From d6026b1436c628513984fbf949bc4b09444faa55 Mon Sep 17 00:00:00 2001 From: pqhuy1987 Date: Thu, 13 Aug 2026 01:58:29 +0700 Subject: [PATCH] =?UTF-8?q?[CLAUDE]=20Docs:=20S191=20closeout=20=E2=80=94?= =?UTF-8?q?=20v=C3=A1=2010=20FLAG=20H24=20+=20gotcha=20#92=20=C4=91?= =?UTF-8?q?=E1=BB=95i=20root-cause=20+=20RCA=20P0-BUNDLE=20+=203=20action?= =?UTF-8?q?=20refine=20(A7=20429=E2=86=92432)=20[skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5 --- .claude/WAL.md | 16 +- .claude/agent-memory/.mfe-state.json | 7 +- .claude/agent-memory/cicd-monitor/MEMORY.md | 33 ++-- .../cicd-monitor/archive/2026-08.md | 7 + .../cicd-monitor/archive/_INDEX.md | 2 + .claude/agent-memory/ctx-verifier/MEMORY.md | 9 + .claude/agent-memory/harness-eval/MEMORY.md | 9 + .claude/agent-memory/harness-refine/MEMORY.md | 8 + .../agent-memory/harvest-curator/MEMORY.md | 10 + .../agent-memory/lead-gap-auditor/MEMORY.md | 14 +- .../lead-gap-auditor/archive/2026-08.md | 6 + .../lead-gap-auditor/archive/_INDEX.md | 1 + .../agent-memory/lead-stale-auditor/MEMORY.md | 14 +- .../lead-stale-auditor/archive/2026-08.md | 6 + .../lead-stale-auditor/archive/_INDEX.md | 5 + .../ring1-audit/archive/_INDEX.md | 6 + .../agent-memory/tooling-auditor/MEMORY.md | 12 ++ .claude/agents/investigator-api.md | 2 +- .claude/governance/.session-counter.json | 47 +++-- .claude/skills/dependency-audit-erp/SKILL.md | 2 +- .../sub-cicd-va-goc-92.md | 173 ++++++++++++++++++ .../harness-eval-return.md | 68 +++++++ .../harness-refine-return.md | 42 +++++ .../runs/2026-08-13-S191-bookend-close/run.md | 43 +++++ .../sub-harvest-curator.md | 23 +++ .../sub-lead-gap.md | 16 ++ .../sub-lead-stale.md | 18 ++ .../sub-ring1-audit.md | 28 +++ .../sub-ring5-audit.md | 18 ++ .../sub-tooling-auditor.md | 17 ++ docs/CLAUDE.md | 4 +- docs/HANDOFF.md | 7 +- docs/STATUS.md | 10 +- ...26-08-12-2252-S189-S191-yc028-yc030-l15.md | 11 +- docs/gotchas.md | 19 +- docs/governance/error-ledger.md | 26 +++ docs/governance/so-yeu-cau-chu-du-an.md | 4 +- docs/guides/cicd.md | 2 +- 38 files changed, 664 insertions(+), 81 deletions(-) create mode 100644 .claude/agent-memory/lead-gap-auditor/archive/2026-08.md create mode 100644 .claude/agent-memory/lead-stale-auditor/archive/2026-08.md create mode 100644 .claude/agent-memory/lead-stale-auditor/archive/_INDEX.md create mode 100644 .claude/workflows/runs/2026-08-12-S190-soltuon-dieu-chinh-hd/sub-cicd-va-goc-92.md create mode 100644 .claude/workflows/runs/2026-08-13-S191-bookend-close/harness-eval-return.md create mode 100644 .claude/workflows/runs/2026-08-13-S191-bookend-close/harness-refine-return.md create mode 100644 .claude/workflows/runs/2026-08-13-S191-bookend-close/run.md create mode 100644 .claude/workflows/runs/2026-08-13-S191-bookend-close/sub-harvest-curator.md create mode 100644 .claude/workflows/runs/2026-08-13-S191-bookend-close/sub-lead-gap.md create mode 100644 .claude/workflows/runs/2026-08-13-S191-bookend-close/sub-lead-stale.md create mode 100644 .claude/workflows/runs/2026-08-13-S191-bookend-close/sub-ring1-audit.md create mode 100644 .claude/workflows/runs/2026-08-13-S191-bookend-close/sub-ring5-audit.md create mode 100644 .claude/workflows/runs/2026-08-13-S191-bookend-close/sub-tooling-auditor.md diff --git a/.claude/WAL.md b/.claude/WAL.md index 3447302..614ce7b 100644 --- a/.claude/WAL.md +++ b/.claude/WAL.md @@ -1,4 +1,5 @@ # WAL — auto-generated, không sửa tay +closing: S191 @2026-08-13T01:20+07:00 updated: 2026-08-13 | session: S191 (phiên-LOGIC L15, window 3) | branch: main goal: L15 trọn vế thi-công: YC-028/029/030 SHIP + cửa ngoài-giờ ĐÓNG. Phiên-LOGIC GIỮ MỞ — @@ -27,17 +28,18 @@ chain: KHẮC THẬT (2 ca: lệch CI-vs-local 103KB user / 39KB admin cùng commit; giả-thuyết "root-cause=disk đã đóng" BÁC lần 2). Admin D2FHMRPX cùng lò nhiễm nhưng ĐANG SỐNG → không đụng, chẩn ghi sổ (local KRJldwaN 1.780.807B sẵn nếu anh muốn đồng nhất) -[ ] chờ anh: KIỂM PROD GĐ3 tiếp (eoffice đã sống lại) · "ổn rồi" ⇒ mở W8 · chọn giờ VÁ GỐC - runner (dọn npm-cache SYSTEM + dispatch verify — SẼ rotate bundle prod) · tồn +[ ] chờ anh: KIỂM PROD GĐ3 tiếp (bundle mới CR538vZx/C10ta-wB) · "ổn rồi" ⇒ mở W8 · tồn (76)(77)(78)(79) · (89) · (74) · value_protect · YC-008↔YC-010 · (22)(67)(72) -next: 🔴 CẤM push CODE / dispatch CI cho tới khi runner được VÁ + VERIFY (build CI mới sẽ - đè hotfix bằng bundle nhiễm → trắng màn lại). Docs push = [skip ci]. Watch: reviewer - dư 131B · ring2 {đang-cãi} · [carry:w5-host-ondeleted] · OVERDUE:deep @bookend kế. +wf: bookend-close run=2026-08-13-S191-bookend-close (Sàn-5 — H2 bắt MISS 1/1) + +next: ✅ Ràng buộc CẤM-push ĐÃ GỠ (vá gốc 305b573f + run #488 PASS 6/6 + runtime-verify 2 app). + Watch: 3 vai over-cap byte (lead-gap 28.094 · ring2 27.458 · lead-stale 25.966) · + [carry:w5-host-ondeleted] · [carry:reset-doi-het] · nửa-lỗ #92 node runner chưa pin. verify: - prod: curl -s https://eoffice.solutions.com.vn/ | grep -o 'index-D6lFjgKF.js' # HOTFIX local-build @S191 (BIN1bEGo = CI nhiễm, crash) - admin: curl -s https://admin.solutions.com.vn/ | grep -o 'index-D2FHMRPX.js' + prod: curl -s https://eoffice.solutions.com.vn/ | grep -o 'index-CR538vZx.js' # CI run #488 (hash CI==local 4/4) + admin: curl -s https://admin.solutions.com.vn/ | grep -o 'index-C10ta-wB.js' mig: ssh vietreport-vps 'sqlcmd -E -S .\SQLEXPRESS -d SolutionErp -h -1 -Q "SELECT TOP 1 MigrationId FROM __EFMigrationsHistory ORDER BY MigrationId DESC"' # =20260812141501_AddContractEndedByLevelFinalize cron: ssh vietreport-vps 'powershell -NoProfile -Command "Select-String -Path C:\gitea\custom\conf\app.ini -Pattern archive_cleanup"' # co section vrdb: ssh vietreport-vps 'sqlcmd -E -S .\SQLEXPRESS -h -1 -Q "SELECT state_desc FROM sys.databases WHERE name=''Vietreport_Master''"' # =ONLINE diff --git a/.claude/agent-memory/.mfe-state.json b/.claude/agent-memory/.mfe-state.json index 2a88c9b..f994d65 100644 --- a/.claude/agent-memory/.mfe-state.json +++ b/.claude/agent-memory/.mfe-state.json @@ -1,7 +1,7 @@ { "strikes_total": 25, "rca_entries": 16, - "at": "2026-08-11", + "at": "2026-08-13", "warn_baseline": 25, "history": [ { @@ -158,6 +158,11 @@ "strikes_total": 25, "rca_entries": 16, "at": "2026-08-11 00:09" + }, + { + "strikes_total": 25, + "rca_entries": 16, + "at": "2026-08-13 01:14" } ] } diff --git a/.claude/agent-memory/cicd-monitor/MEMORY.md b/.claude/agent-memory/cicd-monitor/MEMORY.md index fa3e505..f2e5103 100644 --- a/.claude/agent-memory/cicd-monitor/MEMORY.md +++ b/.claude/agent-memory/cicd-monitor/MEMORY.md @@ -1,18 +1,12 @@ # CI/CD Monitor Agent — Persistent Memory -- **S190 (08-12) `091073f9` YC-029+YC-030 GĐ3 Duyệt HĐ (BE+2FE+**Mig 73**) — PASS TRỌN 6/6.** Deploy NGAY SAU P0 disk-0 S189: disk **25.9GB** free (lead dọn 4.7→26.6 giữ) ⇒ **disk-death KHÔNG tái**. 🔑 gate **697 EXACT** = 45 Domain + 652 Infra (Δ+17 vs #486=680, TRỌN ở Infra: YC-029 +13 cumulative + YC-030 finalize +4 = `ContractApproveFinalizeTests`). 🔑 **Mig 73 `AddContractEndedByLevelFinalize`** (mirror PE Mig 60, AddColumn bit NOT NULL reversible) áp prod: history top khớp + col `EndedByLevelFinalize` bit is_nullable=0 + `sys.tables` **97 unchanged**. 🔑 **Ship-proof 3 CHÂN:** rotate ×2 (eoffice `DqJszev6→BIN1bEGo`, admin `RZy2dzPC→D2FHMRPX`) + **size prod == dòng CI log TỚI BYTE** (1.819.492==1,819.49kB · 1.803.881==1,803.88kB, `application/javascript`) + **control âm** hash-CŨ→`text/html` 876B (overwrite THẬT). Smoke 200/401 chuẩn (login token len=468 · contracts/PE/menus). **#91 guard XANH** (updated_at 22:11:20 ≥ commit 22:10:10, branch-head khớp, ActionRun sinh) = ĐỐI LẬP hoàn toàn S189. 🔑 **PRE-snapshot chụp NGAY lúc build đang chạy** (deploy ở CUỐI ⇒ bundle+mig còn CŨ) = differential sạch. Evidence `runs/2026-08-12-S190-soltuon-dieu-chinh-hd/sub-cicd-deploy-yc030.md`. Tag `[s190, gate-697, mig73-ended-finalize, shipproof-3chan-bytematch, control-am-overwrite, disk-death-khong-tai, gotcha-91-xanh]` +- **S191 (08-13) `305b573f` vá GỐC #92 (CI-config-only: `deploy.yml`+2 lockfile) — PASS 6/6 + 1 caveat tự khai.** Run **#488** success 10m24s. 🔑 **PHÉP ĐO QUYẾT ĐỊNH: hash CI == local 4/4** (`CR538vZx`1.700.709·`DNE0buTg`94.665·`C10ta-wB`1.780.807·`CTIZKsjE`88.858) **DÙ runner node v24.15.0/npm11 ⟂ local v22.13.0/npm10** ⇒ nghi-vấn 'chênh node/npm = nguồn bất định thứ 2' **BỊ BÁC BẰNG ĐO**. GUARD-92 **2/2 app** `react don ban = 19.2.5`, 0 FAIL. Gate **697** Δ0. Mig **73** no-advance. 🔑 **BẪY MỚI — hash-delta VÔ DỤNG khi PRE đã trùng hash kỳ vọng** (prod đang chạy bản-cứu chép tay) ⇒ ship-proof chuyển sang **Last-Modified nhảy vào cửa sổ run** (18:10:28→18:23:17 · 18:10:37→18:21:58; run 18:13:51-18:24:15Z) + control âm hash-cũ→`text/html` 876B. Bổ sung #69: **mode-C FROZEN-nhưng-ĐÚNG**. 🔴 **Runtime-gap tự khai:** SHA256 prod==local byte-identical, bản local ĐÃ được người mở browser console-0-lỗi ⇒ tính-chạy-được **chuyển giao**; khác 2 lần crash ở CHẤT (byte-match CI⟂prod mà **cả hai đầu chưa ai chạy**). Nhưng tao KHÔNG tự mở browser được ⇒ **file-integrity KHÔNG thay runtime-check**; marker React trong bundle **CHƯA hiệu chuẩn (mất control âm)** ⇒ không dùng làm bằng chứng. Evidence `runs/2026-08-12-S190-soltuon-dieu-chinh-hd/sub-cicd-va-goc-92.md`. Tag `[s191, gotcha-92-va-goc, npm-ci-deterministic, hash-CI==local, guard92-2/2, LM-thay-hash-delta, runtime-gap-tu-khai]` -- **S189 (08-11) `92d8215a` YC-028 FE tách 404⟂lỗi-hệ-thống (8 FE, **0 BE**, 0-mig) — V1 FAIL 8/11 → V2 PARTIAL 8/9.** 🔴 **V1 = KHÔNG CÓ RUN ĐỂ MÀ ĐỎ**: push land, `ls-remote` đúng sha, mà **0 ActionRun**/484 task. 🔑 **DETECTOR #91 = 2 nguồn LỆCH trong CÙNG 1 API:** `/repos/{r}`→`updated_at` đọc **DB** = giờ push TRƯỚC ⟂ `/branches/main`→`commit.id` đọc **git trên ĐĨA** = sha mới ⇒ ref tiến trên đĩa mà tầng app chưa hề thấy push. **Stage 2 từ nay ĐO `updated_at ≥ giờ push` TRƯỚC khi kết luận 'đang chờ CI'.** Terminal push SẠCH ⇒ chết ở **notifier**, không ở receive-pack. Sửa = `workflow_dispatch` (204). 🔴 Nguy vì **mọi tín hiệu quen đều XANH** ⇒ chỉ **vắng-mặt thứ đáng lẽ có** mới tố cáo. 🔑 **CẶP ĐỐI-CHỨNG dập nghi-oan filter** (commit anh em có/không file non-ignored → có/không run). 🔑 **V2 SHIP PASS TRỌN:** gate **680 EXACT** Δ0 · JS rotate ×2 + **size prod khớp log CI TỚI BYTE** · marker **0→5/app = 10/10** · hash cũ→`text/html`. 🔑 **CSS không rotate mà vẫn ĐÚNG** (0 class Tailwind mới) — **JS đổi ⟂ CSS giữ = đúng hình dạng diff**. 🔴 **V2 FAIL: A/059 6/16 mẫu >3s (max 8,75s).** **Tự bác cold-start của chính mình vì burst-2 XẤU HƠN burst-1** ⇒ *warm-up curve đẹp KHÔNG đủ, phải đo burst THỨ HAI*. Loại trừ runbook (disk 28,2GB · orphan 0 · `AUTO_CLOSE=0`) → **RAM 4GB ép**: SQL `Total 213MB/Target 1,09GB`, PLE 522s ⇒ **LƯỠNG CỰC 0,6-1,0s vs 5-8,7s, trống ở giữa = hình dạng THIẾU RAM, không phải code chậm**. 🔑 **Logic rẻ hơn đo: commit 0 file BE ⇒ latency không thể do commit này.** 🔴 **Tự nhận:** `Restart-Service gitea` (khuyến nghị của chính tao) làm gitea tái chỉ mục 317MB+512s CPU/25ph, giành RAM/CPU với SQL ĐÚNG lúc đo — phải nói ra, không giấu vào chữ 'transient'. Treo: ghim `max server memory` · **nâng RAM = mặt thứ 2 của YC-028 (trước vỡ ĐĨA, nay ép RAM)** · `compact /u` `Vietreport_Master.mdf` (#88). Evidence `runs/2026-08-10-S189-bookstart-open/sub-cicd-monitor-yc028.md`. Tag `[s189, gotcha-91, detector-updatedat-vs-branchhead, burst2-bac-coldstart, luong-cuc-thieu-RAM, tu-nhan]` +- _(**S190 (08-12) `091073f9` YC-029+YC-030 GĐ3 Duyệt HĐ — PASS TRỌN 6/6**: gate **697 EXACT** (45+652, Δ+17 trọn ở Infra), **Mig 73** `AddContractEndedByLevelFinalize` áp prod (tables 97 unchanged), ship-proof **3 CHÂN** (rotate ×2 + size==log CI tới byte + control âm `text/html` 876B), #91 XANH. 🔑 **PRE-snapshot chụp NGAY lúc build đang chạy** (deploy ở CUỐI ⇒ bundle+mig còn CŨ) = differential sạch. verbatim → `archive/2026-08.md`)_ -- _(**S159 (07-29) — 4 đợt PASS/PARTIAL** [harvest hồi-tố @S172]: đợt-2 `1a47a61` PARTIAL bắt regression revoker 447/494 row → đợt-3 đóng bằng **3 chân kiềng** → đợt-4 tái xác nhận ⇒ **durability phải đo ≥2 restart**. 🔑 **control ÂM đọc ở tầng BUNDLE, không tầng source**. verbatim → `archive/2026-08.md`)_ +- _(**S189 (08-11) `92d8215a` YC-028 FE (8 FE, 0 BE, 0-mig) — V1 FAIL 8/11 → V2 PARTIAL 8/9**. 🔴 **V1 = KHÔNG CÓ RUN ĐỂ MÀ ĐỎ** (push land, sha đúng, 0 ActionRun) ⇒ đẻ ra **detector #91**: `/repos`→`updated_at` đọc **DB** ⟂ `/branches/main`→`commit.id` đọc **git ĐĨA**; nguy vì **mọi tín hiệu quen đều XANH**, chỉ **vắng-mặt thứ đáng lẽ có** mới tố cáo. 🔑 CẶP ĐỐI-CHỨNG dập nghi-oan filter. 🔑 **CSS không rotate mà vẫn ĐÚNG** (0 class Tailwind mới). 🔴 A/059 chậm: **burst-2 XẤU HƠN burst-1 ⇒ tự bác cold-start của chính mình**; lưỡng-cực 0,6-1s vs 5-8,7s = hình dạng **THIẾU RAM** (VPS 4GB). 🔑 **Logic rẻ hơn đo: commit 0 file BE ⇒ latency không thể do commit này.** 🔴 **Tự nhận:** `Restart-Service gitea` (khuyến nghị của chính tao) giành RAM/CPU với SQL đúng lúc đo. verbatim → `archive/2026-08.md`)_ -- _(**S168 (08-01) `0bfadc2` — PASS 6/6**: #444, gate 644 Δ+5 đúng 5 Fact mới. 🔑 **WIRE-PROOF = 400 GỌI TÊN FIELD** (mạnh hơn 401; chứng pool phục vụ BINARY MỚI mạnh hơn `w3wp` StartTime). 🔑 **CHỤP PRE NGAY khi vào việc** → differential thật 404→401, 0→1. 🔑 marker **BẤT-ĐỐI-XỨNG** · CSS = nhân chứng ARTIFACT KHÁC. verbatim → `archive/2026-08.md`)_ - -- _(**`aaed699` S167 K7 — PARTIAL 4/6+1**: #442 (run #441 CANCELLED). 🔴 **PUSH-ĐÈ NUỐT DEPLOY = gotcha #86**. 🔑 control-dương = chuỗi bản TIỀN-commit của CHÍNH file đang sửa. 🔑 seeder báo **2/3 upgraded** = chứng idempotent tầng-row miễn phí. ⚠️ `appcmd list wp` map PID→pool. verbatim → `archive/2026-08.md`)_ - -- _(**`1c6d77a` S167 K6 menu 12-key — PASS 5/5**: #440, gate 622 Δ0. 🔴 **0-hit marker SAI 2 LẦN do CƠ-CHẾ REGEX** (minify→BACKTICK · pattern-chứa-backtick qua biến làm `grep -cE` gãy IM LẶNG) ⇒ **LUẬT `grep -F`/python + trích byte thật TRƯỚC khi kết luận vắng-mặt**. 🔑 **COUNT-DELTA** khi literal đã tồn tại. 🔑 menu ẩn 12/12 mà route 68→68 ⇒ **ẩn client KHÔNG thu quyền** (#82). verbatim → `archive/2026-08.md`)_ - -- _(**Arc S155→S166 (#416→#439)** gate 551→622. 🔑 #438 **mốc PRE trong đề bài LÃO HOÁ sau MỖI deploy — bắt bằng ĐO**. 🔑 #436 marker = tên biến local thì 0 bit. 🔴 **#435 ACCEPTANCE CHÂN-LÝ-RỖNG** (`0==0` xanh mà 0 bit). 🔑 #434 TAM-GIÁC 3 nguồn. 🔴 #432 CẤM `HEAD~1` → neo `X^..X`. 🔴 #423 revoker lật 447/494 vì **đo TRƯỚC recycle**. verbatim → `archive/2026-08.md`)_ +- _(**Arc S155→S168 + #447 (gộp @S191)** gate 551→644. 🔑 **S168 WIRE-PROOF = 400 GỌI TÊN FIELD** (mạnh hơn 401) · **CHỤP PRE NGAY khi vào việc** · marker BẤT-ĐỐI-XỨNG. 🔴 **K7 `aaed699` PUSH-ĐÈ NUỐT DEPLOY = #86**. 🔴 **K6 0-hit marker SAI 2 LẦN do CƠ-CHẾ REGEX** (minify→BACKTICK · pattern-chứa-backtick qua biến làm `grep -cE` gãy IM LẶNG) ⇒ **LUẬT `grep -F`/python + trích byte thật TRƯỚC khi kết luận vắng-mặt**; menu ẩn 12/12 mà route 68→68 ⇒ **ẩn client KHÔNG thu quyền** (#82). 🔑 #447 **415 = họ hàng 411** ⇒ mọi mã pre-auth phải re-probe đúng dạng; **set-diff Mig 2 CHIỀU**. 🔑 #438 **mốc PRE trong đề bài LÃO HOÁ sau MỖI deploy**. 🔴 #435 **ACCEPTANCE CHÂN-LÝ-RỖNG** (`0==0` xanh mà 0 bit) · #432 CẤM `HEAD~1`→neo `X^..X` · #423 revoker lật 447/494 vì **đo TRƯỚC recycle**. 🔑 S159 **durability đo ≥2 restart** + **control ÂM ở tầng BUNDLE**. verbatim → `archive/2026-08.md` + `_INDEX.md`)_ > **Persistent diary cross-session.** Auto-injected first ~200 lines at spawn (L1 HOT). > Update BEFORE every stop. Tiered Memory v1: L1 HOT soft-cap ~30KB · L2 `archive/` on-demand · L3 RAG `search_memory` just-in-time. Keep entry ≤ 1.5K chars (gotcha #53). @@ -37,6 +31,7 @@ cicd-lane trả nhầm slice transcript thay verdict — **tao TÁI PHẠM dai n - **#39 act_runner github.com TCP timeout** — run hang "Set up job" 21s. Log `dial tcp github.com:443 i/o timeout`. Fix: manual checkout bypass hardcoded `.gitea/workflows/deploy.yml`. KHÔNG revert. - **#40 npm cache `tsc not found`** — `build_fe_admin` fail post `cache: npm`. DISABLED rolled back `a21790d`. KHÔNG re-enable. - **#41 paths-ignore docs-only skip** — check `git diff --name-only ..` vs **7-glob** `['docs/**','**/*.md','.claude/skills/**','.claude/agent-memory/**','.claude/workflows/runs/**','.gitignore','scripts/**.md']`. Gitea đọc *range* — ≥1 file non-ignored → build. ⚠️ **AS-6: memory-push/run-trace HẾT trigger CI.** ⚠️ @S189: filter ĐÚNG mà vẫn 0 run ⇒ xem **#91** trước khi đổ tại filter. +- **🔴 #92 runner build-env nhiễm → bundle crash runtime `useState null` (trắng màn prod ×2: #486 S189, #600 S191).** GỐC = `deploy.yml` **xoá `package-lock.json`** rồi `npm install` ⇒ mỗi run resolve lại cây theo semver ⇒ **cùng commit ra bundle khác nhau**. Vá @`305b573f`: giữ lockfile + `npm ci` + GUARD-92 (`npm ls react`, regex lookbehind `(?.. -- '*Migrations*'`.** -- **Bundle hash live:** baseline **#600 (08-12)** admin `D2FHMRPX`/`DVHtHLex` · eoffice `BIN1bEGo`/`b_d2fusd` (JS 1.819.492/1.803.881 B — khớp CI log tới byte). 🔑 Ship-proof rẻ nhất = size prod khớp dòng `dist/assets/…` TRONG LOG CI (tới byte). ⚠️ marker minify ra **BACKTICK** → `grep -F`/python. ⚠️ **re-snapshot LIVE sau status=success** (#69). ⚠️ id ≠ run_number (key theo head_sha). +- **Tests baseline: 697 PASS** (45 Domain + 652 Infra · 0 fail/skip) — tái xác nhận run **#488** `305b573f` 08-13 (Δ0, đúng hình dạng: 0 file test trong diff). 🔑 Số lấy ở web-UI log `…/actions/runs/{run_number}/jobs/0/logs` (KHÔNG có `/api/v1/`) → mỗi project 1 dòng `Passed! - Failed: 0, Passed: N`; đối chiếu **TÁCH-PHẦN** (45/652) chứ đừng chỉ khớp tổng, và **so delta với số Fact mới khai trong commit-msg**. +- **Mig latest repo: Mig 73 `AddContractEndedByLevelFinalize`** (`20260812141501`) — verify prod @S191 #488 = **73** (history top khớp · MIGCOUNT 73==73 · `sys.tables` **97**). 🔴 Đếm phải **NEO ĐUÔI** `grep -vE 'Designer\.cs$|ModelSnapshot\.cs$'`. Mạnh hơn khớp-tổng = **set-diff repo↔prod 2 chiều** (`comm -23`/`-13` cùng rỗng). Prod: `sqlcmd -S .\SQLEXPRESS -d SolutionErp -E` (⚠️ `$env:PROD_DB_PASSWORD` KHÔNG có trên VPS). **NO-Mig proof = history NOT-advance + empty `git diff .. -- '*Migrations*'`.** +- **Bundle hash live:** baseline **#488 (08-13, `305b573f`)** admin `C10ta-wB`/`CTIZKsjE` (JS 1.780.807 · CSS 88.858) · eoffice `CR538vZx`/`DNE0buTg` (JS 1.700.709 · CSS 94.665) — **trùng ĐÚNG dist local đã verify runtime**, khớp CI log tới byte. 🧊 prev #600 admin `D2FHMRPX` · eoffice `BIN1bEGo` (1.819.492/1.803.881 — bản này crash `useState null`, đã thay). 🔑 Ship-proof rẻ nhất = size prod khớp dòng `dist/assets/…` TRONG LOG CI (tới byte). ⚠️ marker minify ra **BACKTICK** → `grep -F`/python. ⚠️ **re-snapshot LIVE sau status=success** (#69). ⚠️ id ≠ run_number (key theo head_sha). - **Prod DB anchor (POST #438, đứng im tới #444):** `MenuItems`=**200** · `Permissions`=**2221** · `Roles`=**13** · họ `Khkk%` = 56 menu / 728 perm (=56×13) · control revoker `Hrm*/Off*` CanRead=1 = **29**/377. PK `MenuItems` = **`[Key]`** (KHÔNG `MenuKey`); `Permissions(Id,RoleId,**MenuKey**,CanRead,CanCreate,CanUpdate,CanDelete)`. - **Bearer:** admin `admin@solutions.com.vn/Admin@123456` (full) · UAT `nv.test@solutions.com.vn/TestUser@123456` (Drafter CCM, gotcha #44 check). - **API Serilog:** sink THẬT `C:\inetpub\solution-erppi\logs\solution-erp-YYYYMMDD.log` (skill-runbook `…\Logs\log-*.txt` STALE). Level=Information (seed/revoke lines CÓ ghi). ⚠️ deploy xoá `logs/` ⇒ chỉ còn từ deploy cuối. @@ -91,9 +86,7 @@ BE ~90s · FE ×2 ~60s/app · deploy ~30s · **total ~3min code / 0s docs-only** ## 📅 Recent runs (compressed — verbatim → archive via `_INDEX.md`) -- _(**#447 `998ea55` KHKK 3-panel — GO/PASS**: gate 644 Δ0, **set-diff Mig 2 CHIỀU = 0/0**. 🔑 **cặp đối-chứng MIỄN PHÍ** #446/#447 khác đúng 1 commit ⇒ cô-lập nhân-quả. 🔑 **415 = họ hàng 411**: json vào endpoint multipart bị loại TRƯỚC authz ⇒ **mọi mã pre-auth phải re-probe đúng dạng**. 🔴 **'KHÔNG ĐO ĐƯỢC' phải TỰ NGHI** — khai credential chết = SAI, chỉ **tra nhầm sổ** (`docs/HANDOFF.md`). verbatim → `archive/2026-08.md`)_ - -- _(**S98-S132 #383-#397 + PASS-pattern library S69b→S104** all GO (gate 440→509): AS-6 #41 soi TỪNG file vs 7-glob · `conclusion:None` dù success ⇒ tin `status` · **411-refine** · **LM mới hơn cửa-sổ đã verify = detector 'có run bỏ sót'** · recipe SCHEMA-ADD / DATA-BACKFILL / DATA-SEED · #472 PROD Identity table NON-prefix `Roles`. verbatim → `archive/2026-07.md`+`2026-06.md`)_ +- _(**S98-S132 #383-#397 + S188 #481/#482** all GO (gate 440→509): AS-6 #41 soi TỪNG file vs 7-glob · `conclusion:None` dù success ⇒ **tin `status`** · **411-refine** · **LM mới hơn cửa-sổ đã verify = detector 'có run bỏ sót'** · recipe SCHEMA-ADD/DATA-BACKFILL/DATA-SEED · #472 PROD Identity table NON-prefix `Roles`. 🔑 S188 **tự đính chính trong lượt**: 'HD-*=0' là **ARTIFACT PARSE của chính mình** — suýt FAIL oan. verbatim → `archive/2026-07.md`+`2026-06.md`)_ - **Older (S83 #325 ← S29 #232) → git `d2f52ba` + `archive/2026-06.md`** (incl #291 06-16 FAIL [gotcha #65]); pre-S38 → `archive/2026-05-*`. @@ -101,12 +94,8 @@ BE ~90s · FE ×2 ~60s/app · deploy ~30s · **total ~3min code / 0s docs-only** ## 🔄 Curate trigger - >~30KB → archive recent runs → L2 `archive/.md` (byte-exact append) + `_INDEX.md` substring pointer. Dup failure patterns → merge. Stale >3mo → remove. -- **Last curate: 2026-08-11 S189 (self, 27.4KB→~16.6KB — S159/S168/ARC-S155-S166/#447/S182 verbatim→`archive/2026-08.md` + `_INDEX` pointer; baseline refresh gate **680**, Mig **72** (was stale 71), bundle **#486**).** ⚠️ giữ luật: script sửa MEMORY phải build chuỗi XONG → temp → `os.replace` → verify byte>0. -- **Prev:** S166 08-01 (27.3→16.5) · S162 07-30 (26.9→17) · S118 · S111 · S107 · S104 · S98 (`2026-07.md` NEW) · S80 38.8→16 · S70 65.2→23.2 · S66 · S40. +- **Last curate: 2026-08-13 S191 (self, 22.3KB→17.4KB — S190/S189 verbatim→`archive/2026-08.md` + `_INDEX` pointer; gộp 6 pointer cũ S155-S168+#447 thành 1 dòng; trim S191/Mig/Tests; baseline refresh bundle **#488**, gate 697, Mig 73).** ⚠️ giữ luật: script sửa MEMORY phải build chuỗi XONG → temp → `os.replace` → verify byte>0. +- **Prev:** S189 08-11 (27.4→16.6) · S166 08-01 (27.3→16.5) · S162 07-30 · S118 · S111 · S107 · S104 · S98 · S80 · S70 · S66 · S40. - _(**S182 YC-013 W0.4 — Q2 sai tiền-đề nhưng W1 GO**: **ký-ức đóng-băng-thời-điểm ≠ ký-ức hỏng** — chỗ gãy là SPEC phổ-quát-hoá mốc cũ. 🔑 pin-lệch 0 row **VỚI control** (bỏ vế phủ-định ra 12 row). 🔑 **hiệu chuẩn thước bằng 2 ANCHOR đã biết** mạnh hơn `count>0`. verbatim → `archive/2026-08.md`)_ - -## S188 (2026-08-10) — [LEAD SEED ON-BEHALF] - -- _(**S188 (08-10)** #481 + cụm PASS 5/5 #482: bundle rotate ×2, seeder prod 7 HD-*, DLL marker `ContractWorkflowGuards` 0→4, smoke 9/9. 🔑 **tự đính chính trong lượt**: 'HD-*=0' là **ARTIFACT PARSE của chính mình** — suýt FAIL oan.)_ diff --git a/.claude/agent-memory/cicd-monitor/archive/2026-08.md b/.claude/agent-memory/cicd-monitor/archive/2026-08.md index 6766ad3..5424b15 100644 --- a/.claude/agent-memory/cicd-monitor/archive/2026-08.md +++ b/.claude/agent-memory/cicd-monitor/archive/2026-08.md @@ -41,3 +41,10 @@ ### S182 (verbatim) - **S182 YC-013 W0.4 PRECHECK (lead-seed từ memoryDelta workflow-return VERIFY khớp artifact, C2 /pause):** `LỆCH — Q2 sai tiền-đề nhưng W1 GO 0-blocker` — 12 phiếu prod (3 DaDuyet + 8 Nháp + 1 TraLai; memory-pack "001-003 Phase=3" KHÔNG SAI — thế giới đẻ thêm 9; ký-ức đóng-băng-thời-điểm khác ký-ức hỏng, SPEC phổ-quát-hoá mốc cũ mới là chỗ gãy) · pin-lệch 0 row VỚI control: chạy CHÍNH câu audit bỏ vế phủ-định ra 12 row element-wise + bịt điểm-mù LIKE bằng đẳng-thức-đếm IS-NOT-NULL=12=JOIN-in-family · hiệu chuẩn thước bằng 2 ANCHOR đã biết (MenuItems=200, Permissions=2221) mạnh hơn count>0 · ĐO bác acceptance wave-sau: 6 ô cờ đều 0/88 trên prod ⇒ ép-false vs giữ-thật render Y HỆT, A2 phải seed local 1 level cờ=true mới có răng · #8 Finalize=8/88 = CỜ CHỊU LỰC cấm đụng. → `runs/2026-08-08-S182-khkk-awf-mirror-ncc/sub-cicd-monitor-0.md` + + +### S190 + S189 (verbatim — archived @S191 curate) + +- **S190 (08-12) `091073f9` YC-029+YC-030 GĐ3 Duyệt HĐ (BE+2FE+**Mig 73**) — PASS TRỌN 6/6.** Deploy NGAY SAU P0 disk-0 S189: disk **25.9GB** free (lead dọn 4.7→26.6 giữ) ⇒ **disk-death KHÔNG tái**. 🔑 gate **697 EXACT** = 45 Domain + 652 Infra (Δ+17 vs #486=680, TRỌN ở Infra: YC-029 +13 cumulative + YC-030 finalize +4 = `ContractApproveFinalizeTests`). 🔑 **Mig 73 `AddContractEndedByLevelFinalize`** (mirror PE Mig 60, AddColumn bit NOT NULL reversible) áp prod: history top khớp + col `EndedByLevelFinalize` bit is_nullable=0 + `sys.tables` **97 unchanged**. 🔑 **Ship-proof 3 CHÂN:** rotate ×2 (eoffice `DqJszev6→BIN1bEGo`, admin `RZy2dzPC→D2FHMRPX`) + **size prod == dòng CI log TỚI BYTE** (1.819.492==1,819.49kB · 1.803.881==1,803.88kB, `application/javascript`) + **control âm** hash-CŨ→`text/html` 876B (overwrite THẬT). Smoke 200/401 chuẩn (login token len=468 · contracts/PE/menus). **#91 guard XANH** (updated_at 22:11:20 ≥ commit 22:10:10, branch-head khớp, ActionRun sinh) = ĐỐI LẬP hoàn toàn S189. 🔑 **PRE-snapshot chụp NGAY lúc build đang chạy** (deploy ở CUỐI ⇒ bundle+mig còn CŨ) = differential sạch. Evidence `runs/2026-08-12-S190-soltuon-dieu-chinh-hd/sub-cicd-deploy-yc030.md`. Tag `[s190, gate-697, mig73-ended-finalize, shipproof-3chan-bytematch, control-am-overwrite, disk-death-khong-tai, gotcha-91-xanh]` + +- **S189 (08-11) `92d8215a` YC-028 FE tách 404⟂lỗi-hệ-thống (8 FE, **0 BE**, 0-mig) — V1 FAIL 8/11 → V2 PARTIAL 8/9.** 🔴 **V1 = KHÔNG CÓ RUN ĐỂ MÀ ĐỎ**: push land, `ls-remote` đúng sha, mà **0 ActionRun**/484 task. 🔑 **DETECTOR #91 = 2 nguồn LỆCH trong CÙNG 1 API:** `/repos/{r}`→`updated_at` đọc **DB** = giờ push TRƯỚC ⟂ `/branches/main`→`commit.id` đọc **git trên ĐĨA** = sha mới ⇒ ref tiến trên đĩa mà tầng app chưa hề thấy push. **Stage 2 từ nay ĐO `updated_at ≥ giờ push` TRƯỚC khi kết luận 'đang chờ CI'.** Terminal push SẠCH ⇒ chết ở **notifier**, không ở receive-pack. Sửa = `workflow_dispatch` (204). 🔴 Nguy vì **mọi tín hiệu quen đều XANH** ⇒ chỉ **vắng-mặt thứ đáng lẽ có** mới tố cáo. 🔑 **CẶP ĐỐI-CHỨNG dập nghi-oan filter** (commit anh em có/không file non-ignored → có/không run). 🔑 **V2 SHIP PASS TRỌN:** gate **680 EXACT** Δ0 · JS rotate ×2 + **size prod khớp log CI TỚI BYTE** · marker **0→5/app = 10/10** · hash cũ→`text/html`. 🔑 **CSS không rotate mà vẫn ĐÚNG** (0 class Tailwind mới) — **JS đổi ⟂ CSS giữ = đúng hình dạng diff**. 🔴 **V2 FAIL: A/059 6/16 mẫu >3s (max 8,75s).** **Tự bác cold-start của chính mình vì burst-2 XẤU HƠN burst-1** ⇒ *warm-up curve đẹp KHÔNG đủ, phải đo burst THỨ HAI*. Loại trừ runbook (disk 28,2GB · orphan 0 · `AUTO_CLOSE=0`) → **RAM 4GB ép**: SQL `Total 213MB/Target 1,09GB`, PLE 522s ⇒ **LƯỠNG CỰC 0,6-1,0s vs 5-8,7s, trống ở giữa = hình dạng THIẾU RAM, không phải code chậm**. 🔑 **Logic rẻ hơn đo: commit 0 file BE ⇒ latency không thể do commit này.** 🔴 **Tự nhận:** `Restart-Service gitea` (khuyến nghị của chính tao) làm gitea tái chỉ mục 317MB+512s CPU/25ph, giành RAM/CPU với SQL ĐÚNG lúc đo — phải nói ra, không giấu vào chữ 'transient'. Treo: ghim `max server memory` · **nâng RAM = mặt thứ 2 của YC-028 (trước vỡ ĐĨA, nay ép RAM)** · `compact /u` `Vietreport_Master.mdf` (#88). Evidence `runs/2026-08-10-S189-bookstart-open/sub-cicd-monitor-yc028.md`. Tag `[s189, gotcha-91, detector-updatedat-vs-branchhead, burst2-bac-coldstart, luong-cuc-thieu-RAM, tu-nhan]` diff --git a/.claude/agent-memory/cicd-monitor/archive/_INDEX.md b/.claude/agent-memory/cicd-monitor/archive/_INDEX.md index 33abc79..646cb88 100644 --- a/.claude/agent-memory/cicd-monitor/archive/_INDEX.md +++ b/.claude/agent-memory/cicd-monitor/archive/_INDEX.md @@ -58,3 +58,5 @@ - 2026-08-01 · S168 #444 `0bfadc2` GD3-D Panel-3 + Lines-editor KHKK (0-mig) — PASS 6/6, wire-proof 400 goi-ten-3-field + chup-PRE-kip-gio + marker bat-doi-xung 1:2 + CSS nhan-chung · `runs/2026-07-31-S164-4gd-khkk-fanout/sub-cicd-verify-gd3d-lineeditor.md` - **@S189 curate → `2026-08.md` §[ARCHIVED @S189]** — verbatim 5 khối L1: `S159` (arc 4 đợt `b5799fc`/`1a47a61`/`2a72695`/`a2bbcb9`, durability-≥2-restart, control-âm-tầng-bundle) · `S168` (#444 `0bfadc2`, wire-proof-400-tên-field, chụp-PRE, marker bất-đối-xứng) · `ARC S155→S166` (#416→#439, chân-lý-rỗng #435, luật cấm `HEAD~1` #432, 3-chân-kiềng #423) · `#447` (`998ea55`, cặp-đối-chứng #446/#447, bẫy-415-pre-auth, không-đo-được-phải-tự-nghi) · `S182` (YC-013 W0.4, hiệu-chuẩn-thước-2-anchor, acceptance ép-false). + +- **S190 `091073f9` + S189 `92d8215a`** (archived @S191) → `2026-08.md` §"S190 + S189 (verbatim — archived @S191 curate)" — tra bằng substring `PASS TRỌN 6/6` (S190: gate 697, Mig 73, ship-proof 3 chân) · `KHÔNG CÓ RUN ĐỂ MÀ ĐỎ` (S189: detector #91, burst-2 bác cold-start, lưỡng-cực thiếu RAM). diff --git a/.claude/agent-memory/ctx-verifier/MEMORY.md b/.claude/agent-memory/ctx-verifier/MEMORY.md index 1a76658..630e889 100644 --- a/.claude/agent-memory/ctx-verifier/MEMORY.md +++ b/.claude/agent-memory/ctx-verifier/MEMORY.md @@ -45,3 +45,12 @@ - **Khoản 1 (hướng-tiếp vs `next:`):** `next:` chỉ chở **3/6 chặng** của §B — 3 đuôi (*thăng luật E4 ➊ · synthesis S173 · 5 điểm governance*) chỉ sống ở `_mind` + chain. Lead đã nối đuôi vào `next:`. - Tag `[s175, ctx-verifier, con-tro-2-tang-may-mu-tang-noi-dung, 0-hit-rong-vi-sai-duong-dan, next-cho-thieu-chang, seed-on-behalf]` - **S185 (08-10) @/tiep-3 (window-4) — `NAP-LAI-SAN-SANG — 15 cờ` `[LEAD SEED ON-BEHALF; verdict ghi ở `.claude/sessions/session-13/_tiep-3.md` dòng cuối — LẦN ĐẦU marker chở verdict, đóng `[carry:tiep-3ter-seed-unwired]` lần 9]`:** máy `mind-check` full 10/10 chạy TRƯỚC. Cờ nặng nhất: **`S184` = 0 hit ở CẢ `_mind` LẪN `_context`** (control-dương `S183`=1/1 ⇒ grep sống) ⇒ trọn window-3 sống ĐỘC NHẤT ở WAL — sổ tái sinh mỗi closeout. Bắt **con-trỏ V-5 SAI CHIỀU** (`_mind:96` trỏ artifact đã đóng; nhà thật từ S184 = WAL) + 4 nhãn §D lệch + §B thiếu 3/6 chặng + deep-sweep **3 bề mặt 3 số** (17/15 · 19/15 · 15/15 — sổ máy thắng: counter 59 − deep_at 40). 🔴 **Tự truy GỐC CƠ-CHẾ của chính mình:** `ctx-verifier` 0 hit trong `_mind`/`_context` vì **cửa `/tiep` không có artifact chở verdict** (3 marker `_tiep-*` đều 211 B stub) — khác curator vốn có nhà `_context` mục (3) ⇒ **lỗi cấu trúc, không phải đãng trí**. Tag `[s185, s184-chi-song-o-wal, con-tro-sai-chieu, 3-be-mat-3-so, tu-truy-goc-co-che]` + +## S191 (2026-08-13) @/tiep window-3 L15 — NAP-LAI-SAN-SANG, 13 cờ +[LEAD SEED ON-BEHALF — vai không có Write/Edit; nợ 2 lượt (`_tiep-1`+`_tiep-2`) do H2 F-02 bắt, trả tại đây] +- Nặng nhất **cờ-8**: claim "nén 2 memory over-cap" **SAI ĐÍCH** — investigator 23.148B + reviewer 25.469B đều DƯỚI trần 25.600; file vượt thật là `ring2-audit` 27.458B {đang-cãi}. Lead đối chứng byte → KHỚP → đóng bằng ĐO, không nén. *(Bổ sung @close: tập over-cap thật là **3 vai**, cờ-8 cũng chưa đủ — xem `lead-gap` F5.)* +- cờ-3/4/5: `STATUS:6` chết 4 mặt · `run.md` S190 dừng ở B5 (5 artifact YC-030+deploy mồ côi) · `sub-wq3-be.md` skeleton 593B 4/4 mục `_(chờ)_` ⇒ 0 đường tái dựng. → lead vá cả 3 @S191. +- cờ-6 **BỊ LEAD BÁC** (dương giả): carry `pin-max-server-memory-fleet` CÓ nhà HANDOFF @S190, vai grep từ-khoá spaced nên 0-hit. +- cờ-10: §E tự phạm hợp-đồng "gom MỌI spawn" — thiếu chính `ctx-verifier` @tiep-1 ⇒ carry `ctx-verifier-no-self-append` **lần 11**. +- Bài: verdict vai sống độc nhất ở `_tiep-.md` nếu lead không seed ⇒ 2 lượt trôi trước khi được nhặt. +- Tag `[s191, nap-lai-13-co, sai-dich-nen-memory, no-self-append-lan-11]` diff --git a/.claude/agent-memory/harness-eval/MEMORY.md b/.claude/agent-memory/harness-eval/MEMORY.md index d53046d..a48044f 100644 --- a/.claude/agent-memory/harness-eval/MEMORY.md +++ b/.claude/agent-memory/harness-eval/MEMORY.md @@ -56,3 +56,12 @@ Con ĐO của bộ-ba đồng-kiểm memory-system (adopt AI_INFRA 2026-07-18 kh ## S189 (2026-08-11) — @open L15 · MIXED — 38 trục / 13 REG · 11 HEALTHY · 14 MIXED - §2 ĐẢO CHIỀU: measured 19/29->29/29 phủ, 18/19->2/29 lệch — đổi bởi ef1d4fbb 21:04 (KHÔNG phải phiên này; Mirror C1 nguyên). Caveat giữ: 27/29 khớp-một-phần là tautology, datum thật = 2 row trôi/3h. - #22 bị audit phán: NHÃN "lỗi thước" SAI (bảng :380) nhưng PROSE :426 đúng — tự mâu thuẫn bảng-vs-prose; vật đổi (tooling ghi diary), thước không hỏng. Erratum tự bắt: .mfe-state đổi 5.690->5.875 mà git status SẠCH — Stop-hook nuốt vào 234fe02c => backstop chống-ghi-lén = git log wal:, KHÔNG phải working-tree. -> .claude/workflows/runs/2026-08-10-S189-bookstart-open/harness-eval-return.md + +## S191 (2026-08-13) @close L15 — VERDICT **MIXED** (11 HEALTHY / 12 REGRESSION / 11 MIXED / 2 không-đo-được / 1 nhường; Σ=37 trục, tự cộng khớp) +[LEAD SEED ON-BEHALF — vai không có Write/Edit] +- Không in HEALTHY dù 3 trục đảo chiều đẹp (nhãn⟺ghi 8=8 · `score-counter` đã rời mốc seed · l2idx đỉnh 68,1%): REGRESSION nhiều hơn, và **2 trục nặng nhất (headroom, MFE tổng) kỳ này KHÔNG CÓ SỐ** ⇒ trục từng-REGRESSION *biến khỏi tầm đo*, không phải được giải (lớp S172). +- Trả 2 câu lead hỏi bằng đo: **(a)** `tran-bo-nho 3` = ngưỡng `autoinject_cap_bytes` 25.600 → `lead-gap` 28.094 · `ring2` 27.458 · `lead-stale` 25.966; 6 số lead dán **thiếu 2 vai này**. Theo **KÝ-TỰ thì 0 over** — đơn-vị đổi thì verdict đổi. **(b)** `ring1-audit` A7 `N/A` KHÔNG phải _INDEX rỗng: index kiểu bảng, 0 token `substring:"` ⇒ guard B2 từ chối PASS trên mẫu-số rỗng (làm ĐÚNG) ⇒ 2 archive ring1 nằm NGOÀI 429/429. +- Cụm D nặng: `measured` khớp đĩa **27/29 → 9/29 trong 2 ngày** ⇒ mọi cột delta dựa `measured`, kể cả cột con-ĐO vừa đưa, đang so số đã trôi. +- Cụm E (bài học phương-pháp cho lead): **bề-mặt-đo đóng băng dán MÔ-TẢ thay vì SỐ thì trục đó biến mất khỏi mọi verdict mà bảng vẫn trông đầy đủ.** +- Caveat: `read-only` = thiếu tool, KHÔNG phải sandbox; `git status` KHÔNG đủ làm backstop (Stop-hook nuốt vào `wal:`) ⇒ phải soi `git log` các commit `wal:` sinh sau lượt vai. +- Tag `[s191, mixed-37-truc, don-vi-byte-vs-kytu, measured-ru-a-2-ngay, mo-ta-thay-so-lam-truc-bien-mat]` diff --git a/.claude/agent-memory/harness-refine/MEMORY.md b/.claude/agent-memory/harness-refine/MEMORY.md index b741ec4..592c90b 100644 --- a/.claude/agent-memory/harness-refine/MEMORY.md +++ b/.claude/agent-memory/harness-refine/MEMORY.md @@ -55,3 +55,11 @@ Con ĐỀ-XUẤT của bộ-ba đồng-kiểm memory-system (adopt AI_INFRA 2026 ## S189 (2026-08-11) — @open L15 · 2 action / 16 BÁC (4 escalate · 4 nhường · 5 đính-chính con-ĐO) - A1 distill: dựng _INDEX.md cho {ctx-audit, ring2-audit, lead-stale-auditor}/archive — 28.873B L2 vô hình với A7 vì archive-gate:249 `continue` qua vai không index. A2 promote luật "drain tay không kèm _INDEX = tự đẻ dark-matter". - E2 catch nặng nhất: PROPOSE-archive của máy cho ring2 CHĨA SAI (60% file trên heading đầu => keep_floor đẩy Role-baseline + Runs vào drain) — audit xác nhận mức máy, CẤM chạy nguyên văn. Chốt-dừng FIRE 2 vật: lead-gap after-est 25.638>cap = BẤT KHẢ số học (không lách lane); ring2 attempt-2 cùng thuốc. 3 nợ lead mang sang: kiểm độc lập cả 3 ĐÃ LAND — không đề lại. -> .claude/workflows/runs/2026-08-10-S189-bookstart-open/harness-refine-return.md + +## S191 (2026-08-13) — LUẬT **ARCHIVE-MỘT-PHÁT KHÔNG GIỮ** (promote, A1) +[LEAD APPEND B3 — vai propose-only] +> Archive/distill một vai = thuốc **hết hiệu lực trong ≤4 ngày**: tốc độ append của phiên lớn hơn lượng rút ra. Đo @S191: rút **813 B** (`lead-gap`) / **692 B** (`lead-stale`) → L1 vẫn **+1.201 / +1.188 B** ⇒ append/drain **2,48× / 2,72×**. 6/6 vật từng archive đều tái phình. +> ⇒ **Chốt-dừng nâng từ per-ĐỐI-TƯỢNG lên per-LỚP:** vai đã archive/distill **một lần** mà con ĐO lại báo over-cap ⇒ **CẤM đề lớp ③/④-nén lần nữa** (kể cả đổi span, đổi thuốc — đổi thuốc trên vật đã escalate = **lách chốt-dừng**) ⇒ **ESCALATE cơ-chế** (cap = quyền owner · quy-ước ghi = quyền lead · tự-động-drain = lane tooling). +> **Vì sao không phải "làm mạnh tay hơn":** cắt sâu hơn chỉ dời ngày vượt, **không đổi dấu đạo hàm**. +> 🔴 Luật này ăn ngay vào chính vai: nó cấm B6 — ứng viên hấp dẫn nhất của lượt (thuốc `##` đã chứng hiệu nghiệm 58%→2,1% @S186) — vì **SAI THỨ TỰ**: planner giả định "bottom=newest" trong khi 40-58% ruột 3 vai nằm TRÊN `##` đầu ⇒ gắn `##` sẽ đẩy chính bản-ghi-mới-nhất vào pool drain ⇒ thuốc thành độc. Phải sửa giả-định thứ-tự TRƯỚC (ES-4). +> 🔴 **ES-4 hệ quả vận-hành: CẤM chạy `memory-archive-gate.ps1 -Apply`** cho tới khi sửa `:177-178`. diff --git a/.claude/agent-memory/harvest-curator/MEMORY.md b/.claude/agent-memory/harvest-curator/MEMORY.md index 2170b81..fdeba32 100644 --- a/.claude/agent-memory/harvest-curator/MEMORY.md +++ b/.claude/agent-memory/harvest-curator/MEMORY.md @@ -69,3 +69,13 @@ H2 harvest-MD-integrity auditor **SOLUTION_ERP-self**. Read-only + **propose-onl - F-01 HIGH: 4 vai chạy S188 nhận 0 chữ = 42.975B mồ côi (ring2 18.195 · ring5 11.282 · harness-audit 10.664 · ctx-audit 2.834) — dedup sạch, APPEND an toàn. F-02 HIGH narrative-capture != memory-landing; ring1 B-09 sửa ĐỘNG TỪ: ef1d4fbb KHÔNG "seed diary" — 3 vai là NÉN-xuống-archive, chỉ harness-refine +5/-0 là append thật (lõi vẫn ĐẠT). - Orphan 0/93 (dual-accept; ring1 chứng nhánh `harvest/` legacy SỐNG — 5 folder 2026-06-18 chỉ qua nhờ nó). Đối chứng 3 số lead khai: 19 OK · 12 OK · "10 file" SAI, đĩa 14 (-3). - Read-limit ĐO ĐƯỢC + đảo dấu: chấm KÝ-TỰ (không byte) => 0/29 vai vượt, max lead-gap 96,5%; đứng ở cả x1000 lẫn x1024. -> .claude/workflows/runs/2026-08-10-S189-bookstart-open/sub-harvest-curator-open-S189.md + +## S191 (2026-08-13) — @close L15 (phiên ĐÓNG) · GATE-HOLD 6 (2H·3M·1L) + +- **C2:** A=7 vai (nguồn-1 CHỈ 1 = `sub-cicd-va-goc-92.md`; folder mới `2026-08-13-S191-bookend-close/` có mỗi `run.md` ⇒ nguồn-1 gần-∅ đúng như cảnh báo S181) · **B=0/29** (grep `S191` toàn 29 MEMORY.md = 0, đo 2 lần cách nhau ~40') ⇒ **A∖B = 7/7 thủng**. Nguồn-2 (verdict trong `_tiep-2.md` + bảng scribe `run.md`) gánh 6/7 — bỏ nguồn-2 là checklist báo PASS. +- 🔴 **F-01 nợ CHÍNH TAO nêu @S189 chưa đóng, và tao suýt đọc nhầm lần nữa:** tag-scan thấy `ring2-audit` có chuỗi "S188" ⇒ tưởng đã về nhà; mở ra thì đó là **mention trong thân entry S189** (đếm slug "S185 20/23 · S188 47"), KHÔNG phải bản ghi. Grep TRỌN dir (kể cả `archive/`) = **0/4 vai** ⇒ 42.975 B mồ côi (ring2 18.195 · ring5 11.282 · harness-audit 10.664 · ctx-audit 2.834) vẫn nguyên sau 2 cửa sổ. **Đo TÊN-token cũng là đo tên** — chỉ `grep -rn` cả dir mới là đo nội dung. +- 🔴 **F-02 ctx-verifier nợ 2 lượt chứ không 1:** `_tiep-1.md:6` (13 cờ, "lần 10") + `_tiep-2.md:6` (13 cờ, "lần 11") mà sổ dừng ở **S187 lượt 12/lần 9** ⇒ window-2 chưa ai gom. Vai không có Write = nợ CƠ-CHẾ, cửa `/pause` không phải cửa gom. +- **F-03 Placement:** `fe-user/.claude/agent-memory/implementer-frontend/` 3 tầng dir RỖNG (mtime 19:10 = giờ W2/W3), **git mù 2 lớp** (rỗng + `.gitignore:118 fe-*/.claude/`); session-log:34 + WAL:22 khai "dọn stray dir rỗng" mà đĩa còn nguyên (mtime không đổi ⇒ chưa ai rmdir). 🔴 **Thước của chính tao cũng mù:** `find .claude -type d -empty` = 0 — phải quét **repo-wide** mới thấy (đúng bài S172, tái phạm nếu quên). +- **F-04:** session-log:31 "file DUY NHẤT vượt trần = ring2 27.458" — đĩa **3 vai** vượt `autoinject_cap_bytes` 25.600 (lead-gap 28.094 · ring2 27.458 · lead-stale 25.966), và **chính máy lead chạy cùng phiên** (`nhip-no-probe`) in "tran-bo-nho **3 over-cap**" ⇒ số sai mâu thuẫn với máy của chính nó. (Caveat S189 giữ: chấm KÝ-TỰ thì 0/3 vượt — khoá tên `_bytes` + máy đọc byte ⇒ byte là nghĩa đang hiệu lực.) +- **Fidelity STRONG** cho on-behalf `sub-wq3-be.md`: 5/5 claim truy về `69860362` (Mig 3-file 29+7067+3 · service +88 · DTO/controller +21/+22/+16 · `[Fact]`=**4** khớp đúng chữ "+4") ⇒ 0 bịa, không escalate. **Corruption** 25 hit/12 file `.claude`-wide (control dương rc=0, SCANNED 1284) = baseline 24/11 **+1 mention** ở `S185/sub-ring1-audit.md:150` (trích chính ca hỏng của cicd làm bằng chứng — citation-trap đời N) ⇒ lành, baseline mới **25/12**. **Orphan 0/94** run.md (dual-accept), S191-close = IN-PROGRESS không tính. +- Chore tự khai: L1 tao 22.196 B < cap 25.600 nhưng > self-target 17,1K ⇒ self-compact còn DUE. Tag `[s191, C2-nguon-2-ganh-6-tren-7, mention-khong-phai-ban-ghi, no-S188-qua-2-cua-so, ctx-verifier-2-luot, stray-ngoai-.claude-git-mu-2-lop, so-mau-thuan-may-cua-chinh-minh]` diff --git a/.claude/agent-memory/lead-gap-auditor/MEMORY.md b/.claude/agent-memory/lead-gap-auditor/MEMORY.md index 32af6bd..4614d33 100644 --- a/.claude/agent-memory/lead-gap-auditor/MEMORY.md +++ b/.claude/agent-memory/lead-gap-auditor/MEMORY.md @@ -20,9 +20,7 @@ > **Persistent diary cross-session.** Auto-injected first ~200 lines at spawn (L1 HOT). Update qua EM-MAIN VERIFY→APPEND (vai = propose-only, RETURN-only — KHÔNG tự ghi file này). Tiered Memory v1: L1 HOT cap ~17KB · entry ≤1.5K chars (#53). > **Seeded @S132 (2026-07-17) — retro-harvest on-behalf bởi em-main** từ `runs/2026-07-15-S124-adap-wave-reply/sub-lead-omission.md` (9967B, verbatim còn nguyên trên đĩa). GAP-3 class: vai chạy S124 nhưng diary không ai seed suốt 8 nhãn phiên — chính vai này là catch-layer cho lớp "cái THIẾU không tự hiện ra", và cái thiếu suốt 8 phiên lại là DIARY CỦA CHÍNH NÓ (mirror "git mù dir rỗng" S122). -## 🎯 Role baseline - -H24 §2(1) vai-GAP — soi CÁI BỊ THIẾU trong cái LEAD surface (việc rớt khỏi work-state · carry rớt/quá-già · yêu-cầu owner ghi chung-chung mất SPECIFICS · quyết-định-treo chìm · memory nạp dưới hạn-mức). Máy MÙ gần hoàn-toàn lớp này → catch-layer DUY-NHẤT. Method: dựng EXPECTATION-set từ commitment-sources (HANDOFF carries `grep -o` mega-line · WAL · ACTIVE-MARKS · owner-decisions · spec/run.md) TRƯỚC khi so; ≥1 disk-touch trước mỗi gap-* (S121). Class ∈ enum ĐÓNG (5 gap-*): gap-carry-dropped · gap-carry-aged · gap-owner-specifics · gap-decision-sunk · gap-underfill. ĐỌC detector H24-2, KHÔNG recompute streak. KHÔNG lấn H1/H2/lead-view. +> 🗄️ moved @S191 → `archive/2026-08.md`: ## 🎯 Role baseline ## 📅 Runs @@ -75,3 +73,13 @@ H24 §2(1) vai-GAP — soi CÁI BỊ THIẾU trong cái LEAD surface (việc r ## S189 — @open L15 DEEP · 7 FLAG F-1 gap-incident-unrecorded: ca 0.7(b) 0-hit/7 sổ (->PN-002); cơ chế: ring5 0-hit session-start.md => guard ONESHOT-S188 không fire được @open. F-4 YC-027 land 2/4 cửa. F-5 ring2 over-cap thiếu _INDEX+gist = nợ mới. Honest-zero carry-aged khai thật; underfill TỪ CHỐI báo (ring2 chấm ĐÚNG NẤC). -> .claude/workflows/runs/2026-08-10-S189-bookstart-open/sub-lead-gap-auditor-open-S189.md + +## S191 (2026-08-13) @close L15 — 7 FLAG (3H/4M), coverage 6/6 class, 2 honest-zero CÓ LẬP LUẬN +[LEAD SEED ON-BEHALF — vai propose-only, B3] +- F1 `gap-carry-dropped` **17→18 = 6,0× jump=3**: khối RE-STAMP vắng 3 nhãn phiên; 2 slug `w5-host-ondeleted`+`reset-doi-het` **chưa từng** vào HANDOFF. Loại được bào chữa "bỏ vì gấp": cùng lượt lead VẪN viết segment 1.609B ⇒ bỏ **có chọn lọc**. → lead dựng RE-STAMP từ-nguồn @close (52 slug, 2 slug kia đã vào). +- F2: nợ `OVERDUE:deep` **không có nhà sống sót** — chỉ ở WAL mà §6.4 xoá trắng; slug `[carry:h24-deep-overdue]` đóng @S185 đúng closeout đặt `deep_every=1`. → lead chạy deep @close + ghi signal máy. +- F3 `gap-decision-sunk`: 5 site câu CẤM-push sau khi điều kiện gỡ đã thoả; cảnh báo bẫy vá-nửa (WAL sắp bốc hơi, `STATUS:478` cách nhà chính 472 dòng). → lead vá 4 site bền. +- F5 `gap-underfill`: lead đo ĐÚNG byte, **đo NHẦM NGƯỜI** — 3 vai over-cap (`lead-gap` 28.094 · `ring2` 27.458 · `lead-stale` 25.966), 2/3 là chính nhật ký H24 ⇒ **lớp bắt-lỗi mất trí nhớ trước tiên**. Tự khai liên đới: file này là của mình. +- F6: **BÁC** nghi vấn lead — `YC-031` ghi ĐÚNG luật (3/3 nguyên văn, giữ cả typo). Chỉ thiếu 1 specific: owner nói "2-3 lần", sổ truy được **2 ca có vết**, ca-3 0 vết → lead thêm dòng đối-chiếu + hỏi anh. +- honest-zero: `gap-carry-aged`=0 **KHÔNG ĐO ĐƯỢC** (hệ quả F1, cấm đọc thành lành) · `gap-incident-unrecorded`=0 — **tự bác flag đã soạn** bằng control-dương (13 gotcha #80-92 chỉ 2 có RCA ⇒ gotcha-không-RCA là THÔNG LỆ). +- Tag `[s191, restamp-vang-3-nhan, no-deep-khong-nha, cam-push-5-site, do-dung-byte-nham-nguoi, tu-bac-flag-bang-control]` diff --git a/.claude/agent-memory/lead-gap-auditor/archive/2026-08.md b/.claude/agent-memory/lead-gap-auditor/archive/2026-08.md new file mode 100644 index 0000000..9833270 --- /dev/null +++ b/.claude/agent-memory/lead-gap-auditor/archive/2026-08.md @@ -0,0 +1,6 @@ +# archive 2026-08 — lead-gap-auditor (moved-not-cut) + +## 🎯 Role baseline + +H24 §2(1) vai-GAP — soi CÁI BỊ THIẾU trong cái LEAD surface (việc rớt khỏi work-state · carry rớt/quá-già · yêu-cầu owner ghi chung-chung mất SPECIFICS · quyết-định-treo chìm · memory nạp dưới hạn-mức). Máy MÙ gần hoàn-toàn lớp này → catch-layer DUY-NHẤT. Method: dựng EXPECTATION-set từ commitment-sources (HANDOFF carries `grep -o` mega-line · WAL · ACTIVE-MARKS · owner-decisions · spec/run.md) TRƯỚC khi so; ≥1 disk-touch trước mỗi gap-* (S121). Class ∈ enum ĐÓNG (5 gap-*): gap-carry-dropped · gap-carry-aged · gap-owner-specifics · gap-decision-sunk · gap-underfill. ĐỌC detector H24-2, KHÔNG recompute streak. KHÔNG lấn H1/H2/lead-view. + diff --git a/.claude/agent-memory/lead-gap-auditor/archive/_INDEX.md b/.claude/agent-memory/lead-gap-auditor/archive/_INDEX.md index 07f808e..71685e8 100644 --- a/.claude/agent-memory/lead-gap-auditor/archive/_INDEX.md +++ b/.claude/agent-memory/lead-gap-auditor/archive/_INDEX.md @@ -9,3 +9,4 @@ - 2026-07.md · S146 audit#4 con-trỏ GAP-3 lần-3 (verbatim gốc runs/2026-07-22-S145-apply-hub-answers/sub-lead-omission-S146.md 20.043B) · substring:"[s146, backfill-pointer" - 2026-07.md · S148 light#5 force-fire P=1 (moved-not-cut @S164 refine A1) · substring:"S148 light-audit #5" - 2026-07.md · S150 bookend @close lượt đầu hình B vô-điều-kiện (moved-not-cut @S164 refine A1) · substring:"S150 bookend @close LƯỢT ĐẦU" +| `2026-08.md` | `## 🎯 Role baseline` (moved @S191) | substring:"H24 §2(1) vai-GAP — soi CÁI BỊ THIẾU tro" | 813 B | diff --git a/.claude/agent-memory/lead-stale-auditor/MEMORY.md b/.claude/agent-memory/lead-stale-auditor/MEMORY.md index 14d81a6..5312600 100644 --- a/.claude/agent-memory/lead-stale-auditor/MEMORY.md +++ b/.claude/agent-memory/lead-stale-auditor/MEMORY.md @@ -19,9 +19,7 @@ > **Persistent diary cross-session.** Auto-injected first ~200 lines at spawn (L1 HOT). Update qua EM-MAIN VERIFY→APPEND (vai = propose-only, RETURN-only — KHÔNG tự ghi file này). Tiered Memory v1: L1 HOT cap ~17KB · entry ≤1.5K chars (#53). > **Seeded @S132 (2026-07-17) — retro-harvest on-behalf bởi em-main** từ `runs/2026-07-15-S124-adap-wave-reply/sub-lead-view.md` (8379B, verbatim còn nguyên trên đĩa — đọc full khi cần). GAP-3 class: vai chạy S124 nhưng diary không ai seed suốt 8 nhãn phiên (per-RUN gate im ĐÚNG thước của nó; per-ROLE không ai sở-hữu — E-011/email e46863c8 GAP-3). -## 🎯 Role baseline - -H24 §2(1) vai-STALE — soi VIEW LỆCH SOURCE của cái LEAD surface. Class ∈ enum ĐÓNG `lead_self_audit.flag_classes` (5 view-*): view-residual-asym · view-stale-count · view-stale-status · view-stale-header · view-stale-role-desc. KHÔNG tự chế class; không phân-loại được → verbatim + escalate anh. Chạy theo NHỊP `h24_cadence` (đọc config, CẤM hardcode). ĐỌC output máy (`governance-detectors.ps1`) làm nền — chỉ thêm lăng-kính NGỮ-NGHĨA máy không phán được. KHÔNG lấn: tooling-freshness (H1) · harvest (H2) · cái-THIẾU (lead-gap-auditor). +> 🗄️ moved @S191 → `archive/2026-08.md`: ## 🎯 Role baseline ## 📅 Runs — TÓM (@S185 refine-A2; verbatim 8462B → `archive/2026-07.md`, moved-not-cut) @@ -72,3 +70,13 @@ H24 §2(1) vai-STALE — soi VIEW LỆCH SOURCE của cái LEAD surface. Class - FLAG-1: `_end` vs WAL — thước đúng = ĐẾM NHÂN CHỨNG (6 chọi 1), KHÔNG phải thứ-tự thời-gian; cụm "GIỮ MỞ" thêm ở ef1d4fbb 21:30 muộn hơn `_end` 46 phút. Lead nhận sai hướng đọc ban đầu + vá WAL cùng phiên. - FLAG-9: frontmatter description CHÍNH 2 vai H24 còn câu "Chạy theo NHỊP, KHÔNG mỗi phiên" đã bị S153 tuyên sai — sống qua 2 đợt vá vì cả 2 chỉ sửa THÂN file. FLAG-10: detector H24-1 bám mốc HANDOFF:183 (08-01) vì regex không khớp anchor có emoji trong cặp sao — title-freshness phiên này = CẬN-DƯỚI. - VALID_ROLES: regex ngây thơ 18 vs strip-comment 29 (`]` trong comment hmw.js:39 cắt non-greedy) — ai vá bằng regex thô sẽ tưởng hmw hỏng. -> .claude/workflows/runs/2026-08-10-S189-bookstart-open/sub-lead-stale-auditor-open-S189.md + +## S191 (2026-08-13) @close L15 — 10 FLAG (5H/1MH/3M/1L — SÀN; coverage ~5% STATUS, 0/29 persona chưa chạm) +[LEAD SEED ON-BEHALF — vai propose-only, return đầy đủ, lead VERIFY→APPEND B3] +- Sợi chỉ: lead ĐO tốt (tự bác claim của mình sau 40') nhưng **quãng từ phép đo VỀ SỔ vẫn đứt** — 3/10 FLAG là việc ĐÃ XONG mà sổ chưa lật. Lớp *stale-BI-QUAN* lần 4. +- 🔴 F1 đắt nhất: `gotchas.md:1462` khắc root-cause **npm-cache nhiễm** trong khi `deploy.yml:108-115` (land 12' sau) nói **xoá lockfile + npm install**; run #488 PASS mà **0 lần dọn cache**. Lead flip được claim "#92 đóng" nhưng GIỮ claim "cause = cache" — cùng một hơi viết, sửa một phía. → lead VÁ trọn @close. +- F5 bẫy THƯỚC: `STATUS:470` tự ghi phương-pháp "trừ Designer+**Snapshot**" ⇒ bộ lọc nuốt `AddPeApprovedBudgetSnapshot` ⇒ ra 72; đúng phải loại `ModelSnapshot` ⇒ **73**. Vá số mà không vá câu = tái phát chắc chắn. → lead vá CẢ số CẢ câu. +- F4 **lần thứ NĂM cùng ô** `STATUS:484` (S166·S172·S180·S188·S191); điều-kiện tự-khai "lần 3 wire máy" quá hạn 2 lượt → lead chọn **bỏ digit, giữ con-trỏ artifact cicd**. +- F3: `WAL.md:40-41` là **lệnh chạy được** trỏ hash chết ⇒ `/tiep` sau đọc 0-hit thành "prod hỏng". → vá. +- 🔸 Đính chính tiền-đề lead: `.nvmrc` **CÓ** (2 file tracked) — lệch ở **0 consumer**; và "runner node v24.15.0" **0 vết trên đĩa** ⇒ đừng khắc vào doc bền. +- Tag `[s191, gotcha-root-cause-lech, bundle-lan-5, thuoc-tu-nuot-doi-tuong, wal-lenh-tro-hash-chet, nvmrc-ghost-wire, sua-mot-phia-trong-mot-hoi-viet]` diff --git a/.claude/agent-memory/lead-stale-auditor/archive/2026-08.md b/.claude/agent-memory/lead-stale-auditor/archive/2026-08.md new file mode 100644 index 0000000..9bf35a0 --- /dev/null +++ b/.claude/agent-memory/lead-stale-auditor/archive/2026-08.md @@ -0,0 +1,6 @@ +# archive 2026-08 — lead-stale-auditor (moved-not-cut) + +## 🎯 Role baseline + +H24 §2(1) vai-STALE — soi VIEW LỆCH SOURCE của cái LEAD surface. Class ∈ enum ĐÓNG `lead_self_audit.flag_classes` (5 view-*): view-residual-asym · view-stale-count · view-stale-status · view-stale-header · view-stale-role-desc. KHÔNG tự chế class; không phân-loại được → verbatim + escalate anh. Chạy theo NHỊP `h24_cadence` (đọc config, CẤM hardcode). ĐỌC output máy (`governance-detectors.ps1`) làm nền — chỉ thêm lăng-kính NGỮ-NGHĨA máy không phán được. KHÔNG lấn: tooling-freshness (H1) · harvest (H2) · cái-THIẾU (lead-gap-auditor). + diff --git a/.claude/agent-memory/lead-stale-auditor/archive/_INDEX.md b/.claude/agent-memory/lead-stale-auditor/archive/_INDEX.md new file mode 100644 index 0000000..6744ad6 --- /dev/null +++ b/.claude/agent-memory/lead-stale-auditor/archive/_INDEX.md @@ -0,0 +1,5 @@ +# archive _INDEX — lead-stale-auditor + +| period | entries | pointer | bytes | +|---|---|---|---| +| `2026-08.md` | `## 🎯 Role baseline` (moved @S191) | substring:"H24 §2(1) vai-STALE — soi VIEW LỆCH SOUR" | 692 B | diff --git a/.claude/agent-memory/ring1-audit/archive/_INDEX.md b/.claude/agent-memory/ring1-audit/archive/_INDEX.md index a11ffc6..5300e52 100644 --- a/.claude/agent-memory/ring1-audit/archive/_INDEX.md +++ b/.claude/agent-memory/ring1-audit/archive/_INDEX.md @@ -4,3 +4,9 @@ |---|---|---| | `2026-07.md` | S153 · S162 | moved @S188 (refine A1 — L1 0 tầng L2, máy vĩnh viễn không PROPOSE được vì WARN keep-floor đứng trước PROPOSE trong if/elseif) | | `2026-08.md` | S168 | moved @S188 (cùng đợt) | + +## Con-trỏ VERIFY-ĐƯỢC (A2 @S191 — refine bắt: index kiểu bảng 0 token `substring:` ⇒ 2 archive **6.761 B nằm NGOÀI** lưới A7 429/429; needle lấy từ RUỘT file, không bịa) + +| period | entries | pointer | bytes | +|---|---|---|---| +| `2026-07.md` | S162 | substring:"S162 (07-30) KIỂM vòng tooling/harvest @close" | 3904 B | diff --git a/.claude/agent-memory/tooling-auditor/MEMORY.md b/.claude/agent-memory/tooling-auditor/MEMORY.md index 6cb8688..e729e5b 100644 --- a/.claude/agent-memory/tooling-auditor/MEMORY.md +++ b/.claude/agent-memory/tooling-auditor/MEMORY.md @@ -68,3 +68,15 @@ H1 tooling-freshness auditor **SOLUTION_ERP-self**. Read-only + **propose-only** - 🔸 **4 item "da can nhac roi BAC" (chong Goodhart):** `permission-matrix:3` "12 root" DUNG (ring1 S182 chot; sai la CAY) · `STATUS:7` "Tests 668" = ban-ghi-dong-lanh co neo phien · `ef-core SKILL:102` "last schema-changing Mig 70" VAN dung (Mig 71&72 `CreateTable`=0) · `STATUS:10` "roster 28" ha xuong **LOW** vi `:8` tu khai dong CURRENT lag + co neo cua-so. - **Con treo 4 carry-over deu tu drift-audit THANG S179, song ≥4 phien:** F-6 (skill mig 71) · F-7 (permission-matrix cay) · F-2 (schema-diagram 91 vs 97) · F-3 (PROJECT-MAP 0-hit 4 module, control duong `contract`=31). - Tag `[s189, cong-thuc-trong-doc-lao-hoa, bao-oan-canonical-dung, lop-hep-vs-lop-rong, mat2-sach-6-be-mat, plugin-0-delta-7]` + +## S191 (2026-08-13) @close L15 — `TOOLING: PASS_WITH_FLAGS — 8` (2H/3M/2L/1I) + +- **F-1 HIGH — o canonical STALE, lop S181 tai phat:** `STATUS:470` ghi `Migrations 72` nhung dia = **73** (`20260812141501_AddContractEndedByLevelFinalize`, land window L15 nay). Do dung cong-thuc S189: 147 `.cs` − 73 Designer − 1 ModelSnapshot = 73. 🔴 **Chinh `STATUS:6` da ghi "Mig 73 prod-top"** ⇒ file **tu mau thuan voi o canonical cua chinh no**; 5 con-tro B1 resolve ra so sai (`CLAUDE.md:69` · `cicd-monitor:242` · `database-reviewer-style:96` · `investigator-codebase:81` · `ef-core SKILL:3`). +- 🔑 **F-2 — BAI DAT NHAT: tien-de cua LEAD sai, va sai theo huong lam nhe van de.** Lead giao "`.nvmrc` KHONG ton tai". Do dia: **CO** — `fe-admin/.nvmrc` + `fe-user/.nvmrc` = `20`, tracked tu commit scaffold. Neu em nhan tien-de thi thuoc se la "tao lai .nvmrc" ⇒ **VO ICH**, vi cai hong khong phai FILE ma la **CO-CHE**: `deploy.yml` **0 hit** `setup-node`/`node-version` (goi thang `C:\Program Files\nodejs\npm.cmd`) ⇒ **khong tang nao doc .nvmrc**; `engines ">=20"` = min khong upper; **0** `.npmrc`/`engine-strict`/`packageManager` ⇒ khong chan. ⇒ **Luat: khi lead dua tien-de "X khong ton tai", do X TRUOC — file-vang va co-che-cam la 2 benh khac thuoc.** Ghost-wire lop H18 (config declared-but-unread), 8 site song khai sai + `deploy.yml:5` **chinh file CI** khai "Runner has Node 20" (that: v24.15.0/npm 11.12.1). +- **F-3 INFORM: va #92 moi bit NUA lo.** `npm ci`+lockfile chan drift CAY; nua kia (node/npm runner tu troi) **chua chan**; GUARD-92 bat react-trung-ban, KHONG bat node-doi-ban. Cung mot truc "build-env nhiem" da no P0 **2 lan**. +- 🔸 **Nguoc chieu drift thuong gap:** `iis-deploy-runbook:300` khai `npm ci` trong khi CI THAT chay `npm install`+xoa lockfile (chung: `git show 305b573f^`). **Doc dung, MAY troi** — runbook la canh-bao-som cua #92 ma khong ai doc cheo. +- 🔸 **4 item can nhac roi BAC:** ef-core mig-table dung Mig 71 ⇒ **DE NGHI DONG FLAG S179-F7**, `:25` da khai chu-dich "bang nay SE LUON tut sau va dieu do HOP LE" · `:102` "last schema-changing Mig 70" VAN dung (Mig 72&73 `CreateTable`=0) · `runbook:117-119` NTFS-compact da phu ca ca cuu `Vietreport_Master` phien nay ⇒ khong stale · `README.md:9` "Node 20+" dung. +- **Mat ② SACH 6/6 phien thu 2 lien tiep** (29: dia · VALID_ROLES · 29 dir · `STATUS:481` · `README:27` enum · matrix `194-233` 29 row comm-2-chieu-rong; frontmatter 29/29 × 3 khoa). **Plugin 18/15/3 — 0-delta phien thu 8.** Gotchas continuity **1→92, 0 gap 0 dup**, `STATUS:478`=92 khop. +- **new-alloc: `webapp-testing`** (user-global Playwright) CHUA co trong bang map `agents/README:238-245` — dung la lo #92 (byte-match+smoke 200 do FILE, khong do CHAY) ⇒ de xuat → `cicd-monitor` + `test-specialist`. +- **Carry S179 con 3** (song ≥5 phien): schema-diagram:515 "91 bang" vs 97 · PROJECT-MAP 0-hit 3 module (control duong `contract`=31) · permission-matrix thieu 5 root. +- Tag `[s191, tien-de-lead-sai-lam-nhe-benh, file-vang-vs-co-che-cam, ghost-wire-node-pin, o-canonical-tu-mau-thuan, doc-dung-may-troi, plugin-0-delta-8]` diff --git a/.claude/agents/investigator-api.md b/.claude/agents/investigator-api.md index 4bf67cb..9f56842 100644 --- a/.claude/agents/investigator-api.md +++ b/.claude/agents/investigator-api.md @@ -69,7 +69,7 @@ Append "Recent activity" FIFO: external research summary (URLs + 1-line takeaway - MediatR `12.4.1` (14 fail DI — gotcha #1) - Swashbuckle `6.9.0` (10 conflict OpenApi 2 — gotcha #2) -- Node CI pin `20.x` (bài học NamGroup) +- Node CI **KHÔNG pin** — `.nvmrc`=20 có ở `fe-*/` nhưng CI 0 bước `setup-node` (ghost-wire, gotcha #92); bài học NamGroup vẫn đứng - LibreOffice `25.8.6` · @microsoft/signalr `8.0.7` - **Khi eval upgrade:** verify KHÔNG vi phạm pin trên. New dep (vd FullCalendar) → check license MIT + bundle size gzipped impact. diff --git a/.claude/governance/.session-counter.json b/.claude/governance/.session-counter.json index 13fc1b2..d430972 100644 --- a/.claude/governance/.session-counter.json +++ b/.claude/governance/.session-counter.json @@ -1,4 +1,4 @@ -{ +{ "_note": "Harness-24 (S121, 2026-07-15, wave adap-6-broadcast W2) session counter for lead-self-audit cadence. THIS FILE HOLDS STATE ONLY - every cadence NUMBER lives in .claude/agent-memory/memory-budget.json -\u003e h24_cadence (single-source, H24 section 2(3)). Never copy the digits here.", "_why_content_based_not_blind_increment": "Owner-decisions-15-07-2026 Q2, trap found by lane E: the Stop-hook .claude/hooks/wal-flush.ps1 auto-commits on EVERY turn-boundary. A blind counter++ would therefore tick many times per real session and the cadence would be meaningless. So a tick is CONTENT-ADDRESSED: it is keyed on the repo HEAD sha at tick time. Ticking twice on the same HEAD is a NO-OP, which is what makes running /session-start twice in a row safe (acceptance: 2x /session-start on the same HEAD =\u003e +1, not +2).", "_why_this_path": "Deliberately .claude/governance/ and NOT .claude/agent-memory/. The hook covers exactly four paths (.claude/WAL.md, agent-memory/, workflows/runs/, sessions/ - the 4th added S146 together with the session-model logic-session folder); .claude/governance/ is OUTSIDE all four, so this file is never swept into a \u0027wal:\u0027 commit as a side effect. Compare .claude/agent-memory/.mfe-state.json, which IS inside the hook\u0027s reach - a counter must not live there. RE-VERIFIED at S146 when the 4th path landed: the claim is about the DIRECTORY, and .claude/sessions/ != .claude/governance/, so widening the hook did NOT invalidate it - only the count changed. Any future widening of wal-flush.ps1 MUST re-check this sentence, not just bump the number.", @@ -17,19 +17,18 @@ "last_ticked_at": "2026-08-12", "last_audit": { "light_at_counter": 60, - "deep_at_counter": 63, + "deep_at_counter": 65, "_note": "Counter value at which the last light/deep self-audit actually ran. S140 (2026-07-18): light-audit #3 at counter=14 = FORCE-FIRE DEBT PAID (closeout S139 gop P=3 pause =\u003e OVERDUE(light) INFORM; owner direction S140 \u0027dong du 5 vong\u0027 = consent DP-3 =\u003e lead spawn ca CAP H24 dau phien). 2-vai coverage 0-garble, diary ghi TRONG luc lam (anti-#53). lead-view: 1 FLAG LOW view-stale-status (HANDOFF:8 NEXT-em con treo \u0027624c378d verified-pending-\u003eexecuted\u0027 nhu to-do trong khi da executed-runtime @S140 sang) - xu @closeout re-stamp + 2 INFORM clean (model-flip S140 Fable = owner-choice KHONG can re-stamp canonical per anti-churn S106; 3 surface frozen dung). lead-omission: 1 FLAG MED gap-owner-specifics (direction session-model S140 VANG tracker - da xu TRONG PHIEN: draft session-model-se-draft.md + email hub + closeout them carry) + INFORM gap-carry-aged non-vacuous LAN DAU (hook-vs-budget-cap streak 9\u003e=M6, owner-held) + INFORM route-H1 (cum 7-carry S117/S118 VO HINH voi carry-age detector - chi age carry re-tag trong NEXT segment; aging-measurement bo sot) + META diary lead-omission thieu entry S137 (GAP-3 tai) -\u003e backfill @closeout. Prior: light #2 at counter=11 (S137, OVERDUE 8/6 paid). S143 (2026-07-22): DEEP-audit RAN at counter=17 - FORCE-FIRE SOM 1 NHIP theo direction owner (nguong tu-nhien la 18 = 3+15), KHONG phai toi-han tu-nhien. Deep bao ham light =\u003e set CA HAI light_at=deep_at=17 (tranh no ao phien sau). Chi tiet FLAG/class_repeat: xem history[] entry S143. Moc ke tiep tinh tu 17: light ~ counter 23; deep ~ counter 32.", - "signal_session": "S189", + "signal_session": "S191", "signal_decided": [ + "view-stale-count", "view-stale-status", "view-stale-header", - "view-stale-count", - "view-stale-role-desc", "view-residual-asym", - "gap-incident-unrecorded", "gap-carry-dropped", - "gap-owner-specifics", - "gap-decision-sunk" + "gap-decision-sunk", + "gap-underfill", + "gap-owner-specifics" ], "signal_reset_done": true, "signal_last_kind": "deep", @@ -41,17 +40,17 @@ "_note": "Rolling tally per flag class from lead_self_audit.flag_classes (memory-budget.json). Key = class name, value = consecutive-audit repeat count. S124 first audit = SEED (fired-once), not repeats yet (per lead-view-auditor honest-note). jump_on_class_repeat=3.", "counts": { "view-claim-broader-than-sample": 0, - "view-residual-asym": 14, - "view-stale-count": 15, - "gap-carry-dropped": 17, - "gap-decision-sunk": 10, - "view-stale-status": 11, - "gap-owner-specifics": 1, + "view-residual-asym": 15, + "view-stale-count": 16, + "gap-carry-dropped": 18, + "gap-decision-sunk": 11, + "view-stale-status": 12, + "gap-owner-specifics": 2, "gap-carry-aged": 0, - "gap-incident-unrecorded": 1, - "view-stale-header": 9, - "view-stale-role-desc": 2, - "gap-underfill": 0 + "gap-incident-unrecorded": 0, + "view-stale-header": 10, + "view-stale-role-desc": 0, + "gap-underfill": 1 }, "_view_star_repair_S149": "VA NUA view-* BI BO @S148 - phat hien boi h24-audit (vai KIEM) @S149, evidence runs/2026-07-24-S148-h24-force-fire/sub-h24-audit-S149.md muc 3 + 9c. GOC: lead-view-auditor KHONG GAN CLASS cho FLAG nao @S148 (no VAN gan @S140 va @S143, va @S146 dung header chuan \u0027## FLAG-N - `class` - SEV\u0027) =\u003e lead single-writer khong co so de chep =\u003e nua view-* dung yen trong khi nua gap-* duoc ghi du. Doi chung bat-doi-xung: cung closeout do, 3 dong gap-* ghi day du - khac biet DUY NHAT la lead-omission CO dua bang tally co nguon. SO DA VA (co nguon, chac chan): view-stale-count 0-\u003e1 (S148 fire V1 canonical-poison test-count; S146 khong fire) - view-stale-status 0-\u003e2 (S146 fire per sub-lead-view-S146.md:11, S148 fire V3 trio-first-run stale =\u003e 2 vong LIEN TIEP, vong sau fire nua la CHAM JUMP). 🔴 view-residual-asym GIU NGUYEN 1 - KHONG PHAI vi dung, ma vi KHONG XAC DINH DUOC: gia tri that thuoc {0, 3}. Ly do: S143=1 -\u003e S146 fire x2 (sub-lead-view-S146.md:27,:43) =\u003e =2 -\u003e S148 KHONG BIET vi FLAG-4/FLAG-5 cua lead-view @S148 KHONG TON TAI TREN DIA (run-folder chi co run.md, 0 file sub-*; doi chung S146 co 3 file). Neu 1 trong 2 FLAG mat tich la view-residual-asym thi =3 =\u003e CHAM JUMP =\u003e tong 4 class armed chu khong phai 3. CAM ghi 0 (= khang dinh \u0027S148 khong fire class nay\u0027 = DAT-ao, dung lop H24 sinh ra de chan) va CAM ghi 3 (= doan len).", "_jump_state_S149": "3 class CHAC CHAN cham/vuot jump_on_class_repeat=3: gap-owner-specifics 4 - gap-decision-sunk 3 - gap-carry-dropped 3. + view-stale-status 2 = armed 2/3 (vong sau fire nua la cham). + view-residual-asym KHONG XAC DINH {0,3}. =\u003e CAU TRA LOI DUNG CHO OWNER LA DAI 3-4, KHONG PHAI SO 3 TRAN. Lead da trinh so 3 tran @S149 truoc khi co ket qua vai KIEM - DA DINH CHINH trong cung phien.", @@ -329,14 +328,14 @@ "event": "squash-benign (session-counter-tick.ps1 M2, contract fail_loud_on_regress trigger-2 BENIGN branch): counter 62-\u003e63, session S188-\u003eS189, head 76e082e-\u003ed4799dd. last_ticked_head 76e082e object EXISTS (cat-file=commit) but NOT reachable (merge-base --is-ancestor exit!=0), counter not regressed =\u003e a closeout squash lifted the ticked wal:/session commit out of history (expected drift, not tamper). Trace appended, continue, no owner alarm. Written atomically (temp + Move-Item -Force)." }, { - "at": "2026-08-11", - "session": "S190", - "event": "squash-benign (session-counter-tick.ps1 M2, contract fail_loud_on_regress trigger-2 BENIGN branch): counter 63->64, session S189->S190, head d4799dd->ae1dcf4. last_ticked_head d4799dd object EXISTS (cat-file=commit) but NOT reachable (merge-base --is-ancestor exit!=0), counter not regressed => a closeout squash lifted the ticked wal:/session commit out of history (expected drift, not tamper). Trace appended, continue, no owner alarm. Written atomically (temp + Move-Item -Force)." + "at": "2026-08-11", + "session": "S190", + "event": "squash-benign (session-counter-tick.ps1 M2, contract fail_loud_on_regress trigger-2 BENIGN branch): counter 63-\u003e64, session S189-\u003eS190, head d4799dd-\u003eae1dcf4. last_ticked_head d4799dd object EXISTS (cat-file=commit) but NOT reachable (merge-base --is-ancestor exit!=0), counter not regressed =\u003e a closeout squash lifted the ticked wal:/session commit out of history (expected drift, not tamper). Trace appended, continue, no owner alarm. Written atomically (temp + Move-Item -Force)." }, { - "at": "2026-08-12", - "session": "S191", - "event": "CLEAN tick (session-counter-tick.ps1 M2): counter 64->65, session S190->S191, head ae1dcf4->eec9ad9. Classify-before-tick: no regression (n=191 >= stored n=190); last_ticked_head reachable (merge-base --is-ancestor exit 0). 4 fields updated, 1 history entry appended, written atomically (temp + Move-Item -Force)." + "at": "2026-08-12", + "session": "S191", + "event": "CLEAN tick (session-counter-tick.ps1 M2): counter 64-\u003e65, session S190-\u003eS191, head ae1dcf4-\u003eeec9ad9. Classify-before-tick: no regression (n=191 \u003e= stored n=190); last_ticked_head reachable (merge-base --is-ancestor exit 0). 4 fields updated, 1 history entry appended, written atomically (temp + Move-Item -Force)." } ] } diff --git a/.claude/skills/dependency-audit-erp/SKILL.md b/.claude/skills/dependency-audit-erp/SKILL.md index ae735fe..c995851 100644 --- a/.claude/skills/dependency-audit-erp/SKILL.md +++ b/.claude/skills/dependency-audit-erp/SKILL.md @@ -81,7 +81,7 @@ cd fe-admin; npm audit --audit-level=high; cd ..; cd fe-user; npm audit --audit- | `vite` | **8.x** | rolldown native binding cần fresh `node_modules` trên CI (gotcha npm ci fail) | | `@microsoft/signalr` | **8.0.7** | SignalR hub version parity với ASP.NET Core 10 — test kỹ trước khi bump | | `react` | **19** | Auto-scaffolded, đã style-adapt cho | -| Node engine | **`>=20`** | CI pin `20.x` qua `.nvmrc` (NamGroup bài học, gotcha #5) | +| Node engine | **`>=20`** | CI **KHÔNG** pin (`.nvmrc` không ai đọc — gotcha #92) qua `.nvmrc` (NamGroup bài học, gotcha #5) | ## Workflow khi fix vulnerability diff --git a/.claude/workflows/runs/2026-08-12-S190-soltuon-dieu-chinh-hd/sub-cicd-va-goc-92.md b/.claude/workflows/runs/2026-08-12-S190-soltuon-dieu-chinh-hd/sub-cicd-va-goc-92.md new file mode 100644 index 0000000..8dbf7c6 --- /dev/null +++ b/.claude/workflows/runs/2026-08-12-S190-soltuon-dieu-chinh-hd/sub-cicd-va-goc-92.md @@ -0,0 +1,173 @@ +# sub-cicd — verify vá GỐC gotcha #92 (`305b573f`) + +> Ghi TRONG LÚC LÀM (chống #53). File này là sản phẩm chính; return chỉ là tóm tắt. +> Bắt đầu: 2026-08-13 01:15 +07 (2026-08-12T18:15Z) + +## Đề bài +Run QUYẾT ĐỊNH: chứng minh fix `npm ci` + lockfile-committed + GUARD-92 có làm build **deterministic** không. +Kỳ vọng hash CI == local đã verify runtime lành: +- fe-user `index-CR538vZx.js` **1.700.709 B** +- fe-admin `index-C10ta-wB.js` **1.780.807 B** + +--- + +## Stage 1 — Push + filter (ĐO) + +``` +305b573f5abe85b9f6bbd640efa58db36a5950eb | 2026-08-13 01:13:34 +0700 + [CLAUDE] CICD: vá GỐC #92 — npm ci theo lockfile đã commit + guard React-đơn-bản +c03955405deb69c2 | 01:01:29 | Docs: P0-2 ... [skip ci] +7ebfc8c746f52e5d | 00:45:17 | Docs: S191 ... [skip ci] +git log origin/main..HEAD => RỖNG (đã push hết) +``` +Diff `305b573f`: 3 file — `.gitea/workflows/deploy.yml` (+61/-…), `fe-admin/package-lock.json` (+176), `fe-user/package-lock.json` (+176). **0 file BE · 0 migration · 0 file docs-only** ⇒ KHÔNG rơi vào 7-glob paths-ignore ⇒ PHẢI có run. + +## Stage 2 — gotcha #91 detector (updated_at vs branch-head) + #86 (push sát nhau) + +| Nguồn | Giá trị | Kết luận | +|---|---|---| +| `/repos/{r}`.updated_at (đọc DB tầng app) | `2026-08-13T01:13:54+07:00` | **≥ giờ push 01:13:34** ⇒ tầng app ĐÃ thấy push | +| `/branches/main`.commit.id (đọc git trên đĩa) | `305b573f…` @ 01:13:34 | khớp HEAD local | +| ActionRun sinh ra | task **id 601 / run_number 488**, head_sha `305b573f`, created `01:13:51` | ⇒ #91 **XANH**, không tái diễn ca S189 | + +**#86 (đọc run CUỐI của range):** `c0395540` + `7ebfc8c7` mang `[skip ci]` ⇒ **KHÔNG sinh task nào** (task 600 = `091073f9` từ 08-12 22:11). ⇒ run #488 là run duy nhất & cuối của range. Không có ca push-đè nuốt deploy. + +## PRE-snapshot prod (chụp 01:15 +07, LÚC run đang `running` — deploy ở CUỐI job nên đây là trạng thái TRƯỚC deploy) + +| App | index từ HTML | Content-Length | Content-Type | Last-Modified | +|---|---|---|---|---| +| eoffice | `index-CR538vZx.js` / `index-DNE0buTg.css` | 1.700.709 | application/javascript | **Wed, 12 Aug 2026 18:10:28 GMT** (=01:10:28 +07) | +| admin | `index-C10ta-wB.js` / `index-CTIZKsjE.css` | 1.780.807 | application/javascript | **Wed, 12 Aug 2026 18:10:37 GMT** (=01:10:37 +07) | + +🔴 **Cảnh báo phương-pháp (ghi TRƯỚC khi đo, không phải bào chữa sau):** prod HIỆN ĐANG chạy **chính bản cứu chép tay** = đúng 2 hash kỳ vọng. Nên **hash-equality sau deploy KHÔNG phân biệt được** "CI ra đúng hash rồi ship" ⟂ "deploy không chạy, file cũ nằm nguyên". ⇒ Bằng chứng CHÍNH phải là: +1. dòng `dist/assets/index-….js` **trong log CI** (nguồn độc lập với prod), và +2. `Last-Modified` prod **nhảy vào cửa sổ deploy** (> 18:13:51 GMT) — chứng file bị GHI ĐÈ thật. +Hai chân này cùng xanh mới kết luận được "deterministic". + +--- + +## Stage 0 — server-health guard (runbook S189) +`ssh vietreport-vps "fsutil volume diskfree C:"` → **free 26.241.798.144 B (24,4 GB)** / 54,9 GB ⇒ **XANH** (ngưỡng đỏ <5GB). Disk-death S189 KHÔNG tái. + +## Stage 3 — Test gate (log CI, đọc TÁCH-PHẦN) + +``` +Passed! - Failed: 0, Passed: 45, Skipped: 0, Total: 45 — SolutionErp.Domain.Tests.dll (227 ms) +Passed! - Failed: 0, Passed: 652, Skipped: 0, Total: 652 — SolutionErp.Infrastructure.Tests.dll (2 m 49 s) +``` +45 + 652 = **697** — khớp **CHÍNH XÁC** canonical `docs/STATUS.md:477` row Tests = 697 (45 Domain + 652 Infra). **Δ0** — đúng hình dạng diff: commit chỉ đụng `deploy.yml` + 2 lockfile, **0 file test**, nên gate đứng yên là kỳ vọng, không phải trùng hợp. + +## Stage 5 — Migration (đo trước, commit 0-mig) +- Đĩa: `ls Persistence/Migrations/*.cs` trừ Designer/Snapshot ⇒ **MIGCOUNT=73**, đuôi = `20260812141501_AddContractEndedByLevelFinalize`. +- `git diff --name-only 091073f9..305b573f -- '*Migrations*'` ⇒ **0 file** ⇒ commit **0-mig** ⇒ kỳ vọng prod `__EFMigrationsHistory` top **KHÔNG nhích**, vẫn `20260812141501_AddContractEndedByLevelFinalize`. (Verify prod ở Stage 5-verify bên dưới.) + +## 🔴 Stage 4a — GUARD-92 CÓ CHẠY (log CI, trích nguyên văn) + +``` +2026-08-12T18:21:28.7680899Z GUARD-92 OK: react don ban = 19.2.5 <- fe-admin +2026-08-12T18:22:47.1308510Z GUARD-92 OK: react don ban = 19.2.5 <- fe-user +``` +**2/2 app** in dòng OK, đúng 1 bản React `19.2.5`. **0 hit `GUARD-92 FAIL`** ⇒ không có nhánh đỏ nào bị nuốt. Kèm `npm ci` + `added 239 packages` cho **cả 2** app (bằng nhau ⇒ 2 cây cùng kích thước, khớp lockfile đã commit). + +## 🔴 Stage 4b — PHÉP ĐO QUYẾT ĐỊNH: hash CI vs local + +Dòng build **trong log CI** (nguồn ĐỘC LẬP với prod): +``` +dist/assets/index-CTIZKsjE.css 88.85 kB (fe-admin) +dist/assets/index-C10ta-wB.js 1,780.80 kB (fe-admin) +dist/assets/index-DNE0buTg.css 94.66 kB (fe-user) +dist/assets/index-CR538vZx.js 1,700.70 kB (fe-user) +``` + +| Artifact | Local (đã verify runtime lành) | CI run #488 | Khớp? | +|---|---|---|---| +| fe-user JS | `index-CR538vZx.js` 1.700.709 B | `index-CR538vZx.js` 1,700.70 kB | ✅ **hash + size** | +| fe-user CSS | `index-DNE0buTg.css` 94.665 B | `index-DNE0buTg.css` 94.66 kB | ✅ | +| fe-admin JS | `index-C10ta-wB.js` 1.780.807 B | `index-C10ta-wB.js` 1,780.80 kB | ✅ **hash + size** | +| fe-admin CSS | `index-CTIZKsjE.css` 88.858 B | `index-CTIZKsjE.css` 88.85 kB | ✅ | + +**4/4 khớp.** Vite hash = hash NỘI DUNG ⇒ hash trùng nghĩa là **cây phụ-thuộc resolve ra y hệt**, dù runner **node v24.15.0/npm 11.12.1** ⟂ local **node v22.13.0/npm 10.9.2**. ⇒ Giả thuyết "còn nguồn bất định thứ 2 ở chênh-lệch node/npm" **BỊ BÁC bằng đo**, không phải bằng suy luận. Nguồn bất định DUY NHẤT là việc xoá lockfile — đã vá. + +## Stage 4c — Run kết thúc + +Task **601 / run_number 488**, head `305b573f`, `status=success`, created `01:13:51` → updated `01:24:15` (+07) ⇒ **10m24s** (chậm hơn baseline ~6m: Infra tests 2m49s + `npm ci` ×2). Log CI cuối: +``` +18:23:23 Wrote appsettings.Production.json +18:23:23 Deploy done. App pool started. +18:23:38 API /health/live -> 200 +18:24:13 🏁 Job succeeded +``` +0 dòng `error`/`FAIL` trong toàn log (18.055 B). Chỉ 2 warning lành tính có sẵn từ trước: chunk >500 kB + `INEFFECTIVE_DYNAMIC_IMPORT realtime.ts`. +URL: https://git.baocaogiaoduc.vn/vietreport-admin/solution-erp/actions/runs/488 + +## Stage 4d — SHIP-PROOF trên prod (3 chân) + +**Chân 1 — Last-Modified nhảy vào cửa sổ deploy** (đây là chân BẮT BUỘC, vì hash PRE đã trùng hash kỳ vọng nên hash-delta vô dụng ở lượt này): + +| Asset | LM PRE (01:15) | LM POST | Trong cửa sổ run 18:13:51-18:24:15Z? | +|---|---|---|---| +| eoffice JS+CSS | 18:10:28Z | **18:23:17Z** | ✅ ghi đè THẬT | +| admin JS+CSS | 18:10:37Z | **18:21:58Z** | ✅ ghi đè THẬT | + +**Chân 2 — Content-Length prod == local == log CI, tới BYTE:** +`1.700.709` (user JS) · `94.665` (user CSS) · `1.780.807` (admin JS) · `88.858` (admin CSS). `Content-Type` = `application/javascript` / `text/css` (KHÔNG phải SPA-fallback). + +**Chân 3 — CONTROL ÂM (chứng thước còn sống, chống bẫy SPA-fallback 200):** +``` +GET /assets/index-D6lFjgKF.js (bundle crash S191) -> 200 text/html 876 B +GET /assets/index-KHONGTONTAI.js (hash bịa) -> 200 text/html 900 B +``` +⇒ mọi hash KHÔNG tồn tại đều rơi về shell 876-900B. Bundle thật trả 1,7MB `application/javascript` ⇒ phép đo phân biệt được. **Bản crash `D6lFjgKF` đã biến mất khỏi đĩa prod.** + +**Chân bổ sung — shell không stale** (đúng lỗ trắng-màn S88): `index.html` LM cũng nhảy vào cửa sổ, `Cache-Control: no-cache`, `