KB-2489

Hiện trạng Vòng 2 — Đối chiếu logic 4 Bà Mẹ ↔ PG / registry / binding / khóa (khảo sát đọc-only)

44 min read Revision 1
kestravong-2khao-satread-only4-mothersmowmotmoitmoutmodwregistrybindingkey-matrixpilot

Hiện trạng Vòng 2 — Đối chiếu logic 4 Bà Mẹ ↔ PG / registry / binding / khóa

Nhịp KHẢO SÁT, ĐỌC-ONLY, nối tiếp Vòng 1 (hien-trang-he-thong-truoc-trien-khai-pilot-0.md — KHÔNG sửa file đó). Không thiết kế, không triển khai, không sửa DB, không tạo bảng/field/DOT/event/workflow/task, không deploy, không git, không in secret value. Ngày khảo sát: 2026-06-29 Công cụ: query_pg (READ ONLY txn, role context_pack_readonly, statement_timeout 5s, hard LIMIT 500) · pg_schema · đọc KB · WebFetch (preview HTML) · upload_document (đúng 1 báo cáo này). Không psql/shell, không gọi function gây ghi.


0. Bằng chứng môi trường

SELECT current_database(), current_user, current_schema(), version();
db user schema version
directus context_pack_readonly public PostgreSQL 16.13 (Debian)
  • Trùng dự kiến. User = context_pack_readonly (read-only chuyên dụng). Tool ép transaction READ ONLY ⇒ đảm bảo đọc-only ở tầng công cụ.
  • SHOW transaction_read_only / default_transaction_read_only: CHƯA XÁC MINH trực tiếp (current_setting() ngoài allowlist của tool → [DENIED]). Mọi câu đều SELECT.
  • Phát hiện mô hình truy cập (quan trọng cho cách đọc báo cáo này): role context_pack_readonly chỉ được GRANT SELECT trên một tập bảng được duyệt, KHÔNG phải toàn bộ public. Bảng không nằm trong allowlist → SELECT trả relation "..." does not exist (che quyền). Bằng chứng information_schema.table_privileges WHERE grantee='context_pack_readonly': có SELECT trên approval_requests, binding_registry, block_form, collection_field_standards, collection_registry, design_templates, field_type_equivalences, forms, governance_registry, table_registry, tasks, trigger_registry (+ từ Vòng 1: task_comments, task_checkpoints, workflows, workflow_steps, workflow_step_relations, workflow_categories, workflow_change_requests, dot_iu_command_catalog, event_*). Không có grant trên một số registry trọng yếu.
  • Catalog (pg_class/pg_attribute/to_regclass) đọc được. reltuples thường = -1 (chưa ANALYZE) và pg_stat_user_tables.n_live_tup không tin được (trả 0 cho bảng có dữ liệu, vd collection_registry) ⇒ chỉ count(*) trên bảng readable mới là sự thật; bảng ungranted thì số dòng CHƯA XÁC MINH.

1. Tóm tắt 5 dòng — 4 mẹ ↔ PG đủ/thiếu gì

  1. MOIT = chưa chạy được. 3 registry lõi của thiết kế field_registry, input_form_registry, tier_registry KHÔNG TỒN TẠI live (to_regclass=NULL; DDL 2026-05-29 chỉ chạy BEGIN..ROLLBACK). binding_registry/forms/block_form tồn tại nhưng rỗng (0 dòng)binding_registry lại có hình dạng khác thiết kế (binding nguồn→output, không phải field↔cột). Không có DOT submit form. ⇒ "bind field → cột DB → form submit" = KHÔNG.
  2. MOW canvas = mới có khung thô. workflows(2)/workflow_steps(70)/workflow_step_relations(80)/workflow_change_requests(3) tồn tại, nhưng thiếu toàn bộ cột EXTEND (owner_gov_code, design_health, iu_ref, dot_ref, event_ref…), không có view v_mow_design_*, không có tier_registry, không có bảng cây 7 tầng tổ chức, không có lớp instance/run. Hợp đồng CanvasNode 22 trường phần lớn chưa có nền PG.
  3. MOT đọc/đổi task = chạy được; cá nhân hóa = KHÔNG. tasks/task_comments/task_checkpoints đủ cho vòng đời task (Vòng 1). Nhưng không có row-filter $CURRENT_USER trên tasks (chỉ feedbacks.read có), và assigned_totext agent (claude_code/CLI/…), không phải directus_users ⇒ "việc của tôi" theo hàng không làm được.
  4. MOUT = không có tầng registry. output_table_registry/report_registry/report_run/recipient/distribution đều KHÔNG TỒN TẠI. Mặt báo cáo sống duy nhất = cụm pg-read-pg (table_registry=28 + snapshot v_report_home/v_report_pg) — cơ chế khác thiết kế MOUT-builder.
  5. Liên thông 4 mẹ = mới ở mức UI + khóa MỀM. Toàn cụm task/workflow/proposal 0 foreign key (PK-only, tất cả là soft-ref). 4 mẹ đã đăng ký governance_registry (factory) nhưng status=draft và GOV-MOIT trỏ output_table không tồn tại. Không có anchor key 7 tầng nối chéo. ⇒ Pilot xuyên tầng tối thiểu KHÔNG chạy được nếu không tạo ≥2 bảng mới (field_registry + input_form_registry).

2. Hợp đồng dữ liệu mỗi mẹ (từ thiết kế) → PG đáp ứng thế nào

Mẹ Hợp đồng dữ liệu phải có (thiết kế) Điểm ghi Điểm đọc Điểm phê duyệt Điểm liên thông PG đáp ứng
MOW CanvasNode 22 trường (node_id, tier, code, parent_id, status, traffic_light, automation_level, owner_gov_code, freeze_status, health_summary, iu_ref, workflow_ref, task_ref, dot_refs, event_refs, proposal_count, permission_actions, instance_data…) ánh xạ workflows/workflow_steps + cột EXTEND + view v_mow_design_workflow/_step + tier_registry + cây 7 tầng Proposal-only → workflow_change_requests (dsl_diff) view + Directus policy + predicate Điều-37 ≥2 chữ ký (Điều 32) anchor 7 tầng; task_ref/iu_ref/dot_refs/event_refs PARTIAL→THIẾU: bảng thô có; EXTEND cols/views/tier_registry/cây-7-tầng/instance KHÔNG; proposal_count=wcr; quorum/chữ ký KHÔNG có trường
MOT Task card: header + input + reference/output + instruction + comments/checkpoints + actions; "việc của tôi" theo người tasks.status/content_*/task_comments qua Directus Public read tasks (n/a, qua MOW) task↔workflow_step, task↔form (MOIT), task↔report (MOUT) CÓ phần lõi: tasks/comments/checkpoints đủ; THIẾU row-perm cá nhân, assignee thật, cột anchor/form_ref/output_ref
MOIT field_registry (field↔collection_code↔column↔interface↔validation) + input_form_registry (target_collection, field_set, form_schema, routing direct/queue) + DOT assembly + DOT write DOT executor → INSERT target_collection (direct) hoặc staging+event (queue) <MOITForm formId> zero-logic (queue) → MOW duyệt field_registry→cột; form→target_collection KHÔNG: field_registry/input_form_registry không tồn tại; binding_registry rỗng+sai-hình; forms/block_form rỗng; 0 DOT submit
MOUT report_registry (report_id, code, title, anchor_node, anchor_tier, created_by, schedule/cron, distribute[], output_url, status) + output_table_registry + report_run/history + recipient/distribution; neo anchor 7 tầng, resolvePath "Đúc báo cáo" → lưu hệ thống đọc kho trường + source view governance D0-G/Điều 30-31 anchor node 7 tầng (2 chiều với MOW/MOT/MOIT) KHÔNG: report_registry/output_table_registry/report_run/recipient/distribution vắng; chỉ table_registry + v_report_* (cơ chế khác)
MODW "Con của MOW" — ma trận Hiến pháp đa chiều; logic nằm trong MOW; nền normative_registry/universal_rule_registry (qua MOW) đọc ma trận (qua MOW Điều 32) anchor vào workflows MOW PARTIAL: nền luật (normative_registry=46, universal_rule_registry, measurement_registry=142) tồn tại; không có anchor key nối MODW↔workflows
Master hub Mỗi mẹ một list "đã đúc" cùng khuôn (STT·Mã·Tên·Tầng quản lý·Đường 7 tầng·Ngày·Người lập·Trạng thái) đọc từ report_registry/workflow_registry/task_registry; Master = tổng hợp 4 list theo thời gian (n/a) đọc per-mother registry (n/a) gộp 4 list theo cây 7 tầng KHÔNG (data): per-mother "*_registry" hầu hết vắng; chỉ table_registry/v_report_home cho mặt MOUT. Master = tổng hợp UI (eco-nav), không phải bảng dữ liệu

3. Registry / binding hiện có (đối chiếu thiết kế ↔ live)

Bảng Tồn tại? Owner Số dòng (thật) Vai trò thiết kế Trạng thái
field_registry KHÔNG (to_regclass NULL) MOIT: field↔cột↔widget↔validation KHÔNG CÓ
input_form_registry KHÔNG MOIT: form contract (target+field_set+layout+routing) KHÔNG CÓ
tier_registry KHÔNG 7 tầng quản trị (cả 4 mẹ tiêu thụ) KHÔNG CÓ
output_table_registry KHÔNG MOUT: bảng output KHÔNG CÓ
report_registry KHÔNG MOUT: khuôn báo cáo đã đúc KHÔNG CÓ
dot_function_registry KHÔNG MOT: registry hàm DOT KHÔNG CÓ (de-facto = dot_iu_command_catalog)
task_template_registry KHÔNG MOW: khuôn task KHÔNG CÓ
role_in_process / iu_process_binding KHÔNG MOW role-in-process / binding KHÔNG CÓ
binding_registry directus 0 (thiết kế kỳ vọng field↔form) — thực = code,name,binding_type,source_table,source_column,source_view,output_format,description,status CÓ NHƯNG RỖNG + sai hình so với MOIT
forms directus 0 form (kiểu Directus: id,key,title,schema,submit_label,on_success,redirect_url,status) CÓ NHƯNG RỖNG
block_form directus 0 block↔form (id,title,headline,form) CÓ NHƯNG RỖNG
collection_field_standards directus 11 chuẩn field theo collection (field_name,field_type,tier 1/2,required,field_status) — tier=mức quan trọng (1 lõi/2 phụ), KHÔNG phải 7 tầng CÓ + SEEDED
field_type_equivalences directus 4 tương đương kiểu (type_a,type_b) CÓ + SEEDED
trigger_registry directus 107 trigger_name,table_name,trigger_type,function_name,fires_on,timing,enabled,status CÓ + SEEDED
design_templates directus 1 Điều-28 template — chỉ 1 dòng TPL-002 "DirectusMatrix" (pivot/matrix view, instance_collection=pivot_definitions). Không có template form/node CÓ NHƯNG CHƯA SEED đủ (1 matrix)
governance_registry directus 9 4 mẹ = factory (xem §8-C); + GOV-COUNCIL/DOT/KG-SYS/NRM-SYS/SIV nhưng 4 mẹ draft
collection_registry directus 168 hợp đồng collection (FK group→collection_groups) CÓ + SEEDED
table_registry directus 28 hợp đồng bảng UI (nền cụm reports) CÓ + SEEDED
approval_requests directus 231 hàng phê duyệt governance/birth (xem §8-B) CÓ + SEEDED (khác miền MOW)
workflow_change_requests directus 3 đề xuất sửa workflow MOW (mỏng, MOW-only)
qt001_tier_registry (+_rule_registry,_v2) directus CHƯA XÁC MINH (ungranted, reltuples -1) tier tự-trị DOT (tier_code,tier_rank,eligibility_rule,allowed_action,scale_risk,parity) — KHÔNG phải cây 7 tầng tổ chức nhưng sai miền cho MOW-7-tầng
dot_iu_command_catalog directus 47 catalog DOT (IU/piece/collection/health) nhưng 0 lệnh mother-verb
event_type_registry / event_outbox workflow_admin 40 / ~209,989 (Vòng 1) — 0 type miền task/workflow active CÓ NHƯNG CHƯA NỐI task

4. Luồng liên thông 4 mẹ

Luồng Có khóa thật? Soft-ref? Bảng/cột Đủ/thiếu Bằng chứng
I1. MOIT form → tạo/cập nhật task MOT KHÔNG (không có) THIẾU field_registry/input_form_registry vắng; không cơ chế form-submit→task
I2. MOW workflow/step → sinh task MOT KHÔNG (chỉ ngược 1:1) workflows.task_id→tasks (soft, 1 WF↔1 task); workflow_steps không có task_id THIẾU sinh task từ step constraint: 0 FK; steps thiếu task_id
I3. MOT task → mở MOIT form nhập KHÔNG tasks không có form_ref THIẾU input_form_registry vắng; tasks 26 cột không có form_ref
I4. MOT task → hiển thị MOUT reference/output KHÔNG tasks không có output_ref/report_ref THIẾU report_registry vắng
I5. MOW proposal → wcr → duyệt → apply PARTIAL (mềm) workflow_change_requests(workflow_id,task_id,dsl_diff,approved_by,applied_at,status) CÓ phần lõi (2/3 applied), không FK, không quorum sample WCR-001/002 applied by 'codex'; WCR-003 draft
I6. MOUT report → phân phối email/MOT task KHÔNG không recipient/distribution; không report→task THIẾU report_run/recipient/distribution vắng
I7. Master hub → list "đã đúc" từng mẹ PARTIAL (UI) chỉ table_registry/v_report_home (mặt MOUT) THIẾU data per-mother registry vắng; Master = eco-nav UI
I8. MODW (trong MOW) — anchor nối dữ liệu KHÔNG normative_registry/universal_rule_registry tồn tại, không anchor key tới workflows THIẾU không cột nối MODW↔workflows

Kết luận I: liên thông mới ở UI (eco-nav) + 1 phần MOW-internal (wcr). CHƯA có khóa dữ liệu thật xuyên 4 mẹ; thiếu hẳn anchor key 7 tầng dùng chung.


5. Ma trận khóa PK / FK / soft-ref (đầy đủ)

Mọi bảng dưới đây đều trong directus.public ⇒ cột "Cùng DB?" = Y (cùng database, cùng schema). Khuyến nghị là phân loại trên giấy, KHÔNG phải lệnh sửa DB.

source.cột DB/schema target.cột DB/schema Cùng DB? Loại hiện tại Index? Null? Orphan? Loại thiếu Khuyến nghị (giấy) Lý do Bằng chứng
tasks.id directus.public (PK) Y PK no giữ định danh task tasks_pkey
task_comments.task_id directus.public tasks.id directus.public Y soft-ref ? yes 1 orphan CÓ NHƯNG CHƯA NỐI GIỮ-MỀM-CÓ-INDEX có 1 orphan → dọn trước khi FK count=1
task_checkpoints.task_id directus.public tasks.id directus.public Y soft-ref ? yes 0 CÓ NHƯNG CHƯA NỐI GIỮ-MỀM-CÓ-INDEX sạch nhưng không cưỡng chế orphan=0
task_checkpoints.workflow_step_id directus.public workflow_steps.id directus.public Y soft-ref ? yes CHƯA KT CÓ NHƯNG CHƯA NỐI GIỮ-MỀM link checkpoint↔step cột tồn tại
workflows.task_id directus.public tasks.id directus.public Y soft-ref ? yes 0 CÓ NHƯNG CHƯA NỐI GIỮ-MỀM-CÓ-INDEX 1 WF↔1 task orphan=0
workflows.parent_workflow_id directus.public workflows.id directus.public Y soft-ref ? yes CHƯA KT CÓ NHƯNG CHƯA NỐI GIỮ-MỀM phân cấp WF cột tồn tại
workflows.category_id directus.public workflow_categories.id directus.public Y soft-ref ? yes CHƯA KT CÓ NHƯNG CHƯA NỐI GIỮ-MỀM-CÓ-INDEX phân loại cột tồn tại
workflow_steps.workflow_id directus.public workflows.id directus.public Y soft-ref ? no? 0 CÓ NHƯNG CHƯA NỐI NÂNG-FK-CỨNG khả thi (sau khi index) cạnh xương sống, sạch orphan=0
workflow_step_relations.from_step_id directus.public workflow_steps.id directus.public Y soft-ref ? no? 0 CÓ NHƯNG CHƯA NỐI NÂNG-FK-CỨNG khả thi đồ thị A→B, sạch orphan=0
workflow_step_relations.to_step_id directus.public workflow_steps.id directus.public Y soft-ref ? no? 0 CÓ NHƯNG CHƯA NỐI NÂNG-FK-CỨNG khả thi đồ thị A→B, sạch orphan=0
workflow_change_requests.workflow_id directus.public workflows.id directus.public Y soft-ref ? yes 0 CÓ NHƯNG CHƯA NỐI GIỮ-MỀM-CÓ-INDEX proposal↔WF orphan=0
workflow_change_requests.task_id directus.public tasks.id directus.public Y soft-ref ? yes 0 CÓ NHƯNG CHƯA NỐI GIỮ-MỀM proposal↔task orphan=0
workflow_change_requests.approved_by directus.public (người duyệt) Y text tự do ('codex') yes CÓ NHƯNG CHƯA NỐI CHƯA ĐỦ DỮ LIỆU không trỏ user thật sample
tasks.assigned_to directus.public directus_users.id? directus.public Y text tự do (claude_code/CLI) yes CÓ NHƯNG CHƯA NỐI CHƯA ĐỦ DỮ LIỆU không phải user UUID dist
approval_requests.proposed_action_code directus.public apr_action_types.action_code directus.public Y FK CỨNG yes giữ đã FK fk_apr_action_type
approval_requests.request_type_code directus.public apr_request_types.request_code directus.public Y FK CỨNG yes giữ đã FK fk_apr_request_type
approval_requests.entity_type/entity_code/target_collection directus.public (đa hình) directus.public Y soft-ref yes CÓ NHƯNG CHƯA NỐI GIỮ-MỀM đa hình (collection/dot_tool/axis…) dist §8-B
governance_registry.domain directus.public dot_domains.code directus.public Y FK CỨNG yes giữ đã FK fk_gov_registry_domain
governance_registry.created_by_law directus.public normative_registry.code directus.public Y FK CỨNG yes giữ đã FK fk_gov_registry_created_by_law
governance_registry.output_target directus.public (tên bảng) directus.public Y text (GOV-MOIT→input_form_registry không tồn tại) yes dangling CÓ NHƯNG CHƯA NỐI CHƯA ĐỦ DỮ LIỆU trỏ bảng vắng §8-C
collection_registry.group directus.public collection_groups.code directus.public Y FK CỨNG yes giữ đã FK fk_collection_group
field_registry.collection_codecolumn (thiết kế) (không tồn tại) Y KHÔNG CÓ CHƯA ĐỦ DỮ LIỆU bảng nguồn không tồn tại to_regclass NULL
input_form_registry.field_set[]field_registry (thiết kế) (không tồn tại) Y KHÔNG CÓ CHƯA ĐỦ DỮ LIỆU cả 2 bảng vắng to_regclass NULL

Kết luận G: Khóa nên cứng được (sạch, cùng DB): workflow_steps.workflow_id, workflow_step_relations.from/to_step_id (xương sống đồ thị WF, 0 orphan). Khóa nên mềm-có-index: các task_id/workflow_id/category_id (dọn 1 orphan ở task_comments trước). Khóa nguy hiểm nếu nối ngay: assigned_to/approved_by (text, không trỏ user thật) và governance_registry.output_target (GOV-MOIT trỏ bảng không tồn tại) — không được FK. Khóa MOIT (field_registry/input_form_registry) = CHƯA ĐỦ DỮ LIỆU vì bảng không tồn tại.


6. Orphan check (soft-ref chính)

-- NOT EXISTS check, read-only
Soft-ref Orphan
task_comments.task_idtasks.id 1
task_checkpoints.task_idtasks.id 0
workflows.task_idtasks.id 0
workflow_steps.workflow_idworkflows.id 0
workflow_step_relations.from_step_idworkflow_steps.id 0
workflow_step_relations.to_step_idworkflow_steps.id 0
workflow_change_requests.workflow_idworkflows.id 0
workflow_change_requests.task_idtasks.id 0

Hiện sạch (chỉ 1 orphan ở task_comments — giảm so Vòng 1 vì dữ liệu task đã đổi). Không kiểm được orphan cho field_registry.field_set/input_form_registry (bảng không tồn tại) và cho qt001_tier_* (ungranted).


7. Phân loại thiếu (3 mức)

Miếng thiếu Loại thiếu Bằng chứng Hệ quả với Pilot
field_registry, input_form_registry, tier_registry KHÔNG CÓ to_regclass=NULL (control binding_registry/tasks resolve) MOIT không bind/submit được
output_table_registry, report_registry, report_run/history, recipient/distribution KHÔNG CÓ name-scan + to_regclass NULL MOUT không đúc/lưu/phân phối theo thiết kế
dot_function_registry, task_template_registry, role_in_process, iu_process_binding KHÔNG CÓ to_regclass NULL thiếu nền MOT/MOW
Cột EXTEND workflows/workflow_steps (owner_gov_code, design_health, iu_ref, dot_ref, event_ref…) + view v_mow_design_* KHÔNG CÓ col-list + view-scan (chỉ v_registry_/v_report_) CanvasNode 22 trường không render từ PG
Bảng cây 7 tầng tổ chức (Lĩnh vực→Công việc) KHÔNG CÓ tier_registry vắng; qt001_tier_* là tier tự-trị DOT; workflows.level chỉ =1 không anchor/resolvePath thật
Lớp run/instance workflow; cột started_at/done_at/anchor_node trên tasks KHÔNG CÓ Vòng 1 + col-list không track "đang chạy"/2 chiều
DOT mother-verb (create-task, set-status, render/submit-form, create/distribute-report, propose) KHÔNG CÓ catalog scan (chỉ create_workflow_from_steps, staging_approve) tự động hóa đường ghi chưa có
binding_registry, forms, block_form CÓ NHƯNG RỖNG count=0,0,0 tồn tại khung, chưa seed/nối
design_templates (1 matrix) CÓ NHƯNG CHƯA SEED đủ count=1, TPL-002 matrix thiếu template form/node
4 mẹ trong governance_registry CÓ NHƯNG CHƯA NỐI (draft) status=draft; GOV-MOIT→bảng vắng factory chưa kích hoạt
workflow_change_requests (3) CÓ NHƯNG CHƯA NỐI thiếu step/tier/quorum; 0 FK proposal MOW chưa đủ trường
approval_requests (231) CÓ NHƯNG CHƯA NỐI entity_type ∈ collection/dot_tool/axis… (0 task/workflow) không governance proposal mẹ
event_outbox/event_type_registry CÓ NHƯNG CHƯA NỐI Vòng 1: 0 type task active analytics task không có nơi hứng
row-perm cá nhân hóa trên tasks KHÔNG CÓ chỉ feedbacks.read có $CURRENT_USER "việc của tôi" không lọc được

8. Trả lời chi tiết Nhóm A–J (kèm SELECT + kết quả thật)

Nhóm A — Registry / binding MOIT

  • A1 field_registry đủ để field trỏ cột DB? SELECT to_regclass('public.field_registry')NULLKHÔNG TỒN TẠI. (Hợp đồng thiết kế: code·name·collection_code·field_kind·data_type·is_required·interface·validation·owner_mother·status — DDL 2026-05-29 chỉ chạy BEGIN..ROLLBACK.)
  • A2 input_form_registry đủ để form chạy? to_regclass=NULL ⇒ KHÔNG TỒN TẠI. forms(Directus-style) tồn tại nhưng 0 dòng; block_form 0 dòng.
  • A3 Đường truy vết form_id→field_code→collection_code→column→target_collection? KHÔNG — đứt ngay khâu đầu (2 registry vắng).
  • A4 binding_registry vai trò? Tồn tại, 0 dòng, hình dạng = code,name,binding_type,source_table,source_column,source_view,output_format,description,status ⇒ là binding nguồn→output (kiểu MOUT/view), KHÔNG nối field↔form như MOIT cần. PK=code, 0 FK.
  • A5 trigger_registry nối form submit/sinh task/trigger workflow? Tồn tại 107 dòng (trigger_name,table_name,function_name,fires_on,timing,enabled,status) — là catalog mô tả trigger DB, không có cơ chế nối form→task; không có dòng nào trỏ forms/field_registry (các bảng đó rỗng/vắng).
  • Kết luận A: MOIT bind field → cột DB → form submit thật: KHÔNG.

Nhóm B — MOW proposal / sinh việc / phê duyệt

  • B1 Proposal ghi vào đâu? workflow_change_requests (3 dòng). Cột: id, workflow_id, change_type, title, description, position_context, suggested_actor_type, suggested_block_id, status, schema_warnings, dsl_diff(jsonb), approved_by(text), applied_at, task_id, date_created, code, _dot_origin.
    • Có: target workflow (workflow_id), change_type (add_step/add_block), payload đề xuất (dsl_diff), người duyệt (approved_by='codex' text), ngày duyệt/áp dụng (applied_at), trạng thái (draft/applied).
    • THIẾU: target step (chỉ suggested_block_id), target tier T1–T7, số chữ ký/quorum (Điều 32 ≥2 — không có cột), người đề xuất riêng (chỉ user_created qua Directus), reject reason.
    • Mẫu: WCR-001(add_step,applied,by codex), WCR-002(add_block,applied), WCR-003(add_step,draft). Cả 3 đều workflow_id=1, task_id=10.
  • B2 Hai đường PA1/PA2? PA1 (duyệt→áp dụng): biểu diễn được bằng status draft→approved→applied + applied_at. PA2 (staging→duyệt→nạp): CHƯA THẤY bảng staging/queue cho MOW; chỉ dot_iu_staging_approve (miền IU). ⇒ CHƯA ĐỦ.
  • B3 Trigger sinh task? trigger→workflow→step→task: không có engine; workflow_steps không có task_id; không cơ chế sinh task từ step (Vòng 1 + 0 FK).
  • B4 workflow_steps biết sinh task loại gì? Cột: step_type (wait_for_event/human_checkpoint/agent_call/condition/action), actor_type, config(jsonb) — không có task_type_ref/executor_class/assignee_rule/form_ref/output_ref. config jsonb CHƯA mở (CHƯA XÁC MINH).
  • Phụ — approval_requests (231): hệ phê duyệt governance/birth riêng, không phải MOW proposal. request_type: birth_orphan(143), reclassify(18), schema_modify(15), fix_repair_dot(25), topic_promotion(7 pending)…; entity_type ∈ {collection, dot_tool, topic_node, axis, facet, process…} — 0 dòng task/workflow/workflow_step. status ∈ {applied, expired, pending, rejected, approved}. ⇒ 2 hệ phê duyệt song song, chưa nối (wcr cho DSL workflow; approval_requests cho governance).
  • Kết luận B: MOW proposal có chỗ lưu phần lõi nhưng KHÔNG đủ theo thiết kế (thiếu step/tier/quorum/chữ ký).

Nhóm C — MOW canvas 7 tầng & Master-list

  • C1 T7→T1 map vào đâu? KHÔNG có bảng cây 7 tầng tổ chức. tier_registry vắng. qt001_tier_registry = tier tự-trị DOT (tier_code/eligibility_rule/allowed_action/scale_risk) — sai miền. collection_field_standards.tier = mức quan trọng field (1/2). workflows.level chỉ có giá trị 1. ⇒ 7 tầng (Lĩnh vực/Công ty/Khối/Phòng ban/Chuyên môn/Nhiệm vụ/Công việc) chỉ tồn tại trong mock-data.json (UI), không có nền PG.
  • C2 CanvasNode.id từ đâu? Thiết kế: workflows.id/workflow_steps.id/tbl_*.id. Có (bảng thô).
  • C3 parent_id? workflows.parent_workflow_id/workflow_steps.workflow_id (soft, không FK). Có.
  • C4 workflow_ref/task_type_ref/iu_ref có cột thật? workflow_ref=workflows.id (có). task_type_ref/iu_ref/dot_ref/event_ref: KHÔNG — col-list workflow_steps = id,workflow_id,step_key,step_type,title,description,actor_type,config,position_x,position_y,block_id,sort_order,date_created,date_updated,trigger_in_text,trigger_out_text,code,checkpoint_set_id,_dot_origin,status (không có step_iu_ref/dot_ref/event_*_ref). workflows cũng không có owner_gov_code/active_design_version/freeze_active/design_health/design_iu_ref. ⇒ toàn bộ cột "+8/+7 EXTEND" của hợp đồng chưa áp.
  • C5 proposal_count? = count(workflow_change_requests WHERE status IN draft/submitted/review) per node → tính được (hiện 1 draft cho workflow_id=1).
  • C6 permission_actions? Cần predicate Điều-37 theo role (Directus) — chưa có (server-computed, chưa có cột/view).
  • C7 instance_data? THIẾU (không có lớp workflow_run/instance — Vòng 1).
  • C8 Master-list nguồn? view v_mow_design_workflow/v_mow_design_step: KHÔNG TỒN TẠI (view-scan chỉ thấy v_registry_*, v_report_home, v_report_pg). 4 mẹ đã đăng ký governance_registry factory: GOV-MOW→workflows, GOV-MOT→tasks, GOV-MOUT→design_templates, GOV-MOIT→input_form_registry(vắng); tất cả status=draft, primary_collection=NULL.
  • Kết luận C: MOW canvas + master-list render từ PG thật, không hardcode: KHÔNG (thiếu EXTEND cols, views, tier_registry, cây 7 tầng, instance).

Nhóm D — MOT cá nhân hóa / inbox / quyền theo hàng

  • D1 tasks có assignee/PIC? Có cột assigned_to (varchar).
  • D2 Assignee trỏ user thật? KHÔNGSELECT assigned_to, count(*): null(4), claude_code(2), CLI(2), Claude Desktop(1), claude(1) ⇒ text danh tính agent, không phải directus_users UUID. (tasks=10; status active=7/done=2/draft=1.)
  • D3 Role/tier/department phân việc? Không trên tasks (không cột department/tier/role).
  • D4 Directus row-filter assigned_to = current_user? SELECT … WHERE permissions ILIKE '%CURRENT_USER%'chỉ 1 dòng: feedbacks.read = {user_created _eq $CURRENT_USER}. KHÔNG có trên tasks (Vòng 1: tasks read Public, row_filter {}).
  • D5 "Việc của tôi" bằng cách nào? Directus row-filter: chưa có. Gateway/DOT filter: chưa có. ⇒ Hiện chỉ lọc được ở UI (client-side), không cưỡng chế.
  • D6 Admin/master thấy tất cả? Có — Public read tasks row_filter {} ⇒ ẩn danh đã thấy tất cả (ngược lại: không che được).
  • D7 Task card map vùng nào? header=name/status/priority/deadline; input=content_targets/content_rules/content_checklist; reference/output=content_reports/content_verify/content_test (text, không có output_ref thật); instruction=content_prompt/content_plan; comments/checkpoints=task_comments(75)/task_checkpoints(9); actions=update qua Directus Agent Policy. Các vùng nội dung CÓ (text); link form/output thật KHÔNG.
  • Kết luận D: MOT cá nhân hóa theo người + master theo admin CHƯA đủ (thiếu row-perm + assignee thật).

Nhóm E — MOUT report / bản đúc / phân phối

  • E1 Registry khuôn báo cáo? report_registry/output_table_registry/mout_registry: KHÔNG TỒN TẠI. Gần nhất = table_registry(28).
  • E2 Nơi lưu bản đúc/lịch sử chạy? report_run/report_history/report_runs: KHÔNG TỒN TẠI (name-scan NULL). Mặt sống = snapshot v_report_home/v_report_pg (là table relkind 'r', không phải view) — từ cụm pg-read-pg.
  • E3 report_run_id? KHÔNG.
  • E4 Nguồn output table/view/matview? v_report_* snapshot tables + table_registry. Không có matview v_report_% (relkind 'm'); các v_report_* là bảng snapshot.
  • E5 Phân phối email/MOT? recipient_registry/distribution_registry/distribution: KHÔNG TỒN TẠI. report→task: không có.
  • E6 MOUT master-list nguồn? Thiết kế = report_registry (report_id,code,title,anchor_node,anchor_tier,schedule,distribute[],output_url,status) → vắng. Thực = table_registry/v_report_home. design_templates (output target của GOV-MOUT) = 1 dòng TPL-002 "DirectusMatrix" (matrix/pivot view).
  • Kết luận E: MOUT có registry + nơi lưu bản đúc/report run/phân phối: KHÔNG (chỉ có mặt reports pg-read-pg, cơ chế khác thiết kế).

Nhóm F — Đường ghi tự động / DOT / Secret Manager / token

  • F1 Đường ghi hiện có cho 4 mẹ: (a) Directus REST/SDK (role Agent — đổi tasks.status; AI Agent không gồm status) = đường ghi thật duy nhất đang dùng; (b) PG triggers (side-effect, không emit event task); (c) DOT CLI ngoài DB (/opt/incomex/dot/* — file-based, KHÔNG trong catalog; CHƯA XÁC MINH lại vòng này); (d) Directus flows (sync Agent Data/Changelog). Nuxt KHÔNG ghi DB (Điều 28 zero-logic — thiết kế).
  • F2 DOT sẵn cho mother-verb? Catalog scan: chỉ dot_iu_create_workflow_from_steps + dot_iu_staging_approve. KHÔNG có get-canvas / propose-change / get-task-card / create-task / update-task-status / render-form / submit-form / create-report / distribute-report.
  • F3 DOT/agent lấy token từ Secret Manager? Trong public KHÔNG có bảng secret/vault/credential/api_key (name-scan NULL) ⇒ credential không nằm trong DB (Secret Manager external — env/docker). Cơ chế cụ thể (metadata): CHƯA XÁC MINH (không đọc secret value; không có tool đọc env trong nhịp này).
  • F4 UI/Nuxt ghi thẳng DB? Thiết kế = KHÔNG (Nuxt zero-logic, ghi qua Directus/DOT). Live: đường ghi qua Directus REST (Agent token).
  • F5 Đường ghi phù hợp nguyên tắc (Nuxt zero-logic + DOT-pair validate + Secret Manager + PG/Directus SoT)? Hiện trạng: nguyên tắc chưa hiện thực cho 4 mẹ — DOT-pair cho form/task/report chưa tồn tại; chỉ Directus REST.
  • Kết luận F: Tự động hóa đường ghi qua DOT/agent + Secret Manager mà không đưa token cho UI: CHƯA XÁC MINH/PARTIAL (Secret không ở DB = đúng nguyên tắc; nhưng DOT mother-verb vắng nên chưa có đường tự động hóa thật).

Nhóm G — Ma trận khóa

Xem §5 + §6. Tóm: toàn cụm task/workflow/proposal PK-only, 0 FK; FK cứng chỉ ở registry tĩnh (governance_registry, collection_registry, approval_requests→apr_*). Mọi khóa cùng directus.public.

Nhóm H — Analytics / audit / cải tiến

  • H1 Nơi hứng sự kiện phân tích? event_outbox (~209,989) chỉ event system/health (Vòng 1). workflow_change_requests(3) có approved_by/applied_at (đo được ai duyệt/đã áp dụng) nhưng không có: tầng đề xuất, bước sửa cụ thể (chỉ block), thời lượng, phút tiết kiệm, số quy trình ảnh hưởng. approval_requests(231) có reviewed_by/reviewed_at/status (đo governance) nhưng khác miền mẹ.
  • H2 correlation_id xuyên suốt? event_outboxcorrelation_id (Vòng 1) nhưng workflow_change_requests/tasks/approval_requests KHÔNG có correlation_id chung ⇒ không nối proposal→task→approval→execution→report.
  • H3 event_outbox dùng được cho analytics này? KHÔNG — bị chặn vì thiếu event_type miền task/workflow active (Vòng 1: process.step.* inactive).
  • H4 task_comments/changelog đủ phân tích? Một phần (nhật ký tự do) — không cấu trúc đủ để đo tiết kiệm/ảnh hưởng.
  • Kết luận H: Tầm nhìn analytics cải tiến có nơi hứng dữ liệu: KHÔNG (chưa có event task + chưa có correlation_id xuyên suốt).

Nhóm I — Liên thông 4 mẹ

Xem §4. Kết luận I: 4 mẹ có khóa liên thông dữ liệu thật: KHÔNG (mới liên thông UI + 1 phần MOW-internal wcr).

Nhóm J — Lát cắt pilot xuyên tầng tối thiểu

  • J1 Lát cắt MOIT chọn field đã đăng ký → submit qua DOT → ghi task/comment → MOT thấy → xác nhận → master/MOUT đọc lại trạng thái chạy được? KHÔNG (toàn mạch) — khâu MOIT (chọn field đã đăng ký + submit qua DOT) bất khảfield_registry/input_form_registry không tồn tại và 0 DOT submit.
  • J2 Nếu làm được, dùng bảng/cột nào? Nửa MOT chạy được: tasks(status/content_*) + task_comments (Directus Agent), đọc lại qua Public read + v_report_*. (Đây chính là Pilot 0 của Vòng 1.)
  • J3 Thiếu đúng miếng nào? Khâu MOIT→DB: thiếu field_registry + input_form_registry (+ ≥1 design_template kiểu form + cờ routing) + DOT submit executor.
  • J4 Cần tạo bảng mới? — tối thiểu field_registry + input_form_registry cho mạch xuyên tầng thật. (Nửa MOT không cần bảng mới.)
  • J5 Cần thêm field? Cho liên thông: cột anchor_node/anchor_tier (neo 7 tầng) + started_at/done_at; cho MOT cá nhân: row-perm + assignee user thật.
  • J6 Cần Kestra? KHÔNG cho nửa MOT (Vòng 1). Cho engine workflow thật thì thiếu lớp instance (ngoài phạm vi).
  • J7 Cần event_outbox? KHÔNG bắt buộc (nhật ký = task_comments/changelog).
  • J8 Phân loại miếng thiếu: field_registry/input_form_registry/DOT-submit = KHÔNG CÓ; binding_registry/forms/design_templates(form) = CÓ NHƯNG RỖNG/CHƯA SEED; 4 mẹ governance = CÓ NHƯNG CHƯA NỐI (draft).
  • Kết luận J: Pilot xuyên tầng tối thiểu chạy bằng cái hiện có: KHÔNG (phải tạo ≥2 bảng MOIT). Pilot nửa-MOT (đọc task→nhập→đổi status→đọc lại): (đã xác nhận ở Vòng 1).

9. Danh sách "miếng còn thiếu" (phân nhóm)

Khóa định nghĩa: field_registry, input_form_registry, tier_registry, output_table_registry, report_registry, dot_function_registry, task_template_registry, role_in_process, iu_process_binding, bảng cây 7 tầng tổ chức, cột EXTEND workflows/workflow_steps (owner_gov_code/design_health/iu_ref/dot_ref/event_ref…), view v_mow_design_*, design_template kiểu form/node.

Khóa vận hành: lớp workflow_run/instance/step_run/task_run; report_run_id; cột assigned_at/started_at/done_at; anchor_node/anchor_tier trên tasks/reports; bảng staging/queue MOW (PA2).

Khóa audit/cải tiến: correlation_id chung xuyên workflow_change_requeststasksapproval_requests↔report; event_type miền task/workflow active; cột đo (thời lượng, phút tiết kiệm, số quy trình ảnh hưởng); thống nhất 2 hệ phê duyệt (wcr ↔ approval_requests).

Quyền/secret/đường ghi: row-perm $CURRENT_USER trên tasks; assigned_to trỏ directus_users thật; DOT mother-verb (create-task/set-status/render-form/submit-form/create-report/distribute); kích hoạt 4 factory governance (draft→active) + sửa GOV-MOIT.output_target (đang trỏ bảng vắng); cơ chế Secret Manager (metadata) CHƯA XÁC MINH.

Analytics/report: nơi hứng event task; report run/history; recipient/distribution; báo cáo→task.


10. Nguy cơ nếu nối PG ngay mà không siết khóa

  1. 0 FK toàn cụm vận hành ⇒ soft-ref trôi âm thầm (đã có 1 orphan task_comments); nối hệ thống ngay = rủi ro tham chiếu gãy.
  2. governance_registry.output_target của GOV-MOIT trỏ input_form_registry KHÔNG TỒN TẠI ⇒ kích hoạt factory MOIT sẽ ghi vào bảng vắng.
  3. assigned_to/approved_by là text agent (không phải user) ⇒ không lọc/audit theo người thật được; nếu phơi "việc của tôi" sẽ lộ toàn bộ task (Public read {}).
  4. Không lớp run/instance + không engine (Vòng 1) ⇒ "đang chạy" không track được; bước wait_for_event/agent_call chỉ là mô tả.
  5. KB nói registry MOIT "đã có" nhưng live không có ⇒ hành động theo KB cũ sẽ xây trên tiền đề sai.
  6. 2 hệ phê duyệt song song (workflow_change_requests vs approval_requests) chưa nối ⇒ nhập nhằng "ai cai quản proposal của mẹ".
  7. binding_registry rỗng + sai hình so với nhu cầu MOIT ⇒ nếu tái dùng nhầm sẽ lệch ngữ nghĩa (binding nguồn→output ≠ field↔form).
  8. Worker chết / event task vắng (Vòng 1) ⇒ bất kỳ "đẩy event" nào hiện không có người tiêu thụ.

11. Danh sách "CHƯA XÁC MINH"

  • transaction_read_only/default_transaction_read_only (tool chặn current_setting).
  • Số dòng + shape thật của field_registry/input_form_registry/tier_registry — moot vì to_regclass=NULL (không tồn tại); giả định Postgres chuẩn không RLS trên pg_catalog. Nếu môi trường có lớp lọc catalog-theo-grant đặc biệt thì còn khả năng "tồn-tại-nhưng-ẩn" (xác suất thấp, chưa loại trừ 100%).
  • qt001_tier_registry/_rule_registry/_v2: nội dung + số dòng (ungranted, reltuples -1).
  • workflow_steps.config (jsonb): cấu hình actor/agent — chưa mở.
  • /opt/incomex/dot/* CLI (dot-report-publish, dot-pg-atomic-apply…): file-based, ngoài catalog — chưa đọc lại vòng này (chỉ biết qua KB/memory).
  • Cơ chế Secret Manager thật (env/docker secret) — không đọc value, metadata chưa soi.
  • ai_tasks (collection riêng + 2 flow Auto-Dispatch/Auto-Create Reviewer — Vòng 1) — chưa khảo sát cấu trúc/quan hệ với tasks.
  • token sống cho role Agent (đường ghi tasks.status) — mới xác minh permission, chưa xác minh token dùng được.
  • v_report_home/v_report_pg có đúng là mặt "đã đúc" MOUT không — suy từ memory, chưa truy vết đầy đủ vòng này.

12. Mâu thuẫn preview ↔ KB (cần người chốt)

  1. MÂU THUẪN — CẦN NGƯỜI CHỐT — KB moit-input-runnable-architecture-notes.md (2026-06-18) khẳng định "LỚP KẾT NỐI ĐÃ CÓ TRONG DB PRODUCTION… field_registry, input_form_registry, tier_registry…" ↔ live PG 2026-06-29: to_regclass=NULL (KHÔNG TỒN TẠI). Cùng đó: survey 2026-05-28 (02-candidate-registry-survey) = ABSENT; doc 2026-05-29 (01-production-schemas) = DDL chỉ chạy BEGIN..ROLLBACK (rolled back, deferred chờ Điều 32). ⇒ Cần chốt: các bảng từng được tạo rồi DROP, hay note 2026-06-18 là nguyện vọng/nhầm? (Ghi cả ba nguồn, không tự chọn.)
  2. Hợp đồng MOW node-card (03-node-card-data-contract, 2026-05-29) coi cột EXTEND workflows/workflow_steps + view v_mow_design_* là "existing+EXTEND substrate" ↔ live: EXTEND cols & views KHÔNG TỒN TẠI. ⇒ hợp đồng tham chiếu nền chưa hiện thực (design-vs-impl gap, cần chốt thứ tự đúc).
  3. MOUT design (mout-governance-master-notes/mout-builder-v3) dựa report_registry/output_table_registry ↔ live dùng table_registry + v_report_* (cơ chế pg-read-pg khác). ⇒ cần chốt MOUT đi theo report_registry mới hay mở rộng table_registry.
  4. Survey 2026-05-28 "No factory registered" ↔ live: 4 mẹ đã đăng ký factory (draft, GOV-MOIT lỗi output_target). ⇒ tiến hóa, không phải mâu thuẫn — nhưng cần chốt việc kích hoạt draft→active + sửa output_target.
  • Preview HTML: đọc được (MOW canvas v2, MOUT builder v3, master-hub) nhưng nội dung mỏng; moit-builder-v3.html → HTTP 404 (URL KHÔNG ĐỌC ĐƯỢC BẰNG TOOL — DÙNG KB THAY THẾ). Không mâu thuẫn trực tiếp với KB, chỉ thiếu.

13. Ghi rõ về FK cứng & cùng database

Tất cả bảng/khóa ứng viên trong báo cáo này đều thuộc cùng một database directus, cùng schema public ⇒ cột "Cùng DB?" = Y cho mọi dòng ma trận khóa. Do đó không có khuyến nghị NÂNG-FK-CỨNG nào bị hạ vì lý do khác-DB. Tuy nhiên, theo §3.1/§5, các khóa sau bị hạ CHƯA ĐỦ DỮ LIỆU vì lý do dữ liệu (không phải khác-DB): field_registry.collection_code/input_form_registry.field_set (bảng nguồn không tồn tại), tasks.assigned_to/workflow_change_requests.approved_by (text, không trỏ user), governance_registry.output_target (trỏ bảng vắng). Các khóa đủ điều kiện FK cứng cùng DB (sạch, 0 orphan): workflow_steps.workflow_id, workflow_step_relations.from_step_id/to_step_id — đã xác minh cùng directus.public.


14. Kết luận đóng K1–K14

# Câu hỏi Đáp Bằng chứng 1 dòng
K1 PG đủ registry/binding để MOIT bind field→cột→form submit? KHÔNG field_registry/input_form_registry to_regclass=NULL; forms/binding_registry=0; 0 DOT submit
K2 PG đủ khóa để MOW canvas 7 tầng map node→workflow/step/IU? KHÔNG thiếu EXTEND cols + v_mow_design_* + tier_registry + cây 7 tầng; workflows.level chỉ =1
K3 MOT lọc "việc của tôi" theo hàng bằng dữ liệu/quyền hiện có? KHÔNG 0 row-filter $CURRENT_USER trên tasks; assigned_to=text agent
K4 Proposal mode MOW có nơi lưu đủ trường? PARTIAL (lõi-có, đủ-KHÔNG) wcr có workflow_id/dsl_diff/approved_by/applied_at; thiếu step/tier/quorum/chữ ký
K5 Hai đường PA1/PA2 biểu diễn được? PARTIAL → CHƯA ĐỦ PA1=status draft→applied; PA2 staging MOW không thấy (chỉ IU staging)
K6 Lớp run/instance workflow có thiếu không? CÓ THIẾU 0 bảng workflow_run/instance/step_run (Vòng 1 + scan)
K7 MOUT có registry + bản đúc/report run/phân phối? KHÔNG output_table_registry/report_registry/report_run/recipient/distribution vắng; chỉ table_registry+v_report_*
K8 Có nơi hứng analytics + correlation_id xuyên suốt? KHÔNG event_outbox chỉ system; wcr/tasks/approval_requests không correlation_id chung
K9 Liên thông 4 mẹ đã có khóa dữ liệu thật? KHÔNG 0 FK cụm; không anchor 7 tầng; chỉ eco-nav UI + wcr MOW-internal
K10 Đường ghi tự động DOT/agent + Secret Manager đủ rõ? CHƯA XÁC MINH/PARTIAL secret không ở DB (đúng nguyên tắc) nhưng 0 DOT mother-verb; cơ chế secret metadata chưa soi
K11 Pilot xuyên tầng chạy không tạo bảng mới? KHÔNG nửa MOIT cần field_registry+input_form_registry mới (nửa MOT chạy được = Pilot 0)
K12 Miếng tối thiểu phải thêm? (liệt kê) field_registry+input_form_registry(+1 design_template form+routing)+DOT-submit; (tùy) output_table_registry; cột anchor_node/tier; row-perm tasks
K13 Có FK cứng nào chưa xác minh cùng DB? KHÔNG (đều cùng directus.public) nhưng hạ CHƯA ĐỦ DỮ LIỆU cho các khóa trỏ bảng vắng/text (lý do dữ liệu, không khác-DB)
K14 Có mâu thuẫn preview↔KB cần người chốt? chính: MOIT note "registry tồn tại" ↔ live NULL; phụ: MOW EXTEND/views, MOUT registry (§12)

Hết khảo sát Vòng 2. Chỉ SELECT đọc-only + đúng 1 tài liệu KB này. Không mutation DB / Directus write / tạo bảng/field/DOT/event/workflow/task / deploy / git / in secret value. Không sửa báo cáo Vòng 1.