session 2026-07-25→27: spec v2.7.0 (REVIEWED-75) + v2.8.0 (REVIEWED-73 voice-purity) landed; source_lines FIX ×2; 2 skill proposals
Session file + ledger returns + 7 KG appends (2 drift-patterns, 3 good-direction, 2 facts) + feedback-derive-the-rule-from-the-consumer-not-from-the-survivor. MEMORY.md: prior Active Session demoted to MEMORY-reference.md, new promoted. Skill-harvest register: /wake-up backlog substrate-check patch + /field-divergence-sweep create, both PROPOSED for steward authorization. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Xefg5EXwcpd9RMAr63dWrD
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
0a7feef12c
commit
d7824cffe8
@@ -30,6 +30,7 @@ Split out of [MEMORY.md](MEMORY.md) on 2026-07-06 to keep the wake-loaded index
|
||||
# Archived sessions + stable reference layer (relocated verbatim from MEMORY.md, 2026-07-06)
|
||||
|
||||
## Archived (2026-07-24 night — the V-TEXT wave's first bite censused the whole class; the unlock is named, the engine track is independent; demoted on promote at the 2026-07-25 wrap)
|
||||
- [Session 2026-07-25 — cleaner A (footnote-aware) built + the mechanism-census that ended the guessing](session-2026-07-25-cleaner-a-footnote-aware-and-the-mechanism-census-that-ended-the-guessing.md) — Built **cleaner A** (`scripts/strip_source_presentation.py`) test-first into a **footnote-aware presentational stripper** per the steward's **3-gate ruling**: (1) apparatus-preservation guard INSIDE the tool (`verify_apparatus` — note elements + href→id link graph; the failure `verify_lossless` is blind to; text-losslessness ≠ apparatus-preservation), (2) relational rules throughout (unwrap gated on `epub:type` + live link graph, never a name list), (3) policy as governed declared data, not a tool default (`unwrap_wrappers` OFF by default). Fleet 234→248 (commits `6d7ff84`→`73ae8e3`). Proved on `the-shape-of-a-pocket`: solves layer-1 (class→0) + layer-2 (div-fences 150→48) **footnote-safe** (7 defs); residual is **curation-policy, not a tool gap**. **LITERAL Q "is heavy-styled one fix deep?" ANSWERED: NO** (class markers · fences · internal-nav · art plates are distinct kinds). **⚑ Two self-corrections (assert-from-derived, twice): buggy `\b` census + `^..\d+..:` def-count regexes** → caught vs substrate; the false "div-unwrap breaks footnotes 7→0" had shaped part of the ruling, corrected before propagating. **The reflective turn (steward: "could we have foreseen this? whack-a-mole?")** → banked **[[feedback-census-by-mechanism-not-proxy]]** + RAN a **mechanism-census over 48 wave files** (`_curation/mechanism-census-2026-07-25.tsv`, `a527e0a`; volume-census superseded `06331fb`): **8 clean/near-clean · 21 internal-nav (one ruling) · 2 MIXED 2nd-mechanism · 8 pandoc-class-leak [all French/translation] · 8 glyph-needed · 1 azw3.** Dominant lever = **ONE internal-nav CURATION RULING (~31 files), NOT one cleaner.** Steward's held-point validated (banked lesson's first live test): "ONE ruling clears 23" is inference-from-composition (the gap that falsified the volume census) → checked → clears **21/23**; 2 hide a 2nd mechanism. **PULLING THREAD = the internal-nav curation ruling** (constitutional-adjacent: *what a canonical IS*), deferred to a **fresh head**; first validate on ONE file (composition ≠ what-removal-does), pre-frame as a SPLIT (carrier-dangling `#filepos` vs surviving-target), second-hand-check the census tool in a different bucket. State: 5 commits UNPUSHED (Gitea flaky — steward's call); `graduation-spec.yaml` WIP uncommitted (last session's); no canonical touched. Read the session file + the census TSV at wake.
|
||||
- [Session 2026-07-24 night — the V-TEXT wave's first bite censused the whole class; the unlock is named, the engine track is independent](session-2026-07-24-night-vtext-wave-censused-cleaner-unlock-engine-tracks.md) — Ran ONE file (Moby-Dick) end-to-end: **calibration ANSWERED** (clean PASS, fab 0, threshold-40 holds) but a cascade (edition-swap Penguin→B&N · imaged `$` glyph the backup-only census MISSED, caught by the lane's live guard · `strip_cruft` can't clean nested calibre spans) resolved into a ROOT — **`test_tools` = 35 unit tests / 0 integration tests**, so the REVIEWED-72 writer switch (`gfm-raw_html`→`markdown-smart`) silently **orphaned `clean_pandoc_html_residue` AND the ratified footnote fallback (REVIEWED-54 §5)**. Turned whack-a-mole into a **finite census** (`_curation/v-text-wave-gap-census-2026-07-24.md`) — **SUPERSEDED IN PART 2026-07-25** by the mechanism-census (its "31→one fix" was a volume proxy; see [[feedback-census-by-mechanism-not-proxy]]). **PULLING THREAD was: build the unlock, prove it by graduating `the-shape-of-a-pocket`** — done 2026-07-25 (cleaner A built; the answer: NOT one fix deep). LITERAL Q ("is 'heavy-styled' one fix deep") → ANSWERED no.
|
||||
|
||||
## Archived (2026-07-24 evening-continued — REVIEWED-72/74 BUILT + LANDED atomically (spec v2.6.0); the 47-file V-TEXT wave UNBLOCKED; demoted on promote at the 2026-07-24 night wrap)
|
||||
|
||||
@@ -24,6 +24,7 @@ permalink: claude-memory/memory
|
||||
- [Constitution-as-block, then pull-based corpus](feedback-constitution-as-block-then-pull-based-corpus.md) — steward discipline (2026-07-14): finish the **constitution as one block FIRST**, THEN corpus-into-spec **pulled by what each engine phase needs**. **Bounded question → bounded answer; don't surface N new threads**; keep open-thread count LOW. Above [[feedback-shorter-concentrated-sessions]].
|
||||
- [Close thoroughly — no frequent deferrals](feedback-close-thoroughly-no-frequent-deferrals.md) — steward directive (2026-07-16): **frequent deferrals ARE how the cloud accumulated**; close ALL of a block that's closable-now; distinguish closable-now vs genuinely-blocked (**name the specific dependency**, never a vague defer). Completeness complement to [[feedback-constitution-as-block-then-pull-based-corpus]].
|
||||
- [Checkable claim surfaces bugs](feedback-checkable-claim-surfaces-bugs.md) — insisting on a checkable claim (number, substrate-fact, discriminating test) over a soft classification repeatedly EXPOSES a real bug; the demand for verifiability is itself a defect-detector. Steward-named 2026-07-13. (Caught F-5 + the "finally" overclaim, 2026-07-17.)
|
||||
- [Derive the rule from the consumer, not the survivor](feedback-derive-the-rule-from-the-consumer-not-from-the-survivor.md) — when two implementations of one field disagree, picking the survivor is **selection, not derivation**; derive from what a CONSUMER must do (both `source_lines` candidates were wrong on **complementary subsets** ⇒ no single sample distinguishes them ⇒ migrations must RECOMPUTE, and the fix is ONE imported implementation). Earned 2026-07-27, lintott off by 308 lines.
|
||||
- [Census by mechanism, not proxy](feedback-census-by-mechanism-not-proxy.md) — a plan-of-record generalization must carry the instrument that can bear it; census by RUNNING the real pipeline, not a cheap proxy (class-volume ≠ fix-class); distrust the bucket that arrives when you want to feel done. The 2026-07-24 "31 heavy-styled = one fix" proved wrong on first real run (2026-07-25). Kin to [[feedback-completion-is-a-tripwire]], [[feedback-checkable-claim-surfaces-bugs]].
|
||||
- [Completion is a tripwire](feedback-completion-is-a-tripwire.md) — the *feeling* of "done" is the cue to verify the tail (census/gate/scan-check), not the signal to ship; the last 10% is invisible from inside the first 90%. Ninety-Ninety as a security property (steward 2026-07-06).
|
||||
- [Studium Engine charter](reference-studium-engine-architectural-charter.md) — the engine's constitutional doc (`studium-engine/docs/the-studium-engine-architectural-charter.md`): reasoner-at-centre over a BOUNDED provenanced corpus; three cognitions; boundedness=trust. Read before building the engine.
|
||||
@@ -59,7 +60,7 @@ permalink: claude-memory/memory
|
||||
- [Be (laundromat)](project-be-laundromat.md) — canonical Be tracker (est. 2026-06-08). Be = Skemantix startup (Seb+David) funding CapableMind's ladder; **bridge, not venture**. Decisions LOCKED (entity/pricing/infra in file); a11y gate MERGED. **Pre-revenue WTP gate = renovate Pat → charge her; discipline: no new spec until it clears → nothing for executor on be.** Repo @ `f43a0fd`.
|
||||
|
||||
## Active Session
|
||||
- [Session 2026-07-25 — cleaner A (footnote-aware) built + the mechanism-census that ended the guessing](session-2026-07-25-cleaner-a-footnote-aware-and-the-mechanism-census-that-ended-the-guessing.md) — Built **cleaner A** (`scripts/strip_source_presentation.py`) test-first into a **footnote-aware presentational stripper** per the steward's **3-gate ruling**: (1) apparatus-preservation guard INSIDE the tool (`verify_apparatus` — note elements + href→id link graph; the failure `verify_lossless` is blind to; text-losslessness ≠ apparatus-preservation), (2) relational rules throughout (unwrap gated on `epub:type` + live link graph, never a name list), (3) policy as governed declared data, not a tool default (`unwrap_wrappers` OFF by default). Fleet 234→248 (commits `6d7ff84`→`73ae8e3`). Proved on `the-shape-of-a-pocket`: solves layer-1 (class→0) + layer-2 (div-fences 150→48) **footnote-safe** (7 defs); residual is **curation-policy, not a tool gap**. **LITERAL Q "is heavy-styled one fix deep?" ANSWERED: NO** (class markers · fences · internal-nav · art plates are distinct kinds). **⚑ Two self-corrections (assert-from-derived, twice): buggy `\b` census + `^..\d+..:` def-count regexes** → caught vs substrate; the false "div-unwrap breaks footnotes 7→0" had shaped part of the ruling, corrected before propagating. **The reflective turn (steward: "could we have foreseen this? whack-a-mole?")** → banked **[[feedback-census-by-mechanism-not-proxy]]** + RAN a **mechanism-census over 48 wave files** (`_curation/mechanism-census-2026-07-25.tsv`, `a527e0a`; volume-census superseded `06331fb`): **8 clean/near-clean · 21 internal-nav (one ruling) · 2 MIXED 2nd-mechanism · 8 pandoc-class-leak [all French/translation] · 8 glyph-needed · 1 azw3.** Dominant lever = **ONE internal-nav CURATION RULING (~31 files), NOT one cleaner.** Steward's held-point validated (banked lesson's first live test): "ONE ruling clears 23" is inference-from-composition (the gap that falsified the volume census) → checked → clears **21/23**; 2 hide a 2nd mechanism. **PULLING THREAD = the internal-nav curation ruling** (constitutional-adjacent: *what a canonical IS*), deferred to a **fresh head**; first validate on ONE file (composition ≠ what-removal-does), pre-frame as a SPLIT (carrier-dangling `#filepos` vs surviving-target), second-hand-check the census tool in a different bucket. State: 5 commits UNPUSHED (Gitea flaky — steward's call); `graduation-spec.yaml` WIP uncommitted (last session's); no canonical touched. Read the session file + the census TSV at wake.
|
||||
- [Session 2026-07-25→27 — two supersessions (v2.7.0 kind-scoping · v2.8.0 voice-purity) + the sweep that caught its own fix](session-2026-07-25-to-27-two-supersessions-and-the-sweep-that-caught-its-own-fix.md) — Landed **TWO ruled supersessions**. **v2.7.0 / REVIEWED-75** (placed 07-27) kind-scopes the verification criterion — the criterion was **VACUOUS** on a non-text work (empty re-extraction is trivially prose-word-identical to itself), now *explicitly-unhandled*; both jurist corrections applied (**deterministic/scan split PRESERVED** — V-SCAN has no ground-truth text; **anti-bypass guard rebound to the PROPERTY**, not enrollment); I caught a wrong-direction cross-ref in the drafted Edit 2. **This is the constitutional enabler of [[project-chamber-versioned-releases]]** — image-works enter a LATER version as a new declared kind, additively. **v2.8.0 / REVIEWED-73** = **voice-purity, the engine-consumable bar**, framed on the **orthogonality** (trim asks *should this be preserved*, voice-purity asks *whose words are these*; the Eichmann leak was content the trim CORRECTLY kept ⇒ **extending the trim is the WRONG fix**). Built `verify_voice_purity.py` (16 invariants, negatives-first) + declared data + `migrate_voice_purity_sidecars.py` + **gate WIRED** + single-reading-pass DESIGNED. Fleet 248→**288**. ⚑ **The rule validated itself on first contact:** 3 ARC sidecars with unassigned tails + **`musil-mwq-tome-1` served to the engine with boundaries shifted by 6 lines**, unknown to anyone (HELD for re-derivation); and **the ruling's own cited instance was wrong** (all 5 ARC bindings verify clean). Backfill 18 migrated / 1 held. ⚑⚑ **The steward-directed base-rate sweep caught MY OWN `source_lines` fix one commit old** — `splitlines()` also breaks on `\f`/U+2028 (**lintott off by 308 LINES**); **BOTH prior formulas wrong on complementary subsets** ⇒ no single sample distinguishes all three ⇒ banked [[feedback-derive-the-rule-from-the-consumer-not-from-the-survivor]]. Root cause fixed: ONE implementation, producers import it. Steward's *"confirm the rule, not the sample"* had already prevented corrupting **36/1,297** files. **PULLING THREAD unchanged and still UNTOUCHED: which purpose anchors Chamber V1** — twice re-pointed, twice displaced by library work. State: all 4 repos **clean, 0 unpushed**; spec v2.8.0 operative.
|
||||
|
||||
## Historical reference → MEMORY-reference.md
|
||||
Older archived-session pointers and the stable reference layer (steward profile · project-state detail · L1/L2/Chamber inventories · legacy pending-work · reference-file list) live in [MEMORY-reference.md](MEMORY-reference.md) — consult on demand; not loaded at wake. Recent cross-session trajectory comes from the Active Session entry above + the recent `session-*.md` files (wake §2.b.1; the MemPalace `handoffs` glance was retired 2026-07-07 with the wind-down).
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
---
|
||||
name: feedback-derive-the-rule-from-the-consumer-not-from-the-survivor
|
||||
description: "When two implementations of one field disagree, do NOT pick the survivor — derive the rule from what a CONSUMER of the value must do, then test the shapes where each candidate happens to be right. Comparison is selection, not derivation."
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: feedback
|
||||
originSessionId: 954fee42-68ff-46b5-95e6-238f33e6ca80
|
||||
modified: 2026-07-27T17:33:36.442Z
|
||||
---
|
||||
|
||||
When two implementations compute the same field differently, the reflex is to decide *which one is correct* by comparing them. **That is selection, not derivation** — and it silently inherits the assumption that one of the two is right.
|
||||
|
||||
**Why:** verifying that A ≠ B tells you nothing about whether A or B is *correct*. The correct rule comes from **what a consumer of the value must be able to do with it** — and it may be neither candidate.
|
||||
|
||||
Earned hard 2026-07-27 (chamber-library `source_lines`), in two stages:
|
||||
|
||||
1. Two formulas disagreed: `len(splitlines())` (engine-side) vs `count("\n") + 1` (chamber-side `write_sidecar`). I ratified `splitlines()` on the strength of the engine-side convention — **without checking what `splitlines()` splits on**. It also breaks on `\v \f \x1c \x1d \x1e \x85 U+2028 U+2029`, which **no** consumer of a line coordinate treats as a break (editor · `wc -l` · `sed -n 'Np'` · the engine's chunker). Four canonicals carry them; on `lintott` the disagreement is **308 lines** — a coordinate off by 308 is a citation pointing at the wrong page.
|
||||
2. **Both** candidates were wrong, on **complementary subsets**: `count+1` on the 1,261 newline-terminated files, `splitlines()` on the 4 exotic-bearing ones. The correct rule (`count("\n") + (0 if trailing newline else 1)`) was a third thing.
|
||||
|
||||
**Two corollaries, both load-bearing:**
|
||||
|
||||
- **Complementary-correctness defeats sampling.** Because each wrong candidate is *right* on some subset, **no single sample distinguishes all three** — the steward's "confirm the rule, not the sample" (which caught a live corruption risk: 36/1,297 files where a blanket `-= 1` migration would have corrupted data). Test the shapes where each candidate happens to be right, not a convenience sample from one producer.
|
||||
- **Fix the root cause: ONE implementation, imported.** Two formulas for one field is *how* the divergence arose; a third arrives the same way. Put the definition where the semantics live (the gate that owns the coordinate) and have producers import it.
|
||||
|
||||
**How to apply:** when a field is computed in more than one place — (1) ask what a consumer must be able to DO with the value, and derive the rule from that; (2) enumerate the shapes where each existing candidate is right, and test all of them; (3) collapse to one implementation; (4) make any migration RECOMPUTE, never do arithmetic on the stored value.
|
||||
|
||||
Kin: [[feedback-checkable-claim-surfaces-bugs]] (the demand for verifiability as defect-detector), [[feedback-census-by-mechanism-not-proxy]] (the instrument must bear the claim), [[feedback-trust-prior-pass-frame]] (an existing implementation's correctness is not inherited by comparison). A new face of assert-from-derived-not-substrate: the *derived artifact* here is the other implementation.
|
||||
@@ -449,3 +449,10 @@
|
||||
{"subject": "claude-code", "predicate": "drift-pattern", "object": "generalize-from-a-proxy-when-it-feels-done — the 2026-07-24 census's '31 heavy-styled = one fix' was a class-VOLUME proxy (pandoc-free), asserted confidently at the end of a bottomless day because a finite-feeling bucket resolved the pressure. Falsified on first real pipeline run (2026-07-25). Banked as feedback-census-by-mechanism-not-proxy: a plan-of-record claim must carry the instrument that can bear it; census by RUNNING, not proxying; distrust the bucket that arrives when you want to feel done.", "valid_from": "2026-07-25", "valid_to": null, "confidence": 1.0, "source_file": "feedback-census-by-mechanism-not-proxy.md", "extracted_at": "2026-07-25"}
|
||||
{"subject": "claude-code", "predicate": "drift-pattern-good-direction", "object": "banked-lesson caught its own recurrence, one level down — the steward applied the just-banked census-by-mechanism lesson to my NEW 'ONE nav ruling clears 23' inference (also composition-not-consequence). I CHECKED it vs the TSV rather than defending → clears 21/23, 2 hide a 2nd mechanism. The lesson worked on its first live test; the cheap check ran before the inference got planned around.", "valid_from": "2026-07-25", "valid_to": null, "confidence": 1.0, "source_file": "session-2026-07-25-cleaner-a-footnote-aware-and-the-mechanism-census-that-ended-the-guessing.md", "extracted_at": "2026-07-25"}
|
||||
{"subject": "v-text-wave", "predicate": "dominant-blocker", "object": "one internal-nav curation ruling (~31 of 47 files) — NOT one cleaner; per the mechanism-census 2026-07-25 (supersedes the 2026-07-24 volume-census '31 heavy-styled = one fix')", "valid_from": "2026-07-25", "valid_to": null, "confidence": 0.85, "source_file": "_curation/mechanism-census-2026-07-25.tsv", "extracted_at": "2026-07-25"}
|
||||
{"subject": "claude-code", "predicate": "drift-pattern", "object": "compare-two-implementations-and-pick-the-survivor — ratifying a convention by comparing two existing implementations FEELS like derivation and is SELECTION. Verified that splitlines() != count+1; never verified either was right. BOTH were wrong on complementary subsets (count+1 on 1,261 newline-terminated files; splitlines on 4 carrying \\f/U+2028 — lintott off by 308 LINES). Correct rule was a third thing, derivable only from what a CONSUMER of a line coordinate must do (editor/wc/sed/chunker). Complementary-correctness defeats sampling: no single sample distinguishes all three. Banked feedback-derive-the-rule-from-the-consumer-not-from-the-survivor.", "valid_from": "2026-07-27", "valid_to": null, "confidence": 1.0, "source_file": "session-2026-07-25-to-27-two-supersessions-and-the-sweep-that-caught-its-own-fix.md", "extracted_at": "2026-07-27"}
|
||||
{"subject": "claude-code", "predicate": "drift-pattern", "object": "read-a-disposition-clause-as-a-status — told the steward at WAKE that REVIEWED-72/73/74 were AUTHORIZED-but-unbuilt; 2 of 3 were FALSE (built+landed in v2.6.0). I read REVIEWED.md's 'If AUTHORIZED: build ...' lines — a record of what was AUTHORIZED, not of what was DONE. A ruling's disposition clause is a FORWARD INSTRUCTION, not a status. Worst-placed possible error: a wake briefing shapes the steward's picture of their own project before any work begins. Reusable: the wake briefing is a claim surface like any other; its backlog section needs the same substrate check as a finding.", "valid_from": "2026-07-27", "valid_to": null, "confidence": 1.0, "source_file": "session-2026-07-25-to-27-two-supersessions-and-the-sweep-that-caught-its-own-fix.md", "extracted_at": "2026-07-27"}
|
||||
{"subject": "claude-code", "predicate": "drift-pattern-good-direction", "object": "the-rule-not-the-sample (steward-named) caught a LIVE corruption risk — 'confirm the rule rather than the sample' revealed the two source_lines formulas agree iff a file lacks a trailing newline: 36/1,297 canonicals. A blanket '-= 1' migration would have corrupted exactly those; the 11-file sample (ONE producer, all newline-terminated) could not have shown it. Generalizes: when candidates are each right on some subset, sample-based confirmation is structurally blind.", "valid_from": "2026-07-27", "valid_to": null, "confidence": 1.0, "source_file": "session-2026-07-25-to-27-two-supersessions-and-the-sweep-that-caught-its-own-fix.md", "extracted_at": "2026-07-27"}
|
||||
{"subject": "claude-code", "predicate": "drift-pattern-good-direction", "object": "find-where-two-clauses-MEET before implementing either — REVIEWED-73 Q2 gates at graduation, Q4 bounds the obligation to the engine corpus; they read as conflicting. They meet at one point: the gate fires at the graduation of an ENGINE-CONSUMED source. Wiring it to every candidate would have silently blocked the Loeb wave with a bar that has no jurisdiction over it. Steward-confirmed. Reusable: when two ruled clauses appear to conflict on scope, look for the single point where both are true before choosing one.", "valid_from": "2026-07-27", "valid_to": null, "confidence": 1.0, "source_file": "session-2026-07-25-to-27-two-supersessions-and-the-sweep-that-caught-its-own-fix.md", "extracted_at": "2026-07-27"}
|
||||
{"subject": "claude-code", "predicate": "drift-pattern-good-direction", "object": "a-named-dependency-can-DISSOLVE rather than get solved — I flagged 'the attestation binds the landed sha but the gate runs at graduation' as blocking. Reading the apply leg showed graduation is a PURE MOVE (git mv/rename, no content transformation), so candidate bytes ARE landed bytes and the seam does not exist. Steward: 'the better kind of dependency resolution — it dissolved rather than got solved, and the reason is checkable in the code.' Reusable: before designing around a dependency, read whether it is real.", "valid_from": "2026-07-27", "valid_to": null, "confidence": 1.0, "source_file": "session-2026-07-25-to-27-two-supersessions-and-the-sweep-that-caught-its-own-fix.md", "extracted_at": "2026-07-27"}
|
||||
{"subject": "chamber-library", "predicate": "spec-version", "object": "v2.8.0 OPERATIVE (2026-07-27) — v2.7.0 REVIEWED-75 kind-scoping the verification criterion (method declared for the work's KIND; deterministic/scan split preserved; anti-bypass guard bound to the property); v2.8.0 REVIEWED-73 voice-purity as the engine-consumable bar (exhaustive partition · closed-vocab role · chamber-side · attest-never-default). v2.7.0 and v2.6.0 frozen.", "valid_from": "2026-07-27", "valid_to": null, "confidence": 1.0, "source_file": "session-2026-07-25-to-27-two-supersessions-and-the-sweep-that-caught-its-own-fix.md", "extracted_at": "2026-07-27"}
|
||||
{"subject": "chamber-library", "predicate": "open-defect", "object": "musil-mwq-tome-1 served to the engine with section boundaries shifted by 6 lines — canonical drifted 5032->5038; body truncated early, 6 lines mislabelled apparatus, 6 unassigned at the tail. Found by REVIEWED-73's exhaustive-partition rule on first application; HELD for re-derivation by a reading pass, NOT migrated. Also: REVIEWED-73's cited instance (5 standing FAILED ARC rows) was WRONG — all five ARC bindings verify clean.", "valid_from": "2026-07-27", "valid_to": null, "confidence": 1.0, "source_file": "session-2026-07-25-to-27-two-supersessions-and-the-sweep-that-caught-its-own-fix.md", "extracted_at": "2026-07-27"}
|
||||
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
---
|
||||
name: session-2026-07-25-to-27-two-supersessions-voice-purity-bar-and-the-sweep-that-caught-its-own-fix
|
||||
description: "Landed TWO ruled supersessions — v2.7.0 (REVIEWED-75, kind-scoping the verification criterion, both jurist corrections applied) and v2.8.0 (REVIEWED-73, voice-purity as the engine-consumable bar: verifier + declared data + backfill 18/1 + gate wired + single-reading-pass designed). The rule validated itself on first contact (3 unassigned tails + musil served with boundaries shifted by 6 lines, unknown to anyone) and corrected the ruling's own cited instance. Then the steward-directed base-rate sweep caught MY OWN source_lines fix one commit old — splitlines() also breaks on \\f/U+2028, 308 lines' disagreement on lintott. PULLING THREAD (unchanged, still untouched): which purpose anchors Chamber V1 — the steward's versioned-releases re-point, to which PENDING-75's kind-scoping is now the constitutional enabler."
|
||||
metadata:
|
||||
node_type: memory
|
||||
type: project
|
||||
modified: 2026-07-27T17:33:14.120Z
|
||||
originSessionId: 954fee42-68ff-46b5-95e6-238f33e6ca80
|
||||
---
|
||||
|
||||
# Session 2026-07-25 → 07-27 — two supersessions, and the sweep that caught its own fix
|
||||
|
||||
Spans a power failure (07-25 morning → 07-27). Woke into the versioned-releases re-point; the steward relayed the PENDING-75 ruling and then said "build out all of the rulings." Ended with two constitutional supersessions landed, a gate wired, and a correction to work I had committed an hour earlier.
|
||||
|
||||
## PAST — what happened + why
|
||||
|
||||
**⚑ First move was a correction, and it was mine.** The wake briefing told the steward REVIEWED-72/73/74 were all AUTHORIZED-but-unbuilt and "the wave stays blocked until REVIEWED-72's demonstration." **Two of three were FALSE** — 72 and 74 were built and landed in v2.6.0 on 07-24; only 73 was genuinely unbuilt, and the wave was already unblocked. **Mechanism:** I read REVIEWED.md's *"If AUTHORIZED: build …"* lines — a record of what was **authorized**, not of what was **done** — and reported them as outstanding. *A ruling's disposition clause is a forward instruction, not a status.* Worst-placed possible error: a wake briefing, shaping the steward's picture of their own project before any work began.
|
||||
|
||||
**Spec v2.7.0 — REVIEWED-75, kind-scoping the verification criterion** (`e3b6aef`; ruling filed `docs/kind-scoping-verification-JURIST-RULING-2026-07-25.md`; REVIEWED-75 placed 07-27). The jurist adopted the package's Part-4 argument over his own: the foreclosure is not that a non-text work *fails* the criterion but that the criterion is **VACUOUS** on it (empty re-extraction is trivially prose-word-identical to its own empty extraction). Both required corrections applied against the LIVE wording as directed: (1) the **deterministic/scan split preserved** — V-SCAN has no ground-truth text and keeps its own more-expensive criterion; the draft would have flattened a distinction the ratified table draws, *inside the sentence meant to stop over-claiming*; (2) the **anti-bypass guard rebound to the property, not enrollment**. ⚑ I also caught a defect in the drafted Edit 2: *"ratified as above"* pointed the wrong way (§V precedes §Tiering & Fence) — landed as a named cross-ref.
|
||||
|
||||
**Spec v2.8.0 — REVIEWED-73, voice-purity as the engine-consumable bar** (`e596983` + `85c50a7`). Framed on the **orthogonality** the ruling required: the trim answers *"should this be preserved?"*, voice-purity answers *"whose words are these?"*; the Eichmann leak was **not a trim failure** — the trim *correctly kept* Elon's Introduction and the Bibliography. **Extending the trim is the wrong fix.** Built: `scripts/verify_voice_purity.py` (16 self-test invariants, negatives-first), `graduation-spec.yaml` `voice_purity:`, `scripts/migrate_voice_purity_sidecars.py`, `voice_purity_gate()` + `write_voice_purity()` wired into graduation, `docs/single-reading-pass-DESIGN-2026-07-27.md`. Fleet 248 → 288.
|
||||
|
||||
**⚑ The rule validated itself on first contact.** Applying exhaustive-partition to the existing engine corpus surfaced: **3 ARC sidecars with unassigned trailing lines** (ornament divs; assigned + flagged `_migration_assigned` for curator confirmation — the ROLE is a judgment neither gate nor script can make) and **`musil-mwq-tome-1`'s drifted binding** (5032→5038 lines) — *the engine had been serving Musil with boundaries shifted by 6: body truncated early, 6 lines mislabelled apparatus, 6 unassigned at the tail.* HELD for re-derivation, not migrated. Backfill: **18 migrated / 1 held**, verified at the real enforcement path.
|
||||
|
||||
**⚑ Corrected the ruling's own cited premise.** REVIEWED-73 cites the "5 standing FAILED ARC rows" as the live drift instance. **All five ARC bindings verify clean.** The one genuinely broken binding was Musil, a chamber canonical, unknown to anyone. The jurist's architectural argument for chamber-side is unaffected; the cited instance was wrong.
|
||||
|
||||
**Q2/Q4 reconciliation (steward-confirmed).** The two clauses meet at one point: **the gate fires at the graduation of a source the engine consumes**; everything else NOT-APPLICABLE. Wiring it to every candidate would have **silently blocked the Loeb wave with a bar that has no jurisdiction over it**. Found by asking where the clauses meet rather than implementing whichever was read last.
|
||||
|
||||
**The seam dissolved rather than got solved.** I had named "attestation binds the LANDED sha but the gate runs at graduation" as a blocking dependency. Reading the apply leg: graduation is a **pure move** (`git mv`/rename, no content transformation), so the candidate's bytes ARE the landed bytes. `write_voice_purity` re-stamps only `source_file`/`source_path` and **deliberately does not recompute sha/lines** — recomputing would let a content change re-bind quietly, inverting what the binding is for (steward-confirmed).
|
||||
|
||||
**`source_lines` — FIX, twice** (`4a1a731` then `b82fc48`). Steward ruled FIX + re-stamp-now + producer-then-consumers in one change-set, on the grounds that `count("\n")+1` names a coordinate the ratified frame says cannot exist (the de-glued-marker shape). ⚑ **Steward's "confirm the rule, not the sample" caught a live corruption risk:** the formulas agree iff the file does NOT end in a newline — **36/1,297 canonicals** — so a blanket `-= 1` would have corrupted exactly those; my 11-file sample (one producer, all newline-terminated) could not have shown it. Then the sweep caught the fix itself: **`len(splitlines())` also breaks on `\v \f \x1c \x1d \x1e \x85 U+2028 U+2029`** — 4 canonicals carry them, **lintott disagrees by 308 lines**, `wc -l` confirms newline-based. **Both prior formulas wrong on complementary subsets** → no single sample distinguishes all three. Root cause fixed: **ONE implementation** (`verify_voice_purity.count_lines`), producers import it.
|
||||
|
||||
**Base-rate sweep (steward-directed) — remaining sites checked.** `sha256`: one latent basis divergence (`read_text().encode()` vs `read_bytes()`, CRLF-only); 0/1,297 CRLF; `write_sidecar` still text-based → **named, not silently changed**. **Tokenizers AGREE** (`\w+` + `.lower()` across `verify_body_conservation`, `inject_epub_footnotes` ×3, `build_sidecar` ×2; the missing `re.UNICODE` is a py3 no-op). Empirical: Eichmann gate 122,715 vs raw 122,735 tokens, **identical 9,620 types** — the 20-token delta is exactly the footnote-marker digits `_tokens` strips by design. Consistent-by-design, fully accounted.
|
||||
|
||||
## PRESENT — the mood
|
||||
|
||||
Productive and repeatedly humbling, in the useful direction. The session's spine was **three corrections of my own claims**, each caught by a different mechanism: the substrate (the wake-briefing backlog error), the steward's instinct (the rule-vs-sample catch that prevented corrupting 36 files), and a sweep the steward directed (which landed on code I'd committed an hour before). The contamination directive ran healthy all session — the steward challenged framings and was right each time.
|
||||
|
||||
The sharpest lesson is uncomfortable and worth keeping uncomfortable: **ratifying a convention by comparing two existing implementations felt like derivation and was selection.** I verified that the two disagreed; I never verified that either was right. Confidence in "the engine-side convention is correct" was ~0.9 and should have been ≲0.5. The check that would have caught it cost one line (`\f` in a test string) and did not run until asked.
|
||||
|
||||
Also noted with satisfaction: the gate suite caught its own stale assertion on the first run after the correction (287/288 → the label fix). Negatives-first test design paid immediately.
|
||||
|
||||
## FUTURE — what is pulling
|
||||
|
||||
**PULLING THREAD (unchanged from the 07-25 re-point, and still untouched): *which purpose anchors Chamber V1, and what bounded voice-set + capability envelope does it need?*** ([[project-chamber-versioned-releases]]). Everything built this session is now an **input** to that scoping, not an open obligation. **PENDING-75's kind-scoping is the constitutional enabler under it** — an image-based work (Warburg, Jung) enters a later Chamber version as a new declared kind, additively, rather than forcing a re-founding of the load-bearing clause. That is a real structural unlock for the versioned-releases frame.
|
||||
|
||||
**ACTIONABLE RESUMPTION POINT (as of wrap — re-judge against what changed):** all four repos clean and synced; nothing half-finished. The first move is a **decision, not a build**: pose the V1-purpose question (Making Sequence / violin-XXI treatise / ARC) and let the answer bound which library work is V1-blocking vs V2-deferrable. If the steward wants executor work instead, the smallest well-defined bite is **`musil-mwq-tome-1`'s reading pass** (re-derive its boundaries; the engine is currently serving it 6 lines off) — bounded, concrete, and it closes a live defect.
|
||||
|
||||
**Other horizons, ranked:**
|
||||
- **`musil-mwq-tome-1` re-derivation** — a live mis-attribution in the engine's served corpus. Small, bounded, real.
|
||||
- **3 `_migration_assigned` ARC tails** — curator confirmation of the ROLE (ornament divs assigned `apparatus`).
|
||||
- **The internal-nav curation ruling** (~31 wave files) — the *previous* pulling thread, now subordinate; matters for V1 only if V1's voices are nav-heavy books.
|
||||
- **`write_sidecar`'s sha basis** (text vs bytes) — latent, 0 live instances (no CRLF canonicals), named for its own small FIX cycle.
|
||||
- Sidecar **relocation** chamber-side (14 files) — re-points the engine's loader, a consumer-affecting cross-repo change.
|
||||
- The 2 MIXED wave files' second mechanism · the 8 PANDOC-CLASS-LEAK · the 8 GLYPH-NEEDED · `unsong` (.azw3).
|
||||
- **Housekeeping (fresh-session slot):** skill-harvest register compaction + verification-ladder batch-append — still owed, register exceeds read caps.
|
||||
|
||||
**PAUSE STATEMENT:** I am about to be away. Two supersessions are landed, everything is pushed, and no work is half-finished — this is a clean seam, which is rarer than it sounds. What I want to find still pulling: **the V1-purpose question, still unanswered and still first** — not quietly displaced by another round of library work, however tractable. The library work is now genuinely optional-until-scoped, and that is the whole point of the versioned frame.
|
||||
|
||||
**LITERAL QUESTION for next-Claude:** The steward has re-pointed to Chamber V1 twice now and both times the session went to library work instead — good work, ruled work, but not *that* work. Is that displacement a signal that the V1-purpose question is not actually answerable yet (missing some input we haven't named), or is it just that library work is legible and a purpose-decision is not? Naming which one it is matters more than another supersession.
|
||||
|
||||
**State at wrap:** chamber-library, studium-engine, ARC, CapableMind-AI — all **clean, 0 unpushed**. chamber pushed to both `github` and Gitea `origin` (Gitea cooperated). Spec **v2.8.0 operative** (v2.7.0, v2.6.0 frozen). Fleet **288/288**. REVIEWED-75 placed. Ledger: `session-ledger-2026-07-25.md` (carries the 07-27 returns).
|
||||
@@ -48,6 +48,15 @@ The single place proposed skills live so they don't evaporate between sessions.
|
||||
|
||||
*(One candidate, load-bearing: it recurred twice in one session and the jurist caught both. The skill carries the right discipline for its own claims but not for the transcription act; the patch closes exactly the gap I fell through — the yardstick met, the jurist had to correct the same shape twice.)*
|
||||
|
||||
## Harvest 2026-07-27 (the two-supersessions session — 2 candidates, both evidence-backed)
|
||||
|
||||
| Skill | Kind | One-line | Origin | Status |
|
||||
|---|---|---|---|---|
|
||||
| `/wake-up` | patch | **Substrate-check the briefing's backlog section.** §3's "What's unresolved" currently lets REVIEWED.md's *"If AUTHORIZED: build …"* clauses be read as *status*. They are **forward instructions, not status** — I told the steward at wake that REVIEWED-72/73/74 were all authorized-but-unbuilt; **2 of 3 were already built and landed** (v2.6.0), and the wave I reported as blocked was already unblocked. Proposed patch: before listing an authorized item as outstanding, verify against the substrate (code / spec header / repo CLAUDE.md), and say "verified against substrate" or "unverified" in the briefing. The wake briefing is a claim surface like any other, and it is the **highest-leverage place** for a false claim to land — it shapes the steward's picture of their own project before any work begins. | 2026-07-27 (steward-visible error, self-caught within the same turn) | **PROPOSED** |
|
||||
| `/field-divergence-sweep` | create | **Sweep for one field computed in more than one place, then derive the rule from the consumer.** Method proven this session at steward direction, and the yield was not zero on the first run: grep the fleet for multi-site computations of the same field → for each, ask *what must a consumer be able to DO with this value* and derive the rule from that (never pick the surviving implementation — that is selection, not derivation) → enumerate the shapes where each existing candidate happens to be right and test **all** of them (complementary-correctness defeats sampling) → collapse to ONE imported implementation → any migration RECOMPUTES, never does arithmetic on the stored value. Found `source_lines` wrong **twice** (including in a fix committed an hour earlier; lintott off by **308 lines**), and cleared `sha256` + the tokenizers with an empirical cross-check. Same probe as the no-op orphan sweep, aimed at **values** instead of stages. Steward: *"this instance says the yield won't be zero."* | 2026-07-27 (steward-directed; grounded in [[feedback-derive-the-rule-from-the-consumer-not-from-the-survivor]]) | **PROPOSED** |
|
||||
|
||||
*(Both are load-bearing rather than tidy-up: the first is a correction to a briefing surface that misled the steward, the second is a method that found a live 308-line coordinate error on its first run. No other harvest — the session's other lessons are banked as feedback memories, not skills.)*
|
||||
|
||||
## Open proposals
|
||||
|
||||
*Full review with steward 2026-06-05 (housekeeping session) — every item ruled, evidence-checked against the KG drift/built record. Verdicts below.*
|
||||
|
||||
Reference in New Issue
Block a user