open-standards/joulespec/conformance/v1/evaluation
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Transaction Science 06f00e619a
All checks were successful
standards workspaces build + test / which workspaces this change touches (pull_request) Successful in 9s
standards workspaces build + test / arl-rs (arl/arl-rs, arl-rs, linux) (pull_request) Successful in 30s
standards workspaces build + test / joulespec-proofs (joulespec/joulespec-rs, joulespec-proofs, true, macos) (pull_request) Successful in 1m0s
standards workspaces build + test / eoc-rs (eoc/eoc-rs, -p eoc-meter --features cuda, eoc-rs, linux) (pull_request) Successful in 1m3s
standards workspaces build + test / joulehook-rs (joulehook/joulehook-rs, joulehook-rs, linux) (pull_request) Successful in 31s
standards workspaces build + test / joule-ui-rs (joule-ui/joule-ui-rs, joule-ui-rs, linux) (pull_request) Successful in 1m18s
standards workspaces build + test / pool-rs (pool/pool-rs, pool-rs, linux) (pull_request) Successful in 29s
standards workspaces build + test / jcp-rs (jcp-conformance, jcp/jcp-rs, -p jcp-energy --features nvml, jcp-rs, linux) (pull_request) Successful in 1m48s
standards workspaces build + test / proof-rs (proof-conformance, proof/proof-rs, proof-rs, linux, true) (pull_request) Successful in 47s
standards workspaces build + test / sense-rs (sense/sense-rs, sense-rs, linux) (pull_request) Successful in 31s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (pull_request) Successful in 2m45s
standards workspaces build + test / joulespec-rs (true, joulespec/joulespec-rs, true, joulespec-rs, linux) (pull_request) Successful in 1m25s
standards workspaces build + test / jouledesk-rs (jouledesk/jouledesk-rs, jouledesk-rs, macos) (pull_request) Successful in 4m24s
standards workspaces build + test / sandbox-rs (sandbox-conformance, sandbox/sandbox-rs, -p sandbox-tee --features amd-kds,intel-pcs, sandbox-rs, linux) (pull_request) Successful in 3m28s
standards workspaces build + test / smart-byte-rs (smart-byte/smart-byte-rs, smart-byte-rs, linux) (pull_request) Successful in 4m17s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 10m44s
standards workspaces build + test / jouleclaw-rs (-nodebug, jouleclaw/jouleclaw-rs, -p jouleclaw-energy --features rapl,nvml, jouleclaw-rs, linux-arm64, -C target-feature=+fp16) (pull_request) Successful in 4m13s
standards workspaces build + test / aac-rs (aac-conformance, aac/aac-rs, aac-rs, linux-arm64) (pull_request) Successful in 3m53s
standards workspaces build + test / joulecontract-rs (joulecontract/joulecontract-rs, joulecontract-rs, linux-arm64, true) (pull_request) Successful in 1m9s
standards workspaces build + test / map-rs (map-conformance, map/map-rs, map-rs, linux-arm64) (pull_request) Successful in 1m25s
standards workspaces build + test / mesh-rs (mesh/mesh-rs, -p mesh-engine-gguf -p mesh-openai --features mesh-engine-gguf/gguf,mesh-openai/server, mesh-rs, linux-arm64) (pull_request) Successful in 1m9s
standards workspaces build + test / joule-code-rs (joule-code/joule-code-rs, joule-code-rs, linux-arm64, true) (pull_request) Successful in 7m10s
standards workspaces build + test / openpay (openpay, openpay, linux-arm64) (pull_request) Successful in 3m48s
joulespec: an evaluation corpus, and a measured limit on what a second solver buys
Two things asked for: a benchmark corpus, and a second verification method.

## The corpus

The wire vectors certify that an implementation round-trips a receipt's
bytes. They say nothing about whether it reached the right verdict, because
they carry one scenario. `conformance/v1/evaluation/` is the other half: ten
cases, each a complete set of evaluation inputs plus the verdict §3 requires,
chosen so a plausible but generous implementation disagrees — a mean where a
minimum is required, an unevidenced obligation skipped rather than emptying
the grade, `E3` on a killed counter-artifact whose anchor is unstated, `E4`
because a prover succeeded, a witness for a clause's previous wording
discarded instead of flagged, a `reviewed` label taken at face value when the
reviewer is the clause's own author.

Each case states its direction. Most catch over-grading; one catches
under-grading, and that one is load-bearing: an implementation that graded
nothing at all would pass every over-grading case, so a corpus with one
direction rewards a rule that refuses everything. A test asserts the shape of
the set rather than trusting it was built as described.

The expectations are written by hand from §3 and are never read back out of
this implementation — a corpus whose expectations are whatever the code
produced certifies agreement with itself. That earned its keep immediately:
seven of the ten were wrong on first authoring, all the same mistake and mine
rather than the evaluator's. They assumed the attestation axis came from who
signed a witness, where §2.8 computes it from who authored the work; with no
work declared it is absent. The fix was not to copy the observed value in,
which would have buried the misunderstanding, but to declare work in every
case so the axis is exercised at all.

## What a second method bought, and what it did not

The quotient-bound statement abandoned in the previous commit was retried
under a solver reasoning with a bitvector theory rather than bit-blasting to
a propositional problem. It settled four of the statement's conditions in
about eight seconds — where the default engine had shown no per-property
progress in twenty-four minutes — and then spent over fifty minutes on the
fifth.

So the method moved the wall without removing it, and §8 now says that
instead of implying a solver choice would fix it. The harness is kept as the
reproducible record of a negative result, behind a `cfg` nobody sets so an
ordinary run does not hang on it.

A second finding from the same runs, recorded in `conformance/v1/README.md`: a
wall-clock wrapper around a prover is not enough. Both abandoned runs outlived
the `timeout` meant to bound them, because the prover is a driver that spawns
the checker and a timeout reaches only the driver. The producer kills the
process group, which is why its budget works where the shell's did not — the
design was right for a reason that has now been observed twice.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-11-01 21:56:22 -05:00
..
01-a-mean-conceals-the-weakest-obligation joulespec: an evaluation corpus, and a measured limit on what a second solver buys 2026-11-01 21:56:22 -05:00
02-an-unevidenced-obligation-empties-the-grade joulespec: an evaluation corpus, and a measured limit on what a second solver buys 2026-11-01 21:56:22 -05:00
03-an-unwitnessed-non-goal-does-not-cap joulespec: an evaluation corpus, and a measured limit on what a second solver buys 2026-11-01 21:56:22 -05:00
04-evidence-for-a-non-goal-is-a-flag joulespec: an evaluation corpus, and a measured limit on what a second solver buys 2026-11-01 21:56:22 -05:00
05-an-unstated-anchor-caps-at-exercised joulespec: an evaluation corpus, and a measured limit on what a second solver buys 2026-11-01 21:56:22 -05:00
06-a-declared-formalization-caps-at-exercised joulespec: an evaluation corpus, and a measured limit on what a second solver buys 2026-11-01 21:56:22 -05:00
07-an-unchecked-vacuity-caps-at-exercised joulespec: an evaluation corpus, and a measured limit on what a second solver buys 2026-11-01 21:56:22 -05:00
08-a-superseded-state-makes-a-witness-stale joulespec: an evaluation corpus, and a measured limit on what a second solver buys 2026-11-01 21:56:22 -05:00
09-a-witness-for-a-reworded-clause-is-a-flag joulespec: an evaluation corpus, and a measured limit on what a second solver buys 2026-11-01 21:56:22 -05:00
10-a-self-review-is-the-citation-again joulespec: an evaluation corpus, and a measured limit on what a second solver buys 2026-11-01 21:56:22 -05:00
README.md joulespec: an evaluation corpus, and a measured limit on what a second solver buys 2026-11-01 21:56:22 -05:00

The evaluation corpus

Cases a too-generous implementation passes incorrectly.

The wire vectors in ../vectors/ certify that an implementation round-trips a receipt's bytes. They say nothing about whether it reaches the right verdict, because they carry one scenario. This corpus is the other half.

Each case directory holds five files. Read the first four, evaluate, and compare against the fifth:

File What it is
spec.json the signed specification
state.json the artifact state the witnesses were observed at
witnesses.json the signed witnesses
work.json the declared work, which is what the attestation axis is computed from
expect.json the verdict §3 requires, with the trap it sets

expect.json carries its own intent and trap in prose, so a failing case says what it was for rather than only which field differed.

Why the cases are shaped the way they are

Every case states a direction. Most are over-grading: an implementation that reports conformance never established, which is the failure this standard exists to stop. At least one is under-grading, because an implementation that graded nothing at all would pass every over-grading case — a corpus with only one direction rewards a rule that refuses everything. A test asserts that both directions are present, that every over-grading case's correct verdict falls short of the bar or is blocked by a flag, and that every under-grading case's correct verdict reaches it.

The traps are the ones that are reachable by accident rather than by carelessness:

  • a mean instead of a minimum, which lets well-evidenced obligations conceal one nobody looked at;
  • skipping an unevidenced obligation rather than letting its absence empty the grade — and reporting E0 there, which would claim a citation nobody made;
  • treating an unwitnessed non-goal as an owed obligation with no evidence, which is the under-grading case;
  • grading a witnessed non-goal's evidence, or discarding it quietly, instead of raising the flag that blocks conformance;
  • awarding E3 on a killed counter-artifact alone, where the check's anchor is unstated;
  • awarding E4 because a prover succeeded, where the formalization is the prover's own word or its vacuity was never checked — two independent ways a proof establishes nothing about a clause;
  • counting a witness bound to a superseded state, which an empty footprint makes stale on any change at all;
  • silently discarding a witness whose obligation address is a clause's previous wording, which is exactly how drift stops being visible;
  • reading reviewed off the evidence label when the reviewer is the clause's own author.

Where the expected verdicts come from

They are written by hand from §3 of the specification. They are not read back out of this implementation: a corpus whose expectations are whatever the code produced would certify agreement with itself and nothing else.

That distinction earned its keep while this corpus was being written. Seven of the ten expectations were wrong on first authoring — all the same mistake, and the author's rather than the evaluator's. They assumed the attestation axis was computed from who signed a witness, when §2.8 computes it from who authored the work; with no work declared, attestation is absent. The fix was not to copy the observed value into the expectation, which would have hidden the misunderstanding, but to declare work in every case so that the axis is actually exercised.

Regenerating

JOULESPEC_GEN_EVALUATION=1 cargo test -p joulespec-core --test evaluation

That republishes the input files and the expectations as the test states them. Without the variable the test reads the published expectation back and asserts it still agrees with the test's own, so an expectation edited in one place and not the other fails rather than drifting.