# STATUS — Snapshot hiện tại

> **Update rule:** trước khi bắt đầu 1 task → ghi row `🔥 In Progress`. Xong → `✅ Recently Done`.
> **Tiering rule (S40):** chỉ giữ **state hiện tại + 3 session gần nhất** ở file này. Session cũ hơn → `docs/changelog/sessions/`. Full history pre-S40 → `docs/_archive/STATUS-preS40-fullhistory.md`. (Tránh over-context — xóa double, không cắt nội dung.)

> ✅ **S190→S191 ĐÓNG vế thi-công (2026-08-12→13, phiên-LOGIC L15 window 2-3)** — **YC-029 "SOLTUON-12-08-2026" 5 wave B6 + YC-030 Q1-Q5 SHIP PROD deploy #600 PASS 6/6** (cicd-monitor + lead re-verify độc-lập KHỚP): W4 `1cc16a2d` + W1 `09ebd20e` + W2 `7b291014` + W3 `ed3b39ff` + W5 `2ae62f3f` · YC-030 `69860362`(BE)+`59cb1217`(FE)+`091073f9`(docs) · test **680→697** (+13 `ContractDeleteGuardTests` test-before + 4 finalize; row canonical Tests bên dưới = 697 chép từ cicd #600) · **Mig 73** `AddContractEndedByLevelFinalize` prod-top · bundle rotate ×2 byte-match (eoffice `BIN1bEGo`/admin `D2FHMRPX`) · Q5 prod QT-HD-V2-001→0/0, type-3 selectable = 7 `HD-*`. **@S191 (13/08 00:34) CỬA NGOÀI-GIỜ đóng trọn:** bật `[cron.archive_cleanup]` Gitea (backup `app.ini.bak-20260813-003421`, restart verify HTTP 200 v1.24.2, cron fire ngay) + **cứu `Vietreport_Master` khỏi RECOVERY_PENDING** (compact /u hết nén NTFS, 3/3 DB ONLINE — gotcha #88 ứng nghiệm) + note báo VIETREPORT. **@S191 00:50 P0-2 anh kiểm ra ("eOffice trắng màn") → VÁ GỐC XONG:** bundle CI #600 `BIN1bEGo` crash `useState null` → hotfix build-local ×2 app → truy **root-cause thật = `deploy.yml` xoá `package-lock.json` rồi `npm install`** (resolve lại cây mỗi run) → **`305b573f`: `npm ci` + lockfile commit + GUARD-92 React-đơn-bản** → **CI run #488 PASS 6/6, hash CI == local 4/4** ⇒ **prod nay `index-CR538vZx.js` (eoffice) / `index-C10ta-wB.js` (admin)**, runtime-verify 2 app console 0 lỗi. **gotcha #92** khắc + root-cause đính chính (giả thuyết disk & npm-cache đều BỊ BÁC bằng đo). Anh KIỂM prod GĐ3 tiếp — lệch-ý-thì-chỉnh. Mạch sống → `.claude/WAL.md`.
> ✅ **S187→S188 ĐÓNG (2026-08-10, phiên-LOGIC L14 window 2-3)** — **module Duyệt Hợp đồng (GĐ3) từ KHKK SHIP PROD 2 đợt** (YC-023 mở việc · YC-024 9 đáp án (80)-(88) · YC-025 *"làm tiếp hết, review 1 lần"*). Đợt-1 `0149f106` (W1 gỡ 2 bom per-type · W2 BE-DTO nguồn-gốc+cây workflow · W7 server-filter) + cụm `b275893c` (W3 seed **7 quy trình `HD-*`** sao khuôn KHKK + **7 key `AwV2_Hd*`** · W4 guard 4-cửa khoá-cứng-theo-loại · W6-BE Đ2 đúng-trạm · W5 card Nguồn-gốc · W6-FE panel **2 nút** + Designer type-3 slice). **0 migration** · test **668→680** · Menu keys 113→**120** · Policies 452→**480** · cicd **4/4 + 5/5** (seeder prod 7 workflow + 7 menu-row, KHKK-8 control nguyên) · **W10 dry-run Dev PASS 5/5** toàn trình 2 nhánh tới `DaPhatHanh`. 🔴 W8 authz **HOÃN** theo (82) · W9 **HỦY** theo (85). #53 garble ~90% return, **đĩa cứu 100%**. Log: `docs/changelog/sessions/2026-08-10-2000-S187-S188-duyet-hop-dong-gd3.md` · run-trace `runs/2026-08-10-S187-duyet-hd-tu-khkk/` (19 file + `implement-synthesis.md`).
> ✅ **S185 ĐÓNG (2026-08-10, phiên-LOGIC L13 window 1-4)** — closeout ONE-SHOT lượt đầu (YC-018). **10 mã YC đóng** (YC-013→022): KHKK 8-panel + guard tay-cầm-phiếu SHIP+verify+acceptance · pipeline email/adap **0/39 nợ per-id** · bookend @close **9 vai một mạch** · ring5-audit (roster 29) + `/day` day-wake · deep_every 15→1 · bảng thẩm-quyền owner chính thức. Tests **668** · counter **59** · over-cap 3. Log: `docs/changelog/sessions/2026-08-10-0400-S185-bookend-oneshot-yc017-022.md`.
> 🔴 **mốc SỐNG = S191, phiên-LOGIC L15, window 3** (2026-08-13) — YC-013 KHKK 8-panel + YC-016 guard tay-cầm-phiếu SHIP+verify prod · YC-017 pipeline email/adap trọn · YC-018 ONE-SHOT bookend land · bookend @close MỘT MẠCH 9 vai (chi tiết `docs/HANDOFF.md` segment mới + `runs/2026-08-09-S185-bookend-close/`). 🧊 mốc cũ S179/L11/window-7 (chuỗi UAT KHKK 8 đợt + đội STYLE) → xem segment Recently-Done. **Dòng CURRENT ngay dưới đây advance @closeout nên tụt sau — giữa phiên đọc `.claude/WAL.md`.**

**🔥 CURRENT (S161→S168, 2026-07-31→08-01 — phiên-LOGIC **L9**: chuỗi SP-002 B0→B4 **TRỌN 8/8 wave**: K1→K7 SHIP (cicd 6/6 · 5/6-khỏe · 6/6 · 7/7 · 5/5 · K6 #440 5/5 · K7 PARTIAL-live-sạch · F-1 `7a903cf` · K7 bridge `aaed699` PWF-10) + **@S168 owner chốt (63)(b)=D+"mở rộng": GĐ3-D SHIP `081557b` (3 trang Panel-3, gate PWF-10/0-blocker) + K8-BLOCKER Lines-editor phát-hiện-bởi-dry-run + vá + SHIP `0bfadc2` (gate PWF-8/0-blocker) — cicd #444 PASS 6/6 — rồi **K8 DRY-RUN PASS TOÀN TRÌNH 2 NHÁNH** (PE A/052 finalize-CCM + A/053 full-CEO → KHKK/2026/001+002 qua endpoint-line-MỚI → bridge-K7 → HĐ ĐẦU TIÊN prod `ZZTEST-K8/NCC/SOL&ZZTEST-NCC-K8/01` DaPhatHanh → bản-cứng hasSealedCopy=True → QĐ9 4/4 vế [nguồn-khoá-409 + catalog-rename-không-lan] — sổ ID + seq-cháy: `sub-k8-dryrun.md` B15, 🔴 KHKK/2026 seq **001-002-003 ĐỀU là phiếu test** [001-002 dry-run + **003 bộ fx3**] ⇒ **phiếu THẬT đầu tiên = 004** — số cũ "003" ở dòng này SAI, vá @close S168 sau khi `lead-gap-auditor` F-2 bắt + lead đo prod xác nhận `sqlcmd` 3 phiếu đều phase=3)**; closeout-nợ TRẢ @S168 — mạch sống ở `.claude/WAL.md`; lineage L8 giữ dưới):** Mig **71** (K1 Mig70 `AddContractCatalogEntries` danh mục 86 dòng + K2 Mig71 `AddKhkkApprovalGroupCatalogAndFinalizeRuntime` — phiếu KHKK +nhóm duyệt N1-N8 backfill=1 + Line +hạng-mục + unique 3-cột) · **97 bảng** · **644 test PASS** (45D+599I — CI #444 KHỚP local; +5 Fact Lines-editor @S168; lineage 639 sau-K7 → 622 @S167 KHỚP CI #439 tách-phần) · gotcha **87** · counter **46** (tick S172; H24 light **2/6** deep **6/15** ok — `light_at=44` · `deep_at=40`; ⚠️ *cặp `light 2/6` trùng số với đợt S168 do tình cờ 42−40 = 46−44, chỉ vế `deep` mới lộ 2/15→6/15 — đừng liếc vế light rồi tưởng ô còn tươi*) · roster 28 · **MenuItems prod 142 GIỮ** (key `KeHoachKyKet` sinh **policy** không sinh menu-row — H1 bác nghi-vấn stale) · Policies **452** · Menu keys **113** (@S166 K4a +49 `Khkk_G*` bộ-sinh — canonical bảng `:470-471`, test T2 khoá drift; lineage 64/256 @K3: +`ContractCatalog` K1 [4 policy chưa endpoint tiêu thụ — khai #82] · +8 `AwV2_KhkkN1..N8`) · bundle prod → **canonical ở `:479`, KHÔNG chép số ở đây** (B1). 🔴 *Cặp `DXoYDy7R`/`o8KDluD1` từng ghi ở dòng này **chưa bao giờ là trạng-thái cuối** — `e5123ff` ship thêm 6 file FE-src SAU snapshot; đo live @S164: admin `B43R6Y17` · user `NLI5umBg`.* Contracts prod **0**.
① **5 wave KHKK SHIP (window-3, S161):** W1 `a8027c0` (Mig 69, 7 bảng, 89→96) · W2 `6cbc6ad` (CRUD+Dossier 15 policy) · W3 `df52fa0` (duyệt V2 3-trạm, test-before RED→GREEN) · W6 `761d818` (đường-ống HĐ V2) · W7 `3119cb9` (bản-cứng **1-MỐC** theo owner: form điền đủ → duyệt nếu có → upload bản cứng = xong). Mỗi wave: gate 5-anchor → hmw → test → reviewer → F-0 → cicd 3-chân. 3 quyết owner: mã `KHKK/{YYYY}/{Seq:D3}` · **bỏ "MB"** · GĐ4 1-mốc.
② **Cây 4-folder GĐ (window-4, S162) — `bfc7b79`, cicd PASS 5/5 Run #432:** lệnh owner *"Tạo folder: Duyệt NCC / Kế hoạch Hợp đồng. / Duyệt Hợp đồng / Hợp đồng cứng."* + AskUser chốt **DƯỚI TỪNG GÓI THẦU** + **áp CẢ trang GĐ khác**. 3 file MỚI ×2 app (`PipelineStageFolders` · `PipelineTreePanel` · `usePipelineStages`) + 3 trang ×2 app, **SHA-pair 6/6**, thuần FE 0-mig. designer SHIP-READY (tự soi ảnh bắt 4 lỗi build-không-báo) → reviewer PASS-WITH-FLAGS 8 → lead vá F-1/3/4/6/7 + F-8. ~~🔴 CÒN NỢ: trang GĐ3 chưa làm~~ ✅ **ĐÓNG @S168 `081557b`** (owner slot (63)(b)=D + "mở rộng" ⇒ áp CẢ 3 trang; câu gốc giữ làm lineage — H1 F-1) (owner nói "CẢ", lead giao 3/4 — lead-gap FLAG-3) · F-2 liên-danh N-HĐ chờ W5 · F-5 layout 19rem chờ owner nghiệm thu prod.
③ **Bookend-close 5 vòng, 10 vai:** H1 `PASS_WITH_FLAGS` 10 finding · H2 **`GATE-FAIL` 4** (⭐ `ctx-verifier` chạy thật mà **chưa bao giờ tự APPEND** diary — S153+S158 đều lead-seed; `cicd-monitor` khai "verbatim→archive" thứ `git log -S` chứng **chưa từng vào archive**) · cặp H24 **20 FLAG** (stale 16 = **SÀN** + gap 4, `gap-carry-dropped` **streak 8**) · trio memory **MIXED** (headroom 165.767 tok đơn-điệu giảm 3 mốc · light 9/6 OVERDUE · baseline `measured` 17/23) · orphan run-folder **3 xác nhận** (2 thiếu THẬT + 1 dương-giả TÊN).
④ **`#53` 6/6 sub, resume-từ-đĩa 6/6, mất 0 B** — chống-#53 = thiết-kế ARTIFACT. **Bài mới:** diagnostic giữa-Edit là snapshot dở (#68) **cắn chính LEAD ×2** (ra lệnh "sửa dứt điểm" cho file `tsc` EXIT 0) ⇒ trọng tài = build chạy SAU khi agent dừng tay · **con-trỏ vào WAL phải theo NỘI-DUNG không theo số dòng** (WAL tái sinh mỗi `/pause` ⇒ số dòng thối IM LẶNG) · nén block `_mind` có **lớp mất-mát ẩn** (2/5 ý rơi không kêu).
→ run-trace `.claude/workflows/runs/2026-07-30-S162-cay-4-folder-gd/` + `.claude/workflows/runs/2026-07-30-S162-bookend-close/` · log `changelog/sessions/2026-07-30-1100-S162-cay-4-folder-gd-close.md`

**✅ S159→S160, 2026-07-29 — phiên-LOGIC **L8**: window-1 = bookend @open **5 vòng ĐỦ** + vá spec KHKK + thi hành 5 khoản owner + **ARC-2 UI "Tổng quan quy trình" 5 đợt SHIP PROD**; window-2 `/tiep` @S160 = closeout sổ bền + PARK chờ anh):** Mig **68** · 89 bảng · **562 test PASS** (45D+517I, đo tươi @đợt-5 Run #426) · gotcha **84** · counter **34** · roster 23 · **MenuItems prod 142** (root 12 · 38-key 13/13 · 21 key `Ct_*` mới 13/13) · bundle **admin js `D0sXA0fe`/css `DWDbm5As` (frozen-hợp-lệ #69-B)** · **user js `Y6dW_5CM`/css `6YIAufJR`** · 🟢 **RAG service UP** (SE index stale — row RAG chunks đã TÁCH 2 trục). **Nửa đầu governance (0 mig) + nửa sau ARC-2 code 2-app + BE endpoint/seeder — dòng "0 prod-code" của bản trước CHỈ đúng nửa đầu.**
① **Sàn-3 ① kêu ×2** (orphan S155+S157 dạng-4) → anh chốt *"nối cho xong hẳn rồi bootstrap"* → **retro-harvest 2 synthesis**; `harvest-curator` verify độc lập: **12/12 byte-exact · 8/8 verdict nguyên văn · 0 bịa**.
② **ARC spec KHKK:** H5 đóng **2 site** (`N ≥ 6` + 6 tên test W3 · `N ≥ 2` + 2 tên W1 — trước đó `N` thả tự do ⇒ `N=0` vẫn PASS) · H6 đóng **4 site** (HANDOFF ghi 1, lead đếm đầu 3, thật **4** — site-4 `DbInitializer` W2 chỉ lộ khi hỏi *"W1 bỏ `IsVisible=0` rồi thì bật ở W2 còn nghĩa gì?"* ⇒ **grep tìm CHUỖI, chỉ mô-hình nhân-quả tìm HỆ-QUẢ**).
③ **Bookend 5 vòng, 10 vai, 9 spawn + 6 resume, 11 artifact ~231 KB:** V1 tooling 7f + harvest **GATE-FAIL 9f** → `ring1` **40Đ/7T** · V2 stale 5 FLAG (chết #53, **SÀN không phải TỔNG**) + gap 8 FLAG → `ring2` **13Đ/0T** · V3 trio eval **MIXED** → refine 2 action/10 BÁC → audit **42Đ/6T** (re-chạy 15/15 byte-exact) · V4 **`không-nhịp`** (shard 15/15 IM, ring2 xác nhận biên `-gt` qua 4 đường) · V5 floor 43+8 · Phase 3.5 `ctx-audit` **TRUOT 6 FLAG**.
④ 🔴 **Vòng kiểm chặn lead 3 lần:** **D-4** — suýt chép `gap-carry-dropped=3` (đơn-vị trong-phiên) vào tally đang **=7** (consecutive-audit) ⇒ **xoá lịch-sử** · **dư-lượng vật-lý** — `ring1` lật claim *"stray 0 · empty-dir 0"* của H2, thật **1** + **5→6 đang tăng** (`git status` **mù cấu-trúc với thư-mục rỗng**) · **thứ-tự nghi-thức** — `ctx-audit` dùng mtime chứng lead ghi `_mind` **sớm 13–54 phút**, ngược `session-start.md:358`.
⑤ **Thi hành 5 khoản owner (anh: *"có giải pháp thì làm luôn, các vòng này tự động luôn"*):** **(49)** vá **6 site** 2 file LỆNH (cặp H24 = **VÔ-ĐIỀU-KIỆN mỗi bookend**, chỉ `deep` theo nhịp) + nới bất-biến (6) + **thêm phép (10) `thu-tu bookend vs _mind`** (fault-inject **4/4** 2 chiều, gồm ca chống-Goodhart *0 run-folder ⇒ bỏ-qua-CÓ-KHAI, không đọc thành "đạt"*) · **(50)** seed **10/10 diary** on-behalf · **(51)** `_INDEX` header **78→80** + 🔴 **`Run #407` MỒ CÔI** (có trong kho, 0 con-trỏ) đã thêm, sweep lại **0 mồ côi** · **(52)** slot (45) **RÚT — báo động giả** (đo trên `_mind-s-7` đã đóng băng; file sống **37,9%**) · **(53)** vá lọc detector `sub-*.md` → `(sub|harness)-*` ⇒ **INFORM 8→14**, và **số tăng CHÍNH LÀ bản vá chạy đúng** (3 lane trio + ctx trước đây vô hình).
⑥ **`#53`: 7 garble / 10 first-return · 6/6 resume SẠCH · mất 0 B.** Chống-`#53` = **thiết-kế ARTIFACT**, không phải prompt (chứng bền nhất: skeleton 929 B kịp vào git giữa lượt).
⑦ **ARC-2 UI toàn-trình "Tổng quan quy trình" (5 đợt / 5 commit, mỗi đợt qua đủ build+test+reviewer+cicd; khuôn {đợt nhỏ → ship → anh nhìn prod → vẽ tiếp}):** `b5799fc` pipeline 4-GĐ (PASS 9/9) → `1a47a61` tab-strip phiếu + menu 4-GĐ + đánh số 01-07 (**PARTIAL 8/9** — mục-9 lộ revoker, xem ⑧) → `2a72695` gỡ nhánh [S92] khỏi revoker + skeleton menu GĐ2 `Khkk_*`/GĐ4 `Hdc_*` + ComingSoonPage ×2 + REGRESSION-GUARD 2-vế (PASS 9/9 restart-proof 3-chân-kiềng) → `a2bbcb9` bỏ KPI/gần-đây thay bằng list chi tiết toàn-trình + nhãn Hdc "- Bảng cứng" (7 FLAG reviewer fix; PASS 9/9 durability-2) → `ea962b1` menu 6-leaf y-chang-Duyệt-NCC ×7 loại HĐ (21 key `Ct_*_{WfView,Approved,Deleted}`) + **`GET /api/contracts/deleted`** (401-với-control-404) + bỏ hero + sidebar **"Tổng quan quy trình"** (**PASS 9/9** — menu 119→142 = +23 **khớp toán từng đồng**, durability ×3 restart; cicd cứu 1 FALSE-FAIL nhờ luật *control-âm-phải-ĐỘC-QUYỀN*). **Bộ tên 4-GĐ chốt (lời anh):** ❶ **Duyệt NCC** · ❷ **Kế hoạch ký kết HĐ** (đời trước "Đề xuất ký kết hợp đồng" — superseded) · ❸ **Duyệt hợp đồng** (*"Trình ký Hợp đồng đổi thành Duyệt hợp đồng"*) · ❹ **Hợp đồng cứng** (*"ký cứng -> Hợp đồng cứng"*). 🔴 **❹-risk CÓ Ý THỨC (verbatim anh):** *"đang phát triển → cho hiển thị hết để mọi người góp ý, còn duyệt NCC thì cứ để như cũ"* — menu HĐ public 13/13 role trong khi authz HĐ còn `[Authorize]` trần (lỗ hổng S156 treo chủ-đích *"chỗ hợp đồng cứ từ từ"*); đã cảnh báo, anh tái khẳng định.
⑧ **Sự cố revoker → gotcha #84:** grant menu bằng SQL tay bị `RevokeTemporarilyHiddenModulesAsync` (nhánh [S92], ungated @restart) lật **447/494 row** ở Run #423 → xử 2 nhịp: regrant 447 + **gỡ nhánh [S92] khỏi code** + guard test 2-vế (`StillHiddenKeys` false ∧ `ReopenedKeys` true — re-add nhánh là CI đỏ) → bền ×3 restart (38-key 494/494, control âm `Hrm/Off/Personal`=0 chứng revoker còn sống). **Luật: KHÔNG SQL tay cho menu nữa — code-first seeder.**
→ run-trace `.claude/workflows/runs/2026-07-29-S159-bookend-open/` (bookend 11 artifact) + `.claude/workflows/runs/2026-07-29-S159-tong-quan-pipeline-menu/` (arc-2: run.md + 5 cicd-verify + 3 sub-reviewer + 2 sub-designer + prod-backup/verify = 13 file)

**✅ S155→S158 (2026-07-27→28 — phiên-LOGIC L7, **5 cửa-sổ**: PE nút XÓA ship prod → điều tra quy trình sau-CEO → UAT Địa điểm → spec KHKK → **S158 adap `/day` + bookend-close**):** Mig **68** · 89 bảng · **562 test** (45D+517I, đo tươi @S158) · gotcha 83 · counter **32** · bundle admin `8-QYcMOg` / user `DptYR4wL`. ① **PE nút XÓA phiếu ở màn duyệt** (Mig 68 `AddPeAllowApproverDelete`, cờ `AllowApproverDelete` **per-NGƯỜI** — owner chốt (5)): chia **2 ĐỢT** theo lệnh anh vì §F.0 chứng minh quyền xóa **không tới được phiếu đang treo** nếu thiếu lệnh sửa-quy-trình-tại-chỗ; `b1bae77` (nền) + `4464a46` (nút + menu 3 mục + màn "Đã xóa") + `f4494cf` (fix menu sáng nhầm) — **cicd PASS 6/6** lead tự đo @S156 (**D3 giao-tập-ID = 0**: 37 sống ⟂ 9 xóa) · test 532→**562** (+30) ② **A2 quy trình SAU CEO duyệt** (PDF 21 bước, phạm vi **b.7→21** — 🔴 **nguyên văn anh chốt phạm vi:** *"đã xong bước thứ 6 tức CEO duyệt rồi nhé, chưa cần làm gì hết → Bắt đầu đến Project (Ban Chỉ Huy Công trường)"*; `ring2-audit` @S158 M-1 bắt câu này **bốc hơi khỏi mọi bề mặt bền** — `grep -c 'bước thứ 6'` = 0/STATUS + 0/HANDOFF, chỉ còn dẫn xuất `b.7→21` ⇒ nhét lại verbatim cạnh dẫn xuất): `/fable-real investigator-codebase` + `/fable-clone reviewer` **4/4 lane sạch 0 chết, 35 điểm** → verdict **`LAI`** (b.13→21 TÁI DÙNG Contract V2 · b.7→12 DỰNG MỚI) — lõi SỐNG, đổ ở nhãn chi-phí + cách đặt vấn đề; 🔴 **anh ĐẶT TÊN khúc 7→12 = "đề xuất giá trị ký kết hợp đồng"** ⇒ đầu ra = **1 CON SỐ có phê duyệt** ⇒ là **PHIẾU**, không phải thư-mục đính kèm ⇒ Q2 nhánh (c) yếu hẳn, Q6 gần tự trả lời. **CHẶN Q1-Q6 chờ anh** (14 câu); 6 việc sửa bản invest chưa làm (gồm 1 claim SAI SỰ THẬT: "hardcoded fallback" → thật là `ConflictException:115-116` ⇒ HĐ từ phiếu **KẸT CỨNG `ChoDuyet`**) ③ 🔴🔴 **LỖ HỔNG AN NINH PROD phát hiện @S156** (KHÔNG liên quan tính năng mới, gotcha #82 tái phát): `ContractWorkflowService.cs:48-66` nhánh Reject chạy **TRƯỚC MỌI GUARD** + `ContractsController.cs:13` **`[Authorize]` trần DUY NHẤT phủ 22 endpoint ghi** ⇒ mọi user đăng nhập Từ-chối/Trả-lại được **bất kỳ HĐ nào kể cả `DaPhatHanh`**; verify 2 tầng độc lập, đối chứng PE controller có 3 per-action policy. **Anh chốt 07-28: "chỗ hợp đồng cứ từ từ"** ⇒ treo có chủ đích ④ **S157 UAT anh Kiệt "lấy địa chỉ lên luôn"** — chẩn **DATA-không-phải-CODE**: auto-fill `Project.Location` đã wire S59 + chạy đúng cả 4 tầng; ô trống vì **prod 57/62 dự án `Location` NULL** (đo sqlcmd; chỉ 5 dự án có địa chỉ = đúng 5 dòng Excel S55). Anh chốt **"để người dùng tự cập nhật Master data, cái nào không có thì không fill"** ⇒ KHÔNG backfill; vá = cảnh báo amber lộ lý do + trỏ chỗ bổ sung (`6250f39`, 4 file 2-app SHA-mirror). **Deploy Run #419 success 5m40s — cicd PASS 9/9 + lead tự re-curl độc lập KHỚP TỪNG BYTE** (marker 2/2 mỗi app, control âm chứng bundle cũ đã biến mất) ⑤ **`#53` cửa S157 ×1** (`cicd-monitor` tái phạm — return = mẩu transcript, cứu TRỌN 10.666B từ đĩa **nhờ ép ghi-từng-mục-trong-lúc-làm**) · `ctx-verifier` @tiep-3 **CO-CO 10 cờ** (nặng nhất: trần `_mind` dư 110B ⇒ cửa sau nén ≥2 block). → log `changelog/sessions/2026-07-28-0930-S155-S157-pe-delete-bch-invest-diadiem.md`

**✅ S153 (2026-07-26 — phiên-logic 6: adopt TRỌN thư Ctx soft-memory + OWNER-VETO 3-vai + RENAME hub-form):** Mig 67 · 89 bảng · **532 test** (giữ — `git diff` 0 file `src/`/`tests/`/`fe-*` toàn phiên) · gotcha 83 · **Sub-agents 23** · counter **27** · bundle FROZEN. **Governance-only.** ① **Pipeline anh lệnh** (`/check-email`+`/adap-apply` → `/fable-real` invest → spec+checklist → hmw Opus-5-MAX): thư ① `9c909007` **TRỌN** (filing 2-tuyến + **probe-sau-restart 2-nguồn `claude-opus-5[1m]`** + thư hub `d432f5eab5cd`) · thư ② `0df10df4` **EXECUTED** — 9 task T1-T8: máy `mind-check` (`session_ctx.py` +528 dòng, 7 phép+2 phụ, 4 mức, draft/closed/`--root`) + template `_mind` + 3 persona + `hmw.js` 23 + wire 4 lệnh + `mind_ctx_kb`=32/`tiep_reload` + **ĐÓNG ghost-wire `session_ctx_kb`** (H18 class-2 sống S146→S153) ② **fault-inject 18/18** + **2 fix hậu-T4 (FI 6/6)**: **GAP-#9** closed-mode "E-có-nội-dung-0-con-trỏ" CỜ→**TRƯỢT** (chặn gradient thưởng *xoá-con-trỏ-trung-thực* — họ bẫy F-1 của chính thư hub) · `secrets-sweep` +`--root` parity; số ĐO THẬT pause +**117ms** thay ước lệch 2.2-5.4× ③ **T10 OWNER-VETO (38)**: anh *"còn thiếu 2 vai ctx?"* → chốt **"Build đủ 3 vai như hub"** ⇒ +`ctx-curator`(@pause, **carve-out `pause.md §1`**) +`ctx-verifier`(@tiep, dòng `LEAD-PHAI-NHAC-LAI:`) · `ctx-audit` thu về vai-3 (kiểm-vết vai-1/2) ④ **T11 RENAME** theo lệnh anh *"đặt tên giống hub/sisters để dễ audit"* — đo đĩa 3 nhà (hub curator/verifier/audit · VIPIX check/reload/chain) ⇒ SE theo **HUB-form** (tiền lệ S149); sweep 15 file, tên cũ chỉ còn lineage-note; **gap còn lại: `ring5-audit` V5 hub CÓ, SE+VIPIX chưa → slot (41)** ⑤ bookend @open 5-vòng (9 spawn: H1 7f · H2 4f · H24 5+3 FLAG · ring1 28Đ/4T/1KC · **ring2 8/8 ĐẠT + M-1 MISS-thật** persona-cadence-stale · trio eval-MIXED-14-signal/refine-3A-7B-4N/**audit 25Đ-3T re-chạy 7 instrument 24-số-byte-exact**) ⑥ **#53 ×14-cận-dưới** (8 open + 4 arc + 2 close), **0 mất dữ liệu** — WRITE-lane derive-from-body · Agent-resume · SendMessage-resume; datum: **trio return-only hết miễn nhiễm** (3/3 CLEAN → 1/3) ⑦ residual-write test-specialist self-compact → verify A7 **401/401** ⇒ ACCEPT verified-KEPT (AS-10) · M9 seed 3 diary ctx (dir 20→23). → log `changelog/sessions/2026-07-26-1600-S153-ctx-adopt-3vai-rename.md`

**✅ S152 (2026-07-25→26 — phiên-logic 5: bookend trọn 2 đầu + owner 3-quyết + queue memory-ops TRỌN):** Mig 67 · 89 bảng · **532 test** (giữ nguyên — `git diff` 0 file src/tests/fe toàn phiên) · gotcha 83 · counter **26**. **Governance-only.** ① Owner 3 quyết trong-phiên: **(30)** dải JUMP để-nguyên-theo-nhịp · **(31)** 4 persona +`Anti-patterns (NEVER)` (ăn registry nhờ CLI-restart giữa phiên — requirement ĐÃ THOẢ, tooling-close proof) · **(32)** "vòng 1→5 auto" → **lô consent gỡ SẠCH 9 site** (5 H1 + site-6 `ring1-audit:24` ring1 TỰ BẮT trong persona mình [E-013 EXT tái-phát] + 3 trio-persona lead grep-cùng-lớp) ② **Queue memory-ops TRỌN** (A1-A4 · D1 · D2+Fidelity-gate F1/F2 · R1 · B-series+FI-9-ca): A7 **392/392** · mfe **20/20-100% lần đầu** · lead-gap drain 24.728→16.485B · sổ-strike `-Apply` + WARN-latch (`-Ack` = **owner-action**, doc @`eval/mfe/README.md`) ③ **V4 sleep AUTO lượt đầu** (probe KÊU 16 → đo-trước-tin: 1 shard THẬT; gist lead-gap distill-gen-1) + **ring4 đầu-đời TRƯỢT-4/5** claim "0-MISS" của lead → 4 fix áp verbatim (scribe `sub-ring4-close-S152.md` + diary — vai return-only, verdict suýt bốc hơi) ④ **Thư model re-stamp**: `59ce1d0f` → published **`9c909007`** (G-024a; stamp_verify OK) — sweep 13 bề-mặt LIVE + adap-report Đính-chính @S152 (2 lệnh S151 SAI THẬT: find=1, grep=3) ⑤ Bookend @close: stale 6 FLAG + gap 2 FLAG → **vá 6/6 cùng phiên**; ring2 **8/8 ĐẠT** (⭐4-A pin-bản-cắt 16.911/30.195B — 3 FLAG ngoài tầm, tally thoát NHỜ MAY → đề `END+TOTAL`-line chờ anh) · ring1 **48Đ/5T/6KC trên 59 claim** (thách-CLEAN 6 lens: 2 THỦNG đều ô 🟢) ⑥ **#53 ×10-chắc S152** (7 @open + 3 @close; ring2-STRICT + trio = 4 CLEAN) → **tally 60-cận-dưới** + errata commit-subject `1b85713` "53"=SAI · M9 **13 đơn-vị** diary (3 `S151-deep` hồi-tố đóng harvest FLAG-A HIGH). → log `changelog/sessions/2026-07-26-0200-S152-bookend-memops-close.md`

**✅ S151 (2026-07-25 — phiên-logic 4: bootstrap chuẩn + trio-AUTO đầu tiên + sửa 3 máy sống):** Mig 67 · 89 bảng · **532 test** (45D+487I PASS tươi @bootstrap S151) · gotcha 83 · menu 54 · bundle FROZEN admin `B2j1LQ-v`/user `C3wbJegk` · RAG 2447. **Governance-only 0 prod-code/0 mig.** ① **Bookend @open hình B lượt chuẩn đầu** — 6 vai (cặp H24 8 FLAG → ring2 **8/8 ĐẠT** · H1 PASS_WITH_FLAGS 8-finding [F-6 BÁC MÁY: #111 = dương-giả detector] · H2 GATE-PASS CLEAN · ring1 33Đ/3T [bắt orphan S144 + skill thiếu Mig 67]); signal-write 6-fire + frozen-held in thật · ② **Trio-memory vòng-2 = vòng AUTO ĐẦU TIÊN** (anh chốt trong-turn *"1 vòng auto giữa 2 bookend"* → codified `session-start §2.1.9(a)` + `session-end §L.b(k)(i)`; eval MIXED 6-trục/12-signal · refine 9-action/9-bàn-giao/6-BÁC · audit **37Đ/3T re-chạy 6 instrument BYTE-IDENTICAL**; spawn-probe 3/3 SỐNG — nợ probe S141 đóng) · ③ **#27 gói sửa-máy 3-fix live-verified** (tick 2-shape style-preserving [FI 7-ca] · C1 pin-backtrack giết #111-giả [FI 8-ca, FI còn bắt bug-backtrack của chính fix đầu] · H24-2 anchor-header [FI 4-ca] → **carry-age HỒI SINH** bắt streak thật 7/9/12; TOTAL 44→46 = −1giả+3thật) · ④ batch doc-fix 11 chỗ (#14 ô canonical → **default Opus 5 MAX** per anh · README:249 XOÁ lập-luận tự-niêm-phong · sha re-anchor `2448393` · +row Mig 67 skill ef-core) · ⑤ tick TAY squash-benign counter **25** (fail-loud exit-7 format-fork → #27 vá tận gốc) · **#53 ×5/6 wave (trio return-only 3/3 CLEAN = counter-datum) → tally chốt 50** + **AS-17/E-013 `skeleton-ruột-rỗng` 2-strike → guard promote** · thư `59ce1d0f` vắng CẢ hub (0-hit find+sha) → hỏi hub re-publish *(🧊 @S152 falsified: thư CÓ trên hub, re-stamp `9c909007` — xem dòng S152)*. **Bookend @close = DEEP** (anh #21: kéo sớm + reset-có-bằng-chứng + gỡ frozen — kết quả xem log). → log `changelog/sessions/2026-07-25-1930-S151-bootstrap-trio-auto-fixes.md`

**Mega-diary lịch-sử (FROZEN — current-state đọc CURRENT STATE table + Recently Done bên dưới, đừng đọc dòng này làm hiện-hành):** (S119 2026-07-15 — **Adap 6 broadcast AI_INFRA: điều-tra chiều-rộng + spec v3 — DỪNG TRƯỚC WAVE (anh chốt B); governance-only 0 prod-code/0 mig/0 FE, test 509 giữ.** Lead **Opus 4.8 owner-choice = flip-9, KHÔNG outage** (MTv3: 0 caveat/0 revert). Pipeline H21 trọn: `/check-email` **6 broadcast mới** (hash 7/7 + tamper 4/4 MATCH; naive-diff ra 56 "NEW" **đa số GIẢ** — H1→H20 đã adopt, chưa copy body = process-gap S101) → `/fable-clone invest` 5-lane `wf_1f6bd5e2-478` **5/5 clean 0-garble** → spec v1 → `/fable-clone reviewer` 4-lane `wf_78a84f9b-03e` **R2 FAIL 4C+8M
R3 FAIL 5C+6M
R1/R4 chết #53** → v2 → `/fable-real reviewer` `wf_cb964f83-331` **GO-WITH-FIXES + 8 fix + 2 honesty-C** → **v3**. **🔴 Phơi-nhiễm ĐO THẬT: 57 `wal:` đã lọt `origin/main`** (hub phát cảnh-báo fleet vì đo được **1** ⇒ **SE = 57×**)
K trôi **3→4→5→6→8→10 trong 1 buổi** (hook fire mỗi turn-boundary ⇒ **LUẬT SỐ ĐỘNG**, cấm hardcode)
`autocrlf=true`@**SYSTEM** + **188** file lật (131 Migrations)
agent **0-CR + 12/12 block-scalar** = chưa chết, 2 lớp may độc-lập
gate EOL scoped **ĐÃ XANH SẴN 0**. **🔴 4 phát-hiện lật tiền-đề, 2/4 lật CHÍNH LEAD:** **L1** 57 KHÔNG do turn-seam — **0/57 ở đuôi, 57/57 bị-kẹp**; kênh rò = `session-end.md:113` SE **tự viết** *"kẹp sâu → GIỮ NGUYÊN, chấp-nhận noise"*, rò ~10/phiên từ S111 ⇒ **`n=0` bất-khả-đạt ⇒ sửa §5.0 = TIỀN-ĐỀ**
**L2 PARTIAL** 188 KHÔNG do squash (§5.0 = `reset --soft` worktree-neutral); nguồn = `dotnet ef` + **lead-written sub-returns**
**L3 → CHƯA VERIFY** lane B **đọc parser** (js-yaml 4.1.1 trong `claude.exe`, `readLineBreak` CRLF-safe ⇒ `': '` **N/A THẬT**) **NHƯNG** regex delimiter **LF-only** ×2 song song bản vá ⇒ **CRLF đơn-độc có thể đủ giết** ⇒ mô-hình broadcast THIẾU; R1 chết đúng câu *"confirm which site is the actual fs-backed frontmatter reader"* ⇒ **hạ nấc, adap-request R4 CẤM gửi dạng "đọc mã-nguồn"**
**L4** H23 ⟂ H8 **KHÔNG xung-đột** — `pin-simple` *"không mandate; form mỗi đội tự quyết; cả hai đạt sàn"* ⇒ SE all-inherit **TRONG KHUNG**; **defect ở H23 §1** tả form-hub như sàn-đã-chốt. **🔴 Fleet drift 3 chiều (→request R1):** H8 *"BẮT BUỘC mọi sister"* → pin-simple *"form tự quyết"* → H23 *"worker-tier gán-cứng"*; **hub tự PIN 17/17 `claude-opus-4-8`** trong khi broadcast all-inherit cho sister; H8 **chưa từng retract**. **GAP#6 lỗi sống:** `fable-clone.md:15` hứa "tier-2" mà **0 cơ-chế `tier:'opus'`** ⇒ Fable UP = **N×Fable** trái §K.D floor-2; **đã cắn S108** (fix landed runbook:431, H21-redesign `debe82f` **không mang sang command-file**). **3 phát-hiện ngoài đề-bài:** **F1** S118 = ca THẬT Lớp-1 (7-spawn trọn ngày, **0 run-folder/0 `wf:`/0 marker**)
**F2** `workflows/README:52` *"bypass-surface ~N/A"* **bác ×3** (RECURRED S72 raw-Workflow mất writeGuard + S118 raw-Agent + **chính run này**) ⇒ đồ-thị THẬT **3 đường**, 2 đường **KHÔNG gate được** = kẽ CÒN-LẠI
**F3** Sàn-3 wire thẳng = **bão dương-giả** (naive 13 orphan vs dual-accept 8). **Positive-control suýt bị lead giết:** `permission-matrix/SKILL.md` stale **Session-6 `2abbc1d`** (54 menu vs "~60"
**216** policy vs `:3`"~240"⟂`:81`"48" tự-mâu-thuẫn
còn `Bg_*` chết S61); detector **42-flag baseline, 0 flag trên chính file này** = máy MÙ chứng-minh-được ⇒ lead đề-xuất vá @Phase-3 → **RÚT LẠI** (H24 §2(4): fire→chứng-kiến→**RỒI MỚI** vá). **Bẫy mega-line — SE ca NẶNG NHẤT:** `STATUS.md:6` = **63,104 ký-tự/1 dòng**, 37 date-token; date-max→`2026-08-01` **tương-lai ⇒ detector không bao giờ kêu ⇒ tự giết positive-control**; date-min→`1987-03-07` **ngày-ma từ `pqhuy1987`** ⇒ **BẮT BUỘC neo-phạm-vi**. **🔴 v1 SẼ GÂY MẤT VIỆC** (R3 fault-inject: 6/6 wal: NONWAL=0 ⇒ 0 commit để fixup → detached HEAD → hook fail-open commit → abort → **mất worktree** = `E-029` tới bằng cửa sau, đúng lỗi **v1 trích làm cảnh-báo**). **🔴 2 honesty-C của lead:** *"v2 vá 19 finding"* thật **23** (tự-khai 4+7+5+2=**18≠19**; tập "7M/2M" **khớp chính-xác** tập đã xử ⇒ **đếm đúng cái đã làm rồi gọi là TỔNG**, 5 rớt 0-disposition, 3 STILL-BROKEN)
enum **10/11** rồi tuyên *"khớp 5+5"* (bỏ đúng class bắt **ca F1 của chính SE**); **tỷ-lệ claim gate re-đo ~30: ~80% ĐO-đúng
~13% SAI TRỌN ở meta-count/coverage
~7% suy-diễn** ⇒ **lead ĐO tốt, ĐẾM VỀ MÌNH thì sai**. **Owner 6 chốt:** **nguyên-tắc MỚI** (harness phải giống
trong-khung=tự làm
**vượt-khung=🔴request anh+AI_INFRA**
khung-tự-mâu-thuẫn=report→hub broadcast lại)
**O1 PA-2** (hình-thức **PA-2a hằng-số + PA-2b audit**; neo-tại-spawn **bất-khả-thi** — param chỉ nhận alias, SE 0 full-id vì H8)
**O2 6/15/3** (trùng hub **có chủ-đích**, hub dặn *"đừng chép"*)
**O3 `[carry:<slug>]`** (dòng-carry = **đoạn LOGIC** không dòng vật-lý)
**O4 KHÔNG dọn 57** (rewrite = **tự vô-hiệu-hoá bằng-chứng VERIFIED-RUNTIME của chính H22** — `12071c5` cited 12 file + `67be443` cited 10 file = 2 commit chứng-minh hook-FIRE ở `engine:407` **và trong adopt-report ĐÃ GỬI hub**)
**fix#8** (a) PA-2 stamp [tiền-đề *"param chỉ nhận alias"* = **đọc-doc CHƯA thử full-id**, giữ nấc] (b) hook-interlock **TRONG KHUNG** [thu-hẹp ≠ đổi-cơ-chế; side-ref **VẪN vượt-khung**]. **14 artifact tracked** `runs/2026-07-15-S119-adap-6-broadcast/`. **STILL-BROKEN sau v3 = 0.** 🔴 **v3-GAP lead tự bắt @đóng:** điều-kiện rẽ nhánh test `NONWAL==0` **SAI THỨ** (luật fix#3(c) nói **"đáy range"**) → 3 ca đúng ghi WAL, **vá trước W0.3**. **#53 ×3** (tooling-auditor lượt-1
R1
R4) → recover SendMessage-resume 1/1 + transcript-mining + em-main tự đo; **+bài học MỚI: "return trước, làm việc sau" = BẤT-KHẢ-THI** (return chấm dứt agent) ⇒ tooling-auditor claim *"đã compact"* SAI (mtime Jul-14, 0-touch) — **lỗi ở LỆNH lead**, em-main ghi entry on-behalf. State GIỮ NGUYÊN: **Mig 66
89 bảng
509 test
gotcha 82
menu 54
bundle admin `cFI7ih4a`/user `MxgooVZw` (FE FROZEN)**. 🎯 **NEXT: `/tiep` → wave W0→W6** (RESTART ×2 ⇒ trải ≥3 phiên CLI). → log `2026-07-15-S119-adap-6-broadcast-spec-v3.md`)
**Prev S118** (S118 — **UAT anh Kiệt FDC: phân quyền PRO `tra.bui` + vá lỗ hổng `ReportsController` — em-main-led + 7 spawn (2 monitor + reviewer + 2 test-specialist + 2 cicd-#53-GARBLE) + 3 script, 3 commit (`e88e75d` docs-reconcile + `c2135ba` PRO-perm + `c808b9a` Reports-authz) pushed, 2 deploy #388/#389 verified.** Triệu chứng: `tra.bui` (Bùi Lê Thủy Trà, Procurement TP) login không thấy menu quản lý NCC. **Điều tra prod read-only** (SSH sqlcmd + permission-matrix skill): account active OK + roles đúng (`Procurement`+`DeptManager`) nhưng chỉ đọc 11 menu `Pe_*` — vì seeder `RevokeTemporarilyHiddenModulesAsync` (S92 owner-decision) set `Master`/`Suppliers`/`Projects`/`Departments`/`Catalog*` CanRead=0 cho MỌI non-admin ("chỉ Admin thấy"). **Owner 3-decision** (AskUser): scope=Master-đầy-đủ
durability=làm-bền-qua-code
edit-NCC=chỉ-công-bố/import/thêm (KHÔNG sửa/xóa). **Fix 2 tầng:** (1) grant tạm prod MERGE-idempotent (tra.bui 11→22 verify-LIVE) → sau reviewer bỏ Reports/Dashboard còn **20**; (2) code-hóa bền `SeedProcurementMasterAccessAsync` (chạy-SAU-revoke để THẮNG, mirror Hrm S65/Office S69, **CHỈ role Procurement** upgrade-only 9-key: `Suppliers` R+C+U [S113 publish cần Suppliers.Update] + Master-family Read; **KHÔNG Dashboard/Reports** — reviewer bắt Reports lộ `TotalValueActive`+top-NCC-theo-giá-trị ngược S92). **Serilog = bằng-chứng-durable vàng:** deploy restart log "Revoked 9 permission rows (S92)" → "Seeded Procurement master access: 0 added + 9 upgraded" 44ms sau ⇒ seeder THẮNG revoke; verify ×2 deploy (tra.bui giữ 20). **Scope-isolation prod-verify:** `binh.le` (CostControl, no-Procurement)=11
DeptManager-standalone Master/Suppliers=0 (S92 nguyên vẹn role khác). **+4 test** `ProcurementMasterAccessSeedTests` (reflection no-prod-touch) 501→505. **ReportsController authz** (task-riêng anh mở, reviewer-catch): `[Authorize]` trần → MỌI user đọc `GET /reports/dashboard` (tổng-giá-trị-HĐ) + `contracts/export` (dump HĐ); fix gate `[Authorize(Policy="Reports.Read")]` per-method (owner: chỉ-Admin; prod-verify Reports.Read=chỉ-Admin) + `my-dashboard` GIỮ-MỞ (scope currentUser); **+4 authz reflection test** 505→509. **gotcha #82** (menu-flag grant ≠ quyền API thật: display-layer ⟂ API-authz-layer). **wipe-durability #75/#76 CATCH** (grant tay sẽ bị revoke reset next-deploy → bắt kịp trước khi báo "done"). ⚠️ **#53 cicd-garble ×2** (cả 2 cicd trả memory-curation thay verdict) → em-main-solo recover (curl 401/health + sqlcmd, 2 nguồn khớp; verify-lane garble ≠ mất-việc). 3 script clean (archive-gate 12/12 under-cap A7 249/249
crystallized headroom-OK). State: **Mig 66
89 bảng
509 test (45D+464I)
gotcha 82
menu 54
bundle admin `cFI7ih4a`/user `MxgooVZw` (FE FROZEN — BE/permission-only)
prod 37 NCC/17 user.** → log `2026-07-14-S118-perm-pro-tra-bui-reports-authz.md`)
**Prev S117** (**2 chỉnh PE từ UAT anh Kiệt FDC SHIP PROD (`316a82f`, CI Run #387 PASS 5m36s, bundle rotate ×2) — em-main-led, 2× `/fable-real investigator-codebase` engine-đắt deep-pass (Fable) + 4 spawn (test-specialist + implementer-frontend + cicd-monitor), HMW-ON, lead Opus 4.8, 1 commit.** **(1) Fix hiển thị lũy kế "duyệt rồi không bắt" = DISPLAY-LIE KHÔNG phải lũy kế bug:** anh Kiệt/Kenny/Bích Phượng báo phiếu A/018 "duyệt rồi mà không bắt lũy kế", xóa/tạo lại vô ích. `/fable-real invest` (`wf ab2657ee`, **#53-garble lần 1 → SendMessage-resume recover** + em-main verify prod-DB độc-lập) hội-tụ: A/018 **CHƯA DaDuyet** — prod `Phase=ChoDuyet, EndedByLevelFinalize=0, pointer Step2/Lvl1 = đang chờ CEO`; anh Chương duyệt cấp finalize NHƯNG **không tick "Cấp này KẾT THÚC"** (S97 default bỏ-tick opt-in) → advance lên CEO thay finalize. Lũy kế loại A/018 ĐÚNG (filter `Phase==DaDuyet`, nguyên tắc Kenny "duyệt rồi mới bắc"). Bug thật = `endsBeforeCeo` cho phiếu non-DaDuyet trả config `true` mù (`PurchaseEvaluationFeatures.cs:1152`) → sơ đồ mờ Bước 3 "Kết thúc tại Cấp 2" khi phiếu đang inbox CEO (**gotcha #78 nửa-còn-lại**). Owner AskUser chọn **"sửa hiển thị + giữ opt-in"**. Fix **POINTER-AWARE 3 site** (detail in-memory + list/inbox EF-subquery rank=Step.Order-1): non-DaDuyet chỉ endsBeforeCeo=true khi CÒN cấp finalize ở-hoặc-SAU con-trỏ. **BE-only** (FE consumer thuần `PeFinalizeChip`/`PeWorkflowPanel:124` gate cờ), +1 test repro (RED→GREEN). A/018 lên lũy kế = việc vận-hành (CEO duyệt / re-approve tick-finalize). **(2) Feature "duyệt theo khoảng Min–Max":** anh Kiệt "chọn cả 2 min và max". `/fable-real invest` (`wf abbbb86d`, **0-garble clean verdict**) → **Model A**: +cột `ApprovedPriceMaxAmount` (Mig 66 AddColumn nullable no-backfill, phiếu cũ nguyên) + source `"ProMinMax"` radio thứ 5 (chỉ khi PRO có cả Min&Max), Amount=Min/Max=Max, bất-biến Max⟺ProMinMax + Min≤Max (guard service+validator). **HĐ.GiaTri KHÔNG đọc giá chốt** (=SUM báo giá NCC chọn — em-main verify độc-lập `CreateContractFromEvaluationFeatures.cs:88` grep ApprovedPrice=0-match) → range thuần record-of-decision, **0 tác động HĐ**. BE **em-main-solo** (signature ripple: 3 call-site :858/:896/:928 + 2 method sig + command/validator/handler/controller/DTO/projection/interface) + FE 2-app SHA-mirror `011ee8cf`/`617b0aa0` (implementer-frontend) + test +5 (test-specialist, harness `InvokeApply` 4→5 args fix tránh TargetParameterCountException). anh **"làm theo hướng dẫn nó luôn"** → implement thẳng theo investigator (3 product-decision resolve theo khuyến nghị: HĐ giữ
range 3 finalize-path
1 radio). Test **495→501** (+1 pointer-aware +5 ProMinMax). ⚠️ **#53-garble ×2** (invest-lane-1 + cicd-monitor) → SendMessage-resume + **em-main curl độc-lập cross-verify** (`cFI7ih4a`/`MxgooVZw` khớp verdict agent). cicd **Run #387** PASS 5m36s: Mig 66 prod (`ApprovedPriceMaxAmount` col decimal(18,2) + `__EFMigrationsHistory` + 89 bảng)
bundle admin `Dd55jBpj`→**`cFI7ih4a`**/user `DVDr1UQ4`→**`MxgooVZw`** (CSS frozen=logic-only)
byte-level `ProMinMax`/`duyệt theo khoảng`/`cả Min và Max`/`Min–Max` PRESENT (bundle cũ=0)
smoke 200×3
PE 401. **KHÔNG đụng** multi-winner S114 / negative-quote S116. State: **Mig 66
89 bảng
501 test
gotcha 81
menu 54
bundle admin `cFI7ih4a`/user `MxgooVZw`
prod 37 NCC/17 user.** → log `2026-07-14-S117-pe-luyke-display-minmax-range.md`)
**Prev S116** (S116 — **PE cho nhập giá ÂM ô "Số tiền báo giá cho hạng mục" SHIP PROD (`88368fd`, CI Run 386 PASS 5m28s, bundle rotate ×2) — anh Kiệt/Duy Nguyen: số âm = phát-sinh-giảm/hoàn-tiền NCC = giá THẬT, "có giá là được" (≥1 giá thật âm/dương → gửi được; chỉ chưa-nhập-gì mới chặn) — em-main-led pipeline anh chỉ-định (fable-clone invest+review → fable-real → hmw), HMW-ON, lead Opus 4.8, 12 spawn / 5 workflow, 1 commit.** invest `/fable-clone investigator-codebase` 4-lane (`wf_eaf52972-d18`) hội-tụ **FE-ONLY** (BE/DB nhận âm SẴN: 0 validator `UpsertPurchaseEvaluationQuoteCommand`
`ThanhTien decimal(18,2)` no CHECK; **ngân sách GIỮ NGUYÊN bằng kiến-trúc** — `PeWorkItemBudgets` chỉ ghi bởi command budget role-gated, quote-path `:308-343` không đụng) → owner **4-decision** AskUser (**R1** Contract.GiaTri âm no-clamp [`CreateContractFromEvaluationFeatures.cs:88-100`]
**R2** nới submit-guard `Sum()<=0`→`All(==0)` [anh HỎI LẠI mid-pipeline: 1-NCC-1-hạng-mục-âm PHẢI gửi được, mâu-thuẫn R1-cho-HĐ-âm → refine]
**R-CEO** giữ NET threshold [dòng âm kéo phiếu dưới ngưỡng→CCM finalize bỏ CEO, owner chấp-nhận]
R3 BgVat/ChuaVat giữ) → review `/fable-clone reviewer` 3-lane (`wf_4824f158-b66`: Lane1 PASS_WITH_FIXES bắt **sign-plumbing** [2 dialog commit `form.thanhTien` THẲNG POST `:2232`/`:2875`, nút ± phải ghi giá-CÓ-DẤU KHÔNG chỉ flip cờ `neg` → mất-dấu thầm lặng]
Lane2/3 PASS mirror-byte-identical + budget-invariant + gotcha #81 safe [IsSelected boolean độc-lập dấu]) → `/fable-real reviewer` (`wf_9648d207-21b` model=**claude-fable-5** Fable UP — **#53 return-garble ×19, cut mid-CEO-threshold 0-verdict** → **em-main-solo gate GO-WITH-FIXES**: transcript-forensics [verify đúng `winnerQuoteTotal SUM` :884-889] + em tự soi bắt thêm **FE 2 mirror `:201`+`:235`** [SUM không phân-biệt all-zero vs net-zero → iterate `details[].quotes` KHÔNG `suppliers[].quotes`; FE-impl-agent tự-sửa spec-shape-error]) → **hmw implement** (`wf_48834aca-c41` Opus 4.8 MAX, FE ‖ BE→test, 0-garble): FE 2-app SHA `3e16dba5` (nút ± toggle 2 input + gate `>0`→`!==0` + toast + helper `hasRealSelectedQuote` 2 mirror + ô-ngân-sách giữ ≥0)
BE `PurchaseEvaluationWorkflowService.cs:206` `Sum()<=0`→`All(x=>x==0)` 1-điều-kiện + stale-comment-fix
**+9 test 486→495** (T1 ngân-sách-bất-biến
T2 winnerQuoteTotal signed-sum
T3 submit-guard all-zero-blocked/pure-neg-submittable/net-zero-submittable
T4 CCM-net-threshold). **KHÔNG migration** (Mig 65
89 bảng GIỮ; BE+DB nhận âm sẵn). Verify em-main độc-lập (không tin self-report #53): `dotnet test` **495** (Domain 45 + Infra 450)
mirror SHA identical
BE build exit-0
scope 11-file clean. cicd **Run 386** PASS 5m28s: bundle admin `D51OYyGV`→**`Dd55jBpj`**/user `BVdssm5S`→**`DVDr1UQ4`** rotate ×2 (CSS frozen=logic-only fingerprint)
byte-level `Đã nhập giá chào thầu`/`hoàn tiền NCC`/`phát sinh giảm`/`Đơn vị được chọn chưa có giá chào thầu` PRESENT (bundle cũ=0)
smoke 200×3
PE 401-secured
89 bảng
cicd bắt bẫy snapshot-while-CI-running→poll-success TRƯỚC re-snap (tránh false-FAIL). ⚠️ **#53-garble chỉ 1/5 workflow** (fable-real single-lane) — 4 workflow khác 0-garble (`parallel()` + schema-nhỏ 3-field). run-trace + agent-memory `.claude/` gitignored → force-add @closeout. State: **Mig 65
89 bảng
495 test
gotcha 81
menu 54
bundle admin `Dd55jBpj`/user `DVDr1UQ4`
prod 37 NCC/17 user.** → log `2026-07-13-S116-pe-negative-quote.md`)
**Prev S115** (S115 — **Adopt AI_INFRA presence-not-age selector guardrail (`ab6c387e`) + rec-3 hmw.js STOP-HARD — governance/tooling-only 0 prod-code, em-main-led + 7 spawn (5-lane fable-clone reviewer ensemble + fable-real deep-pass + cicd), commit `81b59f0` pushed, CI #385 PASS 5m23s bundle FROZEN.** Pipeline H21: `/check-email` 2-new (`6c32df89` approve H22+H21/MTv3 VERIFIED — SE first-in-fleet H22
`ab6c387e` presence-not-age type=update) → `/fable-clone reviewer` 5-lane ensemble (`wf_b621aac4-f0b`) → spec 3-mục → `/fable-real reviewer` deep-pass **PASS-WITH-FIXES (0C/2M/5m)** (bắt **M2 = contiguity-inversion bug THẬT** trong D3 pseudocode mà 5-lane ensemble bỏ sót; M1 grep-acceptance quá hẹp) → owner **ALL-3** (AskUser) → HMW execute em-main-solo (governance single-writer D9). **D2 hmw.js:** unknown-role fail-soft-WARN → up-front STOP-HARD throw (trước parallel, giữ null/'' role-less inherit-lead; node --check + stub 7/7) + 5-doc sync. **D3 archive-gate:** value_protect advisory-flag → pre-selection HARD-SKIP (value-primary, heading-only spans, non-contiguous byte accum) + value-floor WARN; fault-inject ALL PASS + real regression A7 242/242 DRY-RUN. **D1 reinject-ledger:** presence re-verify stamp + 3 honest-notes + BUILD-GAP. Verdict: reinject (i) + MFE age-band (iii) đã COMPLIANT; chỉ archive-gate cần hardening; **D3 = defense-in-depth codify KHÔNG leak-closure** (9-token grep unchanged; em-main value-scan = guarantee). adap-report + email AI_INFRA `8b9dc5165d5a`. **Owner-directed:** `crystallized_backfill.target` 0→**210K** (budget.json; expected_backfill 210K fits headroom 253.7K). **RAG-down bootstrap** (gotcha #14 down-artifact, Qdrant off-after-reboot corpus-intact) → AI_INFRA restore (§I1 domain), SE flag+defer. #53-garble ×2 (fable-clone lane-4 → sub-file
cicd #385 → em-main-solo curl) 0-loss. AS-10 reviewer self-write verified-KEPT. H22 dogfood: Stop-hook wal-flush + §5.0 reset-soft squash. State GIỮ NGUYÊN: **Mig 65
89 bảng
486 test
gotcha 81
menu 54
bundle admin `D51OYyGV`/user `BVdssm5S`**. → log `2026-07-13-S115-presence-not-age-adopt.md`)
**Prev S114** (S114 — **PE multi-NCC per hạng mục SHIP PROD (`d436af2`, bundle rotate ×2) — anh Kiệt: cho ≥2 NCC-TP trúng thầu/1 hạng mục, mỗi nhà 1 giá riêng — em-main-led 6-bước fable-clone→hmw→verify, 4 workflow + 3 spawn, HMW-ON, lead=Opus.** Flow: `/fable-clone invest` 4-lane inv-cb ensemble (`wf_dd49ddc0`) → **3 trục winner** (A `SelectedSupplierId` single legacy
B `Supplier.IsWinner` Mig58 liên-danh cả-gói
**C `Quote.IsSelected` per-hạng-mục = hook Mig 12 DORMANT**) → feature = trục C, KHÁC Mig58 → anh Kiệt **4-decision** AskUser (**D1**=SUM(IsSelected)
**D2**=THAY-THẾ IsWinner-derived
**D3**=giá-chào-gốc
**D4**=1HĐ/NCC → **0 bảng/cột mới**) → `/fable-clone review` 3-lane reviewer (`wf_1e127f4b`, **6 adjustment A1-A6**: A1 giaTri bỏ detailsSum
A2 derive-invariant mọi-writer+backfill-2-chiều
A3 re-key SPLIT 5-financial→IsSelected/existence-GIỮ-IsWinner
A4 endpoint per-detail+FE per-cell) → **hmw implement** staged BE→FE+test (`wf_e7ee6abe`+`wf_410896c4`) → `/fable-clone verify` 2-lane refute (`wf_14850736`, **CLEAN 0-garble HỘI TỤ 1 MUST bug** invest/review/implement đều sót). **Mig 65 `BackfillPeQuoteIsSelectedAndWinnerInvariant`:** data-only 2-chiều `IsWinner↔IsSelected`, idempotent, Down no-op, no new table (89). **BE:** command per-detail `POST /select-winner {detailId, supplierIds}` set Quote.IsSelected + derive IsWinner; re-key 5 financial-SUM (winnerQuoteTotal/submit-guard/CCM-threshold/giaTri/budget-B)→WHERE IsSelected; giaTri bỏ isSingle→detailsSum (⚠️ **single đổi budget→bid** theo D4). **FE 2-app SHA `ae3788e9`:** HangMucCard per-cell winner grid Detail×NCC + toggle per-detail; NccSelectorRow hạ-cấp read-only summary. **🎯 Bước 4 bắt MUST bug (gotcha #81):** DeleteQuote/DeleteDetail sót re-derive IsWinner → xóa quote-selected cuối → IsWinner kẹt stale → CreateContract sinh **HĐ giaTri=0 phantom** → em-main fix test-before (helper `PeWinnerInvariant` + 2 test RED→GREEN + guard). Test **477→486** (+9). ⚠️ **#53-garble ×5** (review-lane + BE + FE + test + cicd) — **0 mất việc**, all recover-from-disk (WRITE-lane garble return≠mất-code; `parallel()`+disk-verify chốt; stage-1 `await agent()` trực-tiếp = 1-garble-giết-workflow → lesson). cicd garble→**em-main-solo verify**: bundle admin `acprMqfB`→`D51OYyGV`/user `Ck3BTDdA`→`BVdssm5S` rotate ×2
byte-verify `detailId`+`select-winner`+`hạng mục` PRESENT
smoke 3/3 200
endpoint 401-live
mig applied API-healthy. State: **Mig 65
89 bảng
486 test
gotcha 81
menu 54
bundle admin `D51OYyGV`/user `BVdssm5S`
prod 37 NCC/17 user.** → log `2026-07-12-S114-multi-ncc-per-hangmuc.md`)
**Prev S113** (S113 — **Supplier import v2 SHIP PROD (Run #497 PASS 5m14s) — anh Kiệt owner: R1-R7 (đọc file thật 30-token-re-bake byte-exact + nút Tải-file-mẫu BE-gen + nhập Mã-NCC thủ-công=Code + thiếu-Mã→nháp/ẩn + dedup MST-primary+Code-backstop + MST-thiếu→cảnh-báo-mềm + badge Public/Nháp) — em-main-led + fable-clone-invest-ensemble (5-lane investigator-codebase: 4-structured + 1-garble#53-visibility→em-main-solo-grep-recover) → spec-3-mục → anh 3-decision (D1=A Mã-NCC=Code
D2 Code-cổng/MST-cảnh-báo-mềm/existing-public-giữ
D3 nới-quyền Suppliers.Update) → HMW-Opus implement (BE⟂FE disjoint parallel) → test-specialist → reviewer GO-WITH-ADJ → deploy.** **Mig 64 `AddSupplierPublishState`:** +`IsPublic` bit (cổng công-bố R4) + backfill 37/37 prod→public + filtered-unique đổi `[IsDeleted]=0 AND [Code]<>''` (nhiều nháp Code='') + **no new table (89)** reversible Down. **BE:** dedup MST-primary+Code-backstop (chống 500 unique-violation)
re-bake 30 token header THẬT byte-exact (LayoutValid khớp file anh)
`PublishSupplierCommand` riêng (né #73 clobber)
`GET /import/template` ClosedXML
authz D3 `Policy=Suppliers.Update`. **FE 2-app SHA-mirror:** badge
nút Công-bố
filter
nút Tải-file-mẫu
cột Mã editable
cảnh-báo-MST
**picker PE+HĐ lọc published=true (ẩn nháp → mã HĐ không dính Code rỗng)** + CreateSupplier set IsPublic=true. **4 BUG caught+fixed PRE-PROD (multi-agent value):** #53-garble invest-visibility-lane [em-solo grep recover]
**null-Code NRE `NewSupplier` (gotcha #80, test-specialist bắt — path R4 lõi, 500-cả-batch, `!`-tắt-cảnh-báo build-0/0-không-thấy)**
authz-403 Import-nút Create→Update [em verify-chéo]
draft-leak-picker + CreateSupplier-quên-IsPublic [reviewer 2 must-fix]. Test **458→477** (+19). ⚠️ **#53-garble ×2** (invest-visibility-lane + implementer-backend-first-return → **SendMessage-resume 1/3 finish sạch build-0/0**). **cicd Run #497 PASS 5m14s:** bundle admin `Cixlt_MA`→`acprMqfB` (CSS `CfunQHbd`) / user `BhBOG1dn`→`Ck3BTDdA` (CSS `DGqqHQXS`) rotate ×2 real-src ship-proof
Mig 64 prod (history-top + IsPublic-col + 37/37-backfill + sys.tables 89)
byte-verify feature-string PRESENT
smoke 200 + endpoint-mới 401-live bogus-404-control. **Owner-note: prod 37 NCC (không phải 22 ước).** State: **Mig 64
89 bảng
477 test
gotcha 80
menu 54
bundle admin `acprMqfB`/user `Ck3BTDdA` (Run #497)
prod 37 NCC/17 user.** → log `2026-07-12-S113-supplier-import-v2.md`)
**Prev S112** (S112 — **2 FEATURE SHIP PROD (Run #496 PASS 5m25s) — Supplier Excel-import Phase B + PE sign-off A1/EDGE-5/opinion-history — em-main-led, 3 fable-clone ensemble Opus MAX + 8 spawn, HMW-ON, lead=Opus owner-choice `/model`, 4 commit (2 prod + closeout).** Bootstrap all-green (458 re-verify
detector 0-HIGH
spec-audit 0-GAP
RAG 2439
2 monitor ALL-PASS/CLEAN
WAL sạch). **Owner-directed số:** `harness_floor` 30K→**100K** (rounded_up) + measured re-measure 21K→**55K** — 21K cũ UNDER-COUNT (đoán tool-schema+framing ~7K thực ~30-50K; disk-inject đo-thật 57.6KB ~14-19K một mình đã ≈ 21K cũ; sister-parity ~60-71K). **Supplier import (`e100ef0`, Mig 63 `AddSupplierImportSourceFields` +SourceUpdatedAt/By 2-nullable no-new-table):** fable-clone invest `wf_e2f23a84` → 5 owner-decision (Code=col4
+2field
A-scoped-layout
fill-nulls-SAFE
Type-lạ→NhaCungCap) → BE (dedup OrdinalIgnoreCase preview+confirm chống-unique-violation-CI-collation
all-or-nothing
parser header-fingerprint row-4 absolute-cell-index #REF!-null NAS-backslash-raw) + FE 2-app byte-identical → close-review `wf_75d6149b` GO-WITH-ADJ → adjust (bake 30 real-token `RealFileHeaderTokens` byte-verify + `.Normalize(FormC)` de-risk NFD)
10 test có-RĂNG (SQLite BINARY → dedup ở service). **PE sign-off (`a829d0d`, code-only no-mig):** fable-clone invest `wf_fd8f2bfe` (root=`ApplyDrafterBypassOnSubmitAsync` S60-feature tự-ký-hộ ô-creator comment-canned) → anh Kiệt 6-decision (A1-bypass-subordinate+creator-ký-tay
no-finalize-guard-theo-quyền
EDGE-5-hard-lock
1-nút
opinion-history
phiếu-mới-only) → close-review `wf_7df56b89` GO-WITH-ADJ (🔴 L2-catch: EDGE-5-guard phải ĐỈNH-METHOD chặn admin-override :290 spec bỏ sót
A1 MỞ CEO-skip MỚI qua finalize-flag) → oQ reconcile (finalize-theo-quyền accept + EDGE-5 `!isAdmin&&!isSystem` admin-exempt "Admin đầy-đủ-nhất") → BE (A1 `minOwn`+pointer-stop
EDGE-5-guard-top-TransitionAsync
history log-cũ→PurchaseEvaluationChangelog trước-overwrite) + test 4-update→A1 + 8-new (happy/non-contiguous/EDGE-5-nonadmin-throw+admin+system-pass/history) → reviewer GO 0-must-fix. **Deploy Run #496:** bundle admin `BVyH-FY7`→`Cixlt_MA` (+CSS `Bbtesa6B`→`Ds-E5neu`) / user `EDsZebvn`→`BhBOG1dn` (+CSS) rotate ×2 ship-proof
Mig 63 prod 2/2-col sys.tables=89
smoke health/admin/eoffice + PE-endpoint 200 + import-route preview-415/confirm-401-live(bogus-404 control)
**458 test** (45D+413I). ⚠️ **#53-garble ×3** (invest S103-analog + reviewer + cicd Opus-lane) → SendMessage-resume + em-main byte-verify-token/curl-prod recover (KHÔNG tin verdict garble). **UAT heads-up anh Kiệt:** A1 bỏ auto-terminal-on-submit — phiếu 1-bước creator-là-cấp-cuối nay cần bấm Duyệt (đúng "bám-quy-trình", KHÔNG lỗi). **Defer follow-up (non-blocking):** FE-Import-guard `Suppliers/Create`→`Admin,CatalogManager` role-gate 2-app
2 stale-comment (best-guess→baked)
test-NormalizeJoin +FormC. State: **Mig 63
89 bảng
458 test
gotcha 79
menu 54
bundle admin `Cixlt_MA`/user `BhBOG1dn` (Run #496)
prod 21 NCC/17 user.** → log `2026-07-12-S112-supplier-import-pe-signoff.md`)
**Prev S111** (S111 — **Adopt H22 WAL session-continuity — governance/tooling-only 0 prod-code src, em-main-led + 7 spawn (2 monitor ×2-lượt SendMessage-resume + invest/reviewer Fable per-invocation **0-garble 2/2** + cicd) + WF `wf_5ba3daf6-fe0` 3-worker-Opus **RUN-TRACE (dogfood sàn mới ngay)**, HMW-ON, 3 commit pushed (`318a271`+`8aa3869`+closeout).** Bootstrap ALL-GREEN: 440 ✓
detector 39-benign 0-HIGH
spec-audit 0-GAP
RAG **2438** rerank-OK (Qdrant transient tự-hồi ~30s)
H1 PASS_WITH_FLAGS (FLAG-1 `STATUS:39` mark-proposal stale → flip done) + H2 ALL-CLEAN (0/15 orphan
2 gist FROZEN
2 monitor diary **self-compact hook-directed md5-verified** harvest 22.2→16.3K + tooling 18.4→16.9K — 2/4 L1-compact treo S110 TỰ GIẢI)
✅ Fable **streak-5** S107F→S111F. **Pipeline H21-chuẩn:** `/check-email` 1-new (notify+broadcast H22, hash **4/4**) → invest-**Fable** READY_WITH_NUANCES **14N** (N2 mô-tả-vs-luật 0-mark-cấm-hook
N3 AS-6-không-tăng
N9 per-TURN≠per-TASK) → spec lead-**3-chỉnh** (⭐ hook **PS1 path-independent** — PATH **3-context ngược nhau**: PS-primary→WSL-HỎNG system32
cmd→Git-Bash
PS-from-bash→usr/bin; bash-hook rơi WSL = chết-mọi-lượt + fail-open CHE) → WF 3-Opus 3/3 ~322K → reviewer-**Fable PASS_WITH_FIXES** (0C·**1M**·7m — M1 lớp nâng-nấc-quên-sync-câu-cũ CÙNG-file; fault-inject cây-tạm 2-ca bịt nhánh-0-delta; refutation 2-claim × 3-hướng đều ĐỨNG) → **8/8 fix** (+**detector C5 WAL-guardrail** răng-thật [OK] 17/40). ⚡ **Stop-hook HOT-RELOAD FIRE ×2 CÙNG PHIÊN** (`12071c5` 11:05:39 — **7 giây** sau ps1 sinh, GIỮA cửa-sổ worker + `67be443` 11:17 reviewer **chứng kiến SỐNG** giữa review; forensics NTFS-CreationTime×commit-time; N.3 STAGED→**VERIFIED-RUNTIME**; ENV-DEPENDENT data-point **#2/#3** lớp registry-hot-reload — #3 = chính §5.0/§6.4 session-end THỰC THI lần đầu ngay phiên sinh nó) + **squash §5.0 dogfood-THẬT K=2** (reset-soft về ==origin/main, 0-rewrite-đã-push, flow khớp 100% dry-simulate reviewer) + `/pause`·`/tiep` skill-registry hot-reload đăng-ký giữa phiên. **Artifacts:** `.claude/WAL.md` + `wal-flush.ps1` + `settings.json` (file ĐẦU TIÊN repo) + 2 command + BƯỚC 0.7/§5.0/§6.4 + **FLIP-policy run-trace ≥3-task/>5'** (hmw.js+README) + engine **PHẦN N** + rules §5.2 `wal:`-exception + CLAUDE.md `/tiep`-pointer + runs/README taskList-snapshot. **Anh-directed ×2:** mark MỚI **`RC-pqhuy1987-12-07-2026-11-43-45`** (H22 — **Active-High thứ 6**, additive) + **D10** deploy.yml +2 paths-ignore → 🔴 **AS-6 taxonomy ĐỔI từ Run #495: `.claude/agent-memory/**`+`runs/**` đổi HẾT trigger CI** (pattern #490/#492 chết). Outward: adap-report + email **`9cdcda2f3c83`** selftest-MATCH + STAGE-2 ×2 processed. 🟩 cicd **Run #495 PASS 5m11s** (bundle **FROZEN ×6** `BVyH-FY7`/`EDsZebvn` LM-in-window 11:49/11:50 ship-proof
Mig 62/89 frozen
smoke 3×200
**deploy.yml self-change D10 hợp-lệ** — run parse+chạy trọn bằng chính file mới
diary tự-curate 20.5→17.04K). State GIỮ NGUYÊN: **Mig 62
89 bảng
440 test
gotcha 79
menu 54
Sub-agents 12**. 🎯 **Pilot NEXT-anh:** phiên-mới verify hook-fire re-check
kill-giữa-chain→`/tiep`
đổi-acc
pause-roundtrip 1 workflow THẬT. → log `2026-07-12-S111-h22-wal-adopt.md`)
**Prev S110** (S110 — **Adopt H21 engine-đắt PER-INVOCATION + spec-file kết-tinh + model-tier-v3 lead owner-choice — governance/docs-only 0 prod-code, em-main-led + 2 monitor ×2-lượt + invest/reviewer Fable per-invocation + WF 3-worker-Opus + cicd ×2, HMW-ON, 6 commit pushed.** Bootstrap: 440 re-verified
detector 39-benign 0-HIGH
spec-audit 0-GAP
RAG 2437
H1 ALL-PASS (correction: 2 file dirty = diary lượt-SÁNG S110 transcript-lost lần-2-liên-tiếp WATCH → `162f0b9`) + H2 CLEAN (orphan 0/14
2 gist S109 byte-exact)
✅ Fable streak-4 S107F→**S110F**. **`/check-email` 4 msg hash 4/4 MATCH:** triage-reply (S5 hot-reload **ENV-DEPENDENT** — hub NGƯỢC kết quả → caveat 3 chỗ; S6 #53-mitigation ACCEPT) + notify + 🔴 **H21** (① spec-file 3-mục mỗi run engine-đắt: engine propose → lead verify → LEAD ghi → worker theo spec
② owner-gõ-kèm-vai, BỎ marker + BỎ 2-vai-cố-định) + **MTv3** (lead = frontier-class owner-choice per-session {Fable|Opus 4.8 1M MAX}
owner-chọn ≠ outage 0-caveat/0-revert
1-line-ask sau outage
A1/A2). **Adopt đúng lệnh anh** ("/fable-real inves và review + hmw Opus"): invest-**Fable** PASS (7 nuance + 15 cụm + 12-persona-SẠCH + hmw.js:38 xung-đột-MTv3 surprise) → lead ghi **spec-file dogfood run-1** `runs/2026-07-11-h21-mtv3-adopt/` → WF **`wf_0c3b307f-a64`** 3-worker-Opus 3/3-DONE (commands redesign + engine **§K.E mới** + runbook ~30 point-edit) → reviewer-**Fable PASS_WITH_FIXES** (0C·5M·9m: M1 worker-đổi-fact "12 vai"
**M2 boundary-gap lệnh-B × 2 monitor**
M3 ~16 cụm un-🧊 sweep-token-mù-semantics
M4 two-tier-stale
M5 filename) → fix trọn, grep-suite SẠCH. ⚠️ **#53-garble ×2 CHÍNH 2 lane Fable** → **SendMessage-resume recover 3/3 lifetime**. **Anh-directed ×2:** mark MỚI **`RC-pqhuy1987-11-07-2026-20-42-01`** (H21+MTv3 Active-High; row H19 → 📦 SUPERSEDED-partial) + **VALID_ROLES 10→12** (+2 monitor, M2 RESOLVED cùng phiên, node-check PASS, sweep 10 consumer). Outward: email `01d9096e` selftest-MATCH + 2 adap-report + 3 supersede-note + STAGE-2 ×4. 🟩 cicd **Run #493 PASS** 5m24s (bundle FROZEN ×4 ship-proof LM-in-window; trigger AS-6 hmw.js đúng #41) + **spot-check (i) TƯƠI bắt Run #494** (trigger `ac3f122`) → verify lượt 2. Closeout: archive-gate 12/12 under-cap 0-strike + A7 233/233
marker `.claude/fable-real-mode.on` ĐÃ XÓA. State GIỮ NGUYÊN: **Mig 62
89 bảng
440 test
gotcha 79
menu 54
Sub-agents 12**. ⚠️ **Restart CLI** (4 command .md đổi semantics — engine-đắt từ nay = `/fable-real|/fable-clone <vai> <đề-bài>`). → log `2026-07-11-S110-h21-mtv3-adopt.md`)
**Prev S109** (S109 — **Sleep-recovery P1 RESUME→DONE (scope-truth 16→2) + bootstrap all-green — memory/docs-only 0 prod-code, em-main-led + 5 spawn (2 monitor RE-REPORT + H2-propose + reviewer-Fidelity + cicd-AS6), HMW-ON + fable-real-ON.** Bootstrap: **440 re-verified**
detector 36-benign 0-HIGH
spec-audit 0-GAP
reinject trống
RAG **2436** rerank-OK
marks 5 AH
monthly n/a (next 08-01)
✅ Fable giữ (S107F→S108F→**S109F**, lead+spawns self-report ×6, 0 flip)
H1 **ALL-PASS 4-mặt** (resume-point nhất-quán 3-nguồn; tooling self-compact 17.2→14.8K md5) + H2 **ALL-CLEAN** (0 mồ-côi post-S108
orphan 0/14
disk==resume-point MATCH; harvest self-compact 20.2→16.7K md5). **Sleep-recovery P1 (`f5a5c3e`):** Phase-0 re-verify bắt **14/16 file scope-pause ĐÃ covered** bởi `2026-05.gist.md` gộp-kỳ S70 `f36aab8` (header `source-verbatim` + git-date proof 14/14 verbatim unchanged-since-gist; phiên-pause match gist theo TÊN-file 1:1 nên tưởng chưa-nén) → SKIP đúng guard Phase-0.2 "tránh nén lại"; scope thật = 2 file gen-0 (tooling 2026-06 16.4K + harvest 2026-06 17.1K) → pipeline Cách-B trọn vai: ⬜ H2 PROPOSE-ONLY sạch (cluster 5-cụm + inventory 5-lớp + 3 flag tự-bắt-lỗi giữ nguyên) → lead distill 2 gist `distill-gen:1` 5-entry 4-field + N/A-note (6,141/6,544B; ratio 2.66×/2.61× báo-cáo) → coverage-diff PASS + pointer 10/10 grep-unique + G-009 0-mojibake → 🟥 reviewer **Fidelity Fable-real single-deep-pass PASS_WITH_FIXES 3-fix applied** (**14-entry count-từ-disk** [em+proposal đều đếm sai 15]
**+8.9KB** arithmetic
**ERD-debt §16+ CÒN-pending** N/A-fact-claim) + 2 minor; **meta-lesson: gist-metadata-count + số-TỰ-TÍNH + N/A-fact-claim = 3 bề-mặt lỗi NGOÀI body mà coverage-diff máy-móc MÙ** → `last_sleep_at = 2026-07-10`. Verbatim FROZEN 0-touch (2 gist untracked-new
archive 2026-07 pure-append +N−0). 🔸 Option anh: 14-file per-quý re-distill = ép-đè-guard `distill-gen:2`, gõ đích-danh — mặc-định KHÔNG. Closeout: **§L.a 1 AS-6 hit** (`f5a5c3e` chứa `memory-budget.json` `.json` NGOÀI paths-ignore → CI **Run #492 trigger** dù 0-code — path-filter INTACT; 🟩 cicd **PASS 5m21s**: bundle **FROZEN-streak ×3** #490→#492 `BVyH-FY7`/`EDsZebvn` [LM-in-window + real-size 1.64/1.55MB ship-proof — dòng bundle :27 VẪN ĐÚNG khỏi hoist]
Mig 62/89 frozen
smoke 3/3
AS-6-reasoning CONFIRMED pattern lặp #490 cùng budget.json; 12 AS còn lại sạch, 3 sub diary-write = normal-spawn mandate verified-keep)
archive-gate **12/12 under-cap 0-strike** (lần đầu toàn-roster sạch; +reviewer curate 22.4→17.4K) + **A7 GATE 233/233 pointer**
spot-check TƯƠI 4/4
guard #53-recover HELD 0-garble 6/6 (streak S107→S109)
user-memory +`feedback_resume_premise_reverify` (32)
forensic `/usr/bin/bash` inv-cb gist:43 = quoted-lesson G-009 KHÔNG corruption. State GIỮ NGUYÊN: **Mig 62
89 bảng
440 test
gotcha 79
menu 54
Sub-agents 12**. → log `2026-07-10-S109-sleep-recovery-p1-resume.md`)
**Prev S108** (S108 — **Fable-real FIRST-REAL-RUN (H19 dogfood — đóng honest-note §K:334 "chưa chạy thật lần nào") + runbook 60KB + email-chain AI_INFRA — governance/docs-only 0 prod-code, em-main-led + 4-worker-Opus + 2-judge-Fable + cicd, HMW-ON + fable-real-ON.** **Email-chain:** check-email **0-new** (9/9 ≤07-04 processed)
adap-apply n/a
**adap-request MỚI `2026-07-10-se-registry-hot-reload-new-agent`** (S27-lesson thu hẹp, đề nghị AI_INFRA verify n=2 + broadcast fleet)
adap-report n/a-no-new
**send-email `8d14405f` selftest-6c-MATCH** (6 mục: roster-12
hot-reload
#53 data-point
first-real-run
runtime-note). **Runbook `docs/governance/fable-real-runbook.md` 60KB** (anh yêu cầu "hàm/biến/checklist → file"): §1 dùng-nhanh
§2 wiring 12-biến + 3-GAP-rule + decision-matrix
§3 lane-invest (8-biến + spawn-template + 12-checklist)
§4 lane-reviewer (6-cat + 2-trục boundary)
§5 PRE/PER/POST-RUN + **AC 8-tiêu-chí** + dogfood-form + 8 anti-pattern. Draft **4-worker-Opus tier-2** (`wf_2f85b3f6-3dc` 4/4-done 0-empty ~514K tok; 2 bẫy Workflow-tool tự-fix: **args-đến-script-dạng-STRING → parse-guard** + **`tier:` = hmw-convention → generic dùng `model:'opus'`**) → em-main assemble + 6 stale-fix. **First-real-run:** `/fable-real` marker ON (check-ignore ✓ :92) → **2 judge SINGLE-FABLE song song 2-đầu-khác-trục** theo chính template runbook: 🟦 invest **PARTIAL 103/111 cite-exact** (~111 anchor
**bắt trúng bẫy-honesty** [email "đã sửa hmw.js:31" khi disk chưa sửa]
7 off-by-1/2 quanh code-fence
1 **meta-drift 2-tầng** [drift-note tự-stale vì engine vá song song])
🟥 reviewer **FAIL Smart-Friend** (1 CRITICAL email-fact + 4 MAJOR [nặng nhất: clone-example thiếu `tier:'opus'` = leak N×Fable trái K.D floor-2 khi Fable UP] + 6 minor; 7 refutation 5-đứng; core JSON-shape/biến/checklist/GAP-guard **SOUND**) → em-main **37/37 fix** + vá `hmw.js:31` comment per-session-probe THẬT + engine §K.C:328 9→10-vai / §K:334 designed+**dogfooded** / K.D:332 S108-note (H20 đủ-tầng) + dogfood-form điền → **AC 8/8**
harvest 2-entry on-behalf **`[engine: fable-real-single
Fable-S108]`** (GAP-2/3 stamp lần đầu áp thật). **cicd Run #491 PASS** 5m06s (`69957fd` hmw.js trigger
bundle **FROZEN** `BVyH-FY7`/`EDsZebvn` — **#69 frozen-streak ×2** #490→#491 sau rotate-#489, LM-in-window + real-size = ship-signal duy nhất
**path-filter verified 2-chiều** `f1af05c` .md-only 0-run). **0-garble 7/7** (4 worker schema-NHỎ + 2 judge VERDICT-header + cicd — mitigation streak). Closeout: §L.a 0-AS-hit
spot-check 4/4 (sha-recompute `8d14405f0f5ae7ed` khớp
bundle-curl FROZEN
runbook 9×tier-opus + 0-stale-claim
engine-10-vai)
A7 228/228
sleep 8d INFORM-×3
marks 5 Active-High n-a-mới. 3 commit `69957fd`/`f1af05c`/`5d13b48` + closeout. State GIỮ NGUYÊN: **Mig 62
89 bảng
440 test
gotcha 79
menu 54
Sub-agents 12**. 🔴 **Marker fable-real VẪN ON** (anh gõ `/fable-clone` khi muốn về ảo — em KHÔNG tự toggle, AP-4). *(🧊 H21 S110: marker RETIRED — engine-đắt = per-invocation `/fable-real|/fable-clone <vai> <đề-bài>`.)* → log `2026-07-10-S108-fable-real-first-run-runbook.md`)
**Prev S107** (S107 — **+office-document 12th sub (anh giao "Sub chính" Office) VERIFIED-RUNTIME cùng-phiên + reconcile S106-leftover — governance/docs-only 0 prod-code, em-main-led + 4 spawn (2 monitor ×2-lượt SendMessage-resume + cicd + office-document).** Bootstrap all-green: **440 re-verified**
detector 36-benign 0-HIGH
spec-audit 0-GAP
A7 226/226
RAG 2434 rerank-OK
✅ **Fable VỀ lần 4** (flip-8 S106-Opus→S107-Fable, self-report ×5)
2 monitor RE-REPORT ALL-PASS/ALL-CLEAN (H1 verify S106 self-compact **md5 3/3 moved-not-cut** + 2 flag-S106 closed
H2 Fidelity byte-level PASS + orphan 0/14). **Reconcile `1eea51b`:** commit S106 leftover 7-file (gộp flip-chain 1-owner §Sub-agents per anh-confirm + tooling self-compact) + flip-8 canonical + ERD-range →62 ×2. **+office-document `21387cd`:** agent **OD1–OD10** (skill-first
fidelity-template-100%
extract-không-bịa
round-trip-verify
file-mới-không-đè-gốc
boundary ⟂ implementer-backend code-engine) + skill nạp **docx·xlsx·pptx·pdf + form-engine** + MEMORY seed + wire 14-file (roster 11→**12**
VALID_ROLES hmw.js 9→**10**) → **cicd Run #489 PASS** ~5m33s (bundle rotate benign #69 admin `ChSNAJBK`→`BVyH-FY7`/user `Bn2w1znH`→`EDsZebvn` CSS-frozen
Mig 62/89 frozen
smoke 200×3
path-filter 12/14-ignore 2-trigger đúng #41). **Spawn-test `86a34d5`: VERIFIED-RUNTIME CÙNG PHIÊN** — registry **HOT-RELOAD agent MỚI giữa phiên** (S27 lesson THU HẸP còn EDIT-agent/command; user-memory harness4 corrected) + PASS OD1/OD4/OD5 template thật (FO-002.05 249-para/10-table
FO-002.07 3-sheet
round-trip 37KB VN-dấu 3/3
**finding: 2 template `wwwroot/templates` 0-placeholder `{{field}}` — mẫu blank "…………..", mapping ở render-engine hoặc chưa placeholder-hóa → câu hỏi mở khi đụng form-engine**). **Closeout:** §L.a 0-AS-hit
guard **#53-recover HELD 5/5 spawn return-verdict-sạch 0-garble** (RETURN-FORMAT + narrow-prompt mitigation ăn — phiên sạch đầu tiên sau chuỗi ×11)
spot-check H18-D(a) **3/3 PASS** (bundle TƯƠI curl khớp `BVyH-FY7`/`EDsZebvn`
`{{`-grep độc-lập 0-hit
alias-map 3-fork verified; +1 false-alarm CWD-drift tự-giải — lesson cd-in-compound spot-check)
archive-gate 0-over-cap
budget.json **full re-measure S107** (supersede S98; harvest 18.1K>17.1K self-target + cicd L1 20.2K → compact-candidates phiên sau)
sleep 8d≥7 INFORM chờ anh
marks 5 Active-High n-a-mới. State: **Mig 62
89 bảng
440 test
gotcha 79
menu 54
Sub-agents 12**
bundle admin `BVyH-FY7`/user `EDsZebvn` (Run #489). → log `2026-07-10-S107-office-document-12th-sub.md`)
**Prev S105** (S105 — **Bootstrap all-green + BVAAU cross-repo assist (favicon + auth-RCA) + closeout eval-all — docs/memory-only 0 prod-code SE, em-main-led + 3 spawn (2 monitor + investigator).** Session-start: test **440 re-verified**
detector **36-benign 0-HIGH** (S104-reconcile sạch, canonical==disk)
2 monitor RE-REPORT: **H2 CLEAN + tự-bắt mồ-côi record H2-S104 của CHÍNH NÓ** (self-record blind-spot gate-agent → em-main retro-append 2 entry)
**H1 PASS 4-mặt** (#53-garble lần-6 → recover-from-diary) + 2 flag → em-main vá **4 derived-flush**: `skills/README:20` Mig 62/S104 + `agents/README:3` + `session-start:37` flip-chain +S104-O/S105-F + `session-end:113` trailer→Fable 5
✅ **Fable VỀ lần 3** (flip-6: S102F→S103O→S104O→**S105F**; lead + 2 monitor self-report `claude-fable-5` ×3 = runtime-verified)
sleep 5d<7 skip
RAG 2433
marks 5 Active-High. **BVAAU cross-repo (anh gửi, repo BENHVIEN_A_AU — chỉ đụng 1 file disjoint, session BVAAU kia đang live):** favicon Home placeholder-teal-cross → **brand thật** (trắng + vũ công navy `#00249b` + pip nhà vàng `#f9ca17`, hệ per-app S81) commit `0cc815b` pushed (**prod-verify pending CI** lúc đóng còn teal)
**investigator deep-pass RCA 3-Q** (⚠️ **#53-garble lần-7** ở reasoning-lane → **recover-path MỚI: SendMessage-resume** khi diary trống → verdict đầy đủ lần 2): **Q1** Home Google "đá-ra-ngoài" = **FE mù session** — bundle cũ gọi relative `/api` trên site TĨNH → `/api/auth/me` 404 → anonymous vĩnh viễn, hub-side OK hết (7 nghi vấn a-g đều KHÔNG; cookie `.benhvienaau.com` set đúng) — fix API_BASE-absolute = `51c69fb` bởi CHÍNH session BVAAU cùng-lúc → em-main **byte-verify prod LIVE** (bundle mới Home `CtTKjYz2` + CRM1 `Cr8wJMpn` marker PRESENT, config zalo:true)
**Q2** CRM1 trước hở 2 tầng (FE soft-gate + API `enforceCrmGate:false` — data thật lộ anonymous); FE-redirect-home live 51c69fb; **kín API = flip `AUTH_ENFORCE_CRM_GATE=true` CHỜ ANH quyết** (đề nghị: bật sau UAT login ổn)
**Q3** "User_ID" Zalo KHÔNG có trong UI 3 app (duyệt = StaffCode+Note; `ProviderUserId` backend = identity-map GIỮ) — trường anh Mỹ thấy khả năng ngoài repo. `/fable-real` anh gõ nhầm → hủy, 0 marker. **eval-all closeout:** MFE **FIT PASS** (denom 30 item, 1.1% cap worst-case; SUB coverage 85-100% đo-thật; age-band 0) + archive-gate **A7 226/226** 0-over-cap + spec-audit **0-GAP** + reinject-ledger trống + **§L.a 0-AS-hit** + guard #53-recover **HELD 2/2**. State GIỮ NGUYÊN: **Mig 62
89 bảng
440 test
gotcha 79
menu 54**. → log `2026-07-07-S105-bootstrap-bvaau-auth-favicon.md`)
**Prev S104** (S104 — **Session-start audit bắt Mig 62 docs-lag → reconcile (docs/memory-only 0 prod-code, em-main-led + 2 monitor).** Cùng-ngày commit `778fc98` `[CLAUDE] Supplier: Mig 62 expand 30-field` (16:06, Opus) ship BE+FE 2-app+Mig 62+deploy Run #488 NHƯNG bỏ closeout docs → STATUS/HANDOFF kẹt "Mig 61/S103". S104 session-start: governance-detectors bắt **1 HIGH** (`STATUS Mig=61 nhưng disk=62`) + 2 monitor RE-REPORT (**H1** 4-mặt PASS [skill/roster/plugin unchanged] + patch-list D1-D4
**H2** 5-trục CLEAN — investigator-harvest-in-HEAD verified **moved-not-cut** [khác vụ cut S102] + 3 cicd file uncommitted **commit-worthy** Run #488 bundle admin `ChSNAJBK`/user `Bn2w1znH` #69-meaningful) + `dotnet test` **440 PASS re-verified** (#65 no-bite dù Mig 62 đổi chữ ký `Create/UpdateSupplierCommand`). **Reconcile:** STATUS Mig 61→62 + mega-line + Sub-agents S104-Opus + In-Progress S104 + Supplier-backlog Phase-A-shipped + HANDOFF + ef-core SKILL row Mig 62 + commit 3 cicd memory (Run #488). Mig 62 = **Supplier 9→27 field** (18 AddColumn nullable) + `SupplierType +CaHai=6` + enum `SupplierStatus` + seed 4 NCC 30-field + FE 2-app SHA-mirror (form 4-section + Status select + component `PathLink` 3 NAS-link tách từ PE HoSoLink) — **no new table (89)**, reversible Down, test-after-UAT (Phase B Excel-auto-map defer). ⚠️ runtime S104=Opus (Fable outage flip-5: S98→S101-Opus→S102-Fable→S103-Opus→**S104-Opus**). State: **Mig 62
89 bảng
440 test
gotcha 79
menu 54**. → log `2026-07-06-S104-mig62-supplier-reconcile.md`)
**Prev S103** (S103 — **AI_INFRA 6-broadcast adap (crystallized-backfill + Harness-20 + memory-hygiene mapping) + session-start audit — governance/scripts-only 0 prod-code, em-main-led + 2 workflow HMW-ON.** Session-start: test **440 re-verified** (0 code-delta)
2 monitor RE-REPORT (H1 ①②③ PASS + 1 LOW model-note-S103
H2 ALL-CLEAN 0-orphan/0-byte)
governance-detectors 35→36 (benign +1 wikilink) 0-CRITICAL
memory-selfimprove A1-A3/B1-B2 0-GAP
reinject-ledger trống
RAG 2431
⚠️ **runtime S103 = Opus** (Fable outage lại — lead+spawn self-report `claude-opus-4-8`, `~/.claude/settings.json:11` vẫn pin fable → H5-fallback revert-free; per-session flip **S98-Fable→S101-Opus→S102-Fable→S103-Opus**, đúng lý-do BƯỚC 0.6 probe mỗi phiên). **Adap (`/check-email` 3 new pulled whole-file+body verified → `/adap-apply` hash MATCH cả 6):** (1) **Harness-20 fix-all-structure** engine §L + dogfood model-note 4-tầng-sweep (README:3-PERSONA/session-start:37/session-end:113 Fable→Opus + §G.5 220K→380K neo-supersede, history-saga giữ) + **2-đầu-catch** review bắt 2 DẪN-XUẤT stale-trailer `rules:220`/`guides:428` sweep-sót→fixed (14 session-log SNAPSHOT giữ). (2) **F4 crystallized-backfill** = NEW `scripts/crystallized-backfill.ps1` (measure-then-fill DRY, **default target=0=OFF owner-authority**, calibrated-range [bytes/4..bytes/3.0], precondition target>0∧headroom>0, **file-floor=UPPER-BOUND honest** peak~368K) + `budget.json:crystallized_backfill` + budget-table wire §2.1.6/§L.b(c). (3) **F1/F3 already-met** (0 hardcoded-violation toàn-kho persona-clean; BƯỚC 0.6 bắt S103=Opus real-metadata). (4) **session-cmd budget-table (Up1) + run-loop 2-tầng (Up2 largely-already-met §L.b(c))**. (5) **H16 no-key Applied%** = `scripts/applied-eval-nokey.ps1` (adversarial-gate fail-closed 3-ca + fault-inject FLIP bắt real-bug `$script:`-scope; **mechanism-built numbers-DEFERRED**). (6) **memory-hygiene A/B/C** already-met (archive-gate DRY-RUN sidesteps-grep-trap + governance-detectors 4-layer 1:1; **C n/a JS-sandbox no-CLI-launcher**). (7) **consolidation** reference-ack (crystallization≠backfill absorbed). engine **§L + §M** codify. **2-workflow:** WF1 implement `wf_55ef6778-a0d` (3 lane schema-CLEAN, 2 script selftest exit-0 + fault-inject teeth + Lane-C verify) + WF2 review `wf_3c5c37cb-aa2` fable-clone (**Lane-C PASS returned + Lane-B recover-from-memory PASS**, 0-BLOCKING 2-CONCERN-addressed; ⚠️ **#53 garble ×3** [investigator recon + 2 review-lane] → em-main recover, **investigator AS-10 garble-curation REVERTED** git-backstop). **6 adap-report + 1 adap-request** (`2026-07-06-se-53-garble-reasoning-lanes-mitigation` — evidenced build-3/3-clean vs review-1/3 → N-lane-redundancy+narrow-schema+em-main-recover mitigation) + send-email `fc1e22ac` selftest-MATCH + STAGE-2 move 3-inbox. State GIỮ NGUYÊN: **Mig 61
89 bảng
440 test
gotcha 79
menu 54**. ⚠️ restart CLI (session-start/end + agents/README đổi). → log `2026-07-06-S103-crystallized-backfill-harness-20-adopt.md`)
**Prev S101** (S101 — **H18 WF2 review closeout + session-start audit — governance/docs-only 0 prod-code, em-main-led + 1 review-workflow HMW-ON.** Session-start: test 440 baseline (0 code-delta S98→S100)
2 monitor RE-REPORT ALL-PASS/CLEAN (tooling 4-mặt fresh + **MODEL-DRIFT bắt: runtime=Opus 4.8 KHÔNG Fable dù `settings.json:11` pin `claude-fable-5[1m]` → H5-fallback tự-kích S101, Fable unavailable phiên này, revert-free KHÔNG sửa frontmatter**; harvest 0-orphan/0-byte-0/11/0-corruption + cicd #486 dirty-delta fidelity-verified→commit)
governance-detectors 35 flag 0-CRITICAL (3 MED vocab-fork known-alias-mapped S96)
memory-selfimprove A1-A3/B1-B2 ALL-PASS 0-GAP
reinject-ledger CG-1 trống
sleep-check 1-ngày<7 skip
RAG 2431 alive. **H18 WF2 closeout (NEXT-em #1 từ S100):** WF2 gốc `wf_31ea3985-92c` MẤT theo CLI-restart (TaskList empty
mode-A no-run-folder) → đúng report-before-stamp KHÔNG bịa PASS → **re-run fresh 3-lane `wf_955643c3-f7d` → PASS_WITH_CONCERNS 0-BLOCKING:** Lane-A detector-teeth **PASS** (fault-inject 4/4 tái-dựng ĐỘC-LẬP `-RepoRoot` temp-tree: 68-gotcha→MED
79-đúng→IM
6-test→LOW
88-bảng→MED [od-c verify byte `0xE1 0xBA 0xA3`='ả' khớp `$VN_BANG`]; MED derived-stale real-repo 11→0; refute 3-trục đều FAIL)
Lane-B ledger-retire **PWC** (0/15 lifetime byte-exact reversible `sed 3,4d`==parent
6/6 consumer 🧊-repointed
history preserved; **1 CONCERN = `workflows/README.md:51` nhãn-cũ "ledger orphan-scan" sweep-S100-SÓT [grep-exact `_ledger` không match] → FIXED S101** + 2 NIT)
Lane-C codify+frontier+containment **PARTIAL** (codify-khớp-2-report + n-a-legit-H8-S66 + containment-0-residual first-hand ✓; frontier-hash `b8d2a846`≠`8b6a8354` + reviewer_gate-missing dựa **record-S100** do **broadcast inbound VẮNG khỏi repo** [inbox chỉ tới 06-20-H15v2] → process-gap ghi backlog; HELD=an-toàn dù không tái-kiểm). ⚠️ **Lane-C #53-return-garble tái-diễn lần-5** (`subagent completed without calling StructuredOutput`) → em-main recover first-hand KHÔNG re-spawn (`feedback_agent_return_garble_recover`). Stamp run-id+verdict → adap-report:5 + engine §J:283; model-note reconcile STATUS:24 + agents/README:3. State GIỮ NGUYÊN: **Mig 61
89 bảng
440 test
gotcha 79
menu 54**. **PART 2 — `/check-email AI_INFRA` + `/adap-apply` (anh-directed):** directed ack `batch13` pull+verify (whole-file + body-hash `72aaeee` MATCH) → AI_INFRA **ack trọn 13 báo cáo SE** (bắt-kịp H-17; deep-reverify H-17="mạnh nhất fleet"; Fable-restore H-8 runtime-verified S98 ghi-nhận); **re-stamp H10** body-hash lỗi-phương-pháp `5f511fe5`→`5f8b8504` (no-strip→canonical) + **frontier flag#2 RESOLVED** (AI_INFRA xác-nhận lỗi-stamp-của-họ → re-stamp `8b6a8354`=đúng-SE-computed, SE HELD đúng). **4 broadcast 07-03 adap (hash-MATCH + reviewer_gate PASS — format-regression H18 fixed):** model-tier **12/12** (SE all-inherit form-valid per autonomy; v2-pin-simple KHÔNG mandate→SE giữ all-inherit; C3 `[1m]`=0 frontmatter-scoped) + Q1/Q2-documented + selftest-stamp→send-email
**H19 fable-clone FORMAL ADOPT + RC-stamp `RC-pqhuy1987-03-07-2026-17-46-35`** (anh chọn "Formal adopt" + "full 2-workflow": WF1 `wf_5f308fd8-744` SOUND_WITH_CONCERNS [3 floor-fidelity gap; lost-to-interruption→resume-cached] + WF2 `wf_ed5b972f-a4d` PASS_WITH_CONCERNS 0-BLOCKING): 2 command `/fable-real`+`/fable-clone` thật/ảo-toggle (semantic-inverse marker-vắng=ảo-DEFAULT) + marker `.claude/fable-real-mode.on` gitignored + engine **§K** (K.A-K.D + 3 gap) + session-start **BƯỚC 0.5b reader** (WF2-Lane-A-fix marker-write-only) + 4 adap-report. Mapping reviewer+investigator-codebase. Honest **VACUOUSLY-MET-SE-today** (all-inherit→2 vị-trí đã top-model→0 runtime-delta; value=future-proof-floor + anti-consensus-catch KHÔNG cost; nấc designed+will-dogfood). ⚠️ **GAP-3 AS-10 fired LIVE** (WF2 lanes tự-ghi reviewer-memory dù RETURN-only → harness-sanctioned KEPT → dogfood-validate §K.C "convention-KHÔNG-mechanism" ngay trong review chính bản codify). +2 command
RC-mark 4 Active-High
engine §K. → log `2026-07-03-S101-h18-wf2-closeout.md` + `2026-07-03-S101-h19-fable-clone-adopt.md`)
**Prev S100** (S100 — **Harness-18 adopt (kiện-toàn kiến-trúc 4 khuôn-mẫu additive) + frontier-assessment HELD-integrity — governance/scripts-only 0 prod-code, em-main-led + 2 workflow HMW-ON.** `/check-email AI_INFRA` 0 directed mới → `/adap-apply` 3 broadcast: **(1) hash-verify** H18+checklist MATCH ✓
**frontier `content_sha256` MISMATCH** (4 biến-thể canonical đều lệch, 2 file kia match → body lệch stamp) → **HELD-integrity** không codify + đề nghị AI_INFRA re-stamp; ⚠️ cả 3 thiếu field `reviewer_gate` (24 broadcast cũ đều có) → flag format-regression. **(2) J.A detector v2** (`governance-detectors.ps1`): ratio-band mismatch-only (0.5–2.0=MED stale-total, xa=LOW module-local — sửa lớp FP `|diff|≥10` NGƯỢC, S98 8/8 MED đều FP) + scan-range **glob động** ALL SKILL.md + ALL commands/*.md (vá lớp-mù "(68)" sống 11 phiên) — **fault-inject 4/4 PASS** (`-RepoRoot` temp: stale-MED/đúng-IM/local-LOW/anti-Goodhart-MED) + real-repo MED derived-stale 11→0. **(3) J.B retire `runs/_ledger.md` two-beat:** đo bắt-thật **0/15 lifetime** (đều open+close cùng-ngày 06-18) + mode-A coverage 0/8 S93+ + đính-chính "S71 `harvest/` rỗng" = criterion-wording KHÔNG phải incident (caveat-3 parity ghi honest) → freeze 🧊 1-dòng reversible + **sweep 15 điểm/8 file**; orphan-authority = folder-scan (`run.md` có mà `*-synthesis.md` vắng/0-byte). **(4) J.C bracket** 2/3 n-a-by-owner-mandate H8 + revisit-condition viết ra (C3 ĐẠT). **(5) J.D** D(a) spot-check-tươi wired `session-end §L.b(i)` (dogfood n=1) + D(b/c) REUSE reinject-ledger CG-1. **(6) Frontier self-audit (dù HELD, vô-hại):** cron monthly = **ghost-wire THẬT** (CronList runtime=0 + scheduler RỖNG 05-04 + S96 chạy 13:04 em-main) → **honest-retire 5 file** (audit = thủ-công em-main session đầu-tháng — function vẫn đúng hạn S44/S96, chỉ wiring-claim sai)
3 script đo GLOB-LIVE ✓ 0-hardcode
MAST=0
defer **D-1/D-2** đánh-số Maintenance backlog. **(7) Hygiene:** F2 SendMessage-note patch 2 command (runtime-verified KHẢ DỤNG lại) + B1-pointer "130 PASS"/cron-date + Co-Authored trailer → Fable. Checklist H18: **10/12 ĐẠT + 2/12 n-a-reasoned**. WF1 `wf_50a817ce-a69` 3-lane investigator (0-residual, chunk 2431==2431); **WF2 review `wf_31ea3985-92c` IN-FLIGHT lúc đóng** → session kế đọc verdict + điền run-id + email AI_INFRA. 3 adap-report committed. Đầu phiên: test **440 re-verified** + 2 monitor RE-REPORT ALL-PASS/ALL-CLEAN (`513aa09`). Dogfood frontier-method: tự-bắt 1 ca suýt-stamp run-id WF2-chưa-chạy → placeholder. State GIỮ NGUYÊN: Mig 61
89 bảng
440 test
gotcha 79. → log `2026-07-02-S100-harness-18-adopt.md`)
**Prev S98** (S98 — **Harness backlog batch ĐÓNG — docs/memory-only 0 prod code, 2 commit `4263d63`+`8a249c5` CI-skip.** ✅ Fable-restore gỡ caveat H5.6: settings `claude-fable-5[1m]` + spawn-test inherit ×2 monitor self-report `claude-fable-5` → H8 all-inherit runtime-verified, fallback-Opus H5 S62→S97 kết thúc
monthly pointer→2026-08-01
skill ef-core-migration +row Mig 60/61
re-tier mega-line S93/S94→`docs/_archive/STATUS-HANDOFF-tier-S98-2026-07-02.md`
3 orphan-append H2 (database-agent 4th+5th spawn S97
reviewer S97-bis addendum
implementer-frontend S97-Part2 hook)
cicd-monitor L1 curate 19.9→17.5KB + `memory-budget.json` re-measure fresh
sleep-compress implementer-frontend `2026-H1.gist.md` distill-gen:1
email AI_INFRA Fable-restore
ledger H10 mode-A note. Session-log skip (docs-batch). State GIỮ NGUYÊN: Mig 61
89 bảng
440 test
gotcha 79. *(Flip ✅ hồi-tố @S99-start — S98 đóng thiếu flip header/row, H1 F1 catch.)*)
**Prev S97** (S97 — **PE finalize 4-fix UAT anh Kiệt FDC (buổi live) — em-main-led, prod-verified Run #481+#482.** **(1)** badge cấp-sau-finalize `"không trình tới"`→**`"Kết thúc tại {finalizeLevelName}"`** (render-động → hiện "Kết thúc tại CCM"; fallback finalizeStepName/'cấp trên') + tooltip template-literal. **(2)** đảo default checkbox "Cấp này KẾT THÚC quy trình" **opt-out→opt-in** (`useState(true→false)` init + reset onSuccess + helper text reword + comment S96-"default checked"-drift fix) — mặc định TRÌNH TIẾP CEO, tick mới KẾT THÚC tại cấp. **FE-only mirror 2-app SHA-identical `PeWorkflowPanel.tsx` (`bcf812fd`), 0 BE/mig/test** (BE service `if(AllowApproverFinalize && applyLevelFinalize)` tôn trọng cờ FE; param default `true` giữ làm fallback caller non-FE, FE luôn POST tường minh). Workflow `wf_0e01fdba-209`: implementer-frontend (8 hunk 4×2, build×2 PASS) → reviewer (PASS 0-issue; verify comment-L121+handler-L664 giữ, logic non-break). Commit `1c8fb6a`. **cicd Run #481 PASS ~5m10s byte-level #77:** JS rotate admin `COYAX-yQ`→**`Cf0o8dx8`**/user `0MU-kb4N`→**`x8rppRAK`** (CSS frozen `Bbtesa6B`/`BmuPz_Dy` #69-REFINE logic-only; real-size 1.64/1.54MB anti-SPA-trap)
**NEW `Kết thúc tại`+helper `Mặc định…TRÌNH TIẾP` PRESENT / OLD `không trình tới`+`Đã BỎ tick` ABSENT** (fix shipped byte-level → UI-cũ=cache→incognito, KHÔNG deploy-fail)
Mig 59/88-table frozen
smoke api+admin+eoffice 200×3 + PE-list 200 items[]-valid. **Lessons:** #53 return-garble **tái-diễn lần-4** (cicd trả prose-curate-memory "18.7KB above target" thay verdict dù instruction "return-verdict" → **recover-from-diary S97-#481-entry KHÔNG re-spawn** per `feedback_agent_return_garble_recover`; instruction-fix giảm-không-100%)
BE-honors-explicit-flag → đảo-default chỉ sửa FE `useState` (BE param=fallback, FE luôn POST tường minh) = zero BE/test-churn zero-prod-risk
comment-drift cleanup trước commit. impl MEMORY compaction giữa-spawn (23.8→11.5KB, archive S76-79→`2026-H1.md` verify no-loss). **(3) endsBeforeCeo config→RUNTIME (Mig 60 `8037fa0` #482 — cross-stack, reviewer PASS 0-issue):** phiếu có cấp finalize nhưng approver opt-out → lên CEO thật + CEO duyệt, nhưng sơ đồ báo sai "kết thúc tại CCM, không qua CEO" + làm-mờ Bước CEO (endsBeforeCeo suy CONFIG). Fix: field runtime `EndedByLevelFinalize` (set CHỈ nhánh level-finalize) → EndsBeforeCeo cho phiếu DaDuyet đọc runtime; 4 projection (detail/List/Inbox/ListApproved) + FE gate làm-mờ 2-app + backfill marker; test 440 (repro `peFinButWentCeo` config-finalize+field-false→false) + reviewer 6-điểm PASS + **cicd #482 bug fixed LIVE** (PE-detail `31faef0d` endsBeforeCeo=False phase=7, EF-ternary SQL-Server 200-NOT-500) → gotcha #78 (display-flag CONFIG-vs-RUNTIME). **(4) badge "✅ Đã được CEO duyệt" (`9e12e80` #483, FE-only):** đối xứng fix-3 — phiếu DaDuyet + `!endsBeforeCeo` (đi hết lên CEO) → PeFinalizeChip hiện badge; tận-dụng cờ runtime (0 BE/mig); mirror 2-app + 6 call-site; cicd #483 byte-#77 PRESENT. **(5) Mig 61 backfill fix (`fb2dfa9` #484 data-fix):** anh Kiệt check A/005 "CEO duyệt chưa" → điều tra (API+sqlcmd) phát hiện A/005/A/008 **finalize-CCM (KHÔNG qua CEO)** nhưng badge sai "Đã được CEO duyệt" do Mig 60 backfill soi NHẦM bảng (Approvals thay Changelogs nơi marker thật). Mig 61 query đúng Changelogs → prod A/005/A/008 EndedByLevelFinalize 0→1 + endsBeforeCeo flip True (cicd #484), A/010 control unchanged → gotcha #79. database-agent điều tra + em-main verify-prod + migration. **State: Mig 61
89 bảng
440 test
gotcha 79
menu 54
bundle admin `mEGqlNWc`/user `Dnrp4PU1` (Run #484 data-fix, #69-rebuild)
prod 21 NCC/17 user.** **REVIEW-before-session-end (anh yêu cầu, workflow `wf_4951c347` 4-lane):** prod-data-integrity CLEAN (flag-vs-marker 3 phiếu chuẩn 0-miss/0-over-reach, #78/#79 ăn prod)
prod-deploy CLEAN (11 commit deploy OK, Mig 61 applied, health 200)
code-review PASS (em-main grep 0 wrong-table khác)
feedback captured. **PROD AN TOÀN.** **🔴 NEXT anh:** UAT **incognito** phiếu "8 MEP Sub Hệ thống solar" xác nhận: (a) sơ đồ hết báo "không qua CEO" + Bước 3 CEO KHÔNG còn mờ [fix-3 mới], (b) badge "Kết thúc tại CCM" + checkbox default-unchecked [fix 1-2] (+ vụ cũ "lỗi phân quyền vào phiếu": cho số-phiếu+user). **NEXT em:** monthly re-tier mega-line pending (giờ 5-blurb S97-S93). → log `2026-07-01-S97-pe-finalize-wording-default-flip.md`)
**Prev S96** (S96 — **buổi UAT LỚN anh Kiệt/chị Trà/anh Chương live + monthly-audit — 5 commit prod-verified, em-main-led (HMW-mode ON; 1 prep-workflow monthly-audit + spawn-lẻ, chủ-yếu solo).** **(1) Monthly drift audit `881783c`** (docs-only CI-skip): ef-core SKILL Mig→59 + bảng rows 57/58/59 + Mig 14/Phase-7 Budget-DROPPED annotate
skills/README Mig 55→59 + gotcha #69→76
docs/CLAUDE Budget REMOVED Mig 50 strike-through
**`docs/governance/vocab-alias-map.md` MỚI** (3 fork run-trace/Ngân-sách-PRO/all-inherit + `$ExcludeExact` anti-self-match)
**re-tier STATUS/HANDOFF mega-line 5→3 blurb** (S92/S91→archive, conservation delta=0 BOM-preserved) + hoist 3 UAT-carry→blockers
**FD memory distill** (H17 strike-1 CLEARED: L1 26129→21492B, 5 war-story→archive/`_INDEX`/gist, Lessons value-protect lên L1). Workflow `wf_2d687d27` 4-cluster draft→verify (reviewer bắt #74-paraphrase-drift + AS-10 residual reverted). detector 27→25. **(2) Import NCC DONGDUONG `ba4b8e0`** (Excel anh Kiệt "Database NCC" 4 NCC/30-field): 3 NCC đã seed sẵn (TRUONGGIANG/TANPHU/TGN) → chỉ +DONGDUONG vào SeedRealMasterDataAsync (ungated idempotent, pack extras→Note, no-mig); prod 20→21 NCC (Run #477). Backlog 15-18 field "note-lại-từ-từ-tính"→Next-up. **(3-5) 3 PE bug-fix UAT:** `e657faa` ô "Cấp này KẾT THÚC quy trình" (AllowApproverFinalize S89-auto) → **opt-out bỏ-tick-được** (2-tier: Designer=cấp-quyền / phiếu=chọn kết-thúc-hay-trình-CEO; +param `applyLevelFinalize` default-true BE + FE 2-app, Run #478)
`36cbf8b` **chuông tự sạch** noti "cần duyệt" cũ khi phiếu rời cấp (LogTransitionAsync mark-read Generic+RefId ExecuteUpdate BE-only, Run #479)
`0c2f9f6` **khóa sửa giá đề xuất PRO/CCM sau gửi-duyệt** ("duyệt là fix" — Mig 54 "KHÔNG-ràng-Phase" ĐẢO → non-admin chỉ sửa Nháp/TraLai + Admin-override; BE+FE 2-app+4 test, Run #480). Test 434→440. **Delete-sau-duyệt = ĐÃ chặn sẵn** (FE nút Xóa chỉ DangSoanThao + BE guard, không cần sửa). Checkbox "ko-được" = **browser-cache** (verify byte-level: prod bundle `0MU-kb4N` CHỨA fix + "✅-static" cũ đã mất; index.html no-cache đúng-chuẩn + no-service-worker) → **incognito = golden-test**. **State: Mig 59
88 bảng
440 test (45D+395I)
gotcha 77
menu 54
bundle admin `COYAX-yQ`/user `0MU-kb4N` (Run #480)
prod 21 NCC/17 user.** **Lessons:** verify-deployed-artifact-byte-level (cache≠deploy; incognito golden — gotcha #77)
#53-return-garble tái-diễn ×3 (investigator + cicd×2 trả text-memory-curation thay verdict → recover từ agent-memory; instruction-fix "return-verdict" ăn lần-3)
2-tier-permission (grant-vs-exercise)
spec-change→update-test-cũ (SeedPeAsync ChoDuyet→DangSoanThao). **🔴 NEXT anh:** UAT incognito checkbox + cho **số-phiếu/user** vụ "lỗi phân quyền vào phiếu" để em soi config-workflow. **NEXT em:** cicd-monitor S-tag-drift S97/S98→S96 reconcile (closeout này)
monthly re-tier mega-line (giờ 4-blurb S96/S95/S94/S93). → log `2026-07-01-S96-uat-pe-fixes-monthly-audit.md`)
**Prev S95** (S95 — **Harness-17 adopt (Vòng tự-cải-thiện bộ-nhớ Đo→Tinh-chỉnh→Kiểm) — governance-only 0 prod code, em-main-led + 3-workflow fan-out (HMW-mode ON).** `/check-email AI_INFRA` (0 directed mới; H16 đã áp trọn S93) → `/adap-apply` H17 (2 broadcast hash-MATCH
`reviewer_gate:PASS`). **10/10 mục 🔴 sàn ĐẠT:** REUSE-cite A2=§H MFE/C3=D9/CG-2=value_protect/archive=§A; **build mới** `scripts/memory-selfimprove-audit.ps1` (C1 spec-audit NO-API exit-0, **runtime-verified bắt frontend-designer over-cap GAP thật**) + `.claude/governance/reinject-ledger.md` (B2 CG-1 N=3, tách khỏi budget.json) + engine **§I** codify + `session-start §2.1.7`/`session-end §L.b(c)` wire + HCV alias no-seed (coverage 3-nghĩa, detector vẫn 27). **3-workflow (run-id bằng-chứng):** WF1 `wf_f085d7c4-d78` ground-truth + WF2 `wf_8e73c1d6-ee6` 3-lane review PASS 0-blocking + WF3 `wf_6f44eddf-680` deep-reverify (**fault-injection 13-inject chứng-răng-thật** + integration + cross-doc, 0 application-defect). **2 commit:** `18a17f5` (adopt — cicd **Run #476 PASS** prod 200×3, bundle rotate admin `0T6vVJST`/user `BGXEVZO6`, Mig 59 unchanged) + `65b434a` (deep-reverify docs-only CI-skip). **adap-report + 2 email AI_INFRA** (hash `54789e19` adopt + `8c94fa34` deep-reverify-update). **Dogfood C3 4-fire:** AS-10 WF1+WF3 self-write reverted (git-diff net = backstop THẬT; **instruction-fix NOT 100%** — WF3 explicit-return-only STILL self-wrote → E-006 recurrence S95, guard HELD 4/4, 0 escape; cicd-monitor diary KEPT = normal-spawn legit). **Lessons:** fault-injection-via-`-RepoRoot`-temp chứng checker-teeth (không chỉ happy-path PASS)
Lane B #53 empty-return → em-main self-gate recover
workflow-agent persona-write stochastic → git-diff mandatory. **State GIỮ NGUYÊN: Mig 59
88 bảng
434 test
gotcha 76
menu 54
prod 17 user/7 NCC.** **NEXT em:** frontend-designer distill (WATCH strike-1 = H17 loop's live finding)
monthly re-tier mega-line + ef-core SKILL Mig→59 + 3 vocab-fork (2026-07-01 due). → log `2026-07-01-S95-harness17-adopt.md`)
*(S93-S94 blurb đã tách → `docs/_archive/STATUS-HANDOFF-tier-S98-2026-07-02.md`, re-tier S98; session ≤S90 → `docs/_archive/STATUS-HANDOFF-tier-S94-2026-06-29.md` + `docs/changelog/sessions/`, re-tier S94)*

---

## 🎯 CURRENT STATE (baseline S40 — re-ground sống liên tục, mốc gần nhất **S179** [🔄 bump @S179 — `lead-stale-auditor` FLAG-6: bảng này đã re-ground **2 lần SAU S168** (`:474` S170 · `:476` +S176) mà header vẫn giữ S168 ⇒ **chính dòng này chép ra cái luật mà nó vi phạm**, bác được KHÔNG cần rời file. Luật giữ nguyên: bump theo lần re-ground giá-trị mới nhất TRONG section. 🧊 lineage: bump @S168 ← vá @S153 FLAG-2 ← header bump @S157 ctx-verifier C3])

| Metric | Value | Note |
|---|---|---|
| Migrations | **73** | 🔄 **73 @S191 (đo đĩa `ls Persistence/Migrations/*.cs` trừ `*.Designer.cs` + `ApplicationDbContextModelSnapshot` = 73 — 🔴 loại `ModelSnapshot` KHÔNG phải chuỗi `Snapshot`: bộ lọc `Snapshot` nuốt nhầm `AddPeApprovedBudgetSnapshot` (Mig 67) ⇒ ra 72, đó là cách ô này sai suốt từ S177; prod `__EFMigrationsHistory` MIGCOUNT=73 @run #488 xác nhận. Mig 73 = `AddContractEndedByLevelFinalize` land `69860362` @S190. 🧊 cũ: 72 @S177 (thước hỏng), flush @S179 — `lead-stale-auditor` FLAG-5 + máy `canonical-itself-stale` HIGH).** Mig 72 land ở cửa-sổ 5 phiên-LOGIC L11 kèm backfill 5/5 có mã. 🧊 **71 @S164/S165 (K1/K2 SP-002):** Mig 70 `AddContractCatalogEntries` (danh mục HĐ 86 dòng, `50e6d8c`, cicd 6/6) + Mig 71 `AddKhkkApprovalGroupCatalogAndFinalizeRuntime` (phiếu KHKK +nhóm N1-N8 backfill=1 + Line hạng-mục + unique 3-cột, `0779f2d`, cicd 5/6-khỏe; prod `__EFMigrationsHistory` top + MIGCOUNT=71 @sub-cicd-verify-k3.md §3). **+S161: Mig 69 `AddContractSigningPlans`** (`20260729122015` — W1 KHKK: 7 bảng MỚI cho Kế hoạch ký kết HĐ, commit `a8027c0` cicd PASS 6/6; SQL tables 89→96).  **+S155: Mig 68 `AddPeAllowApproverDelete`** (`20260727033522` — PE cho phép **approver xóa phiếu ngay ở màn duyệt**: cờ `AllowApproverDelete` **per-NGƯỜI** trên `ApprovalWorkflowLevel` [owner chốt (5)] + lệnh sửa-quy-trình-tại-chỗ; **AddColumn no new table [89 giữ]**, reversible Down. Chia 2 ĐỢT theo lệnh anh — §F.0 chứng minh quyền xóa **không tới được phiếu đang treo** nếu thiếu lệnh sửa tại chỗ. Đợt 1 `b1bae77` CICD **PASS 6/6**; đợt 2 `4464a46` NO-MIG [nút xóa + menu 3 mục + màn "Đã xóa"] CICD **PASS 6/6** verify @S156 [endpoint 401⟂control-404 · smoke 8/8 · **D3 giao-tập-ID = 0** 37 sống ⟂ 9 xóa · bundle rotate ×2 + 4/4 byte-marker]; +`f4494cf` fix menu sáng nhầm PASS. prod-verified `__EFMigrationsHistory` top + `sys.tables`=89). +S133: Mig 67 `AddPeApprovedBudgetSnapshot` (PE **freeze ngân sách phiếu DaDuyet** — UAT anh Kiệt 07-16 R1 "phiếu đã duyệt bất biến, ngân sách live chỉ cho phiếu chưa duyệt": **11 AddColumn snapshot** lên PE [`ApprovedBudgetSnapshotAt` + Pro/Ccm `Initial·Adjustment·Note` ×6 + `PrevSubmitted/PrevSelected Total·Count` ×4] chốt tại finalize choke-point qua helper `PeBudgetAccumulator` 4-site + **site-5 admin-override `PurchaseEvaluationWorkflowService.cs:308`** [reviewer catch #81-EXT indirect-assignment — override thẳng → DaDuyet cũng PHẢI snapshot] + seeder site; +`Sql()` backfill OUTER APPLY khớp accumulator cho phiếu DaDuyet cũ — **prod 18/18, chua=0**; display-gate `budgetFrozen`: phiếu DaDuyet đọc snapshot + badge 🔒, phiếu chưa duyệt đọc live [R2 "bản cập nhật gần nhất"]; **no new table [89 giữ]**, reversible Down DropColumn ×11; prod-verified Run #398 `__EFMigrationsHistory`-top + 11 cột; commit `d4fbced`). +S117: Mig 66 `AddPeApprovedPriceRange` (PE +`ApprovedPriceMaxAmount decimal(18,2)?` — feature "duyệt theo khoảng Min–Max" anh Kiệt "chọn cả 2 min và max": source `"ProMinMax"` = Amount(Min)+MaxAmount(Max), bất-biến `MaxAmount != null ⟺ Source=="ProMinMax"` + Min≤Max [guard service `ApplyApprovedPriceOnFinalize` + FluentValidation]; **1 AddColumn nullable no-backfill** [phiếu cũ Source-đơn Max=null nguyên vẹn], reversible Down DropColumn, **no new table [89 giữ]**; HĐ.GiaTri KHÔNG đọc giá chốt [=SUM báo giá NCC được chọn] → 0 tác động HĐ [range = record-of-decision]; prod-verified Run #387 col decimal(18,2) + `__EFMigrationsHistory` top; commit `316a82f`). +S114: Mig 65 `BackfillPeQuoteIsSelectedAndWinnerInvariant` (data-only 2-chiều bất-biến `IsWinner↔IsSelected`, no new table [89 giữ], idempotent, Down no-op mirror Mig 61; multi-NCC per hạng mục anh Kiệt; commit `d436af2`; kèm gotcha #81 delete-writer). +S113: Mig 64 `AddSupplierPublishState` (Supplier +`IsPublic` bit NOT NULL default 0 — cổng công-bố R4 "thiếu Mã NCC→nháp/ẩn"; `Sql("UPDATE Suppliers SET IsPublic=1")` backfill 37/37 prod→public; DropIndex→CreateIndex đổi filtered-unique Code `WHERE [IsDeleted]=0 AND [Code]<>''` [cho nhiều nháp Code='']; **no new table [89 giữ]**, reversible Down; prod-verified Run #497 __EFMigrationsHistory-top + IsPublic-col + 37/37-backfill; gotcha #80 null-Code). +S112: Mig 63 `AddSupplierImportSourceFields` (Supplier +`SourceUpdatedAt datetime2?` + `SourceUpdatedBy nvarchar(200)?` — import-provenance cột 29/30 file Excel "Database NCC"; 2 AddColumn nullable, **no new table [89 giữ]**, reversible Down DropColumn ×2; prod-verified Run #496 `__EFMigrationsHistory` top + 2/2-col present). +S104 (reconcile): Mig 62 `ExpandSupplierFields` (Supplier 9→27 field: 18 AddColumn nullable + 18 DropColumn Down + `SupplierType +CaHai=6` append-only + enum `SupplierStatus` mới + guarded un-cram `Sql()` clear legacy crammed Note 4 seeded rows exact-match; **no new table (89 giữ nguyên — 18 AddColumn/0 CreateTable)**, reversible Down; seed fill-nulls-if-exists 30-field TRUONGGIANG/TANPHU/TGN/DONGDUONG idempotent; commit `778fc98` shipped UN-closed-out → S104 session-start docs-reconcile; prod-verified Run #488 PASS bundle admin `ChSNAJBK`/user `Bn2w1znH`; 440 test re-verified #65-no-bite). +S97: Mig 61 `BackfillEndedByLevelFinalizeFromChangelog` (data-only no-schema — đính chính Mig 60 backfill soi NHẦM bảng `Approvals`→`Changelogs`; set `EndedByLevelFinalize=1` cho phiếu finalize-sớm pre-Mig60 [A/005/A/008 finalize-CCM KHÔNG qua CEO] qua marker ở `PurchaseEvaluationChangelogs.ContextNote`; idempotent SQL-Server-only; prod-verified Run #484: A/005/A/008 0→1 + endsBeforeCeo-flip-True, A/010=0 control-unchanged; gotcha #79). +S97: Mig 60 `AddPeEndedByLevelFinalize` (PE +`EndedByLevelFinalize` bit NOT NULL default 0 — cờ RUNTIME "phiếu ĐÃ kết thúc sớm bằng level-finalize", set-true CHỈ nhánh finalize service; +`Sql()` backfill Phase=7-marker→=1; EndsBeforeCeo display đọc runtime thay config → phiếu-lên-CEO hết báo sai "không qua CEO" [gotcha #78]; AddColumn no new table, prod-verified Run #482 PE-detail endsBeforeCeo=False live). +S87: Mig 58 `AddPeMultiWinnerAndLevelFinalize` (`PurchaseEvaluationSupplier` +`IsWinner` bit multi-winner backfill từ SelectedSupplierId + `ApprovalWorkflowLevel` +`AllowApproverFinalize` bit cấp-KẾT-THÚC-quy-trình AUTO; 2 AddColumn + 1 backfill, no new table) + Mig 59 `AddCcmBudgetPeriodToPurchaseEvaluation` (PE +`CcmBudgetPeriodAmount` decimal(18,2)? — NS kỳ-này cột CCM cho Section B 3-cột; 1 AddColumn nullable, no backfill, no new table). +S77: Mig 57 `AddPeSuggestedPriceNotes` (PE +`ProSuggestedPriceNote` +`CcmSuggestedPriceNote` nvarchar(1000) — ô ghi chú giá đề xuất PRO/CCM giải-thích Min/Max · additive-nullable, 0 backfill, no new table; absolute-set role-gate mirror Mig 54/55). +S76: Mig 56 `AddProBudgetSplitToPeWorkItemBudget` (PeWorkItemBudget +`ProInitialAmount`+`ProAdjustmentAmount` decimal(18,2)? — cột PRO "Ban hành lần đầu"+"V0/hiệu chỉnh" mirror CCM Initial/Adjustment; AddColumn additive + `Sql()` data-migrate `ProInitial=ProEstimate` 4 rows prod gotcha #64; no new table). +S74: Mig 55 `AddCcmNoteToPeWorkItemBudget` (PeWorkItemBudget +CcmNote nvarchar(1000) — "Ghi chú từ CCM" mirror ProNote · additive-nullable, 0 backfill, no new table). +S73: Mig 54 `AddPeSuggestedAndApprovedPrice` (PE +5 cột giá đề xuất PRO Min/Max + CCM + giá chốt ApprovedPriceAmount/Source — additive-nullable, 0 backfill, prod-verified Run #313). +S69: Mig 53 `AddPeUrgentAndCeoApprovalThreshold` (PE +IsUrgentByPro/Ccm cờ gấp + ApprovalWorkflow +CeoApprovalThreshold ngưỡng CCM duyệt-final · 3 AddColumn no new table). Prev S65: Mig 51 `AddDepartmentParentId` (Department.ParentId loose-Guid no-FK — org-tree) + Mig 52 `AddHoSoLinkToPurchaseEvaluation` (PE HoSoLink nvarchar(1000) hyperlink NAS) — **cả 2 AddColumn-only, no new table** (tables giữ 88). Prev Mig 50 `ReplaceBudgetModuleWithPeWorkItemBudgets` (bảng `PeWorkItemBudgets` per-gói-thầu + DROP module Budget cũ + backfill BudgetManual→BudgetPeriod TRƯỚC DropColumn + DROP PE/Contracts.BudgetId; gotcha #63/#64). Prev Mig 49 PE WorkItemId (S57bis) |
| SQL tables | **97** | 🔄 **97 @S164** (Mig 70 K1 +1 bảng `ContractCatalogEntries` — prod `sys.tables`=97 @sub-cicd-verify-k1.md; Mig 71 AddColumn-only giữ 97). Cũ: **96 @S161** (cicd `cicd-verify-a8027c0.md:117` prod `sys.tables` 89→96 = +7 bảng Mig 69; mọi note "no-new-table"/"89 giữ" bên dưới là **frozen-in-time** của mig cũ, KHÔNG sửa).  re-ground S97 (cicd `sys.tables` is_ms_shipped=0 Run #482 LIVE = **89**, pre==post Mig 60 no-new-table; "88" từ S62 STALE). Prev net 93→88 S62 (Mig 50 drop Budget + create `PeWorkItemBudgets`) |
| Master data (prod) | **71 WorkItems PMH-only S59** | 62 Projects + **WorkItems = ĐÚNG 71 mã PMH** (S59: wipe 15 demo + rename format anh Kiệt `MAT-1..16`/`SUB-1..30`/`MEP-SUB-1..9`/`MEP-EQU-1..16`, Name "STT nhóm tên") + Suppliers **37** (S113 cicd-verified prod count, tất cả IsPublic=1 sau Mig 64 backfill — "22 ước" cũ STALE; POST mở any-auth S59 quick-add; import v2 mới landing nháp). Transactional testing data wiped S59 (PE/HĐ/Notif = 0 baseline, phiếu thật từ A/001). Provenance `scripts/master-import-data.generated.md` |
| API endpoints | **~253** | +1 S54 `GET /it-tickets/assignable-staff` (capability endpoint); +3 S52 (attendances/report + report/excel + it-tickets/{id}/assign) |
| FE pages | **68** | unchanged S54 (ItTicketsPage reassign = in-place 2 app); +1 S52 AttendanceReportPage |
| Policies | **480** | 🔄 **480 @S187 W3** = All 120 × 4 (DELTA: **+28** = 7 `AwV2_Hd*` × 4 actions — 7 quy trình duyệt HĐ theo LOẠI, YC-023/YC-024). Đo RUNTIME, không suy từ số cũ: nạp `SolutionErp.Domain.dll` vừa build → `MenuKeys.All.Length × MenuKeys.Actions.Length` = 120 × 4 (`Distinct()` = 120 ⇒ 0 key trùng). 🧊 **452 @S166 K4a** = All 113 × 4 (máy khoá: test T2 `KhkkGroupMenuSeedTests` đỏ nếu drift; DELTA vá-2: +4 ContractCatalog K1 · +32 AwV2_KhkkN* K3 · +196 Khkk_G* K4a). Cũ: **220 @S161** (W1 KHKK: `All` +`KeHoachKyKet` ⇒ 55 × 4 — reviewer F-2 bắt cặp-row-đôi đúng luật dòng dưới) · 🆕 **row MỚI S121** (wave adap-6-broadcast W2 — H24 GAP-3: `governance-detectors.ps1` `Get-StatusValue` resolve canonical TỪ bảng này; **KHÔNG có row ⇒ token `policy` UNRESOLVED ⇒ nửa `policy` của GAP-3 không thể fire** ⇒ detector khai FAIL-LOUD + SKIP, KHÔNG im-lặng-giả-vờ-xanh). 🔴 **DERIVED, KHÔNG độc-lập:** `Policies = |MenuKeys.All| × |MenuKeys.Actions| = 55 × 4 = 220 (@S161; trước W1 = 54 × 4 = 216)` — sinh runtime ở `src/Backend/SolutionErp.Api/Program.cs:82-89` (`foreach menu → foreach action → opts.AddPolicy($"{menu}.{action}")`), `Actions = ["Read","Create","Update","Delete"]` (`MenuKeys.cs:167`). ⇒ **row này BUỘC đổi CÙNG row `Menu keys`**: thêm 1 menu key ⇒ 55 × 4 = 220; sửa `Menu keys` mà quên `Policies` ⇒ detector flag derived-doc thay vì flag chính chỗ sai. Ground S121 bằng đếm mã-nguồn (`MenuKeys.All` = 54 entry, `public const string` = 54, khớp) — KHÔNG chép số từ spec. ⚠️ `.claude/skills/permission-matrix/SKILL.md` ghi **~240 = STALE** ⇒ W4 vá (🔴 chuỗi H24 §2(4) BẮT BUỘC: detector fire → cổng chứng-kiến → RỒI MỚI vá; vá trước = giết chứng-nhân sống) |
| Menu keys | **120** | 🔄 **120 @S187 W3** (đo RUNTIME `MenuKeys.All` bằng cách nạp DLL vừa build, KHÔNG đếm mắt: `ALL=120 · DISTINCT=120 · HD_KEYS=7`). DELTA **+7** = `AwV2_Hd{TP,GK,NCC,DV,MB,NTNCC,NTDV}` — 7 leaf Designer cho 7 quy trình duyệt HĐ theo LOẠI (YC-023/YC-024), sinh by-construction từ `ContractApprovalWorkflowFamily.Members` qua `MenuKeys.ContractWorkflowMenuKeys` ⇒ CÙNG bộ sinh với vòng seed menu-row trong `SeedMenuTreeAsync` (invariant T6: key vào `All` mà thiếu menu-row = Permission FK nổ lần boot đầu). 🧊 **113 @S166 K4a** (đo RUNTIME `MenuKeys.All` — test T2; +49 `Khkk_G{2-8}`+42-leaf bộ-sinh by-construction K4a · +8 `AwV2_KhkkN1..N8` K3 · +1 `ContractCatalog` K1 trên nền 55). Cũ: **+1 S161 `KeHoachKyKet` vào `All` (W1 KHKK — policy `KeHoachKyKet.*` sinh runtime; menu-row prod KHÔNG đổi, 142 giữ)** · +1 S69 `Off_Dashboard` (landing Văn phòng số). Prev re-ground S61 (`MenuKeys.cs` const — Mig 50 gỡ 4 `Bg_*` Budget menu cũ). Prev 57 (S58) |
| Tests | **697 PASS** | **45 Domain + 652 Infra** · 🔄 **697 @S190 — cicd-verify CI run #600 `091073f9`** (deploy YC-029+YC-030 GĐ3; Δ+17 trọn ở Infra = YC-029 +13 [W1 menu-drift + W5 delete-guard 13-ca] + YC-030 +4 [`ContractApproveFinalizeTests` nhánh finalize]; 0 Failed/0 Skipped, đối chứng local `dotnet test SolutionErp.slnx` @gate-cụm). 🧊 **680 @S188 — ĐO ×2 nguồn độc-lập** (`dotnet test SolutionErp.slnx` local @gate-cụm + gate CI **run #482** `b275893c` tách-phần 45/635; đối chứng thứ 3 `sub-reviewer-cum.md`). **+12 vs S185** = 4 test-before W1 (`UpdateAwDefinitionTests` W1a/W1b bom per-type) + T2/T6 menu-key drift W3 + 3 security W6-BE (`ContractWorkflowServiceApproveV2Tests` đúng-trạm) + collateral. 🔴 **Ô này lệch 2 đời trong phiên S188** (668 → 672 đợt-1 → 680 cụm) — `lead-stale-auditor` DEEP FLAG-2 bắt, class `view-stale-count`, cùng ô đã 4 lần tái phát ⇒ **nguồn cập nhật = cicd-verify lượt kế, KHÔNG chép tay**. 🧊 **668 @S185 — ĐO BẰNG CÁCH CHẠY THẬT ×2 nguồn độc-lập** (`dotnet test SolutionErp.slnx` @/tiep-verify + `ring2-audit` tự chạy đối-chứng cùng ngày): Domain 45 · Infra 623 · 0 fail 0 skip. Lineage: +15 KHKK-mirror @S182 (14 spec + T15) + +8 `UploadDuyet_*/UploadCanCu_*` YC-016 @S183. 🧊 **645 @S179** (45D+600I — ô này từng kẹt 645 tới S185 trong khi suite đã 668: stale-F3 canonical-poison, máy lấy ô này làm thước in 6 flag khuyên vá về số SAI — vá @S185). 🔴 Không lấy số từ doc: `lead-stale-auditor` FLAG-4 bắt ô này còn **644**, mà 644 đang là **THƯỚC** cho 6 flag derived-stale của detector ⇒ canonical sai thì máy khuyên vá về số sai (class canonical-poison S148/S166). 🔸 Breakdown cũ ghi "599 Infra" cũng lệch — **600**. 🧊 **644 @S168 #444** (+5 Fact Lines-editor) · 🧊 **639 @S168-sáng** (đo tươi local 45D+594I sau K7 Δ+17; chuỗi K lineage: 597 K1 → 614 K3 → 622 K4c @S167 KHỚP CI #439 tách-phần → **639** K7 — gate `639=45+594` KHỚP cicd-K7 dòng-1) · 🧊 **+28 @S161** (5 wave KHKK: W1 566 → W2 574 → W3 580 → W6 587 → W7 590; đo tươi @S162 `dotnet test` 45+545, gate CI Run #432 khớp). ~~45 Domain + 517 Infra~~ · 0 fail / 0 skip · **S155 +30** (PE xóa-by-approver: `PeDeleteByApproverTests.cs` + T26/T27 — 🔴 **T27 khoá CẢ LỚP lỗi** *entity-có-cờ-mà-DTO-không-có* bằng reflection [mọi cờ `Allow*` trên entity phải có mặt trên DTO], **fault-inject xác nhận có răng**: tiêm bug ⇒ ĐỎ, khôi phục ⇒ xanh — không phải guard tuyên-bố suông; T26 giữ ĐỎ có chủ ý vì bug production thật, lead vá bằng đảo thứ tự chứ KHÔNG nới assert. Số 562 cross-check 2 nguồn độc-lập: log CI run #417 + `dotnet test` local @S156) · **S147 +4** (`ProjectCodeNormalizationTests` — Trim khi lưu + kiểm-trùng bỏ-dấu-cách; 🔴 **ô canonical này STALE 528/483I suốt S147→S148**, header `:6` và session-log S147 đều ghi 532/487I từ đầu — closeout S147 vá header mà quên ô canonical; H24 `lead-view-auditor` bắt @S148, lead verify 3-nguồn rồi vá) · **S134 +8** (`PePendingAccumulationTests` C1-C8 lũy-kế-TẠM-TÍNH: C1 ChoDuyet+winner vào delta-selected + PriorPes · C2 TuChoi/DaDuyet loại sạch · C3 Nháp list-only KHÔNG cộng tiền [D1] + TraLai vào delta-submitted [D2] · C4 peer-window CreatedAt · C5 delta âm signed · **C6 complementary-no-double-count exact-numbers [ComputeAsync bất động khi thêm peer non-terminal]** · C7 frozen→pending 0/null · C8 D4 changelog `[S134 pending-prior]` positive+contrast) · **S133 +11** (`PeBudgetFreezeTests` freeze-NS-at-DaDuyet: **T0 repro test-before RED→GREEN** [phiếu DaDuyet phải giữ số cũ sau `UpdatePeBudgetPro` — RED bắt 999tr @:184 pre-fix, phiếu đưa tới DaDuyet QUA service finalize mirror `PeApproverFinalizeTests` KHÔNG seed thẳng Phase] + **T1-T9** spec-coverage [snapshot các nhánh finalize + display-gate + 2 terminal-guard chặn sửa NS phiếu đã kết thúc (cả Admin) + backfill] + **site-5 AdminOverride** [reviewer catch — override thẳng → DaDuyet cũng chốt snapshot]) · **S118 +8** (PRO-perm scope-isolation **+4** `ProcurementMasterAccessSeedTests` [reflection no-prod-touch: upgrade-path Suppliers R+C+U + Master-Read · **scope-isolation** DeptManager-riêng vẫn revoke=false · insert-path no-Delete · idempotent] · ReportsController authz **+4** `AuthorizePolicyRegressionTests` [dashboard/export require Reports.Read · my-dashboard KHÔNG action-policy · class-level [Authorize] intact]) · **S117 +6** (PE endsBeforeCeo pointer-aware **+1** `PeFinalizeProjectionTests.ListPe_EndsBeforeCeo_ChoDuyet_PointerAware_PastFinalizeIsFalse` [ChoDuyet con-trỏ QUA cấp finalize → endsBeforeCeo=false, test-before RED→GREEN + EF-subquery translate smoke] · duyệt-theo-khoảng ProMinMax **+5** `PeApprovedPriceFinalizeTests` [happy set Min+Max · min==max boundary lock strict-`>` · thiếu-Max→Conflict not-finalized · min>max→Conflict · single-source+Max→Conflict wire-bug + regression Max=null] · harness `InvokeApply` 4→5 args fix TargetParameterCountException) · **S116 +9** (PE nhập giá âm: T1 ngân-sách-bất-biến khi quote-âm · T2 winnerQuoteTotal signed-sum · T3 submit-guard all-zero-blocked/pure-neg+net-zero-submittable · T4 CCM-net-threshold) · **S114 +9** (PE multi-NCC per hạng mục: `PeSelectWinnerClearTests` delete-invariant +4 [DeleteQuote/DeleteDetail re-derive IsWinner **test-before RED→GREEN** + guard-no-over-clear + UpsertQuote-update-branch coverage] + impl-lane +5 [per-hạng-mục-total · giaTri-single-partial · threshold-crossing · derive-invariant]) · **S113 +19** (Supplier import v2: `SupplierImportV2DedupTests` 13 [dedup MST-primary+Code-backstop T1-T7 · draft-on-import IsPublic · all-or-nothing · LayoutValid re-bake real-token · **null-Code→nháp FIXED** flipped-from-characterization] + `SupplierPublishAndListTests` 6 [publish-guard Code-required→409 · unpublish · list-filter published · DTO IsPublic]) · **S112 +18** (Supplier `SupplierExcelImportServiceTests` +10 [case-collation dedup có-RĂNG SQLite-BINARY-collation-nên-chứng-dedup-ở-SERVICE · fill-nulls-safe · all-or-nothing-abort · parser abs-cell-index/#REF!-null/header-fingerprint · Type-lạ→NCC · Status-emoji-strip] · PE `PeSubmitGuardAndBypassTests` 4-update→A1 [minOwn subordinate-only, pointer-stop] + 8-new [A1-happy · non-contiguous · EDGE-5 non-admin-throw/admin-pass/system-pass · opinion-history log/none]) · Prev 440: **S96 +6** (PE `PeApproverFinalizeTests` +2 [#6 finalize-opt-out→advance-CEO · #7 stale-noti-clear ExecuteUpdate] · `PeSuggestedPriceSetterAuthzTests` +4 [price-lock phase-guard after-submit — PRO/CCM ChoDuyet/DaDuyet→Conflict, Admin-override; +sửa SeedPeAsync default ChoDuyet→DangSoanThao spec-change]) · **S92 +3** (`AdminOnlyModulesRevokeTests` ẩn 5 nhóm menu chỉ Admin — non-Admin revoked-4-cờ / Admin untouched / Pe_* preserved) · **S91 +9** (ChangePassword self-service BE+test) · **S89 +3** (`PeDraftVisibilityTests` IDOR nháp riêng-tư) · **S88 +17** (D1 financials/CEO-notify/HoSoLink null-safe +11 · D2 create-contract multi-winner +6) · **S87 +25** (Mig 58 net +18: `PeMultiWinnerTests` sum + `PeSelectWinnerClearTests` multi-update + `PeSubmitGuardAndBypass` budget=0 + `PeApproverFinalizeTests` 5 auto-finalize [từng 7, −2 khi opt-in→auto rework] + `PeCcmThresholdFinalize`/`PeWorkItemBudget` collateral; Mig 59 +7 `PeCcmBudgetPeriodSetterAuthzTests` role-gate Admin|CCM/budget=0/null-clear) · **S86 +3** (`PeApproverNotifyExcludesDrafterTests` — notify "cần duyệt" loại NGƯỜI TẠO phiếu: drafter-excluded · co-approver-vẫn-nhận · drafter-vẫn-nhận-chuông-kết-quả) · **S85 +18** (PE CV PRO C5 hủy/đổi NCC winner +10 · urgent drafter-self-unset +5 · workflow-preserve bug-class S42 +3 `PeUpdateDraftWorkflowPreserveTests`) · **S83 +2** (PE require-workflow: `PeWorkItemGuardTests` ApprovalWorkflowId `NotEmpty` ×2 validator + submit-guard rewrite test 7/13 `PeSubmitGuardAndBypass` V1-submit-deprecated, no-count-change) · **S77 +10** (+7 `PeSuggestedPriceSetterAuthzTests` ghi chú PRO/CCM Mig 57 absolute-set/role-gate/null-clear/max-1000 · +3 `PeUrgentToggleAuthzTests` rewrite cờ-gấp **BẤT ĐỐI XỨNG** SET=function role / UNSET=function+DeptManager, plain-PRO-unset Forbidden) · **S76 +5** (`PeWorkItemBudgetTests` PRO split: set ProInitial+ProAdjust gồm âm · validator ProInitial≥0/ProAdjust-cho-âm · full=proFull khi CCM empty · full=CCM khi CCM present) · **S74 +5** (`PeWorkItemBudgetTests` §4b CcmNote: set CCM/Admin · null-clear absolute-set · non-priv Forbidden+no-mutate · all-3-persist) · **S73 +28** (PE opt-in finalize spec 6→11 + 10 giá-chốt `PeApprovedPriceFinalizeTests` + 13 setter-authz `PeSuggestedPriceSetterAuthzTests`) · **S69 +20** (Office-golive OfficeModulePermissionSeed 6 + PE PeCcmThresholdFinalize 5 + PeUrgentToggleAuthz 9) · **S67 +23 HRM test-after** (DepartmentTreeTests 8 cycle-guard/rollup + PeHoSoLinkTests 9 absolute-set + HrmProfilePermissionSeedTests 6 reflection-seed) → 286 · S61 +22 `PeWorkItemBudgetTests` −14 `BudgetPolicyTests` −1 → 263 · S60 +14 `PeSubmitGuardAndBypassTests` +2 spec → 256 (Domain 58→45 do drop Budget module tests) |
| Gotchas | **92** | 🔄 **92 @S191** — **+S191 #92** (runner build-env NHIỄM: CI exit-0 + **byte-match CI↔prod** + smoke 200 nhưng bundle **CRASH runtime** `useState null` → trắng màn; 2 ca S189+S191 [#600: fe-user CI 1.803.881B vs local 1.700.709B **+103KB** CÙNG commit, local deterministic 2-build-1-hash; fe-admin lệch +39KB nhưng sống — nhiễm KHÔNG đồng đều]; 🔴 **ROOT-CAUSE THẬT = `deploy.yml` XOÁ `package-lock.json` rồi `npm install`** ⇒ resolve lại cây theo semver mỗi run ⇒ cùng commit ra bundle khác nhau. **2 giả thuyết ĐỀU BỊ BÁC bằng đo**: ① "root-cause=disk" (bác bởi ca-2) · ② "npm-cache SYSTEM là nguồn" (bác bởi run #488 — ra 4/4 hash trùng local mà **KHÔNG ai dọn cache lần nào**). Thuốc = `npm ci` + lockfile-committed + GUARD-92 (`305b573f`) — `npm ci` là **THUỐC**, không phải đường nhiễm; fix chuẩn ×2 = build local HEAD → scp đè app chết GIỮ bundle hỏng làm rollback-1s → verify RUNTIME console+read_page; luật: verify deploy FE PHẢI có 1 phép đo runtime — file-integrity+HTTP-200 chưa đủ · bundle CI lệch local cùng-commit = ĐỎ · sau sự cố hạ tầng coi MỌI cache toolchain là nghi phạm · ràng buộc CẤM-push GỠ @run #488 — mốc điều-kiện giữ cho lần sau) · 🧊 **91 @S189** — **+S189 #91** (push land trên ĐĨA nhưng tầng-app Gitea CÂM — 0 run/0 status dù MỌI tín hiệu quen XANH [runner Running · ENABLED · filter đúng · không push-đè]; tố cáo bằng **2 nguồn LỆCH cùng API**: `branches/main→commit.id` [git-đĩa] tiến ⟂ `repo→updated_at` [DB] đứng ⇒ CI **chưa từng được gọi**, không phải đỏ; kèm `gitea.log` 0-byte 11,5h [xoay không mở lại] ⇒ restart mở logger + `workflow_dispatch` API → run #486 ship trọn; cost-của-thuốc: restart kích re-index 25' tranh RAM → latency bimodal = số bẩn, khai chứ không giấu; vá RAM cùng lượt `max server memory` **unbounded→1200MB** [PLE 522→1123, A/059 0,58s]; luật verifier: `updated_at ≥ push-time` TRƯỚC khi tuyên "đang chờ CI") · **+S189 #89** (cache automation phình vô hình ăn sạch ổ C — `gitea repo-archive` 16,49GB + `npm-cache` SYSTEM 12,76GB → free **−20MB** → SQL `Error -2` không mở nổi connection → "ko duyệt được"/GET-500, FE gom mọi lỗi vào "Không tìm thấy phiếu" [#44] ⇒ nghi oan phiếu trong khi phiếu NGUYÊN; fix dọn 30GB + `AUTO_CLOSE OFF` ×3 DB [ON = mỗi connection mở lại ~5s] + FE tách 404⟂500 5-site ×2-app; guard runbook §Disk-free + cicd-monitor 1b; luật: prod chậm/mất/không-lưu ⇒ `fsutil diskfree` TRƯỚC khi nghi data) · **+S189 #90** (`ssh … \| head` cắt pipe → sshd Windows-OpenSSH MỒ CÔI spin full core — 3 orphan bão hòa máy 3-core, SQL `ASYNC_NETWORK_IO` CPU-66ms-elapsed-29s, client đói CPU không nhận data ⇒ A/059 47s/500 "task was canceled"; kill orphan [CHỪA ancestor-chain] → **0,38s** tức thì; luật: cắt output = `Select-Object -First N` phía REMOTE + đợi cold-start ~48s sau recycle mới đo + op đo nặng tự hỏi "ngắt rồi để lại gì") — sự cố YC-028 trọn: `runs/2026-08-10-S189-bookstart-open/run.md` + RCA `YC028-S189` error-ledger. 🧊 **88 @S185** — **+S185 #88** (sự cố prod 2 tầng: disk C: đầy → 2 DB RECOVERY_PENDING → Disk-Cleanup "free space" **NÉN NTFS đúng file .mdf/.ldf đang đóng** → SET ONLINE fail `Msg 5118`, login prod 500 "transient failure UseSqlServer" + Gitea push 502/unpacker CÙNG GỐC; fix OFFLINE-từng-DB → backup copy → restart-service-nhả-handle → `compact /U` 4 file + folder → ONLINE, `Recovery is complete` **0 mất data** [58 PE · 21 user · 97 bảng khớp]; luật: Msg 5118 ⇒ check `compact` TRƯỚC khi nghĩ restore + CẤM nén cây SQL DATA; kèm phát hiện **1433 phơi Internet, `sa` bị brute-force** — chờ anh vá firewall). 🧊 87 @S179 flush — đo đĩa `docs/gotchas.md` max anchor = **87** (`lead-stale-auditor` FLAG-5 + máy HIGH `canonical-itself-stale`; #87 sinh ở S177 vá lệch 2 tầng). 🧊 **+S168 #86** (2-push-sát → Gitea auto-CANCEL run đầu cùng-branch: CANCELLED ≠ fail — verifier đọc run CUỐI của range + bằng-chứng artifact-level; side-effect @startup chỉ 1-startup cho cả cụm push; ca thật `aaed699` ship qua #442) · **+S162 #85** (menu-key OR-gate FE ≠ policy per-action BE: cây 4-folder GĐ gate `['Khkk_List','Khkk_G1','KeHoachKyKet'].some(can)` NHƯNG endpoint gắn `[Authorize(Policy="KeHoachKyKet.Read")]` [`ContractSigningPlansController.cs:36`] + `MenuPermissionHandler.cs:40` so khớp **CHÍNH XÁC 1 key** — KHÔNG kế-thừa cha, KHÔNG OR key con ⇒ role `Khkk_List=1 ∧ KeHoachKyKet=0`: FE mở cổng → API **403** → folder GĐ2 hiện "—" dưới **MỌI** gói thầu, claim "gate trước fetch ⇒ 0 rác 403" **vỡ**. Bẫy: luật "OR nhiều key" **ĐÚNG ở tầng HIỂN-THỊ** [`GetMyMenuTreeQuery.cs:61-96` trả node khi con `CanRead`] nhưng **SAI ở tầng API-authz** — mặt thứ 2 của #82, lần này **menu-hiện RỘNG hơn API-cho** [#82 là chiều ngược]. Fix = gate đúng key policy CỦA endpoint; **mở controller đọc attribute TRƯỚC khi wire gate**, đừng suy từ cây menu. Reviewer bắt **trước ship**; Dev 13/13 role đều `Contracts=1 ∧ KeHoachKyKet=1` nên **chưa lộ** — lớp "chưa vỡ vì dữ-liệu hiện tại may mắn", vá ngay không đợi triệu chứng). **+S159 #84** (revoker-2-chiều: sửa data tay trên prod bị code-path ungated @restart ĐẢO NGƯỢC im lặng — grant menu SQL tay bị revoker [S92] lật 447/494 row; fix = code-first seeder + gỡ nhánh + guard 2-vế + khuôn 3-chân-kiềng; liên-quan #75/#76 chiều seeder). **+S133 #81-EXT** (instance 2 indirect-assignment, KHÔNG số mới: snapshot-NS-at-DaDuyet hook đặt ở finalize choke-point NHƯNG 2 site gán Phase TRỰC TIẾP bypass — admin-override `PurchaseEvaluationWorkflowService.cs:308` `= targetPhase` + seeder `DbInitializer:1323` `= current` → phiếu vào DaDuyet qua 2 đường này KHÔNG snapshot [frozen=0, display rơi về live = đúng bug đang vá]; reviewer adversarial bắt pre-commit, em-main + 3 invocation implement đều sót — cùng bài enumeration-writer #81; meta: field-đích có hook/derive/snapshot ⇒ grep MỌI assignment-site kể cả override/seeder). +1 S126 (**#83** số AGGREGATE session-cumulative tự-lão-hoá — audit COUNTS đổi bởi CHÍNH spawn review sau đó [2/2/0→4/4/0]; outward mời-reproduce = bảng per-lane theo run-id, KHÔNG số tổng; reviewer-gate bắt, em-main-solo sót). +1 S118 (**#82** menu-flag grant ≠ quyền API thật: display-layer [Permission `CanRead`→`GetMyMenuTree` FE-menu] ⟂ API-authz-layer [controller `[Authorize(Policy=)]`] = 2 tầng ĐỘC-LẬP; grant `Suppliers` R+C+U cho PRO nhưng `PUT/DELETE /suppliers` gate `[Authorize(Roles="Admin,CatalogManager")]` → PRO vẫn 403 sửa/xóa NCC [chỉ Publish/Import theo `Suppliers.Update` là ăn]; ngược lại `ReportsController` `[Authorize]` trần → mọi authed-user đọc `dashboard` tài-chính-HĐ ngược S92; fix gate `[Authorize(Policy="Reports.Read")]` per-method + grep controller authz TRƯỚC khi tin hiệu-lực grant; reviewer adversarial bắt, em-main-solo tin menu-flag=quyền thì sót; liên-quan #44). +1 S114 (**#81** derived-invariant re-derive ở write/select NHƯNG SÓT DELETE writer [DeleteQuote/DeleteDetail cascade] → xóa quote-selected cuối của NCC → `Supplier.IsWinner` kẹt stale [Any(IsSelected)=false] → `CreateContract Where(IsWinner)` gom NCC phantom → **HĐ giaTri=0**; fix helper `PeWinnerInvariant.ReSyncAfterQuoteRemovalAsync` gọi sau SaveChanges 2 handler; **enumeration-writer-trong-spec KHÔNG đáng tin** → grep MỌI `.Remove(`/`.Add(`/`=field` chạm entity chứa field-nguồn; chỉ **verify-adversarial-refute** bắt [invest/review/implement đều sót]; cardinality S87/S88 lên tầng mutation-path). +1 S113 (**#80** null-forgiving `!` che NRE trên external-parsed data: `SupplierExcelImportService.NewSupplier` gán `Code = r.Code!.Trim()` → NullReferenceException khi parser trả `null` cho ô cột-4 rỗng [ĐÚNG path R4 "thiếu Mã NCC → nháp"] → confirm nổ 500 CẢ batch dù preview classify New-draft KHÔNG lỗi; sibling `IsPublic=!IsNullOrWhiteSpace(row.Code)` null-safe nhưng NewSupplier thì KHÔNG; empty-string `""` chạy OK nhưng FE round-trip blank→JSON `null` → nổ. Fix `(r.Code ?? "").Trim()`. **Build 0/0 KHÔNG bắt** [`!` tắt nullable-warning]; chỉ test-before-critical bắt. Lesson: `!` null-forgiving trên dữ-liệu-parse-ngoài = mìn, dùng `?? default`). +1 S97 (**#79** backfill soi NHẦM bảng — transition-marker "[Duyệt KẾT THÚC]" nằm ở `PurchaseEvaluationChangelogs.ContextNote` KHÔNG phải `PurchaseEvaluationApprovals` → Mig 60 backfill match 0, phiếu finalize-CCM giữ flag=0 hiện sai "Đã được CEO duyệt"; fix Mig 61 query đúng bảng. PE 2 bảng lịch-sử tách vai [Approvals=ai-duyệt record :745 · Changelogs=chuyển-phase+marker LogTransition :1073]; verify marker-count prod trước khi tin backfill). +1 S97 (**#78** display-flag suy CONFIG thay RUNTIME → nói dối khi instance lệch config: `endsBeforeCeo` từ "workflow CÓ cấp finalize" thay "phiếu NÀY finalize" → phiếu lên CEO báo sai "không qua CEO"; nặng sau S97 default-flip opt-in; fix field runtime `EndedByLevelFinalize` Mig 60. Flag = "instance ĐÃ làm-gì" KHÔNG "config CÓ THỂ"). +1 S96 (**#77** SPA deploy bundle cache-lag: team thấy UI CŨ dù đã deploy + Ctrl+F5 — index.html no-cache ĐÚNG-chuẩn + JS hash-immutable nhưng browser giữ tab-SPA-mở/cache-local → verify bundle prod **BYTE-LEVEL** (curl + grep string-fix trong `/assets/index-<hash>.js`) phân-biệt cache-vs-deploy; **incognito = golden-test**; no-service-worker nên clear-site-data đủ). +2 S91 (**#76** deploy render config từ `.example` KHÔNG phải file-gitignored → prod thiếu setting tới khi điền tay · **#75** seed ungated per-code RESURRECT data đã-wipe mỗi restart → gate sau env-flag `DemoSeed:Disabled` + verify-by-restart-thật). +1 S90 (**#74** Chrome-MCP screenshot kẹt SPA-SignalR `document_idle` → PowerShell `CopyFromScreen` + Win32 lọc-process-`chrome.exe`). +2 S85 (**#72** lệch giờ +7h — DateTime lưu UTC nhưng serialize thiếu 'Z' → FE `new Date()`=local → `UtcDateTimeJsonConverter` global ép UTC-with-Z · **#73** UpdateDraft absolute-set CLEAR field SÓT khỏi pattern null-safe = bug-class S42 → guard `if (request.X is not null)`). +1 S78 **#71** (thêm enum value vào entity DÙNG-CHUNG → pollute UI/guard phân-loại theo PROXY-predicate `supplierId===null` thay vì enum tường minh; file-khi-duyệt purpose=5 lẫn "Bảng so sánh" + false-pass submit-guard → grep mọi field-proxy predicate loại value mới + build-verify TỪNG app; em-main grep no-leak bắt trước deploy). +1 S76 **#70** (FE absolute-set echo field anh-em từ server-snapshot + `invalidate()` fire-and-forget → cửa-sổ stale-echo mất-dữ-liệu khi lưu 2 ô liên-tiếp; guard `useIsFetching` gate nút Lưu tới khi refetch land; reviewer workflow bắt, impl self-review sót). +1 S72 **#69** FE bundle-hash non-deterministic + `deploy.yml` rebuild-FE-unconditional → bundle rotate kể cả commit governance (SPA-fallback-200 trap; cicd Run #312). +2 S69: **#67** Tailwind v4 accent palette thiếu stop (teal/violet/amberx/greenx chỉ 50/100/500/600/700; dùng -300 → teal/violet rơi DEFAULT Tailwind sai-hệ, amberx/greenx drop hẳn — build PASS, phải soi dist CSS) · **#68** IDE TS diagnostic giữa background-agent/workflow = snapshot dở-dang (TS server bắn mỗi save), chỉ tin build SẠCH sau-cùng (2× session này: re-skin + PE-FE đều false-alarm). Prev +1 S68 **#66** Tailwind v4 rule element thô `h1-h4{color:#0b1220}` viết NGOÀI `@layer` thắng utility `text-white` → heading render đen; fix ĐIỂM `text-white!` (important, grep dist confirm), KHÔNG move `@layer` (load-bearing ~30+ heading toàn app). Prev +1 S65 **#65** build csproj con (vd `SolutionErp.Api.csproj`) ≠ `dotnet build SolutionErp.slnx` (gồm tests) → miss test-compile khi đổi chữ ký record command (CreateDepartmentCommand +ParentId) → CI CS7036 FAIL-gated Run #291 (deploy chặn, prod nguyên — test-gate làm đúng việc). Fix: build full slnx trước push BE signature-change. Prev +2 S61: **#63** EF scaffold tự sinh `RenameColumn` SAI-semantics khi drop+add cùng type (test xanh không bắt — SQLite EnsureCreated không replay migration) · **#64** `dotnet ef database update` áp Design-DB 0-rows ≠ Dev-DB → data-migrate `Sql()` chạy thật lần đầu trên prod. Prev +2 S59 (#61 sqlcmd `-f 65001` · #62 rename natural-key UPDATE trước deploy) |
| User memory | **60** | 🔄 **re-ground S179** — đo lại ĐÚNG phương-pháp dòng này tự khai: `ls .claude/auto-memory/*.md | wc -l` = **61**, trừ 1 index `MEMORY.md` = **60** (`lead-stale-auditor` FLAG-9; máy MÙ trục này — không có cross-check). 🔴 Ô này trôi lại chỉ sau **9 nhãn phiên** kể từ lần re-ground trước ⇒ đây là ô **rụng nhanh**, đừng tin số cũ. 🧊 re-ground S170 — đếm đĩa 60 file trừ 1 index = 59 (số "31" stale từ S84; lead-stale FLAG @S169, ring2 verify, vá @S170 SAU khi ring chấm — đúng thứ-tự H24 §2(4) fire→chứng-kiến→vá). +S84 `feedback_derived_flush_execution` (derived→canonical flush = em-main execution KHÔNG gate user-confirm; monitor INFORM-only ≠ cần-anh-duyệt; chỉ ĐỔI-con-số/policy = quyền anh). +S79 `feedback_canonical_spec_over_broadcast` (adap pull canonical-command/§P đừng phỏng-theo broadcast + report-before-stamp dogfood + residual own-diary OK). +S75 `feedback_harness11_engine` (engine governance tự-bảo-trì + gotcha #30-via-Edit + multi-workflow-verify + git-add-specific lesson). re-ground S71 (H1 disk-count: 25 `feedback_*` + 3 `project_*`; STATUS "21" stale từ S64). +S71 `feedback_harness10_run_trace` (run-trace + 3 lesson). Prev +1 S64 `feedback_harness7_outward_writing_quality`; re-grounded S54 base 19 |
| Skills | 6 | 3 domain + 3 ops |
| Sub-agents | **29** | **+S185 🔬 `ring5-audit`** (vòng-6 nghi-thức cửa phiên — slot (41) ĐÓNG, YC-021/W-2 anh chốt "đồng ý thêm 1 nghi thức"; KIỂM output `tien-kiem-cua` + bảng-nhãn `ritual-labels` 4-nhãn, quyền **đề-nghị-XOÁ-ÁN** khi nhãn nhầm lớp — khác 3 ring kia; wire `session-end §L.b(m)` + `hmw.js` VALID_ROLES 28→**29**; ✅ nấc = **verified-runtime @S185 CÙNG PHIÊN** — registry hot-reload agent-MỚI [data-point lần 2 sau S107, MỚI ⟂ EDIT] + spawn-probe ALIVE fail-closed đúng ngưỡng; KHÔNG cần đợi restart 73) **+S176 🎨 ĐỘI STYLE 3 vai** (`front-end-reviewer-style` · `back-end-reviewer-style` · `database-reviewer-style` — **anh chốt TRỰC TIẾP**, không qua adap). 🔴 **Luật lõi anh giao:** *"quy tắc thì các tính năng đã deploy thành production rồi thì sẽ là chuẩn, trừ khi tao có điều chỉnh lại lần nữa"* — lý-do sinh đội là câu *"mày cứ làm đi làm lại hoài"*. **Ca THẬT làm anh nêu:** S176 vòng-4b lead dựng thùng rác KHKK **thiếu banner + dấu `🗑 xóa ≈`** trong khi màn thùng rác Duyệt NCC **đã chạy prod** có đủ cả hai ⇒ anh phải tự chụp màn gửi sang bảo *"ảnh chỉ là mẫu"*. Trục = **ĐỒNG-NHẤT** (có giống bản đã chạy không) ⟂ `reviewer` = **ĐÚNG-SAI** (có bug không) ⇒ chạy SONG SONG, không giẫm. Địa-phận RỜI theo glob diff: `fe-*/src/**` · `src/Backend/**` trừ `Persistence/**` · `Persistence/**`; **gọi theo diff chạm đâu**, diff không chạm ⇒ KHÔNG gọi (không phải bỏ sót). 🧊 **Anh nêu ban đầu 4 con** (có `clean-code-reviewer-style`) **rồi tự chốt lại 3** (*"3 con tao nhầm"* + *"chốt theo ý mày"*): con clean-code phủ chồng cả 3 con kia nên **không viết nổi câu scope-rời** mà roster này bắt buộc ⇒ trục clean-code (đặt tên · trùng lặp · mật-độ comment · pattern drift) **gộp vào từng con trong địa phận của nó**. 🔸 **Máy trước, vai sau** (đo S176): FE có ESLint chạy trước (`npm run lint`) nhưng **CI KHÔNG gác** (`grep 'npm run lint'` trong workflows = **0 hit**) và đang tồn **89 vấn-đề / 78 lỗi** (fe-admin 42 · fe-user 47); **BE 0 máy style nào** (0 `.editorconfig` · 0 analyzer · 0 `dotnet format`) ⇒ con BE gánh cả lớp cơ-học, khác con FE — 🧊 **đây là SỐ ĐO NGÀY 2026-08-06 (S176), giữ làm LINEAGE có ngày, KHÔNG phải trạng-thái hiện-hành**; nguồn sống = phép-đo per-spawn trong `back-end-reviewer-style.md` §0 (SỬA-6a @S179: claim này từng chép ra **4 site** ⇒ cắm `.editorconfig` là 4 chỗ sai cùng lúc, detector chỉ so SỐ nên không bắt). Cắm được máy vào CI thì **PHẢI cập-nhật lại persona con BE** trả lớp đó về máy. ⚠️ **~~roster 26 > `hmw_width.cap` 20~~ ✅ **ĐÓNG @S181: cap 30, roster 23 ≤ 30 ⇒ 0 lane bị bỏ**** ⇒ full-roster-sweep LOUD-skip nhiều lane hơn trước — số cap = quyền anh (O-7 vẫn treo, nay lệch rộng hơn). 🔸 **Nấc = executed-file / verified-pending-restart** — 3 vai CHƯA spawn-probe; `hmw.js` VALID_ROLES 23→**26**. **+S153 bộ-ba vòng Ctx** (adopt thư `0df10df4` — 🔄 **OWNER-VETO @S153 hub-form 3-vai**: bản đầu (38)(a) 1-vai OWNER-DELEGATED→LEAD-DECIDED, **anh bác cùng ngày** chốt trực tiếp *"Build đủ 3 vai như hub"* qua AskUser = owner chốt THẬT cho quyết này; 🔄 **RENAME cùng phiên theo lệnh anh** *"đặt tên giống hub và sisters để dễ audit"* — tên khai-sinh `ctx-pause-check`/`ctx-reload` → **hub-form `ctx-curator`/`ctx-verifier`** [đo đĩa 3 nhà: hub = curator/verifier/audit · VIPIX = check/reload/chain · hub≠sister ⇒ SE theo HUB-form, tiền lệ rename S149 lead-*]): **`ctx-curator`** vai-1 KIỂM nháp @mỗi-`/pause` (carve-out `pause.md §1` mirror hub O-1(a)) · **`ctx-verifier`** vai-2 ĐỐI-CHIẾU+NẠP-LẠI @mỗi-`/tiep` (dòng `LEAD-PHAI-NHAC-LAI:` = bằng-chứng nội-dung) · **`ctx-audit`** vai-3 SOI-CHUỖI @2-bookend (kiểm-vết vai-1/2, hồi-tố = fallback phiên 1-cửa). Nấc: ctx-audit `file-land + registry-surfaced @S153` cho CẢ 3 vai ctx [🔄 vá @S153 FLAG-6: bản đầu chỉ cấp nấc này cho `ctx-audit` trong khi `hmw.js:42` + writeGuard + README `:27`/`:199`/`:200` chứng 2 vai mới ĐẠT CÙNG nấc — khai THIẾU vẫn là lệch] — spawn-probe ALIVE cả 3 = phiên sau restart T9; hmw VALID_ROLES 20→**23** + writeGuard :228/:235; ⚠️ **roster 23 > `hmw_width.cap` 20** ⇒ full-roster-sweep LOUD-skip 3 lane cuối — số cap = quyền anh, O-7 (câu (40) đang treo). **🔄 RENAME @S149 (anh ratify "OK đồng ý"): 5 vai đổi tên đồng-bộ sister — `tooling-harvest-audit`→`ring1-audit` · `h24-audit`→`ring2-audit` · `sleep-audit`→`ring4-audit` · `lead-view-auditor`→`lead-stale-auditor` · `lead-omission-auditor`→`lead-gap-auditor` (ring* = 2 sister TRÙNG tuyệt đối; lead-* = hub-form, VIPIX-form là prefix). Nấc **NÂNG @cùng-phiên: `registry-listed-in-session`** — harness list 5 tên MỚI + gỡ 5 tên CŨ NGAY TRONG PHIÊN S149 (không restart), **TRÁI phép đo S120/S121 no-hot-reload** (môi trường có thể đã đổi — đây là data-point ĐO ĐƯỢC, không suy). Spawn-probe vẫn CẦN để chứng instantiate (list ≠ spawn được — đúng 0.6b). Tên cũ trong narrative/runs/history = vết lịch-sử, CỐ Ý giữ.** **+S145 🔬 `ring1-audit` (18th sub — round-KIỂM vòng tooling/harvest, C4/C4b adap dot-11 khoản ① `harness-dong-du-vong:51`, owner-decision [2] TÁCH mỗi-vòng-1-con-KHÔNG-gộp). Vai-KIỂM ĐỘC-LẬP đọc OUTPUT H1 `tooling-auditor` (4-mặt freshness) + H2 `harvest-curator` (5-trục integrity), **KHÔNG re-chạy đo**: verdict per-claim ĐẠT/TRƯỢT + falsify ≥2 + **tự tái-dựng ≥1 số CÓ-THỂ-SAI** (đếm `.claude/agents/*.md` vs roster-count H1 · N-harvested/M-spawned) + **thách-CLEAN** (H1 PASS/H2 GATE-0 → mở 1 skill "fresh"+1 sub "harvested" xem thật). 🔴 no-self-exempt ≠ H1/H2 (m-3 S139). **AUTO fire-after-measure @session-end §L.b(g-bis)** — owner-chốt S145 KHÔNG consent-gate (KHÁC trio/H24), fail-safe NO-OP nếu H1/H2 không chạy phiên đó (CẤM ĐẠT-ảo); tuần-tự C4b (invocation SAU con-đo, mtime chứng). Propose-only, backstop = git-diff commit-gate (KHÔNG dựa thiếu-tool `[carry:tools-whitelist-no-teeth]`). `model: opus`+`effort: max`+`memory: project`+`maxTurns: 16`. **Vai #1/3 round-KIỂM** — `ring2-audit` (vòng soi-lead) + `ring4-audit` (vòng nén-ngủ) land dần incremental (§6 broadcast báo-nấc-per-vòng, owner S145). 🔴 **Nấc = executed-file / verified-pending-restart** — registry Agent-tool KHÔNG hot-reload (`agents/README` §Memory discipline — anchor không-số-dòng, vá cite-dòng-trống @S151 per H1 F-3), spawn-probe alive cần **restart CLI**; run-thử-thật @session-end phiên sau. Design-doc: `runs/2026-07-22-S144-adap-dot-11/C4-design-3-vai-kiem.md`.** **+S145 🔬 `ring2-audit` (19th sub — round-KIỂM vòng soi-lead H24, vai #2/3 C4/C4b). Đọc OUTPUT `lead-stale-auditor` + `lead-gap-auditor` (🔴 KIỂM 2 con-đo H24, **KHÔNG soi lead trực-tiếp**) → verdict per-FLAG + tự tái-dựng ≥1 số (flag-count · mở 1 FLAG đối-chứng source · `class_repeat` `.session-counter.json`) + **thách-CLEAN** (H24 báo ít/0 FLAG ⇒ tự soi 1 surface tìm FLAG sót — CLEAN "lead ổn" là ca nguy nhất, khớp H24 §2(1) phép-thử-nhanh). Verify vai H24 KHÔNG tự chế class ngoài enum ĐÓNG `flag_classes`. no-self-exempt ≠ lead-stale/lead-gap (m-3; tên mới @rename S149). AUTO wired `session-end §L.b(j)(ii-bis)` sau cặp H24; fail-safe NO-OP nếu H24 không chạy (nhịp/consent). `maxTurns: 16`.** **+S145 🔬 `ring4-audit` (20th sub — round-KIỂM vòng nén-ngủ, vai #3/3 C4/C4b). Đọc OUTPUT `/sleep-recovery-memory-l2` (`.gist.md` mới + Fidelity verdict + claim giảm-byte) → verdict per-claim + **tự ĐO LẠI byte** archive gốc vs gist (đối-chứng claim) + **thách-CLEAN** (Fidelity 5P/0F ⇒ mở 1 gist đối-chứng `<period>.md` gốc xem có giữ 4-field load-bearing hay nén quá tay) + kiểm bất-biến gist-ADDITIVE (gốc byte-identical). no-self-exempt độc-lập lượt nén (m-3). AUTO wired `sleep-recovery-memory-l2.md Phase 4.5` sau nén; fail-safe NO-OP nếu 0 gist tươi. `maxTurns: 16`.** **+S141/S142 🧪🧭🧮 `harness-eval` + `harness-refine` + `harness-audit` (15th–17th sub — bộ-ba đồng-kiểm HỆ MEMORY, adopt AI_INFRA khuôn 5-câu `58e28bae` khối B, wave adap đợt-9/10; land S141 persona+seed+`hmw.js` VALID_ROLES 14→17, wiring nghi-thức S142 vòng-2 sau khi vòng-1 chết giữa chừng). Read-only INFORM-only propose-only, frontmatter **không khai Write/Edit** — 🔴 nhưng đo S143: **runtime VẪN cấp** (append cuối tool-list, 9/9 vai read-only; nhân-chứng `reviewer` đã Write+Edit thật) ⇒ đây là **tuyên-bố ý-định**, KHÔNG phải chặn-bằng-thiếu-tool; containment thật = single-writer + git-diff commit-gate · `model: opus`+`effort: max`+`memory: project`+`maxTurns: 18`. Trục = **CHÍNH HỆ MEMORY**, chạy **TUẦN TỰ** eval→refine→audit (🔴 CẤM `parallel()` — con KIỂM chạy song song sẽ chấm bản CŨ ⇒ verdict vô-nghĩa): `harness-eval` = con **ĐO** (chỉ trả số nguyên-văn từ instrument, CẤM số-từ-trí-nhớ) ⟂ `harness-refine` = con **ĐỀ-XUẤT** (4 lớp reinject/promote/archive/distill, bắt buộc có mục "đã cân-nhắc→BÁC") ⟂ `harness-audit` = con **KIỂM** (verdict ĐẠT/TRƯỢT per-claim + re-chạy ≥2 số load-bearing; PIN run-folder đích-danh, CẤM tự tìm "run mới nhất"). 🔴 **KHÔNG gộp** với H1 tooling-freshness / H2 harvest-integrity / H24 lead-surface / reviewer diff-code — 4 trục khác nhau. Nghi-thức 2-đầu-phiên **AUTO 1 vòng/phiên GIỮA 2 bookend** (`session-start §2.1.9(a)` canonical + `session-end §L.b(k)(i)` trỏ): owner chốt @S151 — em-main IN 1 dòng trạng-thái rồi CHẠY, KHÔNG chờ gật [🔄 vá @S153 FLAG-4 HIGH: ô này còn khai "consent-gated + anh gật mới chạy" sau khi owner (32) đã lật AUTO, và ngược chính `:466` cùng file; trio đã chạy THẬT 3 vòng S151/S152/S153]; skip → ghi vết WAL `trio: skipped S<nn>` (vết-2-lớp, chuỗi skip nhìn thấy được). Budget seed đo TƯƠI `measure-agent-memory.ps1`: eval 1547B · refine 1616B · audit 1513B (l2_*=0 = SEED-STATE đúng, chưa chạy lần nào). 🔸 **Nấc trung-thực = executed-file / verified-pending-restart** — 3 vai CHƯA spawn-probe lần nào (cần restart CLI + anh consent; KHÔNG được đọc thành verified-runtime).** **+S121 👁 `lead-stale-auditor` + `lead-gap-auditor` (13th+14th sub — H24 lead-self-audit, adopt broadcast `2026-07-14-Governance-harness-24`, anh chốt S119 `owner-decisions-15-07-2026`, land S121 wave-W2 `hmw.js` VALID_ROLES 12→14 CÙNG COMMIT roster+STATUS [R3-M2: lệch landing ⇒ C2/B3 flag mọi derived ghi "14" là stale-vs-12 ⇒ detector BÃO trên chính thay đổi của H24]). 2 monitor INFORM-only propose-only, cookie-cutter frontmatter monitor sẵn (`model: inherit` lúc-land [S124 re-pin → `opus`+`effort:max` cùng toàn roster] · `memory: project` · `maxTurns: 18` · 8 tool read-only, **NO Write/Edit**). Trục: `lead-stale-auditor` = **view LỆCH source** (5 class `view-*`) ⟂ `lead-gap-auditor` = **cái BỊ THIẾU** (6 class `gap-*` — +`gap-incident-unrecorded` @S143 owner-duyệt) — 🔴 **KHÔNG gộp** vào tooling-auditor(H1 tooling-freshness)/harvest-curator(H2 harvest-integrity): H24 §2(1) *"gộp là mất tiêu-điểm; cái ta cần là cặp mắt CHỈ dành cho lead"*. Class-flag = **enum ĐÓNG** `lead_self_audit.flag_classes` ở `.claude/agent-memory/memory-budget.json` (11 class = 5+6, vai CẤM tự chế — mở enum là quyền owner). Nhịp = `h24_cadence` cùng file (single-source H24 §2(3) — doc TRỎ key, KHÔNG chép số ⇒ 🔄 **đã GỠ digits `{6/15/3}` @S153** theo `ring2-audit` R-3: chép số ngay cạnh câu cấm-chép-số là **B1-copy** [số vẫn KHỚP canonical nên KHÔNG phải stale — F-6 chống vu-oan]; đọc số sống ở `memory-budget.json → h24_cadence`); 🔄 **HÌNH B @S149**: cặp soi-lead spawn **VÔ-ĐIỀU-KIỆN 2 bookend mỗi phiên** — `light_every` hạ thành **stats-only** (KHÔNG còn cổng bắn), `deep_every` GIỮ cổng nhịp [vá @S153 FLAG-5: ô này còn mô-tả bắn thuần-cadence; đối-chứng hành-vi = cặp chạy @counter 27 với light 1/6 CHƯA tới hạn]; counter `.claude/governance/.session-counter.json` (content-based `last_ticked_head`, KHÔNG blind-increment — hook `wal-flush.ps1` auto-commit `agent-memory/` mỗi turn sẽ làm hỏng đếm mù; đặt ngoài **4 path** hook CÓ CHỦ-ĐÍCH — *hook nới từ 3 lên 4 @S146 khi thêm `.claude/sessions/`; mệnh-đề "governance/ nằm ngoài" đã RE-VERIFY sau khi nới, vẫn đúng*). ✅ **verified-runtime S122** (spawn-probe toàn-roster-KHI-ĐÓ SỐNG post-restart — **N=14 tại thời-điểm S122**, chứng runtime, §Recently-Done S122; 🔸 +3 trio S141 CHƯA nằm trong phép đo này) **+ chạy THẬT S124** (dogfood 2-vai đầu-tiên, owner-triggered @counter 3) **+ S137** (light-audit consent OVERDUE 8/6 → 2 FLAG view-stale-status + 1 FLAG gap-decision-sunk). 🔸 Residual THẬT giữ: đường `hmw.js→agentType` cho 2 vai H24 chưa exercise (Agent-tool path đã chứng; workflow-path chưa) [S137 view-audit lật ⚠️→✅ khớp source, giữ residual]. 🔸 Từ-vựng "view"/"omission" chọn có chủ-đích tránh va-chạm: `governance-detectors.ps1:15` đã sở-hữu `derived-staleness`, và "GAP" quá-tải (`session-end` build-gap · `memory-selfimprove-audit.ps1` CRITERIA+GAP).** **+S107 📄 `office-document` (12th sub — Office document WRITE specialist: docx·xlsx·pptx·pdf + form-engine; floor OD1–OD10; VALID_ROLES hmw.js 9→10; anh giao trực tiếp S107 "Sub chính" Office; ✅ **verified-runtime S107 CÙNG PHIÊN** — registry hot-reload agent MỚI giữa phiên [S27 lesson thu hẹp còn EDIT-agent/command] + spawn-test PASS OD1/OD4/OD5 template thật, model self-report `claude-fable-5` [data-point #5 flip-8]; finding: 2 template `wwwroot/templates` 0-placeholder mẫu-blank).** **worker-tier-pin (owner-decision S124 2026-07-15 — thay all-inherit H8 S66, trước nữa two-tier H4; sub TOÀN-ROSTER pin cứng KHÔNG theo lead; H23-precedence ĐO S126: spawn-param THẮNG hard-pin ⇒ `/fable-real` SỐNG). Lead = **DEFAULT Opus 5 MAX** (thư `9c909007` @S149 (re-stamp 07-25 G-024a; pre `59ce1d0f`); **anh chốt ô canonical hiển-thị DEFAULT-fleet @S151** — *"cần gọi Fable tao chọn đầu mỗi phiên hoặc gọi bằng command fable-real"* ⇒ Fable = anh `/model` đầu phiên HOẶC per-invocation `/fable-real`; runtime thật = BƯỚC 0.6 probe mỗi phiên, KHÔNG ghi sổ mỗi flip — hết class stale-2-flip ring1 bắt @S150). 🧊 Lineage owner-choice/flip-chain FROZEN tới flip-8 (flip-9 S119 Opus-4.8 owner-choice + các lượt /model sau = per-session không enumerate, anti-churn S106):** em main Fable 5 (1M) Max (✅ **Fable RESTORED S98 2026-07-02** — lead self-report `claude-fable-5` + settings `claude-fable-5[1m]`; fallback-Opus H5 S62→S97 kết thúc, H5.6 hoàn tất) ⚠️ **S101 2026-07-03: runtime lead = Opus 4.8** (lead + 2 monitor + WF2 reviewer inherit đều self-report `claude-opus-4-8`; settings vẫn pin `claude-fable-5[1m]` → **Fable unavailable phiên này → H5-fallback tự-kích, revert-free, KHÔNG sửa frontmatter**; "Fable RESTORED S98" = point-in-time KHÔNG phải steady-state — inherit-chain resolve theo availability runtime; ✅ **S102 2026-07-06: Fable VỀ LẠI runtime** — lead + 2 monitor inherit self-report `claude-fable-5` → H5-fallback S101 kết thúc, pattern availability per-session xác nhận [S98 Fable → S101 Opus → S102 Fable → **S103 Opus** → **S104 Opus** (2026-07-06 Fable outage tiếp — S104 lead + 2 monitor spawn self-report `claude-opus-4-8` ×3, H5-fallback revert-free) → ✅ **S105 Fable** (2026-07-07 Fable VỀ lần 3 — lead + 2 monitor self-report `claude-fable-5` ×3, runtime-verified) → ⚠️ **S106 Opus** (2026-07-07 Fable outage lại — lead runtime self-report `claude-opus-4-8`, H5-fallback revert-free; flip-7) → ✅ **S107 Fable** (2026-07-10 Fable VỀ lần 4 — lead + 2 monitor self-report `claude-fable-5` ×3, runtime-verified; flip-8)], BƯỚC 0.6 probe mỗi phiên; per-session KHÔNG steady-state. 🔴 **[§Sub-agents = CANONICAL single-owner flip-chain — S106 gộp per anh-confirm; derived `agents/README §Architecture` · `session-start BƯỚC 0.6` · `session-end §commit-format` trỏ về đây [🔄 vá @S153 FLAG-1: 3 cite số-dòng cũ `:3`/`:37`/`:113` đo lại SAI cả 3 (đúng là `:5`/`:48`/`:315`) — vá bằng BỎ số theo luật đã áp @S151, không ĐỔI số], KHÔNG tự enumerate mỗi flip → chống churn 4-file/flip]**) · **TOÀN roster `model: opus` + `effort: max`** (worker-tier-pin S124; **A2 đo S126:** lane no-tier resolve `claude-opus-4-8` DÙ lead=Fable ⇒ pin ăn runtime, hết inherit-lead; số vai = cột giữa của chính row này — KHÔNG chép lại vào narrative, đó là cách row-14 và narrative-12 lệch nhau từ S121 tới S122; lineage: 7 demoted flip S66 → all-inherit S66–S123 [office-document S107 inherit-born] → pin S124) · effort Max. 10 product/quality + monitor INFORM-only (H1 · H2 · 2×H24 S121 · 3×trio-memory S141 · 3×round-KIỂM `ring1-audit`/`ring2-audit`/`ring4-audit` S145) — **liệt-kê NHÓM, số vai = cột giữa của chính row này**. Nấc H8 = **runtime-verified S98 (2026-07-02)** — spawn-test inherit-chain ×2 monitor self-report `claude-fable-5` (cả đội tự lên Fable khi lead restore, 0 sửa frontmatter — đúng thiết kế all-inherit). Prev two-tier H4 runtime-verified S57bis (spawn-test 2 chiều). |
| RAG chunks | 🟢 **service UP** · 🔴 **SE index STALE** | 🔴 **TÁCH 2 TRỤC @S159 — 1 nhãn nhị-phân DOWN/alive che mất trục thứ hai.** ① **service-liveness = UP**: đo LIVE 2026-07-29 `list_projects` → **7/7 project chunk > 0** (`solution_erp` **2449** · vipix_multisite 7090 · dh_y_duoc 15440 · namgroup 6106 · ashico 4742 · vipix_ai_infra 4176 · benhvien_aau 3024; chỉ `shared_global` = 0); **query THẬT** `search_code` → 1 hit **có ruột** score 7.156 ⇒ collection đọc được, **không phải vỏ rỗng** (metadata một mình KHÔNG đủ — có thể là registry-cache). ② **SE index-freshness = KÉM**: `last_indexed_at` = **2026-05-29** trong khi **5 sibling re-index 2026-07-29 08:21** cùng một lượt. **Lật thẳng DOWN→alive sẽ CHÔN trục ②.** 🧊 **Nhãn "DOWN từ S153" ĐÚNG LÚC GHI** (`33e7f68`, 07-28 20:50, 3 phép đo khớp, `chunk_count=0` cả 7 project) — service **hồi phục sau ~12h** ⇒ class `view-stale-status`, **KHÔNG phải lead ghi ẩu**; đừng quy lỗi cho lượt viết vốn có bằng chứng đúng. 🔸 **Caveat giữ (H1 F-4 → ring1 T-2):** H1 tuyên `last_indexed_at` "không đáng tin" (2447→2449 nhúc nhích), `ring1` **BÁC** bằng nội-dung — coi là **đáng tin**; muốn chắc tuyệt đối thì re-index rồi xem field có nhảy không. Re-index = AI_INFRA op (cần VOYAGE_API_KEY). *(FLAG-2 `view-stale-status` HIGH — `lead-stale-auditor` @S159, `ring2` tái-dựng 8/8 số. Lead trước đó chỉ vá `:6`, sót đúng ô canonical này = **canonical-poison**, cùng lớp khác site.)* |

**Bundle hash live (prod):** 🔴 **KHÔNG chép digit ở ô này nữa — nó lệch 5 lần liên tiếp (S166·S172·S180·S188·S191, lần này chậm 4 đời); điều-kiện tự-khai "lần 3 thì wire máy" đã quá hạn 2 lượt.** Nguồn SỐNG = artifact `cicd-monitor` mới nhất `.claude/workflows/runs/**/sub-cicd-*.md`. Mốc gần nhất **run #488 @S191**: eoffice `CR538vZx` 1.700.709 B · admin `C10ta-wB` 1.780.807 B (hash CI==local 4/4). 🧊 cũ @S188: admin `BZ1PG34E` (1.813.772 B) · user `0ObPwWFB` (1.728.765 B) — **đo LIVE trên VPS 2026-08-10 19:53-19:55 @S188** (`sub-cicd-cum.md:53-54`, ship-proof tầng đĩa: chỉ còn ĐÚNG 1 `index-*.js` mỗi app). 🔴 **Ô này lệch 2 ĐỜI khi bị bắt** (`lead-stale-auditor` DEEP FLAG-1, lần thứ 4 cùng ô: S166 → S172 → S180 → S188) — đời giữa `DeBPqp_c`/`CSIiQrhk` (đợt-1 S188) không kịp vào sổ. **Điều-kiện tự-khai "tái diễn lần 3 ⇒ wire máy đọc hash live" ĐÃ QUÁ HẠN từ S180 và chưa ai thi hành** ⇒ hoặc wire máy, hoặc gỡ câu tự-khai đó đi, đừng để luật chết nằm lại. 🧊 mốc cũ: admin `Ajv-MaCz` (1.783.465B) · user `YsXRkBSR` (1.701.224B) — **đo LIVE 2026-08-05 @S172 bởi 3 nguồn độc-lập** (cicd-verify `998ea55` §5.1 · lead `curl` · `ring2-audit` §2 đo ngoài repo); 2 hash đời trước đã **biến mất khỏi đĩa** (trả `text/html` ~900/876 B). 🧊 *S168 #444: admin `DLRf9TeA` · eoffice `C7TGA4Kn` — **ô này đứng STALE suốt S171→S172** dù `998ea55` đã ship 04/08; `lead-stale-auditor` FLAG-1 (HIGH) bắt @S172, `ring2-audit` F-2 HELD bằng nguồn ngoài repo. **Lần thứ hai cùng ô** (S166 F-2) ⇒ quy-trình tự-khai dưới đây **có luật mà không có người thi hành** — nếu tái-diễn lần 3 thì phải wire máy, đừng vá tay nữa.*; 🧊 K7 #442: admin `RgvHZkPH` · eoffice `D65FJPGd`; push kế tiếp SẼ rotate tiếp ⇒ **nguồn cập nhật ô này = cicd-verify lượt kế, đừng tin ô này quá 1 deploy** (bài "sạch lúc HH:MM" — ô này đã chết-ngay-lúc-viết 1 lần trong chính S166). 🧊 Lineage gần: K6 #440 admin `Ig1R5tAh` ROTATE · eoffice FROZEN-lành-tính cmp-byte · K4a #437 admin `1yiNV4VH`/eoffice `DoULfmdT` (post-F-1, 2-css khớp chứng đo-đúng-site) · K3 #436 admin `mySTlx42`/css `Cf3iCOOv` · eoffice `CZAYiWWa` FROZEN-hợp-lệ (diff toàn comment, cicd §5 dự-đoán-trước). 🧊 Lineage cũ (S162-S164, hash `B43R6Y17`/`NLI5umBg` đã chết): **Nguồn rotate = push `e5123ff`**, commit gắn nhãn `Docs: S162 closeout` **nhưng ship 6 file FE-src THẬT** (`PipelineStageFolders.tsx` · `PipelineTreePanel.tsx` · `usePipelineStages.ts` ×2 app) ⇒ rotate **real-src, KHÔNG phải #69-benign**; scope commit sai convention (đáng lẽ `FE-Admin`+`FE-User`, không phải `Docs`). 🔴 **Hại đo được — LỆCH 2 BỀ MẶT, không phải 1:** ô này đứng ở cặp S157 qua **2 đời deploy**, VÀ dòng `:6` ghi cặp S162 `DXoYDy7R`/`o8KDluD1` **chưa bao giờ là trạng-thái cuối** (snapshot chụp sau `bfc7b79`, trong khi `e5123ff` còn ship FE tiếp) ⇒ **cả 2 bề mặt owner đều lệch prod cùng lúc**. Đúng ca *"closeout-push kế có non-md sẽ rotate tiếp"* mà chính ô này đã tiên-liệu (precedent S99-#485 / S107) — tiên-liệu đúng, cơ-chế bắt vẫn không có. **Control-âm:** cặp S157 `8-QYcMOg`/`DptYR4wL` nay trả `text/html` **900 B** admin / **876 B** eoffice ⇒ bundle cũ đã chết. ⚠️ **CHƯA neo run-số CI** — lead chỉ curl 3 phép (2 hash live + control-âm), **không đọc Gitea Actions**; cần `cicd-monitor` xác nhận Run # + test-gate trước khi coi ô này đủ bằng-chứng. 🧊 *Mốc trước S157:* admin **`8-QYcMOg`** · user **`DptYR4wL`** (đo LIVE @S157 2026-07-28, **Run #419** `6250f39` — cicd PASS 9/9 + lead tự re-curl độc lập khớp từng byte, marker 2/2 mỗi app; **control-âm**: 2 hash CŨ `index-BK8w3QxU.js`/`index-DYnxSI0T.js` nay trả `text/html` **900 B admin / 876 B eoffice** ⇒ bundle cũ đã chết trên prod. 3 phép đo độc-lập: cicd-verify · lead re-curl · ring2-audit). 🔴 **Ô này từng đứng ở cặp `BK8w3QxU`/`DYnxSI0T` sau khi prod đã rotate** — `git show 3b6fabc -- docs/STATUS.md` chỉ có 2 hunk, **0 hunk chạm dòng này**; hại đo được: `cicd-verify-s157-diadiem.md:58` dùng chính ô này làm baseline ⇒ lượt deploy kế hoặc báo "ĐỔI" giả hoặc che một lần không-rotate (lead-stale-auditor FLAG-1 HIGH @S158). 🧊 *Mốc trước:* admin `BK8w3QxU` · user `DYnxSI0T` (S156 CI run 531 `f4494cf`; `Last-Modified` 14:41:15/14:42:10 +07 **nằm trong cửa-sổ deploy** — ship-proof, không phải hash-delta suông. Byte-verify 4/4 marker: `allowApproverDelete` 8/2 · `by-approver` 1/1 · `deleted=1` 1/1 · `view=approved` 1/1. ⚠️ **Không chứng minh hồi-tố** được bundle của riêng `4464a46` đã rotate lúc 14:12 — `f4494cf` đè lên sau 30 phút, không ai chụp snapshot khoảng giữa). 🧊 *Mốc trước:* admin `B2j1LQ-v` · user `C3wbJegk` (S147 CI #407 — re-stamp @S152: FLAG-2 lead-stale bắt ô này đứng S134 qua 5 nhãn trong khi `:6`/`:465`/HANDOFF đều S147; ring2 verify 2 lệnh độc-lập). 🧊 *Chuỗi rotate lịch-sử giữ nguyên:* (S134 — **`6664a61`** PE lũy kế TẠM TÍNH vs CHÍNH XÁC [0 mig — `ComputePendingAsync` complementary + DTO 5-field + FE sub-dòng amber + banner màn duyệt + D4 audit-note]; **Run #399** GO 5/5 5m27s gate-**528**-EXACT-từ-log rotate ×2 admin js `3NCdyODe`→**`BVCukFP5`** css `B--dUHcm`→**`CBzUlgOA`** / eoffice js `CKsoiNCI`→**`DoxyEOxh`** css `BuntB63r`→**`BHsBUA8e`** [FE-src đổi thật 6 file ⇒ rotate expected; CSS rotate = amber badge utilities, benign #69]; real-size 1.659.037/1.565.367B + LM 14:31:34/14:32:28+07 in-window; **byte-verify #77** `pendingPriorPes`=2 + `Tạm tính`=3 + `phiếu trước cùng gói thầu CHƯA duyệt`=2 PRESENT cả 2 js [control old-hash 900B text/html 0-hit — ct=text/html là discriminator sạch hơn size-919b]; Mig 67 top FROZEN + 89 bảng [0-mig by-construction]; smoke 4×200 + PE 401; lead spot-check độc-lập post-verdict: 4/4 hash khớp + marker PRESENT). **Prev S133** — admin **`3NCdyODe`** · user **`CKsoiNCI`** (S133 — **`d4fbced`** PE freeze NS phiếu DaDuyet [Mig 67 snapshot 11 cột + backfill 18/18 + FE 2-app badge 🔒 SHA-mirror `5534addb` + display-gate `budgetFrozen`]; **Run #398** GO 5/5 gate-520 rotate ×2 admin →**`3NCdyODe`** [CSS `B--dUHcm`] / user →**`CKsoiNCI`** [CSS `BuntB63r`] — prev `yCkX-2Bp`/`DKSD4p9k` @Run #397 S131-S132 [dòng-live lag S117→S133, hoist per precedent S104/S107]; **CSS cũng rotate** = badge sinh utility-class mới, benign #69; **byte-verify #77** `budgetFrozen`=1 + VN-string 🔒=1 PRESENT [old-control 0]; Mig 67 prod history-top + 11 cột + backfill 18/18 chua=0 + sys.tables **89**; smoke 4×200 + PE 401; `/tiep` S134 re-verify độc-lập 4/4: mig-top + health-200 + bundle-hash ×2 + filter 11/11). **Prev S117** — admin **`cFI7ih4a`** · user **`MxgooVZw`** (S117 — **`316a82f`** PE endsBeforeCeo pointer-aware [display-fix BE-only, phiếu chờ CEO hết báo "Kết thúc" sai] + duyệt-theo-khoảng Min–Max [Mig 66 + FE 2-app ProMinMax radio thứ 5]; **Run #387** PASS 5m36s rotate ×2 admin `Dd55jBpj`→`cFI7ih4a` / user `DVDr1UQ4`→`MxgooVZw` CSS-frozen [logic-only fingerprint]; **byte-verify #77** `ProMinMax`/`duyệt theo khoảng`/`cả Min và Max`/`Min–Max` PRESENT [bundle-cũ=0]; Mig 66 prod col decimal(18,2) + `__EFMigrationsHistory`-top + sys.tables **89**; smoke 200×3 · PE 401-secured; **#53-garble ×2** [invest-lane-1 + cicd-monitor] → SendMessage-resume + em-main curl cross-verify khớp). **Prev S116** — admin **`Dd55jBpj`** · user **`DVDr1UQ4`** (S116 — **`88368fd`** PE cho nhập giá ÂM ô báo giá [FE 2-app nút ± toggle + submit-gate `>0`→`!==0` + helper `hasRealSelectedQuote` 2-mirror `:201`/`:235`; BE submit-guard `:206` `Sum()<=0`→`All(==0)`; +9 test 486→495; **NO migration**]; **Run 386** PASS 5m28s rotate ×2 admin `D51OYyGV`→`Dd55jBpj` / user `BVdssm5S`→`DVDr1UQ4` CSS-frozen [logic-only fingerprint]; **byte-verify #77** `Đã nhập giá chào thầu`/`hoàn tiền NCC`/`phát sinh giảm`/`Đơn vị được chọn chưa có giá chào thầu` PRESENT [bundle-cũ=0]; smoke 200×3 · PE 401-secured · 89 bảng; cicd bắt bẫy snapshot-while-CI-running→poll-success TRƯỚC re-snapshot). **Prev S114** — admin **`D51OYyGV`** · user **`BVdssm5S`** (S114 — **`d436af2`** PE multi-NCC per hạng mục [Mig 65 backfill 2-chiều + BE re-key 5 financial→IsSelected + FE per-cell grid Detail×NCC 2-app SHA `ae3788e9`]; bundle rotate ×2 admin `acprMqfB`→`D51OYyGV` / user `Ck3BTDdA`→`BVdssm5S`; **byte-verify** `detailId`+`select-winner`+`hạng mục` PRESENT [bundle 1.65MB real-size]; smoke health/admin/eoffice 3/3 200 + endpoint POST select-winner bogus-401-live; **cicd garble #53 ×5 → em-main-solo curl-verify**; mig applied [API-healthy=migrations-ran-startup]). **Prev S113** — admin **`acprMqfB`** · user **`Ck3BTDdA`** (S113 — **Run #497** `5fa11b5` Supplier import v2 [Mig 64 publish/draft + dedup-MST + template + file mẫu] FE 2-app real-src rotate; JS admin `Cixlt_MA`→`acprMqfB` / user `BhBOG1dn`→`Ck3BTDdA` + CSS admin `Ds-E5neu`→`CfunQHbd` / user `Beb0Bb1h`→`DGqqHQXS`; ship-proof real-size 1.66/1.56MB + LM-in-window + **byte-verify** `Tải file mẫu`×1/`Đã công bố`×3/`Nháp (ẩn)`×4/`import/template`×1/`published`×5 PRESENT; Mig 64 prod 37/37-backfill sys.tables **89**; smoke health/admin/eoffice 200 + `import/template`-401-live + `suppliers?published=true`-401-live bogus-404-control). **Prev S112** — admin **`Cixlt_MA`** · user **`BhBOG1dn`** (S112 — **Run #496** `e100ef0` Supplier Excel-import Phase B FE 2-app [`SupplierImportDialog` NEW cả fe-admin+fe-user] + PE sign-off code-only; **real fe-src rotate — kết thúc #489→#495 non-determinism-freeze**; JS admin `BVyH-FY7`→`Cixlt_MA` / user `EDsZebvn`→`BhBOG1dn` + CSS admin `Bbtesa6B`→`Ds-E5neu` / user `BmuPz_Dy`→`Beb0Bb1h`; ship-proof real-size + Last-Modified-in-window + `"Database NCC"` marker PRESENT ×1; Mig 63 prod 2/2-col sys.tables **89**; smoke health/admin/eoffice 200 + PE-endpoint 200 + import-route preview-415/confirm-401-live bogus-404). **Prev S107** — admin **`BVyH-FY7`** · user **`EDsZebvn`** (S107 — **Run #489** `21387cd` +office-document 12th sub governance-only; **rotate benign #69-two-mode** [0 fe-src — Vite non-determinism], CSS frozen `Bbtesa6B`/`BmuPz_Dy`, real-size 1.64/1.55MB + Last-Modified-in-window 09:32/09:33 = ship-proof, Mig 62/89 frozen, smoke 200×3; hoist @S107-closeout per H1 flag D-BUNDLE-lặp — ⚠️ closeout-push kế có non-md sẽ rotate tiếp → Run #490 record nằm ở cicd MEMORY [authoritative], hoist ở bundle đầu phiên sau per precedent S99-#485). **Prev S104** — admin **`ChSNAJBK`** · user **`Bn2w1znH`** (S104 — **Run #488** `778fc98` Mig 62 Supplier expand 30-field; real-src-rotate FE 2-app SHA-mirror [form 4-section + Status select + `PathLink` 3 NAS-link], **sys.tables 89 pre==post no-new-table**, prod-verified marker grep-HIT, smoke 200×3; S104-shipped nhưng dòng-live `:27` lag tới S106 → hoist per H1 flag D-BUNDLE). **Prev S97** — admin **`mEGqlNWc`** · user **`Dnrp4PU1`** (S97 — **Run #484** `fb2dfa9` Mig 61 data-fix backfill; bundle rebuild **#69-benign** [0 FE-src change, review-workflow cicd re-snapshot LIVE → `CeTA7Z82`/`CGaAyXen` #483 đã bị #484 rebuild rotate]; backfill A/005/A/008 flag 0→1 prod-verified). **Prev #483** — admin **`CeTA7Z82`** · user **`CGaAyXen`** (S97 — **Run #483** `9e12e80` badge "✅ Đã được CEO duyệt" phiếu đi-hết-lên-CEO [PeFinalizeChip single-source + 6 call-site 2-app, đối xứng chip "⚑ Kết thúc·X"]; FE-only tận-dụng endsBeforeCeo runtime, no BE/mig; JS rotate CSS-frozen #69; byte-#77 "Đã được CEO duyệt" PRESENT cả 2 app + prev-badge additive no-regression; Mig 60 frozen; smoke 200×3 + PE-list 200). **Prev #482** — admin **`DR9q2VUy`** · user **`Bgz8u4E5`** (S97 — **Run #482** `8037fa0` endsBeforeCeo config→RUNTIME [Mig 60 `EndedByLevelFinalize`]: **Mig 60 applied prod** (history-top + col-default-0 EXISTS + backfill=0 UAT-no-marker + sys.tables **89** pre==post); **EF-ternary SQL-Server LIVE-confirmed** GET /purchase-evaluations 200 items=9 + PE-detail `31faef0d` 200 **endsBeforeCeo=False phase=7** = runtime-path chạy = **bug fixed LIVE** (NOT 500); JS rotate 2-app PeWorkflowPanel gate-diff, CSS frozen #69-REFINE; byte-#77 `endsBeforeCeo` PRESENT in-bundle; smoke 200×3. reviewer PASS 0-issue + test 440. **Prev #481** — admin **`Cf0o8dx8`** · user **`x8rppRAK`** (S97 — **Run #481** `1c8fb6a` PE finalize 2-fix [badge "không trình tới"→"Kết thúc tại {cấp}" + đảo default checkbox opt-in]; JS rotate real-FE 2-app `PeWorkflowPanel` diff, CSS frozen `Bbtesa6B`/`BmuPz_Dy` #69-REFINE logic-only; **byte-level #77** NEW `Kết thúc tại`+helper PRESENT / OLD `không trình tới`+`Đã BỎ tick` ABSENT; real-size 1.64/1.54MB; Mig 59/88-table frozen; smoke 200×3. FE-only mirror SHA `bcf812fd`, 0 BE/mig/test). **Prev S96** — admin **`COYAX-yQ`** · user **`0MU-kb4N`** (S96 — **Run #480** `0c2f9f6` price-lock; chuỗi 3 PE deploy #478 `e657faa` checkbox-opt-out → #479 `36cbf8b` chuông-stale-clear (BE-only) → #480 `0c2f9f6` khóa-giá-sau-duyệt, cicd PASS each ~5m; **FE JS rotate THẬT** (PeWorkflowPanel #478 + PeDetailTabs #480, 2-app) real-size 1.64/1.54MB vs 919b SPA-trap, CSS frozen #69-REFINE; Mig 59 frozen 0-mig; +Run #477 `ba4b8e0` NCC seed no-mig prod 21 NCC. **Verify byte-level:** prod `0MU-kb4N` CHỨA checkbox-fix ("BỎ tick"/"Đã BỎ tick") + "✅-static" cũ MẤT → checkbox "ko-được" = browser-cache KHÔNG deploy-fail). **Prev S95** — admin **`0T6vVJST`** · user **`BGXEVZO6`** (S95 — **Run #476** `18a17f5` H17 governance-only deploy; bundle rotate benign #69 CSS-frozen, prod 200×3, Mig 59 unchanged; cicd re-snapshot LIVE — pre-deploy `CkZ1MjC1`/`_-gpX7_Y`, mega-line S93 `CDn40vpV`/`CoPmPBg7` đã bị deploy trung-gian rotate từ S94). **Prev S85** — admin **`aKuNip19`** · user **`BUsL0HeQ`** (S85 — **Run #341** `49ac086` lệch-giờ TZ serialize UTC-with-Z; FE frozen #339+#341 BE-only. Chuỗi ~10 deploy #334→#341 buổi UAT anh Kiệt CV PRO: #334 `5a61254` batch CV PRO 6-fix → #335-#338 6 vòng UAT → #339 `1263c0d` workflow-preserve bug-class S42 → #341 `49ac086` TZ; #342 `d4f6021` docs+cicd BE-frozen, bundle giữ-nguyên gotcha #69-REFINE). **Prev S78** — admin **`CsJetgZH`** · user **`BVS0ApIm`** (S78 — **Run #330** `7886fd0` PE attach-file khi duyệt; bundle ROTATE từ S77 `BqKD3Y23`/`Cn-i349D` dù NO migration enum-only — gotcha #69 non-determ rebuild; cicd ship-proof byte-stable + fake-hash control). **Prev S77** — admin **`BqKD3Y23`** · user **`Cn-i349D`** (S77 — **Run #329** `e823694` banner Trả-lại; cuối chuỗi 10 deploy #320→#329 cùng ngày, cicd PASS each: #320 pill `DsSg6RRz`-era → #321 focus → #322 revert → #323 Mig57+notes `CPm4LTqm`/`BWJUAqEI` → #324 số-âm-đỏ `C6fx-0ea`/`N3sW4Div` → #325 indent `BhnNMucS`/`B1VebpXc` → #326 cờ-gấp-asymmetric `DwXqn37C`/`COXMCv7E` → #327 decouple `B0gboSAg`/`DbDg7pM-` → #328 notify (BE-only, FE frozen) → #329 banner **`BqKD3Y23`**/**`Cn-i349D`**). **Prev S76** — admin **`jOqxW4-p`** · user **`DbsznVvR`** (S76 — **Run #319** `21d1f4e` bảng lưới `<table>` ngân sách viền-ô; chuỗi S76 cùng ngày: #318 `e33481e` feature ma-trận-3-cột + badge quyền-NS `BhFDF9IJ`/`BAkuRl3C` → #319 **`jOqxW4-p`**/**`DbsznVvR`**, cicd PASS each, smoke 3×200, Mig 56 applied prod #318). **Prev S74** — admin **`BYF5vIMJ`** · user **`CB-tiRxd`** (S74 — **Run #315** `8655ebf` Mig 55 CcmNote, cicd PASS ~4m54s: Mig 55 applied prod CcmNote nvarchar(1000) nullable · sys.tables 88 · smoke 4×200 · 0 regression). **Prev S73** — admin **`Bv3jUCNo`** · user **`BWlMBQz6`** (Run #314 `6aa4dcb` FE empty-candidates guard fix; chuỗi 2 deploy: #313 `1d86abc` feature `OlNyG9OD`/`DSzSLVtL` → #314 **`Bv3jUCNo`**/**`BWlMBQz6`**, cicd PASS each). **Prev S72** — admin **`fc_xkNpJ`** · user **`DP-tBcg0`** (Run #312 governance commit `18fced6`; bundle ROTATE do **non-deterministic hash + deploy rebuild-FE-unconditional** (gotcha #69) — 0 FE source change, prod state/DB GIỮ NGUYÊN). **Prev S69** — admin **`BgNCjwsG`** · user **`CBvh0vtf`** (Run #308 PE cờ gấp + ngưỡng CCM; chuỗi 4 deploy session: #305 Văn phòng số foundation → #306 re-skin 10 page → #307 Office golive (BE-only) `Wt54PHYl`/`B99fMU6X` → #308 **`BgNCjwsG`**/**`CBvh0vtf`**). **Prev S68** — admin **`CNUv1jxY`** · user **`CpOskeS1`** (S68 — Run #304 `37752eb` fix tên đen→trắng; chuỗi #303 `6983609` `D532XZKG`/`CuFaBoWt` → #304 **`CNUv1jxY`**/**`CpOskeS1`**, cicd PASS each). **Prev S67** — admin `CcrZqfht`/user `DniDFUB_` (S67 — 6 deploy Run #297→#302; admin rotate chuỗi #298`xkSz9BfE`→#300`PxiZQkaw`→#301`I1fpLeYw`→#302**`CcrZqfht`** · user #297`BumgrwCJ`→#300`B36hGoKd`→#301`DrQYkzh0`→#302**`DniDFUB_`**; #299 tests BE-only cả 2 frozen, cicd PASS each). **Prev S65** — admin `BDwV5d0X`/user `DbVv6rsf` (Run #293-295). Prev S62 admin `0xKYGhhf`/user `C81ZdG9G` (Run #286). **Prev S59:** admin `B1DtNT9C` · user `D6uF3Mln` (Run **#282** `792c030` FINAL — bỏ nút Thêm hạng mục; ships kèm `80b64dd` gỡ Điều khoản TT, #281 cancelled-benign ancestor-verified). Chuỗi S59 cùng ngày: #280 `69997da` (`BKy_8OO9`/`XcZ6PRyA`, ships kèm `f21c55d` table-fixed #279-cancelled) · #278 `9c330d2` self-approve+quick-add-NCC (`BSh2fG2X`/`D22KfpPc`, authz probe 4/4) · #277 `faed59f` SearchableSelect (`ex7Tc92G`/`DzUeSk96`) · #276 `c869d26` rename 71 PMH (`BBA0KSWu`/`DzdTI18G`) · #275 `bbd1554` dọn demo WorkItems (FROZEN BE-only) · #274 `0eafcd3` tree 4 tầng (`DuU7OTym`/`DWyeTzf3`) · #273 `56882ac` wipe + tree v1 (`R9uGRxvw`/`DikfX1RD`). Prev S58: Run #386 `3ebaf84` admin `DMm9rtNA`/user `BUkOMn_Y` (chi tiết session log S58).
**Phase:** ✅ Phase 10 COMPLETE · ✅ **Phase 11 product backlog ĐÓNG TRỌN** · ✅ **Văn phòng số (E-Office) golive S69** (foundation PURO + re-skin 10 page + public read+create 16-key allow-list mọi role) prod-verified · ✅ **PE cờ gấp PRO/CCM + CCM duyệt-final theo ngưỡng (Mig 53 S69)** prod-verified · ✅ **PE ngân sách MA TRẬN 3 cột Dự án/PRO/CCM (bảng lưới `<table>`) + badge quyền-NS theo role trong Workflow Designer & flow Duyệt NCC (Mig 56 S76)** prod-verified · ✅ **PE UX batch S77 (10 deploy)** — cờ GẤP pill mọi danh sách+inbox · focus/inline+overlay decouple+"Xem mở rộng" · ô ghi chú giá đề xuất PRO/CCM (Mig 57) · số phân cách + số-âm-đỏ-ngoặc + indent mục con · cờ gấp GẮN=NV/GỠ=Trưởng phòng · chuông báo người duyệt · banner Trả-lại — prod-verified · ✅ **PE đính kèm file khi DUYỆT (S78, Run #330)** — người duyệt tải file lên lúc duyệt thay vì Trả lại; migration-free reuse-enum `ApprovalAttachment=5` — prod-verified · 🚫 Phase 9 Ops blocked (anh main coordinate — anh dừng).

> ⚠️ **Count drift fixed S40:** endpoints ~223→**211**, FE pages 53→**65**, menu keys 85→**~53**. Tables **84 confirmed correct** (DbSet 77 + Identity 7). 3 số "khó fake" (mig/gotcha/git) luôn đúng. Cause: số "incremented mỗi session" over/under-count optimistic — re-ground định kỳ.

---

## ✅ Recently Done (S180–S181 — 2026-08-07, phiên-LOGIC **L12**)

**Gói adap 7 GĐ (4 thư hub 120KB) — 10/10 wave chạy xong.** S180 đóng W0·W1·W2·W3; **S181** (window-2 qua `/tiep`) đóng phần còn lại.

- **Chủ dự án chốt 8 câu P1-P8** → `runs/2026-08-07-S180-adap-upgrade-pack-phased/owner-decisions-07-08-2026-dot-2.md`. Ký **2 RC-mark**: `RC-…-07-08-2026-20-57-48` (luật tự-trị 3 bậc) · `RC-…-21-42-10` (niêm phong W6, **khai rõ phạm vi ký**).
- **Vật mới:** `docs/governance/{naming-standard,ritual-labels,expensive-runs-view,so-yeu-cau-chu-du-an}.md` · `adap-reports/{bang-goc 12 TC, bao-cao-cuoi, 2026-08-07-nghi-thuc-hai-dau}.md` · `harness-11-engine` **+PHẦN O/P/Q** · `scripts/{naming-scan,artifact-integrity,tien-kiem-cua,naming-baseline.json}`.
- **Roster 26→28 vai** (+`score-counter` tầng-2, +`score-count-auditor` tầng-3) · `hmw_width.cap` **20→30** đủ 2 mirror ⇒ **slot (75) ĐÓNG**, hết LOUD-skip.
- **Máy vá:** `spawn-model-audit` (trước: **0 lane** thấy trên 5 phiên gần nhất mà vẫn in `TOTAL FLAGS: 0`; sau: **24/24** + mẫu số) · `nhip-no-probe` (+vế `so-yc`, sửa đơn vị đếm LẦN→MỤC) · `artifact-integrity` (+`VANG-DAT` mức cao nhất) · `hmw.js` (hết `undefined` im-lặng).
- 🔬 **Hệ 4 tầng bắt lỗi của tầng-1 ngay lượt đầu:** lead đếm 3 mục, vai `score-counter` đếm **1** — lead đếm theo DÒNG thay vì theo MỤC, tái tạo đúng đáp án luật gọi là SAI. Đã vá sổ (+cột `nhắc-lại-của`) và vá máy.
- 🔴 **Phát hiện đắt nhất (W6/A16):** `naming-scan` + `artifact-integrity` **MỒ CÔI — 0 cửa nghi-thức gọi**; đã wire `session-end §L.b(k-ter)`.
- **Còn mở:** W3b cắm mã thoát (chờ soak ≥1 phiên, **tự tan**) · báo-cáo cuối chờ anh duyệt → gửi hub. Nấc *đã được kiểm chứng* **chỉ hub cấp**.

## ✅ Recently Done (S177–S179 — 2026-08-06 → 08-07, phiên-LOGIC **L11**)

- **S179 (2026-08-07) — vá đội STYLE 2 vòng + H24 + drift-audit tháng** → [`sessions/2026-08-07-1200-S179-doi-style-va-2-vong.md`](changelog/sessions/2026-08-07-1200-S179-doi-style-va-2-vong.md). **0 file code nghiệp-vụ** (toàn governance + comment); build ✅ 2/2 app · test **645/645**.
  🔴 **Bài đắt nhất — chẩn-đoán sai vẫn PASS acceptance:** vòng-1 vá `SỬA-1` pass **12/12** rồi `reviewer` C7 bắt **2 MAJOR trong chính bản vá** (đổi ba-chấm→hai-chấm là **REGRESSION có điều-kiện**, không phải cosmetic · `porcelain | cut -c4-` **đẻ path RÁC** ở rename + path có dấu cách). Lead dựng sandbox đo lại, CONFIRMED cả 2 ⇒ acceptance đo **hình-dạng chuỗi**, không đo **hành-vi**.
  🔴 **Lớp `mỏ-neo TỰ-VÔ-HIỆU`:** con-trỏ số-dòng trỏ vào CHÍNH tệp chứa nó ⇒ tự thối mỗi lần sửa đầu tệp (112→118→121 trong 1 phiên) ⇒ **neo TÊN, không neo SỐ DÒNG**.
  🔴 **"Sổ nói dối theo hướng BI QUAN" ×3** (4 slot HANDOFF · E4 · `run.md` S173) ⇒ **leo thang lần 3 phải ĐO LẠI TIỀN-ĐỀ**.
  Kèm: H24 9 FLAG (flush 8 ô canonical) · 2 NỢ vòng-3 · 2 synthesis ORPHAN · di-trú cửa-sổ 6 · adap 2 thư (**bác Lớp 8 có số**: mtime cụm SE 0,7% vs hub 69%) · drift-audit tháng `PASS_WITH_FLAGS — 8` · `_mind` 99,67%→**84,2%** · #53 **4/4 vai garble, vớt trọn 4/4**.

## ✅ Recently Done (S171–S172 — 2026-08-04 → 08-05, phiên-LOGIC **L10**)

- **`998ea55` KHKK 3-panel mirror Duyệt NCC — verdict cicd = PASS**, prod khoẻ, 0 rollback. Test-gate #447 **644/644 Failed 0** khớp baseline tách-phần Δ0 · bundle 4/4 rotate khớp log CI tới byte · 2 endpoint MỚI **401** · mig repo 71 = prod 71 **set-diff 0/0 hai chiều**, tables 97 · smoke 8/8. Chi tiết → `.claude/workflows/runs/2026-08-04-S171-khkk-ui-mirror-pe/cicd-verify-998ea55.md`.
- **Chân #44/#85 đóng bằng đo** — nấc cũ *"credential UAT chết"* SAI (tra nhầm account đời cũ); bộ sống ở HANDOFF slot (64). 🔴 **Phạm-vi = 2 tổ-hợp vai** (`Drafter+Procurement` · `CostControl+DeptManager`), **chưa loại** nhánh vai thường khác vẫn 403.
- **Bookend-close 5 vòng / 11 sub** → `.claude/workflows/runs/2026-08-05-S172-bookend-close/`. Verdict: H1 `DRIFT 7` · H2 `GATE-HOLD 6` · lead-stale `9 FLAG (SÀN)+1 ESCALATE` · lead-gap `8 FLAG (3 HIGH)` · ring1 `67/69` · ring2 `ĐẠT 17/17` · trio `MIXED` → `2 action/15 bác` → `MIXED-PASS 50/59`. Session-log → `docs/changelog/sessions/2026-08-05-0900-S172-cicd-verdict-998ea55-close.md`.
- **Vá stale @closeout:** `STATUS:479` bundle (stale 2 phiên, lần 2 cùng ô) · counter 42→46 + deep 2/15→6/15 · `skills/README.md` ×2 ổ số cứng nằm cạnh chính con-trỏ B1 · overclaim `#85` siết **5 site / 3 file** cùng lượt.
- 🔴 **Nợ harvest ~306 KB chưa gom:** `S168-bookend-close` 162.916 B (9/10 vai) + `S171` 143.682 B (4 vai) + `a2bbcb9`/`b5799fc` (mở từ S162). ⚠️ **KHÔNG** harvest `S159-bookend-open` — ring1 chứng 4/4 byte-exact là **dương-giả**, harvest sẽ đẻ entry trùng trên 10 sổ.

## ✅ Recently Done (S168 — 2026-08-01)

- **GĐ3-D** `081557b` — cây toàn trình vào Panel-3 cả **3 trang** 3-panel (owner slot (63)(b)=D + "mở rộng"); khuôn `PipelineTreePanel` +prop `bodyMaxHClass` (default GIỮ ⇒ 3 host cũ 0 đổi); gate PWF-10/0-blocker.
- **K8-blocker Lines-editor KHKK** `0bfadc2` — dry-run bắt command **chỉ sống trong comment** ⇒ mọi phiếu KHKK mới kẹt Nháp vĩnh viễn; vá BE command+route `PUT …/lines/{lineId}` + FE select ×2 app + **5 Fact**; gate PWF-8/0-blocker. cicd **#444 PASS 6/6**, suite **644**.
- **K8 dry-run PASS toàn trình 2 nhánh** + **bộ fixture TEST** (`ADMIN_TEST` + 2 user TEST + master test) + **bộ dữ liệu fx3** PE/2026/A/054 → KHKK/2026/003 → HĐ ZZTEST DaPhatHanh → bản cứng.
- **Bookend @close 5 vòng / 9 vai** — H1 PWF-7 · H2 GATE-FAIL-5 · H24 stale 8 FLAG + gap 7 FLAG · trio eval MIXED-25 + refine 2-action/14-BÁC · ring1 **52Đ/4T** · 🔴 **V4 SKIP có khai** (0/17 shard hợp lệ — 14 đã nén dưới tên gộp, guard khớp-tên-cặp không kích) · 🔴 **ring2 + ctx-audit + harness-audit chết vì session-limit ⇒ nợ phiên sau** (run-folder đã PIN).
→ log `changelog/sessions/2026-08-01-1800-S168-gd3d-lineeditor-k8-dryrun-fixture.md` · run-trace `runs/2026-08-01-S168-bookend-close/`

## ✅ Recently Done (S153 — 2026-07-26)
- Pipeline anh lệnh trọn 3 nhịp: `/check-email`+`/adap-apply` → `/fable-real` invest (spec 9-task/24-checklist) → hmw Opus-5-MAX 2 đợt + lead-solo T6-T8 → checklist verify. Thư ① TRỌN (probe 2-nguồn `claude-opus-5[1m]`), thư ② **EXECUTED** (kiểm-chứng chờ T9 dogfood).
- Vòng Ctx soft-memory land: máy `mind-check` + template `_mind` + **3 persona hub-form** (`ctx-curator`/`ctx-verifier`/`ctx-audit`) + wire 4 lệnh + 2 khoá config + ĐÓNG ghost-wire `session_ctx_kb`; fault-inject 18/18 + 2 fix hậu-T4 (FI 6/6).
- Owner 2 quyết trong-phiên: **(38) VETO** 1-vai → hub-form 3-vai (kéo theo carve-out `pause.md §1`) · **T11 RENAME** theo chuẩn hub/sisters để audit chéo (đo đĩa 3 nhà; gap V5 `ring5-audit` → slot (41)).
- Bookend 2 đầu + trio auto: @open 9 spawn (ring2 bắt **M-1 MISS thật** persona-cadence-stale; audit re-chạy 7 instrument 24-số byte-exact) · @close 6 vai. **#53 ×14, 0 mất dữ liệu.** M9 seed 3 diary ctx (dir 23/23) · A7 401/401.
- State: **Mig 67 · 89 bảng · 532 test · gotcha 83 · menu 54 · Sub-agents 23 · counter 27 · bundle FROZEN `B2j1LQ-v`/`C3wbJegk` · RAG DOWN (defer AI_INFRA) · prod 37 NCC/17 user.** → log [`2026-07-26-1600-S153-ctx-adopt-3vai-rename.md`](changelog/sessions/2026-07-26-1600-S153-ctx-adopt-3vai-rename.md)

## ✅ Recently Done (S151 — 2026-07-25)
- Bootstrap trọn nghi thức (WAL-gate ⑤a residue-lành → anh chọn bỏ mạch · session-4 scaffold máy · thư 0/0 ×2 cửa · test 532 tươi · marks 9-AH hiển thị) → bookend @open hình B 6-vai → **trio vòng-AUTO đầu** (owner-direction codified) → **#27 3-fix + fault-inject 19 ca + live-verify** → #12/#14 chốt → batch doc-fix 11 → AS-17 promote 2-strike → tally #53 = 50 (derive) → harvest-hồi-tố orphan S144 + 3 synthesis đóng run → M9 diary on-behalf 9 vai.
- Owner-decisions @S151: trio-auto-1-vòng/phiên (giữa 2 bookend) · #21 deep-kéo-sớm @close + reset-có-bằng-chứng + gỡ frozen · #27 gật (đóng cùng phiên) · #14 ô canonical = default-fleet · #13/#4/#5/#6 giữ chờ UAT production.
- State: **Mig 67 · 89 bảng · 532 test · gotcha 83 · menu 54 · Sub-agents 20 · bundle FROZEN `B2j1LQ-v`/`C3wbJegk` · RAG 2447 · prod 37 NCC/17 user.**

## ✅ Recently Done (S149–S150 — 2026-07-24 → 07-25)

**S149–S150 — 2 arc governance + BOOKEND LƯỢT ĐẦU end-to-end (hình B) — governance-only: 0 prod-code, 0 mig, test 532 giữ, bundle FROZEN. Lead Fable 5.** Arc-1 hội-tụ: rename 5 vai (residual 0 bề-mặt hiện-hành) + 4 máy PS1 + C9–C12 + M6/M7/M9 wired. Arc-2: 23/23 adap-report (git-diff 23 A + 1 M) + probe Opus-5 2-nguồn + eval-của-eval 🔒 + email hub `3a05a6cc8509`. **@S150 bookend đầu:** H1 `PASS_WITH_FLAGS` 4F · H2 `GATE-PASS-5` (0 orphan/5 run) · lead-stale 6F · lead-gap 4F · **ring1 31/34-ĐẠT** (3 TRƯỢT = lỗi neo/quy-nguồn H1, 0 lỗi kết-luận) · **ring2 10/10-ĐẠT** + M-1 FLAG-sót `view-stale-role-desc` (thách-CLEAN ăn thật). Máy: tick CLEAN ×2 (23·24) · `h24-signal-write` 9-FIRE + `frozen-held` (khoá cắm trước theo lead-gap FLAG-2 — run.md input-pin từng khẳng-định-frozen-không-chạm-đĩa = lỗi S121, đính-chính tại chỗ) · M3 first-live bug `$PSScriptRoot` param-default (vá + guard). **#53 ×12 phiên-logic** (S149 ×5 + S150 ×7/7 first-return, 0 mất dữ-liệu) — tally derive-from-body chốt **45** + sub-class `ngược-#53`/`skeleton-ruột-rỗng` ⇒ *"ghi-đĩa-trong-lúc-làm = CẦN, KHÔNG ĐỦ"*. JUMP dải rộng ra {5,4,4,3} + asym{1,4} FROZEN chờ anh (#21). → log [`2026-07-25-1200-S149-S150-closeout-bookend-first-run.md`](changelog/sessions/2026-07-25-1200-S149-S150-closeout-bookend-first-run.md)

## ✅ Recently Done (S147 — 2026-07-23)

**S147 — product/UAT SHIP PROD (CI #407 PASS 5m36s):** ① PE người-soạn xóa/tải "Bảng so sánh" khi phiếu **Trả lại** (gate `(isAdmin||isDrafter)&&isEditablePhase` thay `readOnly` màn-hình, cả 2 app; reviewer né `:421` HoSoLink-bleed + SupplierAttachmentsCell Mig28 + BE-guard S78) · ② **gom 3 cặp dự án trùng dấu-cách trên PROD** (`FLOCK 01`/`FLOCK 03`/`CAL 01`→no-space; 5 phiếu+5 NS repoint, 3 ẩn mềm đảo được, qua `ssh vietreport-vps` integrated-auth) + vá gốc chuẩn-hóa `Code` (Trim + kiểm-trùng bỏ-dấu-cách, **+4 test** → 532). Bundle rotate ×2 verify 2-nguồn. → log `changelog/sessions/2026-07-23-1730-S147-pe-attach-fix-project-dedup.md` · merge script `changelog/data-fixes/2026-07-23-merge-duplicate-projects.sql` · commit `7d39d8d`+`4510cea`. **Lead Opus 4.8.**

## ✅ Recently Done (S148 — 2026-07-24)

**S148 — session-model PORT FORM HUB + `/check-email` 4 cửa + Sàn-3 dual-accept — governance-only: 0 prod-code, 0 mig, bundle FROZEN. Test 532 (45D+487I) đo TƯƠI.** Vào bằng `/tiep`. **Session-model:** form khớp hub từng file (`_context-s-<N>.md` STOCK+FLOW+STOCK-touched · `_pause-<i>`/`_tiep-<i>` marker 5-trường ~200B · `_snapshot-<i>` · `_end` thay `closed.md`); port `/snapshot` + `scripts/session_scaffold.py` (near-verbatim) + `scripts/session_ctx.py` **TRIMMED CÓ KHAI** (chỉ `machine-block`+`secrets-sweep`; KHÔNG port jsonl/overhead/cap-getter vì **chưa có caller** = ghost-wire). **`/check-email` 4 CỬA + 2 CHẾ-ĐỘ** (DÒ ~5ms ở `pause`/`tiep` ⟂ KÉO ở bookend) — vá vi-phạm **khoản-3 BINDING** hub `goi-chot` mà lead tự tạo ra 20 phút trước đó; DÒ quét **2 kênh** + định-tuyến (`outbox/se`→`/check-email` · `outbox/all`→`/adap-apply`). **STAGE-2** 10 thư fan-out tồn 5 ngày → verify 2 tuyến 10/10 → `inbox/ai_infra/`, backlog 0. **Sàn-3 ⑤** DUAL-ACCEPT hub+legacy + **vá bug `c=1` sống từ S146** (chốt-kết nay ĐÓNG TRỌN thư-mục; fault-inject **10/10 hai chiều**). 🔴 **H24 force-fire P=1, cả 2 vai garble #53** (×27) — `lead-view` ghi diary trong lúc làm ⇒ vớt trọn từ đĩa; `lead-omission` không ghi ⇒ phải resume. **9 FLAG.** Nặng nhất **CANONICAL-POISON**: ô canonical `STATUS:448` Tests ghi **528/483I** trong khi `STATUS:6` + session-log S147 ghi **532/487I** ⇒ `dotnet test` tươi chốt **45D+487I=532** ⇒ ô canonical **sai thật**, đã vá; kèm cặp bất-đối-xứng NGƯỢC CHIỀU cùng file (`STATUS:6` "gotcha 82" vs row 83 vs `gotchas.md` anchor 83). Và **backfill entry S146 bị thiếu** trong `.session-counter.json` ⇒ **JUMP đã chạm từ S146 mà không ai biết**; tick S148 kết-luận "2 < 3 không jump" là **đọc từ sổ tiền-S146**. 4 lỗi lead tự bắt trong phiên (vi-phạm BINDING · vá tool không hỏng theo lời khai không đo · báo sai "index thiếu 17 dòng" · cân-giả do giữ 2 form). 🔴 **Nấc trung thực: CHƯA adapt đủ** — `#18 tiep-window-crash` chưa wire · `session_ctx_kb` vẫn ghost-wire · meld-forward chưa đo · C14 còn 6 khoản BLOCKED/DEFER · 3 khoản owner-gated `O-2/O-3/O-7` câm 5 nhãn (nay kéo lên #17-#19). → log [`2026-07-24-1800-S148-session-model-form-hub.md`](changelog/sessions/2026-07-24-1800-S148-session-model-form-hub.md) · commit `2448393`+ *(re-anchor @S151 — sha cũ `977ba18` dangling-sau-squash, lớp E-012/AS-16; stale FLAG-3 bookend S151)*. **Lead Opus 4.8.**

## ✅ Recently Done (S146 — 2026-07-22 → 07-23)

- **Áp `spec-apply-hub-s145-v2` 5 axis** (governance-only, **0 prod-code / 0 mig**): C7 **§N.8** predicate 4-vế · hook `wal-flush.ps1` **4 path** (+`.claude/sessions/`) · Sàn-3 **⑤ + ORPHAN-L** · D2 **KIỂM end-only** · `§L.c` completeness-gate **có RĂNG** (cấm bare-PASS) · line-ref `:7`→`:13`. Workflow S145 chết giữa chừng ⇒ `/tiep §4` **relaunch-cắt-gọt** `wf_3d803740-41d` 3 worker DISJOINT-file 3/3 DONE.
- **🎯 LIVE-VERIFY hook 4-path PASS repo THẬT** — `da7ee8a` nuốt `sessions/session-1/probe.md` (worker chỉ verify được cây tạm + **khai thật** giới-hạn ⇒ lead làm nốt).
- **Owner-decision @S146:** `session_ctx_kb=64` **tường-minh** (giữ nguyên caveat ghost-wire — 0 reader) · session-model **3 câu**: scaffold **idempotent** (tách *cấp SỐ* ⟂ *tạo THƯ-MỤC*) · `closed.md` **WIRE** (`session-end §6.3-bis`) · V2 **auto** (gỡ cổng NGƯỜI, **giữ** cổng NHỊP 6/15/3 — **chưa** phải bookend-hub).
- **🥇 session-model chạy TRỌN VÒNG đầu tiên:** `session-1/pause-S146-*` → `/tiep` → `resume-S146-*` → **ORPHAN-L cân sổ, im đúng**. Tín-hiệu **⑤ fire lần đầu và fire ĐÚNG** (không vacuous).
- **H24 force-fire** (P=8 `wal: pause` ⇒ OVERDUE bất-kể counter; luật "auto" mới ⇒ chạy thẳng): 2 vai + `h24-audit` → **7 FLAG**, vá hết + re-verify. Bắt được: sweep-consent **sót 6 site** · `closed.md` **wired-but-declared-unwired** (ghost-wire **chiều ngược**) · **owner-decision `[7]` bị ghi đè do tái-dụng slot-index** (mất uỷ-quyền push, lead hỏi lại 3 lượt).
- **🔴 3/3 vai lane-H24 garble `#53`** — con ghi-đĩa-SỚM cứu trọn, con ghi-MUỘN mất trắng phải resume. Chứng lại: chặn `#53` **không** bằng prompt hay hơn, mà bằng **ghi-đĩa-trong-lúc-làm**.
- **Sổ:** orphan run-folder **3 → 0** (retro-harvest 2 folder S144 + `implement-synthesis` S145) · carry **14 → 20** (6 mục mới **có tag** `[carry:*]`, trước đó tách đôi 2 sổ không sổ nào đủ) · **E-013 + E-014** vào error-ledger · `.gitignore` +`scheduled_tasks.lock`.

## ✅ Recently Done (S141–S143 — 2026-07-20 → 07-22)

**S141–S143 — Wave adap đợt-9/10 ĐÓNG TRỌN (7 thư) + closeout OUTWARD — governance-only: 0 prod-code, 0 mig, test 528 giữ, bundle FROZEN `BVCukFP5`/`DoxyEOxh`. Roster 14 → 17.** **S141 vòng-1** `wf_3e1ade40-704` **CHẾT giữa chừng** → reconcile ground-truth-từ-ĐĨA, đóng orphan partial-honest 5/13. **S142 vòng-2 CẮT-GỌT** `wf_1e936b16-30c` (đúng `tiep.md §4` relaunch-đã-cắt-gọt, KHÔNG chạy lại từ đầu): 2/2 lane, 0 error/0 garble, 424.755 tok; AC1–AC13 lead verify độc-lập. Land: **bộ-ba `harness-{eval,refine,audit}`** (3 persona + 3 diary + `§2.1.9`/`§L.b(k)` consent-gated TUẦN-TỰ) · **contract v2 dangling-head** khuôn ①a (3-điều-kiện `squash-benign`, giữ FAIL-LOUD cho counter-lùi ∧ object-missing) + detector H24-5 INFORM-sink · **stamp-decode** khoan-dung 3 dạng + port `scripts/stamp_verify.py` · **annex phép-8** + `_tick_invariant_note` · **sweep roster 13 site** · draft session-model prereq (a)+(b) — **0 wire** (chờ owner duyệt VC). **S143 `/tiep` closeout OUTWARD** (anh gật): adap-report **7/7** đủ 5-trường · email hub `6c94873f72e0` selftest exit 0 · STAGE-2 7 thư → `inbox/ai_infra/` 0-pending cross-check 2 chiều · squash K=8 → push `2757e41` (0 `wal:` lọt remote, 12==12) · vá drift **skill-matrix 15→17 row** (thiếu 2 vai H24 từ S121). **Contract v2 chạy runtime LẦN ĐẦU** @S143: tick 16→17, nhánh `OK-reachable`. **+vế-4 `pull-cach` cho `nhip-no-probe.ps1`** (fault-inject 7 ca 2-chiều: isolation · anti-Goodhart OUTBOUND · FLAG khi ngưỡng≤N · IM khi ngưỡng>N; ngưỡng CỐ Ý để trống = quyền anh). 🔴 **2 phát hiện khai theo G-015:** (a) **whitelist `tools:` KHÔNG chặn ghi ở runtime** — 6 vai read-only không khai `Write/Edit` nhưng roster runtime vẫn cấp, **append ở cuối** (tell = vị-trí; `implementer-backend` giữ đúng thứ-tự file) ⇒ "chặn-bằng-thiếu-tool" là **tuyên-bố ý-định**, backstop thật = git-diff commit-gate; cơ-chế **chưa kiểm** · (b) **pull-lag do canh nhầm chỗ** — "watch `broadcasts/inbox`" không bao giờ thấy thư CHƯA kéo. 🔴 **Nấc cao nhất khai được = `executed-file / verified-pending-restart` — trio CHƯA spawn lần nào.** **Vòng audit S143 (anh gật "làm hết"): 3 lane — `reviewer` FAIL 1C/4M/4m/1nit + 19 số tự re-đo · `lead-view` 3 FLAG · `lead-omission` 3 FLAG/3 INFORM; lead re-đo ĐỘC-LẬP từng finding trước khi vá, 9/9 vá xong.** 🔴 **CRITICAL = E-012/AS-16 `bằng-chứng-tự-huỷ-sau-squash`** (7 report + email neo sha `wal:` chưa-push → squash phá đúng sha đó → re-anchor `2757e41` + **errata `e43484cef10f`** gửi hub, CẤM sửa bản đã stamp). MAJOR khác: "TRIPLE 17/17/17" **chọn enum DỄ** (`README:225` tự xưng "ĐỦ roster" còn 14 + "4 monitor"; `:27` "Roster THẬT" còn 14 — **lọt vì AC4 grep theo SỐ mà 2 site liệt-kê TÊN**) · `TOTAL 46 "== baseline"` sai (baseline ghi = **45**; số đi 45→46→47) · 4 site còn khai "NO Write/Edit" như cơ-chế chặn. 🔴 **Tool-grant nay có NHÂN-CHỨNG first-person:** `reviewer` (frontmatter **0** Write/Edit) **đã Write+Edit thật** — đếm lại **9 vai** read-only cùng hình dạng (bản đầu khai 6 = under-count). **3/3 sub garble #53, cả 3 resume, 0 mất dữ-liệu nhờ ghi-đĩa-trong-lúc-làm** (sổ đếm ×20 qua S118 → **×23 qua S143**). +vế-4 `pull-cach` cho `nhip-no-probe` (fault-inject **7 ca 2 chiều**, ngưỡng để trống = quyền anh) · `flag_classes` **10→11** (+`gap-incident-unrecorded`, anh duyệt — vai lead-omission **từ chối tự chế class** và escalate đúng luật CLOSED-enum). State GIỮ NGUYÊN: **Mig 67 · 89 bảng · 528 test · gotcha 83 · menu 54 · prod 37 NCC/17 user.** **Lead Opus 4.8.** *(H1 @S143 bắt: đây là row session DUY NHẤT từng thiếu dòng `Lead <model>` — nay bổ sung. 🔴 Còn CHỜ ANH: `settings.json` pin nay = `claude-opus-4-8[1m]` từ 2026-07-20 trong khi ô canonical §Sub-agents còn ghi "Fable 5", và `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 anh, em không tự đoán.)*

---

## ✅ Recently Done (S140 — 2026-07-18)

**S140 (2026-07-18) — Direction owner "đóng đủ 5 vòng + session-model" → 5 VÒNG ĐÓNG PHẦN SE TỰ CHỦ trong 1 phiên — governance-only: 0 prod-code, 0 mig, test 528 giữ (re-verify ×2), bundle FROZEN `BVCukFP5`/`DoxyEOxh`. Lead Fable 5 (owner-choice flip mới, MTv3 0-caveat).** Bootstrap trọn nghi thức (tick 14 · detector 45-baseline-0-mới · ancestor PASS lần đầu sau 3 fail-loud · runtime-proof cửa 4/4 `cadd24ae`) + **probe reviewer 5-nhãn → `624c378d` executed-runtime**. **Vòng-2:** trả nợ force-fire S139 = cặp H24 light-audit #3 @counter 14 (view 1-FLAG-LOW xử @closeout · omission 1-FLAG-MED xử-trong-phiên bằng draft+email+carry · carry-age non-vacuous LẦN ĐẦU hook-streak-9 · +backfill diary S137 on-behalf). **Vòng-4:** sleep-compress lần 2 = 5 verbatim kỳ 2026-07 183.054B → 5 gist additive 69.175B (`aa88d01`) — **Fidelity-gate reviewer CÓ RĂNG 4-PASS+1-FAIL** (gist inv-cb sót 2 recon-cluster khai "drop 0" → grep 6-token bắt → re-distill +CỤM 11), verbatim FROZEN assert-2-chiều, sleep-INFORM chuỗi-3 GIẢI. **Phép-8 đo LẦN ĐẦU toàn fleet** (hub chưa dogfood): FAIL-as-written / PASS-with-tailoring DP-3, khai 2-nấc + đề nghị hub reword. **Session-model:** draft v0 `docs/governance/session-model-se-draft.md` (nhãn 2-tầng S-vật-lý+L-logic · bảng VC-1/2/3 · 4 câu hỏi) + **email hub GỬI `b9ef5ede5679`** (reviewer-gate outward GO-WITH-FIXES 3-fix-áp-trước-stamp; FIX-3 điều-chỉnh-có-căn-cứ `291550ff`=ref-của-hub) + nhắc wave-1807 (bộ-ba SUB = blocker cuối). H22 dogfood: pause 42b899e (harvest-liền verdict-gate về đúng lúc chốt) → autonomous-tick tự tắt đúng luật → `/tiep` reconcile 1-LỆCH (commit-governance đã-land — ground-truth thắng). Closeout: §L.a 0-RCA · H2 GATE-PASS-0 (8/8 vết, Sàn-5 vacuous, orphan 0/37) · H1 PASS_WITH_FLAGS/3 (đều xử @closeout) · 2 monitor tự-compact md5-verified (harvest 19.7→14.9K · tooling 18.1→15.9K) · memory-triple exit 0/0 + A7 251/251 · spot-check 4/4 tươi. State GIỮ NGUYÊN: **Mig 67 · 89 bảng · 528 test · gotcha 83 · menu 54 · prod 37 NCC/17 user.** → log [`2026-07-18-1300-S140-nam-vong-dong-session-model.md`](changelog/sessions/2026-07-18-1300-S140-nam-vong-dong-session-model.md)

---

## ✅ Recently Done (S138–S139 — 2026-07-18, closeout @S139 = session-end MỚI lần đầu)

**S138–S139 (2026-07-17→18) — Wave adap 3 bản AI_INFRA 17-07 ĐÓNG TRỌN + owner-quyết 4-khoản + quyết bộ-ba SUB vòng-3 — governance-only: 0 prod-code, 0 mig, test 528 giữ.** Nấc: đính-chính-kép `624c378d`=**verified-pending** (+grounded 5-nhãn reviewer, agent-md chờ restart; Δ2 already-compliant SE-originated) · master-checklist `cadd24ae`=**executed** (khối 2-tầng in 4 cửa, 2/4 runtime-proven ngay trong phiên [pause ×2 + tiep ×1], heading 26/28/7/14 bất-biến) · năm-quyết `123d8272`=**executed** (+2 detector INFORM-only **C6 cite-2-nấc + H24-4 pending-flip** fault-inject 13/13 ×2 độc-lập, TOTAL 45 giữ + count-riêng; K3 3-hit/3-traced candidate RỖNG; G-011 ladder canonical on-disk error-ledger; K4 rules §6.6). Pipeline: invest-fable → em-main-solo-gate (review-fable #53) → hmw 2-lane opus-MAX (L1 CLEAN · L2 #53→disk-truth +260/0 nguyên vẹn) → **L3 reviewer GO 0C/0M/3-nit** (re-measure từ git HEAD + fault-inject byte-exact; nit-1 sàn-5 → ĐÃ rename "Luật đánh-số chờ-anh"). Hậu-wave: anh quyết 4 khoản (1a·2-OK·3-rename·4-map-Vòng-5) + **bộ-ba SUB vòng-3** ("đồng ý scripts nhưng phải có thêm sub đồng-kiểm") + chỉ-đạo ĐỒNG-BỘ cross-project → 3 email hub selftest-PASS (`c5ea71b1`·`21b71a1e`·`fc2b218d`), **3 khoản chờ-HUB khuôn chung** (1a dangling-head · 4a cửa-duyệt-hứa-máy · khuôn 3-sub harness-eval/refine/audit). Tick 13 + ancestor FAIL-LOUD lần 3. Session-log → [`2026-07-18-0200-S138-S139-adap-3-ban-wave.md`](changelog/sessions/2026-07-18-0200-S138-S139-adap-3-ban-wave.md). Lead Fable 5.

---

### Prev: S135–S137 (2026-07-17, closeout @S138 `/tiep`)

**Wave adap `khung-nhip-nam-vong` (broadcast AI_INFRA 17-07) ĐÓNG TRỌN + H24 light-audit #2 + H25 fold-per-label — governance-only: 0 prod-code, 0 mig, test 528 giữ (re-verify tươi @S138: 45D+483I 0-fail/0-skip), bundle FROZEN.** Session-log → `2026-07-17-S135-S137-adap-khung-nhip-nam-vong.md`. Lead Fable 5.

- **S135-S136 (adap 7-item `da349fc` + check-email `55ef8f6`):** tick đa-điểm-vào **OR-guard** (head + session-label) + **label-convention `S<nn>` PIN THÀNH LUẬT** (conversation mới = nhãn mới, kể cả `/tiep` — CẤM reuse; thiếu luật này OR-guard NO-OP nhầm ngay cửa tiep ⇒ phép-7 +0) + force-fire consent closeout-gộp-sổ (§L.b(j)(vi)) + `scripts/nhip-no-probe.ps1` dòng-nợ 3-vế + 2 detector H25 closeout-ritual + luật non-JSON-args + sleep-khuôn byte-display; AC A10/10 B6/6 C8/8 · reviewer GO 0C/0M/2n · fault-inject 9/9.
- **S137 (đo + audit + fold, `7760cdf` + `c1e9686`):** RESTART verified (bản `/tiep` mới tự chứng) → **phép 7 PASS** (counter 10→11 = +1 đúng chu-kỳ pause–tiep) + **phép 1 PASS** cửa-sổ mới 3 tick/3 nhãn (baseline 3/9 FAIL) → **H24 light-audit #2 @counter 11** consent-gate DP-3 lần đầu (view 2 FLAG `view-stale-status` FIXED cùng phiên · omission 1 FLAG MED `gap-decision-sunk` repeat-2 → NAMED `[carry:dangling-head]` @closeout · 4 INFORM) → **H25 FP W3: FOLD-per-label + guard INFORM batch≥3** (fault-inject 12/12 [9 regression + 3 fold-case], detector TOTAL 46→45 = đúng 1 FP classified, W1/W2 giữ) → adap-reports ×5 + email hub `6e93be2fa7b1` selftest-MATCH + STAGE-2 7 file processed (`processed | ai_infra` = 32).
- **Closeout @S138** (S137 chết trước session-end; Sàn-3 bắt ② 4-commit-thật-chưa-push + ④): HANDOFF re-stamp carry 10+1 + promote DP-2/DP-5 + memory-triple exit 0/0/0 (⚠️ MFE **GOODHART-WARN strikes 21→23 while set FITS** — INFORM anh) + measured-block +2 row H24 (lead-view 3332B · lead-omission 3691B đo tươi; row khác giữ snapshot S107 — full re-sync để monthly 2026-08-01) + tick S138 (counter 12, `last_ticked_head` cũ REACHABLE — không dính dangling vì S137 chưa từng squash) + squash `wal:` + push (17 ahead: 4 thật + 13 wal).
- State GIỮ NGUYÊN: **Mig 67 · 89 bảng · 528 test · gotcha 83 · menu 54 · bundle admin `BVCukFP5`/user `DoxyEOxh` (Run #399) · prod 37 NCC/17 user.**

## ✅ Recently Done (S134 — 2026-07-17)

**PE lũy kế TẠM TÍNH vs CHÍNH XÁC SHIP PROD (`6664a61`, CI Run #399 GO 5/5, bundle rotate ×2) — UAT anh Kiệt FDC (chat 15/07, chốt "Vậy em xử lý theo hướng này đi"): vì "cung đặc thù" phiếu sau trình khi phiếu trước cùng gói CHƯA duyệt → chia 2 số: lũy kế TẠM TÍNH (tất cả phiếu, phần chưa-duyệt note màu amber) ⟂ lũy kế CHÍNH XÁC (chỉ DaDuyet — semantics Kenny S117 GIỮ NGUYÊN 100%); người duyệt cuối THẤY danh sách "phiếu trước chưa duyệt" — informational, KHÔNG hard-block.** Session-log → `2026-07-17-S134-pe-luyke-tam-tinh.md`. Lead Fable 5, HMW-ON, pipeline anh chỉ định: `/fable-real invest` → spec → `/fable-real review` → hmw Opus 4.8 MAX ×2 invocation → reviewer pre-commit → cicd. **0 MIGRATION** (Mig 67 giữ top, 89 bảng).

- **Ground-truth lật khung (invest Fable):** row 1 "NS trình duyệt trước" ĐÃ gồm ChoDuyet sẵn (`PeBudgetAccumulator.cs:42-48`) — gap thật = **row 2 "Kỳ trước đã chọn thầu"** (DaDuyet+IsWinner only) + row 5/6 dẫn xuất → spec gọn: thêm nhánh MỚI, KHÔNG đụng predicate cũ.
- **BE (4 file):** `ComputePendingAsync` + `PePendingAccumulation` (pure-add +68/0 — **ComputeAsync body 0-diff = chính-xác/snapshot/backfill bất động by-construction**); tập chốt: PriorPes = NOT IN {7,99} · delta-selected = NOT IN {1,7,99}+IsWinner (GỒM ChoDuyet = gap chính) · delta-submitted = NOT IN {1,7,10,99} (no-double-count); DTO append-cuối 5 field (2 construction site frozen-defaults/live-fill); **D4 audit-note** 1-chỗ-trong-helper (`Action=Update` KHÔNG Transition — né #49; signature giữ → 5 call-site 0-diff insertion-only).
- **FE 2-app (6 file):** types ×2 (+5 field) · PeDetailTabs `5534addb`→`d28eaa16` ×2 IDENTICAL (**`sub?: ReactNode` slot-prop** trên 2 cell-component → sub-dòng amber "Tạm tính" row 1/2/5/6, N8 count-đúng-delta; danh sách mã+badge `PurchaseEvaluationPhaseLabel`, N9 KHÔNG link tránh 403-S89) · PeWorkflowPanel `a83a58e1`→`bebc0ada` ×2 (banner gate M2 `!readOnly && phase===ChoDuyet` enum-constant + reminder TRONG dialog duyệt; nút Xác nhận 0-diff).
- **Pipeline chất lượng:** fable-real invest **#53-garble → sub-file 8-phần cứu** (lần 3 pattern thắng) + lead verify 7/7 claim + 2 errata · fable-real spec-review **GO_WITH_FIXES 0C/2M/9n** (M1 D4-shape đầy-đủ tránh hmw tự đổi signature vỡ A6; M2 banner-gate — edge-note "tự ẩn" SAI với predicate gốc; D4-seeder CLEAR set-trực-tiếp) → lead áp trọn → spec v2 · **hmw INV-2 [BE‖FE] + INV-3 [test] 3/3 lane 0-garble** (hmw index sub-file GLOBAL theo taskList → hết collision S133) · reviewer pre-commit **PASS 0C/0M/4-nice-to-have** (tự chạy build+npm+filter; xác nhận #81-indirect 5/5-qua-helper + seeder-bypass-cố-ý an toàn) · lead full-suite độc lập exit-0.
- **Test 520→528** (+8 `PePendingAccumulationTests` — C6 complementary exact-numbers là regression-guard chính-xác-bất-động).
- **Squash §5.0 TRƯỚC push:** reset --soft → 9 `wal:` local tiêu → 2 commit sạch (`e53a693` docs S133 + `6664a61` feature) → **0 wal: lọt origin** (bài 57× S119).
- **cicd Run #399 GO 5/5** (return CLEAN): gate 528 exact-từ-log · Mig 67 frozen + 89 · bundle ×2 byte-verify 3 marker PRESENT + control-0-hit (learned: **ct=text/html là SPA-trap discriminator sạch hơn size-heuristic**) · smoke 4×200 + PE 401 · lead spot-check độc-lập khớp 4/4 hash + marker.
- ⚑ **Flag anh (D1):** phiếu NHÁP vào danh sách cảnh báo (mã + badge) nhưng KHÔNG cộng tiền vào tạm-tính (S89 nháp riêng-tư + số chưa chốt) — lời chat "tất cả lun" nếu anh muốn cộng cả tiền nháp thì báo em đổi (1 predicate).
- State: **Mig 67 · 89 bảng · 528 test · gotcha 83 · menu 54 · bundle admin `BVCukFP5`/user `DoxyEOxh` (Run #399) · prod 37 NCC/17 user.**

## ✅ Recently Done (S133 — 2026-07-17, closeout @S134 `/tiep`)

**PE freeze ngân sách phiếu DaDuyet SHIP PROD (`d4fbced` 16 file +7831/−63, CI Run #398 GO 5/5, bundle rotate ×2) — UAT anh Kiệt FDC 07-16: cập nhật ngân sách gói thầu (`PeWorkItemBudgets` live) làm phiếu ĐÃ DUYỆT đổi số theo (retro-display) → R1 phiếu DaDuyet bất biến · R2 phiếu mới đọc bản cập nhật gần nhất · R3 DB delta nhỏ không bảng mới.** Session-log → `2026-07-17-S133-pe-budget-freeze-daduyet.md`. Lead Fable 5 owner-choice, HMW-ON, pipeline `/fable-real invest` → spec+errata → hmw implement Opus MAX ×3 invocation staged → reviewer → cicd.

- **Mig 67 `AddPeApprovedBudgetSnapshot`:** 11 AddColumn snapshot budget-summary per-phiếu (`ApprovedBudgetSnapshotAt` + Pro/Ccm ×6 + Prev ×4) chốt tại finalize choke-point (helper `PeBudgetAccumulator` 4-site `:862/:901/:934/:1109`) + backfill `Sql()` OUTER APPLY phiếu DaDuyet cũ (**prod 18/18, chua=0**) — **no new table (89 giữ)**. Em-main-solo mig (INV-B chết trước mig — #53; Dev catch-up Mig 66 lag).
- **Display-gate `budgetFrozen`:** phiếu DaDuyet đọc snapshot (badge 🔒 "Ngân sách chốt tại thời điểm duyệt" @ "Tổng hợp ngân sách trình ký", FE 2-app SHA-mirror `5534addb`), phiếu chưa duyệt đọc live. +2 terminal-guard chặn sửa NS trên phiếu đã kết thúc (chặn cả Admin).
- **Reviewer PASS_WITH_FIXES 0M/2S/2N → 2 SHOULD FIXED:** cả 2 = **#81-EXT indirect-assignment** — 2 site gán Phase TRỰC TIẾP bypass choke-point (admin-override `PurchaseEvaluationWorkflowService.cs:308` + seeder `DbInitializer:1323`) → FIX + test site-5 AdminOverride + comment `[S133 site 5]`.
- **Test 509→520** (+11 `PeBudgetFreezeTests`: T0 repro test-before RED→GREEN + T1-T9 + site-5). FULL **520/0** (45D+475I) · npm build ×2 PASS.
- **cicd Run #398 VERDICT GO 5/5** (verdict về SAU `/pause` — harvest-liền; **S134 `/tiep` re-verify độc-lập 4/4 KHỚP**: mig prod top + health 200 + bundle-hash ×2 + filter 11/11): gate 520 · Mig 67 prod 11 cột + backfill 18/18 · bundle admin `3NCdyODe`/`B--dUHcm` · user `CKsoiNCI`/`BuntB63r` (CSS rotate = badge utility-class mới, benign #69) · byte-verify `budgetFrozen`+VN-string PRESENT old-control-0 · smoke 4×200 + PE 401.
- ⚠️ **#53 ×3 + 1 overwrite-lesson:** fable-real invest + INV-B ×2 + INV-C — 0 mất việc, đều recover từ disk sub-file (ghi-đĩa-trong-lúc-làm); **lesson MỚI: 2 invocation cùng role+index chung run → sub-file OVERWRITE** (file INV-A bị INV-C đè — multi-invocation chung run phải đánh index/tên riêng per-invocation).
- State: **Mig 67 · 89 bảng · 520 test · gotcha 83 (#81-EXT) · menu 54 · Sub-agents 14 · bundle admin `3NCdyODe`/user `CKsoiNCI` (Run #398) · prod 37 NCC/17 user.**

## ✅ Recently Done (S131+S132 — 2026-07-17)

**Session-end S131 mở ĐÚNG nghi-thức đầu-tiên sau 3 closeout chạy tắt; S132 `/tiep` nối (S131 chết session-limit) → đóng TRỌN §L.b.** Session-log → `2026-07-17-S131-S132-session-end-3-gap-don-monitor.md`. Lead Fable 5.

- **3-gap vận-hành báo hub** (`e46863c8` + direction `closure-cadence` `641bf8ca` ĐANG BÀN): GAP-1 counter H24 không tick trên mạch pause→`/tiep` (dưới-đếm ~37%/8-nhãn) · GAP-2 3-closeout S128-S130 không spawn monitor · GAP-3 diary 2 vai H24 rỗng sau first-run S124. → **E-011 + AS-15 "nghi-thức chạy tắt"** vào error-ledger (guard episodic, verified S132).
- **Dồn monitor S127→S131 (S132):** H2 GAPS→CLOSED (0-orphan/**31 run.md**/33 dirs · seed 2 diary `lead-{view,omission}-auditor` retro từ S124 · rmdir stray S119) · H1 DRIFT-FOUND 1 thật → FIXED (`rag-onboarding-guide:118/:134` contextual_retrieval true→false + gỡ claim "+15% recall" chưa-đo; roster **khớp 4-nguồn** (N=14 khi đó); plugin 0-delta).
- **(j)** counter=7 · light 4/6 · deep 4/15 · OVERDUE none · (i) spot-check 3/3 (sha 2 email re-compute + tick ancestor REACHABLE) · (h) marks n-a.
- State: **Mig 66 · 89 bảng · 509 test · gotcha 83 · menu 54 · Sub-agents 14 · bundle FROZEN @S129-S132** (`yCkX-2Bp`/`DKSD4p9k`). CI commit chốt: **run #397 `72f68d1` GO** (gate 509 exact · smoke 4×200 · AS-6-refined lần 3: `.session-counter.json` non-.md ⇒ trigger).

## ✅ Recently Done (S127→S129 — 2026-07-16, ghi bù @S132 — 3 closeout gốc chạy tắt E-011)

**Adap TRỌN đợt broadcast 16-07 (5 bản + thư điều-phối) — commit `289ba96` PUSHED, CI run 509/#395 GO (gate 509 exact · smoke ALL 200).** Chuỗi 4-lớp guard: A fable-reviewer GO-ADAP (BÁC claim hub "bản 2 duy nhất") → B fable-invest draft 6/6 việc (garble #53 — ghi-đĩa-trong-lúc-làm cứu trọn; **LỆCH-1: config RAG per-project nằm TRONG repo SE**) → C fable-reviewer#2 GO-WITH-FIXES (4 fix: F1 README-count · F2 sai-loại-hash · F3 item-rơi · F4 future-claim — 2/4 chỉ lộ khi CHẠY THỬ lệnh verify) → D HMW 3-wave 11/11 + review 2-lane GO-COMMIT (owner-gated 0-diff).

- **Diff thật:** `rag.json:26` contextual_retrieval=**false** (owner-final `f5ce2778`, lineage git-chính-xác 05-22) · backfill hạ-nhãn calibrated→heuristic (C1 190c11ba) · `reviewer.md:46` +Measured-label gate (verified-pending restart) · `session-start.md:206` re-tune chu-kỳ-2-CỦA-SE · bookend đính-chính "5 sai + 2 đổi-cách-đọc" · **4 adap-reports NEW** + bookend UPDATE · email hub báo-nấc 6c-PASS `c0ac7486447e` · STAGE-2 move 6 file hash-preserve → `inbox/ai_infra/`.
- **S129 (/tiep):** anh trả lời 4 owner-gated: (ii) **ÁP** — XOÁ `measured_token_estimate` giữ trần cao nhất 100K (verbatim-archive trong proposals) · (iv) **ÁP** budget:65 tail-note · (i)+(iii) **CHỜ-HUB** (lời-chốt canonical phía hub chưa broadcast / hub đang build seal-verify). Ask do-token GIỮ pending.
- wf-runs: `wf_a965db21-e87` (w1) · `wf_869809a1-f99` (w2) · `wf_7436bb45-e20` (w3) · `wf_44eeed6b-3b4` (review) — run-folder `2026-07-16-S127-adap-dot-16-07/` 11 sub-md + 2 synthesis.

## ✅ Recently Done (S130 — 2026-07-17)

**Anh chốt 3 mục S126 owner-gated + áp trọn (`cdb6279` PUSHED — docs-only, CI skip đúng paths-ignore 4/4 file).** Session-log → `2026-07-17-0013-S130-owner-gated-3-muc-s126.md`. Lead Fable 5, 0 sub spawn, 0 run mới.

- **B3 = #2 TÁCH DÒNG** (anh chọn, KHÔNG re-tier): mega-line tách tại ' · '→CRLF — STATUS 261→686 dòng · HANDOFF 13→317 dòng; **round-trip 2-tầng PASS** (RAM + đọc-đĩa-đảo-phép, `-ceq`) = giữ-nguyên-chữ 100%; EOL/BOM nguyên-trạng. ⚠️ Token luôn-tải KHÔNG giảm (trade-off anh biết khi chọn) — carry `retier-megaline` **ĐÓNG theo quyết-định anh**; muốn giảm THẬT sau này = mở carry MỚI.
- **B4:** `memory-budget.json:74` relabel EN **"upper-bound (heuristic-notice) headroom"** (config mark `…01-58-01` — anh gật qua AskUserQuestion; old-literal `real-token headroom` 0 hit còn lại).
- **Carry mark-S123 GỠ:** câu treo `ACTIVE-MARKS.md:33` ("mark MỚI hay chú-thích đủ?") đã có lời đáp = chính mark `RC-…17-23-10` (thân dòng 25, stamped Active-High S123) → dòng **RESOLVED @S130** chèn ngay sau, dòng treo giữ làm audit-trail.
- **Detector suite 44** — so tracked-vs-tracked với base `295c70c` (git worktree + `-RepoRoot`): **0-mất/0-mới** ⇒ tách dòng KHÔNG giết chứng-nhân/KHÔNG sinh flag mới (17 dòng "MỚI" trong phép so thô = artifact: `auto-memory/` untracked nên worktree không có). Δ−1 vs nhãn "45" S126 thuộc về S127/S129 (trước phiên này). 🎯 **Side-benefit cấu-trúc: carry-age detector HẾT vacuous** — đọc được 7 carry-lines/52 segment (trước tách: mega 1 dòng vật-lý ⇒ carry-lines=1 ⇒ streak≡1 vĩnh-viễn).
- **E-010 + AS-14 mới (error-ledger):** đo text bằng `Get-Content` KHÔNG `-Encoding` trên file no-BOM → PS5.1 đọc ANSI, ký-tự Việt đếm ×2-3 — em báo anh "mega phình ~13K/ngày" **SAI** (số thật UTF-8: STATUS +113 ch · HANDOFF +2.5K từ S126); tự-bắt + đính-chính TRONG-phiên, quyết-định anh không dựa số này. Guard: **ép `UTF8Encoding` tường-minh mọi phép đo text**.
- State: **Mig 66 · 89 bảng · 509 test · gotcha 83 · menu 54 · Sub-agents 14 · bundle FROZEN** (docs-only — không đổi so S126).

## ✅ Recently Done (S125+S126 — 2026-07-16, closeout GỘP)

**Adap tiền-đề-vòng-4 (S125 @`010d12c`) + `/tiep` resume thực-thi TRỌN spec fable-real (S126).** Governance/tooling-only: 0 prod-code, 0 mig, test 509 GIỮ, bundle FROZEN. Session-log → `2026-07-16-S125-S126-adap-tien-de-vong4-h23-execute.md`. Lead Fable 5 cả 2 phiên (WAL dự-kiến Opus 4.8 MAX cho S126 — owner-choice, lệch ghi pilot D5; leg cross-model resume vẫn PENDING).

- **S125 (tóm — chi-tiết commit `010d12c`):** relabel token CẬN-TRÊN (negative-control 3-probe) + vá hash-verify byte-safe 2 command + email đính-chính hub `58f5afd8` + `/fable-real` spec 3-mục.
- **S126 NHÓM A (restart-verify):** 🎯 **H23-precedence ĐO — SPAWN-PARAM THẮNG frontmatter hard-pin** (lane `reviewer` pin-`opus` + `tier:'fable'` → resolved **`claude-fable-5`**) ⇒ **`/fable-real`·`/fable-clone` SỐNG, không cần re-pin**; **A2** worker-pin ăn runtime (lane no-tier → `claude-opus-4-8` DÙ lead=Fable ⇒ loại inherit-lead); **A3** autoMemory WRITE-path OK (file mới `project_h23_spawn_precedence.md`). Báo hub `2026-07-16-se-to-ai_infra-h23-precedence-test-result` stamp `945cf3ad` (**reviewer-gate FAIL bắt 3 lỗi TRƯỚC stamp**: aggregate-cumulative non-reproducible [→ gotcha #83] · "3 việc" thực 2-ask · hedge hub-17/17).
- **S126 B1 sweep+vá `all-inherit` floor-sống:** 15 dòng/5 file + 3 cùng-lớp lọt-pattern → VÁ HẾT (`vocab-alias-map` §3 canonical-flip → worker-tier-pin · STATUS:25/:42 · `agents/README:5` · `fable-real-runbook` ×11 · `harness-11-engine` ×3 · `hmw.js` :9/:44-51 · `spawn-model-audit.ps1` Section-D flush H8→S124 + effort-check MỚI · `governance-detectors.ps1` C3 seed +`worker-tier-pin`). Fault-inject 2-chiều PASS (inject 2 lỗi → đúng 2 FLAG; happy-path 14-dương-giả → 0) + re-grep 0 floor-sống + detector-suite TOTAL 45 = baseline 0-flag-mới. Class-gốc: S125 vá 2 command-file KHÔNG grep sibling (root_cause ×2 — memory updated).
- **B6:** 0 mail mới; hub CHƯA xử 2 ask thư đính-chính (re-stamp 2 broadcast `NO-DECLARED-SHA` + pin-decode snippet) — ghi-nhận chờ, KHÔNG stamp trước.
- **🔒 CHỜ ANH (B3/B4):** `runs/2026-07-16-S126-adap-spec-execute/b3-b4-owner-gated-proposals.md` — B3 mega-line giữ/tách/**re-tier (em khuyến-nghị)** + B4 diff 1-dòng `memory-budget.json:74`.
- State: **Mig 66 · 89 bảng · 509 test · gotcha 83 · menu 54 · Sub-agents 14 (worker-tier-pin opus+max — đo runtime S126) · bundle FROZEN `cFI7ih4a`/`MxgooVZw`**.

## ✅ Recently Done (S124 — 2026-07-15)

**Adap wave AI_INFRA (reply-wave-s122 + 4 broadcast mới) + 4 owner-decision APPLIED + H24 dogfood lần đầu.** Governance/config-only: 0 prod-code, 0 mig, test 509 GIỮ. Session-log → `2026-07-15-S124-adap-wave-reply.md`. Lead Opus 4.8 owner-choice.

- **`/check-email` + `/adap-apply`:** 1 reply pulled+hash-verified+processed + **6 adap-report** (4 new: erratum-h8 · h17-cadence-bookend · do-token · bon-vong; 2 reconcile: push-guard `dd4b0176` · presence-not-age) + **hub report GỬI** (`28c424d4`, selftest MATCH).
- **Reviewer @MAX ensemble** (`wf_184f32e2-9da`, 3-lane opus, L3 #53-garble→**disk-recover** `sub-reviewer-3.md`): SCOPE **0 over-reach** nhưng **4 framing-overclaim** (meta-count blind-spot S119 **tái phát TRONG plan cites S119** — chỉ ensemble bắt) → sửa trước ghi: push-guard "ahead"→**diverge-looser** · do-token 26075→**70892** (folded-chunk vs whole-file) · bon-vong "AHEAD"→**n=0** · h17 verified→**agreed** · +R5-dropped meta-count · E-2 single-probe caveat.
- 🔴 **Owner 4-decision APPLIED** (override reviewer "KHÔNG apply"): **(1)** TOÀN-ROSTER agent frontmatter (N=14 khi đó) `model:inherit`→**`opus`+`effort:max`** (worker-tier-pin, bỏ all-inherit; hmw.js 7-spot + session-start/fable-clone/README/ultra-on sync; **🔴 restart để ăn runtime; H23-precedence NAY testable ở lead=Opus** — spawn `tier:'fable'`, nếu frontmatter thắng thì `/fable-real` NO-OP) · **(2)** giữ H24 counter (default-valid §6.4) · **(3)** do-token measured **cap GIỮ** (STATUS **70.892 tok**/HANDOFF 32.254/27% budget lead — byte/4 dưới 2.29×; ⚠️ **S125 RELABEL:** notice-T = **CẬN-TRÊN heuristic ≈char-đếm**, KHÔNG phải token thật — negative-control 3-probe 'a'×150K→"150.006 tok"~1,0/char content-independent; đọc DẢI **[31K byte/4 — 70,9K notice]** ⇒ lead-share **[8,2–18,7]%**, 2-file **[12–27]%** cận-trên; nguồn hub `phuong-phap-dem-token-tien-de-vong4` + adap-report cùng tên) · **(4)** relocate user-memory → `.claude/auto-memory/` + `settings.json autoMemoryDirectory` (đóng R6; restart+workspace-trust+verify).
- **H24 dogfood FIRST-EVER real run (2 vai, 0-garble, giá-trị THẬT):** lead-view **9 flag** (8 residual-asym + 1 count — doc-sync all-inherit→worker-tier vá hmw.js+command @S124, ⚠️ SÓT 5 sibling .md [vocab-alias-map §3 · STATUS:25 · agents/README:5 · fable-real-runbook ×11 · harness-11 ×3] → B1-sweep S126 vá nốt (15 dòng floor-sống + 3 cùng-lớp lọt-pattern); corrected lead: marks CLEAN đừng sửa body) · lead-omission **4 flag** (R6-untracked-tới-commit · /fable-real-NO-OP-no-record · counter-stale · h24-2vai-chua-chay-falsified) + 🔴 **escalate:** carry-age detector STRUCTURALLY VACUOUS (HANDOFF tiering cap carry < M=6 ⇒ 0 fire vĩnh-viễn). Counter TICK counter=3, light+deep@3.
- State GIỮ NGUYÊN: **Mig 66 · 89 bảng · 509 test · gotcha 82 · menu 54 · Sub-agents 14 · bundle admin `cFI7ih4a`/user `MxgooVZw` (FE FROZEN)**.

## ✅ Recently Done (S123 — 2026-07-15)

**4 việc governance anh chốt + mark MỚI + đính chính hub.** Session-log → [`2026-07-15-S123-citation-trap-dual-accept.md`](changelog/sessions/2026-07-15-S123-citation-trap-dual-accept.md). Mark **`RC-pqhuy1987-15-07-2026-17-23-10`** (Active-High, supersede-partial `…15-32-20` điều-khoản (2)).

- **Detector 46 → 45 = ĐỔI THÀNH PHẦN, không phải "flag giảm":** **−2 dương-giả** (citation-trap) **+1 dương-THẬT** (`STATUS:6`, trước giờ **H24-1 không thể thấy**). Đo bằng `comm`, `comm -13` rỗng.
- 🔴 **Citation-trap = CLASS, lây qua trích-dẫn, 3 đời THẬT trong 1 wave:** `permission-matrix:16` (defect thật) → `lead-view-auditor:45` (trích làm ví-dụ — file nay = `lead-stale-auditor.md` @rename S149) → `adap-report…h24…:78` (trích **khi đang giải-thích FP đời-2**). Guard = **enclosure (use ⟂ mention)**, KHÔNG phải hình-dạng — helper DUY-NHẤT `Test-Quoted`, mọi matcher prose phải gọi.
- 🔴 **Gen-2 xảy ra THẬT ngay trong diff vá nó:** lead viết 30 dòng chứng-minh định-luật rồi **đẻ H24-3 KHÔNG guard**. Reviewer bắt. ⇒ **vá 1 CLASS ⇒ grep MỌI matcher cùng-lớp TRONG diff đó.**
- **H24-3 session-label lag (MED, mới):** vá **âm-giả CHỨNG-MINH-ĐƯỢC** của H24-1 (nó so NGÀY, mà ngày = mới nhất ⇒ 0 flag trong khi nhãn lùi 3 phiên; tái-phát **lần 4** S116/S117/S118/S123 — 3 lần trước vá bằng bump số ⇒ quay lại).
- **DUAL-ACCEPT (dạng-3 RETIRED)** + 🔴 **LUẬT RETIRE LEGACY (mới, tổng-quát):** *gỡ nhánh legacy khi **tập di-sản RỖNG**; giữ khi **CÒN người thụ-hưởng***. dạng-3 → 0 folder ⇒ gỡ; dạng-2 → 5 folder S71 ⇒ giữ. Repo thật **0 orphan/26** sau retire.
- 🔴 **Goodhart ĐO ĐƯỢC (ngoài diff):** W4/S122 "vá" `permission-matrix:16` bằng **đổi FORMAT anchor** ⇒ khớp 0 pattern ⇒ **H24-1 mất chính positive-control nó được dựng quanh**; flag-count GIẢM nên **trông như thành-công** ⇒ *"5 FLAG→0"* của W4 **có phần đạt nhờ một file thoát khỏi thước**.
- **Fault-inject 4 bộ 24/24** (5/5 + 6/6 + 7/7 + 6/6-trục-mới). 🔴 **Reviewer bác 3 lập-luận của lead và bác ĐÚNG:** "retire HOÀN-THÀNH mark" = **nguỵ-biện** · "MED vì 0 proxy" = **sai** · "5/5" = **4/4**.
- **`_index` reconcile:** 2 email S122 **đã gửi mà chưa log** (0 row cho 07-15 / 3 file trên đĩa) — vá + ghi bài học.
- **Email hub `ed3786a10f12`** (selftest-stamp MATCH ×2) + **addendum R5**: 🔴 *đừng adopt TRI-ACCEPT* → thay bằng LUẬT RETIRE LEGACY + 2 cảnh-báo fleet.
- ⚠️ **#53 garble ×4 / 3 agent** (tooling ×1 · harvest ×1 · reviewer ×2). **harvest-curator là vai DUY-NHẤT ghi diary TRONG lúc làm ⇒ vớt được từ đĩa ngay**; 2 vai kia phải resume. Reviewer **tự rút luật "ghi diary TRƯỚC return"** từ lần garble đầu và **nhờ đúng luật đó mà lần 2 vớt được** — vòng khép trong 1 phiên. Khớp MED-3 mà H2 bắt sáng cùng ngày (reviewer 5-spawn/0-dòng).
- 🔴 **Lead sai 4 ca, TRỌN ở trục đếm-về-mình:** mẫu-số "25"≠**26** (chép narrative, H2 bắt) · "5/5"≠**4/4** (chép số sub) · viết "7/7 PASS" **TRƯỚC khi chạy** · "0 proxy" sai. **Prompt-đúng KHÔNG chặn được #53** (cấm bẫy "return trước" từ prompt đầu cho cả 3, cả 3 vẫn garble) ⇒ chặn được là nhờ **ghi-đĩa-trong-lúc-làm** + **resume**, không nhờ nhắc-nhở.
- State GIỮ NGUYÊN: **Mig 66 · 89 bảng · 509 test · gotcha 82 · menu 54 · bundle admin `cFI7ih4a`/user `MxgooVZw`** (governance-only, 0 prod-code).
- 🔴 **CÒN NỢ:** `STATUS:6` **CỐ Ý chưa bump** — mega-line **0 hit S122** ⇒ bump = nói dối kiểu khác; fix đúng = **bỏ nhãn phiên (B1 collapse)**, dính carry **re-tier mega-line rơi sổ từ S95** (28 phiên) · 2 vai H24 vẫn **chưa chạy** (nhịp ~S128) · H23 precedence **chờ lead=Fable**.

## ✅ Recently Done (S122 — 2026-07-15)

**Wave adap 6 broadcast AI_INFRA — W0→W6 ĐÓNG TRỌN.** Chain `4727d16..2f068c5` (**4 push**, K=0, tree clean). Session-log → [`2026-07-15-S122-adap-6-broadcast-wave.md`](changelog/sessions/2026-07-15-S122-adap-6-broadcast-wave.md).

- **Spawn-probe toàn-roster SỐNG** (0 error/0 garble — **N=14 tại thời-điểm S122**) — chứng runtime. 🔸 phủ **Agent-tool registry** THÔI; đường `hmw.js→agentType` CHƯA phủ.
- 🔴 **W3.0 retro-harvest 7 orphan `22ea8c5` — LẬT TIỀN-ĐỀ: 0/7 là việc mất; 7/7 ĐÃ XONG, chỉ ghi synthesis SAI CHỖ.** Gốc: **orphan-authority đo TÊN FILE, không đo NỘI DUNG** ⇒ **8 dương-giả / 25 run = 32%**; folder **ghi-chép ĐẦY-ĐỦ NHẤT** (cicd PASS + bundle-hash + smoke 200) **vẫn** bị xếp orphan. Thực-địa **≥4 dạng** vs doc **2** ⇒ **TRI-ACCEPT** (nhận ≠ cho phép; dạng-4 = **kẽ CÒN LẠI**). dual-orphan **8→2**.
- **W3 9 file** `dfa3dae`+`53765b0` (WAL kế-hoạch 5): Sàn-3 canonical @`tiep.md §0` · `session-start` 0.6b registry-probe + 0.7-trỏ (`grep -c "chain rỗng"`=**0**) + §2.1.8 counter · `session-end` Sàn-2 + §5.0/§5.2 + Sàn-5 + §L.b(j) + RE-STAMP · `fable-clone` GAP#6 `tier:'opus'`.
- **W4** `a09dcae` positive-control: **5 FLAG → 0**, TOTAL **50→45** tụt **đúng 5**, **0 flag mới**. TOTAL 50 **khớp chính-xác dự-báo W2**.
- **W5** `c39ba9d`: engine roster → **0 occurrence** · **fix `$userMemDir` hardcode** ⇒ fault-inject **nay cô-lập được**.
- **4 bộ fault-inject CÓ RĂNG:** Sàn-1 **2 chiều** · Sàn-3 **9/9** (2 ca anti-Goodhart) · push-guard **10/10 cây git THẬT** (ca(2) `base+wal+[CLAUDE]`→K=0→**không deadlock**) · wal-recovery **4/4 ca 30 assert**.
- **Sàn-2 + Sàn-5 chạy THẬT lần đầu** @closeout ⇒ **đóng gap runtime**. 🔴 Sàn-5 **tự bắt 3 bug của chính nó** (đo commit-CUỐI thay commit-ĐẦU ⇒ 9 dương-giả · soi WAL-đang-co thay session-log **append-only** · bẫy `grep -c` **lần thứ 3 cùng phiên**) → vá xong **LỆCH=0**.
- **H24 counter TICK lần đầu 0→1** (content-addressed, neo HEAD-sha). `light 1/6 · deep 1/15 · OVERDUE: none` ⇒ **nhịp audit đầu tiên ~S128**.
- **Hub:** 5 adap-report + **6 adap-request** (R1-R5 + **R6 anh nêu**) + 2 email (**selftest-stamp PASS** cả 2).
- **2 mark Active-High** — anh chốt **TÁCH** (2 trục **khác nấc bằng-chứng**): `RC-pqhuy1987-15-07-2026-15-32-20` (H22 · bằng-chứng mạnh) · `RC-pqhuy1987-15-07-2026-15-32-23` (H24 · **caveat binding: "LỆNH về CÁCH LÀM, chưa phải bằng-chứng về HIỆU-QUẢ"**).
- 🔴 **CÒN NỢ (khai thẳng):** 2 vai H24 **CHƯA CHẠY lần nào** (counter=1, nhịp đầu ~S128) · precedence H23 **CHƯA test** (chờ phiên **lead=Fable**) · dạng-4 orphan = kẽ CÒN LẠI · **R6 chờ hub** (SE không tự dời memory được — `settings.json` 0 key ⇒ harness ép).

## 🔥 In Progress (mốc gần nhất S162 — phiên-LOGIC L8; khối dưới còn nhãn L7 là lineage. 🔴 **Section này STALE-BY-DESIGN**: nó chỉ advance @closeout, nên giữa phiên **ĐỪNG đọc nó làm bản-đồ hiện-hành** — bản-đồ sống là `.claude/WAL.md`, KHÔNG phải dòng CURRENT ở đầu file. 🧊 con-trỏ cũ trỏ sang "dòng CURRENT trên đầu" bị GỠ @S179: lúc đó `:6` đang ở **L9/S168** trong khi thực-tế **L11/S179** ⇒ chuỗi cứu-hộ trỏ vào ô cũng đã ô-nhiễm — `lead-stale-auditor` FLAG-7)

| Task | Owner | Status |
|---|---|---|
| ✅ **PE nút XÓA phiếu ở màn duyệt SHIP PROD** (Mig 68, 2 đợt `b1bae77`+`4464a46`+`f4494cf`, cicd PASS 6/6, test 532→562) | 👤 em main + 🟦🟧🟪🟩 | 🟢 done |
| ✅ **S157 UAT "lấy địa chỉ lên luôn"** — chẩn data-không-phải-code (57/62 dự án thiếu `Location`), vá = cảnh báo amber; `6250f39` deploy Run #419, cicd **PASS 9/9** + lead re-curl khớp byte | 👤 em main + 🟥 cicd | 🟢 done |
| **A2 quy trình SAU CEO duyệt (b.7→21)** — invest + review 4/4 lane xong (35 điểm, verdict `LAI`); **6 việc sửa bản invest** chưa làm → rồi mới trình 14 câu | 👤 em main | 🟡 chặn Q1-Q6 |
| **🔴 Q1-Q6 thiết kế khúc 7→12** ("đề xuất giá trị ký kết hợp đồng") — 14 câu, nặng nhất Q2 kiến-trúc (phải viết lại theo 2-trục + 3 số đo trước khi hỏi) | 👤 anh Kiệt / anh Huy | ⚪ pending (NEXT-anh) |
| **🔴🔴 Lỗ hổng an ninh duyệt HĐ** (Reject trước mọi guard + `[Authorize]` trần 22 endpoint ghi) — **anh chốt 07-28 "cứ từ từ"** | 👤 anh quyết ưu tiên | ⏸ treo có chủ đích |
| **UAT anh Kiệt** — vào Danh mục → Dự án → điền Địa điểm (vd BVN01) → tạo phiếu mới xác nhận tự điền | 👤 anh Kiệt | ⚪ pending (NEXT-anh) |

## 🔥 In Progress (S117)

| Task | Owner | Status |
|---|---|---|
| ✅ **S117 SHIP 2 chỉnh PE prod (Run #387 PASS 5m36s)** — (1) **endsBeforeCeo pointer-aware** [display-fix lũy-kế "duyệt rồi không bắt" = DISPLAY-LIE, phiếu A/018 CHƯA DaDuyet đang chờ CEO; lũy-kế loại ĐÚNG] BE-only 3-site + (2) **duyệt-theo-khoảng Min–Max** [Mig 66 +`ApprovedPriceMaxAmount` + source `ProMinMax` radio thứ 5, HĐ 0-tác-động] BE em-main-solo signature-ripple + FE 2-app SHA-mirror; 2× `/fable-real invest` engine-đắt + test **+6 (495→501)**; #53-garble ×2 recover resume+cross-verify | 👤 em main + 🟦×2 fable-real + 🟪🟧🟩 | 🟢 done |
| **UAT anh Kiệt (incognito #77)** — (1) phiếu chờ CEO → sơ đồ hết mờ "Kết thúc tại Cấp 2", hiện "đang chờ CEO" · (2) đưa A/018 lên Đã duyệt (CEO duyệt / re-approve tick-finalize) → A/028 hiện lũy kế **749.564.000đ** khỏi xóa/tạo lại · (3) phiếu PRO Min–Max → duyệt cuối radio **"PRO — cả Min và Max"** → chi tiết "min – max" | 👤 anh Kiệt | ⚪ pending (NEXT-anh) |

## 🔥 In Progress (S113)

| Task | Owner | Status |
|---|---|---|
| ✅ **S113 SHIP Supplier import v2 prod (Run #497 PASS)** — R1-R7 (đọc file thật + nút file mẫu + nhập Mã NCC=Code + thiếu Mã→nháp + dedup MST + MST-cảnh-báo-mềm + badge Public/Nháp) · Mig 64 IsPublic + PublishCommand + template endpoint + authz Suppliers.Update · FE 2-app + picker-lọc-published · 477 test (+19) · 4 bug caught+fixed (null-Code #80 + authz-403 + draft-leak + CreateSupplier-IsPublic) | 👤 em main + 🟦🟨🟧🟪🟥🟩 + fable-clone-ensemble | 🟢 done |
| **UAT anh Kiệt** — luồng: import→lưới Mã editable→thiếu Mã=nháp/ẩn→Confirm→badge→nút Công bố→tạo HĐ chỉ NCC-công-bố; + upload file "Database NCC" ĐẦY ĐỦ (file test chỉ 4 dòng) xác nhận LayoutValid=true | 👤 anh Kiệt | ⚪ pending (NEXT-anh) |

## 🔥 In Progress (S112)

| Task | Owner | Status |
|---|---|---|
| ✅ **S112 SHIP 2 feature prod (Run #496 PASS)** — Supplier Excel-import Phase B + PE sign-off A1/EDGE-5/opinion-history (3 fable-clone ensemble Opus MAX → anh Kiệt decisions → close-review GO-WITH-ADJ → adjust → 458 test → reviewer GO 0-must-fix → deploy verified bundle `Cixlt_MA`/`BhBOG1dn` + Mig 63) + owner harness_floor 30K→100K/measured→55K | 👤 em main + 🟦🟨🟧🟪🟥🟩 + 3 Opus-ensemble | 🟢 done |
| **UAT anh Kiệt** — (1) A1 bỏ auto-terminal-on-submit: phiếu 1-bước creator-cấp-cuối nay bấm Duyệt thêm (đúng ý) · (2) upload file "Database NCC" THẬT xác nhận LayoutValid=true trước dùng | 👤 anh Kiệt | ⚪ pending (NEXT-anh) |
| **Follow-up non-blocking** — FE-Import-guard `Suppliers/Create`→role Admin/CatalogManager 2-app · 2 stale-comment (best-guess→baked) · test `NormalizeJoin` +FormC · harvest run-trace stamp | 👤 em main | ⚪ pending (carry) |

## 🔥 In Progress (S111)

| Task | Owner | Status |
|---|---|---|
| ✅ **S111 adopt H22 WAL session-continuity** — pipeline H21-chuẩn trọn (invest-Fable 14N → spec PS1-3-chỉnh → WF `wf_5ba3daf6-fe0` 3-Opus RUN-TRACE 3/3 → reviewer-Fable PASS_WITH_FIXES 0C·1M·7m → 8/8 fix) + ⚡ hook HOT-RELOAD FIRE ×2 VERIFIED-RUNTIME (`12071c5`/`67be443`) + squash §5.0 dogfood-THẬT K=2 + mark **AH thứ 6** `RC-…12-07-2026-11-43-45` + D10 AS-6-taxonomy-đổi + adap-report/email `9cdcda2f3c83` + cicd **Run #495 PASS** | 👤 em main + 🟦🟥 Fable + 3 Opus + 🟩 | 🟢 done |
| **H22 pilot** (phiên mới): hook-fire re-check · kill-giữa-chain → `/tiep` · đổi-acc · pause-roundtrip 1 workflow THẬT | 👤 anh + em | ⚪ pending (NEXT-anh) |
| **PE "lỗi phân quyền vào phiếu"** (anh Kiệt UAT) — chờ **số-phiếu + user** soi config workflow | 👤 em main | ⚪ pending (chờ anh specifics, carry S103) |

## 🔥 In Progress (S110)

| Task | Owner | Status |
|---|---|---|
| ✅ **S110 adopt H21 + model-tier-v3** (4 msg AI_INFRA hash-verified 4/4) — marker fable-real RETIRED → **per-invocation** `/fable-real\|/fable-clone <vai> <đề-bài>` + **spec-file 3-mục mỗi run engine-đắt** (K.E mới) + MTv3 lead=owner-choice (BƯỚC 0.6 reword, 0 revert-nghĩa-vụ, 1-line-ask) + triage-S5 hot-reload ENV-DEPENDENT caveat. Pipeline đúng lệnh anh: invest-**Fable** → spec `runs/2026-07-11-h21-mtv3-adopt/` → WF **`wf_0c3b307f-a64`** 3-worker-**Opus** → reviewer-**Fable** **PASS_WITH_FIXES** (5M+9m → fixed; M2 boundary-gap lệnh-B × 2 monitor → **RESOLVED cùng phiên: anh-directed VALID_ROLES 10→12** đủ roster). ⚠️ #53-garble ×2 (invest + reviewer Fable-lane) → **SendMessage-resume recover 2/2 sạch**. 2 adap-report + 3 supersede-note + STAGE-2 done | 👤 em main + 🟦🟥 Fable + 3 Opus-worker | 🟢 done |
| **Mark-proposal H21+MTv3** (supersede `RC-…17-46-35` → 📦) — trình anh cuối phiên → **ĐÃ stamped cùng phiên S110** `RC-pqhuy1987-11-07-2026-20-42-01` (ACTIVE-MARKS:19 Active-High; H19 → 📦 superseded-partial) | 👤 anh | 🟢 done (stale-flip S111 per H1 FLAG-1) |
| **PE "lỗi phân quyền vào phiếu"** (anh Kiệt UAT) — chờ **số-phiếu + user** soi config workflow | 👤 em main | ⚪ pending (chờ anh specifics, carry S103) |

## 🔥 In Progress (S109)

| Task | Owner | Status |
|---|---|---|
| ✅ **S109 sleep-recovery P1 RESUME→DONE** — Phase-0 re-verify scope-truth 16→2 (14 file 2026-05 ĐÃ covered gist gộp-kỳ S70, git-date proof) → 2 gist mới tooling/harvest 2026-06 `distill-gen:1` + reviewer Fidelity Fable-real PASS_WITH_FIXES 3-fix-applied + `last_sleep_at=2026-07-10` (commit `f5a5c3e`) | 👤 em main + ⬜🟥 | 🟢 done |
| ✅ **S109 bootstrap all-green** — 440 ✓ · detector 36-benign · spec-audit 0-GAP · 2 monitor ALL-PASS/ALL-CLEAN · RAG 2436 · archive-gate 12/12 + A7 233/233 · Fable giữ S107F→S109F | 👤 em main | 🟢 done |
| ✅ **S109 cicd verify Run #492** (AS-6: `budget.json` ngoài paths-ignore → run trigger dù 0-code) — **PASS 5m21s**, bundle FROZEN-streak ×3 `BVyH-FY7`/`EDsZebvn`, Mig 62/89 frozen, smoke 3/3 | 🟩 cicd-monitor | 🟢 done |
| **PE "lỗi phân quyền vào phiếu"** (anh Kiệt UAT) — chờ **số-phiếu + user** soi config workflow | 👤 em main | ⚪ pending (chờ anh specifics, carry S103) |

<details><summary>S108 In-Progress (đã đóng — chi tiết session log)</summary>

## 🔥 In Progress (S108)

| Task | Owner | Status |
|---|---|---|
| ✅ **S108 email-chain AI_INFRA** — 0-new · adap-request MỚI hot-reload · send-email `8d14405f` selftest-MATCH (AI_INFRA tự pull) | 👤 em main | 🟢 done |
| ✅ **S108 Fable-real runbook + FIRST-REAL-RUN** — runbook 60KB (4-worker-Opus draft → 2-judge single-Fable 2-trục: FAIL/PARTIAL → 37-fix → AC 8/8) + engine §K note-supersede + hmw.js:31 comment-fix + cicd #491 PASS bundle-FROZEN | 👤 em main | 🟢 done |
| **PE "lỗi phân quyền vào phiếu"** (anh Kiệt UAT) — chờ **số-phiếu + user** soi config workflow | 👤 em main | ⚪ pending (chờ anh specifics, carry S103) |

</details>

<details><summary>S107 In-Progress (đã đóng — chi tiết session log)</summary>

## 🔥 In Progress (S107)

| Task | Owner | Status |
|---|---|---|
| ✅ **S107 session-start reconcile** — commit S106 leftover 7-file (gộp flip-chain 1-owner anh-confirm + tooling self-compact **md5-verified moved-not-cut 3/3**) + flip-8 S107-Fable canonical + ERD-range →62 ×2 (root CLAUDE:131 + docs/CLAUDE:70) + bootstrap all-green (**440 test** re-verified · detector 36-benign 0-HIGH · spec-audit 0-GAP · 2 monitor ALL-PASS/ALL-CLEAN · RAG 2434 rerank-OK) | 👤 em main | 🟢 done |
| ✅ **+office-document (12th sub — anh giao)** — agent .md OD1–OD10 + MEMORY seed + skill nạp (docx·xlsx·pptx·pdf + form-engine) + wire 12 điểm (README/2 session-cmd/hmw.js VALID_ROLES 9→10/ultra-on/fable-real/workflows-README/engine/2 monitor baseline/STATUS/budget.json) — ✅ **verified-runtime CÙNG PHIÊN** (registry hot-reload + spawn-test PASS: OD1 skill invoke · OD4 extract-honest · OD5 round-trip 37KB VN-dấu · finding template `wwwroot` 0-placeholder) + cicd **Run #489 PASS** (bundle rotate benign #69 admin `BVyH-FY7`/user `EDsZebvn`, Mig 62/89 frozen, smoke 200×3) | 👤 em main | 🟢 done |
| **PE "lỗi phân quyền vào phiếu"** (anh Kiệt UAT) — chờ **số-phiếu + user** soi config workflow | 👤 em main | ⚪ pending (chờ anh specifics, carry S103) |

</details>

<details><summary>S105 In-Progress (đã đóng — chi tiết session log)</summary>

## 🔥 In Progress (S105)

| Task | Owner | Status |
|---|---|---|
| ✅ **S105 bootstrap + closeout eval-all** — all-green: 440 test · detector 36-benign · MFE FIT + 0-GAP + A7 226/226 · 4 derived-flush vá + 3 spawn-record harvest · Fable flip-6 runtime-verified ×3 | 👤 em main | 🟢 done |
| ✅ **BVAAU cross-repo assist** — favicon `0cc815b` pushed (**prod-verify pending CI**) + auth RCA 3-Q byte-verified (Q1 FE-mù-session fix `51c69fb` LIVE · Q2 CRM1 FE-redirect live, **API-gate chờ anh** · Q3 User_ID không có trong UI) | 👤 em main | 🟢 done |
| **PE "lỗi phân quyền vào phiếu"** (anh Kiệt UAT) — chờ **số-phiếu + user** soi config workflow | 👤 em main | ⚪ pending (chờ anh specifics, carry S103) |

</details>

<details><summary>S104 In-Progress (đã đóng — chi tiết session log)</summary>

## 🔥 In Progress (S104)

| Task | Owner | Status |
|---|---|---|
| ✅ **Reconcile Mig 62 Supplier docs-lag** — DONE S104: session Mig 62 (`778fc98`, cùng-ngày 16:06) ship code+FE+deploy Run #488 nhưng bỏ closeout docs (STATUS/HANDOFF kẹt Mig 61/S103). S104 session-start audit bắt (detector HIGH + H1/H2 monitor) → flush STATUS Mig 61→62 + mega-line + Sub-agents S104-Opus + HANDOFF + ef-core SKILL row + Supplier-backlog Phase-A + commit 3 cicd memory. Test **440 re-verified** (#65 no-bite) · deploy **Run #488 PASS** verified · 2 monitor CLEAN. | 👤 em main | 🟢 done |
| **PE "lỗi phân quyền vào phiếu"** (anh Kiệt UAT) — chờ **số-phiếu + user** soi config workflow | 👤 em main | ⚪ pending (chờ anh specifics, carry S103) |

</details>

<details><summary>S103 In-Progress (đã đóng — chi tiết session log)</summary>

## 🔥 In Progress (S103)

| Task | Owner | Status |
|---|---|---|
| ✅ **AI_INFRA 6-broadcast adap** (crystallized-backfill + Harness-20 + memory-hygiene) — DONE S103: 2 script + engine §L/§M + wiring + model-note sweep + 6 adap-report + 1 adap-request + send-email. 2-workflow WF1 `wf_55ef6778-a0d` + WF2 `wf_3c5c37cb-aa2` (Lane-C PASS + Lane-B recover). Còn: restart CLI + cicd verify | 👤 em main | 🟢 done |
| ✅ **Mark-decision Harness-20 + crystallized-backfill** — anh chọn **codify-only (KHÔNG mark)** như H16/H17/H18 precedent; engine §L/§M = canonical đủ; crystallized-backfill owner-authority dưới mark H15 §G sẵn. ACTIVE-MARKS giữ 5 Active-High. | 👤 anh | 🟢 done |
| **PE "lỗi phân quyền vào phiếu"** (anh Kiệt UAT) — chờ **số-phiếu + user** soi config workflow | 👤 em main | ⚪ pending → carry S104 |

</details>

<details><summary>S101 In-Progress (đã đóng — chi tiết session log)</summary>

## 🔥 In Progress (S101)

| Task | Owner | Status |
|---|---|---|
| **PE "lỗi phân quyền vào phiếu"** (anh Kiệt UAT báo) — chờ **số-phiếu + user** để soi config workflow (nhiều khả năng user chưa được gán approver Cấp phiếu đang chờ — config, không phải code-bug) | 👤 em main | ⚪ pending (chờ anh specifics) |
| ✅ **H18 WF2 review closeout** — DONE S101: WF2 gốc `wf_31ea3985-92c` mất theo CLI-restart → **re-run fresh `wf_955643c3-f7d` → PASS_WITH_CONCERNS** (Lane-A detector-teeth PASS fault-inject-4/4 · Lane-B ledger PWC 1-concern `workflows/README:51`-FIXED · Lane-C PARTIAL: codify+containment first-hand ✓, frontier-hash+reviewer_gate dựa record-S100 do broadcast-inbound vắng repo; Lane-C #53-garble→recover). Verdict stamped adap-report:5 + engine §J:283. Còn: `/send-email AI_INFRA` + commit | 👤 em main | 🟢 done |
| ✅ **H19 fable-clone formal adopt + model-tier compliance** — DONE S101 (anh-directed `/check-email`+`/adap-apply`): RC-stamp `RC-…03-07-2026-17-46-35` + 2 command thật/ảo + engine §K + BƯỚC 0.5b + 4 adap-report; 2-workflow WF1 `wf_5f308fd8-744` + WF2 `wf_ed5b972f-a4d` PASS_WITH_CONCERNS. Model-tier 12/12. Frontier flag#2 resolved + H10 re-stamp. Còn: `/send-email AI_INFRA` + commit + ⚠️ restart CLI (2 command + BƯỚC 0.5b) | 👤 em main | 🟢 done |

</details>

---

## ✅ Recently Done (newest on top — 3 session; cũ hơn → session logs)

> Chi-tiết 4 session gần nhất (S98/S97/S96/S95) = mega-line đầu file (4 blurb — re-tier S95 defer monthly 2026-08-01). Blurb S93-S94 → `docs/_archive/STATUS-HANDOFF-tier-S98-2026-07-02.md` (re-tier S98). Detail S75↓ đã tách (re-tier S94) → `docs/_archive/STATUS-HANDOFF-tier-S94-2026-06-29.md` + bản đầy-đủ `docs/changelog/sessions/`.

---

## 🎯 Next up

### ✅ Phase 11 — Polish/wire skeleton (COMPLETE S52)
- ✅ **P11-A** wire ApproveV2 + LevelOpinions 4 module — **DONE S42** (prod).
- ✅ **P11-B** LeaveBalance business logic — **DONE S43** (Mig 42, prod).
- ✅ **P11-C** Vehicle+Driver catalog — **DONE S51** (Mig 44/45, prod).
- ✅ **P11-D** ItTicket round-robin assign + SLA timer — **DONE S52** (Mig 46, `dcf76f8`, prod). Dept-IT pool + `ItTicketSlaJob` no-auto-transition. _Follow-up minor: reassign-UI defer (endpoint `/assign` sẵn)._
- ✅ **P11-E** AttendanceReport + Excel + OtPolicy multiplier — **DONE S52** (`6a66429`, prod). Admin-only, weighted-OT-hours (no salary field → quy-đổi-giờ not pay, MVP). _Follow-up: menu-key promote (hiện via button)._
- ✅ **P11-F** CodeGen atomic MaTicket — **DONE S52** (`6a66429`, prod). gen-on-Create `IT/2026/NNN`.

### 🔧 Maintenance backlog
- RAG re-ingest `solution_erp` S42-S43 content (store_memory stopgap live; full re-index = AI_INFRA op)
- 🟡 **Supplier schema mở-rộng (anh Kiệt "note lại từ từ tính", S96) — Phase A SHIPPED Mig 62 (S104, commit `778fc98`):** Supplier 9→27 field (18 AddColumn nullable) + `SupplierType +CaHai=6` + enum `SupplierStatus` + seed 4 NCC 30-field + FE 2-app form 4-section + `PathLink` 3 NAS-link. **Phase B (Excel upload auto-map) 🅿️ PARKED (anh chốt S104 — GỠ khỏi active queue, CHỜ ANH NHẮC mới làm, KHÔNG tự khởi động ở session sau)** + đối-chiếu field-list dưới còn thiếu khi làm. Nguyên spec form Excel "Database NCC" ~30 field, entity gốc 9. S96 import 4 NCC (option-3 crammed→Note, nay un-crammed Mig 62). **Field-list gốc (đối-chiếu Phase B):** GÓI THẦU (có thể → WorkItem/category) · ĐỊA CHỈ VP · FAX · SỐ TK+NGÂN HÀNG (tách field) · SỐ TK PHỤ · NGƯỜI ĐẠI DIỆN PL + CHỨC VỤ · GIẤY ỦY QUYỀN (số/ngày/người) · **Link GUQ/GPKD/HSNL** (nvarchar(1000) mirror HoSoLink) · CHỨC VỤ LH · SĐT contact riêng · ĐỊA CHỈ GỬI THƯ · NGƯỜI NHẬN THƯ · NGUỒN GT · PMH · TÌNH TRẠNG (enum active/blacklist) · NGÀY/NGƯỜI CẬP NHẬT. Additive-nullable → 1 migration khi làm. Enum `SupplierType` cần thêm "Cả hai" (NTP+NCC) nếu gặp.
- ✅ **gotcha #57 LeaveType+ShiftPattern+OtPolicy filtered-unique DONE S51** (Mig 45, **3 HRM catalog** — OtPolicy bị bỏ sót khỏi backlog "2 catalog", bắt được via grep + test-before 5 case). ⬜ **EXT (worktree session, Mig 46):** Department/Supplier/Project (Master, confirmed-reachable via global query-filter quirk); ContractClause/MeetingRoom/EmployeeProfile = SKIP (audit-verified not-reachable).
- Skill + doc drift audit (**thủ-công em-main session đầu-tháng** — 🧊 ghost-wire "cron fire 9:00" gỡ S100 H18/frontier-P2: CronList runtime = 0 job, S44/S96 thực-tế đều em-main chạy in-session đúng hạn) — ✅ **2026-07-01 DONE (S96 `881783c`)** — ef-core→Mig 59 + vocab-alias-map + re-tier mega-line (prev 2026-06-01 S44); next **2026-08-01**
- ⬜ **H18/frontier deferred (S100 — mục-sổ đánh-số per frontier-P2):** **(D-1)** wire-or-retire 2 config key `mfe.sub_denominator.role_file_glob`/`diary_path_pattern` (`memory-budget.json:54-55` defined-but-unread — `mfe-eval.ps1:216/:237` re-hardcode giá trị trùng; chờ frontier-assessment re-stamp [content_sha256 MISMATCH → HELD] hoặc maintenance kế) · **(D-2)** `memory-selfimprove-audit.ps1:147` latent blind-spot skip-if-no-`tools:`-line trong A1 (0 agent affected — 12/12 có `tools:` re-verified S107 +office-document; vá khi thêm agent class này)

### 🚫 Phase 9 Ops (blocked — anh main coordinate)
- SMTP email outbound · Rotate prod creds · SQL auto-backup (backup-sql.ps1 ready, chờ Task Scheduler register) · UAT 2-3 user 1 tuần

---

## 🚨 Blockers / risks
- ⚠️ **Email SMTP chưa có** — blocker notification outbound
- ⚠️ **Credentials trong chat** — rotate trước go-live thật
- ⚠️ **SQL backup chưa auto** — risk data loss (script ready, chờ register)
- ⚠️ **UAT real user chưa chạy** — risk edge-case bug
- ⏳ **UAT-confirm chờ anh sign-off (carry S91/S92, hoist khi re-tier S96):** (1) eoffice non-admin ẩn 5 nhóm menu [S92 · Run #358 sqlcmd 0-leak] · (2) đổi mật khẩu self-service [S91 · +10 test] · (3) NCC demo không sống-lại sau restart [S91 · #75 gate verified 2 restart] — cả 3 code/prod-verified server-side, chỉ chờ anh xác nhận UAT (blurb đầy đủ S91/S92 → `docs/_archive/STATUS-HANDOFF-tier-S94-2026-06-29.md`).
- ✅ **Cert** `api.solutions.com.vn` ĐÃ auto-renew — verified S99 TLS live: NotBefore 2026-06-18 → NotAfter **2026-09-16** (win-acme task chạy đúng hạn; hết blocker)

---

## 🔑 Credentials + URLs
```
Prod login: admin@solutions.com.vn / Admin@123456   (⚠️ rotate sau login đầu)
```
- API prod `https://api.solutions.com.vn` (`/health/live` + `/health/ready`) · dev `http://localhost:5443` (`/swagger`)
- Admin FE prod `https://admin.solutions.com.vn` · dev `:8082`
- User FE prod `https://eoffice.solutions.com.vn` · dev `:8080`
- Gitea `https://git.baocaogiaoduc.vn/vietreport-admin/solution-erp` · SSH `ssh vietreport-vps`
- SQL prod `.\SQLEXPRESS` / `SolutionErp` · dev `(localdb)\MSSQLLocalDB` / `SolutionErp_Dev`

---

> **Session history:** S0→S39 full detail trong `docs/changelog/sessions/` + `docs/_archive/STATUS-preS40-fullhistory.md`. File này chỉ giữ state hiện tại + 3 session gần nhất.
