diff --git a/PENDING.md b/PENDING.md index 8e62712..a9f2597 100644 --- a/PENDING.md +++ b/PENDING.md @@ -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. ---