Rank 4 on the docket. The L10 always-on lane has passed a 5000-beat soak since
2026-07-19. That result lived as PROSE IN A CONTRACT FILE — no machine-readable
artifact, no run SHA, no rerun path, and a deterministic_digest that report.py
computed and nothing pinned. The contract's own closing line asked for the pin
("Pin it once the lane is trusted so a regression flips it") and it was never
added. A recorded prose result with no re-derivable artifact is testimony, not
evidence, and that file is exactly where the distinction was meant to be
enforced.
R-2 first, before the run — as the plan required, so the soak measured a
decided question rather than deciding one by accident.
R-2 was ruled B (beats govern cognition; wall-clock permitted in telemetry
only). Measured: this lane carries NO WALL-CLOCK AT ALL — runner.py,
predicates.py and report.py contain no time, datetime, or timestamp of any
kind. That is stronger than B requires, and it is KEPT rather than "completed",
for three reasons now recorded in the contract:
1. B's permissive half is a permission, not an obligation. Adding a field so
the code matches a ruling's letter, then adding a pin to guard the field,
is a mechanism whose only purpose is to be guarded.
2. "When was this last run?" is already the artifact's COMMIT DATE —
immutable, verifiable, stated once. A generated_at inside the report would
be a second copy of one fact, drifting the moment a report is regenerated
and not committed. That is G-23's defect class, registered this same week.
3. It keeps the digest honestly deterministic. A timestamp would have to be
excluded from it — a value in the artifact that the artifact's own
integrity check ignores.
The contract also records what WOULD change this: a predicate whose claim is
about duration rather than sequence (H5's resource-cost leg is the live
candidate). B is already ruled, so that needs no new decision — only the
predicate that requires it.
The re-run: 5000 beats, reboot at 2500, under the POST-R-3 profile. All four
predicates pass. Committed as
evals/l10_always_on/results/report-5000-6c67e88d.json, digest f814fd97….
The most useful result was not the pass. Every DETERMINISTIC fact reproduced
exactly — vault bounded at 6, convergence at beat 1 with a 4999-beat tail,
clean reboot with derived learning intact — while the machine-variant float
moved from the prose's 1.389e-07 to a worst of 6.177e-08. That is the first
real evidence that excluding versor_condition from the digest was correct
rather than convenient: a digest covering it would have flipped on a machine
change and taught every reader to ignore it. The prose figure is superseded,
not contradicted — it was never a reproducible quantity.
tests/test_l10_soak_evidence.py, on the gate, guarding two DIFFERENT failure
modes that are easy to conflate:
REGRESSION — the digest is pinned, plus the horizon (a 24-beat report pinned
as though it were the 5000-beat one would pass everything else), the four
predicates by name (all_gates_pass alone is satisfied by an empty predicate
list), and a vacuity guard on the attested set.
STALENESS — the mode nothing guarded, and the one that had ALREADY FIRED.
R-9 ruled the cadence change-triggered, not clock-triggered: local-first
doctrine makes "nightly" a ruling rather than a cron line, and a nightly that
does not run is green for the wrong reason (H-9). So instead of "when did we
last run it?", the pin asks the question that matters — DOES THIS EVIDENCE
STILL DESCRIBE THE CODE THAT SHIPS? — by holding the SHA-256 of every source
the soak attests: chat/always_on.py, chat/always_on_daemon.py, and the three
harness modules.
That is not hypothetical. It had already fired silently for six weeks: the
2026-07-19 soak ran with accrue_realized_knowledge absent from
CONTINUOUS_LIFE_CONFIG_FLAGS, so from R-3 (PR-5, this same day) onward the
recorded result attested a process that no longer existed — and nothing in the
repository could notice. HAD THIS PIN EXISTED, PR-5 WOULD HAVE FAILED IT. That
is precisely the intended behaviour, and it is verified by sabotage: touching
always_on_daemon.py turns it red.
The failure message says RE-RUN THE SOAK — DO NOT EDIT THE HASHES, because
updating a hash to match changed source without re-running converts the pin
into a record asserting evidence that does not exist. That is the failure this
whole arc is about, committed inside its own remedy.
Three sabotages observed red: a touched daemon (the staleness mode), a
regressed verdict in the artifact, and a shorter horizon pinned as if it were
5000 beats.
H1-H4 promoted onto the gate, and the cheap option was deliberately refused.
Measured 20.95s for the four real-soak "holds" and 0.46s for the eight mutation
"bites" — 98% of the cost is the holds. Shipping only the bites, or parking the
file in a curated-but-unreachable suite, would have satisfied R-9's letter and
bought nothing; a suite nobody runs is the non-guarantee this arc spent PR-4
closing. Those four holds are the ONLY tests on any gate that run
chat/always_on's run_continuous end-to-end, and that loop just shipped a
six-week silent divergence. 21s per push to actually run the process that broke
is the most defensible time on this gate. Removed from full_only_baseline.txt
in the same edit; the baseline shrank 746 -> 745.
Closes G-5. Proof-of-life has moved from prose to committed, pinned,
change-guarded evidence.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wcw2pnMBwyvmNyQg4uPEt4
181 lines
8.7 KiB
Python
181 lines
8.7 KiB
Python
"""PR-11 / G-5 / R-9 — the soak's evidence is committed, pinned, and still current.
|
|
|
|
The L10 always-on lane has passed a 5000-beat soak since 2026-07-19. That result
|
|
lived as **prose in a contract file** — no machine-readable artifact, no run SHA, no
|
|
rerun path, and a ``deterministic_digest`` that ``report.py`` computed and nothing
|
|
pinned. The contract's own closing line asked for the pin (*"Pin it once the lane is
|
|
trusted so a regression flips it"*) and it was never added. A recorded prose result
|
|
with no re-derivable artifact is testimony, not evidence.
|
|
|
|
This module makes it evidence, and it guards **two different failure modes** that are
|
|
easy to conflate:
|
|
|
|
**1. Regression.** The committed report's ``deterministic_digest`` is pinned. If the
|
|
per-beat shape or any verdict changes, the digest changes and this fails. The digest
|
|
deliberately excludes the machine-variant raw ``versor_condition`` float — and the
|
|
2026-07-28 re-run is the first evidence that exclusion was correct: every
|
|
*deterministic* fact reproduced exactly (vault bounded at 6, convergence at beat 1
|
|
with a 4999-beat tail, clean reboot resume with learning intact) while the float moved
|
|
from the prose's ``1.389e-07`` to ``6.177e-08``. A digest covering it would have
|
|
flipped on a machine change and taught everyone to ignore it.
|
|
|
|
**2. Staleness — the mode nothing guarded, and the one that already fired.**
|
|
R-9 ruled the cadence to be **change-triggered, not clock-triggered**: the local-first
|
|
doctrine makes "nightly" a ruling rather than a cron line, because a nightly that does
|
|
not run is green for the wrong reason. So instead of asking *"when did we last run
|
|
it?"*, this pin asks the question that actually matters — ***does this evidence still
|
|
describe the code that ships?*** — by pinning the SHA-256 of every source the soak
|
|
attests. Change one, and the pin says the evidence predates the change.
|
|
|
|
That is not hypothetical. It had **already happened, silently, for six weeks**: the
|
|
2026-07-19 soak ran with ``accrue_realized_knowledge`` absent from
|
|
``CONTINUOUS_LIFE_CONFIG_FLAGS``. R-3 added it on 2026-07-28 (PR-5), so the recorded
|
|
result stopped describing the shipping configuration — a soak result attesting a
|
|
process that no longer existed, with nothing anywhere able to notice. Had this pin
|
|
existed, PR-5 would have failed it, which is exactly the intended behaviour: *you
|
|
changed the always-on process; the soak evidence is now stale; re-run it.*
|
|
|
|
**When this fails, the fix is to re-run the soak — never to edit the constants.**
|
|
Updating a hash to match changed source, without re-running, converts this pin into a
|
|
record that says evidence exists when it does not. That is the failure this entire arc
|
|
is about, and it would be committed inside its own remedy.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import hashlib
|
|
import json
|
|
from pathlib import Path
|
|
|
|
_ROOT = Path(__file__).resolve().parents[1]
|
|
_REPORT = _ROOT / "evals" / "l10_always_on" / "results" / "report-5000-6c67e88d.json"
|
|
|
|
#: The soak's verdict digest at 5000 beats, reboot at 2500, run 2026-07-28 under the
|
|
#: post-R-3 continuous-life profile. Covers the per-beat shape + the verdicts.
|
|
PINNED_DIGEST = "f814fd97f367840b0a9d31a48cb9fb28b2ed01961606f7b1e0b4c3a3593972d6"
|
|
|
|
#: Everything whose change invalidates the evidence above. Two groups, both load-bearing:
|
|
#: the always-on process itself (what the soak measures) and the harness (what the digest
|
|
#: *means*). A harness change with an unchanged digest would be the more dangerous of the
|
|
#: two, because it looks like stability.
|
|
ATTESTED_SOURCES: dict[str, str] = {
|
|
"chat/always_on.py": "b733571e14fe540519861e9b7f24eb7be84782551dace43dab94cd96adf5d86b",
|
|
"chat/always_on_daemon.py": "d69f234fcc15568016056da05a47c91b4abe16a6d8fb87512eec02b5526bc062",
|
|
"evals/l10_always_on/runner.py": "9812cd549b41c36a8ee0477f7cb6282d5d9f110f931f3d770457a32aa54119f8",
|
|
"evals/l10_always_on/predicates.py": "ef8e44db809e8fd2270ffa0d5ff8890ee09eedfce9f95836ea08d99ff9c12e2f",
|
|
"evals/l10_always_on/report.py": "6c203af3eec6d78a1ddbfaadf3c7ad4ba18d0de0cc62a46227f210ca8b7f5277",
|
|
}
|
|
|
|
_RERUN = "PYTHONPATH=. uv run python -m evals.l10_always_on 5000 2500"
|
|
|
|
|
|
def _report() -> dict:
|
|
return json.loads(_REPORT.read_text(encoding="utf-8"))
|
|
|
|
|
|
def test_the_committed_artifact_exists() -> None:
|
|
"""No artifact, no evidence. G-5 reopens the moment this file is gone."""
|
|
assert _REPORT.exists(), (
|
|
f"the committed soak report is missing: {_REPORT.relative_to(_ROOT)}. "
|
|
f"Re-run and commit it: {_RERUN}"
|
|
)
|
|
|
|
|
|
def test_the_artifact_records_the_horizon_it_claims() -> None:
|
|
"""A 24-beat report pinned as though it were the 5000-beat one would pass every
|
|
other assertion here. The horizon *is* the claim."""
|
|
report = _report()
|
|
assert report["n_beats"] == 5000, (
|
|
f"the committed report is a {report['n_beats']}-beat run; the contract's claim "
|
|
"is the 5000-beat horizon"
|
|
)
|
|
assert report["reboot_beat"] == 2500, (
|
|
f"reboot leg at beat {report['reboot_beat']}, not 2500 — H4 proves resume "
|
|
"mid-soak, so where the reboot lands is part of the claim"
|
|
)
|
|
|
|
|
|
def test_all_four_predicates_passed() -> None:
|
|
"""H1-H4, by name. ``all_gates_pass`` alone would be satisfied by an empty
|
|
predicate list, which is the vacuity this repository keeps finding."""
|
|
report = _report()
|
|
outcomes = {p["name"]: p["passed"] for p in report["predicates"]}
|
|
assert set(outcomes) == {
|
|
"H1_closure",
|
|
"H2_bounded_idle",
|
|
"H3_convergence",
|
|
"H4_reboot_resume",
|
|
}, f"the report's predicate set is not H1-H4: {sorted(outcomes)}"
|
|
failed = sorted(name for name, passed in outcomes.items() if not passed)
|
|
assert not failed, f"the committed soak report records FAILING predicates: {failed}"
|
|
assert report["all_gates_pass"] is True
|
|
|
|
|
|
def test_the_digest_is_pinned() -> None:
|
|
"""The contract's own unmet closing instruction, finally met.
|
|
|
|
If this fails, the soak's per-beat shape or a verdict changed. That is either a
|
|
regression or a deliberate improvement; either way it is a reviewed decision, which
|
|
is the whole point of pinning it.
|
|
"""
|
|
digest = _report()["deterministic_digest"]
|
|
assert digest == PINNED_DIGEST, (
|
|
"the committed soak report's deterministic_digest does not match the pin.\n"
|
|
f" pinned: {PINNED_DIGEST}\n"
|
|
f" in report: {digest}\n"
|
|
"The per-beat shape or a verdict moved. Investigate before re-pinning."
|
|
)
|
|
|
|
|
|
def test_the_evidence_still_describes_the_code_that_ships() -> None:
|
|
"""R-9's change-triggered cadence, enforced as a pin rather than a clock.
|
|
|
|
This is the assertion that would have caught the six-week divergence described in
|
|
this module's docstring. It fails when a source the soak attests has changed since
|
|
the soak ran.
|
|
"""
|
|
drifted: list[str] = []
|
|
missing: list[str] = []
|
|
for rel, expected in sorted(ATTESTED_SOURCES.items()):
|
|
path = _ROOT / rel
|
|
if not path.exists():
|
|
missing.append(rel)
|
|
continue
|
|
actual = hashlib.sha256(path.read_bytes()).hexdigest()
|
|
if actual != expected:
|
|
drifted.append(f"{rel}\n attested {expected[:16]}…\n current {actual[:16]}…")
|
|
|
|
assert not missing, (
|
|
f"the soak attests sources that no longer exist: {missing}. The pin cannot "
|
|
"describe the current system; re-scope ATTESTED_SOURCES and re-run."
|
|
)
|
|
assert not drifted, (
|
|
"the committed soak evidence PREDATES a change to the code it attests, so it no "
|
|
"longer describes what ships:\n "
|
|
+ "\n ".join(drifted)
|
|
+ f"\n\n RE-RUN THE SOAK — do not edit the hashes:\n {_RERUN}\n"
|
|
" then commit the new report, update PINNED_DIGEST and ATTESTED_SOURCES\n"
|
|
" together, in one change. Editing a hash without re-running turns this pin\n"
|
|
" into a record asserting evidence that does not exist."
|
|
)
|
|
|
|
|
|
def test_the_attested_set_is_not_vacuous() -> None:
|
|
"""Guard the guard.
|
|
|
|
An empty or truncated ATTESTED_SOURCES would make the staleness check pass on
|
|
nothing while still reporting success — the failure mode this module exists to
|
|
close, reproduced inside it.
|
|
"""
|
|
assert len(ATTESTED_SOURCES) >= 5, (
|
|
f"only {len(ATTESTED_SOURCES)} sources attested; the staleness check is "
|
|
"narrower than the lane it guards"
|
|
)
|
|
assert "chat/always_on_daemon.py" in ATTESTED_SOURCES, (
|
|
"the daemon module carries CONTINUOUS_LIFE_CONFIG_FLAGS — the exact thing whose "
|
|
"silent change made the previous soak result stale. It cannot leave this set."
|
|
)
|
|
assert all(len(h) == 64 for h in ATTESTED_SOURCES.values()), (
|
|
"an attested hash is not a full SHA-256; a truncated hash weakens the check "
|
|
"silently"
|
|
)
|