KB-1C5A
RP UI Axis — 08 No-Hardcode / No-Fake Audit
4 min read Revision 1
topic-axisauditno-hardcodestop-states2026-06-04
08 — No-Hardcode / No-Fake Acceptance Audit (Workstream G)
Scaling / anti-hardcode checks — PASS
| Check | Result | Evidence |
|---|---|---|
| No topic_level_1/2/3 columns | PASS | depth emerges from parent_codes arrays / taxonomy.parent_id ∪ universal_edges; no fixed-level columns anywhere |
| No topic-only island table | PASS | only generic axis_registry + axis_assignment; topics are data rows, not a table |
| No hardcoded topic labels in UI/API packet | PASS | every label comes from the views; handlers are SELECT passthroughs; decision queue tokenises labels dynamically |
| No candidate auto-active | PASS | decision queue writes nothing; all 7 stay candidate; activation is owner UPDATE only |
| No FK false claim to taxonomy | PASS | axis_assignment.node_code has no FK to taxonomy; candidates are TOPIC-CAND tokens with null taxonomy_node |
| No source tag deletion | PASS | iu_metadata_tag topic tags = 25, untouched; decision queue only reads them |
| No tree-only path loss | PASS | parent_codes is an array everywhere; has_multiple_parents preserved; queue + surface DAG-safe |
| No Nuxt-side count math | PASS | all counts/flags computed in PG; handlers return rows verbatim |
| No faked counts | PASS | document_count honestly 0 (no document assignments); PIV-327/328 honestly DEFER_NO_SOURCE; governance_owner honestly null |
New object audit — v_axis_topic_decision_queue
- Read-only view; writes nothing; DROP-reversible.
- evidence_strength / review_bucket / proposed_action are derived from data (assignment_count, parent_codes, shared label tokens), not hardcoded per node.
- Điều-39 enforced structurally (a view cannot activate anything); a governance_note column restates it.
STOP states (defined and observed)
| STOP condition | Current state | Behaviour |
|---|---|---|
| axis missing resolver | not triggered | resolver live (fn_topic_node_substrate) |
| candidate lacks governed node | active for all 7 | surface shows UNGOVERNED_CANDIDATE; queue says gov_council_decision_needed=true; promotion blocked until approval |
| approval missing | active | AX-TOPIC.approval_ref=null; no activation performed |
| grouping needed | observed (advisory) | cut_pipeline/render_pipeline flagged sibling; grouping_status=OK (under threshold 50) |
| governance owner missing | active system-wide | governance_object_ownership=0 rows; Packet 5 STOPs if no GOV owner code exists |
| evidence too weak | observed | workflow(2)/cut(1)/render(1) flagged WEAK; proposed DEFER/GROUP not promote |
| taxonomy promotion not safe | active | unretirable births + name-dependent amplification → per-node dry-run mandated; not committed |
Fake-green guard
Nothing in this macro reports success it did not achieve:
- UI/API is packet (not live) — stated plainly; redeploy operator-gated.
- Taxonomy promotion is rehearsal (not committed) — net-zero proven, one-way-door risk disclosed.
- Routing rows are proposed (not inserted).
- governance ownership is blocked (0 rows / no GOV owner code) — disclosed, not papered over.
Result
Audit PASS. The axis layer scales (generic registry + DAG arrays + dynamic derivation), and every gated/absent thing is reported honestly with its exact blocker.