# invest-synthesis — S113 Supplier import v2

> 🔄 **partial-honest — CHUẨN-HOÁ VỊ-TRÍ @S122 (2026-07-15), KHÔNG PHẢI VIẾT MỚI.**
>
> Thân dưới = **trích từ `run.md:34-41`** (`## Synthesis` + `## OUTCOME`), đã tồn-tại từ **2026-07-12**.
> 🔴 **Bản gốc trong `run.md` GIỮ NGUYÊN, và bản gốc mới là CHUẨN** — file này là bản-sao chuẩn-hoá vị-trí. Không cắt, không rewrite history (tinh-thần C8 `workflows/README.md:19`).
>
> **Vì sao file này ra đời:** orphan-authority (`workflows/README.md:20`) đo **TÊN FILE**, không đo **nội-dung**. Đo @S122: `naive 13 / dual-accept 8 / C8 cứu 5` — **0/7 là việc mất**. Anh chủ-dự-án chốt @S122: **chuẩn-hoá + tri-accept**.
>
> 🔸 **Folder này khai "0 sub-MD" nhưng KHÔNG phải run rỗng** — nó có `## Synthesis` **và** `## OUTCOME` ghi đủ kết-quả ship. Vật-liệu chi-tiết nằm ở `spec-supplier-import-v2-12-07-2026.md` (12.9KB) chứ không ở sub-MD.

---

## [TRÍCH `run.md:34-41` — bản gốc là chuẩn]

### Synthesis (em-main refute + P3/P4)

**Hội tụ 4 lane (auto-decide):** IsPublic bool (KHÔNG đụng SupplierStatus) · dedup MST-primary+Code-backstop (chống 500) · backfill 22 prod→public · PublishSupplierCommand riêng (né #73) · template BE-gen ClosedXML · LayoutValid re-bake 30-token-thật (đã extract byte-exact).

**Chẻ đôi (→ anh chốt):** D1 Mã-NCC = Code[schema-lens] vs field-mới[import-lens]. D2 R4-strict vs R6-literal (mâu thuẫn thật). D3 authz FE⧣BE mismatch.

**Recover visibility:** consumers = PE picker (PeWorkspaceCreateView/PeDetailTabs) · ContractCreatePage · CreateContractFromEvaluationFeatures · dashboard — đều qua ListSuppliersQuery → filter `Published`. HMW grep-all trước implement.

→ Chi tiết đầy đủ ở `spec-supplier-import-v2-12-07-2026.md`.

### OUTCOME — SHIPPED PROD (Run #497 PASS 5m14s, commit `5fa11b5`)

Spec → HMW-Opus implement (BE⟂FE parallel) → test-specialist +19 (477 PASS) → reviewer GO-WITH-ADJ (2 must-fix applied) → deploy verified. **4 bug caught+fixed pre-prod:** #53-visibility-lane-recover · null-Code NRE #80 (test-specialist) · authz-403 Import-nút (em verify-chéo) · draft-leak-picker + CreateSupplier-IsPublic (reviewer). Mig 64 prod 37/37-backfill · bundle admin `acprMqfB`/user `Ck3BTDdA` · byte-verify feature PRESENT. ⚠️ #53-garble ×2 (invest-visibility-lane + impl-be-first-return → SendMessage-resume 1/3 finish sạch). Harvest: em-main stamp invest-ensemble `[engine: fable-clone-ensemble · Opus-S113]` + product-agents self-updated diary S113.

---

## Verify độc-lập @S122 (lead — KHÔNG tin thẳng return sub)

**VERDICT: LANDED** — sha verify bằng `git cat-file -t` = commit (không phải nhãn suông).

- 🟢 **`5fa11b5`** (`5fa11b588aa9f978ddff1b7de9f7cdc2e6af9a30`) · Sun Jul 12 19:03:37 2026 · *"[CLAUDE] Supplier: import v2 — Mig 64 publish/draft + dedup-MST + template + file mẫu"* — **28 file, +7659/−105**:
  - Mig 64 **3-file đủ** (`20260712110556_AddSupplierPublishState.cs` + `.Designer.cs` + ModelSnapshot)
  - `PublishSupplierCommand.cs` +57 · `GetSupplierImportTemplateQuery.cs` +17 · `SupplierExcelImportService.cs` +198 · `ListSuppliersQuery.cs` +11 · `Supplier.cs` +5
  - FE **2-app mirror** (SupplierImportDialog 60/60 · SuppliersPage 121/121 · types 2/2)
  - consumer-filter `PeDetailTabs` + `ContractCreatePage` ×2 app (+2 mỗi file = **đúng cái recover-lane visibility** nêu trong synthesis)
  - test `SupplierImportV2DedupTests.cs` +452 + `SupplierPublishAndListTests.cs` +155
- 🟢 **`ccdcbe7`** 19:24:49 — *"[CLAUDE] Docs: S113 closeout — Supplier import v2 SHIP prod (Run #497) + Mig 64/477 test/gotcha #80"*.

**Spec → code loop KHỚP (đọc đĩa HÔM NAY, không tin doc):**

| Điểm spec | Trên đĩa |
|---|---|
| D1 = A (IsPublic bool) | `Supplier.cs:45` `public bool IsPublic` ✓ |
| D2 backfill + unique-index | Mig64 `:17-33` AddColumn IsPublic bit default-false + `Sql("UPDATE Suppliers SET IsPublic = 1;")` + DropIndex→CreateIndex filter `[IsDeleted] = 0 AND [Code] <> ''` ✓ (khớp `spec:30-31`) |
| R2 template endpoint | `SuppliersController.cs:79` `[HttpGet("import/template")]` ✓ |
| R5 dedup MST | `SupplierExcelImportService.cs:112/176/185/192/212` `NormalizeMst`/`batchByMst`; `:212` *"blank-MST KHÔNG vào batchByMst → 2 blank-MST = 2 insert"* ✓ (khớp `spec:77`) |
| R7 filter Published | `ListSuppliersQuery.cs:11` `bool? Published = null` + `:26-28` ✓ |

> 🟢 **Đáng ghi — 4 bug bắt TRƯỚC prod**, mỗi cái từ một lớp phòng-thủ khác nhau: recover-lane (visibility) · test-specialist (null-Code NRE #80) · em-main verify-chéo (authz-403) · reviewer (draft-leak-picker). Đây là ca **defense-in-depth trả giá đúng** — không lớp nào bắt được cả 4.
>
> ⚠️ **#53-garble ×2 trong chính run này** (invest-visibility-lane + impl-be-first-return) → xử bằng `SendMessage`-resume, 1/3 finish sạch. Khớp memory `feedback_agent_return_garble_recover` (nấc 2 = SendMessage-resume in-session).

### Gap KHÔNG chứng minh được (khai thẳng)

1. **Prod Run #497 PASS 5m14s · Mig 64 prod 37/37-backfill · bundle `acprMqfB`/`Ck3BTDdA`** — S122 **KHÔNG probe CI/prod** ⇒ **KHÔNG XÁC ĐỊNH ĐƯỢC** trạng-thái prod hiện tại. (Và bundle-hash **chắc chắn đã đổi** từ đó — S116/S117 ship tiếp; xem `docs/STATUS.md` canonical.)
2. **477 test PASS** — S122 KHÔNG chạy `dotnet test`.
3. **D1/D2/D3 "chẻ đôi → anh chốt"** — synthesis ghi 3 quyết-định chờ owner. Đĩa cho thấy **D1 = A đã land**; **D2/D3 S122 KHÔNG truy** ⇒ **KHÔNG XÁC ĐỊNH ĐƯỢC** chốt thế nào.

### Lệch convention của chính folder này (ghi để không lặp)

- **0 sub-MD** dù run có 4 lane ⇒ **run-trace thủng**: chi-tiết lane không bao giờ chạm đĩa, chỉ còn bản gom trong `run.md` + spec. Nếu phiên đó chết giữa chừng, `/tiep` §4 **không có vật-liệu** để cắt-gọt. Đây đúng lý-do sàn H22 S111 ép RUN-TRACE ≥3 task — và run này **có trước** sàn đó.
- Synthesis ghi vào **thân `run.md`** ⇒ **dạng-3**, nguyên-nhân gốc false-orphan.

---
*Chuẩn-hoá vị-trí @S122 `/tiep` · run `2026-07-15-S122-retro-harvest-7-orphan` · wf `wf_5ce007c4-980` lane `retro:S113-supplier-import-v2-invest` · lead Opus 4.8 · sub read-only, lead single-writer (B6)*
