[HARDENING] PENDING-127 built — and the defect was unary, not binary

emit fingerprinted 261 of 261 Alexander regions under a hardcoded date. The
fix records no new fingerprints at all, because name-landing is anchor-start
evidence and content_sha256 is a whole-span claim.

My filed acceptance fixture was stale — Alexander front_matter was partitioned
out on 2026-08-07 — and measuring produced a better control than I specified:
Alexander against Mauss, two real artifacts. stale stays synthetic and labelled.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A35wiD55yRHj5U1ECZAX4t
This commit is contained in:
David F Glidden
2026-08-08 18:34:48 +02:00
co-authored by Claude Opus 5
parent 6c42878e27
commit 5dd158eec1
+19 -1
View File
@@ -2171,6 +2171,24 @@ Three cases, all discriminated: a rule ran → existing output already says so,
**Files affected:** `~/_Dev/studium-engine/docs/spec/r0-reading-index-contract.md` §4; `~/_Dev/studium-engine/engine/reading_index.py` (`emit`).
**Awaiting:** Steward authorization (D-1 lane).
**Awaiting:** ~~Steward authorization (D-1 lane).~~ → **BUILT 2026-08-08, `ccc4d6c`.**
---
### AMENDMENT 1 — 2026-08-08, built; and the defect was one degree worse than filed
**§A — Not binary. UNARY.** `emit` promoted `baseline_sha256` → `content_sha256` on **every** region — measured **261 of 261** for Alexander, including regions no instrument had verified — under the **hardcoded** date `"2026-08-07"`. So three different answers lived in one contract and one module: §3 three states, §4 two, the code one.
**§B — The fix goes further than (a) asked, on this item's own logic.** A `content_sha256` attests the **whole span**; name-landing is evidence about the anchor's **first line**. Recording the former because the latter held **promotes a weaker claim into a stronger one** — the PENDING-47 shape. So emission now records **no new fingerprints at all**: verified-by-fingerprint keeps its stored hash · verified-by-name-landing carries none · `stale` keeps the stored hash unaltered · `unverified` carries none. `baseline_sha256` is not emitted — recomputable at any moment, and a baseline in a reviewable artifact is an invitation to promote it. **A fingerprint now enters only through an attested re-verification**, which is PENDING-121 condition 4 made reachable.
**§C — The divergence guard.** State determination is now **one function** (`region_state`) called by both `validate` and `emit`, which had silently disagreed. That is §3's own *"one mechanism with two call sites, not two mechanisms that drift"*, applied to this module's **interior** rather than to the pair it was written about.
**§D — ⚠ THE ACCEPTANCE FIXTURE I FILED WAS STALE, and measuring corrected it.** I wrote that Alexander's five `front_matter` anchors must emit `unverified`. They were **partitioned out on 2026-08-07**; Alexander is now **261/261 name-landing with zero unverified**. The real unverified population is **Mauss 23 + after-the-reply 33 = 56**. So the discriminating pair is **Alexander against Mauss — two real artifacts**, which is a better control than the one I specified. Totals now: **271 verified · 56 unverified · 0 stale · 0 fingerprints**, and **emit and validate agree on all of it**.
⚠ **`stale` is unreachable from live data** — no region carries a stored hash, so nothing can mismatch. Its control is **synthetic and labelled synthetic**, rather than letting the real pair cover a state it cannot reach.
**§E — One pre-existing check went red and was REPLACED, not deleted.** It asserted the promotion this item rules a defect. A test that pinned the old contract is evidence of what the contract used to say, so the reversal is left legible in place.
**Landed:** contract **v0.1 → v0.2** with the superseded sentence preserved in place; suite **31 → 44**; fleet **7/7 green**. Both trigger rules fired on the commit.
---