agent-evidence-vectors v0.17.9

Independent runs

One row per run of a corpus in this repository by an implementation that this repository did not write, posted publicly with a record a reader can fetch.

This file exists because the only claim this suite makes that matters is that somebody else can run it and get the same answers. Five rails written by one author catch each other's transcription errors and share one reading of the specification; they cannot catch a misreading, because they all inherit it. An outside run can.

What a row has to carry

Blind and directed are different evidence and are never added together. A blind run says something about whether the specification text is determinate from a cold start. A directed run, where the author read a specification diff or a changelog before implementing, says the corrected text is implementable, which is a weaker and still useful thing. This file keeps the label beside the figure for that reason.

A row is licensed by a posting, not by a conversation. If a run was not posted with a record, it does not get a row, however good the figure was.

The runs

Rul1an, Rul1an/aee-checker, suiteRevision 28 of the AEE corpus

Reporter Rul1an
Implementation Rul1an/aee-checker, an independent Rust verifier with its own I-JSON parser, RFC 8785 serializer, RFC 6962 Merkle root, run-binding derivation and Ed25519 tier
Posted at Rul1an/aee-checker#21, opened and merged 2026-09-06
Corpus vectors/, at the corpus commit that pull request pins
suiteRevision 28, which the checker's own index labels revision 27: it counts one run per corpus it read, and it read suiteRevision 25 twice
Result 61/61 accepts, 209/209 rejects, 2/2 indeterminate, zero mismatches
Reason parity 80/209, which its author reports and explicitly does not promote
Label, by its author directed

What the run is evidence of, in his words:

the build under test predates every vector in this corpus and every word of the spec delta, and its source was not modified, so no vector-driven fix is possible in either direction.

And what it is not evidence of, also his:

This is not a determinacy result. The figure that bears on whether the text is determinate from a cold start is still the blind 179/232

Both quotations are transcribed with the posting's markdown emphasis removed and nothing else changed.

Three things in that posting belong in this file rather than in a summary of it. The first is a disclosure its author made before any figure: an unregistered exploratory pass had run earlier the same day and a comment describing the specification change had been read beforehand, so the run is labelled directed under his own protocol rather than presented as blind. The second is scope: the corpus was pinned to a vendored specification 4393 bytes behind the upstream head of the review thread, and the rule those bytes add is exercised by no vector in the corpus, so the parity figure is not evidence about that rule and his record says so. The third is that his own reproduction recipe and one provenance note were found to be wrong in the course of the run and were corrected in it, which is the kind of finding an outside run produces and an in-house one does not.

His summary of what the frozen build did across the advance:

The corpus advanced 282 commits and 250 → 272 vectors and the frozen build agreed on all of them.

The 0.12.1 harness fix and this row

Releases 0.6.0 to 0.12.0 printed the reference rail's pass when the verifier named with --verifier never ran, which SECURITY.md records. This row is not touched by it: the run called aee-checker on the corpus directly, through its own conformance workflow, and never went through this package's --verifier path, so the fallback could not have supplied its figure. A run that does go through the harness shows it in its report: rail reads external and verifier.vectorsExecuted equals the vector count.

MoltyCel, MoltyCel/moltrust-api, the a2a-jcs-v01 corpus

This corpus is the A2A Agent Card canonicalisation set, conformance-vectors/a2a-jcs-v01 in a2aproject/a2a-tck, written by this repository's maintainer. It is carried here byte for byte as vectors-a2a-jcs-v01/, locked to the commit and digest below, so it replays through the harness and the GitHub Action with --corpus vectors-a2a-jcs-v01. It has no suiteRevision; the row pins it by commit and corpus digest instead, and it is not a row of the ledger below, which counts AEE revisions only.

Reporter MoltyCel
Implementation MoltyCel/moltrust-api at commit c81b57165d6d62bda1548b55db96fcf75d367db4, with lib/agent_card_verify.py at blob dc908ba47ed9622263484a6fb6f8f2597beddaf8 and app/signature.py at blob f7193f49c09bac55d9a9882d4518820fa2e5b05e
Posted at a2aproject/A2A#1882, comment of 2026-10-01, and the repository's own CI, run 36871040292, on a merge ref that includes that commit, under Python 3.9 and 3.12
Corpus a2a-jcs-v01 at a2aproject/a2a-tck commit 97b007237ee4c3b802ed563829e3937a5529244e, corpus digest 29b3f2c5a9c2e6b07dc7e925b13c81563e2efd407a62ce05df513fca04e9361c
Raw canonicaliser, app/signature.py canonicalize 53/53, target rfc8785
Card signing, app/signature.py sign_agent_card 57/57, target card-signing-input
Card verify, lib/agent_card_verify.py verify_agent_card 57/57, target card-signing-input, refusal class CardVerificationError
Label, by its author none given

Each path is listed with its own refusal class because a score means nothing without the class the runner counted as a refusal. The author said so, and corrected his own earlier figure on exactly that ground:

That number depended on a setting in the runner I used.

The earlier runner counted any exception on a reject vector as a refusal. Under CardVerificationError the verify path then scored 52/57; under the runner's default of ValueError it scored 54/57. The five vectors that separate them are the lone-surrogate rejects A3-REJECT-011, A3-REJECT-012 and A4-REJECT-013 to 015, where the path refused the input but raised UnicodeEncodeError. Commit c81b571 makes those raise CardVerificationError, and the class now derives from ValueError.

The CI run above declared both CardVerificationError and builtins:ValueError as refusals for the verify path. The figure in the table is the narrower one: the same scorer at the same corpus commit, with CardVerificationError as the only refusal, gives 57/57 on the verify path over that commit's code, and 52/57 over lib/agent_card_verify.py from the parent commit a708e98. The verify path's builtins:ValueError declaration was removed in MoltyCel/moltrust-api#526, so CardVerificationError is its only declared refusal. Because the runner matches a refusal class exactly, the raw and signing paths declare both ValueError (the three number rejects) and UnicodeEncodeError (the five lone-surrogate rejects) as of 1e4c4b7c. The author reports the four results unchanged on both corpus states, 97b0072 and 7a3197d: raw 53/53, signing 57/57, verify 57/57 and negative control 53/57 (A2A#1882).

The author gave the run no blind or directed label, and this file does not supply one. It is not a cold-start result: the fix it measures was made after the author saw which vectors failed, and the scoring workflow was contributed to his repository by this repository's maintainer. What it shows is that the corrected text is implementable on three paths of one codebase, each scored against the function it provides.

The ledger this file is not

docs/INDEPENDENT-RUNS.json is the gated record behind the independence column in README.md and docs/IMPLEMENTATION-REPORT.md: scripts/independent-runs-gate.py derives the not-run set from it and refuses prose that disagrees. This file is the reader-facing scoreboard, one row per posting, and it adds no figure that its posting does not carry.

That ledger also carries an attempts array, and it is the half of the record nothing used to hold. A row in runs is what licenses a figure, and every row there carries a figures array, so a dispatch that was authorised, ran and produced no score had no shape in the file and was invisible to the gate. Two had already happened by the time the array was added, and the count is written that way on purpose: the array is where the current number lives, and a total restated here would rot the next time one is dispatched. An attempt records the corpus commit, the checker ref, the authorization packet, the dispatch and where its artifacts survive, with figures null beside a note saying why there is none; it carries no suiteRevision, because the not-run set is computed over runs and a revision there would let a dispatch with no figure license the one it has none of. The gate reads the array, holds it to that shape, and refuses a sentence in either publishing document that names an attempt's dispatch and a figure together.

Reporting your own

The form is .github/ISSUE_TEMPLATE/independent-run.yml. Nothing in it asks you to agree with the corpus. If your verifier answered differently on a vector, that is the row worth having, and CONTRIBUTING.md says what happens to it: it becomes a disposition row under a permanent identifier, in your frame, whichever way it is resolved.