A job's receipt showed that a result is the one its signer sealed. A verdict (wai.quantum.verdict/1) already said how far the engine checked a circuit job's intent, as a level. It now names what did the checking, a job on a provider's device and a qudit job carry one, and a verifier works a sealed verdict out again. The contract is quantum-providers §8.9. The layer. Every check, and the verdict, names its layer and that layer's limits: exact_simulation, stabilizer, pass_equivalence, reading, certificate, random_states, agreement, samples, physical_consistency or unchecked (verdict::LAYERS). The verdict's is the weakest of its checks', and unchecked where an intent was not decided or none was given. The result's accuracy class is beside it under executed.accuracy. More intents. expectation (an observable's exact value on the program's state), and four of the answer the job returned: outcomes, conserves (weight or parity), counts (the job's own counts held to a stated distribution, by a test at a level or within a distance) and agrees (those counts held to the exact distribution the engine computes of the program). outcomes and conserves are decided by the program's exact distribution where the run is the program's own, and on the counts otherwise. More jobs. provider::read reads an intent before the job is sent and refuses a sampled one there (J020); provider::seal seals the verdict with the device's answer. A qudit job takes an intent of its counts. An energy-landscape job's own sealed word reads as a verdict (verdict::of_job, which panicked on one: its `verdict` is a word, not an object). A job whose form holds no intent, or one another host sealed, is signed off (engine::signoff, wai.quantum.signoff/1, schemas/signoff.v1.json): a job about that job, sealing its digest, the intent and the verdict together. Verifying. job::answer_of routes a job that seals a verdict to job::rerun, and job::verdict and verdict_of_text work it out again too (verdict::recheck, within the state vector of 22 qubits): `answer` gives the level, holds, the layer and its limits, the accuracy class, and `again`: reproduced, partly, host_statement or differs. A verdict that is not of its own form, names another method or class than the result, another job than a sign-off holds, or a check decided here otherwise, differs, and the job is not valid though its seal holds. A sampled check's samples and a proof another engine version reached are the host's statement, not a difference. A verdict sealed before layers were named is held to its level and its checks. A job that asks for no verdict gives the bytes it gave. Conformance. quantum-conformance/verdicts/: 21 sealed jobs and what a verifier must say of each, written by hand from §8.9: verdicts that hold, one that fails, ones no layer decided, ones past what a verifier works out again, five a host sealed that its job does not bear out, one changed after its seal, a provider's, a qudit job's, and sign-offs of a wasmQ job and an energy-landscape job. tests/verdict_conformance.rs holds the kept jobs to the manifest (natively and under wasm32-wasip2) and makes each again with this engine. quantum-conformance/intents/ gains twelve cases, and its harness holds each verdict to its layer, every kind of intent and every layer a circuit job's verdict can stand on. wai-quantum-verdict.yml runs the new set and requires the new tests by name. What moves with it: the answer set's stored seal is over a verdict, so it is written again (WAI_ANSWER_BUNDLE_WRITE=1); wai-web's pinned course check holds each case's verdict, so its digest moves, and the page gains QuantumEngine.signoff and a wasm test (wai-web-wasm.yml counts 24); schema::FILES gains signoff.v1.json (acknowledged in the changes entry); the qudit referee reads `intent` as a member of a request. Co-Authored-By: Claude Fable 5.2 <[email protected]>
13 lines
647 B
Text
13 lines
647 B
Text
root = Answer([bell, counts, check, seal])
|
|
```qasm bell
|
|
OPENQASM 3.0;
|
|
qubit[2] q;
|
|
bit[2] c;
|
|
h q[0];
|
|
cx q[0], q[1];
|
|
c = measure q;
|
|
```
|
|
counts = Histogram(@Sample(bell, 1000))
|
|
check = Verdict(@Check(bell, {"00": 0.5, "11": 0.5}))
|
|
seal = Receipt(@Seal([bell, counts, check]))
|
|
]]>wai:receipt {"statement":"seal","receipt":{"alg":"ed25519","canon":"rfc8785","key":"ed4928c628d1c2c6eae90338905995612959273a5c63f93636c14614ac8737d1","digest":"2a3e0f1ba9d186498e3d1da007f5b867ad34d5bc173c708ef8dae9cda618e52a","signature":"b0d349886218eb60833930c63cc30e68987d9a56622c0f90dc5c688be6a29f58fc4eb837eb059cc1e18bf70a5ed1d7a6b3f104a98547510b4beb50ab01d1a50a"}}
|