Mission 0.5 — Fix Production Blockers (3 Blockers + birth_registry status)
📋 HO SO QUA TRINH — KHONG PHAI LUAT, KHONG PHAI HUONG DAN HIEN HANH
Day la ban ghi mot vong review/thao luan da ket thuc. Doc de hieu boi canh lich su, DUNG lam can cu de quyet dinh hay thuc thi.
Rieng tai lieu nay la BAN GIAO VIEC cho mot phien lam viec da qua. Cac lenh trong day (merge, deploy, fix) da duoc giao tu 2026, DUNG chay lai.
DO: 2026-07-29 HAN DUNG: tu 2027-01-29 nhan nay la GIA THUYET — DO LAI truoc khi dua vao no. CHI TIET:
docs/BAN-DO-HE-THONG-20260729.md
MISSION 0.5: FIX PRODUCTION BLOCKERS — ĐIỀU 26
Giao: Claude Code CLI (claude-go) Mục tiêu: Fix 3 blockers SSH-verified → 8/8 contract tests PASS KHÔNG SỬA KIẾN TRÚC. KHÔNG TẠO PIVOT. Chỉ fix blockers hiện tại.
⛔ 4 REQUIRED CHECKS GREEN = MERGE NGAY
KHÔNG đợi build/E2E/Terraform/docs-guard. MERGE ≠ DONE: sau merge → deploy → smoke-test → verify production URL → THEN báo DONE.
📋 CHECKPOINT BẮT BUỘC (đọc TRƯỚC khi làm)
Đọc SSOT:
search_knowledge("handoff S141")
search_knowledge("council claude code review dieu26 round2")
Trả lời Assembly Gate:
- Q0: "PostgreSQL đã giải quyết chưa?" → CÓ, sửa trực tiếp PG function + GRANT
- Q1-Q5: confirm đọc xong SSOT
3 BLOCKERS CẦN FIX
B1: GRANT TRUNCATE privilege
# SSH vào VPS, chạy:
docker exec -i postgres psql -U directus -d directus -c "
GRANT TRUNCATE ON v_registry_counts TO directus;
GRANT TRUNCATE ON v_registry_summary TO directus;
"
Verify B1:
docker exec -i postgres psql -U directus -d directus -c "
SELECT has_table_privilege('directus', 'v_registry_counts', 'TRUNCATE');
SELECT has_table_privilege('directus', 'v_registry_summary', 'TRUNCATE');
"
# Kết quả: cả 2 = true
B2: Fix count_material trong summary INSERT
SSH vào PG, đọc function refresh_registry_counts() hiện tại:
docker exec -i postgres psql -U directus -d directus -c "
SELECT prosrc FROM pg_proc WHERE proname = 'refresh_registry_counts';
" > /tmp/current_function.sql
Tìm dòng INSERT vào v_registry_summary → thêm count_material column.
Logic: count_material = (SELECT SUM(record_count) FROM v_registry_counts WHERE composition_level = 'material')
Verify B2:
docker exec -i postgres psql -U directus -d directus -c "
SELECT count_material FROM v_registry_summary LIMIT 1;
"
# Kết quả: > 0 (expected ~55)
B3: Sync code file với PG deployed
# Dump current deployed function
docker exec -i postgres psql -U directus -d directus -c "
SELECT pg_get_functiondef(oid) FROM pg_proc WHERE proname = 'refresh_registry_counts';
" > /tmp/deployed_refresh.sql
docker exec -i postgres psql -U directus -d directus -c "
SELECT pg_get_functiondef(oid) FROM pg_proc WHERE proname = 'test_counting_contract';
" > /tmp/deployed_test.sql
So sánh với code file scripts/dot-pg-views-ensure.mjs (hoặc tương đương).
Cập nhật code file cho khớp với PG deployed + B2 fix.
B3.5: Add status field cho birth_registry (ngoại lệ duy nhất)
# Verify birth_registry thiếu status
docker exec -i postgres psql -U directus -d directus -c "
SELECT column_name FROM information_schema.columns
WHERE table_name = 'birth_registry' AND column_name = 'status';
"
# Nếu trống → thêm:
docker exec -i postgres psql -U directus -d directus -c "
ALTER TABLE birth_registry ADD COLUMN IF NOT EXISTS status VARCHAR(20) DEFAULT 'active';
UPDATE birth_registry SET status = 'active' WHERE status IS NULL;
"
Sau đó tạo field status trong Directus cho birth_registry collection (qua API hoặc DOT).
RE-TEST: 8/8 PASS
docker exec -i postgres psql -U directus -d directus -c "
SELECT * FROM test_counting_contract();
"
Kết quả mong đợi: 8 dòng, tất cả status = 'PASS'. Đặc biệt:
- T1: active_count = record_count → PASS (sau B1 fix cho phép refresh chạy đúng)
- T5: count_material > 0 → PASS (sau B2 fix)
BÁO CÁO BẮT BUỘC
Sau khi xong, tạo report tại knowledge/current-state/reports/mission-05-blockers-fix.md:
## Mission 0.5 Results
### B1: GRANT TRUNCATE
- Trước: [output cũ]
- Sau: [output mới]
### B2: count_material
- Trước: count_material = [giá trị]
- Sau: count_material = [giá trị]
### B3: Code sync
- Diff: [số dòng khác biệt]
- Files updated: [danh sách]
### B3.5: birth_registry status
- Trước: [có/không có column]
- Sau: status column added, [N] records = 'active'
### Contract Tests
- T1: [PASS/FAIL] — [giá trị]
- T2: [PASS/FAIL]
- T3: [PASS/FAIL]
- T4: [PASS/FAIL]
- T5: [PASS/FAIL] — count_material = [giá trị]
- T6: [PASS/FAIL]
- T7: [PASS/FAIL]
- T8: [PASS/FAIL hoặc N/A]
### Production URL verify
- https://vps.incomexsaigoncorp.vn/api/health → [status]
§0-AF: Evidence BẮT BUỘC từ https://vps.incomexsaigoncorp.vn, KHÔNG từ Directus/localhost.
RÀNG BUỘC
- KHÔNG sửa kiến trúc. Chỉ fix 3 blockers + 1 status field.
- KHÔNG tạo pivot_definitions hay pivot_count(). Đó là Mission 1.
- KHÔNG #DISABLE triggers hay views. Đó là Mission 1.
- Test local TRƯỚC khi push. Gộp fix vào 1 commit.
- Tiết kiệm context. Không đọc toàn bộ Hiến pháp, chỉ đọc handoff + report R2.
Mission 0.5 | Fix 3 blockers | Re-test 8/8 PASS | S141