Files
planer/docs/format.md
2026-07-22 16:12:23 +02:00

185 lines
7.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# `.planer/`-Dateiformat (Spezifikation, Phase 0)
Format der Wissensschichten im Projekt-Repo. Entwurf — wird in Phase 0 gegen echte
Scan-Ergebnisse am Creator validiert und nachgeschärft.
## Design-Entscheidungen
- **Markdown mit einfachen `schlüssel: wert`-Zeilen**, kein reines YAML/JSON: Menschen
lesen und editieren die Dateien direkt (Soll-Änderungen!), Agenten schreiben sie,
Skripte parsen sie mit simplen Regeln (Überschriften-Ebenen + Schlüsselzeilen).
- **Einheiten-ID = `pfad::symbol`** (z. B. `backend/kanban.py::_worker`) — stabil,
ableitbar, ohne separate ID-Verwaltung. Bei Datei-Ebene ohne Symbol: nur `pfad`.
- **Belege = wörtliche Kurzzitate** aus dem Code (nicht Zeilennummern — die verschieben
sich bei jedem Diff). Mechanisch prüfbar per Substring-Suche in der Anker-Datei.
Ein Beleg ist ein Ausschnitt aus GENAU EINER Quellzeile (Phase-0-Erkenntnis:
Modelle ziehen sonst mehrzeilige Statements zusammen — nicht prüfbar).
- **Eine Einheiten-Datei pro Quelldatei** (nicht pro Einheit — sonst hunderte Dateien;
nicht eine große — sonst Merge-Hölle). Diff-Lokalität: Quelldatei ändert sich →
genau eine Einheiten-Datei ändert sich.
- **Sichten referenzieren Einheiten nur per ID**, kopieren nie Fakten (Single Source).
## Verzeichnis-Layout
```
<projekt>/.planer/
kern.md Kern des Projekts + tragende Einheiten
architektur.md Komponenten + Beziehungen
flows.md Abläufe als Schrittfolgen
features/<bereich>.md eine Datei je Funktionsbereich
einheiten/<quelle>.md eine Datei je Quelldatei (Pfad, `/` → `__`)
pruefung.md Build-/Test-/Start-Kommandos, Eigenheiten
entscheidungen/*.md Decision Records
strategie/*.md benannte Soll-Entwürfe
ideen.md Ideen-Backlog
jourfixe/*.md Sitzungsprotokolle
```
## Einheiten: `einheiten/backend__kanban.py.md`
````markdown
# Einheiten: backend/kanban.py
stand: 3f2a91c ← Commit-Hash des letzten Scans dieser Datei (der Anker-Stand)
## backend/kanban.py::_worker
beschreibung: Zieht Karten aus der Stufe der Spalte und arbeitet sie nebenläufig ab.
input: Flow, Stage-Spezifikation, Inflight-Limit, Liste aller Stage-Namen
output: kehrt erst zurück, wenn flowweit nichts mehr zu tun ist; Karten sind advanced,
im Backoff oder dead
entscheidungen:
- Exit erst nach doppelter Leerlauf-Prüfung mit Karenz-Schlaf.
beleg: "if await _idle_exit():"
- Ein Barriere-Worker zieht nur bei Quieszenz aller Upstream-Stufen.
beleg: "return await quiescent(flow, spec.upstream)"
kanten:
- ruft-auf: backend/kanban.py::quiescent
- nutzt: backend/database.py::kanban_pull
- wird-genutzt-von: backend/kanban.py::run_flow
````
Regeln:
- `## `-Überschrift = Einheiten-ID. Freitext darunter bis zur nächsten Schlüsselzeile
ist verboten — nur `beschreibung:`, `input:`, `output:`, `entscheidungen:`, `kanten:`
(feste Reihenfolge).
- `beschreibung:` genau ein Satz (die Verantwortung), Umbruch mit Einrückung erlaubt.
- `input:` was die Einheit entgegennimmt, `output:` was sie liefert bzw. bewirkt —
je eine knappe Zeile, keine Prosa.
- Jede Entscheidung: kurzer Satz (`- `-Zeile) — eine im Code getroffene Design-
Entscheidung oder Garantie, kein Implementierungs-Nacherzählen — gefolgt von
`beleg: "<wörtliches Kurzzitat aus der Anker-Datei>"`.
- **Der konkrete Code wird nie in Artefakte kopiert** — die UI zieht ihn live über den
Anker (Pfad + Symbol) aus der Quelle. Single Source, kein Drift.
- `kanten:`-Typen: `ruft-auf`, `nutzt`, `wird-genutzt-von`, `löst-aus`, `wird-ausgelöst-von`.
Ziel ist immer eine Einheiten-ID.
- MECE-Anspruch v1: Symbol-Ebene; Kleinkram (Imports, Konstanten) darf unzugeordnet
bleiben. Jede Funktion/Klasse der Quelldatei gehört zu genau einer Einheit (eine
Einheit darf mehrere kleine, zusammengehörige Symbole bündeln — dann mehrere
`anker:`-Zeilen unter der Überschrift, ID ist der Hauptanker).
## Feature-Sicht: `features/<bereich>.md`
````markdown
# Bereich: Generierungs-Pipeline
beschreibung: Erzeugt aus einer Quelle die Lerninhalte in drei Board-Stufen.
## Feature: Resümierbare Kanban-Boards [kern]
beschreibung: Generierung läuft als Karten durch Spalten und übersteht Abbrüche.
### Kann nach Abbruch fortsetzen
einheiten: backend/kanban.py::run_flow, backend/database.py::kanban_pull
### Fehlerhafte Karten landen sichtbar im Dead-Letter
einheiten: backend/kanban.py::_worker
````
Regeln:
- `# Bereich` → `## Feature` → `### Teilfeature`; Flag `[kern]` oder `[rand]` am Feature.
- **Titel kurz, ohne Klammern, ohne „und"** — ein Bereich/Feature erfüllt genau EINE
Aufgabe; wer „und" braucht, muss splitten. Beschreibungen: ein kurzer Satz, der den
Kern trifft, ebenfalls ohne „und"-Aufzählung.
- Teilfeatures tragen NUR `einheiten:`-Referenzen (+ optional `beschreibung:`).
Alles Weitere zieht die UI live aus den Einheiten: die Entscheidungs-Liste
(aggregiert über die referenzierten Einheiten), je Methode Input/Output und den
konkreten Code aus dem Anker.
- MECE je Ebene: Bereiche zerlegen das Projekt, Features ihren Bereich, Teilfeatures
ihr Feature — vollständig, überschneidungsfrei. Richtwert 610 Bereiche, 515
Features je Bereich.
## Kern: `kern.md`
````markdown
# Kern: creator
Aus einem Thema/Skript/Ordner/Link entsteht ein vollständiger, belegter Lernguide
mit Übungssystem — zerlegt nach MECE, jede Aussage mit Beleg.
tragende-einheiten: backend/kanban.py::run_flow, backend/board_inventory.py, …
````
Wenige Sätze; `tragende-einheiten:` verweist auf das, was das Projekt trägt.
## Architektur: `architektur.md`
````markdown
# Architektur: creator
## Komponente: Kanban-Engine
beschreibung: Generischer Streaming-Motor; Boards definieren die Stufen.
einheiten: backend/kanban.py::Flow, backend/kanban.py::_worker, …
beziehungen:
- nutzt: Komponente: Datenbank
- wird-genutzt-von: Komponente: Boards
````
Komponenten-Beziehungen werden aus den Einheiten-Kanten aggregiert und beim Scan
gegen sie geprüft (keine Beziehung ohne mindestens eine tragende Kante).
## Flows: `flows.md`
````markdown
# Flows: creator
## Flow: Thema → fertiger Guide
1. Research-Agenten sammeln Quellen — backend/board_inventory.py::research
2. Titel werden geclustert und benannt — backend/board_inventory.py::cluster
3. …
````
Nummerierte Schritte, jeder Schritt endet mit ` — <einheiten-id>[, <einheiten-id>]`.
## Prüfung: `pruefung.md`
````markdown
# Prüfung: creator
tests: make test
lint: (keins vorhanden)
start: make dev
hinweise:
- Backend-Edits bei laufendem Flow triggern uvicorn-Reload und killen Läufe.
````
Feste Schlüssel `tests:`, `lint:`, `start:`; fehlt etwas, steht dort explizit
`(keins vorhanden)` — Gates degradieren sichtbar, nie still.
## Decision Record: `entscheidungen/<datum>-<slug>.md`
````markdown
# Entscheidung: Belege als Kurzzitate statt Zeilennummern
datum: 2026-07-09
status: aktiv
betrifft: einheiten-format
frage: Wie referenzieren Fakten die Code-Stelle?
optionen: Zeilennummern (präzise, aber driften) | Kurzzitate (robust, substring-prüfbar)
entscheidung: Kurzzitate.
begründung: Zeilennummern veralten bei jedem Diff; Zitate sind mechanisch prüfbar.
````
## Mechanische Prüfungen (Skripte, tokenfrei)
1. **Anker-Existenz**: jede Einheiten-ID zeigt auf existierende Datei + Symbol darin.
2. **Zitat-Treue**: jeder `beleg:`-String kommt wörtlich in der Anker-Datei vor.
3. **Referenz-Integrität**: jede `einheiten:`-Referenz in Sichten existiert; jedes
Kanten-Ziel existiert.
4. **Abdeckung**: jedes Symbol der Quelldatei ist einer Einheit zugeordnet (Report,
v1 kein harter Fehler).
5. **Struktur**: Dateien folgen der Grammatik (Schlüssel, Reihenfolge, Flags).