agent-action-capsule 0.4.1

Agent Action Capsule reference verification: RFC 8785 canonicalization and capsule_id, the Class 1 record checks, Producer Envelopes, and Evidence Bundles.
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
# Registries of record — Agent Action Capsule vocabularies

**Status.** This document is the **interim registry of record** for the
extensible vocabularies of the Agent Action Capsule profile, until RFC
publication establishes the corresponding IANA registries. The registries and
their normative definitions are in the Internet-Draft
(`draft-mih-scitt-agent-action-capsule`, this repository's `spec/`), §12 (IANA
Considerations). Registration policy: **Specification Required** per
[RFC 8126 §4.6]. Change controller: **Action State Group, Inc.** (interim) →
**IETF** on publication.

**The never-reject invariant.** Verifiers MUST treat unregistered values as
informational and MUST NOT reject a record solely because it carries an
unregistered value. The digest commits whatever bytes are present; an unknown
value breaks only semantic interpretation, never digest verification.

**Descriptive, not generative.** The registry text is DESCRIPTIVE of the
vocabulary defined normatively in the Internet-Draft; it never generates new
semantics. A registration records a value and its specification — it does not
amend the format.

This record applies only to Capsules conforming to the base profile's format-4
requirements. A registry entry cannot make a pre-format-4 Capsule or any other
unsupported canonicalization declaration conforming or verifiable.

[RFC 8126 §4.6]: https://www.rfc-editor.org/rfc/rfc8126#section-4.6

## Designated-expert guidance (all registries)

A designated expert evaluating a registration applies three tests:

1. **Clear semantics** — two independent implementations would apply the value
   identically.
2. **No overlap** with existing values.
3. **Publicly available spec** documenting the value.

The Specification Required policy answers a specific threat: a vocabulary value
whose meaning is defined only inside a closed product would make two verifiers
disagree on what the value means. The publicly-available-spec requirement is the
mitigation — a value enters the shared vocabulary only once its semantics are
pinned in a specification any implementer can read (Internet-Draft §12).

**Worked example — rejected registration.** `ready` (proposed as a disposition
value) — REJECTED: `ready` is a derived state computed from the chain (an open
item whose constraints are all satisfied), not a verdict the gate issued.
Derived states are never registry values; registering one would let a capsule
assert a state that only the store can compute.

---

## 1. `verdict_class`

Defined in §5.4.1 of the Internet-Draft (the `verdict_class` vocabulary).
Initial contents:

| Value | Semantics |
|---|---|
| `executed` | The action ran (effect_mode confirmed \| dispatched_unconfirmed). |
| `blocked` | A blocking constraint stopped it pre-dispatch. |
| `hitl_dispatched` | Routed to an operator; awaiting resolution. |
| `denied` | Operator/policy refused pre-dispatch. |
| `timeout` | Timed out (pre-dispatch: not_applicable; post: dispatched_unconfirmed). |
| `errored` | Ran and threw; final state unknown (dispatched_unconfirmed). |
| `engine_failure` | The engine could not evaluate (pre-dispatch). |
| `deferred` | A human elected to postpone the decision; open item. |
| `needs_decision` | Evaluation complete, decision required, not yet routed to a decider; open item. |
| `expired` | TTL policy on the deferral elapsed; terminal unless superseded by escalation. |
| `escalated` | Expiry or policy routed the item to a higher authority; open item at the new authority. |
| `resolved` | A terminal decision capsule closed the chain without executing (pairing rule, Internet-Draft §5.4.2). |
| `epoch_boundary` | An administrative capsule (`action_type: "fyi"`) marking a configuration-epoch transition. REQUIRES `effect_mode: "not_applicable"` — no effect is dispatched by an administrative epoch record. Defined in §5.1 (Configuration epochs) of the Internet-Draft. |

**`deferred` token ownership.** The `deferred` token's semantics are OWNED by
the `verdict_class` registry; the `disposition.decision` entry of the same
spelling (§2) is a cross-reference to it.

## 2. `disposition.decision`

Defined in §5.4 of the Internet-Draft (Disposition).
Initial contents: `accept`, `reject`, `needs_input`, `deferred`.

**`deferred` token ownership.** The `deferred` token's semantics are OWNED by
the `verdict_class` registry (§1); this `disposition.decision` entry is a
cross-reference to it.

## 3. `effect.type`

Defined in §5.2 of the Internet-Draft (Effect Record and the confirmed-effect
binding). Initial contents:

| Value | Semantics |
|---|---|
| `write_order` | Seeded example value of the profile (Internet-Draft §5.2). |
| `send_payment` | Seeded example value of the profile (Internet-Draft §5.2). |
| `inference_completion` | An inference request to a model-serving runtime whose committed effect is producing a completion. `request_digest` is the JSON digest of the request body as received at the serving boundary; `response_digest` is the JSON digest of the completion body as returned. |

## 4. `irreversibility_class`

Defined in §5.2 of the Internet-Draft (Effect Record). An **ordered**
vocabulary by ascending consequence; a registration MUST state its position in
the consequence order relative to the existing values. Initial contents, in
order:

1. `two_way`
2. `one_way_recoverable`
3. `one_way_consequential`
4. `one_way_terminal`

## 5. `effect_attestation`

Defined in §5.2 of the Internet-Draft (Effect Record; the validity matrix).

**Grade-floor rule (registry preamble).** Consumers MUST treat an unregistered
or unrecognized `effect_attestation` value as **no stronger than
`runtime_claimed`**. The never-reject invariant holds — unknown values are
informational, never a verification failure — but unknown NEVER grades up.

**Planned carve (registry preamble).** `effect.status = "planned"` asserts no
execution — `effect_attestation` MUST be absent (nothing to grade; a phantom
grade would poison grade-based queries); it becomes REQUIRED the moment
dispatch occurs (Internet-Draft §5.2).

Initial contents:

| Value | Semantics |
|---|---|
| `gate_executed` | The commit transited the gate; the engine observed the effect boundary directly. |
| `runtime_claimed` | The gate issued a verdict only; the executing runtime asserted completion; the capsule records that claim, not an observation. |
| `host_served_observed` | The serving host's runtime reported the completion (its request and response digests) through the host's lifecycle channel; the producer observed that report, not the effect boundary itself. **Grade: equal to `runtime_claimed`** — it records a runtime's report of completion, never a gate observation, so it never grades above `runtime_claimed`. |

**Grade order.** `gate_executed` is the stronger grade; `runtime_claimed` and
`host_served_observed` are equal in grade to each other and below
`gate_executed`. Registering `host_served_observed` changes no grading: the
grade-floor rule above already treated it, while unregistered, as no stronger
than `runtime_claimed`.

**Designated-expert guidance (this registry).** Plausible future registrations
exist and are deliberately NOT seeded here — e.g. independent sensor
confirmation of a claimed effect, or hardware/TEE-anchored execution. A
registration MUST state where its grade sits relative to the seeded values.

## 6. `chain.relation`

Defined in §5.5.4 of the Internet-Draft (Chained Capsules; the chain block).
Initial contents:

| Value | Semantics |
|---|---|
| `follows` | Non-terminal: a bare next-link — this capsule appends to the producer's stream after the parent and asserts no outcome, observation, or transition over it; the parent's open state is unaffected. The default relation for an ordinary sequential record, including a record whose substance lies in its own fields or its `references[]` citations rather than in any claim about the parent (e.g. a counterparty-half custody record citing a foreign half via `citation_purpose: counterparty_half`, §11). **Verifier consequence:** verifiers and downstream evidence evaluators MUST NOT read a `follows` link as confirming, superseding, or otherwise grading the parent — it is ordering only. |
| `confirms` | Non-terminal: this capsule observes or records the outcome of the parent — the parent's open state remains. The most common chain link: *attempted → confirmed*. |
| `supersedes` | Terminal transition over the parent — resolution, expiry, escalation close/replace the parent's open state. |
| `epoch_opens` | Non-terminal: this capsule opens a new operational configuration epoch. The chain parent MUST be the last capsule produced under the prior epoch. The opening capsule carries the new `epoch_id`. Defined in §5.1 (Configuration epochs, Epoch-boundary Capsules) of the Internet-Draft. |
| `duplicates` | Non-terminal: this capsule is a backfilled import of the same logical event already recorded by the parent, a contemporaneous capsule in this producer's own stream. Defined in the Internet-Draft's Provenance mode section (`-05` and later revisions). A `duplicates`-linked pair is counted once by verifiers and downstream evidence evaluators; the contemporaneous parent's assurance and disposition govern. |

**Designated-expert guidance (this registry).** Seeded with the bare ordering
link (`follows`), the core non-terminal and terminal relations, plus
`epoch_opens` for configuration-epoch boundaries and `duplicates`
for backfilled-record deduplication. Additional
non-terminal relations — deposit-toward-open and effort-toward-open relations,
or `amends` / `contradicts` — are expected future registrations, each admitted
once its semantics and any verifier consequence are pinned in a publicly
available specification. Such relations are anticipated in a future revision of
the Internet-Draft and are registered into this same registry rather than
establishing a new one.

**Deployed legacy alias — `sequence`.** The reference implementation's adapter
tier (tool-wrapping integrations) has emitted `sequence` as its default
next-link relation with the same bare-ordering intent as `follows`. The
Internet-Draft distinguishes no relation vocabulary by producer tier, so
`sequence` is NOT registered as a separate value: `follows` is the registered
form, and `sequence` is a deployed legacy alias slated for migration to
`follows`. A verifier encountering `sequence` handles it under the never-reject
invariant like any unregistered value — an informational finding, never a
rejection — and producers SHOULD emit the registered `follows`.

**Deployed legacy aliases — `resolves`, `escalates`, `adjudicates`,
`assesses` (noted 2026-10-04).** Earlier releases of a deployed producer
(capsule-emit, before its PRs #276 and #277) wrote these four tokens as
`chain.relation` values before any of them was registered. None is registered
as a separate value, and none is to be emitted: they are read-only legacy
spellings found in records already written, and producers MUST emit the
registered value instead. A verifier encountering one handles it under the
never-reject invariant like any unregistered value — an informational finding,
never a rejection — and MAY report it as the registered value it meant:

- `resolves` → `supersedes`. An approval or denial closing a blocked capsule's
  open state; terminal. That producer now emits `supersedes` (#276).
- `escalates` → `supersedes`. An escalation closing or replacing the parent's
  open state; terminal, as listed under `supersedes` above. Now emitted as
  `supersedes` (#277).
- `adjudicates` → `confirms`. A comparison verdict that observes the compared
  record and leaves its open state as it was; non-terminal. Now emitted as
  `confirms` (#277). This legacy `chain.relation` spelling is unrelated to the
  `adjudicates` link type in the Evidence Layer link type registry (§18): the
  two share a token across different axes, and neither defines the other. The
  §18 registration does not make `adjudicates` a registered `chain.relation`
  value.
- `assesses` → `confirms`. A judge's verdict citing its subject; an
  observation of the subject, non-terminal. Now emitted as `confirms` (#277).

## 7. Reserved payload members — selective disclosure

Reserved by the companion Internet-Draft
`draft-mih-scitt-agent-action-capsule-sel-disc` (Selective Disclosure
Profile), §9 (IANA Considerations). These members carry the salted-hash
selective-disclosure structure and MUST NOT be used for any other purpose. They use
the underscore-prefixed naming convention (following SD-JWT (RFC 9901)) to avoid
collision with current or future Capsule payload members.

| Member | Type | Location | Defined in |
|---|---|---|---|
| `_sd_alg` | string | Top-level Capsule object | Selective-Disclosure profile, "Algorithm Identifier" section (`"sha-256"` only) |
| `_sd` | array of string | Any SD-eligible JSON object | Selective-Disclosure profile, "Salted-Hash Commitment Construction" section (commitment digests) |

A plain (non-SD) Capsule carries neither member. The `_sd`/`_sd_alg` structure is
part of the content-addressed form, so it is covered by `capsule_id` and is
tamper-evident; a verifier unaware of the SD profile processes an SD-Capsule as a
plain Capsule and sees the concealed REQUIRED fields as missing. See the companion
draft for producer requirements, the eligible-field set, and the two-phase
verifier checks.

## 8. `domain`

Defined in §5.1 of Internet-Draft `-02` (`domain` / `provenance` addendum). The
capsule's epistemic role — what kind of act this capsule records. **Optional**;
absent implies the receiver SHOULD treat the capsule as `"action"`.

| Value | Semantics |
|---|---|
| `action` | A tool call, side-effecting step, or any act that could in principle be confirmed against an external system. The most common value; applies to all capsules where the agent *did something*. |
| `memory` | A write-to or read-from a persistent memory store (retrieval, consolidation, eviction). |
| `reasoning` | A STANDALONE reasoning / chain-of-thought step that is itself the recorded act — not an action-with-reasoning (those stay `"action"`). A reasoning capsule typically carries no `effect`. |

**Extension convention.** Values with an `x-` prefix are reserved for private
experiments and MUST NOT be submitted for registration. A public extension MUST
have a publicly available specification (Specification Required, §12).

## 9. `provenance`

Defined in §5.1 of Internet-Draft `-02` (`domain` / `provenance` addendum). A
dedup rank signal: when the same logical event produces capsules from multiple
tiers, the higher-ranked provenance is authoritative. **Optional**; absent
implies receivers SHOULD treat the capsule as `"runtime"`. Rank order is
strictly gate > runtime > collector; equal rank resolves by earliest timestamp.

| Value | Rank | Semantics |
|---|---|---|
| `gate` | 3 | Emitted at the gate / policy-enforcement boundary. The most authoritative form: the capsule was produced at the point where the decision was made and committed. |
| `runtime` | 2 | Emitted by the executing runtime (agent framework, tool adapter). Authoritative for the execution record but cannot see the gate's internal decision details. |
| `collector` | 1 | Emitted by a general observability or telemetry system that observed the action passively. Lowest authority; used when neither the gate nor the runtime directly produce capsules. |

**Dedup rule (verifier / ledger-reader, NOT wire).** On dedup, the capsule with
the highest-ranked `provenance` wins; equal rank resolves by earliest timestamp.
The dedup rule is a consumer-side read algorithm, not a wire constraint — a
collector-provenance capsule is still valid; it loses only when a higher-ranked
capsule for the same event is also present.

## 10. Reserved wrapper members and disclosable fields — disclosure envelope

Reserved by the companion Internet-Draft
`draft-mih-agent-disclosure-envelope` (Disclosure
Envelope Profile), §8 (IANA Considerations). `capsule` and `disclosures`
are wrapper-level member names — never Capsule payload members — used only
by a Disclosure Envelope, the out-of-band structure a producer builds
around an unmodified, already-sealed Capsule to reveal the raw content
behind a digest-only field without altering `capsule_id`.

| Member | Type | Location | Defined in |
|---|---|---|---|
| `capsule` | object | Top-level Disclosure Envelope object | Disclosure Envelope profile, "Envelope Object" section (the unmodified Capsule payload) |
| `disclosures` | object | Top-level Disclosure Envelope object | Disclosure Envelope profile, "Envelope Object" section (OPTIONAL; absent members are WITHHELD) |

The disclosure-eligible fields this initial revision defines. This table is a
**Specification Required** registry:

| `disclosures` member | Committed-digest field (in `capsule.model_attestation.compute_attestation`) |
|---|---|
| `agent_input` | `agent_input_digest` |
| `agent_output` | `agent_output_digest` |

A `disclosures` member outside this table is non-conforming; a verifier
treats it as an unrecognized member rather than attempting to verify it.
An extension MUST add a digest-only Capsule field, register the member-to-
committed-digest-field pair, add format-4 vectors and increment their vector
version, and require producers to retain the original value for revelation.
This registry is currently limited to fields directly under
`capsule.model_attestation.compute_attestation`; widening it requires generic
path resolution in every implementation. The disclosure unit is the whole
registered member. CPB's salted-commitment mechanism, not this envelope,
governs selective disclosure of a sub-field. `capsule_id` is computed over
`capsule` alone and is unaffected by the presence or absence of any
`disclosures` member. See the companion draft for the full verifier checks
(digest recomputation and comparison).

### Provisional: `agent_input` presentation types

**Held for ratification; not yet registered.** The Disclosure Envelope draft
defines no presentation types. A presentation type names a JSON shape for a
value revealed as the `agent_input` member, and adds checks a verifier runs on
that value after DE-3 has matched it against `agent_input_digest`. It never
changes DE-1 through DE-3, the digest, or `capsule_id`. A value of no
registered type is checked by DE-3 alone. Conformance vectors:
`vectors/minimum-necessary/`.

| Discriminator | Value | Checks after a DE-3 match |
|---|---|---|
| `agent_input_version: "1"` | `{"agent_input_version": "1", "presentations": [<SD-JWT presentation>, ...]}`: the SD-JWT presentations (RFC 9901) the agent received, each an issuer-signed JWT followed by the Disclosures transmitted, exactly as transmitted. `agent_input_digest` is the JSON-DIGEST of this wrapper. | A checker verifying a revealed `agent_input` of this type MUST verify each SD-JWT inside it: (1) the issuer-signed JWT's signature against the JWK carried for its `iss` (in an Evidence Bundle, the `sd-jwt-issuers/v1` extension); (2) the digest of each Disclosure, under the JWT's `_sd_alg`, against its `_sd` array; and (3) the set of disclosed claim names against the `revealed` list for that presentation's `vct` in the policy decision bound to the Capsule (in an Evidence Bundle, the `disclosure-policy-decisions/v1` extension). Without a policy decision, check (3) is reported as not evaluated, never as passed. A failed check is a finding on that disclosure; a value that failed DE-3 is not checked and is never presented as confirmed. |

## 11. `citation_purpose`

Defined in the Internet-Draft's Cross-record references section (`-04` and
later revisions). Governs the `citation_purpose` field of a `references[]`
entry — a Capsule's citation of a record outside its own `chain` scope (a
different producer or stream). Distinct from, and never a repurposing of,
CPB's own `purpose` field on a typed digest reference
(scitt-payload-binding), which selects among an artifact type's registered
digest contexts.

| Value | Semantics |
|---|---|
| `acted_on` | The citing Capsule's action targeted, consumed, or was performed against the cited record's declared content. Not a custody claim. |
| `responds_to` | The citing Capsule addresses or answers the cited record without a same-stream chain relationship to it. |
| `ran_under` | The citing Capsule's action executed under the runtime environment and authority the cited record states — what ran, and under whose attestation. The cited record MAY be a different producer's (e.g. a hardware-attestation record from an attestation service). A grade the cited record carries for what it attests does not propagate to claims stated inside it. |
| `corroborates_source_time` | The citing Capsule's `references[]` entry cites, by digest, a signed or independently witnessed timestamp supporting a `provenance_mode` block's `source_asserted_at` claim. Defined in the Internet-Draft's Provenance mode section (`-05` and later revisions). The only citation this profile permits to raise `provenance_mode.time_rung` from `self_attested` to `witnessed`. |
| `counterparty_half` | The cited record is the counterparty's half of a two-party exchange, received and held by the citing node, which cites the counterparty's already-sealed Capsule by digest. How the citing node obtained and checked the cited half is outside this profile; the citation asserts custody of the cited record, not an observation of it. The citing node does NOT re-assert the cited half as its own observation — it records custody of an external half, never an action or outcome of its own. |
| `counterparty_inclusion` | The citing Capsule cites, by digest, a counterparty's inclusion proof and the checkpoint covering it — and that checkpoint's receipt when it is witnessed — for a counterparty half this node already holds under an earlier `counterparty_half` citation, one `references[]` entry per cited artifact. It exists because `log_coordinates` cannot be added to a Capsule after sealing, so inclusion evidence that arrives later is cited by a later record; the cited artifacts are stored as held artifacts, never entered into this node's chain. The citing Capsule chains to its own head via `follows` and never mutates the earlier `counterparty_half` citation: inclusion evidence is added by a new record, never by amending the custody record. |

**Boundary rule.** A citation to the producer's own same-stream `chain`
parent is never expressed via `references`/`citation_purpose`; a
`references` entry MUST NOT duplicate `chain.parent_capsule_id`. A
`counterparty_half` citation is compatible with this rule precisely because
it cites a FOREIGN half while the citing Capsule chains to its own LOCAL
head in `chain`: the two targets are different records, so nothing is
duplicated. The `chain.relation` to that local head remains the ordinary
same-stream link — `follows` when the record asserts nothing over that head
(§6, Internet-Draft `#hitl`); holding a foreign half is
carried entirely by the `references[]` entry and this `citation_purpose`,
never by minting a new `chain.relation` value (see the designated-expert
note below and §6).

**Designated-expert guidance (this registry).** `counterparty_half` is
registered here, on the citation axis, and deliberately NOT as a
`chain.relation` value (§6). The two axes answer different questions:
`chain.relation` describes the link to the citing Capsule's own same-stream
parent (§6), while a `citation_purpose` describes why the Capsule cites a
record outside that chain. Holding a counterparty's foreign half is a
citation, not a parent-link, so registering it as a `chain.relation` value
(for example a proposed `cites`) would conflate the two axes — the very
conflation the Internet-Draft's Cross-record references section forbids when
it states that a cross-stream citation "is a `references` entry with the
appropriate `citation_purpose`, not a new `chain.relation` value." The
record still carries an ordinary same-stream `chain.relation` to its own
head — `follows` when it makes no other claim over that head; the relation
asserts no outcome over the parent (§6), and the
custody-of-a-foreign-half meaning lives solely in this `citation_purpose`.
`counterparty_inclusion` follows the same discipline: later evidence about a
held half (its inclusion in the counterparty's log) is a further citation by
a later record, never an amendment of the record that first took custody.

## 12. `provenance_mode`

Defined in the Internet-Draft's Provenance mode section (`-05` and later
revisions). A MODE on the ordinary Capsule — never a distinct record type —
disambiguating a contemporaneous action record from a backfilled import of a
historical one. Distinct from, and never a repurposing of, the unrelated
top-level `provenance` member (§9 above, the `-02` dedup-rank signal): the
two names are deliberately different so that adding one never collides with
the other. **Optional**; absent implies `mode: "contemporaneous"`.

| `provenance_mode.mode` value | Semantics |
|---|---|
| `contemporaneous` | The default. The Capsule was produced close to when the action occurred; no import metadata is carried. |
| `backfilled` | The Capsule records an action that occurred before this Capsule was produced — a migration, reconciliation, or bulk historical import. REQUIRES `source_ref`, `source_asserted_at`, `import_batch`, and `imported_at` on the same block. |

`provenance_mode.mode` is a closed two-value enum, not itself
Specification-Required-governed (mirroring `assurance.attestation_mode`'s
treatment, Internet-Draft §5.3): an unrecognized `mode` value is a
structural failure, not an informational finding, because downstream
evidence-sufficiency logic depends on being able to tell the two modes
apart.

`provenance_mode.time_rung` (OPTIONAL; MUST be absent unless `mode` is
`"backfilled"`) is `self_attested` or `witnessed`, ordered
`self_attested` < `witnessed` for overclaim detection — the same
never-grades-up discipline as `attestation_mode` / `ledger_mode` /
`cross_party_rung`. Absent implies `self_attested`. A producer MUST NOT
claim `witnessed` without a `references[]` entry carrying
`citation_purpose: "corroborates_source_time"` (§11 above).

## 13. Evidence Bundle kind

Defined in `draft-mih-zhang-agent-disclosure-bundle`,
"Evidence Bundle Object". This is a **Specification Required** registry.
It identifies a neutral presentation and verification container, not a Capsule
payload type.

| Value | Semantics |
|---|---|
| `evidence-bundle/v2` | Version 2 AAC Evidence Bundle, with `bundle_version: "2"`. |

## 14. Evidence Bundle extension kind

Defined in `draft-mih-zhang-agent-disclosure-bundle`,
"Typed Extensions". This is a **Specification Required** registry. The
`extensions` object's member name is the registered kind. Its registered
specification defines that extension's block shape and semantic checks; the
neutral bundle core does not interpret it. A private `x-`-prefixed kind is not
registered.

| Value | Semantics |
|---|---|
| `producer-key/v1` | `{"public_key": "<64 lowercase hex>"}`: the declaring producer's Ed25519 public key, one key per block, defined in the Evidence Bundle draft (`-01` and later), "The producer-key/v1 Extension". Covered by the bundle digest like every extension. A verifier uses it only to classify a countersignature whose `signer.key_id` equals it as not independent (a self-countersignature). It can only downgrade an entry to not independent, never upgrade one, and it is not an identity or authority claim. A malformed block is ignored and does not fail the Bundle. |
| `composed/v1` | `{"members", "observers", "joins"?, "not_requested"?, "missing"?, "composed_digest"}`: a composition of several responders' Evidence Request outcomes, defined in the Evidence Bundle draft (`-01` and later), "The composed/v1 Extension". Each member records one responder's outcome (`artifact`, `refusal` or `absence`), the observer that produced it and its digest; each observer has a `role` and an opaque `custody_domain`; each join declares a linkage basis and a state (`agree`, `mismatch`, `unjoined` or `one_sided`) that a verifier re-derives. `composed_digest` is SHA-256 over the JCS form of the member, observer, join and `not_requested` declarations (member bodies and `missing` excluded). A verifier reports composition closure (every member present or declared missing) separately from each member Bundle's own three claims, and reports two agreeing members in one custody domain as redundant, not corroborating. Conformance vectors: `vectors/bundle/composed/`. |
| `contract-report/v1` | `{}`: a closed empty object, defined in `spec/contract-report-v1.md` with the schema `schemas/contract-report-v1.json`. A producer's opt-in to the contract-report view of a verified Evidence Result (`spec/evidence-result-v0.md`): the Result's sealed aggregate first, then one row per (`contract_ref`, `requirement_ref`) with its claims counted by verdict, each claim keeping its tier, grade and carrier status. The block carries no words, data, grouping or flags; the words come from the rendering module's wording pack (`spec/presentation-contract-v0.md` §6, §7.4), never from the bundle. A block that is not an empty object is declined: the kind is not engaged. Earlier unregistered display kinds that it replaces are listed in the deprecation table of `spec/presentation-contract-v0.md` §4.2. |

A company-specific row model such as `report/v1` is an extension only when
its independently available specification is registered; this registry does
not define that row model.

### Provisional: minimum-necessary extension kinds

**Held for ratification; not yet registered.** The Evidence Bundle draft
(`-01`) names these two kinds as provisional and does not define them. They carry what a
checker needs to verify a revealed `agent_input` of presentation type
`agent_input_version: "1"` (§10) and the disclosure-policy constraint record
that binds it. Like every extension they are covered by the bundle digest; a
verifier that does not implement them reports them as uninterpreted.
Conformance vectors: `vectors/minimum-necessary/`.

| Value | Semantics |
|---|---|
| `disclosure-policy-decisions/v1` | `{"<capsule_id>": <policy decision>, ...}`, one entry per Capsule in `records` that recorded a disclosure-policy check. A policy decision names fields, never their values: `{"policy_decision_version": "1", "policy_id", "policy_version", "agent", "role", "subject", "sources": [{"vct", "revealed": [<name>, ...], "withheld": [<name>, ...]}], "decided_at"}`, where `subject` holds correlation handles only. Its JSON-DIGEST MUST equal the `evidence_digest` of a constraint record in that Capsule's `constraints`. A verifier reports, per Capsule, the matching record's `result`, or that no constraint record carries the digest; it locates the record by `evidence_digest`, not by its labels. A key naming no supplied record is a finding. Checking the revealed list against a revealed `agent_input` is the §10 presentation-type check. |
| `sd-jwt-issuers/v1` | `{"<iss>": <JWK>, ...}`: for each SD-JWT issuer whose presentations appear in a revealed `agent_input` of presentation type `agent_input_version: "1"`, the public key (RFC 7517, public members only) under which that issuer's JWTs are verified. Verification is offline; the verifier fetches no issuer metadata. The key states which key signed, not who the issuer is. An entry carrying private key members is malformed and is ignored. |

The constraint record these kinds bind to is not registered; constraint `id`,
`check_type` and `method` follow the namespacing convention (see "No registry"
below). Example, with the producer's reverse-DNS prefix:

```json
{"id": "org.example.disclosure_policy", "check_type": "org.example.minimum_necessary",
 "method": "org.example.sd_jwt_presentation", "result": "pass", "severity": "high",
 "blocking": true, "evidence_digest": "<JSON-DIGEST of the policy decision>"}
```

`result` is `pass` when the transmitted Disclosure set equals the decision's
`revealed` lists, `fail` when it does not (the action is then `blocked`), and
`n/a` when no decision applied. `blocking: true` records that the action would
not have run had the check failed.

### Provisional: composed/v1 join basis values

**Held for ratification; not yet registered.** The Evidence Bundle draft
(`-01`), "Joins", defines the `composed/v1` join basis as a closed list:
`pre_agreed_identifier` and `shared_artifact_digest`, each with a derivation, and
`issued_receipt` and `same_interval`, reserved for a later specification. The value
below is proposed for a later Bundle revision. It is not part of `-01`. A `-01`
verifier reads a block that carries it as malformed, so a producer MUST NOT put it
in a `composed/v1` block until a posted Bundle revision lists it. Until then, the
binding is used beside the composition, under issuer independence
(`spec/interop-profile-v0.md` §6.7.4). Conformance vectors:
`vectors/controller-binding-v0/`.

| Value | Semantics |
|---|---|
| `controller_binding` | `identifier_digest` is the digest of a controller binding record (`spec/controller-binding-v0.md` §4) delivered beside the block, and `pointer` selects each member root record's `key_id`. `identifier_digest` is SHA-256 of the record's signing input (the record without `sigs`). The two members are linked when the delivered record's digest equals `identifier_digest`, the two selected values are its two keys, and it applies to them (§6.2 of that document): it is well formed, both keys signed it under a method the verifier implements, it is in its window at each root record's time, and no received revocation applies. A `controller_binding` join that derives `agree` is redundant, not corroborating. The binding proves control of both keys at its ceremony, never who holds them. |

## 15. Evidence Bundle countersignature type

Defined in `draft-mih-zhang-agent-disclosure-bundle`,
"Countersignatures". This is a **Specification Required** registry. It names
the encoding and verification rules for a signature by a party other than the
bundle producer over the bundle digest.

| Value | Semantics |
|---|---|
| `cose-sign1` | A tagged COSE_Sign1 whose attached payload is the raw 32-byte bundle digest, as defined by the Evidence Bundle draft. |
| `countersign/v1` | The JSON entry `{type, signer, over, statement, signature, receipt?}` defined in the Evidence Bundle draft, "The countersign/v1 Entry": an Ed25519 signature over the bundle digest, the signer, and the countersigner's statement of the checks it recomputed, each with one of five results. |

## 16. Evidence Request derivation

Defined in `draft-mih-agent-evidence-request`, "Derivation-Scoped
Disclosure" and IANA Considerations ("Evidence Request Derivations"). This is a
**Specification Required** registry. A token is lowercase ASCII,
underscore-separated, with a `/N` version suffix. A derivation's declared field
set bounds what its result reveals; a responder unwilling to disclose that set
refuses rather than truncating the result.

| Token | Description | Declared fields |
|---|---|---|
| `history_card/1` | Checkpoints, receipts, and consistency proofs for a stream. | None (no record content). |

### Provisional: minimum-necessary report

**Held for ratification; not yet registered.** Conformance vectors:
`vectors/minimum-necessary/` (`bundle-external-auditor` is the result shape).

| Token | Description | Declared fields |
|---|---|---|
| `minimum_necessary_report/1` | Per Capsule in the subject: which fields the agent was handed, under which policy, and whether the disclosure-policy check passed. | For each Capsule: its `disclosure-policy-decisions/v1` entry (§14: policy id and version, agent, role, subject handles, and per `vct` the `revealed` and `withheld` name lists) and the constraint record whose `evidence_digest` equals that entry's JSON-DIGEST (`id`, `check_type`, `method`, `result`, `blocking`, `evidence_digest`). No field values: no `disclosures` member, SD-JWT, Disclosure, or salt. |

The result is an Evidence Bundle (`evidence-bundle/v2`) over the subject's
Capsules carrying the `disclosure-policy-decisions/v1` extension, with
`completeness.suppressed_fields` naming `agent_input` and `agent_output` and no
`disclosures` member. The Capsules, completeness certificate and checkpoint are
digests-tier material, not part of the declared field set.

## 17. Evidence Layer epistemic type

Defined in `draft-mih-agent-evidence-layer`, "Epistemic Type" and IANA
Considerations ("Evidence Layer Epistemic Types"). This is a
**Specification Required** registry. A token is lowercase ASCII,
underscore-separated. It states how a record's content came to be known, is
assigned once at commit, and is never upgraded. It is a different axis from
`domain` (§8), which states what kind of act a Capsule records.

| Token | Semantics |
|---|---|
| `observed_event` | Directly observed by the recording system or actor. |
| `system_of_record_fact` | Asserted by an external system of record. |
| `producer_claim` | Asserted by the record's own producer, unverified by the store. |
| `human_report` | Asserted by a human, not machine-observed. |
| `semantic_judgment` | A judgment or classification reached by interpretation, not direct observation. |
| `derived_metric` | A value computed or aggregated from other records. |
| `adjudication` | A ruling on a matter that was disputed or required judgment. |
| `obligation_reference` | A reference to an obligation the record does not itself discharge. |

## 18. Evidence Layer link type

Defined in `draft-mih-agent-evidence-layer`, "Typed Links" and IANA
Considerations ("Evidence Layer Link Types"). This is a **Specification
Required** registry. A link is a typed, directed reference from one
evidence-store record to another, identified by the target's digest, and
never mutates its target. This registry is distinct from `chain.relation`
(§6) and `citation_purpose` (§11), which govern fields inside a Capsule; the
token `supersedes` is registered in both this registry and §6, and neither
registration defines the other.

| Token | Semantics |
|---|---|
| `cites` | The carrying record depends on the target's committed content. |
| `adjudicates` | The carrying record renders a judgment about the target's claim. Its `epistemic_type` is `adjudication`. |
| `supersedes` | The carrying record replaces the target's content for current use, without mutating it. |
| `acknowledges` | The carrying record states its author has seen and holds the target: receipt, not agreement. |
| `rebuts` | The carrying record disputes the target's claim. |
| `closes` | The carrying record binds a range or set of records as reconciled. |

## No registry

The following vocabularies are deliberately **not** registries of this document:

- **COSE algorithms** — by reference to the IANA
  [COSE Algorithms](https://www.iana.org/assignments/cose/cose.xhtml#algorithms)
  registry (Internet-Draft §12, "No new registry").
- **Constraint `id` / `check_type`, `compliance.framework_tags`,
  `assurance.sources[].kind`** — governed by the namespacing convention
  (Internet-Draft §9): bare names are reserved for the seeded values; new values
  use a URI or reverse-DNS prefix.