diff --git a/.claude/auto-memory/MEMORY.md b/.claude/auto-memory/MEMORY.md index 51c1455..59d84bb 100644 --- a/.claude/auto-memory/MEMORY.md +++ b/.claude/auto-memory/MEMORY.md @@ -26,6 +26,7 @@ - [Canonical spec over broadcast](feedback_canonical_spec_over_broadcast.md) — adap khi anh trỏ LỆNH canonical → pull command/§P/ledger, ĐỪNG phỏng-theo broadcast cô-đọng; report-before-stamp (S79) - [Review presentation & stale config](feedback_review_presentation_and_stale_config.md) — review độc-lập bắt honesty-PRESENTATION gap + stale-config đánh-lừa reviewer; tighten-wording + re-measure TRƯỚC review (S81) - [Derived-flush = execution](feedback_derived_flush_execution.md) — derived-doc flush khớp canonical owner-set = em-main tự làm KHÔNG gate; chỉ ĐỔI con-số/policy = quyền anh (S84) +- [Cơ-chế đúng, dữ-liệu không có](feedback_mechanism_right_data_absent.md) — lớp ×6; UAT báo "không chạy" ⇒ ĐO DỮ LIỆU PROD trước, đừng đọc/viết code (S157: auto-fill đúng, 57/62 dự án rỗng `Location`) - [Root-cause over symptom](feedback_root_cause_over_symptom.md) — bug lặp sau band-aid → truy field/case LỆCH-quy-ước vào pattern đã-đúng = fix 1 chỗ; verify "tạo lỗi MỚI còn lặp?" (S85, #72/#73) · **+S122 anh nêu: (i) được-chỉ-1-chỗ ⇒ PHẢI grep cùng-lớp (script thứ-2 lòi ra khi anh hỏi — thoát vì MAY) · (ii) 🔴 bài-học nằm-trong-context KHÔNG tự bật (file này auto-inject mà lead vẫn vá triệu-chứng; +SHA-bịa tái-phạm sau 1 NGÀY) ⇒ chặn được = LUẬT soi-được, không phải trí-nhớ · chứng: hardcode sống 27 ngày qua 1 đợt "double-check" vì nó hỏi "logic đúng?" mà logic VẪN đúng · truy-gốc ≠ tự-sửa-gốc (harness owns → R6 hỏi hub)** - [Cardinality change grep consumers](feedback_cardinality_change_grep_consumers.md) — đổi field single→multi = grep MỌI consumer; sửa write-site sót read-site → vỡ feature (S87/S88 PE multi-winner) - [Prod config: inspect-before-change](feedback_prod_config_inspect_before_change.md) — đổi config prod = inspect LIVE trước (runbook STALE); backup→apply→verify-LIVE→commit; replicate mọi rule cũ + delta (S88) diff --git a/.claude/auto-memory/feedback_mechanism_right_data_absent.md b/.claude/auto-memory/feedback_mechanism_right_data_absent.md new file mode 100644 index 0000000..9c380c2 --- /dev/null +++ b/.claude/auto-memory/feedback_mechanism_right_data_absent.md @@ -0,0 +1,30 @@ +--- +name: feedback-mechanism-right-data-absent +description: "Lớp lỗi lặp ×6 ở SOLUTION_ERP — cơ-chế ĐÚNG nhưng thứ đi qua nó KHÔNG CÓ; UAT báo \"không chạy\" thì ĐO DỮ LIỆU trước, đừng đọc/viết code" +metadata: + node_type: memory + type: feedback + originSessionId: 85c4bae3-8755-487e-bb4b-d8d8c9135463 + modified: 2026-07-28T02:57:02.204Z +--- + +**"Cơ-chế đúng, thứ đi qua nó không có"** — lớp lỗi đã nổ **×6** ở repo này. Khi anh/UAT báo *"cái X không tự điền / không hiện / không bắt"*, **phép đầu tiên là ĐO DỮ LIỆU PROD**, không phải đọc code rồi suy, và tuyệt đối không phải viết code mới. + +**Why:** đây là **ĐẶC-TÍNH KIẾN-TRÚC**, không phải xui: schema DÙNG CHUNG ⟂ service/seed RIÊNG per-loại ⇒ một cột thêm cho loại này mặc-định **CÂM** ở loại kia trừ khi có người nối; và cột có thật thì vẫn có thể **rỗng data**. Cả 6 ca đều **build sạch + test xanh** — không có tín-hiệu máy nào kêu. Nguy nhất: viết code auto-fill "mới" khi code cũ **đã đúng và đang chạy** ⇒ tốn công, đẻ trùng-lặp, mà triệu-chứng y nguyên vì bảng vẫn rỗng. + +**6 ca (ca 6 = chiều MỚI: bug do NGƯỜI DÙNG báo, fix ngây-thơ sẽ nhân đôi code đã đúng):** +1. policy tồn tại / 11-trên-13 vai `CanDelete=0` +2. endpoint PUT sống / 0 dây FE gọi +3. policy chặn đúng approver cần dùng +4. DTO thiếu field FE đang đọc +5. PMH role `Procurement` bị 403 ở b.13/b.17 (cơ-chế phân quyền đúng, vai đi qua không có quyền) +6. **@S157 PE "Địa điểm không tự lấy"** — auto-fill `Project.Location` đã wire từ S59 và **chạy đúng cả 4 tầng** (DB cột → `ProjectFeatures.cs:51` projection → FE type → `onChange` SearchableSelect); ô trống vì **prod 57/62 dự án `Location = NULL`** (chỉ 5 dự án có địa chỉ — đúng 5 dòng có địa chỉ trong Excel nhập S55). + +**How to apply:** +- UAT báo "không chạy" ⇒ **sqlcmd đếm dữ liệu prod TRƯỚC** (`SELECT COUNT(*), SUM(CASE WHEN IS NULL...)`). Một câu query rẻ hơn một vòng đọc code + một lần sửa nhầm. +- Rồi mới truy dây theo tầng: DB cột → DTO projection → FE type → chỗ tiêu-thụ. Đủ 4 tầng mới kết luận "wire hỏng". +- Data rỗng ⇒ **KHÔNG sửa cơ-chế**. Hỏi owner nguồn dữ liệu; hướng anh chọn @S157 là *"để người dùng tự cập nhật Master data, cái nào không có thì không fill"* (không backfill hàng loạt). +- Vá đúng cho ca data-rỗng = **lộ LÝ DO tại chỗ** (dòng cảnh báo trỏ nơi bổ sung), vì ô trống im lặng làm người dùng tưởng hệ-thống hỏng → đẻ báo lỗi giả. Xem [[feedback-absence-looks-like-clean]]. +- Báo lại cho anh phải nói thẳng *"cơ-chế không hỏng, thiếu dữ-liệu"* — đừng để anh tưởng vừa được sửa bug. + +Liên quan: [[feedback-root-cause-over-symptom]] (truy gốc thay vì vá triệu-chứng) · [[feedback-permission-grant-two-layers]] (cùng họ: 2 tầng độc-lập, tầng này đúng không suy ra tầng kia) · [[feedback-cardinality-change-grep-consumers]] (write-site đúng, read-site sót). diff --git a/docs/STATUS.md b/docs/STATUS.md index dcd1a9a..cb1a6de 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -3,7 +3,9 @@ > **Update rule:** trước khi bắt đầu 1 task → ghi row `🔥 In Progress`. Xong → `✅ Recently Done`. > **Tiering rule (S40):** chỉ giữ **state hiện tại + 3 session gần nhất** ở file này. Session cũ hơn → `docs/changelog/sessions/`. Full history pre-S40 → `docs/_archive/STATUS-preS40-fullhistory.md`. (Tránh over-context — xóa double, không cắt nội dung.) -**🔥 CURRENT (S153, 2026-07-26 — phiên-logic 6: adopt TRỌN thư Ctx soft-memory + OWNER-VETO 3-vai + RENAME hub-form):** Mig 67 · 89 bảng · **532 test** (giữ — `git diff` 0 file `src/`/`tests/`/`fe-*` toàn phiên) · gotcha 83 · **Sub-agents 23** · counter **27** · bundle FROZEN. **Governance-only.** ① **Pipeline anh lệnh** (`/check-email`+`/adap-apply` → `/fable-real` invest → spec+checklist → hmw Opus-5-MAX): thư ① `9c909007` **TRỌN** (filing 2-tuyến + **probe-sau-restart 2-nguồn `claude-opus-5[1m]`** + thư hub `d432f5eab5cd`) · thư ② `0df10df4` **EXECUTED** — 9 task T1-T8: máy `mind-check` (`session_ctx.py` +528 dòng, 7 phép+2 phụ, 4 mức, draft/closed/`--root`) + template `_mind` + 3 persona + `hmw.js` 23 + wire 4 lệnh + `mind_ctx_kb`=32/`tiep_reload` + **ĐÓNG ghost-wire `session_ctx_kb`** (H18 class-2 sống S146→S153) ② **fault-inject 18/18** + **2 fix hậu-T4 (FI 6/6)**: **GAP-#9** closed-mode "E-có-nội-dung-0-con-trỏ" CỜ→**TRƯỢT** (chặn gradient thưởng *xoá-con-trỏ-trung-thực* — họ bẫy F-1 của chính thư hub) · `secrets-sweep` +`--root` parity; số ĐO THẬT pause +**117ms** thay ước lệch 2.2-5.4× ③ **T10 OWNER-VETO (38)**: anh *"còn thiếu 2 vai ctx?"* → chốt **"Build đủ 3 vai như hub"** ⇒ +`ctx-curator`(@pause, **carve-out `pause.md §1`**) +`ctx-verifier`(@tiep, dòng `LEAD-PHAI-NHAC-LAI:`) · `ctx-audit` thu về vai-3 (kiểm-vết vai-1/2) ④ **T11 RENAME** theo lệnh anh *"đặt tên giống hub/sisters để dễ audit"* — đo đĩa 3 nhà (hub curator/verifier/audit · VIPIX check/reload/chain) ⇒ SE theo **HUB-form** (tiền lệ S149); sweep 15 file, tên cũ chỉ còn lineage-note; **gap còn lại: `ring5-audit` V5 hub CÓ, SE+VIPIX chưa → slot (41)** ⑤ bookend @open 5-vòng (9 spawn: H1 7f · H2 4f · H24 5+3 FLAG · ring1 28Đ/4T/1KC · **ring2 8/8 ĐẠT + M-1 MISS-thật** persona-cadence-stale · trio eval-MIXED-14-signal/refine-3A-7B-4N/**audit 25Đ-3T re-chạy 7 instrument 24-số-byte-exact**) ⑥ **#53 ×14-cận-dưới** (8 open + 4 arc + 2 close), **0 mất dữ liệu** — WRITE-lane derive-from-body · Agent-resume · SendMessage-resume; datum: **trio return-only hết miễn nhiễm** (3/3 CLEAN → 1/3) ⑦ residual-write test-specialist self-compact → verify A7 **401/401** ⇒ ACCEPT verified-KEPT (AS-10) · M9 seed 3 diary ctx (dir 20→23). → log `changelog/sessions/2026-07-26-1600-S153-ctx-adopt-3vai-rename.md` +**🔥 CURRENT (S155→S157, 2026-07-27→28 — phiên-LOGIC L7, 4 cửa-sổ: PE nút XÓA ship prod → điều tra quy trình sau-CEO → UAT Địa điểm):** Mig **68** · 89 bảng · **562 test** (45D+517I) · gotcha 83 · counter **31** · bundle admin `8-QYcMOg` / user `DptYR4wL`. ① **PE nút XÓA phiếu ở màn duyệt** (Mig 68 `AddPeAllowApproverDelete`, cờ `AllowApproverDelete` **per-NGƯỜI** — owner chốt (5)): chia **2 ĐỢT** theo lệnh anh vì §F.0 chứng minh quyền xóa **không tới được phiếu đang treo** nếu thiếu lệnh sửa-quy-trình-tại-chỗ; `b1bae77` (nền) + `4464a46` (nút + menu 3 mục + màn "Đã xóa") + `f4494cf` (fix menu sáng nhầm) — **cicd PASS 6/6** lead tự đo @S156 (**D3 giao-tập-ID = 0**: 37 sống ⟂ 9 xóa) · test 532→**562** (+30) ② **A2 quy trình SAU CEO duyệt** (PDF 21 bước, phạm vi **b.7→21**): `/fable-real investigator-codebase` + `/fable-clone reviewer` **4/4 lane sạch 0 chết, 35 điểm** → verdict **`LAI`** (b.13→21 TÁI DÙNG Contract V2 · b.7→12 DỰNG MỚI) — lõi SỐNG, đổ ở nhãn chi-phí + cách đặt vấn đề; 🔴 **anh ĐẶT TÊN khúc 7→12 = "đề xuất giá trị ký kết hợp đồng"** ⇒ đầu ra = **1 CON SỐ có phê duyệt** ⇒ là **PHIẾU**, không phải thư-mục đính kèm ⇒ Q2 nhánh (c) yếu hẳn, Q6 gần tự trả lời. **CHẶN Q1-Q6 chờ anh** (14 câu); 6 việc sửa bản invest chưa làm (gồm 1 claim SAI SỰ THẬT: "hardcoded fallback" → thật là `ConflictException:115-116` ⇒ HĐ từ phiếu **KẸT CỨNG `ChoDuyet`**) ③ 🔴🔴 **LỖ HỔNG AN NINH PROD phát hiện @S156** (KHÔNG liên quan tính năng mới, gotcha #82 tái phát): `ContractWorkflowService.cs:48-66` nhánh Reject chạy **TRƯỚC MỌI GUARD** + `ContractsController.cs:13` **`[Authorize]` trần DUY NHẤT phủ 22 endpoint ghi** ⇒ mọi user đăng nhập Từ-chối/Trả-lại được **bất kỳ HĐ nào kể cả `DaPhatHanh`**; verify 2 tầng độc lập, đối chứng PE controller có 3 per-action policy. **Anh chốt 07-28: "chỗ hợp đồng cứ từ từ"** ⇒ treo có chủ đích ④ **S157 UAT anh Kiệt "lấy địa chỉ lên luôn"** — chẩn **DATA-không-phải-CODE**: auto-fill `Project.Location` đã wire S59 + chạy đúng cả 4 tầng; ô trống vì **prod 57/62 dự án `Location` NULL** (đo sqlcmd; chỉ 5 dự án có địa chỉ = đúng 5 dòng Excel S55). Anh chốt **"để người dùng tự cập nhật Master data, cái nào không có thì không fill"** ⇒ KHÔNG backfill; vá = cảnh báo amber lộ lý do + trỏ chỗ bổ sung (`6250f39`, 4 file 2-app SHA-mirror). **Deploy Run #419 success 5m40s — cicd PASS 9/9 + lead tự re-curl độc lập KHỚP TỪNG BYTE** (marker 2/2 mỗi app, control âm chứng bundle cũ đã biến mất) ⑤ **`#53` cửa S157 ×1** (`cicd-monitor` tái phạm — return = mẩu transcript, cứu TRỌN 10.666B từ đĩa **nhờ ép ghi-từng-mục-trong-lúc-làm**) · `ctx-verifier` @tiep-3 **CO-CO 10 cờ** (nặng nhất: trần `_mind` dư 110B ⇒ cửa sau nén ≥2 block). → log `changelog/sessions/2026-07-28-0930-S155-S157-pe-delete-bch-invest-diadiem.md` + +**✅ S153 (2026-07-26 — phiên-logic 6: adopt TRỌN thư Ctx soft-memory + OWNER-VETO 3-vai + RENAME hub-form):** Mig 67 · 89 bảng · **532 test** (giữ — `git diff` 0 file `src/`/`tests/`/`fe-*` toàn phiên) · gotcha 83 · **Sub-agents 23** · counter **27** · bundle FROZEN. **Governance-only.** ① **Pipeline anh lệnh** (`/check-email`+`/adap-apply` → `/fable-real` invest → spec+checklist → hmw Opus-5-MAX): thư ① `9c909007` **TRỌN** (filing 2-tuyến + **probe-sau-restart 2-nguồn `claude-opus-5[1m]`** + thư hub `d432f5eab5cd`) · thư ② `0df10df4` **EXECUTED** — 9 task T1-T8: máy `mind-check` (`session_ctx.py` +528 dòng, 7 phép+2 phụ, 4 mức, draft/closed/`--root`) + template `_mind` + 3 persona + `hmw.js` 23 + wire 4 lệnh + `mind_ctx_kb`=32/`tiep_reload` + **ĐÓNG ghost-wire `session_ctx_kb`** (H18 class-2 sống S146→S153) ② **fault-inject 18/18** + **2 fix hậu-T4 (FI 6/6)**: **GAP-#9** closed-mode "E-có-nội-dung-0-con-trỏ" CỜ→**TRƯỢT** (chặn gradient thưởng *xoá-con-trỏ-trung-thực* — họ bẫy F-1 của chính thư hub) · `secrets-sweep` +`--root` parity; số ĐO THẬT pause +**117ms** thay ước lệch 2.2-5.4× ③ **T10 OWNER-VETO (38)**: anh *"còn thiếu 2 vai ctx?"* → chốt **"Build đủ 3 vai như hub"** ⇒ +`ctx-curator`(@pause, **carve-out `pause.md §1`**) +`ctx-verifier`(@tiep, dòng `LEAD-PHAI-NHAC-LAI:`) · `ctx-audit` thu về vai-3 (kiểm-vết vai-1/2) ④ **T11 RENAME** theo lệnh anh *"đặt tên giống hub/sisters để dễ audit"* — đo đĩa 3 nhà (hub curator/verifier/audit · VIPIX check/reload/chain) ⇒ SE theo **HUB-form** (tiền lệ S149); sweep 15 file, tên cũ chỉ còn lineage-note; **gap còn lại: `ring5-audit` V5 hub CÓ, SE+VIPIX chưa → slot (41)** ⑤ bookend @open 5-vòng (9 spawn: H1 7f · H2 4f · H24 5+3 FLAG · ring1 28Đ/4T/1KC · **ring2 8/8 ĐẠT + M-1 MISS-thật** persona-cadence-stale · trio eval-MIXED-14-signal/refine-3A-7B-4N/**audit 25Đ-3T re-chạy 7 instrument 24-số-byte-exact**) ⑥ **#53 ×14-cận-dưới** (8 open + 4 arc + 2 close), **0 mất dữ liệu** — WRITE-lane derive-from-body · Agent-resume · SendMessage-resume; datum: **trio return-only hết miễn nhiễm** (3/3 CLEAN → 1/3) ⑦ residual-write test-specialist self-compact → verify A7 **401/401** ⇒ ACCEPT verified-KEPT (AS-10) · M9 seed 3 diary ctx (dir 20→23). → log `changelog/sessions/2026-07-26-1600-S153-ctx-adopt-3vai-rename.md` **✅ S152 (2026-07-25→26 — phiên-logic 5: bookend trọn 2 đầu + owner 3-quyết + queue memory-ops TRỌN):** Mig 67 · 89 bảng · **532 test** (giữ nguyên — `git diff` 0 file src/tests/fe toàn phiên) · gotcha 83 · counter **26**. **Governance-only.** ① Owner 3 quyết trong-phiên: **(30)** dải JUMP để-nguyên-theo-nhịp · **(31)** 4 persona +`Anti-patterns (NEVER)` (ăn registry nhờ CLI-restart giữa phiên — requirement ĐÃ THOẢ, tooling-close proof) · **(32)** "vòng 1→5 auto" → **lô consent gỡ SẠCH 9 site** (5 H1 + site-6 `ring1-audit:24` ring1 TỰ BẮT trong persona mình [E-013 EXT tái-phát] + 3 trio-persona lead grep-cùng-lớp) ② **Queue memory-ops TRỌN** (A1-A4 · D1 · D2+Fidelity-gate F1/F2 · R1 · B-series+FI-9-ca): A7 **392/392** · mfe **20/20-100% lần đầu** · lead-gap drain 24.728→16.485B · sổ-strike `-Apply` + WARN-latch (`-Ack` = **owner-action**, doc @`eval/mfe/README.md`) ③ **V4 sleep AUTO lượt đầu** (probe KÊU 16 → đo-trước-tin: 1 shard THẬT; gist lead-gap distill-gen-1) + **ring4 đầu-đời TRƯỢT-4/5** claim "0-MISS" của lead → 4 fix áp verbatim (scribe `sub-ring4-close-S152.md` + diary — vai return-only, verdict suýt bốc hơi) ④ **Thư model re-stamp**: `59ce1d0f` → published **`9c909007`** (G-024a; stamp_verify OK) — sweep 13 bề-mặt LIVE + adap-report Đính-chính @S152 (2 lệnh S151 SAI THẬT: find=1, grep=3) ⑤ Bookend @close: stale 6 FLAG + gap 2 FLAG → **vá 6/6 cùng phiên**; ring2 **8/8 ĐẠT** (⭐4-A pin-bản-cắt 16.911/30.195B — 3 FLAG ngoài tầm, tally thoát NHỜ MAY → đề `END+TOTAL`-line chờ anh) · ring1 **48Đ/5T/6KC trên 59 claim** (thách-CLEAN 6 lens: 2 THỦNG đều ô 🟢) ⑥ **#53 ×10-chắc S152** (7 @open + 3 @close; ring2-STRICT + trio = 4 CLEAN) → **tally 60-cận-dưới** + errata commit-subject `1b85713` "53"=SAI · M9 **13 đơn-vị** diary (3 `S151-deep` hồi-tố đóng harvest FLAG-A HIGH). → log `changelog/sessions/2026-07-26-0200-S152-bookend-memops-close.md` @@ -633,6 +635,17 @@ monthly re-tier mega-line + ef-core SKILL Mig→59 + 3 vocab-fork (2026-07-01 du - **2 mark Active-High** — anh chốt **TÁCH** (2 trục **khác nấc bằng-chứng**): `RC-pqhuy1987-15-07-2026-15-32-20` (H22 · bằng-chứng mạnh) · `RC-pqhuy1987-15-07-2026-15-32-23` (H24 · **caveat binding: "LỆNH về CÁCH LÀM, chưa phải bằng-chứng về HIỆU-QUẢ"**). - 🔴 **CÒN NỢ (khai thẳng):** 2 vai H24 **CHƯA CHẠY lần nào** (counter=1, nhịp đầu ~S128) · precedence H23 **CHƯA test** (chờ phiên **lead=Fable**) · dạng-4 orphan = kẽ CÒN LẠI · **R6 chờ hub** (SE không tự dời memory được — `settings.json` 0 key ⇒ harness ép). +## 🔥 In Progress (S155→S157 — phiên-LOGIC L7) + +| Task | Owner | Status | +|---|---|---| +| ✅ **PE nút XÓA phiếu ở màn duyệt SHIP PROD** (Mig 68, 2 đợt `b1bae77`+`4464a46`+`f4494cf`, cicd PASS 6/6, test 532→562) | 👤 em main + 🟦🟧🟪🟩 | 🟢 done | +| ✅ **S157 UAT "lấy địa chỉ lên luôn"** — chẩn data-không-phải-code (57/62 dự án thiếu `Location`), vá = cảnh báo amber; `6250f39` deploy Run #419, cicd **PASS 9/9** + lead re-curl khớp byte | 👤 em main + 🟥 cicd | 🟢 done | +| **A2 quy trình SAU CEO duyệt (b.7→21)** — invest + review 4/4 lane xong (35 điểm, verdict `LAI`); **6 việc sửa bản invest** chưa làm → rồi mới trình 14 câu | 👤 em main | 🟡 chặn Q1-Q6 | +| **🔴 Q1-Q6 thiết kế khúc 7→12** ("đề xuất giá trị ký kết hợp đồng") — 14 câu, nặng nhất Q2 kiến-trúc (phải viết lại theo 2-trục + 3 số đo trước khi hỏi) | 👤 anh Kiệt / anh Huy | ⚪ pending (NEXT-anh) | +| **🔴🔴 Lỗ hổng an ninh duyệt HĐ** (Reject trước mọi guard + `[Authorize]` trần 22 endpoint ghi) — **anh chốt 07-28 "cứ từ từ"** | 👤 anh quyết ưu tiên | ⏸ treo có chủ đích | +| **UAT anh Kiệt** — vào Danh mục → Dự án → điền Địa điểm (vd BVN01) → tạo phiếu mới xác nhận tự điền | 👤 anh Kiệt | ⚪ pending (NEXT-anh) | + ## 🔥 In Progress (S117) | Task | Owner | Status | diff --git a/docs/changelog/sessions/2026-07-28-0930-S155-S157-pe-delete-bch-invest-diadiem.md b/docs/changelog/sessions/2026-07-28-0930-S155-S157-pe-delete-bch-invest-diadiem.md new file mode 100644 index 0000000..cda9621 --- /dev/null +++ b/docs/changelog/sessions/2026-07-28-0930-S155-S157-pe-delete-bch-invest-diadiem.md @@ -0,0 +1,101 @@ +# S155→S157 — PE nút XÓA ship prod · điều tra quy trình sau-CEO · UAT Địa điểm + +> **Phiên-LOGIC L7**, 4 cửa-sổ vật-lý (2026-07-27 → 07-28), nối bằng `/pause` + `/tiep`. +> Lead: Fable 5 (S156-S157) · State cuối: Mig **68** · 89 bảng · **562 test** · gotcha 83 · counter **31**. +> Con-trỏ durable: `.claude/sessions/session-7/_context-s-7.md` (FLOW 3 entry PAUSE-1..3) · `_mind-s-7.md` (MIND-0..3). + +--- + +## 1. PE — nút XÓA phiếu ở màn duyệt (SHIP PROD, 2 đợt) + +**Nguồn:** ảnh chat UAT anh Kiệt FDC. **Owner chốt trong cửa:** cờ `AllowApproverDelete` **per-NGƯỜI** (không per-vai) · màn "Đã xóa" **chỉ xem, không khôi phục** · **vá trọn rồi đẩy** (bác 2 phương án đẩy sớm) · bỏ policy-theo-vai trên đường xóa mới, giữ 3 rào nghiệp vụ. + +**Vì sao chia 2 đợt** (anh chốt, có bằng chứng): §F.0 chứng minh quyền xóa **không tới được phiếu đang treo** nếu thiếu lệnh sửa-quy-trình-tại-chỗ ⇒ đợt 1 = NỀN, đợt 2 = phần người dùng chạm. + +- Mig **68** `AddPeAllowApproverDelete` — AddColumn trên `ApprovalWorkflowLevel`, **no new table** (89 giữ), reversible Down. +- Commit: `b1bae77` (nền) · `4464a46` (nút xóa + menu 3 mục + màn "Đã xóa") · `f4494cf` (fix menu sáng nhầm). +- **cicd PASS 6/6** — lead **tự đo** @S156 thay vì giao lại `cicd-monitor` (vai đó đã dừng giữa chừng ở cửa trước): endpoint 2/2 → **401** (control bịa ra 404, chứng phép đo có phân biệt) · smoke **8/8** · **D3 giao-tập-ID = 0** (37 phiếu sống ⟂ 9 phiếu xóa, không lẫn) · bundle rotate ×2 app + **4/4 byte-marker** · Run #531 success 5m41s. +- Test **532 → 562** (+30). Chi tiết: `.claude/workflows/runs/2026-07-27-S155-pe-delete-approver/cicd-verify-dot2.md`. + +**Lớp lỗi lặp ĐÚNG 4 LẦN trong riêng cửa này** — *cơ-chế đúng, thứ đi qua nó không có*: policy tồn tại nhưng 11/13 vai `CanDelete=0` · endpoint PUT sống nhưng 0 dây FE gọi · policy chặn đúng approver cần dùng · DTO thiếu field FE đang đọc. **Cả 4 đều build sạch + test xanh.** Chốt chặn đã dựng: **T27** (fault-inject xác nhận có răng). + +--- + +## 2. A2 — quy trình SAU khi CEO duyệt (b.7→21) · CHẶN chờ anh + +**Nguồn:** PDF sơ đồ *"A. PHÊ DUYỆT GÓI MEP, KẾT CẤU THÉP"* 6 lane × 21 bước. Anh chốt *"đã xong bước thứ 6 tức CEO duyệt rồi, bắt đầu đến Project (Ban Chỉ Huy Công trường)"* ⇒ phạm vi **b.7→21**. + +**🔴 Anh ĐẶT TÊN NGHIỆP-VỤ cho khúc 7→12 = "đề xuất giá trị ký kết hợp đồng".** Đây là phát-biểu **MỤC ĐÍCH**, không phải đổi nhãn: đầu ra = **1 CON SỐ có phê duyệt**; b.8-9 (duyệt mẫu / shopdrawing với TVGS) = **căn cứ**, b.10-12 = **chuỗi duyệt chính con số đó** ⇒ nó là **PHIẾU**, không phải thư-mục đính kèm. Hệ quả: Q2 nhánh (c) yếu hẳn, Q6 gần như tự trả lời. Bỏ tên tạm "PostAward" của bản invest. + +**Đã chạy:** +- `/fable-real investigator-codebase` (Fable) 2 lượt — lượt 1 **`#53` mất trắng return**, cứu TRỌN từ đĩa; lượt 2 resume cắt-ngắn CLEAN, `sub-invest-bch-1.md` **22.659 B**. +- `/fable-clone reviewer` `wf_1618ae3c-a17` — **4/4 lane sạch, 0 chết**, 35 điểm: verdict `LUNG-LAY 11` · fidelity `CO-VAN-DE 10` · q2 `THIEU-PHUONG-AN 14` (+ thiên-vị-có-hướng) · gaps `4/4 THẬT, 0 dương-giả`. +- **Verdict `LAI` SỐNG:** b.13→21 **TÁI DÙNG** Contract V2 · b.7→12 **DỰNG MỚI**. Đổ ở *nhãn chi-phí* + *cách đặt vấn đề*, không đổ ở lõi. + +**Grounding 4 phép (đo, không suy):** `PE.DaDuyet = 7` khớp "xong b.6" · cầu PE→HĐ **CÓ SẴN** (`CreateContractFromEvaluationFeatures.cs`) · `shopdrawing|TVGS|duyệt mẫu` = **0 hit toàn repo** (b.8-9 là đất trắng) · `ContractPhase` **12 giá trị / 7 `[LEGACY]`** — 🔧 lead ghi nhầm "9 phase / 6 LEGACY", **2 vai độc lập bắt được**, máy xác nhận. + +**CÒN NỢ trước khi trình anh — 6 việc sửa bản invest** (`review-synthesis.md` §G): vá **1 claim SAI SỰ THẬT** ("hardcoded policy fallback" → thật là `ConflictException:115-116` ⇒ HĐ tạo từ phiếu **KẸT CỨNG `ChoDuyet`**, hỏng CỨNG chứ không degrade êm; gốc: invest **tin skill-doc hơn ĐĨA**, doc stale che luôn lệch display⟂guard) · siết biên `b.14→19` · thêm Q vai-người-TRÌNH · thêm cảnh báo lỗ hổng reject · Q5 thêm phương án (d) `skipToFinal` **ĐÃ WIRE** mà invest bỏ sót · **viết lại Q2** theo 2 trục + 3 số đo cùng đơn-vị lấy từ twin repo. + +--- + +## 3. 🔴🔴 Lỗ hổng an ninh prod — duyệt Hợp đồng (phát hiện @S156, TREO theo lệnh anh) + +**KHÔNG liên quan tính năng mới** — gotcha #82 tái phát ở module Contract: + +- `ContractWorkflowService.cs:48-66` — nhánh **Reject chạy TRƯỚC MỌI GUARD** (0 kiểm role, 0 kiểm approver, 0 kiểm `fromPhase`), `SaveChanges` + `return` luôn. +- `ContractsController.cs:13` — **`[Authorize]` trần DUY NHẤT** phủ **22 endpoint ghi**. + +⇒ **mọi user đăng nhập Từ-chối / Trả-lại được BẤT KỲ hợp đồng nào, kể cả `DaPhatHanh` (terminal)**, kèm xoá `SlaDeadline`. Lead verify **2 tầng độc lập**; đối chứng: PE controller có **3 per-action policy** (bất đối xứng rõ giữa 2 module). + +**Trạng thái:** anh chốt 2026-07-28 *"chỗ hợp đồng cứ từ từ nhé"* ⇒ **treo có chủ đích**, không phải bị bỏ quên. Đã tách chip riêng. + +--- + +## 4. S157 — UAT "lấy địa chỉ lên luôn" (SHIP PROD) + +**Anh Kiệt 07-28, ảnh chụp form tạo phiếu:** ô **Địa điểm** trống, *"chỗ này lấy địa chỉ lên luôn giúp anh"*. + +**🔴 Chẩn đoán: DATA, không phải CODE.** Cơ-chế auto-fill `Project.Location` **đã wire từ S59 và chạy đúng cả 4 tầng** — cột DB → projection `ProjectFeatures.cs:51` → FE type `master.ts:97` → `onChange` SearchableSelect (`PeWorkspaceCreateView.tsx:227` + `PeHeaderForm.tsx:200`, có cả logic không ghi đè khi user đã gõ tay). + +Đo prod bằng sqlcmd **trước khi đụng code**: + +| Đo | Kết quả | +|---|---| +| BVN01 (dự án trong ảnh) | `Location = NULL` | +| Tổng dự án | 62 | +| **Thiếu Địa điểm** | **57** | +| Có Địa điểm | 5 — CAL01 · MIDEA01 · SAM01 · TLB01 · ZOTE01 | + +Đúng 5 dự án đó = đúng 5 dòng có địa chỉ trong file Excel nhập S55. **Nếu viết code auto-fill "mới" thì code sẽ chạy hoàn hảo và ô vẫn trống** — đây là lần **thứ 6** của lớp *cơ-chế đúng, thứ đi qua nó không có*. + +**Anh chốt hướng:** *"để người dùng cập nhật Master data rồi sau đó fill ra phiếu, cái nào không có thì không cần fill"* ⇒ **KHÔNG backfill hàng loạt**. + +**Vá (`6250f39`):** thêm dòng cảnh báo amber ngay dưới ô Địa điểm, chỉ hiện khi **đã chọn dự án** mà dự án đó **không có `location`** — nói thẳng lý do + trỏ chỗ bổ sung (Danh mục → Dự án → Địa điểm). Lý do làm vậy: ô trống im lặng khiến người dùng tưởng hệ-thống hỏng → đẻ báo lỗi giả (đúng ca vừa xảy ra). 4 file, **SHA256 mirror 2 app IDENTICAL**, npm build 2/2 PASS. + +**Deploy verified 2 NGUỒN ĐỘC LẬP:** +- `cicd-monitor` **PASS 9/9** (`cicd-verify-s157-diadiem.md`) — Run #419 success **5m40s**, test gate **562 (45D+517I)** khớp canonical cả 2 thành-phần, bundle rotate 2/2 + `Last-Modified` nằm trong cửa-sổ deploy, byte-marker **2/2 app** (count=2 = đúng 2 chỗ nhúng/app), **control âm**: hash bịa + hash cũ đều rơi về SPA shell 900B `text/html` ⇒ bundle cũ đã **biến mất khỏi đĩa**, deploy ghi đè thật. +- **Lead tự re-curl độc lập, KHỚP TỪNG BYTE:** admin `8-QYcMOg` 1.675.282 B LM 02:44:33Z · eoffice `DptYR4wL` 1.575.513 B LM 02:45:30Z · marker 2/2. + +--- + +## 5. Governance / harness + +- **`/tiep` S157** (window 4): Sàn-3 5 tín-hiệu — 3 kêu, cả 3 khớp WAL. `verify:` **5/5 KHỚP, 0 lệch**. Tick counter **30→31 CLEAN**. Thư cross-project `se=0 all=0` (**5/6 repo — `dyd` VẮNG trên máy**, fail-soft khai rõ). +- **`ctx-verifier` @`_tiep-3`** (vai-2 vòng Ctx): `CO-CO — 10 cờ`, return CLEAN. Nặng nhất: trần `_mind` **dư 110 B** ⇒ cửa sau phải nén **≥2 block** (MIND-2 + MIND-3) chứ không phải 1 — carry cũ under-state 2 lần; kèm hở luật *"nén block cũ nhất"* khi block cũ nhất **đã nén rồi**. Cờ **C3 đã vá trong cửa** (header CURRENT STATE còn ghi mốc S153 trong khi số đã bump tới S156). +- **`#53` (return garble) cửa S157 ×1** — `cicd-monitor` **tái phạm đúng dự đoán**: return = mẩu transcript giữa chừng, không phải verdict. **Cứu TRỌN 10.666 B từ đĩa** nhờ lead ép *ghi-từng-mục-trong-lúc-làm* ngay trong prompt. Củng cố datum: **chặn được #53 = ghi-đĩa-trong-lúc-làm, KHÔNG phải prompt-đúng**. +- **Vết lỗi lead @S156:** viết `run.md` **điền SẴN kết-quả cho lượt chạy CHƯA xảy ra** (byte-count + `TOTAL=14 GAP` + verdict = bịa). Tự bắt ngay sau Write, sửa về `[ ]`. Cơ-chế = *quán-tính điền mẫu*; cứu nhờ **thói quen đọc lại thứ vừa Write**, không nhờ trí nhớ ⇒ chốt chặn phải là **luật soi được**. +- **Memory mới:** `.claude/auto-memory/feedback_mechanism_right_data_absent.md` — lớp *cơ-chế đúng / dữ-liệu không có*, nay ×6, kèm luật *"UAT báo không chạy ⇒ ĐO DỮ LIỆU PROD trước"*. + +--- + +## 6. CÒN TREO sang phiên sau + +| # | Việc | Chờ ai | +|---|---|---| +| 1 | 6 việc sửa bản invest → trình anh 14 câu → Q1-Q6 | em làm, rồi anh trả lời | +| 2 | Lỗ hổng an ninh duyệt HĐ | anh xếp ưu tiên (*"cứ từ từ"*) | +| 3 | 4 lỗ "cột CÓ mà 0 ai đọc" (L1 cầu PE→HĐ bỏ pin V2 · L2 `CeoApprovalThreshold` 0-consumer phía HĐ · L3 SLA hardcode `AddDays(7)` · L4 `AttachmentPurpose` sai tầng) | em | +| 4 | 22 FLAG governance (42)(43)(44)(E2) — **4 cửa-sổ chưa động** | anh | +| 5 | Trần `_mind` — nén ≥2 block hay nâng `mind_ctx_kb` | anh | +| 6 | `reviewer/MEMORY.md` 19.049 B trên ngưỡng 17.1 KB | em curate | +| 7 | Monthly drift-audit **2026-08-01** | em (session đầu tháng) |