KB-73A4

S176-INVESTIGATE K0 — Timeline + Retention

12 min read Revision 1
s176investigateddldmlphaseCk0timelineretention

title: "S176-INVESTIGATE K0 — Mốc thời gian + Retention log" sprint: S176 phase: INVESTIGATE block: K0 date: 2026-04-13 status: done tags: ['s176','investigate','ddl','dml','phaseC','k0','timeline','retention']

S176-INVESTIGATE · K0 — Mốc thời gian + Retention

Mục tiêu: trả lời 3 câu mốc để phân loại writer L1/L2/L3 × H1/H2/H3 ở các khối sau. Chế độ: CHỈ ĐỌC. Không GRANT/REVOKE/ALTER. Nguồn chính: Directus KB (knowledge_documents), PG trực tiếp qua SSH (SELECT only), Directus REST /items/* aggregate.


1. Mốc DOT 100% — ban hành khi nào?

Phương pháp

  • Query knowledge_documents qua Directus REST với file_path _contains operating-rulesconstitution.
  • Đọc nội dung knowledge/dev/laws/constitution.mdknowledge/dev/ssot/operating-rules.md để trích trực tiếp câu có "DOT 100%".

Kết quả

Artifact Doc ID (Directus) File path Ngày KB Phiên bản
Hiến pháp Kiến trúc 945 knowledge/dev/laws/constitution.md created 2026-03-30 / updated 2026-04-03 v4.4.0 BAN HÀNH (S148), cập nhật S157 2026-04-02 (+Điều 38)
OR SSOT 955 knowledge/dev/ssot/operating-rules.md created 2026-03-30 / updated 2026-04-11 v7.57-draft (S176)

Trích HP v4.4.0 (id=945):

11 NGUYÊN TẮC NỀN TẢNG — CẤM VI PHẠM | 3 | DOT 100% | Mọi thao tác qua script | Không DOT = không làm được |

Trích OR v7.57-draft (id=955):

V. 13 NGUYÊN TẮC — CẤM VI PHẠM NT-01 SSOT | NT-02 Tự động 100% | NT-03 DOT 100% | NT-04 Sẵn sàng thay đổi | … | NT-12 DOT cặp | NT-13 PG FIRST

Luật chi tiết:

  • Điều 35 — Luật Quản trị DOT v5.0 (ban hành S155, 3 vòng Council, 67 domain rules, 271 DOT tools) — từ changelog HP v4.4.0.

Kết luận mốc

  • Mốc DOT 100% tường minh sớm nhất trong KB hiện hữu: 2026-03-30 (S148 — HP v4.4.0 BAN HÀNH).
  • Luật chuyên biệt (Đ35 v5.0) đến từ S155 (sau S148). Ngày S155 chưa tra chính xác.
  • Chưa verify: DOT 100% có tồn tại ở bản HP trước v4.4.0 (v4.3.0, v3.9…) hay không — KB đã retire bản cũ ("Hiến pháp v3.9 — SUPERSEDED"). Không tìm thấy bản v4.3.0 còn lưu trong knowledge_documents qua query hiện tại.
  • Anchor dùng cho K1-K4: bất kỳ writer nào có last-touch > 2026-03-30 và KHÔNG nằm trong dot_tools = vi phạm DOT 100% thời kỳ H3.

2. Migration MySQL → PG — khi nào xong?

Phương pháp

  • Đọc S115 Final Report (id=570, knowledge/current-state/reports/s115-mysql-to-pg-report).
  • Đối chiếu header amendment trong docs/ssot/constitution.md local.
  • Đọc S174-INV-02 (id=1116) để xác nhận không còn MySQL daemon.

Kết quả

Sự kiện Ngày Nguồn
S115 MySQL→PG Migration COMPLETE 2026-03-13 Doc 570 s115-mysql-to-pg-report — "Date: 2026-03-13 · Status: COMPLETE · PRs #496 #497 #498"
Amendment vào constitution.md 2026-03-13 docs/ssot/constitution.md line 1: "[S115 AMENDMENT — 2026-03-13] Phụ lục E 'MySQL First' đã RETIRED"
Xác nhận không còn MySQL daemon 2026-04-08 S174-INV-02 (doc 1116): "Không có MySQL daemon/binary/user/port đang chạy trên host"

Trích S115 (doc 570):

  • PR #496 — feat: migrate Directus from MySQL to PostgreSQL
    • infra/docker/docker-compose.yml: MySQL service replaced with PostgreSQL 16
    • infra/docker/.env.example: MySQL vars replaced with PG vars
    • dot/configs/directus.env.template: DB_CLIENT=pg, port 5432
    • scripts/0047c_*.sh (3 files): Added DEPRECATED headers
  • Verification: DB_CLIENT=pg on VPS: Confirmed, MySQL container STOPPED: incomex-mysql Exited (0)

Kết luận mốc

  • Migration xong: 2026-03-13.
  • Danh sách writer đã rewrite cho PG: CHƯA TỒN TẠI trong S115 report. Báo cáo chỉ liệt kê infra-swap (compose + env + 3 script 0047c_* bị đánh DEPRECATED). KHÔNG có audit app-layer writers. → Giả định ngầm: "Directus là writer chính → đổi DB_CLIENT là đủ; mọi script khác đi qua Directus API." Giả định này CHƯA VERIFY → là câu hỏi mở của K2 (bypass writers).
  • S174-INV-02 (2026-04-08) tìm thấy 5 cụm dormant trong env/repo/migration-backups/build path → vẫn còn bề mặt điều tra cho remnant PATH, nhưng không phải daemon sống.

Phát hiện bất thường

  • Header amendment nằm ở bản local docs/ssot/constitution.md, nhưng KB version (doc 945, HP v4.4.0) đã viết lại hoàn toàn → không còn dấu amendment S115. Local vs KB đang drift về thể loại (HP v1.11e cũ vs HP v4.4.0 mới).

3. Retention các nguồn log (MAX thực tế, không cap)

Phương pháp

  • Directus REST /items/<collection>?aggregate[count]=id&aggregate[min]=<field>&aggregate[max]=<field>.
  • PG trực tiếp qua SSH docker exec postgres psql -U directus cho directus_activity, directus_revisions.
  • Kiểm tra cấu hình WAL: SHOW wal_keep_size; SHOW archive_mode; SHOW archive_command;.

Ma trận retention

# Nguồn log Vị trí thật Count Min Max Retention thực Ghi chú
1 directus_activity PG directus.public.directus_activity 102,496 2025-12-07 09:13:49 2026-04-13 07:41:37 ~128 ngày Có trước cả mốc migration — data đã được mang từ MySQL sang PG hoặc bắt đầu khi Directus deploy ban đầu. Xuyên suốt H2→H3.
2 directus_revisions PG directus.public.directus_revisions 97,219 2025-12-07 10:55:27 (id=1, qua join activity) ~128 ngày Không có field timestamp trực tiếp, lấy qua FK activity.
3 system_issues Directus/PG 1,069 2026-03-10 05:37:30 2026-04-12 01:30:03 ~34 ngày Bắt đầu 3 ngày trước migration — có thể bảng mới lập từ đợt S115 hoặc bị reset.
4 registry_changelog PG public.registry_changelog 20,614 2026-03-10 03:28:07 2026-04-13 06:00:47 ~34 ngày Trùng mốc với system_issues → hai collection đều ra đời cùng đợt đầu tháng 3.
5 entity_audit_queue PG 1 2026-03-20 10:07:59 2026-03-20 10:07:59 1 row duy nhất Không được tiêu thụ — queue rỗng thực tế.
6 dot_tools.last_executed Directus collection 272 rows min last_executed = 2026-03-31 08:08:57 Không phải log — chỉ lưu timestamp lần chạy gần nhất per DOT, không có lịch sử run. NT12 vẫn không có nhiệt kế "DOT chạy mấy lần/bao giờ".
7 dot_run_log KHÔNG TỒN TẠI 0 Đã quét: information_schema.tables PG không có bảng tên chứa run hoặc log trùng dot_run_log; knowledge_documents collection list không có.
8 PG WAL /var/lib/postgresql/data/pg_wal (container postgres) pg_wal dir = 81M KHÔNG retain archive_mode=off, archive_command=(disabled), wal_keep_size=0, max_wal_size=1GB. WAL chỉ đủ checkpoint cycle → không thể replay DDL/DML quá khứ.
9 PG database size directus database 270 MB total — nhỏ, toàn bộ query aggregate dưới 1 giây.

Phát hiện bất thường

  1. Không có dot_run_log: memory và skill đề cập "dot_run_log" là nguồn log chuẩn, nhưng NT12 "DOT cặp" không có backing storage. Nếu muốn verify một DOT có chạy không, hiện chỉ có dot_tools.last_executed (không phải log, chỉ timestamp mới nhất). → Điều tra bypass (K2) phải dựa chủ yếu vào filesystem/cron/code-grep, KHÔNG có runtime log.
  2. PG WAL archive OFF: không thể truy DDL event quá khứ ngoài 128 ngày của directus_activity. Mọi điều tra "ai ALTER TABLE" cần dựa vào directus_activity (cho DDL qua Directus API) + git history + source grep.
  3. Trùng mốc 2026-03-10: system_issuesregistry_changelog bắt đầu cùng ngày (3 ngày trước S115). Cần verify K2: có migration script tạo mới 2 bảng này không? Hay bị TRUNCATE lúc migrate?
  4. directus_activity có data từ 2025-12-07: cross mốc MySQL→PG → chứng tỏ data đã được pg_dump/mysqldump restore, không phải bảng mới. Nếu đúng, có thể dò DDL qua action='update'/action='create' trên collection directus_fields/directus_collections để truy DDL qua Directus API thời MySQL.
  5. entity_audit_queue chỉ có 1 row từ 2026-03-20: không tiêu thụ — nghi ngờ đây là bảng đăng ký kế hoạch nhưng không có producer nào bơm vào.

Cửa sổ điều tra khả thi

Lớp Cửa sổ tối đa Dùng cho
H3 (sau DOT 100%) 2026-03-30 → 2026-04-13 = 14 ngày Phát hiện vi phạm hiện tại
H2 (thời MySQL) 2025-12-07 → 2026-03-13 = 96 ngày Qua directus_activity (DDL qua Directus API)
H2/H3 chính xác mốc Chỉ có thể bóc qua directus_activity + git log
H1 (trước DOT 100%) Không có log runtime. Phải dùng git history + source grep.

4. Câu hỏi mở (chuyển sang K1-K4)

  1. DOT 100% lần đầu ban hành khi nào (trước HP v4.4.0 2026-03-30)? Cần tra git log knowledge/dev/laws/ để dò bản v4.3.0, v4.2.0, v3.9 còn lưu trong repo không.
  2. Danh sách writer đã rewrite cho PG có tồn tại dưới dạng checklist nào khác (PR #496 diff, S115 session handoff) không? Hay S115 thực sự chỉ đổi connection string?
  3. 2 bảng system_issues, registry_changelog ra đời ngày 2026-03-10: do ai tạo, qua flow nào? (K2)
  4. entity_audit_queue có producer không? Có phải di tích của kế hoạch cũ không? (K4 dead code)
  5. Tại sao không có dot_run_log mà vẫn yêu cầu DOT cặp (NT12) verify? NT13 PG FIRST + NT12 có đồng bộ không?

  • Backward: không (K0 là khối đầu)
  • Forward:
    • K1 — L1 chính thức: dùng mốc 2026-03-30 làm đường cutoff phân biệt H2↔H3; dùng dot_tools + last_executed làm danh sách writer L1.
    • K2 — Bypass: dùng cửa sổ directus_activity (128 ngày) để check DDL bypass Directus; dùng grep cho các nguồn không log.
    • K3 — Credentials: PG user directus hiện có full DDL (xác nhận ở K3 bằng \du); WAL off có nghĩa không có "read replica role" nào đang chạy.
    • K4 — Shadow patterns: vì PG WAL và dot_run_log đều thiếu, K4 phải đào filesystem cron/systemd + source code.

6. Evidence trích dẫn

# Directus knowledge_documents
id=945 title="Hiến pháp Kiến trúc v4.4.0 BAN HÀNH" file_path=knowledge/dev/laws/constitution.md
  date_created=2026-03-30T07:11:34 date_updated=2026-04-03T08:12:07
id=955 title="Nguyên tắc Điều hành — SSOT" file_path=knowledge/dev/ssot/operating-rules.md
  date_created=2026-03-30T08:42:58 date_updated=2026-04-11T02:48:13
id=570 title="S115 MySQL to PostgreSQL Migration Report"
  date_created=2026-03-13T08:11:07
id=1116 title="S174-INV-02 — Rà tàn dư MySQL/Firestore/GCS/Artifact Registry"
  date_created=2026-04-08T10:13:21

# PG SELECT (docker exec postgres psql -U directus -d directus)
directus_activity:  count=102496  min=2025-12-07 09:13:49  max=2026-04-13 07:41:37
directus_revisions: count=97219   min(via join)=2025-12-07 10:55:27
system_issues:      count=1069    min=2026-03-10 05:37:30  max=2026-04-12 01:30:03
registry_changelog: count=20614   min=2026-03-10 03:28:07  max=2026-04-13 06:00:47
entity_audit_queue: count=1       min=max=2026-03-20 10:07:59
dot_tools:          count=272     last_executed min=2026-03-31 08:08:57

# PG config
wal_keep_size=0   max_wal_size=1GB   archive_mode=off   archive_command=(disabled)
pg_wal dir=81M    directus db size=270 MB

# dot_run_log
SELECT table_name FROM information_schema.tables WHERE table_schema='public' AND (table_name LIKE '%run%' OR table_name LIKE '%log%')
→ không có dot_run_log

7. Trạng thái

  • K0 DONE. Chờ duyệt để chuyển sang K1.
  • Không chỉnh sửa code/schema/quyền. Toàn bộ query là SELECT / GET.