feat(analyze-before-plan): read-before bookend — scan memory (+code) before planning

Shared include lib/analyze-before-plan.md (two-pass on '## <PREFIX>-' headings, disposition-not-reading invariant, guarded no-op). Wired into the dev flows: ship-feature STEP 0d (analyzer code+memory, INPUT INJECTION into brainstorm/plan + STEP 3 reconciliation gate), bugfix STEP 2.5 (blockers-first), feat STEP 0.6 (decisions-first, MINI-PLAN names in-force or states none), hotfix opt-in. analyzer gains a RELATED MEMORY output section pointing at the include (DRY). init-project / onboard no-op by construction (guarded scan on absent/empty registries).

Mirror of the coupled-capitalize write-after (BDR-034): read-before / write-after bookend.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ho5EQCFTSvYamuRtVZpp2d
This commit is contained in:
Bastien Chanot
2026-06-26 23:46:41 +02:00
co-authored by Claude Opus 4.8
parent 07e846f0a6
commit 67c6a8165d
6 changed files with 228 additions and 2 deletions
+26
View File
@@ -64,6 +64,12 @@ RISKS:
OPEN QUESTIONS:
- <ambiguity to clarify>
RELATED MEMORY:
- IN FORCE: <id> — <title> — <how it constrains this work> [status] (detail each)
- ALREADY SEEN: <BLK-id> — <title> [status] (known cause/fix — don't re-derive)
- NON-BINDING: <c> surfaced, none binding — <bare id refs> (superseded / N-A — counted)
- SELECTION: scanned <N> headings — surfaced <K> = in-force <a> + seen <b> + non-binding <c>
```
Surface discovered patterns and conventions in the analysis output
@@ -73,6 +79,26 @@ happens in the main thread via the gated capitalize flow.
---
## RELATED MEMORY (read-before)
When `.claude/memory/` exists and holds entries, run the memory-relevance scan per
`$HOME/.claude/lib/analyze-before-plan.md` (PASS 1: grep `## <PREFIX>-` headings →
select on titles → PASS 2: full-read only the selected bodies) and populate the
RELATED MEMORY section of OUTPUT.
The contract is DISPOSITION, not retrieval: every surfaced ID gets a verdict —
in-force / already-seen / non-binding. Detail the binding ones (IN FORCE, ALREADY SEEN —
they constrain the work); COUNT the non-binding (superseded / N-A) as one line with bare
refs — a per-entry paragraph on a non-binding match dilutes the in-force ones that bite.
A surfaced ID left undisposed is the gap this closes. You judge bearing; the main-thread
plan decides what to DO.
Read-only here too: reading registries is within Read/Grep; the "Do not modify files" rule
still forbids any write — Index backfill or new entries are never your job. Empty or absent
registries → omit the section (no-op).
---
## EDGE CASES
| Situation | Action |