Files
solution-erp/.claude/workflows/runs/2026-08-01-S169-bookend-open/sub-reviewer-sleep-fidelity-S170.md
2026-08-03 10:38:16 +07:00

83 lines
9.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# sub-reviewer — GATE Fidelity (Phase 3b) /sleep-recovery-memory-l2 — S170
> Anti-#53: file này ghi TỪNG MỤC ngay khi có kết luận (flush liên tục). Đọc từ trên xuống = tiến độ thật.
> Vai: GATE (lead KHÔNG tự chấm Fidelity — G-001). Verdict-only, KHÔNG sửa draft.
> Run: `2026-08-01-S169-bookend-open` · 16 draft đã qua gate (a) coverage-diff 16/16.
## Trạng thái
- [x] P1 — FIDELITY-FLAG 4 cờ (`implementer-backend--2026-05-q3`) → **FLAG ĐÚNG nhưng CHƯA ĐỦ (2 MAJOR + 2 MINOR)**
- [x] P2a — cicd-monitor--2026-05-runs → **PASS-WITH-FIXES** (3 câu hỏi lead đều ĐẠT; 1 con-trỏ CHẾT + 1 keep-vs-drop MAJOR)
- [ ] P2b — test-specialist--baseline-history
- [ ] P2c — implementer-frontend--2026-H2
- [ ] P2d — investigator-codebase--2026-05-q1
- [ ] P3 — chấm subsection `### Bổ-sung coverage @P3-gate S170`
---
## P1 — FIDELITY-FLAG 4 tên cờ (`implementer-backend--2026-05-q3.gist.draft.md`)
**Verdict: nhãn `⚠️ FIDELITY-FLAG … đừng cite như fact` là ĐÚNG và CẦN, nhưng CHƯA ĐỦ.** Phải sửa thêm 2 điểm MAJOR + 2 MINOR trước khi chốt draft.
### 1. Sự thật trên đĩa (đo hôm nay, 2 dụng cụ độc lập)
Đọc thẳng thân 4 file migration (`src/Backend/SolutionErp.Infrastructure/Persistence/Migrations/`):
| Mig | Tên file thật | Cột thật do migration này tạo | Bảng đích |
|---|---|---|---|
| 28 | `20260513114505_AddAdvancedOptionsToApprovalWorkflows` | `AllowApproverEditDetails` · `AllowDrafterSkipToFinal` · `AllowReturnOneLevel` · `AllowReturnOneStep` · `AllowReturnToAssignee` · `AllowReturnToDrafter` (6 cột) | `ApprovalWorkflows` |
| 29 | `20260513130144_RefactorAdvancedOptionsToPerLevelAndDrafterUser` | dời 5 cột sang `ApprovalWorkflowLevels`; riêng `AllowDrafterSkipToFinal` sang **`Users`** | Levels + **Users** |
| 30 | `20260513160703_AddAllowApproverEditBudgetToLevels` | `AllowApproverEditBudget`**đúng 1 cột duy nhất** | `ApprovalWorkflowLevels` |
| 31 | `20260514160124_RefactorSkipToFinalToApproverLevel` | ADD `AllowApproverSkipToFinal` (Levels) + DROP `AllowDrafterSkipToFinal` (Users), **no-backfill** | Levels ← Users |
Dụng cụ 1 — `grep -rl <tên> src/Backend` (đã trừ `/obj/` + `/bin/`): 4 tên = **0 / 0 / 0 / 0**; control dương `AllowApproverSkipToFinal` = **54**; control âm `AllowXyzKhongTonTai` = **0**. Khớp draft.
Dụng cụ 2 (tôi thêm) — `git log --all --oneline -S "<tên>" -- src fe-admin fe-user`: `AllowDrafterEdit` · `AllowApproverEditSection1` · `AllowEarlyApprove` · `AllowDelegate` = **0 commit trong TOÀN BỘ lịch sử**; control dương `AllowApproverSkipToFinal` = **5 commit** (`15349e8` `0779f2d` `50e6d8c` `df52fa0` `a8027c0`), `AllowApproverEditBudget` = **5 commit** ⇒ dụng cụ có răng. Kết luận nâng cấp từ "nghi" lên **chốt: 4 tên này chưa từng tồn tại trong mã, kể cả thoáng qua rồi bị đổi tên**.
### 2. Phán từng tên (draft gộp 4 làm một — sai lớp)
| Tên trong verbatim | Phán | Đối-ứng thật |
|---|---|---|
| `AllowDrafterEdit` (gán Mig 29) | **tên viết sai — lai ghép 2 cờ thật** | phần "per-NV" thật = `AllowDrafterSkipToFinal` (bảng `Users`); phần "Edit" thật = `AllowApproverEditDetails` (Levels, và là **approver** chứ không phải drafter) |
| `AllowApproverEditSection1` (gán Mig 30) | **tên viết sai — trôi từ vựng UI** | `AllowApproverEditBudget` |
| `AllowEarlyApprove` (gán Mig 31) | **tên viết sai nhưng CÓ đối-ứng ngữ nghĩa 1-1** | `AllowApproverSkipToFinal` ("duyệt vượt thẳng tới cấp cuối" = "duyệt sớm") |
| `AllowDelegate` (gán Mig 31) | **KHÔNG có đối-ứng nào — hạng nặng nhất** | Mig 31 chỉ ADD đúng 1 cột; toàn `src/Backend` không có khái niệm uỷ-quyền duyệt (chỉ `RequestDelegate`/`RequestHandlerDelegate` của framework, 3 file) |
⇒ Trả lời câu hỏi lead: **3/4 là tên viết sai của cờ thật (drift từ vựng), 1/4 (`AllowDelegate`) không có bất kỳ đối-ứng nào — không phải "kế hoạch bị bỏ" vì pickaxe cho 0 commit, tức nó chưa từng được viết ra dòng nào.** Cả 2 lớp đều thoả "đừng cite như fact", nên nhãn không sai — nhưng nó che mất chỗ nguy hiểm nhất.
### 3. MAJOR-1 — nhãn không phủ CON SỐ "4×", mà con số mới là thứ mang tải
Câu trong verbatim (`archive/2026-05-q3.md:16`) là: *"Pattern 7 … **đã proven 4× — strong candidate Layer B promote khi unfreeze**"*, đặt cạnh luật ngay trên nó: *"Pattern proven ≥ 2× qualifies Layer B nominate"*. Nghĩa là **con số 4 là thứ kích hoạt một quyết định**, và nó được suy ra bằng cách đếm chính 4 cái tên vừa bị bác. Một tên là ma, ba tên còn lại đổ về ~3 migration ⇒ "4×" không có chứng độc lập.
Nặng hơn: draft dòng 10 tự kê đơn *«ý an-toàn để giữ: "Pattern 7 đã áp 4 lần qua Mig 29/30/31" bỏ tên cờ»*. Đơn này **giữ nguyên khẳng định và vứt đi đúng những token cho phép kiểm lại nó** — sau khi "làm sạch", câu đó thành bất-khả-bác. Thêm nữa nó tự vênh số học: 4 lần qua 3 migration. Con số này cũng đã lan sang `implementer-backend/archive/2026-06.gist.md:53``archive/_INDEX.md:38` dưới dạng dữ kiện trần.
**Phải sửa:** nhãn FIDELITY-FLAG nêu rõ **"4×" cũng chưa kiểm**; và bỏ/viết lại câu "ý an-toàn để giữ" ở dòng 10 — nếu muốn giữ ý thì giữ dạng không mang số, ví dụ "Pattern 7 lặp qua chuỗi Mig 28→31 (số lần chưa kiểm)".
### 4. MAJOR-2 — nhãn nêu "0-hit" nhưng KHÔNG nêu tên cờ THẬT
Draft liệt 4 **tên file migration** thật, nhưng người đọc sau cần **tên cột** thật mới có neo dùng được, và chúng chỉ cách 1 lệnh grep (đã liệt ở bảng §1). Ở dạng hiện tại, gist đóng vai trò "cảnh báo có lỗ" thay vì "vá lỗ". Trớ trêu: file gist đời cũ `implementer-backend/archive/2026-05.gist.md:11` đã ghi đúng 1 trong các tên thật (`AllowApproverSkipToFinal`) — tức bản gist MỚI, bản đi cảnh báo sai, lại nghèo thông tin hơn bản cũ.
**Phải sửa:** thêm vào nhãn danh sách cột thật kèm bảng đích (tối thiểu 4 cột: `AllowApproverEditDetails` · `AllowDrafterSkipToFinal``Users` · `AllowApproverEditBudget` · `AllowApproverSkipToFinal`).
### 5. MINOR-1 — gộp sai `AllowEarlyApprove` với `AllowDelegate`
Draft viết *"riêng `AllowEarlyApprove`+`AllowDelegate` chưa có đối-ứng nào ở Mig 31 (thật = `AllowApproverSkipToFinal`)"*. Sai: `AllowEarlyApprove` **có** đối-ứng 1-1 chính là `AllowApproverSkipToFinal`; chỉ `AllowDelegate` là không có gì. Gộp 2 ca khác lớp làm mất dấu đúng mục đáng ngờ nhất.
### 6. MINOR-2 — số control dương "54 file" không khai bộ lọc
Đo lại: `grep -rl AllowApproverSkipToFinal src/Backend` = **86**; **54** chỉ khi trừ `/obj/` + `/bin/`; **12** khi trừ thêm `*.Designer.cs` + `ModelSnapshot`. Cả ba đều là "phép đo" — 54 chỉ tái lập được với bộ lọc chưa được khai. Kết luận 0-hit vững dưới cả 3 bộ lọc (0/0/0) nên verdict không đổi, nhưng số nằm trong sổ trí nhớ phải đi kèm thước, không thì người sau đo ra 86 và tưởng ghi chú sai.
### 7. Điểm draft làm ĐÚNG (giữ nguyên, không được hạ)
-**control âm** (`AllowXyzKhongTonTai`) cạnh control dương ⇒ chứng minh phép đo còn răng, không phải 0-hit do thước hỏng. Đây là chỗ draft vượt chuẩn.
- Nhãn được **nhân đôi đúng chỗ**: §TỔNG-HỢP (dòng 10) + đầu §Entries (dòng 14) + §Phụ-lục (dòng 46, 50, 53) ⇒ không có đường trích dẫn nào thoát khỏi cảnh báo.
- Không lén "sửa đẹp" tên cờ trong thân bài: trích dẫn verbatim giữ nguyên chữ sai, đúng nguyên tắc chép-nguyên-văn.
- Draft anh em `implementer-backend--2026-05-q1.gist.draft.md` **không mang tên bịa** (diễn đạt trung tính "cờ admin bật riêng (thành Mig 30)") ⇒ không lan sang bản đồng lứa. Đã đo: 4 tên chỉ xuất hiện ở q3 draft, 3 dòng, tất cả trong ngữ cảnh nhãn.
### 8. Ghi chú lây nhiễm (ngoài phạm vi draft — việc của em-main)
Từ vựng bịa đã sống sẵn trong 4 hiện vật trí nhớ: `implementer-backend/archive/2026-05-q1.md:19` · `archive/2026-05.gist.md:11` · `archive/2026-06.gist.md:53` (số "4×") · `archive/_INDEX.md:15`.
🔴 **Cảnh báo khi dọn:** `_INDEX.md:15` dùng tên sai **bên trong con trỏ** `substring:"30 migrations** (+1 Mig 30 AllowApproverEditSection1"`. Con trỏ đó trỏ vào văn bản nguồn, nên **sửa chính tả ở đây sẽ giết con trỏ**. Luật dọn: vá chỗ **khẳng định**, không đụng chỗ **trích để định vị** (use ⟂ mention).
---