[FIX] L1 pin root-caused and cleared; S-series closed; instrument census

mindfabric-00 had been event-loop-pinned for 6+ days (100% CPU, /health silent).
Profile + CDP inspector named two hot paths, both from runTemporalPipeline:

  checkForCycle -> getCausalEdgesFromSqlite   99.8% of samples
  tryExtendChains -> getChainsContainingSeq   now dominant (json_each scan)

Cause of the first: ANALYZE had never been run, so SQLite preferred a boolean
index (idx_caused_tombstoned, matching ~all 836k edges) over idx_caused_from.
ANALYZE across 15 module DBs flipped the plan; 6.4x on a microbenchmark and
99.8% -> 6.0% in the live profile. /health went from silent to 200 in 0.13s.

B1.1's fan-out cap is IMPLEMENTED AND WORKING (today: max in-degree exactly 20,
zero violations; pre-23-June: max 629, avg 67.6). The defect is data, not code —
836k edges / 813k chains minted under ungoverned fan-out before the fix landed.
Repair run: derived stores wiped, logchain preserved, replay in flight.

S-series closed (jurist had already ruled all of Q1-Q5 on 2026-05-18):
  S6/S7/S9 implemented (Symmetria §3 flags, `suspend` outcome, wrap-up §8 tenses)
  S2 rebuilt as [FIX] — wake-digest unwrapped-session detector, discrimination-
    gated on real sessions (11 wrapped / 2 unwrapped)
  S4/S5 withdrawn with MemPalace (steward ruling)
Dormant legacy dispositioned: PENDING-4/5/11/12, CD-03, ICP-19 duplicate.
Open authorization items 22 -> 10.

Census 01: which instruments have no real negative instance. Finding — the
governance drift-check has 3 of 5 families inert against the current CLAUDE.md,
and 71 of 75 verification-ladder entries are cited nowhere outside the ladder.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WuMjg3ipEVa3n8CoSzoyvc
This commit is contained in:
David F Glidden
2026-08-03 20:57:41 +02:00
co-authored by Claude Opus 5
parent 23e7515302
commit 0a48e6934d
8 changed files with 427 additions and 16 deletions
@@ -0,0 +1,68 @@
# Census 01 — Which instruments have no real negative instance?
**Pre-registered:** 2026-08-03, before reading any instrument source or the verification ladder.
**Origin:** the literal question left by the 2026-08-02 evening wrap.
---
## The question
Five times on 2026-08-02, a passing check certified a property of the *code* while
claiming a property of the *result*. The discrimination gate (`e9f3544`) is the mechanical
answer **for checks that have a real negative instance to test against**.
So: **which of our current instruments have no real negative instance available, and is
that absence recorded anywhere, or does it look like coverage?**
## Unit of census
An **instrument** = any check, gate, guard, or test suite whose verdict is used to license
a claim. Two populations, both censused entire (no sampling, no `| head`):
1. Everything in `~/dotfiles/claude/governance/fool/` that returns a verdict.
2. Every named entry in `reference-verification-ladder.md`.
## The test applied to each
**Was this instrument demonstrated returning its FAIL verdict on a REAL artifact** — one
drawn from actual work, not authored so the test would exercise the branch?
Three outcomes:
- **DEMONSTRATED** — names the real artifact it was shown failing on.
- **ABSENT-RECORDED** — no real negative instance, and the instrument or its record says so.
- **ABSENT-UNRECORDED** — no real negative instance, and nothing says so. **This is the finding**: absence that reads as coverage.
Synthetic fixtures do not count as negative instances. That is the whole point of the
discrimination gate: fixtures derived from the check inherit the check's blind spot.
## Predictions (recorded before the read)
1. **The discrimination gate itself → DEMONSTRATED.** It was built and shown rejecting the
§3.3 pattern as it actually shipped, on two real artifacts.
2. **`test_reduce.py` and `test_twin.py` → ABSENT-UNRECORDED.** Expectation is that they
are fixture-based and say nothing about it.
3. **The trial-03 degraded guard → ABSENT, now RECORDED.** It had no negative instance
until trial 03 supplied one by failing; the record exists because the failure did.
4. **Verification-ladder entries → mixed, skewed DEMONSTRATED.** Ladder entries were earned
from real failures, so most should name the artifact. If they do *not* name it — if the
entry states the rule but drops the instance — that is the same concealment shape as
yesterday's, at the level of the record rather than the document.
5. **Overall skew → ABSENT-UNRECORDED dominant.** Prior: this is the pattern that surfaced
five times in one session.
## The census's own discrimination condition
This census is an instrument. Its negative instance is an instrument that genuinely *does*
have a real negative instance, correctly classified DEMONSTRATED, standing beside one that
does not, classified ABSENT.
**If every instrument lands in one bucket, the census has discriminated nothing** and must
be reported as such rather than as a result. If the skew comes out opposite to prediction 5
— mostly DEMONSTRATED — the first hypothesis to test is that my classification went lenient,
not that the instruments are sound.
## Stopping rule
The census is complete when both populations are enumerated entire and every member is
classified. Unclassifiable members are reported as unclassifiable, not dropped.
@@ -0,0 +1,98 @@
# Census 01 — RESULT
**Run:** 2026-08-03. Pre-registered at `census-01-negative-instances-PREREGISTRATION.md` before any instrument source or the ladder was read.
**Question:** which of our instruments have no real negative instance, and is that absence recorded, or does it look like coverage?
---
## Verdict in one line
**The instruments built under this discipline are sound. The instruments built *before* it decay silently — and three of them are currently reporting a clean number they are structurally incapable of dirtying.**
The census discriminated (both buckets populated, per the pre-registered condition), so it is reportable as a result rather than as nothing.
---
## Population A — `fool/` (7 instruments, censused entire)
| Instrument | Negative instance | Verdict |
|---|---|---|
| `test_degraded_guard.py` | The **real trial-03 artefact** that defeated its predecessor. Fails loudly (`INSTRUMENT NOT VERIFIED`) if the artefact is absent. | **DEMONSTRATED** — gold standard |
| `test_discrimination.py` | **Two real governance documents**; shown rejecting the §3.3 pattern *as it actually shipped*. | **DEMONSTRATED** — gold standard |
| `test_twin.py` | The **real CONTROL-A/B pair**; shown failing in both laundering directions. | **DEMONSTRATED** |
| `test_reduce.py` | Mixed: fixtures are synthetic, but each is a **minimisation of a real defect** found by contact with a real ruling/package; plus a real-document tiling check and the real false-pass string. | **DEMONSTRATED (derived)** |
| `reduce.py` §3.3 screen | Tested in `test_reduce.py` against heading strings **in isolation** — the exact code-not-result shape. Backstopped by `test_discrimination.py` at document level. | **weak alone, covered by the suite** |
| `reduce.py` §3.2 Q-resolution | Real `CLAUDE.md` + a genuine clause and a plausible fabrication; rejects the fabrication. | **DEMONSTRATED** |
| `twin.py` bidirectional gate | Covered by `test_twin.py`. | **DEMONSTRATED** |
**Prediction 2 was wrong.** I expected `test_reduce.py` and `test_twin.py` to be fixture-based and silent about it. Both explicitly derive fixtures from the property and say so. Nothing here is concealing an absence.
## Population B — the verification ladder (75 entries, censused entire)
Mechanically extracted all 75 entry names, then counted citations elsewhere in `memory/`, `governance/`, `skills/`. **Instrument positive-controlled first** (the same grep finds `Fowler` in 28 files, `verify-before-compose` in 18, `pre-registration` in 13 — it detects presence readily).
- **71 of 75 entries are referred to by name nowhere outside the ladder.**
- The 4 that are cited: *Byte-identical compile gate* · *Two-hat commit separation* · *Revert-and-redo-smaller* · *The gate itself can be PASS-BUT-FALSELY*. Three of the four are **meta-instruments** — about the practice of gating, not about a domain.
**What this does NOT establish:** that 71 entries never fire. Name-absence is not use-absence; a discipline can be applied without anyone writing its name. Overclaiming here would be the same error the census exists to catch.
**What it does establish:** the ladder's own header calls these *"the **named** gates any session reaches for instead of re-deriving."* Naming is the whole mechanism. If 71 names appear nowhere, then either the naming does no work, or the entries are not reached for — **and the record cannot distinguish the two.** Each entry records its *origin* (the real failure that earned it) and nothing about its subsequent life.
The ladder contains the rule that judges it:
> *A silent safety net is uninformative, not reassuring — a fallback that never fires across N real cases has not been shown to work.*
75 entries read as 75 units of coverage. What the record attests is 75 units of *past* catch.
**Structural cause: ladder entries have no IDs.** They are bolded prose. There is no handle to write in a session record, so firing history cannot be recorded even by someone who wanted to.
## Population C — the wake instruments (the numbers the steward acts on)
### `governance-drift-check.py` — reported **0 substrate-contradicted claims** this morning
Five check families. Tested each against the **real** `~/CLAUDE.md`:
| # | Family | State | Evidence |
|---|---|---|---|
| 1 | Referenced paths | **LIVE** — examines 4 paths | but **silently skips any backticked path containing a space**: the Compass vault path is never checked. It happens to exist today, so no false negative — but if it broke, the report would still read 0. |
| 2 | Named MCP tools | **INERT** — 0 tool names found | keyed to `kg_*`/`diary_*`/mempalace, which the 2026-07-07 wind-down and the obligation-before-instrument rewrite removed from the document |
| 3 | Hooks claimed to fire | **INERT** — 0 claims found | and its control sits *inside* the `if`, so **the control does not run either** |
| 4 | Expired horizons | **INERT** — 0 phrases found | its control is written to pass on absence (`… or "through end of" not in text`) |
| 5 | Doctrine-id parser | **LIVE**, with a proper discriminating triple (detects definition, detects citation, rejects non-id) | the good one |
**Three of five families cannot currently report anything, all controls pass, and the instrument never says `INSTRUMENT NOT VERIFIED`.** The 0 is honest about what it measured and silent about what it can no longer see.
**The general class this exposes — and it is new:**
> **A drift-checker keyed to a document's current wording goes inert when the document is improved.** It can only ever detect the drift that existed the day it was written.
Family 2 died *because of a good change*: the memory-discipline rewrite that states *"Instruments for reaching it change; the obligations below do not — state the obligation first and the instrument second, or the next retired tool takes a rule down with it."* That rewrite protected the doctrine from instrument-decay and silently retired the checker watching the doctrine. The rule caught everything except its own watchman.
### `wake-digest.py` — reported **361 pointers, 0 dead**
Self-test carries presence **and** absence controls and names the specific real bugs each was built from (*the v1 splitter's blind spot*, *the 2026-08-01 bug*, *the drafting-habit trigger*). Same shape as `test_reduce.py`: synthetic fixtures that are minimisations of real defects. **DEMONSTRATED (derived).** No finding.
---
## Scope boundary — what this census did NOT cover
Named so the result is not read as complete:
- the `verify-before-compose` PreToolUse hook
- chamber-library tooling (`audit_cruft`, `verify_conversion`, `resolve_archived_source`, `apply_char_glyphs`, …)
- studium-engine `verify-quote` V1 / `fidelity_equivalence@2`
- BMF/L1 test suites
Each is a live instrument whose verdicts license claims. Uncensused is uncensused.
---
## Predictions, graded
1. Discrimination gate → DEMONSTRATED. **Held.**
2. `test_reduce.py` / `test_twin.py` → ABSENT-UNRECORDED. **Wrong** — both are property-derived and explicit.
3. Trial-03 degraded guard → ABSENT, now RECORDED. **Held**, and stronger than predicted: it fails loudly when the real artefact is missing.
4. Ladder entries skewed DEMONSTRATED-at-origin. **Held** — every entry names its origin failure. The gap is *subsequent* history, which I did not anticipate as the axis.
5. ABSENT-UNRECORDED dominant overall. **Held, but for the opposite reason.** I expected weakness in the newest work. It is in the oldest. Instruments do not start blind; **they go blind as the substrate they watch improves.**
The prediction-5 inversion is the finding worth carrying: freshly-built instruments are strong because the lesson is fresh. Decay is the failure mode, not construction.