READY-TO-ASSEMBLE-LEGO1 05 — C1 Dependency Map & Contract Join Points — 2026-06-22
READY-TO-ASSEMBLE-LEGO1 05 — C1 Dependency Map & Contract Join Points — 2026-06-22
Gate: REGISTRATION_HOLD · REGISTRATION_CAN_PROCEED = NO · 0 runtime mutations.
Carrier: C1 — canonical_operation vocabulary contract.
1. Method
The carrier dependency graph is taken from the accepted PATCH1 edge set E1–E8 (file: rs5b-closeout-patch1/03). C1's incoming and outgoing edges are extracted and proven from that source plus the live schema, not assumed. "Incoming" = an edge whose consumer is C1; "outgoing" = an edge whose producer is C1.
2. Incoming dependencies (edges where C1 is the consumer)
NONE. Searching E1–E8: no edge terminates at C1. C1 is consumed-by-nothing — it is a root producer.
- Proof from source: E1 is
C1 → C2(C1 producer, C2 consumer). No E* lists C1 as consumer. PATCH1 C1 spec describes C1 as a "producer node" only. - Proof from live schema: the would-be C1 table does not yet exist (
REQUIRED_NOT_PRESENT, file 02 §4); there is therefore no live row that references another carrier as a precondition for C1. C1's only inputs are its ownprotocol_version,act_type,operation_code, and the per-valuegoverning_authority_ref(the value's own governing authority, which is a governance fact, not a carrier edge). - Consequence: building C1 first cannot create a dangling incoming reference — there is nothing upstream to dangle.
3. Outgoing dependencies (edges where C1 is the producer)
E1 — C1 → C2 (canonical_operation)
| Field | Value |
|---|---|
| Producer | C1 canonical_operation vocabulary |
| Consumer | C2 effect schema |
| Reference field | canonical_operation input of effect_identity = H(protocol_version, canonical_operation, …) |
| Direction | producer → consumer (C1 → C2); no reverse edge |
| What breaks if producer (C1) is deleted/dropped | every historical effect_identity that hashed a now-deleted operation value becomes uninterpretable; the C1→C2 edge dangles; replay/audit of those effects cannot resolve the operation |
| What breaks if consumer (C2) changes | if C2 changes the lookup contract (e.g. expects an inlined value or a different key), historical effects may fail to resolve their operation; mitigated by the read-only reference contract (C2 must look up, never inline) |
| Safe rollback rule | retire the value/version (mark superseded/retired), keep it resolvable, add successor mapping if replaced — never destructive deletion (PATCH1 C1) |
| Required compatibility rule | C2 resolves canonical_operation by reference to the C1 contract under a matching protocol_version; a retired value remains resolvable for historical effects; new use of a retired value is fail-closed (I6) |
| Bad input | drop a canonical_operation value referenced by an existing C2 effect |
| Expected rejection | ROLLBACK_DELETES_REFERENCED_IDENTITY (RBP-2) — XBI-11 |
| Contract join point | C2's effect_identity computation performs a read-only vocabulary lookup against the C1 contract; the join is the lookup, nothing is inlined |
| No silent edge | the lookup is the only path between C1 and C2; there is no shared table, no trigger, no implicit write |
Live note: because C2 is itself NOT PRESENT in runtime (file 02 §5), there is currently no live consumer of C1. Building C1 first therefore has a blast radius of zero on existing data: no live effect, no live C2 row, nothing references the vocabulary yet. The edge E1 becomes live only when C2 is later built (a separate, later LEGO).
4. Dependency summary
| Count | Detail | |
|---|---|---|
| Incoming carrier edges | 0 | root producer |
| Outgoing carrier edges | 1 | E1 → C2 (canonical_operation lookup) |
| Live consumers today | 0 | C2 not present (file 02 §5) |
| Cross-carrier rollback dependency | 0 | C1 rollback is local (I9) |
5. What this means for safe first assembly
- No incoming edge ⇒ C1 can be born without any other carrier existing.
- One outgoing edge to a not-yet-built consumer ⇒ building C1 first orphans nothing and breaks nothing.
- Forward-fail-closed (I6) is satisfied by the
status/successor_codecontract: a retired value stays resolvable for history but is rejected for new use unless a successor maps it. - Locality (I9) is satisfied: C1 rollback never requires mutating C2 or any other carrier.
6. Bad-input → rejection map (dependency-level)
| Bad input | Expected rejection |
|---|---|
Drop a canonical_operation value referenced by a historical C2 effect |
ROLLBACK_DELETES_REFERENCED_IDENTITY (RBP-2) |
| Retire a value with no successor rule while a new act needs it | ROLLBACK_SUCCESSOR_RULE_ABSENT (RBP-7) |
| Retire a value but leave it admissible for new use | ROLLBACK_FORWARD_FAIL_CLOSED_VIOLATED (RBP-8) |
| Make C1 rollback "work" only by editing C2 references | ROLLBACK_NOT_LOCAL (RBP-10) |
| Add an incoming edge that makes C1 consume another carrier | scope drift (file 03 §7) — rejected at design review, not a valid C1 change |
7. No-dependency claims are proven, not assumed
The claim "C1 has no incoming carrier dependency" is proven by (a) the accepted E1–E8 edge set listing C1 only as a producer, and (b) the live schema showing the C1 table absent and therefore referencing nothing. It is not an assumption.
8. Boundary attestation
This file maps dependencies at design level. It creates no carrier, writes no row, opens no P2/lane, and clears no blocker. REGISTRATION_HOLD retained; REGISTRATION_CAN_PROCEED = NO; 0 runtime mutations; I1–I10 not weakened.