KB-2670

One-Roof Clone Axis/Topic — 02 Axis Substrate Build on Clone (Obj A, PASS)

4 min read Revision 1
one-roofnonprod-cloneaxis-substrateaxis-registryaxis-assignmentcoverage-ruleparallel-ownershipzero-drift

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_ownership is 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 (mapping scopevalue_code); only other axes read axis_object_ownership. v_axis_effective_owner UNIONs the two.
  • The whole substrate is purely additiveDROP restores 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.

Back to Knowledge Hub knowledge/dev/reports/architecture/one-roof-nonprod-clone-axis-topic-substrate-pipeline-2026-06-02/02-axis-substrate-build-on-clone.md