# implement-synthesis — KHKK 8 workflow-nhóm mirror DuyetNcc (YC-013 + YC-016)

> **VERIFIED bởi lead** — viết hồi-tố @S185 (2026-08-09, cửa `/tiep` window-4/L13) khi ĐÓNG orphan sàn-3 ①.
> Nguồn sự-thật: verify 4-chân @S183 + RE-verify 3/3 @S185 (origin `72568f05` · suite 668/0 · DLL prod 2 guard × 3-hit, control-dương đứng) — KHÔNG chép từ return sub (chuỗi #53 ~14 lượt trong phiên, ruột nằm ở 10 `sub-*.md` cùng folder).

## Kết quả từng stage (B1a→B5 — bảng run.md:18-24 tick cùng lượt)

| stage | kết quả VERIFIED | con-trỏ |
|---|---|---|
| B1a invest BE | BE ~85% generic theo `workflowKey` — mirror DuyetNcc gần như 0 code mới BE-side | `sub-invest-be-fable.md` (21.244 B) |
| B1b invest DB | **0-MIG** — schema Mig 71 đã đủ (8 row KHKK-N1..8 seeder), không đổi bảng | `sub-invest-db-fable.md` (18.097 B) |
| B1c invest FE-UI | 1-file chính `ApprovalWorkflowsV2Page` param-hoá theo key; dialog 9-ô giữ khuôn | `sub-invest-fe-fable.md` (13.916 B) |
| B2 wave-plan | spec DRAFT 8.891 B; PRECHECK đọc-DB bác tiền-đề `:24` "phiếu đều Phase=3" (thật 9/12 submit-được, pin-lệch=0 ⇒ GO) | `spec-khkk-awf-mirror-ncc-DRAFT.md` · `sub-cicd-monitor-0.md:199` |
| B3 review ×2 | R1 `2C/5M` · R2 `1C/5M+§8` — vá vào spec final | `sub-review-{1,2}-fable.md` |
| B4 spec final | 15.900 B — D3=C (YC-014: ô chưa-nghe mờ + tooltip, giữ layout) | `spec-khkk-awf-mirror-ncc-08-08-2026.md` |
| B5 execute | wf `wf_a07b53c8-47e` 4 lane Opus MAX (PRECHECK trọn + 3 lane đứt-limit) → 3 Agent nối-từ-đĩa (BE build 0-err · FE tsc 0×2 · TEST) → 2 Agent vá MAJOR-1/-3 → reviewer pre-commit `PASS_WITH_FIXES 0C/3M+6m` (3M vá trước commit) → **SHIP `706134da`** (13 file, +1604/−89, 0-mig) | `sub-{implementer-backend-0,implementer-frontend-1,test-specialist-2}.md` · `sub-reviewer-precommit.md` |

## Verify sau-ship (2 đợt độc lập)

- **@S183 cicd 4/4 chân:** admin bundle `Ajv-MaCz→ChepzuO4` marker `KhkkN1`=1 (control-âm 0) · eoffice `YsXRkBSR→BQ_dvyu6` · DLL `EnsureWorkflowGroupMatch` 3-hit · 8-row `IsActive=1` + pin-lệch-0 ⇒ **8 panel SỐNG prod**.
- **@S185 RE-verify 3/3:** origin `72568f05` · suite **668/0** · DLL `EnsureApprovalAttachmentUploaderAsync` 3-hit + control 3, mtime `2026-08-08 13:11:21` (YC-016 cùng chuỗi — guard tay-cầm-phiếu, slot 67 đóng).

## 🔴 2 khai lệch (đóng-băng số cũ, không sơn lại)

1. **Acceptance-literal `run.md:32` "= 659" LỖI THỜI ngay lúc ship:** 645 + 14 spec-test **+ 1 T15 (MAJOR-3)** = **660** lúc ship `706134da`; nay 668 (+8 test YC-016). Số 659 giữ nguyên trong run.md làm ảnh chụp — bài-5 thư 08-08: không sửa bản đóng băng, đính chính ở đây.
2. **Engine-mix:** `run.md:4` ghi lead = Fable 5 (đúng lúc mở @S182); giữa chuỗi anh đổi Opus-5 (PAUSE-1), cửa đóng-orphan này chạy Fable 5. Worker B5 = Opus MAX đúng pin.

## Trạng thái sổ

YC-013 **mở** (code+deploy+verify XONG — chờ acceptance-mắt-anh rồi lật) · YC-014 đóng · YC-015 đóng · YC-016 mở-đã-verify (chờ lật cùng đợt). Orphan sàn-3 ① của run này **ĐÓNG tại file này**.

## ADDENDUM @S185 (2026-08-10) — Acceptance ĐỘNG local (A2-răng + T8) — PASS

Seed local `SolutionErp_Dev`: cờ `AllowApproverEditDetails=1` trên approver `620B968B` (N1 B1C1) + phiếu `KHKK-LOCAL-A2T8` Phase=ChoDuyet grp=1 pin N1. Đo qua API http:5443 + FE dev :8082 (JWT inject localStorage 3-key).

- **A2-răng 2 tầng PASS:** (data) API overview type-10 trả đủ 8 nhóm qua `history`, approver seed `allowApproverEditDetails=True`, 2 approver cùng cấp False = control-âm · (hiển-thị) dialog "Sửa tại chỗ — KHKK-N1 v01": ô #4 Drafter tick-disabled default-true · **ô "Sửa Section 2" TICK+disabled = STATE THẬT từ DB, không hard-code** · NV#2 cùng cấp untick toàn bộ · ô #7 "KẾT THÚC" là ô sống duy nhất — khớp từng chữ D3=C + rule-box tự khai "ô vẫn hiển thị đúng giá trị đang lưu".
- **T8-động PASS:** PUT đổi-tên (change thật) → 204 → **1 row `ContractSigningPlanChangelogs`** đúng shape {act=Update · etype=Workflow · PhaseAtChange=ChoDuyet · UserName=Administrator · Summary "Sửa quy trình duyệt tại chỗ: KHKK-N1 v1 (giữ nguyên phiên bản)" · ContextNote=lý-do}. **Control-âm tự nhiên:** 3 PUT echo-no-change trước đó → 204 + 0 row (`changes.Count>0` gate đúng — không rác changelog).
- **Bonus guard-409 runtime:** tick cờ "Duyệt là KẾT THÚC" qua sửa-tại-chỗ → **409 Conflict** đúng rule-box ("đổi cờ đó ⇒ phải Tạo phiên bản mới") — guard sống ở runtime, không chỉ unit.
- **2 thước-hỏng tự bắt:** (i) selector `[role=dialog]` không match component thật → đọc nhầm "dialog CLOSED" khi đang mở; (ii) slot "+ Thêm NV" auto-pick bị dedup loại → 2 PUT "đổi" thực chất echo — suýt phán T8-FAIL oan trước khi soi `changes.Count` gate + đếm B3C1.
- Revert trọn: tên + cờ + phiếu + changelog test đã xoá; 2 server preview dừng. Vite-proxy note: API dev phải nghe **http**:5443 (`--urls`) — proxy không nói https.
