Skip to content

fix: make the sealed-condition anchor independent of the close label - #4

Merged
bhyi4 merged 1 commit into
mainfrom
fix/seal-anchor-label-independent
Aug 5, 2026
Merged

fix: make the sealed-condition anchor independent of the close label#4
bhyi4 merged 1 commit into
mainfrom
fix/seal-anchor-label-independent

Conversation

@bhyi4

@bhyi4 bhyi4 commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

The hole

A pre-registered kill-condition is the only thing in a close the closing agent did not write — it is sealed in an append-only ledger before the compute. But arc-close only injected and checked it when IS_KILL was set, and IS_KILL reads --stop plus the verdict string. Both of those are written by the same agent, at closing time.

So closing a sealed arc as converged switched the anchor off. The sealed bar was never quoted into the record, never compared against, never refused. The strongest gate in the harness was gated behind the weakest signal.

The fix

SEAL_GATE keys off the sealed condition existing, never off the label.

  • KILL close → 🛡️ KILL-defense 5-check (unchanged)
  • any other close on a sealed arc → 🔒 sealed-condition cross-check, one item: did the result stay clear of the bar you sealed, or did you move the bar?
  • a .prereg whose condition no longer resolves → refused, not skipped (it was a quiet way around the gate)
  • both paths share one trivial-evasion bar (check_answers) — kept apart they drift, which this repo has already demonstrated once

What was rejected, and why

Triggering on the word "KILL" appearing in the summary body. Measured against an archive of real closes, it was wrong in both directions: it fired on 3 of 4 label-free arcs for the wrong reason (citations of other arcs' seals, kill-conditions being designed for a next stage), and it missed the closes that actually buried an original claim, because those never use the word. It would also have attached a filing cost to exactly the honest self-reporting the gate exists to encourage.

The general point, which is now in METHODOLOGY.md: a trigger the examinee writes is not a trigger.

Tests

tests/test_gates.sh covers the regression directly — injection on a non-KILL close, refusal while unfilled, refusal of a trivial answer, refusal of a widened sealed line, refusal of a broken anchor, plus two positive controls (a substantive answer seals; an unsealed arc closes exactly as before). Verified failing against the pre-fix script.

🤖 Generated with Claude Code

A pre-registered kill-condition is the only signal in a close that the closing
agent did not write: it is sealed in an append-only ledger before the compute.
But the harness only injected and checked it when IS_KILL was set — and IS_KILL
comes from `--stop` and the verdict string, both written by that same agent at
closing time. Closing an arc as `converged` therefore switched the anchor off
entirely: the sealed bar was never quoted, never compared, never refused.

Now the injection keys off the sealed condition existing. A KILL close still
gets the 🛡️ 5-check; any other close on a sealed arc gets a one-item 🔒
sealed-condition cross-check — did the result stay clear of the bar you sealed,
or did you move the bar? A `.prereg` whose condition no longer resolves is
refused rather than passed in silence, since that was a quiet way around the
gate. Both paths share one trivial-evasion bar (`check_answers`); kept separate
they drift, which this repo has already demonstrated once.

Triggering on the word "KILL" appearing in the summary body was considered and
rejected on measurement: against an archive of real closes it fired on 3 of 4
label-free arcs for the wrong reason (citations of other arcs' seals,
kill-conditions being designed for a next stage) while missing the closes that
actually buried an original claim — those never use the word. It would also
have put a filing cost on exactly the honest self-reporting the gate exists to
encourage.

Tests cover the regression directly: injection on a non-KILL close, refusal
while unfilled, refusal of a trivial answer, refusal of a widened sealed line,
refusal of a broken anchor, and two positive controls (a substantive answer
seals; an arc with no seal is unaffected).
@bhyi4
bhyi4 merged commit 968dd99 into main Aug 5, 2026
3 checks passed
@bhyi4
bhyi4 deleted the fix/seal-anchor-label-independent branch August 5, 2026 07:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant