KB-630E
15000x · 02 — Productization Gap Matrix (9 capabilities LIVE_READY + 8 GAPs G1..G8 + 1 ruled-out G9; sidecar > column-add)
4 min read Revision 1
iu-corev0.615000xgap-matrixproductizationsidecar-designlive-discovery
15000x · 02 — Productization Gap Matrix
Method
Live discovery first (per 12000x lesson L1: "the substrate is usually already shipped"). Surveyed:
pg_procforfn_iu_collection_*,fn_iu_compose*,*template*,*catalog*,*product*information_schema.tablesfor*template*,*product*,*catalog*,*registry*dot_iu_command_catalogfor product-factory commandsiu_piece_collection,iu_piece_membershipschemas — look foris_template/ lineage columnsdesign_templatesandcollection_registry(the only existing "template"/"registry" tables) — verify out-of-scope
Live findings
Already LIVE_READY (no work needed)
| Capability | Lives where |
|---|---|
| Piece-collection compose (mint+attach) | fn_iu_compose |
| Piece-collection lifecycle CRUD | fn_iu_collection_create / add_piece / remove_piece / reorder_piece |
| Manifest digest | fn_iu_collection_manifest_refresh |
| Render / validate | fn_iu_collection_render / fn_iu_collection_validate |
| Healthcheck | fn_iu_collection_healthcheck + 8-surface Python wrapper |
| DOT entrypoints (compose) | dot_iu_create_workflow_from_steps, dot_iu_create_file_from_pieces |
| Piece lifecycle (gov-bound) | dot_iu_supersede_piece / split / merge (10000x) |
| Event runtime (gated) | fn_iu_piece_emit_event + lifecycle trigger (11000x) |
| Template+Instance mechanism | fn_iu_compose iu_id-reuse branch (12000x Phase F proven) |
| Text-as-code roundtrip | cutter_agent/iu_core/text_as_code.py (12000x proven) |
GAPs to close in 15000x
| # | Gap | Severity | Resolution |
|---|---|---|---|
| G1 | No durable is_template marker | High | Migration 031 sidecar iu_collection_template_registry |
| G2 | No durable template→instance lineage record | High | Migration 031 sidecar iu_collection_template_instance_lineage |
| G3 | No product-template view | Med | v_iu_product_template |
| G4 | No lineage view | Med | v_iu_product_template_instance with digest-match flag |
| G5 | No operator-grade DOT for register-as-template | Med | dot_iu_register_template |
| G6 | No operator-grade DOT for record-instance-lineage | Med | dot_iu_record_template_instance |
| G7 | No consolidated operator runbook | High | OPERATOR_RUNBOOK.md |
| G8 | No durable productized templates | High | Compose + mark 2 templates; 1 instance |
| G9 | design_templates table — IU Core registry? |
(resolved) | Out of scope: UI/component template table for Directus design system |
Design decision — sidecar, not column-add
| Option | Pros | Cons |
|---|---|---|
A — add columns to iu_piece_collection |
Single-table queries; direct FK | 9+ live callers; harder rollback |
| B — sidecar tables | Zero blast radius; fail-closed rollback; FK keeps integrity | Two-step query — mitigated by views |
Decision: B (sidecar). Migration 031.
What this macro does NOT productize
- Template versioning column —
collection_keysuffix convention sufficient - Template ACLs —
iu_piece_collectionhas no ACL model - Cross-tenant templates — no tenancy model
- Bulk export — text-as-code handles single; bulk is 16000x
- Auto-instantiate from event — belongs in event-runtime productization
Validation
After migration 031: runtime/110 D9 PASS at 169 (27+26+61+6+12+21+16). D8_unregistered = 0 rows.