refactor(contract): split architecture-documentation into vocabulary contract + arc42-authoring skill#577
Conversation
WalkthroughDiese Änderung fügt eine neue arc42‑Authoring‑Skill mit Referenzdokumenten für Scaffolding, Kapitel‑8/10/11‑Strukturen, ADR↔Risk‑Wiring und Traceability hinzu und reformatiert mehrere Changesarc42-Authoring-Skill-Definition
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related issues
Possibly related PRs
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
d30c1e2 to
ec0d14b
Compare
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@skill/arc42-authoring/references/adr-risk-wiring.md`:
- Line 27: The fenced code block at the top of adr-risk-wiring.md currently
starts with triple backticks only (` ``` `); update that opening fence to
include the language identifier by changing it to "```markdown" so the block
becomes "```markdown" followed by the "# ADR-NNN: <Title>" line to enable syntax
highlighting.
In `@website/public/data/contracts.json`:
- Around line 41-47: Update the two references/catalog.md files to include the
missing anchor entries so they match the anchor IDs listed in contracts.json and
the files in docs/anchors; specifically add entries for "arc42" (if absent),
"adr-according-to-nygard", "bdd-given-when-then", "pugh-matrix", and
"quality-attribute-scenario" (and any other anchor IDs present in
website/public/data/contracts.json but missing from catalog.md), ensuring each
entry uses the same anchor ID string and the same display/title format used for
existing anchors in those catalog.md files so the catalogs stay synchronized
with docs/anchors and contracts.json.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yml
Review profile: CHILL
Plan: Pro
Run ID: 30278b24-ca55-4d67-8bfb-6ebbc02f891b
📒 Files selected for processing (8)
skill/arc42-authoring/SKILL.mdskill/arc42-authoring/references/adr-risk-wiring.mdskill/arc42-authoring/references/chapter-10-quality-scenarios.mdskill/arc42-authoring/references/chapter-11-structure.mdskill/arc42-authoring/references/chapter-8-baseline.mdskill/arc42-authoring/references/scaffolding.mdskill/arc42-authoring/references/traceability-rules.mdwebsite/public/data/contracts.json
|
|
||
| When creating a new ADR, use this template: | ||
|
|
||
| ``` |
There was a problem hiding this comment.
Sprachkennung für Code-Block ergänzen.
Der Fenced Code Block sollte eine Sprachkennung haben, um Syntax-Highlighting zu ermöglichen. Fügen Sie markdown nach den öffnenden Backticks hinzu.
📝 Vorgeschlagene Korrektur
-```
+```markdown
# ADR-NNN: <Title>🧰 Tools
🪛 markdownlint-cli2 (0.22.1)
[warning] 27-27: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@skill/arc42-authoring/references/adr-risk-wiring.md` at line 27, The fenced
code block at the top of adr-risk-wiring.md currently starts with triple
backticks only (` ``` `); update that opening fence to include the language
identifier by changing it to "```markdown" so the block becomes "```markdown"
followed by the "# ADR-NNN: <Title>" line to enable syntax highlighting.
Source: Linters/SAST tools
| "anchors": [ | ||
| "arc42", | ||
| "c4-diagrams", | ||
| "adr-according-to-nygard", | ||
| "pugh-matrix", | ||
| "quality-attribute-scenario" | ||
| ], |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Beschreibung: Alle Anchor-IDs aus contracts.json extrahieren und gegen docs/anchors/ prüfen
# Alle Anchor-IDs aus contracts.json sammeln
echo "=== Anchors aus contracts.json ==="
jq -r '.[].anchors[]' website/public/data/contracts.json | sort -u > /tmp/contract_anchors.txt
cat /tmp/contract_anchors.txt
# Alle Anchor-Dateien in docs/anchors/ auflisten
echo -e "\n=== Anchor-Dateien in docs/anchors/ ==="
if [ -d "docs/anchors" ]; then
fd -t f . docs/anchors/ -x basename {} .md | sort -u > /tmp/docs_anchors.txt
cat /tmp/docs_anchors.txt
# Differenz: Anchors in contracts.json, die nicht in docs/anchors/ sind
echo -e "\n=== In contracts.json, aber NICHT in docs/anchors/ ==="
comm -23 /tmp/contract_anchors.txt /tmp/docs_anchors.txt
# Differenz: Anchors in docs/anchors/, die nicht in contracts.json sind
echo -e "\n=== In docs/anchors/, aber NICHT in contracts.json ==="
comm -13 /tmp/contract_anchors.txt /tmp/docs_anchors.txt
else
echo "Verzeichnis docs/anchors/ nicht gefunden"
fi
# Katalog-Check
echo -e "\n=== Prüfe skill/arc42-authoring/references/catalog.md ==="
if [ -f "skill/arc42-authoring/references/catalog.md" ]; then
echo "Katalog existiert, prüfe auf fehlende Einträge:"
while IFS= read -r anchor; do
if ! rg -q "^## $anchor" skill/arc42-authoring/references/catalog.md; then
echo " Fehlender Katalog-Eintrag: $anchor"
fi
done < /tmp/contract_anchors.txt
else
echo "Katalog nicht gefunden"
fiRepository: LLM-Coding/Semantic-Anchors
Length of output: 16463
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# 1) Anchors aus contracts.json
jq -r '.[].anchors[]' website/public/data/contracts.json | sort -u > /tmp/contract_anchors.txt
echo "=== Anchors aus contracts.json (IDs) ==="
cat /tmp/contract_anchors.txt
# 2) Anchors aus docs/anchors/ (Dateinamen -> IDs ohne Endung)
echo
echo "=== Anchor-Dateien in docs/anchors/ (IDs) ==="
if [ -d "docs/anchors" ]; then
fd -t f . docs/anchors/ --extension md --extension adoc 2>/dev/null || true
# Robust: alle *.<ext> in docs/anchors nehmen und Endung entfernen
fd -t f . docs/anchors/ -e adoc -e md 2>/dev/null | sed 's|.*/||' | sed 's/\.[^.]*$//' | sort -u > /tmp/docs_anchor_ids.txt
cat /tmp/docs_anchor_ids.txt
else
echo "Verzeichnis docs/anchors/ nicht gefunden"
exit 0
fi
# Differenzen (IDs)
echo
echo "=== In contracts.json, aber NICHT in docs/anchors/ (IDs) ==="
comm -23 /tmp/contract_anchors.txt /tmp/docs_anchor_ids.txt || true
echo
echo "=== In docs/anchors/, aber NICHT in contracts.json (IDs) ==="
comm -13 /tmp/contract_anchors.txt /tmp/docs_anchor_ids.txt || true
# 3) Katalog finden (Pfad war vorher ggf. falsch)
echo
echo "=== Suche nach catalog.md ==="
fd -t f "catalog.md" . 2>/dev/null | head -n 50
# 4) Katalog-Check gegen die gefundene(n) Datei(n)
echo
echo "=== Prüfe Anchors im gefundenen Katalog ==="
for catalog in $(fd -t f "catalog.md" . 2>/dev/null); do
echo
echo "Katalog: $catalog"
missing_count=0
while IFS= read -r anchor; do
# Erwartung: als Heading (z.B. '## arc42') oder beliebiger Treffer
if ! rg -q -S "^(###+[[:space:]]+)?${anchor}([[:space:]]|$)" "$catalog"; then
echo " Fehlender Katalog-Eintrag (kein Heading/Token-Treffer): $anchor"
missing_count=$((missing_count+1))
fi
done < /tmp/contract_anchors.txt
echo "Fehlende Anchors im Katalog: $missing_count"
doneRepository: LLM-Coding/Semantic-Anchors
Length of output: 28606
🏁 Script executed:
#!/bin/bash
set -euo pipefail
catalogs=(
"./plugins/semantic-anchors/skills/semantic-anchor-translator/references/catalog.md"
"./skill/semantic-anchor-translator/references/catalog.md"
)
# Pick a few anchors that contracts.json references
anchors=(
"arc42"
"adr-according-to-nygard"
"bdd-given-when-then"
"pugh-matrix"
"walking-skeleton"
)
for c in "${catalogs[@]}"; do
echo "================ $c ================"
if [ ! -f "$c" ]; then
echo "(nicht gefunden)"
continue
fi
for a in "${anchors[@]}"; do
echo "-- Treffer für: $a"
# Show up to 20 matching lines with context
rg -n -S --context 2 "$a" "$c" | head -n 20 || true
done
echo "-- Erste 120 Zeilen des Katalogs (Strukturüberblick)"
head -n 120 "$c" | nl -ba | head -n 120
doneRepository: LLM-Coding/Semantic-Anchors
Length of output: 1754
🏁 Script executed:
#!/bin/bash
set -euo pipefail
catalogs=(
"./plugins/semantic-anchors/skills/semantic-anchor-translator/references/catalog.md"
"./skill/semantic-anchor-translator/references/catalog.md"
)
# Anchors aus contracts.json zum Abgleich
anchors=(
"arc42"
"adr-according-to-nygard"
"bdd-given-when-then"
"pugh-matrix"
"walking-skeleton"
)
for c in "${catalogs[@]}"; do
echo "================ $c ================"
[ -f "$c" ] || { echo "(nicht gefunden)"; continue; }
for a in "${anchors[@]}"; do
echo "-- Treffer für: $a"
rg -n -S --context 2 "$a" "$c" | head -n 20 || true
done
echo "-- Erste 120 Zeilen des Katalogs (Strukturüberblick)"
head -n 120 "$c" | nl -ba
doneRepository: LLM-Coding/Semantic-Anchors
Length of output: 1754
🏁 Script executed:
#!/bin/bash
set -euo pipefail
catalogs=(
"./plugins/semantic-anchors/skills/semantic-anchor-translator/references/catalog.md"
"./skill/semantic-anchor-translator/references/catalog.md"
)
anchors=(
"adr-according-to-nygard"
"arc42"
"bdd-given-when-then"
"pugh-matrix"
"quality-attribute-scenario"
"walking-skeleton"
)
for c in "${catalogs[@]}"; do
echo "================ Katalog: $c ================"
[ -f "$c" ] || { echo "(nicht gefunden)"; continue; }
for a in "${anchors[@]}"; do
echo "-- Treffer für: $a (case-insensitiv)"
rg -n -i -S "$a" "$c" | head -n 20 || true
done
doneRepository: LLM-Coding/Semantic-Anchors
Length of output: 2331
🏁 Script executed:
#!/bin/bash
set -euo pipefail
catalogs=(
"./plugins/semantic-anchors/skills/semantic-anchor-translator/references/catalog.md"
"./skill/semantic-anchor-translator/references/catalog.md"
)
# Anchors aus contracts.json
jq -r '.[].anchors[]' website/public/data/contracts.json | sort -u > /tmp/contract_anchors.txt
slugify() {
# input: title text
# output: lower kebab-case
echo "$1" \
| tr '[:upper:]' '[:lower:]' \
| sed -E 's/[’'\''"]/ /g' \
| sed -E 's/[^a-z0-9]+/-/g' \
| sed -E 's/^-+//' \
| sed -E 's/-+$//' \
| sed -E 's/--+/-/g'
}
for c in "${catalogs[@]}"; do
echo "================ Katalog: $c ================"
[ -f "$c" ] || { echo "(nicht gefunden)"; continue; }
# Slug-Liste aus den ### Überschriften
rg -n '^### ' "$c" | sed -E 's/^([0-9]+:)?###[[:space:]]+//' | while IFS= read -r title; do
slugify "$title"
done | sort -u > /tmp/catalog_slugs.txt
echo "=== Vergleich: contracts.json Anchors vs. Katalog-Slugs ==="
echo "=== In contracts.json, aber NICHT als slug in catalog.md ==="
comm -23 /tmp/contract_anchors.txt /tmp/catalog_slugs.txt || true
echo
echo "=== In catalog.md, aber NICHT in contracts.json ==="
comm -13 /tmp/contract_anchors.txt /tmp/catalog_slugs.txt || true
echo
echo "=== Anzahl: contracts=$(wc -l < /tmp/contract_anchors.txt), catalog_slugs=$(wc -l < /tmp/catalog_slugs.txt) ==="
doneRepository: LLM-Coding/Semantic-Anchors
Length of output: 6929
🏁 Script executed:
#!/bin/bash
set -euo pipefail
catalogs=(
"./plugins/semantic-anchors/skills/semantic-anchor-translator/references/catalog.md"
"./skill/semantic-anchor-translator/references/catalog.md"
)
anchors=(
"adr-according-to-nygard"
"arc42"
"bdd-given-when-then"
"pugh-matrix"
"quality-attribute-scenario"
"walking-skeleton"
)
for c in "${catalogs[@]}"; do
echo "================ Katalog: $c ================"
[ -f "$c" ] || { echo "(nicht gefunden)"; continue; }
for a in "${anchors[@]}"; do
echo "-- Suche in Katalog für: $a"
# Zeige ggf. die ersten Trefferzeilen
if rg -n -i -S "$a" "$c" | head -n 5 | sed 's/^/ /'; then
:
else
echo " (keine Treffer)"
fi
done
doneRepository: LLM-Coding/Semantic-Anchors
Length of output: 2431
Anchors sind in docs/anchors/ vorhanden, aber in references/catalog.md fehlen mehrere Einträge
Die Anchors aus website/public/data/contracts.json (u.a. arc42, adr-according-to-nygard, bdd-given-when-then, pugh-matrix, quality-attribute-scenario) existieren als Dateien in docs/anchors/.
In den gefundenen catalog.md-Dateien sind diese Anchors jedoch (außer arc42) nicht enthalten:
./plugins/semantic-anchors/skills/semantic-anchor-translator/references/catalog.md./skill/semantic-anchor-translator/references/catalog.md
Bitte references/catalog.md so ergänzen, dass die Einträge mit den Anchor-IDs aus contracts.json/docs/anchors/ synchron sind.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@website/public/data/contracts.json` around lines 41 - 47, Update the two
references/catalog.md files to include the missing anchor entries so they match
the anchor IDs listed in contracts.json and the files in docs/anchors;
specifically add entries for "arc42" (if absent), "adr-according-to-nygard",
"bdd-given-when-then", "pugh-matrix", and "quality-attribute-scenario" (and any
other anchor IDs present in website/public/data/contracts.json but missing from
catalog.md), ensuring each entry uses the same anchor ID string and the same
display/title format used for existing anchors in those catalog.md files so the
catalogs stay synchronized with docs/anchors and contracts.json.
Source: Coding guidelines
…+ arc42-authoring skill Extract procedural content from the over-grown architecture-documentation contract (2922 chars) into a new arc42-authoring skill. Absorb crosscutting-concepts contract into the skill as chapter-8-baseline.md. Shrink architecture-documentation contract to vocabulary only (~385 chars). Closes LLM-Coding#529
ec0d14b to
3ab1a88
Compare
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
skill/arc42-authoring/references/chapter-10-quality-scenarios.md (1)
1-29:⚠️ Potential issue | 🔴 CriticalPflicht-Check zur Anchor-Synchronisation: erforderliche Dateien/Verzeichnisse fehlen
Der Check kann nicht durchgeführt werden, weil im Repo keindocs/anchors-Verzeichnis gefunden wurde undskill/arc42-authoring/references/catalog.mdnicht existiert (stattdessen nurskill/semantic-anchor-translator/references/catalog.mdvorhanden). Entsprechend muss die fehlendedocs/anchors-Quelle und/oder der fehlendeskill/arc42-authoring-Catalog ergänzt bzw. korrigiert werden.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@skill/arc42-authoring/references/chapter-10-quality-scenarios.md` around lines 1 - 29, Der Pflicht-Check schlägt fehl, weil das Verzeichnis docs/anchors fehlt und die erwartete Datei skill/arc42-authoring/references/catalog.md nicht vorhanden ist (stattdessen existiert nur skill/semantic-anchor-translator/references/catalog.md); behebe dies, indem du entweder das fehlende docs/anchors-Verzeichnis und die darin benötigten Anchor-Quellen anlegst oder den Pfad in der Check-Logik/CI so korrigierst, dass auf die vorhandene skill/semantic-anchor-translator/references/catalog.md verwiesen wird; stelle sicher, dass die Anchors im richtigen Format und Ort liegen und passe ggf. alle Referenzen/Configs an, die auf skill/arc42-authoring/references/catalog.md verweisen.Source: Coding guidelines
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@skill/arc42-authoring/references/chapter-10-quality-scenarios.md`:
- Around line 1-29: Der Pflicht-Check schlägt fehl, weil das Verzeichnis
docs/anchors fehlt und die erwartete Datei
skill/arc42-authoring/references/catalog.md nicht vorhanden ist (stattdessen
existiert nur skill/semantic-anchor-translator/references/catalog.md); behebe
dies, indem du entweder das fehlende docs/anchors-Verzeichnis und die darin
benötigten Anchor-Quellen anlegst oder den Pfad in der Check-Logik/CI so
korrigierst, dass auf die vorhandene
skill/semantic-anchor-translator/references/catalog.md verwiesen wird; stelle
sicher, dass die Anchors im richtigen Format und Ort liegen und passe ggf. alle
Referenzen/Configs an, die auf skill/arc42-authoring/references/catalog.md
verweisen.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yml
Review profile: CHILL
Plan: Pro
Run ID: 7ec70d77-6e35-4a77-b0fe-27a550f46863
📒 Files selected for processing (8)
skill/arc42-authoring/SKILL.mdskill/arc42-authoring/references/adr-risk-wiring.mdskill/arc42-authoring/references/chapter-10-quality-scenarios.mdskill/arc42-authoring/references/chapter-11-structure.mdskill/arc42-authoring/references/chapter-8-baseline.mdskill/arc42-authoring/references/scaffolding.mdskill/arc42-authoring/references/traceability-rules.mdwebsite/public/data/contracts.json
✅ Files skipped from review due to trivial changes (3)
- skill/arc42-authoring/references/traceability-rules.md
- skill/arc42-authoring/references/scaffolding.md
- skill/arc42-authoring/references/chapter-8-baseline.md
🚧 Files skipped from review as they are similar to previous changes (2)
- skill/arc42-authoring/references/chapter-11-structure.md
- website/public/data/contracts.json
refactor(contract): split architecture-documentation into vocabulary contract + arc42-authoring skill
(German version below)
Splits the over-grown
architecture-documentationcontract (2922 chars) into:arc42-authoring/— carries the how-toCloses #529. Absorbs
crosscutting-conceptsinto the skill.Assessment against project taxonomy
Contract/Skill boundary — catalog evidence
templatefield incontracts.jsonSKILL.md+references/+prompts/architecture-documentation)arc42-authoring)Size analysis — the outlier
architecture-documentationsocratic-code-theory-recoveryexplaining-teachingtdd-hamburg-stylearchitecture-documentationis the only contract >1200 chars that has no companion skill.socratic-code-theory-recoveryis similarly long but justified as a condensed reminder of its companion skill — the procedural depth lives in the skill, not the contract alone.Precedent: "invoke a skill for depth" pattern
The
explaining-teachingcontract (#573) proves this pattern works:socratic-code-theory-recoveryskillConsistency with Harness Inventory
The Harness Inventory page (
docs/harness-inventory.adoc) separates "what a layer checks" (definition) from "how to deploy it" (procedure). Same lens: contract = the what, skill = the how.Changes
1. New skill:
skill/arc42-authoring/Content extracted 1:1 from the current
architecture-documentationandcrosscutting-conceptscontracts. No information lost — only relocated.2. Shrunken contract:
architecture-documentationFrom 2922 chars → ~340 chars:
3. Absorbed:
crosscutting-conceptsMoved to
skill/arc42-authoring/references/chapter-8-baseline.md. The contract entry is removed fromcontracts.json.4. Socratic overlap resolution
The
socratic-code-theory-recoveryskill'sreferences/arc42.mdcontains a Phase 1 decomposition guide (Q-IDs, when to stop decomposing) — this is specific to the Socratic workflow, not to arc42 authoring. No overlap — both skills coexist without duplication:arc42-authoringsocratic-code-theory-recoveryTradeoff acknowledged
The traceability rules move from always-on to on-demand. For architecture work the skill is invoked anyway — no loss. For someone only reading the contract as a reminder, the detail was already too large for always-on context — this is a correction, not a regression (as #529 states).
Deutsche Version
refactor(contract): architecture-documentation in Vokabular-Contract + arc42-authoring-Skill aufteilen
Teilt den überwachsenen
architecture-documentation-Contract (2922 Zeichen) auf in:arc42-authoring/— enthält das WieSchließt #529. Absorbiert
crosscutting-conceptsin den Skill.Bewertung gegen die Projekt-Taxonomie
Contract/Skill-Grenze — Katalog-Evidenz
template-Feld incontracts.jsonSKILL.md+references/+prompts/architecture-documentation)arc42-authoring)Größenanalyse — der Ausreißer
architecture-documentationsocratic-code-theory-recoveryexplaining-teachingtdd-hamburg-stylearchitecture-documentationist der einzige Contract >1200 Zeichen ohne Begleit-Skill.socratic-code-theory-recoveryist ähnlich lang, aber gerechtfertigt als kondensierte Erinnerung seines Begleit-Skills — die prozedurale Tiefe lebt im Skill, nicht allein im Contract.Präzedenzfall: „invoke a skill for depth"-Pattern
Der
explaining-teaching-Contract (#573) beweist, dass dieses Pattern funktioniert:socratic-code-theory-recovery-SkillKonsistenz mit der Harness Inventory
Die Harness-Inventory-Seite (
docs/harness-inventory.adoc) trennt „was eine Schicht prüft" (Definition) von „wie man sie deployt" (Prozedur). Gleiche Linse: Contract = das Was, Skill = das Wie.Änderungen
1. Neuer Skill:
skill/arc42-authoring/Inhalt 1:1 extrahiert aus den aktuellen Contracts
architecture-documentationundcrosscutting-concepts. Keine Information geht verloren — nur umgezogen.2. Eingedampfter Contract:
architecture-documentationVon 2922 Zeichen → ~340 Zeichen:
3. Absorbiert:
crosscutting-conceptsVerschoben nach
skill/arc42-authoring/references/chapter-8-baseline.md. Der Contract-Eintrag wird auscontracts.jsonentfernt.4. Socratic-Überschneidung aufgelöst
Die
references/arc42.mddessocratic-code-theory-recovery-Skills enthält einen Phase-1-Dekompositions-Guide (Q-IDs, wann man aufhört zu dekomponieren) — das ist spezifisch für den Socratic-Workflow, nicht für arc42-Authoring. Keine Überschneidung — beide Skills koexistieren ohne Duplikation:arc42-authoringsocratic-code-theory-recoveryTrade-off anerkannt
Die Traceability-Regeln wandern von always-on zu on-demand. Für Architekturarbeit wird der Skill ohnehin aufgerufen — kein Verlust. Für jemanden, der den Contract nur als Erinnerung liest, war das Detail bereits zu umfangreich für always-on-Kontext — dies ist eine Korrektur, keine Regression (wie #529 feststellt).
Summary by CodeRabbit
Documentation
Chores