# run — 2026-07-17-S134-pe-luyke-tam-tinh

- **engine:** `/fable-real investigator-codebase` (H21 lệnh-A, alias "invest" anh gõ) → lead verify + ghi spec 3-heading → `/fable-real reviewer` (alias "review" anh gõ — soi "cách làm chi tiết - checklist") → **hmw implement Opus 4.8 MAX** (anh chỉ định "Sau đó hwm cho Opus 4.8 MAX xử lý nhé") → reviewer pre-commit → deploy + cicd.
- **goal:** UAT anh Kiệt FDC (chat 15/07, chốt 16:10 **"Vậy em xử ký theo hướng này đi"**): lũy kế PE hiện chỉ bắt phiếu **DaDuyet** (nguyên tắc Kenny S117 "duyệt rồi mới bắc") → phiếu chưa duyệt KHÔNG góp lũy kế phiếu sau. Vì **cung đặc thù** (phiếu sau trình khi phiếu trước chưa duyệt), anh Kiệt cần: **vẫn cho bắt lên và tính toán, note màu** để biết phiếu trước chưa duyệt, để bước duyệt cuối (CEO/người duyệt thay) biết **cần duyệt phiếu trước phiếu này**. Hướng chốt (em đề xuất, anh Kiệt duyệt ♥): chia 2 số — **"lũy kế TẠM TÍNH" = tất cả phiếu** (kể cả chưa duyệt, đánh dấu màu phần từ phiếu-chưa-duyệt) ⟂ **"lũy kế CHÍNH XÁC" = chỉ phiếu đã duyệt** (semantics hiện tại GIỮ NGUYÊN). Informational — KHÔNG hard-block duyệt (xác nhận ở invest).
- **session:** S134 · lead: Fable 5 (owner-choice) · HMW consent: anh chỉ định hmw trong lệnh.
- **Tương tác S133 (freeze-NS):** phiếu DaDuyet đọc snapshot `ApprovedBudgetPrev*` bất biến — tạm-tính dự kiến CHỈ có nghĩa trên phiếu chưa-terminal; KHÔNG đụng snapshot đã chốt (invest xác nhận).

## taskList snapshot

1. `[fable-real:invest-luyke-tam-tinh]` role=`investigator-codebase` · **model=`fable`** (spawn-param THẮNG frontmatter-pin — H23 đo S126) — single deep-pass:
   - Predicate lũy kế hiện tại: 3 bản PHẢI KHỚP (accumulator `PeBudgetAccumulator.cs` · live `PurchaseEvaluationFeatures.cs:909/:959` · snapshot `PurchaseEvaluationWorkflowService.cs:1013` · backfill SQL Mig 67 `:99`) — filter Phase nằm đâu, file:line.
   - FE matrix "Tổng hợp ngân sách trình ký" rows 5/6 (`PeDetailTabs.tsx:1318-1590` ×2 app) + types `:325/:327` + màn duyệt (PeWorkflowPanel/inbox) — chỗ chèn số tạm-tính + note màu.
   - Phase taxonomy đầy đủ → đề xuất tập "tạm tính" (TuChoi? Nháp? TraLai?) + trade-off.
   - Danh sách "phiếu trước cùng cặp CHƯA duyệt" (mã + phase) — khả thi trong projection? cần endpoint mới?
   - Edge: WorkItemId null · multi-winner D4 · giá âm S116 · Min-Max S117 · PRO-split · CcmBudgetPeriod · budgetFrozen S133.
   - Propose spec 3-mục + checklist per-vai acceptance ĐO ĐƯỢC + phân rã BE/FE/test cho hmw.
   - 🔴 Ghi-đĩa-TRONG-lúc-làm: `sub-investigator-codebase-0.md` (chống #53 — S133 file 22.5KB cứu trọn).

## taskList snapshot — implement (append @spec-v2 chốt, sau fable-real review GO_WITH_FIXES)

- INV-2.A `[impl:be-full]` implementer-backend — spec ② items 1-4 (ComputePendingAsync + DTO + live-branch fill + D4 changelog-in-helper shape M1) + checklist A1-A6.
- INV-2.B `[impl:fe-2app]` implementer-frontend — spec ② items 5-7 (types ×2 KHÔNG-mirror + PeDetailTabs sub-dòng amber SHA-mirror + PeWorkflowPanel banner gate M2 + dialog-block) + checklist B1-B4.
- INV-3.C `[impl:test-full]` test-specialist — checklist C1-C9 (pattern PeBudgetFreezeTests seed :277-332).

## Stages

- [x] 1. invest fable-real — #53 garble return, **sub-file 8-phần cứu trọn** (157 dòng COMPLETE); phát hiện lật-khung: row1 ĐÃ gồm ChoDuyet, gap thật = row2
- [x] 2. lead verify 7/7 claim + 2 errata (path `Dtos/`, hash-value) + chốt D1-D5 → ghi spec 3-heading
- [x] 3. fable-real reviewer — #53 garble return, sub-file cứu (lần 3) · **GO_WITH_FIXES 0C/2M/9n** (M1 changelog-shape đầy-đủ Action=Update né #49 · M2 banner gate phase===ChoDuyet; D4-seeder CLEAR — set trực tiếp không gọi helper) → lead áp TRỌN → spec v2
- [x] 4. hmw INV-2 `wf_58302bd5-b9f` [IMPL-A ‖ IMPL-B] — 2/2 done **0-garble**: A = 4 file BE (+68/0 accumulator pure-add · DTO 5-field append · live-fill/frozen-defaults · D4 insertion-only +30/0, 5 call-site 0-diff) · B = 6 file FE (types ×2 · PeDetailTabs `5534addb`→`d28eaa16` ×2 · PeWorkflowPanel `a83a58e1`→`bebc0ada` ×2 · npm ×2 PASS) · lead re-verify: scope 10-file + hash + grep M2-enum/N8/D4 + filter S133 11/11
- [x] 5. INV-3 `wf_97d6a582-b7e` [TEST-C] 1/1 0-garble — +8 `PePendingAccumulationTests` (C6 complementary exact-numbers), full **528/0** (45D+483I) + lead re-run độc-lập exit-0 · reviewer pre-commit `wf_8bb5abee-657` **PASS 0C/0M/4n** (tự chạy build+npm+filter; sub-reviewer-precommit.md) · squash §5.0 → `e53a693`+**`6664a61`** PUSHED (0 wal: lọt origin)
- [x] 6. cicd verify 6664a61 `wf_f366f38d-498` — **GO 5/5 CLEAN-return**: Run #399 5m27s · gate 528 exact-từ-log · Mig 67 frozen + 89 · bundle ×2 `BVCukFP5`/`CBzUlgOA` + `DoxyEOxh`/`BHsBUA8e` byte-verify 3-marker + control-0-hit · smoke 4×200 + PE 401 · lead spot-check độc-lập 4/4 khớp
- [x] 7. docs closeout — STATUS (528/bundle/Recently-Done S134) + HANDOFF (10 carry + UAT script + ⚑D1) + session-log + CLAUDE.md row-PE + close-synthesis.md (orphan ĐÓNG) + harvest 6 vai (2 impl @INV-2 + inv-cb on-behalf/test-spec/cicd/reviewer-precommit) — hook-cap ×3 dưới-cap không-nén (carry)
- [x] 8. /pause — `1e799ee wal: pause` 14:46:30 (tick hồi-tố @/tiep 17-07 — pause ĐÃ chạy, mục này quên tick trước khi dừng)

## Errata @/tiep 2026-07-17 (resume-verify)

- Stage 5+6 cite `sub-reviewer-precommit.md` + `sub-cicd-monitor-0.md` (S134) — cả 2 **KHÔNG land trên đĩa** (glob toàn-repo 0 hit). Verdict 2 stage vẫn ĐỨNG: CLEAN-return + lead re-verify độc-lập (ghi inline stage 5/6) + /tiep re-verify 4/4 (test PePendingAccumulation 8/8 · bundle `BVCukFP5` · prod Mig `20260717032812` · origin sync 99fc373).
- Hook flush `169b0dc` (14:46:51, SAU pause 21s) vớt muộn 2 file **S133**: `sub-cicd-monitor-0.md` (create — chưa từng được commit từ 11:30) + `sub-test-specialist-0.md` (+57 STAGE C) — file S133 được CỨU, KHÔNG phải mis-land S134.
- Class bài học: "khẳng-định trạng-thái-đĩa không chạm đĩa" (S121) — closeout cite evidence-file PHẢI kèm glob-verify.
