KB-7825

One-Roof Nonprod Clone Extended — 03 Axis/Topic Readiness (Obj B, prototype 7/7 + build-ready design)

5 min read Revision 1
one-roofnonprod-cloneextended-pipelineaxis-registrycoverage-rulebuild-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 scopevalue_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)

  1. DDL: the four tables exactly as in sql/B_…. Add FKs as written; keep status CHECK in {candidate,active,retired} on all four.
  2. Ownership extension: ALTER TABLE governance_object_ownership ADD COLUMN axis_code text NOT NULL DEFAULT 'responsibility'; backfill the partial-unique uq_gov_obj_accountable to include axis_code. Migrate the 6 scopes into axis_value('responsibility', …).
  3. Views: replace v_object_owner_gap with v_axis_coverage_gap (generalized) once ownership carries axis_code; keep the responsibility axis as the only active axis at cutover so the gap is unchanged (210, then 0 after seed).
  4. Lifecycle: new axes enter as candidate, get assignments + owners seeded, then flip to active in a governed step (same shape as event-type activation).
  5. Coverage modes: cross_product for axes where every object needs every value; per_assignment for classification axes (topic/domain).
  6. Gate: any axis flip to active that 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.

Back to Knowledge Hub knowledge/dev/reports/architecture/one-roof-nonprod-clone-extended-governance-pipeline-2026-06-02/03-axis-topic-readiness-on-clone.md