# sub-investigator-codebase-1 — LANE-1 NGUỒN/QUY-TRÌNH GĐ3-GĐ4 (S160 dry-run toàn trình)

> RAW invest — fable-real single-deep-pass. Nguồn PIN: run.md + 5 file + folder FORM.
> Trục: NGHIỆP VỤ từ tài liệu nguồn (KHÔNG đọc src/Backend, fe-* — đó là lane-2).
> Ghi-đĩa-trong-lúc-làm chống #53. Mỗi mục đánh số F-nn.

## §0 — Nguồn đã đọc (log tuần tự)

- F-01. `run.md` đọc TRƯỚC TIÊN (lệnh anh verbatim :6-15; đọc-hiểu lead :17; ràng buộc :42-48). Chốt: spec KHKK cũ RATIFIED chỉ BỔ SUNG; toàn trình 4 GĐ ❶PE ❷KHKK ❸Duyệt HĐ b.13→21 ❹HĐ cứng `Hdc_*`.
- F-02. `src-QT-TRINH-KY-HD.txt` (14.425B, paragraphs=38 tables=2). TABLE 1 = lưu đồ 12r×5c (cột shape flowchart MẤT khi extract — tên bước phải suy từ TABLE 2 + thứ tự trách nhiệm). TABLE 2 = diễn giải 10r×3c = **9 bước có tên**. QT tự nó KHÔNG đánh số 13→21 — numbering toàn-trình là quy ước dự án (S156/S157: b.13→21 ↔ 9 bước ISO 1:1).

## §1 — Câu 1: Bảng b.13→21 chi tiết (mirror khuôn spec cũ)

### F-03. Căn chỉnh số bước ↔ 9 bước ISO (nguồn: QT TABLE 2 :59-68 + TABLE 1 SLA :47-55)

TABLE 1 hàng theo thứ tự (cột Trách nhiệm + Thời gian — tên bước ghép từ TABLE 2 cùng trách nhiệm):

| Hàng T1 | Trách nhiệm | SLA (QT ghi) | Bước TABLE 2 khớp |
|---|---|---|---|
| :47 | PB/BCH CT | (form SOL-PRO-SP-001) | Lựa chọn NTP/NCC |
| :48 | QS/NV.PB/TBP/TPB | 07 ngày | Soạn thảo HĐ |
| :49 | PD/PM/PRO/CCM/FIN/ACT | 07 ngày | Góp ý nội dung |
| :50 | QS/NV.PB/TBP/TPB/PD/PM | 07 ngày | Đàm phán thương thảo |
| :51 | NTP/NCC/TĐ | 07 ngày | In HĐ (NTP in-ký-đóng dấu trước) |
| :52 | CCM | 03 ngày | Kiểm tra |
| :53 | BOD/NĐUQ | 01 ngày | Duyệt |
| :54 | HRA | (không ghi) | Đóng dấu |
| :55 | PB/BCH CT/CCM | (không ghi) | Phát hành + Lưu trữ |

### F-04. FO-002.01 đọc xong (40r×13c, 1 table)

Cấu trúc form: header thông-tin HĐ (`:8-11` Phòng ban/Dự án · Loại HĐ tick-box · Tên đối tác · Nội dung) + 4 KHỐI KÝ per-phòng (`:15-45`) + LƯU Ý 3 luật (`:46`).

**4 khối ký + mục tick từng khối** (mỗi khối có Họ tên + Ngày):
1. PHÒNG BAN/DỰ ÁN — ĐỀ XUẤT (`:15-20`): tick ①Soạn thảo ②Nội dung HĐ
2. PHÒNG CUNG ỨNG — PRO (`:21-30`): tick ①Điều khoản HĐ ②Điều khoản t/toán ③Rủi ro pháp lý HĐ
3. PHÒNG CCM (`:31-40`): tick ①G/trị HĐ so với NS ②Rủi ro pháp lý HĐ
4. GIÁM ĐỐC / NĐUQ (`:41-45`): "Ký kết, phát hành" (1 mục)

**LƯU Ý (`:46`) — 3 luật nghiệp vụ:**
- (a) HĐ **Chủ đầu tư**: đơn vị đề xuất chuyển TRỰC TIẾP Giám đốc (bỏ PRO+CCM). Mọi loại còn lại PHẢI qua PRO và CCM trước. → khớp cờ `BypassProcurementAndCCM` đã có trong code (lane-2 verify).
- (b) Mỗi bộ phận CHỈ 01 NGÀY xử lý; quá 01 ngày chưa xong = **XEM NHƯ ĐÃ THÔNG QUA** (auto-pass). Kéo dài phải báo bộ phận soạn thảo + ghi chú vào "Ý kiến". → mâu thuẫn V2 no-auto-approve (đã biết S157, owner O-2: SLA=tham khảo).
- (c) Bảng kiểm tra PHẢI lưu kèm bộ hồ sơ gốc → FO-002.01 là ARTIFACT của bộ HĐ cứng, không chỉ màn hình.

**Tick-box Loại HĐ trên form (`:9`): 6 lựa chọn** = Chủ đầu tư / Nhà cung cấp / Thầu phụ / Tổ đội / Thiết bị thuê / Khác — KHÔNG 1:1 với 7 ContractType repo (không có Mua bán/Dịch vụ/Nguyên tắc riêng; có "Thiết bị thuê" + "Khác" mà repo không có). Ghi nhận diff phân loại, form-render cần map.

**Chuỗi ký FO-002.01 = ĐỀ XUẤT → PRO → CCM → GIÁM ĐỐC.** QT TABLE 2 chỉ nêu cover được ký ở b.17 (PD/PM/TPB), b.18 (CCM), b.19 (BOD) — **PRO không có trạm riêng trong lưu đồ QT** nhưng có khối ký trên cover + LƯU Ý (a) buộc "qua PRO và CCM". → QT mơ hồ chỗ này; đề xuất: PRO ký cover trong khoảng b.17→b.18 (sau ký nháy nội bộ, trước CCM).

### F-05. RG-001 v02 đọc xong (2.907B)

**Mã HĐ `A/B/SOL&C/D`** (`:7`): A=Code dự án HOẶC Năm (HĐ dịch vụ/nguyên tắc) · B=viết tắt loại HĐ · C=viết tắt TP/NCC/TĐ/NC/ĐVDV · D=STT từ 01.

**Bộ viết tắt loại HĐ v02 CHỈ CÓ 4** (`:12-16`): HĐTP · HĐGK (Giao khoán/Đội thi công/Nhân công cơ hữu) · NCC · HĐDV. **KHÔNG có "MB" (Mua bán)** — trong khi repo codegen có 7 type gồm `HopDongMuaBan → {Project}/MB/SOL&{Sup}/{Seq}`.

**6 ví dụ mã HĐ** (`:46-51`): FLOCK 01/HĐTP/SOL&HD/01 · FLOCK 01/HĐGK/SOL&PVL/01 · FLOCK 01/NCC/SOL&CC1/01 · 2026/NCC/SOL&AKATI/01 (nguyên tắc=Năm) · FLOCK 01/HĐDV/SOL&KG/01 · 2026/HĐDV/SOL&TTL/01.

**2 dạng PO:**
- PO THEO HĐ nguyên tắc (`:25`, ví dụ `:54`): `X/Y/PO Z` = `{ProjectCode}/{NCC-abbr}/PO {Seq}` — ví dụ `FLOCK 01/TRUNGDUNG/PO 01`. KHÔNG có `SOL&`, KHÔNG có token loại HĐ, "PO" đứng TRƯỚC seq có DẤU CÁCH.
- PO KHÔNG theo HĐ nguyên tắc (`:36`, ví dụ `:57`): `A/PO/SOL&C/D` — ví dụ `FLOCK 01/PO/SOL&PVL/01`. "PO" chiếm vị trí loại-HĐ, có `SOL&`.

**Mã cho PHIẾU KHKK: RG-001 v02 KHÔNG quy định** — văn bản chỉ cover mã HĐ + mã PO. (Đề xuất ở §3.)

## §3 — Câu 3: DIFF RG-001 v02 vs bản repo (forms-spec.md)

### F-06. Kết luận DIFF: forms-spec.md = parse của CHÍNH file v02 → 0 lệch trên format

Folder FORM chỉ có 1 file RG-001 = `SOL-CCM-RG-001.v02 QD ma so hop dong.docx` (46.147B, mtime 2026-03-19) — tức Phase 0 đã parse đúng bản v02, không có v01 nào khác trên đĩa. Đối chiếu TỪNG dòng:

| Điểm | RG-001 v02 (src :dòng) | forms-spec.md (:dòng) | Verdict |
|---|---|---|---|
| Format HĐ `A/B/SOL&C/D` | `:7` | `:82-87` 6 row | KHỚP 6/6 ví dụ nguyên văn (kể cả `FLOCK 01` có DẤU CÁCH) |
| 4 viết tắt HĐTP/HĐGK/NCC/HĐDV | `:12-16` | `:82-87` cột Loại | KHỚP (HĐGK gồm Tổ đội/NC cơ hữu ✓) |
| Nguyên tắc → Năm thay ProjectCode | `:8-9` + ví dụ `:49,:51` | `:85,:87` | KHỚP |
| PO theo HĐNT `X/Y/PO Z` (không SOL&, "PO␣01") | `:25,:54` | `:93` | KHỚP |
| PO không theo HĐNT `A/PO/SOL&C/D` | `:36,:57` | `:94` | KHỚP |

**3 điểm KHÔNG-khớp-hoàn-toàn (đắt cho lane-2):**
1. 🔴 **"MB" (Mua bán) KHÔNG TỒN TẠI trong RG-001 v02** — v02 chỉ định nghĩa 4 viết tắt (`:12-16`), KHÔNG có MB; forms-spec cũng không có row MB. NHƯNG codegen repo (skill contract-workflow, bảng Mã HĐ gen) có `HopDongMuaBan → {Project}/MB/SOL&{Sup}/{Seq}` — tức "MB" là SÁNG TÁC của repo, không có gốc quy định. HĐ Mua bán (template FO-002.06 có thật) dùng mã gì theo v02? **Nguồn CÂM.** Đề xuất default dry-run: GIỮ "MB" hiện trạng (đổi codegen giữa dry-run = rủi ro), flag chờ anh ratify (option: map Mua bán→NCC hoặc →PO). Lane-2 check consumer.
2. **Scope reset Seq: v02 CÂM** — chỉ ghi "đánh số tăng dần bắt đầu từ 01" (`:19-20`), KHÔNG nói seq reset theo gì. forms-spec `:96` diễn giải "theo dự án + loại HĐ + đối tác" = interpretation hợp lý (codegen per-prefix khớp), nhưng cần biết đây là suy, không phải quy định.
3. **Chữ "dịch vụ/nguyên tắc" mơ hồ ở `:8`** ("Năm đối với HĐ dịch vụ/nguyên tắc") — nếu đọc chữ, HĐDV cấp-riêng cũng dùng Năm; nhưng ví dụ `:50` = `FLOCK 01/HĐDV/...` (ProjectCode) → ví dụ THẮNG chữ: Năm CHỈ cho nguyên tắc. forms-spec đã resolve đúng theo ví dụ.

### F-07. Mã cho PHIẾU KHKK: RG-001 v02 KHÔNG quy định

v02 chỉ cover mã HĐ + mã PO (2 loại). Không có mã phiếu trình/kế hoạch nào. → khai "nguồn không nói". Đề xuất default (mirror tiền lệ PE `PE/{YYYY}/{A|B}/{Seq:D3}` là mã tự đặt của hệ thống, không từ QĐ nào): **`KHKK/{YYYY}/{Seq:D3}`** atomic sequence, hiển thị trên phiếu + list; chờ anh ratify (spec cũ đã đề gì → xem §F-08 sau khi đọc spec).

## §2-pre — Câu 2 chất liệu: folder FORM + "hợp đồng cứng" vật lý

### F-08. Danh mục FORM folder (8 file, ls 2026-07-29 — khớp forms-spec 8 form, KHÔNG file mới)

| File (bytes, mtime) | Loại | Nhận diện |
|---|---|---|
| FO-002.01.v01 Bảng kiểm tra (113.214B docx) | Cover/checklist | ĐÃ extract S157 |
| FO-002.02.v01 Trọn gói NC+VT (516.608B .doc) | Template HĐ cứng | thầu phụ trọn gói |
| FO-002.03.v01 Trọn gói NC+TB (591.360B .doc) | Template HĐ cứng | thầu phụ trọn gói TB |
| FO-002.04.v01 Điều kiện chung (192.608B docx) | Appendix cố định | đính kèm HĐ trọn gói |
| FO-002.05.v01 HĐ Giao khoán (459.676B docx) | Template HĐ cứng | 10 table |
| FO-002.06.v01 HĐ mua bán (356.864B .doc) | Template HĐ cứng | NCC vật tư/TB |
| FO-002.07.V01 Đơn đặt hàng (1.032.615B xlsx) | Template PO | 3 sheet (SS GIA/PO/Po01 NLT) |
| RG-001.v02 QĐ mã số (46.147B docx) | Quy định | extract @S160 |

→ "6 template còn lại" = 002.02→.07. 3 file `.doc` (02/03/06) vẫn chưa convert (forms-spec TODO Phase 2 còn treo). mtime mới nhất 2026-03-19 = KHÔNG có bản mới sau Phase 0 parse → catalog forms-spec vẫn đúng hiện trạng đĩa.

## §1 (tiếp) — Câu 1: bảng b.13→21 + ranh GĐ3/GĐ4

### F-09. 🔴 RANH GĐ3/GĐ4 KHÔNG cần suy từ QT — OWNER ĐÃ CHỐT @S159

Spec cũ `:27` (verbatim owner ratification): **"ranh GĐ2 = b.7→12 (b.12 chốt con số ∈ GĐ2) · GĐ3 = b.13→18 tận dụng Contract V2 · GĐ4 = b.19→21 + ký cứng upload-only"**. QT tự nó KHÔNG chia giai đoạn (1 quy trình 9 bước liền); ranh là quy ước dự án đã ratify.
⚠️ **DRIFT trong run.md `:17`**: lead viết "GĐ3 Duyệt hợp đồng (b.13→21…)" — đọc đúng phải là *khúc 13→21 = verdict LAI (toàn bộ tái dùng Contract)*, còn RANH GĐ3/GĐ4 = 13→18 / 19→21 theo owner @S159. Plan cha PHẢI dùng ranh @S159, đừng chép "b.13→21" thành span GĐ3.

### F-10. Bảng b.13→21 chi tiết (khuôn spec cũ §1.5; nguồn = QT TABLE 2 `:60-68` + SLA TABLE 1 `:47-55` + FO-002.01)

Căn số: toàn trình b.1-6=PE(GĐ1) · b.7-12=KHKK(GĐ2) · **b.13-21 ↔ 9 bước ISO 1:1** (spec cũ §1.3(A) `:35-38`, lens-fidelity xác nhận 9/9 `:459-461`).

| b | GĐ | Việc | Ai (QT) | Đầu vào | Đầu ra/artifact | Chuyển bước | SLA QT |
|---|---|---|---|---|---|---|---|
| 13 | GĐ3 | Lựa chọn NTP/NCC | PB/BCH CT (`:60`) | QĐ theo SOL-PRO-SP-001 (`:47`,`:60` — **nguồn thứ 4 NGOÀI pin, chưa ai đọc**, spec cũ `:483-485`) | NTP/NCC được chọn | → b.14 | không ghi |
| 14 | GĐ3 | Soạn thảo HĐ | QS/NV.PB soạn; TBP/TPB kiểm khớp gói thầu + biểu mẫu (`:61`) | Winner + giá chốt GĐ2 + template FO-002.02→06 | Dự thảo HĐ, gửi các PB **qua email** lấy ý kiến | → b.15 | 07 ngày (`:48`) |
| 15 | GĐ3 | Góp ý nội dung | PD/PM (phạm vi CV/tiến độ/chất lượng/biện pháp — HĐ BCH CT) · EQU (thuê/mua TB) · PRO (vật tư/TP trọn gói) · CCM (điều khoản chi phí) · ACT/FIN (thanh toán/bảo lãnh/bảo hành) (`:62`) | Dự thảo | Ý kiến per-phòng | → b.16 | 07 ngày (`:49`) |
| 16 | GĐ3 | Đàm phán thương thảo | QS/NV.PB/TBP/TPB/PD/PM; PB/BCH CT đàm phán chất lượng/giao hàng/giá trị/thanh toán/tạm ứng; phòng chức năng tham gia nếu yêu cầu (`:63`) | Dự thảo + ý kiến | Điều khoản chốt với NTP | → b.17 | 07 ngày (`:50`) |
| 17 | GĐ3 | In HĐ | ⚠️ 2 nguồn trong CÙNG doc lệch nhẹ: T1 `:51` ghi trách nhiệm **NTP/NCC/TĐ**, T2 `:64` ghi **QS/NV.PB** (chủ trì) — thực chất chuỗi: NTP in 2 mặt + **KÝ + ĐÓNG DẤU TRƯỚC** gửi về PB/BCH CT → **cập nhật SỐ HĐ theo quy định** (RG-001) → PD/PM/TPB **ký nháy từng HĐ đúng vị trí** → PD/PM/TPB/TBP ký duyệt + ý kiến lên **cover FO-002.01** → QS/NV.PB chuyển CCM | Điều khoản chốt | **BẢN CỨNG ra đời tại đây** + số HĐ + ký nháy + cover khối ĐỀ XUẤT | → b.18 | 07 ngày (`:51`) |
| 18 | GĐ3 | Kiểm tra | CCM; **TP.CCM ký nháy từng HĐ** + ký duyệt + ý kiến lên cover FO-002.01 (`:65`) | Bộ cứng + cover | Cover khối CCM đã ký | → b.19 | 03 ngày (`:52`) |
| 19 | **GĐ4** | Duyệt | BOD/**NĐUQ** xem xét + **ký duyệt HĐ** (`:66`) | Bộ cứng đã qua CCM | Chữ ký GĐ trên HĐ + cover khối GĐ "Ký kết, phát hành" | → b.20 | 01 ngày (`:53`) |
| 20 | GĐ4 | Đóng dấu | **HRA/ISO** (T2 `:67` có ISO; T1 `:54` chỉ HRA); PB/BCH CT chuyển HĐ đã ký đến HRA/ISO đóng dấu theo quy định | HĐ đã ký GĐ | HĐ đóng dấu SOL | → b.21 | không ghi |
| 21 | GĐ4 | Phát hành + Lưu trữ | PB/BCH CT + CCM (`:68`) | HĐ hoàn chỉnh | **scan + gửi 01 BẢN GỐC cho CCM** · thông báo + chuyển bản gốc "theo đúng số lượng" đến NTP/NCC · lưu bản gốc · **lưu Server theo Filing System (bản CỨNG chính + bản SCAN)** | terminal | không ghi |

**Nhánh lỗi/vòng lặp: QT KHÔNG VẼ** nhánh trả-lại nào cho b.13→21 (spec cũ bảng mâu-thuẫn #5 `:88` cùng nhận định) → hệ thống dùng TraLai/TuChoi sẵn có của V2, khai là default.

### F-11. Nuance ranh: bản cứng SINH ở b.17 (GĐ3) nhưng MODULE cứng (GĐ4) mở từ b.19

Owner chốt GĐ4=b.19→21, nhưng theo QT thì vật-lý giấy + ký NTP + ký nháy + số HĐ đều sinh ở b.17-18 (∈GĐ3). ⇒ Trang `Hdc_*` phải HIỂN THỊ readonly metadata sinh từ b.17-18 (NTP đã ký/đóng dấu, ký nháy, cover 2 khối đầu), còn THAO TÁC của nó chỉ là 3 trạm b.19/20/21. Khai rõ để lane-2/lead không dựng trùng trạm.

### F-12. Điều kiện ">5 tỷ" quanh b.18→19: NGOÀI nguồn pin

Sổ S156 ghi "bước-18 '>5 tỷ' chưa có máy" (nguồn = sơ đồ PDF S156, KHÔNG nằm trong 6 nguồn pin lượt này). QT + FO-002.01 + RG-001 đều IM LẶNG về ngưỡng giá trị. → uncertain: KHÔNG đưa ngưỡng vào bảng bước; lead muốn dùng phải re-check PDF S156 + hỏi anh (twin câu Q3 GĐ2 đang treo).

## §2 — Câu 2: GĐ4 "Hợp đồng cứng" cụ thể là gì + đề xuất 6 leaf `Hdc_*`

### F-13. GĐ4 theo nguồn — cái BIẾT và cái NGUỒN CÂM

**Nguồn NÓI (QT `:64-68` + FO-002.01 `:46`):**
- Ký: NTP ký+đóng dấu TRƯỚC (b.17) → ký nháy nội bộ PD/PM/TPB đúng vị trí (b.17) → TP.CCM ký nháy (b.18) → **BOD/NĐUQ ký duyệt (b.19)**. Đóng dấu SOL: HRA/ISO (b.20).
- Lưu: 01 bản gốc → CCM · bản gốc theo số lượng → NTP/NCC · PB/BCH CT lưu bản gốc · Server Filing System giữ CẢ bản-cứng-chính lẫn bản-scan (b.21).
- Scan/số hoá: CÓ — scan là nghĩa vụ b.21; cover FO-002.01 PHẢI lưu kèm bộ hồ sơ gốc (luật (c) `:46`).
**Nguồn CÂM (khai + đề xuất default, đảo được):**
- **Tổng số bộ in**: QT không quy định (chỉ "01 bản cho CCM" + "theo đúng số lượng" cho NTP) → default: field `SoBoGoc` nhập tay khi tiếp nhận, tối thiểu 2; cần anh ratify.
- **Nơi lưu vật lý cụ thể** (tủ/phòng/mã hồ sơ): không nói → default: field text `ViTriLuuTru` + `FilingPath` (link server), nhập ở b.21.
- **Ai bấm gì trên hệ thống**: QT là quy trình giấy; owner @S159 đã chốt cơ chế hệ thống = **"ký cứng upload-only"** → mỗi trạm b.19/20/21 = 1 action xác nhận + upload scan bằng chứng, KHÔNG e-signature.

### F-14. Artifact GĐ4 cần track (đề xuất, suy trực tiếp từ b.17-21)

1. Số HĐ (RG-001) — sinh trước GĐ4 (xem F-16 lệch thời điểm). 2. `SoBoGoc` (default, nguồn câm). 3. Trạng thái cứng: đề xuất 4 mốc `ChoKyGD → DaKyGD → DaDongDau → DaPhatHanh` (map 1:1 b.19/20/21+terminal). 4. Scan bộ HĐ đã ký+đóng dấu (b.21). 5. Scan cover FO-002.01 (luật (c)). 6. Tick + ngày "01 bản gốc đã giao CCM". 7. Số bộ + ngày giao NTP/NCC. 8. `ViTriLuuTru` + `FilingPath`. 9. Ngày ký GĐ / ngày đóng dấu / ngày phát hành + người thao tác (audit). 10. Readonly từ GĐ3: NTP đã ký (b.17), ký nháy PD/PM/TPB + TP.CCM (b.17-18).

### F-15. Đề xuất nội dung 6 leaf `Hdc_*` (nhãn "- Bảng cứng", skeleton prod sẵn — run.md `:47`)

| Leaf | Dry-run cần hiển thị/thao tác |
|---|---|
| `Hdc_WfView` | Sơ đồ 3 trạm b.19→21 (Ký GĐ → Đóng dấu → Phát hành/Lưu) + đếm HĐ đang đứng mỗi trạm — mirror trang "Tổng quan quy trình" arc-2 |
| `Hdc_List` | Mọi HĐ đã vào GĐ4 (tức GĐ3 xong): mã HĐ, NCC, dự án, giá trị, trạng thái cứng 4-mốc, số bộ, cột thiếu-scan |
| `Hdc_Create` | ⚠️ **Nguồn không nói** — GĐ4 không "tạo mới từ trắng". Default: form "Tiếp nhận bản cứng" pick HĐ GĐ3-xong + nhập `SoBoGoc`/ghi chú; cần anh ratify (option B: leaf này giữ ComingSoon, tiếp nhận tự động khi GĐ3 terminal) |
| `Hdc_Pending` | Inbox theo vai: BOD/NĐUQ thấy ChoKyGD · HRA thấy DaKyGD (chờ đóng dấu) · PB/BCH+CCM thấy DaDongDau (chờ phát hành/scan/giao) |
| `Hdc_Approved` | HĐ DaPhatHanh: đủ scan + đã giao CCM/NTP + nơi lưu |
| `Hdc_Deleted` | Soft-deleted records (khuôn 6-leaf y-chang Duyệt NCC, commit `ea962b1`) |
Mỗi transition = nút xác nhận + upload scan + note (upload-only @S159).

### F-16. Lệch thời điểm GÁN MÃ HĐ: QT b.17 vs máy gen ở terminal — input cho lane-2

QT `:64`: "Cập nhật số Hợp đồng theo quy định" nằm TRONG b.17 In HĐ (mã phải có trên bản in). Code hiện gen mã lúc khác (skill: transition DangDongDau; sổ S156: V2 terminal gen-mã+DaPhatHanh — **lane-2 verify site thật**). Dry-run default: GIỮ máy hiện trạng (mã sinh ở terminal GĐ3 = sau b.18, vẫn TRƯỚC khi GĐ4 thao tác) + ghi nhận lệch so QT-b.17; user viết tay mã lên bản in nếu in trước. Cần anh ratify nếu muốn dời sớm thời điểm gen.

## §4 — Câu 4: FO-002.01 → gate/checklist per-phòng

### F-17. Map 4 khối ký ↔ bước

| Khối FO-002.01 | Mục tick | Bước | Căn cứ |
|---|---|---|---|
| PHÒNG BAN/DỰ ÁN (ĐỀ XUẤT) | Soạn thảo · Nội dung HĐ | ký ở **b.17** (nội dung làm từ b.14) | QT `:64` "ký duyệt + ý kiến lên tờ cover" |
| PHÒNG CUNG ỨNG (PRO) | Điều khoản HĐ · Điều khoản t/toán · Rủi ro pháp lý | **b.17→18 handover** — QT KHÔNG có trạm PRO riêng trong lưu đồ; LƯU Ý (a) buộc "qua PRO và CCM trước" → khai mơ hồ, default đặt PRO ký NGAY TRƯỚC CCM | FO `:21-30` + `:46`(a) |
| PHÒNG CCM | G/trị HĐ so với NS · Rủi ro pháp lý | **b.18** | QT `:65` |
| GIÁM ĐỐC/NĐUQ | Ký kết, phát hành | **b.19** | QT `:66` |

Spec cũ đã dùng chuỗi này làm đối-chứng-GIẤY cho O-1 (bảng `:92` — cùng HÌNH b.9→12 GĐ2). Hai giai đoạn dùng CÙNG khuôn 4-trạm là feature, không phải trùng lặp.

### F-18. Default dry-run cho 3 luật LƯU Ý + checklist (O-Q1/O-Q2 CHƯA trả lời — default phải đảo được)

1. **Checklist per-phòng (O-Q2 treo):** dry-run chạy bằng **comment tự do LevelOpinions như hiện trạng V2 = 0 dev mới**; số hoá checkbox (ĐỀ XUẤT 2 mục · PRO 3 · CCM 2 · GĐ 1) dời sang wave-gate sau khi anh trả lời. Đảo: bật checkbox per-Level, map đúng bảng F-17.
2. **Auto-pass 01-ngày (luật (b)):** KHÔNG máy hoá (mâu thuẫn duyệt-chặn V2; O-2 SLA=tham khảo — spec cũ `:412` cùng kết luận). Default: hiển thị số-ngày-đang-chờ trên phiếu, không auto-approve. Đảo: cần SLA-engine (đã bị loại khỏi mọi wave GĐ2 — nếu anh muốn thì là wave riêng).
3. **Bypass Chủ đầu tư (luật (a)):** ngoài scope dry-run NTP/NCC (QT scope = TP/NCC/TĐ); cờ `BypassProcurementAndCCM` đã tồn tại, không kích hoạt.
4. **Cover lưu kèm bộ gốc (luật (c)):** thành acceptance GĐ4: HĐ DaPhatHanh PHẢI có scan cover đính kèm (attachment purpose riêng — lane-2 check enum `AttachmentPurpose` thiếu ký-nháy/cover, sổ S156 đã flag).

## §5 — Câu 5: wave-structure NGHIỆP VỤ GĐ3+GĐ4 (nối W1-W5 spec cũ)

### F-19. Nguyên tắc kế thừa + đề xuất W6→W9

Nguyên tắc spec cũ §③ `:253-254`: mỗi wave deploy riêng phải trả lời "người dùng thấy gì"; NOTE @S160: menu đã public toàn bộ (skeleton), dark-launch = lớp TRANG/DATA.

| Wave | Tên (nghiệp vụ) | Người dùng thấy gì khi đẩy riêng | Chặn bởi | Bắt buộc cho dry-run E2E? |
|---|---|---|---|---|
| **W6** | GĐ3 sống: HĐ từ KHKK → duyệt V2 → DaDuyet | Tạo HĐ từ phiếu KHKK DaDuyet (giá = ApprovedAmount), trình, 3 trạm PRO→CCM→CEO duyệt web (default mirror chuỗi FO-002.01, admin-config được), approver MỞ ĐƯỢC phiếu chờ mình | Q6/Q11 (cầu W5 — anh ĐÃ MỞ gate chạm HĐ @S160 run.md `:17`④); 🔴 authz S156 phải khoanh vùng per-action TRONG wave này vì dry-run mở menu mọi người | ✅ |
| **W7** | GĐ4 lõi: Hdc 6 leaf trang thật, 3 trạm cứng b.19/20/21 | Theo dõi bản cứng: tiếp nhận → ký GĐ (upload) → đóng dấu → phát hành (scan+số bộ+giao CCM/NTP+nơi lưu) | `Hdc_Create` semantics cần anh ratify (F-15); còn lại default đủ chạy | ✅ |
| **W8** | Gate + checklist FO-002.01 số hoá | Checkbox per-phòng trên phiếu + gate trình/duyệt siết dần | ✅ **O-Q1 + O-Q2** (twin W4 GĐ2) | ❌ hoãn — nguồn: O-2 tham khảo + 2 câu owner treo |
| **W9** | Hồ sơ hoàn tất + nhắc thiếu scan + thống kê lưu trữ | Filing view, cảnh báo HĐ phát hành thiếu scan/cover | không | ❌ hoãn — không chặn vòng chạy |

**Bắt buộc E2E đến "Hợp đồng cứng": W5(cầu, spec cũ) + W6 + W7.** b.14-16 (soạn/góp ý/đàm phán) dry-run bằng trạng thái Nháp + comment thread + update draft (default khai rõ: ISO có trạm "Góp ý 6 phòng" nhưng V2 5-state không có phase góp-ý riêng — nếu anh muốn trạm thật thì thêm Bước trong workflow admin-config, 0 code).

### F-07-BỔ-SUNG. Mã phiếu KHKK: spec cũ ĐÃ đề `KHKK/{YYYY}/{Seq:D3}` (`:128` tái dùng `WorkflowAppCodeSequence` prefix namespaced + `:307` "owner nên liếc format trước W1") — F-07 giữ nguyên kết luận "RG-001 câm", đề xuất KHỚP spec cũ, vẫn CHỜ anh ratify format.

## §6 — Surprises ngoài 5 câu hỏi

- F-20. **run.md `:17` drift ranh GĐ3** (chi tiết F-09) — Plan cha phải theo owner @S159: GĐ3=13→18, GĐ4=19→21.
- F-21. **"MB" codegen không có gốc quy định** (F-06.1) — dry-run HĐ Mua bán sẽ đẻ mã ngoài RG-001 v02; forms-spec.md cũng KHÔNG có row MB → repo tự thêm ở tầng codegen, cần owner ratify hoặc loại type MuaBan khỏi dry-run.
- F-22. **forms-spec TODO Phase 2 còn treo**: 3 file `.doc` (002.02/.03/.06) chưa convert → template render HĐ trọn gói/mua bán chưa chắc chạy được trong dry-run — lane-2 check form-engine coverage thật; nghiệp vụ fallback: đính file mẫu tĩnh.
- F-23. **FO-002.01 tick-box 6 loại HĐ ≠ 7 ContractType repo** (F-04) — màn render cover cần bảng map, "Thiết bị thuê"/"Khác" không có ContractType tương ứng.
- F-24. **SLA QT b.14-17 = 07 ngày** khớp fallback code (7d) nhưng b.17 In-HĐ QT=07d ≠ skill DangInKy=1d — O-2 nói tham khảo nên không chặn, ghi để bảng SLA hiển thị đúng NGUỒN thay vì đúng code.

<!-- END sub-investigator-codebase-1 · TOTAL=25 mục (F-01→F-24 + F-07-BỔ-SUNG) -->

