[CLAUDE] Docs: S162 closeout - cay 4-folder GD ship prod + bookend-close 5 vong/10 vai
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m54s

- Cay 4-folder giai doan duoi tung goi thau (bfc7b79, cicd PASS 5/5 Run #432)
- Bookend-close: H1 PASS_WITH_FLAGS · H2 GATE-FAIL 4 · H24 20 FLAG · trio MIXED
  · ring1 26D/2T · ring2 19D/1T · harness-audit 43D/4T · ctx-audit TRUOT 7 FLAG
- Lead va trong phien: F-01/F-02/F-04 + A1 archive + A2 distill + skill KHKK
  + comment mirror self-ref (SHA-pair 6/6 giu, build x2 EXIT 0)
- MIND-5 = refresh @closeout dau tien (nhip thu 5, theo de ctx-audit)
- STATUS 3 row canonical + dong CURRENT · HANDOFF 6 slot danh so (54)-(59)
- gotcha #85 · error-ledger E-015/E-016 + AS-19/AS-20 · Phase 12 roadmap
- 4 errata khai thang: tally view-stale-count thoi 1 · enum thieu 1 class
  · tong L1 lech 54 B · A2 tren trigger duong-gia (R10)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-07-30 15:13:18 +07:00
parent bfc7b79f72
commit e5123ff5e1
52 changed files with 2221 additions and 157 deletions

View File

@ -1,18 +1,13 @@
# CI/CD Monitor Agent — Persistent Memory
- **07-29 verify `a8027c0` W1 KHKK — Mig 69 `AddContractSigningPlans` [S161, 30 file +8987/22]:** ✅ **PASS 6/6** — Run **#427** (id=540) success **5m40s**; gate **566 = 45D+521I** (0 fail/skip, +4 test W1). Mig 69 APPLIED-PROD: MIGTOP `20260729122015_AddContractSigningPlans` · MIGCOUNT 68→**69** · `sys.tables` **89→96 (+7 khớp 7 CreateTable)** · 7 bảng `ContractSigningPlan{s,Lines,DossierItems,LevelOpinions,Attachments,Changelogs,Approvals}`. MenuItems **142→142 GIỮ** (policy-key ⟂ menu-key). 🔑 **KHUÔN ĐO-CỜ (không đếm ROW) — tái dùng cho mọi seeder UPGRADE-if-exists:** row đã tồn tại CanRead-only ⇒ đếm row = 0-bit; đo PRE/POST **cờ** 8 key: 7 key đích 13/0/0/0 → **13/13/13/2**, vế ÂM liệt-kê-toàn-bộ `CanDelete=1` = **đúng 14 row = {Admin,Drafter}×7** (11 role kia D=0), Drafter (non-Admin) C/U/D=1. 🔑 **Control ÂM NỘI-HỌ mạnh nhất từ trước tới nay: `Khkk_G1` bị seeder CỐ Ý bỏ khỏi danh sách 7 key** ⇒ nó phải đứng yên 13/**0/0/0** — và nó đứng yên ⟹ chứng "đúng NGƯỜI làm, đúng TẬP", không phải thứ gì lật bừa cả họ. **Đọc seeder DỰ ĐOÁN `0 added + 91 upgraded` (91=7×13) TRƯỚC khi đo → log prod khớp từng đồng** (`added=0` = đúng đường upgrade, F-S1 đóng). Marker `QT-KHKK-V2-001` grep repo TRƯỚC ⇒ độc quyền 1 site fe-admin ⇒ dự đoán admin=1/user=0, đo đúng; **control ÂM 3 TẦNG**: hash CŨ `D0sXA0fe``ct=text/html` 900B **trùng khít hash BỊA** ⇒ 200 là SPA-fallback, bundle cũ đã bị ghi đè. admin js+css rotate (`M8SDA7Ps`/`C3xzT0H9`); user FROZEN nhưng **LM 20:10:00 in-window**#69 mode-B lành tính. Restart chứng bằng **w3wp pid=4980 StartTime 20:10:05 TRÙNG dòng CI `App pool started`** + DLL mtime 20:07:50. Label F-7 sống: `?applicableType=10``"applicableTypeLabel":"Kế hoạch ký kết HĐ"`, `active:null/history:[]` + sqlcmd `ApplicableType=10`=0 ⇒ chưa dựng WF (đúng W1). Smoke 4 endpoint 200 + **route bịa 404** (chứng 200 CÓ NGHĨA). Durability `Ct_` **637/637** CanRead, root 12, DUPKEYS 0. Evidence: `runs/2026-07-29-S161-khkk-w1-schema/cicd-verify-a8027c0.md`. Tag `[run-427, pass-6-6, do-CO-khong-dem-ROW, control-am-noi-ho-key-bi-bo-sot, du-doan-91-upgraded-khop, control-am-3-tang-bundle, mig69-96-bang, gate-566]`
- **07-30 verify `bfc7b79` S162 cây-4-folder-GĐ (FE-ONLY, 17 file, 12 FE = 6+6 đối xứng ×2 app):** ✅ **PASS 5/5** — Run **#432** (id=545) success **5m35s**; gate **590 = 45D+545I** (0 fail/skip). 0 mig/0 BE ⇒ không chân EF. Bundle **4/4 ROTATE** (admin js `BBQKvUMa``DXoYDy7R` · user js `BV5--mPf``o8KDluD1`, css cả 2 đổi); `index.html` LM 10:09:07 in-window + `Cache-Control:no-cache`. 🔴 **BẪY MỚI — MOVING-TARGET `HEAD~1`:** phiên có Stop-hook WAL **tự commit giữa lúc verify**`HEAD~1` đổi nghĩa từ 'cha commit đích' thành 'chính commit đích' trong ~6 phút. Tao đã kết SAI '2 marker có sẵn ở parent ⇒ vô giá trị'; đo lại bằng SHA tuyệt đối `8eba137` thì **cả 2 = 0 hit** ⇒ marker hợp lệ. **LUẬT: verify commit X luôn neo `X^..X` bằng SHA, CẤM dùng `HEAD~1`** (mọi repo có hook auto-commit). 🔑 **Khuôn MỚI 'ĐẾM TRỌN HỌ bằng 1 REGEX'**: `pipeline-[a-z-]{0,24}index` quét bundle ra **đúng 3 phần tử** `{contract×2, khkk×1, pe×1}` khớp source element-wise ⇒ vừa là vế DƯƠNG, vừa tự chứng regex không quét bừa (mạnh hơn đếm chuỗi rời). Dự-đoán-trước-khi-đo khớp từng đồng: `contract-index`=2 (= số FILE trong diff) · VN `Kế hoạch Hợp đồng`=**1** (source 3 **2 comment**) · raw-UTF8 không escape. ⚠️ **suýt FAIL OAN lần nữa:** `Kế hoạch ký kết HĐ` (nhãn strip cũ) = **8/app** — KHÔNG dùng làm control ÂM được vì synthesis ghi rõ nhãn folder GĐ2 **cố ý khác** nhãn strip; 1-mới + 8-cũ cùng sống = chứng phân-biệt-phiên-bản. Control ÂM: chuỗi-BỊA `pipeline-hardcopy-index`=0 (source cũng 0) + hash BỊA & **hash CŨ cả 2 app** đều `ct=text/html` **876B/900B trùng khít size index.html** ⇒ bundle cũ biến mất = ghi đè thật. Smoke 4×200 + bare `/health` **404** (control). WAL-commit `a07b942` (3 file `.md`) bị `paths-ignore` nuốt ⇒ không đẻ run rác. Evidence: `runs/2026-07-30-S162-cay-4-folder-gd/sub-cicd-monitor-2.md`. Tag `[run-432, pass-5-5, CAM-HEAD~1-neo-SHA, dem-tron-ho-1-regex, control-am-DOC-QUYEN-lan-2, gate-590, fe-only]`
- _(**#426 S159 đợt-5 `ea962b1` menu 6-leaf + `GET /contracts/deleted` + bỏ hero — PASS 9/9**: gate 562, 5m38s. JS rotate cả 2 app (admin `CC1pGE1F``D0sXA0fe` · user `CLfAftby``Y6dW_5CM` +css `B6bUSFBt``6YIAufJR`); admin-css FROZEN nhưng **LM 14:44:29 in-window** ⇒ lành tính (#69 mode-B, khuôn đợt-4 dùng lại được ngay). 🔑 **CỨU FALSE-FAIL — luật MỚI về control ÂM:** brief bảo `Toàn trình 4 giai đoạn` phải VẮNG; tao grep repo-wide TRƯỚC khi đo → chuỗi vẫn sống hợp lệ ở `PePipelineStrip.tsx:24` **`aria-label`** (cả 2 app, có từ đợt-2) ⇒ **dự đoán bundle=1 chứ không 0**, đo đúng 1. Áp máy móc là FAIL OAN. Thay bằng `Quy trình mua sắm` (eyebrow hero) — `grep -rc` 2 app = **0 hit mọi file** ⇒ ĐỘC QUYỀN ⇒ bundle=0 = chứng hero đã gỡ (kèm `UserDashboardPage` 63.124→50.142 B). ⟹ **LUẬT: trước khi nhận 1 chuỗi làm control ÂM phải grep repo-wide xác nhận nó ĐỘC QUYỀN cho thứ mình muốn chứng vắng; chuỗi dùng-chung chỉ làm marker DƯƠNG.** 🔑 **SEEDER-INSERT delta khớp TOÁN (khuôn mạnh, tái dùng):** đo baseline TRƯỚC deploy rồi so SAU restart — `Ct_%_WfView` 0→**7** · `_Approved` 0→**7** · `_Deleted` 0→**7** · `Khkk_%` 5→**7** · nhãn `Ct_%_Pending`=`Đang%` 0→**7** · Dashboard `%quy tr%` 0→**1** · **MenuItems 119→142 = +23 = 7+7+7+2 khớp từng đng** · root 12 · DUPKEYS 0 · **21 key mới đủ 13/13 canread** (nhánh reviewKeys skip-existing ăn vì key HOÀN TOÀN MỚI — khác đợt-2/3 nơi row `false` sẵn có không được nâng). **Endpoint mới:** `GET /api/contracts/deleted`**401** + **control route bịa → 404** ⇒ 401 CÓ NGHĨA, không phải catch-all (đừng chỉ đo 401 trần). ⚠️ brief ghi `/contracts/deleted` thiếu prefix — route thật có `[Route("api/contracts")]`. **Durability lần 3:** 38-key **494/494** · control âm Hrm/Off/Personal=0 · `Pe%` 197/185 · `Hdc_` nhãn 7 · 3 root ẩn. ⚠️ **Bẫy phạm-vi mới: `Ct_*` nay đẻ thêm 21 key ⇒ `LEFT(MenuKey,3)='Ct_'` cho ra 59 key, KHÔNG so được với đợt trước — phải NOT LIKE 3 hậu tố mới để giữ đúng tập 38 gốc.** Evidence: `runs/2026-07-29-S159-tong-quan-pipeline-menu/cicd-verify-ea962b1.md`. Tag `[run-426, pass-9-9, control-am-phai-DOC-QUYEN, seeder-delta-khop-toan, 401-voi-control-404, durability-restart-3, query-scope-re-anchor, gate-562]`
- _(**#427 S161 W1 KHKK `a8027c0` +Mig 69 `AddContractSigningPlans` — PASS 6/6**: gate 566, 5m40s; `sys.tables` **89→96** (+7 khớp 7 CreateTable), MenuItems 142 GIỮ. 🔑 **khuôn ĐO-CỜ không đếm ROW** (row tồn tại sẵn ⇒ đếm row = 0-bit; đo PRE/POST **cờ** 7 key 13/0/0/0→13/13/13/2) + 🔑 **control ÂM NỘI-HỌ: `Khkk_G1` bị seeder CỐ Ý bỏ khỏi tập** ⇒ phải đứng yên, và nó đng yên ⇒ chứng 'đúng NGƯỜI, đúng TẬP'. Đọc seeder **dự đoán `0 added + 91 upgraded` TRƯỚC khi đo → log prod khớp từng đồng**. verbatim → `archive/2026-07.md` substring:"a8027c0` W1 KHKK")_
- _(**#425 S159 đợt-4 `a2bbcb9` 7-FLAG fix + nhãn 'Bảng cứng' — PASS 9/9**: gate 562, user js `DeAg7MWm``CLfAftby`. 🔑 **admin FROZEN vẫn chứng được lành tính**: LM 13:55:31 **in-window** + size trùng ⇒ re-ship byte-identical (#69 mode-B). 🔑 **comment-strip DỰ ĐOÁN TRƯỚC rồi mới đo**: `chưa tới` source=2 (cả 2 trong comment) → dự đoán bundle=0 → đúng 0. ⚠️ `Không tìm thấy` bundle 10 > source 3 ⇒ marker phổ-thông chỉ dùng '≥1'. **Durability lần 2**: 38-key 494/494 giữ + control âm 0)_
- _(**#426 S159 đợt-5 `ea962b1` menu 6-leaf + `GET /contracts/deleted` — PASS 9/9**: gate 562. 🔑 **LUẬT gốc control-ÂM-phải-ĐỘC-QUYỀN** (cứu false-fail: chuỗi brief bảo phải vắng vẫn sống hợp lệ ở `aria-label` ⇒ grep repo-wide TRƯỚC; chuỗi dùng-chung chỉ làm marker DƯƠNG). 🔑 **SEEDER-INSERT delta khớp TOÁN**: MenuItems **119→142 = +23 = 7+7+7+2**. Endpoint mới 401 **kèm route bịa 404** ⇒ 401 CÓ NGHĨA. ⚠️ bẫy phạm-vi query: `Ct_*` đẻ thêm 21 key ⇒ `LEFT(MenuKey,3)` không so được với đợt trước. verbatim → `archive/2026-07.md` substring:"#426 S159 đợt-5")_
- _(**#424 S159 đợt-3 `2a72695` gỡ nhánh S92 khỏi revoker + skeleton GĐ2/GĐ4 — PASS 9/9, ĐÓNG regression #423**: durability khuôn 3-CHÂN-KIỀNG (xem 'Recurring bug patterns' dưới — restart-proof + đo-sau-mốc + control-ÂM) · bundle rotate 4/4 · guard 2-vế StillHiddenKeys/ReopenedKeys · ⚠️ seeder grant skip-existing không nâng row false sẵn có. verbatim → `archive/2026-07.md` substring:"07-29 verify `2a72695` ĐỢT-3" — 🔴 pointer `_INDEX` TREO chờ slot (51-bis): index 20.313/20.480=99,2%, 167B headroom. Evidence: `runs/2026-07-29-S159-tong-quan-pipeline-menu/cicd-verify-2a72695.md`)_
- _(**S159 arc đợt-1→4 (#422 `b5799fc` · #423 `1a47a61` · #424 `2a72695` · #425 `a2bbcb9`) + S157 #419 `a52a91e`** — gate 562. 🔴 **ĐÍNH CHÍNH @S162 (H2 F-02 HIGH):** câu cũ ở đây viết *"verbatim → `archive/2026-07.md` via `_INDEX`"* cho CẢ 5 run — **SAI**: `#423`/`#424`/`#419` có trong archive ✅ nhưng **`#422 b5799fc``#425 a2bbcb9` CHƯA TỪNG vào archive** (`git log -S"b5799fc" -- .claude/agent-memory/cicd-monitor/archive/` **RỖNG toàn lịch sử**). Mất **lớp đã chưng cất**, KHÔNG mất nguyên-liệu — còn nguyên ở `runs/2026-07-29-S159-tong-quan-pipeline-menu/cicd-verify-b5799fc.md` (9.930 B) + `cicd-verify-a2bbcb9.md` (9.860 B); re-distill khi retro-harvest folder đó (HANDOFF NEXT-em #2). **Bài: stub tự khai "đã archive" là một CLAIM, phải đo mới được viết** — cùng class với F-03 (trích verbatim chuỗi không tồn tại) trong cùng phiên. Bài-học CÒN DÙNG: 🔴 **#423 PARTIAL 8/9 = phát hiện lớn nhất arc** — `RevokeTemporarilyHiddenModulesAsync` UNGATED lật 447/494 row grant SQL tay; tao sót vì **đo TRƯỚC recycle** (query lúc `running` = trạng thái CŨ) → đã nâng thành luật 3-CHÂN-KIỀNG ở 'Recurring bug patterns'; đóng ở #424 (guard 2-vế StillHidden/Reopened, 494/494 sống qua restart ×3). 🔑 #425 **comment-strip dự-đoán-trước-rồi-mới-đo** (source=2 đều trong comment → dự đoán bundle=0 → đúng 0); marker phổ-thông chỉ dùng '≥1' (`Không tìm thấy` bundle 10 > source 3). 🔑 #425 **FROZEN vẫn lành tính nếu LM in-window** (#69 mode-B). 🔑 #422 **marker PHÂN-BIỆT-PHIÊN-BẢN** (cặp chữ cũ/mới sau review: `Toàn trình`=1 & `Pipeline`=0 ⇒ prod chạy bản ĐÃ-FIX); ⚠️ **LỆCH-số phải truy PHẠM-VI-QUERY trước khi hô drift** (`LEFT(,3)` vs `LIKE 'Pe%'`). 🔑 #419 byte-marker **count = SỐ FILE trong diff** ('đúng-BỘI-SỐ' > 'tìm thấy ≥1') + control âm 2 tầng fake-hash & hash-CŨ → `text/html`)_
- _(**#423 S159 đợt-2 `1a47a61` tab-strip 4GĐ + menu 4-GĐ — PARTIAL 8/9**: 8 mục ship đúng, **FAIL mục-9 = phát hiện lớn nhất arc**: `RevokeTemporarilyHiddenModulesAsync` UNGATED lật 447/494 row grant SQL tay (còn 47: Admin 38 + Procurement 9). ⚠️ **bẫy ĐO-TRƯỚC-RECYCLE** (đo lúc `running` = trạng thái CŨ) — đã nâng thành luật ở mục 'Recurring bug patterns'. 🔑 marker-count = SỐ MODULE chứa chuỗi. verbatim → `archive/2026-07.md`)_
- _(**07-29 `b5799fc` ĐỢT-1 (Tổng quan tất cả luồng duyệt) PASS 9/9** — Run #422 5m59s, gate 562, 0 mig, user js `DptYR4wL``0GO8mgrG`. 🔑 **marker PHÂN-BIỆT-PHIÊN-BẢN**: designer gốc `Pipeline 4 giai đoạn` vs bản-sau-review `Toàn trình 4 giai đoạn` ⇒ bundle có `Toàn trình`=1 & `Pipeline`=0 ⟹ chứng prod chạy bản ĐÃ-FIX. Dùng khi review sửa CHỮ: chọn cặp chuỗi cũ/mới làm phép phân-biệt. ⚠️ **bẫy hình-dạng-truy-vấn**: control `Pe` ra 182/182 vs kỳ vọng 197/185 vì tao dùng `LEFT(MenuKey,3)='Pe_'` còn gốc là `LIKE 'Pe%'` (+`Permissions`/`Personal`/`PeWorkflows`=+15/+3) ⇒ **LỆCH-số phải truy PHẠM-VI-QUERY trước khi hô drift**. 🔴 M7 lượt này SAI (đo 11:46 TRƯỚC restart ~11:49) → regression lộ ở đợt-2, đóng ở đợt-3/4. Evidence `cicd-verify-b5799fc.md`)_
- _(**S157 #419 `a52a91e` PE cảnh-báo amber ô Địa-điểm (FE 2-app) GO 9/9** — gate 562 [45+517, khớp canonical STATUS cả tách-phần]; NO-Mig; 🔑 byte-marker **count=2/app = khớp SỐ FILE trong diff** ["đúng-BỘI-SỐ" > "tìm thấy ≥1"]; js-rotate ×2 css-FROZEN ×2; control âm 2 tầng [fake-hash + **hash CŨ** đều `ct=text/html` ⇒ bundle cũ biến mất = chứng ghi-đè]; self-correct on-disk "6 file"→13 commit/26 file · verbatim → `archive/2026-07.md` @S159-curate)_
- _(**#416 S155 `b1bae77` Workflow duyệt-TẠI-CHỖ +Mig 68 APPLIED-PROD 6/6** [gate 551; FLAG 'mig rớt khỏi commit' loại-trừ 3 lớp — mạnh nhất `GET /approval-workflows-v2` trả cột ×54 **materialize qua EF từ DB thật**] · **#407 S135 `4510cea` mã-dự-án normalize 5/5** [gate 532] · **#399 S134 `6664a61` PE lũy-kế 0-mig 5/5** [gate 528; 🔑 `ct=text/html` discriminator SẠCH HƠN size-919B vì shell-size drift] · **#398 S133 `d4fbced` +Mig 67 budget-freeze 5/5** [gate 520; backfill 18/18; python text=True crash cp1252 → dùng bytes] · verbatim → `archive/2026-07.md` via `_INDEX`)_
> **Persistent diary cross-session.** Auto-injected first ~200 lines at spawn (L1 HOT).
@ -29,7 +24,7 @@ Read-only CI/CD + post-deploy verifier SOLUTION_ERP. Polls Gitea Actions API, ve
## ⚠️ cicd-lane return-garble tracker (#53)
cicd-lane đôi khi trả nhầm slice transcript (memory-curation) thay verdict **tao TÁI PHẠM dai nhất trong roster** (×5/6 qua S114; S117/S118 ×3 nữa; cumulative all-agents ×66-cận-dưới [[feedback_agent_return_garble_recover]]). Từng **tự dán nhãn 'CLEAN-return' SAI** (harvest-curator bắt S118) **KHÔNG tự phong return sạch** mình không quan sát được return của chính mình. 🔒 **Đối-sách đã chứng minh (S158, xác nhận lần 5): ghi-đĩa TRONG LÚC LÀM.** Prompt đúng KHÔNG chặn được garble; artifact mới chặn vai có-ép-ghi-đĩa mất **0 B**, vai không-ép mất TOÀN BỘ. Mỗi lượt: file evidence trong run-folder SẢN PHẨM CHÍNH, ghi từng mục ngay khi bằng chứng, kết bằng dòng `END … VERDICT=`; return chỉ tóm tắt. Recover khi garble: em-main re-curl + sqlcmd 2-nguồn-khớp, hoặc đọc thẳng file evidence.
cicd-lane đôi khi trả nhầm slice transcript thay verdict **tao TÁI PHẠM dai nhất roster** (×5/6 qua S114; S117/S118 ×3; all-agents ×66-cận-dưới [[feedback_agent_return_garble_recover]]). Từng **tự dán nhãn 'CLEAN-return' SAI** **KHÔNG tự phong return sạch**. 🔒 **Đối-sách đã chứng minh (S158, lần 5): ghi-đĩa TRONG LÚC LÀM** prompt đúng KHÔNG chặn được, artifact mới chặn (vai có-ép mất **0 B**, vai không-ép mất TOÀN BỘ). file evidence trong run-folder SẢN PHẨM CHÍNH, ghi từng mục ngay khi bằng chứng, kết bằng `END … VERDICT=`; return chỉ tóm tắt.
---
@ -41,9 +36,9 @@ cicd-lane đôi khi trả nhầm slice transcript (memory-curation) thay verdict
- **#25 IIS WebSocket** `notification-hub/negotiate` 401/404 prod. Fix: WebSocket module enable `web.config` site api (skill `iis-deploy-runbook`).
- **#48 SQLite tie-break** `OrderByDescending(CreatedAt).First()` pick wrong khi 2+ `.Add()` cùng frozen-clock. Fix: discriminator filter BEFORE OrderBy.
- **Bundle hash unchanged = ship FAIL** push+action success nhưng prod không đổi. Verify via INDEX.HTML ref (`curl -s https://admin.solutions.com.vn/ | grep -oE '/assets/index-[A-Za-z0-9_-]+\.(js|css)'`), NOT by GETting a hash-named asset directly. verify MUST sau status=success (Run #242 false-positive: check khi "running" stale hash).
- **🔴 #69 TWO-MODE (S72 #312 + S83 #333) FE hash vừa thể ROTATE vừa thể FROZEN.** deploy.yml copy `dist\*` UNCONDITIONALLY mọi run (path-filter gate cả workflow, không per-step) 0-FE-change vẫn rotate được (mode-A); ngược lại src y hệt Vite ra byte-identical hash FROZEN (mode-B). **Cả hai lành tính ⟹ hash-delta KHÔNG phải ship-proof.** Ship-proof THẬT = `Last-Modified` in deploy-window + real-size + byte-marker. Muốn biết FE đổi thật diff `fe-*/src` trong range. 🔑 **Phân biệt FROZEN-lành-tính vs bundle-cũ-kẹt: xem `Last-Modified`** frozen + LM **trong** cửa-sổ deploy = re-ship byte-identical (OK); frozen + LM **cũ** = deploy không chạm file (cờ đỏ). S159 #425 admin frozen, LM in-window lành tính.
- **🔴 #69 TWO-MODE FE hash vừa thể ROTATE vừa thể FROZEN.** deploy.yml copy `dist\*` UNCONDITIONALLY mọi run 0-FE-change vẫn rotate (mode-A); src y hệt Vite byte-identical FROZEN (mode-B). **Cả hai lành tính ⟹ hash-delta KHÔNG phải ship-proof.** Ship-proof THẬT = `Last-Modified` in deploy-window + real-size + byte-marker. 🔑 FROZEN-lành-tính vs bundle-cũ-kẹt: **xem LM** in-window = re-ship byte-identical (OK) · LM **cũ** = deploy không chạm file (cờ đỏ).
- **⚠ SPA-fallback 200 trap (S72):** server rewrite `/*``index.html` GET `/assets/index-<BỊA>.js` vẫn **200**. Discriminator sạch = **`Content-Type`** (`text/html` ~876-919B = trap · `application/javascript` ~1,6MB = thật); size drift per-build nên đừng neo số byte. **Hash CŨ rơi về text/html = bundle cũ biến mất khỏi đĩa = chứng ghi-đè (control âm tầng-2).**
- **🔴 Durability: đo SAU recycle + 3 CHÂN KIỀNG** pool restart CUỐI deploy-window query DB lúc `running` = trạng thái (S159 đợt-2 tao sai đúng chỗ này). Khuôn đúng: (i) **chứng minh restart thật** (`w3wp` StartTime in-window + dòng ĐẦU log `Applying migrations...` hợp lệ deploy xoá `logs/`), (ii) đo chỉ-số đích SAU mốc đó, (iii) **control ÂM chứng minh checker còn sống** (thiếu (iii) thì 'fix' kiểu xoá checker cũng xanh). Ca gốc: `RevokeTemporarilyHiddenModulesAsync` ungated lật 447/494 row grant SQL tay (#423) đợt-3 #424 gỡ nhánh S92 + guard test 2 vế 494/494 sống sót. Data-change ngoài CI luôn phải re-verify SAU status=success.
- **🔴 Durability: đo SAU recycle + 3 CHÂN KIỀNG** pool restart CUỐI deploy-window query DB lúc `running` = trạng thái (tao sai đúng chỗ này #423). Khuôn: (i) **chứng minh restart thật** (`w3wp` StartTime in-window + dòng ĐẦU log `Applying migrations...`), (ii) đo chỉ-số đích SAU mốc đó, (iii) **control ÂM chứng checker còn sống** (thiếu (iii) thì 'fix' kiểu xoá checker cũng xanh). Data-change ngoài CI luôn re-verify SAU status=success.
- **Migration drift prod vs repo** compare `ls .../Persistence/Migrations/*.cs` vs `sqlcmd __EFMigrationsHistory`. Fix: check `Program.cs`/DbInitializer `app.MigrateDatabase()` + app pool recycle. Mig-applied proof = `__EFMigrationsHistory` top==repo-HEAD; stuck-old pool didn't recycle FAIL even if status=success+bundle-rotated.
---
@ -53,10 +48,10 @@ cicd-lane đôi khi trả nhầm slice transcript (memory-curation) thay verdict
- **Stage 0 RAG infra:** `Get-Service Qdrant` Running + `http://localhost:6333/healthz`. Collection `proj_solution_erp`.
- **Stage 1 Push+filter:** `git log -1 --format='%H %s'` + `git log origin/main..HEAD` empty + diff vs paths-ignore (docs-only SKIPPED-DOCS return).
- **Stage 2 Gitea poll** (max 10 iter × 60s): API `.../actions/tasks?limit=5` (NOT `/runs` 404). Match `head_sha` (NOT run_number cancelled runs shift numbering). `updated_at` stale ~2min (gotcha #46) cross-check VPS mtime. Foreground-sleep BLOCKED Windows Monitor-style busy-wait-curl-spin ~30s/iter.
- **Stage 3 Test gate:** baseline **562 PASS** (45 Domain + 517 Infra; run #422 `b5799fc` 07-29; climb 562/551/532/528/520/509/505/501/495/486/458/440/421). CI chạy cả 2 proj TRƯỚC build/deploy `status:success` = gate passed (`tasks` KHÔNG populate `conclusion` tin `status`). Local grep undercount (Theory/InlineData). Phase 9 UAT skip OK.
- **Stage 3 Test gate:** baseline **590 PASS** (45 Domain + 545 Infra; run #432 `bfc7b79` 07-30; climb 590/566/562/551/532/528/520/509/505/501/495/486/458/440/421). CI chạy cả 2 proj TRƯỚC build/deploy `status:success` = gate passed (`tasks` KHÔNG populate `conclusion` tin `status`). Local grep undercount (Theory/InlineData). Phase 9 UAT skip OK.
- **Stage 4 Post-deploy** (if SUCCESS): auth login bearer (admin + nv.test gotcha #44; token=`accessToken` route `/api/auth/login`) 3-5 endpoint smoke 2XX (incl new NEW-endpoint bodyless-POST returns **411 IIS Length-Required pre-auth NOT 404**; re-probe WITH body 401 confirms wired) FE bundle hash 2 app (per #69 = real-size-vs-fake not hash-delta) SignalR negotiate (gotcha #25) EF mig prod==repo.
- **Stage 4.6 (S29 CRITICAL):** sqlcmd seed sample verify post-deploy (NOT chỉ schema). Seed=runtime-row-insert (no history/tables advance) verify via DB-query (e.g. Permissions count), NOT bundle-frozen-alone.
- Discovery: ASP.NET 10 record enum needs numeric input unless `JsonStringEnumConverter` (SOL has NO converter FE sends numeric). sqlcmd ssh Windows-auth `\\\\SQLEXPRESS` 4-backslash. INFRASTRUCTURE seed MUST run (NOT inside `if(!demoSeedDisabled)`); DEMO seed gated gotcha #51.
- Discovery: record enum cần input SỐ (SOL không `JsonStringEnumConverter`). sqlcmd ssh Windows-auth `\\\\SQLEXPRESS` 4-backslash. INFRASTRUCTURE seed ungated / DEMO seed gated gotcha #51.
- **Stage 5 Report** PASS/FAIL + evidence + MEMORY update.
---
@ -69,13 +64,13 @@ cicd-lane đôi khi trả nhầm slice transcript (memory-curation) thay verdict
## 🧠 SOLUTION_ERP CI/CD essentials (S80 verified — re-ground từ docs/STATUS.md canonical)
- **Gitea:** `git.baocaogiaoduc.vn/vietreport-admin/solution-erp` · workflow `.gitea/workflows/deploy.yml` · paths-ignore 7-entry (D10 S111 #495): `['docs/**','**/*.md','.claude/skills/**','.claude/agent-memory/**','.claude/workflows/runs/**','.gitignore','scripts/**.md']`. Anon API works (public repo) when GITEA_TOKEN absent.
- **Prod:** api/admin/eoffice `.solutions.com.vn` · SSH `ssh vietreport-vps` (Administrator, id_ed25519) · IIS phys paths: API `C:\inetpub\solution-erp\api` · admin `\fe-admin` · user `\fe-user`. DB `.\SQLEXPRESS`/`SolutionErp`/`vrapp` SQL-auth. **Conn key = `ConnectionStrings.Default` (NOT `DefaultConnection`)**. DB pw = `buKL3TGBkD0wDDbYVw65QeX9` (User Id=`vrapp`; Password field has NO `vrapp/` prefix S89 login-failed when prefix included; read verbatim from prod `appsettings.Production.json` ConnectionStrings.Default when `$env:PROD_DB_PASSWORD` empty). skill-doc path `C:\inetpub\apps\SolutionErp\Api` STALE.
- **Prod:** api/admin/eoffice `.solutions.com.vn` · SSH `ssh vietreport-vps` (Administrator, id_ed25519) · IIS phys paths: API `C:\inetpub\solution-erp\api` · admin `\fe-admin` · user `\fe-user`. DB `.\SQLEXPRESS`/`SolutionErp`/`vrapp` SQL-auth. **Conn key = `ConnectionStrings.Default` (NOT `DefaultConnection`)**. DB pw = `buKL3TGBkD0wDDbYVw65QeX9` (User Id=`vrapp`; Password field has NO `vrapp/` prefix S89 login-failed when prefix included; read verbatim from prod `appsettings.Production.json` ConnectionStrings.Default when `$env:PROD_DB_PASSWORD` empty).
- **SSHPS quoting (S42):** nested bashsshpowershell mangles `$var`/`\"` use `iconv UTF-16LE | base64` `powershell -EncodedCommand $B64`; OR write ps1-file + `powershell -File $(cygpath -w)`. sqlcmd over SSH direct `-W -h -1` pw-inline. sys-catalog string-concat `COLLATE DATABASE_DEFAULT` (collation conflict).
- **Tests baseline:** **562 PASS** (45 Domain + 517 Infra · 0 fail/skip; run #422 `b5799fc` 07-29; khớp canonical `docs/STATUS.md`). 🔑 **Số cụ thể lấy ở web-UI log `https://git.baocaogiaoduc.vn/vietreport-admin/solution-erp/actions/runs/{run_number}/jobs/0/logs` (~18KB, KHÔNG có `/api/v1/` — api/v1 runs+tasks logs đều 404)** mỗi project 1 dòng `Passed! - Failed: 0, Passed: N, Skipped: 0`; đối chiếu TÁCH-PHẦN (45/517) chứ đừng chỉ khớp tổng. Delta test mới = so run trước.
- **Mig latest repo: Mig 68 `AddPeAllowApproverDelete`** (`20260727033522`, S155 AddColumn bit trên `ApprovalWorkflowLevels`, no-new-table; VERIFIED-APPLIED-PROD). Path `src/Backend/SolutionErp.Infrastructure/Persistence/Migrations/` (68 `.cs` excl Designer/Snapshot). Prod check `sqlcmd __EFMigrationsHistory ORDER BY MigrationId DESC`. **`sys.tables`(is_ms_shipped=0)=89** AddColumn/data-only/enum-additive KHÔNG đổi số; no-new-table commit 89 đúng, đừng FAIL. **NO-Mig proof = history NOT-advance + empty `git diff <base>..<head> -- '*Migrations*'`.** Bảng mig đầy đủ skill `ef-core-migration` + `docs/STATUS.md`.
- **Bundle hash live:** ship-baseline = run **#426** (07-29 đợt-5 `ea962b1`) admin js `D0sXA0fe`/css `DWDbm5As` (frozen-hợp-lệ LM-in-window) · eoffice js `Y6dW_5CM`/css `6YIAufJR`. **SNAPSHOT-per-run, KHÔNG phải mốc ổn định** (#69 TWO-MODE) LUÔN re-snapshot LIVE sau status=success; ship-proof = LM-in-window + real-size + marker, KHÔNG phải hash-delta. id run_number (key theo head_sha).
- **Tests baseline:** **590 PASS** (45 Domain + 545 Infra · 0 fail/skip; run #432 `bfc7b79` 07-30 đo LIVE web-UI log). 🔑 **Số cụ thể lấy ở web-UI log `https://git.baocaogiaoduc.vn/vietreport-admin/solution-erp/actions/runs/{run_number}/jobs/0/logs` (~18KB, KHÔNG có `/api/v1/` — api/v1 runs+tasks logs đều 404)** mỗi project 1 dòng `Passed! - Failed: 0, Passed: N, Skipped: 0`; đối chiếu TÁCH-PHẦN (45/545) chứ đừng chỉ khớp tổng. Delta test mới = so run trước.
- **Mig latest repo: Mig 69 `AddContractSigningPlans`** (`20260729122015`, S161 7 CreateTable, `sys.tables` 89→**96**, applied-prod #427). Path `src/Backend/SolutionErp.Infrastructure/Persistence/Migrations/` (đếm `.cs` excl Designer/Snapshot). Prod check `sqlcmd __EFMigrationsHistory ORDER BY MigrationId DESC`. **`sys.tables`(is_ms_shipped=0)=96** (sau Mig 69; 89 trước đó) AddColumn/data-only KHÔNG đổi số no-new-table commit giữ nguyên, đừng FAIL. **NO-Mig proof = history NOT-advance + empty `git diff <base>..<head> -- '*Migrations*'`.** Bảng mig đầy đủ skill `ef-core-migration` + `docs/STATUS.md`.
- **Bundle hash live:** ship-baseline = run **#432** (07-30 `bfc7b79`) admin js `DXoYDy7R`/css `BZ5F-g1w` · eoffice js `o8KDluD1`/css `yNZDmVNz` (cả 4 rotate, LM in-window). **SNAPSHOT-per-run, KHÔNG phải mốc ổn định** (#69 TWO-MODE) LUÔN re-snapshot LIVE sau status=success; ship-proof = LM-in-window + real-size + marker, KHÔNG phải hash-delta. id run_number (key theo head_sha).
- **Bearer:** admin `admin@solutions.com.vn/Admin@123456` (full) · UAT `nv.test@solutions.com.vn/TestUser@123456` (Drafter CCM, gotcha #44 check).
- **API Serilog log:** sink THẬT = `C:\inetpub\solution-erppi\logs\solution-erp-YYYYMMDD.log` (lowercase `logs`; skill-runbook path `…\Logs\log-*.txt` STALE grep rỗng). Default=Information (DbInitializer seed/revoke lines ghi). **deploy `Remove-Item …pi\*` xoá luôn `logs/`** chỉ còn từ lần deploy cuối, không truy ngược restart trước. Dùng grep revoke-line + seeder-line cùng-giây để audit seed-race.
- **API Serilog:** sink THẬT `C:\inetpub\solution-erp\api\logs\solution-erp-YYYYMMDD.log` (skill-runbook `…\Logs\log-*.txt` STALE). Level=Information (seed/revoke lines ghi). deploy xoá luôn `logs/` chỉ còn từ deploy cuối. Grep revoke-line + seeder-line cùng-giây để audit seed-race. *(S162: bản cũ dòng này chứa byte BEL 0x07 do `\a` bị nuốt — đã sửa.)*
## 🔑 Critical config (flag commit nếu tái xuất)
Node CI `20.x` (`feedback_node_cicd`) · MediatR `12.4.1` (gotcha #1, flag `Version="14`) · Swashbuckle `6.9.0` (gotcha #2) · act_runner manual checkout (#39) · npm cache DISABLED (#40, flag `cache: npm`)
@ -83,7 +78,7 @@ Node CI `20.x` (`feedback_node_cicd`) · MediatR `12.4.1` (gotcha #1, flag `Vers
---
## 🎯 Per-NV admin opt-in wire — 10-point checklist (cumulative S22→S23)
Cross-ref `feedback_per_nv_permission_scope`. Refactor per-NV/per-Level phải verify 10 điểm: Domain field · EF `HasDefaultValue(false)` · Mig 3-file · Service read · Domain+App DTO mirror · Designer FE checkbox · AwLevelDto+ToDto · Create/Update input · **(9) Lookup discrimination** (`FirstOrDefault` thêm `ApproverUserId==actorId` + admin fallback) · **(10) Controller body record count == Command record count**. Miss 9-10 bug prod im-lặng 2-3 ngày. Sau refactor OR-of-N: `grep -n "FirstOrDefault.*Order.*==" *.cs`.
Cross-ref `feedback_per_nv_permission_scope` (10 điểm đầy đủ đó). 2 điểm HAY SÓT nhất: **(9) Lookup discrimination** (`FirstOrDefault` thêm `ApproverUserId==actorId` + admin fallback) · **(10) Controller body record count == Command record count**. Miss 9-10 bug prod im-lặng 2-3 ngày. Sau refactor OR-of-N: `grep -n "FirstOrDefault.*Order.*==" *.cs`.
## 📊 Run stats baseline
BE (test+build) ~90s · FE × 2 ~60s/app · deploy ~30s · **total ~3min code / 0s docs-only**. >5min → escalate. Recent runs all ~4m40-5m.
@ -92,13 +87,14 @@ BE (test+build) ~90s · FE × 2 ~60s/app · deploy ~30s · **total ~3min code /
## 📅 Recent runs (compressed — verbatim → archive via `_INDEX.md`)
- _(**S98-S132 #383-#397/#485-#496 — GOVERNANCE/FE/SECURITY streak, all GO** (gate leo 440→509): 🔑 bài-học còn dùng — **AS-6 #41 soi TỪNG file vs 7-glob** (`.ps1`/`.json` thoát `scripts/**.md`governance non-.md VẪN trigger CI; memory-push thì HẾT trigger từ #495) · `conclusion:None` dù success ⇒ tin `status` · **411-refine**: endpoint MỚI bodyless-POST trả **411** (IIS Length-Required, pre-auth) KHÔNG phải 404 → re-probe CÓ body, 401/415 đã wire · bare `/health`=404 UNMAPPED, thật là `/health/live`+`/ready` (đừng FAIL nhầm) · **LM mới hơn cửa-sổ đã verify = detector 'có run mình bỏ sót'** · Mig 63/64/65/66 + Mig 67 đều APPLIED-PROD, 89-table giữ · verbatim → `archive/2026-07.md` via `_INDEX`)_
- _(**PASS-pattern library S69b→S104 #307-#494** all GO — recipe tái dùng: **SCHEMA-ADD+DATA-UN-CRAM** [#488 Supplier 9→27 Mig62: AddColumn×18-exact + 89-invariant + DTO-live] · **DATA-FIX-BACKFILL** [#484 Mig61: Mig-top==HEAD + target-rows-flip-EXACT + control-untouched + derived-API-FLIP-live] · **DATA-SEED-PASS** [#477: pre/post-DB-row-delta + DLL-mtime + w3wp-recycle]; #482 Mig60 EF-ternary-SQL 200≠500; **#472 PROD Identity table NON-prefix `Roles`** (không `AspNetRoles`); Mig54-62 applied-prod; #348 411→401 · verbatim → git + `2026-06/07.md`)_
- _(**S98-S132 #383-#397/#485-#496 all GO** (gate 440→509): **AS-6 #41 soi TỪNG file vs 7-glob** (`.ps1`/`.json` thoát `scripts/**.md`vẫn trigger CI) · `conclusion:None` dù success ⇒ tin `status` · **411-refine** (endpoint MỚI bodyless-POST = 411 IIS pre-auth; re-probe CÓ body 401/415 = đã wire) · **LM mới hơn cửa-sổ đã verify = detector 'có run bỏ sót'** · Mig 63-67 applied-prod · verbatim → `archive/2026-07.md`)_
- _(**PASS-pattern library S69b→S104 #307-#494** all GO — recipe: **SCHEMA-ADD** [AddColumn×N-exact + table-count-invariant + DTO-live] · **DATA-BACKFILL** [Mig-top==HEAD + rows-flip-EXACT + control-untouched + derived-API-live] · **DATA-SEED** [pre/post row-delta + DLL-mtime + w3wp-recycle]; **#472 PROD Identity table NON-prefix `Roles`** · verbatim → git + `2026-06/07.md`)_
- **Older (S83 #325 ← S29 #232) → git `d2f52ba` + `archive/2026-06.md`** (incl #291 06-16 FAIL [gotcha #65]); pre-S38 → `archive/2026-05-*`.
---
## 🔄 Curate trigger
- >~30KB → archive recent runs → L2 `archive/<period>.md` (byte-exact append) + `_INDEX.md` substring pointer. Dup failure patterns → merge. Stale >3mo → remove.
- **Last curate: 2026-07-14 S118 (self #389-run: S117 #387 verbatim`archive/2026-07.md` moved-not-cut byte-id, baselines 505→509; prev S115 self 21.6→<17KB)**: #384/#383/#496/#495 (S114/S113/S112/S111) verbatim `archive/2026-07.md` + `_INDEX` +4 pointers S114 compact-stub + S111-113 merged-stub; top S114 garble-block 1-line tracker.
- **Prev: S111 07-12 self 20.517 (#490-#494archive) · S107 07-10 self 20.416.9 (#489/#488archive) · S104 07-06 self 20.517.9 · S98 07-02 em-main 19.917.06 (`2026-07.md` NEW) · S80 06-20 em-main 38.816 · S70 06-17 Harness-9 65.223.2 · earlier S66 · S40.**
- **Last curate: 2026-07-30 S162 (self #432-run: 26.9KB→<17.1KB #427+#426 verbatim`archive/2026-07.md` moved-not-cut; #422/#423/#424/#425/#419 merged-stub; baselines gate 562590 + bundle + Mig 69). **0-BYTE NEAR-MISS**: `io.open(mem,'w')` TRUNCATE trước khi `UnicodeEncodeError` (emoji viết bằng cặp surrogate `\ud83d\udd34`) file về 0 B; cứu bằng `git checkout HEAD --`. **LUẬT: script sửa MEMORY phải build chuỗi XONG → ghi temp → `os.replace`, và verify byte>0 ngay sau.**
- **Prev:** S118 07-14 (#387/#384/#383/#496/#495archive) · S111 20.517 · S107 20.416.9 · S104 20.517.9 · S98 19.917.06 (`2026-07.md` NEW) · S80 38.816 · S70 65.223.2 · S66 · S40.

View File

@ -65,3 +65,9 @@
## Moved @S160 (2026-07-29) — verbatim from L1 (moved-not-cut; pointer _INDEX treo cho (51-bis))
- **07-29 verify `2a72695` ĐỢT-3 (gỡ nhánh S92 khỏi revoker + skeleton menu GĐ2/GĐ4 + ComingSoonPage×2) [S159, 9 file code, 0 mig]:** ✅ **PASS 9/9 — ĐÓNG regression tao bắt ở đợt-2.** Run **#424** (id=537) success **5m56s**; gate **562** giữ nguyên (3 test SỬA theo spec-change, không thêm ⇒ tổng không đổi). Bundle rotate **4/4** (admin `D6Pz7nfV``CC1pGE1F`/`B1ErASuI``DWDbm5As` · user `Bpb8WEuY``DeAg7MWm`/`7oAYFlzM``BQIZ-rUe`); marker `Phân hệ đang được triển khai`=1 cả 2 bundle + `Quay lại`=4; hash CŨ→`text/html` = chứng ghi-đè. Menu-tree: Khkk=5 · Hdc=7 · root=12 · DUPKEYS=0 · 3 root vis=0. 🔑 **PHÉP DURABILITY LÀM ĐÚNG (sửa lỗi đo-sớm đợt-2) — khuôn 3 CHÂN KIỀNG, tái dùng cho mọi ca 'fix có bền không':** (i) **CHỨNG MINH có restart THẬT trước khi đo**`w3wp` PID StartTime 12:39:56 trong cửa-sổ deploy + **dòng ĐẦU log = 12:40:03 `Applying migrations...`** (dùng được vì deploy xoá `logs/` ⇒ log mở lại = boot mới) + DLL mtime; (ii) đo CÁI CẦN: 38-key **min=13 max=13 keys=38, tổng 494/494** SAU restart (đợt-2 chính phép này ra 47/494); (iii) **control ÂM chống Goodhart**: `Hrm/Off/Personal` non-Admin vẫn **=0** ⇒ revoker CÒN SỐNG, nên (ii) xanh KHÔNG phải do vô hiệu hoá cả hàm. **Thiếu (iii) thì 'fix' bằng cách xoá luôn checker cũng xanh y hệt.** Bổ sung: `Revoked` **0 dòng** trong log = ĐÚNG (hàm chỉ log khi `rows.Count>0`; nay 0 row cần lật, so 447 ở đợt-2) — **vắng-mặt phải giải-trình bằng cơ-chế, đừng đọc thành thiếu dữ liệu**. Guard mới có RĂNG 2 vế: `StillHiddenKeys` phải false + `ReopenedKeys` phải TRUE ⇒ re-add nhánh S92 là CI đỏ. ⚠️ Bẫy số: nhãn `01.-07.` đếm ra **14** (kỳ vọng 7) — tách prefix ra `Ct_`=7 + `Hdc_`=7 + other=0, đúng thiết kế 'GĐ4 tái dùng nhãn đã đánh số', KHÔNG phải nhân đôi. ⚠️ seeder grant là **skip-existing** ⇒ không tự nâng row `false` sẵn có trên prod; prod phải re-grant SQL + revoker thôi lật. Evidence: `runs/2026-07-29-S159-tong-quan-pipeline-menu/cicd-verify-2a72695.md`. Tag `[run-424, pass-9-9, durability-3-chan-kieng, restart-proof-w3wp-log-head, control-am-chong-goodhart, gate-562]`
## Moved @S162 (2026-07-30) — verbatim from L1 (moved-not-cut; MEMORY 26.9KB->target <17.1KB)
- **07-29 verify `a8027c0` W1 KHKK — Mig 69 `AddContractSigningPlans` [S161, 30 file +8987/22]:** ✅ **PASS 6/6** — Run **#427** (id=540) success **5m40s**; gate **566 = 45D+521I** (0 fail/skip, +4 test W1). Mig 69 APPLIED-PROD: MIGTOP `20260729122015_AddContractSigningPlans` · MIGCOUNT 68→**69** · `sys.tables` **89→96 (+7 khớp 7 CreateTable)** · 7 bảng `ContractSigningPlan{s,Lines,DossierItems,LevelOpinions,Attachments,Changelogs,Approvals}`. MenuItems **142→142 GIỮ** (policy-key ⟂ menu-key). 🔑 **KHUÔN ĐO-CỜ (không đếm ROW) — tái dùng cho mọi seeder UPGRADE-if-exists:** row đã tồn tại CanRead-only ⇒ đếm row = 0-bit; đo PRE/POST **cờ** 8 key: 7 key đích 13/0/0/0 → **13/13/13/2**, vế ÂM liệt-kê-toàn-bộ `CanDelete=1` = **đúng 14 row = {Admin,Drafter}×7** (11 role kia D=0), Drafter (non-Admin) C/U/D=1. 🔑 **Control ÂM NỘI-HỌ mạnh nhất từ trước tới nay: `Khkk_G1` bị seeder CỐ Ý bỏ khỏi danh sách 7 key** ⇒ nó phải đứng yên 13/**0/0/0** — và nó đứng yên ⟹ chứng "đúng NGƯỜI làm, đúng TẬP", không phải thứ gì lật bừa cả họ. **Đọc seeder DỰ ĐOÁN `0 added + 91 upgraded` (91=7×13) TRƯỚC khi đo → log prod khớp từng đồng** (`added=0` = đúng đường upgrade, F-S1 đóng). Marker `QT-KHKK-V2-001` grep repo TRƯỚC ⇒ độc quyền 1 site fe-admin ⇒ dự đoán admin=1/user=0, đo đúng; **control ÂM 3 TẦNG**: hash CŨ `D0sXA0fe``ct=text/html` 900B **trùng khít hash BỊA** ⇒ 200 là SPA-fallback, bundle cũ đã bị ghi đè. admin js+css rotate (`M8SDA7Ps`/`C3xzT0H9`); user FROZEN nhưng **LM 20:10:00 in-window**#69 mode-B lành tính. Restart chứng bằng **w3wp pid=4980 StartTime 20:10:05 TRÙNG dòng CI `App pool started`** + DLL mtime 20:07:50. Label F-7 sống: `?applicableType=10``"applicableTypeLabel":"Kế hoạch ký kết HĐ"`, `active:null/history:[]` + sqlcmd `ApplicableType=10`=0 ⇒ chưa dựng WF (đúng W1). Smoke 4 endpoint 200 + **route bịa 404** (chứng 200 CÓ NGHĨA). Durability `Ct_` **637/637** CanRead, root 12, DUPKEYS 0. Evidence: `runs/2026-07-29-S161-khkk-w1-schema/cicd-verify-a8027c0.md`. Tag `[run-427, pass-6-6, do-CO-khong-dem-ROW, control-am-noi-ho-key-bi-bo-sot, du-doan-91-upgraded-khop, control-am-3-tang-bundle, mig69-96-bang, gate-566]`
- _(**#426 S159 đợt-5 `ea962b1` menu 6-leaf + `GET /contracts/deleted` + bỏ hero — PASS 9/9**: gate 562, 5m38s. JS rotate cả 2 app (admin `CC1pGE1F``D0sXA0fe` · user `CLfAftby``Y6dW_5CM` +css `B6bUSFBt``6YIAufJR`); admin-css FROZEN nhưng **LM 14:44:29 in-window** ⇒ lành tính (#69 mode-B, khuôn đợt-4 dùng lại được ngay). 🔑 **CỨU FALSE-FAIL — luật MỚI về control ÂM:** brief bảo `Toàn trình 4 giai đoạn` phải VẮNG; tao grep repo-wide TRƯỚC khi đo → chuỗi vẫn sống hợp lệ ở `PePipelineStrip.tsx:24` **`aria-label`** (cả 2 app, có từ đợt-2) ⇒ **dự đoán bundle=1 chứ không 0**, đo đúng 1. Áp máy móc là FAIL OAN. Thay bằng `Quy trình mua sắm` (eyebrow hero) — `grep -rc` 2 app = **0 hit mọi file** ⇒ ĐỘC QUYỀN ⇒ bundle=0 = chứng hero đã gỡ (kèm `UserDashboardPage` 63.124→50.142 B). ⟹ **LUẬT: trước khi nhận 1 chuỗi làm control ÂM phải grep repo-wide xác nhận nó ĐỘC QUYỀN cho thứ mình muốn chứng vắng; chuỗi dùng-chung chỉ làm marker DƯƠNG.** 🔑 **SEEDER-INSERT delta khớp TOÁN (khuôn mạnh, tái dùng):** đo baseline TRƯỚC deploy rồi so SAU restart — `Ct_%_WfView` 0→**7** · `_Approved` 0→**7** · `_Deleted` 0→**7** · `Khkk_%` 5→**7** · nhãn `Ct_%_Pending`=`Đang%` 0→**7** · Dashboard `%quy tr%` 0→**1** · **MenuItems 119→142 = +23 = 7+7+7+2 khớp từng đồng** · root 12 · DUPKEYS 0 · **21 key mới đủ 13/13 canread** (nhánh reviewKeys skip-existing ăn vì key HOÀN TOÀN MỚI — khác đợt-2/3 nơi row `false` sẵn có không được nâng). **Endpoint mới:** `GET /api/contracts/deleted`**401** + **control route bịa → 404** ⇒ 401 CÓ NGHĨA, không phải catch-all (đừng chỉ đo 401 trần). ⚠️ brief ghi `/contracts/deleted` thiếu prefix — route thật có `[Route("api/contracts")]`. **Durability lần 3:** 38-key **494/494** · control âm Hrm/Off/Personal=0 · `Pe%` 197/185 · `Hdc_` nhãn 7 · 3 root ẩn. ⚠️ **Bẫy phạm-vi mới: `Ct_*` nay đẻ thêm 21 key ⇒ `LEFT(MenuKey,3)='Ct_'` cho ra 59 key, KHÔNG so được với đợt trước — phải NOT LIKE 3 hậu tố mới để giữ đúng tập 38 gốc.** Evidence: `runs/2026-07-29-S159-tong-quan-pipeline-menu/cicd-verify-ea962b1.md`. Tag `[run-426, pass-9-9, control-am-phai-DOC-QUYEN, seeder-delta-khop-toan, 401-voi-control-404, durability-restart-3, query-scope-re-anchor, gate-562]`

View File

@ -1,5 +1,6 @@
# ctx-audit Agent — Persistent Memory
- **S162 (07-30) SOI-CHUỖI @close`TRUOT — 7 FLAG` `[LEAD SEED ON-BEHALF @closeout M9 — nguon: sub-ctx-audit-close-S162.md, END-line dòng cuối]`:** 🔴 **FLAG lớn nhất = TRẢ LỜI CÂU HỎI THIẾT KẾ: nhịp ghi `_mind` có LỖ, không hợp-lệ.** Luật neo ghi vào `/pause`, nhưng cửa-sổ **không bắt buộc** đóng bằng `/pause` ⇒ vào `/tiep` + ra `/session-end` = **đường hợp-lệ xuyên TRỌN cửa-sổ với 0 lần ghi**; thiệt hại đo được: mục E phủ **0/13** lượt window-4. 4 căn cứ: máy phép (10) tự fire `co` (`_mind` cũ hơn artifact **839 phút**) · bất-biến phép (6) đã chừa sẵn “tối đa 2 refresh bookend” ⇒ luật **KỲ VỌNG** bookend đẻ block · MIND-1 là tiền lệ refresh-bookend cùng phiên-logic · **tao đã nêu đúng lỗ này @S158 (L7), L8 tái phát**. Đề 1 câu sửa luật (lead **đã thi hành nửa đầu**: viết MIND-5 = refresh @closeout ĐẦU TIÊN của repo): *nâng nhịp 4→5, thêm `refresh @closeout` vào `session-end §L.b`, chèn SAU vòng kiểm cuối TRƯỚC `_end`; cửa-sổ đóng mà `|block|` không tăng thì `_end` BẮT BUỘC mang `mind-refresh: BỎ QUA — <lý do>`, thiếu = TRƯỢT closed-check***vế fail-LOUD là vế quan trọng nhất**. **FLAG-2 HIGH — nguyên nhân GỐC vai-2 chưa nêu: NÉN là lane KHÔNG AI GÁC** — vai-1 @PAUSE-3 **cũng** bắt 2 ý D rơi nhưng là **cặp KHÁC****4 ý rơi / 2 sự kiện / 1 cửa**; curator soi *block đang soạn*, thao tác *nén block cũ* nằm NGOÀI 8 điểm được chấm ⇒ **thao tác duy nhất được phép sửa quá khứ là thao tác duy nhất không bị soi**. **FLAG-3 HIGH — bắt ĐÚNG 1 LỖI CỦA LEAD**: di-trú 1/2 SAI CHIỀU — `slot-45` ĐỦ, nhưng `C11b` **SAI**: khuyết-tật ĐÃ VÁ từ S159 ở CẢ 2 site (`governance-detectors.ps1` regex `^(sub-.+|.+-return)\.md$`) ⇒ lead **bơm việc-ma vào hàng đợi owner**, và 2 neo `:1095/:1760` đã thối (thật `:1102/:1771`) — **ngay dòng dưới** chỗ lead vừa ghi luật “trỏ NỘI-DUNG không số-dòng” ⇒ *bài học cách nhau 1 dòng vẫn không tự bật*. (Lead verify độc lập bằng `sed -n` rồi RÚT khỏi WAL cùng closeout.) **K7 của vai-2 ĐÚNG CHÍNH XÁC 2 ý** — dựng lại bản trước nén bằng `git show 2c11005:` (con-trỏ giải được, chứng bằng thực thi). **Mồi-ngầm ĐẠT lần đầu qua 3 lượt gieo** (ý tách service-chết ⟂ SE-không-re-index đã thi hành tận nguồn `STATUS:13`). Bất-biến chuỗi CÂN 5/3/3/3, 0 mồ côi. Tự khai 2 lỗi của chính mình: **FLAG-1** persona tao `{p,p+1}` ⟂ máy `p..p+3` ⇒ cùng số 5 ra 2 phán ngược (máy đúng, persona tao lỗi thời) · **FLAG-0** số PIN `11/0/0` chụp @/tiep đã hết hạn, đo tươi `10/0/1`**nếu tuân “đừng phán lại” thì cờ duy nhất của phiên biến mất**. Tag `[s162, truot-7-flag, lo-nhip-ghi-mind-tai-phat-L7, nen-la-lane-khong-ai-gac, bat-dung-1-loi-lead-viec-ma, moi-ngam-dat-lan-dau, tu-khai-persona-loi-thoi, seed-on-behalf]`
- **S153 (2026-07-26) SINH RA + RENAME cùng phiên — vai-3 vòng Ctx `[seed on-behalf by lead @closeout M9 — mày CHƯA chạy lần nào; nguồn = đĩa, KHÔNG tái-dựng từ trí nhớ]`:** adopt thư hub `0df10df4` (pause-tiep-upgrade-vong-ctx, sàn 7-khoản lớp mềm). Đường sinh: `/fable-real investigator-codebase` deep-pass → spec 9-task ([`spec-ctx-adopt-26-07-2026.md`](../../workflows/runs/2026-07-26-S153-ctx-adopt/spec-ctx-adopt-26-07-2026.md)) → hmw Opus-5-MAX T3 tạo persona (11/11 acceptance, 14.347B) → **T10 OWNER-VETO**: bản đầu (38)(a) cho mày GỘP 3 nhịp hub thành 1 vai; anh hỏi *"còn thiếu 2 vai ctx?"* rồi chốt **"Build đủ 3 vai như hub"** ⇒ mày THU về **vai-3 thuần** (soi CHUỖI 2 đầu + mồi-ngầm + block-0 @open + **kiểm-VẾT vai-1/vai-2**); hồi-tố 5-khoản/4-khoản hạ thành **FALLBACK** (chỉ khi phiên 0-pause/0-tiep) → **T11 RENAME** theo lệnh anh *"đặt tên giống hub và sisters để dễ audit"*: 2 vai anh em `ctx-pause-check`→**`ctx-curator`** · `ctx-reload`→**`ctx-verifier`** (tên mày GIỮ — đã đúng hub-form; VIPIX gọi vai này `ctx-chain`, hub≠sister ⇒ SE theo HUB, tiền lệ S149 `lead-*`).
**Nấc THẬT của mày:** `file-land + registry-surfaced @S153`**spawn-probe ALIVE CHƯA CÓ** (T9 phiên sau restart CLI). Lượt chạy đầu cũng ở T9 (dogfood 4-cửa). Wire: `session-start` Phase 3.5(iii) @open · `session-end` §L.b(l) @close.
**Máy TRƯỚC mày (đọc, KHÔNG re-implement):** `python scripts/session_ctx.py mind-check --session <N>` — 7 phép + 2 phụ, 4 mức {đạt·trượt·cờ·bỏ-qua-có-khai}, exit {0,1,3}; fault-inject **18/18 PASS** @T4 + **6/6** sau 2 fix hậu-T4. Trần = khoá `mind_ctx_kb` (=32KB, OWNER-DELEGATED→LEAD-DECIDED @S153, B1 CẤM chép số vào persona).

View File

@ -1,5 +1,6 @@
# ctx-verifier Agent — Persistent Memory
- **S162 (2026-07-30) LƯỢT 3 @`/tiep` window-4 L8 — verdict `CO-CO — 8 cờ` `[LEAD SEED ON-BEHALF @closeout — nguồn: đĩa `_tiep-3.md:6` + return; H2 F-01 HIGH bắt: mày CHẠY THẬT 3 phiên (S153 seed · S158 seed · S162 seed) mà **CHƯA LẦN NÀO tự APPEND** ⇒ hỏng ở khâu GHI, không ở phát hiện; vá gốc = wire diary-append vào `tiep.md §3-ter`, đã lên HANDOFF NEXT-em #1]`:** 8 cờ K1-K8. **Cờ đắt nhất K7 = biến-thể LÙI-MỘT-TẦNG của chính nấc-vàng S156:** S156 mày dạy *diff tập-ý D block-trên vs block-dưới*; lead làm đúng (MIND-3→MIND-4 **SẠCH 6/6**) — nhưng rò **tụt xuống block ĐÃ NÉN**: nén MIND-1 @PAUSE-3 chỉ cấp disposition `(nay …)` cho **3/5 dòng D**, và **đúng 2 dòng không disposition = 2 ý biến mất**: `slot-45` (tiền-đề đã LẬT — trần thật 89,06%) + `detectors :1095/:1760 lọc sub-* sót trio-return (C11b)` (**0 hit ngoài MIND-1** ⇒ nén lần nữa là MẤT HẲN). ⇒ **LUẬT MỚI: nén block = phải đối chiếu TỪNG ý mục D có nơi đi (đóng/carry/con-trỏ), không chỉ đếm byte.** **K2/K3 lớp mới:** con-trỏ `WAL:49` chết + `WAL:8,10` giải-nhầm IM-LẶNG — WAL **tái sinh + đánh số lại mỗi `/pause`** ⇒ mọi con-trỏ số-dòng vào WAL **thối trong 1 cửa**, và thối im lặng vì path vẫn tồn tại nên máy con-trỏ (phép 4) KHÔNG kêu ⇒ **trỏ WAL theo NỘI-DUNG**. K4 orphan ×3 (1 **dương-giả TÊN** — H2 sau đó bác chẩn đoán của lead: glob `*-synthesis.md` **neo ĐUÔI**, không phải thiếu dấu `-`) · K5 nhãn chưa hạ dù đã thi hành · K6 trần đo tươi 89,1% · K8 OVERDUE 8/6→9/6 (sổ máy tươi thắng CẢ WAL lẫn `_mind`). Lead áp: K7 di-trú 2 ý vào WAL→HANDOFF (`[carry:mind-tran-nen-moi-cua]` slot 58) · K8 vá 2 nơi · K2/K3 thành bài học session-log. Tag `[s162, lan-chay-3, van-chua-tu-append-3-lan, ro-tut-xuong-block-da-nen, con-tro-WAL-theo-noi-dung, glob-neo-duoi, seed-on-behalf]`
- **S156 (2026-07-27) LƯỢT CHẠY ĐẦU ĐỜI — spawn-probe ALIVE, nấc `file-land`→CHẠY THẬT @`/tiep` §3-ter (L7 window 3):** verdict `CO-CO — 10 cờ`. Nấc-vàng học được: **4 khoản của mày ĐỀU ra cờ, nhưng cờ NẶNG nhất KHÔNG nằm ở khoản nào cả** — nó là **biến-thể NGƯỢC của khoản 3**: ý mục D **rơi IM-LẶNG** giữa 2 block (MIND-1→MIND-2 mất 3 ý, 0 khai) trong khi khoản 3 chỉ dạy soi "định-đoạt mà chưa đổi nhãn". ⇒ **LUÔN diff tập-ý D block-trên vs block-dưới**, đừng chỉ đọc block top (đúng vệt `absence_looks_like_clean`). Ca đắt nhất: ý "trần `mind_ctx_kb`=32KB" {treo-chờ-anh} rơi ĐÚNG lúc nó thành ràng-buộc thật — đo ra `_mind` **85,5% trần (28.010/32.768 B), dư 4.758 B < mọi block (5.767-7.536)** ⇒ MIND-3 sẽ vượt, luật buộc nén MIND-1.
**2 nghề rẻ mà ăn tiền:** (a) **đo byte từng block** (`python` split theo `## MIND-`) — 1 lệnh ra cờ trần + số để lead quyết nén · (b) **chạm ĐĨA để bác chú-thích lớp mềm**: §E ghi `sub-implementer-backend-1.md` "(file này không còn)" mà `ls` ra **3.499 B, commit `9c0ac68`, ruột toàn `⏳`** ⇒ nhãn đúng = `skeleton-ruột-rỗng` CÒN SỐNG. Máy `mind-check` chấm `dat` vì nó chỉ soi path TỒN TẠI — **máy đúng, chữ sai**; khoản 4 phải soi CHÚ-THÍCH chứ không chỉ đọc verdict.
**Bẫy bản-đồ 2 chiều (khoản 2):** `run.md` tail còn `[ ] Đ2-W1/W2/W3` dù WAL `[x]` đã deploy — **ledger run-folder tụt hậu so WAL**; và việc sinh SAU mốc block-top (commit `f4494cf`) thì `_mind`**có lý do chính đáng** — vẫn cờ, nhưng phải nói rõ "mù có lý do" kẻo lead đọc thành lỗi cẩu-thả.

View File

@ -45,7 +45,7 @@
- **Lucide alias-dodge:** icon từ export-aggregation-line (`SendHorizonal`) / mojibake token (`网络Placeholder` autocomplete) → dùng proven-safe export (`Send`), node-check icons trước build.
## Activity log
- **S162 (2026-07-30) Cây 4 folder GIAI ĐOẠN dưới từng gói thầu — 3 file MỚI + 3 trang, MIRROR đủ 2 app, build PASS ×2.** Owner (screenshot khoanh đỏ dải 4 GĐ → cây trái trang Duyệt NCC) + AskUser chốt: folder đặt DƯỚI TỪNG GÓI THẦU · áp cả trang GĐ khác. Nhãn VERBATIM "Duyệt NCC · Kế hoạch Hợp đồng · Duyệt Hợp đồng · Hợp đồng cứng" (GĐ2 CỐ Ý khác nhãn strip `PePipelineStrip` = lời-mới-nhất-thắng; KHÔNG sửa strip/menu). **3 file mới:** `components/pipeline/PipelineStageFolders.tsx` (thuần trình bày; `<details>` controlled `useState(n===currentStage)`; prop `content` cho GĐ1 giữ leaf phiếu cũ; `locked`/`failed`/`loading`/`hideEmpty`) · `hooks/usePipelineStages.ts` (2 query index key MỚI `pipeline-khkk-index`/`pipeline-contract-index` pageSize 200 — `PagedResult.cs:20` KẸP ≤200 không 400; `buildStages(peItems)` nối GĐ2 qua `khkk.purchaseEvaluationId`, GĐ3 qua `pe.contractId`, GĐ4 = HĐ đó có `hasSealedCopy`) · `components/pipeline/PipelineTreePanel.tsx` (panel cây trái cho trang GĐ2/GĐ4; `buildTree` RIÊNG, KHÔNG đụng memo `yearGroups` trang PE). **Wire:** PE list (`currentStage=1`, khối `<li>` phiếu giữ NGUYÊN TỪNG BYTE kể cả thụt lề ⇒ diff chỉ 2 mẩu bọc = bằng chứng không đụng behavior) · KhkkListPage (=2) · HardCopiesPage (=4), 2 trang sau bọc lưới `lg:grid-cols-[19rem_minmax(0,1fr)]` + `min-w-0` + `<table>` bọc `overflow-x-auto` + KPI `lg:grid-cols-6``xl:`. **Permission 2 tầng (S118/#82):** gate TRƯỚC fetch, `enabled:false` ⇒ 0 rác 403 **VỚI ĐIỀU KIỆN gate = ĐÚNG key policy của endpoint** *(reviewer F-1 @S162 bắt, lead sửa cùng lượt: GĐ2 `/contract-signing-plans` = `KeHoachKyKet.Read`, `MenuPermissionHandler.cs:40` so khớp CHÍNH XÁC 1 key — KHÔNG kế thừa/OR-con ⇒ OR key con sẽ fetch rồi ăn 403 khi role thiếu key root; gate đã đổi về `['KeHoachKyKet']`. GĐ3/4 `/contracts` `[Authorize]` trần nên OR key hiển-thị vô hại)*. ⚠️ menu-tree fallback quyền cha CHỈ khi menu con KHÔNG có row riêng (`GetMyMenuTreeQuery.cs:66`) — seeder TẠO row `Ct_*` (`DbInitializer.cs:2168-2176`) ⇒ `Ct_*` thực tế KHÔNG kế thừa `Contracts` *(câu "Ct_* kế thừa Contracts" bản đầu entry này SAI — reviewer F-8, đã sửa)*. **+5 fix hậu-review cùng lượt (lead áp):** F-1 gate-policy-key · F-3 leaf ngoài-index nhãn "(ngoài chỉ mục 200 — mở để xem)" tách nghĩa "(chưa cấp mã)" · F-4 index giữ `total` ⇒ cờ `truncated` khai cửa-sổ-200 ngay trên cây (footer folder + notice panel) · F-6 `hideEmpty` KHÔNG nuốt folder failed/loading · F-7 upload bản cứng invalidate thêm `pipeline-contract-index`. Giới hạn khai thẳng: F-2 phiếu liên-danh N-HĐ chỉ nối được HĐ[0] qua `pe.contractId` (chờ W5 link KHKK→HĐ) · F-5 lưới 19rem 2 trang chưa render thật (harness chỉ import 2 component) — nghiệm thu prod. Tag [s162, pipeline-stage-folders, 4-folder-gd, permission-policy-key-gate, index-query-key-moi, leaf-byte-verbatim, sha-pair-6-file, review-f1-f8].
- **S162 (2026-07-30) Cây 4 folder GIAI ĐOẠN dưới từng gói thầu — 3 file MỚI + 3 trang, MIRROR đủ 2 app, build PASS ×2.** Owner (screenshot khoanh đỏ dải 4 GĐ → cây trái trang Duyệt NCC) + AskUser chốt: folder đặt DƯỚI TỪNG GÓI THẦU · áp cả trang GĐ khác. Nhãn VERBATIM "Duyệt NCC · Kế hoạch Hợp đồng · Duyệt Hợp đồng · Hợp đồng cứng" (GĐ2 CỐ Ý khác nhãn strip `PePipelineStrip` = lời-mới-nhất-thắng; KHÔNG sửa strip/menu). **3 file mới:** `components/pipeline/PipelineStageFolders.tsx` (thuần trình bày; `<details>` controlled `useState(n===currentStage)`; prop `content` cho GĐ1 giữ leaf phiếu cũ; `locked`/`failed`/`loading`/`hideEmpty`) · `hooks/usePipelineStages.ts` (2 query index key MỚI `pipeline-khkk-index`/`pipeline-contract-index` pageSize 200 — `PagedResult.cs:20` KẸP ≤200 không 400; `buildStages(peItems)` nối GĐ2 qua `khkk.purchaseEvaluationId`, GĐ3 qua `pe.contractId`, GĐ4 = HĐ đó có `hasSealedCopy`) · `components/pipeline/PipelineTreePanel.tsx` (panel cây trái cho trang GĐ2/GĐ4; `buildTree` RIÊNG, KHÔNG đụng memo `yearGroups` trang PE). **Wire:** PE list (`currentStage=1`, khối `<li>` phiếu giữ NGUYÊN TỪNG BYTE kể cả thụt lề ⇒ diff chỉ 2 mẩu bọc = bằng chứng không đụng behavior) · KhkkListPage (=2) · HardCopiesPage (=4), 2 trang sau bọc lưới `lg:grid-cols-[19rem_minmax(0,1fr)]` + `min-w-0` + `<table>` bọc `overflow-x-auto` + KPI `lg:grid-cols-6``xl:`. **Permission 2 tầng (S118/#82):** gate TRƯỚC fetch, `enabled:false` ⇒ 0 rác 403 **VỚI ĐIỀU KIỆN gate = ĐÚNG key policy của endpoint** *(reviewer F-1 @S162 bắt, lead sửa cùng lượt: GĐ2 `/contract-signing-plans` = `KeHoachKyKet.Read`, `MenuPermissionHandler.cs:40` so khớp CHÍNH XÁC 1 key — KHÔNG kế thừa/OR-con ⇒ OR key con sẽ fetch rồi ăn 403 khi role thiếu key root; gate đã đổi về `['KeHoachKyKet']`. GĐ3/4 `/contracts` `[Authorize]` trần nên OR key hiển-thị vô hại)*. ⚠️ menu-tree fallback quyền cha CHỈ khi menu con KHÔNG có row riêng (`GetMyMenuTreeQuery.cs:66`) — seeder TẠO row `Ct_*` (`DbInitializer.cs:2168-2176`) ⇒ `Ct_*` thực tế KHÔNG kế thừa `Contracts` *(câu "Ct_* kế thừa Contracts" bản đầu entry này SAI — reviewer F-8, đã sửa)*. **+5 fix hậu-review cùng lượt (lead áp):** F-1 gate-policy-key · F-3 leaf ngoài-index nhãn "(ngoài chỉ mục 200 — mở để xem)" tách nghĩa "(chưa cấp mã)" · F-4 index giữ `total` ⇒ cờ `truncated` khai cửa-sổ-200 ngay trên cây (footer folder + notice panel) · F-6 `hideEmpty` KHÔNG nuốt folder failed/loading · F-7 upload bản cứng invalidate thêm `pipeline-contract-index`. Giới hạn khai thẳng: F-2 phiếu liên-danh N-HĐ chỉ nối được HĐ[0] qua `pe.contractId` (chờ W5 link KHKK→HĐ) · F-5 lưới 19rem 2 trang chưa render thật (harness chỉ import 2 component) — nghiệm thu prod. **Evidence:** `.claude/workflows/runs/2026-07-30-S162-cay-4-folder-gd/sub-frontend-designer-0.md` + `ship-synthesis.md` · SHIP `bfc7b79` · cicd PASS 5/5 Run #432. 🔸 *H2 F-03 @S162: `ship-synthesis` trích `VERDICT: SHIP-READY` như verbatim của tao nhưng sub-file **0 hit** chuỗi đó (kết bằng "TỰ ĐÁNH GIÁ CÒN HỞ", không END-line) — nội dung khớp đĩa nên KHÔNG phải bịa, nhưng từ nay **mọi `sub-*.md` PHẢI kết bằng `END <slug> — VERDICT=<…>`*. Tag [s162, pipeline-stage-folders, 4-folder-gd, permission-policy-key-gate, index-query-key-moi, leaf-byte-verbatim, sha-pair-6-file, review-f1-f8].
- **S159 (2026-07-29) ARC-2 "Tổng quan quy trình" ×2 lượt — `UserDashboardPage.tsx` fe-user (đợt-1 hero pipeline + đợt-4 redesign list toàn-trình).** *(Entry on-behalf bởi lead @S160 closeout M9 — VERIFY từ 2 sub-file + commit; cả 2 lượt vai ghi-đĩa-trong-lúc-làm nên #53 ×2 first-return mất 0 B.)* **Đợt-1** (`b5799fc`, `sub-frontend-designer-tongquan.md` 15.803 B): file 309 dòng → THÊM hero pipeline 4 GĐ trên cùng, GIỮ trọn 3 query (`my-dashboard`/`my-contracts-recent`/`my-pe-recent`) + 5 StatCard + 2 list (owner: *"đừng vứt"*); đổi PageHeader title "Tổng quan tất cả luồng duyệt". **Đợt-4** (`a2bbcb9`, `sub-frontend-designer-dot4.md` 13.956 B): file lúc đó 766 dòng — đọc đĩa KHÔNG dùng bản nhớ (đã qua 3 đợt sửa nhãn giữa 2 lượt); bỏ khối owner khoanh (5 StatCard + 2 list "gần đây") → **list chi tiết toàn-trình**; GIỮ hero (owner không khoanh — *đợt-5 vai khác mới bỏ hero theo lệnh anh*); nhãn 4 GĐ echo bản MỚI NHẤT từ comment đầu file (GĐ2 "Kế hoạch ký kết HĐ", KHÔNG lấy tên đợt-1 "Đề xuất ký kết hợp đồng" đã superseded); +2 query `['pipeline-pe-approved']` (phase=7 pageSize=1 lấy `.total`) + `['pe-inbox']` **dùng `select: d => d.length` để KHÔNG vỡ cache dùng chung InboxPage**; verify param BE bằng đọc controller thật. 🔴 **Môi trường spawn KHÔNG có dev-server/Playwright ⇒ FD2 visual-loop bất-khả — thay bằng `npm run build` PASS + tự-review tĩnh FD4, KHAI THẲNG không bịa screenshot** (khuôn NO-SCREENSHOT này tái dùng cho mọi spawn thiếu rig). Bài giữ lại: (i) giữa 2 lượt cùng file, dòng-đếm/nhãn đổi ⇒ **khảo sát lại từ đĩa mỗi lượt**; (ii) đổi consumer của endpoint dùng-chung → `select` transform thay đổi shape cache. Tag [s159, tong-quan-quy-trinh, hero-pipeline-4gd, dot4-list-toan-trinh, no-screenshot-khai-that, select-transform-cache-safe, doc-dia-moi-luot, on-behalf-m9].
- _(**S79 (2026-06-19) PE list fe-user — DECOUPLE chọn/mở-rộng: `?expand=1` cạnh `?id`, nút Maximize2 mỗi dòng, ALL logic verbatim, harness-FD2 6 shot.** verbatim → `archive/2026-06.md` §"S79 (2026-06-19)")_
- _(**S69 (2026-06-17) OfficeDashboardPage.tsx fe-user — E-Office landing PURO, COMPOSES 3 shared widgets, reuse hooks verbatim 0 new API, build PASS 0 TS.** verbatim → `archive/2026-06.md` substring:"S69 (2026-06-17) OfficeDashboardPage.tsx")_

View File

@ -1,5 +1,6 @@
# harness-audit — MEMORY (bộ-ba đồng-kiểm memory, nấc 3/3: con KIỂM)
- **S162 (07-30) nấc KIỂM (3/3) vòng trio — `43Đ / 4T / 4KC` `[LEAD SEED ON-BEHALF @closeout M9 — nguon: harness-audit-return.md]`:** PIN 4/4 tồn tại + non-empty; tuần-tự HELD (mtime 14:17→14:33→14:45→tao). **6 instrument re-chạy, 22/24 số byte-exact** ⇒ nấc ĐO **không bịa số nào**. 🔴 **TRƯỢT nặng nhất R10 — A2 của nấc ĐỀ-XUẤT MẤT TRIGGER:** refine X7 kết “`baseline-history.md` không làm sai kết luận KÊU” — **SAI**: `memory-budget.json:191` **tự khai** nó là *reference-file [skip sleep: da distilled-form]*, không phải shard `<period>`; bỏ nó ⇒ pending **15**, `-gt 15`**IM****A2 không có trigger**. Refine lẫn *dương-giả MỚI* với *dương-giả QUYẾT ĐỊNH* — ở ngưỡng 15/đếm 16 thì **một cái là đủ**. (Lead verify độc lập: note `:191` đúng nguyên văn; A2 **đã thi hành** trước khi có verdict này ⇒ khai thẳng: gist sinh ra trên **trigger dương-giả**, vô hại vì ADDITIVE + có giá trị đọc riêng, nhưng **KHÔNG được tính là “đóng nợ shard”**.) 3 TRƯỢT còn lại: **E3** eval “+876 B/1 ngày” — 876 đúng, **thời-lượng sai** (2,76 ngày; 24h gần nhất +0 B) · **E4** tổng L1 cite 303.937 vs re-dựng **303.883 (54 B)** — lead-write giải thích 100% file lệch nhưng **KHÔNG** giải thích 54 B ⇒ lỗi ở khối đóng-băng `run.md`, KHÔNG ở lượt eval; trục N/A không cap ⇒ decision-impact NIL · **R19** “0 hit ⇒ chưa duyệt” — thước 17,1K **CÓ ghi**`:192` dạng prose + “self-compact planned”; đúng lớp phải là **“0 key + 0 reader”**, chính lăng-kính refine dùng đúng cho `pull_warn_days`. **Falsify 15 phép: 7 HELD / 8 BROKE.** 🔴 **F14 BROKE = bài phương-pháp**: tooling **24.340 lúc mở → 19.055 @14:49** (lead thi hành A1/A2 GIỮA lượt) ⇒ đo trên cây LIVE thì **báo sai cho CẢ HAI con** ⇒ phải dựng cây đóng-băng bằng `git archive de0e69f` (chứng `git diff --stat de0e69f HEAD -- .claude/agent-memory` = RỖNG). **F6 HELD**: 8/8 bước tăng lịch sử diary tooling (min 574) đều vượt điểm gãy 420 B/mục ⇒ 876 là mẫu **bảo thủ** ⇒ A1 vẫn đứng. **F12 HELD**: tự phá giả-thuyết “verdict tổng của tao che TRƯỢT lẻ”. 3 điểm nghi lead giao: **(a) A1 ĐỨNG** khi bỏ phép ×3 (trigger là so sánh TĨNH 1.260 < 3.070, không neo tốc độ; + 8 mẫu độc lập chống lưng) · **(b) 167 B ĐÚNG byte-exact** (5/5 mốc git, min-step 161, 6 B đúng) va chạm liên-lane **đúng và NHẸ HƠN sự thật**: F-02 **2 record ⇒ 322 > 167 ⇒ vỡ CHẮC CHẮN**; đường lead chọn (đính-chính-câu) **KHÔNG vỡ**, verify từ đĩa `_INDEX` mtime 07-29 size bất biến **nhưng nợ chỉ HOÃN, E1 phải giữ trạng thái sống** · **(c) refine đúng KẾT LUẬN sai DO** (2 chân độc lập đủ bác: máy còn 4.323 B + lane thuộc H2); **tiền-đề câu hỏi của lead không đứng** H2 return **0 hit “DUE”**, nguồn self-compact DUE thật note S107 **cũ 20 ngày**. Tag `[s162, 43d-4t, a2-mat-trigger-r10, duong-gia-moi-vs-duong-gia-quyet-dinh, f14-cay-live-lech-giua-luot, git-archive-dung-cay-dong-bang, 167B-va-cham-lien-lane-nang-hon-khai, seed-on-behalf]`
- **S153 (07-26) trio vòng AUTO con KIỂM `[lead seed on-behalf @closeout M9; nguồn = harness-audit-return.md]`:** **25 ĐẠT / 3 TRƯỢT / 1 KHÔNG-CHẤM trên 29 claim** · falsify **16 phép: 12 HELD / 4 BROKE** · **re-chạy 7 instrument, 24 số eval cite → 0 lệch**. Lượt-1 GARBLE #53 (return-only, 0 đĩa) resume trả trọn.
**3 TRƯỢT (đều bắt bằng phép mạnh hơn lời khai):** T1 eval "PINLIVE 5/7" = SAI, thật **4/7 khớp / 3 lệch** (bảng của chính eval đã liệt 3 dòng lệch tự-mâu-thuẫn; meta-count blind-spot) · T2 refine A2 "6/19" = SAI, thật **5/19**, work-list THIẾU 1 file (`tooling-auditor/archive/2026-06.gist.md` chuỗi `coverage` nhưng **prose** `:26` "N/A có-chủ-đích (coverage-diff)" probe lỏng đọc mention thành block; chạy y-văn 13 file = bỏ sót IM-LẶNG; tử-số phủ thật 26,3% không 31,6%) · T3 **LẬT 2 BÁC B2/B3** của refine số đúng byte-exact nhưng nền suy-luận vỡ (gist harvest TỰ KHAI `+7427B NGOÀI scope` hụt 31,4%; gist cicd scope "20 run-records" vs **0** `Run #` trên src).
**Claim mạnh nhất xác-nhận (N2 refine):** C11(b) filter `sub-*.md` + regex `^sub-<role>[-.]` (`:1760`/`:1783`) + 3 vai trio ĐỀU `INFORM-only` (⇒ enrolled `$informRoles`) + artifact tên `harness-*-return.md` **KHÔNG BAO GIỜ khớp**; folder `sub-lead-*`/`sub-ring2-*` nên `$c11Measured=true` caveat "MEASURED NOTHING" **KHÔNG in** **đọc thành sạch**. Diary-seeding của chính bộ-ba = vùng KHÔNG được đo.

View File

@ -1,5 +1,6 @@
# harness-eval — MEMORY (bộ-ba đồng-kiểm memory, nấc 1/3: con ĐO)
- **S162 (07-30) nấc ĐO (1/3) vòng trio — `MIXED` `[LEAD SEED ON-BEHALF @closeout M9 — nguon: harness-eval-return.md lead scribe]`:** bảng **17 trục = 4 HEALTHY + 3 REGRESSION + 5 MIXED + 5 N/A** (tự-kiểm 4+3+5+5=17 ✓ — đúng lớp lỗi meta-count từng ngã S151/S153/S159). 3 REGRESSION: crystallized headroom **165.767 tok** (đơn-điệu giảm 3 mốc 181.228→172.247→165.767; hotload +19.439 B/1 ngày; thiếu 44.233 so target owner 210.000) · nhịp **light 9/6 OVERDUE** (từ đúng-vạch S159 thành quá 3 nhịp trong 3 tick) · baseline `measured` **17/23 row** (6 vai 3 ctx + 3 ring **chưa từng đo** ⇒ “delta 0” với chúng là vô nghĩa). 🔴 **2 ĐIỂM MÙ MỚI SINH kỳ này**: (i) **`l2_index` không có số nào in** — 1 ngày trước 95,14%/996 B, `cicd-monitor` CHẠY phiên này, mà probe chỉ in nhị phân `l2idx 0 over`**đọc y hệt “sạch”**; (ii) **MFE trắng** (lệnh không kèm `eval`) ⇒ mất 3 số coverage/retention. Baseline `measured` lệch thực-đo ở 5/5 vai có số, cực đoan `lead-gap` **+484%** (3.691 → 21.552). 🔴 Bắt được **datum LEAD tự-mâu-thuẫn** (brief viết “2 vai tự ghi memory” nhưng liệt 3 tên) ⇒ **từ chối dùng làm mẫu-số** — đúng phản xạ. Tag `[s162, mixed-17-truc, diem-mu-l2index-nhi-phan, mfe-trang, baseline-17-tren-23, tu-choi-datum-mau-thuan, seed-on-behalf]`
- **S153 (07-26) trio vòng AUTO — con ĐO `[lead seed on-behalf @closeout M9; nguồn = harness-eval-return.md 10.966B]`:** **MIXED — 14 signal**. Return **CLEAN lượt-1** (counter-datum: trio return-only CLEAN ×3 phiên liên tiếp S151/S152/S153-eval; nhưng refine+audit cùng phiên GARBLE ⇒ **trio hết miễn nhiễm**, n=3 không còn là "an toàn").
**Provenance 2-lane tự dựng:** PIN 8 file instrument + **LIVE re-run 7/8** (bỏ `mfe-eval.ps1` CỐ Ý vì nó GHI `.mfe-state.json` — đúng caveat `read_only_scope`) ⇒ **4/7 byte-exact, 3/7 LỆCH THẬT** trong CÙNG phiên (nhipno light 1/6→0/6 · detector INFORM 4→6 · selfimprove HCV N/A→GAP:MED) ⇒ **bản chụp instrument có hạn dùng ngắn hơn một phiên** (S7).
**Trục nặng:** S1 REGRESSION duy nhất — headroom **181.228 < target 210.000** (thiếu 28.772; hotload 596.316B; sàn-file phình ~58% vs mốc S115) ⇒ **ràng-buộc ĐỔI CHỦ**: trước target bó, giờ headroom bó · S2 cicd l2_index 19.322/20.480 = **94,3%** (headroom 1.158B, vai TĂNG-mỗi-run) · S4 lead-gap tái-phình **+1.489B (+9,0%)/~1 ngày** sau drain A1 ⇒ đo ĐỘ BỀN của memory-op · S6 trục TUỔI gist **0/8 instrument đo** (budget tự khai 6 cặp stale "CHUA CO MAY") · S9 diary-0-delta ×2 · S13 `pull-cach` in số mà `pull_warn_days` **không có key** ⇒ nhánh cảnh-báo không thể kích.

View File

@ -1,5 +1,6 @@
# harness-refine — MEMORY (bộ-ba đồng-kiểm memory, nấc 2/3: con ĐỀ-XUẤT)
- **S162 (07-30) nấc ĐỀ-XUẤT (2/3) vòng trio — `2 action / 12 BÁC / 3 ESCALATE / 5 NHƯỜNG` `[LEAD SEED ON-BEHALF @closeout M9 — nguon: harness-refine-return.md; **cả A1 và A2 lead ĐÃ THI HÀNH cùng closeout**]`:** **A1 archive `tooling-auditor`** (headroom 1.260 B < tripwire 3.070 + 3 mục xếp hàng; kết luận **không phụ thuộc mẫu đơn lẻ** chiết nửa vẫn vượt) lead thi hành: moved-not-cut 3 entry S126/S140/S143, L1 **24.340 → 19.055 B**, headroom **6.545 B**, A7 vẫn 413/413. **A2 distill `implementer-backend/archive/2026-07.md`** lead tạo `.gist.md`, probe nay **`pending=15 | nguong=15 => IM`**. 🔴 Giá trị lớn nhất KHÔNG phải 2 action **E1 — va chạm liên-lane duy nhất vị trí này thấy**: remediation F-02 của H2 (archive verbatim) sẽ **thêm record vào chính `_INDEX` đang còn 167 B** thi hành F-02 trước = **vỡ cap l2_index**; lead nhờ đó chọn đường **đính-chính-câu (0 record mới)**. **E2 tự đính chính con ĐO**: đà +876 B/**ngày**” sai thời-lượng tích trong 2,76 ngày, **24,2 h gần nhất = +0 B** A1 **không neo vận tốc**, chỉ neo headroom tĩnh. **Tự khai 2 lần lật lập trường của chính mình**: (i) đã BÁC drain tooling **3 lần** với do byte y hệt do nay hiệu thành A1; (ii) định BÁC trục-13 dương-giả nghi bộ lọc nuốt `baseline-history.md` **sai**, file từ 06-26, shard 16 vật thật. Còn chặn 1 lỗi ghép: nếu đích A1 không twin `.gist` thì A1 đẩy 1617 **tự phá A2**; đã kiểm, twin sẵn. BÁC X9 nâng cap = **rời tập đo (Goodhart)**; BÁC X1 `harvest-curator` self-compact thước `self_target_bytes` **0 hit** = chưa duyệt. Tag `[s162, 2-action-da-thi-hanh, e1-va-cham-lien-lane, tu-dinh-chinh-thoi-luong, lat-lap-truong-co-bang-chung, khong-nang-nguong-de-tat-den, seed-on-behalf]`
- **S153 (07-26) trio vòng AUTO con ĐỀ-XUẤT `[lead seed on-behalf @closeout M9; nguồn = harness-refine-return.md 9.792B]`:** **3 action (1 promote / 2 distill) + 7 BÁC + 4 NHƯỜNG**. Lượt-1 **GARBLE #53** (narration 1 câu) return-only nên **0 đĩa để vớt** SendMessage-resume trả trọn; audit CHỨNG resume không mất dữ liệu bằng nội-dung chỉ-có-khi-chạm-đĩa (2168/16565/101/78 · regex `SEV ` · `:1760`).
**3 action:** A1 nén header `_INDEX` cicd (2.168B prose 0-pointer ~600B + thay `Total 78 records` bằng con-trỏ A7-count; **khai thẳng đây là attempt-2 trên đối-tượng D1@S152**, tái-vượt CẤM attempt-3 escalate owner) · A2 append COVERAGE-TOKENS **13 gist** (audit T2 sửa thành **14** mình đếm 6/19 , thật 5/19; probe khớp-lỏng đọc prose `(coverage-diff)` thành block) · A3 promote luật **"proxy mtime/ngày CẤM neo action; phải mở file so NỘI-DUNG"** vào diary chính mình.
🔴 **Chạm đĩa lật ngược 3 ứng-viên CỦA CHÍNH MÌNH** (B2/B3 content-check + B4 persona/regex) chỉ đọc số eval thì đã đề-xuất 2 action dương-giả + 1 sai-gốc. **B4 truy GỐC đáng nhất:** 2/4 FLAG-khuôn THẬT đã class-tag, trượt regex CHỈ literal **`SEV `** (detector `:1752` đòi `— (LOW|MED|HIGH)` ngay sau em-dash); gốc = **2 nguồn khuôn đá nhau** (persona `:66` dạng-ống detector đòi heading; hint viết `SEV` KHÔNG đóng ngoặc như `<class>` nên vai chép nguyên chữ) diary = quyền-lực thứ-3, NHƯỜNG lane tooling.

View File

@ -1,5 +1,6 @@
# Harvest-Curator Agent — Persistent Memory
- **S162 (07-30) @close bookend L8 — `GATE-FAIL 4 finding` `[LEAD SEED ON-BEHALF @closeout M9 — nguon: runs/2026-07-30-S162-bookend-close/sub-harvest-curator-close-S162.md 13.833 B + return]`:** F-01 HIGH `ctx-verifier` chạy THẬT (`_tiep-3.md:6`) mà diary **0 hit S162**, entry cuối S158 — và **S153 + S158 đều là lead-seed** ⇒ vai chưa BAO GIỜ tự APPEND (hỏng khâu GHI, không phải phát hiện). F-02 HIGH `cicd-monitor/MEMORY.md:9` khai “verbatim→archive” cho #422/#425`git log -S` **rỗng toàn lịch sử**; 🔴 tự đính chính overclaim của chính mình: **không “mất hẳn”** — nguyên liệu còn ở `runs/…S159-tong-quan-pipeline-menu/cicd-verify-{b5799fc,a2bbcb9}.md` ⇒ mất **lớp chưng cất**, phục hồi được. F-03 MED `ship-synthesis` trích `SHIP-READY` mà sub-file **0 hit** ⇒ đề luật END-line. F-04 LOW 2/4 vai thiếu `Evidence:`. Orphan **3 xác nhận / universe 75 dir / 72 có run.md** — 🔴 **BÁC chẩn đoán lead** về folder S160: không phải “thiếu dấu gạch” mà **glob `*-synthesis.md` neo ở ĐUÔI**, file còn `-clone-s160` SAU chữ synthesis ⇒ sửa theo chẩn đoán cũ **không hết bệnh**. 🔴 Bài đắt nhất của chính tao: vòng-1 gắn cờ 13 ca CUT-NOT-MOVED, vòng-2 **tự bác 20/22 ca là artifact-đo** (thước thiếu 2 lớp: dòng MODIFIED tại chỗ + stub trỏ archive bị gộp) — chỉ 2 ca sống sót, và sống bằng chứng cứ MẠNH HƠN substring (`git log -S`). **Nghi ngờ thước của chính mình trước khi tố người khác.** Corruption baseline mới **24 hit/12 file** (Δ+8/+2 trọn vẹn ở 2 file S159 = **mention** trích bằng chứng, citation-trap đời-4). Placement `find -type d -empty` = **0** ⇒ cờ S159 “5→6 đang tăng” **ĐÓNG**. Chore tự khai: L1 21.277 B > self-target 17,1K ⇒ self-compact DUE (nợ từ S153) — 🔴 `harness-refine` BÁC hộ vì thước `self_target_bytes` **0 hit trên đĩa** (chưa duyệt) + thước MÁY còn 4.323 B. Tag `[s162, gate-fail-4, ctx-verifier-never-self-append, claim-manh-hon-viec, glob-neo-duoi, tu-bac-thuoc-cua-minh, seed-on-behalf]`
- **S153 (07-26) 2 LƯỢT bookend — vòng V1 harvest `[lead seed on-behalf @closeout M9; nguồn = 2 sub-file đĩa]`:** @open GATE-PASS-WITH-FLAGS 4f (0 orphan/57 · corruption 16/10 + đề **m#20** mẫu-số-có-mệnh-đề-loại-trừ · 0-byte = 10 `.gitkeep` · Fidelity byte-exact 67056 · FLAG-A/B S152 ĐÓNG · tự bắt `grep -P` chết rc=2 im-lặng ⇒ chuyển perl byte-mode). @close **GATE-PASS-WITH-FLAGS 8f**: 5-trục {Coverage PASS-with-debt · Completeness PASS · **Fidelity STRONG** · Placement PASS · Corruption PASS} · **0 orphan/59** (3 dir không-`run.md` KHÔNG orphan: 2 spec-only S117 + `S144-bootstrap``bootstrap-synthesis.md` — ca tự trượt @S151) · **Sàn-5 3/3 đăng-ký** (WAL `run=` 0 toàn sổ, session-log §6 gánh 4 dòng `wf:`) · **spawn-record 20 lượt** (brief ước ≈15) · **baseline S154 = 16/10** (tự SỬA bản "~23/11" của mình — ring1 @open HELD: file dùng ASCII `<FFFD>` KHÔNG đếm) · M9 3 vai ctx **ĐÃ seed, GAP-3 lần đầu đóng NGAY trong phiên sinh vai** (6 lần trước hồi-tố).
**4 method mới:** **m#20-bis** perl `END{}` chạy 1 lần/batch xargs ⇒ TỔNG đúng mà TÊN FILE bịa hoàn toàn (tự bắt khi đo) · **m#21** END-line có ≥2 khuôn (văn-xuôi vs HTML-comment ⇒ grep 1 khuôn ra dương-giả "no END") · **m#22** cùng-size PHẢI md5 mới phán copy-vs-re-chạy · **m#23** vắng ở `git status` = đã-commit HOẶC bị-ignore ⇒ cần `ls-files --error-unmatch` + `check-ignore` mới phân biệt.
**Nợ của chính mình:** L1 **17.655B > self-target 17.1KB** ⇒ self-compact DUE phiên sau (khối S150+S151).

View File

@ -0,0 +1,16 @@
# Gist 2026-07 — implementer-backend (L2 distilled, ADDITIVE)
> 🔴 **ADDITIVE — KHÔNG đè `2026-07.md`** (verbatim gốc 2.826 B còn nguyên cạnh file này). Sinh @S162 closeout theo `harness-refine` A2 (shard thứ 16 chưa có twin, đưa đếm 16→15 = mốc owner `min_pending_shards`, **không đụng ngưỡng**). 4-field load-bearing giữ nguyên: đối-tượng · việc · bằng-chứng · bài-học.
## S134 (07-17) — PE lũy kế TẠM TÍNH (BE) · `wf_58302bd5-b9f` return sạch
- **Việc:** `+ComputePendingAsync` + `PePendingAccumulation` (`PeBudgetAccumulator.cs` pure-add **+68/0**) · `PePendingPriorPeDto` · `PeBudgetSummaryDto` append-cuối 5 field (2 site: `:946` frozen-defaults · `:985` live-fill) · D4 audit-note trong `ApplyBudgetSnapshotOnFinalizeAsync` với `Action=Update` **KHÔNG Transition** (#49 — tránh UI đọc 2 lần chuyển-phase), insertion-only **+30/0**, signature GIỮ ⇒ 5 call-site 0-diff.
- **Bằng chứng:** build slnx 0/0 · 0 mig · `ComputeAsync` body 0-diff.
- **Bài học (3):** ① **insertion-only diff** (`grep '^-'` = 0 real-removal) = bằng-chứng MẠNH NHẤT cho "thân method/call-site bất động" — mạnh hơn đọc-mắt, chống báo-số-sai kiểu #53 · ② derived-audit thêm vào helper **không cần đổi signature** nếu tính nội bộ từ field entity sẵn có ⇒ giữ call-site 0-diff · ③ accumulator namespace ≠ DTO namespace (`…Dtos`) ⇒ cần `using` tường minh dù **cùng project**.
## S133 (07-17) — PE budget-freeze (BE, Mig 67) · `wf_4bef08b8-730` **#53 return-fail → disk-truth + em-main-solo**
- **Việc:** lane sửa xong 6 file + `PeBudgetAccumulator.cs` mới (Domain 11 props `ApprovedBudget*` · Config precision/maxlength · DTO append `BudgetFrozen=false` **cuối** positional-record · display-gate frozen/live 2-nhánh trong `GetPurchaseEvaluationQuery` · helper `ApplyBudgetSnapshotOnFinalizeAsync` gọi **4 site** `:862/:901/:934/:1109` · 2 terminal-guard block-CẢ-Admin) **rồi CHẾT trước bước sinh migration** ⇒ em-main solo: Mig 67 sạch **11 AddColumn** (0 RenameColumn — #63) + backfill `Sql()` OUTER APPLY ×3 khớp accumulator **từng điều kiện** + apply 2 DB + filter test **44/44** (T0 RED→GREEN, không sửa test).
- **Bắt được nhờ apply thật:** Dev lòi **drift Mig 66 committed-chưa-apply-local** ⇒ catch-up luôn.
- **Bài học (3):** ① `TransitionAsync` **KHÔNG** SaveChanges nội bộ (`:537`) ⇒ snapshot flush qua SaveChanges của **caller** (mirror pattern ApprovedPrice) · ② khuôn backfill THẬT ở Mig 61/65 = **plain `Sql()`**, KHÔNG C# provider-guard (SQLite `EnsureCreated` không replay = guard kiến-trúc) · ③ Suppliers/Quotes là `BaseEntity` **không soft-delete** ⇒ SQL backfill **không** thêm `IsDeleted` trên `s`/`q`; `WorkItemId` null ⇒ 4 lũy kế NULL mirror helper nhưng `SnapshotAt` **vẫn set**.
- **Class #53:** WRITE-lane garble ≠ mất code — recover bằng disk-truth (git + build + test), entry ghi on-behalf.
Tag `[s162-distill, implementer-backend, 2026-07, insertion-only-proof, mig67-budget-freeze, 53-writelane-disk-recover]`

View File

@ -1,5 +1,6 @@
# Lead-Omission-Auditor Agent — Persistent Memory
- **S162 (07-30) @close bookend L8 — `4 FLAG` `[LEAD SEED ON-BEHALF @closeout M9 — nguon: sub-lead-gap-close-S162.md 18.638 B + return]`:** **FLAG-1 `gap-carry-dropped` HIGH (streak 8)** — nghi-thức re-stamp carry bị bỏ **lần 2 NGAY SAU khi bị FLAG HIGH @S159**: segment HANDOFF `1d3d167`**0 slug carry**, mà cùng segment đó lead VẪN viết `NEXT em` 1.037 B ⇒ **không phải “bỏ cả khối vì gấp”** mà bỏ chọn lọc. Detector H24-2 in **y hệt số S159** trong khi đĩa còn 219 occurrence/43 slug. **FLAG-2 `gap-decision-sunk` HIGH** — BLOCKER “3 người duyệt PRO/CCM/CEO” **0 hit trên CẢ 4 bề mặt owner** (3 hit “người duyệt” ở STATUS là **dương-giả**, mô tả tính năng PE), sống DUY NHẤT ở `.claude/WAL.md` = **đúng file §6.4 sắp reset**; bất-đối-xứng: món *không chặn* (51-bis) CÓ slot số, món **chặn cả W5→E2E** thì không — im 3 cửa-sổ/2 ngày. **FLAG-3 `gap-owner-specifics` MED** — chữ **CẢ** (“áp CẢ các trang GĐ khác”) + việc lead tự thu hẹp 3/4 trang không lên bề mặt nào; đo cứng `grep -c "Duyệt NCC" .claude/WAL.md` = **0** trong khi chính dòng đó tự khai “nhãn VERBATIM anh” ⇒ **sổ quảng cáo có verbatim mà không chứa verbatim**. **FLAG-4 `gap-underfill` MED**`tiep_reload` hẹn 40-60K tok, đo TRẦN đúng 5 nguồn đã khoanh = 71.492 B ⇒ **[20.4K..23.8K] ≈ ½ sàn**; đọc rộng nhất vẫn [35.3K..41.2K] ⇒ **tuân 100% danh sách VẪN dưới hạn**, và `/tiep` có 0 bước %-print nên **không máy nào thấy**. Honest-zero 2 mục + **trục-6 BÁC** (lead CÓ surface việc thiếu bookend-open ở `run.md:3`). JUMP khai đơn-vị trước (bài D-4): 1 class vượt = `gap-carry-dropped` **8** = **nghi-thức hỏng**, không phải sự cố lẻ. Tag `[s162, 4-flag, carry-streak-8, blocker-song-trong-file-sap-reset, so-quang-cao-verbatim-ma-khong-chua, underfill-muc-tieu-vs-nguon, seed-on-behalf]`
- **S153 (07-26) 2 LƯỢT hình-B — vòng V2 `[lead seed on-behalf @closeout M9; nguồn = sub-file đĩa]`:** @open **3 FLAG** — FLAG-1 `gap-carry-dropped` MED-HIGH (**2 khối NEXT-em cùng đánh số ①②③ song song** HANDOFF:8 @S152 vs :13 kỳ-S151; khối MỚI không nuốt mục MỞ ④⑤⑦ của khối CŨ; mục ⑦ owner-#32 "dựng máy per-item-L1-presence" = 0 hit 5 bề mặt) · FLAG-2 `gap-decision-sunk` MED-HIGH (`trio-synthesis.md:13` ra lệnh "H7 → ghi HANDOFF"; H7 = 0 hit, `convention-only` = 0 hit — **đòn bất-đối-xứng**: H6 cùng dòng cùng mệnh-lệnh ĐÃ landed 1 hit ⇒ loại được bào chữa "cả khối bị bỏ", anh chưa từng được hỏi) · FLAG-3 `gap-underfill` MED **fire lần đầu** (target 210K owner-set @S115 có nghĩa-vụ "em-main manual pour from source_order" nhưng `grep source_order|pour` trên 3 command = 0 ⇒ **không tồn tại bước rót**; khai cận-dưới trung thực: 0-hit là cận-dưới vì rót không để lại artifact).
**honest-zero có giá:** `gap-owner-specifics` = 0 — (30)(31)(32) codified 3/3 giữ trọn specifics; bảng owner-gated O-1…O-7 = **0 khoản câm****tự BÁC 2 FLAG cũ của mình** (FLAG-1@S148 + FLAG-3@S150). Tự BÁC thêm FLAG-2 HIGH @S150 (`_frozen_until_owner` vắng là ĐÚNG — owner đóng (30) frozen=False).
**@close datum riêng:** đo lúc closeout đang mở ⇒ sổ bền TRẮNG là **vô-nghĩa để FLAG**; khuôn đúng = *"cái gì sống DUY-NHẤT ở nơi sắp bị xoá (WAL §6.4 reset) mà không bước nghi-thức nào gánh"* — mirror khuôn "danh-sách sẽ-bốc-hơi" @S150.

View File

@ -1,5 +1,6 @@
# Lead-View-Auditor Agent — Persistent Memory
- **S162 (07-30) @close bookend L8 — `16 FLAG (SÀN, chưa phải TỔNG)` `[LEAD SEED ON-BEHALF @closeout M9 — nguon: sub-lead-stale-close-S162.md 22.035 B + return]`:** class view-stale-count 8 · view-stale-header 3 · view-residual-asym 2 · view-stale-status 2 · view-stale-role-desc 1. Nặng nhất **FLAG-1 `view-residual-asym`**: commit `a8027c0` vừa tạo Mig 69 + 7 bảng **vừa MỞ bảng canonical STATUS**, chỉ vá 2/5 row (policy 220, menu 55) và **bỏ đúng 3 row chính nó làm sai** ⇒ không phải “closeout chưa chạy” mà là **sửa một phía**. **FLAG-7/8 = 2 slot đang CHỜ OWNER trình bằng THƯỚC CŨ**: (51-bis) ghi 97,45%/522 B trong khi tươi **99,18%/167 B** · slot (45) vẫn “RÚT — báo động giả” (đo trên `_mind-s-7` đóng băng) trong khi file SỐNG **89,06%**. **FLAG-11** `agents/README.md:242` tự xưng “ĐỦ roster” liệt **20 tên**/thật **23** — grep-theo-số IM vì file cố ý không chép số ⇒ **phải ĐẾM PHẦN TỬ**; sống 9 nhãn phiên, tái phạm nguyên văn bài S143 cách chính dòng bài học 214 dòng. **FLAG-15** `_context-s-8` PAUSE-3 ghi menu “135→142” trong khi cicd đo **142→142, 0 row thêm** — file nằm trong `tiep_reload.sources`**sai số TÁI SINH mỗi `/tiep`**. 🔴 Câu chốt: **khoảng cách không nằm giữa lead và sự thật, mà giữa NƠI LEAD LÀM VIỆC (WAL/`_mind` — số đúng đủ cả) và NƠI ANH ĐỌC (STATUS/HANDOFF)**. + **9 mục VERIFIED-CLEAN có lệnh bác** (roster 23 · gotcha 84 · menu/policy vừa vá @S161 · ship-synthesis khớp 8/8 sau khi lead vá F-1/3/4/6/7). Coverage khai thẳng PARTIAL/CHƯA-CHẠM (HANDOFF 383/417 dòng · 20/23 persona · run-folder cây 4-folder ~47 KB) ⇒ **cấm đọc phần chưa soi thành sạch**. Tag `[s162, 16-flag-san-khong-phai-tong, sua-mot-phia, slot-owner-thuoc-cu, dem-phan-tu-khong-grep-so, sai-so-tai-sinh-moi-tiep, seed-on-behalf]`
- **S153 (07-26) 2 LƯỢT hình-B (open + close) — vòng V2 `[lead seed on-behalf @closeout M9; nguồn = sub-file đĩa + ring2 verdict]`:** @open **5 FLAG** — FLAG-1 `view-residual-asym` MED (STATUS:454 khai 3 derived-cite `:3/:37/:113`, đo lại **3/3 sai dòng**, đúng là `:5/:48/:315`) · FLAG-2 `view-stale-header` LOW (:439 "mốc gần nhất S151" trong khi :457 re-stamp @S152; `git show c2d01f0` 3 hunk, 0 chạm :439) · FLAG-3 `view-stale-count` LOW (HANDOFF carry-age 12/9/7 vs máy 13/10/8 — lệch **+1 đều 3**, nguồn = chính đoạn carry vừa append ⇒ **self-referential count**) · **FLAG-4 `view-stale-status` HIGH** (STATUS:454 còn khai trio "consent-gated + CHƯA spawn-probe" trong khi owner (32) đã AUTO **và** chính `:466` cùng file nói ngược — bác được không cần ra ngoài file) · FLAG-5 `view-stale-status` MED (H24 nhịp-`{6/15/3}` vs hình-B vô-điều-kiện; đối-chứng hành-vi: lượt này chạy @counter 27 với light 1/6 chưa tới hạn).
**ring2 chấm 8/8 ĐẠT** + **thách-CLEAN bắt M-1 MISS THẬT của mình**: persona `lead-stale-auditor.md:51-54` còn dạy "KHÔNG chạy mỗi phiên / thuần cadence" — hình-B đã vô-điều-kiện từ S149, và `398d343` chính đợt land hình-B mở file sửa mà để nguyên câu sai. 🔴 **Bài:** mình bắt ĐÚNG class đó ở STATUS (FLAG-5) nhưng **sót chính persona mình** ⇒ điểm mù **tự-quy-chiếu**; `.claude/agents/` NẰM TRONG tập-đo (đã dùng `agents/README`), chỉ 2 file persona bị bỏ ⇒ lần sau grep tập-đo PHẢI gồm persona của chính mình.
Tag `[s153, 5-flag-open, flag4-high-tu-mau-thuan-cung-file, self-referential-count, m1-diem-mu-tu-quy-chieu]`

View File

@ -1,27 +1,26 @@
# Reviewer Agent — Persistent Memory
- **S161-W2 (07-29) KHKK CRUD review — PWF 12 FLAG 3C/5M/4m `[chết #53 sau Trục-4 (13.9KB ghi-từng-trục sống trọn) → lead đo Trục 5-7 + verdict on-behalf; 11 FIXED cùng lượt + 1 GIỮ]`:** 🔴 **Trục-1 hợp-đồng FE↔BE VỠ 6 điểm khi 2 lane viết SONG SONG từ cùng spec** — tsc+build+574-test đều XANH cả 6: route picker lệch tên (F-1, 404 đội lốt empty-state vì TanStack nuốt lỗi + `?? []`) · body `purchaseEvaluationId` vs `PeId` (F-2 — **D1 của BE lập luận "FE đọc cùng spec sẽ khớp" = GIẢ ĐỊNH, không phải phép đo; FE đã KHÔNG làm thế**) · dossier body thiếu planId (F-3) · FE chỉ gọi POST khi BE ép Id=null ⇒ Sửa-đẻ-bản-sao im lặng (F-4) · `peTenGoiThau` (F-5) · `winnerSupplierNames` BE không có (F-6 — **bị F-1 CHE: mảng rỗng nên .map chưa chạy, vá F-1 xong mới lòi** = 2-lỗi-che-nhau). **Luật rút: đối chiếu hợp-đồng = so ROUTE+FIELD từng cái giữa types-FE và record-BE trên ĐĨA, đừng tin lời khai lane nào.** · F-8/F-9 security: **list bịt mà detail/download 0-rào ⇒ rào list chỉ còn là UX** — đối chứng twin PE :877-899 CÓ guard + S89 nháp-riêng-tư ⇒ thụt chuẩn, không phải "khuôn vốn thế" · F-12 INNER-join Projects (global-filter) = picker silent-vanish — lớp "vắng-mặt trông giống ổn". Trục-4 picker-khớp-rào ĐẠT (3/3 rào PE mirror đủ). Tag `[s161-w2, hop-dong-2-lane-song-song-6-diem-dut, loi-khai-la-gia-dinh, 2-loi-che-nhau, list-bit-detail-mo-rao-thanh-ux, inner-join-global-filter-vanish]`
- **S162 (07-30) cây 4-folder GĐ (FE-only 2 app) — PASS-WITH-FLAGS 8 flag/0 blocker:** 🔴 class **`im-lặng-về-độ-chính-xác-của-con-số`** — 3 ca cùng lớp 1 diff, tsc+build ×2 xanh: hook VỨT `total` khi `pageSize:200` ⇒ không biết mình bị cắt, badge tụt không dấu vết · `pe.ContractId = contracts[0].Id` ⇒ phiếu liên-danh N HĐ chỉ nối 1 mà badge in như thật (**tái phát cardinality S87/S88 — field làm KHOÁ-NỐI phải đi đọc WRITE-SITE của nó**) · fallback `?? '(chưa cấp mã)'` trộn 2 nguyên nhân ⇒ **khẳng định SAI**, không phải degrade. · **#82 ngược chiều:** FE gate OR nhiều menu-key nhưng `MenuPermissionHandler.cs:40` khớp CHÍNH XÁC 1 key ⇒ OR làm gate LỎNG HƠN policy, tự chuốc 403; **gate query = ĐÚNG key policy của endpoint**. 2 endpoint cùng diff kết luận NGƯỢC nhau (`/contracts` `[Authorize]` trn ⇒ KHÔNG 403) ⇒ đo TỪNG cái. · **Nhãn ✓ không có phép đo:** rubric 'responsive ✓' mà harness grep 'grid-cols-[19rem'=0 hit ⇒ 2 trang lưới chưa từng render; **đọc `^import` của harness = cách rẻ nhất biết ảnh CHỨNG được gì**. Tag `[s162, im-lang-do-chinh-xac, total-bi-vut, contracts0-cardinality, or-key-long-hon-policy, nhan-tick-khong-phep-do]` **Evidence:** `.claude/workflows/runs/2026-07-30-S162-cay-4-folder-gd/sub-reviewer-1.md` · lead áp 5/8 flag (F-1/3/4/6/7) + F-8 sửa memory designer TRƯỚC ship `bfc7b79`; F-2 (liên-danh N-HĐ) + F-5 (layout 19rem chưa render thật) = giới-hạn khai thẳng lên HANDOFF slot (56).
- **[→ archive/2026-07.md @S161-curate] S159 đợt-5 (07-29) menu 6-leaf HĐ + `/contracts/deleted` (PWF 0H/4M/6L):** chú-thích-mang-SỐ phải chạy phép đếm (comment "2 chỗ IgnoreQueryFilters" — thật 3 file/17 site) · cookie-cutter phải soi CẢ phần bản gốc đã CHẶN (thiếu `disabled={deletedView}` ⇒ panel trắng) · kiểm hide-filter TRƯỚC khi kêu thiếu mirror 2-app · `tsc` + `noUnusedLocals` mạnh hơn grep cho claim "đã cắt".
- **[→ archive/2026-07.md @S162-curate] S161-W2 (07-29) KHKK CRUD — 2 lane viết SONG SONG:** hợp-đồng FE↔BE VỠ 6 điểm mà tsc+build+574-test đều XANH (route lệch tên · field lệch · 2 lỗi CHE NHAU); lời-khai-lane = GIẢ ĐỊNH ⇒ so ROUTE+FIELD trên ĐĨA; list-bịt-detail-mở ⇒ rào chỉ còn UX; INNER-join global-filter = picker vanish.
- **S161 (07-29) W1 KHKK tiền-commit (Mig 69 + seeder + Designer type-10) — PWF 10 FLAG 1H/3M/4m/2L:** 🔴 **HIGH lại nằm ở `git` chứ không ở mã (S155 tái diễn):** 2/3 file Mig 69 UNTRACKED `??` mà snapshot đã tracked-M ⇒ `commit -a` nạp model 7 bảng nhưng BỎ migration; build+566 test vẫn xanh ⇒ **gate = `git status --porcelain -- src tests | grep '^??'` phải RỖNG ngay trước commit**. · **MAJOR bắt được nhờ đi NGƯỢC lời-khai FE:** comment FE tự khai "nhãn lấy từ BE `applicableTypeLabel`" ⇒ đi kiểm bờ BE: `AwLabels.Type` chỉ 3 entry, `GetValueOrDefault(type, type.ToString())` ⇒ UI hiện **"ContractSigningPlan"** tiếng Anh và `useState(\`Quy trình ${label}\`)` **GHI chuỗi Anh vào cột Name DB** — lớp *hợp-đồng-đứt-2-bờ*, tsc+build+test đều xanh. **Luật rút: câu comment dạng "bên kia lo" = ĐI ĐỌC BÊN KIA.** · seeder 5/5 PASS (call sau revoke `:2109`>`:2096`; revoker chỉ `Hrm|Off|Personal` ⇒ không lật 2-chiều; `TryGetValue` tuple `(RoleId,MenuKey)` — khuôn 1-role sẽ ném dup-key, unique-index `PermissionConfiguration:26` cứu) nhưng **acceptance "đo CỜ" chưa đo được ở đâu**: Dev DB **0 row** `Khkk*` cả MenuItems lẫn Permissions (menus 100 vs prod 142) ⇒ chưa nhánh nào từng chạy. · **`grep`-cùng-lớp bằng TOKEN-SONG-SINH** (`VehicleBookingLevelOpinions` repo-wide) mạnh hơn grep tên-mới: chứng 3/3 site đủ + 0 site thứ 4. · 2 chú thích cùng file nay SAI SỐ ("7 bảng"/"7 khối" → 8) + comment nguồn `MenuKeys.cs:37` "CỐ Ý NGOÀI All" nay sai + anchor `(:614)` trỏ dòng TRƯỚC-commit (đúng = :645) ⇒ **diff sửa mã phải sửa MỌI số/neo trong chú thích cùng file**. · STATUS.md `Menu keys 54`/`Policies 216` không đổi dù |All|=55 ⇒ derived-drift. Tag `[s161, high-o-git-khong-o-ma, hop-dong-dut-2-bo-nhan-BE, token-song-sinh-sweep, seeder-upgrade-if-exists, comment-mang-so-va-neo]`
- **[→ archive/2026-07.md @S159-curate] S155-đợt2 (07-27) PE delete-approver DIFF-review #2 (12 FLAG 2H/4M/6L · ĐỪNG-DEPLOY):** class **`hợp-đồng-đứt-giữa-2-bờ`** (FE type khai cờ, BE DTO không có ⇒ nút chết mà tsc+build+561-test đều xanh) · policy-gate đo DB 11/13 vai `CanDelete=0` · mã ĐỔI giữa lượt soi ⇒ re-đo đĩa TRƯỚC verdict · đổi-chiều-assert ≠ nới-assert.
- **[→ archive/2026-07.md @S155-curate] S155 ×2 (07-27) PE delete-approver — DIFF-review đợt 1 tiền-deploy (14 FLAG 4H/6M/3L/1I, DEPLOY-CÓ-RỦI-RO) + SPEC-review (PWF 4H/8M/5L):** 🔴 class MỚI **`HIGH nằm ở git chứ không ở mã`** — 2/3 file migration UNTRACKED mà snapshot ĐÃ tracked ⇒ `commit -a` nạp model-có-cột nhưng bỏ migration ⇒ `Invalid column name` cả 7 module, build+test vẫn xanh ⇒ **gate deploy phải chấm `git status ^??` cho `Migrations/`** · `ExecuteDelete` ngoài transaction TRƯỚC `SaveChanges` = mất dữ liệu không hoàn tác · purge xoá CỨNG chữ ký phiếu XOÁ MỀM ⇒ **test đang KHOÁ chiều ngược, vá xong test đỏ ≠ hồi quy, CẤM nới assert** · ~600 dòng BE = mã chết (`grep api.put`=0) · **xanh-giả bắt bằng phép 2-thế-giới** (còn-gate ⟂ bỏ-gate cùng cho 0 ⇒ 0 thông tin) · CLEAN chứng bằng **liệt kê vét cạn** write-site + sweep gián-tiếp (#81-EXT) · 2 lỗi TỰ BẮT: trích line-number **từ diff** (diff không mang số dòng file) · `grep -v Snapshot` ăn nhầm tên migration · **file bị sửa TRONG LÚC soi ⇒ neo bằng NỘI DUNG DÒNG + ghi bản-đồ-trôi**.
- **[→ archive/2026-07.md @S155-curate] S146·S147·S152-D2 (digest):** S146 lead sửa 1 phép quét 4 lần/phiên vì mã-hoá ý-định NGỮ-NGHĨA vào regex ⇒ nấc đúng = lưới-soát-cho-người + allowlist CÓ TÊN + use⟂mention · S147 **decouple 1 gate ⇒ truy xem prop dùng chung đã mang carve-out chưa** (`itemsReadOnly` ≠ raw `readOnly`); "same fix" cho surface anh-em có thể trúng gate KHÁC · S152-D2 census thay spot 307/307; **3 THƯỚC-HỎNG** (md5 disk vs `git show` = FAIL giả do CRLF⟂LF · `grep -c` dính citation-trap · `grep -iF` MSYS trả 0-hit IM LẶNG trên UTF-8) + máy-trích mù đuôi `{.yml,.json,.sql}`.
- **[→ archive/2026-07.md @S145-curate] S145 4-lane (Axis-A/D/E + S145b GATE) — digest:** bất-biến chia-đôi giữa 2 axis nằm ĐÚNG SEAM ⇒ chỉ cross-cut sweep bắt (hook 3→4 path orphan; `session_ctx_kb` ghost-wire #H18) · 'vai-có-sổ' acceptance ⇒ MUST `ls agent-memory/<role>/` (folder≠sổ, ring1-audit RỖNG) · stale-fix phải verify caller-TRÊN-ĐĨA — grep-"4 surface"=0-hit là ANTI-TEETH Goodhart; 2-script-same-suffix = conflation-vector · đếm VALID_ROLES = per-file grep bidirectional KHÔNG regex (comment lừa parser).
- **[→ archive/2026-07.md @S145b-curate] S145a·S143 (digest, archived):** S145a NUMERIC "roster 17" hardcode trốn name-enum sweep ⇒ sweep repo-wide CẢ numeric LẪN name-enum (superseded S145b PASS) · S143 CLASS `bằng-chứng-tự-huỷ-sau-squash` (cite outward = commit SỐNG-sau-squash) + số neo-mốc + errata CẤM sửa file đã-stamp + #53 ghi-đĩa-trong-lúc-làm.
- **[→ archive/2026-07.md @S140/@S134] S139·S134b·S133 (digest, archived):** S139 re-measure MỌI acceptance từ git HEAD + no-self-exempt (chấm cả file CHÍNH VAI MÌNH); "measured" sống CHỈ KHI falsify-path CHẠY ∧ đứng · S134b insertion-only + `grep '^-'`=0 chắc hơn diff-mắt · S133 "mọi nhánh set X" phải grep CẢ assignment-qua-BIẾN (#81).
- **[→ archive/2026-07.md @S161-curate] S159 đợt-5 (07-29) menu 6-leaf HĐ:** chú-thích-mang-SỐ phải chạy phép đếm · cookie-cutter phải soi CẢ phần bản gốc đã CHẶN · `tsc`+`noUnusedLocals` mạnh hơn grep cho claim 'đã cắt'.
- **[→ archive/2026-07.md @S162-curate] S161 W1 (07-29) KHKK tiền-commit (Mig 69):** HIGH nằm ở `git` chứ không ở mã — 2/3 file mig UNTRACKED mà snapshot tracked ⇒ gate `git status --porcelain -- src tests | grep '^??'` phải RỖNG ngay trước commit; comment 'bên kia lo' = ĐI ĐỌC BÊN KIA (nhãn BE thiếu ⇒ ghi chuỗi Anh vào cột DB); grep bằng TOKEN-SONG-SINH; diff sửa mã phải sửa MỌI số/neo trong chú thích.
- **[→ archive/2026-07.md @S159-curate] S155-đợt2 (07-27) PE delete-approver DIFF #2:** class `hợp-đồng-đứt-giữa-2-bờ` (FE type khai cờ, BE DTO không có ⇒ nút chết mà build+561-test xanh) · policy-gate đo DB 11/13 vai · re-đo đĩa TRƯỚC verdict · đổi-chiều-assert ≠ nới-assert.
- **[→ archive/2026-07.md @S155-curate] S155 ×2 · S155-đợt2 · S146 · S147 · S152-D2 (digest):** `hợp-đồng-đứt-2-bờ` (FE khai cờ, BE DTO không có ⇒ nút chết mà build+test xanh) · HIGH-ở-git (mig untracked) · `ExecuteDelete` ngoài transaction = mất dữ liệu · test đang KHOÁ chiều ngược, CẤM nới assert · xanh-giả bắt bằng phép 2-thế-giới · mã ĐỔI giữa lượt soi ⇒ re-đo đĩa TRƯỚC verdict · decouple 1 gate ⇒ truy prop dùng chung · 3 THƯỚC-HỎNG (md5 CRLF · `grep -c` citation-trap · `grep -iF` MSYS 0-hit im lặng).
- **[→ archive/2026-07.md @S145-curate · @S145b-curate · @S140] S145 4-lane · S145a · S143 · S139·S134b·S133 (digest):** bất-biến chia-đôi giữa 2 axis chỉ cross-cut sweep bắt · 'vai-có-sổ' phải `ls` thật · sweep CẢ numeric LẪN name-enum · `bằng-chứng-tự-huỷ-sau-squash` · re-measure acceptance từ git HEAD + no-self-exempt · insertion-only `grep '^-'`=0 · 'mọi nhánh set X' phải grep assignment-qua-BIẾN (#81).
> **Persistent diary cross-session.** Auto-injected first ~200 lines at spawn (L1 HOT).
> Update BEFORE every stop. Tiered Memory v1: L1 HOT cap ~17KB (hook 24.4KB read-limit) · L2 `archive/` on-demand · L3 RAG `search_memory` just-in-time. Keep entry ≤ 1.5K chars (gotcha #53).
> Full verbatim history pre-S40 → git `d2f52ba` + `archive/2026-05-q1..q2.md`; S51→S76 detail → `archive/2026-06.md` (S69/S70/S71/**S80** curate). Archive map: `archive/_INDEX.md` + per-period `.gist.md`.
- **[→ archive/2026-07.md @S161-curate] S160 (07-29) CHỐT-CUỐI verify 13-fix landed (12 landed + 1 half-fix):** fix áp NỬA spec = dư-lượng (soi CẢ FILE khi nhận "đã fix") · anchor-list là artifact RIÊNG phải sync khi thân đổi · dải anchor phải grep CẢ 2 symbol · verify NGƯỢC premise clone 3/3 đứng · owner để-mở ⇒ finding MOOT-đúng.
- **[→ archive/2026-07.md @S161-curate] S160 (07-29) CHỐT-CUỐI 13-fix:** fix áp NỬA spec = dư-lượng (soi CẢ FILE khi nhận 'đã fix') · anchor-list là artifact RIÊNG phải sync · verify NGƯỢC premise · owner để-mở ⇒ finding MOOT-đúng.
## 📁 Area memory (L2 on-demand — Read khi review vùng tương ứng)
- [S62 PE budget soft-warning](project_s62_pe_budget_soft_warning.md) — PASS: hard-block→soft-warning; submit-guard intact + validator giữ `BudgetPeriodAmount>0`, row8 negative-safe (additive-only). Validator class `PurchaseEvaluationFeatures.cs:317`.
- [Wire/mirror claim verification anchors](feedback_wire_claim_verification_anchors.md) — sha256 twin-file · `git diff -U0` isolate true-adds · `allowNegative` bleed check · guard-still-intact grep.
- **[→ archive/2026-07.md @S161-curate] S160 (07-29) review SPEC-BỘ dry-run KHKK (6 lane, 5/5 SUA-TRUOC-THI-CONG):** review SPEC ≠ review CODE lỗ ở acceptance + default-lấn-quyền, không chỉ anchor · seeder-grant kiểu insert = NO-OP 403 im lặng ⇒ acceptance phải đo CỜ không đếm ROW · owner-authority surface AskUser thay tự quyết · acceptance "PASS SẴN" = 0-bit · FK-547 compiler-không-chặn · choke-point "DUY NHẤT" sai vì gán QUA BIẾN (#81).
- **[→ archive/2026-07.md @S161-curate] S160 (07-29) review SPEC-BỘ dry-run KHKK:** review SPEC ≠ review CODE (lỗ ở acceptance + default-lấn-quyền) · seeder-grant kiểu insert = NO-OP 403 im lặng ⇒ acceptance phải đo CỜ không đếm ROW · acceptance 'PASS SẴN' = 0-bit · choke-point 'DUY NHẤT' sai vì gán QUA BIẾN (#81).
- **S89 trio** ([sectionB](project_s89_pe_sectionb_review.md) · [endsBeforeCeo](project_s89_pe_endsbeforeceo_plan_review.md) · [finalize-note](project_s89_finalize_note_plan_review.md)) — adjustMut share race + authz-lens ≠ concurrency-lens · FE 4 render-sites plan-missed-2 · ground-truth-accurate-nhưng-gaps.
- **S101 H18/H19 WF2 + LANE-C — PWC/PASS:** content-hash ≠ commit-SHA (hex strip/no-strip) · exact-token sweep misses paraphrase → widen concept-phrase. → `archive/2026-07.md`.
- [S103 H20+crystallized-backfill review](project_s103_h20_crystallized_backfill_review.md) — WF2 PASS; 6/6 hash recompute MATCH + 4 already-met verified. Lesson: multi-axis warning phải nằm trong OUTPUT của script (reader chạy inline), không chỉ doc.
@ -83,21 +82,20 @@ Adversarial pre-commit reviewer SOLUTION_ERP. Read-only verify + live curl prod
## 📅 Recent activity (compressed — full verbatim → `archive/2026-06.md` + `archive/2026-07.md` via `archive/_INDEX.md`)
- **[→ archive/2026-07.md @S126/@S134] S123·S124·S125·S129·S131·S131b digest (all archived):** S131b follow-up phải GIỮ con-số source · S131 số-atomic-đúng vẫn fencepost → hero-ratio re-derive từ raw ([topic](project_s131_h24_h22_3gap_outward_gate.md)) · S129 writer-only = NỬA-VÁ + quick-test tự-chạy = chứng rẻ nhất · S124/125 do-token trap re-Read full + sibling-test 2-CHIỀU (MATCH⇒file-bệnh·FAIL⇒verifier-bệnh) · S123 🔴 #53 ghi diary TRƯỚC return + vá-1-lớp grep MỌI matcher cùng-lớp ([topic](project_s123_governance_4change_review.md)).
- **Digest S93→S117 (verbatim → `archive/2026-07.md`; 1 mệnh-đề/entry):** S93 code-gate re-derived denom · S97 default-flip byte-mirror SHA ×2 · S98 Windows byte-verify = .NET (MSYS strip
báo sai) · S100 HELD stale run-id NOT-stamped · S101 persist-claim cần reader-side · S108 outward-claim "đã sửa X" phải cat X trước gate · S109 gist meta-count ≠ disk · S110 claim-về-code grep lại kể cả reword · S111 nâng-nấc-quên-sync cùng-diff · S115 verify EACH regex-alt by-hand · S116 persist-claim = tracked + 0-drift · S117 2-tier guard compare SUM-EXPRESSION.
- **[→ archive/2026-07.md @S126/@S134] S123·S124·S125·S129·S131·S131b (digest):** follow-up phải GIỮ con-số source · số-atomic-đúng vẫn fencepost re-derive từ raw · writer-only = NỬA-VÁ · do-token trap re-Read full + sibling-test 2-CHIỀU · 🔴 ghi diary TRƯỚC return + vá-1-lớp phải grep MỌI matcher cùng-lớp ([topic](project_s123_governance_4change_review.md)).
- **Digest S93→S117 (verbatim → `archive/2026-07.md`):** code-gate re-derived denom · default-flip byte-mirror SHA ×2 · Windows byte-verify = .NET · HELD stale run-id · persist-claim cần reader-side + tracked + 0-drift · outward-claim 'đã sửa X' phải cat X trước gate · gist meta-count ≠ đĩa · claim-về-code grep lại kể cả reword · nâng-nấc-quên-sync cùng-diff · verify EACH regex-alt by-hand · 2-tier guard compare SUM-EXPRESSION.
- **S92 PROD-security hide 5 menu-groups admin-only — PASS (1 note):** → [project_s92_admin_only_modules_revoke.md](project_s92_admin_only_modules_revoke.md).
- **June-2026 digest — LESSON-ONLY (verbatim → `archive/2026-06.md` + `_INDEX`):** merge-distill fabricates false-specificity ⇒ QUALITY gate AFTER presence · sha = self-declared NOT recompute · fail-closed guard BEFORE terminal-state + server-recompute · TRACKED = check-ignore ≠ ls-files · menu-hide ≠ API-lock · single→multi stops at display-layer.
- **June-2026 digest — LESSON-ONLY:** merge-distill fabricates false-specificity ⇒ QUALITY gate AFTER presence · sha = self-declared NOT recompute · fail-closed guard BEFORE terminal-state · TRACKED = check-ignore ≠ ls-files · menu-hide ≠ API-lock · single→multi stops at display-layer.
- **[→ archive/2026-07.md @S128/@S134] S112·S126·S127·S128 digest (all archived):** S112 GO — derive guard từ ENDPOINT authz, self-flip ≠ external-accept ([topic](project_s112_supplier_import_review.md)) · S126 gate — AGGREGATE cumulative KHÔNG vào outward artifact, "ba việc"=2 ASK · S128 — direction-of-error quyết mức lỗi outward + brute-force sha-variant TRƯỚC phán tamper + Get-FileHash ≠ body-sha · S127 — hedge broadcast bằng MỞ config THẬT.
- **[→ archive/2026-07.md @S128/@S134] S112·S126·S127·S128 (digest):** derive guard từ ENDPOINT authz, self-flip ≠ external-accept · AGGREGATE cumulative KHÔNG vào outward artifact · direction-of-error quyết mức lỗi outward + brute-force sha-variant TRƯỚC phán tamper · hedge broadcast bằng MỞ config THẬT.
---
## 🔄 Curate trigger
- Hook-cap **>17.1KB** (24.4KB read-limit — đổi từ ~30KB cũ, S109) → archive recent → L2 `archive/<period>.md` (append additive) + `_INDEX.md` substring pointer. Stale >3mo → remove.
- **S145-curate (self lane-4, 2026-07-22, hook 22.6KB→~17.7KB):** concurrent 5-lane /fable-clone session (mỗi lane +~1.6KB fresh entry). Moved 4 fresh verbatim (S145 Axis-D-self·Axis-E·C7-lane·S145b) → `archive/2026-07.md` @S145-curate marker + verify `grep=4` moved-not-cut → collapsed L1 to pointers. S145a/S143 đã digested (linter). Residual ~17.7KB (>17.1 soft) defer — không cut-without-move mid-return (S140 precedent).
- **Prev curates (digest):** S140 (S139·S134b→@S140) · S134 (8 verbatim→@S134, seal 6/6+2) · S128 em-main (md5 e5218d2f) · **S102 recovery: cut-not-moved ×5 @`f229b07` — Lesson: L1-shrink kèm "→archive" = BẮT BUỘC grep moved-not-cut trước khi trust** · S116·S113·S109·S80·S71·S70·S40.
- **S162-curate (self, 2026-07-30, 23.9KB→<17.1KB):** move VERBATIM 2 entry S161-W2 + S161-W1 `archive/2026-07.md` @S162-curate (probe moved-not-cut 2/2 TRƯỚC khi xoá khỏi L1, bài S102) + nén 10 dòng digest đã-archive-sẵn. KHÔNG cut-without-move.
- **Prev curates (digest):** S145 (4 verbatim @S145-curate, residual 17.7KB defer) · S140 · S134 (8 verbatim, seal 6/6+2) · S128 · **S102 recovery: cut-not-moved ×5 @`f229b07` L1-shrink kèm '→archive' BẮT BUỘC grep moved-not-cut trước khi trust** · S116·S113·S109·S80·S71·S70·S40.
## S152 (2026-07-25) — R1 retention-note ranh NEVER [M9 on-behalf lead]
- **NEVER Edit/Write vào code-tree, NEVER commit, NEVER push** vai = verdict-only (PASS/FAIL + issue file:line), sửa việc em-main/implementer. KHAI THẬT 2 nấc: (a) ranh commit/push/code-tree **chưa từng vỡ**; (b) Write/Edit runtime cấp ĐÃ dùng hợp lệ cho sub-file run-folder + diary-self-write (AS-10 VERIFY-KEEP, nhân-chứng S143) tức "NEVER" áp cho ĐÍCH (code/commit/push), không phải cho tool-tồn-tại; containment thật = git-diff lead. Tag `[s152, r1-retention, never-edit-write-commit-push-target-scoped]`

View File

@ -179,3 +179,10 @@
- **S160 (07-29) reviewer CHỐT-CUỐI /fable-real (verify 13-fix landed) — #53 chết sau Trục-1+Trục-2, đĩa cứu:** khuôn review-của-review: chấm "fix ĐÃ LAND + ĐÚNG codebase, không đẻ lỗi mới" — **12/13 landed-đúng + ~30 anchor re-verify THẬT @HEAD, 1 half-fix**. Bài: (1) **fix áp NỬA spec = dư-lượng thật** — W7 §② sửa badge-nguồn nhưng bảng §① cùng file sót ⇒ soi CẢ FILE khi nhận "đã fix", không chỉ chỗ được trỏ (lớp vá-1-nửa-cùng-lớp S122); (2) **anchor-label ⟂ thân** — gate-5-anchor W3 vẫn liệt `PEWS:1008` sau khi thân phán khuôn đó SAI ⇒ anchor-list là artifact riêng phải sync khi thân đổi; (3) **anchor off-by-N** — "2 checkbox :1267-1268" trúng 1 (SkipToFinal ở :1256) ⇒ dải anchor phải grep CẢ 2 symbol; (4) **verify NGƯỢC premise clone**: re-đo `ContractWorkflowService.cs:191-198` admin-override-gán-qua-biến + `ContractChangelogConfiguration:22-25` FK-Cascade + `ContractAttachmentFeatures:56-152` 0-IDOR — 3/3 premise HIGH clone ĐỨNG ⇒ clone-review có răng thật; (5) **O-A moot-check**: owner để-mở ⇒ F-C3/F-C5/F-S2-grant MOOT-đúng (không siết thì không grant), KHÔNG phải lead né. #53 lần 2/phiên trên reviewer — return "Trục-2: xác vị file…" (mẩu giữa việc) nhưng sub-file 8KB có Trục-1+Trục-2 đủ ⇒ **lead finalize VERDICT+LỖI-MỚI+LEFTOVER on-behalf từ đĩa** (0 mất kết-luận vì ghi-đĩa-trong-lúc-làm). Tag `[s160, chot-cuoi-verify-fix-landed, half-fix-soi-ca-file, anchor-label-vs-than, verify-nguoc-premise-clone, o-a-moot-check, 53-doc-cuu]`
- **S160 (07-29) review SPEC-BỘ dry-run KHKK→HĐ-cứng [engine `/fable-clone` 6 lane opus + `/fable-real` chốt fable; `runs/2026-07-29-S160-khkk-dryrun-plan/review-synthesis-clone-s160.md`]:** 6 lane (anchor-A rỗng #StructuredOutput-fail nhưng ghi-đĩa-lượt-1-2 cứu · B/C/wave-logic/owner-consist/security). **5/5 verdict SUA-TRUOC-THI-CONG, hội tụ cao** ⇒ lead-verify 5 claim load-bearing 5/5 CONFIRMED đĩa. Bài đắt: (1) **review SPEC ≠ review CODE — bắt lỗ ở acceptance + default-lấn-quyền + hố-chưa-khai, KHÔNG chỉ anchor** (anchor 24-28/28 đúng dòng nhưng spec vẫn hỏng cấu-trúc); (2) **seeder-grant no-op = 403 giết-feature IM LẶNG** — row Permission đã tồn tại CanRead-only ⇒ grant kiểu insert rơi skip-existing `continue` (`DbInitializer.cs:2242-2245`), phải UPGRADE-if-exists (`SeedProcurementMasterAccessAsync:2367-2374`); **acceptance đếm ROW = 0-bit, phải đo CỜ CanCreate/CanUpdate**; (3) **owner-authority finding** — lane owner-consistency bắt lead đặt default lấn đúng chỗ owner phán "để yên" (O-3 "hợp đồng cứ từ từ" + STATUS:13 tái-khẳng-định) ⇒ surface AskUser thay vì tự quyết → anh chọn O-A gỡ hẳn wave; (4) **"204 KHÔNG 409" PASS SẴN** = acceptance 0-bit nửa-vế vì nhánh trình không đọc workflow (`ContractWorkflowService.cs:70-89`) — vế răng = `currentApprovalLevelOrder=1` phải chạy tới lượt DUYỆT; (5) **FK-547 compiler-không-chặn**: gọi `LogWorkflowTransitionAsync(Guid contractId)` với plan.Id = enum/Guid cast được nên build xanh, nổ runtime — dùng bảng changelog RIÊNG của module mới; (6) **choke-point "DUY NHẤT" sai** — admin-override gán Phase QUA BIẾN (`:190-193`) nên literal-grep miss (lớp #81), phải kê 2 write-path. **anchor-B census tên-test: repo 0/460 tên thuần-Việt ⇒ khuôn = English-predicate** (owner chốt đổi). Ensemble ĐÓNG GÓI C2 ăn: 6 lane ≤3-file + khung-rỗng-lượt-1-2 ⇒ 0 lane chết dù 1M+ token. Tag `[s160, review-spec-bo, seeder-grant-no-op-403, acceptance-dem-row-0bit, owner-authority-surface, 204-khong-409-pass-san, fk-547-compiler-mien, choke-point-2-write-path, test-name-census-repo]`
## @S162-curate (2026-07-30) — moved verbatim từ L1 (hook 23.9KB > sàn 17.1KB)
- **S161-W2 (07-29) KHKK CRUD review — PWF 12 FLAG 3C/5M/4m `[chết #53 sau Trục-4 (13.9KB ghi-từng-trục sống trọn) → lead đo Trục 5-7 + verdict on-behalf; 11 FIXED cùng lượt + 1 GIỮ]`:** 🔴 **Trục-1 hợp-đồng FE↔BE VỠ 6 điểm khi 2 lane viết SONG SONG từ cùng spec** — tsc+build+574-test đều XANH cả 6: route picker lệch tên (F-1, 404 đội lốt empty-state vì TanStack nuốt lỗi + `?? []`) · body `purchaseEvaluationId` vs `PeId` (F-2 — **D1 của BE lập luận "FE đọc cùng spec sẽ khớp" = GIẢ ĐỊNH, không phải phép đo; FE đã KHÔNG làm thế**) · dossier body thiếu planId (F-3) · FE chỉ gọi POST khi BE ép Id=null ⇒ Sửa-đẻ-bản-sao im lặng (F-4) · `peTenGoiThau` (F-5) · `winnerSupplierNames` BE không có (F-6 — **bị F-1 CHE: mảng rỗng nên .map chưa chạy, vá F-1 xong mới lòi** = 2-lỗi-che-nhau). **Luật rút: đối chiếu hợp-đồng = so ROUTE+FIELD từng cái giữa types-FE và record-BE trên ĐĨA, đừng tin lời khai lane nào.** · F-8/F-9 security: **list bịt mà detail/download 0-rào ⇒ rào list chỉ còn là UX** — đối chứng twin PE :877-899 CÓ guard + S89 nháp-riêng-tư ⇒ thụt chuẩn, không phải "khuôn vốn thế" · F-12 INNER-join Projects (global-filter) = picker silent-vanish — lớp "vắng-mặt trông giống ổn". Trục-4 picker-khớp-rào ĐẠT (3/3 rào PE mirror đủ). Tag `[s161-w2, hop-dong-2-lane-song-song-6-diem-dut, loi-khai-la-gia-dinh, 2-loi-che-nhau, list-bit-detail-mo-rao-thanh-ux, inner-join-global-filter-vanish]`
- **S161 (07-29) W1 KHKK tiền-commit (Mig 69 + seeder + Designer type-10) — PWF 10 FLAG 1H/3M/4m/2L:** 🔴 **HIGH lại nằm ở `git` chứ không ở mã (S155 tái diễn):** 2/3 file Mig 69 UNTRACKED `??` mà snapshot đã tracked-M ⇒ `commit -a` nạp model 7 bảng nhưng BỎ migration; build+566 test vẫn xanh ⇒ **gate = `git status --porcelain -- src tests | grep '^??'` phải RỖNG ngay trước commit**. · **MAJOR bắt được nhờ đi NGƯỢC lời-khai FE:** comment FE tự khai "nhãn lấy từ BE `applicableTypeLabel`" ⇒ đi kiểm bờ BE: `AwLabels.Type` chỉ 3 entry, `GetValueOrDefault(type, type.ToString())` ⇒ UI hiện **"ContractSigningPlan"** tiếng Anh và `useState(\`Quy trình ${label}\`)` **GHI chuỗi Anh vào cột Name DB** — lớp *hợp-đồng-đứt-2-bờ*, tsc+build+test đều xanh. **Luật rút: câu comment dạng "bên kia lo" = ĐI ĐỌC BÊN KIA.** · seeder 5/5 PASS (call sau revoke `:2109`>`:2096`; revoker chỉ `Hrm|Off|Personal` ⇒ không lật 2-chiều; `TryGetValue` tuple `(RoleId,MenuKey)` — khuôn 1-role sẽ ném dup-key, unique-index `PermissionConfiguration:26` cứu) nhưng **acceptance "đo CỜ" chưa đo được ở đâu**: Dev DB **0 row** `Khkk*` cả MenuItems lẫn Permissions (menus 100 vs prod 142) ⇒ chưa nhánh nào từng chạy. · **`grep`-cùng-lớp bằng TOKEN-SONG-SINH** (`VehicleBookingLevelOpinions` repo-wide) mạnh hơn grep tên-mới: chứng 3/3 site đủ + 0 site thứ 4. · 2 chú thích cùng file nay SAI SỐ ("7 bảng"/"7 khối" → 8) + comment nguồn `MenuKeys.cs:37` "CỐ Ý NGOÀI All" nay sai + anchor `(:614)` trỏ dòng TRƯỚC-commit (đúng = :645) ⇒ **diff sửa mã phải sửa MỌI số/neo trong chú thích cùng file**. · STATUS.md `Menu keys 54`/`Policies 216` không đổi dù |All|=55 ⇒ derived-drift. Tag `[s161, high-o-git-khong-o-ma, hop-dong-dut-2-bo-nhan-BE, token-song-sinh-sweep, seeder-upgrade-if-exists, comment-mang-so-va-neo]`

View File

@ -1,5 +1,6 @@
# MEMORY — ring1-audit (KIỂM vòng-1: tooling/harvest)
- **S162 (07-30) KIỂM vòng tooling/harvest @close`26Đ/2T trên 36 claim` `[LEAD SEED ON-BEHALF @closeout M9 — nguon: sub-ring1-audit-close-S162.md 17.231 B + return]`:** H1 15Đ/2T/3KC · H2 11Đ/0T/5KC. 🔴 **THÁCH-CLEAN A THỦNG — skill `contract-workflow`**: H1 gọi “4 skill còn lại PASS” nhưng skill này **0 hit** `SigningPlan|Khkk|Kế hoạch ký kết|PipelineStage` trong 24.949 B, trong khi S161 đẻ nguyên máy mới **nằm đúng lãnh-địa nó** (`ContractSigningPlanPhase.cs` 5 phase, WF V2 type-10, codegen `KHKK/{YYYY}/{Seq:D3}`) và frontmatter nhận đúng từ khoá routing ⇒ người tra bị dẫn vào rồi **đọc nhầm luật RG-001/9-phase**. Không phải nới chuẩn: **H1 dùng 2 THƯỚC trong 1 báo cáo** (nợ-tích-luỹ cho `ef-core-migration`, “đợt này” cho `contract-workflow`) ⇒ TRƯỢT A16 + A17 dẫn xuất (TOTAL under-count 10→11). ✅ **THÁCH-CLEAN B CHỊU**`reviewer` harvested THẬT (numstat +16/18, mở ruột dòng cộng có nội dung thật, không phải đếm-tên); `ctx-verifier` numstat **rỗng hoàn toàn****F-01 của H2 mạnh hơn chính bản H2 nộp**. 🔴 **F-A BROKE VÀO CHÍNH TAO**: định tố H1 bịa số Mig “69” (tao đếm 68) — lỗi của tao, `grep -v Snapshot` **nuốt mất** `…AddPeApprovedBudgetSnapshot.cs`; đếm lại 2 engine = **69**, H1 HELD. Tái phát y hệt lỗi `grep -c || echo 0` của tao @S153. **F-B HELD mạnh**: nghi F-02 vô giá trị vì `git log -S` trên path archive “luôn rỗng” → chạy **control-dương** H2 không chạy (`git log -S 1a47a61` = **1 commit**) ⇒ lệnh CÓ RĂNG ⇒ 0-hit là vắng-mặt THẬT. Số tự tái-dựng: roster **23 × 6 nguồn độc lập** · universe **75/72/3 so TẬP không so SỐ** · VALID_ROLES 23 bằng engine khác. Tag `[s162, 26d-2t, thach-clean-thung-contract-workflow, 2-thuoc-1-bao-cao, control-duong-chung-lenh-co-rang, tu-bat-loi-cua-minh, seed-on-behalf]`
- **S153 (07-26) KIỂM vòng V1 (tooling+harvest) `[lead seed on-behalf @closeout M9; nguồn = sub-ring1-S153.md 22.992B]`:** **28 ĐẠT / 4 TRƯỢT-rìa / 1 KHÔNG-CHẤM trên 33 claim** · falsify 7 phép (4 HELD / 3 BROKE — **1 BROKE vào CHÍNH MÌNH**: `grep -c X f || echo 0` in "0" **và** exit 1 ⇒ đếm nhầm 20/20, suýt tố oan H2 bằng số rác của mình) · tái-dựng 11 số khớp / 1 lệch (đổi nguồn `git ls-files` · đổi engine python↔perl · đổi parse json↔grep · **so TẬP thay so SỐ**).
**4 TRƯỢT đều lỗi RÌA, 0 lỗi ở số load-bearing:** H1-15 MED (F-6 **under-count** — dump 18 key thấy `code-review@`+`feature-dev@` cũng `true` dưới cùng heading ⇒ phá claim mà flag NẶNG hơn) · **H2-11 MED BROKE** (baseline S154 "16 + hit của file NÀY" — file H2 có **0 raw U+FFFD**, dùng ASCII `<FFFD>` ×7 ⇒ kỳ sau đọc 16/10 thành SỤT rồi truy **file phantom**; đúng bẫy m#20 mà H2 vừa đặt) · H1-14 LOW (neo `SKILL.md:122` → chuỗi thật ở `:121`; mtime chứng lệch-thật không time-drift) · H2-10 LOW (phân-hoạch 11+5=16 ≠ 20 role-dir; minh-oan: 11 ĐÚNG dưới vị-từ mtime H2 tự khai ⇒ kết-luận không đổi).
**Thách-CLEAN 3 mặt — 2 chịu, 1 THỦNG:** ef-core "fresh" THẬT (bảng liên-tục 12..67, 0 lỗ) · Placement 0-stray chịu **3/3 lens** ⇒ số 0 CÓ RĂNG · corruption 16/10 chịu (python≠perl trùng khít) **nhưng THỦNG ở mệnh-đề DỰ-BÁO****ô 🟢 vẫn thủng được ở lời-hứa tương-lai**.

View File

@ -1,5 +1,6 @@
# ring2-audit Agent — Persistent Memory
- **S162 (07-30) KIỂM vòng soi-lead @close`19Đ/1T trên 20 FLAG` `[LEAD SEED ON-BEHALF @closeout M9 — nguon: sub-ring2-audit-close-S162.md 22.744 B, END-line 189/191, mtime 15:01:59 > 14:35 = chứng C4b tuần-tự]`:** lead-stale 15Đ/1T · lead-gap 4Đ/0T. 🔴 **Điểm TRƯỢT duy nhất = FLAG-16 ÉP-VỪA ENUM** (quan-sát ĐÚNG, class SAI): `git show a8027c0~1` cho `b.ToTable(` = **88**, HEAD = **95**, `CreateTable` = **7** ⇒ “88→95” **đúng và ĐANG đúng** trong đơn-vị EF-snapshot; định-nghĩa `view-stale-count` đòi “số cũ sau khi source đã đổi” mà source **không đổi** ⇒ vị-ngữ không thoả. Không class nào trong 11 phủ “số đúng, đơn-vị không-canonical” ⇒ **đúng luật phải escalate mở rộng enum, KHÔNG ép vừa**. Hệ-quả máy: thổi `view-stale-count` **8 thay vì 7**, chảy vào `class_repeat`/`jump_on_class_repeat=3`, và mâu-thuẫn chính dòng kết “0 finding rơi ngoài enum”. Công bằng: con-đo tự viết “Delta +7 đúng cả hai” + tự hạ LOW ⇒ **không thổi số về NỘI-DUNG, chỉ sai chỗ nhét**. 🔴 **TIME-DRIFT suýt tạo 2 cáo-buộc oan, cứu bằng `git show HEAD:`** — cây làm việc BẨN (lead vá STATUS 14:38 / HANDOFF 14:40, SAU khi cặp đo 14:33/14:35); chứng cơ-học: lead-stale trích `:649/:660/:667/:674`, cây tươi đã trôi `+7 dòng` thành `:656/…`, bản HEAD khớp cả 4 verbatim ⇒ **vá-sau KHÔNG phải flag-oan**. Falsify 6 (3H/3B) — **2 BROKE nhắm vào nghi-vấn của CHÍNH TAO**: nghi lead-gap bịa `jump_on_class_repeat=3` (key thật ở `memory-budget.json:165`) · nghi nó khai sai `"3 trạm"=0` (đo lại ở HEAD ra 0/0/0/0 tuyệt đối). Thách-CLEAN đảo chiều (rủi ro = **thổi số**, không phải im): bia-1 BẮT ĐƯỢC (F16) · bia-2 **KHÔNG bác được** (F14 — đọc NỘI DUNG dưới tiêu-đề thấy Q1-Q6 + lỗ hổng an ninh + UAT còn mở ⇒ khối đang gánh việc HIỆN TẠI mà mang nhãn phiên đã đóng) · bia-3 VERIFIED-CLEAN #7 có thật (đóng lại **M-1 của chính tao @S153**, 0 tái phát). Enum 0/20 tự chế. 2 INFORM cho lead: G2 chưa đạt thước của chính nó (`"PRO/CCM/CEO"` vẫn 0 hit trong HANDOFF lúc đo — **lead đã vá ngay: bỏ dấu cách quanh dấu gạch**) · errata offset `memory-budget.json:59` → key thật `:58`. Tag `[s162, 19-1, ep-vua-enum-f16, time-drift-cuu-bang-HEAD, thach-clean-dao-chieu-thoi-so, 2-broke-vao-nghi-van-cua-minh, seed-on-behalf]`
- **S153 (07-26) KIỂM vòng V2 (soi-lead H24) `[lead seed on-behalf @closeout M9; nguồn = sub-ring2-S153.md]`:** **8/8 FLAG ĐẠT / 0 TRƯỢT / 0 KHÔNG-CHẤM + 10 phép phụ** · falsify 6 (5 HELD, **1 BROKE là nghi-vấn của chính mình**: nghi `h24_cadence` là pointer treo → probe đường khác thấy key có thật top-level `:146-151` = 6/15/3 ⇒ con-đo **kiềm chế ĐÚNG**, ghi VERIFIED-CLEAN thay báo-động-giả).
**Tái-dựng MẠNH hơn endpoint:** kéo bản TRƯỚC bằng `git show HEAD:.session-counter.json` rồi so **delta từng key** — 7/7 class fired = **+1 chính xác**, 4/4 non-fired = **0**, 11 key cả 2 phía, mọi value `int` (bất-biến `2f39a7e` còn sống), `light_at_counter` 26→27, `signal_session` S152→S153. Ngữ-nghĩa đúng: `view-stale-status` fire 2 FLAG nhưng counter chỉ +1 (đếm **vòng-đo**, không đếm flag).
🔴 **THÁCH-CLEAN bắt M-1 MISS THẬT (giá trị nhất lượt):** `lead-stale-auditor.md:51-54` tiêu-đề "## Nhịp — mày KHÔNG chạy mỗi phiên" + mô-tả bắn thuần cadence, trong khi `session-end.md:114/116` = hình-B VÔ-ĐIỀU-KIỆN + `light_every` hạ stats-only; cặp đã chạy S150-S153 liên tiếp. **Khẳng-định phủ-định SAI**, không phải bỏ trống. Bất-đối-xứng: commit chạm persona gần nhất = `398d343` "bookend lượt đầu (hình B)" ⇒ **chính đợt land hình-B mở file mà để nguyên câu sai**; 0 marker 🧊 ⇒ không phải đóng-băng-chủ-đích. Hại cụ-thể: persona auto-inject ⇒ vai đọc đúng chữ sẽ tự tính "chưa tới lượt tao" — sai ngay tại bookend, load-bearing hơn STATUS:454.

View File

@ -52,9 +52,7 @@ H1 tooling-freshness auditor **SOLUTION_ERP-self**. Read-only + **propose-only**
- **2026-07-15 (S123 @start) → `archive/2026-07.md` verbatim (compact S140, byte-verified +4329B):** ALL-4 PASS + 1 MED (G-015 overclaim 2-vai-H24, Bash residual) + 2 LOW; FP-census lane tôi 17/19 DƯƠNG-GIẢ · status6-stale-header 4th-recur (H24-1 mù) · measured{} 12/14 · perm-matrix silent-watch-loss. Lessons hoisted → user-memory `feedback_citation_trap_selfreference` + `feedback_goodhart_leave_measurement_set`.
- **2026-07-16 (S125 @start — ①②③ PASS + ④ PASS_WITH_FLAGS; worker-tier-pin S124 VERIFIED disk+commit):** HEAD `3aacdf9`(wal), tree clean. **②ROSTER PASS** 14 persona; **14/14 `model:opus`@:5+`effort:max`@:6** on-disk+committed (`git show HEAD:tooling-auditor.md`✓); agents/ last-touch `23bbe97`(S124), 0-since. **①SKILL PASS** 6+23+18 identical S123; contract-wf/ef-core count-stale=monthly(08-01). **③PLUGIN PASS** 18/15/3 IDENTICAL; `claude-fable-5[1m]`:11 lead default UNCHANGED (pin=SUBS-only). **R6 ✓** project `settings.json:2` `autoMemoryDirectory`=`.claude/auto-memory`; my ctx-inject FROM that path ⇒ relocate WORKS; authority ③ user-global. **④ 5 RESIDUAL — worker-tier-pin doc-sync NOT finished:** HIGH `STATUS:25` row "all-inherit/TOÀN roster `model:inherit`" + stale "cả **12** lên top-tier"/"**10** product"(roster 14) · HIGH `agents/README:5` "TOÀN BỘ sub `model:inherit`" CONTRADICTS same-file :38 worker-tier-pin · MED `fable-real-runbook.md` **≥2 FALSE CITATION** `:227`/`:563` cite `investigator-codebase.md:5`/`reviewer.md:5`=`inherit` but disk=`opus` (fix NON-trivial: hmw.js alias-vs-frontmatter "chưa test") · MED `fable-real.md:37` · LOW `fable-clone.md:43`(corrected :57). 🔴 **ROOT:** `STATUS:41-42` blurb CLAIMS "doc-sync **ĐÃ vá**" but 5-spot prove INCOMPLETE = tick-no-evidence → NOT-DONE. Ack machine-fired: STATUS:6 header H24-3; harness-11:57 vocab-seed +worker-tier-pin(D7). **Method:** frontmatter tier-flip→grep MỌI doc citing agent `:5`=inherit. Model self **Opus 4.8**. ⚠L1 carry S126. `[s125-start, worker-tier-pin-verified, doc-sync-incomplete-5spot, false-citation-runbook, da-va-but-incomplete, mem-gap-s124]`
- **S126 (2026-07-16) session-end CHỐT [opus-worker, em-main VERIFY+APPEND]:** 3/4 PASS-clean (① SKILL 6-project 0-diff — task gọi "check-email/send-email skill" thực-ra = **COMMANDS** `.claude/commands/`, 6 skill thật 0-đổi · ② ROSTER 14/14 `opus`@:5 + `max`@:6 disk-verified; README:5 + STATUS:25 flip worker-tier-pin ⇒ **S125-HIGH "README:5 contradicts :38" RESOLVED** · ③ PLUGIN 18/15/3 + `fable-5[1m]`/xhigh IDENTICAL) + ④ DOCS PASS_WITH_FLAGS: 🎯 bắt **5 dòng "H23-precedence CHƯA test" SÓT ở 3 command-file** (`session-start.md:50/:52` canonical BƯỚC 0.6 đọc MỖI phiên · `fable-clone.md:63/:65` cross-ref "hmw.js:44-52 mang cùng ghi-chú" ĐẢO/GÃY sau khi hmw.js vá · `ultra-on.md:35`) trong khi 7 file khác đã "ĐO S126" — **same-class-miss ×2 trong CÙNG PHIÊN đang vá class đó**; em-main vá NGAY 5/5 + LOW STATUS:25 "10+2"→"10+4". Learned: fact-runtime chốt ⇒ grep MỌI file mang claim cũ GỒM lớp **command-doc** (sweep-synthesis liệt consumer thiếu lớp ⇒ miss tái-sinh; commands/*.md blind-spot khớp S57/S99 method-mine). Tag `[s126-end, 5spot-h23-stale-caught, commands-layer-blindspot, s125-high-resolved]`.
- **S140 (2026-07-18) session-end CHỐT [opus-worker] — governance-only (0 code/mig/FE); diff `0b0285c..HEAD`:** **①SKILL PASS** 6-proj+23-standalone 0-diff (skills git-diff rỗng) · **NOTE** "183KB/5-file un-gisted baseline" ở 3 command-file (`session-start.md:131`·`session-end.md:56`·`sleep-recovery-memory-l2.md:52`) NAY stale-as-live: sleep-compress `aa88d01` gist 5/5 archive 2026-07 ⇒ un-gisted=0 (5/5 GIST-EXISTS verified). Display đo LIVE `(Get-Item).Length` KHÔNG consume số ⇒ 0 wiring-bug, chỉ misread-risk. Rec: coi ví-dụ-lịch-sử (đã dated 17-07). **②ROSTER PASS 14=14=14=14** (disk · STATUS:450 `**14**` · agents/README:3 B1-pointer-0-số · hmw.js:22-36 VALID_ROLES) + 0 agents-diff. **③PLUGIN PASS** 18/15/3 IDENTICAL (disabled pr-review·code-mod·hookify); settings user-global 0-touch. **④DOCS PASS_WITH_FLAGS:** (a) `session-model-se-draft.md` NEW anchored auto-memory `project_session_model_direction:14`+WAL:12+email — NOT orphan; HANDOFF-carry PENDING @closeout (WATCH) · (b) adap `624c378d` Vòng-5 verified-pending→executed-runtime self-contained (§2+§5 consistent) + checklist row-8 phép-8 + _index +1 email-row; NO further sync (_index=email-layer, lead-view S140) · (c) HANDOFF stamp S138-S139: NEXT (5)DP-5-sleep+(6)force-fire-H24+(8)phép-8 ĐÃ actioned → closeout reconcile + refresh "183.054B chưa-gist". **NEW-ALLOC:** 5 gist = per-agent L2 own-dir (archive-flow auto-covers) ⇒ 0 alloc-action. Boundary: STATUS-header-stale = lead-view H24, KHÔNG double-touch. Model Opus 4.8. Tag `[s140-end, 3-mặt-pass-docs-flags, sleep-183kb-now-historical, draft-anchored-carry-pending, adap-vong5-executed-runtime, 5-gist-L2-autocover, L1-compact-s123]`
- **S143 (2026-07-22) session-end CHỐT `[opus-worker · #53 GARBLE lượt-1 → resume; em-main VERIFY+APPEND on-behalf]`** — **VERDICT DRIFT-FOUND (4).** 4 mặt: ① skill PASS · ② roster PASS (17=17=17=17: đĩa · `STATUS:450` · `hmw.js` VALID_ROLES · 17 folder agent-memory) · ③ plugin PASS-nhưng-2-delta-config · ④ docs DRIFT-2. **F-A — script đi trước doc:** `nhip-no-probe.ps1` nâng **3-vế → 4-vế** (`pull-cach`) nhưng 7 site PRESCRIPTIVE còn khai "3-vế" (`pause` · `session-end` ×3 · `session-start` · `tiep` · `session-model-se-draft`). 🔴 **Cách tách đúng:** site **prescriptive** (mô-tả hành-vi SỐNG) = DRIFT phải vá · site **frozen-in-time** (run-folder · adap-report · session-log · Prev-block STATUS/HANDOFF) = **record lịch-sử, sửa = giả-mạo**. Lead vá 7 site prescriptive, giữ 15 file frozen. **F-B HIGH — ghost-enum, ca đắt nhất:** enum `flag_classes` mở 10→11 (+`gap-incident-unrecorded`) nhưng `36cefcc` **KHÔNG đụng `lead-gap-auditor.md`** — ĐÚNG cái vai phải DÙNG class đó: heading "5 class", bảng 5 row, class mới **0 hit toàn `.claude/agents/`**. Vai bị luật "CẤM tự chế class" ⇒ lần tới gặp ca sẽ **escalate lại đúng thứ vừa được duyệt**. 🔴 **Bảng-cục-bộ (có cột ngữ-nghĩa + nơi-soi) THẮNG con-trỏ canonical trong thực dụng** — vai đọc bảng, không đọc con-trỏ. Kèm 2 site số (`STATUS:450` "10 class = 5+5" · `hmw.js:33`). 🔴 **Và phải biết chỗ KHÔNG sửa:** `lead-stale-auditor.md` "5 class" **VẪN ĐÚNG** (nhánh view-* không đổi) — sửa thành 11 là **sai**. **F-C MED** lead-model pin flip `settings.json``claude-opus-4-8[1m]` không ghi sổ: `STATUS:462` là row session **DUY NHẤT** thiếu dòng `Lead <model>`; `STATUS:450` còn "Fable 5"; `session-start.md:43` outage-recipe bảo đổi sang **đúng cái đang pin** ⇒ recipe hồi-phục thành **no-op**. Nhãn flip = quyền owner, không tự đoán. **F-D LOW** marketplace 35→37: tự soi — chính tao @S140 kết "PLUGIN PASS IDENTICAL" mà **chỉ đo lớp registered**; **marketplace-inventory là LỚP ĐO RIÊNG**, bỏ sót ≥5 ngày. **new-alloc:** 0 skill/plugin mới ⇒ 0 action; chỉ `security-guidance` đáng cân-nhắc (gán `reviewer`) nhưng nó mang **hook Stop + edit-time warning** đụng `settings.json` hooks ⇒ **owner quyết, không tự bật**. Tag `[s143, drift-found-4, prescriptive-vs-frozen, ghost-enum-bang-cuc-bo-thang-con-tro, biet-cho-khong-sua, layer-do-rieng-marketplace, model-pin-flip-unlogged]`
- _(**S126 (07-16) · S140 (07-18) · S143 (07-22) — 3 lượt session-end CHỐT** [S126: 3/4 PASS-clean · S140: governance-only · S143: `#53` garble lượt-1 → resume]. verbatim → `archive/2026-07.md` **@S162 moved-not-cut** — đã verify byte-exact 3/3 trước khi xoá khỏi L1.)_
## S150 (2026-07-25) — H1 4-mặt chốt closeout phiên-logic 3 [LEAD GHI ON-BEHALF — M9/B3; nguồn: `runs/2026-07-25-S150-closeout-bookend/sub-tooling-S150.md` 18.762B; return-1 garble #53 (câu status giữa-chừng), resume CLEAN — đĩa cứu trọn]
- **verdict `PASS_WITH_FLAGS` — 4 FLAG + 2 INFORM.** ① HIGH `sleep-recovery-memory-l2.md:37/:42` exclusion-list sót 6 vai monitor mới (tái-phát class :43 tự cảnh-báo) → vá @S150 bằng **derive-from-source** (bỏ hardcode, đúng đề-xuất (b)). ② HIGH `STATUS:452` flip-chain 0-hit Opus-5 — ring1 BROKE-2 tinh chỉnh: flip-9 CÓ ở `STATUS:8` (frozen) ⇒ ô canonical stale **2 flip**; nhãn = quyền owner → NEXT-anh #14 re-stamp. ③ MED `spawn-model-audit.ps1:9` .DESCRIPTION stale → vá @S150. ④ LOW `:156` dead-ref → vá @S150. INFORM: ring4 no-dir (nhà dựng @S150) · `STATUS:583` additive-note (vá @S150).

View File

@ -60,3 +60,11 @@
🔴 **META (lý-do entry này on-behalf) — bẫy CẤU-TRÚC do em-main tạo, KHÔNG phải sub bịa:** lượt-1 return **#53-garble** (trả lát-cắt transcript self-compact thay verdict) → em-main SendMessage-resume với chỉ-thị **"1. Trả verdict TRƯỚC · 2. SAU ĐÓ hoàn-tất self-compact + ghi entry S119"** → sub trả verdict SẠCH (recover thành công) **kèm câu "đã hoàn tất self-compact + ghi entry S119 sau khi trả verdict — L1=16,733B"**. **Đĩa bác:** `MEMORY.md` = **18,786B mtime Jul-14 16:24** (0-touch hôm nay) · S111 trong L1 = **2 dòng CÒN** · entry S119 = **0**. ⇒ **return CHẤM DỨT agent** ⇒ mọi việc "sau khi trả verdict" là **bất-khả-thi vật-lý**; sub mô-tả ý-định rồi tắt. **LỖI Ở LỆNH CỦA EM-MAIN.** Bài học: **CẤM chỉ-thị "return trước, làm việc sau"** — mọi write PHẢI xong TRƯỚC return; nếu cần cả hai thì thứ-tự là **làm → verify → return**. Self-compact S111→L2 **VẪN CHƯA XONG** (archive `2026-07.md` đã +3 dòng additive `+3/-0` = phần THẬT đã làm ở lượt-1; L1 chưa trim) → **carry S120**. `[s119-start, pass-with-flags, permission-matrix-stale-session6, mtv3-taxonomy-lag, flip-9-owner-choice, on-behalf-by-lead, return-then-work-impossible]`
- **2026-07-15 (S123 @start — ALL-4 PASS + 1 MED + 2 LOW; FP-census lane tôi = 17/19 DƯƠNG-GIẢ):** HEAD `cefb183`; tree 1-M `.session-counter.json` (em-main tick 1→2, expected). **①SKILL PASS** 6+23+18 identical S122. **C2 replicate 15/15 KHỚP baseline em-main****15/15 FP, 0 MED**: contract-wf 6 (`:24/:35/:332×2/:367/:371`) · ef-core 7 (`:99/:100/:108/:116/:119` per-mig phrase + `:167` HEADING "Revert 1 migration" + `:184` shell-comment) · CLAUDE:86 · session-end:126 ("vd 130→132 nếu thêm 2 test"). Ratio-band ĐÚNG việc (far-from-canonical→LOW). 🔴 **ĐỪNG vá 13 flag 2 SKILL này** — noise cấu-trúc, KHÔNG suy-giảm. **②ROSTER PASS 14=14=14** (disk 14 = 15 file README · STATUS:25 · hmw.js VALID_ROLES) + **14/14 `model: inherit`**; `agents/README:3` B1-pointer 0-số ✓. 🔴 **MED — G-015 overclaim 2 vai H24:** `lead-view-auditor:77` + `lead-omission-auditor:68` ghi "KHÔNG Write/Edit/commit (mày không có tool đó)" nhưng cả 2 CÓ `Bash`@:6`git commit` LÀM ĐƯỢC ⇒ SAI cho *commit*. 5 persona khác CÓ caveat; đúng 2 vai soi-LEAD thì KHÔNG. 🟡 LOW: 4 hardcode "roster 14" (`fable-clone:3/:18`·`fable-real:3/:19`) đúng-hôm-nay nhưng `fable-clone:21` CÙNG FILE cấm chép số ⇒ tự mâu-thuẫn + pre-armed (ACTIVE-MARKS:19 "roster 12" đã dính, :26 vá bằng chú-thích). **③PLUGIN PASS** 18/15/3 + m35 + `claude-fable-5[1m]`:11 + xhigh + skipWf IDENTICAL; 0 new-alloc. **④DOCS (a) STATUS:6 `view-stale-header` THẬT** — `Last updated: 2026-07-15 (S119…)``:35 Recently Done (S122)`; mega-line S119×3, **S120/121/122 = 0 hit**. **H24-1 MÙ** (chỉ so NGÀY; 07-15=newest⇒0 flag) = **âm-giả chứng-minh-được**. Tái-phát **lần 4** (S116/S117/S118) ⇒ fix CẤU-TRÚC, không bump. **(b) measured{} 12 vai thiếu 2 vai H24 = DRIFT nhưng số=0:** 2 dir RỖNG + 0 git-track (chưa chạy). Drift thật = `_note` "roster 11->12" (nay 14) + **blind-spot**: `lead-omission-auditor:38` class `gap-underfill` ĐỌC `measured` ⇒ 2 vai mới 0-baseline ⇒ đo NOTHING (= failure-mode GAP-3 policy W4). Fix RẺ: `measure-agent-memory.ps1:10` **auto-discover**, 0 hardcode. 🔴 **+1 delta (45→46):** 45 đo tại **W4 `a09dcae`**, sau 6 commit; `6dcd457` (W6) thêm adap-report H24 `:78` **trích lại** anchor `Status (post Session 6 — 2026-04-30)` khi ĐANG GIẢI-THÍCH chính FP đó ⇒ H24-1 3→4. Số-học khép. 🔴 **GỐC — FP TỰ LÂY qua TRÍCH-DẪN (3 đời):** perm-matrix:16 (defect THẬT, vá W4) → lead-view-auditor:45 (ví-dụ) → adap-report:78 (**= +1 delta**). **Mỗi doc viết VỀ FP tự thành FP.** Chỉ exclusion `runs/` (`:109`) chặn 3 file khác ⇒ **exclusion runs/ VÔ-TÌNH gánh FP-rate**. **DỰ-BÁO:** session-log S123 trong `docs/changelog/sessions/` trích anchor ⇒ TOTAL **47**; trong `runs/`**46**. 🔴 **Guard tự-quy-chiếu:** H24-2 `:670-672` CỐ Ý loại `<` cho `[carry:<slug>]` (*self-reference trap*) = **CÙNG LỚP** H24-1 nhưng **KHÔNG port được CƠ-CHẾ** (guard H24-2 ăn nhờ `<` phân-biệt; ví-dụ H24-1 **byte-identical** anchor thật = ĐIỂM của ví-dụ tốt). **ĐO 5/5: backtick-enclosure** — QUOTED = :45+:78 (**2 FP**) · BARE = form-engine:15 + rag-setup-plan:4 + perm-matrix:16-pre-vá (**3 TP**, gồm positive-control lịch-sử). ⚠️ **form-engine:15 = TP + anchor TRUNG-THỰC** (`git log` last-touch `2abbc1d` **2026-04-30** ⇒ file ĐÚNG từ S6). 🔴 **BẪY:** vá kiểu W4 (đổi form→`Status (cập-nhật…)`) ⇒ **rơi khỏi watch-set** như perm-matrix VỪA rơi (nay KHÔNG khớp pattern nào ⇒ `Get-AnchorDate`→null→SKIP = **mất theo-dõi ÂM-THẦM**, dù comment `:508-512` nói pattern#2 sinh ra CHÍNH VÌ perm-matrix). form-engine:15 = **TP DUY-NHẤT nuôi pattern#2**. **5→0 số-học W4 KHÔNG phân-biệt "date refreshed, còn watch" vs "form lạ, hết watch".** Model **Opus 4.8** (flip-9 owner-choice; `settings:11` `claude-fable-5[1m]` = configured-default, KHÔNG drift). ⚠️ L1 over-cap carry S124. Tag `[s123-start, fp-census-17-of-19, fp-self-propagating-via-quotation, backtick-discriminator-5-of-5, g015-overclaim-2-new-vai, status6-stale-header-4th-recur, measured-12-of-14, perm-matrix-silent-watch-loss]`
<!-- moved-not-cut @S162 closeout — A1 của `harness-refine` (headroom 1.260 B < tripwire 3.070; 3 mục xếp hàng S154/S158/S162). Verbatim, KHÔNG nén. -->
- **S126 (2026-07-16) session-end CHỐT [opus-worker, em-main VERIFY+APPEND]:** 3/4 PASS-clean (① SKILL 6-project 0-diff — task gọi "check-email/send-email skill" thực-ra = **COMMANDS** `.claude/commands/`, 6 skill thật 0-đổi · ② ROSTER 14/14 `opus`@:5 + `max`@:6 disk-verified; README:5 + STATUS:25 flip worker-tier-pin ⇒ **S125-HIGH "README:5 contradicts :38" RESOLVED** · ③ PLUGIN 18/15/3 + `fable-5[1m]`/xhigh IDENTICAL) + ④ DOCS PASS_WITH_FLAGS: 🎯 bắt **5 dòng "H23-precedence CHƯA test" SÓT ở 3 command-file** (`session-start.md:50/:52` canonical BƯỚC 0.6 đọc MỖI phiên · `fable-clone.md:63/:65` cross-ref "hmw.js:44-52 mang cùng ghi-chú" ĐẢO/GÃY sau khi hmw.js vá · `ultra-on.md:35`) trong khi 7 file khác đã "ĐO S126" — **same-class-miss ×2 trong CÙNG PHIÊN đang vá class đó**; em-main vá NGAY 5/5 + LOW STATUS:25 "10+2"→"10+4". Learned: fact-runtime chốt ⇒ grep MỌI file mang claim cũ GỒM lớp **command-doc** (sweep-synthesis liệt consumer thiếu lớp ⇒ miss tái-sinh; commands/*.md blind-spot khớp S57/S99 method-mine). Tag `[s126-end, 5spot-h23-stale-caught, commands-layer-blindspot, s125-high-resolved]`.
- **S140 (2026-07-18) session-end CHỐT [opus-worker] — governance-only (0 code/mig/FE); diff `0b0285c..HEAD`:** **①SKILL PASS** 6-proj+23-standalone 0-diff (skills git-diff rỗng) · **NOTE** "183KB/5-file un-gisted baseline" ở 3 command-file (`session-start.md:131`·`session-end.md:56`·`sleep-recovery-memory-l2.md:52`) NAY stale-as-live: sleep-compress `aa88d01` gist 5/5 archive 2026-07 ⇒ un-gisted=0 (5/5 GIST-EXISTS verified). Display đo LIVE `(Get-Item).Length` KHÔNG consume số ⇒ 0 wiring-bug, chỉ misread-risk. Rec: coi ví-dụ-lịch-sử (đã dated 17-07). **②ROSTER PASS 14=14=14=14** (disk · STATUS:450 `**14**` · agents/README:3 B1-pointer-0-số · hmw.js:22-36 VALID_ROLES) + 0 agents-diff. **③PLUGIN PASS** 18/15/3 IDENTICAL (disabled pr-review·code-mod·hookify); settings user-global 0-touch. **④DOCS PASS_WITH_FLAGS:** (a) `session-model-se-draft.md` NEW anchored auto-memory `project_session_model_direction:14`+WAL:12+email — NOT orphan; HANDOFF-carry PENDING @closeout (WATCH) · (b) adap `624c378d` Vòng-5 verified-pending→executed-runtime self-contained (§2+§5 consistent) + checklist row-8 phép-8 + _index +1 email-row; NO further sync (_index=email-layer, lead-view S140) · (c) HANDOFF stamp S138-S139: NEXT (5)DP-5-sleep+(6)force-fire-H24+(8)phép-8 ĐÃ actioned → closeout reconcile + refresh "183.054B chưa-gist". **NEW-ALLOC:** 5 gist = per-agent L2 own-dir (archive-flow auto-covers) ⇒ 0 alloc-action. Boundary: STATUS-header-stale = lead-view H24, KHÔNG double-touch. Model Opus 4.8. Tag `[s140-end, 3-mặt-pass-docs-flags, sleep-183kb-now-historical, draft-anchored-carry-pending, adap-vong5-executed-runtime, 5-gist-L2-autocover, L1-compact-s123]`
- **S143 (2026-07-22) session-end CHỐT `[opus-worker · #53 GARBLE lượt-1 → resume; em-main VERIFY+APPEND on-behalf]`** — **VERDICT DRIFT-FOUND (4).** 4 mặt: ① skill PASS · ② roster PASS (17=17=17=17: đĩa · `STATUS:450` · `hmw.js` VALID_ROLES · 17 folder agent-memory) · ③ plugin PASS-nhưng-2-delta-config · ④ docs DRIFT-2. **F-A — script đi trước doc:** `nhip-no-probe.ps1` nâng **3-vế → 4-vế** (`pull-cach`) nhưng 7 site PRESCRIPTIVE còn khai "3-vế" (`pause` · `session-end` ×3 · `session-start` · `tiep` · `session-model-se-draft`). 🔴 **Cách tách đúng:** site **prescriptive** (mô-tả hành-vi SỐNG) = DRIFT phải vá · site **frozen-in-time** (run-folder · adap-report · session-log · Prev-block STATUS/HANDOFF) = **record lịch-sử, sửa = giả-mạo**. Lead vá 7 site prescriptive, giữ 15 file frozen. **F-B HIGH — ghost-enum, ca đắt nhất:** enum `flag_classes` mở 10→11 (+`gap-incident-unrecorded`) nhưng `36cefcc` **KHÔNG đụng `lead-gap-auditor.md`** — ĐÚNG cái vai phải DÙNG class đó: heading "5 class", bảng 5 row, class mới **0 hit toàn `.claude/agents/`**. Vai bị luật "CẤM tự chế class" ⇒ lần tới gặp ca sẽ **escalate lại đúng thứ vừa được duyệt**. 🔴 **Bảng-cục-bộ (có cột ngữ-nghĩa + nơi-soi) THẮNG con-trỏ canonical trong thực dụng** — vai đọc bảng, không đọc con-trỏ. Kèm 2 site số (`STATUS:450` "10 class = 5+5" · `hmw.js:33`). 🔴 **Và phải biết chỗ KHÔNG sửa:** `lead-stale-auditor.md` "5 class" **VẪN ĐÚNG** (nhánh view-* không đổi) — sửa thành 11 là **sai**. **F-C MED** lead-model pin flip `settings.json``claude-opus-4-8[1m]` không ghi sổ: `STATUS:462` là row session **DUY NHẤT** thiếu dòng `Lead <model>`; `STATUS:450` còn "Fable 5"; `session-start.md:43` outage-recipe bảo đổi sang **đúng cái đang pin** ⇒ recipe hồi-phục thành **no-op**. Nhãn flip = quyền owner, không tự đoán. **F-D LOW** marketplace 35→37: tự soi — chính tao @S140 kết "PLUGIN PASS IDENTICAL" mà **chỉ đo lớp registered**; **marketplace-inventory là LỚP ĐO RIÊNG**, bỏ sót ≥5 ngày. **new-alloc:** 0 skill/plugin mới ⇒ 0 action; chỉ `security-guidance` đáng cân-nhắc (gán `reviewer`) nhưng nó mang **hook Stop + edit-time warning** đụng `settings.json` hooks ⇒ **owner quyết, không tự bật**. Tag `[s143, drift-found-4, prescriptive-vs-frozen, ghost-enum-bang-cuc-bo-thang-con-tro, biet-cho-khong-sua, layer-do-rieng-marketplace, model-pin-flip-unlogged]`