open-standards/joule-ui/conformance/v1/c4-chain.json
Transaction Science 079fabafe8 joule-ui: make the interaction actor mandatory (SPEC /2)
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]>
2026-06-12 22:19:18 -04:00

367 lines
No EOL
6.2 KiB
JSON

{
"chain": [
{
"interaction": {
"action": "apply",
"actor": "did:key:z6MkConformanceActor",
"budget_remaining_uj": 4800,
"energy": {
"estimated_uj": 4200,
"measured_uj": 4200,
"provenance": "HwShunt"
},
"grant_id": "did:web:conformance#grant",
"inputs": "b3:e1e0e81d6ea39b0cf8b86ffd440921011f57400cbc3f76a8a171906a9b8d7505",
"outputs": "b3:e1e0e81d6ea39b0cf8b86ffd440921011f57400cbc3f76a8a171906a9b8d7505",
"surface": "b3:ddf8a971aaeefc840592a98d0018812a4092630ed642c257bff68db3dd882ad7",
"verdict": "Allow"
},
"prev": "b3:0000000000000000000000000000000000000000000000000000000000000000",
"seq": 0,
"signature": [
63,
152,
219,
199,
37,
117,
214,
234,
169,
226,
190,
79,
133,
114,
184,
109,
10,
63,
179,
121,
136,
125,
28,
139,
111,
5,
31,
47,
161,
55,
234,
177,
79,
191,
198,
161,
196,
108,
75,
9,
45,
112,
84,
248,
67,
21,
180,
111,
54,
188,
71,
72,
206,
56,
31,
127,
5,
131,
126,
98,
99,
1,
166,
1
],
"signer": [
49,
222,
190,
85,
211,
124,
114,
39,
104,
177,
55,
19,
28,
170,
96,
135,
8,
11,
46,
11,
96,
185,
75,
215,
133,
209,
69,
117,
207,
164,
152,
188
]
},
{
"interaction": {
"action": "apply",
"actor": "did:key:z6MkConformanceActor",
"budget_remaining_uj": 600,
"energy": {
"estimated_uj": 4200,
"measured_uj": 4200,
"provenance": "HwShunt"
},
"grant_id": "did:web:conformance#grant",
"inputs": "b3:1c310b6bdadd69991cd4e5dbef96c2638536c32b534e3ed64785846bfcebd206",
"outputs": "b3:1c310b6bdadd69991cd4e5dbef96c2638536c32b534e3ed64785846bfcebd206",
"surface": "b3:ddf8a971aaeefc840592a98d0018812a4092630ed642c257bff68db3dd882ad7",
"verdict": "Allow"
},
"prev": "b3:c99cb45b15f754a62abe38a20740392726514c96b2addcd4059b898c6a4439b3",
"seq": 1,
"signature": [
62,
70,
199,
98,
221,
116,
35,
79,
166,
249,
32,
136,
197,
126,
140,
203,
166,
14,
144,
182,
18,
53,
50,
76,
68,
125,
60,
125,
106,
81,
30,
77,
36,
10,
196,
107,
40,
19,
80,
153,
211,
165,
63,
25,
4,
89,
120,
74,
237,
79,
96,
83,
241,
129,
62,
86,
189,
26,
223,
172,
223,
152,
138,
1
],
"signer": [
49,
222,
190,
85,
211,
124,
114,
39,
104,
177,
55,
19,
28,
170,
96,
135,
8,
11,
46,
11,
96,
185,
75,
215,
133,
209,
69,
117,
207,
164,
152,
188
]
},
{
"interaction": {
"action": "apply",
"actor": "did:key:z6MkConformanceActor",
"budget_remaining_uj": 0,
"energy": {
"estimated_uj": 0,
"measured_uj": null,
"provenance": "Estimator"
},
"grant_id": "did:web:conformance#grant",
"inputs": "b3:7219aa1099ced7445c5bf949990ff7d9f6b71a94b8ec02b3eb61fb175a66ba25",
"outputs": "b3:0000000000000000000000000000000000000000000000000000000000000000",
"surface": "b3:ddf8a971aaeefc840592a98d0018812a4092630ed642c257bff68db3dd882ad7",
"verdict": {
"Deny": "budget-exceeded"
}
},
"prev": "b3:e9b362d702a439919b01ac5a73ff356f9ca411187bf106ea2aee8aeb84095c0a",
"seq": 2,
"signature": [
29,
23,
135,
238,
67,
124,
215,
59,
134,
11,
202,
57,
244,
142,
82,
180,
255,
231,
175,
20,
6,
4,
146,
76,
25,
56,
143,
114,
80,
23,
205,
87,
53,
53,
169,
188,
90,
149,
12,
184,
154,
56,
243,
194,
127,
75,
163,
47,
106,
29,
17,
51,
245,
67,
147,
240,
252,
228,
144,
222,
198,
95,
2,
5
],
"signer": [
49,
222,
190,
85,
211,
124,
114,
39,
104,
177,
55,
19,
28,
170,
96,
135,
8,
11,
46,
11,
96,
185,
75,
215,
133,
209,
69,
117,
207,
164,
152,
188
]
}
],
"expected_excise_index_1_breaks_at": 1,
"expected_verify_ok_count": 3,
"note": "C4 — a sealed three-link chain (allow, allow, deny). verify_chain accepts it; removing index 1 breaks it at index 1. Steward key = 0x17*32 (published; attests nothing).",
"steward_verifying_key_hex": "31debe55d37c722768b137131caa6087080b2e0b60b94bd785d14575cfa498bc"
}