show-composition โ the show is one transcript (X3, M2 + M4)
Runnable reference for X3 โ trust-task composition
(X3 โ Trust Task Composition, research root).
Zero-dep Node ESM; imports the shared ยง15.2/ยง6.2 encodings from ../canonical/canonical.mjs.
Run: node test.mjs โ show-composition: 10/10 pass.
What it demonstrates
A trust task never requests one predicate โ it presents a show: several PR-*
member proofs bound to ONE canonical transcript (requestedPredicates is a
required ยง15.2 field, so the baseline already makes the show the unit of
freshness โ canonical C9 is the same fact at digest level, S7/S8 here at show
level). The model enforces the X3 composition algebra:
- Atomicity โ a show verifies as a whole or fails as a whole; every member
must be present and bound to the same transcript digest. - Bundle profiles, not ร -la-carte โ requests name a governed
{bundleId, version}; any other predicate set is rejected (cipher-suite
instinct; ยง18.3 cardinality control lifted to the request layer). - The credential/artifact wall โ a
taskContext-bearing credential may ride
along, but the verified statement never contains ataskCompletionclaim and
a completion query is refused. Outcome evidence is athreadId-correlated
artifact on the Trust Task side of the boundary. - Joint disclosure record (M3 shape, ยง2.4 three-parameter form, as data):
againstWhom= the ยง19 observer list;forHowLong= longest-lived member
linkage (PR-UNQ's epoch dominates session);alongsideWhat= the member list.
The joint boundary is wider than the union of per-predicate boundaries
(intersection narrowing, request-pattern leakage, cross-show correlation) โ
that quantitative worksheet is X3 M1, design-doc work, not code here.
Bundle registry v0 (bundles.mjs)
| id | version | profile | predicates |
|---|---|---|---|
| MLP-BASE | 1 | mlp | PR-LIV, PR-ISS, PR-HLD, PR-FRE |
| MLP-BASE+DEL | 1 | mlp | MLP-BASE + PR-DEL |
| EPP-UNIQ | 1 | epp | MLP-BASE + PR-PER, PR-UNQ |
| EPP-UNIQ+DEL | 1 | epp | EPP-UNIQ + PR-DEL |
| EPP-RANGE | 1 | epp | EPP-UNIQ + PR-RNG |
+DEL variants carry ยง7.3 delegation as separate evidence (transcript gains the
optional delegationRef field); PR-DEL is never inferred from PR-HLD.
Named rejection reasons (the seam to the X1 fixture reason register)
| reason | meaning |
|---|---|
bundle-outside-registry |
unknown id/version, ร -la-carte set, surplus members |
partial-show-rejected |
atomicity: a member proof missing |
member-transcript-mismatch |
member bound to a different transcript (transplant/replay, ยง15.1/ยง26.1) |
stale-transcript |
expiry vs an explicitly supplied now (no Date.now() anywhere) |
transcript-invalid |
malformed transcript or tampered digest |
taskcontext-not-outcome-evidence |
completion asked of a show โ category error |
bundle-profile-mismatch |
(makeShow) bundle profile vs descriptor profile disagree |
These strings are intended verbatim as X1 fixture expected-reasons.
Upstream surface
ยง27.2 joint session with the Trust Task workstream: they own request semantics
and outcome artifacts; we own transcript binding and the disclosure calculus.
The bundle registry is the shared object (M2 draft here; authority question โ
context authority ยง6.7 vs Trust-Task-owned โ is open in X3).