diff --git a/.claude/WAL.md b/.claude/WAL.md index eade70d..ce7abd2 100644 --- a/.claude/WAL.md +++ b/.claude/WAL.md @@ -10,7 +10,7 @@ chain: - [x] V2 ring2-audit — END VERDICT=13Đ/2T (đĩa; lượt-1 skeleton 1.020B, bản chốt = lượt-2) - [x] hậu-V2 — signal-write S170 OK: light_at=44, 8 class FIRE (gap-carry-dropped 9→10 khớp ring2 dự-tính), 1 RESET đúng semantics; 🔴 7/11 class ≥ JUMP=3 → nêu @close cân deep-JUMP. + vá 2 số stale hậu-ring: STATUS:474 31→59 · investigator-codebase:81 bỏ neo-số (ENV-DEP, ăn sau restart) - [x] V3 trio TRỌN — eval MIXED 19-trục/14-signal → refine 1-action/14-BÁC (E1 impl-fe drain −62,5% dưới low-water, A4 0-sàn → CHỜ-ANH) → audit 55Đ/5T re-chạy-177-số/172-byte-exact + CHẶN-A1 (2 mục MISS = trivial<30min + build-gap ⇒ 0 đích reinject; 11/13 đứng-yên trừ khi anh đổi chữ/matcher → CHỜ-ANH) · #53: eval-return + audit-×2 (resume ×2 cứu trọn), refine sạch -- [!] V4 nén-ngủ — P0✓(17 shard/238.849B) · P1✓ 2 curator XONG (A: 9f/45c 113.797B resume-1× · B: 8f/48c 123.454B sạch) + 🔐 2 secret THÔ redact (xem dòng CHỜ-ANH) + đề-nghị skip cicd/2026-08 (đã-chưng-cất) CHẤP NHẬN ⇒ 16 gist · P2 DRAFT: 2 drafter sub ĐANG CHẠY → sleep-drafts/*.gist.draft.md (proposal 59K-tok/file quá dày cho lead-context — sub draft, lead gate+chốt giữ B3) · còn P3 gate-máy → P4 đưa vào archive/ → P4.5 ring4 → P5 report+commit(chờ-anh) +- [!] V4 nén-ngủ — P0✓(17 shard/238.849B) · P1✓ 2 curator XONG (A: 9f/45c 113.797B resume-1× · B: 8f/48c 123.454B sạch) + 🔐 2 secret THÔ redact (xem dòng CHỜ-ANH) + đề-nghị skip cicd/2026-08 (đã-chưng-cất) CHẤP NHẬN ⇒ 16 gist · P2✓ 2 drafter sạch (A 8-draft/98KB 38/38-pointer · B 8-draft+note/121KB) · P3(a)✓ coverage-máy 16/16 PASS (77 token-literal bổ sau soi-tay 4-ca: MISS = biến-thể dải/range/bold-split, KHÔNG mất nội-dung) · P3(b) reviewer Fidelity ĐANG CHẠY (4-tên-cờ + 4 cặp rủi-ro) → P4 archive/ → P4.5 ring4 → P5 report+commit(chờ-anh) - [ ] Phase 3.5 đuôi — refresh _mind block-1 (E stale) + ctx-audit @open + bookend-open-synthesis.md (dạng-1) - [ ] monthly drift-audit 2026-08-01 DUE quá hạn (session đầu-tháng = L10) + re-sync measured{} 17/23 — xếp thứ-tự vs task anh giao - [ ] 🔴 CHỜ-ANH slot (65) ZZTEST hạn 01-08 QUÁ 2 ngày (chỉ anh có kênh) · (64) user TEST · (66) dọn HĐ ZZTEST · thư day-wake-probe nấc adopt (ctx-verifier cờ ⑩: món 65 từng ngoài bản-đồ) diff --git a/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/_lienfile-notes-batchB.md b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/_lienfile-notes-batchB.md new file mode 100644 index 0000000..2eb39c8 --- /dev/null +++ b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/_lienfile-notes-batchB.md @@ -0,0 +1,20 @@ +# _lienfile-notes-batchB — quan-hệ GIỮA file (FLAG-only, lead chốt sau) + +> Nguồn: section "Ghi-chú liên-file" của `sub-harvest-curator-sleep-batchB-S170.md` (7 quan-hệ) + 3 quan-sát bổ-sung của gist-drafter B @S170. +> KHÔNG phải bản nén — KHÔNG trộn vào gist per-file (nguyên tắc đóng-kín từng file). Mọi mục dưới đây chờ lead quyết khi hợp nhất. + +## 7 quan-hệ từ curator + +1. **Bản sao nguyên-văn cùng vai:** `investigator-codebase/2026-05-q1` (mục "2026-05-11 (setup)") ≡ `…/2026-05-q3` (mục "2026-05-11 — Setup baseline") — trùng nội-dung ("44 gotchas + 14 memory entries + 6 skills + 27 mig + 81 test pass cumulative … Awaiting first SendMessage"). Đề-xuất: giữ 1 bản, bản kia thành con-trỏ. *(Draft B đã ghi chú chéo ở B1-G và B3-C+D, chưa xoá bên nào.)* +2. **Cùng sự-kiện, 2 độ dài:** audit 2 bug changelog S25 — bản DÀI (q2 B2-A, 5Q đầy đủ) vs bản NGẮN (q3 B3-B, wrap + kết-cục CI `#215` FAIL → `#216-#221` PASS). Nén mất bản dài = mất file:line; nén mất bản ngắn = mất kết-cục CI. Draft B giữ CẢ HAI. +3. **Cùng sự-kiện, 2 VAI (rủi-ro đếm đôi khi hợp nhất):** ① bug lookup per-NV — `investigator-q1` B1-A (chẩn-đoán `:765`) ↔ `reviewer-q1` B5-B (Plan N vá 1/5 site → Plan O cascade 4 site). ② Plan P — B1-B (phát-hiện body 3 field) ↔ B5-B ("root cause 2 ngày prod bug F1+F2"). ③ Plan AA — B1-E ↔ B5-D. Đề-xuất: giữ cả hai NHƯNG ghi rõ vai (chẩn-đoán ⟂ nghiệm-thu) — Draft B đã giữ cả hai phía. +4. **Một tên, hai nghĩa:** trong `investigator-q2`, "Mig 32" xuất-hiện 2 nghĩa (Plan AG đề-xuất `AddProjectPackageTable` ⟂ Plan B thực-dụng cho Contract `AddApprovalWorkflowToContract`). Nén ẩu sẽ tạo mâu-thuẫn giả — Draft B giữ token đối-chiếu ở phụ-lục q2. +5. **Một gotcha, hai cách chú-giải:** `#48` — batch B chú "SQLite frozen clock tie-break" (`reviewer-q2` + `investigator-q3` + `test-specialist`), batch A (`sub-harvest-curator-sleep-batchA-S170.md:43`) chú "refactor >100 LOC Service chạm changelog/audit". Đề-nghị lead chốt 1 chú-giải canonical khi hợp nhất (quan-sát, KHÔNG phán bên nào sai). +6. **3 mục sức-khoẻ HARVEST (H2 lưu ý riêng):** ① `investigator-q4` header — MEMORY từng trỏ file VẮNG đĩa, nội-dung git-only `d2f52ba`; lô S29-S37 tới nay vẫn khai chỉ nằm trong git (đầu mối kéo về đĩa; curator CHƯA kiểm trạng-thái hiện tại). ② `test-specialist` S133 — 2 lần gọi cùng vai trong 1 run-folder ghi đè sub-file của nhau (INV-C đè `sub-test-specialist-0.md` của INV-A), nội-dung sống nhờ journal + diary. ③ `investigator-q3` S27 — vai tự nghi-ngờ lịch-sử spawn của chính mình ("agent type NOT FOUND", "trust prior memory entries but FLAG uncertainty") — token loại Fidelity, giữ nguyên, không tự phán. +7. **Ràng buộc nén đã tuân (curator tự khai, drafter B xác nhận đã giữ):** `test-specialist` giữ đủ 16 mốc chuỗi gốc + 12 mốc hậu-chuỗi + 4 lỗ + 2 mâu-thuẫn nội-tại (nhãn `⚠️ mâu-thuẫn nội-tại văn-bản — KHÔNG tự sửa số @S170` đã gắn trong draft); `implementer-frontend` giữ 14/14 mục moved-not-cut khối riêng + nguyên chuỗi tag Ctrl-F, mục auto-refuse tag {cao}. + +## 3 quan-sát bổ-sung của gist-drafter B (đo đĩa @S170, ngoài proposal) + +A. **Chênh số entry test-specialist:** curator khai "25 entry"; đo đĩa = 30 heading `##` = 1 dòng "Count progression" + **29 entry-heading** (S155 → S54). Entry **S60** ("UAT anh Kiệt 2 feature PE submit branch, +14") KHÔNG thuộc cụm narrative nào của curator — nó chỉ sống ở mốc mở chuỗi "254 (S60)" (TS-A) + token "GUARD-FIRST"/"⚠️GUARD-FIRST: bypass-test PHẢI dựng PE đủ 4 ĐK" ở phụ-lục. Lead cân nhắc: chấp nhận coverage-qua-token, hay bổ 1 dòng narrative cho S60 khi chốt gist. +B. **Chênh số entry investigator-q1 (hoà-giải được):** curator khai "10 entry verbose FIFO S21→S24"; đĩa = 11 heading `###` = 10 FIFO S21→S24 **+ 1 setup 2026-05-11**. Draft B ghi header "(11 entry [10 FIFO S21→S24 + 1 setup] → 7 cụm)" — không mâu-thuẫn, chỉ khác phạm-vi đếm. +C. **"Run #231" trong B2-B là chú-thích curator, KHÔNG thuộc verbatim q2:** grep `231` trên `investigator-codebase/archive/2026-05-q2.md` = **0 hit**. Draft B đã đánh dấu "(chú-thích curator S170, không thuộc verbatim)" ngay trong entry — khi chốt gist chính-thức, lead quyết giữ (giá-trị nối tiền-sử sự-cố) hay bỏ (thuần-verbatim). diff --git a/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/cicd-monitor--2026-05-q2.gist.draft.md b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/cicd-monitor--2026-05-q2.gist.draft.md index 0260a99..0a4b638 100644 --- a/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/cicd-monitor--2026-05-q2.gist.draft.md +++ b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/cicd-monitor--2026-05-q2.gist.draft.md @@ -32,3 +32,11 @@ pointer-style: substring - **guard:** `DemoSeed:Disabled=true` feature-flag gate · `Reviewer ApplicableType=Contract guard` (hotfix commit trong range) · `paths-ignore`/test-gate 111 baseline · `feedback_uat_skip_verify` (rule được viện-dẫn) · Rule `§6.5` "KHÔNG cắt narrative" - **root-cause:** "DemoSeed feature flag gates Plan B Chunk A2 sample V2 workflow seed" ⇒ `QT-HD-V2-001 NOT seeded in prod (0 rows ApplicableType=3)` ⇒ V2 endpoint trả `{"active":null,"history":[]}` ⇒ dropdown Create rỗng - **file:line / định-danh:** log `2026-05-22 12:57:44 [INF] DemoSeed:Disabled=true → skip workflow + contracts + PE + sample V2 seed (Plan T S23 t10 + Plan B Chunk A2 Contract V2)` · `SeedSampleContractWorkflowV2` · `ApproveV2Async` (~150 LOC) · Run #231 id=345 · Run #232 sha=`38f1c4d` · push range `6eec8d7..3e92584` (11 commit) · Mig 32 `20260522051059_AddApprovalWorkflowToContract` · Mig 33 `20260522052240_AddContractLevelOpinions` · cột `ApprovalWorkflowId` + `CurrentApprovalLevelOrder` · bảng `ContractLevelOpinions` (0 row) · bundle `leEMWFLU→BBADl46y` (admin) / `Dgn1iU9E→DA_VI3zO` (user) · `QT-HD-V2-001` (ApplicableType=3) / `QT-DN-V2-001` v1+v2 (ApplicableType=1) · CI 3m30s 12:54:24→12:57:54 · `SlaExpiryJob` 5 ERR @12:58:16 · 4 transition `DangInKy→DangKiemTraCCM` / `DangSoanThao→DangGopY` / `DangGopY→DangDamPhan` / `DangTrinhKy→DongDau` · archive-header: S32 curate, 27KB→~24KB, ngưỡng 25KB + +### Bổ-sung coverage @P3-gate S170 (token literal — nội-dung đã sống dạng dải/range ở trên; dòng dưới chép NGUYÊN-VĂN context verbatim làm lưới grep) + +- `#215` — > **KEEP in MEMORY:** S32 startup, S29 wrap summary (Run #229-#232 cumulative aggregate including #231 + #232 hotfix DemoSeed gate catch), S28 Layer A… +- `#216` — > **KEEP in MEMORY:** S32 startup, S29 wrap summary (Run #229-#232 cumulative aggregate including #231 + #232 hotfix DemoSeed gate catch), S28 Layer A… +- `#229` — > **KEEP in MEMORY:** S32 startup, S29 wrap summary (Run #229-#232 cumulative aggregate including #231 + #232 hotfix DemoSeed gate catch), S28 Layer A… +- `Run #215` — > **KEEP in MEMORY:** S32 startup, S29 wrap summary (Run #229-#232 cumulative aggregate including #231 + #232 hotfix DemoSeed gate catch), S28 Layer A… +- `Run #229` — > **KEEP in MEMORY:** S32 startup, S29 wrap summary (Run #229-#232 cumulative aggregate including #231 + #232 hotfix DemoSeed gate catch), S28 Layer A… diff --git a/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/cicd-monitor--2026-05-q4.gist.draft.md b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/cicd-monitor--2026-05-q4.gist.draft.md index 1814a3d..69836cf 100644 --- a/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/cicd-monitor--2026-05-q4.gist.draft.md +++ b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/cicd-monitor--2026-05-q4.gist.draft.md @@ -61,3 +61,13 @@ pointer-style: substring · **S32 wrap:** agent id `a505a02d84fc1fabe` · MEMORY 27→24.2KB · 5 commit docs-only · cert `2026-07-23` (openssl s_client) · Plan G 11 module backlog · BW1-BW7 spec ready · 3 trigger chờ S33 (a) G-H1 Hồ sơ NS · (b) BW test bundle · (c) UAT smoke V2 contract · ~3K token · Tag `[wrap, phase-9-to-phase-10, cicd]` · **S32 startup:** MEMORY **24.9KB / 221 lines** · `search_memory` query "Run 232 Plan B Hotfix CICD SeedSampleContractWorkflowV2" rerank **0.906** / 0.828 / 0.816 · RAG **2949 chunk** · last push `f938bf5` (S31 docs patch `cicd-monitor.md`) · ~10K token · **S26:** Run #222 `0bf6c7e` ~12K · bundle `C8TvDy7r→CWHIdoFo` + `BvcWrq2z→Bg2FNeIz` · smoke 5/5 200 · PE List API **9 field** · test-gate **111** · Mig 31 unchanged · Run #223-#227 = Plan AG2-AG6 · AG4 DTO +4 field `DrafterUserId`/`DrafterName`/`DepartmentId`/`DepartmentName` + 3 projection JOIN `Users`+`Departments` · `dotnet test` 111/111 local pre-push · `~150K × N wasteful` + +### Bổ-sung coverage @P3-gate S170 (token literal — nội-dung đã sống dạng dải/range ở trên; dòng dưới chép NGUYÊN-VĂN context verbatim làm lưới grep) + +- `Mig 29` — **Mig prod TOP 5 DESC** sqlcmd Windows-auth via `ssh vietreport-vps "powershell ... '.\\SQLEXPRESS' -E"` pattern (UPDATED from Discovery #5): `AddCont… +- `Mig 30` — **Mig prod TOP 5 DESC** sqlcmd Windows-auth via `ssh vietreport-vps "powershell ... '.\\SQLEXPRESS' -E"` pattern (UPDATED from Discovery #5): `AddCont… +- `Mig 32` — **Mig prod TOP 5 DESC** sqlcmd Windows-auth via `ssh vietreport-vps "powershell ... '.\\SQLEXPRESS' -E"` pattern (UPDATED from Discovery #5): `AddCont… +- `Mig 33` — Archived 2026-05-28 S36 startup curate (em main proxy) — 6 verbose Run entries from S32-S34 absorbed into baseline summary (test 120 → 130, Mig 33… +- `Run #231` — Session 32 đóng clean. Em chủ trì spawn em 1 lần S32 startup verify (a505a02d84fc1fabe alive, MEMORY 27→24.2KB post curate Run #231 PARTIAL d… +- `Run #232` — **Mig prod TOP 5 DESC** sqlcmd Windows-auth via `ssh vietreport-vps "powershell ... '.\\SQLEXPRESS' -E"` pattern (UPDATED from Discovery #5): `AddCont… +- `Run #235` — **Cert api.solutions.com.vn notAfter `Jul 23 01:58:16 2026 GMT`** (matches HANDOFF expected ~2026-07-23, ~58 days lead, auto-renew ~2026-06-23 win-acm… diff --git a/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/cicd-monitor--2026-05-runs.gist.draft.md b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/cicd-monitor--2026-05-runs.gist.draft.md index 39666a4..a9286cd 100644 --- a/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/cicd-monitor--2026-05-runs.gist.draft.md +++ b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/cicd-monitor--2026-05-runs.gist.draft.md @@ -99,3 +99,40 @@ pointer-style: substring - **Mig / dữ-liệu prod:** Mig 28 `20260513114505_AddAdvancedOptionsToApprovalWorkflows` · Mig 29 `RefactorAdvancedOptionsToPerLevelAndDrafterUser` (backfill **48/48** Levels · **0/13** Users) · Mig 30 `20260513160703_AddAllowApproverEditBudgetToLevels` · Mig 31 `20260514160124_RefactorSkipToFinalToApproverLevel` · test-count chuỗi **84 → 103 → 104 → 106 → 108 → 111** · Users **33** · Suppliers 19 · Projects 9 · Contracts 7 · PE-ID `3248f2f9-c6e9-43ff-a4ca-067ffecf9f36` (PE/2026/A/032) · `98736f06-...` (A/025) · `59176ad5-...` (A/027) · `6148ba7a-...` (A/026) · `f9476dad-...` (A/021) · workflow `bf31f120` · token len admin **468** / nv.test **477** · `~720 rows wiped` - **🔐 secret (đã xử-lý):** dòng **48** verbatim — `appsettings.Production.json` tại `C:\inetpub\solution-erp\api\`, `user=vrapp`, password prod **ĐÃ ĐƯỢC LEAD REDACT** thành nhãn `pwd=[đã che 71b7740a — ROTATE REQUIRED]` — gist chép NHÃN CHE này, TUYỆT ĐỐI không tra/chép giá-trị gốc từ git history; **ROTATE REQUIRED** vẫn treo (mật-khẩu từng nằm trong lịch-sử git) - **meta / size-trend:** `~35KB → ~40 → ~43 → ~50 → ~58 → ~60 → ~62 → ~66 → ~69 → ~72KB` · ngưỡng mềm **25KB** / cứng **50KB** · FIFO `~8 → ~9 → ~10 → ~11 → ~12 → ~13 entry` · token-cost mỗi lượt `~10k-28k` · `feedback_md_compact_narrative.md` (§6.5) · `feedback_uat_skip_verify` · `feedback_per_nv_permission_scope.md` + +### Bổ-sung coverage @P3-gate S170 (token literal — nội-dung đã sống dạng dải/range ở trên; dòng dưới chép NGUYÊN-VĂN context verbatim làm lưới grep) + +- `#216` — > **Target slim MEMORY.md after archive:** ~25-30KB (~5 entries kept: Run #215 fail lesson + Run #216 fix + Run #222-#227 S26 + setup baseline).… +- `#222` — > **Target slim MEMORY.md after archive:** ~25-30KB (~5 entries kept: Run #215 fail lesson + Run #216 fix + Run #222-#227 S26 + setup baseline).… +- `#227` — > **Target slim MEMORY.md after archive:** ~25-30KB (~5 entries kept: Run #215 fail lesson + Run #216 fix + Run #222-#227 S26 + setup baseline).… +- `83c9f7b` — (S23 t3 Plan M push range `83c9f7b..f4055a1` 4 commits: Chunk M1 BE Service F1.OneLevel/OneStep edge case Bước 1 → reset (0,1) giữ ChoDuyet + a… +- `8c05947` — **PASS** verdict — fix Bug 3 "Lịch sử duyệt" panel show Trả lại + Duyệt vượt cấp. Push `8c05947..a734bf2` 1 commit Plan AC. Duratio… +- `Mig 26` — (S25 t4 Plan AC2 — FE merge view recover historical Reject events PE cũ — push `a734bf2..25837b6` 1 commit Plan AC2 FE-only). Duration 3m23s base… +- `Mig 27` — (S23 t11 Plan U FE sidebar truncate). Commit 2 file FE × 2 app mirror `Layout.tsx` — MenuNodeRenderer button (accordion toggle) + MenuLeaf NavLink … +- `PurchaseEvaluationDetailFeatures.cs:75` — (S23 t5 Plan O HOTFIX cascade 4 lookup sites — push range `fb3c22c..a1c8386` 2 commits: `ae01ca5` Chunk O1-O5 atomic BE fix 4 lookup sites cùng pat… +- `PurchaseEvaluationFeatures.cs:314` — (S23 t5 Plan O HOTFIX cascade 4 lookup sites — push range `fb3c22c..a1c8386` 2 commits: `ae01ca5` Chunk O1-O5 atomic BE fix 4 lookup sites cùng pat… +- `PurchaseEvaluationWorkflowService.cs:204` — - `PurchaseEvaluationWorkflowService.cs:204` `step.Levels.FirstOrDefault(l => l.Order == curLvl && l.ApproverUserId == actorId)` + throw if null… +- `PurchaseEvaluationWorkflowService.cs:258` — - `PurchaseEvaluationWorkflowService.cs:258-260` `step.Levels.FirstOrDefault(l => l.Order == evaluation.CurrentApprovalLevelOrder && l.ApproverUserId … +- `Run #187` — ### 2026-05-13 20:12-20:15 — Run #187 id=301 sha=c0af9e0 VERDICT=PASS… +- `Run #193` — (S22 chốt — em main spawn cumulative verify cuối S22). Latest CI run #193 id=307 sha=`b04a11a` (S22+5 Chunk B FE) success at 23:16. **Tip commit… +- `Run #194` — ### 2026-05-14 ~16:30 — Run #194 id=308 sha=`098baa6` VERDICT=PARTIAL… +- `Run #195` — ### 2026-05-14/15 — Run #195 id=309 sha=`0062fcb` VERDICT=PASS… +- `Run #199` — (S23 t3 Plan M push range `83c9f7b..f4055a1` 4 commits: Chunk M1 BE Service F1.OneLevel/OneStep edge case Bước 1 → reset (0,1) giữ ChoDuyet + a… +- `Run #200` — ### 2026-05-15 ~11:21-11:25 — Run #200 id=314 sha=`f4055a1` VERDICT=PASS… +- `Run #201` — ### 2026-05-15 12:42-12:45 — Run #201 id=315 sha=`fb3c22c` VERDICT=PASS… +- `Run #202` — ### 2026-05-15 13:18 — added S23 t5 Plan O HOTFIX Run #202 entry… +- `Run #203` — ### 2026-05-15 13:45 — added S23 t6 Plan P HOTFIX Run #203 entry… +- `Run #207` — ### 2026-05-15 ~14:15 — Run #207 sha=`0b97840` VERDICT=PASS… +- `Run #208` — ### 2026-05-15 ~14:30 — Run #208 sha=`7b7b28f` VERDICT=PASS… +- `Run #209` — ### 2026-05-15 ~14:50 — Run #209 sha=`86d8806` VERDICT=PASS… +- `Run #210` — ### 2026-05-15 15:25 — added S24 t1 Plan AA Run #210 entry… +- `Run #214` — **FAIL** verdict at test_infra gate — 2 Plan M edge case tests broken `ApplyReturnMode_OneStep_AtStep1` line 350 + `ApplyReturnMode_OneLevel_AtStep1… +- `Run #215` — > **Target slim MEMORY.md after archive:** ~25-30KB (~5 entries kept: Run #215 fail lesson + Run #216 fix + Run #222-#227 S26 + setup baseline).… +- `Run #216` — > **Target slim MEMORY.md after archive:** ~25-30KB (~5 entries kept: Run #215 fail lesson + Run #216 fix + Run #222-#227 S26 + setup baseline).… +- `Run #218` — ### 2026-05-19 11:00-11:03 — Run #218 id=332 sha=`25837b6` VERDICT=PASS… +- `Run #219` — ### 2026-05-19 11:25 — added S25 t5 Plan AD Run #219 entry… +- `Run #220` — ### 2026-05-19 12:33-12:36 — Run #220 id=334 sha=`9ea62be` VERDICT=PASS… +- `Run #221` — ### 2026-05-19 13:05-13:08 — Run #221 id=335 sha=`506cada` VERDICT=PASS… +- `Run #222` — > **Target slim MEMORY.md after archive:** ~25-30KB (~5 entries kept: Run #215 fail lesson + Run #216 fix + Run #222-#227 S26 + setup baseline).… +- `a1a910f` — (S24 t1 Plan AA — IsUserSelectable filter + WfView menu + sidebar widen). Push range `a1a910f..ac2c859` 3 commits: `ee776d5` Chunk A BE+Layout (6 fi… +- `eb106f2` — (Plan K 8 commits S23 t1 Mig 31 F2 refactor sang per-Approver-slot — push range `eb106f2..098baa6`). Run completed `status=success`. **Mig 31 prod T… diff --git a/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/implementer-backend--2026-05-q1.gist.draft.md b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/implementer-backend--2026-05-q1.gist.draft.md index 891d8e0..4990f91 100644 --- a/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/implementer-backend--2026-05-q1.gist.draft.md +++ b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/implementer-backend--2026-05-q1.gist.draft.md @@ -57,3 +57,10 @@ pointer-style: substring - **file:line / định-danh (BE):** `ApprovalWorkflow.cs` (+`AllowApproverSkipToFinal`; narrative **:78-80**; docstring **:108**) · `User.cs` (−1 prop) · `ApprovalWorkflowConfiguration.cs` (**:22-24** narrative, **:87** storage-move comment) · `PurchaseEvaluationWorkflowService.cs` **:121-157** (−37 LOC), **:287-333** (F1 edge), **:96-99** (comment → ContextNote) · `UserFeatures.cs` · `SetUserAllowDrafterSkipToFinalCommand(+Handler)` · `UsersController.cs` + `SetAllowDrafterSkipToFinalBody` · `PurchaseEvaluationFeatures.cs` **:401** · `ApprovalWorkflowV2AdminFeatures.cs` **:58** · `IPurchaseEvaluationWorkflowService.cs` · `PurchaseEvaluationDtos.cs` · `ApplicationDbContext.OnModelCreating` **~:86** · `DbInitializer.cs` (cờ DemoSeed ~25 LOC) - **file:line / định-danh (test + FE):** `PurchaseEvaluationWorkflowServiceReturnModeTests.cs` **:253** (vỡ, để cho K7), **:241** (chèn 2 `[Fact]` mới) · helper `SeedWorkflowAsync` / `SeedApproversAsync` / **`SeedApproverF2WorkflowAsync`** (2 Bước × 2 Cấp) / `BuildPeAtLevel2` · test xoá: `SkipToFinal_DrafterAllowed_SetsPointerToFinalLevel` · `SkipToFinal_DrafterDenied_NonAdmin_Throws` · `SkipToFinal_AdminBypass_Succeeds` · test thêm: `ApproveV2_SkipToFinal_AdminTickFlag_SetsPhaseDaDuyet` · `ApproveV2_SkipToFinal_FlagOff_NonAdmin_ThrowsConflictException` · `ApproveV2_SkipToFinal_FlagOff_Admin_BypassesFlagCheck` · `ApplyReturnMode_OneLevel_AtStep1Level1_ResetsToBuoc1Cap1_KeepsChoDuyet` · `ApplyReturnMode_OneStep_AtStep1_ResetsToBuoc1Cap1_KeepsChoDuyet` · `ApprovalWorkflowsV2Page.tsx` **:873**, **~:500**, **:535**, banner **~:623**, stale **:75** + **:504** (hoãn K6) · `UsersPage.tsx` + `types/users.ts` · `types/purchaseEvaluation.ts` (`PurchaseEvaluationPhaseLabel[98]`, `PeDisplayStatusLabel.TraLai`) · `PeWorkflowPanel.tsx` · `fe-user/src/types/approvalWorkflowV2.ts` (~55 LOC, 5 record type `AwLevelDto`/`AwStepDto`/`AwDefinitionDto`/`AwTypeSummaryDto`/`AwAdminOverviewDto`) · `fe-user/src/pages/pe/WorkflowMatrixViewPage.tsx` (~215 LOC) · `fe-user/src/App.tsx` route `/purchase-evaluations/workflow-matrix` · `seed-test-users-prod.ps1` → `$authResp.accessToken` · `scripts/plan-r-*.sql` + `plan-s-*.sql` + `plan-t5-*.sql` + `plan-t-backup.sql` - **số-đo:** test **84 → 104 → 106** · mig **29 → 30 → 31** · endpoint ~**146** (+3) · user prod **33** (13 cũ + 20 mới) · diff K5 **+42/-94** (9 file) · K7 **+175/-92** (1 file) · K3 **+26/-7** · M2 **+94** · M3 **+4/-4 ×2 = 8 LOC** · bundle fe-admin **1395 / 1395.74 KB** · fe-user **1275 / 1282 KB** (1907 module, 2.61s) · commit S24 **7** (`a1a910f..ee0902a`, 1 spawn + 6 solo) · token/chunk ~5k-14k · MEMORY nguồn **38.8 KB** · `~720 rows wiped` + +### Bổ-sung coverage @P3-gate S170 (token literal — nội-dung đã sống dạng dải/range ở trên; dòng dưới chép NGUYÊN-VĂN context verbatim làm lưới grep) + +- `#1` — Cleanup zombie F2 endpoint + UsersPage column + DTO field + stale narrative comments (Reviewer Major #1 + Major #2 + Minor #3 + Minor #4). Pattern pos… +- `Mig 25` — FE user read-only matrix view workflow V2 ghim (Mig 25 IsUserSelectable). 3 file: (1) CREATE `fe-user/src/types/approvalWorkflowV2.ts` (~55 LOC) — s… +- `Mig 29` — Em main classified ALL S22 work as cross-stack reasoning chain (BE Mig + Service guard + DTO + FE Designer + FE Section + FE types + tests) → REFUSE… +- `PurchaseEvaluationWorkflowServiceReturnModeTests.cs:253` — Mig 31 schema swap F2 storage Users → ApprovalWorkflowLevels. Pattern Mig 29 ADD-DROP no-BACKFILL Option A (accept lose 4 prod user value `fin.pp` +… diff --git a/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/implementer-backend--2026-05-q3.gist.draft.md b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/implementer-backend--2026-05-q3.gist.draft.md index 526f802..8f5af8a 100644 --- a/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/implementer-backend--2026-05-q3.gist.draft.md +++ b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/implementer-backend--2026-05-q3.gist.draft.md @@ -7,11 +7,16 @@ pointer-style: substring 1. **Nhận/từ-chối việc là bài học 2 chiều đối-xứng:** H1 ca nhận-rồi-vỡ (E3 tự dừng giữa chừng đúng chỗ judgment call; phải `stash` WIP em-main vì song-song cùng lớp BE) ⟂ H2 ca lẽ-ra-nhận-mà-không-được (2/8 task hợp-lệ nhưng registry rỗng ⇒ em-main forced solo, thiệt ~30 phút) — ngưỡng giao việc = **độ mơ-hồ spec >20%**, không phải số file. 2. **Song-song trên cùng một lớp code đẻ chi-phí ẩn** ⇒ luật: chunk **tuần-tự A→B→C** khi cùng chạm BE, KHÔNG parallel. 3. **Governance S28:** cấm tự-cho-phép đặt luật xuyên dự-án (bro bắt tại trận); luật cũ phải **khai tử công-khai (ABANDONED)** thay vì để trôi — luật zombie hại hơn không có luật; pattern proven ≥2× mới đề-cử Layer B. -4. ⚠️ **FIDELITY-FLAG: 4 tên cờ 0-hit src/Backend @S170 — chờ reviewer chấm, đừng cite như fact** (claim Pattern 7 trong verbatim nêu `AllowDrafterEdit`/`AllowApproverEditSection1`/`AllowEarlyApprove`/`AllowDelegate` — nghi trôi từ-vựng UI thay tên code; ý an-toàn để giữ: "Pattern 7 đã áp 4 lần qua Mig 29/30/31" bỏ tên cờ). +4. ⚠️ **FIDELITY-FLAG (reviewer ĐÃ chấm @S170): 4 tên cờ trong claim Pattern 7 đều 0-hit src/Backend, VÀ con số "4×" cũng CHƯA KIỂM** — "4×" suy từ đếm đúng 4 tên vừa bị bác (3 tên đổ về ~3 migration), KHÔNG có chứng độc-lập; đừng cite cả tên lẫn số như fact. Ý giữ được ở dạng không mang số: "Pattern 7 (per-NV admin opt-in) lặp qua chuỗi Mig 28→31 (số lần chưa kiểm)". ## Entries -> ⚠️ **FIDELITY-FLAG (bắt buộc mang theo mọi trích-dẫn Pattern 7 từ file này):** verbatim (S29 wrap) khai *"Pattern 7 per-NV admin opt-in flag (Mig 29 AllowDrafterEdit + Mig 30 AllowApproverEditSection1 + Mig 31 AllowEarlyApprove + AllowDelegate) đã proven 4×"* — **4 tên cờ `AllowDrafterEdit` / `AllowApproverEditSection1` / `AllowEarlyApprove` / `AllowDelegate` = 0-hit src/Backend @S170** (control dương `AllowApproverSkipToFinal` = 54 file · control âm tên bịa = 0 — thước còn răng) — **chờ reviewer chấm, đừng cite như fact**. Giả-thuyết lành: trôi từ-vựng UI-section thay tên code (lặp có hệ-thống, cả ở q1); riêng `AllowEarlyApprove`+`AllowDelegate` chưa có đối-ứng nào ở Mig 31 (thật = `AllowApproverSkipToFinal`). Tên Mig thật: `20260513114505_AddAdvancedOptionsToApprovalWorkflows` (28) · `20260513130144_RefactorAdvancedOptionsToPerLevelAndDrafterUser` (29) · `20260513160703_AddAllowApproverEditBudgetToLevels` (30) · `20260514160124_RefactorSkipToFinalToApproverLevel` (31). +> ⚠️ **FIDELITY-FLAG — reviewer CHẤM XONG @S170 (sub-reviewer-sleep-fidelity-S170.md §P1), bắt buộc mang theo mọi trích-dẫn Pattern 7 từ file này:** verbatim (S29 wrap) khai *"Pattern 7 per-NV admin opt-in flag (Mig 29 AllowDrafterEdit + Mig 30 AllowApproverEditSection1 + Mig 31 AllowEarlyApprove + AllowDelegate) đã proven 4×"*. **Phán từng tên (2 dụng-cụ độc-lập: grep src + git pickaxe toàn lịch-sử):** +> - `AllowDrafterEdit` = **tên viết sai, lai-ghép 2 cờ thật**: `AllowDrafterSkipToFinal` (Mig 29 → bảng `Users`) + `AllowApproverEditDetails` (Levels — và là *approver*, không phải drafter); +> - `AllowApproverEditSection1` = **trôi từ-vựng UI** của `AllowApproverEditBudget` (Mig 30 — đúng 1 cột duy nhất); +> - `AllowEarlyApprove` = tên sai nhưng **CÓ đối-ứng ngữ-nghĩa 1-1** = `AllowApproverSkipToFinal` (Mig 31); +> - `AllowDelegate` = **MA HOÀN TOÀN — 0 đối-ứng, pickaxe 0 commit toàn lịch-sử** (chưa từng được viết ra dòng code nào; `src/Backend` không có khái-niệm uỷ-quyền duyệt). +> **Con số "4×" của claim CŨNG CHƯA KIỂM** (suy từ đếm 4 tên trên). Số đo control dương `AllowApproverSkipToFinal` = **54 file với bộ lọc trừ `/obj/`+`/bin/`** (raw = 86; còn 12 khi trừ thêm `*.Designer.cs`+ModelSnapshot — 0-hit của 4 tên vững dưới cả 3 bộ lọc); control âm tên bịa = 0 — thước còn răng. Tên Mig thật: `20260513114505_AddAdvancedOptionsToApprovalWorkflows` (28) · `20260513130144_RefactorAdvancedOptionsToPerLevelAndDrafterUser` (29) · `20260513160703_AddAllowApproverEditBudgetToLevels` (30) · `20260514160124_RefactorSkipToFinalToApproverLevel` (31). **[cao] H1 — S29 wrap: 5 lần được gọi, và bài học về chạy song-song** - **VIỆC:** phiên bận nhất — Plan CA Chunk B (~10K) + Plan B 4 chunk (A2 Mig 32 ~25K · C Mig 33 ~25K · D FE ~12K · **E3 dừng giữa chừng**). @@ -47,7 +52,7 @@ pointer-style: substring - **criteria#:** `#1` phán-đoán giữ-hay-cắt (§6.5) · `#2` thiết-kế UX / viết docs · `#4` chuỗi suy-luận sửa lỗi · `#7` lần đầu, chưa tiền-lệ · Case 1 (n file sửa cơ-học giống nhau) · Case 2 (cookie-cutter mirror) - **surprise:** "**E3 stopped mid-task** ... STOPPED at 'check ContractDetail type' judgment call" · "**stash em main WIP `ContractWorkflowService.cs`** để build verify clean (em main + Implementer **parallel touch BE → race condition trick**)" · "Forward **SEQUENTIAL** chunks A→B→C khi cùng touch BE, **NOT parallel**" · "em main solo **more reliable** than Implementer khi **spec ambiguity > 20%**" · "**2/8 task lẽ ra delegate được** ... nhưng **registry empty → em main forced solo**" · "Net loss **~30 phút**" · "registry KHÔNG load (per pitfall **VIPIX #1+#2**)" · "bro **caught self-authorize cross-project rule mistake**" · "Quên rule cũ 'mọi tương tác mandatory store' — **ABANDONED**" · "Implementer = **busiest agent S29** với 5 spawn" - **guard:** `git stash` phần WIP trước khi build verify · chunk **tuần-tự** khi cùng chạm BE · ngưỡng **spec ambiguity 20%** để chuyển về em-main · tự-dừng khi gặp judgment call · tag schema bắt buộc `[pattern, phase-, ]` · **cấm tự-cho-phép luật liên-dự-án** · pattern phải proven **≥2×** mới đề-cử Layer B -- **root-cause:** em-main + vai **cùng sửa BE song song** ⇒ cây làm việc bẩn ⇒ build verify không sạch ⇒ phải `stash` · **registry không nạp** ⇒ không spawn được ⇒ 2 việc hợp-lệ bị dồn cho em-main · từ-vựng **UI-section** dùng thay tên cờ trong code ⇒ 4 tên cờ 0-hit (xem FIDELITY-FLAG) +- **root-cause:** em-main + vai **cùng sửa BE song song** ⇒ cây làm việc bẩn ⇒ build verify không sạch ⇒ phải `stash` · **registry không nạp** ⇒ không spawn được ⇒ 2 việc hợp-lệ bị dồn cho em-main · từ-vựng **UI-section** dùng thay tên cờ trong code ⇒ 3/4 tên = drift của cờ thật, 1/4 (`AllowDelegate`) = ma 0-đối-ứng (xem FIDELITY-FLAG) - **file:line / định-danh:** `ContractWorkflowService.cs` (WIP bị stash) · Mig 32 (+column FK **Restrict** + IX + Configuration + `DbInitializer` `SeedSampleContractWorkflowV2`) · Mig 33 `ContractLevelOpinions` (entity + Mig + Config + DbSet + `Contract.cs` +`LevelOpinions` nav) · `ContractCreatePage.tsx` ×2 (88 LOC) · 4 master page + `App.tsx` (+5 route) + `menuKeys.ts` (+5 key `Catalogs*`) · `pattern_master_page_mirror.md` · `archive/2026-05-q1.md` · script PS `start/stop/status/dashboard/boot` - **số-đo:** 5 spawn S29 · ~10K + ~25K + ~25K + ~12K token · **948 LOC** mirror / 6 file · MEMORY **38.8 KB → ~22-24 KB** · 12 entry dồn kho · setup **2026-05-11** -- **🔬 disk-check hôm nay (S170, có 2 control):** `AllowApproverSkipToFinal` = **54 file** (control dương) · `AllowXyzKhongTonTai` = **0** (control âm) · `AllowDrafterEdit` / `AllowApproverEditSection1` / `AllowEarlyApprove` / `AllowDelegate` = **0 / 0 / 0 / 0** · Mig thật: `20260513114505_AddAdvancedOptionsToApprovalWorkflows` · `20260513130144_RefactorAdvancedOptionsToPerLevelAndDrafterUser` · `20260513160703_AddAllowApproverEditBudgetToLevels` · `20260514160124_RefactorSkipToFinalToApproverLevel` +- **🔬 disk-check hôm nay (S170, có 2 control):** `AllowApproverSkipToFinal` = **54 file (bộ lọc: trừ `/obj/`+`/bin/` — raw 86; 12 khi trừ thêm Designer/Snapshot)** (control dương; pickaxe 5 commit) · `AllowXyzKhongTonTai` = **0** (control âm) · `AllowDrafterEdit` / `AllowApproverEditSection1` / `AllowEarlyApprove` / `AllowDelegate` = **0 / 0 / 0 / 0** (grep) + **0 commit pickaxe toàn lịch-sử** · cột thật: `AllowApproverEditDetails` · `AllowDrafterSkipToFinal`→`Users` · `AllowApproverEditBudget` · `AllowApproverSkipToFinal` · Mig thật: `20260513114505_AddAdvancedOptionsToApprovalWorkflows` · `20260513130144_RefactorAdvancedOptionsToPerLevelAndDrafterUser` · `20260513160703_AddAllowApproverEditBudgetToLevels` · `20260514160124_RefactorSkipToFinalToApproverLevel` diff --git a/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/implementer-backend--2026-05-q4.gist.draft.md b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/implementer-backend--2026-05-q4.gist.draft.md index 5ecd75b..ddf8ab0 100644 --- a/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/implementer-backend--2026-05-q4.gist.draft.md +++ b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/implementer-backend--2026-05-q4.gist.draft.md @@ -47,3 +47,7 @@ pointer-style: substring - **root-cause:** đợt dồn kho **S65 FIFO trim** chèn 2 digest **vào giữa** entry S33 Task 5 ⇒ thân và đuôi bị tách rời (gist này đã NỐI lại — xem ghi chú I1) · HRM thiếu `HasQueryFilter` ⇒ mọi truy-vấn phải tự lọc soft-delete · spec ghi MaxLength lệch EF ⇒ validator sai nếu tin spec - **file:line / định-danh:** `types/employee.ts` (**NEW ~283 LOC**, SHA256 `CCFC70666568`) · `pages/hrm/EmployeesListPage.tsx` (**~417 LOC**, `DC859C897C5C`) · `pages/hrm/EmployeeCreatePage.tsx` (**~178 LOC**, `C796F25D01AC`) · `menuKeys.ts` (+3 LOC `Hrm`+`HrmHoSo`) · `Layout.tsx` (+4 LOC staticMap **`Hrm_HoSo`**) · `App.tsx` (+5 LOC) · 6 file fe-user mirror · `HrmConfigFeatures.cs` **372 LOC** + Controller **134 LOC** (**16 endpoint**) · Mig 33 `ContractLevelOpinions` · Mig 34 (em-main giữ) · `migration-todos` (11 module / 10 sprint) · `PurchaseEvaluationWorkflowServiceReturnModeTests.cs` → `ContractWorkflowServiceApproveV2Tests.cs` (7 kịch-bản, spec D-Bis) · `mcp__rag-unified__search_memory` + `mcp__rag-unified__cross_project_search` · "Pattern curate trigger rule **line 364**" · agent id `ab23cc322b5d495c0` - **số-đo:** 14 file (S33 Task 5) · build fe-admin **21.4s / 1429KB** · fe-user **9.2s / 1345KB** · `dotnet build` **1.59s 0 warn 0 err** · `dotnet test` **120/120** (58 + 62) · test mốc S35 **130** · MEMORY **36.2KB** (`Length=36207`) → curate **27.5KB** · rerank **0.824 / 0.801 / 0.793** (ngưỡng 0.7) · token ~25k (Task 5) / ~5K (wrap) / ~5k (startup) · tag `[mirror-page, phase-10.1, frontend]` · `[s35, be-crud, hrm, 12-bis-3x]` · `[s29, plan-b, 12-bis]` · `[wrap, phase-9-to-phase-10, frontend+backend]` · `[verify, phase-9, infra]` + +### Bổ-sung coverage @P3-gate S170 (token literal — nội-dung đã sống dạng dải/range ở trên; dòng dưới chép NGUYÊN-VĂN context verbatim làm lưới grep) + +- `Mig 22` — (d) **Plan G-O3..G-O6 Workflow Apps** — cookie-cutter mirror PE Mig 22-26 Plan B pattern 12-bis cross-module entity scaffold cho 4 module (Proposal/… diff --git a/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/implementer-frontend--2026-H2.gist.draft.md b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/implementer-frontend--2026-H2.gist.draft.md new file mode 100644 index 0000000..f7d797e --- /dev/null +++ b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/implementer-frontend--2026-H2.gist.draft.md @@ -0,0 +1,109 @@ +# implementer-frontend/2026-H2 — gist +distill-gen: 1 +source-verbatim: .claude/agent-memory/implementer-frontend/archive/2026-H2.md (14 entry moved-not-cut → 11 cụm [9 đơn + 1 nhóm J1..J5 giữ 5 danh-tính + 1 chỉ-mục FE-M]) +pointer-style: substring + +## TỔNG-HỢP (3-5 ý) +- Sợi chỉ lặp 5 lần trong 3 phiên (FE-M): tiền-đề đề-bài/lead SAI — K2 việc thật ≈ 1/4 mô tả · K4a 2 tiền-đề sai trong 1 đề bài · K4b lần 3 liên-tiếp · K5 đường dữ-liệu không tồn-tại · K6 spec tự quên 8 designer ⇒ luật rút gọn: đo đĩa TRƯỚC khi gõ, đĩa cãi đề bài thì đĩa thắng — nhưng PHẢI KHAI chỗ cãi. +- Phép đo phải có control-âm mới gọi là đo: harness đo nhầm cái render bị React vứt — control-âm cũng ra 3 ⇒ phép đo mất khả-năng phân-biệt, trông y như PASS (FE-B); im-vì-đúng ⟂ im-vì-câm (FE-D CA4); 0-hit trần vô nghĩa (FE-C); 2 hash đứng yên = đối chứng dương (FE-D). +- Điểm-có-RĂNG phải xác định trước khi sửa: `writeGuard` nằm 2 CHỖ, chỉ `:235` (template-literal vào prompt runtime) có răng, `:228` là comment (FE-E); containment phải 2 LỚP render + payload — chỉ `disabled` là containment GIẢ (FE-I); gate FE đổi phải đổi CẢ 2 chỗ, không phải 1 (FE-J4). +- Hai ranh auto-refuse tự áp của vai (FE-A, {cao}): việc <30 phút TỪ CHỐI nhận (bảo vệ ngân-sách token) + không hạ sàn mirror-SHA × 2 app + `npm build` × 2 PASS dù bị giục (bảo vệ sàn chất-lượng) — cả hai là quyền tự từ chối, không cần xin phép từng lần. +- Sai-thầm-lặng phải đổi thành thiếu-nhìn-thấy-được: rỗng-vì-lọc ⟂ rỗng-vì-chưa-có phải khác câu (FE-F); BE `/deleted` thiếu param `group` ⇒ không cho UI tuyên nhóm ở màn đã-xoá thay vì hiện số trang nói dối (FE-B). + +## Entries + +> 🔴 Ràng buộc kế-thừa từ lệnh lead (giữ nguyên khi chốt): TOÀN BỘ file verbatim là nội-dung moved-not-cut đợt drain 08-01 — con-trỏ 1 dòng ở `MEMORY.md` nhảy bằng tag Ctrl-F ⇒ 14/14 mục giữ danh-tính riêng + NGUYÊN chuỗi tag (mất tag = con-trỏ MEMORY trỏ vào hư-không); mục auto-refuse (FE-A) tag {cao}. + +**[cao] FE-A — S152 R1: hai ranh giới auto-refuse** `[s152, auto-refuse-trivial-30min, no-lower-bar-smart-friend]` +- VIỆC: ghi chú lưu-giữ do lead seed on-behalf (M9, hàng đợi memory-ops) — chốt 2 ranh giới vai implementer-frontend tự áp cho chính mình. +- KẾT-LUẬN: (a) việc <30 phút / vặt (sửa 1 dòng CSS, chỉnh nhãn) = em-main tự làm còn nhanh hơn chi-phí spawn ⇒ TỪ CHỐI nhận, đúng vai, ghi vào role-file; nhận việc vặt là đốt spawn vô ích. (b) KHÔNG hạ chuẩn kiểu "Smart-Friend nể-nang": dù bị giục "làm nhanh" vẫn giữ sàn mirror-SHA × 2 app + `npm build` × 2 PASS; thiếu 1 trong 2 thì trả lại, không ship. +- BÀI-HỌC: hai ranh bảo vệ hai thứ khác nhau — (a) ngân-sách token, (b) sàn chất-lượng; cả hai là quyền TỰ TỪ CHỐI của vai, không cần xin phép từng lần. +- BẤT-NGỜ: một ghi-chú "không làm gì cả" lại là mục đáng giữ nhất nhóm — nó định-nghĩa cái vai này KHÔNG nhận, thứ mọi mục còn lại (toàn việc đã làm) không nói được. +→ substring:"auto-refuse-trivial-30min" + +**[cao] FE-B — S166 K4b: phép đo bắt đúng cái render đã bị React vứt** `[s166, khkk-k4b-group-wire, harness-do-nham-render-bi-vut]` +- VIỆC: nối `?group=` vào trang danh sách + trang tạo, kèm vá-3/5/6. Artifact `…/sub-implfe-k4b.md`. +- KẾT-LUẬN: BÀI TO NHẤT — suýt kết-luận NGƯỢC: `setState` gọi TRONG LÚC render khiến React huỷ render đó và render lại với state mới TRƯỚC khi commit; harness bản 1 chạy 1 lượt nên đọc ra `phase=3` (giá-trị của render đã bị vứt) — và control-âm cũng ra 3 ⇒ hai nhánh giống hệt ⇒ phép đo mất khả-năng phân-biệt, trông y như PASS. Vá = lặp tới khi state đứng yên → A ra `phase=2`, control-âm giữ `3`. Giải bài chính: override 3 trạng-thái `chipPhase: T|null|undefined` (`undefined` = "nghe URL" ≠ `null` = "user chọn Tất cả") + reset TRONG render theo `navKey`, KHÔNG dùng `useEffect` (effect vẽ một lượt dữ-liệu cũ rồi mới sửa = nháy). +- BÀI-HỌC: mô-phỏng hành-vi framework phải mô-phỏng CẢ vòng đời, không chỉ một lượt gọi hàm. Tiền-đề đề-bài sai lần 3 liên-tiếp: làm đúng nguyên văn ("derive `phase` từ searchParams thay `useState`") sẽ giết 6 chip lọc (`KpiCard onClick setPhase :153`) — hỏng CÂM, build vẫn xanh. +- BẤT-NGỜ: BE `/deleted` thiếu tham số `group` (`Controller:61-66` so `List:42`) ⇒ không lọc được ở client (server đếm `total` trên tập chưa lọc ⇒ số trang nói dối) ⇒ xử bằng KHÔNG cho UI tuyên nhóm ở màn đã-xoá (đổi sai-thầm-lặng thành thiếu-nhìn-thấy-được) + gắn cờ lane BE; staticMap lệch CÓ CHỦ ĐÍCH (fe-user 6/6 mang `group=1`, fe-admin 5/6 vì WfView admin trỏ Designer). +→ substring:"harness-do-nham-render-bi-vut" + +**[cao] FE-C — S166 K4a: hai tiền-đề lead sai trong CÙNG một đề bài** `[s166, khkk-k4a-regex-42-leaf, tien-de-lead-sai-x2]` +- VIỆC: nới regex cho 42 leaf KHKK + gom nhãn nhóm về một nguồn. Artifact `…/sub-implfe-k4a.md`. +- KẾT-LUẬN: ① đề bài bảo export `KHKK_GROUP_LABELS` MỚI, nhưng đĩa ĐÃ CÓ `KHKK_APPROVAL_GROUP_LABELS` (`types/khkk.ts:129`, land từ K2, 5 call-site) ⇒ đẻ map thứ 2 chính là phá đúng acceptance-5 (single-source) mà nó phục vụ; đo thêm thấy nhãn BE ≡ `` `${n}. ${short}` `` cho 8/8 ⇒ giải bằng DERIVE `khkkGroupMenuLabel(n)`, 0 call-site cũ bị đụng (hardcode lần 2 sẽ ra "N2 - 2. …" đánh số kép ở select). ② comment vá-8 bảo "phải nới regex trước vì sắp gỡ `KeHoachKyKet` khỏi ẩn-admin", nhưng `isAdminHidden:194` = `key.startsWith('Ct_')` ⇒ KHKK chưa bao giờ bị ẩn ⇒ viết comment theo ĐĨA + gắn cờ "7 nhóm rỗng" (`MenuGroup` chỉ xét `children.length>0`, không xét con có resolve được ⇒ header hiện, thân rỗng). +- BÀI-HỌC: chứng regex bằng `new Function()` chạy CHÍNH khối text đã ship (`indexOf('const khkkMatch')` → slice → eval), key sinh từ `KhkkGroupNumbers`/`KhkkLeafActions` đọc thẳng `MenuKeys.cs` ⇒ 42/42 resolve, 0 drop, +3 control-âm (G9→null · action rác→null · `Khkk_List` nhóm-1-không-infix→null vì chặn ở staticMap trước). Nhãn cũng kèm control-âm (chèn 'x' vào N4 ⇒ phép so phải FLAG) — 0-hit trần là vô nghĩa. +- BẤT-NGỜ: `Khkk_G1` + 6 leaf KHÔNG có infix (S159, cấm đổi kẻo mồ côi permission-row) ⇒ 42 leaf infix chỉ thuộc nhóm 2..8; giữ `[1-8]` rộng hơn tập seed một nấc là CỐ Ý; Layout 2 app cố ý KHÔNG mirror (user +34 dòng regex · admin +13 dòng comment). +→ substring:"khkk-k4a-regex-42-leaf" + +**[cao] FE-D — S166 K5: "chuẩn bị sẵn cho sau" = đổi HÌNH DẠNG, không bịa field** `[s166, khkk-k5-8-sub-folder]` +- VIỆC: mở 8 ngăn nhóm ở GĐ2 của cây toàn-trình. Artifact `…/sub-implfe-k5.md`. +- KẾT-LUẬN: đề bài đòi GĐ3/4 đi qua `lines[].contractId ∪ pe.contractId`; đo 4 nơi đều ÂM (`PeListItem` 0 hit chữ `lines` · `PurchaseEvaluation.cs:31` chỉ có `Guid? ContractId` đơn · `ContractListItem` không có `purchaseEvaluationId` · `Contract.cs` 0 khoá ngược). Bằng-chứng đắt nhất là BE TỰ KHAI: `CreateContractFromEvaluationFeatures.cs:143-145` `pe.ContractId = contracts[0].Id` + comment "N HĐ liên-danh truy qua changelog" — endpoint TRẢ `contractIds[]` (`PeDetailTabs.tsx:2186`) nhưng chỉ HĐ đầu được ghi ngược ⇒ HĐ thứ 2 trở đi VÔ HÌNH. ⇒ chỉ wire vế làm được: `contractIdsOfPackage = new Set()` (hợp) thay vì đọc 1 ô, đánh dấu sẵn chỗ cắm nguồn-2 + trích nguyên văn BE; FLAG 2 đường cho lead. +- BÀI-HỌC: `stage.leaves` giữ vai danh sách PHẲNG canonical (nguồn đếm duy nhất), `groups` chỉ chia lại chính nó ⇒ bất-biến tổng là chuyện CẤU TRÚC, không phải kỷ-luật nhớ-cộng-cho-khớp. Hiện đủ 8 ngăn kể cả rỗng = `.map` trên hằng, KHÔNG `.filter`; ngăn "(chưa phân nhóm)" chỉ mọc khi thật có phiếu lạc (8 nhóm là khung nghiệp-vụ cố định ⟂ ngăn kia là chỗ chứa bất thường). +- BẤT-NGỜ: CA4 control-âm tiêm lỗi nhân-đôi ⇒ `console.warn` NỔ — không có CA4 thì "0 cảnh báo" ở CA1-3 vô nghĩa (im-vì-đúng ⟂ im-vì-câm); 2 hash ĐỨNG YÊN (`PipelineTreePanel` `d70ac315`, `PePipelineStrip` `6fb7337e`) dùng làm đối chứng dương cho phép đo SHA. +→ substring:"khkk-k5-8-sub-folder" + +**[cao] FE-E — S153 T5: `writeGuard` là 2 điểm, chỉ một điểm có răng** `[s153, t5-writeguard-2-diem-235-co-rang]` +- VIỆC: T2 dựng template `session-mind-template.md` + T5 sửa `hmw.js`. Lead seed on-behalf @closeout M9 (T2 return mất schema-fail — #53 +1, phải derive-from-body; template VẪN LAND 8.819 B). +- KẾT-LUẬN: `VALID_ROLES` 20→21 (sau T10/T11 = 23); 🔴 `writeGuard` nằm 2 CHỖ: `:228` là comment JS (tài-liệu) VÀ `:235` là template-literal ĐI VÀO PROMPT của sub. Chỉ sửa `:235` ⇒ tài-liệu lệch trong chính file đó; chỉ sửa `:228` ⇒ prompt runtime KHÔNG đổi ⇒ vai read-only bị hướng-dẫn như vai được ghi ⇒ Bash-write MD ⇒ mojibake G-009. `:235` = điểm có RĂNG. Vùng cấm đo bằng diff: `WIDTH_CAP` 0 hit · `TIER2_EXPECTED_FULL_ID` 0 hit. +- BÀI-HỌC: T2 — `ts` sống trong HEADING sau em-dash nên 0 dòng key `ts:` (không phạm rào-2); placeholder `` trong schema-comment để parser không khớp nhầm; kiểm `_SECRET_RES` để ví-dụ của rào-3 không tự khớp mẫu của chính nó. +- BẤT-NGỜ: 2 kẽ báo lead — ① va tên cùng-vai 2 lần gọi (chỉ số `i` reset mỗi lần gọi ⇒ đợt 2 suýt đè `sub-implementer-frontend-1.md` của đợt 1) = kẽ CÒN LẠI sau S134; ② `node --check` trên file thô LUÔN SyntaxError (top-level await) ⇒ acceptance phải là parse-sau-khi-bọc + đối chứng HEAD. +→ substring:"t5-writeguard-2-diem-235-co-rang" + +**[vừa] FE-F — S166 K4c: rỗng-vì-lọc phải khác câu với rỗng-vì-chưa-có-gì** `[s166, khkk-k4c-wfview-loc-nhom, rong-vi-loc-khac-rong-that]` +- VIỆC: lọc trang WfView theo nhóm (đóng FLAG-3 của K4b: `?group=` chưa ai tiêu-thụ ⇒ 8 leaf mở 8 trang y hệt). fe-user ONLY, 1 file (+68/−5), `git diff -- fe-admin` RỖNG. +- KẾT-LUẬN: đo trước 4 thứ, không đoán — ① `AwDefinitionDto.code` là tên field THẬT (`types/approvalWorkflowV2.ts:41`, đang render `:165`) ② trang tải trọn bộ theo type rồi đọc `summary.history` ⇒ lọc CLIENT-side, KHÔNG thêm trục `group` vào queryKey (thêm = 8 lần gọi mạng cùng payload + 8 ô cache trùng) ③ `DbInitializer.cs:609` `code = $"KHKK-N{n}"` + `:623` `IsUserSelectable = true` ⇒ 8 workflow thực sự lọt bộ lọc của trang (seed `false` thì lọc kiểu gì cũng trắng trang) ④ `PageHeader` bản đang import CÓ `actions` (repo có ≥2 bản khác chữ ký — lặp bài S37). +- BÀI-HỌC: chốt chặn KÉP `typeInt === 10 && /^[1-8]$/` — `group` là khái-niệm riêng của KHKK, type khác hoặc rác thì bỏ qua hoàn toàn (thà hiện đủ còn hơn lọc theo số vô nghĩa ra trang trắng); regex trên chuỗi bắt được `"03"` mà `Number()` sẽ nuốt; lọc giữ đủ VERSION cùng code ("quy trình của nhóm", không phải "1 bản ghi"). +- BẤT-NGỜ: dùng chung một câu cho hai loại rỗng thì user nhóm N5 tưởng cả module chưa cấu hình trong khi 7 nhóm kia đang chạy — cùng họ bài "sai-thầm-lặng → thiếu-nhìn-thấy-được"; chứng 21/21 kèm 2 control-âm (gỡ vị-ngữ lọc ⇒ ra 8 = phép đo phân-biệt được · helper sai khuôn `KHKK_N3` ⇒ 0 wf, không âm thầm khớp). +→ substring:"khkk-k4c-wfview-loc-nhom" + +**[vừa] FE-G — S166 K6: đếm bằng cách DỰNG LẠI CÂY THẬT rồi chạy chính bộ lọc đã ship** `[s166, k6-admin-thu-gon, dung-lai-cay-seed-de-dem, route-resolver-khac-menu-row]` +- VIỆC: thu gọn menu admin về đúng vai "nơi cấu-hình". fe-admin ONLY, 1 file (+52/−19), fe-user 0-diff. +- KẾT-LUẬN: spec treo ẩn-số "N = 7 hay 8 tuỳ `AwV2_Contract` có tồn tại"; đo ra 0 HIT toàn repo ⇒ 2 seed leaf + 8 designer ⇒ chốt N = 1 Dashboard + 4 System-leaf + 2 AwV2 + 8 designer = 15 (spec TỰ QUÊN cộng 8 designer vào công thức của chính nó). Phép đếm: parse 72 tuple literal từ `DbInitializer` + sinh 128 key từ vòng lặp (hằng đọc thẳng `MenuKeys.cs`) = 200 node → chạy `ADMIN_HIDDEN_KEYS` + `isAdminHidden` + `filterForAdmin` cắt từ chính file → 166 lá → 15 lá. CONTROL-ÂM: bỏ `'KeHoachKyKet'` khỏi Set ⇒ 15→63 (+48 = đúng 8 nhóm × 6 leaf). +- BÀI-HỌC: `filterForAdmin` lọc ĐỆ QUY ⇒ ẩn 1 ROOT là cả cây con chết theo ⇒ tập chỉ cần liệt 12 ROOT (thêm `Workflows`/`PeWorkflows` vì là CON của `System`); liệt từng leaf = thừa + phải bảo trì mỗi lần BE thêm key. Vá-14 có 2 lần đảo (S29 ẩn → S57 bỏ ẩn → QĐ7 S164 ẩn lại rộng hơn) ⇒ comment cũ nói NGƯỢC luật đang chạy, gỡ và viết lại kèm câu "cả hai đều từng đúng, mốc sau thắng mốc trước". +- BẤT-NGỜ: cây dựng lại TỰ KIỂM chính nó — đối chứng "113 key trong `MenuKeys.All` → 0 key thiếu menu-row (invariant T6)", dựng sai thì chỉ số vỡ ngay; bẫy suýt lẫn: `resolvePath:173` CÓ nhánh nhận code `'Contract'` nhưng route-resolver có nhánh ≠ menu-row tồn tại. +→ substring:"k6-admin-thu-gon" + +**[vừa] FE-H — S164/S165 K2: tiền-đề lead sai, việc thật chỉ ≈ 1/4 mô tả** `[s164, khkk-nhom-duyet, do-dia-truoc-khi-go, colspan-loi-cam]` +- VIỆC: relaunch p2 sau khi p1 chết vì #53 — nhóm duyệt N1-N8 cho KHKK. +- KẾT-LUẬN: lead khai CreatePage "mid-wire, 8 khai báo chưa vào JSX" (nghĩa là TS6133 sẽ đỏ); đo `git diff` TRƯỚC khi gõ thì 8/8 ĐÃ có call-site, Detail cũng đã land ⇒ việc thật ≈ 1/4 mô tả, chỉ ListPage còn dở. p2 sửa đúng 3 điểm: badge `N{g}` nhét vào ô "Mã kế hoạch" (không đẻ cột — bảng đã cuộn ngang @1366 do cây GĐ 19rem) · thêm cột "Tổng duyệt" (BE trả 0 cho phiếu chưa duyệt ⇒ ép hiển thị `—` kẻo đọc nhầm "đã duyệt 0 đ") · `colSpan` 7→8 ở HAI chỗ (loading + empty row). +- BÀI-HỌC: khuôn "WRITE-lane garble ≠ mất code" (S114) đúng thêm một lần: lead đọc transcript dở-dang nên kết-luận theo Ý ĐỊNH đang chạy, không theo đĩa ⇒ viết lại phần đã đúng chính là PHÁ. `npm run build` = `tsc -b && vite build` với `noUnusedLocals:true` ⇒ build LÀ phép thử TS6133 thật, không cần tin IDE (#68). +- BẤT-NGỜ: quên `colSpan` là lỗi CÂM cho tới lúc bảng rỗng — chỉ lộ ở trạng-thái ít ai test; SHA-pair 5/5 IDENTICAL với Panel không sửa (hash `2B64144EF6E8` BẰNG baseline) làm đối-chứng dương. +→ substring:"khkk-nhom-duyet" + +**[vừa] FE-I — S161 ARC W1+W2+W3đ1: containment 2 lớp và hợp-đồng types** `[s161, khkk-fe-3-wave, containment-2-lop, types-theo-entity]` +- VIỆC: 3 lượt FE cho KHKK (Designer type-10 · 3 page + types · panel workflow). Mọi lượt đều #53, đĩa cứu trọn. +- KẾT-LUẬN: W1 — containment phải 2 LỚP render + payload (`levelFlagsPayload(e, lock)` ép false ở 2/2 call-site; chỉ dùng `disabled` là containment GIẢ vì `copyFromDefinition` tuồn state ra); 2 tiền-đề đề-bài sai tự bẻ (FE không có bảng nhãn — nhãn đến từ BE `applicableTypeLabel`; khuôn type-9 KHÔNG tồn tại ⇒ soi gương `Contract:3`). W2 — types theo ENTITY khi BE chạy song song; header types = HỢP-ĐỒNG 12 endpoint (reviewer đối chiếu ra 6 chỗ đứt → lead vá). W3đ1 — `KhkkWorkflowPanel` soi gương PE-panel 1063 dòng theo bảng GIỮ/BỎ tường minh; cây workflow THÔ nên FE tự suy ✓/●/○ từ con-trỏ đôi (StepIndex 0-based vs `Level.Order` là giá-trị). +- BÀI-HỌC: hợp-đồng giữa 2 lane phải do LEAD định-nghĩa literal — để mỗi lane tự suy thì đứt ở chỗ không ai nhìn; "place-3 menuKeys SKIP-có-khai (0 consumer)" cho thấy bỏ-qua-có-khai là hành-vi hợp lệ, khác hẳn bỏ sót. +- BẤT-NGỜ: W2 khai thiếu `approverUserId` trong opinion, tới W3đ1 mới bổ — lỗ hổng hợp-đồng chỉ lộ ở lượt TIÊU-THỤ, không lộ ở lượt định-nghĩa. +→ substring:"khkk-fe-3-wave" + +**[vừa; J4 cao] FE-J1..J5 — 5 mục micro-lesson (khối riêng từng mục, KHÔNG hợp nhất nội-dung)** +- VIỆC: 5 lượt FE 2-app rời nhau, xếp chung để tiện đọc — danh-tính + tag từng mục giữ nguyên: + - **J1 — S134 lũy-kế tạm tính** `[s134, pe-luyke-tam-tinh, sub-slot-prop]`: slot-prop `sub?: ReactNode` cắm `BudgetSharedNumCell:1184` + `BudgetColValue:1197` ⇒ chèn sub-dòng amber vào N chỗ render không nhân bản markup; gate `showPending = !bs.budgetFrozen && (...)`; hmw đánh chỉ-số sub-file GLOBAL theo taskList ⇒ hết va tên khi 2 vai KHÁC nhau cùng lần gọi. + - **J2 — S133 badge budget-frozen** `[s133, budgetfrozen-badge, anchor-by-visible-text]`: badge 🔒 ở `PeBudgetSummaryTable :1350-1359`; 🔴 className header LẶP 2 chỗ (`:1350` budget và `:1931` winners) ⇒ anchor của Edit PHẢI kèm text nhìn thấy được ("Tổng hợp ngân sách trình ký") mới unique. + - **J3 — S117 radio thứ 5 ProMinMax** `[s117, prominmax-5th-radio, spread-conditional-before-as-cast]`: entry mảng có điều-kiện phải spread TRƯỚC `as T[]` (né suy-diễn sai); `?? undefined` = cách bỏ key chuẩn của axios; Max không cần state riêng (derive từ selectedCandidate) ⇒ 0 chỗ phải reset. + - **J4 {cao} — S116 nhập số ÂM báo giá** `[s116, sign-toggle-immediate-commit, hasRealSelectedQuote]`: 🔴 2 dialog POST commit thẳng `form.thanhTien` (`:2247`/`:2906`, không có nút "Lưu") ⇒ nút đổi dấu phải ghi giá CÓ DẤU NGAY, chỉ lật cờ là MẤT DẤU thầm lặng; `parseVnd/formatVndInput :51-52` là hàm dùng chung (chia với ngân sách) nên KHÔNG sửa, bọc `Math.abs`; gate đổi thành `!== 0` (không phải `> 0`) và 2 gate FE cùng đổi, không phải 1 (`missingForApproval:212` + `submitChecklist:243` → helper `hasRealSelectedQuote`). + - **J5 — S113 import v2 + publish** `[s113, supplier-publish-draft, publish-not-update]`: nút "Công bố/Ẩn" gọi `POST /suppliers/{id}/publish` — KHÔNG qua UpdateSupplier (#73); badge dùng full-class-literal (P14). +- KẾT-LUẬN: 5 mục = 5 lượt việc rời, mỗi mục 1 tag Ctrl-F sống làm con-trỏ MEMORY. +- BÀI-HỌC: ba khuôn tái dùng — slot-prop (J1) mở rộng cell dùng chung, anchor theo chữ nhìn thấy (J2) khi className lặp, spread trước cast (J3). J4 dạy cái đắt nhất: form KHÔNG có nút Lưu thì mọi thay đổi hiển-thị phải commit ngay, không thì UI và payload lệch nhau trong im lặng. +- BẤT-NGỜ: J4 — báo giá nằm ở `details[].quotes` chứ KHÔNG phải `suppliers[].quotes` (đi nhầm nhánh là đo nhầm), công thức cũ SUM `winnerQuoteTotal` chặn oan ca net-zero `+100/−100=0`; J5 — mục "3.d disabled" hoá ra ĐÃ đúng sẵn ⇒ NO change, kèm 1 DEVIATION có khai ("Tải file mẫu" chỉ đặt trong dialog trong khi parent 2.d nhắc thêm nút ở page). +→ substring J1:"sub-slot-prop" · J2:"anchor-by-visible-text" · J3:"spread-conditional-before-as-cast" · J4:"sign-toggle-immediate-commit" · J5:"publish-not-update" + +**[cao] FE-M — [CHỈ-MỤC, không thay thế mục nào] sợi chỉ "tiền-đề sai ⇒ đo đĩa trước khi gõ" ×5** +- VIỆC: đánh dấu chỗ lặp để lead viết 1 dòng luật ở L1 thay vì 5 lần kể lại (đề-xuất curator — giá-trị dedup thật của file này). +- KẾT-LUẬN: K2 (lead khai mid-wire, thật ra 8/8 đã land — việc thật ≈ 1/4) · K4a (2 tiền-đề sai trong 1 đề bài: "chưa có map" thật ra có 5 call-site · "sắp gỡ ẩn" thật ra chưa từng bị ẩn) · K4b (lần 3 liên-tiếp, làm đúng nguyên văn sẽ giết 6 chip) · K5 (đề bài đòi đường dữ-liệu không tồn-tại, đo 4 nơi đều âm) · K6 (spec tự quên 8 designer trong công thức của chính nó). +- BÀI-HỌC: luật rút gọn: đo đĩa trước khi gõ, và khi đĩa cãi đề bài thì đĩa thắng — nhưng phải KHAI ra chỗ cãi (cả 5 lượt đều khai, nên lead sửa được spec). +- BẤT-NGỜ: 5 lần sai đều KHÔNG phải lỗi cẩu thả — lead đọc transcript dở-dang hoặc spec viết trước khi code land ⇒ nguyên-nhân ở ĐỘ TRỄ giữa lúc viết đề bài và lúc đọc đĩa, không ở người viết đề bài. +→ substring:"do-dia-truoc-khi-go" + +## Phụ-lục token (coverage) +*(chép TRỌN token-list section implementer-frontend/2026-H2 của proposal curator — lưới coverage-diff)* + +- **gotcha#:** `#82` ("**Display-only #82**: route+quyền còn nguyên, deep-link vẫn 200, thu gọn = bớt lối đi menu KHÔNG phải thu hồi quyền") · `#68` ("build LÀ phép thử TS6133 thật, không cần tin IDE (#68)") · `#73` ("`POST /suppliers/{id}/publish` (**KHÔNG qua UpdateSupplier** #73)") · `#53` (×4: "Relaunch p2 sau p1 chết #53" · "mọi lượt #53, đĩa cứu trọn" · "T2 return mất schema-fail (#53 +1)" · hàm ý ở S161) · `G-009` (mojibake — mã governance, không phải gotcha số) · `P14` (badge full-class-literal) · `403 S89` (N9 KHÔNG link) +- **surprise (nhãn 🔴/BÀI/BẪY nguyên-văn):** "🔴 **BÀI TO NHẤT — HARNESS ĐO NHẦM CÁI RENDER BỊ REACT VỨT, suýt kết luận NGƯỢC**" · "**control-âm cũng ra 3 ⇒ 2 nhánh giống nhau = phép đo mất khả năng phân biệt, trông y như PASS**" · "🔴 **Tiền-đề đề-bài sai lần 3 liên tiếp** (S164→K4a→K4b)" · "🔴 **Khuôn S164 'đo đĩa TRƯỚC khi gõ' ăn tiếp 2 lần trong CÙNG 1 đề bài**" · "🔴 **BÀI CHÍNH — tiền-đề lead SAI, đo `git diff` TRƯỚC khi gõ** … Việc thật ≈ **1/4** mô tả … **Viết lại phần đã đúng = phá**" · "🔴 **BÀI: forward-provision đúng nghĩa = đổi HÌNH DẠNG, KHÔNG bịa field**" · "🔴 **Bẫy suýt lẫn: `resolvePath:173` CÓ nhánh nhận code `'Contract'` — nhưng route-resolver có nhánh ≠ menu-row tồn tại**" · "(spec tự quên cộng 8 designer vào công thức của chính nó)" · "🔴 **Rỗng-vì-lọc ⟂ rỗng-vì-chưa-có-gì phải khác câu**" · "🔴 **writeGuard là 2 ĐIỂM không phải 1**" · "🔴 2 dialog POST commit `form.thanhTien` THẲNG … chỉ flip cờ = **MẤT DẤU thầm lặng**" · "🔴 GOTCHA quote ở `details[].quotes` KHÔNG `suppliers[].quotes`" · "🔴 Gotcha: className header LẶP 2 chỗ … Edit anchor PHẢI kèm text visible" · "**2 hash đứng yên = đối chứng dương**" (K5) · "Panel không sửa = đối chứng dương" (K2) · "types `7a99b865` không đổi = đối chứng dương" (K4b) · "**im-vì-đúng ⟂ im-vì-câm**" (CA4) · "**0-hit trần vô nghĩa**" (K4a) · "chỉ `disabled` = containment GIẢ" (W1) · "DEVIATION flagged" (S113) · "3.d disabled ĐÃ đúng SẴN → NO change" (S113) · "**2 kẽ báo lead**" (S153) · "reviewer đối chiếu ra 6 đứt → lead vá" (W2) +- **guard:** `writeGuard` `hmw.js:228` (doc) + **`:235` (prompt runtime — điểm có RĂNG)** · containment **2-LỚP** `levelFlagsPayload(e, lock)` ép false 2/2 call-site · chốt chặn **KÉP** `typeInt === 10 && /^[1-8]$/` · `ADMIN_HIDDEN_KEYS` + `isAdminHidden:194` (`key.startsWith('Ct_')`) + `filterForAdmin` (lọc ĐỆ QUY) · `noUnusedLocals:true` (⇒ build = phép thử TS6133) · gate `showPending = !bs.budgetFrozen && (...)` · gate `!== 0` (thay `> 0`) + 2 gate `missingForApproval:212` / `submitChecklist:243` → `hasRealSelectedQuote` · `preventDefault` + `stopPropagation` trong `` · `TRANSIENT_QUERY_KEYS:311` (group/filter/view **∉** ⇒ giữ active-state) · `MenuGroup` chỉ xét `children.length>0` · **CONTROL-ÂM** (7 ca: K4a ×3 + nhãn ×1 · K4c ×2 · K5 CA4 · K6 15→63 · K4b control-âm giữ 3) · **SHA-pair ×2 app** + `npm build ×2 PASS` (sàn tự áp, S152) · "REFUSE việc <30 min/trivial" (rào nhận việc) · `_SECRET_RES` (rào-3 tự-không-khớp-mẫu) · placeholder `` chống parser false-match · "0 dòng key `ts:`" (không phạm rào-2) · `WIDTH_CAP` 0 hit + `TIER2_EXPECTED_FULL_ID` 0 hit (vùng CẤM đo bằng diff) +- **root-cause:** ① K4b — "`setState` gọi **trong lúc render** ⇒ React huỷ render đó + render lại ngay với state mới TRƯỚC khi commit; harness bản-1 chỉ chạy 1 pass" ② K5 — "`pe.ContractId = contracts[0].Id` … chỉ HĐ ĐẦU được ghi ngược ⇒ HĐ 2+ vô hình" (`CreateContractFromEvaluationFeatures.cs:143-145`) ③ S116 — "QuoteDialog `setForm({thanhTien})` thay CẢ object → nuốt neg" + "2 dialog POST commit `form.thanhTien` THẲNG (:2247/:2906, no nút 'Lưu')" ④ S153 — "chỉ sửa `:228` ⇒ **prompt runtime KHÔNG đổi** ⇒ vai read-only bị hướng-dẫn như write-sub ⇒ Bash-write MD ⇒ mojibake G-009" ⑤ K2 — "lead đọc transcript dở-dang → kết luận theo Ý ĐỊNH đang chạy, không theo đĩa" ⑥ K4b — BE `/deleted` thiếu `group` ⇒ "server đếm `total` trên tập chưa lọc → số trang nói dối" ⑦ S153 — "index `i` reset mỗi invocation ⇒ đợt-2 suýt đè `sub-implementer-frontend-1.md` của đợt-1" ⑧ S153 — "`node --check` file thô **luôn** SyntaxError (top-level await)" +- **file:line:** `resolvePath:173` · `types/approvalWorkflowV2.ts:41` (+ render `:165`) · `DbInitializer.cs:609` + `:623` · `PeDetailTabs.tsx:2186` · `CreateContractFromEvaluationFeatures.cs:143-145` · `PurchaseEvaluation.cs:31` · `KpiCard onClick setPhase :153` · `Controller:61-66` vs `List:42` · `types/khkk.ts:129` + comment `:125-127` · `isAdminHidden:194` · `TRANSIENT_QUERY_KEYS:311` · `hmw.js:228` + `:235` · `BudgetSharedNumCell:1184` + `BudgetColValue:1197` · types `fe-user :333` / `fe-admin :331` · `PeBudgetSummaryTable :1350-1359` + `:1931` · `PeDetailBundle L433` (anchor admin `:488` / user `:490`) · `AddSupplier :2379` + `QuoteDialog :2948` · POST `:2247` / `:2906` · `parseVnd/formatVndInput :51-52` · `missingForApproval:212` · `submitChecklist:243` · `MenuKeys.cs` (`MenuKeys.All` 113 key) · `Contract.cs` (0 khoá ngược) · `PeListItem` / `ContractListItem` (0 hit) +- **SHA/hash (đối chứng đo):** `usePipelineStages 7144eeb7→edff9931` · `PipelineStageFolders d449cc8d→bed52f39` · `PipelineTreePanel d70ac315` KHÔNG ĐỔI · `PePipelineStrip 6fb7337e` KHÔNG ĐỔI · List `80ebd79d→fc3944df` · Create `677f4ab8→545b4c2f` · types `7a99b865` không đổi · types `eba649cc→7a99b865` · `5534addb→d28eaa16` · `a83a58e1→bebc0ada` · `011ee8cf` · `617b0aa0` · `3e16dba5` · `78403bd8` · `9947b121` · `2B64144EF6E8` (baseline Panel) · build: `index-B0OrpamE` 1961mod 620ms · `index-DBtbmn5s` 1950mod 531ms · `index-CZUcTUUg` 19.8s / `index-BZWvx0Y8` 1961mod 10.9s · `index-C4F7kHKT` 3.6s / `index-kv90BBYQ` 0.9s · `index-B2v0kn5F` 1950mod 20.8s / `index-84zDBHE-` 1961mod 8.2s +- **định-danh run/artifact:** `runs/2026-07-31-S164-4gd-khkk-fanout/sub-implfe-k6.md` · `…/sub-implfe-k4c.md` · `…/sub-implfe-k5.md` · `…/sub-implfe-k4b.md` · `…/sub-implfe-k4a.md` · `…/sub-implfe-k2.md` (§1-§5) · `runs/2026-07-29-S161-khkk-*/` · `.claude/templates/session-mind-template.md` (8.819 B) · `wf_58302bd5-b9f INV-2.B` (S134, engine opus-worker) · chứng: **21/21** (K4c) · **15/15** (K5) · **42/42 resolve + 3 control-âm** (K4a) · `VALID_ROLES` 20→21→**23** +- **chuỗi tag Ctrl-F 14/14 (con-trỏ MEMORY — PHẢI sống nguyên vẹn):** `[s166, k6-admin-thu-gon, dung-lai-cay-seed-de-dem, route-resolver-khac-menu-row]` · `[s166, khkk-k4c-wfview-loc-nhom, rong-vi-loc-khac-rong-that]` · `[s166, khkk-k5-8-sub-folder]` · `[s166, khkk-k4b-group-wire, harness-do-nham-render-bi-vut]` · `[s166, khkk-k4a-regex-42-leaf, tien-de-lead-sai-x2]` · `[s164, khkk-nhom-duyet, do-dia-truoc-khi-go, colspan-loi-cam]` · `[s161, khkk-fe-3-wave, containment-2-lop, types-theo-entity]` · `[s153, t5-writeguard-2-diem-235-co-rang]` · `[s134, pe-luyke-tam-tinh, sub-slot-prop]` · `[s133, budgetfrozen-badge, anchor-by-visible-text]` · `[s117, prominmax-5th-radio, spread-conditional-before-as-cast]` · `[s116, sign-toggle-immediate-commit, hasRealSelectedQuote]` · `[s113, supplier-publish-draft, publish-not-update]` · `[s152, auto-refuse-trivial-30min, no-lower-bar-smart-friend]` diff --git a/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/investigator-codebase--2026-05-q1.gist.draft.md b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/investigator-codebase--2026-05-q1.gist.draft.md index b606b7b..536cea5 100644 --- a/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/investigator-codebase--2026-05-q1.gist.draft.md +++ b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/investigator-codebase--2026-05-q1.gist.draft.md @@ -70,3 +70,12 @@ pointer-style: substring - **root-cause:** ① "F4 = BROKEN at readOnly short-circuit" — `canAdjust = !readOnly && (…)` đoản-mạch TRƯỚC khi `isApproverChoDuyet` được xét (`PeDetailTabs.tsx:973`, nút ẩn `:1030`) ② "BE line 765 lookup semantic broken sau Mig 29" — `Level.Order` trùng nhau sau khi tách 1 row/ApproverUser ⇒ `FirstOrDefault(Order==X)` lấy row đầu theo PK (`PurchaseEvaluationFeatures.cs:765`) ③ Plan P — `TransitionPeBody` record 3 field ⇒ **ASP.NET silent DROP** 3 field còn lại (`PurchaseEvaluationsController.cs:267`) ④ Plan M0 — KHÔNG có root-cause code, "DISCONNECT bro mental model vs code reality post-Mig 28/29/30/31" - **file:line:** `User.cs:38` · `ApprovalWorkflow.cs:86-105` · `ApprovalWorkflow.cs:45-50` · `PurchaseEvaluationWorkflowService.cs:119-161` (:125) · `~:393-525` · `:268-275` · `:285-312` · `:303-310` · `:314-333` · `:335-360` · `:364` · `:441-468` · `:483-524` (:485) · `:252-265` (:252) · `PurchaseEvaluationFeatures.cs:393-402` · `:272-329` (:283-290 / :291-323) · `:735-770` · `:765` · `:281-329` · `PurchaseEvaluationDtos.cs:86-92` · `PurchaseEvaluationDetailBundleDto` `:214` + `:217` · `UsersController` `:91-98` + `:105` · `UserFeatures.cs:332` · `PurchaseEvaluationDetailFeatures.cs:42` + `:42-99` (:49-51 / :54-94) · `PurchaseEvaluationsController.cs:267` · `ApprovalWorkflowsV2Controller.cs:16-19` · `DbInitializer.cs:1429-1437` + `:1541-1547` · `system/ApprovalWorkflowsV2Page.tsx:873` + `:853-933` + `:889-946` + `:892-948` (975 dòng) · `system/UsersPage.tsx:306-318` + `:365-372` + `:181-186` · `PeDetailTabs.tsx:113-118` + `:118` + `:224` + `:245` + `:957-973` + `:973` + `:977` + `:1030` + `:287-297`(admin) / `:294-304`(user) + `:109-115` + `:967-979` · `PeWorkflowPanel.tsx:51` + `:60-68` + `:113-124` + `:331-422` (:343-396, :343/:357/:371/:397) + `:425-442` (:425) · `fe-user/src/pages/pe/PurchaseEvaluationsListPage.tsx:256-261` · `fe-user Layout.tsx:325` + `fe-admin Layout.tsx:218` · `Persistence/Migrations/` (path thật) · mig `20260513160703_AddAllowApproverEditBudgetToLevels` - **định-danh khác:** commit `a1a910f..ee0902a` (7): `ee776d5` · `c667802` · `ac2c859` · `da218f1` · `4d60598` · `fbbd361` · `ee0902a` · bug UAT prod `409a967` · phiếu `PE/2026/A/026` · WF `QT-DN-V2-001 v12` · user `nv.test@solutions.com.vn` · `TransitionAsync` param `skipToFinal` thứ 8 (position 47:47) · `w-60 xl:w-72` → `w-72 xl:w-80` (ngưỡng rủi-ro `w-80 xl:w-96`) · grid `[260px_1fr] xl:[320px_1fr]` · `STEP_PALETTE`/`LEVEL_PALETTE` 5 màu · token-cost 32k (Pre-A) + +### Bổ-sung coverage @P3-gate S170 (token literal — nội-dung đã sống dạng dải/range ở trên; dòng dưới chép NGUYÊN-VĂN context verbatim làm lưới grep) + +- `ApprovalWorkflowsV2Page.tsx:889` — Bro UAT login `nv.test@solutions.com.vn` vào menu eoffice "Duyệt NCC → Duyệt" phiếu PE/2026/A/026 (Phase=ChoDuyet, WF=QT-DN-V2-001 v12, ở B… +- `Mig 27` — 7 commits total `a1a910f..ee0902a`: BE+Layout (`ee776d5`) + FE Page (`c667802`) + Docs (`ac2c859`) + 4 polish iter UAT (`da218f1` px-2 + `4d60598` v1 … +- `PeDetailTabs.tsx:245` — Bug UAT prod 409a967: admin tick F3+F4 cho slot Approver, login actor user, vào menu "Duyệt" (`?pendingMe=1` cùng `PurchaseEvaluationsListPage` 3-… +- `PurchaseEvaluationFeatures.cs:272` — Bro UAT post-Plan L deploy 2026-05-15 ~02:00: "Hiện logic cũ là khi trả lại 1 cấp hoặc chỉ định hoặc edit là trạng thái draft -… +- `PurchaseEvaluationFeatures.cs:735` — Bug UAT prod 409a967: admin tick F3+F4 cho slot Approver, login actor user, vào menu "Duyệt" (`?pendingMe=1` cùng `PurchaseEvaluationsListPage` 3-… +- `PurchaseEvaluationWorkflowService.cs:285` — Bro UAT post-Plan L deploy 2026-05-15 ~02:00: "Hiện logic cũ là khi trả lại 1 cấp hoặc chỉ định hoặc edit là trạng thái draft -… diff --git a/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/investigator-codebase--2026-05-q2.gist.draft.md b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/investigator-codebase--2026-05-q2.gist.draft.md index 3fb273f..9ead409 100644 --- a/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/investigator-codebase--2026-05-q2.gist.draft.md +++ b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/investigator-codebase--2026-05-q2.gist.draft.md @@ -49,3 +49,12 @@ pointer-style: substring - **root-cause:** ① Bug1 — "FE filter skip Header updates OR Schema gap (Header.Update collision: budget vs section 2 edit)" ② Bug2 — "Handler **intentionally skip logging** (no companion audit table like PurchaseEvaluationApprovals for return history)" - **file:line:** `PurchaseEvaluationFeatures.cs:379-387` · `PurchaseEvaluationWorkflowService.cs:215-378` (ApplyReturnModeAsync) · `TransitionAsync:100` (LogTransitionAsync) · `PurchaseEvaluationChangelog.cs` (EntityType=Workflow(5)) · `ListPurchaseEvaluationChangelogsQueryHandler:1050-1064` · `Master/Project.cs:5-14` · `PurchaseEvaluationsListPage.tsx:133` + `:199-252` · `Contract.cs:8-58` (:12 Phase, :22 WorkflowDefinitionId, :39 CurrentWorkflowStepIndex, :40 RejectedAtStepIndex) · `ContractPhase.cs:14-28` · `ContractWorkflowService.cs:23-219` (:113-126 match Dept+PositionLevel, :148-155 gen mã HĐ) · `20260508053749_AddApprovalWorkflowsV2.cs:14-127` · `20260508072821_AddApprovalWorkflowIdToPurchaseEvaluation.cs:14-31` · `20260508074937_AddCurrentApprovalLevelOrderToPe.cs:14-17` · `PurchaseEvaluationWorkflowService.cs:446-634` (:484-495, :522-546, :561-602, :605-633) + `:167-171` · `ApprovalWorkflowLevels` entity `:86-114` · PE `RejectedAtStepIndex:50` - **định-danh khác:** tag schema `[audit, phase-9, contract]` · `source_path: solution_erp/audit/investigator-plan-b-contract-v2-preflight-2026-05-22` · token-cost 28k/30k/40k/25K · prod 35 PE·17 V2·4 V1 (entry q1) vs "7 Contracts 100% V1Pinned" (entry này) · Mig 32 tên đề-xuất `AddProjectPackageTable` (Plan AG) vs Mig 32 thực-dụng cho Contract (Plan B) — **2 nghĩa của "Mig 32" trong CÙNG file** (xem `_lienfile-notes-batchB.md` #4) + +### Bổ-sung coverage @P3-gate S170 (token literal — nội-dung đã sống dạng dải/range ở trên; dòng dưới chép NGUYÊN-VĂN context verbatim làm lưới grep) + +- `Mig 21` — Em main spawn Investigator pre-flight Plan B priority HIGH. 5Q audit + Bonus chunk refinement. Tag schema: `[audit, phase-9, contract]`. **Findings:**… +- `Mig 23` — Em main spawn Investigator pre-flight Plan B priority HIGH. 5Q audit + Bonus chunk refinement. Tag schema: `[audit, phase-9, contract]`. **Findings:**… +- `Mig 24` — Em main spawn Investigator pre-flight Plan B priority HIGH. 5Q audit + Bonus chunk refinement. Tag schema: `[audit, phase-9, contract]`. **Findings:**… +- `Mig 29` — Em main report 2 bug UAT: (1) Budget Adjust 2×click → "Lịch sử thay đổi" KHÔNG show 2 entry. (2) Return Assignee mode F1 click → "Lịch … +- `Mig 33` — Em main spawn Investigator pre-flight Plan B priority HIGH. 5Q audit + Bonus chunk refinement. Tag schema: `[audit, phase-9, contract]`. **Findings:**… +- `Mig 34` — Em main spawn Investigator pre-flight Plan B priority HIGH. 5Q audit + Bonus chunk refinement. Tag schema: `[audit, phase-9, contract]`. **Findings:**… diff --git a/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/investigator-codebase--2026-05-q4.gist.draft.md b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/investigator-codebase--2026-05-q4.gist.draft.md index 1168a53..4fadfe4 100644 --- a/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/investigator-codebase--2026-05-q4.gist.draft.md +++ b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/investigator-codebase--2026-05-q4.gist.draft.md @@ -48,3 +48,7 @@ pointer-style: substring - **root-cause:** "tables phải count ToTable KHÔNG DbSet" (phép đếm sai nguồn ⇒ lệch −7 bảng Identity) - **file:line:** `Application/Office/WorkflowAppsFeatures.cs:11-15` · `ProposalFeatures.cs:403-486` · `ApprovalWorkflow.cs:72` · `Office/{Module}.cs` (không số dòng) · `.../Persistence/Migrations/*.cs` · `.claude/agents/` (8 file ~22K) - **định-danh khác:** commit `d2f52ba` (nguồn git-only) · Mig 39 · Mig 41+ (dự-kiến) · mig `AddAttendances` (mới nhất) · mig `ExtendApplicableTypeForWorkflowApps` (Up/Down rỗng) · `WorkflowAppStatus` 5-state ↔ `ProposalStatus` · tag `[cross-project, bvaau, port]` · `[state-grounding, docs-drift, s40]` · `[pre-flight, p11-a, workflowapps]` + +### Bổ-sung coverage @P3-gate S170 (token literal — nội-dung đã sống dạng dải/range ở trên; dòng dưới chép NGUYÊN-VĂN context verbatim làm lưới grep) + +- `Mig 38` — - **2026-05-30 (P11-A WorkflowApps wire pre-flight):** 4 module Leave/OT/Travel/Vehicle. Schema pin ĐÃ CÓ SẴN (Mig 39): `Office/{Module}.cs` đ… diff --git a/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/reviewer--2026-05-q1.gist.draft.md b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/reviewer--2026-05-q1.gist.draft.md index 864ee82..ed3e34a 100644 --- a/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/reviewer--2026-05-q1.gist.draft.md +++ b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/reviewer--2026-05-q1.gist.draft.md @@ -56,3 +56,11 @@ pointer-style: substring - **root-cause:** ① "Transient sentinel pattern" ⇒ orphan endpoint `PATCH /api/users/{id}/allow-skip-final` silent NoOp (`Task.CompletedTask`) ② "Plan P Controller `TransitionPeBody:267` record +3 fields mirror `TransitionPurchaseEvaluationCommand` schema — **root cause 2 ngày prod bug F1+F2 wire fail**" ③ "DbInitializer auto re-seed loop … Plan T flag fix root cause" ④ "Plan N point 9 chỉ catch 1/5 sites → Plan O cascade fix" - **file:line:** `ApprovalWorkflow.cs:78` + `:107-113` · `PurchaseEvaluationFeatures.cs:401` · `:765` · `ApprovalWorkflowConfiguration.cs:22` · K2 F2 branch `:477` / UPSERT `:441-468` / advance `:502` / caller guard `:147-149` · test ref `:253` (K7-pending) · `Service.cs:287-333` · `:364` · `:268-275` · `:335-360` · caller `:94-100` · entry guard `:75-81` · `:81` · `:252-265` · `:105-132` · `EnsureCanRejectV2Async:201` · `ApplyReturnModeAsync:248` · `EnsureEditableForDetailsAsync:72` · `AdjustBudgetCommandHandler:311` · `TransitionPeBody:267` · Controller `:21-26` · Handler `:114-117` · `WorkflowMatrixViewPage :29-33` · `App.tsx:38` · `Layout.tsx resolvePath:81-86` · `SeedPurchaseEvaluationPermissionDefaultsAsync:1573` · `[Authorize]` bare `:18` · `PeListPanel.tsx:112` · `PeWorkflowPanel.tsx:270` / `:272` / `:315` / `:342` · `PeDetailTabs.tsx:152` / `:287` · `ApprovalWorkflowsV2Page.tsx:639` · `contracts.ts:29` · `budget.ts:20` · file test `PurchaseEvaluationPerNvLookupRegressionTests.cs` - **định-danh khác:** commit `eb106f2..56868bf..db66253..364aef6` · `c2afef2..508b17a..4dd6f9c` · `a1a910f..ee0902a` (`da218f1`/`4d60598`/`fbbd361`/`ee0902a`) · Run #210 sha=`ac2c859` (4/4 wire + bundle 2 app rotate) · diff 11 file BE +4093/−83 (Designer 3938 dòng) · test 84 → 104 → **106/106** (58 Domain + 48 Infra) → **111** · mig 29 → 30 → 31 · gotcha 45 → 46 → 47 · ~146 endpoint · 33 user · 2 test mới `ApplyReturnMode_OneLevel_AtStep1Level1_ResetsToBuoc1Cap1_KeepsChoDuyet` + `ApplyReturnMode_OneStep_AtStep1_ResetsToBuoc1Cap1_KeepsChoDuyet` · fe-admin npm build 1926 modules / 740ms / 0 TS err · ~720 row prod bị xoá (Plan R+S+T5) · spawn-cost ~25K/lượt vs ~100K nếu spawn 4 polish + +### Bổ-sung coverage @P3-gate S170 (token literal — nội-dung đã sống dạng dải/range ở trên; dòng dưới chép NGUYÊN-VĂN context verbatim làm lưới grep) + +- `Mig 27` — 8 plan consecutive em main self-review per UAT mode (`feedback_uat_skip_verify` rule — em main verify build + test + npm build mỗi chunk). Key val… +- `Mig 28` — 2. **Stale Mig 28 comment ApprovalWorkflow.cs:78** — comment cũ "F2 (Drafter skip) đã move sang Users.AllowDrafterSkipToFinal" còn nguyên dù l… +- `Mig 29` — **Anti-patterns observed:** (a) Default scope expansion mistake S22+4 → S22+5 fix — KHÔNG default expand permission scope without admin tick (per… +- `Mig 30` — S22+4 attachment view endpoint + S22+4 budget-adjust endpoint chưa qua live curl verify (defer post-deploy — bro UAT direct). S22+5 Mig 30 applied … +- `Service.cs:288` — 1. **Stale narrative comment Service.cs:288-289 + 327-328** UPDATED rõ "Plan M S23 t3 — KHÔNG fallback Drafter, phiếu giữ đang duyệt" — k… diff --git a/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/test-specialist--baseline-history.gist.draft.md b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/test-specialist--baseline-history.gist.draft.md index aeaa746..19b21d7 100644 --- a/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/test-specialist--baseline-history.gist.draft.md +++ b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sleep-drafts/test-specialist--baseline-history.gist.draft.md @@ -93,3 +93,14 @@ pointer-style: substring - **tên file test (định-danh):** `PeDeleteByApproverTests.cs` · `PePendingAccumulationTests.cs` · `PeBudgetFreezeTests.cs` · `SupplierImportV2DedupTests.cs` · `SupplierPublishAndListTests.cs` · `Services/SupplierExcelImportServiceTests.cs` · `ProcurementMasterAccessSeedTests.cs` · `AdminOnlyModulesRevokeTests.cs` · `OfficeModulePermissionSeedTests.cs` · `HrmProfilePermissionSeedTests.cs` · `PeSubmitGuardAndBypassTests.cs` · `PeCcmThresholdFinalizeTests.cs` · `PeApprovedPriceFinalizeTests.cs` · `PeSuggestedPriceSetterAuthzTests.cs` · `PeUrgentToggleAuthzTests.cs` · `PeCcmBudgetPeriodSetterAuthzTests.cs` · `PeApproverNotifyExcludesDrafterTests.cs` · `PeUpdateDraftWorkflowPreserveTests.cs` · `PeMultiWinnerTests` · `PeWorkItemBudgetTests` · `PeFinalizeProjectionTests` · `PeApproverFinalizeTests` · `CreateContractFromEvaluationMultiWinnerTests.cs` · `PeListWinnerNamesProjectionTests.cs` · `ItTicketReassignAuthzTests.cs` · `SqliteDbFixture` / `TestApplicationDbContext` / `IdentityFixture` / `CapturingNotificationService` - **định-danh run/engine:** `run 2026-07-27-S155-pe-delete-approver · sub-d2-test-4` (diary 13.9KB) · `run 2026-07-26-S153-ctx-adopt` `[engine: opus-5]` · `wf_97d6a582-b7e` `[engine: opus-worker]` (S134) · `wf_75c6bfd3-754` (S133 INV-C, **#53 return-fail lần 3**) · `wf_d9639faa-97a` (S133 INV-A, return sạch) · Mig 54/55/56/57/58/59/60/61/65/66/67/68 được dẫn rải rác - **nguồn-đếm (ghi-chú drafter @S170):** đĩa đo 30 heading `##` = 1 dòng "Count progression" + 29 entry-heading (S155 → S54, gồm cả S60 và heading gộp "S57bis / S56 (notes kept)"); proposal curator khai "25 entry". Entry S60 KHÔNG thuộc cụm narrative nào của curator — nó sống ở mốc mở chuỗi "254 (S60)" (TS-A) + token GUARD-FIRST ở phụ-lục này. Chi tiết → `_lienfile-notes-batchB.md` §bổ-sung. + +### Bổ-sung coverage @P3-gate S170 (token literal — nội-dung đã sống dạng dải/range ở trên; dòng dưới chép NGUYÊN-VĂN context verbatim làm lưới grep) + +- `#6` — **S97 (2026-07-01) PE EndsBeforeCeo CONFIG→RUNTIME (bug anh Kiệt FDC, spec-change test) — 440 PASS no-red, NET +0 [Fact] (extend in-place):** em… +- `Mig 55` — ## S74 — PE Mig 55 CcmNote (compile-fix arity + test-after), +5… +- `Mig 56` — ## S76 — PE Mig 56 PRO-column-split (spec-change + compile-fix arity), +5… +- `Mig 57` — ## S77 — PE Mig 57 suggested-price NOTE (test-after, mirror CcmNote), +7… +- `Mig 58` — ## D2 — PE Mig 58 multi-winner (test-after + EF translation-smoke), +6 → 419… +- `Mig 59` — ## S87 — PE Mig 59 CCM-budget-period setter (test-after authz), +7… +- `Mig 60` — **S97 (2026-07-01) PE EndsBeforeCeo CONFIG→RUNTIME (bug anh Kiệt FDC, spec-change test) — 440 PASS no-red, NET +0 [Fact] (extend in-place):** em… +- `PurchaseEvaluationFeatures.cs:849` — `UpdatePeBudgetProCommand` record 3→4 param `(PeId, ProInitialAmount, ProAdjustmentAmount, ProNote)`; handler set ProInitial+ProAdjust absolute-set … diff --git a/.claude/workflows/runs/2026-08-01-S169-bookend-open/sub-reviewer-sleep-fidelity-S170.md b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sub-reviewer-sleep-fidelity-S170.md new file mode 100644 index 0000000..25cc531 --- /dev/null +++ b/.claude/workflows/runs/2026-08-01-S169-bookend-open/sub-reviewer-sleep-fidelity-S170.md @@ -0,0 +1,82 @@ +# sub-reviewer — GATE Fidelity (Phase 3b) /sleep-recovery-memory-l2 — S170 + +> Anti-#53: file này ghi TỪNG MỤC ngay khi có kết luận (flush liên tục). Đọc từ trên xuống = tiến độ thật. +> Vai: GATE (lead KHÔNG tự chấm Fidelity — G-001). Verdict-only, KHÔNG sửa draft. +> Run: `2026-08-01-S169-bookend-open` · 16 draft đã qua gate (a) coverage-diff 16/16. + +## Trạng thái + +- [x] P1 — FIDELITY-FLAG 4 cờ (`implementer-backend--2026-05-q3`) → **FLAG ĐÚNG nhưng CHƯA ĐỦ (2 MAJOR + 2 MINOR)** +- [x] P2a — cicd-monitor--2026-05-runs → **PASS-WITH-FIXES** (3 câu hỏi lead đều ĐẠT; 1 con-trỏ CHẾT + 1 keep-vs-drop MAJOR) +- [ ] P2b — test-specialist--baseline-history +- [ ] P2c — implementer-frontend--2026-H2 +- [ ] P2d — investigator-codebase--2026-05-q1 +- [ ] P3 — chấm subsection `### Bổ-sung coverage @P3-gate S170` + +--- + +## P1 — FIDELITY-FLAG 4 tên cờ (`implementer-backend--2026-05-q3.gist.draft.md`) + +**Verdict: nhãn `⚠️ FIDELITY-FLAG … đừng cite như fact` là ĐÚNG và CẦN, nhưng CHƯA ĐỦ.** Phải sửa thêm 2 điểm MAJOR + 2 MINOR trước khi chốt draft. + +### 1. Sự thật trên đĩa (đo hôm nay, 2 dụng cụ độc lập) + +Đọc thẳng thân 4 file migration (`src/Backend/SolutionErp.Infrastructure/Persistence/Migrations/`): + +| Mig | Tên file thật | Cột thật do migration này tạo | Bảng đích | +|---|---|---|---| +| 28 | `20260513114505_AddAdvancedOptionsToApprovalWorkflows` | `AllowApproverEditDetails` · `AllowDrafterSkipToFinal` · `AllowReturnOneLevel` · `AllowReturnOneStep` · `AllowReturnToAssignee` · `AllowReturnToDrafter` (6 cột) | `ApprovalWorkflows` | +| 29 | `20260513130144_RefactorAdvancedOptionsToPerLevelAndDrafterUser` | dời 5 cột sang `ApprovalWorkflowLevels`; riêng `AllowDrafterSkipToFinal` sang **`Users`** | Levels + **Users** | +| 30 | `20260513160703_AddAllowApproverEditBudgetToLevels` | `AllowApproverEditBudget` — **đúng 1 cột duy nhất** | `ApprovalWorkflowLevels` | +| 31 | `20260514160124_RefactorSkipToFinalToApproverLevel` | ADD `AllowApproverSkipToFinal` (Levels) + DROP `AllowDrafterSkipToFinal` (Users), **no-backfill** | Levels ← Users | + +Dụng cụ 1 — `grep -rl src/Backend` (đã trừ `/obj/` + `/bin/`): 4 tên = **0 / 0 / 0 / 0**; control dương `AllowApproverSkipToFinal` = **54**; control âm `AllowXyzKhongTonTai` = **0**. Khớp draft. + +Dụng cụ 2 (tôi thêm) — `git log --all --oneline -S "" -- src fe-admin fe-user`: `AllowDrafterEdit` · `AllowApproverEditSection1` · `AllowEarlyApprove` · `AllowDelegate` = **0 commit trong TOÀN BỘ lịch sử**; control dương `AllowApproverSkipToFinal` = **5 commit** (`15349e8` `0779f2d` `50e6d8c` `df52fa0` `a8027c0`), `AllowApproverEditBudget` = **5 commit** ⇒ dụng cụ có răng. Kết luận nâng cấp từ "nghi" lên **chốt: 4 tên này chưa từng tồn tại trong mã, kể cả thoáng qua rồi bị đổi tên**. + +### 2. Phán từng tên (draft gộp 4 làm một — sai lớp) + +| Tên trong verbatim | Phán | Đối-ứng thật | +|---|---|---| +| `AllowDrafterEdit` (gán Mig 29) | **tên viết sai — lai ghép 2 cờ thật** | phần "per-NV" thật = `AllowDrafterSkipToFinal` (bảng `Users`); phần "Edit" thật = `AllowApproverEditDetails` (Levels, và là **approver** chứ không phải drafter) | +| `AllowApproverEditSection1` (gán Mig 30) | **tên viết sai — trôi từ vựng UI** | `AllowApproverEditBudget` | +| `AllowEarlyApprove` (gán Mig 31) | **tên viết sai nhưng CÓ đối-ứng ngữ nghĩa 1-1** | `AllowApproverSkipToFinal` ("duyệt vượt thẳng tới cấp cuối" = "duyệt sớm") | +| `AllowDelegate` (gán Mig 31) | **KHÔNG có đối-ứng nào — hạng nặng nhất** | Mig 31 chỉ ADD đúng 1 cột; toàn `src/Backend` không có khái niệm uỷ-quyền duyệt (chỉ `RequestDelegate`/`RequestHandlerDelegate` của framework, 3 file) | + +⇒ Trả lời câu hỏi lead: **3/4 là tên viết sai của cờ thật (drift từ vựng), 1/4 (`AllowDelegate`) không có bất kỳ đối-ứng nào — không phải "kế hoạch bị bỏ" vì pickaxe cho 0 commit, tức nó chưa từng được viết ra dòng nào.** Cả 2 lớp đều thoả "đừng cite như fact", nên nhãn không sai — nhưng nó che mất chỗ nguy hiểm nhất. + +### 3. MAJOR-1 — nhãn không phủ CON SỐ "4×", mà con số mới là thứ mang tải + +Câu trong verbatim (`archive/2026-05-q3.md:16`) là: *"Pattern 7 … **đã proven 4× — strong candidate Layer B promote khi unfreeze**"*, đặt cạnh luật ngay trên nó: *"Pattern proven ≥ 2× qualifies Layer B nominate"*. Nghĩa là **con số 4 là thứ kích hoạt một quyết định**, và nó được suy ra bằng cách đếm chính 4 cái tên vừa bị bác. Một tên là ma, ba tên còn lại đổ về ~3 migration ⇒ "4×" không có chứng độc lập. + +Nặng hơn: draft dòng 10 tự kê đơn *«ý an-toàn để giữ: "Pattern 7 đã áp 4 lần qua Mig 29/30/31" bỏ tên cờ»*. Đơn này **giữ nguyên khẳng định và vứt đi đúng những token cho phép kiểm lại nó** — sau khi "làm sạch", câu đó thành bất-khả-bác. Thêm nữa nó tự vênh số học: 4 lần qua 3 migration. Con số này cũng đã lan sang `implementer-backend/archive/2026-06.gist.md:53` và `archive/_INDEX.md:38` dưới dạng dữ kiện trần. + +**Phải sửa:** nhãn FIDELITY-FLAG nêu rõ **"4×" cũng chưa kiểm**; và bỏ/viết lại câu "ý an-toàn để giữ" ở dòng 10 — nếu muốn giữ ý thì giữ dạng không mang số, ví dụ "Pattern 7 lặp qua chuỗi Mig 28→31 (số lần chưa kiểm)". + +### 4. MAJOR-2 — nhãn nêu "0-hit" nhưng KHÔNG nêu tên cờ THẬT + +Draft liệt 4 **tên file migration** thật, nhưng người đọc sau cần **tên cột** thật mới có neo dùng được, và chúng chỉ cách 1 lệnh grep (đã liệt ở bảng §1). Ở dạng hiện tại, gist đóng vai trò "cảnh báo có lỗ" thay vì "vá lỗ". Trớ trêu: file gist đời cũ `implementer-backend/archive/2026-05.gist.md:11` đã ghi đúng 1 trong các tên thật (`AllowApproverSkipToFinal`) — tức bản gist MỚI, bản đi cảnh báo sai, lại nghèo thông tin hơn bản cũ. + +**Phải sửa:** thêm vào nhãn danh sách cột thật kèm bảng đích (tối thiểu 4 cột: `AllowApproverEditDetails` · `AllowDrafterSkipToFinal`→`Users` · `AllowApproverEditBudget` · `AllowApproverSkipToFinal`). + +### 5. MINOR-1 — gộp sai `AllowEarlyApprove` với `AllowDelegate` + +Draft viết *"riêng `AllowEarlyApprove`+`AllowDelegate` chưa có đối-ứng nào ở Mig 31 (thật = `AllowApproverSkipToFinal`)"*. Sai: `AllowEarlyApprove` **có** đối-ứng 1-1 chính là `AllowApproverSkipToFinal`; chỉ `AllowDelegate` là không có gì. Gộp 2 ca khác lớp làm mất dấu đúng mục đáng ngờ nhất. + +### 6. MINOR-2 — số control dương "54 file" không khai bộ lọc + +Đo lại: `grep -rl AllowApproverSkipToFinal src/Backend` = **86**; **54** chỉ khi trừ `/obj/` + `/bin/`; **12** khi trừ thêm `*.Designer.cs` + `ModelSnapshot`. Cả ba đều là "phép đo" — 54 chỉ tái lập được với bộ lọc chưa được khai. Kết luận 0-hit vững dưới cả 3 bộ lọc (0/0/0) nên verdict không đổi, nhưng số nằm trong sổ trí nhớ phải đi kèm thước, không thì người sau đo ra 86 và tưởng ghi chú sai. + +### 7. Điểm draft làm ĐÚNG (giữ nguyên, không được hạ) + +- Có **control âm** (`AllowXyzKhongTonTai`) cạnh control dương ⇒ chứng minh phép đo còn răng, không phải 0-hit do thước hỏng. Đây là chỗ draft vượt chuẩn. +- Nhãn được **nhân đôi đúng chỗ**: §TỔNG-HỢP (dòng 10) + đầu §Entries (dòng 14) + §Phụ-lục (dòng 46, 50, 53) ⇒ không có đường trích dẫn nào thoát khỏi cảnh báo. +- Không lén "sửa đẹp" tên cờ trong thân bài: trích dẫn verbatim giữ nguyên chữ sai, đúng nguyên tắc chép-nguyên-văn. +- Draft anh em `implementer-backend--2026-05-q1.gist.draft.md` **không mang tên bịa** (diễn đạt trung tính "cờ admin bật riêng (thành Mig 30)") ⇒ không lan sang bản đồng lứa. Đã đo: 4 tên chỉ xuất hiện ở q3 draft, 3 dòng, tất cả trong ngữ cảnh nhãn. + +### 8. Ghi chú lây nhiễm (ngoài phạm vi draft — việc của em-main) + +Từ vựng bịa đã sống sẵn trong 4 hiện vật trí nhớ: `implementer-backend/archive/2026-05-q1.md:19` · `archive/2026-05.gist.md:11` · `archive/2026-06.gist.md:53` (số "4×") · `archive/_INDEX.md:15`. +🔴 **Cảnh báo khi dọn:** `_INDEX.md:15` dùng tên sai **bên trong con trỏ** `substring:"30 migrations** (+1 Mig 30 AllowApproverEditSection1"`. Con trỏ đó trỏ vào văn bản nguồn, nên **sửa chính tả ở đây sẽ giết con trỏ**. Luật dọn: vá chỗ **khẳng định**, không đụng chỗ **trích để định vị** (use ⟂ mention). + +---