# run — cột DỰ ÁN trong bảng ngân sách (S175, 2026-08-05)

**Engine:** `/fable-real` (LỆNH-A, per-invocation H21) — **1 vai × SINGLE top-model deep-pass**.
**Vai anh gán:** `investigator-codebase` · **Đề-bài anh gõ:** *"invest case cột DỰ ÁN trong bảng ngân sách → sau đó điều chỉnh lại"*

> 🔴 Engine **propose-only**. Spec-file 3-mục do **LEAD ghi SAU khi verify** (honest-note (c)).

---

## Bối cảnh (lead nạp — anh nói gì)

Ảnh anh gửi ×2: bảng **B. THỰC HIỆN** trong phiếu **Duyệt NCC**, khoanh đỏ **TOÀN BỘ cột DỰ ÁN** (ảnh-2) —
cột đó đang `—` ở mọi dòng per-cột, trong khi PRO và CCM đều có số.

Lời anh (verbatim, 2 lượt trả lời AskUser):
- *"Không nó có 1 mục riêng 3 thằng này là 3 thằng riêng, hiện dự án chưa có thì khi chọn hạng mục → nó cộng vào mục đó"*
- *"Không phải ý là nó đã có sẵn cái bảng ngân sách ở giao diện NCC → Còn thiếu của Dự án → Giờ chọn hạng mục điền tiền sau đó nó sẽ cộng thêm vào mục đó"*
- Trước đó: *"nếu nhiều hơn thì điều chỉnh tăng tiền, bên mục ngân sách có mục dự án chưa điền vào. Nếu tăng tiền lũy kế thì phía KHKK sẽ điền vào đấy"*

🔴 **ANH GỠ NÚT THẮT (tin nhắn thứ 3, giữa lượt — ĐÂY LÀ CÂU CHỐT, đọc kỹ trước mọi thứ khác):**
> *"phần trên duyệt NCC → ngân sách bảng đó mang xuống → KHKK → nhập từng hạng mục sau đó cộng vào ô của dự án"*

⇒ **Luồng đích 4 nhịp:** ① bảng ngân sách ĐANG SỐNG ở Duyệt NCC (GĐ1) → ② **MANG XUỐNG** KHKK (GĐ2)
→ ③ ở KHKK **nhập tiền THEO TỪNG HẠNG MỤC** → ④ các dòng đó **CỘNG vào ô DỰ ÁN**.

🔑 **Câu này hoà-giải mâu-thuẫn tưởng-như-vô-lý ở 2 lượt trước.** "3 thằng RIÊNG" **không** có nghĩa DỰ ÁN
là ô nhập tay cấp dự án — mà nghĩa là **NGUỒN của nó khác hẳn**: PRO/CCM là 2 vai nhập cho *gói thầu này*,
còn DỰ ÁN được nuôi bằng **các dòng hạng mục nhập BÊN KHKK**. Vì nguồn khác nên nó là "thằng riêng";
vì là cộng-dồn nên "chọn hạng mục điền tiền → cộng vào mục đó". **Cả hai vế đều đúng cùng lúc.**
Khớp luôn câu anh nói lượt trước: *"Nếu tăng tiền lũy kế thì phía KHKK sẽ điền vào đấy."*

🔴 **Hệ-quả cho vai:** câu hỏi KHÔNG còn là "A tự-cộng hay B nhập-tay". Nó là:
**bảng ngân sách MANG XUỐNG KHKK như thế nào, ai được nhập, nhập ở đâu, và đường cộng ngược lên ô DỰ ÁN
đi qua bảng/khoá nào** — trong khi `PeBudgetAccumulator` hiện **0 hit** `ContractSigningPlan` (đã đo).

## Đo sơ-bộ của lead (để vai khỏi lặp — VERIFY LẠI, đừng tin suông)

| Đã đo | Kết quả | Nguồn |
|---|---|---|
| DTO `PeBudgetSummary` có trường cấp DỰ ÁN? | **KHÔNG** — mọi trường khoá theo cặp (Dự án × Hạng mục) | `fe-admin/src/types/purchaseEvaluation.ts:312-339` |
| Comment ý-định lúc dựng cột | ghi thẳng `DỰ ÁN "—"` | `PeDetailTabs.tsx:1503` |
| Comment DTO | *"DỰ ÁN = FE hiển thị-only (chưa wire BE)"* | `purchaseEvaluation.ts:311` |
| Cột DỰ ÁN hardcode `—` ở đâu | ≥3 chỗ | `PeDetailTabs.tsx:1535 · 1664 · 1677` |
| `PeBudgetAccumulator` gom từ bảng nào | CHỈ 3 bảng PE; `grep -c 'ContractSigningPlan'` = **0** (control-dương: chuỗi đó có ở 7 file khác Application layer) | `PeBudgetAccumulator.cs` |
| Entity ngân sách | `PeWorkItemBudget` = 1 record / cặp `ProjectId` × `WorkItemId`; có `ProInitial/ProAdjustment` + `Initial/Adjustment` | `Domain/PurchaseEvaluations/PeWorkItemBudget.cs:27-36` |

🔴 **MANH MỐI LỚN NHẤT — vai PHẢI đào:** module **Budget (Ngân sách dự án) CŨ đã bị XÓA HẲN ở Mig 50 (S61)**
(CLAUDE.md: *"XÓA module Budget cũ, thay bằng `PeWorkItemBudgets` ngân sách per-gói-thầu"*; FE `Bg_*` gỡ hết).
⇒ Giả-thuyết cần chứng/bác: **cột DỰ ÁN là DI-CHỨNG của module cũ** — chỗ ngồi còn, ruột bị rút.
Nếu đúng, "điều chỉnh lại" của anh = **dựng lại tầng ngân sách cấp DỰ ÁN**, không phải vá 1 cột FE.

## taskList snapshot

```json
[
  {
    "role": "investigator-codebase",
    "tier": "fable",
    "task": "Điều tra TRỌN luồng 4 nhịp anh chốt: bảng ngân sách ở Duyệt NCC → MANG XUỐNG KHKK → nhập tiền TỪNG HẠNG MỤC ở KHKK → CỘNG vào ô DỰ ÁN. Cụ thể: (1) truy lịch-sử vì sao cột DỰ ÁN tồn tại mà rỗng (Mig 50 xóa module Budget cũ · Mig 56/59 dựng ma-trận 3 cột) — DI-CHỨNG hay CHỖ-CHỪA-SẴN; (2) đo tàn-dư schema/DTO/FE của ngân sách cấp DỰ ÁN còn sót; (3) dựng ĐƯỜNG DỮ-LIỆU đích: KHKK nhập per-hạng-mục thì GHI VÀO ĐÂU (tái dùng PeWorkItemBudgets khoá ProjectId×WorkItemId? hay bảng mới?), ai được nhập (role/phase gate), và ô DỰ ÁN CỘNG NGƯỢC LÊN bằng query nào — nhớ PeBudgetAccumulator hiện 0 hit ContractSigningPlan; (4) chốt 1 phương-án kèm GIÁ (số migration · số endpoint · số file FE), so với ít nhất 1 phương-án thay-thế đã cân-nhắc rồi BÁC; (5) chỉ ĐÍCH DANH mọi file:line phải sửa; (6) nêu rõ mọi rào TIỀN có thể vỡ (freeze snapshot phiếu DaDuyet S133 · lũy kế tạm-tính S134 · choke-point ApplyApprovedValuesOnFinalize) mà thay đổi này có thể đụng."
  }
]
```

## Stages

- [x] P1 — lead scaffold run-folder + taskList snapshot
- [x] P2 — engine deep-pass (propose-only) → return `NAP-LAI...` xong, 169K tok / 38 tool-use
- [x] P3 — lead VERIFY return (tự đo lại 2 đính-chính) + ghi `spec-hang-muc-nhieu-dong-va-cot-du-an-05-08-2026.md`
- [!] P4 — thực-thi: phương-án cột DỰ ÁN **KHÔNG land** (anh chốt "ko cần so sánh j với số duyệt PRO hay CCM j cả"); phần hạng-mục N-dòng thì ĐÃ land `b811e11`

## wf run-id

`wf_a574cff1-6b9` — 1 agent · `investigator-codebase` · tier `fable` · propose-only.

🔸 **Lần phóng ĐẦU FAIL SẠCH (0 agent · 0 token · 22ms):** guard `checkpointApproved chưa set`
(anti-accidental-fire) chặn ngay cửa. Đúng thiết-kế — em-main phải BÁO {số agent · vai · task}
rồi mới set cờ. Đã báo, set `checkpointApproved:true`, phóng lại cùng `resumeFromRunId`.
**Ghi lại làm vết: guard này CÓ RĂNG, không phải trang-trí.**
