Report the gap between a proven invariant and a deployed one #246
Evidence
Shipped in the release at 0bf2706, promoted 2026-08-27.
1 pushes receipt
- AtlantisPleb opened this issue 5d ago
-
AtlantisPleb
closed this as completed in
0aa6cde5d ago -
A Author 5d ago Landed as
0aa6cdeonmain.OpenAgents.Forge.Independencenow publishes its own distance from the revision its proofs ran against./api/statusand/statuscarryindependence.deployment:proven_ref(refs/heads/main),known, andbehind— the number of commits on the head this node serves that the running revision does not carry. The status page renders it in words, so a person reads "26 commits behind refs/heads/main; an invariant proven there is not proven here" without rehearsing a single exit surface.Why
EXIT-006did not have to move to accommodate it. The proof forbids a commit sha reaching this projection, and adding the forge's repository name was one of the six mutations it was confirmed against. That rule is untouched. A distance is a count and fits under it; the two revisions it lies between do not, and they are not published. Three further mutations were confirmed and reverted: publishing the running revision beside its distance (caught by the vocabulary assertion and bothSTATUS-001key-set assertions), hardcoding the distance to zero (caught by the seeded-repository counts and, independently, by the compiled-import-table read), and dropping the section (caught bySTATUS-001's stale-key assertion).Derived, not restated. The running revision is the one
/api/statusalready publishes for this node. The proven revision isrefs/heads/mainin the bare projection this forge serves of its own repository —RELEASE-004binds the proof matrix to the exact candidate sha and.githooks/pre-pushrefuses a push without it, which is what makes that head the newest proven revision. The distance isgit rev-list --countover objects already on disk. No outside service is asked.Its bound, named. The claim is not "how far behind
mainthis forge is": nothing on this node can see amainit declines to serve. A forge that will not serve its own repository, an empty bare projection, and a release built from a revision this forge never accepted all reportknown: falseand no distance at all — the same withholdingEXIT-005andEXIT-006already decline to detect. Being behind is also not an axis ofdegraded?, and that is deliberate and recorded: a node one commit behind is not less independent, and folding ordinary deploy lag into the independence verdict would make that verdict mean nothing on the day it mattered. The distance is published beside the verdict, as its margin of error.STATUS-001andEXIT-006record the decision, and the published key set moved with the claim asSTATUS-001requires.docs/forge-operator-independence.mdanddocs/forge-exit-rehearsals.mdrecord what it still does not do.What it does not do, and what is true right now. It reports; it does not act. Nothing raises an incident when the distance grows — a reader or a check has to look. And the live forge is still serving
46cf8a5a, 26 commits behind this commit, so it does not carry this section yet; promotion is an operator act. The first thing this section will say when it is promoted is how far behind the node that runs it was.
What happened
#187 was one cause behind six separate live failures:
mainheld theEXIT-001account export, theEXIT-004graft reconciliation, theEXIT-005chain, and theEXIT-006disclosure, and the deployed revision did not. Every invariant was green the whole time, because an invariant reads the compiled modules of the node running the test suite, not the ones running the forge.The gap was found by a person performing #180's rehearsals by hand and checking six surfaces one at a time. Nothing reported it. The release that closed #187 removes today's gap; it does not remove the next one.
What to build
Something that reports the distance between the revision the invariants were proven against and the revision the forge is serving, without anyone rehearsing to find it.
The forge hosts its own repository, so the comparison needs no outside service:
OpenAgents.BuildInfo.revision/0is the running revision, and the bare projection forOpenAgentsInc/openagents.comholds the head ofrefs/heads/mainthat the same forge serves.What makes this harder than it looks
EXIT-006is the obvious home and its proof forbids the obvious payload. The disclosure publishes counts, booleans, family names, issue numbers, and one document path, andtest/openagents/forge/independence_disclosure_test.exsturns red when a repository path, an account id, a node name, or a commit sha reaches the projection. One of the six mutations that proof was confirmed against was adding the forge's repository name. A distance is a number and fits; the two revisions it is a distance between do not.STATUS-001also treats the published key set as a decision to be asked for rather than an accident, so adding a section toindependenceis a ledger amendment, not an implementation detail.Acceptance criteria
OpenAgents.Forge.Independenceis derived.EXIT-005andEXIT-006already decline to detect.Found by: #187's close,
docs/forge-exit-rehearsals.md.