Files
solution-erp/docs/STATUS.md
pqhuy1987 50e6d8c382
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 6m31s
[CLAUDE] Contract: K1 SP-002 danh muc loai HD - ContractCatalogEntries (Mig 70) + seed 86 + CQRS + FE kind-5 x2 app + 8 test
Gate: reviewer PASS-WITH-FLAGS 9f (sub-reviewer-gate-k1.md). Xu ly: F4
IncludeInactive mac-dinh-loai (spec K1.c) + test T5b; F7 comment 5-kind;
F1 OG-6 doi nhan soat-SAU @PAUSE-2 (seeder skip-if-exists giu sua-tay CRUD
qua restart - update-branch co y KHONG co); F3 authz mirror khuon Catalogs,
gioi-han khai: 4 policy ContractCatalog.* sinh ra nhung chua endpoint nao
tieu thu (display-layer khac API-layer, #82); F6 ten index IX_ giu EF-default
(NIT). Suite 598/0 (45D+553I). Mig 70 ap SQL Server that OK. Drift DELTA:
MenuKeys.All 55->56, policies 220->224, bang 96->97.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 15:45:50 +07:00

838 lines
213 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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.)
**🔥 CURRENT (S161→S162 + S164/S165 2026-07-31 — phiên-LOGIC **L9**: chuỗi SP-002 B0→B3 spec ĐÓNG BĂNG + **B4 K1 danh mục loại HĐ SHIP** gate PASS-WITH-FLAGS; lineage L8 giữ dưới):** Mig **70** (K1 `AddContractCatalogEntries` — bảng danh mục 86 dòng × 8 nhóm duyệt) · **97 bảng** · **598 test PASS** (45D+553I, đo tươi @S165 gate-K1) · gotcha **85** · counter **39** · roster 23 · **MenuItems prod 142 GIỮ** (key `KeHoachKyKet` sinh **policy** không sinh menu-row — H1 bác nghi-vấn stale) · Policies **224** · Menu keys **56** (+`ContractCatalog` K1 — 4 policy sinh ra, giới-hạn khai: chưa endpoint nào tiêu thụ, controller mirror khuôn Catalogs `Roles=Admin` #82) · 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** (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`**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 1354 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 MinMax":** 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`/`MinMax` 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 +N0). 🔸 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 **OD1OD10** (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.52.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 S156 [🔄 vá @S153 FLAG-2: bump theo lần re-ground giá-trị mới nhất trong section; header bump @S157 ctx-verifier C3])
| Metric | Value | Note |
|---|---|---|
| Migrations | **69** | **+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 MinMax" 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 | **96** | 🔄 **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 | **220** | 🔄 **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 | **55** | **+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 | **590 PASS** | 45 Domain + 545 Infra · 🔄 **+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 | **85** | **+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 | **31** | +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 | **23** | **+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` (15th17th 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 OD1OD10; 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 S66S123 [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):** admin **`B43R6Y17`** · user **`NLI5umBg`** — CSS **frozen** `BZ5F-g1w`/`yNZDmVNz` (logic-only fingerprint #69). **Đo LIVE bằng curl 2026-07-31 @S164** (`/tiep` window-2, vá mục 3). **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 MinMax [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`/`MinMax` 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 (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 (S149S150 — 2026-07-24 → 07-25)
**S149S150 — 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 + C9C12 + 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 (S141S143 — 2026-07-20 → 07-22)
**S141S143 — 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; AC1AC13 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 (S138S139 — 2026-07-18, closeout @S139 = session-end MỚI lần đầu)
**S138S139 (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: S135S137 (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ỳ pausetiep) + **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,218,7]%**, 2-file **[1227]%** 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, đọc dòng CURRENT trên đầu để biết hiện-hành)
| 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 MinMax** [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 MinMax → 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 OD1OD10 + 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.