READY-TO-ASSEMBLE-LEGO1-PATCH2 03 — C1 Identity / Version / Lifecycle Proof — 2026-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: ≤1activeper(operation_code, act_type). Surrogate UNIQUEvocab_id. - Version grammar (new, pinned):
protocol_version= SemVer 2.0.0MAJOR.MINOR.PATCH(e.g.1.0.0), validated byCHECK (protocol_version ~ '^[0-9]+\.[0-9]+\.[0-9]+$'). Comparator = tuple compare(MAJOR,MINOR,PATCH)::int[], not text. Monotone-successor rule uses this comparator, so2.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.