[CLAUDE] Docs: S97 part-2 closeout — endsBeforeCeo config→RUNTIME (Mig 60) + gotcha #78 + memory harvest

- STATUS/HANDOFF S97 mega-line: +fix-3 endsBeforeCeo; State → Mig 60 / 89 tables / gotcha 78 / bundle DR9q2VUy+Bgz8u4E5 (Run #482)
- gotcha #78: display-flag CONFIG-vs-RUNTIME (nói dối khi instance lệch config; nặng sau opt-in flip)
- session-log Part 2: endsBeforeCeo root-cause + fix + verify (test 440 + reviewer PASS 0-issue + cicd #482 bug-fixed-LIVE)
- Memory harvest: test-specialist + reviewer + cicd-monitor (#482 verdict recover từ diary — #53 return-garble lần-5, root-cause structural noted)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-07-01 20:16:43 +07:00
parent 8037fa01d1
commit 07c89058d7
7 changed files with 54 additions and 16 deletions

View File

@ -1314,6 +1314,14 @@ for h in resp.points: # ← .points không phải iterable trực tiếp
**References:** `$env:TEMP\guideshots\capture.ps1` (session-scratch) · `docs/Huong-dan-Duyet-NCC.docx`. Pattern reusable user-memory `pattern_prod_screenshot_to_docx`.
### 78. Display flag suy từ CONFIG thay RUNTIME → nói dối khi instance lệch config (nặng hơn sau opt-in/opt-out flip) (Session 97)
**Triệu chứng:** Phiếu PE/2026/A/010 CEO (Bước 3) đã duyệt thật (Lịch sử duyệt 16:47) nhưng đồ báo "Phiếu đã kết thúc tại CCM Cấp 2 không qua CEO" + làm mờ Bước 3 CEO. Anh Kiệt: "CEO duyệt ko thấy ?".
**Cơ chế:** `endsBeforeCeo` (banner "không qua CEO" + làm-mờ bước-sau) tính theo CONFIG workflow (`steps.Any(l => l.AllowApproverFinalize)` = workflow cấp finalize) luôn true nếu workflow cấp "Duyệt thay CEO", BẤT KỂ phiếu NÀY thực sự finalize hay đã lên CEO. Phiếu opt-out finalize (approver trình tiếp) lên CEO thật nhưng display suy từ config nói dối. `ComputeLevelStatus` cũng blanket "Done" mọi cấp khi DaDuyet. **Nặng lên sau S97 đảo default checkbox opt-out→opt-in**: mặc định giờ TRÌNH TIẾP CEO nhiều phiếu lên CEO bug hiện thường xuyên (fix = follow-up trực-tiếp của chính S97 default-flip).
**Fix (root-cause, Mig 60 `8037fa0`):** thêm field RUNTIME `EndedByLevelFinalize` (set true CHỈ nhánh level-finalize service) `EndsBeforeCeo` cho phiếu DaDuyet đọc runtime thay config (ChoDuyet giữ heads-up config); FE gate làm-mờ theo `endsBeforeCeo`; backfill marker "Duyệt KẾT THÚC tại". prod-verified Run #482 (PE-detail endsBeforeCeo=False live). **Quy tắc:** flag hiển-thị/trạng-thái = "instance NÀY ĐÃ làm-gì" (RUNTIME) KHÔNG "workflow THỂ làm-gì" (CONFIG); config-flag chỉ đúng khi instance không-bao-giờ-lệch-config đổi default opt-in/opt-out làm lệch phổ-biến soi lại mọi display suy-từ-config. Liên-quan `feedback_cardinality_change_grep_consumers` · `feedback_root_cause_over_symptom`.
---
## Checklist debug bug mới