PR2 of 2 — full decision migration + #520 startup rewrite — fixes #520 #521
Completes the knowledge-retrieval arc. PR1 (#526) shipped the machinery; this migrates the whole corpus and rewires startup so agents actually reach for it.
What this delivers
Full corpus migration → 0 legacy. All 108 active decision records now carry the lifecycle metadata block (key/status/since/supersedes/superseded-by + Rule/Signals/Mechanics), fanned out across topic-file + decisions.md batches, gap-filled, de-duplicated, and quality-reviewed (28/108 sampled SOLID). docs/decisions/migration-map.md records the non-trivial mappings.
#520 startup rewrite (docs/handoffs/chicorytv-issue-queue.md, docs/README.md, CLAUDE.md, scripts/select-queue.sh): two concurrent tracks when no issue named (orientation ‖ scripts/select-queue.sh 5), named-issue-skips-selection, the ## Closing record template, and the four server-management#642 orientation bullets verbatim (catalog-first; Gitea-ErsatzTV = evidence-not-authority; the breadcrumb rule — a file path in a historical comment is a breadcrumb not a live pointer, resolve by concept; catalog→rg fallback, MemPalace never authority). Still-valid workflow lore preserved; pre-script selector lore demoted to a clearly-labeled archival section.
#237 retired as live state: reduced to an archival line; the decision docs.queue-state-gitea-tracker flipped to status: superseded and moved to docs/decisions/archive/startup.md, superseded by the new active startup.parallel-orientation (reciprocal links; rationale preserved verbatim).
scripts/check-kickoff-guard.sh — blocks any regression to treating #237 as live state; wired into the decisions lifecycle CI job (non-vacuity proven: failed on pre-rewrite docs, passes after).
Two new validator guards (with non-vacuous tests): archive↔archive reciprocity, and duplicate-metadata-block detection — both caught real defects during this PR. retrieval-eval.md excluded from parsing; budget re-baselined to 4800 post-migration.
docs/decisions/retrieval-eval.md — the active-vs-superseded retrieval benchmark (includes the #390→ci.runner-placement and #237→startup.parallel-orientation traps).
Verification (all local, pre-push)
decisions_validate.py OK, 0 legacy, 108 active; --base origin/main --head HEAD exit 0; catalog --check in sync; check-kickoff-guard.sh OK; 31 pytest pass; up to date with origin/main.
Startup cold-agent sim: fresh agent went catalog-first, never read #237 (cited the doc lines), ran select-queue.sh, understood the breadcrumb rule.
Retrieval cold-agent sim: 6/6 correct active records, zero superseded returned; nailed both active-vs-superseded traps.
Whole-branch adversarial review (SOUND-WITH-FIXES → all folded): confirmed the #520 rewrite complete+correct and the #237 supersession lifecycle-correct.
server-management#642 (MemPalace exporter)
On merge I'll post "ready to mine — decisions lifecycle green on <main-sha>" to #642; its 283-issue export is live + tiered and becomes reachable once this orientation block lands.
## PR2 of 2 — full decision migration + #520 startup rewrite — `fixes #520 #521`
Completes the knowledge-retrieval arc. PR1 (#526) shipped the machinery; this migrates the whole corpus and rewires startup so agents actually reach for it.
### What this delivers
- **Full corpus migration → 0 legacy.** All 108 active decision records now carry the lifecycle metadata block (`key`/`status`/`since`/`supersedes`/`superseded-by` + `Rule`/`Signals`/`Mechanics`), fanned out across topic-file + `decisions.md` batches, gap-filled, de-duplicated, and quality-reviewed (28/108 sampled SOLID). `docs/decisions/migration-map.md` records the non-trivial mappings.
- **#520 startup rewrite** (`docs/handoffs/chicorytv-issue-queue.md`, `docs/README.md`, `CLAUDE.md`, `scripts/select-queue.sh`): two concurrent tracks when no issue named (orientation ‖ `scripts/select-queue.sh 5`), named-issue-skips-selection, the `## Closing record` template, and the **four server-management#642 orientation bullets verbatim** (catalog-first; `Gitea-ErsatzTV` = evidence-not-authority; the **breadcrumb rule** — a file path in a historical comment is a breadcrumb not a live pointer, resolve by concept; catalog→`rg` fallback, MemPalace never authority). Still-valid workflow lore preserved; pre-script selector lore demoted to a clearly-labeled archival section.
- **#237 retired as live state**: reduced to an archival line; the decision `docs.queue-state-gitea-tracker` flipped to `status: superseded` and moved to `docs/decisions/archive/startup.md`, superseded by the new active `startup.parallel-orientation` (reciprocal links; rationale preserved verbatim).
- **`scripts/check-kickoff-guard.sh`** — blocks any regression to treating #237 as live state; wired into the `decisions lifecycle` CI job (non-vacuity proven: failed on pre-rewrite docs, passes after).
- **Two new validator guards** (with non-vacuous tests): archive↔archive reciprocity, and duplicate-metadata-block detection — both caught real defects during this PR. `retrieval-eval.md` excluded from parsing; budget re-baselined to 4800 post-migration.
- **`docs/decisions/retrieval-eval.md`** — the active-vs-superseded retrieval benchmark (includes the #390→`ci.runner-placement` and #237→`startup.parallel-orientation` traps).
### Verification (all local, pre-push)
- `decisions_validate.py` OK, **0 legacy, 108 active**; `--base origin/main --head HEAD` exit 0; catalog `--check` in sync; `check-kickoff-guard.sh` OK; 31 pytest pass; up to date with origin/main.
- **Startup cold-agent sim**: fresh agent went catalog-first, **never read #237** (cited the doc lines), ran `select-queue.sh`, understood the breadcrumb rule.
- **Retrieval cold-agent sim**: 6/6 correct active records, zero superseded returned; nailed both active-vs-superseded traps.
- **Whole-branch adversarial review** (SOUND-WITH-FIXES → all folded): confirmed the #520 rewrite complete+correct and the #237 supersession lifecycle-correct.
### server-management#642 (MemPalace exporter)
On merge I'll post "ready to mine — `decisions lifecycle` green on `<main-sha>`" to #642; its 283-issue export is live + tiered and becomes reachable once this orientation block lands.
fixes #520 #521
Adds metadata blocks (key/status/since/supersedes/superseded-by + Rule/Signals/Mechanics)
to all 26 legacy-unmigrated ## records across optimistic-concurrency.md (7, concurrency.*),
api-auth-security.md (9, security.*), release-ci-governance.md (7 remaining legacy records,
release.*), and spa-modularization.md (3, spa.*). Heading text and rationale prose are
byte-identical; only metadata was inserted, per the key-table assignments.
security.session-auth-dual-credential (#295 PR1) gets a one-line cross-reference noting it
narrows the OIDC-inert sub-claim of security.blazor-removal-auth-posture (#206), per
orchestrator adjudication — both stay status: active with supersedes/superseded-by: none.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Exclude docs/decisions/retrieval-eval.md from active decision parsing
(_NON_DECISION_FILES); its `## N.` eval-question headings were being
miscounted as 7 legacy-unmigrated records.
- Add decisions_lib.metadata_line_count() + a decisions_validate guard
that fails a record with more than one `key:` metadata line, so a
stacked-metadata-block migration bug (which the parser silently
tolerated by reading only the first block) can't recur unnoticed.
TDD: test_duplicate_metadata_block_fails / test_single_metadata_block_passes.
- De-duplicate the 6 docs/decisions.md records left with two stacked
metadata blocks (scan.getoraddfolder-db-lookup #488,
scan.musicvideo-reconciliation #494, scan.jellyfin-mixed-content-library
#489, iptv.logo-drives-bug-preset #67, ffmpeg.qsv-decode-encode-split
#498, ci.small-lane-git-only server-management#639), merging the union
of Signals/paths/issues/Mechanics from both blocks and keeping the
richer Rule wording; rationale prose untouched.
- Fill in the deferred Q6b row in docs/decisions/retrieval-eval.md now
that startup.parallel-orientation is active in docs/decisions.md,
scoring it as a real active-vs-superseded question against the
archived docs.queue-state-gitea-tracker.
- Regenerate docs/decisions/README.md via build_decisions_catalog.py.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Independent whole-branch adversarial review (SOUND-WITH-FIXES → all folded) + two cold-agent simulations, all against this head:
Startup sim: fresh agent went catalog-first, ran select-queue.sh, and never read #237 (cited the doc lines) — satisfies #520's cold-agent + no-#237 boxes.
Retrieval sim: 6/6 correct active-record selections, zero superseded returned; passed the #390→ci.runner-placement and #237→startup.parallel-orientation active-vs-superseded traps — satisfies #521's benchmark box.
Whole-branch review: confirmed the #520 startup rewrite complete+correct and the #237 supersession lifecycle-correct; its two SHOULD-FIX findings (stale migration-map header, conflicting session-start rule) folded in 1b207db8.
Local gates: 0 legacy / 108 active, decisions_validate --base origin/main PASS, catalog --check in sync, check-kickoff-guard OK, 31 pytest.
Review-verdict: MERGEABLE @ 1b207db87ce1246f5c46e0d820f94db494153396
Independent whole-branch adversarial review (SOUND-WITH-FIXES → all folded) + two cold-agent simulations, all against this head:
- **Startup sim**: fresh agent went catalog-first, ran select-queue.sh, and never read #237 (cited the doc lines) — satisfies #520's cold-agent + no-#237 boxes.
- **Retrieval sim**: 6/6 correct active-record selections, zero superseded returned; passed the #390→ci.runner-placement and #237→startup.parallel-orientation active-vs-superseded traps — satisfies #521's benchmark box.
- **Whole-branch review**: confirmed the #520 startup rewrite complete+correct and the #237 supersession lifecycle-correct; its two SHOULD-FIX findings (stale migration-map header, conflicting session-start rule) folded in 1b207db8.
- Local gates: 0 legacy / 108 active, decisions_validate --base origin/main PASS, catalog --check in sync, check-kickoff-guard OK, 31 pytest.
timothy
merged commit 063017584d into main2026-07-21 12:29:19 +02:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
PR2 of 2 — full decision migration + #520 startup rewrite —
fixes #520 #521Completes the knowledge-retrieval arc. PR1 (#526) shipped the machinery; this migrates the whole corpus and rewires startup so agents actually reach for it.
What this delivers
key/status/since/supersedes/superseded-by+Rule/Signals/Mechanics), fanned out across topic-file +decisions.mdbatches, gap-filled, de-duplicated, and quality-reviewed (28/108 sampled SOLID).docs/decisions/migration-map.mdrecords the non-trivial mappings.docs/handoffs/chicorytv-issue-queue.md,docs/README.md,CLAUDE.md,scripts/select-queue.sh): two concurrent tracks when no issue named (orientation ‖scripts/select-queue.sh 5), named-issue-skips-selection, the## Closing recordtemplate, and the four server-management#642 orientation bullets verbatim (catalog-first;Gitea-ErsatzTV= evidence-not-authority; the breadcrumb rule — a file path in a historical comment is a breadcrumb not a live pointer, resolve by concept; catalog→rgfallback, MemPalace never authority). Still-valid workflow lore preserved; pre-script selector lore demoted to a clearly-labeled archival section.docs.queue-state-gitea-trackerflipped tostatus: supersededand moved todocs/decisions/archive/startup.md, superseded by the new activestartup.parallel-orientation(reciprocal links; rationale preserved verbatim).scripts/check-kickoff-guard.sh— blocks any regression to treating #237 as live state; wired into thedecisions lifecycleCI job (non-vacuity proven: failed on pre-rewrite docs, passes after).retrieval-eval.mdexcluded from parsing; budget re-baselined to 4800 post-migration.docs/decisions/retrieval-eval.md— the active-vs-superseded retrieval benchmark (includes the #390→ci.runner-placementand #237→startup.parallel-orientationtraps).Verification (all local, pre-push)
decisions_validate.pyOK, 0 legacy, 108 active;--base origin/main --head HEADexit 0; catalog--checkin sync;check-kickoff-guard.shOK; 31 pytest pass; up to date with origin/main.select-queue.sh, understood the breadcrumb rule.server-management#642 (MemPalace exporter)
On merge I'll post "ready to mine —
decisions lifecyclegreen on<main-sha>" to #642; its 283-issue export is live + tiered and becomes reachable once this orientation block lands.fixes #520 #521
Review-verdict: MERGEABLE @
1b207db87cIndependent whole-branch adversarial review (SOUND-WITH-FIXES → all folded) + two cold-agent simulations, all against this head:
1b207db8.