| Filename | Latest commit message | Latest commit date |
|---|---|---|
Every sealed interaction now names the principal that fired it. The actor is a required field on Interaction, a required argument to run_interaction, and is bound into the signed canonical core — so an interaction can no longer be attributed to a different principal without breaking the chain. Human and agent are traced identically (a did:key either way); the standard draws no distinction. An unauthenticated host attributes fires to its own session principal — joule-ui-serve defaults this to the host's own did:key (derived from its signing key) and exposes with_session_actor for deployments that authenticate the caller. The canonical-core profile tag is bumped joule-ui/interaction/1 -> /2, since the actor is now part of the signed preimage; the two cores are distinct bytes and never collide. SPEC §7.1 + C2/C3 updated, conformance v1 vectors regenerated, examples and the conformance harness pass an actor. Co-Authored-By: Claude Opus 4.8 <[email protected]> |
||
| .. | ||
| v1 | ||
| README.md | ||
joule-ui conformance vectors — v1
Deterministic vectors for independent joule-ui implementations (SPEC §8). Regenerate with:
cargo run -p joule-ui-conformance --bin gen_vectors
A conforming implementation reproduces these from the published JSON alone —
that is what makes joule-ui a vendor-neutral standard rather than one library's
behaviour. Fixed Ed25519 steward key (0x17×32, published, attests nothing) and
fixed meter steps make every vector reproducible.
| Vector | Class | What a conformant implementation must do |
|---|---|---|
c1-validation.json |
C1 — surface validation | Run validate(tree, registry) over both surfaces. The valid one yields no errors; the invalid one yields the exhaustive list (every planted fault — unknown widget, missing required prop, mistyped prop, forbidden child — not just the first). |
c2-interaction.json |
C2 — interaction metering | run_interaction over a deterministic meter (step 4200 µJ) reproduces the Interaction: allow, energy 4200 µJ [HwShunt], and the content addresses of surface, inputs, and outputs. The surface id is the BLAKE3 of the canonical valid_surface JSON; inputs/outputs are content-addressed, never embedded. |
c3-authorization.json |
C3 — authorization | A zero-budget Authorizer denies the action before the handler runs: expected_handler_ran is false, the verdict is deny("budget-exceeded"), and the outputs are the genesis sentinel. A conformant runtime MUST NOT execute a denied action's handler. |
c4-chain.json |
C4 — chain integrity | verify_chain accepts the three-link chain (allow, allow, deny). Removing index 1 MUST break it at index 1: every signature verifies, seq increments from zero, and each link's prev is the prior link's content id, so no interaction can be excised, reordered, or mutated without detection. |
MANIFEST.json |
— | Verify each vector's BLAKE3 content address before relying on it. |
What conformance pins, and what it does not
joule-ui pins the protocol and the receipt, not the product surfaces around
them. There is no renderer vector (the renderer is the host's), no transport
vector (the consumer's — MCP/SSE/Web MoQ), and no widget-library vector (product
surface). The metering and capability mechanisms are recognized edges (SPEC
§9): C2/C3/C4 use a deterministic stub meter and a stub budget so the vectors are
reproducible, while a deployment wires the Sandbox PowerMeter (real hardware)
and a JCP grant. What conformance guarantees is the load-bearing claim — that an
interaction is validated, authorized-before-running, metered, and sealed into a
tamper-evident chain, identically across implementations.