open-standards/.github/workflows
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Transaction Science bd46749c27 jouleclaw-energy test: a refused GPU span is checked against the registry, not retried
The macOS energy job's process_gpu test gave up when a GPU client vanished in six spans in a
row: its checks needed a span in which no client of the shared host vanished, and on a host
whose other sessions open and close GPU clients every second there may be none. Reproduced on
the build host beside a churner of short-lived GPU clients of our own: at one every 0.75 s, 4 of
4 runs gave up; at one every 1.5 s each run took 2-4 tries. Two other failures had the same
root: the oracle's sum over every client gave up when one went back inside its window (job
27254, the `.expect` on `oracle_times`), and fell below the counter's when a client came and went
inside the span (job 48857, the every-client assertion).

No span now needs to be free of churn. Each span of the counter's or the span meter's is
bracketed by `ioreg` listings of the registry, read independently of the counter: before it,
around its work and after it. `classify` sorts every client against them. A registry entry once
destroyed never comes back and its ID is not reused, so:

- a client two reads list is in every read between them, under one pid; anything else is a
  contradiction and fails the test: a client the end snapshot lacks while `ioreg` lists it after
  (step 5's own check, now on every span), one the start lacks while `ioreg` listed it before and
  after, one both snapshots hold that `ioreg` did not list around the work, one gone inside the
  work and back in the end snapshot;
- a client's time goes down only where a queue of it closed, which the listings show as a fall,
  so each counter reading lies between the listings either side of it, or on one side of a fall
  across it; a reading the registry does not explain voids the span;
- a client the counter saw vanish is corroborated if `ioreg` listed it under the same pid (gone)
  or showed its fall inside the span (gone back); one `ioreg` never listed voids the span;
- a client only `ioreg` listed inside the span, or a fall it showed where the counter saw an
  advance, is GPU time the counter's snapshots cannot hold, counted as hidden, a lower bound;
- this process's own clients must be clean, or the span is void.

A void span is taken again after 0.5, 1, 2, 4, 8, 8 ... s, and none the registry vouches for in
90 s fails as `process-gpu INCONCLUSIVE`, with each reason's count: not a verdict, and not a
pass. A refusal must be the registry's: a corroborated vanished client refuses the span, naming
the client the meter's rule picks (`expected_refusal`, factored out of step 5), and with none the
span is not refused. The checks then run on the view, the snapshots with the vanished clients
taken out of both, which can only raise this process's share.

`agrees_with_oracle` checks client by client. This process's GPU time equals `ioreg`'s exactly,
as before. The clients whose time went down nowhere advanced at most the oracle's advance plus
what the gap can hold (their lower bound is now the sorting's, per client). The meter's
every-client time is the sum over the view's clients. The rail is checked against the test's own
IOReport read on every span whose snapshots both read it current, shared ones included (it had
been on sole-user spans only), and a figure's rail is the snapshots' own advance. A figure must
be a sole user's share of the time the counter saw plus the time hidden from it. `oracle_times`
and its give-up are gone.

Steps 4c and 6 take the span meter's span through `finish_showing_gpu` (the previous commit) and
check that it is the GPU counter's figure, or the CPU alone with the counter's reason, over the
meter's own snapshots, where the test had picked a span out of six by the text of its reason. A
corroborated refusal is accepted there as the CPU alone, `HwShunt`, `Partial`, with CPU energy.
Step 5's span-meter span gives the counter's reason over its own snapshots. The idle spans of
steps 3 and 4a, and 4c's CPU-only span, also assert that `ioreg` saw no GPU time of this
process's inside them. After the liveness askers, the test waits, at most 3 s and never failing,
for this process's own clients to settle.

the_span_classifier_sorts_every_client drives `classify` over six built reads: clean; gone and
gone back, with the registry vouching and without; made and destroyed inside the span (48857's
shape); a fall inside the work that the counter saw as an advance (27254's); falls across each
snapshot inside the span and outside it; under- and over-reads; this process's own client not
clean; each contradiction and a pid mismatch; `expected_refusal`'s order; and the 99% gate with
hidden time.

standards-build.yml: the jouleclaw-energy step also greps `process-gpu: oracle-checked:`, which
step 2 prints once its burn was checked against the oracle. MEASURED_ENERGY.md says what the test
checks.

Verified on the build host, at this commit's jouleclaw files: clippy -D warnings on
jouleclaw-energy with `--features ioreport` and without; the macOS energy job's jouleclaw-energy
step as standards-build.yml runs it (under `bash -eo pipefail`, both greps), 5 of 5, three of
them beside a churner of short-lived GPU clients of our own every 0.75 s; and the process_gpu
test 16 of 16, 4 quiet and 4 beside a churner every 3, 1.5 and 0.75 s, with no void span, no
INCONCLUSIVE and no contradiction, every vanished client corroborated on the first attempt. A
read-only walk of the registry the way the counter walks it, every 5 ms for 60 s beside a churner
every 0.2 s (268 clients made and destroyed), found no walk lacking a client the walks either
side of it held and no child iterator invalid at the end of a walk (phantom_walks 0,
invalid_at_end 0, of 7266 walks): a contradiction is a fault in a read, not churn.

Falsified, each failing as named: a start or end walk dropping a client, or giving it another
pid, and a phantom client in both snapshots (contradictions); the counter skipping another
process's vanished client, or giving a figure across a gone one ("the registry vouches for ...
but the counter gave Ok"); refusing a client that did not vanish, or naming another than the
rule's; this process's time and every client's time each 1 ns off; the end snapshot misstating
when it read; the rail under-read by 10%, and a figure's rail not the snapshots' advance; the
sole-user gate at 1%; the span meter's figure, or its reason, not the counter's over its own
snapshots; GPU work in an idle span; the CI grep's line renamed; and the classifier's stretch
rule, fit rule, fall placement, the per-pid oracle, the refusal order and the hidden-time gate,
each broken in turn. Two persistent faults end INCONCLUSIVE, as designed: (c) a 10% under-read of
another process's client in every snapshot, "process-gpu INCONCLUSIVE: 1.5 s burn: no span in 92
s (12 spans) could be checked against the oracle: a counter reading out of the registry's order
×12; ...", and (d) a phantom client in every start snapshot, "... a vanished client the registry
never listed ×12; ...".

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-04 08:13:11 -05:00
..
conformance.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
energy-hardware.yml wip: registry, SPEC, CHANGELOG, CI jobs, reader tests, settle and generic machine description 2026-10-22 13:49:49 -04:00
joule-code-conformance.yml Merge #483 (wai/ingest-srt-rist @b54dc94c): SRT and RIST contribution ingest, with a signed link record 2026-10-26 08:41:50 -04:00
joule-moq-remote.yml joule-moq-room: a bound on the clock's record store of a remote session, which ends the session 2026-10-26 10:43:13 -04:00
joule-moq-room.yml Bring wai mcp, wai setup-agent, Create and the room service's API into the catalogue, renamed to N3 2026-10-27 05:54:20 -04:00
joule-moq-web.yml Merge #493 (wai/messaging-calls @01f3aac1): wai.live.message and wai.live.call, conversations and calls on live rooms 2026-10-26 12:23:34 -04:00
jouleclaw-fabrics.yml jouleclaw-omni: read mmap'd GGUF bytes without assuming their alignment 2026-10-20 17:09:37 -04:00
jouleclaw-public-surface-documented.yml ci: one run per branch at a time — no workflow declared a concurrency group 2026-10-05 12:01:57 -04:00
repo-checks.yml ci: gate on cargo-audit, so an advisory has to be read rather than accumulated 2026-10-22 12:49:04 -04:00
standards-build.yml jouleclaw-energy test: a refused GPU span is checked against the registry, not retried 2026-11-04 08:13:11 -05:00
wai-app.yml CI, the browser end-to-end and docs: Create under wai-app, wai create --from and wai dev 2026-10-27 05:14:19 -04:00
wai-audit.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-breaking.yml CI: five more gates were in the queue they ration, missed by their own names 2026-11-03 15:19:13 -05:00
wai-byte-equality.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-catalogue.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-conformance.yml wai: holdings — which objects of which groups a node holds now, for its neighbours 2026-11-04 05:20:31 -05:00
wai-energy-receipts.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-examples.yml CI: five more gates were in the queue they ration, missed by their own names 2026-11-03 15:19:13 -05:00
wai-fleet.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-formal-verification.yml wai-formal-verification: the Kani cache would have overwritten the second macOS host's install 2026-11-03 11:20:39 -05:00
wai-fuzz.yml wai: coverage-guided fuzzing of the reader, and the container reservations it found 2026-10-14 10:58:29 -04:00
wai-http.yml CI: five more gates were in the queue they ration, missed by their own names 2026-11-03 15:19:13 -05:00
wai-jpegai-e2e.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-key-proxy.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-ledger.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-neural-e2e.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-neural-gates.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-ops-differential.yml wai: D2c M7b gate 4: the networks against the direct networks, on random networks 2026-10-18 01:07:07 -04:00
wai-ops-gpu.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-ops-npu.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-ops.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-pack.yml CI: five more gates were in the queue they ration, missed by their own names 2026-11-03 15:19:13 -05:00
wai-quantum-cli-release.yml wai-quantum-cli release: link the Linux binaries static, not static-pie 2026-10-20 22:24:10 -04:00
wai-quantum-cli.yml wai-quantum-cli: a job on a provider is an MCP task 2026-11-03 17:49:13 -05:00
wai-quantum-contract.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-cuda.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-dataflow.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-desktop-release.yml wai-quantum-desktop: the update manifest served by the website, not a standing pre-release 2026-10-30 10:49:03 -04:00
wai-quantum-docs.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-dsp.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-editors.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-estimate.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-formats.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-fpga.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-hip.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-js-release.yml wai-quantum for JavaScript: the engine as the npm package @transaction-science/wai-quantum 0.1.0 2026-10-29 08:14:24 -04:00
wai-quantum-js.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-lang.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-metal.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-npu-cores.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-npu.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-opencl.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-processors.yml ci: run each suite for what can affect it; re-runs after a merge become nightly 2026-10-19 02:49:11 -04:00
wai-quantum-pulse.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-py-release.yml wai and wai-quantum release workflows: the x86_64 macOS legs on the Intel Mac (macos-x86_64) 2026-10-29 11:50:15 -04:00
wai-quantum-py.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-qec.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-qpu.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-registry.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-service.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-sme.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-studio.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-tensor-engine.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-tensor-program.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-variational.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-vector.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-verdict.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-views.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-quantum-webgpu.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-release.yml wai and wai-quantum release workflows: the x86_64 macOS legs on the Intel Mac (macos-x86_64) 2026-10-29 11:50:15 -04:00
wai-sink-android.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-sink-swift.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-sota-vectors.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-studio.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-vector.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00
wai-web-reach.yml ci: run each suite for what can affect it; re-runs after a merge become nightly 2026-10-19 02:49:11 -04:00
wai-web-wasm.yml CI: the gate that decides whether a workflow runs was queued behind the work it gates 2026-11-03 15:19:13 -05:00