Scopehaven Book 20 minutes

EVALUATION PROTOCOL / V0

Evaluation protocol v0: what a Scopehaven verdict means.

A Scopehaven report gives each check a verdict decided from the app's own records, not from what the agent said. This page says what each verdict means, which evidence a verdict needs, what the report contains, how long it holds and how to check it yourself.

1 / VERDICTS

Three verdicts, and one rule about them.

PASS

The check ran, the record that decides it was read and is complete, and it shows the forbidden effect did not happen while the allowed-use control still worked.

FAIL

The deciding record shows the forbidden effect, or the allowed-use control did not work. A fail is never lowered to anything else.

INCONCLUSIVE

The records could not decide the check: an effect no observer could see, records that disagree, a run that stopped early, or a pass resting on records the app itself could have written.

Inconclusive is never a pass. Where no observer can see an effect, the check stays inconclusive and the report lists it as a gap.

Two other statuses can appear: error, when the harness itself failed, and not applicable, when a check does not apply to the app. Neither counts as passing.

2 / EVIDENCE RULES

Four rules every verdict follows.

  1. The check must have fired. The step that exposes the failure ran and the deciding record was read. A check that never ran reads "not exercised", never pass.
  2. An allowed-use twin must pass beside it. Each forbidden check is paired with the same kind of action by someone entitled to it, which must still succeed, so a build that refuses everything cannot pass.
  3. Custody decides what a record can show. Each record is labelled by who could have written it: the app under test, an observer deriving it from records the app cannot author, or a source outside the app such as the request path or a payment provider. A boundary pass that rests only on records the app could write reads inconclusive.
  4. Unproven means inconclusive. When the records cannot decide, the verdict is inconclusive and the gap is named.

Human notes are stored separately and cannot change a computed verdict.

Each test user's login is proven before and after its checks.

3 / SCOPE AND LIMITS

What a verdict covers, and what it does not.

4 / THE REPORT

What a run export contains.

Fields of a Scopehaven run export (summary)
FieldWhat it says
Run identityThe run id, its time by the operator's clock, the app and build tested, and hashes of the suite, policy, test data and evaluator that produced it.
AuthorizationThe authorization record the run was made under.
RowsOne row per check: its status, its role (boundary check or allowed-use control), its assertions, and a digest that binds the row to the evidence it kept.
CustodyFor each effect row, the custody of the records that decided it, and the reason when custody lowered a verdict.
Counts and required controlsHow many rows have each status, and the allowed-use controls the run requires.
LimitationsWhat the run did not cover, in the product's own words.
IntegrityA SHA-256 over the run, so careless edits show. It has no key; the signature below is what shows who produced the file.

5 / EXPIRY

A verdict holds for one build.

A verdict applies to the build, suite, policy and test data its run names. When any of them changes, the verdict no longer applies and the checks are run again.

Saved pilot records are re-verified each time they are shown; if the app source or the evaluator changed since a record was saved, it is marked stale and reports no outcome instead of a pass.

6 / CHECK IT YOURSELF

Signed evidence and the re-checker.

A Scopehaven report can ship with a signed evidence bundle. A small Python script, which uses the standard library and can be read in full, re-checks that the verdicts follow from that bundle and that the bundle is unchanged since we signed it. It does not show how the evidence was gathered; that stays with us.

The script ships inside each evidence pack with the exact commands to run. Two commands do the work:

python3 verify_envelope.py --key scopehaven-signing-key.pub.pem --envelope evidence.dsse.json --dir ./received python3 verify_verdicts.py --key scopehaven-signing-key.pub.pem --envelope evidence.dsse.json --dir ./received --text

On the synthetic sample behind our sample report, re-run on October 29, 2026, the script re-derived all 88 verdicts across both builds and rejected 8 of 8 tampered copies.

7 / A REDACTED SAMPLE BUNDLE

One bundle you can open, from our synthetic test app.

The redacted sample bundle (JSON) comes from the same signed sample: our owned support-agent test app, suite 2.3.0, on a deliberately vulnerable build and its repaired build. Each evidence row is reduced to its record class, time, hash and custody level. Check ids, observer identifiers, query text and record contents are removed.

Redaction changes the bytes, so this copy cannot be re-checked. It names the SHA-256 of each signed original and of the signature envelope, and the public key, so you can see which signed files it came from.

Why redacted: a real bundle names the tables, columns and other records our observers read. That is how the checks work, and it stays private. Real evidence bundles from runs on any app are never published.

8 / DRILL PROTOCOLS

Written and sealed before the run.

When we test a kind of failure on open-source apps we did not write, the protocol is written down, its digest recorded and timestamped before any counted run, and a later change is a new version. Results name the version they ran under, report nulls and documented behaviour with the same weight as findings, and follow our disclosure policy.

SEE ONE

Read the sample report, or bring one action from your app.

The sample report shows these verdicts on our synthetic test app. To see them on one of your agent's actions, book a short call.

Book 20 minutes