| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
All checks were successful
energy meters on real hardware / RAPL and NVML on jetson-hub (pull_request) Successful in 33s
standards workspaces build + test / jouleclaw-rs (pull_request) Successful in 4m1s
standards workspaces build + test / aac-rs (pull_request) Successful in 2m33s
standards workspaces build + test / joule-code-rs (pull_request) Successful in 2m27s
standards workspaces build + test / joulecontract-rs (pull_request) Successful in 1m7s
standards workspaces build + test / map-rs (pull_request) Successful in 50s
standards workspaces build + test / mesh-rs (pull_request) Successful in 40s
standards workspaces build + test / openpay (pull_request) Successful in 3m5s
standards workspaces build + test / arl-rs (pull_request) Successful in 1m10s
standards workspaces build + test / eoc-rs (pull_request) Successful in 1m55s
standards workspaces build + test / jcp-rs (pull_request) Successful in 1m28s
standards workspaces build + test / joule-ui-rs (pull_request) Successful in 1m8s
standards workspaces build + test / joulehook-rs (pull_request) Successful in 1m9s
standards workspaces build + test / proof-rs (pull_request) Successful in 1m29s
standards workspaces build + test / sandbox-rs (pull_request) Successful in 2m14s
standards workspaces build + test / sense-rs (pull_request) Successful in 1m11s
standards workspaces build + test / smart-byte-rs (pull_request) Successful in 3m39s
standards workspaces build + test / jouledesk-rs (pull_request) Successful in 3m2s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 6m58s
#166 fixed this class of defect in `eoc-meter` and `jouleclaw-energy`: an energy-probe test asserting a floor on thread CPU per tick, which the host's scheduler controls, failing on the dev Mac because the dev Mac is also the macOS runner. The same code exists in two more crates, and the same assertion with it. CI surfaced `proof-cascade` by failing an unrelated PR; sweeping for the pattern found `sandbox-meter` as well, rather than waiting for another round. A tick spins until the thread's CPU clock advances 25 ms **or** a 500 ms wall cap passes. Both copies carried a comment asserting the opposite — "the tick burns thread CPU time, so host load does not shorten it; only its wall-clock cap can" — a sentence containing its own refutation, since the cap is how load shortens a tick. The two outcomes that matter are not separable by time: a spin the host starved into the cap and a tick that simply slept both show a long wall span against little CPU. I tried a per-turn CPU floor first, reasoning that a turn is fixed work so starvation lowers turns-per-second rather than the cost of a turn. Measuring refuted it: a turn that sleeps 1 ms costs 13.3-15.8 µs of thread CPU against a real turn's 2.13-2.92 µs, because a blocking body's context switch is charged to the thread. Even the direction was wrong. So each tick reports what it did. `spin_tick` / `spin_for` return a `TickOutcome` — the CPU it saw itself burn, and how many turns of the spin loop it ran — and each probe collects one per tick, alongside the interval's wall span beside its CPU span. Per tick: the loop ran at all (a tick that never span did not burn CPU, at any load), and the tick stopped for one of its two stated reasons rather than early. The gaps measured by the tests' own clocks still bound it from above and keep CPU under wall. - **proof-cascade**: three load-sensitive sites — `assert_sampling`'s per-interval floor, an aggregate floor over a whole scripted call, and a per-interval floor in the live-rail test. `ProbeRun` gains `interval_wall` and the per-tick outcomes; `burn_thread_cpu` reports the CPU it was already computing. - **sandbox-meter**: the per-interval `PROBE_TICK / 2` floor. This crate already had `assert_tick` using the either-condition rule for the tick itself, so the interval check now matches the crate's own convention — and both are stronger for the spin count, since that rule alone admits a tick that slept through its cap. `TickOutcome` becomes public because it already appears in a public signature: `RaplPackages::live_in` and `counter_liveness` take a tick that returns it, so `sandbox-exec-microvm` has to name it and build one. Where a scripted tick stands in for the burn — fake powercap trees, the MSR fakes, the hardware test's own oracle — it reports a turn, with a comment saying that this is the test declaring a real spin ran and not a figure chosen to clear a threshold. The hardware test's tick keeps using `oracle::burn`, so the oracle stays independent of what it checks. Three doc comments asserting "a tick burns a full tick however loaded the machine is" are corrected in place; leaving that beside a fixed assertion would reinvite the mistake. Two call sites are `cfg(target_os = "linux")` and invisible to every run on this host: `sandbox-meter/tests/rapl_hardware.rs`, which CI's jetson-hub job caught, and `probe::counter_liveness_tick`, reached on the Linux side through `MsrRaplMeter::host`, which `cargo check --target aarch64-unknown-linux-gnu --all-targets` caught. That check is a weak oracle — it runs nothing — but it is the right shape for a type mismatch in code the host never compiles. `CARGO_FEATURE_NO_NEON=1` is needed, or blake3's build script wants Linux C headers. The whole sandbox workspace cannot cross-check (`zstd-sys` needs a real cross compiler), so instead I confirmed that nothing outside these crates references the changed entry points, which makes the per-crate checks exhaustive for callers. Falsified in both crates: a tick that sleeps instead of spinning, and a tick skipped entirely. One sleep falsification first looked like a pass and was a compile error — checked, not assumed. In proof-cascade a tick cut short of both stopping conditions is caught too. Verified: proof-rs 139 passed, sandbox-rs 324 passed, and the five touched crates check clean for aarch64-unknown-linux-gnu. The two clippy warnings in proof-cascade are in untouched code, the same pair that predates the change in eoc-meter — these files are copies of one another, which is why the defect was in four places. Co-Authored-By: Claude Opus 5 <[email protected]> |
||
| .. | ||
| conformance/v1 | ||
| proof-rs | ||
| CONTRIBUTING.md | ||
| LICENSE | ||
| LICENSE-SPEC | ||
| README.md | ||
| SPEC.md | ||
proof — A Carrier for Verified Work
The verification cargo class of the substrate. A proof obligation is content-addressed; a solver is anything that can attempt one at a declared tier; a discharged obligation seals as a signed JCR-1 receipt that records which tier closed it and the joules it cost. The standard fixes the one axis the theorem-proving field leaves implicit — joules per verified proof — and makes it portable: any prover can emit a Proof receipt, and any auditor can verify it with the same tooling as a Map, Sandbox, or Joule Code receipt.
The cheapest sufficient solver wins. Every obligation goes to the cheapest rung
that can discharge it — deterministic automation (T0), then SMT (T1), then a
small distilled prover (T2), then a frontier model (T3, last resort) — and
escalates only on failure. Correctness is never traded for energy: a solver
returns proved only when a verifier would accept the artifact, so the standard
changes which tier pays for a proof, not whether it is checked. The joules
spent on a cheaper solver that ran and failed first are disclosed as the cost
of escalation, never hidden. Energy carries an honest provenance tag
(HwShunt / ModelBased / Estimator), and a receipt for an Ungrounded
statement says, in the signed artifact, that the statement was never validated
against intent — a proof is not a specification.
- Site: jouleproof.transaction.science (the JouleProof pillar is the steward + services layer over this standard).
- Licence: Apache-2.0 for reference code (see
LICENSE); CC-BY-4.0 for specification text (seeLICENSE-SPEC). - Status: v0.1.0 draft. Specification core published (
SPEC.md); reference workspaceproof-rs/.
What's here
proof/
├── SPEC.md — the normative standard (§1–§9)
├── conformance/v1/ — published vectors (receipt wire + signed core + envelope)
└── proof-rs/ — the Apache-2.0 reference implementation
The reference implementation (proof-rs/)
proof-schema— the content-addressed goal (blake3(statement‖0x00‖context)), the cheapest-first tier ladder, the honest energy model (HwShunt/ModelBased/Estimatorwith the coupling enforced),SpecGrounding, the verdict, and theSolvertrait every backend implements. Canonical det-CBOR content addressing.proof-solvers— two real rungs, their energy modeled from measured wall time (ModelBased, a ~15 W power model — not a hardware reading): a propositional decider (T0) that parses a boolean goal and decides validity by truth-table in process, andz3(T1) — shell or kept resident across goals — that decides an SMT-LIB goal (assert the negation;unsat⇒ valid). Each refuses rather than fakes, so the router escalates. The model rungs (T2/T3) are honest stand-ins behind the same trait.proof-cascade— the escalation router (every joule accounted,wasted_ujdisclosed), the content-addressed proof cache (the energy flywheel, durable as line-delimited JSON), batch energy accounting against a frontier-only baseline with the per-tier Amdahl breakdown, and a real hardware energy meter (meter— theHwShuntbackend): it runs a real proof on every spare core and returns its measured microjoules from the first live source — on macOS this process's own CPU energy counter (proc_pid_rusage'sri_energy_nj, public API, no privilege), read before the workers start and after they are joined, so other processes are excluded by construction and no idle baseline is subtracted; else IOReport's Energy Model, read directly through its C API on Apple Silicon and bracketed against idle; on Linux RAPL's package counters, bracketed against idle — so the headlinejoules per verified proofcan be a real reading, not only a model. A vendor or kernel counter's reading is gradedHwShuntonly while the counter is live for the domain it claims (SPEC.md§5), and the meter checks that before it meters anything, by one rule for every source (the counter keeps advancing in at least 5 sample intervals, at least 4 of every 5, over at least 300 ms while the probe burns CPU): the process counter itself, every IOReport CPU energy rail the figure sums (CPU Energy, or each die'sDIE_<n>_CPU Energy), every RAPL package counter the figure sums (psysis neither summed nor probed). Each figure carries its domain: the process counter's is this process's CPU energy only — not other processes, child processes, GPU, ANE or DRAM. Returns nothing where no source is live — the caller keeps the honestly-taggedModelBasedfigure rather than inventing one.proof-receipt— theproof/1JCR-1 receipt: canonical det-CBOR + COSE_Sign1/EdDSA, vendored byte-compatible with the family's cross-language verifiers; refuses to seal an unproved goal.proof-conformance— C1–C5 + a negative pack, all checks real, published vectors inconformance/v1/.proof-cli— theproofreference demo: a proof workload reporting joules-per-proof against a frontier-only baseline — like for like, charged only for the goals the cascade proved, with the all-goals figure and its goal count beside it — the Amdahl breakdown, the cache flywheel, and a sealed + verified receipt.proof --measureadds a real hardware reading of a non-trivial T0 proof (HwShunt) where the meter produces one, and prints which source metered it, its domain, and why each other source was not used; that needs a counter the meter has seen to be live. On the Macs measured so far (macOS 27.0.1, an M5 Max and an M3 Ultra) IOReport's CPU energy rail is frozen for an unprivileged reader, but this process's CPU energy counter is live, so--measuremeters with it; the receipt still seals the cascade's ownModelBasedfigure for the first goal. On Linux, RAPL'senergy_ujis root-only on current kernels.
cargo test --workspace green; cargo clippy --workspace --all-targets is
warning-free for Linux, and on macOS reports two lints in proof-cascade's
IOReport FFI. The two bottom rungs decide for real, with energy modeled from
wall time; the model rungs are honestly marked as stand-ins until inference
backends are wired.
Honesty the standard records
- A proof is not a specification.
spec_groundingrides in the signed receipt;Ungroundedis the default and a prover may never self-certify it. - The multiple shrinks with difficulty. The accounting reports energy per closing tier, so the few hardest goals dominating the joules (Amdahl) is visible, not averaged away.
- Energy is reported at all — per proof, with an honest provenance tag — which the field otherwise leaves to be inferred from device-days.