Integrity — Governed Decision Path
How we govern our own automated agents.
Our platform's own agents make tool calls — starting invocations, holding credit, dispatching work. Those calls are watched by an internal control plane that projects a live event ledger through the same abstract model our formal specs are checked against, and flags the runtime state that model says should be unreachable. This page is about that system, not about betting picks, odds, or grading — see /accountability for that.
Every claim below links to something you can independently check — a live receipt route, a published public key, or a document in this public repository. Nothing here is asserted without a way to verify it yourself.
What we govern
Detection
A live projection, watched
Every internal tool call folds the recent event ledger into an abstract state (claim phase, exposure phase, pending-attempt count) — the same shape our TLA+ specs reason over. Two forbidden states are watched for: two-or-more concurrently pending attempts on one invocation, and a rejected fingerprint with nothing binding it.
See the architecture pipelinePosture
SHADOW is the only default
Detecting a forbidden state does not block anything by default. SHADOW mode always admits and only ever writes an evidence row. An enforcement mode exists, but it is reachable only from an explicitly lab-gated code path — never from a production route, cron, or worker.
See the enforcement postureEvidence
Signed, publicly verifiable receipts
When a gated tool call is refused (lab-only today), it produces a signed receipt: what was asked, why it was refused, and an ed25519 signature over a canonical payload. Anyone can fetch our published public key and verify a receipt themselves — no shared secret required.
View the public keyringShadow evidence & active certificate
We do not publish a live shadow-would-refuse counter on this page — a number here with no way for an outside reader to recompute it would just be a claim, not evidence. Instead, the honest, independently-reproducible numbers live in one place:
- Real TLC model-checking receipts, real state/depth counts — §3, "What is PROVED".
- Whether any certificate version is currently active (today: no — activation is a human-only CLI action, never automated) — §10, "Active certificate".
- Seven concrete steps to verify all of this yourself, not just trust it — §11, "Attack checklist for outsiders".
See it run
90-second walkthrough
Force a REFUSE, verify the signature
A scripted, end-to-end walkthrough: trigger a real violation, get a signed REFUSE receipt, open it over HTTP, fetch the public keyring, and verify the signature — all runnable from a clean checkout.
Read the demo scriptFull record
The single honest status document
Architecture, what is actually proved (with real receipt numbers), enforcement posture, a full SHA-traceable receipts index, and every explicit non-claim — kept current against main, not a point-in-time snapshot.
Read SRQC_STATUS.mdTwo different things called "integrity"
This page is about one of them. Keeping them separate matters — they share a value but not a subject, and merging them would let a strong claim about one imply an unearned claim about the other.
This page
Agent control-plane governance
How our own tool-calling agents are governed: admission bookkeeping, the SHADOW-by-default posture, and signed receipts anyone can verify against a published key. Subject: our software's behavior.
Elsewhere
Whether a published number is substantiated
Whether a rate, edge, or record we display is backed by coverage, a lower bound, CLV, and walk-forward provenance — and is withheld when it is not. Subject: the claims we make about picks.
A signed receipt proves an agent decision happened as recorded. It says nothing about whether a betting claim is statistically supported — that is the Glass Ledger's job, and it stays sealed until the evidence clears its own bar.
Seven ways a prediction record misleads
Every one of these is available to anyone publishing predictions, ourselves included, and most of them happen without anyone deciding to mislead — which is why each needs a structural guard rather than good intentions. We name no companies: these are mechanisms, and the useful question is not who does them but where each one is blocked. Each row links to somewhere you can check ours.
A record that can be edited after the fact
How it goes wrong
If a prediction is stored in a mutable row, a losing call can be softened, requalified, or quietly removed once the result is known, and no reader can tell that it happened. The published history then describes the outcome rather than the forecast — and it will look excellent, because anything that did not work has been edited out.What we do instead
Check a record yourself
Every book-priced pick is written before kickoff into a hash-chained record where each entry commits to the one before it. Changing an old entry breaks the chain for everything after it, so tampering is detectable by a stranger rather than only by us.Choosing which results count once they are known
How it goes wrong
A published history can be assembled by keeping the sports, seasons, bet types, or date ranges that worked and describing the rest as experimental, off-model, or not part of the official record. Nothing is fabricated at any step, and the result is still a number that cannot be reproduced from the full set of forecasts.What we do instead
See what is and is not judged
The scope of what counts is fixed in advance, and every settled pick inside that scope is graded — including pushes and voids, which are excluded from the calibration set as their own category rather than folded into losses or wins.Presenting confidence as though it were edge
How it goes wrong
A model's confidence score says how sure the model is. Whether a wager is worth making depends on that probability compared against the price, after the bookmaker's margin is removed. Ranking by confidence produces a board that looks decisive and systematically favours heavy favourites, where confidence is high and the price has already absorbed it.What we do instead
See the threshold and the gap
Nothing fires on confidence. The decision is made on the gap between our lower-bound probability and the de-vigged price from both sides of that pick's own market, and the gap is shown with the threshold it had to clear.Reporting a rate before the sample can support one
How it goes wrong
A rate computed from a few dozen settled results has an interval wide enough to contain both a strong edge and a losing one. Published as a single number with no interval, it reads as a finding. Published in a period that started at a convenient point, it reads as a trend.What we do instead
See the not-judged state
A category with too little settled history is reported as not judged, in those words, and no rate is shown for it at all. That is a different answer from a refusal, and the two are never collapsed into one.Grading against a price nobody could have taken
How it goes wrong
A result can be graded against the best number seen anywhere, or the number after a favourable move, rather than the one quoted when the call was published. Every individual grade looks defensible; the aggregate describes a bettor who does not exist.What we do instead
See which prices are refused
A pick is evaluated against a captured quote for its own market, timestamped, and refused if that quote is stale or if the handicap has moved off the one the pick was taken at. The price shown is the one we evaluated, not the best one available.Letting a call vanish instead of resolving it
How it goes wrong
When a game is postponed, an input is missing, or a pipeline fails, the affected call can simply stop appearing. A reader cannot distinguish a forecast that was considered and declined from one that quietly disappeared, and only one of those reflects a judgement.What we do instead
See the named exclusions
A candidate that cannot be evaluated is shown as not evaluated, with the specific input that was missing named — a stale quote, an absent price, a game already under way. Rows too incomplete to describe at all are counted and reported rather than dropped.Making the claim impossible to check
How it goes wrong
A number with no method, no scope, no interval, and no route to the underlying records cannot be wrong, because there is nothing to test it against. It functions as reassurance rather than evidence, and the absence of a way to check it is the load-bearing part.What we do instead
See the sealed record
The performance surface stays sealed until the evidence clears its own stated bar, and the bar is published rather than described. Where we have no substantiated number, we say so instead of showing a softer one.
None of the above is a statement about how well the predictions perform. It is a statement about what the reporting makes checkable, which is the only one of the two we can substantiate before there is a settled record.
What we do not claim
- Not a parameterized (∀N) proof. Every model-checking result behind this page is a fixed-constant, finite-cutoff check, not a machine-checked universal statement.
- Not a production enforce-by-default posture. SHADOW is the only default anywhere this admission check runs. Enforcement is reachable only from an explicitly lab-gated path, confirmed by direct code search, not assertion.
- Not a claim about bet-settlement correctness or any user-facing betting logic. This entire surface is about internal AI/agent tool-call admission bookkeeping — nothing about odds, grading, or picks.
- Not a SOC 2, ISO 27001, or EU AI Act certification. Related internal alignment work exists and is documented separately, but nothing on this page is a certification claim.
- Not autonomous. Certificate-version activation is a human-only, manually-run action — never triggered by CI, a cron job, or any automated caller.