One-Roof Clone Axis/Topic — 02 Axis Substrate Build on Clone (Obj A, PASS)
02 — Objective A: Axis Substrate Build on Clone
Verdict: PASS — built and committed on clone. SQL: sql/A_axis_substrate_build_clone_COMMIT.sql. Reversal: sql/Z_axis_substrate_drop_clone.sql.
What was built (6 tables, persistent, TEST_CLONE-marked)
| table | role | notable governance columns |
|---|---|---|
axis_registry |
the set of axes + behavioural class | axis_family (structural/label/semantic/pivot/system), axis_kind (deterministic/uncertain/system), status (candidate/active/deprecated/retired), lifecycle_status (birth/register/active/deprecate/retire), owner_scope_ref |
axis_value |
a value within an axis | parent_value_code (self-FK → topic parent/child), status, provenance jsonb |
axis_assignment |
object ↔ value (uncertain axes) | zone (approved/candidate/quarantine), match_score vs confidence (never collapsed), provenance/evidence jsonb, assigned_kind (dot/agent/human/rule), valid_from/to, revision, superseded_by |
coverage_rule |
how each axis is covered | coverage_mode (cross_product/per_assignment), confidence_threshold, staleness_days, required_owner_kind |
axis_object_ownership |
parallel ownership for non-responsibility axes | (object,axis,value)→owner_gov_code; partial-unique one accountable per cell |
axis_candidate_finding |
clone-local scan findings | idempotent PK (finding_type,object_type,object_ref,axis_code,value_code), scan_count |
Plus 5 build-time views (more added in later objectives): v_axis_required_cell, v_axis_effective_owner, v_axis_coverage_gap, v_axis_assignment_quality, v_axis_registry_coverage.
Design synthesis — why these columns
The build is the proven prototype 4-table engine (which is what actually reproduces 210 and integrates with the live inventory + effective-owner views) enriched with the hardened governance columns (zone/confidence/provenance/lifecycle/parent-child) from the axis-storage build-ready design. The two prior designs are thereby unified into one buildable substrate: the prototype gave coverage-correctness, the hardening doc gave governance-richness.
The load-bearing safety decision — parallel ownership
The prototype identified the one architecturally-significant change: supporting non-responsibility ownership needs either an axis_code column ALTERed onto governance_object_ownership, or a parallel ownership table keyed by (object,axis,value). This run takes the parallel table. Consequences:
governance_object_ownershipis never ALTERed → the existing 210→0 responsibility pipeline is byte-identical before and after.- The responsibility axis reads ownership through the existing
v_object_effective_owner(mappingscope→value_code); only other axes readaxis_object_ownership.v_axis_effective_ownerUNIONs the two. - The whole substrate is purely additive →
DROPrestores the pre-build state completely (no column left behind).
Zero-drift proof (the headline)
The build's pre-commit gate asserted, and post-commit confirmed:
substrate_tables = 6
axis_required_cells = 210 (responsibility cross_product: 35 born objects × 6 active scopes)
axis_coverage_gap = 0
canonical v_object_owner_gap = 0
generalized gap == canonical ✓ (zero drift from today's model)
The generalized engine reproduces the exact responsibility coverage the project already runs — proving the axis model is a faithful superset, not a divergent island. Had the assertion failed, the single BEGIN..COMMIT would have aborted and rolled back (nothing persisted).
Reversibility (verified to exist before first commit)
sql/Z_axis_substrate_drop_clone.sql was written before the build ran. It drops all 9 views and 6 tables in dependency order, clone-guarded, and asserts 0 remain. The build is safe precisely because its undo was in hand first.