Spec-Driven Development
Spec-Driven Development
Spec-Driven Development (SDD) ist eine Entwicklungsmethodik für die strukturierte Zusammenarbeit zwischen Entwicklern und Coding Agents (Claude Code, Cursor, Gemini CLI, etc.). Polycrate stellt die technische Infrastruktur bereit: ein standardisiertes .specs/-Verzeichnis-Layout, ein maschinenlesbares Spec-Format mit ID-basiertem Lifecycle-Management sowie vollständige CLI-Commands für alle Phasen. Optional pflegen Teams zusätzlich eine Referenzarchitektur in .specs/ARCHITECTURE.md (direkt editierbar, kein Spec-Dokument) — siehe Referenzarchitektur.
Warum Spec-Driven Development?
Ohne SDD entstehen in AI-gestützten Entwicklungsworkflows typische Probleme:
- Coding Agents schreiben Code ohne dokumentierten Kontext — niemand weiß mehr, warum etwas so implementiert wurde
- Releases sind schwer nachvollziehbar — welche Änderungen gehören zu welcher Version?
- Agents bearbeiten Dateien direkt und korrumpieren dabei Strukturen, die Maschinen lesen müssen
- Kein gemeinsames "Backlog" zwischen Mensch und Agent — Aufgaben existieren nur im Chat-Kontext
SDD löst diese Probleme durch einen definierten Prozess:
| Frage | SDD-Antwort |
|---|---|
| Warum wurde etwas implementiert? | Spec als permanentes Archiv (Kontext, Analyse, Lösung) |
| Was ist der aktuelle Stand? | Live-Scan von .specs/ — Ordnerposition und Frontmatter definieren den Status |
| Wie kommt eine Änderung zum Release? | Lifecycle draft ↔ done; Release-Zuweisung verschiebt Specs nach .specs/<version>/ |
| Was kommt als nächstes? | Backlog via .specs/.next/ |
| Wie sieht die Ziel-Architektur aus? | Optional: .specs/ARCHITECTURE.md als lebendes, kompaktes Architekturdokument |
| Was sind die unveränderlichen Projektregeln? | .specs/.invariants.md — maschinenlesbare Kernregeln, in Agent-Rules eingebettet |
Konzepte
Specs
Eine Spec ist ein strukturiertes Markdown-Dokument, das eine Änderung, einen Bugfix oder ein Feature von der Idee bis zur Implementierung begleitet. Jede Spec hat:
- Eine eindeutige ID (ganzzahlig, nie wiederverwendet)
- Einen Status (
draft,done,cancelled) - Einen Typ (Conventional Commits:
feat,fix,breaking, …) - Strukturierte Sektionen:
Context,Solution,Affected Files,Acceptance Criteria,Migration,Open Questions,Reviewund weitere (siehe Sektionsschema) - Optionale Labels für Filterung und Grouping
- Optionale Abhängigkeiten (
needs) zu anderen Specs — needs-check warnt bei nicht-done Abhängigkeiten - Optionale thematische Links (
relates-to) — nicht blockierend
Specs liegen in .specs/.next/ (Backlog) oder .specs/<version>/ (einem Release zugewiesen).
Live-Scan (kein index.yml)
Ab CLI ≥ 0.45.0 gibt es kein index.yml mehr. Specs und Releases werden live aus dem Dateisystem gelesen — die Ordnerposition ist der Zustand:
| Pfad | Bedeutung |
|---|---|
.specs/.next/<id>-<slug>.md |
Backlog — Spec in Arbeit, noch keinem Release zugewiesen |
.specs/<version>/<id>-<slug>.md |
Spec ist Release <version> zugewiesen |
ID, Status, Typ, Labels, Needs und weitere Metadaten stehen im YAML-Frontmatter jeder Spec-Datei. polycrate spec list und verwandte Commands leiten alles daraus ab.
Referenzarchitektur (.specs/ARCHITECTURE.md)
Die Datei .specs/ARCHITECTURE.md ist kein Spec-Dokument und wird nicht live-gescannt. Sie dient als empfohlene (should-have, nicht Pflicht für Finalize oder Release) Referenzarchitektur der verwalteten Software: Module, Grenzen, Datenflüsse, Verweise auf Code-Pfade — fortlaufend und inkrementell gepflegt.
| Aspekt | Empfehlung |
|---|---|
| Pflege | Nach größeren Implementierungen oder Releases, oder auf Wunsch des Teams; Inhalt wächst über die Zeit |
| Form | Ausreichend vollständig für Planung und Umsetzung, aber token- und kontextbewusst: Überschriften, Tabellen, Stichpunkte, Verweise statt langer Fließtext |
| Lesen | Vor größerer Planung oder Implementierung mit einbeziehen, wenn die Datei existiert |
| Schreiben | Darf mit normalen Editor- bzw. Agent-Dateiwerkzeugen bearbeitet werden — ersetzt nicht polycrate spec * für echte Specs |
| Agents | Proaktiv prüfen, ob umgesetzte Specs die Architektur ändern und die Datei anpassen; bei Unsicherheit Rückfrage beim Menschen; Nutzer gelegentlich darauf hinweisen, wenn Referenzdoku fällig ist |
Zwei Lifecycle-Phasen
ARBEITSPHASE RELEASE-PHASE
polycrate spec * polycrate release *
──────────────────────────── ────────────────────────────────────
Tage bis Wochen Minuten, nach abgeschlossener Arbeit
Specs erstellen, ausarbeiten, Specs einer Version zuweisen (optional)
reviewen, implementieren, CHANGELOG.poly schreiben
verifizieren, auf done setzen Release Notes (RELEASENOTE.md) füllen
"Was machen wir, und warum?" workspace.poly version setzen
Git-Tag erstellen
"Dokumentation, dass etwas fertig ist"
Verzeichnisstruktur
my-workspace/
├── .specs/
│ ├── ARCHITECTURE.md # Referenzarchitektur (optional, direkt editierbar)
│ ├── .rules.md # Projekt-spezifische Regeln für Agents (optional)
│ ├── .invariants.md # Maschinenlesbare Kernregeln (optional)
│ ├── .next/ # Backlog — noch keiner Version zugewiesen
│ │ ├── 0-login-timeout-fix.md
│ │ └── 1-api-integration.md
│ ├── 1.0.0/ # Released
│ │ ├── RELEASENOTE.md
│ │ └── 2-initial-setup.md
│ └── 1.1.0/ # In Vorbereitung
│ ├── RELEASENOTE.md
│ └── 3-neue-funktion.md
├── workspace.poly
└── CHANGELOG.poly
.specs/.rules.md
Optionale Datei mit projektspezifischen Regeln für Agents in Prosaform. Wird von polycrate spec rules show ausgegeben und in die generierten Agent-Rules-Dateien integriert.
# Projekt-Regeln
## Sprache
Alle Specs auf Deutsch verfassen.
## Spec-Scope
Jede Spec deckt genau ein Problem ab.
.specs/.invariants.md
Optionale Datei mit maschinenlesbaren Kerninvarianten für das Projekt. Eine Invariante pro Zeile, max. 25 Zeilen. Wird als eigener INVARIANTS-Block in die generierten Agent-Rules-Dateien eingebettet — immer an erster Stelle, damit Agents sie als nicht verhandelbare Regeln interpretieren.
# Repo invariants — my-project
# One hard, checkable rule per line. Keep it short (max 25 lines).
- LANG: all user-facing output in English
- DB: use ORM only; no raw SQL
- SDD: never edit .specs/ except ARCHITECTURE.md
Der Unterschied zu .rules.md: Invarianten sind kurz, präzise, prüfbar — keine Prosa. Agents kennen den Unterschied: Invarianten-Verstöße sind Bugs, .rules.md-Regeln sind Konventionen.
Spec-Lifecycle
Status-Übergänge
draft ◄────────────────────────────► done
│ │
└────────────────────────────────────┤
│
cancelled (jederzeit)
| Status | Bedeutung |
|---|---|
draft |
Spec angelegt, in Ausarbeitung oder Implementierung |
done |
Arbeit abgeschlossen — Spec erfüllt ihre Ziele |
cancelled |
Feature abgelehnt oder durch andere Spec ersetzt — Begründung archiviert |
Der Übergang draft ↔ done hat keine Pflicht-Gates. polycrate spec update <id> --set status=done funktioniert von jedem Status aus. Informative Checks (spec review, spec verify, needs-check) geben Warnings, blockieren aber nicht.
Cancelled Specs
Wenn ein Feature abgelehnt oder durch eine andere Spec ersetzt wird, kann es nicht-destruktiv archiviert werden:
polycrate spec update <id> --set status=cancelled --set cancellation_reason="Replaced by spec #18"
spec listblendetcancelledper Default aus;--allzeigt alle inkl. cancelledspec validateignoriert cancelled Specsrelease diffignoriert cancelled Specs
Abhängigkeiten (needs) und thematische Links (relates-to)
Needs sind deklarierte Abhängigkeiten zwischen Specs. Beim Setzen auf done warnt der needs-check, solange Abhängigkeiten nicht done sind (informativ, nicht blockierend):
# Spec 5 sollte erst auf done gesetzt werden, wenn Specs 3 und 4 done sind (needs-check warnt sonst)
polycrate spec link 5 --needs 3 --needs 4
# Äquivalent via spec update
polycrate spec update 5 --add-needs 3 --add-needs 4
# Abhängigkeit entfernen
polycrate spec update 5 --remove-needs 3
spec list zeigt [BLOCKED], wenn mindestens eine needs-Spec nicht done ist.
Validierung: Das System verhindert self-references und Zirkularitäten — direkte wie transitive.
Relates-to sind nicht-blockierende thematische Verknüpfungen. Sie dokumentieren Zusammenhänge, ohne den Lifecycle zu beeinflussen:
# Spec 5 ist thematisch verwandt mit Spec 8
polycrate spec link 5 --relates-to 8
# Äquivalent via spec update
polycrate spec update 5 --add-relates-to 8
# Link entfernen
polycrate spec update 5 --remove-relates-to 8
Informative Checks (optional, nicht blockierend)
polycrate bietet mehrere informative Prüfungen, die Qualität und Vollständigkeit einer Spec unterstützen — ohne den Übergang auf done zu blockieren. Sie geben Warnings aus, wenn Erwartungen nicht erfüllt sind; mit --force (protokolliert, siehe Force-Audit) lassen sich verbleibende Warnungen dokumentiert überbrücken.
Grounding — spec lint / spec verify
Während der Ausarbeitung prüft spec lint, ob die Spec ausreichend im Codebase verankert ist:
- Affected Files: Mindestens ein Pfad in
## Affected Filessollte im Repository existieren - Anchors:
## Contextund## Solutionsollten mindestens einen@path/to/file:LINE-Anker enthalten — oder eine Architektur-Referenz auf.specs/ARCHITECTURE.md(oder spezifische Chunk-Dateien)
polycrate spec lint <id> # zeigt Grounding-Hinweise (informativ, kein Fehler)
Grounding-Opt-out (zwei Schritte)
Falls keine Architektur-Sektion greift (z. B. reine Docs-Specs), sind beide Schritte nötig:
1. Direktive im Body von ## Context oder ## Solution:
no-architecture-reference: <Begründung, warum kein Arch-Abschnitt greift>
2. Als [major]-Finding in ## Review anerkennen:
Finding N [major] [no-code]: no-architecture-reference: <gleiche Begründung> - resolved: yes
Fehlt einer der Schritte, gilt Grounding als nicht erledigt (Disziplin-Konvention; seit Spec 248 kein CLI-Hard-Gate).
Self-Review — spec review
polycrate spec review <id> setzt reviewed_at und prüft optional die Sektion ## Review auf strukturierte Funde:
Finding 1 [minor|major|blocker] @path/to/file:LINE: Beschreibung - resolved: yes|no
- Jeder Fund braucht
@path:LINE(oder[no-code]nur für reine Docs-Specs) - Pauschalaussagen wie „alles OK“ zählen nicht
- Workflow-Gate: informativ (Warning bei fehlendem/veraltetem
reviewed_at) — blockiertstatus=donenicht
Acceptance Criteria — spec verify
polycrate spec verify <id> prüft strukturierte Akzeptanzkriterien ohne Status-Übergang:
## Acceptance Criteria
- [x] Feature ist implementiert - verify: @cmd/spec_verify.go:42
- [x] Prüfung greift bei fehlenden Checkboxen - verify: @pkg/specdev/acceptance.go:15
- [ ] Unerfülltes Kriterium — Warning in spec verify
- Format:
- [x] <Text> - verify: @path:LINE(Leerzeichen nachverify:) - Unerfüllte Kriterien → Warnings, kein Hard-Block für
status=done
polycrate spec verify <id> # listet Kriterien + Status
polycrate spec verify <id> --format json
polycrate spec verify <id> --with-agent # generiert strukturierten Prompt für Subagenten
Deprecated: spec submit / spec finalize
polycrate spec submit und polycrate spec finalize sind deprecated Aliase für polycrate spec update <id> --set status=done. Sie führen dieselben informativen Checks aus, setzen aber direkt done — nicht approved. Für neue Workflows direkt status=done verwenden.
Force-Audit
Jede Nutzung von --force (z. B. release finalize --force) wird protokolliert:
- Eintrag in
.specs/.force-audit.logmit Zeitstempel, Command und Pflicht---force-reason spec listzeigt[forced]-Badge bei betroffenen Specsrelease statuszeigt Anzahl der Force-Bypasses
polycrate release finalize 1.0.0 --force --force-reason "Highlights manuell nachgetragen"
polycrate spec force-audit # Audit-Log anzeigen
Coding Agents: Spec Handoff, Soft-Stop und Staging
Agents sollen offene Designfragen nicht leeren, um Checks zu umgehen. Leere Open Questions bedeuten: Antworten stehen in Solution / Context.
Spec Handoff (Spec 257 / 280, SSOT: polycrate spec manual → AGENT DISCIPLINE): Die Chat-Antwort ist der primäre Handoff — nicht annehmen, dass der Nutzer .specs/-Dateien öffnet. Compact Rules (.cursor/rules/sdd.mdc) tragen nur einen kurzen Reminder.
Nach Authoring im Chat:
- Spec-Identität (ID, Name, Typ, Status)
- Strukturierte Zusammenfassung (Warum + Was/Wie)
- Open Questions ausformuliert — oder explizit „No open questions.“
- Nächster Schritt für den Nutzer
Soft-Stop (MUST): Solange echte Open Questions offen sind: pausieren, nicht implementieren, nicht status=done setzen (kein CLI-Gate — Konversationsdisziplin).
| Regel für Agents | Inhalt |
|---|---|
status=done |
Nur wenn Aufgabe abgeschlossen oder Nutzer es verlangt — Authoring allein → kein automatisches done. |
| Open Questions | Dokumentieren + Soft-Stop; nicht leeren, um Checks zu umgehen. |
| Struktureller Drift (Spec 185) | Blockiert Status-/Release-Operationen — bei Bedarf polycrate spec format <id> (oder --force). |
| Sektions-Inhalte | Text zwischen ##-Grenzen direkt editierbar; Frontmatter nur via CLI; Überschriften via spec format. |
| Staging-Dateien | Für --section-file nicht unter .specs/ — empfohlen: /tmp/.polycrate/spec-sections/ |
| Antwort-Text (Meta) | CLI-Regel-Einhaltung nicht proaktiv betonen; nur auf Nachfrage / bei Recovery / Einweisung. |
Arbeitsstil: wie im polycrate spec manual und in polycrate spec rules show.
Spec-Typen
Jede Spec hat einen Typ nach Conventional Commits. Der Typ steuert, welche Platzhalter-Hints beim spec create in die ## Context-Sektion geschrieben werden.
polycrate spec create --name "Fix login bug" --type fix
polycrate spec create --name "Add dark mode" --type feat # Default wenn --type fehlt
polycrate spec create --name "Drop v1 API" --type breaking
polycrate spec update <id> --set type=refactor
Gültige Typen: fix | perf | feat | refactor | chore | docs | ci | build | style | test | breaking | analysis
Sektionsschema
Alle Specs verwenden ein einheitliches Sektionsschema mit der zentralen Sektion ## Context:
| Sektion | Beschreibung | Empfohlen vor done |
|---|---|---|
context |
Hintergrund, Anforderungen, Scope — typ-spezifische Hints beim Scaffold | Nein |
solution |
Konkreter Implementierungsplan mit @path:LINE-Ankern |
Ja |
affected-files |
Betroffene Dateipfade (ein Pfad pro Zeile) — Grounding-Hinweis | Grounding |
acceptance-criteria |
- [x] <Text> - verify: @path:LINE — spec verify |
Verify |
migration |
Upgrade-Schritte und Breaking Changes | Ja bei type=breaking |
open-questions |
Offene Entscheidungen — Soft-Stop/Handoff, nicht leeren | Leer vor Abschluss (Disziplin) |
review |
Self-Review-Funde: Finding N [severity] @path:LINE — spec review |
Review |
Der Typ steuert den Scaffold-Hint in ## Context:
fix,perf,analysis: „Symptom, analysis steps, confirmed root cause."feat,refactor,chore,docs, …: „Background, requirements, scope boundaries."breaking: „Background, requirements, why breaking change is necessary." +## Migrationist Pflicht
Heading-Level-Regel
Innerhalb von Spec-Sektionen sind nur H3 (###) und tiefere Überschriften erlaubt. H1 (#) und H2 (##) sind verboten, da H2 als Sektionsgrenze reserviert ist.
- Schreibzeit: Content mit H1/H2 wird von
spec updatemit einem Error abgelehnt - Lesezeit:
spec inspectgibt eine Warnung auf stderr aus, wenn bestehender Content H1/H2 enthält
# Dies wird abgelehnt:
polycrate spec update 5 --section context="## Bad heading"
# Error: section "Context": line 1 contains H1/H2 heading...
# H3+ ist erlaubt:
polycrate spec update 5 --section context="### Subsection\nContent here"
Labels
Labels ermöglichen freies Tagging von Specs für Filterung und Grouping:
# Labels hinzufügen und entfernen
polycrate spec update <id> --add-label sdd --add-label agent
polycrate spec update <id> --remove-label sdd
# Filtern
polycrate spec list --label sdd
polycrate spec list --label sdd --type fix
Quickstart
1. SDD initialisieren
polycrate spec init
Legt .specs/ und .specs/.rules.md an. Generiert außerdem Agent-Rules-Dateien im Workspace-Root (siehe Agent-Integration).
2. Spec anlegen
# Mit explizitem Typ — steuert den Scaffold-Hint in ## Context
polycrate spec create --name "Login Timeout Fix" --type fix
# → Erstellt .specs/.next/0-login-timeout-fix.md mit Context (Fix-Hints)
# → Status: draft (Frontmatter in der Spec-Datei)
polycrate spec create --name "Dark Mode" --type feat
# → Erstellt .specs/.next/1-dark-mode.md mit Context (Feature-Hints)
3. Quick-Capture für neue Observations
Wenn während der Implementierung ein neues Problem auffällt — ohne den aktuellen Kontext zu unterbrechen:
polycrate spec note "S3 upload schlägt still fehl bei 403" --type fix --label s3
# → Erstellt draft Spec sofort, gibt ID zurück
# → Weiterarbeiten am aktuellen Task
4. Spec ausarbeiten
# Context füllen — inline
polycrate spec update 0 --section context="Nach 30 Minuten Inaktivität werden Nutzer ausgeloggt. SESSION_COOKIE_AGE ist auf 1800s gesetzt."
polycrate spec update 0 --section solution="Erhöhe auf 28800s, aktiviere Sliding-Window."
# Sektionen aus Datei (für längeren Content) — Staging außerhalb .specs/, z. B.:
# mkdir -p /tmp/.polycrate/spec-sections
polycrate spec update 0 --section-file solution=/tmp/.polycrate/spec-sections/spec-0-solution.md
# Sektionen aus Stdin (für Pipes und Scripte)
polycrate spec inspect 0 --section context | process.py | \
polycrate spec update 0 --section-stdin solution
Verfügbare Sektionen: context, solution, affected-files, acceptance-criteria, migration, open-questions, review
Sektions-Inhalte können auch direkt mit Editor- oder Agent-Dateiwerkzeugen bearbeitet werden (Text zwischen ##-Grenzen). Frontmatter und Sektions-Überschriften bleiben CLI-only.
5. Spec lesen
polycrate spec inspect 0
polycrate spec inspect 0 --section solution # Nur eine Sektion
6. Qualität prüfen (optional)
polycrate spec lint 0 # Grounding-Hinweise (informativ)
polycrate spec review 0 # Self-Review-Zeitstempel + Review-Sektion prüfen
polycrate spec verify 0 # Acceptance Criteria (informativ)
7. Implementierung und Abschluss
# Nach Implementierung: Acceptance Criteria prüfen (optional)
polycrate spec verify 0 # listet Kriterien + Erfüllungsstatus
polycrate spec verify 0 --with-agent # Prompt-Vorlage für Subagenten generieren
# Auf done setzen — funktioniert von jedem Status aus
# (needs-check: warnt bei nicht-done Abhängigkeiten, blockiert nicht)
polycrate spec update 0 --set status=done
# Review-Sektion für Self-Review befüllen (optional, vor Implementierung)
polycrate spec update 0 --section review="Finding 1 [minor] @cmd/main.go:42: ..."
8. Überblick behalten
# Kompakte Tabelle (Default)
polycrate spec list
# Filter
polycrate spec list --open # Nicht done, nicht cancelled
polycrate spec list --status draft
polycrate spec list --status draft --status done
polycrate spec list --status draft,done
polycrate spec list --exclude-status done,cancelled
polycrate spec list --label sdd
polycrate spec list --type fix
polycrate spec list --blocked # Nur Specs mit nicht-done Abhängigkeiten
polycrate spec list --all # Inkl. cancelled Specs
# Sortierung (Default: id aufsteigend)
polycrate spec list --sort name
polycrate spec list --sort created:desc
# Maschinenlesbar / ohne TUI
polycrate spec list --format json
polycrate spec list --format tsv --columns id,status,name
polycrate spec list --format csv --no-header
# Releases (gleiche Idee für Formate und Sortierung)
polycrate release list --sort version:desc --format tsv
Code-Referenzen in Kommentaren
Wenn eine Spec in einem Code-Kommentar referenziert wird, ist die stabile Referenz die Spec-ID, nicht der Dateipfad:
// Spec: polycrate spec inspect 5 ← KORREKT (stabil, funktioniert nach Release)
// Spec: .specs/.next/5-feature.md ← FALSCH (Pfad ändert sich beim Release)
Der Dateipfad ist ein Implementierungsdetail. polycrate spec inspect <id> funktioniert unabhängig von Status und Speicherort.
Release-Lifecycle
Release erstellen
# Vorschau: welche Specs sind bereit?
polycrate release diff 1.0.0
# Release erstellen — Specs optional zuweisen
polycrate release create 1.0.0 --spec 0 --spec 1
# → Verschiebt Spec-Dateien von .next/ nach 1.0.0/
# → Erstellt automatisch RELEASENOTE.md (Scaffold)
# Reine Version-Bump ohne Specs ist ebenfalls gültig:
polycrate release create 1.0.1
# Bulk-Zuweisung nach Status oder Typ
polycrate release create 1.1.0 --spec-status done
polycrate release create 1.1.0 --spec-type fix --spec-type feat
Changelog und Release Notes schreiben
# Changelog-Eintrag
polycrate release update 1.0.0 \
--set type=feat \
--set message="Login Timeout Fix + API Integration" \
--changelog-item "FIX: Session-Timeout auf 8h erhöht, Sliding-Window aktiviert" \
--changelog-item "FEAT: Neue REST-API Integration für Kundendaten"
# Dokumentations-Link setzen (erscheint als Warning in release status wenn fehlend)
polycrate release update 1.0.0 \
--set docs_url="https://docs.ayedo.de/polycrate/releases/cli/1.0.0/"
# Release Notes schreiben (RELEASENOTE.md)
polycrate release update 1.0.0 \
--note-section highlights="Highlights der Version 1.0.0" \
--note-section changes="Detaillierte Änderungen"
# Release Notes aus Datei
polycrate release update 1.0.0 \
--note-section-file highlights=/tmp/.polycrate/spec-sections/highlights.md
Release Notes (RELEASENOTE.md)
Jedes Release hat eine strukturierte RELEASENOTE.md im Versionsverzeichnis (.specs/<version>/RELEASENOTE.md). Sie wird automatisch beim release create als Scaffold angelegt.
| Sektion | Beschreibung | Pflicht für Finalize |
|---|---|---|
highlights |
Kurze Zusammenfassung der wichtigsten Änderungen | Ja |
changes |
Detaillierte Auflistung aller Änderungen | Nein |
fixes |
Bugfixes | Nein |
migration |
Upgrade-Schritte bei Breaking Changes | Nein |
# Release Note Status prüfen
polycrate release note status 1.0.0
# Release Note anzeigen
polycrate release note inspect 1.0.0
polycrate release note inspect 1.0.0 --section highlights
# Release Note manuell erstellen (falls nicht via release create geschehen)
polycrate release note create 1.0.0
Die gleiche Heading-Level-Regel wie für Specs gilt auch für Release Notes: nur H3 und tiefer innerhalb von Sektionen.
Release abschließen
Vor release finalize führt Polycrate automatisch Guards durch:
| Guard | Verhalten |
|---|---|
Zugewiesene Specs nicht done (oder cancelled) |
Error — erst auf done setzen oder Spec entfernen |
RELEASENOTE.md fehlt oder highlights leer |
Error (--force --force-reason "..." zum Überspringen) |
| Keine Specs zugewiesen | Erlaubt — reiner Version-Bump mit Release Note allein ist gültig |
message-Feld leer |
Warning (blockiert nicht) |
docs_url fehlt |
Warning in release status |
| Git-Tag existiert bereits | Error — --force --force-reason "..." zum Überschreiben |
polycrate release status 1.0.0 # Zeigt Warnings und Checklist
polycrate release finalize 1.0.0
# → Setzt workspace.poly version: 1.0.0
# → Erstellt Git-Tag v1.0.0
# → Führt Pre/Post-Actions aus (falls konfiguriert)
# Danach committen und pushen
polycrate workspace sync
Release-Übersicht
polycrate release list
polycrate release status 1.0.0
Validation
polycrate spec validate
Prüft alle Specs auf Konsistenz (Dateipfade, Frontmatter, Sektionen, Abhängigkeiten). .specs/ARCHITECTURE.md ist kein Spec und wird von der Validierung nicht als solches behandelt. Fehlermeldungen sind aktionierbar — sie zeigen immer den Fix-Command:
WARNING: spec 5 [feat]: both 'Context' and 'Solution' are empty
→ Fix: polycrate spec update 5 --section context="Background and requirements."
ERROR: spec 12 [breaking]: 'Migration' section is empty — required for type=breaking
→ Fix: polycrate spec update 12 --section-file migration=/tmp/.polycrate/spec-sections/spec-12-migration.md
WARNING: spec 7 has open needs dependencies:
#3 "Volume Discovery" [draft]
→ Fix: implement spec #3 first or remove needs link
Agent-Integration
SDD ist für die Arbeit mit Coding Agents konzipiert. polycrate spec init und polycrate spec rules generate erzeugen automatisch Instruktionsdateien im Workspace-Root:
| Datei | Ziel-Agent |
|---|---|
CLAUDE.md |
Claude Code (Anthropic) |
AGENTS.md |
OpenAI Codex, Gemini CLI, andere |
.cursor/rules/sdd.mdc |
Cursor IDE (wird in jede Conversation injiziert) |
Was die Agent-Rules-Dateien enthalten
INVARIANTS-Block (an erster Stelle): maschinenlesbare Kernregeln aus.specs/.invariants.md— Verstöße sind Bugs, nicht Konventionsfragen- Regeln für
.specs/: Frontmatter und Sektions-Überschriften nur via CLI; Sektions-Inhalte direkt editierbar;RELEASENOTE.md/ Workspace-CHANGELOG.polynur viarelease *— Ausnahme:.specs/ARCHITECTURE.md - Informative Checks:
spec lint,spec review,spec verify, needs-check — Warnings; struktureller Drift (Spec 185) bleibt hart - Agent discipline: Kein vorschnelles
status=done; Open Questions nicht leeren; Spec Handoff (Chat primär, Spec 257/280) + Soft-Stop; Staging unter/tmp/.polycrate/spec-sections/;-wabsolut - Session-Start-Protokoll: Manual lesen, Stand sehen, ARCHITECTURE.md überfliegen
- Vollständige Command-Referenz inkl.
spec verify,spec arch,spec lint,spec force-audit,release block-finalize - Recovery-Commands für Spec-Inkonsistenzen und Legacy-Migration
- Projektspezifische Regeln aus
.specs/.rules.md - Versionsheader: Zeigt mit welcher Polycrate-Version die Rules generiert wurden
Agent-Workflow (Session-Start)
# 1. Manual lesen (LLM-optimiert)
polycrate spec manual --no-pager -w /path/to/workspace
# 2. Projektspezifische Regeln lesen
polycrate spec rules show --no-pager -w /path/to/workspace
# 3. Aktuellen Stand sehen
polycrate spec list --format json -w /path/to/workspace
# 4. (Empfohlen) Wenn .specs/ARCHITECTURE.md existiert: kurz lesen für Abgleich mit aktueller Arbeit
Agent-Rules aktualisieren
# Nach Polycrate-Upgrade (enthält Versionsheader für Erkennung)
polycrate spec rules generate --force
# Vorschau ohne Schreiben
polycrate spec rules show --no-pager
Recovery
Bei Inkonsistenzen im .specs/-Baum (z. B. fehlgeschlagene Operationen, manuelle Frontmatter-Edits):
# Konsistenz prüfen (primärer Recovery-Schritt)
polycrate spec validate
# Strukturelle Drift in einer Spec reparieren
polycrate spec lint <id> # Drift anzeigen
polycrate spec format <id> # Drift auto-fixen (Sektions-Inhalte bleiben erhalten)
Migration von Legacy-Repos (mit index.yml)
Repos mit altem 5-Status-Lifecycle und index.yml:
# 1. Legacy-Statuses und Sektionen auf Disk umschreiben (nur bei index.yml-Repos)
polycrate spec index migrate
# 2. Auf Spec 248 migrieren: index.yml entfernen, Status-Remap abschließen
polycrate spec lifecycle migrate-v2
Sandbox und Runtime-Verzeichnis
SDD-Commands (polycrate spec *, polycrate release *) starten keinen vollständigen Workspace — kein Docker, kein Container. Sie sind leichtgewichtig und funktionieren auch in eingeschränkten Umgebungen.
In Sandbox-Umgebungen (z. B. eingeschränkte Schreibrechte auf HOME):
polycrate spec list --runtime-dir /tmp/polycrate-run -w /pfad/zum/projekt
→ Details: CLI-Referenz — Runtime-Verzeichnis
Typischer Workflow (Gesamtübersicht)
sequenceDiagram
participant Dev as Entwickler
participant CLI as polycrate spec
participant Agent as Coding Agent
participant Rel as polycrate release
Dev->>CLI: spec init
CLI-->>Dev: .specs/ + Agent-Rules-Dateien
Dev->>CLI: spec create --name "Feature X" --type feat
CLI-->>Dev: ID 0, status: draft
Dev->>CLI: spec update 0 --section context="..."
Dev->>CLI: spec update 0 --section solution="..."
Dev->>CLI: spec update 0 --section review="Finding 1 [minor] @cmd/main.go:5: ..."
Agent->>CLI: spec lint 0
CLI-->>Agent: Grounding hints (informativ)
Agent->>CLI: spec review 0
CLI-->>Agent: Review-Zeitstempel (optional)
Agent->>Agent: Implementierung
Agent->>CLI: spec note "Neues Problem entdeckt" --type fix
Agent->>CLI: spec verify 0
CLI-->>Agent: Acceptance Criteria Status (Warning wenn offen)
Dev->>CLI: spec update 0 --set status=done
Dev->>Rel: release create 1.0.0 --spec 0
Dev->>Rel: release update 1.0.0 --set type=feat ...
Dev->>Rel: release status 1.0.0
Dev->>Rel: release finalize 1.0.0
Rel-->>Dev: workspace.poly version=1.0.0, Git-Tag v1.0.0
Multi-Agent-Workflow
SDD unterstützt Workflows mit mehreren parallelen Subagenten. Jede Rolle hat eine klar definierte Aufgabe:
| Rolle | Aufgabe | CLI-Einstiegspunkt |
|---|---|---|
| Grounding Agent | Codebase analysieren, Anchors setzen, Affected Files ermitteln | spec update <id> --section affected-files=... |
| Spec Author | Context + Solution ausarbeiten, Review-Sektion befüllen | spec update <id> --section solution=... |
| Reviewer | Self-Review prüfen, Lint-Hinweise beurteilen | spec lint <id> → spec review <id> |
| Verifier | Acceptance Criteria prüfen und abhaken | spec verify <id> --with-agent |
Parallelisierung
Mehrere Specs können gleichzeitig in verschiedenen Sessions bearbeitet werden. Jede Session arbeitet an genau einer Spec. Parallelisierung lohnt sich wenn:
- Specs keine
needs-Abhängigkeiten zueinander haben - Die betroffenen Code-Bereiche überlappungsfrei sind
- Die Verifikation pro Spec isoliert durchführbar ist
# Agent 1 (Spec A):
polycrate spec verify 10 --with-agent # generiert Verifikations-Prompt
# Agent 2 (Spec B, parallel):
polycrate spec verify 11 --with-agent
Invariants im Multi-Agent-Kontext
Jeder Subagent liest die generierten sdd.mdc-Regeln automatisch via Cursor. Der INVARIANTS-Block steht immer an erster Stelle — Verstöße sind keine Konventionsfragen, sondern Bugs.
Alle Commands im Überblick
polycrate spec
| Command | Beschreibung |
|---|---|
spec init |
.specs/-Struktur + Agent-Rules initialisieren |
spec create --name <name> |
Neue Spec anlegen (--type für Typ-Scaffolding) |
spec note "<text>" |
Quick-Capture: minimale Spec sofort anlegen (--type, --label) |
spec list |
Alle Specs als kompakte Tabelle (--label, --type, --blocked, --all, --format json) |
spec inspect <id> |
Spec-Inhalt anzeigen (--section <name>) |
spec update <id> |
Frontmatter (--set), Sektionen (--section, --section-file, --section-stdin), Labels (--add-label, --remove-label), Needs (--add-needs, --remove-needs), Relates-to (--add-relates-to, --remove-relates-to) |
spec link <id> |
Abhängigkeit deklarieren: --needs <dep-id>, thematischer Link: --relates-to <id> |
spec lint <id> |
Strukturelle Drift + Grounding-Hinweise (informativ, kein Fehler) |
spec format <id> |
Strukturelle Drift auto-fixen (Sektions-Inhalte bleiben erhalten) |
spec review <id> |
Self-Review-Zeitstempel setzen, Review-Sektion prüfen (informativ) |
spec submit <id> |
Deprecated — Alias für --set status=done |
spec verify <id> |
Acceptance Criteria prüfen (--format json, --with-agent für Subagenten-Prompt) |
spec arch |
Architektur-Datei(en) verwalten (list, search, show für Referenzarchitektur) |
spec force-audit |
Force-Audit-Log anzeigen |
spec index migrate |
Legacy-Statuses/Sektionen auf Disk umschreiben (nur Repos mit index.yml) |
spec lifecycle migrate-v2 |
Auf Spec 248 migrieren: index.yml entfernen, Status-Remap |
spec delete <id> |
Spec löschen |
spec validate |
Alle Specs auf Konsistenz prüfen — aktionierbare Fehlermeldungen |
spec index rebuild |
Deprecated (No-Op) — stattdessen spec validate |
spec manual |
Vollständiges LLM-optimiertes Manual ausgeben (--no-pager) |
spec rules generate |
Agent-Rules-Dateien erzeugen (inkl. INVARIANTS-Block, --force zum Überschreiben) |
spec rules show |
Agent-Rules-Inhalt anzeigen ohne Dateien zu schreiben |
polycrate release
| Command | Beschreibung |
|---|---|
release create <version> |
Release erstellen, Specs optional zuweisen (--spec <id>, --spec-status, --spec-type) |
release update <version> |
Changelog schreiben (--set, --changelog-item, --set docs_url=...), Release Notes (--note-section, --note-section-file), weitere Specs zuweisen |
release finalize <version> |
Guards prüfen (RELEASENOTE highlights Pflicht; Specs optional), Version setzen, Git-Tag, Pre/Post-Actions (--force --force-reason "...") |
release block-finalize <name> <version> |
Block-Release deterministisch abschließen: Version setzen, CHANGELOG validieren, Image pushen (idempotent) |
release list |
Alle Releases auflisten |
release status <version> |
Release-Detail anzeigen inkl. Warnings (fehlende docs_url, leeres message) |
release diff <version> |
Vorschau: welche Specs würden zugewiesen |
release note create <version> |
RELEASENOTE.md manuell erstellen (normalerweise automatisch via release create) |
release note inspect <version> |
Release Note anzeigen (--section <name>) |
release note status <version> |
Füllstatus der Release-Note-Sektionen anzeigen |
release unassign <version> |
Spec zurück in .next/ verschieben |
release delete <version> |
Release rückgängig machen (destructive) |