jcp: energy traceability across operation, activity and outcome #138
Loading…
Reference in a new issue
No description provided.
Delete branch "efficiency/energy-trace"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
§5 graded a figure and said how much of the work it covered. It never said which level the figure belonged to — and a deployed system is answerable at three that are not interchangeable:
jcp/2work receiptefficiency/1Those three were joined by nothing.
efficiency/1identifies its unit of work by aString, so the level where the number is most load-bearing was the level with no binding at all. And AR-1 carries exactly one energy figure, in binding 3: work — so authorising, attesting, verifying and pushing bytes off the device cost joules no receipt anywhere claimed.Egresscounts bytes and no joules.Conservation, with the residual named
An outcome now names its activities by content-id, so a verifier re-adds the figures itself, and the difference is a named signed residual in exact integer µJ — the cost of being accountable, not a remainder that vanishes. Mirrors
eoc-carbon's allocation discipline. Negative is a finding. A double-bound activity is refused before the sum, because counting it twice shrinks the residual in the one direction that flatters. Provenance and coverage take the floor: aggregation must not be where a grade improves.Dynamism — because a scalar distinguishes nothing
A total cannot tell a throttled part from a contended host from a cold cache, and on unprofiled silicon it cannot say what normal was. Energy is carried as a series, graded per window since counters do not have uniform resolution.
OperationalCausecarries a content-id for the reading behind it. Otherwise anything inconvenient gets labelledThermalThrottleand disappears.There is no
Maliciousvariant, and that absence is the most important line in the module. Energy does not carry intent. A type offering that arm would have it used — something mapsUnexplainedonto it, a dashboard colours it red, and a figure with no evidential basis starts informing decisions about people.Partitioncounts and produces no score: unexplained, inapplicable and unresolvable mean look at this, we have no yardstick, and we could not have seen it.Why fractions of a percent are detectable
Integer µJ and exact sums make the floor arithmetic, not statistical: against a grant of N µJ the smallest representable discrepancy is
1_000_000/Nppm — on a one-joule grant, 1 ppm. A fractional-percent drift sits three orders above it.This does not survive the usual construction, which is the point. Where energy is derived from a performance proxy — utilisation × TDP, tokens × a coefficient, instructions × pJ/op — model error is tens of percent and a fractional-percent drift is invisible by construction, inside the error bar of the estimator that produced it. Deriving energy from performance does not merely lose accuracy; it destroys the ability to notice the books do not balance. So
floor_is_physical()reports whether the quoted floor rests on a measurement or a model's opinion.What can and cannot be faked
The joules were spent. The measurement is as forgeable as any report — a counter lied about, a figure fabricated,
HwShuntstamped on a number from nowhere. What energy has that a synthetic unit does not is an external referent: a token count can be any number at all; a joule count is bounded by the part's envelope and the window's duration.PowerEnveloperefutes a figure above what the part could draw, or below what a powered executing part must — the second being the shape a frozen counter takes, which is why §5's liveness rule exists. Bounds are deliberately permissive so a refutation is unassailable. There is noVerifiedarm: a fabricated figure inside the envelope passes, and must.The one thing that cannot be faked is how the energy was consumed. A part cannot draw the profile of one computation while performing another. That closes the hole conservation leaves: a total can be balanced by padding, but a fictional operation contributes no draw, so the character stops matching the declared mix.
Character is also what survives unfamiliar hardware — magnitudes move with the node and memory hierarchy (which is why band baselines fail there), while flat stays flat and a ramp stays a ramp on any part.
DrawShapemust be declared in advance; classifying first and deciding afterwards is post-hoc pattern matching. An inconsistency refutes the declaration, and names no cause and no intent.Verification
43 tests in
jcp-efficiency(24 new); 54 test binaries green acrossjcp-rs.jouledeskpath-depends onjcp-efficiencyfrom another workspace, which--workspacehere never builds — checked separately and unaffected. SPEC.md gains §5.3–5.6.🤖 Generated with Claude Code