LỆNH 3A — Khôi phục Nuxt source thành tập cha của production
LỆNH 3A — Khôi phục Nuxt source thành tập cha của production
Ngày thực hiện: 2026-07-16
Phạm vi: Nuxt source SSOT/opt/incomex/docker/nuxt-repo
Verdict: READY_FOR_REPORT_RECENT_IMPLEMENTATION
Production: ZERO-TOUCH — chưa deploy
0. Kết luận điều hành
Candidate Nuxt mới đã giữ nguyên toàn bộ route/API và Reports live refresh, đồng thời phục hồi đúng phần Knowledge Pivot Matrix còn thiếu. Kết quả verifier cuối:
ROUTE_ARTIFACTS production=88 candidate=88
API_HANDLERS production=40 candidate=40
PRODUCT_SOURCE_INVENTORY production=531 candidate=531
LIVE_ONLY_PRODUCT_SOURCES=(none)
CANDIDATE_ONLY_PRODUCT_SOURCES=(none)
TYPECHECK=PASS
BUILD=PASS
CANARY_VERDICT=PASS
Commit cục bộ trên VPS:
ae694716d5647ce1ed7f3118274645f5d2cf060b
fix(pivot): restore production matrix in VPS source
Commit chỉ chứa:
web/components/templates/MatrixView.vue
web/pages/knowledge/pivot/index.vue
Không deploy, không restart/reload/recreate, không sửa nginx/compose/DB/Balo, không push GitHub và không kích hoạt workflow. Mission dừng tại đây; không thêm report “Balo gần đây”.
1. Luật, ba câu tuyên ngôn và phương pháp
Đã đọc trực tiếp trước khi sửa:
.claude/skills/incomex-rules.md— 36 mục, quy trình 8 bước và quy trình hai mũ;- Operating Rules SSOT v7.58 rev51;
- VPS Operating Rules v1.0 rev2;
- Hiến pháp v4.6.3 rev44;
- báo cáo forensic Lệnh 1.5 rev2 và báo cáo Reports pre-deploy rev2.
Ba câu tuyên ngôn:
- Vĩnh viễn: source SSOT sau mission phải là tập cha nội dung của runtime hiện tại, không chỉ vá để build qua.
- Nhầm được không: inventory hai chiều, hash API và marker/content verifier chặn mất Matrix, Reports refresh hoặc route trước mọi deploy sau này.
- Tự động: typecheck, build và verifier artifact/source-map tự chứng minh tập cha; mission không tạo framework sản phẩm mới.
Mũ thi công chỉ phục hồi đúng hai surface đã được forensic nhận diện. Mũ giám sát chạy lại inventory độc lập trên production artifact và candidate build.
2. Gate 0 — nền trước mission
Nuxt source path: /opt/incomex/docker/nuxt-repo
Branch: main
HEAD trước mission: da89657cf2d3a4751fe01ed95485d0dbad49eb26
da89657: chính là HEAD trước mission
Working tree trước mission:
? web-rp-current
web-rp-current là linked worktree có sẵn, ở commit d04d8e5624f92d26b868c93adc50fca5e2f07b7f; không thuộc mission và không được stage.
Production trước mission:
container: /incomex-nuxt
image: asia-southeast1-docker.pkg.dev/github-chatgpt-ggcloud/web-test/nuxt-ssr:latest
image_id: sha256:72715a92885c9b2a467cabccdb1e3b8e5221dbfdae68e59f9daef0af08bfab30
started_at: 2026-07-11T02:50:33.302411141Z
running: true
mount: /opt/incomex/deploys/nuxt-output -> /app/.output (rw=true)
Candidate artifact trước mission còn ở web/.output, mtime 2026-07-15 05:49:32 +0200. Production artifact nằm ở /opt/incomex/deploys/nuxt-output; hai đường này tách biệt, nên build candidate không đổi runtime.
Backup byte-exact trước sửa
Backup ngoài working tree:
/opt/incomex/backups/nuxt-3a-20260716T130312/
Hash:
current/web/pages/knowledge/pivot/index.vue
c51a9a97b59ac5f21e9bfc42b488b240f9e97c0b1288bae5f88abe967e461854
MatrixView trước mission: ABSENT
provenance MatrixView.vue:
ba28b6b16b86c330531ab5401a68f3636c784c29a54ce53942e171ac0849244b
provenance pivot/index.vue:
79e7132caad39dd4aa8f070092b08f7a89435bf45d8a7d59ad1e1d32fa1a07e7
3. Inventory production và candidate trước sửa
| Surface | Production runtime | Candidate source da89657 |
Candidate build cũ | Kết quả trước sửa | Nguồn phục hồi |
|---|---|---|---|---|---|
| Route artifact | 88 file handler+map | các route source còn | 88 file | Khớp | Không cần phục hồi |
| API handler | 40 | còn | 40 | Khớp | Không cần phục hồi |
| Knowledge Pivot page | Có Matrix | Có trang Pivot nhưng thiếu block Matrix | thiếu ba marker Matrix | Thiếu | Git object 8eb1cbb + production source-map |
MatrixView.vue |
source-map runtime ghi nhận component | Không có file | không có marker | Thiếu | blob 77a51c01… |
pivot-matrices |
Có | 0 | 0 | Thiếu | block từ 8eb1cbb |
TemplatesMatrixView |
Có | 0 | 0 | Thiếu | component + wiring từ 8eb1cbb |
matrix_spec |
Có | 0 | 0 | Thiếu | đọc pivot_definitions.matrix_spec từ 8eb1cbb |
reports/live |
Có | Có | Có | Khớp | Giữ nguyên |
handleRefresh |
Có | Có | Có | Khớp | Giữ nguyên |
Cache-Control: no-store |
Có | Có | Có | Khớp | Giữ nguyên |
| Registries Pivot APIs | Có | Có | Có | Khớp | Giữ nguyên |
So sánh toàn bộ sources trong source-map trước sửa chỉ tìm thấy một product source live-only:
components/templates/MatrixView.vue
Không phát hiện feature live-only nào khác. Vì vậy không kích hoạt HOLD và không mở rộng phạm vi.
4. Provenance phần Matrix
Git object cục bộ trên VPS chứng minh:
8eb1cbb S150-P2: TPL-002 DirectusMatrix — matrix display on Tab Pivot (#660)
df739c6 (vps-backup-20260405) S167: add 18 GH-only files to VPS
Các object/hash liên quan:
MatrixView git blob: 77a51c01b1b836b63f63b17654930ef6d39330f5
MatrixView SHA-256: ba28b6b16b86c330531ab5401a68f3636c784c29a54ce53942e171ac0849244b
Pivot page blob 8eb1cbb: 987d35c…
Pivot page SHA-256: 79e7132caad39dd4aa8f070092b08f7a89435bf45d8a7d59ad1e1d32fa1a07e7
Production source-map:
server/chunks/build/index-CuHoYtke.mjs.map
sources=../../../../components/templates/MatrixView.vue,
../../../../pages/knowledge/pivot/index.vue
Candidate build sau phục hồi:
server/chunks/build/index-BIAWNrd2.mjs.map
sources=../../../../components/templates/MatrixView.vue,
../../../../pages/knowledge/pivot/index.vue
Marker trong hai chunk Matrix giống nhau về số lần xuất hiện:
production candidate
pivot-matrices 1 1
TemplatesMatrixView 2 2
matrix_spec 3 3
Diff compiled chunk chỉ khác tên hash của các import chunk và dòng sourceMappingURL; logic Matrix không khác. Không lấy repository hoặc nguyên commit từ GitHub remote.
5. Sửa tối thiểu và diff
Đã phục hồi nguyên byte component Matrix từ Git object và chỉ thêm lại 24 dòng wiring/block vào trang Pivot:
useAsyncData('pivot-matrices', ...)đọcpivot_definitionsđang active và cómatrix_spec;- render
TemplatesMatrixViewsau bảng Pivot hiện hữu; - không refactor, không đổi API contract, không sửa style ngoài component đã có provenance.
Diff trước commit:
web/components/templates/MatrixView.vue | 225 ++++++++++++++++++++++++++++++++
web/pages/knowledge/pivot/index.vue | 24 ++++
2 files changed, 249 insertions(+)
Hash source sau sửa trùng tuyệt đối nguồn provenance:
web/pages/knowledge/pivot/index.vue
79e7132caad39dd4aa8f070092b08f7a89435bf45d8a7d59ad1e1d32fa1a07e7
web/components/templates/MatrixView.vue
ba28b6b16b86c330531ab5401a68f3636c784c29a54ce53942e171ac0849244b
Reports không đổi so với da89657:
REPORTS_SOURCE_DIFF_BEGIN
REPORTS_SOURCE_DIFF_END
6. Typecheck và build — mũ thi công
Typecheck output thật:
> @ typecheck /opt/incomex/docker/nuxt-repo/web
> nuxt typecheck
✔ Globals loaded into appConfig
✔ Directus Module Loaded
exit_code=0
Build output chốt:
✔ Client built in 52554ms
✔ Server built in 50004ms
[nitro] ✔ Nuxt Nitro server built
Σ Total size: 35.5 MB (10.1 MB gzip)
└ ✨ Build complete!
exit_code=0
Build có cảnh báo CSS SVG checkerboard, browserslist cũ và chunk lớn đã tồn tại trong codebase; không có lỗi type/build và không phát sinh từ hai file Matrix.
7. Verifier — mũ giám sát
7.1 Route/API inventory và hash nội dung
ROUTE_HANDLERS live=44
ROUTE_HANDLERS candidate=44
ROUTE_ARTIFACTS live=88
ROUTE_ARTIFACTS candidate=88
ROUTE_RELATIVE_DIFF_BEGIN
ROUTE_RELATIVE_DIFF_END
API_HANDLERS live=40
API_HANDLERS candidate=40
Hash bốn API trọng yếu trùng byte production:
api/registries-pivot/node.get.mjs
live=candidate=5402d21f4b95a1473a8860be6d078488613e81bf950cf2b4ecc3f01c26155800
api/registries-pivot/rows.get.mjs
live=candidate=4dc7e46eb5259da2a55d18dbafb3d305f01ef1414f53983b44e105cdcff23942
api/registries-pivot/summary.get.mjs
live=candidate=fb81d88c927a142409728fbc0080564f6e8bde655f66bf88ac52b8a24d6b8cbc
api/reports/live.get.mjs
live=candidate=e1e73c0c9d55d6a56b7398365dbafc1be6742c84834dabffad70608dc9c93eb4
7.2 Marker/content inventory
Số file artifact chứa marker:
marker production candidate
pivot-matrices 2 2
TemplatesMatrixView 1 1
matrix_spec 2 2
reports/live 6 5
handleRefresh 1 1
no-store 7 6
Chênh số file đóng gói của reports/live và no-store không phải chênh logic: route Reports live trùng SHA-256 byte-for-byte, source Reports không đổi, và handleRefresh vẫn có trong candidate. Verifier không dùng riêng count để kết luận.
7.3 Canary
CANARY /knowledge/pivot=PASS source+map+Matrix
CANARY /reports=PASS source+map
CANARY /reports/report-pg=PASS dynamic-report-host+map
CANARY /reports/report-balo-table=PASS dynamic-report-host+map
CANARY /api/registries-pivot/summary=PASS source+handler
CANARY /api/reports/live=PASS source+map+handler+no-store
CANARY_VERDICT=PASS
Hai URL report cụ thể dùng chung khuôn pages/reports/[report]/index.vue; khuôn resolve theo table_registry.page_url, không hardcode slug.
7.4 Không còn live-only feature
Verifier evidence:
PRODUCT_SOURCE_INVENTORY production=531 candidate=531
LIVE_ONLY_PRODUCT_SOURCES_BEGIN
LIVE_ONLY_PRODUCT_SOURCES_END
CANDIDATE_ONLY_PRODUCT_SOURCES_BEGIN
CANDIDATE_ONLY_PRODUCT_SOURCES_END
VERDICT=PASS_NO_LIVE_ONLY_PRODUCT_SOURCE
Script mission-only:
knowledge/current-state/reports/evidence/nuxt-source-superset-3a-20260716/
verify-source-map-inventory.mjs
8. Git scope và trạng thái sau commit
Output commit thật:
STAGED_FILES
web/components/templates/MatrixView.vue
web/pages/knowledge/pivot/index.vue
[main ae69471] fix(pivot): restore production matrix in VPS source
2 files changed, 249 insertions(+)
create mode 100644 web/components/templates/MatrixView.vue
COMMIT=ae694716d5647ce1ed7f3118274645f5d2cf060b
Không dùng git add -A. Diff mission scope sau commit rỗng:
DIFF_AFTER_COMMIT_BEGIN
DIFF_AFTER_COMMIT_END
Working tree sau commit:
? web-rp-current
Đây là linked worktree có sẵn, không thuộc commit. da89657 hiện là ancestor trực tiếp của HEAD mới.
9. Chứng minh candidate mới là tập cha
| Điều kiện | Bằng chứng | Kết quả |
|---|---|---|
| Matrix còn | source/hash provenance, 3 marker, Matrix source-map hai phía | PASS |
| Reports refresh còn | source diff rỗng, handleRefresh, no-store, API hash trùng production |
PASS |
| Route cũ còn | 88/88, relative diff rỗng | PASS |
| API cũ còn | 40/40; 4 API trọng yếu trùng byte | PASS |
| Không còn product source live-only | source-map inventory 531/531, hai tập chênh rỗng | PASS |
| Candidate không mang thêm feature ngoài phạm vi | candidate-only product source rỗng | PASS |
Kết luận: candidate tại ae694716… là tập cha nội dung đã kiểm của production hiện tại và đủ điều kiện chuyển sang mission riêng triển khai report gần đây, nhưng chưa được deploy trong Lệnh 3A.
10. Zero-touch production
Xác minh cuối mission:
production started_at=2026-07-11T02:50:33.302411141Z
production restart_count=0
production running=true
production image_id=sha256:72715a92885c9b2a467cabccdb1e3b8e5221dbfdae68e59f9daef0af08bfab30
production mount=/opt/incomex/deploys/nuxt-output -> /app/.output rw=true
NUXT_DEPLOY=NOT_RUN
CONTAINER_RESTART_RELOAD_RECREATE=NOT_RUN
NGINX_CHANGE=NOT_RUN
COMPOSE_CHANGE=NOT_RUN
DB_WRITE=NOT_RUN
BALO_CHANGE=NOT_RUN
GITHUB_PUSH=NOT_RUN
WORKFLOW_TRIGGER=NOT_RUN
Candidate build mới có mtime 2026-07-16 13:10:12 +0200; production mount vẫn trỏ /opt/incomex/deploys/nuxt-output, không trỏ candidate build.
11. Evidence path
VPS backup/provenance/verifier:
/opt/incomex/backups/nuxt-3a-20260716T130312/
Local mission evidence:
knowledge/current-state/reports/evidence/nuxt-source-superset-3a-20260716/
KB report path:
knowledge/current-state/reports/codex-lenh-3a-nuxt-source-production-superset-2026-07-16.md
CHỐT: READY_FOR_REPORT_RECENT_IMPLEMENTATION. DỪNG, chờ lệnh tiếp theo của Owner.