KB-5260

READY-TO-ASSEMBLE-LEGO1-PATCH2 03 — C1 Identity / Version / Lifecycle Proof — 2026-06-22

4 min read Revision 1
ready-to-assemble-lego1-patch2c1-identityversioned-identitylifecyclesemverenforcement-absentregistration-hold2026-06-22

READY-TO-ASSEMBLE-LEGO1-PATCH2 03 — C1 Identity / Version / Lifecycle Proof — 2026-06-22

Closes/holds Codex 5.2. Gate: REGISTRATION_HOLD · CAN_PROCEED = NO · 0 runtime mutations. Design-only; nothing created (c1_table=0).


1. Codex residual (reproduced)

PATCH1 file 03's composite identity was sound, but: (a) protocol_version >= on text is not a defined version ordering; (b) cycle prevention, write-once immutability, lifecycle transitions, and new-use resolution had no enforcing schema/handler — and the package itself carried U3_PARTIAL_UNIQUE_SURFACE_ABSENT and STATUS_DOMAIN_NOT_DB_ENFORCED. Confirmed real: design intent without enforcement.

2. Identity model (retained, with version grammar pinned)

  • Surrogate vocab_id uuid (immutable reference target). PK (operation_code, protocol_version). Partial UNIQUE: ≤1 active per (operation_code, act_type). Surrogate UNIQUE vocab_id.
  • Version grammar (new, pinned): protocol_version = SemVer 2.0.0 MAJOR.MINOR.PATCH (e.g. 1.0.0), validated by CHECK (protocol_version ~ '^[0-9]+\.[0-9]+\.[0-9]+$'). Comparator = tuple compare (MAJOR,MINOR,PATCH)::int[], not text. Monotone-successor rule uses this comparator, so 2.0.0 > 1.10.0 (text would mis-order).

3. Field set + enforcement binding

Field Rule Enforced by
vocab_id immutable surrogate UNIQUE + handler write-once
operation_code, protocol_version, act_type, semantics_frozen write-once per row column triggers / handler (no UPDATE re-meaning)
status active/superseded/retired CHECK + handler transitions
successor_(operation_code,protocol_version) composite FK to an existing row; <> self FK + CHECK
successor chain acyclic DAG governed handler (recursive guard)
monotone version successor version ≥ this (SemVer comparator) handler
lifecycle retired⇒not resolvable for new use; superseded⇒successor set handler (forward-fail-closed)

4. Invalid cases → expected rejection

Bad input Expected
duplicate active (operation_code, protocol_version) PK / unique-violation
two active rows same (operation_code, act_type) partial-unique violation
UPDATE semantics_frozen in place write-once reject (would be RBP-5)
successor = self / cycle self-link CHECK / DAG reject
successor version < current (SemVer) monotone reject
retired value used for new effect RETIRED_FOR_NEW_USE (RBP-8)
DELETE instead of retire forbidden (no DELETE; RBP-2)

5. Honest status

The model is now fully specified (version grammar + comparator + write-once + DAG + lifecycle). But all of it is enforced by the schema + governed handler from file 02, which do not exist (c1_table=0; no C1 handler registered). Per Codex's "must exist and be read-back-verifiable" bar, the enforcement is a PREPARATION_GAP tied to B1: it cannot be created under REGISTRATION_HOLD/0-mutation. The design is closed; the enforcing artifact is absent.

6. Boundary attestation

Design-only; nothing created. REGISTRATION_HOLD retained; CAN_PROCEED = NO; 0 runtime mutations. Supersedes PATCH1 file 03 §5 text-version comparison.

Back to Knowledge Hub knowledge/dev/laws-new/reports/ready-to-assemble-lego1-patch2/03-c1-identity-version-lifecycle-proof-2026-06-22.md