ADR-0021: Foundation-pass workflow with parking lot
Status: Accepted
Date: 2026-05-22
Amended: 2026-05-24 — productionized by ADR-0023 (process_batch.py atomize). REVIEW.md lean shape gains one extra ## Linking applied sub-section when output is script-generated; ADR-0023 governs the contents. Variant-2 (foundation-pass) semantics and parking-lot behavior unchanged.
Context
ADR-0009 established a single batch-staging review workflow. In practice that workflow has produced two distinct rigor profiles:
- Thorough rigor (BR ch 0–8; CSG Book 1 ch 1–4 + secondary pass). Per-chapter REVIEW.md grows to 5–12k words. Each batch synthesises atomics AND seeds threads AND verifies counter-arg citations AND assesses cluster support. Time-per-chapter is hours; the final secondary-pass batch upgrades earlier work to current-rigor parity (
_meta/batch-reviews/csg-01-secondary-pass-phase-2.md). - Foundation rigor (this ADR). The user wants atomics extracted across all remaining DP (~25–30 ch), CSG Books 2–16 (~150 ch), and WS (22 ch) — ~200 chapter-sessions total — before threads, counter-arg research, or secondary rigor pass are sensible. Threads emerge cleanest from cross-chapter cluster recognition over an existing atomic corpus; pulling them into a per-chapter session forces seeding on isolated material and produces threads that get re-done in any case.
ADR-0009 doesn’t accommodate this split. A second pain point: live judgements made during a foundation session (“this would make a good thread once the cluster exists”, “this question needs answering once DP is ingested”, “this counter-argument needs a primary critic before it’s defensible”) get buried in per-chapter REVIEW archives. A future weaving pass that scans the full _meta/batch-reviews/ archive across ~200 batches is reading ~750k tokens — not a workable index.
Two changes needed: a leaner batch profile for foundation work, and a structured parking lot to carry deferred judgements forward.
Decision
Two variants of the ADR-0009 workflow, opted into per batch via batch ID convention and REVIEW.md shape.
Variant 1 — Thorough (default for one-off / load-bearing work)
Unchanged. ADR-0009 § “Gate 2 — Batch review” governs. REVIEW.md uses the full shape (summary + tag requests + suspected duplicates + ADR-0014 “Proposed work” with full reasoning + cost report). Used for: secondary-pass rigor upgrades, content-cleanup batches, and any chapter the user designates load-bearing.
Variant 2 — Foundation-pass (atomics-only, lean REVIEW, parking lot)
Used during the foundation-pass project (DP → CSG Books 2–16 → WS). REVIEW.md uses a lean shape; deferred judgements append to _meta/parking/.
Lean REVIEW shape
# Batch Review — {batch-id}
**Source:** {resource file path}
**Scope:** {N} atomics + {M} glossary stubs (if any)
**Date:** {YYYY-MM-DD}
**Variant:** foundation-pass
## Atomics
{table: file | title | tags}
## Glossary / Person updates
{any new stubs, or atomics that filled out a pre-stubbed entry's body}
## Suspected duplicates / cross-batch notes
{1–3 lines per item; reference existing atomic by wikilink}
## Tag-registry requests
{none, or a small table with justification}
## Parked items (also appended to _meta/parking/)
- Threads: {N entries — see _meta/parking/threads.md}
- Questions: {N entries — see _meta/parking/questions.md}
- Web-search: {N entries — see _meta/parking/web-search.md}
## How to review
{terse: review atomics in /staging/{batch-id}/, accept or edit; say "approved" to finalize}
No counter-argument verification section. No secondary-pass commentary. No cost report (pilot mode — Anthropic dashboard suffices). Target: ≤3k words per REVIEW.
Parking-lot files
Three append-only files under _meta/parking/:
threads.md— thread candidates surfaced during foundation workquestions.md— question candidates not yet promoted to/questions/web-search.md— counter-arg citations / primary critics to verify in weaving pass
Entry format (one line per entry; breadcrumbs back to REVIEW and source):
- [{batch-id}] **{title-hint}** — anchors: [[atomic-a]], [[atomic-b]] | trigger: {source-section ref} | one-line: {why-it-might-thread} | review: {batch-review filename}
Adapt fields per file:
threads.md— anchors are atomics; one-line is the thread-claim seedquestions.md— anchors are the triggering atomic(s); one-line is question text + priorityweb-search.md— one-line is “verify {critic name} ({work}) {year}” with the thread/atomic that needs it
Finalize step (Variant 2)
In addition to ADR-0009’s finalize (move atomics, copy REVIEW to _meta/batch-reviews/{batch-id}.md, update Person/Glossary ## Referenced by for any pre-stubbed entry hit by new wikilinks, delete now-empty staging folder, commit):
- Append each parked item from REVIEW.md’s “Parked items” section to the matching
_meta/parking/*.mdfile under a## {batch-id} — {YYYY-MM-DD}heading. - The append is part of the same commit as the staging move.
The parking-lot files are the index the weaving pass reads. REVIEW.md remains the audit trail (in _meta/batch-reviews/) for any item that needs cold-context recovery.
Default-promote rule for questions (ADR-0014) still applies — adapted
ADR-0014 specifies that proposed questions default-promote to /questions/ unless the user rejects specific ones. Under Variant 2 the default flips: proposed questions default-park to _meta/parking/questions.md (not promoted to /questions/). Promotion to a real Question note happens during the weaving pass, when cluster support and answering threads are in scope. Rationale: ~200 foundation sessions × 1–3 questions each = ~400 Question notes most without an answering thread anywhere near; that’s index pollution. The parking lot keeps them visible without polluting /questions/.
If the user wants a foundation-pass question promoted immediately (“this one’s worth a Question note now”), they say so during review and the AI promotes it the normal way.
Batch ID convention
Variant 2 batches use the same {class}-{NN}-{slug} pattern. The Variant: foundation-pass line in the REVIEW frontmatter / header is the marker. No separate ID namespace.
Alternatives considered
- A. Keep one workflow; just truncate REVIEW shape per-batch by judgement. Rejected — invites drift and “is this thorough or lean?” ambiguity per batch. Explicit variants are cheap to maintain and clearly auditable in
_meta/batch-reviews/. - B. Parking inside REVIEW.md only (no separate
_meta/parking/files). Rejected — at ~200 lean REVIEWs the weaving pass would scan ~600k tokens of REVIEW archive to inventory parked items. Structured parking files are ~100k tokens for the same inventory and grep-able. - C. Parking-only (skip REVIEW.md duplication). Rejected — REVIEW.md remains the audit trail for the user’s per-batch review (need to see the parked items in context of the batch they came from). The duplication is small (one-line entries echoed from REVIEW into parking on finalize).
- D. Single
_meta/parking.mdwith H2 sections per type. Rejected — file grows unbounded; threads/questions/web-search benefit from separate grep-able files (different consumers at different times during weaving). - E. Promote all proposed questions immediately per ADR-0014 default. Rejected — see “Default-promote rule” above; foundation pass would produce ~400 mostly-orphan Question notes.
Consequences
- (+) Foundation pass is achievable in bounded time (~200 lean sessions @ ~30–45 min each vs ~hours each at thorough rigor).
- (+) Parked judgements survive the foundation-pass-to-weaving-pass transition without scraping the REVIEW archive.
- (+)
/questions/index stays meaningful (only promoted questions, not foundation-pass speculation). - (+) Pre-commit hook (ADR-0017,
scripts/pre-commit-hook.py) requires no changes — it operates per-file by type and doesn’t inspect REVIEW.md shape. - (+) Thorough rigor is still on the table — secondary-pass-style batches (e.g.,
csg-01-secondary-pass) remain Variant 1 and stay rare but allowed. - (−) Two REVIEW shapes to remember. Mitigated by the
Variant:header field and explicit examples in_meta/batch-reviews/(the first foundation-pass batch becomes the canonical example). - (−)
_meta/parking/*.mdfiles grow long over the foundation pass. Acceptable — they are append-only, grouped by{batch-id}heading, and the weaving pass is their consumer. If a parking file gets unwieldy mid-pass, split by class (e.g.,threads-dp.md,threads-csg.md); decide then, don’t over-engineer now. - (−) Some thread/question candidates surfaced during foundation will turn out wrong (cluster never materialises). Acceptable — parking is cheap; the weaving pass triages.