open-standards/sandbox/spec
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Transaction Science 48372367aa
All checks were successful
standards workspaces build + test / which workspaces this change touches (pull_request) Successful in 7s
standards workspaces build + test / proof-rs (proof/conformance/v1/joulespec.toml, proof-conformance, proof/proof-rs, proof-rs, linux, true) (pull_request) Successful in 1m1s
standards workspaces build + test / joule-ui-rs (joule-ui/joule-ui-rs, joule-ui-rs, linux) (pull_request) Successful in 1m25s
standards workspaces build + test / sandbox-rs (sandbox-conformance, sandbox/sandbox-rs, -p sandbox-tee --features amd-kds,intel-pcs, sandbox-rs, linux) (pull_request) Successful in 1m37s
standards workspaces build + test / jcp-rs (jcp-conformance, jcp/jcp-rs, -p jcp-energy --features nvml, jcp-rs, linux) (pull_request) Successful in 1m46s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (pull_request) Successful in 3m21s
standards workspaces build + test / jouledesk-rs (jouledesk/jouledesk-rs, jouledesk-rs, macos) (pull_request) Successful in 7m1s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 12m16s
standards workspaces build + test / joulecontract-rs (joulecontract/joulecontract-rs, joulecontract-rs, linux-arm64, true) (pull_request) Successful in 1m15s
standards workspaces build + test / joule-code-rs (joule-code/joule-code-rs, joule-code-rs, linux-arm64, true) (pull_request) Successful in 7m28s
sandbox §13.2: what an executed interval proves about waiting
§13 prices the wait a run spends parked. It says nothing about the wait a run
spends *running*, which is usually the larger number. An interval that dispatches
an outward call and then sits until the result arrives holds its sandbox, and its
receipt charges the sitting as computation. A twenty-minute build, a review that
comes back the next morning, an approval that never comes — each is, in a
blocking runtime, an interval whose receipt is mostly waiting. Two runs doing
identical work bill hours apart, and the record reported both the same way.

So an executed segment may now carry a `CallAccount`: the calls it dispatched
and the results it resolved, each by call id.

A run is **non-blocking** when every executed interval accounts, and every
interval resolves only calls that were outstanding before it began. An interval
that resolves a call it dispatched itself did not hand off and return — it
waited, and the wait is inside its receipt. `RunRecord::wait_proof()` walks the
segments in order holding the outstanding set and returns one of:

- `NonBlocking` — no receipt in the run contains a wait for an outward call, so
  the run's whole cost of waiting is the idle energy §13 already records, and
  which §13.1 makes small for a transcript park. This is the condition under
  which "waiting costs no computation" is a statement about the record rather
  than about the runtime that produced it.
- `Blocked { segment }` — that interval consumed its own dispatch.
- `Malformed { segment }` — the account does not add up: a result answering a
  call never dispatched, a call resolved twice, or one id dispatched twice. A
  record that cannot be read is a different problem from a run that waited, and
  is reported separately.
- `Unproved` — some interval did not account, or the run has no accounted
  interval at all.

Two deliberate pieces of honesty

**An absent account is not an empty one.** Not accounting and accounting for no
calls are different statements, and they do not fold to the same bytes — a test
and a conformance check both hold that, so the marker is not merely a comment.

**A property of no intervals is not a property.** A run with nothing accounted
returns `Unproved`, not `NonBlocking`. Without that, every empty record would
certify the strongest claim in the section.

Backwards compatibility, checked rather than asserted

`calls` is `Option`, `serde(default, skip_serializing_if)`, and folded into the
chain only when present, so an interval recorded by `record_execution` hashes
exactly as it did before — pinned by a test against bytes written out by hand.
The committed vector confirms it: `durable.json` diffs as one added line and no
changed line, so `expect_runrecord_head` and `expect_transcript_head` are
unchanged, and the accounted trace gets its own address at
`b3:FINebhSRpv_1ncmpE3PaRG85MR8Ri1fDy4lmR1yI2DA`. That trace is the transcript
one with the account added and nothing else changed, so an implementation that
dropped the account would produce the transcript head where this one is
expected. Each id set is length-prefixed, so no id boundary is ambiguous.

Conformance class C15, and the pack's deliberate class count moves 14 → 15.

Evidence, on the build host: clippy `-D warnings` clean over the workspace, the
workspace's tests pass, and the full pack reports all 15 classes passed with no
skips. `cargo fmt` was not run: these workspaces are not rustfmt-clean.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-11-02 13:37:56 -05:00
..
attestation.md sandbox: one report_data binding for a run, a relying-party challenge, and evidence a third party can verify 2026-10-21 07:41:40 -04:00
build.md
capabilities.md sandbox: flow across a run's checkpoints — an untrusted read closes the sinks that follow 2026-10-21 10:49:52 -04:00
conformance.md sandbox §13.2: what an executed interval proves about waiting 2026-11-02 13:37:56 -05:00
durable-runs.md sandbox §13.2: what an executed interval proves about waiting 2026-11-02 13:37:56 -05:00
eat.md sandbox: one report_data binding for a run, a relying-party challenge, and evidence a third party can verify 2026-10-21 07:41:40 -04:00
environment-manifest.md sandbox: a manifest is pinned only when its image AND every feature are digest-addressed 2026-10-15 20:50:37 -04:00
mcp.md
receipts.md sandbox-exec-microvm, sandbox-exec-wasm, sandbox-meter: grade nominal-cost figures Estimator 2026-10-11 10:11:54 -04:00
tiers.md