[CLAUDE] Docs: S134 closeout — luy ke TAM TINH (STATUS 528/bundle Run #399 + HANDOFF 10-carry UAT-script + session-log + synthesis dong orphan + harvest 6 vai)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-07-17 14:45:20 +07:00
parent 6664a6136a
commit 99fc37361f
11 changed files with 108 additions and 18 deletions

View File

@ -2,7 +2,11 @@
> **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-17 (S133 + closeout @S134 `/tiep`**PE freeze ngân sách phiếu DaDuyet SHIP PROD `d4fbced` (16 file +7831/63), CI Run #398 VERDICT GO 5/5, bundle rotate ×2 admin `3NCdyODe`/user `CKsoiNCI`.** UAT anh Kiệt FDC 07-16: cập nhật NS gói thầu làm phiếu ĐÃ DUYỆT đổi số theo → R1 DaDuyet bất biến [Mig 67 snapshot 11 cột chốt tại finalize + site-5 admin-override + backfill 18/18 prod] · R2 phiếu chưa duyệt đọc live "bản cập nhật gần nhất" [display-gate `budgetFrozen` + badge 🔒 FE 2-app SHA-mirror `5534addb`] · R3 no new table [89 giữ]. Reviewer PASS_WITH_FIXES 2 SHOULD = **#81-EXT indirect-assignment** (2 site gán Phase thẳng bypass choke-point → FIXED + test site-5). Test **509→520** (+11 `PeBudgetFreezeTests` T0 RED→GREEN + T1-T9 + site-5), FULL 520/0. ⚠️ #53 ×3 + lesson **sub-file overwrite khi 2 invocation cùng role+index chung run** (INV-A bị INV-C đè — đánh tên riêng per-invocation). S133 `/pause` giữa chờ cicd → S134 `/tiep` nối: verdict GO harvest-liền được **re-verify độc-lập 4/4 KHỚP** [mig prod top `20260717032812` + health 200 + bundle-hash ×2 + filter 11/11] → docs closeout + synthesis đóng orphan run-folder.)
**Last updated:** 2026-07-17 (S134 — **PE lũy kế TẠM TÍNH vs CHÍNH XÁC SHIP PROD `6664a61` (11 file: 4 BE + 6 FE + 1 test, 0 MIG), CI Run #399 GO 5/5 gate 528-exact, bundle rotate ×2 admin `BVCukFP5`/user `DoxyEOxh`.** UAT anh Kiệt chat 15/07 chốt "Vậy em xử lý theo hướng này đi": vì cung đặc thù, chia 2 số — TẠM TÍNH (tất cả phiếu cùng gói, phần chưa-duyệt sub-dòng amber + danh sách mã+badge) ⟂ CHÍNH XÁC (chỉ DaDuyet, GIỮ NGUYÊN 100% — `ComputeAsync` 0-diff by-construction, C6 exact-numbers guard); banner màn duyệt + nhắc lại trong dialog duyệt (gate `phase===ChoDuyet`, KHÔNG hard-block); D4 audit-note changelog `[S134 pending-prior]` lúc finalize. Pipeline anh chỉ định chạy TRỌN: `/fable-real invest` [#53-garble → sub-file 8-phần cứu, lần 3] → lead verify 7/7 + spec 3-heading → `/fable-real review` [GO_WITH_FIXES 0C/2M/9n → áp trọn spec v2] → **hmw Opus 4.8 MAX 3 lane 0-garble** [INV-2 BE‖FE + INV-3 test +8 → 528/0] → reviewer pre-commit **PASS 0C/0M****squash §5.0 trước push (9 wal: tiêu, 0 lọt origin)** → cicd GO 5/5 CLEAN-return + lead spot-check 4/4 khớp. ⚑ **D1 flag anh:** phiếu NHÁP chỉ vào danh sách cảnh báo (mã+badge), KHÔNG cộng tiền tạm-tính — muốn cộng cả nháp ("tất cả lun" nghĩa đen) thì báo em đổi 1 predicate.)
**Carry MỞ re-stamp (10):** (1) carry-age design-question `[carry:carry-age-vacuous]` (2) hook-cap — S133 ×2 (inv-cb 19.7K · reviewer 20.4K) + **S134 ×3 (inv-cb 20.5K · test-spec 20.4K · cicd 21.3K)** — TẤT CẢ dưới cap anh 25.6K/30.7K, em không tự nén (S122); cụm D6 phình dần, anh chốt hướng `[carry:hook-vs-budget-cap]` (3) UAT S117 incognito `[carry:uat-s117]` (4) PE phân-quyền số-phiếu+user `[carry:pe-phanquyen]` (5) BVAAU `[carry:bvaau]` (6) quyết-định Bình/Lê `[carry:binh-le-decision]` (7) Trà/Bùi re-login `[carry:tra-bui-relogin]` (8) account trùng `[carry:account-trung]` (9) UAT freeze-NS S133 `[carry:uat-s133-budget-freeze]` (10) 🆕 **UAT lũy-kế tạm-tính S134** `[carry:uat-s134-luyke]`.
**🔴 NEXT anh:** (1) 🆕 **UAT script lũy-kế tạm-tính (3 bước, incognito #77):** (a) đặt 2 phiếu cùng Dự án × Hạng mục — phiếu A **Đã gửi duyệt** (đã chọn NCC + giá), mở phiếu B → bảng "Tổng hợp ngân sách trình ký" row 2 + row 6 hiện sub-dòng **amber "Tạm tính: … (+X từ 1 phiếu chưa duyệt)"** + dưới bảng danh sách "A/0xx (Đã gửi duyệt)"; **số chính xác giữ nguyên**; (b) mở phiếu B ở màn duyệt → **banner amber "⚠ 1 phiếu trước cùng gói thầu CHƯA duyệt…"** + bấm Duyệt → dialog NHẮC LẠI ngay trên ô chọn giá — nút Xác nhận **KHÔNG bị khóa**; (c) duyệt phiếu A xong → mở lại B: sub-dòng tạm-tính biến mất, row 2 chính-xác TĂNG đúng phần A; phiếu ĐÃ DUYỆT bất kỳ: bảng giữ nguyên (freeze S133) `[carry:uat-s134-luyke]`; (2) UAT script freeze-NS S133 (3 bước — segment Prev) `[carry:uat-s133-budget-freeze]`; (3) ⚑ D1 nháp-không-cộng-tiền — gật giữ hay đổi; (4) hook-cap `[carry:hook-vs-budget-cap]`; (5) 2 đề-xuất S131 CHỜ GẬT + CHỜ HUB reply-batch (segment cũ).
**NEXT em (phiên kế):** watch `broadcasts/inbox`; spawn-probe reviewer Measured-label gate (post-restart, H1 #3); monthly combined audit 2026-08-01; nếu anh đổi D1 → sửa predicate `ComputePendingAsync` (delta-tiền thêm phase 1) + test C3 flip + deploy.
**Prev S133 (+closeout @S134 `/tiep`):** 2026-07-17 (S133 — **PE freeze ngân sách phiếu DaDuyet SHIP PROD `d4fbced` (16 file +7831/63), CI Run #398 VERDICT GO 5/5, bundle rotate ×2 admin `3NCdyODe`/user `CKsoiNCI`.** UAT anh Kiệt FDC 07-16: cập nhật NS gói thầu làm phiếu ĐÃ DUYỆT đổi số theo → R1 DaDuyet bất biến [Mig 67 snapshot 11 cột chốt tại finalize + site-5 admin-override + backfill 18/18 prod] · R2 phiếu chưa duyệt đọc live "bản cập nhật gần nhất" [display-gate `budgetFrozen` + badge 🔒 FE 2-app SHA-mirror `5534addb`] · R3 no new table [89 giữ]. Reviewer PASS_WITH_FIXES 2 SHOULD = **#81-EXT indirect-assignment** (2 site gán Phase thẳng bypass choke-point → FIXED + test site-5). Test **509→520** (+11 `PeBudgetFreezeTests` T0 RED→GREEN + T1-T9 + site-5), FULL 520/0. ⚠️ #53 ×3 + lesson **sub-file overwrite khi 2 invocation cùng role+index chung run** (INV-A bị INV-C đè — đánh tên riêng per-invocation). S133 `/pause` giữa chờ cicd → S134 `/tiep` nối: verdict GO harvest-liền được **re-verify độc-lập 4/4 KHỚP** [mig prod top `20260717032812` + health 200 + bundle-hash ×2 + filter 11/11] → docs closeout + synthesis đóng orphan run-folder.)
**Carry MỞ re-stamp (9):** (1) carry-age design-question `[carry:carry-age-vacuous]` (2) **hook-cap 17.1K — S133 bắn ×2 MỚI: inv-cb 19.7KB + reviewer 20.4KB, đều DƯỚI cap anh 25.6K/30.7K ⇒ em KHÔNG tự nén (S122), chờ anh chốt hướng** `[carry:hook-vs-budget-cap]` (3) UAT S117 incognito `[carry:uat-s117]` (4) PE phân-quyền số-phiếu+user `[carry:pe-phanquyen]` (5) BVAAU `[carry:bvaau]` (6) quyết-định Bình/Lê `[carry:binh-le-decision]` (7) Trà/Bùi re-login `[carry:tra-bui-relogin]` (8) account trùng `[carry:account-trung]` (9) 🆕 **UAT freeze-NS S133** `[carry:uat-s133-budget-freeze]`.
**🔴 NEXT anh:** (1) 🆕 **UAT script freeze-NS cho anh Kiệt (3 bước, incognito #77):** (a) mở phiếu **ĐÃ DUYỆT** → thấy badge **🔒 "Ngân sách chốt tại thời điểm duyệt"**, bảng TỔNG HỢP NGÂN SÁCH **giữ nguyên số** sau khi PRO/CCM cập nhật NS gói thầu (từ phiếu khác cùng gói); (b) phiếu **CHƯA duyệt** cùng gói → thấy số **MỚI** ("ngân sách cập nhật gần nhất"); (c) thử sửa "NS kỳ này (CCM)" / "Điều chỉnh ngân sách" trên phiếu đã duyệt → lỗi **"Phiếu đã kết thúc — ngân sách đã chốt tại thời điểm duyệt, không sửa được nữa."** (chặn cả Admin) `[carry:uat-s133-budget-freeze]`; (2) 🟡 **hook-cap bắn ×2 phiên S133** (inv-cb 19.7K · reviewer 20.4K — dưới cap, em không tự nén) — anh chốt hướng `[carry:hook-vs-budget-cap]`; (3) 2 đề-xuất S131 CHỜ GẬT (wire tick H24 vào `/tiep` + light-run owner-triggered); (4) CHỜ HUB reply-batch (i)/seal-verify/do-token/closure-cadence — khi land em `/check-email` verify hash + áp canonical.
**NEXT em (phiên kế):** watch `broadcasts/inbox`; spawn-probe reviewer Measured-label gate `reviewer.md:46` runtime-active (post-restart, H1 #3); monthly combined audit 2026-08-01; session-end khi anh gõ (squash `wal:` local trước push — 4 commit local đang chờ).

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,34 @@
# S134 — PE lũy kế TẠM TÍNH vs CHÍNH XÁC (2026-07-17)
**Commit:** `6664a61` (11 file: 4 BE + 6 FE + 1 test) + `e53a693` (docs S133 closeout, cùng push) — **squash §5.0 trước push, 9 `wal:` local tiêu, 0 lọt origin** · **CI:** Run **#399** VERDICT **GO 5/5** (5m27s, return CLEAN) · **Test:** 520→**528** (45D+483I) · **Mig:** 0 (Mig 67 giữ top, 89 bảng) · **Bundle:** admin `BVCukFP5`/`CBzUlgOA` · user `DoxyEOxh`/`BHsBUA8e` · **Lead:** Fable 5 · HMW-ON · run-folder `.claude/workflows/runs/2026-07-17-S134-pe-luyke-tam-tinh/`
## Đề bài (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 chỉ bắt phiếu DaDuyet (Kenny S117) → phiếu chưa duyệt không góp vào phiếu sau. Vì **"cung đặc thù"** (phiếu sau trình khi phiếu trước chưa duyệt), anh Kiệt yêu cầu "vẫn cho bắt lên và tính toán, note nó màu gì đó… để đến bước cuối của CEO hay người duyệt thay cần phải duyệt phiếu trước phiếu này". Hướng chốt (em đề xuất, anh Kiệt duyệt ♥): **lũy kế TẠM TÍNH = tất cả****lũy kế CHÍNH XÁC = chỉ phiếu đã duyệt** (giữ nguyên).
## Ship
- **Ground-truth lật khung (fable-real invest):** row 1 ĐÃ gồm ChoDuyet sẵn — gap thật = row 2 (DaDuyet+IsWinner) + row 5/6 dẫn xuất ⇒ **0 migration, 0 endpoint mới, 0 đụng số chính xác**.
- **BE:** `PeBudgetAccumulator.ComputePendingAsync` MỚI (pure-add +68/0; `ComputeAsync` 0-diff) — PriorPes `NOT IN {7,99}` · delta-selected `NOT IN {1,7,99}`+IsWinner (GỒM ChoDuyet = gap chính) · delta-submitted `NOT IN {1,7,10,99}` (no-double-count, C6 chứng exact-numbers); `PeBudgetSummaryDto` +5 field append-cuối (frozen→defaults R1-S133 / live→fill); **D4 audit-note** trong `ApplyBudgetSnapshotOnFinalizeAsync` (1 chỗ, `Action=Update`#49, signature giữ → 5 call-site 0-diff).
- **FE 2-app:** types ×2 · PeDetailTabs →`d28eaa16` ×2 (**`sub?: ReactNode` slot-prop** → sub-dòng amber "Tạm tính" row 1/2/5/6 N8-count-đúng-delta + danh sách mã+badge `PurchaseEvaluationPhaseLabel`, N9 no-link tránh 403-S89 + gate `!budgetFrozen`) · PeWorkflowPanel →`bebc0ada` ×2 (banner gate M2 `!readOnly && phase===ChoDuyet` + reminder trong dialog duyệt; Xác nhận 0-diff).
- **Decisions D1-D5** (lead chốt theo invest, ⚑ D1 flag anh): nháp list-only KHÔNG cộng tiền · delta row1 làm (TraLai+legacy) · plain-info không hard-block · changelog-in-helper · TuChoi exclude.
## Pipeline (anh chỉ định: "/fable-real invest và review… Sau đó hmw cho Opus 4.8 MAX xử lý")
1. `/fable-real investigator-codebase` — ⚠️ #53 garble return, **sub-file 8-phần 20.7KB cứu trọn** (lần 3 liên tiếp pattern ghi-đĩa-trong-lúc-làm thắng); lead verify **7/7 claim** + 2 errata (path `Dtos/`, hash-value) → spec 3-heading.
2. `/fable-real reviewer` — ⚠️ #53 garble return, sub-file cứu · **GO_WITH_FIXES 0C/2M/9n**: M1 D4-shape đầy đủ (thiếu → hmw tự thêm param = vỡ chính A6) + M2 banner-gate (edge-note "tự ẩn" SAI vs predicate) + N1-N9; **D4-seeder CLEAR** (set trực tiếp, không gọi helper — 0 changelog rác #75-class) → lead áp TRỌN → spec v2.
3. **hmw Opus 4.8 MAX** — INV-2 `wf_58302bd5-b9f` [IMPL-A BE ‖ IMPL-B FE] + INV-3 `wf_97d6a582-b7e` [TEST-C] = **3/3 lane 0-garble, return structured đầy đủ** (lần đầu chuỗi dài sạch trọn); lead re-verify độc lập từng chặng (scope/hash/grep/filter-S133-11-11).
4. Reviewer pre-commit `wf_8bb5abee-657`**PASS 0C/0M/4-nice-to-have** (tự chạy build+npm ×2+filter 8/8; xác nhận #81-indirect 5/5-qua-helper); lead full-suite độc lập exit-0.
5. Squash §5.0 → push `d4fbced..6664a61` → cicd `wf_f366f38d-498` **GO 5/5 CLEAN**: gate **528 exact-từ-log** · Mig 67 frozen + 89 · bundle ×2 byte-verify 3 marker PRESENT + control 0-hit · smoke 4×200 + PE 401 → lead spot-check độc lập 4/4 hash + marker khớp.
## Lessons
- **hmw index sub-file GLOBAL theo taskList** (backend=0, frontend=1) → collision S133 tự hết khi role khác nhau; cùng-role re-invocation vẫn phải đặt tên riêng (đã áp `sub-reviewer-precommit.md`).
- **Insertion-only diff** (`grep '^-'` = 0 real-removal) = bằng chứng mạnh nhất cho "thân method/call-site bất động".
- **ct=text/html** là SPA-trap discriminator sạch hơn size-heuristic 919B (cicd).
- Spec đặt ràng buộc "không đổi X" phải tự kiểm việc-mới lấy đủ nguyên liệu trong X-nguyên-trạng (M1 — reviewer).
## Carry
- 🆕 `[carry:uat-s134-luyke]` — UAT script 3 bước trong HANDOFF (sub-dòng amber / banner+dialog / duyệt-A-xong-số-chuyển-chính-xác).
- ⚑ D1 nháp-không-cộng-tiền — chờ anh gật giữ hay đổi.