KB-12ED rev 3

23-P2 — IU Edit/Merge Runtime Inspection Prompt (rev3)

13 min read Revision 3
pack-23p2inspectionread-onlyeditmergepromptrev3multi-axisscale

23-P2 — IU Edit/Merge Runtime Inspection Prompt (rev3)

Date: 2026-05-06 | Status: PROMPT rev3 — chờ approve Rev3: +metadata evolution, +multi-axis composition, +scale-safety, +query counters READ-ONLY ONLY.


#!/usr/bin/env bash
# 23-P2 rev3 — IU Edit/Merge Runtime Inspection
set -uo pipefail

PG_CONTAINER="${PG_CONTAINER:-postgres}"
PG_USER="${PG_USER:-directus}"
PG_DB="${PG_DB:-directus}"
PSQL_RO=(docker exec -i "$PG_CONTAINER" psql -v ON_ERROR_STOP=1 -U "$PG_USER" -d "$PG_DB")

LOG_PATH="/tmp/23-p2.$(date -u +%Y%m%d-%H%M%S).log"
QUERY_ERRORS=""
QUERY_COUNT=0
QUERY_FAIL_COUNT=0
echo "=== 23-P2 rev3 Edit/Merge Inspection ===" | tee "$LOG_PATH"

run_sql() {
  local id="$1" label="$2"
  QUERY_COUNT=$((QUERY_COUNT+1))
  echo "--- $id $label ---" | tee -a "$LOG_PATH"
  "${PSQL_RO[@]}" 2>&1 | tee -a "$LOG_PATH"
  local ex=${PIPESTATUS[0]}
  if [ "$ex" -ne 0 ]; then
    QUERY_FAIL_COUNT=$((QUERY_FAIL_COUNT+1))
    QUERY_ERRORS="${QUERY_ERRORS}${id}: ${label} (exit=${ex})\n"
    echo "*** ERROR ($id) ***" | tee -a "$LOG_PATH"
  fi
}

# ============================================================
# §1 TABLE SCHEMA + CONSTRAINTS
# ============================================================

run_sql "1.1" "information_unit full schema" <<'SQL'
SELECT column_name, data_type, is_nullable, column_default
FROM information_schema.columns WHERE table_schema='public' AND table_name='information_unit' ORDER BY ordinal_position;
SQL

run_sql "1.2" "information_unit constraints" <<'SQL'
SELECT conname, contype, pg_get_constraintdef(oid) AS def
FROM pg_constraint WHERE conrelid='public.information_unit'::regclass ORDER BY contype, conname;
SQL

run_sql "1.3" "information_unit indexes" <<'SQL'
SELECT indexname, indexdef FROM pg_indexes WHERE schemaname='public' AND tablename='information_unit' ORDER BY indexname;
SQL

run_sql "1.4" "unit_version full schema" <<'SQL'
SELECT column_name, data_type, is_nullable, column_default
FROM information_schema.columns WHERE table_schema='public' AND table_name='unit_version' ORDER BY ordinal_position;
SQL

run_sql "1.5" "unit_version constraints" <<'SQL'
SELECT conname, contype, pg_get_constraintdef(oid) AS def
FROM pg_constraint WHERE conrelid='public.unit_version'::regclass ORDER BY contype, conname;
SQL

run_sql "1.6" "unit_version indexes" <<'SQL'
SELECT indexname, indexdef FROM pg_indexes WHERE schemaname='public' AND tablename='unit_version' ORDER BY indexname;
SQL

run_sql "1.7" "version_seq nullability + uniqueness" <<'SQL'
SELECT a.attname, a.attnotnull,
  EXISTS(SELECT 1 FROM pg_constraint c WHERE c.conrelid=a.attrelid AND a.attnum=ANY(c.conkey) AND c.contype='u') AS has_unique,
  EXISTS(SELECT 1 FROM pg_constraint c WHERE c.conrelid=a.attrelid AND a.attnum=ANY(c.conkey) AND c.contype='p') AS has_pk
FROM pg_attribute a WHERE a.attrelid='public.unit_version'::regclass AND a.attname='version_seq';
SQL

run_sql "1.8" "IU anchor columns" <<'SQL'
SELECT a.attname, a.attnotnull, t.typname FROM pg_attribute a JOIN pg_type t ON t.oid=a.atttypid
WHERE a.attrelid='public.information_unit'::regclass AND a.attname IN ('version_anchor_ref','content_anchor_ref') ORDER BY a.attname;
SQL

run_sql "1.9" "Existing lifecycle/proposal columns on UV" <<'SQL'
SELECT column_name FROM information_schema.columns WHERE table_schema='public' AND table_name='unit_version'
  AND column_name IN ('lifecycle_status','review_state','base_version_ref','status','review_actor','merged_at');
SQL

# ============================================================
# §2 FUNCTION BEHAVIOR
# ============================================================

run_sql "2.1" "fn_iu_create source" <<'SQL'
SELECT left(prosrc, 6000) FROM pg_proc WHERE proname='fn_iu_create';
SQL

run_sql "2.2" "fn_iu_create_plan source" <<'SQL'
SELECT left(prosrc, 6000) FROM pg_proc WHERE proname='fn_iu_create_plan';
SQL

run_sql "2.3" "fn_iu_verify_invariants source" <<'SQL'
SELECT left(prosrc, 6000) FROM pg_proc WHERE proname='fn_iu_verify_invariants';
SQL

run_sql "2.4" "fn_content_hash source" <<'SQL'
SELECT left(prosrc, 2000) FROM pg_proc WHERE proname='fn_content_hash';
SQL

run_sql "2.5" "fn_iu_gateway_write_guard source" <<'SQL'
SELECT left(prosrc, 4000) FROM pg_proc WHERE proname='fn_iu_gateway_write_guard';
SQL

run_sql "2.6" "Any edit/merge/proposal/version functions?" <<'SQL'
SELECT proname, proowner::regrole, prosecdef FROM pg_proc p JOIN pg_namespace n ON n.oid=p.pronamespace
WHERE n.nspname='public' AND (proname LIKE '%edit%' OR proname LIKE '%merge%' OR proname LIKE '%propos%' OR proname LIKE '%version%') ORDER BY proname;
SQL

# ============================================================
# §3 DATA SHAPE
# ============================================================

run_sql "3.1" "IU and UV counts" <<'SQL'
SELECT 'iu' AS tbl, count(*) FROM public.information_unit UNION ALL SELECT 'uv', count(*) FROM public.unit_version;
SQL

run_sql "3.2" "UV per IU distribution" <<'SQL'
SELECT unit_id, count(*) AS uv_count, min(version_seq) AS min_seq, max(version_seq) AS max_seq
FROM public.unit_version GROUP BY unit_id ORDER BY uv_count DESC;
SQL

run_sql "3.3" "All UV rows" <<'SQL'
SELECT id, unit_id, version_seq, content_hash, left(body, 50) AS body_preview, created_by, created_at
FROM public.unit_version ORDER BY unit_id, version_seq;
SQL

# ============================================================
# §4 PARENT/CHILD + ORDER
# ============================================================

run_sql "4.1" "All IUs with parent refs" <<'SQL'
SELECT canonical_address, parent_or_container_ref, unit_kind, identity_profile->>'title' AS title
FROM public.information_unit ORDER BY canonical_address;
SQL

run_sql "4.2" "identity_profile keys distribution" <<'SQL'
SELECT key, count(*) FROM public.information_unit, jsonb_object_keys(COALESCE(identity_profile,'{}'::jsonb)) AS key
GROUP BY key ORDER BY count(*) DESC;
SQL

# ============================================================
# §5 METADATA EVOLUTION / SCHEMA-EVOLUTION CAPACITY [rev3]
# ============================================================

run_sql "5.1" "JSONB columns on IU + UV" <<'SQL'
SELECT table_name, column_name, data_type FROM information_schema.columns
WHERE table_schema='public' AND table_name IN ('information_unit','unit_version') AND data_type='jsonb'
ORDER BY table_name, column_name;
SQL

run_sql "5.2" "identity_profile value types sample" <<'SQL'
SELECT key, jsonb_typeof(value) AS val_type, count(*) FROM public.information_unit,
  jsonb_each(COALESCE(identity_profile,'{}'::jsonb)) GROUP BY key, jsonb_typeof(value) ORDER BY key;
SQL

run_sql "5.3" "content_profile on UV if exists" <<'SQL'
SELECT column_name FROM information_schema.columns
WHERE table_schema='public' AND table_name='unit_version' AND column_name='content_profile';
SQL

run_sql "5.4" "dot_config keys related to metadata/profile/schema/IU" <<'SQL'
SELECT key, value FROM public.dot_config
WHERE key LIKE 'iu_%' OR key LIKE '%profile%' OR key LIKE '%schema%' OR key LIKE '%metadata%'
ORDER BY key;
SQL

run_sql "5.5" "GIN indexes on JSONB columns" <<'SQL'
SELECT indexname, indexdef FROM pg_indexes
WHERE schemaname='public' AND tablename IN ('information_unit','unit_version') AND indexdef LIKE '%jsonb%'
ORDER BY indexname;
SQL

# ============================================================
# §6 MULTI-AXIS COMPOSITION / TRACEABILITY [rev3]
# ============================================================

run_sql "6.1" "universal_edges schema" <<'SQL'
SELECT column_name, data_type, is_nullable FROM information_schema.columns
WHERE table_schema='public' AND table_name='universal_edges' ORDER BY ordinal_position;
SQL

run_sql "6.2" "Edge types in use (all)" <<'SQL'
SELECT edge_type, count(*) FROM public.universal_edges GROUP BY edge_type ORDER BY count(*) DESC;
SQL

run_sql "6.3" "Edges with order/sort/priority metadata" <<'SQL'
SELECT column_name FROM information_schema.columns
WHERE table_schema='public' AND table_name='universal_edges'
  AND (column_name LIKE '%order%' OR column_name LIKE '%sort%' OR column_name LIKE '%priority%' OR column_name LIKE '%seq%');
SQL

run_sql "6.4" "Edge metadata JSONB columns" <<'SQL'
SELECT column_name, data_type FROM information_schema.columns
WHERE table_schema='public' AND table_name='universal_edges' AND data_type='jsonb';
SQL

run_sql "6.5" "Governance/traceability edge types" <<'SQL'
SELECT edge_type, source_collection, target_collection, count(*)
FROM public.universal_edges
WHERE edge_type IN ('contains','belongs_to','governs','governed_by','implements','implemented_by',
  'tests','tested_by','derived_from','depends_on','references','uses','supersedes','part_of')
GROUP BY edge_type, source_collection, target_collection ORDER BY edge_type;
SQL

run_sql "6.6" "CONTAINS/BELONGS_TO by collection pair" <<'SQL'
SELECT edge_type, source_collection, target_collection, count(*)
FROM public.universal_edges WHERE edge_type IN ('contains','belongs_to','part_of')
GROUP BY edge_type, source_collection, target_collection ORDER BY count(*) DESC;
SQL

# ============================================================
# §7 GATEWAY ALLOW-LIST FEASIBILITY
# ============================================================

run_sql "7.1" "Gateway dot_config keys" <<'SQL'
SELECT key, value FROM public.dot_config WHERE key LIKE 'iu_create.gateway.%' ORDER BY key;
SQL

run_sql "7.2" "Guard marker check type" <<'SQL'
SELECT CASE
  WHEN prosrc LIKE '%ANY(%' OR prosrc LIKE '%string_to_array%' THEN 'ALLOW_LIST'
  WHEN prosrc LIKE '%v_cur=v_mv%' OR prosrc LIKE '%v_cur = v_mv%' THEN 'EXACT_MATCH'
  ELSE 'UNKNOWN'
END AS marker_check_type FROM pg_proc WHERE proname='fn_iu_gateway_write_guard';
SQL

# ============================================================
# FINAL
# ============================================================
echo "" | tee -a "$LOG_PATH"
echo "queries_run=$QUERY_COUNT" | tee -a "$LOG_PATH"
echo "queries_failed=$QUERY_FAIL_COUNT" | tee -a "$LOG_PATH"
if [ -n "$QUERY_ERRORS" ]; then
  echo "=== QUERY ERRORS ===" | tee -a "$LOG_PATH"
  echo -e "$QUERY_ERRORS" | tee -a "$LOG_PATH"
  echo "inspection_status=PARTIAL" | tee -a "$LOG_PATH"
else
  echo "inspection_status=COMPLETE" | tee -a "$LOG_PATH"
fi
echo "=== UPLOAD REPORT NOW ===" | tee -a "$LOG_PATH"

Agent Instructions

§8 Proposal Model Feasibility (ADVISORY)

Model Feasible? Blockers Required changes Scale-safe?
A. UV stores proposals, consumes version_seq ? ? ? ?
B. UV stores proposals, seq on merge only ? ? ? ?
C. Separate proposal table ? ? ? ?
D. Hybrid ? ? ? ?

[rev3] Scale-safety questions:

  • Model chịu nhiều proposed UV per IU không? Cần scan hay indexed?
  • JSONB metadata ổn lâu dài hay cần governance/vocab migration?
  • Index/constraint nào cần tương lai (không tạo bây giờ)?

§9 Composition Axis Assessment (ADVISORY) [rev3]

Axis Example Current primitive Feasible now? Missing
Document assembly doc → sections, ghép lại = văn bản gốc parent_or_container_ref + sort_order ? ?
Workflow assembly process → steps (miếng mẹ = quy trình, miếng con = bước) parent/child IU ? ?
Domain traceability law → design → procedure → code → test → report (ghép theo chuyên môn) universal_edges typed relations ? ?
Release/render bundle selected slices → artifact TBD ? ?

Key distinction (User directive):

  • Document/workflow axis = parent_or_container_ref (structural containment)
  • Domain axis = universal_edges with typed relations (cross-document traceability)
  • Không gom tất cả thành parent/child

§10 Gateway Allow-list + Metadata Evolution (ADVISORY)

  • Guard exact vs allow-list?
  • JSONB metadata safe for Phase 1?
  • What governance needed when metadata grows?

Report Template

# 23-P2 — IU Edit/Merge Runtime Inspection Report
> inspection_status: COMPLETE/PARTIAL
> queries_run: N / queries_failed: N

## §1 Schema [IU + UV]
## §2 Functions
## §3 Data Shape
## §4 Parent/Child
## §5 Metadata Evolution [rev3]
## §6 Multi-Axis Composition [rev3]
## §7 Gateway
## §8 Proposal Model (ADVISORY)
## §9 Composition Axis (ADVISORY) [rev3]
## §10 Gateway + Metadata (ADVISORY)
## §11 Recommended 23-P3 (ADVISORY)

Report: knowledge/dev/laws/dieu44-trien-khai/reports/23-p2-iu-edit-merge-runtime-inspection-report.md

Hard Boundaries

❌ READ-ONLY — No DDL/DML — No function/trigger — No vector — No cleanup


23-P2 rev3 | 2026-05-06 | +metadata evolution +multi-axis +scale-safety +counters | Chờ approve.

Back to Knowledge Hub knowledge/dev/laws/dieu44-trien-khai/prompts/23-p2-iu-edit-merge-runtime-inspection-prompt.md