open-standards/.github/workflows
Repository files (latest commit first)
Filename Latest commit message Latest commit date
David Charlot 104a8b444c check: no library source file is unreachable from its crate root
Going after the meters turned up a worse instance of a family this repo keeps
finding. `jouleclaw-omni/src/runtime/energy.rs` documents itself as measuring
"actual GPU, CPU, ANE and DRAM energy consumption in joules using Apple's
IOReport framework". It does not call IOReport. The macOS path multiplies
`getrusage` CPU seconds by a fixed 15 W; the other path multiplies wall-clock by
45 W; each then splits the result 60/20/20 across subsystems by constant
fractions. It has **zero tests**, and `runtime/mod.rs` does not declare it — so
it has never been compiled, by anything, ever.

That is the strongest member of the family. A feature-gated test with no
`--features` reports zero tests; a platform-gated meter on a single-platform
runner compiles out; a conformance suite in `main()` gets built and never run.
An orphan source file does not even type-check. It is invisible to cargo check,
cargo test, clippy and every conformance suite simultaneously, and it cannot
fail because nothing asks it anything.

The hazard is the next reader, not the dead code. A real meter with a per-rail
liveness gate already lives in the same workspace (`jouleclaw-energy`); someone
who trusts this file's header and wires it in instead gets CPU-seconds times a
guess, apportioned by invented fractions — energy derived from a performance
proxy, which is the thing the whole metering ladder exists to grade against.

So: `scripts/check-orphan-sources.py`, wired into the hygiene workflow. The
per-subsystem split is worth naming separately — four fields reading as four
independent observations when all four are fractions of one number is precision
standing in for measurement, and it invites conclusions nothing here supports.

**Measured, not estimated.** 1659 library sources checked; 25 orphans, all in
`jouleclaw-omni`, 19,964 lines never compiled. Every other crate is clean.
My first pass said 77 — it counted `src/bin/*.rs`, which cargo auto-discovers,
so the exclusions are part of the check rather than a convenience. The baseline
was then generated by the detector instead of retyped, because hand-copying it
pinned 15 of 25 and the check caught the other ten.

Falsified in both directions before being trusted, and the CI step repeats the
self-test on every run: a planted orphan must fail the check, and removing it
must pass. Exit codes verified without a pipe — `$?` after `| head` is head's
status, which is how a gate silently stops gating.

The baseline pins today's 25 so this does not go red on a pre-existing
condition, and names what the file falsely claims. Removing an entry is the
point; adding one is a regression to argue for in a commit message.

`energy.rs` itself gets a corrected header and nothing else. I had added a
declared `EnergyBasis` to it and reverted that: the field made the orphan stop
compiling, and a broken orphan is worse than an honest one. Whether those 25
files are wired up or deleted is not mine to decide — 20k lines is someone's
work, and the guard stops the problem growing either way.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-10-10 09:51:01 -04:00
..
conformance.yml ci: one run per branch at a time — no workflow declared a concurrency group 2026-10-05 12:01:57 -04:00
energy-hardware.yml ci: energy-hardware.yml declares its concurrency group 2026-10-06 02:30:35 -04:00
joule-code-conformance.yml joule-moq: receipt chains recover (P-J2, P-J3); public text by capability; the conformance gate parses its count 2026-10-06 10:39:21 -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
no-vanity-metrics.yml check: no library source file is unreachable from its crate root 2026-10-10 09:51:01 -04:00
standards-build.yml jcp-gateway: test tree-metered calls against an oracle on real servers 2026-10-09 10:49:24 -04:00
wai-byte-equality.yml ci: one run per branch at a time — no workflow declared a concurrency group 2026-10-05 12:01:57 -04:00
wai-conformance.yml Merge origin/main (1cf132ec) into wai/w5-4-measure-web 2026-10-07 21:32:49 -04:00
wai-energy-receipts.yml Leave wai-quantum on its own verifier; the rule goes back into wai-rs 2026-10-07 14:33:18 -04:00
wai-formal-verification.yml ci: one run per branch at a time — no workflow declared a concurrency group 2026-10-05 12:01:57 -04:00
wai-http.yml Merge main (#186 merged as ae9a1ca6: strict Ed25519) into wai/w5-4-measure-web 2026-10-08 02:00:51 -04:00
wai-jpegai-e2e.yml ci: one run per branch at a time — no workflow declared a concurrency group 2026-10-05 12:01:57 -04:00
wai-neural-e2e.yml ci: one run per branch at a time — no workflow declared a concurrency group 2026-10-05 12:01:57 -04:00
wai-neural-gates.yml ci: one run per branch at a time — no workflow declared a concurrency group 2026-10-05 12:01:57 -04:00
wai-pack.yml ci: a rebase ran every path-filtered workflow, because paths: matches the push delta 2026-10-08 11:40:23 -04:00
wai-section-refs.yml ci: one run per branch at a time — no workflow declared a concurrency group 2026-10-05 12:01:57 -04:00
wai-sota-vectors.yml ci: one run per branch at a time — no workflow declared a concurrency group 2026-10-05 12:01:57 -04:00
wai-web-wasm.yml ci: wai-web's native test count is 24, with the WAI2 classical-length test 2026-10-08 07:42:21 -04:00
workflow-hygiene.yml ci: workflow hygiene — restore the comment marker on the header's first prose line 2026-10-09 16:29:23 -04:00