KB-2991

READY-TO-ASSEMBLE-LEGO1 05 — C1 Dependency Map & Contract Join Points — 2026-06-22

6 min read Revision 1
ready-to-assemble-lego1dependency-mapjoin-pointsc1-canonical-operation-vocabularye1-edgeregistration-hold2026-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 own protocol_version, act_type, operation_code, and the per-value governing_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_code contract: 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.

Back to Knowledge Hub knowledge/dev/laws-new/reports/ready-to-assemble-lego1/05-lego1-dependency-map-and-contract-join-points-2026-06-22.md