wai-quantum-service: a job sent again under its key is the same job #607
Merged
dcharlot
merged 1 commit from 2026-11-04 10:17:26 -05:00
wai/quantum-service-idempotency-2 into main 2026-11-03
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]>