One-Roof Clone Axis/Topic — 03 Topic Axis Seed & Lifecycle (Obj B, PASS)
03 — Objective B: Topic/Axis Seed & Lifecycle
Verdict: PASS — committed (topic persisted as candidate). SQL: sql/B_topic_axis_seed_lifecycle_clone_COMMIT.sql. 11/11 persisted checks PASS; candidate→active transition proven with visible deltas.
What was seeded
Three axes now exist (responsibility from Objective A, plus):
topic(uncertain / label, value_domaintopic) — seeded candidate. Four values forming a 2-level hierarchy:governance(root, human-designated),workflow(root, human-designated)ai-ops(parentgovernance, AI-proposed),registry-kg(parentgovernance, AI-proposed)- coverage rule
CR-TOPIC-ASSIGNED:per_assignment, confidence_threshold0.70, staleness30d. - four candidate assignments with confidence + provenance +
assigned_kind∈ {human, agent}.
containment(deterministic / structural, value_domaincontainment) — 5 group values (GRP-AI/BUSINESS/GOVERNANCE/REGISTRY/WORKFLOW) sourced fromcollection_registry."group". Demonstrates a third value_domain and the deterministic class (validation, not proposal) — kept candidate, no ownership coverage (deterministic axes don't carry a candidate ownership gap).
Provenance: human-designated vs AI-proposed (both proven)
axis_value.provenance records designated_by ∈ {human,agent}; the 4 topic values split 2 human-rooted / 2 agent-inferred. axis_assignment.assigned_kind likewise carries both human and agent rows. Check 4 & 6 confirmed both designations present — the substrate distinguishes a council-designated topic from a DOT/KG-inferred one, which is the precondition for the promotion gate (human-designated may auto-qualify; AI-proposed must clear confidence + review).
Parent/child topic relation (proven)
axis_value.parent_value_code is a self-FK within an axis. Two children (ai-ops, registry-kg) reference parent governance; the FK rejects a child pointing at a non-existent parent. This is the substrate for the topic tree (doc 07) and the parentage-conflict detector (doc 06).
Candidate → active lifecycle (the transition, measured)
A candidate axis is excluded from active coverage; activating it changes coverage deterministically. Measured live (rollback-only, so the persisted state stays clean):
| phase | required cells | total gap | topic gap |
|---|---|---|---|
| topic = candidate | 210 | 0 | n/a (excluded) |
| topic = active | 214 | 4 | 4 |
| post-revert | 210 | 0 | — |
The +4 are exactly the 4 assigned objects (agents, governance_registry, modules, workflows) — each becomes a required cell needing a topic owner the moment the axis goes active. This is the candidate→active gate working end to end: activation is the governed act that makes coverage real, and it is reversible.
Why the persisted state keeps topic as candidate
The seed is committed; the activation was measured then reverted (savepoint), leaving the clean active gap at 0. Activation-with-owners is then done deliberately in Objective C, so the lifecycle is shown as a controlled, owner-backed transition rather than a flip that silently opens a gap. (A subtle correctness note: the activation-measurement result rows were correctly discarded by the savepoint rollback — proving the savepoint isolation works — so the deltas above were captured in a separate clean rollback-only pass for durable evidence.)