[CLAUDE] Docs: S162 closeout - cay 4-folder GD ship prod + bookend-close 5 vong/10 vai
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m54s
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m54s
- Cay 4-folder giai doan duoi tung goi thau (bfc7b79, cicd PASS 5/5 Run #432)
- Bookend-close: H1 PASS_WITH_FLAGS · H2 GATE-FAIL 4 · H24 20 FLAG · trio MIXED
· ring1 26D/2T · ring2 19D/1T · harness-audit 43D/4T · ctx-audit TRUOT 7 FLAG
- Lead va trong phien: F-01/F-02/F-04 + A1 archive + A2 distill + skill KHKK
+ comment mirror self-ref (SHA-pair 6/6 giu, build x2 EXIT 0)
- MIND-5 = refresh @closeout dau tien (nhip thu 5, theo de ctx-audit)
- STATUS 3 row canonical + dong CURRENT · HANDOFF 6 slot danh so (54)-(59)
- gotcha #85 · error-ledger E-015/E-016 + AS-19/AS-20 · Phase 12 roadmap
- 4 errata khai thang: tally view-stale-count thoi 1 · enum thieu 1 class
· tong L1 lech 54 B · A2 tren trigger duong-gia (R10)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@ -2,7 +2,42 @@
|
||||
|
||||
> **Tiering rule (S40):** giữ **2-3 session gần nhất**. Cũ hơn → `docs/changelog/sessions/`. Full brief history pre-S40 → `docs/_archive/HANDOFF-preS40-fullhistory.md`.
|
||||
|
||||
**🆕 Last updated:** 2026-07-29 chiều (**S159→S160** — phiên-LOGIC **L8**, window-1 `/pause` @14:40 + window-2 `/tiep` closeout). Chi tiết = `docs/STATUS.md` dòng CURRENT + run-trace `.claude/workflows/runs/2026-07-29-S159-bookend-open/` (bookend) + `.claude/workflows/runs/2026-07-29-S159-tong-quan-pipeline-menu/` (arc-2).
|
||||
**🆕 Last updated:** 2026-07-30 trưa (**S161→S162** — phiên-LOGIC **L8** window-3 `/tiep` = **5/5 wave KHKK SHIP**, window-4 `/tiep` = **cây 4-folder GĐ ship prod** + **bookend-close 5 vòng**). Chi tiết = `docs/STATUS.md` dòng CURRENT + log `docs/changelog/sessions/2026-07-30-1100-S162-cay-4-folder-gd-close.md` + run-trace `.claude/workflows/runs/2026-07-30-S162-{cay-4-folder-gd,bookend-close}/`.
|
||||
|
||||
## 🔴 CHỜ ANH — ĐÁNH SỐ (trả lời bằng số)
|
||||
|
||||
**(54) 🔴🔴 BLOCKER MẠCH CHÍNH — chốt NGƯỜI DUYỆT 3 trạm PRO/CCM/CEO** (chọn trong 18 user prod; em KHÔNG tự chọn người thật). Có 3 tên/email ⇒ dựng 2 workflow type-3 + type-10 qua Designer (KHÔNG SQL tay #84) → W5 cầu KHKK→HĐ → E2E toàn trình PE `PE/2026/A/045` → KHKK → HĐ → bản-cứng. 🔴 *`lead-gap-auditor` FLAG-2 HIGH @S162: món này đã im **3 cửa-sổ / 2 ngày** vì chỉ sống trong `.claude/WAL.md` — đúng file bị reset mỗi closeout; **0 hit** trên cả 4 bề mặt owner. Nay đưa lên đây, có số.*
|
||||
|
||||
**(55) Trang GĐ3 của cây 4-folder** — anh chốt AskUser *"áp **CẢ** các trang GĐ khác"*, em giao **3/4** (Duyệt NCC · KHKK · Hợp đồng cứng) và **tự hoãn cụm Duyệt hợp đồng** (7 loại HĐ × 6 leaf) sang đợt-2 để anh nhìn prod trước. Làm tiếp ngay, hay giữ nguyên 3 trang? *(lead-gap FLAG-3)*
|
||||
|
||||
**(56) Nghiệm thu prod cây 4-folder** — 2 điểm em **chưa chứng minh được** trước khi ship: bố cục panel cây trái ở trang KHKK/Hợp-đồng-cứng (lưới 19rem **chưa từng render bằng dữ liệu thật** — harness chỉ import component; dev-rig authed chặn bởi gotcha #3), và folder GĐ3/GĐ4 hiện "SẮP" là **đúng hiện trạng** (prod 0 hợp đồng) chứ không phải lỗi.
|
||||
|
||||
**(57) 🔄 (51-bis) MỞ LẠI BẰNG THƯỚC TƯƠI** — `cicd-monitor/archive/_INDEX.md` đo lại @S162 = **99,18% / headroom 167 B** (KHÔNG phải 97,45% / 522 B như slot (51-bis) cũ ghi). Vế (c) "chấp nhận vỡ cap ~1-2 phiên nữa" thực chất **còn đúng 1 dòng append**. Chọn: **(a)** split file · **(b)** nâng cap · **(c)** để vỡ. 🔴 *`lead-stale` FLAG-7 HIGH: anh đang chọn trên thước cũ.*
|
||||
|
||||
**(58) 🔄 SLOT (45) SỐNG LẠI — trần `_mind` là THẬT, không còn báo-động-giả.** S159 rút slot này vì số 92,5% đo trên `_mind-s-7` **đã đóng băng**; file SỐNG `_mind-s-8.md` nay **89,06% (29.184/32.768 B)** và mỗi cửa `/pause` phải nén 1 block mới đủ chỗ. Chọn: nâng khoá `mind_ctx_kb` · đổi luật nén · hay giữ nguyên (chấp nhận mỗi cửa nén 1 block). *(lead-stale FLAG-8 HIGH)*
|
||||
|
||||
**(59) `tiep_reload` — mục tiêu và danh-sách nguồn KHÔNG khớp.** Khoá hẹn nạp nền **40-60K tok**, nhưng đo tươi ĐÚNG 5 nguồn đã khoanh = 71.492 B ⇒ **~20-24K tok ≈ ½ sàn**; đọc rộng nhất có thể vẫn chỉ ~35-41K. Tức **tuân 100% danh sách vẫn dưới hạn**, và `/tiep` không có bước %-print nên không máy nào thấy. Sửa mục tiêu xuống, hay mở rộng danh-sách nguồn? *(lead-gap FLAG-4)*
|
||||
|
||||
**Slot cũ còn treo:** (42)(43)(44) canonRows / carry-con-trỏ / END-line-thành-luật · (46) thước "17,1K" ma · (47) `_INDEX` cap · (48) `harvest-curator/MEMORY.md` 0-byte-đổi *(nay vai tự khai self-compact DUE, L1 21.277 B)* · (39) RAG Qdrant · (40) `hmw_width.cap` 20 < roster 23 · (41) `ring5-audit`.
|
||||
|
||||
**Chờ-anh phụ (không chặn):** F-10 attachment owner-check 2 module · mark-read chuông cũ (mirror PE S96) · tài khoản UAT non-Admin (`nv.test` không tồn tại prod) · thư `ai_infra/all/2026-07-28-day-wake-probe-first-resume` (nấc `agreed`, executed chờ anh).
|
||||
|
||||
## 🔴 NEXT em @S163 (không cần anh gật)
|
||||
|
||||
1. **Vá gốc F-01 H2:** wire bước diary-append vào `tiep.md §3-ter` — `ctx-verifier` chạy 3 phiên (S153/S158/S162) mà **chưa lần nào tự ghi**, cả 3 lần đều lead-seed on-behalf ⇒ hỏng ở khâu GHI, không ở phát hiện.
|
||||
2. **Retro-harvest 2 orphan** `S159-bookend-open` + `S159-tong-quan-pipeline-menu` (cái sau **ưu tiên**: là nơi duy nhất còn nguyên-liệu #422/#425 cho F-02 ⇒ 1 công đóng 2 lỗ) + `git mv review-synthesis-clone-s160.md` → `review-clone-s160-synthesis.md` (glob neo ĐUÔI).
|
||||
3. **Nghi-thức re-stamp carry** — `gap-carry-dropped` **streak 8**, bỏ lần 2 ngay sau khi bị FLAG HIGH @S159 ⇒ đây là **nghi-thức hỏng**, không phải sự cố lẻ. Segment này đã re-stamp (xem dòng Carry dưới).
|
||||
4. **Luật END-line** cho mọi `sub-*.md` (`END <slug> — VERDICT=<…>`) — F-03: `ship-synthesis` trích `SHIP-READY` mà sub-file **0 hit** chuỗi đó.
|
||||
5. `agents/README.md:242` tự xưng "ĐỦ roster" liệt **20 tên** / thật **23** (thiếu đúng bộ-ba `ctx-*`, sống 9 nhãn phiên) + "10 monitor" / thật **13**. *(lead-stale FLAG-11/12)*
|
||||
6. `CLAUDE.md:62/:69` danh-sách mig thiếu 68+69; `_context-s-8` PAUSE-3 ghi menu "135→142" trong khi cicd đo **142→142 (0 row thêm)** — file này nằm trong `tiep_reload.sources` ⇒ **sai số tái sinh mỗi `/tiep`**. *(FLAG-13/15)*
|
||||
7. Monthly drift-audit **2026-08-01 (2 ngày nữa)** + re-sync `measured{}` — 🔴 6 vai (3 ctx + 3 ring) **KHÔNG có baseline** ⇒ "delta 0" với chúng = **chưa từng đo**.
|
||||
|
||||
**Carry @S162 (RE-STAMP — nghi-thức §L.b(j)(iv), bỏ 2 kỳ liên tiếp S159+S160 nên `gap-carry-dropped` lên streak 8):** `[carry:ctx-t9-dogfood]` · `[carry:ring5-audit-gap]` · `[carry:hmw-width-vs-roster]` · `[carry:hmw-subfile-index-collision]` · `[carry:ctx-verifier-no-self-append]` *(MỚI @S162 — F-01, 3 phiên liên tiếp lead-seed)* · `[carry:orphan-retro-harvest-s159]` *(MỚI)* · `[carry:endline-sub-md]` *(MỚI)* · `[carry:tra-bui-relogin]` · `[carry:mind-tran-nen-moi-cua]` *(MỚI — slot 58)* · `[carry:tiep-reload-underfill]` *(MỚI — slot 59)*. *(26 slug re-stamp @S152 giữ nguyên hiệu lực — con-trỏ segment S152, KHÔNG chép để tránh drift.)*
|
||||
|
||||
🧊 *Segment trước (S159→S160) giữ nguyên bên dưới làm lineage:*
|
||||
|
||||
**🧊 (Last updated cũ)** 2026-07-29 chiều (**S159→S160** — phiên-LOGIC **L8**, window-1 `/pause` @14:40 + window-2 `/tiep` closeout). Chi tiết = `docs/STATUS.md` dòng CURRENT + run-trace `.claude/workflows/runs/2026-07-29-S159-bookend-open/` (bookend) + `.claude/workflows/runs/2026-07-29-S159-tong-quan-pipeline-menu/` (arc-2).
|
||||
|
||||
|
||||
**Tóm S159 window-1 = 2 nửa.** **Nửa đầu governance:** anh giao 2 việc — **chạy đủ 5 vòng bookend** + **vá 2 chỗ hở spec KHKK** — rồi chốt tiếp *"có giải pháp thì làm luôn, các vòng này tự động luôn"*. Kết quả: 10 vai · 9 spawn + 6 resume · 11 artifact ~231 KB · **5 khoản (49)-(53) thi hành xong**. **Nửa sau ARC-2 UI SHIP PROD (khối 🆕 dưới)** — dòng "0 prod-code" chỉ đúng nửa đầu.
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -795,6 +795,22 @@ Cron task `solution-erp-skill-audit-monthly` fire 9:00 AM ngày 1 mỗi tháng.
|
||||
6. **Permission leaf 50 NEW** — admin Designer phải seed cẩn thận tránh broken inheritance tree (gotcha #35)
|
||||
7. **FullCalendar lib new dep** cho G-O2 + G-O5 + G-P1 — skill `dependency-audit-erp` chạy trước commit
|
||||
|
||||
## 🎯 Phase 12 — Dry-run TOÀN TRÌNH đến Hợp đồng cứng (S160-S162) — 6/8 wave DONE
|
||||
|
||||
> Pipeline owner giao @S160: *"dry-run luôn cho đến hợp đồng cứng"* → plan-cha + 7 spec-wave (`runs/2026-07-29-S160-khkk-dryrun-plan/`) qua 2 vòng review (`/fable-clone` 6 lane → `/fable-real` chốt cuối GO-WITH-FIXES). **GATE 5-ANCHOR bắt buộc trước mỗi wave** (≥1 anchor trượt ⇒ chấm lại toàn bộ anchor của wave).
|
||||
|
||||
- [x] **W1 — Schema + Designer** `a8027c0` · Mig **69** `AddContractSigningPlans` (7 bảng, SQL tables 89→96) · cicd PASS 6/6 · suite 566
|
||||
- [x] **W2 — CRUD + nhập** `6cbc6ad` · 15 action policy + Dossier + picker PE THẬT (`PE/2026/A/045`) · cicd PASS 6/6 · suite 574
|
||||
- [x] **W3 — Duyệt V2 3 trạm** `df52fa0` · test-before RED→GREEN 6 PIN · GĐ2 trọn vòng đời prod · cicd PASS 5/5 · suite 580
|
||||
- [x] **W6 — Đường ống HĐ V2** `761d818` · `isV2Approver` 3-site + guard-trình null-trap · cicd PASS · suite 587
|
||||
- [x] **W7 — Bản cứng (GĐ4 1-MỐC)** `3119cb9` · `?type` + badge `hasSealedCopy` + trang ×2 SHA-pair + 3 PIN · cicd PASS 3/3 · suite **590/0**
|
||||
- [x] **Cây 4-folder GĐ (ngoài plan — lệnh owner @S162)** `bfc7b79` · 3 file MỚI + 3 trang ×2 app SHA-pair 6/6 · cicd PASS 5/5 Run #432 · FE-only 0-mig
|
||||
- [ ] 🔴 **BLOCKER — chốt NGƯỜI DUYỆT 3 trạm PRO/CCM/CEO** (18 user prod; quyền owner, HANDOFF slot **(54)**) ⇒ dựng 2 workflow type-3 + type-10 qua **Designer UI** (KHÔNG SQL tay — gotcha #84) → verify GET matrix
|
||||
- [ ] **W5 — Cầu KHKK→HĐ** (spec `spec-wave-w5-cau-khkk-hd-29-07-2026.md`; §③-C **CẤM** tạo HĐ `HopDongMuaBan`) — chặn bởi BLOCKER trên. Vá luôn **F-2**: phiếu liên-danh N-HĐ hiện chỉ nối HĐ[0] (`CreateContractFromEvaluationFeatures.cs:145`)
|
||||
- [ ] **E2E toàn trình** PE `PE/2026/A/045` → KHKK → HĐ → bản cứng; re-curl `hasSealedCopy` đóng treo cicd N=0 (Contracts prod hiện **0**)
|
||||
- [ ] **Trang GĐ3 của cây 4-folder** (owner nói *"áp CẢ các trang GĐ khác"*, lead giao 3/4 — HANDOFF slot **(55)**)
|
||||
- ⏸️ **W8 — Siết authz HĐ**: owner chốt **O-A "để mở, không siết"** @S160 (đúng ❹ *"đang phát triển → cho hiển thị hết để mọi người góp ý"*) ⇒ **gỡ khỏi dry-run**, rủi ro disclose có ý thức. Gồm cả lỗ hổng S156 (`ContractWorkflowService.cs:49-66` Reject-trước-guard + controller `[Authorize]` trần) + F-10 attachment owner-check.
|
||||
|
||||
## 📦 Post-launch (Phase 11+ — future, defer Phase 10 done)
|
||||
|
||||
- [ ] **Email outbox** (MailKit + SMTP) — blocked chờ SMTP config (Phase 9 hard blocker)
|
||||
|
||||
@ -0,0 +1,87 @@
|
||||
# S162 (2026-07-30) — phiên-LOGIC L8 window-4: `/tiep` nối mạch + đợt "cây 4-folder GĐ" ship prod + bookend-close
|
||||
|
||||
wf: run=2026-07-30-S162-cay-4-folder-gd · run=2026-07-30-S162-bookend-close
|
||||
|
||||
## 0. Khung phiên
|
||||
|
||||
- Vào bằng **`/tiep`** (window-4 của L8) ⇒ **KHÔNG có bookend @open** ⇒ closeout gánh cả vòng trio memory (chạy bù §L.b(k)(i)) — lead có surface điều này ở `run.md:3` (lead-gap trục-6 **BÁC** nghi vấn im lặng).
|
||||
- Lead model: **Opus 5** (owner đổi `/model claude-opus-5` ngay trước closeout; thân phiên chạy Fable 5).
|
||||
- Ship 1 commit code: **`bfc7b79`** — FE-only, 0 migration.
|
||||
|
||||
## 1. `/tiep` — reconcile KHỚP, không lệch
|
||||
|
||||
Sàn-3 bậc MẠNH: ① kêu **3 folder** · ⑤ ORPHAN-L session-8 (pause=3 tiep=2) → cân sổ bằng `_tiep-3.md`.
|
||||
Ground-truth vs WAL: origin `3119cb9` ✓ · suite **590/0** (45 Domain + 545 Infra, đo tươi) ✓ · 5 wave synthesis ✓ · O-3 Reject-guard diff rỗng ✓ · `mind-check` **11 ĐẠT/0** ✓. Tick counter 35→**36**. Thư: se=0 chưa xử · all=1 lá đã biết (`day-wake` nấc `agreed`).
|
||||
|
||||
**`ctx-verifier`: `CO-CO — 8 cờ`.** Ba cờ lead xử ngay:
|
||||
- **K7 🔴:** nén MIND-1 @PAUSE-3 chỉ cấp disposition cho 3/5 dòng D ⇒ **2 ý rơi**: `slot-45` (tiền-đề đã LẬT — trần thật 89,1%) và `detectors :1095/:1760 lọc sub-* sót trio-return (C11b)` (**0 hit ngoài MIND-1** ⇒ nén lần nữa là mất hẳn). Lead di-trú cả 2 vào WAL → nay lên HANDOFF.
|
||||
- **K2/K3:** con-trỏ `WAL:49` **chết**, `WAL:8,10` **giải-nhầm im lặng** ⇒ **luật mới: trỏ WAL theo NỘI-DUNG, không theo số dòng** (WAL tái sinh + đánh số lại mỗi `/pause`; path vẫn tồn tại nên máy con-trỏ KHÔNG kêu — thối im lặng).
|
||||
- **K8:** OVERDUE:light 8/6 stale → tươi **9/6**.
|
||||
|
||||
## 2. Đợt "cây 4-folder GĐ" — lệnh owner giữa phiên
|
||||
|
||||
**Verbatim owner (30-07 sáng, kèm screenshot khoanh đỏ dải 4 GĐ trỏ xuống cây trái trang Duyệt NCC):**
|
||||
> Tạo folder :
|
||||
> Duyệt NCC
|
||||
> Kế hoạch Hợp đồng.
|
||||
> Duyệt Hợp đồng
|
||||
> Hợp đồng cứng.
|
||||
|
||||
**2 quyết AskUser:** (1) folder đặt **DƯỚI TỪNG GÓI THẦU** · (2) **áp CẢ các trang GĐ khác**.
|
||||
🔴 **Lead thu hẹp có khai (lead-gap FLAG-3):** giao 3/4 trang (PE list · KHKK · HĐ-cứng), **hoãn trang GĐ3** (cụm HĐ 7 loại × 6 leaf) sang đợt-2 — chữ **CẢ** của owner chưa được thoả trọn; đưa lên HANDOFF chờ-anh.
|
||||
Nhãn folder giữ **VERBATIM** — GĐ2 "Kế hoạch Hợp đồng" **cố ý khác** nhãn dải strip "Kế hoạch ký kết HĐ" (lời-mới-nhất-thắng).
|
||||
|
||||
**Cái ship (`bfc7b79`, 17 file, +1839/−12):** 3 file MỚI ×2 app (`components/pipeline/PipelineStageFolders.tsx` · `PipelineTreePanel.tsx` · `hooks/usePipelineStages.ts`) + 3 trang sửa ×2 app. **SHA-pair 6/6.** Thuần FE: 0 API mới · 0 mig · 0 chạm menu/seeder/strip/BE/tests. Nối dữ liệu: GĐ2 qua `khkk.purchaseEvaluationId` · GĐ3 qua `pe.contractId` · GĐ4 = HĐ đó có `hasSealedCopy`.
|
||||
|
||||
**Chuỗi 3 verdict:**
|
||||
1. `frontend-designer` **SHIP-READY** — tự soi ảnh 3 vòng bắt **4 lỗi build không báo**, nặng nhất: panel trang KHKK/HĐ-cứng mở mặc định sai lớp ⇒ **không thấy folder của chính trang đó** + node không đóng lại được.
|
||||
2. `reviewer` **PASS-WITH-FLAGS — 0 blocker, 8 flag**; xác nhận hunk-level: khối `<li>` phiếu PE **0 dòng xoá**.
|
||||
3. `cicd-monitor` **PASS 5/5** — Run #432 (id=545) 5m35s · gate 590/0 · bundle **4/4 rotate** · marker + control-âm 2 lớp · smoke 4×200 + 404-control.
|
||||
|
||||
**5 flag lead vá trước ship:** F-1 gate quyền dùng **đúng key policy endpoint** (`KeHoachKyKet` — `MenuPermissionHandler.cs:40` so khớp CHÍNH XÁC 1 key, không kế thừa/OR-con) · F-3 tách nghĩa `(ngoài chỉ mục 200)` vs `(chưa cấp mã)` · F-4 index giữ `total` ⇒ cờ `truncated` (không tụt số im lặng) · F-6 `hideEmpty` không nuốt folder failed/loading · F-7 invalidate `pipeline-contract-index` sau upload. **F-8** sửa 2 câu SAI trong memory designer.
|
||||
**2 giới hạn khai thẳng:** **F-2** phiếu liên-danh N HĐ chỉ nối HĐ[0] (`CreateContractFromEvaluationFeatures.cs:145`) — vá thật ở W5 · **F-5** lưới `19rem` chưa render thật ⇒ owner nghiệm thu prod.
|
||||
|
||||
## 3. Bookend @close — 5 vòng
|
||||
|
||||
**Khối số máy (đóng băng 10:45):** 23 vai · L1>30KB NONE · tổng L1 **303.937 B** · A7 **413/413** · headroom **165.767 tok** (hotload 642.699 B, target 210.000 ⇒ headroom BINDS) · `light 9/6 OVERDUE · deep 11/15` · shard-probe **KÊU 16** · detectors **TOTAL 44** (+5 INFORM riêng) · counter **36**.
|
||||
|
||||
| Vòng | Con-ĐO | Verdict | Con-KIỂM |
|
||||
|---|---|---|---|
|
||||
| V1 tooling+harvest | H1 `tooling-auditor` · H2 `harvest-curator` | `PASS_WITH_FLAGS` (10 finding) · **`GATE-FAIL` 4 finding** | `ring1-audit` |
|
||||
| V2 soi-lead | `lead-stale-auditor` · `lead-gap-auditor` | (stale) · **4 FLAG** | `ring2-audit` |
|
||||
| V3 memory | `harness-eval` → `harness-refine` | **MIXED** (3 REGRESSION / 4 HEALTHY / 5 MIXED / 5 N/A) | `harness-audit` |
|
||||
| V4 nén-ngủ | `/sleep-recovery-memory-l2` (probe KÊU 16 shard) | — | `ring4-audit` |
|
||||
| V5 sàn-sự-thật | measured-label-gate (floor) | — | — |
|
||||
|
||||
**Finding đắt nhất phiên (H2 GATE-FAIL):**
|
||||
- **F-01 HIGH** `ctx-verifier` chạy THẬT @S162 (`_tiep-3.md:6`) mà `agent-memory/ctx-verifier/MEMORY.md` **0 hit S162**; entry cuối S158 — và **cả S153 lẫn S158 đều là lead-seed on-behalf** ⇒ vai này **chưa bao giờ tự APPEND**. Hỏng ở khâu **GHI**, không ở phát hiện. Vá gốc = wire bước diary-append vào `tiep.md §3-ter`.
|
||||
- **F-02 HIGH** `cicd-monitor/MEMORY.md:9` khai "verbatim → archive" cho #422 `b5799fc` + #425 `a2bbcb9` nhưng `git log -S` chứng **chưa từng vào archive**; nguyên liệu còn nguyên ở run-folder S159 ⇒ mất **lớp đã chưng cất**, phục hồi được (H2 tự đính chính overclaim "mất hẳn").
|
||||
- **F-03 MED** `ship-synthesis.md` trích `SHIP-READY` như verbatim mà sub-file designer **0 hit** chuỗi đó ⇒ đề luật **mọi `sub-*.md` kết bằng END-line `END <slug> — VERDICT=<…>`**.
|
||||
- **3 orphan xác nhận:** 2 THẬT thiếu synthesis (`S159-bookend-open`, `S159-tong-quan-pipeline-menu`) · 1 **dương-giả TÊN** `S160-khkk-dryrun-plan` — 🔴 H2 **bác chẩn đoán của lead**: không phải "thiếu dấu `-`" mà glob `*-synthesis.md` **neo ở ĐUÔI**, file còn `-clone-s160` SAU chữ synthesis.
|
||||
|
||||
**H1 bác 1 mục lead liệt sai:** **menu 142 KHÔNG stale** (`STATUS:464` — key mới `KeHoachKyKet` sinh **policy**, không sinh menu-row) ⇒ hình dạng drift là **PARTIAL-LANDING**, không phải cả bảng chết. Và `ef-core-migration/SKILL.md:86-89` hit "89 bảng" là **frozen-in-time** — sửa = giả mạo hồ sơ.
|
||||
|
||||
**lead-gap 4 FLAG:**
|
||||
- **FLAG-1 HIGH `gap-carry-dropped` (streak 8):** nghi-thức re-stamp carry bị bỏ **lần 2 SAU khi đã FLAG HIGH @S159** — segment HANDOFF `1d3d167` có **0 slug carry**. 8 kỳ liên tiếp cùng class = **nghi-thức hỏng**, không phải sự cố lẻ.
|
||||
- **FLAG-2 HIGH `gap-decision-sunk`:** BLOCKER "3 người duyệt PRO/CCM/CEO" **0 hit trên cả 4 bề mặt owner**, sống duy nhất ở `.claude/WAL.md` = đúng file `§6.4` sắp reset. Bất đối xứng: món *không chặn* (51-bis) có slot số, món **chặn cả W5→E2E** thì không.
|
||||
- **FLAG-3 MED `gap-owner-specifics`:** chữ **CẢ** (áp cả trang GĐ khác) + việc lead tự thu hẹp 3/4 trang không lên bề mặt nào của owner.
|
||||
- **FLAG-4 MED `gap-underfill`:** `tiep_reload` hẹn 40-60K tok, đo tươi đúng 5 nguồn đã khoanh = 71.492 B ⇒ **[20.4K..23.8K] tok ≈ ½ sàn**; đọc rộng nhất vẫn [35.3K..41.2K] ⇒ **tuân 100% danh sách vẫn dưới hạn** ⇒ mục tiêu và danh-sách nguồn KHÔNG khớp, và `/tiep` có 0 bước %-print nên không máy nào thấy.
|
||||
|
||||
## 4. Bài học phiên
|
||||
|
||||
1. 🔴 **`#53` 6/6 sub product+monitor, resume-từ-đĩa 6/6, mất 0 B** — ghi-đĩa-trong-lúc-làm cứu trọn lần nữa. Datum đẹp: `cicd-monitor` dừng đúng câu *"4/4 hash rotated"* ⇒ phần đắt nhất đã nằm trên đĩa trước khi tắt; `harvest-curator` dừng đúng lúc **đang nghi ngờ chính thước đo của mình**, resume xong tự bác **20/22 ca** nghi ban đầu.
|
||||
2. 🔴 **Diagnostic giữa-Edit là snapshot dở (#68) — ×3 trong 1 đợt, lần này cắn LEAD:** lead 2 lần đọc diagnostics "file rách" rồi ra lệnh "sửa dứt điểm"; đo lại `npx tsc -b --force` = **EXIT 0**, đĩa nguyên vẹn. ⇒ **Trọng tài = build chạy SAU khi agent dừng tay.**
|
||||
3. 🔴 **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 trong 1 cửa và **thối IM LẶNG**.
|
||||
4. **Nén block `_mind` là thao tác có lớp mất-mát ẩn:** nén MIND-1 chỉ cấp disposition 3/5 ý ⇒ 2 ý rơi, **không kêu** vì nén là hợp lệ ⇒ trước khi nén phải đối chiếu TỪNG ý mục D có nơi đi.
|
||||
5. **Claim CÓ ĐIỀU KIỆN viết thành vô điều kiện = đóng băng cái sai** (F-8 "0 rác 403"); cùng lớp với F-03 (trích verbatim một chuỗi không tồn tại trên đĩa) và F-02 (khai "đã archive" thứ chưa từng archive). **Ba ca, một class: sổ nói mạnh hơn việc đã làm.**
|
||||
6. **Vai KIỂM có răng thật:** H1 **bác** 1 mục lead liệt sai (menu 142) và tự đính chính verdict @open của chính nó; H2 **bác** chẩn đoán orphan của lead và **tự sửa thước** (20/22 ca nghi là artifact-đo).
|
||||
|
||||
## 5. Số chốt
|
||||
|
||||
Mig **69** · **96 bảng** · **590 test** (45D + 545I) · menu **142** (không đổi) · gotcha 84 · counter **36** · roster 23 · bundle prod admin `index-DXoYDy7R.js`/`index-BZ5F-g1w.css` · eoffice `index-o8KDluD1.js`/`index-yNZDmVNz.css` · Contracts prod 0.
|
||||
|
||||
memory-triple: do=`scripts/measure-agent-memory.ps1 · exit 0`
|
||||
memory-triple: de-xuat=`scripts/memory-archive-gate.ps1 DRY · exit 0`
|
||||
memory-triple: kiem=`harness-audit · verdict → xem harness-audit-return.md`
|
||||
memory-triple: do-record=`governance-detectors TOTAL=44`
|
||||
memory-triple: do-record=`NHIP-NO: kiem light 9/6 deep 11/15 OVERDUE:light | tran-bo-nho 0 over-cap l2idx 0 over | run-chua-gom 3 | pull-cach 8 ngay`
|
||||
@ -1376,6 +1376,16 @@ for h in resp.points: # ← .points không phải iterable trực tiếp
|
||||
|
||||
---
|
||||
|
||||
### 85. Menu-key OR-gate FE ≠ policy per-action BE — gate rộng hơn endpoint ⇒ 403 rải khắp UI (Session 162)
|
||||
|
||||
**Triệu chứng (chưa kịp xảy ra trên prod — reviewer bắt trước ship):** cây 4-folder GĐ gate quyền GĐ2 bằng `['Khkk_List','Khkk_G1','KeHoachKyKet'].some(can)`, nhưng endpoint `/contract-signing-plans` gắn `[Authorize(Policy="KeHoachKyKet.Read")]` (`ContractSigningPlansController.cs:36`) và `MenuPermissionHandler.cs:40` **so khớp CHÍNH XÁC 1 key** — KHÔNG kế thừa cha, KHÔNG OR key con. ⇒ role có `Khkk_List=1` mà `KeHoachKyKet=0` sẽ: FE mở cổng → gọi API → **403** → folder GĐ2 hiện "—" **dưới MỌI gói thầu**, và claim "gate trước fetch ⇒ 0 rác 403" **vỡ**.
|
||||
|
||||
**Vì sao dễ mắc:** luật *"gate phải OR nhiều key"* là **ĐÚNG cho tầng HIỂN THỊ** — `GetMyMenuTreeQuery.cs:61-96` trả node khi `CanRead=true` **hoặc có con CanRead** nên root có thể tồn tại với `canRead=false`. Người viết mang nguyên luật đúng-ở-tầng-này sang **tầng API-authz** nơi nó sai. Đây là mặt thứ hai của #82 (menu-hiện ≠ API-mở); lần này là **menu-hiện rộng hơn API-cho**.
|
||||
|
||||
**Fix:** gate mỗi query bằng **đúng key policy của endpoint** (`['KeHoachKyKet']`). Endpoint chỉ có `[Authorize]` trần (`/contracts` — #82 còn treo có chủ đích) thì OR key hiển-thị **vô hại** vì không có policy per-action để đá. Trước khi wire gate: **mở controller đích đọc attribute**, đừng suy từ cây menu.
|
||||
|
||||
**Đo trước khi tin:** Dev DB 13/13 role đều có `Contracts=1 ∧ KeHoachKyKet=1` ⇒ ca này **chưa lộ**; nó chờ đúng 1 lần chỉnh ma-trận quyền. Lớp lỗi "chưa vỡ vì dữ-liệu hiện tại may mắn" phải vá ngay, không đợi triệu chứng.
|
||||
|
||||
## Checklist debug bug mới
|
||||
|
||||
1. Build pass không? → fail → check using + package version compat
|
||||
|
||||
@ -35,6 +35,8 @@ Detect by **action-signature** (NOT "AI tự phán có vi phạm không"). Scan
|
||||
| AS-14 | phép ĐO text (length/char-count/so-sánh) qua `Get-Content`/console-pipe **KHÔNG ép encoding** trên file **no-BOM** (PS5.1 default = ANSI → ký-tự Việt đếm ×2-3) | đo-phải-chạm-đĩa-ĐÚNG-CÁCH (E-010; anh em với bẫy `grep -c` — `feedback_resume_premise_reverify`) | RCA + re-đo `[System.Text.UTF8Encoding]` tường-minh; số đã báo owner → đính-chính NGAY |
|
||||
| AS-15 | **điểm-đóng-thật** (chốt-đợt commit+push HOẶC session-end) **KHÔNG kèm** delta diary monitor (H1/H2) **và KHÔNG** dòng counter §L.b(j) | session-end §L.b "(a)→(j) đủ HẾT, KHÔNG skip" (E-011 — nghi-thức chạy tắt; máy mù lớp "nghi-thức có chạy không") | RCA + spawn DỒN H1+H2 re-report phủ khoảng bị bỏ + harvest hồi-tố + đọc counter bù |
|
||||
| **AS-16** | artifact **OUTWARD** (adap-report · email hub · broadcast) **cite sha CHƯA-push**, HOẶC được **stamp trước khi `git status --porcelain` sạch** | E-012 — closeout-squash phá đúng sha vừa cite ⇒ con-trỏ chết với người ngoài; và file sửa sau khi stamp làm câu trong bản đã-niêm thành sai. **Cite outward = commit SẼ SỐNG sau squash.** `git status` là bước **ĐẦU** của outward-gate, không phải bước cuối | RCA + re-anchor sang commit đã-push + **errata rời** (CẤM sửa file đã stamp — vỡ hash) |
|
||||
| **AS-20** | sổ/stub khai *"X đã được ghi/chuyển/kết-luận"* mà đĩa **0 hit** — claim mạnh hơn việc đã làm | E-016 (S162 ×3 ca cùng phiên: `cicd-monitor` "verbatim→archive" thứ chưa từng archive · `ship-synthesis` trích VERDICT không tồn tại · memory viết claim CÓ-ĐIỀU-KIỆN thành vô-điều-kiện) | mệnh-đề *đã-làm* = **CLAIM ĐO ĐƯỢC**, phải đo trước khi viết; guard = **END-line bắt buộc** cho mọi `sub-*.md` (`END <slug> — VERDICT=<…>`) để trích dẫn luôn có neo grep được |
|
||||
| **AS-19** | nén/gộp block trí-nhớ làm **rơi ý** mà không để lại vết (byte hợp-lệ, số-hiệu hợp-lệ, máy im) | E-015 (S162: nén `MIND-1` cấp disposition 3/5 ý ⇒ 2 ý mất, 1 trong đó **0 hit ngoài chính block bị nén**) | trước khi nén: liệt tập-ý mục D + gán **nơi đi** từng ý (đóng/carry/con-trỏ). Nén = chuyển-dạng, KHÔNG phải giảm số ý. 🔴 hiện là **nghi-thức, chưa cơ-khí-hoá** |
|
||||
| **AS-17** | sub được lệnh ghi-đĩa-trong-lúc-làm nhưng lúc return/chết sub-file chỉ có **SKELETON** (header/checklist, 0 finding) — byte-content KHÔNG tăng theo tiến độ | sub-class `skeleton-ruột-rỗng` (E-013 — S150 gate `wf_f4e4c006` khung 274B/0-append → S151 ×2 thuần [sub-lead-stale header-only + sub-lead-gap checklist-only] = **2-strike**; "ghi-đĩa-trong-lúc-làm = CẦN, KHÔNG ĐỦ" — `feedback_agent_return_garble_recover`) | lead verify **BYTE-CONTENT tăng thật GIỮA wave** (đọc RUỘT — size nhỏ = nghi-vấn không phải bằng-chứng, phân biệt skeleton vs đang-viết-dở; H2 m#19) → resume-in-session ép đổ ruột (S151: 5/5 sạch) · lane quan-trọng giữ N-lane-redundancy + em-main-solo backstop |
|
||||
|
||||
## 🛡️ Active-Guards index (2-strike promote: episodic → procedural)
|
||||
@ -86,6 +88,26 @@ Detect by **action-signature** (NOT "AI tự phán có vi phạm không"). Scan
|
||||
|
||||
> Format: `E-NNN | date | rule | what | 5-why root | fix (prod-bug = 2-fix: code + guard) | prevention | tags[TYPE/ACTOR/COMPONENT]`
|
||||
|
||||
### E-016 — AS-20 claim-mạnh-hơn-việc-đã-làm: sổ khai "đã archive / đã verbatim / đã VERDICT" cho thứ chưa từng tồn tại trên đĩa (S162, **3 ca cùng phiên**, H2 `harvest-curator` bắt cả 3)
|
||||
|
||||
- **rule (AS-20 NEW):** mọi mệnh-đề trong sổ có dạng *"X đã được ghi/chuyển/kết-luận"* là một **CLAIM ĐO ĐƯỢC** ⇒ **phải đo trước khi viết**, không được suy từ ý-định. Đặc-biệt nguy khi câu đó nằm trong **stub/summary** — nơi người đọc sau coi là đã-xử-lý xong nên **không mở gốc kiểm nữa**.
|
||||
- **what — 3 ca, 1 class:**
|
||||
1. **F-02** `cicd-monitor/MEMORY.md:9` stub khai *"(#422 `b5799fc` · #423 · #424 · #425 `a2bbcb9`) + #419 — verbatim → `archive/2026-07.md`"*; đo: #423/#424/#419 CÓ, **#422 và #425 = 0 hit toàn `agent-memory/`**, `git log -S"b5799fc" -- .../archive/` **RỖNG toàn lịch sử** ⇒ chưa từng vào archive.
|
||||
2. **F-03** `ship-synthesis.md:14` trích ``designer `VERDICT: SHIP-READY` `` như **verbatim của vai**, nhưng `sub-frontend-designer-0.md` (17.844 B) **0 hit** `ship.?ready|VERDICT|END` — file kết bằng "TỰ ĐÁNH GIÁ CÒN HỞ". Nội-dung khớp đĩa (tsc/build EXIT 0, SHA-pair 6/6) ⇒ **không phải bịa**, nhưng **hình-thức trích dẫn tạo ra một chuỗi không tồn tại**.
|
||||
3. **F-08** (reviewer bắt, cùng phiên) memory `frontend-designer` viết *"0 rác 403"* **vô điều kiện** — thật là claim **CÓ ĐIỀU KIỆN** (chỉ đúng khi gate dùng đúng key policy endpoint); + câu *"`Ct_*` kế thừa `Contracts`"* SAI vì seeder tạo row `Ct_*` riêng.
|
||||
- **5-why:** (1) người viết sổ vừa làm xong việc nên "biết" nó đã xong → (2) viết câu tổng-kết theo **trí-nhớ về ý-định**, không theo đĩa → (3) câu tổng-kết đọc mạnh hơn thực-tế → (4) **stub/summary được thiết-kế để thay thế việc mở gốc** ⇒ sai-số đóng băng ngay tại lớp mà người sau tin nhất → (5) máy MÙ: không detector nào so được "câu khai" với "trạng-thái đĩa" ở dạng tổng quát.
|
||||
- **fix KÉP (bug-production = 2 fix):** (a) **vá dữ-liệu** — đính chính `cicd-monitor/MEMORY.md` (@S162, nêu rõ nguyên-liệu còn ở run-folder S159, re-distill khi retro-harvest) + sửa 2 câu memory `frontend-designer`; (b) **vá guard** — luật **END-line bắt buộc**: mọi `sub-*.md` kết bằng `END <slug> — VERDICT=<…>` ⇒ trích dẫn verdict **luôn có neo đo được**; ai trích mà grep 0 hit thì lộ ngay. (Đã lên HANDOFF NEXT-em #4 + `[carry:endline-sub-md]`.)
|
||||
- **guard hiện có ĐÃ giữ:** H2 5-trục Fidelity-FLAG bắt được cả 3 ca **trong cùng phiên chúng sinh ra** ⇒ nấc episodic, chưa cần promote procedural (mới 1-strike với class này).
|
||||
|
||||
### E-015 — AS-19 nén-block làm rơi ý IM-LẶNG: nén `_mind` hợp-lệ về byte nhưng 2/5 ý mục D mất không để lại vết (S162, `ctx-verifier` K7 bắt)
|
||||
|
||||
- **rule (AS-19 NEW):** thao-tác **nén/gộp một block trí-nhớ** phải đối-chiếu **TỪNG ý** trong block bị nén có **nơi đi** (đóng · carry sang block mới · con-trỏ ra sổ bền). Nén = **chuyển-dạng**, không phải **giảm số ý**; giảm ý mà không khai = **mất dữ-liệu hợp-thức-hoá**.
|
||||
- **what:** nén `MIND-1` @PAUSE-3 (vượt trần 212 B) tự cấp disposition `(nay …)` cho **3/5 dòng mục D**; **đúng 2 dòng không có disposition là 2 ý biến mất khỏi MIND-4**: `slot-45` (tiền-đề **đã LẬT** — trần thật 89,06%, nên ý này đang từ "báo-động-giả" trở lại "vấn-đề thật") và `detectors :1095/:1760 lọc sub-* sót trio-return (C11b)` (**0 hit ở WAL, 0 hit `_context`, chỉ còn trong chính MIND-1** ⇒ nén lần nữa = **mất hẳn**).
|
||||
- **vì sao KHÔNG kêu:** máy `mind-check` phép (5)(6) chỉ soi **số-hiệu + bất-biến |block| vs p** — nén là **hợp lệ** với cả hai; phép (9) chỉ đòi *mỗi ý mục D có nhãn*, không đòi *mọi ý kỳ trước có nơi đi*. ⇒ đây là **vắng-mặt trông giống ổn** (`feedback_absence_looks_like_clean`) ở đúng lớp trí-nhớ mềm.
|
||||
- **5-why:** (1) trần `_mind` chật (89%) ⇒ mỗi cửa buộc nén 1 block → (2) nén chọn block CŨ NHẤT (đúng luật) → (3) người nén tóm-tắt theo **ấn-tượng còn lại**, ý nào không nhớ thì rơi → (4) rơi **không sinh diff đọc được** (block cũ vốn được phép co lại) → (5) ý sống-sót duy-nhất ở block bị nén thì **không có nguồn thứ 2 để đối-chiếu**.
|
||||
- **fix KÉP:** (a) **vá dữ-liệu** — di-trú 2 ý vào WAL rồi lên `HANDOFF` slot (58) + `[carry:mind-tran-nen-moi-cua]`; (b) **vá guard** — trước khi nén, liệt tập-ý mục D của block sắp nén và gán nơi-đi từng ý (nghi-thức, chưa cơ-khí-hoá được: máy không phán được "ý này đã đóng chưa"). 🔴 Khai thẳng: **guard (b) hiện là NGHI-THỨC, không phải máy** ⇒ đúng lớp "cấm bằng trí-nhớ" mà repo này vốn cảnh-giác; nâng lên máy được khi có nguồn thứ 2 để diff.
|
||||
- **liên-đới:** trần chật là **nguyên-nhân gốc** ⇒ slot (58) hỏi owner (nâng `mind_ctx_kb` / đổi luật nén / chấp nhận nén mỗi cửa) — vá triệu-chứng mà không hỏi trần thì ca này **tái diễn mỗi cửa `/pause`**.
|
||||
|
||||
### E-014 — AS-18 slot-index tái-dụng làm MẤT owner-decision không để lại vết (S146, H24 `lead-omission-auditor` bắt, lead verify bằng `git show`)
|
||||
- **rule (AS-18 NEW):** khối đánh số (`OWNER-DECISION [n]`, checklist, enum…) **CHỈ ĐƯỢC TĂNG index**. **CẤM tái-dụng số cũ cho nội-dung mới.** Đè slot = nội-dung cũ **biến mất im-lặng** — khác hẳn đổi giá-trị (còn thấy giá-trị cũ để grep).
|
||||
- **what:** owner @S146 nói *"còn lại xử lý hết xong rồi session-end nhé"*; lead ghi ĐÚNG vào `.claude/WAL.md:9` slot `[7]` = **uỷ-quyền commit+push** (`ad02483`, `9c68bae`). Sau đó lead thêm 3 quyết-định session-model và **tái-dụng slot `[7]`** ⇒ `e7d06f2` mất hẳn dòng cũ. Grep toàn repo = **0 hit**.
|
||||
|
||||
Reference in New Issue
Block a user