jouleclaw-energy: a ledger total carries its weakest grade; macOS meter code is linted in CI #259

Merged
dcharlot merged 1 commit from ci/meter-clippy-macos into main 2026-10-14 19:54:10 -04:00
Owner

What was wrong

jouleclaw-energy's EnergyLedger added up microjoules without recording how good each figure was. Its costs defaults are fixed numbers, and their docs called one of them "measured". So a total built from estimates looked exactly like a total built from hardware readings, in the serializable LedgerSnapshot as well.

The fix

  • Every deposit is graded. record and record_batch now take the deposit's Provenance, and the ledger keeps the weakest grade it has been given. That is a single fetch_min, so the hot path stays lock-free.
    • provenance(), LedgerSnapshot::provenance and summary() report the total's grade.
    • An empty ledger has no grade, and reset clears it.
    • A test pins the grade order to span::weaker.
  • The defaults are described honestly. They are figures carried over from another codebase's measurements, calibrated on no host that uses them. A deposit computed from one is therefore Estimator, and the word "measured" is gone.
  • Their orderings are checked at compile time. The checks are now const _: () = { assert!(..) } in costs. Before, they were a test of constants, which clippy flagged as assertions_on_constants.

CI

The macOS energy job gains a last step that runs cargo clippy --all-targets --no-deps -- -D warnings on the eight crates whose meter code compiles only on macOS. Each crate gets the features its tests use:

  • jcp-energy, jcp-gateway
  • proof-cascade, proof-solvers
  • eoc-meter
  • jouleclaw-energy (ioreport)
  • sandbox-meter, sandbox-proof

No Linux job lints that code, which is how the lints fixed in #244 went unseen. All eight pass the gate today on the build host.

Checked

  • jouleclaw-energy tests pass on the build host with default features, with ioreport and with serde, including the two new ledger tests.
  • Mutation checks, run after the commit:
    • making the grade last-write-wins fails a_total_is_graded_by_its_weakest_deposit;
    • breaking a default's ordering fails the build (E0080);
    • putting back b"IOReportChannels\0" fails the new CI step.
  • No other users. Nothing outside the crate calls EnergyLedger or costs.

🤖 Generated with Claude Code

## What was wrong `jouleclaw-energy`'s `EnergyLedger` added up microjoules without recording how good each figure was. Its `costs` defaults are fixed numbers, and their docs called one of them "measured". So a total built from estimates looked exactly like a total built from hardware readings, in the serializable `LedgerSnapshot` as well. ## The fix - **Every deposit is graded.** `record` and `record_batch` now take the deposit's `Provenance`, and the ledger keeps the weakest grade it has been given. That is a single `fetch_min`, so the hot path stays lock-free. - `provenance()`, `LedgerSnapshot::provenance` and `summary()` report the total's grade. - An empty ledger has no grade, and `reset` clears it. - A test pins the grade order to `span::weaker`. - **The defaults are described honestly.** They are figures carried over from another codebase's measurements, calibrated on no host that uses them. A deposit computed from one is therefore `Estimator`, and the word "measured" is gone. - **Their orderings are checked at compile time.** The checks are now `const _: () = { assert!(..) }` in `costs`. Before, they were a test of constants, which clippy flagged as `assertions_on_constants`. ## CI The macOS energy job gains a last step that runs `cargo clippy --all-targets --no-deps -- -D warnings` on the eight crates whose meter code compiles only on macOS. Each crate gets the features its tests use: - jcp-energy, jcp-gateway - proof-cascade, proof-solvers - eoc-meter - jouleclaw-energy (`ioreport`) - sandbox-meter, sandbox-proof No Linux job lints that code, which is how the lints fixed in #244 went unseen. All eight pass the gate today on the build host. ## Checked - **jouleclaw-energy tests** pass on the build host with default features, with `ioreport` and with `serde`, including the two new ledger tests. - **Mutation checks**, run after the commit: - making the grade last-write-wins fails `a_total_is_graded_by_its_weakest_deposit`; - breaking a default's ordering fails the build (`E0080`); - putting back `b"IOReportChannels\0"` fails the new CI step. - **No other users.** Nothing outside the crate calls `EnergyLedger` or `costs`. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
jouleclaw-energy: a ledger total carries its weakest grade; macOS meter code is linted in CI
All checks were successful
standards workspaces build + test / which workspaces this change touches (pull_request) Successful in 18s
tests in CI / every test file is run by a job or listed with its reason (pull_request) Successful in 10s
wai-quantum WebGPU member / does this change touch it (pull_request) Successful in 10s
workflow hygiene / every workflow supersedes its own queue (pull_request) Successful in 10s
standards workspaces build + test / jouleclaw-rs (-nodebug, jouleclaw/jouleclaw-rs, -p jouleclaw-energy --features rapl,nvml, jouleclaw-rs, linux-arm64, -C target-feature=+fp16) (pull_request) Successful in 3m40s
jouleclaw public surface must stay documented / Public-surface audit (jouleclaw-rs) (pull_request) Successful in 1m4s
spec citations resolve / Code cites no section its SPEC lacks (pull_request) Successful in 4s
wai-quantum WebGPU member / member · discrete GPU, Vulkan (jetson-hub) (pull_request) Successful in 10m26s
standards workspaces build + test / aac-rs (aac-conformance, aac/aac-rs, aac-rs, linux-arm64) (pull_request) Successful in 3m13s
standards workspaces build + test / joule-code-rs (joule-code/joule-code-rs, joule-code-rs, linux-arm64, true) (pull_request) Successful in 1m30s
standards workspaces build + test / joulecontract-rs (joulecontract/joulecontract-rs, joulecontract-rs, linux-arm64, true) (pull_request) Successful in 58s
standards workspaces build + test / map-rs (map-conformance, map/map-rs, map-rs, linux-arm64) (pull_request) Successful in 1m20s
standards workspaces build + test / mesh-rs (mesh/mesh-rs, -p mesh-engine-gguf -p mesh-openai --features mesh-engine-gguf/gguf,mesh-openai/server, mesh-rs, linux-arm64) (pull_request) Successful in 55s
standards workspaces build + test / openpay (openpay, openpay, linux-arm64) (pull_request) Successful in 2m53s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 5m32s
standards workspaces build + test / jouledesk-rs (jouledesk/jouledesk-rs, jouledesk-rs, macos) (pull_request) Successful in 52s
wai-quantum WebGPU member / member · Metal (macos) (pull_request) Successful in 2m11s
wai-quantum WebGPU member / member · browser WebGPU (macos) (pull_request) Successful in 1m28s
standards workspaces build + test / arl-rs (arl/arl-rs, arl-rs, linux) (pull_request) Successful in 1m15s
standards workspaces build + test / jcp-rs (jcp-conformance, jcp/jcp-rs, -p jcp-energy --features nvml, jcp-rs, linux) (pull_request) Successful in 1m50s
standards workspaces build + test / eoc-rs (eoc/eoc-rs, -p eoc-meter --features cuda, eoc-rs, linux) (pull_request) Successful in 2m9s
standards workspaces build + test / joule-ui-rs (joule-ui/joule-ui-rs, joule-ui-rs, linux) (pull_request) Successful in 1m10s
standards workspaces build + test / joulehook-rs (joulehook/joulehook-rs, joulehook-rs, linux) (pull_request) Successful in 1m12s
standards workspaces build + test / proof-rs (proof-conformance, proof/proof-rs, proof-rs, linux, true) (pull_request) Successful in 1m41s
standards workspaces build + test / sandbox-rs (sandbox-conformance, sandbox/sandbox-rs, sandbox-rs, linux) (pull_request) Successful in 2m26s
standards workspaces build + test / sense-rs (sense/sense-rs, sense-rs, linux) (pull_request) Successful in 1m8s
wai-quantum WebGPU member / shader checks · browser build · wasip2 inertness · MSRV (pull_request) Successful in 3m24s
standards workspaces build + test / smart-byte-rs (smart-byte/smart-byte-rs, smart-byte-rs, linux) (pull_request) Successful in 4m1s
wai-quantum WebGPU member / member · software Vulkan (linux) (pull_request) Successful in 2m5s
wai-quantum WebGPU member / member · DX12 and Vulkan (cbio-windows) (pull_request) Successful in 12m0s
de217a854e
EnergyLedger summed microjoules with no grade. Its `costs` defaults are
fixed figures, and the docs called one "measured". So a total built from
estimates looked the same as one built from readings, in the serializable
snapshot too. Now:

- `record` and `record_batch` take the deposit's `Provenance`. The ledger
  keeps the weakest grade it was given (one `fetch_min`, still lock-free).
  `provenance()`, `LedgerSnapshot::provenance` and the summary report that
  grade; an empty ledger has none, and `reset` clears it. The order of the
  grades is pinned to `span::weaker` by a test.
- The `costs` docs say what the figures are: defaults carried over from
  another codebase's measurements, calibrated on no host that uses them, so
  a deposit computed from one is `Estimator`. "measured" is gone.
- The orderings the defaults must keep are checked when the crate builds
  (`const _: () = { assert!(..) }`), not in a test of constants that clippy
  flagged as `assertions_on_constants`.

CI: the macOS energy job now runs clippy, with `-D warnings`, on the eight
crates whose meter code compiles only on macOS: jcp-energy, jcp-gateway,
proof-cascade, proof-solvers, eoc-meter, jouleclaw-energy (ioreport),
sandbox-meter and sandbox-proof. No Linux job lints that code, which is how
the lints fixed in #244 went unseen. All eight pass today.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Transaction-Science/open-standards!259
No description provided.