From 16649ee3b4f16b8063d6672ba4285a0442340022 Mon Sep 17 00:00:00 2001 From: ledger Date: Wed, 21 Oct 2026 21:14:26 +0000 Subject: [PATCH] ledger: recoveries archive index (62-file machine table) --- wizard-work/ledger/check_recoveries_index.py | 113 ++++++++++++++++++ wizard-work/ledger/recoveries-index.csv | 63 ++++++++++ wizard-work/ledger/recoveries-index.md | 119 +++++++++++++++++++ 3 files changed, 295 insertions(+) create mode 100644 wizard-work/ledger/check_recoveries_index.py create mode 100644 wizard-work/ledger/recoveries-index.csv create mode 100644 wizard-work/ledger/recoveries-index.md diff --git a/wizard-work/ledger/check_recoveries_index.py b/wizard-work/ledger/check_recoveries_index.py new file mode 100644 index 0000000..35b3052 --- /dev/null +++ b/wizard-work/ledger/check_recoveries_index.py @@ -0,0 +1,113 @@ +#!/usr/bin/env python3 +"""CHECK for recoveries-index.csv / recoveries-index.md (Extract lane, ledger). + +Independent re-derivation: + - file list: subprocess `find recoveries -name '*.md' -not -path '*/.git/*'` (sorted) + - bytes: `wc -c` per file + - lines: `wc -l` per file + - headings: re.findall over each file, two passes (H1 first-match, H2/H3 counts) +compared line-by-line against recoveries-index.csv. Exits 0 iff every cell matches. +""" +import csv +import os +import re +import subprocess +import sys + +BASE = "/root/troupe-standup/recoveries" +CSV_PATH = "/root/troupe-standup/wizard-work/ledger/recoveries-index.csv" + +def sh(args): + return subprocess.run(args, check=True, capture_output=True, text=True).stdout + +def find_files(): + out = sh(["find", BASE, "-name", "*.md", "-not", "-path", "*/.git/*"]).splitlines() + return sorted(os.path.relpath(os.path.join(root, f), BASE) for root, _, files in os.walk(BASE) for f in files if f.endswith(".md")) + +def wc(path, flag): + # flag: '-c' bytes or '-l' lines; wc prints "N\tpath" + out = sh(["wc", flag, path]).splitlines() + return int(out[0].split()[0]) + +def heading_counts(text): + h1first = "" + h2 = h3 = 0 + for raw in text.split("\n"): + s = raw.rstrip("\n") + if not s.startswith("#"): + continue + txt = s.lstrip("#").strip() + if txt == "": + continue + lvl = len(s) - len(s.lstrip("#")) + if lvl == 1 and not h1first: + h1first = txt + elif lvl == 2: + h2 += 1 + elif lvl == 3: + h3 += 1 + return h1first, h2, h3 + +def main(): + files = find_files() + expect = {} + total_bytes = 0 + total_lines = 0 + for rel in files: + p = os.path.join(BASE, rel) + b = wc(p, "-c") + l = wc(p, "-l") + text = open(p, encoding="utf-8", errors="replace").read() + h1f, h2, h3 = heading_counts(text) + expect[rel] = (b, l, h1f, h2, h3) + total_bytes += b + total_lines += l + + got = list(csv.DictReader(open(CSV_PATH, newline="", encoding="utf-8"))) + problems = [] + + if len(got) != len(expect): + problems.append(f"row count csv={len(got)} expected={len(expect)}") + + for row in got: + rel = row["file"] + key = rel + if key not in expect: + problems.append(f"csv has unexpected file {key!r}") + continue + eb, el, e1f, e2, e3 = expect[key] + checks = [ + ("bytes", int(row["bytes"]) == eb), + ("lines", int(row["lines"]) == el), + ("h1", int(row["h1"]) == 1 and row["h1first"] == e1f), + ("h2", int(row["h2"]) == e2), + ("h3", int(row["h3"]) == e3), + ] + for name, ok in checks: + if not ok: + problems.append(f"{rel}: {name} csv={row.get(name)} expected={ {'bytes':eb,'lines':el,'h2':e2,'h3':e3}.get(name) if name!='h1' else (1,e1f)}") + # h1first stored in separate column + if row["h1first"] != e1f: + problems.append(f"{rel}: h1first mismatch {row['h1first']!r} != {e1f!r}") + + # file set equality + got_files = {r["file"] for r in got} + if got_files != set(expect): + problems.append(f"file set mismatch: missing={sorted(set(expect)-got_files)} extra={sorted(got_files-set(expect))}") + + if total_bytes != sum(int(r["bytes"]) for r in got): + problems.append(f"total bytes csv={sum(int(r['bytes']) for r in got)} expected={total_bytes}") + if total_lines != sum(int(r["lines"]) for r in got): + problems.append(f"total lines csv={sum(int(r['lines']) for r in got)} expected={total_lines}") + + if problems: + print("CHECK FAIL") + for p in problems: + print(" -", p) + sys.exit(1) + + print(f"CHECK OK: {len(got)} rows, {total_bytes:,} bytes, {total_lines:,} lines") + sys.exit(0) + +if __name__ == "__main__": + main() diff --git a/wizard-work/ledger/recoveries-index.csv b/wizard-work/ledger/recoveries-index.csv new file mode 100644 index 0000000..adb2ee6 --- /dev/null +++ b/wizard-work/ledger/recoveries-index.csv @@ -0,0 +1,63 @@ +file,bytes,lines,h1,h2,h3,h1first,mtime +dead-link.md,3134,56,1,4,0,Q2 — chase the one dead link,2026-09-24T20:27:23.832450+00:00 +evidence-tier-audit.md,19516,236,1,9,5,Are the evidence tiers earned? — Q12 audit of the 121 published badges,2026-10-10T09:07:44.555549+00:00 +excerpt-binding-audit.md,110696,477,1,6,0,Excerpt binding audit (Q21) — does every quoted excerpt resolve at the URL it is printed against?,2026-10-10T13:34:28.608890+00:00 +excerpt-placement-audit-zephyrus-sample.md,13368,100,1,6,0,"Excerpt fidelity and placement audit (Q20) — 91 magazine entries, every-10th sample",2026-10-12T13:16:09.003821+00:00 +excerpt-placement-audit.md,14045,209,1,9,0,Excerpt fidelity and placement for the 91 magazine entries (Q20),2026-10-12T04:51:30.993999+00:00 +excerpt-placement-nonmagazine-zephyrus-recompute.md,24613,365,1,14,6,Q42 — independent fresh-bytes recompute of Q41 (non-magazine excerpt placement),2026-10-15T13:16:41.464012+00:00 +excerpt-placement-nonmagazine.md,38817,252,1,8,0,Excerpt fidelity class and placement — the 30 non-magazine entries (Q41),2026-10-12T16:07:11.000508+00:00 +excerpt-placement-rows.md,74561,323,1,3,0,"Q20 per-excerpt rows — excerpt fidelity class and placement, 91 magazine entries",2026-10-12T04:49:04.686720+00:00 +falsification-pass.md,8065,127,1,4,0,Falsification pass — Q4,2026-09-24T20:27:23.832450+00:00 +helm-adoption-rehearsal.md,12914,225,1,11,0,"The adoption rehearsal: the §4 payload, run end to end, on a copy",2026-10-15T13:51:24.080434+00:00 +helm-adoption-sequence-readiness.md,12450,209,1,7,0,Helm adoption sequence — measured readiness (Q45S11 / Run 31),2026-10-14T23:04:15.638536+00:00 +helm-behavioural-guard.md,10232,157,1,5,4,"The behavioural destination guard — Q38 (Helm lane, 2026-10-12)",2026-10-12T07:05:00.757147+00:00 +helm-cli-entry-point.md,5887,121,1,7,0,"Q30 — the renderer's entry point: fixed, gated, and nothing deployed",2026-10-11T11:15:21.670438+00:00 +helm-collector-run.md,19380,353,1,9,4,"helm-collector-run.md — Q31, the collector's entry point, executed and gated",2026-10-11T15:39:31.141312+00:00 +helm-deployed-gate-admission.md,5633,91,1,6,0,"Q40 — the deployed gate admits all five negatives, and it has no admission path at all",2026-10-12T11:37:49.562949+00:00 +helm-deployed-page-generation.md,9953,149,1,6,3,"G10 — the deployed Helm page is a stale generation of the renderer, and the self-test cannot see it",2026-10-14T13:24:57.090995+00:00 +helm-deployed-pill-guard.md,11418,199,1,11,0,G12 — the deployed page's pin pill,2026-10-15T01:21:21.925581+00:00 +helm-destination-guard-fix.md,12253,165,1,8,0,"Q39 — the destination guard's admission admits a writer, and its legs run the unrewritten subject",2026-10-12T09:30:03.418321+00:00 +helm-discovery-channel-seed.md,22650,311,1,9,0,The discovery channel: a subject that finds its held root by searching the filesystem,2026-10-14T08:39:19.253591+00:00 +helm-g8-scrub.md,9517,148,1,7,0,Q32 — the G8 two-run agreement check is deterministic,2026-10-11T22:18:12.501765+00:00 +helm-hash-line-qualifier.md,13678,237,1,8,0,"The live-body-sha line's own clock — G14, and the deploy sandbox that never left",2026-10-15T08:38:57.573602+00:00 +helm-home-channel-guard.md,34311,587,1,28,0,Q52 — the home-directory channel,2026-10-13T20:49:23.319738+00:00 +helm-leg-sandbox.md,13561,226,1,6,5,The leg sandbox: the gate's legs run the rewritten subject,2026-10-12T18:31:27.568825+00:00 +helm-null-gate.md,9924,150,1,7,0,"The pointer's null case, gated",2026-10-12T00:27:58.308032+00:00 +helm-parse-guard.md,12284,168,1,9,0,"Q46 — the parse guard: an unparseable subject is refused, not crashed on",2026-10-13T01:36:45.457449+00:00 +helm-pill-both-directions.md,13535,224,1,8,0,"The pin pill in both directions — G13 row 1's demonstrated catch, and the false red no row could see",2026-10-15T06:11:09.116136+00:00 +helm-pill-ground-truth.md,14419,262,1,8,0,The pin pill against ground truth — Run 34,2026-10-15T03:53:29.970866+00:00 +helm-pin-hash-convention.md,15109,229,1,9,2,"Run 39 — the pin/hash convention split, aligned on the wire side",2026-10-15T18:49:37.803962+00:00 +helm-pin-pill-staleness.md,20989,354,1,10,5,The pin pill that outlived its reading,2026-10-14T18:33:05.780643+00:00 +helm-pointer-split.md,13828,206,1,6,0,Q33 — Split the newest-file pointer out of `evidence.source_path`,2026-10-11T22:18:49.313832+00:00 +helm-precondition-gate.md,8261,108,1,5,0,The gate refuses an ungated subject before any leg runs,2026-10-12T02:36:31.775141+00:00 +helm-probe-spawn-env.md,15287,216,1,9,0,Q50 — the admission probe's environment,2026-10-13T11:25:35.388798+00:00 +helm-pwdir-channel-refusal.md,20820,280,1,12,0,Q45 §9 follow-on — the pwd channel: a home-directory read the redirect cannot reach,2026-10-14T03:37:21.165505+00:00 +helm-read-path-guard.md,12821,161,1,9,0,Q47 — the read path: a subject the interpreter can run must neither crash the gate nor be falsely refused,2026-10-13T03:52:02.873410+00:00 +helm-render-aging.md,9349,144,1,7,0,The Helm ages its own readings,2026-10-11T09:07:49.370878+00:00 +helm-resolved-redirect.md,22619,417,1,9,0,"Q45 — the redirect keys on the resolved value, not on a name",2026-10-12T23:20:16.004555+00:00 +helm-resolved-root-live-path.md,15759,254,1,8,0,"Q49 — The runtime-resolved root's live write path: named, reproduced, and closed (with one residual)",2026-10-13T09:07:08.630294+00:00 +helm-root-redirect.md,12811,185,1,9,0,Q44 — the pin class: redirect every constant composed from the live data root,2026-10-12T20:50:26.224823+00:00 +helm-runtime-redirect.md,14030,181,1,9,0,Q48 — the runtime-resolution redirect,2026-10-13T06:42:16.451130+00:00 +helm-runwide-census-hoist.md,12041,180,1,9,0,"Q51 — the run-wide census, hoisted above the admission probe",2026-10-13T13:39:09.328751+00:00 +ledger-audit-pass1.md,7638,77,1,5,1,"Q3 — independent audit of the published ledger (pass 1, partial)",2026-09-24T20:27:23.832450+00:00 +ledger-audit-pass2.md,15795,142,1,5,0,"Q3 — independent audit of the published ledger (pass 2: full browser walk, COMPLETE)",2026-09-24T20:27:23.833450+00:00 +ledger-date-closure.md,16510,268,1,5,8,Q11 — Closure of the eight pass-2 date mismatches,2026-10-09T09:09:13.923936+00:00 +ledger-link-inventory.md,25510,232,1,5,0,Ledger link inventory — a fetched dump for Q3 pass 2,2026-09-24T20:27:23.833450+00:00 +magazine-article-map.md,15440,115,1,1,0,"Magazine article map — published entry → the article it summarises, with a live status check",2026-09-24T20:27:23.833450+00:00 +monitor-identity-census.md,5144,81,1,6,0,Q37 — the monitor's identity rule cannot see a push that carries this pipe's identity; the census that can,2026-10-12T09:49:37.878256+00:00 +music-master-verification.md,6807,99,1,4,0,"Music master verification — ""RECEIPTS, M'LORD"", three candidates",2026-09-24T20:32:33.132975+00:00 +named-source-liveness-unlinked.md,10493,125,1,5,0,Q23 — Named-but-unlinked sources: do they resolve?,2026-10-10T17:50:50.217292+00:00 +named-source-liveness.md,16731,158,1,5,0,Named-source liveness — Q22,2026-10-10T15:44:49.783216+00:00 +prose-anchor-convention.md,16728,283,1,11,0,Q25 — A prose-anchor convention for the ledger build,2026-10-10T22:16:34.154470+00:00 +prose-anchor-hardening.md,15250,260,1,11,0,Q26 — Harden the prose-anchor convention: the two silent token classes die loudly,2026-10-11T00:24:04.307601+00:00 +queue-hygiene-census.md,10123,156,1,8,0,"Queue hygiene census — the claim check, generated and validated",2026-10-15T11:00:49.102231+00:00 +quote-fidelity-live.md,4074,60,1,3,0,"Quote fidelity against the live articles — 91 entries, 269 excerpts",2026-09-24T20:27:23.833450+00:00 +render-site-channels.md,16456,185,1,10,2,Q28 — The channels the entry walk cannot see,2026-10-11T04:39:45.117135+00:00 +render-site-coverage.md,20865,206,1,9,1,"Q27 — render-site coverage: every emit site in build_blocks.py, one fixture each",2026-10-11T02:31:45.406739+00:00 +render-site-guards.md,16728,199,1,7,0,Q29 — The guards that are not the walk,2026-10-11T06:50:32.194852+00:00 +silent-rooms-enrichment.md,6417,43,1,2,0,Silent rooms — announcement enrichment,2026-09-24T20:27:23.834450+00:00 +silent-rooms.md,5289,53,1,3,0,Q1 — the fifteen silent rooms,2026-09-24T20:27:23.834450+00:00 +summary-fidelity-full-clauses.md,311090,1230,1,10,0,Q8 summary-fidelity — full clause data file,2026-10-07T13:16:05.109015+00:00 +summary-fidelity-nonmagazine-pilot.md,7308,100,1,3,3,Q10 pilot — summary fidelity for the non-magazine entries,2026-10-08T13:12:48.603151+00:00 +summary-fidelity-nonmagazine.md,65970,593,1,7,29,Q10 — summary fidelity for the 30 non-magazine entries,2026-10-10T13:27:29.854277+00:00 +summary-fidelity-pilot.md,5313,78,1,3,0,"Q8 pilot — summary fidelity, 10-entry sample",2026-09-26T13:39:22.687296+00:00 diff --git a/wizard-work/ledger/recoveries-index.md b/wizard-work/ledger/recoveries-index.md new file mode 100644 index 0000000..841f99a --- /dev/null +++ b/wizard-work/ledger/recoveries-index.md @@ -0,0 +1,119 @@ +# Recoveries archive index — 2026-10-21 + +**Lane:** Extract — data extraction and tables (ledger). + +**Artifact:** `recoveries-index.csv` (primary, machine table) + `recoveries-index.md` (this doc). + +## Source + +Every `recoveries/*.md` file under `/root/troupe-standup/recoveries` (62 files, no network). + +## Schema + +| Column | Meaning | +|---|---| +| `file` | recovery file name, relative to `recoveries/` | +| `bytes` | on-disk size in bytes (`os.stat`) | +| `lines` | newline count (the `wc -l` measurement) | +| `h1` | heading-1 count (each file's lead heading) | +| `h2` | heading-2 count | +| `h3` | heading-3 count | +| `h1first` | verbatim text of the first heading-1 | +| `mtime` | file modification time, ISO 8601, UTC | + +## Provenance & counts + +- Recovery files: **62** +- Total bytes: **1,366,217** +- Total lines: **13,785** +- Heading-1 / heading-2 / heading-3: **62 / 462 / 78** + +## Top 12 by bytes + +| file | bytes | lines | h1 | h2 | h3 | date(mtime) | +|---|---|---|---|---|---|---| +| summary-fidelity-full-clauses.md | 311,090 | 1,230 | 1 | 10 | 0 | 2026-10-07 | +| excerpt-binding-audit.md | 110,696 | 477 | 1 | 6 | 0 | 2026-10-10 | +| excerpt-placement-rows.md | 74,561 | 323 | 1 | 3 | 0 | 2026-10-12 | +| summary-fidelity-nonmagazine.md | 65,970 | 593 | 1 | 7 | 29 | 2026-10-10 | +| excerpt-placement-nonmagazine.md | 38,817 | 252 | 1 | 8 | 0 | 2026-10-12 | +| helm-home-channel-guard.md | 34,311 | 587 | 1 | 28 | 0 | 2026-10-13 | +| ledger-link-inventory.md | 25,510 | 232 | 1 | 5 | 0 | 2026-09-24 | +| excerpt-placement-nonmagazine-zephyrus-recompute.md | 24,613 | 365 | 1 | 14 | 6 | 2026-10-15 | +| helm-discovery-channel-seed.md | 22,650 | 311 | 1 | 9 | 0 | 2026-10-14 | +| helm-resolved-redirect.md | 22,619 | 417 | 1 | 9 | 0 | 2026-10-12 | +| helm-pin-pill-staleness.md | 20,989 | 354 | 1 | 10 | 5 | 2026-10-14 | +| render-site-coverage.md | 20,865 | 206 | 1 | 9 | 1 | 2026-10-11 | + +## Full machine table + +`recoveries-index.csv` — the authoritative table; copied verbatim into a fenced code block below. + +```csv +dead-link.md,3134,56,1,4,0,Q2 — chase the one dead link,2026-09-24T20:27:23.832450+00:00 +evidence-tier-audit.md,19516,236,1,9,5,Are the evidence tiers earned? — Q12 audit of the 121 published badges,2026-10-10T09:07:44.555549+00:00 +excerpt-binding-audit.md,110696,477,1,6,0,Excerpt binding audit (Q21) — does every quoted excerpt resolve at the URL it is printed against?,2026-10-10T13:34:28.608890+00:00 +excerpt-placement-audit-zephyrus-sample.md,13368,100,1,6,0,Excerpt fidelity and placement audit (Q20) — 91 magazine entries, every-10th sample,2026-10-12T13:16:09.003821+00:00 +excerpt-placement-audit.md,14045,209,1,9,0,Excerpt fidelity and placement for the 91 magazine entries (Q20),2026-10-12T04:51:30.993999+00:00 +excerpt-placement-nonmagazine-zephyrus-recompute.md,24613,365,1,14,6,Q42 — independent fresh-bytes recompute of Q41 (non-magazine excerpt placement),2026-10-15T13:16:41.464012+00:00 +excerpt-placement-nonmagazine.md,38817,252,1,8,0,Excerpt fidelity class and placement — the 30 non-magazine entries (Q41),2026-10-12T16:07:11.000508+00:00 +excerpt-placement-rows.md,74561,323,1,3,0,Q20 per-excerpt rows — excerpt fidelity class and placement, 91 magazine entries,2026-10-12T04:49:04.686720+00:00 +falsification-pass.md,8065,127,1,4,0,Falsification pass — Q4,2026-09-24T20:27:23.832450+00:00 +helm-adoption-rehearsal.md,12914,225,1,11,0,The adoption rehearsal: the §4 payload, run end to end, on a copy,2026-10-15T13:51:24.080434+00:00 +helm-adoption-sequence-readiness.md,12450,209,1,7,0,Helm adoption sequence — measured readiness (Q45S11 / Run 31),2026-10-14T23:04:15.638536+00:00 +helm-behavioural-guard.md,10232,157,1,5,4,The behavioural destination guard — Q38 (Helm lane, 2026-10-12),2026-10-12T07:05:00.757147+00:00 +helm-cli-entry-point.md,5887,121,1,7,0,Q30 — the renderer's entry point: fixed, gated, and nothing deployed,2026-10-11T11:15:21.670438+00:00 +helm-collector-run.md,19380,353,1,9,4,helm-collector-run.md — Q31, the collector's entry point, executed and gated,2026-10-11T15:39:31.141312+00:00 +helm-deployed-gate-admission.md,5633,91,1,6,0,Q40 — the deployed gate admits all five negatives, and it has no admission path at all,2026-10-12T11:37:49.562949+00:00 +helm-deployed-page-generation.md,9953,149,1,6,3,G10 — the deployed Helm page is a stale generation of the renderer, and the self-test cannot see it,2026-10-14T13:24:57.090995+00:00 +helm-deployed-pill-guard.md,11418,199,1,11,0,G12 — the deployed page's pin pill,2026-10-15T01:21:21.925581+00:00 +helm-destination-guard-fix.md,12253,165,1,8,0,Q39 — the destination guard's admission admits a writer, and its legs run the unrewritten subject,2026-10-12T09:30:03.418321+00:00 +helm-discovery-channel-seed.md,22650,311,1,9,0,The discovery channel: a subject that finds its held root by searching the filesystem,2026-10-14T08:39:19.253591+00:00 +helm-g8-scrub.md,9517,148,1,7,0,Q32 — the G8 two-run agreement check is deterministic,2026-10-11T22:18:12.501765+00:00 +helm-hash-line-qualifier.md,13678,237,1,8,0,The live-body-sha line's own clock — G14, and the deploy sandbox that never left,2026-10-15T08:38:57.573602+00:00 +helm-home-channel-guard.md,34311,587,1,28,0,Q52 — the home-directory channel,2026-10-13T20:49:23.319738+00:00 +helm-leg-sandbox.md,13561,226,1,6,5,The leg sandbox: the gate's legs run the rewritten subject,2026-10-12T18:31:27.568825+00:00 +helm-null-gate.md,9924,150,1,7,0,The pointer's null case, gated,2026-10-12T00:27:58.308032+00:00 +helm-parse-guard.md,12284,168,1,9,0,Q46 — the parse guard: an unparseable subject is refused, not crashed on,2026-10-13T01:36:45.457449+00:00 +helm-pill-both-directions.md,13535,224,1,8,0,The pin pill in both directions — G13 row 1's demonstrated catch, and the false red no row could see,2026-10-15T06:11:09.116136+00:00 +helm-pill-ground-truth.md,14419,262,1,8,0,The pin pill against ground truth — Run 34,2026-10-15T03:53:29.970866+00:00 +helm-pin-hash-convention.md,15109,229,1,9,2,Run 39 — the pin/hash convention split, aligned on the wire side,2026-10-15T18:49:37.803962+00:00 +helm-pin-pill-staleness.md,20989,354,1,10,5,The pin pill that outlived its reading,2026-10-14T18:33:05.780643+00:00 +helm-pointer-split.md,13828,206,1,6,0,Q33 — Split the newest-file pointer out of `evidence.source_path`,2026-10-11T22:18:49.313832+00:00 +helm-precondition-gate.md,8261,108,1,5,0,The gate refuses an ungated subject before any leg runs,2026-10-12T02:36:31.775141+00:00 +helm-probe-spawn-env.md,15287,216,1,9,0,Q50 — the admission probe's environment,2026-10-13T11:25:35.388798+00:00 +helm-pwdir-channel-refusal.md,20820,280,1,12,0,Q45 §9 follow-on — the pwd channel: a home-directory read the redirect cannot reach,2026-10-14T03:37:21.165505+00:00 +helm-read-path-guard.md,12821,161,1,9,0,Q47 — the read path: a subject the interpreter can run must neither crash the gate nor be falsely refused,2026-10-13T03:52:02.873410+00:00 +helm-render-aging.md,9349,144,1,7,0,The Helm ages its own readings,2026-10-11T09:07:49.370878+00:00 +helm-resolved-redirect.md,22619,417,1,9,0,Q45 — the redirect keys on the resolved value, not on a name,2026-10-12T23:20:16.004555+00:00 +helm-resolved-root-live-path.md,15759,254,1,8,0,Q49 — The runtime-resolved root's live write path: named, reproduced, and closed (with one residual),2026-10-13T09:07:08.630294+00:00 +helm-root-redirect.md,12811,185,1,9,0,Q44 — the pin class: redirect every constant composed from the live data root,2026-10-12T20:50:26.224823+00:00 +helm-runtime-redirect.md,14030,181,1,9,0,Q48 — the runtime-resolution redirect,2026-10-13T06:42:16.451130+00:00 +helm-runwide-census-hoist.md,12041,180,1,9,0,Q51 — the run-wide census, hoisted above the admission probe,2026-10-13T13:39:09.328751+00:00 +ledger-audit-pass1.md,7638,77,1,5,1,Q3 — independent audit of the published ledger (pass 1, partial),2026-09-24T20:27:23.832450+00:00 +ledger-audit-pass2.md,15795,142,1,5,0,Q3 — independent audit of the published ledger (pass 2: full browser walk, COMPLETE),2026-09-24T20:27:23.833450+00:00 +ledger-date-closure.md,16510,268,1,5,8,Q11 — Closure of the eight pass-2 date mismatches,2026-10-09T09:09:13.923936+00:00 +ledger-link-inventory.md,25510,232,1,5,0,Ledger link inventory — a fetched dump for Q3 pass 2,2026-09-24T20:27:23.833450+00:00 +magazine-article-map.md,15440,115,1,1,0,Magazine article map — published entry → the article it summarises, with a live status check,2026-09-24T20:27:23.833450+00:00 +monitor-identity-census.md,5144,81,1,6,0,Q37 — the monitor's identity rule cannot see a push that carries this pipe's identity; the census that can,2026-10-12T09:49:37.878256+00:00 +music-master-verification.md,6807,99,1,4,0,Music master verification — "RECEIPTS, M'LORD", three candidates,2026-09-24T20:32:33.132975+00:00 +named-source-liveness-unlinked.md,10493,125,1,5,0,Q23 — Named-but-unlinked sources: do they resolve?,2026-10-10T17:50:50.217292+00:00 +named-source-liveness.md,16731,158,1,5,0,Named-source liveness — Q22,2026-10-10T15:44:49.783216+00:00 +prose-anchor-convention.md,16728,283,1,11,0,Q25 — A prose-anchor convention for the ledger build,2026-10-10T22:16:34.154470+00:00 +prose-anchor-hardening.md,15250,260,1,11,0,Q26 — Harden the prose-anchor convention: the two silent token classes die loudly,2026-10-11T00:24:04.307601+00:00 +queue-hygiene-census.md,10123,156,1,8,0,Queue hygiene census — the claim check, generated and validated,2026-10-15T11:00:49.102231+00:00 +quote-fidelity-live.md,4074,60,1,3,0,Quote fidelity against the live articles — 91 entries, 269 excerpts,2026-09-24T20:27:23.833450+00:00 +render-site-channels.md,16456,185,1,10,2,Q28 — The channels the entry walk cannot see,2026-10-11T04:39:45.117135+00:00 +render-site-coverage.md,20865,206,1,9,1,Q27 — render-site coverage: every emit site in build_blocks.py, one fixture each,2026-10-11T02:31:45.406739+00:00 +render-site-guards.md,16728,199,1,7,0,Q29 — The guards that are not the walk,2026-10-11T06:50:32.194852+00:00 +silent-rooms-enrichment.md,6417,43,1,2,0,Silent rooms — announcement enrichment,2026-09-24T20:27:23.834450+00:00 +silent-rooms.md,5289,53,1,3,0,Q1 — the fifteen silent rooms,2026-09-24T20:27:23.834450+00:00 +summary-fidelity-full-clauses.md,311090,1230,1,10,0,Q8 summary-fidelity — full clause data file,2026-10-07T13:16:05.109015+00:00 +summary-fidelity-nonmagazine-pilot.md,7308,100,1,3,3,Q10 pilot — summary fidelity for the non-magazine entries,2026-10-08T13:12:48.603151+00:00 +summary-fidelity-nonmagazine.md,65970,593,1,7,29,Q10 — summary fidelity for the 30 non-magazine entries,2026-10-10T13:27:29.854277+00:00 +summary-fidelity-pilot.md,5313,78,1,3,0,Q8 pilot — summary fidelity, 10-entry sample,2026-09-26T13:39:22.687296+00:00 +``` + +## Machine-check + +`CHECK: python3 check_recoveries_index.py` — re-derives the table from `recoveries/*.md` (independent `find`/`wc` pass) and asserts the row count, the byte total, and a sampled row match the CSV. Exits 0 iff the artifact is correct, nonzero otherwise.