Skip to content

Commit cb9abbe

Browse files
authored
Merge pull request #477 from raifdmueller/feat/brownfield-de-parity-471
docs: bring DE brownfield workflow to parity with EN (#471)
2 parents e893dcb + 801eec0 commit cb9abbe

1 file changed

Lines changed: 137 additions & 19 deletions

File tree

docs/brownfield-workflow.de.adoc

Lines changed: 137 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -51,41 +51,126 @@ Present as a table.
5151
Einen Bounded Context zum Starten auswählen.
5252
Einen wählen, der klein, gut isoliert ist und eine anstehende Änderungsanforderung hat.
5353

54-
== Phase 0.5: Sicherheitsnetz aufbauen
54+
== Phase 0.5: Socratic Code-Theory Recovery
5555

56-
Vor jeder Änderung braucht man zwei Dinge: Verständnis und Tests.
56+
Vor jeder Änderung muss die "Theorie" des Bounded Context rekonstruiert werden -- das, was https://pages.cs.wisc.edu/~remzi/Naur.pdf[Peter Naur] das mentale Modell nannte, das in den Köpfen der ursprünglichen Entwickler lebt. In einem Brownfield-Projekt ist dieses Modell nicht dokumentiert. Der Code ist die einzige Quelle.
5757

58-
=== Bestehendes Verhalten als Use Cases extrahieren
58+
Diese Phase nutzt *Socratic Code-Theory Recovery*: einen zweiphasigen Workflow, der Verständnis durch rekursive Frageverfeinerung aufbaut, bevor Dokumentation erzeugt wird.
5959

60-
Die KI den Code im Bounded Context lesen lassen und extrahieren, was das System aktuell tut.
61-
Das Ergebnis sind Use Cases, die das *bestehende* Verhalten beschreiben -- nicht was man bauen will, sondern was bereits da ist.
60+
=== Phase 1: Question Tree aufbauen
6261

63-
.Prompt
62+
Mit fünf Top-Level-Fragen zum Bounded Context starten und sie rekursiv zerlegen. Semantic Anchors als Zerlegungs-Heuristiken einsetzen: *arc42* für Architektur, *Cockburn Use Cases* für Spezifikation, *ISO 25010* für Qualität, *Nygard ADRs* für Entscheidungen.
63+
64+
Jedes Blatt im Baum ist entweder `[ANSWERED]` (mit Code-Evidenz: Datei, Funktion, Zeile) oder `[OPEN]` (mit Category und Ask-Rolle). Der Output sind zwei AsciiDoc-Dateien: `QUESTION_TREE.adoc` (vollständige Begründungs-Spur) und `OPEN_QUESTIONS.adoc` (Handoff-Dokument, nach Rolle gruppiert).
65+
66+
Den Prompt unten 1:1 in eine Session kopieren, die Lesezugriff auf den Bounded Context hat. `[bounded context path]` und die Beispielfragen an die eigene Domäne anpassen; die Blatt-Klassifikation, das Q-ID-Schema und die Output-Dateien nicht verändern.
67+
68+
.Prompt: Phase 1 — Question Tree aufbauen
69+
[source,txt]
6470
----
65-
Read the code in [bounded context path]. Extract the existing behavior as Use Cases.
66-
For each Use Case: ID, Trigger, Actors, Preconditions, Main Flow, Alternative Flows, Postconditions, Business Rules.
67-
Save as docs/specs/use-cases-[context-name].adoc.
71+
You are performing Socratic Code-Theory Recovery on a brownfield bounded
72+
context located at [bounded context path]. Phase 1 of two.
73+
74+
Goal: recover the program's theory (Naur, 1985) from source code through
75+
recursive question refinement, before any documentation is written.
76+
77+
Process:
78+
79+
1. Start with five high-level questions about the bounded context:
80+
Q1 What problem does this bounded context solve, and for whom?
81+
Q2 What is the specification of this bounded context?
82+
Q3 What is the architecture of this bounded context?
83+
Q4 What quality goals drive the design?
84+
Q5 What risks and technical debt exist?
85+
86+
2. Decompose each question recursively. Use these Semantic Anchors as
87+
decomposition guides:
88+
- arc42 — 12 sub-questions for architecture (Q3 branch)
89+
- Cockburn Use Cases — Primary Actor, Trigger, Main Success Scenario,
90+
Extensions, Postconditions for specification (Q2 branch)
91+
- ISO/IEC 25010 — 8 quality characteristics for quality goals (Q4 branch)
92+
- Nygard ADRs — Context, Decision, Status, Consequences for design
93+
rationale (Q3.9 branch)
94+
Stop decomposing when a question is precise enough to be answered with a
95+
single piece of code evidence or a single fact from a stakeholder.
96+
97+
3. Assign a hierarchical Q-ID to every node (Q1, Q1.2, Q1.2.3, ...) so that
98+
later documentation can cite back to it.
99+
100+
4. For each leaf, classify it:
101+
102+
[ANSWERED]
103+
- You found the answer in the code.
104+
- Cite the evidence as <file>:<line> or <file>::<function>.
105+
- Be exact. No "see X for details."
106+
107+
[OPEN]
108+
- The answer is not derivable from code alone.
109+
- Category: business-context | design-rationale | quality-goals |
110+
stakeholder-context | future-direction
111+
- Ask role: Product Owner | Architect | Developer | Domain Expert |
112+
Operations
113+
- State precisely what cannot be answered, and why.
114+
115+
5. Output two files in AsciiDoc:
116+
117+
QUESTION_TREE.adoc
118+
- Full hierarchical tree with all nodes and Q-IDs
119+
- Each leaf marked [ANSWERED] (with evidence) or [OPEN] (with Category
120+
and Ask role)
121+
- Includes all reasoning, not only the leaves
122+
123+
OPEN_QUESTIONS.adoc
124+
- Only the [OPEN] leaves, copied verbatim from QUESTION_TREE.adoc
125+
- Grouped by Ask role (one section per role)
126+
- Each question short enough to be answered in 1-3 sentences
127+
128+
Do not write any other documentation in this phase. Phase 2 will synthesize
129+
the answered tree into PRD, specification, arc42, and ADRs — only after the
130+
team has filled in the [OPEN] leaves.
68131
----
69132

70-
Die extrahierten Use Cases gegen das laufende System prüfen.
71-
Die KI kann implizites Verhalten übersehen oder Code falsch interpretieren.
72-
Das ist der eine Schritt, bei dem Domänenwissen unersetzlich ist.
133+
=== Zwischen den Phasen: Das Team beantwortet die offenen Fragen
134+
135+
Die Open Questions an die Personen weiterleiten, die sie beantworten können. In einem kontrollierten Experiment mit einer 13.000-Zeilen-Go-Codebasis reichten *11 gezielte Fragen* aus, um die Lücke zwischen reverse-engineerter Dokumentation und Original zu schließen. Die Fragen sind präzise, weil die rekursive Zerlegung sie spezifisch macht, nicht vage.
136+
137+
Typische Fragen, die das LLM nicht aus dem Code beantworten kann:
138+
139+
[cols="2,3",options="header"]
140+
|===
141+
| Category | Beispiel
142+
143+
| Business Context | Warum wurde das gebaut? Welche Alternativen gab es?
144+
| Design Rationale | Warum JSONC statt YAML? Warum diese Library?
145+
| Quality Goals | Welches Qualitätsziel hat Priorität? Welche Schwellwerte?
146+
| Stakeholder Context | Wer nutzt das? Welches Erfahrungslevel?
147+
| Future Direction | Was ist geplant, aber noch nicht umgesetzt?
148+
|===
149+
150+
=== Phase 2: Dokumentation synthetisieren
151+
152+
Das LLM synthetisiert die beantworteten Fragen plus die Code-Evidenz aus Phase 1 zur Dokumentation gemäß dem Spec-Driven-Workflow:
153+
154+
* *PRD* aus den Antworten im Q1-Ast
155+
* *Spezifikation* (Cockburn Use Cases, CLI-Spec, Datenmodelle, Gherkin-Akzeptanzkriterien) aus dem Q2-Ast
156+
* *arc42* mit allen 12 Kapiteln aus dem Q3-Ast
157+
* *Nygard-ADRs* mit Pugh-Matrix aus dem Q3.9-Ast
158+
159+
Jede Aussage referenziert eine Question-ID und markiert teamgegebene Information mit `(team answer)`. Diese doppelte Rückverfolgbarkeit (Code-Evidenz + Team-Input) ist der entscheidende Unterschied zu einem einfachen Reverse-Engineering-Prompt.
73160

74161
=== Basis-Tests aufbauen
75162

76-
Tests schreiben, die das bestehende Verhalten verifizieren.
77-
Diese Tests sind das Sicherheitsnetz: Wenn eine Änderung etwas kaputt macht, fangen die Tests es ab.
163+
Aus den synthetisierten Use Cases Tests schreiben, die das bestehende Verhalten verifizieren. Diese Tests sind das Sicherheitsnetz.
78164

79165
.Prompt
166+
[source,txt]
80167
----
81168
Based on the Use Cases in docs/specs/use-cases-[context-name].adoc, write tests that verify the current behavior.
82169
Use TDD, London School. Each test references its Use Case ID for traceability.
83170
Do not change any production code. Only add tests.
84171
----
85172

86-
Tests ausführen.
87-
Jeder Test muss gegen den aktuellen Code bestehen.
88-
Wenn ein Test fehlschlägt, war der extrahierte Use Case falsch -- Use Case korrigieren, dann Test korrigieren.
173+
Tests ausführen. Jeder Test muss gegen den aktuellen Code bestehen. Wenn ein Test fehlschlägt, war der extrahierte Use Case falsch -- Use Case korrigieren, dann Test korrigieren.
89174

90175
[IMPORTANT]
91176
====
@@ -94,6 +179,24 @@ Ohne sie kann man nicht unterscheiden zwischen "meine Änderung hat etwas kaputt
94179
Das ist die geschlossene Schleife, die Brownfield-Änderungen sicher macht.
95180
====
96181

182+
=== Was das LLM rekonstruieren kann -- und was nicht
183+
184+
Ein kontrolliertes Experiment (Dokumentation aus einem Greenfield-Projekt löschen und aus dem Code wieder erzeugen) zeigte:
185+
186+
*Aus dem Code ableitbar:* funktionale Anforderungen (21 vs. 7 im Original), Akzeptanzkriterien (69 vs. 40), Building-Block-Views, Glossar (31 Begriffe vs. 2 Platzhalter), Sicherheitsmechanismen, Crosscutting Concepts.
187+
188+
*NICHT aus dem Code ableitbar:* Business Context, Design Rationale (das ADR-"Warum"), *Priorisierung* von Qualitätszielen, Stakeholder-Belange, geplante Features, Performance-Budgets, Tutorials, Review-Ergebnisse.
189+
190+
Semantic Anchors haben in diesem Workflow eine doppelte Funktion: *Prompt-Kompression* (ein 69-Zeilen-Prompt erzeugte 3.850 Zeilen korrekt strukturierter Dokumentation) und *Zerlegungs-Heuristik* ("arc42" erzeugt 12 MECE-Subfragen ohne weitere Anweisungen).
191+
192+
=== Spec-Drift und Abgleich
193+
194+
Selbst in gut dokumentierten Projekten driftet die Spezifikation vom Code weg. Das Implementierungs-LLM ergänzt Security-Hardening, Validierungsregeln und Edge Cases, die nie in der ursprünglichen Spec standen. Das ist kein Disziplinproblem -- es ist eine strukturelle Eigenschaft des Workflows.
195+
196+
Die Lösung: regelmäßiger *Spec-Reconciliation*. Den Reverse-Engineering-Prompt gegen den aktuellen Code laufen lassen und gegen die bestehende Spec diffen. Der Diff zeigt neue Anforderungen (im Code, nicht in der Spec), verändertes Verhalten (auseinandergedriftet) und tote Spec (dokumentiert, aber entfernt).
197+
198+
Drei natürliche Trigger-Punkte: vor einem Release, nach einem Security-Review, vor einem Onboarding.
199+
97200
== Phase 1-12: Der Standard-Workflow
98201

99202
Sobald Use Cases und Basis-Tests für den Bounded Context vorhanden sind, greift der normale Workflow.
@@ -142,17 +245,29 @@ Stabiler Code, den niemand anfasst, braucht keine Specs.
142245
|`Analyze the codebase in [path]. Identify bounded contexts using DDD. List name, responsibility, entities, interfaces.`
143246
|link:#/anchor/domain-driven-design[DDD]
144247

145-
|Reverse-Engineering
146-
|`Read the code in [path]. Extract existing behavior as Use Cases with Trigger, Main Flow, Alternative Flows, Postconditions, Business Rules.`
248+
|Theory Recovery (Phase 1)
249+
|`You have access to [bounded context path]. No documentation exists. Build a Question Tree by recursively refining 5 questions: Problem/Users, Specification, Architecture, Quality Goals, Risks. Each leaf: [ANSWERED] with code evidence or [OPEN] with Category and Ask role.`
250+
|link:#/anchor/arc42[arc42], link:#/anchor/cockburn-use-cases[Cockburn], link:#/anchor/iso-25010[ISO 25010], link:#/anchor/nygard-adrs[Nygard ADR]
251+
252+
|Team Answers
253+
|OPEN_QUESTIONS.adoc nach Ask-Rolle ans Team verteilen. Typisch 10-15 Fragen.
147254
|{empty}--
148255

256+
|Theory Recovery (Phase 2)
257+
|`Synthesize documentation from the Question Tree and team answers. Every claim references a Q-ID. Mark team input with (team answer).`
258+
|link:#/spec-driven-development[Spec-Driven Workflow]
259+
149260
|Basis-Tests
150261
|`Write tests for the Use Cases in [spec file]. Each test references its Use Case ID. Do not change production code.`
151262
|link:#/anchor/tdd-london-school[TDD London] / link:#/anchor/tdd-chicago-school[Chicago]
152263

153264
|Weiter
154265
|Ab hier dem link:#/spec-driven-development[Standard-Workflow] ab Schritt 3 (PRD) oder Schritt 8 (Implementierung) folgen, je nachdem ob neue Features oder Bugs bearbeitet werden.
155266
|{empty}--
267+
268+
|Reconciliation
269+
|`Compare existing spec in [path] against current code. Report: NEW (in code, not in spec), CHANGED (diverged), DEAD (in spec, not in code). Do not modify existing files.`
270+
|{empty}--
156271
|===
157272

158273
== Wann dieser Ansatz nicht passt
@@ -168,3 +283,6 @@ Wenn das System nicht gebaut oder gestartet werden kann, liegt ein anderes Probl
168283
* Simon Martinelli, https://unifiedprocess.ai/[AI Unified Process] -- der Bounded-Context-Ansatz für Spec-Driven Development in bestehenden Systemen.
169284
* Eric Evans, https://www.domainlanguage.com/ddd/[Domain-Driven Design] -- das grundlegende Werk zu Bounded Contexts und strategischem Design.
170285
* Michael Feathers, _Working Effectively with Legacy Code_ -- Techniken zum Aufbau von Testabdeckung in Systemen ohne Tests.
286+
* Peter Naur, "Programming as Theory Building" (1985) -- argumentiert, dass Programmieren der Aufbau eines mentalen Modells ("Theorie") ist, das sich nicht vollständig in Dokumentation einfangen lässt. Socratic Code-Theory Recovery prüft diese Behauptung im Kontext von LLM-generiertem Code.
287+
* link:#/brownfield-experiment-report[Brownfield Experiment Report] -- kontrolliertes Experiment: Dokumentation aus einem Greenfield-Projekt löschen, aus Code regenerieren, vergleichen. Vollständige Methodik und Befunde.
288+
* link:#/brownfield-fair-comparison[Fair Comparison Report] -- drei Ansätze (Direct, Socratic, Two-Phase) mit identischen Team-Antworten. Misst den strukturellen Wert des Question Tree.

0 commit comments

Comments
 (0)