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

> 🔴 **Harvest HỒI-TỐ, ghi @S179 2026-08-07.** Folder này bị sàn `/tiep §0 ①` xếp **ORPHAN** suốt S176→S178 vì có `run.md` mà **không có bản-ghi-kết-quả dạng-1**. Nội-dung dưới đây **derive từ đĩa** (`run.md` + `spec-hang-muc-nhieu-dong-va-cot-du-an-05-08-2026.md` + git), **KHÔNG** dựng lại từ trí-nhớ phiên cũ. Đánh dấu **partial-honest**: phần nào không tái-dựng được từ đĩa thì khai thẳng ở §5.

## 1. Run là gì

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

## 2. Câu chốt của anh — thứ hoà-giải toàn bộ mâu-thuẫn

> *"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 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 gỡ nút thắt *"3 thằng RIÊNG"*: DỰ ÁN **không** phải ô nhập tay cấp dự án — **nguồn của nó khác hẳn**. PRO/CCM là 2 vai nhập cho *gói thầu này*; DỰ ÁN được nuôi bằng **các dòng hạng mục nhập bên KHKK**. Nguồn khác ⇒ "thằng riêng"; cộng-dồn ⇒ "chọn hạng mục điền tiền → cộng vào mục đó". **Hai vế đúng cùng lúc.**

## 3. Phát hiện load-bearing (lead đã đo, có nguồn)

| Phát hiện | Nguồn |
|---|---|
| DTO `PeBudgetSummary` **không** có trường cấp DỰ ÁN — mọi trường khoá theo cặp (Dự án × Hạng mục) | `fe-admin/src/types/purchaseEvaluation.ts:312-339` |
| Cột DỰ ÁN **hardcode `—`** ≥3 chỗ | `PeDetailTabs.tsx:1535 · 1664 · 1677` |
| Comment DTO tự khai *"DỰ ÁN = FE hiển thị-only (chưa wire BE)"* | `purchaseEvaluation.ts:311` |
| `PeBudgetAccumulator` gom **CHỈ 3 bảng PE**; `grep -c 'ContractSigningPlan'` = **0** (control dương: chuỗi đó có ở 7 file khác Application layer ⇒ grep không rỗng) | `PeBudgetAccumulator.cs` |
| Entity `PeWorkItemBudget` = 1 record / cặp `ProjectId` × `WorkItemId` | `Domain/PurchaseEvaluations/PeWorkItemBudget.cs:27-36` |

🔴 **Manh mối lớn nhất:** module **Budget (Ngân sách dự án) cũ đã XÓA HẲN ở Mig 50 (S61)**, FE `Bg_*` gỡ hết ⇒ giả-thuyết *"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 thì "điều chỉnh lại" = **dựng lại tầng ngân sách cấp DỰ ÁN**, không phải vá 1 cột FE.

## 4. Kết cục THẬT (đây là phần quan trọng nhất — đừng đọc run này thành "đã làm")

- ✅ **Phần hạng-mục N-dòng ĐÃ LAND** — `b811e11`.
- ❌ **Phương-án cột DỰ ÁN KHÔNG LAND.** Anh chốt cắt: *"ko cần so sánh j với số duyệt PRO hay CCM j cả"*.
- 🅿️ **Sau đó anh PARK hẳn @S176** — WAL ghi: *"PARK (anh @S176) — KHÔNG hỏi lại, KHÔNG tự làm: cột DỰ ÁN 11 ô · `Project.BudgetTotal` rỗng 61/69"*.

⇒ **Trạng-thái đúng của run này = ĐÃ ĐÓNG bằng quyết-định owner, KHÔNG phải việc dở.** Ai nối mạch sau này: **đừng tự khởi động lại**; giá-trị còn dùng được là **§2 (mô-hình luồng 4 nhịp)** và **§3 (bản đồ file:line)** — nếu anh mở PARK thì bắt đầu từ đó, khỏi điều tra lại.

## 5. Khai giới-hạn (partial-honest)

- Return nguyên-văn của vai **không có trên đĩa** (folder chỉ có `run.md` + spec) ⇒ §3 là **bản lead đã VERIFY và chép vào run.md**, không phải transcript vai. Con số *"169K tok / 38 tool-use"* lấy từ `run.md`, lead @S179 **không tái-dựng được**.
- `run.md` khai P3 gồm *"tự đo lại 2 đính-chính"* nhưng **không ghi 2 đính-chính đó là gì** ⇒ mất, không bịa.

## 6. Vết đáng giữ — guard CÓ RĂNG

Lần phóng **đầu FAIL SẠCH** (0 agent · 0 token · 22ms): guard `checkpointApproved chưa set` 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ờ. **Ghi lại vì đây là bằng-chứng guard không phải trang-trí** — hiếm, vì guard thường chỉ chứng minh được khi có ca chặn thật.
