wai-quantum-service: a job sent again under its key is the same job #607

Merged
dcharlot merged 1 commit from wai/quantum-service-idempotency-2 into main 2026-11-04 10:17:26 -05:00

2026-11-03

Transaction Science
wai-quantum-service: a job sent again under its key is the same job
All checks were successful
wai-quantum WebGPU member / member · software Vulkan (linux) (pull_request) Successful in 2m22s
wai-quantum views in agent hosts / views · a scripted host (pull_request) Successful in 4m2s
wai-quantum WebGPU member / shader checks · browser build · wasip2 inertness · MSRV (pull_request) Successful in 4m20s
wai-web reach builds / wai-web reach builds · the package of record, every output as recorded (pull_request) Successful in 2m36s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 5m47s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (pull_request) Successful in 21m18s
wai-web reach builds / wai-web reach builds · this tree's wai-web, every rung on its engine line (pull_request) Successful in 6m41s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 15m13s
wai-quantum tensor-engine member / member · tensor engine, the kernel toolchain's simulator (linux) (pull_request) Successful in 14m43s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (pull_request) Successful in 1m13s
WAI Studio / Studio in WebKit · linux (pull_request) Successful in 14m19s
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Successful in 16s
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Successful in 21s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 53s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 2m56s
WAI examples / WAI examples · android-app · linux-arm64 (pull_request) Successful in 8m7s
standards workspaces build + test / joule-code-rs (joule-code/joule-code-rs, joule-code-rs, linux-arm64, true) (pull_request) Successful in 8m30s
wai-quantum HIP member / member · HIP absent (linux-arm64) (pull_request) Successful in 1m29s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 18m57s
wai-quantum npu-cores member / member · npu-cores absent (linux-arm64) (pull_request) Successful in 29s
wai-quantum pulse and dynamics / the same bits · linux-arm64 (pull_request) Successful in 2m13s
WAI conformance / each feature of the independent verifiers' steps compiles alone (pull_request) Successful in 18m46s
wai-quantum tensor-engine member / member · tensor engine absent (linux-arm64) (pull_request) Successful in 35s
wai-quantum extension points / the registry and the example · linux-arm64 (pull_request) Successful in 2m27s
wai-quantum variational and algorithm library / parameters, gradients, optimisers, VQE, QAOA and builders · linux-arm64, release (pull_request) Successful in 2m38s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (pull_request) Successful in 2m36s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 29m24s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 1h3m13s
wai-quantum WebGPU member / member · DX12 and Vulkan (cbio-windows) (pull_request) Successful in 12m51s
wai-quantum studio and desktop / desktop app · windows (pull_request) Successful in 10m40s
A client that lost an answer could not ask again safely: a second
submission was a second job, counted against its limits. And the three MCP
tools that run declared idempotentHint: true, which was not so.

POST /v1/jobs and POST /v1/run take an Idempotency-Key, and the three tools
an idempotency_key. Sent again with the same key and request, a job is
answered with the key's job, before any limit, counting as no submission;
with another request the key is refused (J034), naming no job. A key names
its job while the job is kept, but for a job the service interrupted, which
the key runs again. Records keep the key's digest with the client's name;
one lock makes concurrent sends of one key one job. The tools' hint is now
false: a call without a key is a new job. Calls without a key are not
matched by their request, since a client is an address and that would give
one person's job id to anyone at the address sending the same program.

The command line and the Python client send each job under a fresh key, and
send it again under it where no answer came back, only to a service that
says it keeps keys. The Python client's wait also ends on an interrupted
job, where it ran to its deadline before.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-03 17:46:09 -05:00