wai-quantum 0.8.0, wai-quantum-qpu 0.4.0, wai-quantum-cli 0.2.3, the job service 0.2.1, and the Python and JavaScript packages 0.1.1 #564

Merged
dcharlot merged 4 commits from wai/quantum-release-0.8.0 into main 2026-11-01 22:15:41 -05:00
44 changed files with 277 additions and 224 deletions

View file

@ -3474,7 +3474,7 @@ version = "0.1.0"
[[package]]
name = "wai-quantum"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"blake3",
"ed25519-dalek",

View file

@ -398,6 +398,58 @@ wire format may change and such changes are recorded here.
implementation, `channel_lineup_verify.py`, from the text alone, agrees on every vector, and a
CI step runs both.
### wai-quantum 0.8.0, wai-quantum-qpu 0.4.0 and wai-quantum-cli 0.2.3: QIR and jeff, the variational and algorithm library, pulse and dynamics, the state vector on a fabric's members and resident on the GPU, and components a host registers
This release carries the six entries below it, down to pulse and dynamics. Two of them change
`engine::schema::FILES`, a public array whose length is part of its type, so the engine moves to its next 0.y,
a major bump before 1.0 (`wai-quantum/VERSIONING.md`), and `wai-quantum-qpu`, whose functions take the engine's
types, moves with it. Everything else in them only adds: `wai-quantum-cli` 0.2.3 requires `wai-quantum` 0.8.0 and
`wai-quantum-qpu` 0.4.0; the job service is 0.2.1, and the Python package and `@transaction-science/wai-quantum`
are 0.1.1, each carrying the 0.8.0 engine. The desktop app stays 0.1.0; its installers are released with its update
key. Nothing is deprecated.
- **wai-quantum 0.8.0:**
- programs in QIR 1.x and 2.x under their profiles, and in jeff 0.3, read and written, each conversion checked by
the equivalence ladder (`engine::formats`, the codes `Q700` to `Q721`);
- the variational and algorithm library: a job's parameters bound, exact gradients, deterministic optimisers, the
variational eigensolver, QAOA and algorithm builders (`engine::variational`, `engine::algorithms`, the schema
`wai.quantum.algorithms/1`, the codes `J050` to `J053`);
- pulse and dynamics: OpenPulse read, a pulse simulator, the method `pulse`, schedules and checks, and receipts
that bind the calibrations (`qasm::pulse`, `quantum_pulse`, `engine::pulse`, `schemas/pulse.v1.json`, the codes
`J040` and `J041`);
- the state vector on a fabric's members, and split across several devices on one node (`engine::fabric`, a job's
`fabric`), and the method `stabilizer_rank` for Clifford+T;
- the state vector resident on the GPU, `auto` placed by committed measurements (`engine::fabric_measured`), and
sparse Pauli dynamics on a GPU with the CPU's bits (`quantum_spd::device`, the `pauli` method on the fabric);
- methods, compiler passes, noise channels and file formats behind four traits, every built-in registered
through them, and a host's own components checked and marked uncertified in what they produce
(`engine::registry`, the codes `J060` to `J065`).
- **wai-quantum-qpu 0.4.0:** requires `wai-quantum` 0.8.0, and nothing else changes.
- **wai-quantum-cli 0.2.3:** `convert`, `components`, `fabric`, `gradient`, `optimize`, `vqe`, `qaoa`, `build`,
`pulse schedule | check`, and `run --fabric | --param | --method pulse`; every verb reads `.ll`, `.qir` and `.jeff`.
The local MCP server gains `convert_program`, `list_components`, `list_fabric`, `gradient_qasm`, `optimize_qasm`,
`vqe_ground_state`, `qaoa_maxcut`, `build_algorithm`, `pulse_schedule` and `pulse_check`.
- **The job service 0.2.1:** `POST /v1/convert`, `/v1/gradient`, `/v1/optimize`, `/v1/vqe`, `/v1/qaoa`, `/v1/build`,
`/v1/pulse/schedule` and `/v1/pulse/check`; a job's `source` in another format, its `fabric` and `params`, and the
method `pulse`; its components in `GET /v1`; and its MCP server's tools to match.
- **The Python package 0.1.1 and `@transaction-science/wai-quantum` 0.1.1:** the 0.8.0 engine; their names are
unchanged.
- **What moves with the version:** the engine's version is among the sealed bytes of a stamped result, so the
page's pinned digests move (the course check's 969b2c1c… to 1a9aa0ad…, the compile's ac948133… to beffb3cb…, the
estimate's 8715e76b… to db90b147…), the answer set's stored seal is written again (`WAI_ANSWER_BUNDLE_WRITE=1`),
and the notebooks' stored outputs are stored again. The job pins strip the engine and schema, and do not move.
- **What a caller may have to change:** `engine::schema::FILES`, as the two entries below say; and a caller of
`wai-quantum-qpu`'s `job::run` or `job::compiled_json` passes 0.8.0's types.
- Every lockfile that holds one of these crates moves with them (seventeen), so a `--locked` build still reads its
own, and `wai-rs`'s optional requirement on the engine moves to 0.8.0.
- **Breaking:** `wire:corpus:wai/quantum-conformance/answers/cases/bell-stored.wqa`: the stored answer's receipt
marker seals the engine's version, so it is written again at 0.8.0, as at each release. A conformance run checks a
stored answer with the engine that wrote it: 0.7.0's corpus with 0.7.0, this one with 0.8.0.
- **Breaking:** `wire:corpus:wai/quantum-conformance/answers/cases/bell-stored-changed.wqa`: the same stored answer
with one sample's shots changed, written again with it; it still does not verify.
- **Breaking:** `wire:corpus:wai/quantum-conformance/answers/bundle.json`: the corpus inline, written again with both
stored answers.
### wai-quantum: extension points, registration traits for methods, passes, noise channels and formats
- **`engine::registry`**: four traits a component implements, and one registry the engine goes through. `Method`

View file

@ -434,7 +434,7 @@
"valid": true
}
},
"answer": "root = Answer([bell, counts, check, seal])\n```qasm bell\nOPENQASM 3.0;\nqubit[2] q;\nbit[2] c;\nh q[0];\ncx q[0], q[1];\nc = measure q;\n```\ncounts = Histogram(@Sample(bell, 1000))\ncheck = Verdict(@Check(bell, {\"00\": 0.5, \"11\": 0.5}))\nseal = Receipt(@Seal([bell, counts, check]))\n]]>wai:receipt {\"statement\":\"seal\",\"receipt\":{\"alg\":\"ed25519\",\"canon\":\"rfc8785\",\"key\":\"ed4928c628d1c2c6eae90338905995612959273a5c63f93636c14614ac8737d1\",\"digest\":\"172dd72f18d77dc7ef99525fc61859062015f4a44a34d8ae5c76a7ba4a1b7c6d\",\"signature\":\"4e0288de0313b8f76b03bcbcfedf01989833fd63fd31e7bf0d981b75541c0362b92af555b161a552e6a4242e5a1793d9f90705ef8297db924a3abd577e6e8907\"}}\n"
"answer": "root = Answer([bell, counts, check, seal])\n```qasm bell\nOPENQASM 3.0;\nqubit[2] q;\nbit[2] c;\nh q[0];\ncx q[0], q[1];\nc = measure q;\n```\ncounts = Histogram(@Sample(bell, 1000))\ncheck = Verdict(@Check(bell, {\"00\": 0.5, \"11\": 0.5}))\nseal = Receipt(@Seal([bell, counts, check]))\n]]>wai:receipt {\"statement\":\"seal\",\"receipt\":{\"alg\":\"ed25519\",\"canon\":\"rfc8785\",\"key\":\"ed4928c628d1c2c6eae90338905995612959273a5c63f93636c14614ac8737d1\",\"digest\":\"cb520fe1dd07ac764305a9f073b92c2d379543e75fbf43ba4cf7b5f5acede921\",\"signature\":\"b4b31ddefc193f8d411f6792dbf78038b3fcd3a231d339ce8fc29c4b6e003e26b655d3d691d93d53febbe1bd5d7628fc8955d6afaa4589891ae3a34ad3133703\"}}\n"
},
{
"name": "bell-stored-changed",
@ -456,7 +456,7 @@
"valid": false
}
},
"answer": "root = Answer([bell, counts, check, seal])\n```qasm bell\nOPENQASM 3.0;\nqubit[2] q;\nbit[2] c;\nh q[0];\ncx q[0], q[1];\nc = measure q;\n```\ncounts = Histogram(@Sample(bell, 999))\ncheck = Verdict(@Check(bell, {\"00\": 0.5, \"11\": 0.5}))\nseal = Receipt(@Seal([bell, counts, check]))\n]]>wai:receipt {\"statement\":\"seal\",\"receipt\":{\"alg\":\"ed25519\",\"canon\":\"rfc8785\",\"key\":\"ed4928c628d1c2c6eae90338905995612959273a5c63f93636c14614ac8737d1\",\"digest\":\"172dd72f18d77dc7ef99525fc61859062015f4a44a34d8ae5c76a7ba4a1b7c6d\",\"signature\":\"4e0288de0313b8f76b03bcbcfedf01989833fd63fd31e7bf0d981b75541c0362b92af555b161a552e6a4242e5a1793d9f90705ef8297db924a3abd577e6e8907\"}}\n"
"answer": "root = Answer([bell, counts, check, seal])\n```qasm bell\nOPENQASM 3.0;\nqubit[2] q;\nbit[2] c;\nh q[0];\ncx q[0], q[1];\nc = measure q;\n```\ncounts = Histogram(@Sample(bell, 999))\ncheck = Verdict(@Check(bell, {\"00\": 0.5, \"11\": 0.5}))\nseal = Receipt(@Seal([bell, counts, check]))\n]]>wai:receipt {\"statement\":\"seal\",\"receipt\":{\"alg\":\"ed25519\",\"canon\":\"rfc8785\",\"key\":\"ed4928c628d1c2c6eae90338905995612959273a5c63f93636c14614ac8737d1\",\"digest\":\"cb520fe1dd07ac764305a9f073b92c2d379543e75fbf43ba4cf7b5f5acede921\",\"signature\":\"b4b31ddefc193f8d411f6792dbf78038b3fcd3a231d339ce8fc29c4b6e003e26b655d3d691d93d53febbe1bd5d7628fc8955d6afaa4589891ae3a34ad3133703\"}}\n"
}
]
}

View file

@ -10,4 +10,4 @@ c = measure q;
counts = Histogram(@Sample(bell, 999))
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":"172dd72f18d77dc7ef99525fc61859062015f4a44a34d8ae5c76a7ba4a1b7c6d","signature":"4e0288de0313b8f76b03bcbcfedf01989833fd63fd31e7bf0d981b75541c0362b92af555b161a552e6a4242e5a1793d9f90705ef8297db924a3abd577e6e8907"}}
]]>wai:receipt {"statement":"seal","receipt":{"alg":"ed25519","canon":"rfc8785","key":"ed4928c628d1c2c6eae90338905995612959273a5c63f93636c14614ac8737d1","digest":"cb520fe1dd07ac764305a9f073b92c2d379543e75fbf43ba4cf7b5f5acede921","signature":"b4b31ddefc193f8d411f6792dbf78038b3fcd3a231d339ce8fc29c4b6e003e26b655d3d691d93d53febbe1bd5d7628fc8955d6afaa4589891ae3a34ad3133703"}}

View file

@ -10,4 +10,4 @@ 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":"172dd72f18d77dc7ef99525fc61859062015f4a44a34d8ae5c76a7ba4a1b7c6d","signature":"4e0288de0313b8f76b03bcbcfedf01989833fd63fd31e7bf0d981b75541c0362b92af555b161a552e6a4242e5a1793d9f90705ef8297db924a3abd577e6e8907"}}
]]>wai:receipt {"statement":"seal","receipt":{"alg":"ed25519","canon":"rfc8785","key":"ed4928c628d1c2c6eae90338905995612959273a5c63f93636c14614ac8737d1","digest":"cb520fe1dd07ac764305a9f073b92c2d379543e75fbf43ba4cf7b5f5acede921","signature":"b4b31ddefc193f8d411f6792dbf78038b3fcd3a231d339ce8fc29c4b6e003e26b655d3d691d93d53febbe1bd5d7628fc8955d6afaa4589891ae3a34ad3133703"}}

View file

@ -1017,7 +1017,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "wai-quantum"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"blake3",
"ed25519-dalek",

View file

@ -599,7 +599,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "wai-quantum"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"blake3",
"ed25519-dalek",

View file

@ -1005,7 +1005,7 @@ version = "0.1.0"
[[package]]
name = "wai-quantum"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"blake3",
"ed25519-dalek",

View file

@ -985,7 +985,7 @@ dependencies = [
[[package]]
name = "wai-quantum"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"blake3",
"ed25519-dalek",

View file

@ -1007,7 +1007,7 @@ version = "0.1.0"
[[package]]
name = "wai-quantum"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"blake3",
"ed25519-dalek",

View file

@ -1257,7 +1257,7 @@ dependencies = [
[[package]]
name = "wai-quantum"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"blake3",
"ed25519-dalek",

View file

@ -1213,7 +1213,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "wai-quantum"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"blake3",
"cudarc",
@ -1228,7 +1228,7 @@ dependencies = [
[[package]]
name = "wai-quantum-cli"
version = "0.2.2"
version = "0.2.3"
dependencies = [
"clap",
"clap_complete",
@ -1241,7 +1241,7 @@ dependencies = [
[[package]]
name = "wai-quantum-qpu"
version = "0.3.0"
version = "0.4.0"
dependencies = [
"blake3",
"serde_json",

View file

@ -1,6 +1,6 @@
[package]
name = "wai-quantum-cli"
version = "0.2.2"
version = "0.2.3"
edition = "2024"
rust-version = "1.97"
license = "Apache-2.0"
@ -42,5 +42,5 @@ getrandom = "0.4"
# result's receipt still verifies after any JSON writer has carried it.
serde_json = { version = "1", features = ["float_roundtrip"] }
ureq = { version = "3", optional = true, features = ["json"] }
wai-quantum = { version = "0.7.0", path = "../wai-quantum", default-features = false, features = ["full"] }
wai-quantum-qpu = { version = "0.3.0", path = "../wai-quantum-qpu", optional = true }
wai-quantum = { version = "0.8.0", path = "../wai-quantum", default-features = false, features = ["full"] }
wai-quantum-qpu = { version = "0.4.0", path = "../wai-quantum-qpu", optional = true }

View file

@ -3,14 +3,14 @@
"name": "science.transaction.wai/quantum",
"title": "WAI Quantum",
"description": "OpenQASM 3 programs run, checked against their intent and signed on this machine.",
"version": "0.2.2",
"version": "0.2.3",
"websiteUrl": "https://wai.transaction.science/quantum-run/",
"packages": [
{
"registryType": "cargo",
"registryBaseUrl": "https://crates.io",
"identifier": "wai-quantum-cli",
"version": "0.2.2",
"version": "0.2.3",
"transport": {
"type": "stdio"
},

View file

@ -4453,7 +4453,7 @@ dependencies = [
[[package]]
name = "wai-quantum"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"blake3",
"ed25519-dalek",
@ -4466,7 +4466,7 @@ dependencies = [
[[package]]
name = "wai-quantum-cli"
version = "0.2.2"
version = "0.2.3"
dependencies = [
"clap",
"clap_complete",
@ -4493,7 +4493,7 @@ dependencies = [
[[package]]
name = "wai-quantum-qpu"
version = "0.3.0"
version = "0.4.0"
dependencies = [
"blake3",
"serde_json",

View file

@ -16,11 +16,11 @@ tauri = { version = "2", features = [] }
serde_json = { version = "1", features = ["float_roundtrip"] }
# The assistant's model server, called by the app (a local one by default).
ureq = { version = "3", features = ["json"] }
wai-quantum = { version = "0.7.0", path = "../wai-quantum", default-features = false, features = ["quantum_engine", "quantum_receipt", "quantum_toolchain", "quantum_qec", "quantum_noise"] }
wai-quantum-cli = { version = "0.2.2", path = "../wai-quantum-cli", default-features = false }
wai-quantum = { version = "0.8.0", path = "../wai-quantum", default-features = false, features = ["quantum_engine", "quantum_receipt", "quantum_toolchain", "quantum_qec", "quantum_noise"] }
wai-quantum-cli = { version = "0.2.3", path = "../wai-quantum-cli", default-features = false }
# The person's own providers: their registry, their credentials in the
# operating system's keychain, and runs on them sealed with the app's key.
wai-quantum-qpu = { version = "0.3.0", path = "../wai-quantum-qpu" }
wai-quantum-qpu = { version = "0.4.0", path = "../wai-quantum-qpu" }
# Updates: a newer release found in its update manifest, and installed only
# when its signature verifies with the public key in tauri.conf.json.
tauri-plugin-updater = "2.14.0"

View file

@ -2,7 +2,7 @@
The WAI quantum job service's engine in WebAssembly, for a page or for Node. A job is planned, run and sealed here exactly as the service plans, runs and seals it. The answer is the service's JSON, signed with a key you hold, and any job's receipt, the service's included, is checked here. Programs are linted, drawn and critiqued before they run.
This is version 0.1.0 of the package. It carries the engine of `wai-quantum` 0.7.0, built from `wai-web` with its `quantum_engine` feature. The package keeps its own version line, as the Python package does. The module also holds the rest of `wai-web`'s browser surface (reading WAI envelopes among it); this page is about the quantum engine.
This is version 0.1.1 of the package. It carries the engine of `wai-quantum` 0.8.0, built from `wai-web` with its `quantum_engine` feature. The package keeps its own version line, as the Python package does. The module also holds the rest of `wai-web`'s browser surface (reading WAI envelopes among it); this page is about the quantum engine.
## Install

View file

@ -1,6 +1,6 @@
{
"name": "@transaction-science/wai-quantum",
"version": "0.1.0",
"version": "0.1.1",
"description": "The WAI quantum engine in WebAssembly: OpenQASM programs planned, run and signed in a page or in Node as the WAI quantum job service runs them, receipts checked, programs linted and drawn.",
"license": "Apache-2.0",
"type": "module",

View file

@ -504,7 +504,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "wai-quantum"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"blake3",
"ed25519-dalek",
@ -514,7 +514,7 @@ dependencies = [
[[package]]
name = "wai-quantum-py"
version = "0.1.0"
version = "0.1.1"
dependencies = [
"pyo3",
"serde_json",

View file

@ -1,6 +1,6 @@
[package]
name = "wai-quantum-py"
version = "0.1.0"
version = "0.1.1"
edition = "2024"
rust-version = "1.97"
license = "Apache-2.0"
@ -22,7 +22,7 @@ pyo3 = { version = "=0.29.3", features = ["abi3-py39", "extension-module"] }
serde_json = { version = "1", features = ["float_roundtrip"] }
# quantum_qec: codes, decoders and thresholds (`qec`); quantum_noise: mitigation
# in a job (`mitigate`), learned noise models among them.
wai-quantum = { version = "0.7.0", path = "../wai-quantum", default-features = false, features = ["quantum_engine", "quantum_receipt", "quantum_qec", "quantum_noise"] }
wai-quantum = { version = "0.8.0", path = "../wai-quantum", default-features = false, features = ["quantum_engine", "quantum_receipt", "quantum_qec", "quantum_noise"] }
[profile.release]
lto = "thin"

View file

@ -19,7 +19,7 @@ pip install "wai-quantum[widgets]" # and the notebook widgets (anywidget)
The same wheels are attached, each with its SHA-256, to the `wai-quantum-cli-v<version>` release on the forge that carries them:
```sh norun=install
pip install wai_quantum-0.1.0-cp39-abi3-<platform>.whl
pip install wai_quantum-0.1.1-cp39-abi3-<platform>.whl
```
To build the wheel yourself, with Rust 1.98 and maturin 1.15.0:

View file

@ -23,7 +23,7 @@ pip install "wai-quantum[widgets]" # 另加笔记本小组件(anywidget)
同样的 wheel 也附在代码托管平台(forge)上包含它们的 `wai-quantum-cli-v<version>` 发布版中,每个都附有 SHA-256:
```sh norun=install
pip install wai_quantum-0.1.0-cp39-abi3-<platform>.whl
pip install wai_quantum-0.1.1-cp39-abi3-<platform>.whl
```
要自己构建 wheel,需要 Rust 1.98 和 maturin 1.15.0:

View file

@ -16,10 +16,10 @@
"id": "bell-receipt-1",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-28T08:01:08.795118Z",
"iopub.status.busy": "2026-10-28T08:01:08.795034Z",
"iopub.status.idle": "2026-10-28T08:01:08.799657Z",
"shell.execute_reply": "2026-10-28T08:01:08.799448Z"
"iopub.execute_input": "2026-11-01T13:51:55.736123Z",
"iopub.status.busy": "2026-11-01T13:51:55.736056Z",
"iopub.status.idle": "2026-11-01T13:51:55.741092Z",
"shell.execute_reply": "2026-11-01T13:51:55.740773Z"
}
},
"outputs": [],
@ -34,10 +34,10 @@
"id": "bell-receipt-2",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-28T08:01:08.800482Z",
"iopub.status.busy": "2026-10-28T08:01:08.800382Z",
"iopub.status.idle": "2026-10-28T08:01:08.802754Z",
"shell.execute_reply": "2026-10-28T08:01:08.802552Z"
"iopub.execute_input": "2026-11-01T13:51:55.741884Z",
"iopub.status.busy": "2026-11-01T13:51:55.741820Z",
"iopub.status.idle": "2026-11-01T13:51:55.744379Z",
"shell.execute_reply": "2026-11-01T13:51:55.744088Z"
}
},
"outputs": [
@ -67,17 +67,17 @@
"id": "bell-receipt-3",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-28T08:01:08.803379Z",
"iopub.status.busy": "2026-10-28T08:01:08.803320Z",
"iopub.status.idle": "2026-10-28T08:01:08.839939Z",
"shell.execute_reply": "2026-10-28T08:01:08.839650Z"
"iopub.execute_input": "2026-11-01T13:51:55.744955Z",
"iopub.status.busy": "2026-11-01T13:51:55.744895Z",
"iopub.status.idle": "2026-11-01T13:51:55.783189Z",
"shell.execute_reply": "2026-11-01T13:51:55.782630Z"
}
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5361ffd80f1444dcb008849dc8a7eba7",
"model_id": "abb1e0122a7d42229591c0b955738bbe",
"version_major": 2,
"version_minor": 1
},
@ -105,22 +105,22 @@
"id": "bell-receipt-4",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-28T08:01:08.840978Z",
"iopub.status.busy": "2026-10-28T08:01:08.840919Z",
"iopub.status.idle": "2026-10-28T08:01:08.843330Z",
"shell.execute_reply": "2026-10-28T08:01:08.843016Z"
"iopub.execute_input": "2026-11-01T13:51:55.784778Z",
"iopub.status.busy": "2026-11-01T13:51:55.784713Z",
"iopub.status.idle": "2026-11-01T13:51:55.786808Z",
"shell.execute_reply": "2026-11-01T13:51:55.786677Z"
}
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "1c17564bc8f04714913aee26aec298cf",
"model_id": "8b21729581114c3c9b105acbaf05f8c4",
"version_major": 2,
"version_minor": 1
},
"text/html": [
"<div class=\"wq-receipt\" style=\"font-family:ui-sans-serif,system-ui,-apple-system,'Segoe UI',sans-serif;font-size:13px;line-height:1.45;border:1px solid var(--jp-border-color2,rgba(127,127,127,.35));border-radius:8px;padding:10px 12px;margin:2px 0;max-width:100%;overflow-x:auto\"><div>receipt <span class=\"wq-badge\" style=\"display:inline-block;padding:0 7px;border-radius:9px;font-size:11px;font-weight:600;color:#fff;background:#10b981\">verified</span> <span style=\"opacity:.7\">checked here, binding the request and the result as given</span></div><table style=\"border-collapse:collapse;margin-top:6px\"><tr><td style=\"padding:1px 12px 1px 0;opacity:.7\">signer</td><td style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;word-break:break-all\"><span title=\"did:key:z6MkehRgf7yJbgaGfYsdoAsKdBPE3dj2CYhowQdcjqSJgvVd\">did:key:z6MkehRgf7yJbgaGfYsdoAsKdBPE3dj2CYhowQdcjqSJgvVd</span></td></tr><tr><td style=\"padding:1px 12px 1px 0;opacity:.7\">key</td><td style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;word-break:break-all\">03a107bff3ce10be1d70dd18e74bc09967e4d6309ba50d5f1ddc8664125531b8</td></tr><tr><td style=\"padding:1px 12px 1px 0;opacity:.7\">digest</td><td style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;word-break:break-all\">800d66009e3991cb28a4312ac6fb5b262cab458bd8a025d1b689cb0d5a6edec1</td></tr><tr><td style=\"padding:1px 12px 1px 0;opacity:.7\">signature</td><td style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;word-break:break-all\">b61adcc941ba7019…c7543e676ad82b0a</td></tr><tr><td style=\"padding:1px 12px 1px 0;opacity:.7\">form</td><td style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;word-break:break-all\">ed25519 over rfc8785 canonical JSON</td></tr></table></div>"
"<div class=\"wq-receipt\" style=\"font-family:ui-sans-serif,system-ui,-apple-system,'Segoe UI',sans-serif;font-size:13px;line-height:1.45;border:1px solid var(--jp-border-color2,rgba(127,127,127,.35));border-radius:8px;padding:10px 12px;margin:2px 0;max-width:100%;overflow-x:auto\"><div>receipt <span class=\"wq-badge\" style=\"display:inline-block;padding:0 7px;border-radius:9px;font-size:11px;font-weight:600;color:#fff;background:#10b981\">verified</span> <span style=\"opacity:.7\">checked here, binding the request and the result as given</span></div><table style=\"border-collapse:collapse;margin-top:6px\"><tr><td style=\"padding:1px 12px 1px 0;opacity:.7\">signer</td><td style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;word-break:break-all\"><span title=\"did:key:z6MkehRgf7yJbgaGfYsdoAsKdBPE3dj2CYhowQdcjqSJgvVd\">did:key:z6MkehRgf7yJbgaGfYsdoAsKdBPE3dj2CYhowQdcjqSJgvVd</span></td></tr><tr><td style=\"padding:1px 12px 1px 0;opacity:.7\">key</td><td style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;word-break:break-all\">03a107bff3ce10be1d70dd18e74bc09967e4d6309ba50d5f1ddc8664125531b8</td></tr><tr><td style=\"padding:1px 12px 1px 0;opacity:.7\">digest</td><td style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;word-break:break-all\">ab97a7c91deb79cc7cc6b1a15dd68e3c51bd650f6cfe20ec6e968720716ffdbd</td></tr><tr><td style=\"padding:1px 12px 1px 0;opacity:.7\">signature</td><td style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;word-break:break-all\">5f8d2afa9af0ea8d…b84aae21c634c400</td></tr><tr><td style=\"padding:1px 12px 1px 0;opacity:.7\">form</td><td style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;word-break:break-all\">ed25519 over rfc8785 canonical JSON</td></tr></table></div>"
],
"text/plain": [
"Receipt(valid, signed by did:key:z6MkehRgf7yJbgaGfYsdoAsKdBPE3dj2CYhowQdcjqSJgvVd)"
@ -151,10 +151,10 @@
"id": "bell-receipt-6",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-28T08:01:08.844165Z",
"iopub.status.busy": "2026-10-28T08:01:08.844104Z",
"iopub.status.idle": "2026-10-28T08:01:08.845718Z",
"shell.execute_reply": "2026-10-28T08:01:08.845506Z"
"iopub.execute_input": "2026-11-01T13:51:55.788732Z",
"iopub.status.busy": "2026-11-01T13:51:55.788674Z",
"iopub.status.idle": "2026-11-01T13:51:55.790400Z",
"shell.execute_reply": "2026-11-01T13:51:55.790166Z"
}
},
"outputs": [
@ -179,10 +179,10 @@
"id": "bell-receipt-7",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-28T08:01:08.846178Z",
"iopub.status.busy": "2026-10-28T08:01:08.846120Z",
"iopub.status.idle": "2026-10-28T08:01:08.847778Z",
"shell.execute_reply": "2026-10-28T08:01:08.847584Z"
"iopub.execute_input": "2026-11-01T13:51:55.791289Z",
"iopub.status.busy": "2026-11-01T13:51:55.791232Z",
"iopub.status.idle": "2026-11-01T13:51:55.792794Z",
"shell.execute_reply": "2026-11-01T13:51:55.792607Z"
}
},
"outputs": [
@ -222,10 +222,10 @@
"id": "bell-receipt-10",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-28T08:01:08.848344Z",
"iopub.status.busy": "2026-10-28T08:01:08.848288Z",
"iopub.status.idle": "2026-10-28T08:01:08.850125Z",
"shell.execute_reply": "2026-10-28T08:01:08.849948Z"
"iopub.execute_input": "2026-11-01T13:51:55.793708Z",
"iopub.status.busy": "2026-11-01T13:51:55.793651Z",
"iopub.status.idle": "2026-11-01T13:51:55.795486Z",
"shell.execute_reply": "2026-11-01T13:51:55.795203Z"
}
},
"outputs": [
@ -256,22 +256,22 @@
"id": "bell-receipt-11",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-28T08:01:08.850716Z",
"iopub.status.busy": "2026-10-28T08:01:08.850659Z",
"iopub.status.idle": "2026-10-28T08:01:08.852824Z",
"shell.execute_reply": "2026-10-28T08:01:08.852683Z"
"iopub.execute_input": "2026-11-01T13:51:55.796225Z",
"iopub.status.busy": "2026-11-01T13:51:55.796165Z",
"iopub.status.idle": "2026-11-01T13:51:55.798342Z",
"shell.execute_reply": "2026-11-01T13:51:55.798116Z"
}
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d17f2eb5773445e9a278d806450ca8a5",
"model_id": "3d954404748147aa99dae6efeec69367",
"version_major": 2,
"version_minor": 1
},
"text/html": [
"<div class=\"wq-receipt\" style=\"font-family:ui-sans-serif,system-ui,-apple-system,'Segoe UI',sans-serif;font-size:13px;line-height:1.45;border:1px solid var(--jp-border-color2,rgba(127,127,127,.35));border-radius:8px;padding:10px 12px;margin:2px 0;max-width:100%;overflow-x:auto\"><div>receipt <span class=\"wq-badge\" style=\"display:inline-block;padding:0 7px;border-radius:9px;font-size:11px;font-weight:600;color:#fff;background:#ef4444\">INVALID</span> <span style=\"opacity:.7\">checked here, binding the request and the result as given</span></div><table style=\"border-collapse:collapse;margin-top:6px\"><tr><td style=\"padding:1px 12px 1px 0;opacity:.7\">signer</td><td style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;word-break:break-all\"><span title=\"did:key:z6MkehRgf7yJbgaGfYsdoAsKdBPE3dj2CYhowQdcjqSJgvVd\">did:key:z6MkehRgf7yJbgaGfYsdoAsKdBPE3dj2CYhowQdcjqSJgvVd</span></td></tr><tr><td style=\"padding:1px 12px 1px 0;opacity:.7\">key</td><td style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;word-break:break-all\">03a107bff3ce10be1d70dd18e74bc09967e4d6309ba50d5f1ddc8664125531b8</td></tr><tr><td style=\"padding:1px 12px 1px 0;opacity:.7\">digest</td><td style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;word-break:break-all\">800d66009e3991cb28a4312ac6fb5b262cab458bd8a025d1b689cb0d5a6edec1</td></tr><tr><td style=\"padding:1px 12px 1px 0;opacity:.7\">signature</td><td style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;word-break:break-all\">b61adcc941ba7019…c7543e676ad82b0a</td></tr><tr><td style=\"padding:1px 12px 1px 0;opacity:.7\">form</td><td style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;word-break:break-all\">ed25519 over rfc8785 canonical JSON</td></tr></table></div>"
"<div class=\"wq-receipt\" style=\"font-family:ui-sans-serif,system-ui,-apple-system,'Segoe UI',sans-serif;font-size:13px;line-height:1.45;border:1px solid var(--jp-border-color2,rgba(127,127,127,.35));border-radius:8px;padding:10px 12px;margin:2px 0;max-width:100%;overflow-x:auto\"><div>receipt <span class=\"wq-badge\" style=\"display:inline-block;padding:0 7px;border-radius:9px;font-size:11px;font-weight:600;color:#fff;background:#ef4444\">INVALID</span> <span style=\"opacity:.7\">checked here, binding the request and the result as given</span></div><table style=\"border-collapse:collapse;margin-top:6px\"><tr><td style=\"padding:1px 12px 1px 0;opacity:.7\">signer</td><td style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;word-break:break-all\"><span title=\"did:key:z6MkehRgf7yJbgaGfYsdoAsKdBPE3dj2CYhowQdcjqSJgvVd\">did:key:z6MkehRgf7yJbgaGfYsdoAsKdBPE3dj2CYhowQdcjqSJgvVd</span></td></tr><tr><td style=\"padding:1px 12px 1px 0;opacity:.7\">key</td><td style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;word-break:break-all\">03a107bff3ce10be1d70dd18e74bc09967e4d6309ba50d5f1ddc8664125531b8</td></tr><tr><td style=\"padding:1px 12px 1px 0;opacity:.7\">digest</td><td style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;word-break:break-all\">ab97a7c91deb79cc7cc6b1a15dd68e3c51bd650f6cfe20ec6e968720716ffdbd</td></tr><tr><td style=\"padding:1px 12px 1px 0;opacity:.7\">signature</td><td style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;word-break:break-all\">5f8d2afa9af0ea8d…b84aae21c634c400</td></tr><tr><td style=\"padding:1px 12px 1px 0;opacity:.7\">form</td><td style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;word-break:break-all\">ed25519 over rfc8785 canonical JSON</td></tr></table></div>"
],
"text/plain": [
"Receipt(INVALID, signed by did:key:z6MkehRgf7yJbgaGfYsdoAsKdBPE3dj2CYhowQdcjqSJgvVd)"
@ -294,10 +294,10 @@
"id": "bell-receipt-12",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-28T08:01:08.853480Z",
"iopub.status.busy": "2026-10-28T08:01:08.853423Z",
"iopub.status.idle": "2026-10-28T08:01:08.854691Z",
"shell.execute_reply": "2026-10-28T08:01:08.854461Z"
"iopub.execute_input": "2026-11-01T13:51:55.799069Z",
"iopub.status.busy": "2026-11-01T13:51:55.799016Z",
"iopub.status.idle": "2026-11-01T13:51:55.800268Z",
"shell.execute_reply": "2026-11-01T13:51:55.799997Z"
}
},
"outputs": [],
@ -323,7 +323,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.15"
"version": "3.12.16"
}
},
"nbformat": 4,

View file

@ -16,10 +16,10 @@
"id": "equivalence-1",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-28T08:01:09.360760Z",
"iopub.status.busy": "2026-10-28T08:01:09.360511Z",
"iopub.status.idle": "2026-10-28T08:01:09.367481Z",
"shell.execute_reply": "2026-10-28T08:01:09.366910Z"
"iopub.execute_input": "2026-11-01T13:51:56.297938Z",
"iopub.status.busy": "2026-11-01T13:51:56.297867Z",
"iopub.status.idle": "2026-11-01T13:51:56.302893Z",
"shell.execute_reply": "2026-11-01T13:51:56.302556Z"
}
},
"outputs": [],
@ -33,10 +33,10 @@
"id": "equivalence-2",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-28T08:01:09.368686Z",
"iopub.status.busy": "2026-10-28T08:01:09.368607Z",
"iopub.status.idle": "2026-10-28T08:01:09.371231Z",
"shell.execute_reply": "2026-10-28T08:01:09.370905Z"
"iopub.execute_input": "2026-11-01T13:51:56.303730Z",
"iopub.status.busy": "2026-11-01T13:51:56.303668Z",
"iopub.status.idle": "2026-11-01T13:51:56.305849Z",
"shell.execute_reply": "2026-11-01T13:51:56.305580Z"
}
},
"outputs": [
@ -84,10 +84,10 @@
"id": "equivalence-4",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-28T08:01:09.371950Z",
"iopub.status.busy": "2026-10-28T08:01:09.371889Z",
"iopub.status.idle": "2026-10-28T08:01:09.376672Z",
"shell.execute_reply": "2026-10-28T08:01:09.376373Z"
"iopub.execute_input": "2026-11-01T13:51:56.306493Z",
"iopub.status.busy": "2026-11-01T13:51:56.306401Z",
"iopub.status.idle": "2026-11-01T13:51:56.309359Z",
"shell.execute_reply": "2026-11-01T13:51:56.309124Z"
}
},
"outputs": [
@ -127,17 +127,17 @@
"id": "equivalence-5",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-28T08:01:09.377620Z",
"iopub.status.busy": "2026-10-28T08:01:09.377552Z",
"iopub.status.idle": "2026-10-28T08:01:09.414487Z",
"shell.execute_reply": "2026-10-28T08:01:09.413939Z"
"iopub.execute_input": "2026-11-01T13:51:56.310172Z",
"iopub.status.busy": "2026-11-01T13:51:56.310116Z",
"iopub.status.idle": "2026-11-01T13:51:56.350625Z",
"shell.execute_reply": "2026-11-01T13:51:56.350206Z"
}
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "b41310c95795476da6e6961600635aa1",
"model_id": "c3da9d748f1945f2aff2b59ea7eb4c62",
"version_major": 2,
"version_minor": 1
},
@ -166,17 +166,17 @@
"id": "equivalence-6",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-28T08:01:09.415600Z",
"iopub.status.busy": "2026-10-28T08:01:09.415533Z",
"iopub.status.idle": "2026-10-28T08:01:09.417916Z",
"shell.execute_reply": "2026-10-28T08:01:09.417634Z"
"iopub.execute_input": "2026-11-01T13:51:56.351678Z",
"iopub.status.busy": "2026-11-01T13:51:56.351609Z",
"iopub.status.idle": "2026-11-01T13:51:56.354391Z",
"shell.execute_reply": "2026-11-01T13:51:56.354116Z"
}
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d80c745a6b144fedaf718cfa70f41635",
"model_id": "a1878e6caaf94a74ab1da3d3ac5a1080",
"version_major": 2,
"version_minor": 1
},
@ -216,7 +216,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.15"
"version": "3.12.16"
}
},
"nbformat": 4,

View file

@ -23,17 +23,17 @@
"id": "getting-started-1",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-30T18:17:32.853588Z",
"iopub.status.busy": "2026-10-30T18:17:32.853375Z",
"iopub.status.idle": "2026-10-30T18:17:32.871318Z",
"shell.execute_reply": "2026-10-30T18:17:32.870355Z"
"iopub.execute_input": "2026-11-01T13:51:55.199632Z",
"iopub.status.busy": "2026-11-01T13:51:55.199506Z",
"iopub.status.idle": "2026-11-01T13:51:55.207260Z",
"shell.execute_reply": "2026-11-01T13:51:55.206889Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"'0.1.0'"
"'0.1.1'"
]
},
"execution_count": 1,
@ -52,10 +52,10 @@
"id": "getting-started-2",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-30T18:17:32.873536Z",
"iopub.status.busy": "2026-10-30T18:17:32.873343Z",
"iopub.status.idle": "2026-10-30T18:17:32.877116Z",
"shell.execute_reply": "2026-10-30T18:17:32.876420Z"
"iopub.execute_input": "2026-11-01T13:51:55.208119Z",
"iopub.status.busy": "2026-11-01T13:51:55.208045Z",
"iopub.status.idle": "2026-11-01T13:51:55.210082Z",
"shell.execute_reply": "2026-11-01T13:51:55.209763Z"
}
},
"outputs": [
@ -95,10 +95,10 @@
"id": "getting-started-4",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-30T18:17:32.879466Z",
"iopub.status.busy": "2026-10-30T18:17:32.879270Z",
"iopub.status.idle": "2026-10-30T18:17:32.883948Z",
"shell.execute_reply": "2026-10-30T18:17:32.883150Z"
"iopub.execute_input": "2026-11-01T13:51:55.211031Z",
"iopub.status.busy": "2026-11-01T13:51:55.210971Z",
"iopub.status.idle": "2026-11-01T13:51:55.213179Z",
"shell.execute_reply": "2026-11-01T13:51:55.212969Z"
}
},
"outputs": [
@ -142,10 +142,10 @@
"id": "getting-started-6",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-30T18:17:32.885820Z",
"iopub.status.busy": "2026-10-30T18:17:32.885633Z",
"iopub.status.idle": "2026-10-30T18:17:32.889717Z",
"shell.execute_reply": "2026-10-30T18:17:32.889212Z"
"iopub.execute_input": "2026-11-01T13:51:55.214092Z",
"iopub.status.busy": "2026-11-01T13:51:55.214031Z",
"iopub.status.idle": "2026-11-01T13:51:55.216290Z",
"shell.execute_reply": "2026-11-01T13:51:55.216060Z"
}
},
"outputs": [
@ -171,14 +171,14 @@
" 'omitted_shots': 0,\n",
" 'outcome_dimension': 1,\n",
" 'elapsed_ms': 0,\n",
" 'engine': {'name': 'wai-quantum', 'version': '0.7.0'},\n",
" 'engine': {'name': 'wai-quantum', 'version': '0.8.0'},\n",
" 'schema': 'wai.quantum.job-result/1',\n",
" 'energy': {'unmetered': \"the Python package does not meter a run's energy\"},\n",
" 'receipt': {'alg': 'ed25519',\n",
" 'canon': 'rfc8785',\n",
" 'key': '03a107bff3ce10be1d70dd18e74bc09967e4d6309ba50d5f1ddc8664125531b8',\n",
" 'digest': '57b40878d70402c45a5d04cb2549ec2d3752317bacb9aea890add5069eb9b13a',\n",
" 'signature': '3be4c1a273e3e11c0a0203f06a3660245d397a998a104a1ae3eaffdb5aecfb6d5e336c3af429ab561de0e2ae349204b37e823f38214456ef2500b922acd34b08'}}}"
" 'digest': '438d093b41edfae302ee4b499b8134bf1c039e7817eb847987b4c689b8991e60',\n",
" 'signature': 'c61f770d572de5dcdb504e7e26584d1297c69ea8289ca5cd1e5396f22b67d3b943e9ef3c7dc5d76a8dde6f3b62e9511c47ab5cc7c25cbddc0886219418897900'}}}"
]
},
"execution_count": 4,
@ -206,10 +206,10 @@
"id": "getting-started-8",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-30T18:17:32.890804Z",
"iopub.status.busy": "2026-10-30T18:17:32.890727Z",
"iopub.status.idle": "2026-10-30T18:17:32.892852Z",
"shell.execute_reply": "2026-10-30T18:17:32.892507Z"
"iopub.execute_input": "2026-11-01T13:51:55.217127Z",
"iopub.status.busy": "2026-11-01T13:51:55.217066Z",
"iopub.status.idle": "2026-11-01T13:51:55.218801Z",
"shell.execute_reply": "2026-11-01T13:51:55.218546Z"
}
},
"outputs": [
@ -245,10 +245,10 @@
"id": "getting-started-10",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-30T18:17:32.893855Z",
"iopub.status.busy": "2026-10-30T18:17:32.893793Z",
"iopub.status.idle": "2026-10-30T18:17:32.895781Z",
"shell.execute_reply": "2026-10-30T18:17:32.895369Z"
"iopub.execute_input": "2026-11-01T13:51:55.219585Z",
"iopub.status.busy": "2026-11-01T13:51:55.219528Z",
"iopub.status.idle": "2026-11-01T13:51:55.221051Z",
"shell.execute_reply": "2026-11-01T13:51:55.220802Z"
}
},
"outputs": [
@ -277,17 +277,17 @@
"id": "getting-started-11",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-30T18:17:32.896679Z",
"iopub.status.busy": "2026-10-30T18:17:32.896620Z",
"iopub.status.idle": "2026-10-30T18:17:32.937071Z",
"shell.execute_reply": "2026-10-30T18:17:32.936536Z"
"iopub.execute_input": "2026-11-01T13:51:55.221683Z",
"iopub.status.busy": "2026-11-01T13:51:55.221628Z",
"iopub.status.idle": "2026-11-01T13:51:55.259452Z",
"shell.execute_reply": "2026-11-01T13:51:55.258888Z"
}
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "7c992051b33243fa9a5585cc2c0cfcf3",
"model_id": "4ad1e0136ee94ab985bf9acd61d829f4",
"version_major": 2,
"version_minor": 1
},
@ -316,10 +316,10 @@
"id": "getting-started-12",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-30T18:17:32.938195Z",
"iopub.status.busy": "2026-10-30T18:17:32.938101Z",
"iopub.status.idle": "2026-10-30T18:17:32.940581Z",
"shell.execute_reply": "2026-10-30T18:17:32.940034Z"
"iopub.execute_input": "2026-11-01T13:51:55.260588Z",
"iopub.status.busy": "2026-11-01T13:51:55.260521Z",
"iopub.status.idle": "2026-11-01T13:51:55.262655Z",
"shell.execute_reply": "2026-11-01T13:51:55.262293Z"
}
},
"outputs": [
@ -355,10 +355,10 @@
"id": "getting-started-14",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-30T18:17:32.941942Z",
"iopub.status.busy": "2026-10-30T18:17:32.941847Z",
"iopub.status.idle": "2026-10-30T18:17:32.943927Z",
"shell.execute_reply": "2026-10-30T18:17:32.943548Z"
"iopub.execute_input": "2026-11-01T13:51:55.263404Z",
"iopub.status.busy": "2026-11-01T13:51:55.263342Z",
"iopub.status.idle": "2026-11-01T13:51:55.264893Z",
"shell.execute_reply": "2026-11-01T13:51:55.264679Z"
}
},
"outputs": [
@ -393,10 +393,10 @@
"id": "getting-started-15",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-30T18:17:32.944906Z",
"iopub.status.busy": "2026-10-30T18:17:32.944835Z",
"iopub.status.idle": "2026-10-30T18:17:32.947177Z",
"shell.execute_reply": "2026-10-30T18:17:32.946844Z"
"iopub.execute_input": "2026-11-01T13:51:55.265659Z",
"iopub.status.busy": "2026-11-01T13:51:55.265598Z",
"iopub.status.idle": "2026-11-01T13:51:55.267570Z",
"shell.execute_reply": "2026-11-01T13:51:55.267291Z"
}
},
"outputs": [
@ -434,17 +434,17 @@
"id": "getting-started-17",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-30T18:17:32.948407Z",
"iopub.status.busy": "2026-10-30T18:17:32.948327Z",
"iopub.status.idle": "2026-10-30T18:17:32.951943Z",
"shell.execute_reply": "2026-10-30T18:17:32.951464Z"
"iopub.execute_input": "2026-11-01T13:51:55.268166Z",
"iopub.status.busy": "2026-11-01T13:51:55.268105Z",
"iopub.status.idle": "2026-11-01T13:51:55.270774Z",
"shell.execute_reply": "2026-11-01T13:51:55.270516Z"
}
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0578d81f40d747c585ebeaccf83dfb4a",
"model_id": "ac4be8571cc24bf4b2d0d157e78dc1c6",
"version_major": 2,
"version_minor": 1
},
@ -481,7 +481,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.14"
"version": "3.12.16"
}
},
"nbformat": 4,

View file

@ -16,10 +16,10 @@
"id": "noisy-run-1",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-28T08:01:09.955162Z",
"iopub.status.busy": "2026-10-28T08:01:09.955035Z",
"iopub.status.idle": "2026-10-28T08:01:09.960072Z",
"shell.execute_reply": "2026-10-28T08:01:09.959738Z"
"iopub.execute_input": "2026-11-01T13:51:56.874893Z",
"iopub.status.busy": "2026-11-01T13:51:56.874821Z",
"iopub.status.idle": "2026-11-01T13:51:56.879847Z",
"shell.execute_reply": "2026-11-01T13:51:56.879515Z"
}
},
"outputs": [],
@ -33,10 +33,10 @@
"id": "noisy-run-2",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-28T08:01:09.960954Z",
"iopub.status.busy": "2026-10-28T08:01:09.960881Z",
"iopub.status.idle": "2026-10-28T08:01:09.963501Z",
"shell.execute_reply": "2026-10-28T08:01:09.963188Z"
"iopub.execute_input": "2026-11-01T13:51:56.880640Z",
"iopub.status.busy": "2026-11-01T13:51:56.880576Z",
"iopub.status.idle": "2026-11-01T13:51:56.883016Z",
"shell.execute_reply": "2026-11-01T13:51:56.882758Z"
}
},
"outputs": [
@ -66,10 +66,10 @@
"id": "noisy-run-3",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-28T08:01:09.964252Z",
"iopub.status.busy": "2026-10-28T08:01:09.964175Z",
"iopub.status.idle": "2026-10-28T08:01:09.967495Z",
"shell.execute_reply": "2026-10-28T08:01:09.967210Z"
"iopub.execute_input": "2026-11-01T13:51:56.883831Z",
"iopub.status.busy": "2026-11-01T13:51:56.883763Z",
"iopub.status.idle": "2026-11-01T13:51:56.887209Z",
"shell.execute_reply": "2026-11-01T13:51:56.886916Z"
}
},
"outputs": [
@ -108,17 +108,17 @@
"id": "noisy-run-5",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-28T08:01:09.968355Z",
"iopub.status.busy": "2026-10-28T08:01:09.968293Z",
"iopub.status.idle": "2026-10-28T08:01:10.003856Z",
"shell.execute_reply": "2026-10-28T08:01:10.003502Z"
"iopub.execute_input": "2026-11-01T13:51:56.887944Z",
"iopub.status.busy": "2026-11-01T13:51:56.887815Z",
"iopub.status.idle": "2026-11-01T13:51:56.928739Z",
"shell.execute_reply": "2026-11-01T13:51:56.928457Z"
}
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "783d70101e544aae8da9b146ff4fb5ab",
"model_id": "006fa7a5f63a4f80b29ccdeda6e4ffcf",
"version_major": 2,
"version_minor": 1
},
@ -155,10 +155,10 @@
"id": "noisy-run-7",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-28T08:01:10.004751Z",
"iopub.status.busy": "2026-10-28T08:01:10.004679Z",
"iopub.status.idle": "2026-10-28T08:01:10.007086Z",
"shell.execute_reply": "2026-10-28T08:01:10.006737Z"
"iopub.execute_input": "2026-11-01T13:51:56.929803Z",
"iopub.status.busy": "2026-11-01T13:51:56.929732Z",
"iopub.status.idle": "2026-11-01T13:51:56.932326Z",
"shell.execute_reply": "2026-11-01T13:51:56.931883Z"
}
},
"outputs": [
@ -185,17 +185,17 @@
"id": "noisy-run-8",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-28T08:01:10.007827Z",
"iopub.status.busy": "2026-10-28T08:01:10.007764Z",
"iopub.status.idle": "2026-10-28T08:01:10.010461Z",
"shell.execute_reply": "2026-10-28T08:01:10.010135Z"
"iopub.execute_input": "2026-11-01T13:51:56.933097Z",
"iopub.status.busy": "2026-11-01T13:51:56.933036Z",
"iopub.status.idle": "2026-11-01T13:51:56.935560Z",
"shell.execute_reply": "2026-11-01T13:51:56.935442Z"
}
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "4a647a39572b47a6838cb95bf90ef10b",
"model_id": "eee07e66a1184af49c60281df28406a5",
"version_major": 2,
"version_minor": 1
},
@ -232,7 +232,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.15"
"version": "3.12.16"
}
},
"nbformat": 4,

View file

@ -18,10 +18,10 @@
"id": "service-job-1",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-28T08:01:10.513477Z",
"iopub.status.busy": "2026-10-28T08:01:10.513403Z",
"iopub.status.idle": "2026-10-28T08:01:10.521129Z",
"shell.execute_reply": "2026-10-28T08:01:10.520803Z"
"iopub.execute_input": "2026-11-01T13:51:57.467938Z",
"iopub.status.busy": "2026-11-01T13:51:57.467863Z",
"iopub.status.idle": "2026-11-01T13:51:57.475246Z",
"shell.execute_reply": "2026-11-01T13:51:57.474914Z"
},
"tags": [
"service"
@ -51,10 +51,10 @@
"id": "service-job-2",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-28T08:01:10.522340Z",
"iopub.status.busy": "2026-10-28T08:01:10.522275Z",
"iopub.status.idle": "2026-10-28T08:01:10.735996Z",
"shell.execute_reply": "2026-10-28T08:01:10.735417Z"
"iopub.execute_input": "2026-11-01T13:51:57.476037Z",
"iopub.status.busy": "2026-11-01T13:51:57.475960Z",
"iopub.status.idle": "2026-11-01T13:51:57.689928Z",
"shell.execute_reply": "2026-11-01T13:51:57.689449Z"
},
"tags": [
"service"
@ -99,10 +99,10 @@
"id": "service-job-4",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-28T08:01:10.737274Z",
"iopub.status.busy": "2026-10-28T08:01:10.737193Z",
"iopub.status.idle": "2026-10-28T08:01:10.740151Z",
"shell.execute_reply": "2026-10-28T08:01:10.739783Z"
"iopub.execute_input": "2026-11-01T13:51:57.690965Z",
"iopub.status.busy": "2026-11-01T13:51:57.690890Z",
"iopub.status.idle": "2026-11-01T13:51:57.693971Z",
"shell.execute_reply": "2026-11-01T13:51:57.693679Z"
},
"tags": [
"service"
@ -137,10 +137,10 @@
"id": "service-job-6",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-28T08:01:10.741138Z",
"iopub.status.busy": "2026-10-28T08:01:10.741051Z",
"iopub.status.idle": "2026-10-28T08:01:10.743060Z",
"shell.execute_reply": "2026-10-28T08:01:10.742790Z"
"iopub.execute_input": "2026-11-01T13:51:57.694794Z",
"iopub.status.busy": "2026-11-01T13:51:57.694730Z",
"iopub.status.idle": "2026-11-01T13:51:57.696807Z",
"shell.execute_reply": "2026-11-01T13:51:57.696548Z"
},
"tags": [
"service"
@ -169,10 +169,10 @@
"id": "service-job-7",
"metadata": {
"execution": {
"iopub.execute_input": "2026-10-28T08:01:10.743837Z",
"iopub.status.busy": "2026-10-28T08:01:10.743775Z",
"iopub.status.idle": "2026-10-28T08:01:10.769694Z",
"shell.execute_reply": "2026-10-28T08:01:10.769271Z"
"iopub.execute_input": "2026-11-01T13:51:57.697505Z",
"iopub.status.busy": "2026-11-01T13:51:57.697426Z",
"iopub.status.idle": "2026-11-01T13:51:57.725830Z",
"shell.execute_reply": "2026-11-01T13:51:57.725338Z"
},
"tags": [
"service"
@ -211,7 +211,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.15"
"version": "3.12.16"
}
},
"nbformat": 4,

View file

@ -423,7 +423,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "wai-quantum"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"blake3",
"ed25519-dalek",
@ -433,7 +433,7 @@ dependencies = [
[[package]]
name = "wai-quantum-qpu"
version = "0.3.0"
version = "0.4.0"
dependencies = [
"blake3",
"serde_json",

View file

@ -1,6 +1,6 @@
[package]
name = "wai-quantum-qpu"
version = "0.3.0"
version = "0.4.0"
edition = "2024"
rust-version = "1.97"
license = "Apache-2.0"
@ -12,6 +12,6 @@ categories = ["science", "api-bindings"]
[dependencies]
# quantum_engine and quantum_receipt: a provider job is read, compared with the
# circuit's exact distribution and sealed by the engine (engine::provider).
wai-quantum = { version = "0.7.0", path = "../wai-quantum", default-features = false, features = ["quantum_fabric", "quantum_engine", "quantum_receipt"] }
wai-quantum = { version = "0.8.0", path = "../wai-quantum", default-features = false, features = ["quantum_fabric", "quantum_engine", "quantum_receipt"] }
serde_json = "1"
blake3 = "1"

View file

@ -599,7 +599,7 @@ dependencies = [
[[package]]
name = "wai-quantum"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"blake3",
"ed25519-dalek",

View file

@ -857,7 +857,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "wai-quantum"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"blake3",
"ed25519-dalek",
@ -870,7 +870,7 @@ dependencies = [
[[package]]
name = "wai-quantum-service"
version = "0.2.0"
version = "0.2.1"
dependencies = [
"axum",
"blake3",

View file

@ -1,6 +1,6 @@
[package]
name = "wai-quantum-service"
version = "0.2.0"
version = "0.2.1"
edition = "2024"
rust-version = "1.97"
license = "Apache-2.0"

View file

@ -3,7 +3,7 @@
"name": "science.transaction.wai/quantum-jobs",
"title": "WAI Quantum job service",
"description": "A free quantum job service: OpenQASM 3 run, checked and signed, with no account or key.",
"version": "0.2.0",
"version": "0.2.1",
"websiteUrl": "https://wai.transaction.science/quantum-run/",
"remotes": [
{

View file

@ -416,7 +416,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "wai-quantum"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"blake3",
"ed25519-dalek",

View file

@ -1079,7 +1079,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "wai-quantum"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"blake3",
"block2",

View file

@ -1,6 +1,6 @@
[package]
name = "wai-quantum"
version = "0.7.0"
version = "0.8.0"
edition = "2024"
rust-version = "1.97"
license = "Apache-2.0"

View file

@ -21,7 +21,7 @@ library.
```toml
[dependencies]
wai-quantum = "0.7"
wai-quantum = "0.8"
```
```rust runnable

View file

@ -10,7 +10,7 @@
```toml
[dependencies]
wai-quantum = "0.7"
wai-quantum = "0.8"
```
```rust runnable

View file

@ -12,9 +12,9 @@ replacement, are listed in [DEPRECATIONS.md](DEPRECATIONS.md).
| Package | Where | Version today |
|---|---|---|
| `wai-quantum`, the engine (Rust crate) | `wai/wai-quantum`, published on crates.io | 0.7.x |
| `wai-quantum`, the engine (Rust crate) | `wai/wai-quantum`, published on crates.io | 0.8.x |
| `wai-quantum-cli`, the command line `wai-quantum` and its MCP server (Rust crate) | `wai/wai-quantum-cli`, published on crates.io | 0.2.x |
| `wai-quantum-qpu`, quantum processors and the person's own providers (Rust crate) | `wai/wai-quantum-qpu`, published on crates.io | 0.3.x |
| `wai-quantum-qpu`, quantum processors and the person's own providers (Rust crate) | `wai/wai-quantum-qpu`, published on crates.io | 0.4.x |
| The job service, its HTTP API and its MCP server | `wai/wai-quantum-service`, at `https://wai.transaction.science/quantum-jobs` | 0.2.x |
| `wai-quantum`, the Python package | `wai/wai-quantum-py` | 0.1.x |
| The editor extension | `wai/tools/wai-quantum-editor` | 0.1.x |
@ -109,7 +109,7 @@ Every result names the engine that made it and the schema it follows (a
compile's result names `wai.quantum.compile-result/1`):
```json fragment
"engine": { "name": "wai-quantum", "version": "0.7.0" },
"engine": { "name": "wai-quantum", "version": "0.8.0" },
"schema": "wai.quantum.job-result/1"
```

View file

@ -64,7 +64,7 @@
"wai/quantum-studio/src/views/main.js": "4129c45e35f65caaedb9e2fd4e0e2e1a29ba6ff27b33c5190924c8cc13b2a5cd",
"wai/quantum-studio/src/views/render.js": "b3f8bd6717bd18b6275ea8fc94cd2be31f81ef0a8d7c46a882e03085a67eaea4",
"wai/quantum-studio/src/views/views.css": "6ba324a58e6c320094e7534694c3c6d53d15605326be785d72989432b7b2a1fe",
"wai/wai-quantum-views/Cargo.lock": "8c1633a018b90fd8399a80f6822c51bb646d08e6cda4044bfa63ca9a546e3e66",
"wai/wai-quantum-views/Cargo.lock": "83edc2c2e30b8b07fcadfb09c7f65c7b7ae193097ed2584e5b06275e7ed9cccf",
"wai/wai-quantum-views/Cargo.toml": "2de456eaf4a115a7a721f26a27974f5b621295b77e30039d03044922d891bbb2",
"wai/wai-quantum-views/build.sh": "c7cb7c91ba0a3ee39e1e4427c4b8d5be21d289eab3b036b7466347c774b67871",
"wai/wai-quantum-views/src/lib.rs": "a9a20da6399ff58efde84eb5116f8e064ca9110f33b6b99546899ae5971636e0"

2
wai/wai-rs/Cargo.lock generated
View file

@ -4587,7 +4587,7 @@ dependencies = [
[[package]]
name = "wai-quantum"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"blake3",
"ed25519-dalek",

View file

@ -115,7 +115,7 @@ getrandom = { version = "0.3", optional = true }
# ---- quantum (optional, behind the `quantum*` features) ----
# The quantum stack now lives in its own dependency-light crate so it can be used
# without the media/codec chain. `wai` re-exports it unchanged.
wai-quantum = { version = "0.7.0", path = "../wai-quantum", optional = true, default-features = false }
wai-quantum = { version = "0.8.0", path = "../wai-quantum", optional = true, default-features = false }
# Create's library (WAI's widgets for joule-ui): `wai create --from app.oui`, `wai app` and
# `wai mcp --toolset app`, in a build with the feature `app`.
wai-app = { path = "../wai-app", optional = true }

View file

@ -1241,7 +1241,7 @@ version = "0.1.0"
[[package]]
name = "wai-quantum"
version = "0.7.0"
version = "0.8.0"
dependencies = [
"blake3",
"ed25519-dalek",

View file

@ -770,8 +770,9 @@ mod tests {
/// BLAKE3 of [`engine_course_check`]'s answer for [`COURSE_CHECK`] on the
/// lesson's starter, at 512 MiB, as the native build and the wasm32 one write it.
/// A check names the engine that made it (`engine::schema::stamp_as`), so this
/// moves with every release of wai-quantum (374b400e… before checks named it).
pub(super) const COURSE_DIGEST: &str = "969b2c1c19d0fd9c820aa04aae4f0675b165ce7e09e9f51004a92d0ffb910f21";
/// moves with every release of wai-quantum (374b400e… before checks named it,
/// 969b2c1c… at 0.7.0, 1a9aa0ad… at 0.8.0).
pub(super) const COURSE_DIGEST: &str = "1a9aa0adbdf40ce1a812ee40408caec29259a25bea853c49f853a798b05baa6a";
pub(super) fn starter(id: &str) -> String {
let l: Value = serde_json::from_str(&engine_course_lesson(id, "en")).unwrap();
@ -859,7 +860,7 @@ mod tests {
/// names the engine and its schema (`engine::schema::stamp_as`), and its
/// certificate names its gate set `basis` (04a03934… when it was `target`).
/// The engine's version is among the sealed bytes, so this moves with every
/// release of wai-quantum (0a165415… at 0.6.16, ac948133… at 0.7.0).
/// release of wai-quantum (0a165415… at 0.6.16, ac948133… at 0.7.0, beffb3cb… at 0.8.0).
/// The compile sealed before either, whose bytes hashed to 14db506e…, is
/// kept in wai-quantum's `src/engine/testdata/compile-legacy.json` and still
/// verifies.
@ -868,7 +869,7 @@ mod tests {
pub(super) const PULSE_XM: &str = "OPENQASM 3.0;\ndefcalgrammar \"openpulse\";\ncal {\n extern port d0;\n extern port m0;\n extern port a0;\n frame q0 = newframe(d0, 5.0e9, 0);\n frame r0 = newframe(m0, 7.1e9, 0);\n frame c0 = newframe(a0, 7.1e9, 0);\n}\ndefcal x $0 { play(q0, gaussian(0.4, 64dt, 16dt)); }\ndefcal measure $0 -> bit { play(r0, constant(0.1, 200dt)); return capture_v2(c0, 200dt); }\nbit[1] c;\nx $0;\nc[0] = measure $0;\n";
pub(super) const PULSE_XM_DENSITY: &str = "03c0c48a8a3568fdd86e792633c5b4ea98eca3d09dc40d028bb50e13c489828b";
pub(super) const COMPILE_DIGEST: &str = "ac94813324e9bf7ab83b4bf0290e5abf25bef987826311f0632c2701ebbd045a";
pub(super) const COMPILE_DIGEST: &str = "beffb3cbdee44a02268bdd04f4de7941d87f9034e072c727c92f7d571d6b03c9";
/// A compile in the page: Clifford+T within the budget, every pass
/// recorded, the certificate sealed with the page's key and checked
@ -897,8 +898,8 @@ mod tests {
/// names the engine and its schema (`engine::schema::stamp_as`), which
/// moved it from aaa42bc8…, the estimate sealed before. The engine's
/// version is among the sealed bytes, so this moves with every release of
/// wai-quantum (0cd25cf6… at 0.6.16, 8715e76b… at 0.7.0).
pub(super) const ESTIMATE_DIGEST: &str = "8715e76b04746611834d4bbcee1d3196f5ce457d450aa88d46e084b1ff813da1";
/// wai-quantum (0cd25cf6… at 0.6.16, 8715e76b… at 0.7.0, db90b147… at 0.8.0).
pub(super) const ESTIMATE_DIGEST: &str = "db90b14718b301f025e1b2979c19b9c1bcd824e259c7fde9a76775244e4cd76a";
/// An estimate in the page: the counts (a ladder through an ancilla), the
/// frontier, every receipt sealed with the page's key, the seal checked