ltl-accumulator-verified/verification/selftest_statements.sh

156 lines
7.8 KiB
Bash
Raw Normal View History

verification: bind statements and specification bodies (P1-a); un-stale the fidelity pin STATEMENT BINDING (Phase 3d). The coverage gate pins every constant's name, kind and axiom cone, both directions, and none of selftest_audit.sh's nine attacks defeat it. It is nevertheless blind to what a declaration SAYS — and that is demonstrated here rather than argued: Wrapping one branch of `LTLAcc.pinAccept`'s body in `id (…)` is definitionally equal. Every downstream proof still compiles. The name, the kind, the type and the axiom cone are unchanged. The inventory gate reports "222 constants, environment == allowlist" — GREEN. That edit is harmless by construction; the point is that nothing stood between it and a genuinely vacuous redefinition of a specification. Proofs/Inventory.lean now also emits, for every inventoried constant, its fully-elaborated TYPE, and for every definition its fully-elaborated BODY — 266 lines over 222 constants. Proof terms are deliberately absent: by proof irrelevance a theorem's content is its statement. check.sh Phase 3d binds the SHA-256 and the block is committed as AUDIT-MANIFEST.txt so a mismatch is DIFFED, not merely reported. The existing gate is untouched, per the standing rule that the port flows FROM this repo, not to it: INV lines are byte-identical, inventory_gate.sh is unchanged, and all nine of its attacks still fail as before. selftest_statements.sh replays the defeq edit as case 1, asserting BOTH that the coverage gate passes it and that Phase 3d catches it — so if the coverage gate ever grows to see this, the test says so instead of quietly re-labelling. Cases 2-4 cover a hand-edited committed block, a truncated block, and a constant inventoried without a statement. FIDELITY PIN (unrelated, found while running the button). Phase 4 had been failing since 2026-07-23: LIED_PIN_DIV expected 3,867 divergences between the Lean model and the deployed consistency verifier, and observed 0. Cause is pacta ddbb5a4, which restored the RFC 9162 2.1.4.2 Step-7 terminal `sn == 0` condition; that one conjunct removes every divergence in the pinned 73,573-case family. KNOWN-GAPS gap 14 already recorded the closure on the day it landed — only this constant was stale, so the button had been red for five days with nobody running it. The pin now reads 0 with the history in a comment. Nothing about the paper, public log entry 13, or the attested commit 172a1d0 changes; the historical divergence stays reproducible at the tagged pre-fix commit. KNOWN-GAPS gap 16 records what the binding does not buy: identity, not meaning; an author who edits and re-pins in one commit is caught by review and not by the script; and proof terms are unbound by design. Button green end to end: ATTESTATION GREEN (Lean + fidelity). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-29 07:07:13 +00:00
#!/usr/bin/env bash
# ─────────────────────────────────────────────────────────────────────────────
# selftest_statements.sh — adversarial self-test of check.sh Phase 3d.
#
# WHY A SECOND SELF-TEST. selftest_audit.sh attacks the coverage gate, which
# pins every constant's NAME, KIND and AXIOM CONE, both directions. That gate
# is strong and none of its nine attacks defeat it. It is also blind to what a
# declaration SAYS, and this script demonstrates that with a real, compiling
# edit rather than an argument:
#
# `LTLAcc.pinAccept` is a specification definition. Wrapping one branch of
# its body in `id (…)` is definitionally equal, so every downstream proof
# still compiles; the name, the kind, the type and the axiom cone are all
# unchanged. The inventory gate reports 222 constants, environment ==
# allowlist, GREEN. Only the statement digest sees it.
#
# That edit is deliberately harmless. The point is that the ONLY thing
# standing between it and a genuinely vacuous redefinition is the digest.
#
# Cases:
# 0 positive control: pristine tree passes Phase 3d
# 1 defeq body edit: old gate PASSES (asserted), Phase 3d FAILS (asserted)
# 2 committed AUDIT-MANIFEST.txt hand-edited → COMMITTED BLOCK STALE
# 3 statement block truncated → BLOCK TRUNCATED
# 4 a constant inventoried but carrying no statement → COVERAGE GAP
#
# Phase 3d is lifted out of check.sh at run time, so the tested logic IS the
# shipping logic. Run AFTER a green check.sh. All Lean work via lean-guard.
# ─────────────────────────────────────────────────────────────────────────────
set -uo pipefail
AENEAS_ENV="${AENEAS_ENV:-$HOME/aeneas-toolchain/env.sh}"
[ -f "$AENEAS_ENV" ] || { echo "FATAL: Aeneas environment not found: $AENEAS_ENV"; exit 1; }
source "$AENEAS_ENV"
SRC="$(cd "$(dirname "$0")" && pwd)"
AENEAS_LEAN="$AENEAS_HOME/backends/lean"
CORES="${LEAN_MAX_CORES:-0-3}"
FAILURES=0
WORK=$(mktemp -d /tmp/acc-stmt-selftest-XXXX)
trap 'rm -rf "$WORK"' EXIT
echo "=== statement-binding self-test (scratch: $WORK) ==="
cp -a "$SRC" "$WORK/verification"
T="$WORK/verification"
cp "$T/Proofs/PinStore.lean" "$T/PinStore.pristine"
cp "$T/AUDIT-MANIFEST.txt" "$T/MANIFEST.pristine"
# Phase 3d, lifted verbatim from the shipping button. HERE and INVLOG are the
# two variables it reads from its surroundings.
verification: guard the accumulator's two lifts (port lift-guard, assert on the payload) The four forks ship lift-guard.sh and call it from eight files each. This repository had no lift-guard.sh at all and called it zero times, while lifting Phase 0c (selftest-harness.sh) and Phase 3d (selftest_statements.sh). Its lifts got a line-count sanity check and nothing else — no analysis of which variables the payload READS against which the driver DEFINES, and after yesterday's fix no errexit check either. It was the one place that class could still recur. A SECOND defect surfaced while porting, and it is the more interesting one. Both lifts assembled the driver inline, with no payload file anywhere: { echo 'set -euo pipefail'; echo "HERE=..."; sed -n '...' check.sh } > DRIVER if [ "$(wc -l < "$DRIVER")" -lt 40 ]; then ... refuse ... so the size check measured the CONCATENATED DRIVER — bindings included. A lift that recovered almost nothing still cleared the threshold on the strength of the lines the test itself prepended. That is exactly the defect round-7 lift-guard-payload-assert reported and that the forks closed with the words "all six lift sites now assert on payload.sh". Six counted the forks. These two were never in the count, so a finding recorded as closed was measuring the wrong population — the same error this estate keeps finding in new costumes. Both sites now write payload.sh / payload3d.sh and assert on those. lift-guard.sh is byte-identical to the forks' (4f61c113). It is executable, so this repository's own self-deriving Phase 0c rule required a pin before it would run at all: required set == pinned set, verified. WIRING PROVEN RATHER THAN ASSUMED. With lift-guard.sh stubbed to exit 1, each self-test halts AT the guard, naming its phase, before a single attack case runs. Guard restored, pins re-verified. Certified: button + all three self-tests GREEN (check.sh 86s, selftest_audit 258s, selftest-harness 1s, selftest_statements 34s). The other five repositories are unchanged from the tree round-15 certified 50/50 and were not re-run; this commit does not claim they were. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-04 11:39:19 +00:00
# Payload to its own file before the driver is assembled: the size check must
# measure what was LIFTED, not the lift plus its bindings, and lift-guard needs
# the two apart to separate what the phase READS from what the driver DEFINES.
verification: bind statements and specification bodies (P1-a); un-stale the fidelity pin STATEMENT BINDING (Phase 3d). The coverage gate pins every constant's name, kind and axiom cone, both directions, and none of selftest_audit.sh's nine attacks defeat it. It is nevertheless blind to what a declaration SAYS — and that is demonstrated here rather than argued: Wrapping one branch of `LTLAcc.pinAccept`'s body in `id (…)` is definitionally equal. Every downstream proof still compiles. The name, the kind, the type and the axiom cone are unchanged. The inventory gate reports "222 constants, environment == allowlist" — GREEN. That edit is harmless by construction; the point is that nothing stood between it and a genuinely vacuous redefinition of a specification. Proofs/Inventory.lean now also emits, for every inventoried constant, its fully-elaborated TYPE, and for every definition its fully-elaborated BODY — 266 lines over 222 constants. Proof terms are deliberately absent: by proof irrelevance a theorem's content is its statement. check.sh Phase 3d binds the SHA-256 and the block is committed as AUDIT-MANIFEST.txt so a mismatch is DIFFED, not merely reported. The existing gate is untouched, per the standing rule that the port flows FROM this repo, not to it: INV lines are byte-identical, inventory_gate.sh is unchanged, and all nine of its attacks still fail as before. selftest_statements.sh replays the defeq edit as case 1, asserting BOTH that the coverage gate passes it and that Phase 3d catches it — so if the coverage gate ever grows to see this, the test says so instead of quietly re-labelling. Cases 2-4 cover a hand-edited committed block, a truncated block, and a constant inventoried without a statement. FIDELITY PIN (unrelated, found while running the button). Phase 4 had been failing since 2026-07-23: LIED_PIN_DIV expected 3,867 divergences between the Lean model and the deployed consistency verifier, and observed 0. Cause is pacta ddbb5a4, which restored the RFC 9162 2.1.4.2 Step-7 terminal `sn == 0` condition; that one conjunct removes every divergence in the pinned 73,573-case family. KNOWN-GAPS gap 14 already recorded the closure on the day it landed — only this constant was stale, so the button had been red for five days with nobody running it. The pin now reads 0 with the history in a comment. Nothing about the paper, public log entry 13, or the attested commit 172a1d0 changes; the historical divergence stays reproducible at the tagged pre-fix commit. KNOWN-GAPS gap 16 records what the binding does not buy: identity, not meaning; an author who edits and re-pins in one commit is caught by review and not by the script; and proof terms are unbound by design. Button green end to end: ATTESTATION GREEN (Lean + fidelity). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-29 07:07:13 +00:00
DRIVER="$T/phase3d.sh"
verification: guard the accumulator's two lifts (port lift-guard, assert on the payload) The four forks ship lift-guard.sh and call it from eight files each. This repository had no lift-guard.sh at all and called it zero times, while lifting Phase 0c (selftest-harness.sh) and Phase 3d (selftest_statements.sh). Its lifts got a line-count sanity check and nothing else — no analysis of which variables the payload READS against which the driver DEFINES, and after yesterday's fix no errexit check either. It was the one place that class could still recur. A SECOND defect surfaced while porting, and it is the more interesting one. Both lifts assembled the driver inline, with no payload file anywhere: { echo 'set -euo pipefail'; echo "HERE=..."; sed -n '...' check.sh } > DRIVER if [ "$(wc -l < "$DRIVER")" -lt 40 ]; then ... refuse ... so the size check measured the CONCATENATED DRIVER — bindings included. A lift that recovered almost nothing still cleared the threshold on the strength of the lines the test itself prepended. That is exactly the defect round-7 lift-guard-payload-assert reported and that the forks closed with the words "all six lift sites now assert on payload.sh". Six counted the forks. These two were never in the count, so a finding recorded as closed was measuring the wrong population — the same error this estate keeps finding in new costumes. Both sites now write payload.sh / payload3d.sh and assert on those. lift-guard.sh is byte-identical to the forks' (4f61c113). It is executable, so this repository's own self-deriving Phase 0c rule required a pin before it would run at all: required set == pinned set, verified. WIRING PROVEN RATHER THAN ASSUMED. With lift-guard.sh stubbed to exit 1, each self-test halts AT the guard, naming its phase, before a single attack case runs. Guard restored, pins re-verified. Certified: button + all three self-tests GREEN (check.sh 86s, selftest_audit 258s, selftest-harness 1s, selftest_statements 34s). The other five repositories are unchanged from the tree round-15 certified 50/50 and were not re-run; this commit does not claim they were. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-04 11:39:19 +00:00
PAYLOAD="$T/payload3d.sh"
sed -n '/^# -- Phase 3d/,/^# -- Phase 4/p' "$SRC/check.sh" | sed '$d' > "$PAYLOAD"
verification: bind statements and specification bodies (P1-a); un-stale the fidelity pin STATEMENT BINDING (Phase 3d). The coverage gate pins every constant's name, kind and axiom cone, both directions, and none of selftest_audit.sh's nine attacks defeat it. It is nevertheless blind to what a declaration SAYS — and that is demonstrated here rather than argued: Wrapping one branch of `LTLAcc.pinAccept`'s body in `id (…)` is definitionally equal. Every downstream proof still compiles. The name, the kind, the type and the axiom cone are unchanged. The inventory gate reports "222 constants, environment == allowlist" — GREEN. That edit is harmless by construction; the point is that nothing stood between it and a genuinely vacuous redefinition of a specification. Proofs/Inventory.lean now also emits, for every inventoried constant, its fully-elaborated TYPE, and for every definition its fully-elaborated BODY — 266 lines over 222 constants. Proof terms are deliberately absent: by proof irrelevance a theorem's content is its statement. check.sh Phase 3d binds the SHA-256 and the block is committed as AUDIT-MANIFEST.txt so a mismatch is DIFFED, not merely reported. The existing gate is untouched, per the standing rule that the port flows FROM this repo, not to it: INV lines are byte-identical, inventory_gate.sh is unchanged, and all nine of its attacks still fail as before. selftest_statements.sh replays the defeq edit as case 1, asserting BOTH that the coverage gate passes it and that Phase 3d catches it — so if the coverage gate ever grows to see this, the test says so instead of quietly re-labelling. Cases 2-4 cover a hand-edited committed block, a truncated block, and a constant inventoried without a statement. FIDELITY PIN (unrelated, found while running the button). Phase 4 had been failing since 2026-07-23: LIED_PIN_DIV expected 3,867 divergences between the Lean model and the deployed consistency verifier, and observed 0. Cause is pacta ddbb5a4, which restored the RFC 9162 2.1.4.2 Step-7 terminal `sn == 0` condition; that one conjunct removes every divergence in the pinned 73,573-case family. KNOWN-GAPS gap 14 already recorded the closure on the day it landed — only this constant was stale, so the button had been red for five days with nobody running it. The pin now reads 0 with the history in a comment. Nothing about the paper, public log entry 13, or the attested commit 172a1d0 changes; the historical divergence stays reproducible at the tagged pre-fix commit. KNOWN-GAPS gap 16 records what the binding does not buy: identity, not meaning; an author who edits and re-pins in one commit is caught by review and not by the script; and proof terms are unbound by design. Button green end to end: ATTESTATION GREEN (Lean + fidelity). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-29 07:07:13 +00:00
{
verification: lifted phases run under the buttons shell options, enforced in lift-guard A lift is evidence about the shipping gate only if it executes the way the shipping gate executes. Every button here runs `set -euo pipefail`. Eighteen lift sites prefixed their driver with `set -uo pipefail` and no -e — four per fork (selftest-harness, selftest-scalar-statements, selftest-statements twice) and both accumulator lifts — while sixteen other sites got it right. The estate did it both ways, which is what made this a defect and not a convention. Without -e a failing command does not abort: execution continues and the driver returns the LAST command status. A lifted phase can therefore reach a verdict the shipping phase would never reach while the self-test reports the gate "works". selftest_statements.sh:27 claims the tested logic IS the shipping logic; in this respect it was not. NO VERDICT CHANGED. Every self-test that passed before passes now, at the same timings, so -e was not masking a false green at these commits. The defect was fidelity and the claim is no larger than that. The durable part is not the 18 edits. lift-guard.sh already inspects every driver, so it now REFUSES any lift whose driver does not enable errexit and prints the drivers actual shell options. Negative-tested four ways: no -e rejects, `set -euo` passes, bare `set -e` passes, no set line at all rejects. Byte-identical across the four forks. The nineteenth lift someone writes fails closed rather than silently testing a more permissive shell. Certified by the round-15 sweep: 50/50 GREEN, six repositories, both buttons and every self-test, exit 0. Registered and NOT fixed here: ltl-accumulator-verified has no lift-guard.sh at all and calls it zero times, so its two lifts remain unguarded — the one place this class can still recur silently. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-04 10:58:29 +00:00
echo 'set -euo pipefail' # -e matches the button; see lift-drivers-drop-errexit
verification: bind statements and specification bodies (P1-a); un-stale the fidelity pin STATEMENT BINDING (Phase 3d). The coverage gate pins every constant's name, kind and axiom cone, both directions, and none of selftest_audit.sh's nine attacks defeat it. It is nevertheless blind to what a declaration SAYS — and that is demonstrated here rather than argued: Wrapping one branch of `LTLAcc.pinAccept`'s body in `id (…)` is definitionally equal. Every downstream proof still compiles. The name, the kind, the type and the axiom cone are unchanged. The inventory gate reports "222 constants, environment == allowlist" — GREEN. That edit is harmless by construction; the point is that nothing stood between it and a genuinely vacuous redefinition of a specification. Proofs/Inventory.lean now also emits, for every inventoried constant, its fully-elaborated TYPE, and for every definition its fully-elaborated BODY — 266 lines over 222 constants. Proof terms are deliberately absent: by proof irrelevance a theorem's content is its statement. check.sh Phase 3d binds the SHA-256 and the block is committed as AUDIT-MANIFEST.txt so a mismatch is DIFFED, not merely reported. The existing gate is untouched, per the standing rule that the port flows FROM this repo, not to it: INV lines are byte-identical, inventory_gate.sh is unchanged, and all nine of its attacks still fail as before. selftest_statements.sh replays the defeq edit as case 1, asserting BOTH that the coverage gate passes it and that Phase 3d catches it — so if the coverage gate ever grows to see this, the test says so instead of quietly re-labelling. Cases 2-4 cover a hand-edited committed block, a truncated block, and a constant inventoried without a statement. FIDELITY PIN (unrelated, found while running the button). Phase 4 had been failing since 2026-07-23: LIED_PIN_DIV expected 3,867 divergences between the Lean model and the deployed consistency verifier, and observed 0. Cause is pacta ddbb5a4, which restored the RFC 9162 2.1.4.2 Step-7 terminal `sn == 0` condition; that one conjunct removes every divergence in the pinned 73,573-case family. KNOWN-GAPS gap 14 already recorded the closure on the day it landed — only this constant was stale, so the button had been red for five days with nobody running it. The pin now reads 0 with the history in a comment. Nothing about the paper, public log entry 13, or the attested commit 172a1d0 changes; the historical divergence stays reproducible at the tagged pre-fix commit. KNOWN-GAPS gap 16 records what the binding does not buy: identity, not meaning; an author who edits and re-pins in one commit is caught by review and not by the script; and proof terms are unbound by design. Button green end to end: ATTESTATION GREEN (Lean + fidelity). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-29 07:07:13 +00:00
echo "HERE=\"$T\""
echo 'INVLOG="$1"'
verification: guard the accumulator's two lifts (port lift-guard, assert on the payload) The four forks ship lift-guard.sh and call it from eight files each. This repository had no lift-guard.sh at all and called it zero times, while lifting Phase 0c (selftest-harness.sh) and Phase 3d (selftest_statements.sh). Its lifts got a line-count sanity check and nothing else — no analysis of which variables the payload READS against which the driver DEFINES, and after yesterday's fix no errexit check either. It was the one place that class could still recur. A SECOND defect surfaced while porting, and it is the more interesting one. Both lifts assembled the driver inline, with no payload file anywhere: { echo 'set -euo pipefail'; echo "HERE=..."; sed -n '...' check.sh } > DRIVER if [ "$(wc -l < "$DRIVER")" -lt 40 ]; then ... refuse ... so the size check measured the CONCATENATED DRIVER — bindings included. A lift that recovered almost nothing still cleared the threshold on the strength of the lines the test itself prepended. That is exactly the defect round-7 lift-guard-payload-assert reported and that the forks closed with the words "all six lift sites now assert on payload.sh". Six counted the forks. These two were never in the count, so a finding recorded as closed was measuring the wrong population — the same error this estate keeps finding in new costumes. Both sites now write payload.sh / payload3d.sh and assert on those. lift-guard.sh is byte-identical to the forks' (4f61c113). It is executable, so this repository's own self-deriving Phase 0c rule required a pin before it would run at all: required set == pinned set, verified. WIRING PROVEN RATHER THAN ASSUMED. With lift-guard.sh stubbed to exit 1, each self-test halts AT the guard, naming its phase, before a single attack case runs. Guard restored, pins re-verified. Certified: button + all three self-tests GREEN (check.sh 86s, selftest_audit 258s, selftest-harness 1s, selftest_statements 34s). The other five repositories are unchanged from the tree round-15 certified 50/50 and were not re-run; this commit does not claim they were. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-04 11:39:19 +00:00
cat "$PAYLOAD"
verification: bind statements and specification bodies (P1-a); un-stale the fidelity pin STATEMENT BINDING (Phase 3d). The coverage gate pins every constant's name, kind and axiom cone, both directions, and none of selftest_audit.sh's nine attacks defeat it. It is nevertheless blind to what a declaration SAYS — and that is demonstrated here rather than argued: Wrapping one branch of `LTLAcc.pinAccept`'s body in `id (…)` is definitionally equal. Every downstream proof still compiles. The name, the kind, the type and the axiom cone are unchanged. The inventory gate reports "222 constants, environment == allowlist" — GREEN. That edit is harmless by construction; the point is that nothing stood between it and a genuinely vacuous redefinition of a specification. Proofs/Inventory.lean now also emits, for every inventoried constant, its fully-elaborated TYPE, and for every definition its fully-elaborated BODY — 266 lines over 222 constants. Proof terms are deliberately absent: by proof irrelevance a theorem's content is its statement. check.sh Phase 3d binds the SHA-256 and the block is committed as AUDIT-MANIFEST.txt so a mismatch is DIFFED, not merely reported. The existing gate is untouched, per the standing rule that the port flows FROM this repo, not to it: INV lines are byte-identical, inventory_gate.sh is unchanged, and all nine of its attacks still fail as before. selftest_statements.sh replays the defeq edit as case 1, asserting BOTH that the coverage gate passes it and that Phase 3d catches it — so if the coverage gate ever grows to see this, the test says so instead of quietly re-labelling. Cases 2-4 cover a hand-edited committed block, a truncated block, and a constant inventoried without a statement. FIDELITY PIN (unrelated, found while running the button). Phase 4 had been failing since 2026-07-23: LIED_PIN_DIV expected 3,867 divergences between the Lean model and the deployed consistency verifier, and observed 0. Cause is pacta ddbb5a4, which restored the RFC 9162 2.1.4.2 Step-7 terminal `sn == 0` condition; that one conjunct removes every divergence in the pinned 73,573-case family. KNOWN-GAPS gap 14 already recorded the closure on the day it landed — only this constant was stale, so the button had been red for five days with nobody running it. The pin now reads 0 with the history in a comment. Nothing about the paper, public log entry 13, or the attested commit 172a1d0 changes; the historical divergence stays reproducible at the tagged pre-fix commit. KNOWN-GAPS gap 16 records what the binding does not buy: identity, not meaning; an author who edits and re-pins in one commit is caught by review and not by the script; and proof terms are unbound by design. Button green end to end: ATTESTATION GREEN (Lean + fidelity). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-29 07:07:13 +00:00
} > "$DRIVER"
verification: guard the accumulator's two lifts (port lift-guard, assert on the payload) The four forks ship lift-guard.sh and call it from eight files each. This repository had no lift-guard.sh at all and called it zero times, while lifting Phase 0c (selftest-harness.sh) and Phase 3d (selftest_statements.sh). Its lifts got a line-count sanity check and nothing else — no analysis of which variables the payload READS against which the driver DEFINES, and after yesterday's fix no errexit check either. It was the one place that class could still recur. A SECOND defect surfaced while porting, and it is the more interesting one. Both lifts assembled the driver inline, with no payload file anywhere: { echo 'set -euo pipefail'; echo "HERE=..."; sed -n '...' check.sh } > DRIVER if [ "$(wc -l < "$DRIVER")" -lt 40 ]; then ... refuse ... so the size check measured the CONCATENATED DRIVER — bindings included. A lift that recovered almost nothing still cleared the threshold on the strength of the lines the test itself prepended. That is exactly the defect round-7 lift-guard-payload-assert reported and that the forks closed with the words "all six lift sites now assert on payload.sh". Six counted the forks. These two were never in the count, so a finding recorded as closed was measuring the wrong population — the same error this estate keeps finding in new costumes. Both sites now write payload.sh / payload3d.sh and assert on those. lift-guard.sh is byte-identical to the forks' (4f61c113). It is executable, so this repository's own self-deriving Phase 0c rule required a pin before it would run at all: required set == pinned set, verified. WIRING PROVEN RATHER THAN ASSUMED. With lift-guard.sh stubbed to exit 1, each self-test halts AT the guard, naming its phase, before a single attack case runs. Guard restored, pins re-verified. Certified: button + all three self-tests GREEN (check.sh 86s, selftest_audit 258s, selftest-harness 1s, selftest_statements 34s). The other five repositories are unchanged from the tree round-15 certified 50/50 and were not re-run; this commit does not claim they were. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-04 11:39:19 +00:00
if [ "$(wc -l < "$PAYLOAD")" -lt 40 ]; then
verification: bind statements and specification bodies (P1-a); un-stale the fidelity pin STATEMENT BINDING (Phase 3d). The coverage gate pins every constant's name, kind and axiom cone, both directions, and none of selftest_audit.sh's nine attacks defeat it. It is nevertheless blind to what a declaration SAYS — and that is demonstrated here rather than argued: Wrapping one branch of `LTLAcc.pinAccept`'s body in `id (…)` is definitionally equal. Every downstream proof still compiles. The name, the kind, the type and the axiom cone are unchanged. The inventory gate reports "222 constants, environment == allowlist" — GREEN. That edit is harmless by construction; the point is that nothing stood between it and a genuinely vacuous redefinition of a specification. Proofs/Inventory.lean now also emits, for every inventoried constant, its fully-elaborated TYPE, and for every definition its fully-elaborated BODY — 266 lines over 222 constants. Proof terms are deliberately absent: by proof irrelevance a theorem's content is its statement. check.sh Phase 3d binds the SHA-256 and the block is committed as AUDIT-MANIFEST.txt so a mismatch is DIFFED, not merely reported. The existing gate is untouched, per the standing rule that the port flows FROM this repo, not to it: INV lines are byte-identical, inventory_gate.sh is unchanged, and all nine of its attacks still fail as before. selftest_statements.sh replays the defeq edit as case 1, asserting BOTH that the coverage gate passes it and that Phase 3d catches it — so if the coverage gate ever grows to see this, the test says so instead of quietly re-labelling. Cases 2-4 cover a hand-edited committed block, a truncated block, and a constant inventoried without a statement. FIDELITY PIN (unrelated, found while running the button). Phase 4 had been failing since 2026-07-23: LIED_PIN_DIV expected 3,867 divergences between the Lean model and the deployed consistency verifier, and observed 0. Cause is pacta ddbb5a4, which restored the RFC 9162 2.1.4.2 Step-7 terminal `sn == 0` condition; that one conjunct removes every divergence in the pinned 73,573-case family. KNOWN-GAPS gap 14 already recorded the closure on the day it landed — only this constant was stale, so the button had been red for five days with nobody running it. The pin now reads 0 with the history in a comment. Nothing about the paper, public log entry 13, or the attested commit 172a1d0 changes; the historical divergence stays reproducible at the tagged pre-fix commit. KNOWN-GAPS gap 16 records what the binding does not buy: identity, not meaning; an author who edits and re-pins in one commit is caught by review and not by the script; and proof terms are unbound by design. Button green end to end: ATTESTATION GREEN (Lean + fidelity). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-29 07:07:13 +00:00
echo "FATAL: could not lift Phase 3d out of check.sh — the phase markers moved."
echo "This self-test must attack the shipping gate; refusing to run against nothing."
exit 1
fi
verification: guard the accumulator's two lifts (port lift-guard, assert on the payload) The four forks ship lift-guard.sh and call it from eight files each. This repository had no lift-guard.sh at all and called it zero times, while lifting Phase 0c (selftest-harness.sh) and Phase 3d (selftest_statements.sh). Its lifts got a line-count sanity check and nothing else — no analysis of which variables the payload READS against which the driver DEFINES, and after yesterday's fix no errexit check either. It was the one place that class could still recur. A SECOND defect surfaced while porting, and it is the more interesting one. Both lifts assembled the driver inline, with no payload file anywhere: { echo 'set -euo pipefail'; echo "HERE=..."; sed -n '...' check.sh } > DRIVER if [ "$(wc -l < "$DRIVER")" -lt 40 ]; then ... refuse ... so the size check measured the CONCATENATED DRIVER — bindings included. A lift that recovered almost nothing still cleared the threshold on the strength of the lines the test itself prepended. That is exactly the defect round-7 lift-guard-payload-assert reported and that the forks closed with the words "all six lift sites now assert on payload.sh". Six counted the forks. These two were never in the count, so a finding recorded as closed was measuring the wrong population — the same error this estate keeps finding in new costumes. Both sites now write payload.sh / payload3d.sh and assert on those. lift-guard.sh is byte-identical to the forks' (4f61c113). It is executable, so this repository's own self-deriving Phase 0c rule required a pin before it would run at all: required set == pinned set, verified. WIRING PROVEN RATHER THAN ASSUMED. With lift-guard.sh stubbed to exit 1, each self-test halts AT the guard, naming its phase, before a single attack case runs. Guard restored, pins re-verified. Certified: button + all three self-tests GREEN (check.sh 86s, selftest_audit 258s, selftest-harness 1s, selftest_statements 34s). The other five repositories are unchanged from the tree round-15 certified 50/50 and were not re-run; this commit does not claim they were. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-04 11:39:19 +00:00
# Guarded by the SHIPPING guard in $SRC, not the copy inside the scratch tree:
# a test that vets itself with its own copy of the instrument proves less.
"$SRC/lift-guard.sh" "$PAYLOAD" "$DRIVER" "check.sh Phase 3d" || exit 1
verification: bind statements and specification bodies (P1-a); un-stale the fidelity pin STATEMENT BINDING (Phase 3d). The coverage gate pins every constant's name, kind and axiom cone, both directions, and none of selftest_audit.sh's nine attacks defeat it. It is nevertheless blind to what a declaration SAYS — and that is demonstrated here rather than argued: Wrapping one branch of `LTLAcc.pinAccept`'s body in `id (…)` is definitionally equal. Every downstream proof still compiles. The name, the kind, the type and the axiom cone are unchanged. The inventory gate reports "222 constants, environment == allowlist" — GREEN. That edit is harmless by construction; the point is that nothing stood between it and a genuinely vacuous redefinition of a specification. Proofs/Inventory.lean now also emits, for every inventoried constant, its fully-elaborated TYPE, and for every definition its fully-elaborated BODY — 266 lines over 222 constants. Proof terms are deliberately absent: by proof irrelevance a theorem's content is its statement. check.sh Phase 3d binds the SHA-256 and the block is committed as AUDIT-MANIFEST.txt so a mismatch is DIFFED, not merely reported. The existing gate is untouched, per the standing rule that the port flows FROM this repo, not to it: INV lines are byte-identical, inventory_gate.sh is unchanged, and all nine of its attacks still fail as before. selftest_statements.sh replays the defeq edit as case 1, asserting BOTH that the coverage gate passes it and that Phase 3d catches it — so if the coverage gate ever grows to see this, the test says so instead of quietly re-labelling. Cases 2-4 cover a hand-edited committed block, a truncated block, and a constant inventoried without a statement. FIDELITY PIN (unrelated, found while running the button). Phase 4 had been failing since 2026-07-23: LIED_PIN_DIV expected 3,867 divergences between the Lean model and the deployed consistency verifier, and observed 0. Cause is pacta ddbb5a4, which restored the RFC 9162 2.1.4.2 Step-7 terminal `sn == 0` condition; that one conjunct removes every divergence in the pinned 73,573-case family. KNOWN-GAPS gap 14 already recorded the closure on the day it landed — only this constant was stale, so the button had been red for five days with nobody running it. The pin now reads 0 with the history in a comment. Nothing about the paper, public log entry 13, or the attested commit 172a1d0 changes; the historical divergence stays reproducible at the tagged pre-fix commit. KNOWN-GAPS gap 16 records what the binding does not buy: identity, not meaning; an author who edits and re-pins in one commit is caught by review and not by the script; and proof terms are unbound by design. Button green end to end: ATTESTATION GREEN (Lean + fidelity). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-29 07:07:13 +00:00
# Recompile the edited leaf module + the inventory into $T/inv.out.
build_inventory() {
cd "$AENEAS_LEAN"
lake env bash -c "
set -euo pipefail
cd '$T' && export LEAN_PATH=\"\$LEAN_PATH:$T/gen:$T\"
LEAN_TIMEOUT=600 LEAN_MAX_CORES=$CORES '$T/lean-guard' Proofs/PinStore.lean >/dev/null 2>&1
LEAN_TIMEOUT=600 LEAN_MAX_CORES=$CORES '$T/lean-guard' Proofs/Inventory.lean
" > "$T/inv.out" 2>&1
local rc=$?
cd "$T"
return $rc
}
expect() { # expect <label> <invlog> <want-rc> <want-substring>
local label="$1" invlog="$2" want_rc="$3" want_txt="$4" out rc
# Phase 3d removes its INVLOG on the way out — that is correct behaviour for
# the button and fatal for a fixture, so it always gets a disposable copy.
cp "$invlog" "$T/inv.feed"
out=$(bash "$DRIVER" "$T/inv.feed" 2>&1); rc=$?
if [ "$rc" -ne "$want_rc" ]; then
echo "$label: exit $rc, expected $want_rc"; echo "$out" | sed 's/^/ /'
FAILURES=$((FAILURES+1)); return
fi
if ! grep -qF "$want_txt" <<<"$out"; then
echo "$label: exit code right, diagnostic wrong (rejected for the wrong reason)"
echo " wanted: $want_txt"; echo "$out" | sed 's/^/ /'
FAILURES=$((FAILURES+1)); return
fi
echo "$label"
}
# ── 0. positive control ────────────────────────────────────────────────────
build_inventory || { echo " ✗ case 0: pristine tree did not compile"; exit 1; }
cp "$T/inv.out" "$T/inv.pristine"
expect "case 0 control: pristine tree passes Phase 3d" "$T/inv.pristine" 0 "statements bound"
# ── 1. THE ONE THAT MATTERS: a compiling, definitionally-equal body edit ───
python3 - "$T/Proofs/PinStore.lean" <<'PY'
import sys
f = sys.argv[1]; s = open(f).read()
old = " else ConsRec n n' C true r = some (r, r')"
assert s.count(old) == 1, "pinAccept body not found — this case is vacuous"
open(f, "w").write(s.replace(old, " else id (ConsRec n n' C true r = some (r, r'))", 1))
PY
if build_inventory; then
# The premise: the coverage gate must NOT see this. If it ever does, this
# case stops testing what it claims and must be re-examined, not re-labelled.
if "$T/inventory_gate.sh" "$T/inv.out" "$T/inventory-allowlist.txt" >/dev/null 2>&1; then
echo " ✓ case 1 premise: the coverage gate passes the edit (kind and cone unmoved)"
else
echo " ✗ case 1 premise: the coverage gate caught it — this case no longer isolates Phase 3d"
FAILURES=$((FAILURES+1))
fi
expect "case 1: defeq body edit caught by the statement digest" "$T/inv.out" 1 "STATEMENT DIGEST MISMATCH"
else
echo " ✗ case 1: the edited corpus did not compile (case is vacuous)"
FAILURES=$((FAILURES+1))
fi
cp "$T/PinStore.pristine" "$T/Proofs/PinStore.lean"
# ── 2. committed block hand-edited ─────────────────────────────────────────
sed -i '1s/$/ TAMPERED/' "$T/AUDIT-MANIFEST.txt"
expect "case 2: hand-edited committed block" "$T/inv.pristine" 1 "COMMITTED BLOCK STALE"
cp "$T/MANIFEST.pristine" "$T/AUDIT-MANIFEST.txt"
# ── 3. truncated block: "nothing found" must not pass for "nothing wrong" ──
grep -v '^STMT|LTLAcc.pinAccept|def|value=' "$T/inv.pristine" > "$T/inv.truncated"
expect "case 3: truncated statement block" "$T/inv.truncated" 1 "BLOCK TRUNCATED"
# ── 4. a constant inventoried but carrying no statement ────────────────────
# Drop one type line AND fix the trailer, so only the coverage comparison
# against the INV count can still object.
grep -v '^STMT|LTLAcc.pinAccept|def|type=' "$T/inv.pristine" > "$T/inv.gap"
NEW_N=$(awk '/^STMT-BEGIN/{f=1;next}/^STMT-END/{f=0}f' "$T/inv.gap" | grep -c '^STMT|')
sed -i "s/^STMT-COUNT|.*/STMT-COUNT|$NEW_N/" "$T/inv.gap"
expect "case 4: inventoried constant with no statement" "$T/inv.gap" 1 "STATEMENT COVERAGE GAP"
echo ""
if [ "$FAILURES" -eq 0 ]; then
echo "=== SELF-TEST GREEN: 4 attack cases defeated + positive control ==="
echo " Phase 3d catches what the coverage gate provably cannot see."
exit 0
fi
echo "=== SELF-TEST FAILED: $FAILURES case(s) did not behave as claimed ==="
exit 1