diff --git a/claude/memory/MEMORY.md b/claude/memory/MEMORY.md index 70c4e87..3df0858 100644 --- a/claude/memory/MEMORY.md +++ b/claude/memory/MEMORY.md @@ -73,6 +73,7 @@ permalink: claude-memory/memory - Chamber-typography โ€” *tracker not yet established*; moves live in per-session memories (2026-05-11 โ†’) + `project-chamber-cruft-restoration.md` + `project-chamber-typography-mining-plan-2026-05-15.md`. ## Active Session +> ๐Ÿ”ด **NEXT SESSION, FIRST WORK โ€” STEWARD-DIRECTED 2026-09-03:** *"deal with that right away โ€” I need the wake and wrap tools to be reliable."* **ONE root cause, 4โ€“5 consumer sites:** the transcripts dir is a proxy for *"a session"* and **a Tarbuckle mumble is indistinguishable from a session at the file level.** Sites: `governance-drift-check.py:513` (PENDING-178) ยท `wake-digest.py:354`โ†’`previous_transcript` (**the false `unattended` alarm of 09-01 โ€” diagnosed, code never changed**) ยท `wake-digest.py` selftest `_tx[-14:-1]` (**fails every run**) ยท `tarbuckle-invoke.py:40` (โš  **SUSPECTED, VERIFY FIRST**). ๐Ÿ”‘ **The discriminator already exists and is controlled โ€” `wake-digest.py:932 human_turns()`; this is wiring a tested function into 4 call sites, not building a classifier.** โš  **It is `[FIX]`, not `[PROPOSAL]` โ€” my wrap-time classification was wrong**: the control's label already says *"a real session"*, so restoring that population repairs it against its own spec. **Does NOT extend to changing what the `>=84` trigger means** โ€” that stays PENDING-178/REVIEWED-123. **Write the positive control FIRST.** Full census + first steps: ADDENDUM 1 of the session record. > ๐Ÿ”‘ **THE INDEX HAD BECOME THE RECORD.** `MEMORY.md` breached its load budget and was being **silently truncated at wake** โ€” but the cause was not bulk. Five tracker entries had grown into paragraphs, and for **three the index was the SOLE custodian of live state**: the studium tracker stopped at **2026-08-13** while the index carried engine news to 09-01 ยท the Fool's only link was a **sealed seed**, with nowhere legitimate to append ยท L1's replay **mechanism** (`minCursor` is a minimum over 11 modules, two never participate โ‡’ pinned at 0 **by construction**) and **completion criterion** (uninterrupted run length, not rate) existed nowhere else. All relocated verbatim; **Tarbuckle got a tracker**. 26,803 โ†’ 23,714 (`2171d91`, both remotes verified). > โš  **PRUNING WOULD HAVE BEEN HARMFUL.** The cut took its rule from the file's own Index discipline โ€” trackers are pointers โ€” and so **left "Rules that fire silently" untouched**: those keep their text inline because they fire when I would not know to look. Cutting the loudest lines would have removed the catches and still left three workstreams undocumented, now deleted rather than truncated. > โš  **THE CANARY WAS CLEAN AND ITS SELFTEST WAS FAILING** (86/87). The failing control samples the 13 most recent transcripts; **all 13 are Tarbuckle mumbles** (~66 KB, one human turn each). **PENDING-178's defect at a SECOND site** โ€” it will now fail on every run, and a control that always fails is one everyone learns to ignore. The **pointer** controls, which the trim rests on, all pass. Not filed (moratorium undecided). diff --git a/claude/memory/session-2026-09-03-the-index-had-become-the-record.md b/claude/memory/session-2026-09-03-the-index-had-become-the-record.md index a4c96b5..111b90b 100644 --- a/claude/memory/session-2026-09-03-the-index-had-become-the-record.md +++ b/claude/memory/session-2026-09-03-the-index-had-become-the-record.md @@ -181,3 +181,67 @@ bytes. The gap between those two dates is the answer, and the second half of the anything *other than the harness's own truncation warning* was positioned to catch it. โš  If the answer is "only the harness," then the file's self-bounding discipline is documentation, not a mechanism โ€” and the same is true of every budget in this system that no instrument measures. + +--- + +## ADDENDUM 1 โ€” after the wrap: the steward makes this the next session's first work + +โš  **Appended 2026-09-03 after the session record was written, committed and pushed.** The wrap was +complete; the steward then read ยง8 and said: + +> *"We should, if possible, deal with that in the next session right away โ€” I need the wake and wrap +> tools to be reliable."* + +**That reframes the item, and the reframing is the point.** ยง8 handed over "a failing control in +`wake-digest.py`". What is actually being asked for is that **the instruments the wake and wrap run +on can be trusted** โ€” which is a class, not an instance. A read-only census was run before closing, +so the next session starts from a list rather than from the symptom. + +### The root cause, and it is one thing + +**The transcript directory is used as a proxy for "a session", and a Tarbuckle mumble is +indistinguishable from a session at the file level.** Every mumble writes a ~66 KB `*.jsonl` into +`~/.claude/projects/-Users-davidglidden/` exactly as a real session does. Every consumer that counts, +sorts, or samples that directory therefore counts mumbles as sessions. + +### The consumer sites โ€” census by grep over the fleet, 2026-09-03 + +| site | what it does | state | +|---|---|---| +| `governance-drift-check.py:513` | `len(glob("*.jsonl")) >= N` โ€” the ladder trial's `transcripts 84` trigger | **PENDING-178's filed site.** Counter moved 44 โ†’ 52 in one day | +| `wake-digest.py:354` โ†’ `previous_transcript()` | picks "the previous session" for control (c) | **This produced the false `ran unattended, PENDING-172` alarm on 2026-09-01.** Diagnosed that day; the thread was pulled to -178 and **the code was never changed** | +| `wake-digest.py` selftest, `_tx[-14:-1]` | end-to-end wrap control over 13 recent transcripts | **Today's finding.** 0 of 13 wrapped; all 13 are mumbles. Fails on every run | +| `tarbuckle-invoke.py:40` `newest_transcript()` | *"the session he is in the room for"*, newest by mtime | โš  **SUSPECTED, NOT VERIFIED** โ€” if a mumble's own transcript can be newest, Tarbuckle reads a previous mumble as the live session. Feedback loop. **Verify before asserting** | +| `preserve-transcripts.py:45` | archives before the **~30-day retention prune** | Not a defect โ€” and it is the mechanism behind the ladder counter's rolling window (PENDING-147) | + +๐Ÿ”‘ **The discriminator already exists, is already controlled, and is simply not wired to the sites +that need it.** `wake-digest.py:932 human_turns(path)` โ€” REVIEWED-131 cond. 2 โ€” counts genuine human +turns, returns `None` for unreadable (*"unreadable is not zero"*), and carries three passing controls +including `human_turns returns 0 on a hook-only transcript [must-detect]`. It is used for control (c) +alone. **This is wiring a tested function into four call sites, not building a classifier** โ€” which is +why "right away" is realistic. + +### โš  Correction to my own wrap-time classification + +ยง8 recorded: *"did not re-scope the failing selftest control โ€” changes what a governed instrument +asserts โ†’ `[PROPOSAL]`."* **That was wrong, and it would have blocked the steward's instruction on a +boundary that is not there.** The control's own label states its predicate: *"a real session reads as +WRAPPED end-to-end."* Its sample contains **no real sessions**, so the code does not do what it +already says it does. Restoring the population the label names is repairing an instrument **against +its existing specification** โ€” `[FIX]`. It is not a re-scope; it is the opposite of one. + +โš  The `[FIX]` reading covers **restoring the intended population at each site**. It does **not** +cover changing what the ladder trial's `>=84` trigger *means* โ€” that is PENDING-178's question and +stays the steward's, because REVIEWED-123's freeze is measuring against that counter. + +### Where to put your hands first + +1. `python3 ~/dotfiles/scripts/wake-digest.py --selftest` โ€” reproduce the failure (expect 86/87). +2. Verify the `tarbuckle-invoke.py` suspicion before touching it; it is the one unverified row. +3. Wire `human_turns()` into the three confirmed sites, **writing the positive control first** โ€” + a fixture directory of mumbles plus one real session, where the correct answer is known. โš  Today's + own lesson: the conservation checker that shipped without a positive control produced a false loss + report within the hour. +4. **Do not let the count of sites become the measure of done.** The question the steward asked is + whether the tools are reliable, and a fourth site found later is a better outcome than four sites + fixed and the class declared closed.