wal: flush 20260810 S188 dot-1 run-trace + governance state

This commit is contained in:
pqhuy1987
2026-08-10 18:20:40 +07:00
parent bc309c559c
commit 5a77f4f127
65 changed files with 3352 additions and 96 deletions

View File

@ -1,21 +1,13 @@
# Implementer-Backend Agent — Persistent Memory
- **S187 (2026-08-10) lane W1-GREEN — gỡ 2 bom per-type cho type-3 HĐ `[31/31 xanh · build 0/0 · 0-mig; artifact `runs/2026-08-10-S187-duyet-hd-tu-khkk/sub-implementer-backend-w1green.md`]`:** Nghề ăn tiền = **ĐỌC ASSERT ĐỂ CHỌN HÌNH VÁ, đừng nhận hình từ đề bài**: đề (và test-doc) gợi hình (a) *"thêm trường tập hợp chứa MỌI bản active cạnh `Active`"* — nhưng test đo kênh-đương-nhiệm bằng **REFLECTION duyệt MỌI property ≠ `History`** ⇒ hình đó **ĐỎ VÌ ĐÔI** (`BeEquivalentTo` = song ánh 7↔7; `ContainSingle` cho type-1 thành 2). Chọn **phân hoạch**: `Active` giữ **≡ giá trị cũ từng byte** (`versions.FirstOrDefault(IsActive)``actives.FirstOrDefault()`) + `ActiveOthers` = **phần CÒN LẠI** (`Skip(1)`) ⇒ xanh cả 2 ca **và** 0 rủi ro FE. Bác hình "để `Active=null` khi >1 active": FE đọc thẳng `t.active` (`ApprovalWorkflowsV2Page.tsx:381-389/455-479`) mà **type-10 KHKK HÔM NAY đã 8 active** ⇒ đó là đổi hành vi ĐANG CHẠY, không phải vá. Vá bom-2 **CỐ Ý không hỏi type** (đếm actives) ⇒ tự đúng cho family sau này, và control xanh vì **dữ liệu thật** (type-1 chỉ 1 active) chứ không vì khai riêng cho nó. Bom-1: ternary 1-type → **mảng TYPE tường minh** `PerCodeDeactivationTypes` (R-6 cấm regex trên `Code`). Comment tự-khai "1 active/type là bất biến" hỏng vì **neo con số** ⇒ viết lại **neo TẬP TYPE** + ghi vết vì sao câu cũ hỏng. Đa-lane: **KHÔNG `git stash` để đối chứng** (thao tác toàn-cây, nuốt việc lane khác) — chuỗi nhân-quả dựng bằng *RED-đã-ghi + file chưa ai chạm + chỉ tôi sửa*; số ĐO **SAU byte cuối**. Tag `[s187, w1-green, reflection-assert-chon-hinh-va, phan-hoach-thay-tap-hop, neo-tap-type-khong-neo-so, khong-stash-da-lane]`
- **S180 (2026-08-07) lane W3 — nghi thức 2 đầu: 4 nhãn + vòng hỏi ngược + tiền-kiểm 9/19 + gói-B persona `[#53 vai thứ 20; cứu TRỌN nhờ ghi-đĩa-từng-phần — lead resume, xong nốt]`:** Nghề ăn tiền = **KHAI ĐÚNG NẤC CƯỠNG CHẾ**: ký 4/4 nhãn thành văn nhưng đo lại thì **1 có máy đủ · 2 nửa · 1 (`bị chặn`) CHƯA CÓ MÁY** — vị từ `(3)` cho **cùng một số** với *trỏ đặc tả**trỏ nỗ lực gỡ*, không phân biệt được ⇒ khai thẳng thay vì để nó trông như đã cưỡng chế (LỚP-9). 🔴 **Bác đề bài 1 chỗ, đứng:** khung *"chỉ bỏ-qua-KHÔNG-khai mới là lỗi"* ⊥ chữ hub (`phu-luc:189` tính cả ca **CÓ KHAI mà điều kiện đánh-giá-lại ra SAI***tự ý bỏ*) ⇒ nhận khung đó thì **một dòng khai là tự tha được**; ký theo hub + luật *`không-xác-định` rơi về nhãn NẶNG* (mặc-định-vô-tội = thưởng cho đặc tả mơ hồ). 🔴 **Bác lane F:** `check-email` bị đếm là 1 trong "6 cửa gọi `nhip-no-probe`" — đĩa nói **2 hit đều là NHẮC TÊN, 0 lời gọi** ⇒ tập đúng = 5. Sửa lane C 4/19→**5/19** (`snapshot:69` đóng từ 🟡 sang CÓ). 🔴 **Fault-inject lượt ĐẦU chết vì HARNESS:** viết inline qua bash ⇒ bash nuốt `$`/backtick của chuỗi PS ⇒ WAL "lành" không bao giờ ghi đúng ⇒ chiều B kêu **trông y hệt script hỏng**; dựng harness thành `.ps1` riêng ⇒ 5/5. **Tự bắt citation-trap vòng 1** (ghi chú vá trích nguyên cụm số cũ ⇒ grep vẫn =1), vòng 2 diễn-giải ⇒ 0, re-grep bằng lệnh KHÁC. Wall-clock ĐO TRƯỚC khi cắm (luật `check-email.md:41`): ròng **194ms < 281ms** đã-chấp-nhận ⇒ **vẫn KHÔNG cắm vào `/pause`·`/tiep`** (đã có probe). Tag `[s180, w3-nghi-thuc, khai-dung-nac-cuong-che, khai-khong-tu-mien-tru, use-vs-mention-lane-f, harness-hong-trong-nhu-script-hong, do-truoc-roi-noi-khong]`
- **S180 (2026-08-07) lane W2 — dựng máy điểm danh vật chứng (4 vị từ · fault-inject 3 chiều · ca-N1 BẮT) `[#53 vai thứ 19; cứu TRỌN nhờ ghi-đĩa-từng-phần — lead resume, xong nốt]`:** Nghề ăn tiền = **ĐO PHÂN BỐ TRƯỚC KHI CHỌN NGƯỠNG**: K của vị-từ-tỉ-lệ lấy = **phân vị 5 đo thật trên 446 tệp họ `sub-*`** (K=3,00), KHÔNG chỉnh cho vừa ca đã biết — ca N1 rơi ở phân vị 3,6, **lọt lưới sát nút** ⇒ khai thẳng *"vị từ này là lưới PHỤ"* thay vì hạ K xuống 2,7 (= Goodhart). Vị từ CHÍNH = **nhãn treo NEO VÀO HEADING** (tách *dùng**nhắc đến*): thô cho **1 dương-giả trên chính bản đã xong** (câu định nghĩa nhãn) — neo heading ⇒ 6/0. 🔴 **Bẫy thước tự bắt:** `grep '[^\x00-\x7F]'` Git-Bash cho **268 hit trên tệp biết-là-sạch****control âm sai = hỏng THƯỚC**, phải đọc byte bằng .NET. 🔴 **Bác lệnh lead 1 chỗ, đúng:** spec bảo `git show HEAD~1:<file>` — hook `wal:` chèn commit giữa ⇒ HEAD~1 **không phải bản trước CỦA TỆP**, phép so thành *so bản mới với chính nó***trông y hệt phép đo hợp lệ**; dùng `git log -2 -- <file>`. **Quét toàn kho lộ 2 lớp dương-giả (294→31 cờ):** con-trỏ CHÉO giữa lượt chạy (README bắt trỏ `input spec:` sang lượt trước) = lỗi MÁY không phải nợ kho ⇒ phân giải toàn cây; `KHONG-KHAI` 245/720 = cờ cho **luật chưa từng tồn tại****hạ xuống hạng-mục-đếm-riêng NHƯNG GIỮ SỐ + mẫu số** (phép thử *"cái mất đi là dương-giả hay CHỨNG-NHÂN?"*). Vá đến SAU test ⇒ **chạy lại trọn 3 chiều**. Tag `[s180, w2-artifact-integrity, do-phan-bo-truoc-chon-nguong, neo-heading-use-vs-mention, control-am-sai-la-hong-thuoc, headn-khong-phai-ban-truoc, giu-so-bo-co]`
- **S180 (2026-08-07) lane W1-b — ký chuẩn đặt tên + dựng máy soi (11/11 ràng buộc · 3/3 vá · fault-inject 4 lượt/3 chiều) `[#53 vai thứ 18/phiên; cứu TRỌN nhờ ghi-đĩa-từng-phần — artifact 21KB đủ ruột TRƯỚC khi return chết; lead resume, xong nốt]`:** Nghề mới ăn tiền = **LUẬT NẤC: "một nhóm tên sạch CHÍNH XÁC tới độ sâu máy của nó KIỂM, không sâu hơn một nấc"** ⇒ mỗi mục chuẩn PHẢI khai nấc + trỏ máy ép đúng nấc đó; nhóm không máy ⇒ ghi `CHƯA CÓ MÁY`, **CẤM ký luật hình dạng** (ký sâu hơn máy = ký ra thứ tự nó trôi). Hệ quả 2: máy chỉ-ĐỌC (`detectors:1109` liệt-không-cờ) hoặc THA (`:1660` `-or` chấp 2 tên) ⇒ tên vẫn trôi — **nhưng KHÔNG cần STOP-HARD**: `:1639` chỉ in INFORM mà nhóm sạch 12/12. 🔴 **Tự bắt mình tái phạm citation-trap:**`hmw.js:33` bỏ số "11 class", bản vá ĐẦU **trích nguyên văn** cụm cũ ⇒ grep vẫn =1 ⇒ bài học **lời-giải-thích nằm TRONG tập đo**; vòng 2 mới =0 (control-dương 2 chuỗi cùng tệp). **Bác 3 chỗ, 3/3 đứng:** (a) lane a "23 lệch" → tôi đo **8/233** (16 script `s<n>-`/`plan-`*một-lần HỢP LỆ*, gọi lệch = **dương-giả**, mà dương-giả ngày đầu là cách nhanh nhất để người ta tắt máy soi; +1 vật lane a sót `resume-S146`); (b) lead tả bản vá S159 = `(sub|harness)-*` → đĩa thật `^(sub-.+|.+-return)\.md$` (bộ ba lọt qua nhánh `-return`, KHÔNG qua tiền tố) — mirror theo *diễn giải* sẽ đẻ **bản sao thứ 3 lệch nhau**; (c) `wave-plan:85` kê W3 sửa "5 class"→**6** = đúng LỚP-5 vừa gỡ, phải **BỎ SỐ** không đổi số. Bẫy đơn-vị cắn thật: `scripts/`+`docs/governance/` đếm theo **MỤC** (gồm thư mục) ≠ **TỆP** ⇒ lệch 4; và tự mình đẻ 2 vật giữa lượt ⇒ 231→233, phải KHAI. Phát hiện mới ngoài lane a: `settings.json:2` `autoMemoryDirectory` = **đường dẫn TUYỆT ĐỐI** neo cả tên thư mục lẫn gốc kho (lane a chỉ liệt `:9`). Tag `[s180, w1b-naming-standard, luat-nac, citation-trap-tu-bat, duong-gia-vs-chung-nhan, muc-vs-tep, inform-only-exit0]`
- **S171 (2026-08-04) lane BE — `7/7 mục, build PASS`, return SẠCH `[LEAD HARVEST HOI-TO @S172 — no mo tu closeout truoc; owner slot (71) chot 'gom va sleep thi auto, tu quyet'. Nguon = artifact tren dia, KHONG suy dien]; nguồn `runs/2026-08-04-S171-khkk-ui-mirror-pe/sub-implementer-backend-s171.md` 11.650 B`:** BE-1 DetailDto +5 field · **BE-1b `FinalizeStepName`/`FinalizeLevelName` DẪN XUẤT 3-ngả in-memory thay 3 subquery** (+ sửa công thức con-trỏ cho đúng KHKK) · BE-2 `ContractSigningPlanApprovalDto` đẻ mới + projection · **BE-3 tên người duyệt join `Users` — đường THỨ BA** (2 đường kia không dùng được, lý do §2) · BE-4 `WorkflowStepDto` +`DepartmentName` · BE-5 endpoint changelogs policy `KeHoachKyKet.Read` **+ rào `EnsureCanViewAsync`** · BE-6 map Cấp cho Approvals · **BE-7 enum `+ApprovalAttachment=3` + endpoint upload riêng (policy `Update`)**. Mirror `types/khkk.ts` ×2 app **SHA256 trùng khít**; `dotnet build` 0 warning/0 error + `tsc -b` ×2 exit 0. 🔴 **Tự khai 3 chỗ lệch-có-lý-do + treo B-3 vì DB dev 0 phiếu** — nấc trung thực đúng: *làm được thì khai làm được, không đo được thì khai treo*, KHÔNG nhét acceptance runtime vào ô đã-xong. ⚠️ Hệ quả @S172: chính `ApprovalAttachment` + policy `Update` đẻ ra câu hỏi owner slot (67) — **người SOẠN cũng qua được `KeHoachKyKet.Update`**. Tag `[s171, be-7-7-build-pass, dan-xuat-thay-subquery, duong-thu-ba-join-users, treo-b3-trung-thuc]`
- **S167 (08-01) lane K7 — cầu KHKK→HĐ BE + 5 vá `[artifact sub-implbe-k7.md; return-1 garble #53 → lead SendMessage-resume, xong solo]`:** Bài lớn nhất = **BÁC TIỀN ĐỀ ĐỀ BÀI bằng 4 phép đo trước khi gõ**: lead nói "bridge ĐÃ TỒN TẠI (W6-S161), mày chỉ vá quanh nó" — đĩa nói KHÔNG (`grep create-contract` 1 hit duy nhất = bridge PE cũ · 0 file · 0 endpoint · 0 write-site `Line.ContractId`). Cái tồn tại @W6**đường-ống HĐ V2**, không phải cầu ⇒ lead nhập nhằng "đường ống đã vá"≠"bridge có". **Phép thử rẻ phân biệt:** vá-6 ("nạp Project.Code/Supplier.Code theo khuôn bridge-cũ") là **no-op nếu áp lên bridge cũ** (nó ĐÃ có 2 dòng đó) ⇒ vá chỉ có nghĩa với vật CHƯA có ⇒ suy ngược ra vật thiếu. Xử: DỰNG bridge theo spec invest §K7.1 đã pin sẵn (0 quyết-định-mới của tôi) + nhúng 5 vá, KHAI RÕ chệch-khuôn + trỏ dòng spec — lead nhận. Khi **spec vá ⊥ nền invest** (`WorkflowDefinitionId` null vs pin) → **vá THẮNG** (spec `:4` viết luật đó). Cột đã có từ mig cũ ⇒ **0-mig**. `??=` giữ CHIỀU: cầu chạy sau không cướp ô của cầu trước. Thêm field vào projection dùng-chung-3-endpoint → **chạy test filter rẻ ngay** (collection-subquery SQLite dịch được: 34/35). 1 fail = reflection-authz test bắt mọi action phải cùng key module, mà vá-1 cố ý gate key MODULE KHÁC (`Contracts.Create`, #85) ⇒ **verified-fail bàn giao test-lane, KHÔNG tự sửa** (S112 khuôn). Tag `[s167, k7-bridge-khkk-hd, bac-tien-de-4-phep-do, va-noop-suy-nguoc-vat-thieu, spec-thang-nen, 0-mig, verified-fail-handoff]`
- **S166 (08-01) lane K4a — 49 row menu KHKK 8-nhóm, DONE B0-B5 `[LEAD SEED ON-BEHALF TẠI-CỬA — mày #53 sau B5 ("Now the site-4 revoker comment" trong khi comment ĐÃ land — return tụt sau đĩa 1 nhịp); B6 + END lead đóng; nguồn: sub-implbe-k4a.md + git diff]`:** Nghề mới ăn tiền: **BỘ-SINH thay 49 const tay**`KhkkGroupNumbers[7] × (KhkkGroup + 6 KhkkLeafActions)``KhkkGroupMenuKeys` làm NGUỒN CHUNG 3 phía (spread `.. ` vào `All` · vòng seed tree.Add · site-2 `.Concat`) ⇒ khớp **by-construction, 0 mirror tay 147 chuỗi** (đúng loại drift nổ FK Permission T6-K1); chệch-khuôn-so-brief KHAI RÕ + trỏ đề xuất gốc invest `:9` ⇒ lead chấp nhận không mất lượt. Anchor re-ground TRƯỚC khi sửa (số spec trượt vì DbInitializer phình sau K2/K3): dict labelBackfill `:2141-2183` · upsert THẬT `:2162-2179` (vá 2 comment stale "1893" bằng mỏ-neo GREP `existingItems.TryGetValue` thay số-dòng-trần — số dòng sẽ trượt tiếp, mỏ neo thì không). Vá-10 sửa LÝ-DO comment (group-key KHÔNG cần CanRead row — HasAccess đệ-quy theo con `:96`; invest doc viết sai lý-do, kết luận giữ-3-site vẫn đúng). labelBackfill `Khkk_G1` đổi-nhãn-không-nhân-row + fail-fast KeyNotFound khi thiếu nhãn (thà nổ lúc seed còn hơn FK nổ về sau). Suite **614/0 SAU diff** (idempotent/revoke/permission-seed giữ xanh). Tag `[s166, k4a-lane, bo-sinh-by-construction-3-phia, mo-neo-grep-thay-so-dong, fail-fast-luc-seed, return-tut-sau-dia-1-nhip, seed-on-behalf-tai-cua]`
- **S161 (07-29) ARC W1+W2+W3đ1 KHKK — 3 lượt/3 wave, chi tiết = sub-md run-folder `runs/2026-07-29-S161-khkk-{w1-schema,w2-crud,w3-duyet}/` (tổng ~47KB ghi-từng-mục; cả 3 lượt return #53 nhưng 0 mất):** **W1** Mig 69 7-bảng (UNIQUE filtered #57 · cascade-1-hop · apply 2 DB 0-drift · sys.tables 96) + seeder `SeedKeHoachKyKetAccessAsync` UPGRADE-if-exists+CanDelete + CodeGen `KHKK/{YYYY}/{Seq:D3}` WorkflowAppCodeSequences + 3 site AWV2Admin — ship `a8027c0` cicd 6/6. **W2** mega-file CRUD 15-endpoint policy-15/15 + 4 quyết D1-D4 khai-lead-duyệt; 5 bẫy né ghi sổ: codegen-TRƯỚC-Add (S88) · SUM so `w.Id` KHÔNG `w.SupplierId` · `Remove` trước `Add(changelog)` (T26) · subquery-Any-2-tầng vỡ-SQL-lúc-chạy · giao-1-grep-cùng-lớp-ra-3 (S122) — ship `6cbc6ad` cicd 6/6 (reviewer 12F: D1 "FE sẽ khớp" = giả-định-không-phải-phép-đo → 6 điểm đứt, lead vá). **W3đ1** skeleton test-before: switch-throw từng nhánh (đỏ-THẬT không đỏ-compile) + **rào-FK-547-bằng-VẮNG-MẶT-dep** (không inject IChangelogService) + **§6 tự đối-chứng chéo hợp-đồng FE 5/5 TRƯỚC bàn giao** (bài W2 → nghi thức) + §7 bàn-giao ctor-CUỐI. Tag `[s161, khkk-w1-w2-w3d1, mig69, upgrade-if-exists, rao-vang-mat-dep, doi-chung-cheo, gia-dinh-vs-phep-do]`
- **S139 (07-17) Governance wave adap-3-bản 2-lane [wf_f9981ae5-903 · L1 CLEAN · L2 #53-garble → sub-1.md ON-BEHALF em-main verify-2-nguồn] `[engine: opus-worker]`:** L1 = MASTER-CHECKLIST 2-tầng in 4 cửa (ss Phase-3 · se Phase-4 "TỔNG-HỢP CHỐT" · pause ý-6 · tiep §3-bis bold-block KHÔNG heading) + C1 2-câu đóng-băng bề-mặt-đo (§L.b(c) prepend + mirror §2.1.2) + C6i do-record ×2 + luật-số sàn-5 §L.b(j)(iv) — PASS 6/6 (heading 26/28/7/14 bất-biến · 0 checklist-file mới · BƯỚC-0 intact ×8 · 10/10 config-token preserved · add-only 26+/2). L2 = +C6 cite-2-nấc + H24-4 pending-flip vào governance-detectors.ps1 (+260/0 add-only) — fault-inject **13/13 2-chiều** (C6 7/7 lane chạy; H24-4 6/6 em-main hoàn tất — lane chết GIỮA fix harness-bug), live-run TOTAL 45 GIỮ + 2 net mới 0-flag count-riêng + exit-0 + ASCII 0-byte>127 + clean-diff 0-FOREIGN-line. Learned: (1) heading-invariant proof = block chèn toàn `>`/bullet + `grep '^+#'`=none (mạnh hơn đọc-mắt, họ insertion-only S134); (2) test-harness PS1 cần CÙNG kỷ-luật naming như production — bẫy `$h`/`$H` case-insensitive cắn chính harness dù script-đích đã né (`:813`); (3) 2 lane cùng chạm bề-mặt-đo (L1 sửa file nằm trong scan-scope L2) → số đo giữa-chừng trôi, clean-diff PHẢI cùng-snapshot. Tag `[s139, adap-3-ban, master-checklist-4-cua, c6-cite-2-nac, h24-4-pending-flip, faultinject-13-13, 53-writelane-onbehalf]`
- **S133+S134 (07-17) PE budget-freeze BE (Mig 67) + lũy kế TẠM TÍNH BE** → 📦 verbatim dời `archive/2026-07.md` (@S161 curate, moved-not-cut). Giữ hook: insertion-only-diff = proof thân-bất-động · backfill `Sql()` plain KHÔNG provider-guard (Mig 61/65/67 khuôn) · `TransitionAsync` KHÔNG SaveChanges nội bộ `:537` · Dev drift committed-chưa-apply → catch-up. Tag `[s133, s134, mig67, computepending, moved-l2]`
> **Persistent diary cross-session.** Auto-injected first ~200 lines at spawn (L1 HOT).

View File

@ -17,3 +17,10 @@
## @S152 R1 retention-note [moved-not-cut @S185 refine-A1, verbatim]
- **Integration testing multiple components = việc `test-specialist`, KHÔNG phải mình** — mình scaffold + compile-check; assertion/integration test cross-component (SQLite fixture, authz regression) do test-specialist own (tiền lệ S67 HRM test-after +23, S69 +20 đều test-specialist). Nhận viết integration test = double-touch tests/ sai split. Tag `[s152, r1-retention, refuse-integration-testing-components]`
## @S187 curate — 2 entry dời từ L1 (hook read-limit-guard bắn @23.7KB; moved-not-cut, verbatim)
- **S161 (07-29) ARC W1+W2+W3đ1 KHKK — 3 lượt/3 wave, chi tiết = sub-md run-folder `runs/2026-07-29-S161-khkk-{w1-schema,w2-crud,w3-duyet}/` (tổng ~47KB ghi-từng-mục; cả 3 lượt return #53 nhưng 0 mất):** **W1** Mig 69 7-bảng (UNIQUE filtered #57 · cascade-1-hop · apply 2 DB 0-drift · sys.tables 96) + seeder `SeedKeHoachKyKetAccessAsync` UPGRADE-if-exists+CanDelete + CodeGen `KHKK/{YYYY}/{Seq:D3}` WorkflowAppCodeSequences + 3 site AWV2Admin — ship `a8027c0` cicd 6/6. **W2** mega-file CRUD 15-endpoint policy-15/15 + 4 quyết D1-D4 khai-lead-duyệt; 5 bẫy né ghi sổ: codegen-TRƯỚC-Add (S88) · SUM so `w.Id` KHÔNG `w.SupplierId` · `Remove` trước `Add(changelog)` (T26) · subquery-Any-2-tầng vỡ-SQL-lúc-chạy · giao-1-grep-cùng-lớp-ra-3 (S122) — ship `6cbc6ad` cicd 6/6 (reviewer 12F: D1 "FE sẽ khớp" = giả-định-không-phải-phép-đo → 6 điểm đứt, lead vá). **W3đ1** skeleton test-before: switch-throw từng nhánh (đỏ-THẬT không đỏ-compile) + **rào-FK-547-bằng-VẮNG-MẶT-dep** (không inject IChangelogService) + **§6 tự đối-chứng chéo hợp-đồng FE 5/5 TRƯỚC bàn giao** (bài W2 → nghi thức) + §7 bàn-giao ctor-CUỐI. Tag `[s161, khkk-w1-w2-w3d1, mig69, upgrade-if-exists, rao-vang-mat-dep, doi-chung-cheo, gia-dinh-vs-phep-do]`
- **S139 (07-17) Governance wave adap-3-bản 2-lane [wf_f9981ae5-903 · L1 CLEAN · L2 #53-garble → sub-1.md ON-BEHALF em-main verify-2-nguồn] `[engine: opus-worker]`:** L1 = MASTER-CHECKLIST 2-tầng in 4 cửa (ss Phase-3 · se Phase-4 "TỔNG-HỢP CHỐT" · pause ý-6 · tiep §3-bis bold-block KHÔNG heading) + C1 2-câu đóng-băng bề-mặt-đo (§L.b(c) prepend + mirror §2.1.2) + C6i do-record ×2 + luật-số sàn-5 §L.b(j)(iv) — PASS 6/6 (heading 26/28/7/14 bất-biến · 0 checklist-file mới · BƯỚC-0 intact ×8 · 10/10 config-token preserved · add-only 26+/2). L2 = +C6 cite-2-nấc + H24-4 pending-flip vào governance-detectors.ps1 (+260/0 add-only) — fault-inject **13/13 2-chiều** (C6 7/7 lane chạy; H24-4 6/6 em-main hoàn tất — lane chết GIỮA fix harness-bug), live-run TOTAL 45 GIỮ + 2 net mới 0-flag count-riêng + exit-0 + ASCII 0-byte>127 + clean-diff 0-FOREIGN-line. Learned: (1) heading-invariant proof = block chèn toàn `>`/bullet + `grep '^+#'`=none (mạnh hơn đọc-mắt, họ insertion-only S134); (2) test-harness PS1 cần CÙNG kỷ-luật naming như production — bẫy `$h`/`$H` case-insensitive cắn chính harness dù script-đích đã né (`:813`); (3) 2 lane cùng chạm bề-mặt-đo (L1 sửa file nằm trong scan-scope L2) → số đo giữa-chừng trôi, clean-diff PHẢI cùng-snapshot. Tag `[s139, adap-3-ban, master-checklist-4-cua, c6-cite-2-nac, h24-4-pending-flip, faultinject-13-13, 53-writelane-onbehalf]`

View File

@ -0,0 +1,10 @@
# Archive 2026-08 — implementer-backend (L2, moved-not-cut từ L1 @S187 curate)
> Verbatim entries dời khỏi MEMORY.md L1 khi hook read-limit-guard bắn (@23.7KB / cap 24.4KB). KHÔNG nén — nguyên văn. Mới→cũ.
- **S171 (2026-08-04) lane BE — `7/7 mục, build PASS`, return SẠCH `[LEAD HARVEST HOI-TO @S172 — no mo tu closeout truoc; owner slot (71) chot 'gom va sleep thi auto, tu quyet'. Nguon = artifact tren dia, KHONG suy dien]; nguồn `runs/2026-08-04-S171-khkk-ui-mirror-pe/sub-implementer-backend-s171.md` 11.650 B`:** BE-1 DetailDto +5 field · **BE-1b `FinalizeStepName`/`FinalizeLevelName` DẪN XUẤT 3-ngả in-memory thay 3 subquery** (+ sửa công thức con-trỏ cho đúng KHKK) · BE-2 `ContractSigningPlanApprovalDto` đẻ mới + projection · **BE-3 tên người duyệt join `Users` — đường THỨ BA** (2 đường kia không dùng được, lý do §2) · BE-4 `WorkflowStepDto` +`DepartmentName` · BE-5 endpoint changelogs policy `KeHoachKyKet.Read` **+ rào `EnsureCanViewAsync`** · BE-6 map Cấp cho Approvals · **BE-7 enum `+ApprovalAttachment=3` + endpoint upload riêng (policy `Update`)**. Mirror `types/khkk.ts` ×2 app **SHA256 trùng khít**; `dotnet build` 0 warning/0 error + `tsc -b` ×2 exit 0. 🔴 **Tự khai 3 chỗ lệch-có-lý-do + treo B-3 vì DB dev 0 phiếu** — nấc trung thực đúng: *làm được thì khai làm được, không đo được thì khai treo*, KHÔNG nhét acceptance runtime vào ô đã-xong. ⚠️ Hệ quả @S172: chính `ApprovalAttachment` + policy `Update` đẻ ra câu hỏi owner slot (67) — **người SOẠN cũng qua được `KeHoachKyKet.Update`**. Tag `[s171, be-7-7-build-pass, dan-xuat-thay-subquery, duong-thu-ba-join-users, treo-b3-trung-thuc]`
- **S167 (08-01) lane K7 — cầu KHKK→HĐ BE + 5 vá `[artifact sub-implbe-k7.md; return-1 garble #53 → lead SendMessage-resume, xong solo]`:** Bài lớn nhất = **BÁC TIỀN ĐỀ ĐỀ BÀI bằng 4 phép đo trước khi gõ**: lead nói "bridge ĐÃ TỒN TẠI (W6-S161), mày chỉ vá quanh nó" — đĩa nói KHÔNG (`grep create-contract` 1 hit duy nhất = bridge PE cũ · 0 file · 0 endpoint · 0 write-site `Line.ContractId`). Cái tồn tại @W6**đường-ống HĐ V2**, không phải cầu ⇒ lead nhập nhằng "đường ống đã vá"≠"bridge có". **Phép thử rẻ phân biệt:** vá-6 ("nạp Project.Code/Supplier.Code theo khuôn bridge-cũ") là **no-op nếu áp lên bridge cũ** (nó ĐÃ có 2 dòng đó) ⇒ vá chỉ có nghĩa với vật CHƯA có ⇒ suy ngược ra vật thiếu. Xử: DỰNG bridge theo spec invest §K7.1 đã pin sẵn (0 quyết-định-mới của tôi) + nhúng 5 vá, KHAI RÕ chệch-khuôn + trỏ dòng spec — lead nhận. Khi **spec vá ⊥ nền invest** (`WorkflowDefinitionId` null vs pin) → **vá THẮNG** (spec `:4` viết luật đó). Cột đã có từ mig cũ ⇒ **0-mig**. `??=` giữ CHIỀU: cầu chạy sau không cướp ô của cầu trước. Thêm field vào projection dùng-chung-3-endpoint → **chạy test filter rẻ ngay** (collection-subquery SQLite dịch được: 34/35). 1 fail = reflection-authz test bắt mọi action phải cùng key module, mà vá-1 cố ý gate key MODULE KHÁC (`Contracts.Create`, #85) ⇒ **verified-fail bàn giao test-lane, KHÔNG tự sửa** (S112 khuôn). Tag `[s167, k7-bridge-khkk-hd, bac-tien-de-4-phep-do, va-noop-suy-nguoc-vat-thieu, spec-thang-nen, 0-mig, verified-fail-handoff]`
- **S166 (08-01) lane K4a — 49 row menu KHKK 8-nhóm, DONE B0-B5 `[LEAD SEED ON-BEHALF TẠI-CỬA — mày #53 sau B5 ("Now the site-4 revoker comment" trong khi comment ĐÃ land — return tụt sau đĩa 1 nhịp); B6 + END lead đóng; nguồn: sub-implbe-k4a.md + git diff]`:** Nghề mới ăn tiền: **BỘ-SINH thay 49 const tay**`KhkkGroupNumbers[7] × (KhkkGroup + 6 KhkkLeafActions)``KhkkGroupMenuKeys` làm NGUỒN CHUNG 3 phía (spread `.. ` vào `All` · vòng seed tree.Add · site-2 `.Concat`) ⇒ khớp **by-construction, 0 mirror tay 147 chuỗi** (đúng loại drift nổ FK Permission T6-K1); chệch-khuôn-so-brief KHAI RÕ + trỏ đề xuất gốc invest `:9` ⇒ lead chấp nhận không mất lượt. Anchor re-ground TRƯỚC khi sửa (số spec trượt vì DbInitializer phình sau K2/K3): dict labelBackfill `:2141-2183` · upsert THẬT `:2162-2179` (vá 2 comment stale "1893" bằng mỏ-neo GREP `existingItems.TryGetValue` thay số-dòng-trần — số dòng sẽ trượt tiếp, mỏ neo thì không). Vá-10 sửa LÝ-DO comment (group-key KHÔNG cần CanRead row — HasAccess đệ-quy theo con `:96`; invest doc viết sai lý-do, kết luận giữ-3-site vẫn đúng). labelBackfill `Khkk_G1` đổi-nhãn-không-nhân-row + fail-fast KeyNotFound khi thiếu nhãn (thà nổ lúc seed còn hơn FK nổ về sau). Suite **614/0 SAU diff** (idempotent/revoke/permission-seed giữ xanh). Tag `[s166, k4a-lane, bo-sinh-by-construction-3-phia, mo-neo-grep-thay-so-dong, fail-fast-luc-seed, return-tut-sau-dia-1-nhip, seed-on-behalf-tai-cua]`