[HARDENING] STATE-CLAIM + the resolution state, built together (REVIEWED-127)

Both halves of the schema, shipped in one change because the ruling said half a schema
invites a third patch and a third patch is how a vocabulary accretes instead of being
designed.

157 — resolution state. `resolved:` on any block; a resolved block is no longer due but
is NOT dropped: it prints as a closed ledger, because a discharge that vanishes from the
report is its own decay. The pointer must RESOLVE — a real path or a real git object —
so an undocumented discharge is impossible to express rather than merely discouraged. A
dangling pointer reports in the register-integrity lane, the same lane as an amendment
that replaced the record it amends; both are a record closing over its own history.

The 25th's hand-rename is MIGRATED back to DEFERRED-DECISION with resolved: set. That
block was the per-instance workaround 157 was filed against, and it is now the
migration's own test case.

158 — STATE-CLAIM. Reuses trigger_fired() verbatim and inverts only what firing MEANS:
for a deferral, fired = the decision is due; for a state-claim, fired = THE CLAIM IS
FALSE. Two new trigger kinds earned directly from today's instances: text-present (the
trial-09 hold, falsified by REVIEWED-124's existence) and file-changed-since ("the filed
rule not edited", false one hour after writing).

16 new controls, each with its discriminating half — fires on met, silent on unmet,
manual listed-never-fired, resolved excluded from due-ness, the SAME block unresolved
still due, a real pointer resolves, "yes, done" does not.

Proven on the LIVE blocks, not only fixtures: pointing the state-claim at an older
commit made it report FALSIFIED by name; replacing the resolution with "yes done" made
register-integrity report it; both restored and both returned to quiet.

⚠ One control failed before shipping and the failure was the useful part. The negative
control for file-changed-since pointed at FOOL-SEED-RULE.md, which this same session then
edited — so "unchanged since HEAD" broke, correctly. A control whose subject is "did this
file change" must not point at a file the session is changing. Re-pointed at a frozen
2026-08-02 trial artifact, with the reason recorded at the fixture. Caught because the
controls run on every invocation rather than in a separate suite.

First two real state-claims filed, deliberately one of each kind: ~/CLAUDE.md untouched
under PENDING-150, mechanically watched and [ESCALATE]-grade the moment it goes false;
and §9's channel unbuilt, marked `manual` because it has no filename yet and inventing a
proxy falsifier is the error the schema's own comment warns against.

⚠ The zero-state prints a WARNING, not a tick: "0 marked, NOT none-stale" with the ~57
unmarked candidates named as a grep. An instrument that reads nothing reports exactly
like one that finds nothing, and that is the failure this item exists to end.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J6hZXNYSxEfZseBGTni4sf
This commit is contained in:
David F Glidden
2026-08-25 15:29:59 +02:00
co-authored by Claude Opus 5
parent 0dcf304486
commit 063eccfd80
4 changed files with 247 additions and 17 deletions
+10 -10
View File
@@ -4252,20 +4252,20 @@ Jurist: *"Confirm that lowercasing is applied at exactly one point in the code a
| PENDING-89 source (iv) | **AUTHORIZED to read** — 55 files; answers generation diversity only, never correlation of misses |
| §13.6 block | ⚠ **LIFTED** — its stated condition (§5 ratification) is met |
<!-- DISCHARGED-DECISION: fool-beacon-derivation-run-once
<!-- DEFERRED-DECISION: fool-beacon-derivation-run-once
since: 2026-08-22
trigger: date 2026-08-25 — FIRED. Announced BY NAME at the 2026-08-25 wake, which is
the first time this mechanism carried a real one rather than a rehearsed one.
trigger: date 2026-08-25
owner: executor
discharged: 2026-08-25 — the derivation ran ONCE. Record:
claude/governance/fool/seed/FOOL-BONES-2026-08-25.md, commit 5694b925.
RENAMED, not deleted: governance-drift-check.py's parser has no `resolved:` field, so a
taken decision would be reported COME DUE forever and the instrument would degrade into
crying wolf. Renaming the key stops the report while leaving the record that the trigger
existed, fired, and was answered. If a `resolved:` field is ever added, this reverts to
DEFERRED-DECISION with that field set.
resolved: 2026-08-25 — ran once; claude/governance/fool/seed/FOOL-BONES-2026-08-25.md, commit 5694b925
-->
⚠ **MIGRATED 2026-08-25 under REVIEWED-127.** This block was closed on the 25th by
hand-renaming its key to `DISCHARGED-DECISION`, because the schema had no way to say
*answered*. That rename was the per-instance workaround PENDING-157 was filed against, and
it is now reverted: the key is `DEFERRED-DECISION` again and the closure is carried by a
`resolved:` field the checker reads. **This block is the migration's own test case** — the
first resolved deferral, and the one whose pointer must resolve.
⚠ **TRIGGER BLOCK ADDED 2026-08-24.** Until today this run-once, irreversible, dated act had **no
trigger of any kind** — no cron, no launchd, no scheduled agent, and not a tracked
DEFERRED-DECISION. It was one of the 105 prose deferrals the drift-check reports as carrying no