wai-quantum: pulse programs simulated under a Lindblad master equation, the same bits everywhere, their receipts binding the calibrations #551

Merged
dcharlot merged 10 commits from wai/quantum-pulse into main 2026-10-31 07:15:50 -04:00

2026-10-30

Transaction Science
wai-quantum-py: the getting-started notebook's method list names pulse
All checks were successful
wai-quantum docs, course and locales / every command and snippet in the docs · linux (pull_request) Successful in 15m45s
wai-quantum CPU vector units / member · vector unit, rvv 1024-bit (riscv64, emulated) (pull_request) Successful in 43s
wai-quantum verdicts and repairs / the intent set and the verdict under wasm32-wasip2 (wasmtime) (pull_request) Successful in 1m29s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 1m55s
wai-quantum verdicts and repairs / verdicts, repairs and the intent set · linux (pull_request) Successful in 1m52s
wai-quantum CPU vector units / member · vector unit, sve 128-bit (aarch64, emulated) (pull_request) Successful in 30s
wai-quantum studio and desktop / studio · browser (pull_request) Successful in 3m47s
wai-quantum CPU vector units / member · vector unit, rvv 128-bit (riscv64, emulated) (pull_request) Successful in 25s
wai-quantum CPU vector units / member · vector unit, sve 2048-bit (aarch64, emulated) (pull_request) Successful in 24s
wai-quantum CPU vector units / member · vector unit, avx2 (x86_64 silicon) (pull_request) Successful in 29s
wai-quantum CPU vector units / member · vector unit, sve 512-bit (aarch64, emulated) (pull_request) Successful in 30s
WAI conformance / each feature of the independent verifiers' steps compiles alone (pull_request) Successful in 13m7s
wai-quantum studio and desktop / desktop app · linux (pull_request) Successful in 5m52s
wai-quantum WebGPU member / member · software Vulkan (linux) (pull_request) Successful in 2m14s
wai-quantum views in agent hosts / views · the page and its engine (pull_request) Successful in 2m58s
wai-quantum views in agent hosts / views · a scripted host (pull_request) Successful in 3m11s
WAI Studio / the catalogue's actions, the unit tests and the core · linux (pull_request) Successful in 59s
wai-quantum WebGPU member / shader checks · browser build · wasip2 inertness · MSRV (pull_request) Successful in 3m32s
wai-quantum tensor-engine member / member · tensor engine, the kernel toolchain's simulator (linux) (pull_request) Successful in 8m26s
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 5m44s
WAI examples / WAI examples · android-app · linux-arm64 (pull_request) Successful in 7m41s
wai-quantum HIP member / member · HIP absent (linux-arm64) (pull_request) Successful in 34s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 6m21s
wai-quantum npu-cores member / member · npu-cores absent (linux-arm64) (pull_request) Successful in 32s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 10m54s
wai-quantum tensor-engine member / member · tensor engine absent (linux-arm64) (pull_request) Successful in 22s
wai-quantum pulse and dynamics / the same bits · linux-arm64 (pull_request) Successful in 1m27s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (pull_request) Successful in 2m42s
WAI Studio / Studio in WebKit · linux (pull_request) Successful in 10m57s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 1h14m2s
The notebook prints wq.methods(), which now lists the method pulse, so its stored
output no longer matched and the notebook check failed on Linux and macOS (#551).
Its outputs are rewritten with ci/check.sh --write-notebooks, and a second run of
ci/check.sh matched all five notebooks. Only this cell's compared output changed;
the other notebooks' rewrites differed only in timestamps and widget ids, which the
check does not compare, so they are left as they were.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 14:25:43 -04:00
Transaction Science
wai-quantum views: the page rebuilt with the pulse pane's styles, in the image CI rebuilds it in
Some checks failed
wai-quantum WebGPU member / member · software Vulkan (linux) (pull_request) Successful in 2m11s
wai-quantum pulse and dynamics / the same bits · macos (pull_request) Successful in 1m4s
wai-quantum WebGPU member / shader checks · browser build · wasip2 inertness · MSRV (pull_request) Successful in 3m34s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 2m11s
wai-quantum for Python / python · macos (pull_request) Failing after 2m19s
wai-quantum-qpu / credentials in the keychain (macos) (pull_request) Successful in 27s
WAI mbt2018_mean integer decode (regenerated vectors) / regenerate mbt2018_mean integer vectors → Rust decode, required (pull_request) Successful in 5m37s
wai-web wasm32 / wai-web wasm32 build · corpus, menu and writers (pull_request) Successful in 5m19s
wai-quantum service / service · macos (pull_request) Successful in 2m7s
wai-quantum matrix-extension member / member · matrix extension absent (macos) (pull_request) Successful in 12s
wai-quantum neural-processor member / member · neural processor (macos) (pull_request) Successful in 8m23s
wai-quantum portable tensor program / tensor program · Metal and the arm64 CPU (macos) (pull_request) Successful in 18s
wai-quantum CPU vector units / member · vector unit absent (macos) (pull_request) Successful in 18s
WAI Studio / Studio in WebKit · linux (pull_request) Successful in 10m23s
wai-quantum studio and desktop / desktop app · macos (pull_request) Successful in 4m29s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 7m38s
WAI conformance / each feature of the independent verifiers' steps compiles alone (pull_request) Successful in 12m19s
wai-quantum HIP member / member · HIP absent (linux-arm64) (pull_request) Successful in 28s
wai-quantum npu-cores member / member · npu-cores absent (linux-arm64) (pull_request) Successful in 27s
wai-quantum WebGPU member / member · Metal (macos) (pull_request) Successful in 2m49s
wai-quantum pulse and dynamics / the same bits · linux-arm64 (pull_request) Successful in 1m21s
wai-quantum tensor-engine member / member · tensor engine absent (linux-arm64) (pull_request) Successful in 21s
WAI examples / WAI examples · the archive, the readiness check, the browser and Apple · macos (pull_request) Failing after 24m0s
wai-quantum WebGPU member / member · browser WebGPU (macos) (pull_request) Successful in 2m14s
wai-sink-android native sink library / every ABI, the AAR, and the instrumented tests in a headless emulator · macos (pull_request) Successful in 7m22s
WAI examples / WAI examples · android-app · linux-arm64 (pull_request) Successful in 5m40s
wai-sink-android native sink library / the JNI layer and the platform-free half on the host JVM · linux-arm64 (pull_request) Successful in 2m32s
WAI Studio / Studio in Chromium and Firefox · macos (pull_request) Successful in 10m34s
wai-sink-swift native sink package / libwai slices, desktop tests, simulator tests · macos (pull_request) Successful in 16m4s
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Successful in 58m37s
The pulse pane's styles changed studio.css, which the views page is built from,
so build-views --check refused the page main holds. Rebuilt with
wai/wai-quantum-views/build.sh in catthehacker/ubuntu:act-22.04 with Rust 1.98.0,
as the views workflow rebuilds it. Its script is unchanged and its styles carry
the pane's. The engine inside it is rebuilt from the current sources too. The
page on main held an older engine, which CI warned of on #549.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 12:16:21 -04:00
Transaction Science
wai-quantum-service smoke, schema contract: pulse runs within the submission window and under a second schema checker
The service smoke stays within the 30 submissions a client makes in a
window (29 now, 30 on a host with a GPU): its set gains a pulse item, run as
a job of the method pulse, and POST /v1/pulse/check runs that item again and
holds it to its result, in place of separate schedule and run calls. The
schema contract script calls pulse_schedule and the pulse run and plan
tools over the command line's MCP server, and checks the run with
pulse_check, each answer held to its output schema by the second JSON
Schema implementation.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 12:05:51 -04:00
Transaction Science
quantum-studio, wai-quantum-desktop: the pulse pane, and the changelog of the pulse layer
The Studio's Pulse pane draws a pulse program's schedule as a timeline: a
lane per frame with its port and qubit, each play its waveform's envelope at
its samples, captures hatched, barriers as rules, phase and frequency
changes as ticks, and the gate calls as brackets above, each mark titled
with its samples and its line. A program the pulse reader refuses is
answered with its code; an example loads a DRAG x and sx and a measurement.
A run on the pulse simulator is a job of the method pulse in the page,
giving each capture's reading, the counts, the bound and what the receipt
binds, every answer's seal checked there. The tab, the service and the
desktop app each answer the pane (the desktop app's new pulse command), and
studio.test.mjs drives it end to end.

wai/CHANGELOG.md records the pulse layer under Unreleased, with the one
breaking change the gate reports: schema::FILES grew from 22 to 23.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 12:05:51 -04:00
Transaction Science
wai-quantum docs: the pulse page, the READMEs and the feature matrix
docs/pulse.md gives a pulse program, its schedule, its run as a job, its
check and a refusal, all run by the docs checker against the command line
(the receipt a block writes verified), and states the reader's constructs,
the model, the integrator and its bound, what a receipt binds, and the
options. The engine's and the command line's READMEs (with their Simplified
Chinese translations), the service's README, the docs index and the
OpenQASM 3 feature matrix name the pulse layer; the agent docs are
regenerated from the matrix. The reader's module documentation states the
qubit timeline a gate waits for.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 12:05:14 -04:00
Transaction Science
wai-web, CI: pulse calls in the page, and the pulse layer's bits held on every platform
QuantumEngine.pulse gives the page the schedule and check calls, sealed
with the page's key; a pulse run is the page's run with method pulse. A
native test and a wasm32 test run the same pulse job to one pinned digest
of its final density matrix, the engine's own; wai-web-wasm.yml's pins move
from 26 to 27 (native) and from 18 to 19 (wasm32).

wai-quantum-pulse.yml runs the pulse reader's, the simulator's and the pulse
jobs' 26 tests by name in a release build on Linux, builds each feature set
that holds them without warnings, runs the pinned digests in debug and
release builds on arm64 Linux and on macOS, and runs the 26 tests under
wasm32-wasip2 by wasmtime.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 12:05:14 -04:00
Transaction Science
wai-quantum-cli, wai-quantum-service: pulse runs, schedules and checks on the command line, both MCP servers and the job service
A pulse program runs as a job of the method pulse everywhere jobs run:
wai-quantum run --method pulse --pulse OPTIONS (and plan), the MCP tools
run_quantum_circuit and plan_quantum_circuit on both servers (their method
and pulse options in the input schema), and the job service's /v1/jobs and
/v1/run, through its queue, workers and receipts. A pulse run accepts the
verdict hosts ask for and carries its own, and a run's printed result shows
its integrator, captures, device and what its receipt binds.

wai-quantum pulse schedule draws a program's frames as timelines with their
plays, captures and barriers, its gate calls and waveforms; wai-quantum
pulse check holds a sealed pulse job to its request by running it again.
Both MCP servers serve pulse_schedule and pulse_check, and the service
POST /v1/pulse/schedule and /v1/pulse/check, a check held to the work a
call there takes. The API description, both smoke scripts, the committed
tool lists and the agent docs are regenerated; the Simplified Chinese help
summarises the new command.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 12:05:14 -04:00
Transaction Science
wai-quantum: pulse runs as jobs, their receipts binding the program, calibrations, device, target and integrator
engine::pulse makes a pulse program a job of the method pulse, planned and
run through catalog::plan and run::run like every job, so every host that
runs jobs runs it: the device from a target's calibration snapshot and the
request's pulse options over the defaults, each parameter saying where it
came from; counts sampled from the captures' joint reading (into the
program's bits) or the final state; the accuracy class bounded, with the
proved truncation bound and the rounding estimate.

The result's pulse.calibration holds the control program's digest, its
calibrations', the schedule's and the device's, and the target snapshot's
name, hash and calibration id; pulse.integrator the integrator and its
step; pulse.density_hash the final state's bits. The job's receipt seals
them with the result. engine::pulse::check holds a sealed pulse job to its
request: the signature, the program's digest, and the request run again,
each differing field named. engine::pulse::schedule draws the schedule for
a view; tools() gives the pulse_schedule and pulse_check tools for both
servers.

J040 and J041 join the job layer's refusals; the verdict of a pulse run is
its own (executed, bounded). schemas/pulse.v1.json is new (FILES grows from
22 to 23); the job request and result schemas gain the pulse options and
the pulse result, and the accuracy its bound.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 12:05:14 -04:00
Transaction Science
wai-quantum: a pulse simulator under a Lindblad master equation, the same bits everywhere, its error bounded
quantum_pulse (feature quantum_pulse, in quantum_engine and full) runs a
pulse schedule on the qubits its ports reach: two or three levels each in
its rotating frame, the drive as the frames' carriers set it, anharmonicity,
static couplings, and relaxation and dephasing from T1 and T2.

Each sample is integrated in the frame of each qubit's tone, where the
generator is constant: a fixed number of steps of a twelfth-order Taylor
series, then a diagonal phase back. Only + - * / and sqrt are used in a
fixed order with the crate's own sine and cosine, so the density matrix
is the same bits on every platform; a test pins its digest, which x86_64
and arm64 reproduce. The plan states a proved bound on the trace distance
from the model's exact solution and an estimate of rounding beside it, and
refuses a step longer than 1/lambda or a schedule whose error would pass
its tolerance, naming the steps that would meet it.

Tests hold it to closed forms within the bound it states: Rabi turns, the
axis a quarter turn of phase gives, detuned drives, T1 decay and T2
dephasing, a detuned play split in two; and to joint captures, leakage
with three levels, and the model's refusals.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 12:05:14 -04:00
Transaction Science
wai-quantum: OpenPulse read into a schedule on frames
qasm::pulse reads a pulse program's calibrations (cal and defcal on
physical qubits) and runs them in program order into a schedule: ports,
frames with their own times, the waveform templates (constant, gaussian,
sech, gaussian_square, drag, sine) and explicit samples, play, delay,
shift_phase, set_phase, shift_frequency, set_frequency, captures, barriers,
and each gate call with the samples it spans. A gate starts when its qubits
and frames are free; a frame's carrier runs on continuously across a
frequency change, and each play records the carrier's phase at its first
sample. Durations are whole samples of dt or refused.

What it does not take is refused with a code and its place: Q453 to Q462
join qasm::diag after Q452, renumbering nothing, and the table in
docs/qasm-diagnostics.md holds them.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 12:05:14 -04:00