One-Roof Nonprod Clone Extended — 03 Axis/Topic Readiness (Obj B, prototype 7/7 + build-ready design)
03 — Objective B: Axis / Topic Readiness on Clone
Verdict: PROTOTYPE PASS (7/7) rollback-only + build-ready design produced. Persistent commit deliberately withheld (ratification-gated).
SQL: sql/B_axis_substrate_prototype_rollback_only_clone.sql
Finding 1 — substrate is absent; the responsibility scope IS today's single axis
axis_registry, axis_assignment, coverage_rule do not exist (the only *axis* tables are iu_three_axis_envelope*, an unrelated IU subsystem). The current coverage model is effectively a single axis: governance_responsibility_scope (6 active values — approval, audit, execution, health, policy, render), and v_object_owner_gap = inventory × active scopes ⟕ effective_owner. The "scope" column on governance_object_ownership is that axis's value.
Finding 2 — the generalized engine reproduces the canonical 210 exactly
The prototype created four tables in a rolled-back transaction and built a generalized coverage engine over the live inventory + effective-owner views:
- axis_registry (axis_code, value_domain, status candidate/active/retired)
- axis_value (axis_code, value_code, status)
- axis_assignment (object × axis × value, status) — tags objects with axis values
- coverage_rule (rule_code, axis_code, applies_to, coverage_mode, status)
Two coverage modes — a design insight that fell out of the prototype:
cross_product— every matching object × every active axis value (responsibility: 35×6 = 210).per_assignment— only where an active assignment exists (topic: an object needs an owner only for the topic it is tagged with).
v_axis_required_cell (active rules only) computed 210 and v_axis_coverage_gap computed 0, and was asserted equal to the canonical v_object_owner_gap — zero drift from today's model.
Finding 3 — candidate/active split works deterministically
A second axis topic (candidate) with 3 values and 3 assignments was excluded from the active gap (gap stayed 0). Activating it in-transaction (status → active) grew required cells 210 → 213 and produced a topic gap of 3 (the 3 assigned objects have no topic owner yet). This is the candidate→active lifecycle proven end to end.
| state | required cells | total gap | topic gap |
|---|---|---|---|
| topic = candidate | 210 | 0 | n/a (excluded) |
| topic = active | 213 | 3 | 3 |
All 7 assertions PASS. Post-rollback: 0 axis tables remain (substrate not persisted).
Why no persistent commit (even on the clone)
Supporting non-responsibility axes requires the one architectural change the prototype surfaces: governance_object_ownership must gain an axis dimension (an axis_code column defaulting to 'responsibility', with scope→value_code), or a parallel ownership table keyed by (object, axis_code, value_code). That is a schema change with sovereignty implications — it belongs to ratification, not to an ad-hoc clone commit that would create a misleading "island" schema. So: prove the DDL + engine (done), ship build-ready design (below), stop before commit.
Build-ready design (for the eventual governed build)
- DDL: the four tables exactly as in
sql/B_…. Add FKs as written; keepstatusCHECK in {candidate,active,retired} on all four. - Ownership extension:
ALTER TABLE governance_object_ownership ADD COLUMN axis_code text NOT NULL DEFAULT 'responsibility'; backfill the partial-uniqueuq_gov_obj_accountableto includeaxis_code. Migrate the 6 scopes intoaxis_value('responsibility', …). - Views: replace
v_object_owner_gapwithv_axis_coverage_gap(generalized) once ownership carriesaxis_code; keep the responsibility axis as the onlyactiveaxis at cutover so the gap is unchanged (210, then 0 after seed). - Lifecycle: new axes enter as
candidate, get assignments + owners seeded, then flip toactivein a governed step (same shape as event-type activation). - Coverage modes:
cross_productfor axes where every object needs every value;per_assignmentfor classification axes (topic/domain). - Gate: any axis flip to
activethat changes the production gap is a governed change — never auto-enable.
Blocker (precise)
Persistent axis substrate is blocked on: (a) ratification of the ownership-model axis extension, and (b) deciding the first non-responsibility axis's authoritative value source. Neither is technical — both are governance decisions. The technical path is proven and reversible.