[HARDENING] The mumble discriminator fails its own must-detect gate; repairs stopped at the gate (PENDING-179)

The 2026-09-03 repair plan rested on one claim: that human_turns() is an
existing, controlled discriminator, and wiring it into four transcript
consumer sites was plumbing rather than classifier-building.

Tested against ground truth taken from the fool's own prompt text — not from
the function under test — the claim is false. 24 known mumbles, 41 known
non-mumbles, out of 65 transcripts:

  must-detect    22/24  two mumbles read as human-attended
  must-not-flag  35/41  and one "failure" is correct — b7e7eb39 is the
                        unattended session of 2026-08-31, which genuinely
                        has no human turn

human_turns() == 0 never meant "mumble". It means "nobody spoke", which is
equally true of an unattended real session. A mumble embeds the previous
session's text and so inherits its slash-command markers; it is excluded
only when the session it quoted happened to contain one. The two leaks are
exactly the two marker-free mumbles. Coincidence, not design.

No repair was made at any site, and no replacement discriminator was built.
Three controls passed and a fourth broke: all three test the question the
function was built for, none could see the question it was being reused for.
A successor written now inherits whatever made the first set look sufficient.

Also here, per the 2026-09-03 handover:
  - step 0 preservation ran: 76 transcripts, read-back PASS, 11 of them
    already pruned at source and surviving only in the archive
  - gate 2b: the composition claim in PENDING-178 stands (11 mumbles,
    ~a fifth, on 08-31). Two terms do not close and are reported as an open
    disagreement, not a correction — the reconstruction is a demonstrated
    lower bound and -178 enumerated live
  - gate 2c: five sites in four files; -178's [HARDENING] scope holds
  - MEMORY.md record-only arithmetic correction: N-now 44 -> 65 measured,
    composition 41 real + 24 mumble added, direction reversed (it is rising,
    not shedding), stale :331 pointer corrected to :513

Filed as an item rather than a PENDING-178 addendum on PENDING-145's
mechanism: a ruling claims a number, so an addendum would be suppressed the
moment -178 is ruled. The undecided filing moratorium is disclosed inside
the item.

governance-drift-check.py:513 excluded on receipt and not examined.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X3L79vgAnt1x2kxvf23Qt7
This commit is contained in:
David F Glidden
2026-09-04 10:22:23 +02:00
co-authored by Claude Opus 5
parent e5db321d6f
commit c150bdff17
4 changed files with 167 additions and 1 deletions
+128
View File
@@ -0,0 +1,128 @@
---
name: Session Ledger 2026-09-03
description: Practice-of-return ledger maintained by /symmetria — returns, open horizons, recalibrations, authorization moves, sub-agent dialogues, bypasses.
type: feedback
---
# Session Ledger — 2026-09-03
> ⚠ Note on the file itself: this ledger was ABSENT when the second session of 2026-09-03 woke,
> though a full session had already run and wrapped 2.2 h earlier. Symmetria was not init'd that
> session (or was and did not write). The wrap record used ledger-shaped language ("Instruments: 2
> run · K = 0") with no ledger behind it. **A ledger that only exists when someone remembers to
> invoke it is not a record of returns; it is a record of invocations.** Kin to PENDING-168.
## Returns
- **2026-09-03T~14:0x — INHERITED CLAIM FALSIFIED AT THE WAKE, BY RUNNING IT RATHER THAN RELAYING IT.**
The prior wrap recorded the `wake-digest.py` selftest as failing and predicted it would *"fail on
every run from now on"* (0 of 13 sample transcripts wrapped; all 13 Tarbuckle mumbles). Re-run at
this wake: **5 of 13, SELFTEST PASS.** The prediction was falsified in 2.2 hours. Corrected
statement of the defect: the control's verdict is a **function of the mumble rate in a rolling
13-transcript window**, so it is *intermittent*, not permanent — a harder failure to notice than
the one recorded, because it will read clean on some runs and dirty on others with no change in
what it is measuring. Return caught by the standing discipline *prove the instrument before
trusting a clean line* — applied here to a DIRTY inherited line, which is the same rule run
backwards and was not obvious.
- **2026-09-03T~14:0x — measured N-now rather than relaying it.** MEMORY.md carries 44 (2026-08-31);
the prior wrap's addendum carries 52. Actual, by the trial's own method: **65**. Then went one step
past the number the freeze obliges me to report, and censused its composition with the controlled
discriminator (`human_turns`): **31 of 65 are mumbles (48%), 34 real, 0 unreadable.** The bare
count would have been true and useless; the composition is the finding.
- **2026-09-03T~15:0x — THE QUERY THAT FOUND NOTHING, AND THE VACUOUS PASS IT PRODUCED.**
Building 2a's ground truth I searched for the Tarbuckle prompt signature `"You are Tarbuckle.
Your character..."` — taken from `tarbuckle-invoke.py`, the file I had just read. It matched
**0 of 65** transcripts, and the gate duly reported **`PASS (0/0)`**. A green light with an
empty denominator. Caught by the standing rule *a null search is evidence about the QUERY*;
opening a transcript showed the real signature is `"You are writing ONE line as Tarbuckle"` — a
DIFFERENT fool surface (`tarbuckle-mumble.py`/`-wrap`/`-seam`, three scripts the inherited site
census never named). ⚠ **The flag that fired is §3's *a search query shaped by what the session
wants to find*.** Had I accepted the pass, I would have reported the discriminator sound and
wired a broken predicate into three more sites.
- **2026-09-03T~15:1x — FRAME-INHERITANCE, and it is the session's whole finding.**
`human_turns()` carries three passing controls. All three test the question it was built for
("did an executor run unattended?"). The plan reused it for a different question ("is this a
mumble?") and inherited the controls' authority across that gap. Re-run at the scope of the
extension: **22/24 must-detect, 35/41 must-not-flag — FAIL both ways.** The exclusion works only
when a mumble happens to quote a slash command; the 2 leaks are exactly the 2 marker-free
mumbles. ⚠ **`0` never meant "mumble" — it means "nobody spoke", which is also true of a
genuinely unattended session (`b7e7eb39`, PENDING-172).**
## What held [appended]
- **Stopped at the gate instead of building the replacement.** The handover's instruction and the
reasoning behind it were both honoured: three controls passed and a fourth broke, so the finding
is about the control SET. Writing a successor discriminator now would inherit whatever made the
first set look sufficient. Sites 2-4 stay shut.
- **Ran 2b and 2c anyway**, because 2a's failure does not gate them and they answer different
questions. 2b's composition term closed; 2c's scope held.
- **Did not assert 2b's gap against -178.** My reconstruction disagrees by 4 files and is a
demonstrated lower bound (preservation ran twice only). Reported as an open disagreement with
-178's method named as the better-positioned one, rather than as a correction.
- **Narrowed the census three times and said so.** Repeated narrowing can end by confirming the
five sites it was built around; the negative control and the explicit blind-spot statement are
what keep that honest.
## Authorization moves [appended]
- **PENDING-179 FILED** — as an item, not a -178 addendum, on PENDING-145's demonstrated mechanism
(a ruling claims a NUMBER; an addendum under a to-be-ruled number is suppressed on arrival).
⚠ The undecided moratorium is disclosed inside the item, with yesterday's contrary reasoning
preserved rather than overridden.
- **MEMORY.md record-only arithmetic correction applied** (authorized by the handover, 2b): N-now
44 -> **65 measured**, composition **41 real + 24 mumble** added, the "shedding faster than it
gains" direction reversed, and the stale `governance-drift-check.py:331` pointer corrected to
`:513` (`:331` is a register-check control, verified by reading both lines).
- **NOT done, deliberately:** no repair at any site; `governance-drift-check.py:513` not examined,
excluded on receipt; no replacement discriminator; nothing committed (the wrap owns that).
- Did not answer the inherited literal question at the wake despite it being cheap to answer
(`git log -p` on MEMORY.md). The wake's rule is to hold it open. Held.
- Reported the thread-query null as a null, in one clause, rather than dressing six generic
term-matches as findings.
## Open horizons
- **The steward-directed first work:** wire `human_turns()` into the transcript-as-session consumer
sites. Positive control FIRST (yesterday's cost of skipping one: a false loss report within the
hour). `tarbuckle-invoke.py:40` is SUSPECTED, unverified — verify before touching.
- ⚠ **The 84 trigger is ~19 transcripts away and roughly half the counter is chatter.** The ladder
freeze (REVIEWED-123) is measuring against a counter PENDING-178 says is mis-united. Time pressure
is now real and was not when -178 was filed.
- Steward owes: `~/.claude/agents` under version control (before anything else edits it) · the
moratorium decision · `RE_ID` `[FIX]` · PENDING-171/-177/-178/-160/-168 · the §5 regrade.
- Parked worker `acaabadf` — stopped, still carrying `--reply-on-resume`; respawn behaviour not
established. Untouched.
## Confidence to recalibrate
- **Verified this session (ran it):** selftest 86→87 passing, 5 of 13 (`--selftest`) · N-now = 65
(glob, the trial's own method) · mumble census 31/34/0 (`human_turns` over all 65) · dotfiles
local + gitea + github all at `e5db321`, only dirt is this wake's own `thread-query-log.jsonl`
append · governance drift 0 · pointers 407/0/0 · today's ledger absent before now.
- **Inherited, NOT re-verified:** the four-site census in ADDENDUM 1 (grep-derived, read not re-run)
· that `human_turns` is the right discriminator at every site (proven at one) · that
`tarbuckle-invoke.py:40` is affected at all.
- **Post-compression note:** context was cleared deliberately between the two sessions of 2026-09-03.
Everything above marked "inherited" rests on the written record, not on continuity of working
memory.
## Authorization moves
- Reaffirmed the prior session's own correction: the fix is **`[FIX]`, not `[PROPOSAL]`** — the
control's label already states its predicate ("a real session reads as WRAPPED end-to-end"), so
restoring that population repairs it against its existing spec. ⚠ Does **not** extend to changing
what the `>=84` trigger *means* — that stays PENDING-178 / REVIEWED-123, steward's.
## Sub-agent dialogues
*(none)*
## Bypasses
*(none)*