wal: flush 20260807T1357

This commit is contained in:
pqhuy1987
2026-08-07 13:57:44 +07:00
parent c7248b5bc1
commit d8c107c888
5 changed files with 380 additions and 78 deletions

View File

@ -1,28 +1,28 @@
# Investigator-Codebase Agent — Persistent Memory
- **S171 (2026-08-04) ×Fable-5 — `VERDICT = 27 giống-được / 6 buộc-khác / 8 data-gap`, 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-investigator-codebase-invest-s171.md` **44.830 B** (artifact lớn nhất phiên)`:** Cấu trúc 8 mục: **§0 hai đính-chính vào ground-truth của LEAD (đặt TRƯỚC §1 — nghề đúng: bác tiền-đề trước khi xây trên nó)** · §1 bản-đồ 3 panel PE mẫu · §2 bản-đồ KHKK hiện trng · §3 bảng DELTA per-panel · §4 data-gap · §5 kiến-trúc đề-xuất · §6 rủi-ro/bẫy · §7 checklist ĐO ĐƯỢC · §8 ba câu muốn lead đọc kỹ nhất. 🔴 **Bị 3 lane `reviewer` soi ngay sau đó và KHÔNG đứng trọn:** miễn-trừ **6 → 3** (P1-4 + P2-7 lật thành giống-được; P3-12 hạ xuống hoãn vì tiền-đề *'KHKK 3 trạm ngắn'* đo lại là **SAI**`DbInitializer.cs:554` = 3 Bước × ≤2 Cấp, seed tự ghi *'sao từ workflow Duyệt NCC prod'*), và **6 acceptance của nó bị bẻ gãy khi chạy thật**. ⇒ **Bài: bản invest 44 KB rất đầy đủ vẫn KHÔNG thay được lượt reviewer đối-kháng** — đầy-đủ ≠ đúng. Tag `[s171, fable-5, 27-6-8, dinh-chinh-ground-truth-truoc, mien-tru-6-xuong-3, day-du-khong-bang-dung]`
> **Persistent diary cross-session.** Auto-injected first ~200 lines at spawn (L1 HOT). Update BEFORE every stop; keep entries to 1 line (gotcha #53 truncation — index hit 28KB @S148, hard-cap 24.4KB). Detail → `archive/2026-07.md` + `archive/_INDEX.md` (sha-keyed substring, Ctrl-F) + git `d2f52ba` + `archive/2026-0{5,6}.md` + `runs/*/sub-*.md`. Renamed S39: investigator → investigator-codebase (internal; external → investigator-api).
> **Persistent diary cross-session.** Auto-injected first ~200 lines at spawn (L1 HOT). Update BEFORE every stop; keep entries to 1 line (gotcha #53 truncation — hook hard-cap 24.4KB, curate S180: 24.9→~13KB). Verbatim entry dài → `archive/2026-08-curate-s180.md` + `archive/2026-0{5,6,7}.md` + `archive/_INDEX.md` (substring, Ctrl-F) + `runs/*/sub-*.md`. Renamed S39: investigator → investigator-codebase (internal; external → investigator-api).
## 🎯 Role baseline
Read-only INTERNAL audit SOLUTION_ERP. Tools: Read/Grep/Glob/Bash + 5 RAG MCP. Output: concise <500w + file:line. Skills: contract-workflow + permission-matrix + ef-core-migration.
- MINE: sqlcmd schema scan, EF/grep, controller/authz audit, migration diff, count grounding
- NOT: external docs/CVE/lib investigator-api · write implementer · test test-specialist · architecture decision em main
## 📌 Recent invest (1-line digest; full detail → archive/runs/git)
- **S160 (07-29) DRY-RUN toàn-trình đến cứng 2 lane `/fable-real` [engine-label real-fable-S160; lane-2 lượt-1 #53 garble resume sạch, đĩa mất 0 B] [`runs/2026-07-29-S160-khkk-dryrun-plan/sub-investigator-codebase-{1,2}.md` 24.2K+32.2K]:** Lane-1 nguồn: ranh GĐ3=b.13→18/GĐ4=b.19→21 ĐÃ ratify @S159 spec `:27` (đừng suy lại từ QT); RG-001 v02 CHỈ 4 viết tắt **codegen tự chế "MB"** (`ContractCodeGenerator.cs:25`, không gốc quy định); bản cứng vật SINH b.17-18 GĐ3 (GĐ4 hiển thị readonly phần không tạo); FO-002.01 tick-box 6 loại 7 ContractType; forms-spec = parse chính v02, 0 lệch format. Lane-2 code: `Hdc_*` = **7-leaf-per-ContractType** (loop `DbInitializer.cs:1862-1867`) KHÔNG phải 6-leaf đề bài lead sai 2 grounding, lane tự bẻ; KHÔNG phase KyCung (8=DangDongDau LEGACY, terminal=DaPhatHanh 9 GĐ4 = DERIVE sau terminal, 0 mig); 🔴 `DeleteContract` guard `Phase >= DangInKy` so sánh SỐ chặn xóa cả 9/10/98/99 (dry-run rác phải admin-override hoặc chấp nhận); mặt tấn công thật = nhánh Reject-trước-guard `ContractWorkflowService.cs:49-66` (Approve guard); "khuôn PE per-action" KHÔNG tồn tại tầng attribute (PE class-trần + handler-Forbidden) tiền lệ per-action thật = `/deleted` `ContractsController.cs:28-29` + Suppliers; `Contracts` All 4 policy sống sẵn 0-key-mới. Lead đo bổ sung: **prod Contracts = 0 active + 0 deleted** (admin bypass `:298/:440` sổ "7 V1" S156 STALE); login prod parse field `accessToken` (không phải `token`). Đầu ra: plan-cha + 7 spec-wave (W1-W3,W5-W8; W4/W9 defer) cùng run-folder. Tag `[s160, dry-run-toan-trinh, hdc-7-leaf-per-type, delete-guard-numeric-compare, reject-truoc-guard, contracts-policy-co-san, mb-khong-goc, prod-contracts-0]`
- **S157 (07-28) KH-ký-kết-HĐ b.712 AB đĩa, §CD PENDING lượt sau, `runs/2026-07-28-S157-ke-hoach-ky-ket-hd/sub-invest-kehoach-1.md`]:** Owner chốt O-1 *"cấu trúc trình ký GIỐNG, khác nội dung"* tái dùng khung V2, dựng 7 bảng NỘI-DUNG `ContractSigningPlan*` (Mig 69 thuần CreateTable; mig cuối=68 verify ls) + `ApplicableType=10` (slot trống `ApprovalWorkflow.cs:53-67`). 🔴 Bẫy twin MỚI: **Proposal-lite ApproveV2 PHÁ OR-of-N** `ProposalFeatures.cs:427-439` flatten global-level + `ElementAtOrDefault` match 1-user, entity không StepIndex (`Proposal.cs:27`) 2-row-cùng-Order thành AND tuần tự; KH service PHẢI copy `ContractWorkflowService.ApproveV2Async:217-394`, Proposal chỉ làm khuôn CRUD/menu/FE. Twin đo thật: Proposal BE 849 · FE 1.956 LOC · 4 bảng (Mig 38 grep CreateTable) · PE 6.5K/14.9K cận trên. `ConflictException :115-116` tự xác minh đĩa (skill contract-workflow stale fallback V1 chỉ sống đường display). ISO doc 9 bước `ContractPhase` 1-9 khớp 1:1 (7 LEGACY = ISO mã-hoá cứng); khúc b.7-12 thiếu CẢ ISO-doc ln code; FO-002.01 luật auto-pass-quá-01-ngày (mâu thuẫn V2 no-auto-approve; O-2 SLA=tham-khảo). #53: coordinator chặn skeleton-rỗng @202K-token cắt còn §AB, Edit-liền-tay từng mục. Tag `[s157, ke-hoach-ky-ket, proposal-lite-breaks-or-of-n, iso-9-steps-eq-contractphase]`
- **S156 (07-27) BCH post-CEO flow bước 721 0-§36 đĩa, §4-§5 PENDING lượt sau, `runs/2026-07-27-S156-bch-post-ceo-flow/sub-invest-bch-1.md`]:** Verdict **LAI** 1321 TÁI DÙNG Contract (7 dòng `[LEGACY]` `ContractPhase.cs:11-13` chính trạm 13-21 đã gỡ CỐ Ý Mig21/S17; V2 `ContractWorkflowService.cs:217-394` cookie-cutter sẵn, terminal gen-mã+DaPhatHanh) · 7-12 DỰNG MỚI (0-hit shopdrawing/TVGS, khuôn 12-bis + `ApplicableType=10` append-only). 🔴 Chuỗi "cơ-chế đúng, thứ đi qua KHÔNG " phía HĐ: cầu PE pin V1 (`CreateContractFromEvaluationFeatures.cs:68-71,108`) không nhận V2 + UpdateDraft không re-pin · `GetEligiblePhases` (`ContractFeatures.cs:334-351`) + inbox `PhaseActorRoles` (`:363-372`) 100% LEGACY-phase approver V2/BCH KHÔNG xem/inbox được ChoDuyet · `CeoApprovalThreshold` 0-consumer (bước-18 ">5 tỷ" chưa có máy) · SLA V2 hardcode `AddDays(7)` 3 site, Step không có SlaDays · notify chỉ Drafter (`:407`) · `AttachmentPurpose` thiếu ký-nháy (enum-extend 0-mig tiền lệ PE=4) · HĐ TraLai reset-toàn-phần không 4-mode. Mig 68 `AddPeAllowApproverDelete` ĐÃ land 07-27 ⇒ mig kế = 69. Bắt lead sai grounding: 12 enum/7 LEGACY (lead ghi 9/6) — lead nhận. #53 strike-1 (return bốc hơi, đĩa nguyên → lead đọc từ đĩa, không redo). Tag `[s156, bch-post-ceo, verdict-lai, eligible-phases-legacy-only, bridge-pins-v1]`
- _(**S155 (07-27) PE xóa-phiếu màn DUYỆT [24 finding]** — DELETE sẵn+allow-list chặn ChoDuyet · soft-delete indirect #81-EXT · lũy kế 2-chỗ-ăn-số · git-khảo-cổ S60 gỡ nút Từ-chối. verbatim → `archive/2026-07.md` substring:"S155 (07-27) PE xóa-phiếu màn DUYỆT")_
- _(**S155 (07-27) PE xóa-phiếu FE/authz-slice [18 finding]** — PeWorkflowPanel byte-identical 2-app · plumbing xóa nối sẵn · `Pe_*` KHÔNG ∈ All ⇒ dùng root-policy `PurchaseEvaluations.Delete`. verbatim → `archive/2026-07.md` substring:"S155 (07-27) PE xóa-phiếu FE/authz-slice")_
- **S155 (07-27) PE menu/trash/dept-head [21 finding, `runs/2026-07-27-S155-pe-delete-approver/sub-invest-menu-3.md`]:** 🔴 Menu = **SEED DB** không hard-code FE — `Pe_<Code>` khai `DbInitializer.cs:1874-1877`; thêm mục = restart API, 0 migration (upsert `:1888-1914` chỉ sửa `Order`, **KHÔNG đụng Label** ⇒ rename qua `labelBackfill:1918-1924`; `DisplayLabel` **CHỈ ăn fe-user** `MenuDtos.cs:14`). 6-chỗ-mirror: +2 seed permission SONG SONG `:2092-2096`/`:2492-2496` + regex `Layout.tsx:120` (fe-admin `:107` thiếu `WfView`). Đổi KEY = mồ côi 13 row/key × 10 key ⇒ giữ key chỉ đổi label. **`Đã duyệt` chạy được HÔM NAY**: `phase=` đủ 3 tầng (`Controller:23``Features:565``:620`), DaDuyet=7 ⇒ `?type=1&phase=7`, 0 route mới. `pendingMe` KHÔNG phải param BE (FE rẽ `/inbox` `ListPage:61-68` + lọc client `:182`). `IgnoreQueryFilters` 0 src/Backend / 15 hit tests; `HasQueryFilter(`=12. An-toàn accumulator = **cấu trúc** (`PeBudgetAccumulator.cs:42`/`:100` dựng `peers` FRESH). 🎁 Changelog `: BaseEntity` + lọc CHỈ `PurchaseEvaluationId` (`:1424`) ⇒ lịch sử phiếu-xóa đọc MIỄN PHÍ; cái chôn = DETAIL bundle. 0 tiền lệ thùng-rác (hit "khôi phục" duy nhất = STRING `EmployeeFeatures.cs:162` ghost-wire). 🔴 **"Trưởng phòng" CÓ TÊN CHƯA CÓ ĐỜI**: `Department.ManagerUserId` **0/10 Dev** + 2 FE hardcode `managerUserId: null` payload SỬA (`DepartmentsPage.tsx:43`/`:57`) ⇒ tự-xoá mỗi lần sửa phòng. `PositionLevel.TruongPhong` 33/33 NULL (V1-legacy). Tag `[s155, menu-seed-db, phase-param-exists, changelog-survives-softdelete, dept-head-name-only]`
- **S155 (07-27) WF-V2 sửa-tại-chỗ vs version-mới [25 finding, `runs/2026-07-27-S155-pe-delete-approver/sub-invest-wfver-4.md`]:** 🔴 **0 lệnh Update**`ApprovalWorkflowsV2Controller.cs` (54d TOÀN BỘ) chỉ GET/POST/PATCH-user-selectable/DELETE ⇒ sửa 1 cờ = buộc POST = `MAX(Version per Code)+1` (`ApprovalWorkflowV2AdminFeatures.cs:325-328`) + hạ MỌI active cùng type (`:330-334`). Chặn THẬT bằng mã. 🔴 **F17:** POST tạo entity mới ⇒ **Id mới** (`:336`+`BaseEntity.cs:5`) mà phiếu đọc workflow theo **Id đã pin** (`PurchaseEvaluationWorkflowService.cs:674`) ⇒ **cờ mới KHÔNG tới phiếu đang chạy**; re-pin chỉ `PurchaseEvaluationFeatures.cs:149`/`:291``:249-251` chặn chỉ Nháp/TraLai ⇒ ChoDuyet kẹt bản cũ vĩnh viễn; 0 backfill re-pin. ⇒ cờ `AllowApproverDelete` **HỎNG nếu không có lệnh Update**. Pin = **tham chiếu SỐNG** (chỉ NS có snapshot Mig67). Con trỏ **LAI**: Bước=INDEX `steps[currentIdx]` (`:686` vỡ ÂM THẦM/`:683` kẹt) · Cấp=ORDER-VALUE (`:694``:695` kẹt) ⇒ ranh AN-TOÀN = **không đổi tập `{Step.Order}``{Level.Order}`**. 13 thao tác: 3 an-toàn (thêm-người-cùng-Order · cờ `Allow*` · đổi tên) · 2 nửa (bớt/đổi `ApproverUserId` → 403 GUID-trần `:705`, FK Restrict `PeLevelOpinionConfiguration:25-28`) · 6 phá-vỡ · 2 hỏi-owner (`CeoApprovalThreshold`·`Step.DepartmentId`). OR-of-N XÁC NHẬN (`:689` GroupBy Order) ⇒ owner không tự mâu thuẫn; ⚠️ comment `ApprovalWorkflow.cs:81-82` SAI *"KHÔNG OR-of-many"*. Blast 6+ module (198 hit/23 file). Designer **fe-admin ONLY** (`ApprovalWorkflowsV2Page.tsx`), "Nhân bản"→*"Tạo quy trình mới"*; **0 cảnh báo đang-dùng/0 disable IsActive**. F6 tick `:999-1007` +dây `:54/:110/:159/:177/:605` + fe-user `WorkflowMatrixViewPage.tsx:282` + BE `:41/:230/:188/:368`. CẤM delete-then-insert Levels → diff theo `Level.Id`. Tag `[s155, wf-v2-no-update-cmd, new-version-new-id-unreachable, pointer-index-vs-order]`
- **S153 (07-26) ctx soft-memory spec [fable-real, detail → `runs/2026-07-26-S153-ctx-adopt/sub-fable-invest-S153.md`]:** SE **0 content-ts-reader sống** (session_ctx.py = git-ts+mtime) ⇒ rào-2 canonical `_TS_KEY_RE` đặt session_ctx.py, máy-7-phép = EXTEND python (tái dụng `_SECRET_RES` 1-nguồn) KHÔNG .ps1 mới; `secrets_sweep` rglob TRỌN session-dir ⇒ `_mind` tự vào lưới; `_mind` mới-nhất-ở-TRÊN ⟂ `_context` FLOW ở-CUỐI (bẫy chép-khuôn); C11(b) filter `^sub-<role>[-.]` ⇒ tên `sub-ctx-audit-*` lọt lưới ngay. Tag `[s153, ctx-mind-spec, ts-reader-absent, one-source-regex]`
- **S148 (07-23) PE tree DUP project by-space:** `FLOCK 01`/`FLOCK01` = **path-A TWO real Project rows** diff-by-space. Tree groups on `p.projectId` GUID (`PurchaseEvaluationsListPage.tsx:192-197`, display projectCode); PE→Project FK `ProjectId` (`PurchaseEvaluation.cs:15`) JOIN-resolved (`PeFeatures.cs:579/:647`) — NO denorm string. CRUD zero-trim (`ProjectFeatures.cs:80` validator, `:95/:138` exact `Code==` dupe-check). Both seeds exact-Code key emit ONLY no-space: `SeedRealMasterDataAsync:2776` (UNGATED :128) + `SeedDemoMasterDataAsync:2681` (gated :117 OFF-prod). Space=legacy/manual. Blast=3 tables ProjectId (Contracts/PeWorkItemBudgets/PurchaseEvaluations); only `PeWorkItemBudgets` UNIQUE(ProjectId,WorkItemId) filtered [IsDeleted]=0 (`PeWorkItemBudgetConfiguration.cs:27`). Direction: KEEP no-space (in seed→idempotent), RETIRE space (not-in-seed); soft-del survivor→seed RE-CREATES (#75/#76). Dev only FLOCK 01 pair (FLOCK03/CAL01 space-twins prod-only); prod UNVERIFIED (SSH dies on SQL-client, S134). Tag `[s148, pe-tree-dup-project-by-space, path-A-two-rows, no-normalize-crud]`
- **S147 (07-23) PE attach TraLai edit-block:** FE-ONLY block, BE zero phase-guard (`PurchaseEvaluationsController.cs:15` class `[Authorize]` only; handlers check exists only `PurchaseEvaluationAttachmentFeatures.cs:66/:160`). Gate = raw `readOnly` PROP not phase (`GeneralAttachmentsSection` :3555/:3577 hide-when-readOnly); List detail HARDCODE `readOnly=true` (:574/:669) ⇒ TraLai loại khỏi SCREEN không khỏi editable-SET (workspace `PeListPanel.tsx:88` isEditablePhase GỒM TraLai). fe-admin MIRROR. BE no-guard CỐ Ý (S78). Fix FE: `attachEditable=isDrafter&&isEditablePhase`. Tag `[s147, pe-attach-tralai, fe-only-screen-gate]`
- **S133-S141 (07-16→20) gộp [detail → archive/2026-07.md + `runs/…S1{28,33,34,35,38,41}…`]:** S141 adap 5-lane (byte-safe⟂tolerant-EXTRACTION → pin regex `\"?([0-9a-fA-F]{8,64})\"?`; roster-count 3-tầng) · S138 delta-hẹp PHẢI grep landing-site trong luật SỐNG · S134 lũy-kế lệch-tiền-đề row1 (`PeBudgetAccumulator.cs:42-48` PrevSubmitted ĐÃ gồm ChoDuyet) · S133 freeze-at-DaDuyet 4-assignment (`PurchaseEvaluationWorkflowService.cs:861/:899/:931/:1053` Mig67) · S128 RAG config in-repo (`projects.py:39` owner-final) · S126 worker-pin 14/14 opus+max, no-tier→opus DÙ lead=Fable · S125 verifier-suspect-first · S122 orphan đo TÊN không NỘI-DUNG, lane-RỖNG≠mất.
- **S116/S117 (07-13) PE negative-quote + giá-chốt RANGE [fable]:** neg-quote FE-ONLY (BE/DB nhận âm; quote sống `details[].quotes` KHÔNG `suppliers[].quotes`). S117 ApprovedPrice WRITE 1-site `ApplyApprovedPriceOnFinalize`; HĐ-gen KHÔNG đọc ApprovedPrice (GiaTri=SUM IsSelected). endsBeforeCeo=config-lie #78 (detail :1152 / list :647).
- **[archived → archive/2026-07.md + git]** S87-S114 PE recon (multi-winner IsSelected per-hạng-mục Mig65 · WinnerQuoteTotal DERIVED · budget gate PURE-ROLE · V2 routing=ApproverUserId LINEAR) · Supplier-import-v2 (ClosedXML, Mã NCC=Code, IsPublic fail-closed, import authz-mismatch) · S105 BVAAU auth RCA (relative-`/api` prod-404) · S104 30-field · S98-S101 harness · Office/HRM/Governance recon. Ctrl-F `_INDEX.md`.
## 📌 Recent invest (1-line digest; verbatim → archive + runs)
- **S180 (08-07) ×Fable fit-map 4-thư upgrade-pack 7GĐ [`runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-invest-fitmap-S180.md`]:** PHỦ-ĐỦ 7GĐ/12TC/9LỖI. Nghề: hash mesh CHỈ tin máy canonical `scripts/stamp_verify.py` (tự chế MISMATCH cả 4 = suýt phán tamper sai) · TÔI = vai 7/7 dính #53 + bị bắt LỚP-7 tự-giẫm (202K đọc/7KB đĩa) "đổ ruột TRƯỚC đo SAU" cứu; tỉ-lệ byte-đĩa/token-đọc = tín hiệu giám sát · xung đột duy nhất gói: SE exit-0-advisory (`governance-detectors.ps1:1963`) hub cổng-chặn-mã-lỗi VƯỢT-KHUNG · GĐ-5 gần xong nhất / GĐ-4 hổng nhất (0 sổ-yêu-cầu-anh, 0 chấm-điểm) · bác-một-phần lead: `pull_warn_days` trống = CỐ Ý owner khai (`check-email.md:48`) ghost-wire. Tag `[s180, stamp-verify-canonical-only, lop7-tu-giam, exit0-vs-gate]`
- **S175 (08-05) ×Fable cột DỰ ÁN ma-trận NS [seed on-behalf; `runs/2026-08-05-S175-duan-budget-column/`]:** BÁC 2 tiền-đề lead cột = CHỖ-CHỪA-SẴN (`e33481e` cùng-commit comment `PeWorkItemBudget.cs:19`, KHÔNG phải di-chứng Mig50) · `—` = 11 ô/app không phải 3; phả-hệ đo bằng commit-sinh-ra + comment cùng commit, đừng suy từ khoảng-thời-gian-gần. `Project.BudgetTotal` sống từ Mig-2 nhưng Dev 61/69 NULL = "cơ-chế đúng dữ-liệu không có" ln 7. Spawn TASK-RỖNG cứu bằng run.md trên đĩa. Tag `[s175, pha-he-commit, artifact-dia-cuu]`
- **S171 (08-04) ×Fable KHKK-UI-mirror-PE [`runs/2026-08-04-S171-khkk-ui-mirror-pe/` 44.8KB]:** VERDICT 27-giống/6-buộc-khác/8-gap; §0 đính-chính ground-truth lead TRƯỚC §1 (nghề đúng); bị 3 lane reviewer lật: miễn-trừ 63, 6 acceptance gãy khi chạy thật **đầy-đủ ≠ đúng, invest 44KB không thay được reviewer đối-kháng**. Tag `[s171, day-du-khong-bang-dung]`
- **S160 (07-29) dry-run toàn-trình HĐ-cứng 2-lane [`runs/2026-07-29-S160-khkk-dryrun-plan/`]:** `Hdc_*` = 7-leaf-per-ContractType (`DbInitializer.cs:1862-1867`, lead sai 2 grounding) · KHÔNG phase KyCung (GĐ4 = DERIVE sau terminal 9, 0 mig) · 🔴 `DeleteContract` guard so SỐ `Phase >= DangInKy` chặn xóa cả 9/10/98/99 · mặt tấn công = Reject-trước-guard `ContractWorkflowService.cs:49-66` · "MB" codegen không gốc RG-001 · prod Contracts = 0 active/0 deleted (sổ "7 V1" stale). Tag `[s160, delete-guard-numeric, reject-truoc-guard]`
- **S158 (07-28) ×Fable day-wake-probe-first [seed on-behalf; `runs/2026-07-28-S158-day-wake-probe-first/`]:** return CLEAN giữa closeout 7/8 lane #53 khác biệt = ghi-đĩa-từng-phần + verify-RUỘT trước return. BÁC 2 tiền-đề lead bằng **cửa-cho-verdict-ngược** (mạnh hơn lập luận nguyên tắc); anchor = **carrier-commit** `git log --diff-filter=A -1 -- <marker>` sống-sau-squash; **đo BYTE cấm quy token** (`tiep_reload` = 122.115 B / 5 nguồn). Tag `[s158, carrier-commit-anchor, byte-khong-token]`
- **S157 (07-28) KH-ký-kết b.712 [`runs/2026-07-28-S157-ke-hoach-ky-ket-hd/`]:** O-1 tái dùng khung V2 + 7 bảng `ContractSigningPlan*` + `ApplicableType=10`; 🔴 twin-bẫy: **Proposal-lite ApproveV2 PHÁ OR-of-N** (`ProposalFeatures.cs:427-439` flatten + `ElementAtOrDefault`) KH service PHẢI copy `ContractWorkflowService.ApproveV2Async:217-394`; ISO 9-bước ContractPhase 1:1; #53 skeleton-chặn @202K Edit-liền-tay từng mục. Tag `[s157, proposal-lite-breaks-or-of-n]`
- **S156 (07-27) BCH post-CEO b.721 [`runs/2026-07-27-S156-bch-post-ceo-flow/`]:** verdict LAI 1321 tái dùng Contract (7 dòng LEGACY `ContractPhase.cs:11-13` = trạm gỡ cố ý) · 7-12 dựng mới; chuỗi "cơ-chế đúng thứ-đi-qua-không-có": cầu PE pin V1 (`CreateContractFromEvaluationFeatures.cs:68-71`) · `GetEligiblePhases`+inbox 100% LEGACY approver V2 ChoDuyet · SLA V2 hardcode AddDays(7)×3 · notify chỉ Drafter. Bắt lead sai 12-enum/7-LEGACY. Tag `[s156, eligible-phases-legacy-only]`
- **S155 (07-27) PE xóa-phiếu 4 lượt [`runs/2026-07-27-S155-pe-delete-approver/` + archive/2026-07.md]:** menu = SEED-DB 6-chỗ-mirror, đổi KEY = mồ côi 13-row/key giữ key đổi label · `?type=1&phase=7` chạy được hôm nay 0-route-mới · 🔴 WF-V2 **0 lệnh Update** sửa cờ = POST version mới = **Id mới mà phiếu pin Id cũ (F17)** ChoDuyet kẹt vĩnh viễn, 0 backfill re-pin; con trỏ LAI Bước=INDEX Cấp=ORDER ranh an-toàn = không đổi tập Order; OR-of-N xác nhận `:689` (comment `ApprovalWorkflow.cs:81-82` SAI) · `Department.ManagerUserId` 0/10 Dev + 2 FE hardcode null tự-xoá. Tag `[s155, wf-v2-no-update-cmd, f17-new-id-unreachable, menu-seed-db]`
- **S153 (07-26) ctx soft-memory spec [fable-real, `runs/2026-07-26-S153-ctx-adopt/`]:** SE 0 content-ts-reader sống rào-2 canonical `_TS_KEY_RE` đặt session_ctx.py, máy-7-phép = EXTEND python (tái dụng `_SECRET_RES` 1-nguồn); `secrets_sweep` rglob trọn session-dir; `_mind` mới-nhất-ở-TRÊN `_context` FLOW-ở-CUỐI; C11(b) filter khiến tên `sub-ctx-audit-*` lọt lưới. Tag `[s153, ts-reader-absent, one-source-regex]`
- **S149S152 (07-2425) 10-invocation + R1 [lead on-behalf; `runs/2026-07-24-S149-*/` + `runs/2026-07-25-S149-adap-backlog/`]:** chẩn-đoán "SE = rules-đủ MÁY-THIẾU" (0 script GHI counter "đo rồi như chưa đo" ×3) đứng qua gate spec bookend M1-M9; #53 3 sub-class (ngược-#53 · kinh-điển · mất-cả-hai); ghi-đĩa-trong-lúc-làm = CẦN KHÔNG ĐỦ. R1: **KHÔNG fabricate — uncertain + reason; mọi số kèm lệnh**. Tag `[s149, rules-du-may-thieu, s152-no-fabricate]`
- **S148 (07-23) PE tree DUP project by-space:** `FLOCK 01`/`FLOCK01` = path-A TWO real Project rows diff-by-space; tree groups `p.projectId` GUID (`PurchaseEvaluationsListPage.tsx:192-197`); CRUD zero-trim (`ProjectFeatures.cs:80/:95/:138` exact `Code==`); seeds emit ONLY no-space (`SeedRealMasterDataAsync:2776` UNGATED); blast 3 bảng ProjectId, chỉ `PeWorkItemBudgets` UNIQUE filtered; direction KEEP no-space RETIRE space; soft-del survivor seed RE-CREATES (#75/#76); prod UNVERIFIED (SSH chết khi SQL-client load S134/S148). Tag `[s148, dup-by-space, no-normalize-crud]`
- **S147 (07-23) PE attach TraLai edit-block:** FE-ONLY (BE zero phase-guard, `PurchaseEvaluationsController.cs:15` class-trần; gate = raw `readOnly` prop `:3555/:3577`; List detail HARDCODE `readOnly=true` `:574/:669`); BE no-guard CỐ Ý (S78); fix = `attachEditable=isDrafter&&isEditablePhase`. Tag `[s147, fe-only-screen-gate]`
- **S133-S141 (07-1620) gộp [archive/2026-07.md + runs]:** S141 adap 5-lane pin regex sha-extraction + roster-count 3-tầng · S138 delta-hẹp PHẢI grep landing-site luật SỐNG · S134 lũy-kế row1 PrevSubmitted ĐÃ gồm ChoDuyet (`PeBudgetAccumulator.cs:42-48`) · S133 freeze-at-DaDuyet 4-assignment Mig67 · S128 RAG config in-repo · S126 worker-pin 14/14 no-tieropus lead=Fable · S125 verifier-suspect-first · S122 orphan đo TÊN không NỘI-DUNG.
- **S116/S117 (07-13) PE neg-quote + giá-chốt RANGE [fable]:** neg-quote FE-ONLY (quote sống `details[].quotes` KHÔNG `suppliers[].quotes`); ApprovedPrice WRITE 1-site `ApplyApprovedPriceOnFinalize`; HĐ-gen KHÔNG đọc ApprovedPrice (GiaTri=SUM IsSelected); endsBeforeCeo=config-lie #78.
- **[archived archive/2026-07.md + git]** S87-S114: PE recon (multi-winner Mig65 · WinnerQuoteTotal DERIVED · V2 routing LINEAR) · Supplier-import-v2 · S105 BVAAU auth RCA · S104 30-field · S98-S101 harness · Office/HRM recon. Ctrl-F `_INDEX.md`.
## 📋 Patterns proven
### Schema scan sqlcmd
@ -30,66 +30,29 @@ Read-only INTERNAL audit SOLUTION_ERP. Tools: Read/Grep/Glob/Bash + 5 RAG MCP. O
sqlcmd -S "(localdb)\MSSQLLocalDB" -d SolutionErp_Dev -Q "..." # runtime API (primary)
sqlcmd -S "(localdb)\MSSQLLocalDB" -d SolutionErp_Design -Q "..." # ef tooling
```
Prod: `ssh vietreport-vps` powershell-wrapper `sqlcmd -S '.\SQLEXPRESS' -d SolutionErp -E …` — ⚠️ **SSH session DIES whenever SQL-client loads** (S134/S148 re-confirm); prod-DB effectively UNVERIFIABLE this path, flag + give query for implementer. **2 LocalDB distinct**: `_Dev`=runtime · `_Design`=`dotnet ef` default. Queries: `sys.columns/indexes/tables`, `__EFMigrationsHistory`, dup-detector `REPLACE(Code,' ','')`.
Prod: `ssh vietreport-vps` powershell-wrapper **SSH session DIES khi SQL-client load** (S134/S148); prod-DB unverifiable đường này flag + đưa query cho implementer. **2 LocalDB distinct.** Queries: `sys.columns/indexes/tables`, `__EFMigrationsHistory`, dup-detector `REPLACE(Code,' ','')`.
### Controller / wire-claim audit
- Grep `\[Route\("api/[a-z]+"\)\]` controllers · `\[Authorize(Policy="…"` per-action (gotcha #44 silent-403; class-level `[Authorize]` trần = no phase-guard, S147)
- Grep `// Mock` / `alert(` / `setEditing(null) // close UI` — wire bugs
- Grep `\[Route\("api/[a-z]+"\)\]` · `\[Authorize(Policy="…"` per-action (gotcha #44 silent-403; class-trần = no phase-guard S147) · `// Mock` / `alert(` / `setEditing(null)` wire bugs.
### Mesh / governance đo
- Hash thư mesh: `python scripts/stamp_verify.py <file.md>` CẤM tự chế phép băm (S180).
- 0-hit PHẢI kèm control-dương cùng thước; đếm phải xem format file trước khi viết regex (S180 gotcha-count 2 thước hỏng).
- Máy đo sẵn: governance-detectors (exit-0 advisory, TOTAL INFORM 2 dòng) · nhip-no-probe (đèn nợ 4 cửa) · session-counter-tick + h24-signal-write (fail-loud thật) · closeout-sentinel (verdict-line) · spawn-model-audit · memory-archive-gate A7.
### Memory cross-reference
30 user-memory `C:\Users\pqhuy\.claude\projects\D--…\memory\MEMORY.md`. Key: designtime_runtime_db · workflow_fanout_reliability · canonical_spec_over_broadcast · root_cause_over_symptom · cardinality_change_grep_consumers.
30+ user-memory `C:\Users\pqhuy\.claude\projects\D--…\memory\MEMORY.md`. Key: designtime_runtime_db · workflow_fanout_reliability · canonical_spec_over_broadcast · root_cause_over_symptom · cardinality_change_grep_consumers.
## ⚠️ Anti-patterns
Skip MEMORY update · ❌ Vague "seems/probably" · ❌ Missing file:line · ❌ >500 words · ❌ Scope drift to architecture rec (em main decides) · ❌ Multi-line MEMORY entries (index truncates >24.4KB)
Skip MEMORY update · Vague "seems/probably" · Missing file:line · >500 words report · ❌ Scope drift sang architecture rec · ❌ Multi-line MEMORY entries (hook hard-cap 24.4KB) · ❌ Đọc nhiều đổ đĩa ít (LỚP-7 S180 — đổ ruột TRƯỚC đo SAU).
## 🧠 SOLUTION_ERP context (numbers canonical → docs/STATUS.md; re-ground don't trust)
- **DB:** Dev `SolutionErp_Dev` · Design `SolutionErp_Design` (distinct) · Prod `.\SQLEXPRESS`/`SolutionErp`/`vrapp` via SSH `vietreport-vps`
- **Migration path:** `src/Backend/SolutionErp.Infrastructure/Persistence/Migrations/*.cs` (NOT root). Last-schema Mig 67 `AddPeApprovedBudgetSnapshot` (S133); ~67 mig.
- **Counts (docs/STATUS.md canonical):** ~88 SQL tables (count `.ToTable()` snapshot NOT DbSet) · ~253 endpoints · 68 FE pages · 54 menu keys (`MenuKeys.cs`) · ~354 test · ~71+ gotchas · 14 sub-agents (worker-tier-pin S124)
- **Tech:** .NET 10 Clean Arch (Api→Application←Domain + Infra) + CQRS MediatR + EF Core 10 + 2 React Vite TS (fe-admin :8082 + fe-user :8080) + SQL Server + Gitea CI + IIS
- **Prod:** api/admin/eoffice.solutions.com.vn · Gitea `git.baocaogiaoduc.vn/…/solution-erp` (Actions API `/actions/tasks` NOT `/runs`, cache stale ~2min #46)
- **Auth:** `admin@solutions.com.vn/Admin@123456` (full) / `nv.test@solutions.com.vn/TestUser@123456` (Drafter). Password ≥12.
## 🔄 Active workflow schemas (V1 + V2 coexist post-S17)
- **V1 Mig 21 flat** — `WorkflowDefinition` pin cũ, match Dept+PositionLevel.
- **V2 Mig 22-31** — `ApprovalWorkflow` pin PE/Contract, match `ApproverUserId` 1-1 OR-of-N cùng Cấp. Steps(Phòng)>Levels(Cấp). Proposal V2 Mig38, WorkflowApps Mig39. (Mig25 IsUserSelectable · 26 LevelOpinions UPSERT · 30 AllowApproverEditBudget · 31 SkipToFinal→ApproverLevel · 53 cờ-gấp+CeoThreshold · 54 giá-đề-xuất · 58 IsWinner multi + AllowApproverFinalize · 65 Quote.IsSelected per-hạng-mục · 66 ApprovedPrice Min-Max · 67 budget-freeze snapshot).
- **State PE 5:** Nháp / Đã gửi duyệt / Trả lại (TraLai=98) / Từ chối (TuChoi, REMOVED-path S60) / Đã duyệt
- **Mode Trả lại 4:** OneLevel / OneStep / Assignee / Drafter (Phase=TraLai). 3 đầu giữ ChoDuyet lùi pointer. Admin bypass `level.Allow*`.
- **Seeds gating:** `SeedDemoMasterDataAsync` gated `DemoSeed:Disabled` (OFF prod) · `SeedRealMasterDataAsync` UNGATED (62 dự án + 71 hạng mục Excel, per-code idempotent, exact-Code key #75/#76 resurrect risk).
- **DB:** Dev `SolutionErp_Dev` · Design `SolutionErp_Design` (2 LocalDB distinct — memory `feedback_designtime_runtime_db`) · Prod `.\SQLEXPRESS`/`SolutionErp` via SSH `vietreport-vps`.
- **Mig path:** `src/Backend/SolutionErp.Infrastructure/Persistence/Migrations/*.cs` (NOT root). MỌI count (mig/bảng/endpoint/test/gotcha/menu/policy) → `docs/STATUS.md`, KHÔNG neo ở đây (bản cũ neo stale = LỚP-5; "Mig 67 last" từng ghi ở đây đã sai — nay ≥71).
- **Tech:** .NET 10 Clean Arch + CQRS MediatR + EF Core 10 + 2 React Vite TS (fe-admin :8082 / fe-user :8080) + SQL Server + Gitea CI (`/actions/tasks` NOT `/runs`, cache ~2min #46) + IIS. Prod: api/admin/eoffice.solutions.com.vn.
- **Auth test:** `admin@solutions.com.vn/Admin@123456` (full) · `nv.test@solutions.com.vn/TestUser@123456` (Drafter).
- **Workflow V1/V2 chi tiết + state PE 5 + TraLai 4-mode + seeds gating:** → skill `contract-workflow` + verbatim block trong `archive/2026-08-curate-s180.md`.
## 🔄 Curate log
- **S155 (07-27):** hook @19.5KB → compact 20.7→~17.1KB: gộp S122-S141 thành 1 dòng, trim 3 entry S155 (detail nguyên vẹn ở `runs/2026-07-27-S155-pe-delete-approver/sub-*.md`) + S153.
- **S148 (07-23):** hard-cap rewrite 28.2→~14KB — collapsed multi-line S133-S148 → 1-liner, dropped stale pointer-list (S87-S114 → grouped 1-line, verbatim in archive/git).
- **Prev:** S125 (23.9→~15KB) · S71/S70/S40. Verbatim byte-exact in `archive/`.
## S149 (2026-07-24→25) — 10 invocation gộp 1 entry [LEAD GHI ON-BEHALF @S150 — M9/B3 theo H2-F3 Coverage-miss (10 lượt → 0 delta sổ, ngoài lưới C11(b) by-design); nguồn: sub-file trong `runs/2026-07-24-S149-{dong-du-5-vong,hoi-tu-bookend,owner-gated-3-khoan}/` + `runs/2026-07-25-S149-adap-backlog/sub-invest-backlog.md`]
- 10 lượt invest @S149: chẩn-đoán **"SE = rules-đủ, máy-thiếu"** (0 script GHI `.session-counter.json` → chuỗi "đo rồi như chưa đo": backfill S146 · tally-rơi S148 · ×27≠33) — ĐỨNG qua gate reviewer-Fable, thành spec hội-tụ-bookend M1-M9. Backlog adap phân-loại **A-12/B-6/C-1/D-3** ("nợ REPORT không phải nợ ADOPT") → wave 6-lane land 23/23. O-2 nguồn thật = depth-axis → **posture-A**.
- #53 trong 10 lượt (ghi sổ garble @S150): L1 **ngược-#53** (return OK, ĐĨA không — vớt journal) · L5 kinh-điển (đĩa cứu) · L7 mất-cả-hai (bù deep-pass). Sub-class mới: ghi-đĩa-trong-lúc-làm = CẦN, KHÔNG ĐỦ.
## S152 (2026-07-25) — R1 retention-note không-fabricate [M9 on-behalf lead]
- **KHÔNG fabricate — uncertain thì nói "uncertain" + reason:** finding không chứng được từ đĩa/DB phải khai uncertain kèm lý-do thiếu-chứng, KHÔNG lấp bằng suy-đoán (tiền lệ tốt: A/018 S117 — verify prod-DB `Phase=ChoDuyet` trước khi phán "lũy kế đúng", thay vì đoán theo lời UAT). Claim ≠ chứng: mọi số kèm lệnh. Tag `[s152, r1-retention, no-fabricate-uncertain-reason]`
## S158 (2026-07-28) — `/fable-real` adap `day-wake-probe-first` [LEAD SEED ON-BEHALF @closeout M9 — mày chạy THẬT (Fable, 222K tok, 20 tool-use) nhưng KHÔNG tự ghi; nguồn = `runs/2026-07-28-S158-day-wake-probe-first/sub-invest-day-1.md` 25.440 B + adap-synthesis]
- **Return CLEAN 0-garble** giữa một closeout mà **7/8 lane khác đều `#53`**. Khác biệt DUY NHẤT: prompt ép **ghi đĩa từng phần trong lúc làm** + **verify RUỘT có chữ trước khi return**. ⇒ datum củng cố: chống `#53` = **thiết-kế artifact**, không phải prompt.
- 🔴 **BÁC 2 tiền-đề của LEAD — đây là giá trị chính của lượt này, không phải bản đề-xuất:**
(a) *"SE có squash ⇒ có sha mồ-côi"* → đo `cat-file -e` + `is-ancestor` trên 8 marker = **sống 8 / mồ-côi 0**; squash `session-end` chỉ gọt trailing-`wal:` **chưa push**, 6/8 sha đã push. **Vẫn giữ guard** vì tiền lệ S127 dangling có thật + chính feature `/day` tự đẻ điều kiện orphan.
(b) *"probe nên tái dùng Sàn-3"***BÁC bằng bằng-chứng CÙNG CỬA**: Sàn-3 ② HIT ⟂ anchor-delta 0 CLEAN, verdict **NGƯỢC NHAU** vì hỏi **2 câu khác nhau** (*"tồn-tại việc dở"* neo `origin/main`*"đổi so điểm dừng"* neo marker pause) ⇒ dựng phép-2 KHÔNG vi phạm B1.
**Nghề rút ra:** khi lead nêu sẵn một hướng nghiêng, cách bác mạnh nhất là **tìm một cửa mà 2 phép cho verdict ngược nhau** — mạnh hơn mọi lập luận về nguyên tắc.
- **Nghề đo đáng giữ:** anchor = **carrier-commit** `git log --diff-filter=A -1 -- <marker>` (commit ĐẦU TIÊN thêm chính file đó) — 8/8 resolve, **sống-sau-squash by construction**, và **nuốt luôn bẫy-anchor-lệch-1-nhịp** mà hub phải xử bằng bước resolve riêng. Mạnh hơn form của hub.
- **Đo BYTE, CẤM quy token** (chính lỗi làm thư hub trượt vòng r1: dán nhãn "token tự đo" lên proxy ký-tự). `tiep_reload` SE = **122.115 B / 5 nguồn**; nền SE **nhẹ hơn hub 3,6×** ⇒ đừng mượn số hub bán lợi ích.
- **2 phát hiện ngoài đề-bài, cả 2 lead xác nhận:** `docs/HANDOFF.md` segment mới nhất còn **S153** ⇒ nguồn-2 của `tiep_reload` nạp brief cũ **3 nhãn phiên** (vá @S158) · `_tiep-1.md` ghi head-sha **7 ký tự** trong khi 7 marker kia ghi đủ 40 = form drift trong cùng một loại marker.
- Tag `[s158, fable-adap, ghi-dia-cuu-return, bac-tien-de-lead-bang-cua-verdict-nguoc, carrier-commit-anchor, byte-khong-token, seed-on-behalf]`
## S175 (2026-08-05) — `/fable-real` invest cột DỰ ÁN trong ma-trận ngân sách [LEAD SEED ON-BEHALF @pause cổng C2 — mày chạy THẬT (Fable, 169K tok, 38 tool-use, ~12) nhưng KHÔNG tự ghi; nguồn = `runs/2026-08-05-S175-duan-budget-column/run.md` + `spec-hang-muc-nhieu-dong-va-cot-du-an-05-08-2026.md`]
- 🔴 **BÁC 2 tiền-đề của LEAD — đây mới là giá trị chính của lượt này, không phải bản đề-xuất:**
(a) Lead đoán *"cột DỰ ÁN là DI-CHỨNG module Budget cũ bị Mig 50 rút ruột"***SAI**. Đo git: cột sinh ở `e33481e` **19-06** (Mig 56), tức **SAU** Mig 50 (13-06) **6 ngày**, và **CÙNG COMMIT** với comment ý-định `PeWorkItemBudget.cs:19` *"DỰ ÁN: hiển thị FE-only (chưa wire BE — sau mới có NGƯỜI DỰ ÁN NHẬP)"***CHỖ-CHỪA-SẴN có chủ đích**, không phải xác chết.
(b) Lead đo *"hardcode `—` ở ≥3 chỗ"***THIẾU**. Thật = **11 ô/app** (Block A 3 + Block B 8), mirror 2 app.
**Nghề:** tiền-đề đổ mà **kết-luận hệ-quả vẫn đứng** ("phải dựng một tầng, không phải vá 1 cột") — đừng vứt cả kết luận khi vứt tiền-đề.
- 🔑 **Phát hiện ngoài đề-bài, đắt nhất lượt này:** `Project.BudgetTotal` **ĐÃ TỒN TẠI từ Mig 2 — day-1**, wired TRỌN 2 đầu (BE CRUD `ProjectFeatures.cs` + FE cột "Ngân sách" `ProjectsPage.tsx:117` + form `:205`). Chỉ (i) chưa nối vào ma-trận PE, (ii) **DỮ-LIỆU RỖNG: Dev 61/69 dự án NULL** (8 cái có số đều là demo-seed gated-OFF-prod). ⇒ rất có thể CHÍNH LÀ thứ owner nói *"bên mục ngân sách có mục dự án chưa điền vào"* — lớp **"cơ-chế đúng, dữ-liệu không có"** lần thứ 7.
- **Nghề đo đáng giữ:** truy phả-hệ một dòng code bằng **commit sinh ra nó + comment cùng commit**, thay vì suy từ khoảng thời-gian gần nhau. Mig 50 và cột DỰ ÁN cách nhau 6 ngày — đủ gần để đoán bừa là "di-chứng", và đoán đó SAI.
- **Kết cục thực-tế:** owner sau đó chốt *"ko cần so sánh j với số duyệt PRO hay CCM j cả"* ⇒ phương-án live-derive engine đề-xuất **KHÔNG land**; nhưng 2 đính-chính (a)(b) + phát hiện `Project.BudgetTotal` **vẫn còn giá trị** cho lượt sau. Điều-tra không land ≠ điều-tra vô ích.
- 🔸 **META hạ-tầng:** spawn tới với **TASK RỖNG** ("thiếu prompt — lỗi taskList @P0"); mày khôi-phục trọn đề-bài từ `run.md` trên ĐĨA. ⇒ củng cố khuôn **artifact-trên-đĩa > return**: run-folder cứu được cả ca dây-spawn hỏng.
- Tag `[s175, fable-real, bac-tien-de-lead, pha-he-bang-commit-sinh-ra, co-che-dung-du-lieu-khong-co, artifact-dia-cuu-spawn-rong, seed-on-behalf]`
- **S180 (08-07):** hook hard-cap 24.9→~13KB — S171/S160/S157/S156/S155×2/S149/S152/S158/S175 entry-dài + context-blocks verbatim → `archive/2026-08-curate-s180.md`; mọi entry → 1-line.
- **S155 (07-27):** 20.7→~17.1KB gộp S122-S141. · **S148 (07-23):** 28.2→~14KB. · **Prev:** S125/S71/S70/S40. Verbatim byte-exact ở `archive/`.

View File

@ -0,0 +1,105 @@
# archive/2026-08-curate-s180.md — verbatim khối bị nén khỏi MEMORY.md @S180 (hook hard-cap 24.9KB>24.4KB → rewrite <17.1KB)
> Chép NGUYÊN VĂN các entry/section bị gộp thành 1-liner trong index. Ctrl-F theo nhãn phiên. Nguồn: MEMORY.md trạng thái ngay trước curate S180 (2026-08-07).
---
## [S180 entry — bản dài vừa viết @S180 trước curate]
- **S180 (08-07) ×Fable fit-map 4-thư upgrade-pack 7GĐ [`runs/2026-08-07-S180-adap-upgrade-pack-phased/sub-invest-fitmap-S180.md` ~26KB]:** PHỦ-ĐỦ 7GĐ/12TC/9LỖI. 🔴 Nghề: (1) hash 4 thư chỉ khớp qua máy canonical `scripts/stamp_verify.py` (strip-\r → split 2nd `---` → strip-1-LF) — phép tự chế MISMATCH cả 4, suýt phán "tamper" sai ⇒ mesh-hash LUÔN dùng máy sẵn; (2) TÔI = vai **7/7 dính #53** phiên này VÀ bị coordinator bắt đúng **LỚP-7 tự giẫm** (202K token đọc / 7KB đĩa ~15%) → lệnh "đổ ruột TRƯỚC đo SAU" cứu trọn — bài: tỉ-lệ byte-đĩa/token-đọc = tín hiệu giám sát được, đề xuất nối vào AS-17; (3) xung đột lớn DUY NHẤT gói = SE exit-0-advisory (`governance-detectors.ps1:1963` "Exit 0 always") ⟂ hub cổng-chặn-mã-lỗi-4-trạng-thái → VƯỢT-KHUNG; (4) GĐ-5 gần xong nhất (H21 per-invocation + tier-pin + spawn-audit + runs/ chung-gốc), GĐ-4 hổng nhất (0 sổ-yêu-cầu-anh, 0 chấm-điểm — grep "chấm điểm" commands 0-hit, control "điểm dừng"=3); (5) bác-một-phần nền lead: `pull_warn_days` trống = **CỐ Ý owner @S148 có khai** (`check-email.md:48` 🔒) ≠ ghost-wire — lead mời bác, đo ra khác thì nói. Tag `[s180, fit-map-7gd, stamp-verify-canonical-only, lop7-tu-giam-do-ruot-truoc, exit0-vs-gate-vuot-khung, pull-warn-days-owner-gated]`
---
## [S171 header-entry]
- **S171 (2026-08-04) ×Fable-5 — `VERDICT = 27 giống-được / 6 buộc-khác / 8 data-gap`, 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-investigator-codebase-invest-s171.md` **44.830 B** (artifact lớn nhất phiên)`:** Cấu trúc 8 mục: **§0 hai đính-chính vào ground-truth của LEAD (đặt TRƯỚC §1 — nghề đúng: bác tiền-đề trước khi xây trên nó)** · §1 bản-đồ 3 panel PE mẫu · §2 bản-đồ KHKK hiện trạng · §3 bảng DELTA per-panel · §4 data-gap · §5 kiến-trúc đề-xuất · §6 rủi-ro/bẫy · §7 checklist ĐO ĐƯỢC · §8 ba câu muốn lead đọc kỹ nhất. 🔴 **Bị 3 lane `reviewer` soi ngay sau đó và KHÔNG đứng trọn:** miễn-trừ **6 → 3** (P1-4 + P2-7 lật thành giống-được; P3-12 hạ xuống hoãn vì tiền-đề *'KHKK 3 trạm ngắn'* đo lại là **SAI**`DbInitializer.cs:554` = 3 Bước × ≤2 Cấp, seed tự ghi *'sao từ workflow Duyệt NCC prod'*), và **6 acceptance của nó bị bẻ gãy khi chạy thật**. ⇒ **Bài: bản invest 44 KB rất đầy đủ vẫn KHÔNG thay được lượt reviewer đối-kháng** — đầy-đủ ≠ đúng. Tag `[s171, fable-5, 27-6-8, dinh-chinh-ground-truth-truoc, mien-tru-6-xuong-3, day-du-khong-bang-dung]`
---
## [S160 entry]
- **S160 (07-29) DRY-RUN toàn-trình đến HĐ cứng — 2 lane `/fable-real` [engine-label real-fable-S160; lane-2 lượt-1 #53 garble → resume sạch, đĩa mất 0 B] [`runs/2026-07-29-S160-khkk-dryrun-plan/sub-investigator-codebase-{1,2}.md` 24.2K+32.2K]:** Lane-1 nguồn: ranh GĐ3=b.13→18/GĐ4=b.19→21 ĐÃ ratify @S159 spec `:27` (đừng suy lại từ QT); RG-001 v02 CHỈ 4 viết tắt — **codegen tự chế "MB"** (`ContractCodeGenerator.cs:25`, không gốc quy định); bản cứng vật lý SINH ở b.17-18 ∈GĐ3 (GĐ4 hiển thị readonly phần nó không tạo); FO-002.01 tick-box 6 loại ≠ 7 ContractType; forms-spec = parse chính v02, 0 lệch format. Lane-2 code: `Hdc_*` = **7-leaf-per-ContractType** (loop `DbInitializer.cs:1862-1867`) KHÔNG phải 6-leaf — đề bài lead sai 2 grounding, lane tự bẻ; KHÔNG có phase KyCung (8=DangDongDau LEGACY, terminal=DaPhatHanh 9 → GĐ4 = DERIVE sau terminal, 0 mig); 🔴 `DeleteContract` guard `Phase >= DangInKy` so sánh SỐ ⇒ chặn xóa cả 9/10/98/99 (dry-run rác phải admin-override hoặc chấp nhận); mặt tấn công thật = nhánh Reject-trước-guard `ContractWorkflowService.cs:49-66` (Approve CÓ guard); "khuôn PE per-action" KHÔNG tồn tại tầng attribute (PE class-trần + handler-Forbidden) — tiền lệ per-action thật = `/deleted` `ContractsController.cs:28-29` + Suppliers; `Contracts` ∈ All ⇒ 4 policy sống sẵn 0-key-mới. Lead đo bổ sung: **prod Contracts = 0 active + 0 deleted** (admin bypass `:298/:440` — sổ "7 HĐ V1" S156 STALE); login prod parse field `accessToken` (không phải `token`). Đầu ra: plan-cha + 7 spec-wave (W1-W3,W5-W8; W4/W9 defer) cùng run-folder. Tag `[s160, dry-run-toan-trinh, hdc-7-leaf-per-type, delete-guard-numeric-compare, reject-truoc-guard, contracts-policy-co-san, mb-khong-goc, prod-contracts-0]`
---
## [S157 entry]
- **S157 (07-28) KH-ký-kết-HĐ b.7→12 [§A+§B đĩa, §C/§D PENDING lượt sau, `runs/2026-07-28-S157-ke-hoach-ky-ket-hd/sub-invest-kehoach-1.md`]:** Owner chốt O-1 *"cấu trúc trình ký GIỐNG, khác nội dung"* ⇒ tái dùng khung V2, dựng 7 bảng NỘI-DUNG `ContractSigningPlan*` (Mig 69 thuần CreateTable; mig cuối=68 verify ls) + `ApplicableType=10` (slot trống `ApprovalWorkflow.cs:53-67`). 🔴 Bẫy twin MỚI: **Proposal-lite ApproveV2 PHÁ OR-of-N**`ProposalFeatures.cs:427-439` flatten global-level + `ElementAtOrDefault` match 1-user, entity không có StepIndex (`Proposal.cs:27`) ⇒ 2-row-cùng-Order thành AND tuần tự; KH service PHẢI copy `ContractWorkflowService.ApproveV2Async:217-394`, Proposal chỉ làm khuôn CRUD/menu/FE. Twin đo thật: Proposal BE 849 · FE 1.956 LOC · 4 bảng (Mig 38 grep CreateTable) · PE 6.5K/14.9K cận trên. `ConflictException :115-116` tự xác minh đĩa (skill contract-workflow stale — fallback V1 chỉ sống đường display). ISO doc 9 bước ↔ `ContractPhase` 1-9 khớp 1:1 (7 LEGACY = ISO mã-hoá cứng); khúc b.7-12 thiếu CẢ ISO-doc lẫn code; FO-002.01 có luật auto-pass-quá-01-ngày (mâu thuẫn V2 no-auto-approve; O-2 SLA=tham-khảo). #53: coordinator chặn skeleton-rỗng @202K-token → cắt còn §A+§B, Edit-liền-tay từng mục. Tag `[s157, ke-hoach-ky-ket, proposal-lite-breaks-or-of-n, iso-9-steps-eq-contractphase]`
---
## [S156 entry]
- **S156 (07-27) BCH post-CEO flow bước 7→21 [§0-§3+§6 đĩa, §4-§5 PENDING lượt sau, `runs/2026-07-27-S156-bch-post-ceo-flow/sub-invest-bch-1.md`]:** Verdict **LAI** — 13→21 TÁI DÙNG Contract (7 dòng `[LEGACY]` `ContractPhase.cs:11-13` chính LÀ trạm 13-21 đã gỡ CỐ Ý Mig21/S17; V2 `ContractWorkflowService.cs:217-394` cookie-cutter sẵn, terminal gen-mã+DaPhatHanh) · 7-12 DỰNG MỚI (0-hit shopdrawing/TVGS, khuôn 12-bis + `ApplicableType=10` append-only). 🔴 Chuỗi "cơ-chế đúng, thứ đi qua KHÔNG có" phía HĐ: cầu PE→HĐ pin V1 (`CreateContractFromEvaluationFeatures.cs:68-71,108`) không nhận V2 + UpdateDraft không re-pin · `GetEligiblePhases` (`ContractFeatures.cs:334-351`) + inbox `PhaseActorRoles` (`:363-372`) 100% LEGACY-phase ⇒ approver V2/BCH KHÔNG xem/inbox được HĐ ChoDuyet · `CeoApprovalThreshold` 0-consumer HĐ (bước-18 ">5 tỷ" chưa có máy) · SLA V2 hardcode `AddDays(7)` 3 site, Step không có SlaDays · notify chỉ Drafter (`:407`) · `AttachmentPurpose` thiếu ký-nháy (enum-extend 0-mig tiền lệ PE=4) · HĐ TraLai reset-toàn-phần không 4-mode. Mig 68 `AddPeAllowApproverDelete` ĐÃ land 07-27 ⇒ mig kế = 69. Bắt lead sai grounding: 12 enum/7 LEGACY (lead ghi 9/6) — lead nhận. #53 strike-1 (return bốc hơi, đĩa nguyên → lead đọc từ đĩa, không redo). Tag `[s156, bch-post-ceo, verdict-lai, eligible-phases-legacy-only, bridge-pins-v1]`
---
## [S155 menu/trash/dept-head entry]
- **S155 (07-27) PE menu/trash/dept-head [21 finding, `runs/2026-07-27-S155-pe-delete-approver/sub-invest-menu-3.md`]:** 🔴 Menu = **SEED DB** không hard-code FE — `Pe_<Code>` khai `DbInitializer.cs:1874-1877`; thêm mục = restart API, 0 migration (upsert `:1888-1914` chỉ sửa `Order`, **KHÔNG đụng Label** ⇒ rename qua `labelBackfill:1918-1924`; `DisplayLabel` **CHỈ ăn fe-user** `MenuDtos.cs:14`). 6-chỗ-mirror: +2 seed permission SONG SONG `:2092-2096`/`:2492-2496` + regex `Layout.tsx:120` (fe-admin `:107` thiếu `WfView`). Đổi KEY = mồ côi 13 row/key × 10 key ⇒ giữ key chỉ đổi label. **`Đã duyệt` chạy được HÔM NAY**: `phase=` đủ 3 tầng (`Controller:23``Features:565``:620`), DaDuyet=7 ⇒ `?type=1&phase=7`, 0 route mới. `pendingMe` KHÔNG phải param BE (FE rẽ `/inbox` `ListPage:61-68` + lọc client `:182`). `IgnoreQueryFilters` 0 src/Backend / 15 hit tests; `HasQueryFilter(`=12. An-toàn accumulator = **cấu trúc** (`PeBudgetAccumulator.cs:42`/`:100` dựng `peers` FRESH). 🎁 Changelog `: BaseEntity` + lọc CHỈ `PurchaseEvaluationId` (`:1424`) ⇒ lịch sử phiếu-xóa đọc MIỄN PHÍ; cái chôn = DETAIL bundle. 0 tiền lệ thùng-rác (hit "khôi phục" duy nhất = STRING `EmployeeFeatures.cs:162` ghost-wire). 🔴 **"Trưởng phòng" CÓ TÊN CHƯA CÓ ĐỜI**: `Department.ManagerUserId` **0/10 Dev** + 2 FE hardcode `managerUserId: null` payload SỬA (`DepartmentsPage.tsx:43`/`:57`) ⇒ tự-xoá mỗi lần sửa phòng. `PositionLevel.TruongPhong` 33/33 NULL (V1-legacy). Tag `[s155, menu-seed-db, phase-param-exists, changelog-survives-softdelete, dept-head-name-only]`
---
## [S155 WF-V2 sửa-tại-chỗ entry]
- **S155 (07-27) WF-V2 sửa-tại-chỗ vs version-mới [25 finding, `runs/2026-07-27-S155-pe-delete-approver/sub-invest-wfver-4.md`]:** 🔴 **0 lệnh Update**`ApprovalWorkflowsV2Controller.cs` (54d TOÀN BỘ) chỉ GET/POST/PATCH-user-selectable/DELETE ⇒ sửa 1 cờ = buộc POST = `MAX(Version per Code)+1` (`ApprovalWorkflowV2AdminFeatures.cs:325-328`) + hạ MỌI active cùng type (`:330-334`). Chặn THẬT bằng mã. 🔴 **F17:** POST tạo entity mới ⇒ **Id mới** (`:336`+`BaseEntity.cs:5`) mà phiếu đọc workflow theo **Id đã pin** (`PurchaseEvaluationWorkflowService.cs:674`) ⇒ **cờ mới KHÔNG tới phiếu đang chạy**; re-pin chỉ `PurchaseEvaluationFeatures.cs:149`/`:291``:249-251` chặn chỉ Nháp/TraLai ⇒ ChoDuyet kẹt bản cũ vĩnh viễn; 0 backfill re-pin. ⇒ cờ `AllowApproverDelete` **HỎNG nếu không có lệnh Update**. Pin = **tham chiếu SỐNG** (chỉ NS có snapshot Mig67). Con trỏ **LAI**: Bước=INDEX `steps[currentIdx]` (`:686` vỡ ÂM THẦM/`:683` kẹt) · Cấp=ORDER-VALUE (`:694``:695` kẹt) ⇒ ranh AN-TOÀN = **không đổi tập `{Step.Order}``{Level.Order}`**. 13 thao tác: 3 an-toàn (thêm-người-cùng-Order · cờ `Allow*` · đổi tên) · 2 nửa (bớt/đổi `ApproverUserId` → 403 GUID-trần `:705`, FK Restrict `PeLevelOpinionConfiguration:25-28`) · 6 phá-vỡ · 2 hỏi-owner (`CeoApprovalThreshold`·`Step.DepartmentId`). OR-of-N XÁC NHẬN (`:689` GroupBy Order) ⇒ owner không tự mâu thuẫn; ⚠️ comment `ApprovalWorkflow.cs:81-82` SAI *"KHÔNG OR-of-many"*. Blast 6+ module (198 hit/23 file). Designer **fe-admin ONLY** (`ApprovalWorkflowsV2Page.tsx`), "Nhân bản"→*"Tạo quy trình mới"*; **0 cảnh báo đang-dùng/0 disable IsActive**. F6 tick `:999-1007` +dây `:54/:110/:159/:177/:605` + fe-user `WorkflowMatrixViewPage.tsx:282` + BE `:41/:230/:188/:368`. CẤM delete-then-insert Levels → diff theo `Level.Id`. Tag `[s155, wf-v2-no-update-cmd, new-version-new-id-unreachable, pointer-index-vs-order]`
---
## [S149 section]
## S149 (2026-07-24→25) — 10 invocation gộp 1 entry [LEAD GHI ON-BEHALF @S150 — M9/B3 theo H2-F3 Coverage-miss (10 lượt → 0 delta sổ, ngoài lưới C11(b) by-design); nguồn: sub-file trong `runs/2026-07-24-S149-{dong-du-5-vong,hoi-tu-bookend,owner-gated-3-khoan}/` + `runs/2026-07-25-S149-adap-backlog/sub-invest-backlog.md`]
- 10 lượt invest @S149: chẩn-đoán **"SE = rules-đủ, máy-thiếu"** (0 script GHI `.session-counter.json` → chuỗi "đo rồi như chưa đo": backfill S146 · tally-rơi S148 · ×27≠33) — ĐỨNG qua gate reviewer-Fable, thành spec hội-tụ-bookend M1-M9. Backlog adap phân-loại **A-12/B-6/C-1/D-3** ("nợ REPORT không phải nợ ADOPT") → wave 6-lane land 23/23. O-2 nguồn thật = depth-axis → **posture-A**.
- #53 trong 10 lượt (ghi sổ garble @S150): L1 **ngược-#53** (return OK, ĐĨA không — vớt journal) · L5 kinh-điển (đĩa cứu) · L7 mất-cả-hai (bù deep-pass). Sub-class mới: ghi-đĩa-trong-lúc-làm = CẦN, KHÔNG ĐỦ.
## [S152 section]
## S152 (2026-07-25) — R1 retention-note không-fabricate [M9 on-behalf lead]
- **KHÔNG fabricate — uncertain thì nói "uncertain" + reason:** finding không chứng được từ đĩa/DB phải khai uncertain kèm lý-do thiếu-chứng, KHÔNG lấp bằng suy-đoán (tiền lệ tốt: A/018 S117 — verify prod-DB `Phase=ChoDuyet` trước khi phán "lũy kế đúng", thay vì đoán theo lời UAT). Claim ≠ chứng: mọi số kèm lệnh. Tag `[s152, r1-retention, no-fabricate-uncertain-reason]`
---
## [S158 section]
## S158 (2026-07-28) — `/fable-real` adap `day-wake-probe-first` [LEAD SEED ON-BEHALF @closeout M9 — mày chạy THẬT (Fable, 222K tok, 20 tool-use) nhưng KHÔNG tự ghi; nguồn = `runs/2026-07-28-S158-day-wake-probe-first/sub-invest-day-1.md` 25.440 B + adap-synthesis]
- **Return CLEAN 0-garble** giữa một closeout mà **7/8 lane khác đều `#53`**. Khác biệt DUY NHẤT: prompt ép **ghi đĩa từng phần trong lúc làm** + **verify RUỘT có chữ trước khi return**. ⇒ datum củng cố: chống `#53` = **thiết-kế artifact**, không phải prompt.
- 🔴 **BÁC 2 tiền-đề của LEAD — đây là giá trị chính của lượt này, không phải bản đề-xuất:**
(a) *"SE có squash ⇒ có sha mồ-côi"* → đo `cat-file -e` + `is-ancestor` trên 8 marker = **sống 8 / mồ-côi 0**; squash `session-end` chỉ gọt trailing-`wal:` **chưa push**, 6/8 sha đã push. **Vẫn giữ guard** vì tiền lệ S127 dangling có thật + chính feature `/day` tự đẻ điều kiện orphan.
(b) *"probe nên tái dùng Sàn-3"***BÁC bằng bằng-chứng CÙNG CỬA**: Sàn-3 ② HIT ⟂ anchor-delta 0 CLEAN, verdict **NGƯỢC NHAU** vì hỏi **2 câu khác nhau** (*"tồn-tại việc dở"* neo `origin/main`*"đổi so điểm dừng"* neo marker pause) ⇒ dựng phép-2 KHÔNG vi phạm B1.
**Nghề rút ra:** khi lead nêu sẵn một hướng nghiêng, cách bác mạnh nhất là **tìm một cửa mà 2 phép cho verdict ngược nhau** — mạnh hơn mọi lập luận về nguyên tắc.
- **Nghề đo đáng giữ:** anchor = **carrier-commit** `git log --diff-filter=A -1 -- <marker>` (commit ĐẦU TIÊN thêm chính file đó) — 8/8 resolve, **sống-sau-squash by construction**, và **nuốt luôn bẫy-anchor-lệch-1-nhịp** mà hub phải xử bằng bước resolve riêng. Mạnh hơn form của hub.
- **Đo BYTE, CẤM quy token** (chính lỗi làm thư hub trượt vòng r1: dán nhãn "token tự đo" lên proxy ký-tự). `tiep_reload` SE = **122.115 B / 5 nguồn**; nền SE **nhẹ hơn hub 3,6×** ⇒ đừng mượn số hub bán lợi ích.
- **2 phát hiện ngoài đề-bài, cả 2 lead xác nhận:** `docs/HANDOFF.md` segment mới nhất còn **S153** ⇒ nguồn-2 của `tiep_reload` nạp brief cũ **3 nhãn phiên** (vá @S158) · `_tiep-1.md` ghi head-sha **7 ký tự** trong khi 7 marker kia ghi đủ 40 = form drift trong cùng một loại marker.
- Tag `[s158, fable-adap, ghi-dia-cuu-return, bac-tien-de-lead-bang-cua-verdict-nguoc, carrier-commit-anchor, byte-khong-token, seed-on-behalf]`
---
## [S175 section]
## S175 (2026-08-05) — `/fable-real` invest cột DỰ ÁN trong ma-trận ngân sách [LEAD SEED ON-BEHALF @pause cổng C2 — mày chạy THẬT (Fable, 169K tok, 38 tool-use, ~12) nhưng KHÔNG tự ghi; nguồn = `runs/2026-08-05-S175-duan-budget-column/run.md` + `spec-hang-muc-nhieu-dong-va-cot-du-an-05-08-2026.md`]
- 🔴 **BÁC 2 tiền-đề của LEAD — đây mới là giá trị chính của lượt này, không phải bản đề-xuất:**
(a) Lead đoán *"cột DỰ ÁN là DI-CHỨNG module Budget cũ bị Mig 50 rút ruột"***SAI**. Đo git: cột sinh ở `e33481e` **19-06** (Mig 56), tức **SAU** Mig 50 (13-06) **6 ngày**, và **CÙNG COMMIT** với comment ý-định `PeWorkItemBudget.cs:19` *"DỰ ÁN: hiển thị FE-only (chưa wire BE — sau mới có NGƯỜI DỰ ÁN NHẬP)"***CHỖ-CHỪA-SẴN có chủ đích**, không phải xác chết.
(b) Lead đo *"hardcode `—` ở ≥3 chỗ"***THIẾU**. Thật = **11 ô/app** (Block A 3 + Block B 8), mirror 2 app.
**Nghề:** tiền-đề đổ mà **kết-luận hệ-quả vẫn đứng** ("phải dựng một tầng, không phải vá 1 cột") — đừng vứt cả kết luận khi vứt tiền-đề.
- 🔑 **Phát hiện ngoài đề-bài, đắt nhất lượt này:** `Project.BudgetTotal` **ĐÃ TỒN TẠI từ Mig 2 — day-1**, wired TRỌN 2 đầu (BE CRUD `ProjectFeatures.cs` + FE cột "Ngân sách" `ProjectsPage.tsx:117` + form `:205`). Chỉ (i) chưa nối vào ma-trận PE, (ii) **DỮ-LIỆU RỖNG: Dev 61/69 dự án NULL** (8 cái có số đều là demo-seed gated-OFF-prod). ⇒ rất có thể CHÍNH LÀ thứ owner nói *"bên mục ngân sách có mục dự án chưa điền vào"* — lớp **"cơ-chế đúng, dữ-liệu không có"** lần thứ 7.
- **Nghề đo đáng giữ:** truy phả-hệ một dòng code bằng **commit sinh ra nó + comment cùng commit**, thay vì suy từ khoảng thời-gian gần nhau. Mig 50 và cột DỰ ÁN cách nhau 6 ngày — đủ gần để đoán bừa là "di-chứng", và đoán đó SAI.
- **Kết cục thực-tế:** owner sau đó chốt *"ko cần so sánh j với số duyệt PRO hay CCM j cả"* ⇒ phương-án live-derive engine đề-xuất **KHÔNG land**; nhưng 2 đính-chính (a)(b) + phát hiện `Project.BudgetTotal` **vẫn còn giá trị** cho lượt sau. Điều-tra không land ≠ điều-tra vô ích.
- 🔸 **META hạ-tầng:** spawn tới với **TASK RỖNG** ("thiếu prompt — lỗi taskList @P0"); mày khôi-phục trọn đề-bài từ `run.md` trên ĐĨA. ⇒ củng cố khuôn **artifact-trên-đĩa > return**: run-folder cứu được cả ca dây-spawn hỏng.
- Tag `[s175, fable-real, bac-tien-de-lead, pha-he-bang-commit-sinh-ra, co-che-dung-du-lieu-khong-co, artifact-dia-cuu-spawn-rong, seed-on-behalf]`
---
## [Context blocks bị rút khỏi index @S180 — verbatim]
### Active workflow schemas (V1 + V2 coexist post-S17)
- **V1 Mig 21 flat** — `WorkflowDefinition` pin cũ, match Dept+PositionLevel.
- **V2 Mig 22-31** — `ApprovalWorkflow` pin PE/Contract, match `ApproverUserId` 1-1 OR-of-N cùng Cấp. Steps(Phòng)>Levels(Cấp). Proposal V2 Mig38, WorkflowApps Mig39. (Mig25 IsUserSelectable · 26 LevelOpinions UPSERT · 30 AllowApproverEditBudget · 31 SkipToFinal→ApproverLevel · 53 cờ-gấp+CeoThreshold · 54 giá-đề-xuất · 58 IsWinner multi + AllowApproverFinalize · 65 Quote.IsSelected per-hạng-mục · 66 ApprovedPrice Min-Max · 67 budget-freeze snapshot).
- **State PE 5:** Nháp / Đã gửi duyệt / Trả lại (TraLai=98) / Từ chối (TuChoi, REMOVED-path S60) / Đã duyệt
- **Mode Trả lại 4:** OneLevel / OneStep / Assignee / Drafter (Phase=TraLai). 3 đầu giữ ChoDuyet lùi pointer. Admin bypass `level.Allow*`.
- **Seeds gating:** `SeedDemoMasterDataAsync` gated `DemoSeed:Disabled` (OFF prod) · `SeedRealMasterDataAsync` UNGATED (62 dự án + 71 hạng mục Excel, per-code idempotent, exact-Code key #75/#76 resurrect risk).
### Counts row (đã derive-được từ STATUS, rút khỏi index)
- ~88 SQL tables (count `.ToTable()` snapshot NOT DbSet) · ~253 endpoints · 68 FE pages · 54 menu keys (`MenuKeys.cs`) · ~354 test · ~71+ gotchas · 14 sub-agents (worker-tier-pin S124) — SỐ STALE THEO THỜI GIAN, canonical → docs/STATUS.md.

View File

@ -31,7 +31,31 @@
### 🔴 Điều chỉnh thiết kế cho N3 (rút từ 7/7 ca #53 phiên này)
Counter-datum ổn định qua S151 · S152 · S180: **return-only + khuôn cứng định sẵn sống sót tốt hơn return tự-do sau khi làm việc dài.** Bằng chứng mạnh nhất phiên này: **3 spawn-probe vai STYLE trả đúng 1 dòng cố định → 3/3 CLEAN** trong khi 7/7 vai làm việc dài đều garble.
**N3 ensemble mỗi lane PHẢI có:** (a) ép ghi đĩa từng phần · (b) **khuôn return CỨNG, ngắn** (verdict dòng-1 + ≤N mục cố định) · (c) lane độc lập nhau để 1 lane chết không giết cả run (`parallel()` chứ không `await` chuỗi).
- [ ] N2 `/fable-real reviewer` — phản biện N1
- [x] **N1 XONG**`INVEST-N1: PHỦ ĐỦ — 7GĐ/7 · 12TC/12 · 9LỖI/9`, artifact **48.433 B** (§0-§7 + END-line). Recover #53 bằng lệnh "đổ ruột trước" ⇒ **7.049 B → 48.433 B**.
- [!] **N2** `/fable-real reviewer` — phản biện N1 — ĐANG CHẠY
### N1 — kết quả cốt lõi (lead đã verify 2 claim load-bearing)
**Bậc trưởng thành SE theo GĐ:**
| GĐ | trạng thái SE | thiếu gì |
|---|---|---|
| **GĐ-5** | 🟢 **gần xong nhất** — H21 per-invocation + worker-tier-pin + `spawn-model-audit` đo S126 0-mismatch + vật chứng chung-gốc `runs/` + ctx-pack chống-nạp-giả | sổ-khung-nhìn lượt đắt · luật truyền-nguyên-văn |
| **GĐ-2** | 🟡 **~70%** — run-folder FLAT + `nhip-no` orphan-count + archive-gate A7 + trần-ở-config | vị-từ CỤT/NÉN (AS-17/19 mới là **nghi-thức**, chưa cơ-khí-hoá) · mục-lục-sống `runs/` · điểm-danh-2-nguồn |
| **GĐ-3** | 🟡 **nửa** — bookend 2-đầu + đèn-nợ-4-cửa + carrier-commit **ĐÚNG NGUYÊN VĂN hub** | 4-nhãn · vòng-hỏi-ngược · thang-exit |
| **GĐ-1** | 🔴 **chốt MỞ KHOÁ** — có máy rời (C3/C11/alias-map) nhưng **không có chuẩn-duy-nhất****KHÔNG khai miễn được** ⇒ chặn điều-kiện-vào mọi GĐ sau | chuẩn đặt tên duy nhất (TC-11) |
| **GĐ-4** | 🔴 **hổng nhất**`grep "sở-thích\|phàn nàn"` = **0** (control 3 file) · chấm điểm `grep` = **0** (control 3 file) | sổ 3-khối · cơ chế chấm điểm. **TC-12 SE NẶNG HƠN hub**: điểm **chưa từng được sinh** |
| **GĐ-0** | 🟡 gần đóng | dòng sổ "đã nhận" (A0-3 hụt) · fit-map · tệp theo dõi · report |
| **GĐ-6** | ⚪ chưa động — **đúng thiết kế** (điều-kiện-vào chưa thoả) |
**Xung đột triết lý — N1 tìm được ĐÚNG 1:** hub GĐ-3 đòi **cổng-CHẶN-mã-lỗi 4 trạng thái** ⟂ SE doctrine **exit-0-advisory** (`governance-detectors.ps1:1963` *"Exit 0 always"*) + probe-không-chặn 4 cửa. SE chỉ có **2 máy fail-loud** (`session-counter-tick`, `h24-signal-write`) + `hmw` checkpoint throw.
*(N2 được giao nhiệm vụ tìm xung đột **thứ hai** — "chỉ 1" là loại kết luận dễ sai theo hướng lạc quan.)*
**4 khoản VƯỢT-KHUNG → cần anh + AI_INFRA:** (1) đổi exit-0 → gate ở lớp detector/sentinel · (2) wire chấm điểm vào 2 cửa phiên + vai tầng-2/3 + thu-hẹp-vai-cũ · (3) sổ-3-khối = **artifact lane quản trị MỚI cạnh WAL** (🔴 nguy cơ **nguồn-đôi**, phải vẽ ranh trước) · (4) đẻ vai mới (giữ-chuẩn-tên / đọc-sổ) — đụng roster + điều-kiện-vào GĐ-6.
**TC-04 — lưới SE đang TRẢ LÃI, đo được:** 7/7 vai dính #53 phiên này (N1 là vai thứ 7), **recover mất 0 byte** nhờ ghi-đĩa-trong-lúc-làm.
**🔴 F-1 gửi ngược hub (không chặn GĐ-0):** cả 4 thư frontmatter `status: DRAFT` + `reviewer_gate: "PENDING"`, trong khi `thu-chinh:66` tuyên *"khi phát, mỗi món đi kèm dấu xác thực nội dung và **trạng thái đã duyệt**; **bản nháp thì không có**"*. **Lead verify: 4/4 đúng.** Hash **4/4 khớp canonical** qua `scripts/stamp_verify.py`**không phải tamper**, là **dấu trạng thái lệch nội dung**. 🔸 Phép hash **tự chế của N1 ra MISMATCH cả 4** → suýt phán tamper sai; đúng bẫy `false-tamper` @S141, **máy mesh cứu**.
**A0-3 hụt:** 4 thư nằm inbox 2 ngày mà `grep "upgrade-pack-phased" broadcasts/_index.md` = **0 hit** (control `harness-22` = 3) ⇒ chưa có dòng "đã nhận".
- [ ] N3 `/fable-clone reviewer` — ensemble bóc tách không bỏ sót
- [ ] N4 `/fable-real reviewer` — tổng hợp → **plan wave**
- [ ] N5 HMW fan-out Opus 5 MAX — thi công từng wave
@ -50,7 +74,7 @@ Counter-datum ổn định qua S151 · S152 · S180: **return-only + khuôn cứ
| **6** neo trích dẫn bằng số dòng chết ngay khi sinh | ✅ **HÔM NAY** | `STATUS:8` trỏ `:479` mà row bundle ở **`:481`** · `lead-stale-auditor.md:45` neo `STATUS:19` (dòng không liên quan) · memory `feedback_absence_looks_like_clean` đã ghi lớp này |
| **7** tuyên "gấp đầy đủ" mà thân là mục lục | ✅ | `skeleton-ruột-rỗng` **nấc-2** — 1.661 B **toàn heading** sau 202K tok; guard "byte tăng" MÙ với ca này |
| **8** nhãn "đã đóng" hẹp hơn phạm vi thi hành | ✅ **HÔM NAY** | slot **(70)** `~~ĐÓNG @S179~~`**rider lỗi máy H24-2 còn sống** (`lead-gap` FLAG-1) |
| **9** cưỡng chế được tuyên mà chưa có máy | ✅ | class **ghost-wire** của SE (H18): `tools-whitelist-no-teeth` · `session_ctx_kb` 0-reader @S146 · `pull_warn_days` khoá trống |
| **9** cưỡng chế được tuyên mà chưa có máy | ✅ (2 món, **không phải 3**) | class **ghost-wire** của SE (H18): `tools-whitelist-no-teeth` · `session_ctx_kb` 0-reader @S146. ⚠️ **`pull_warn_days` ĐÃ BỊ N1 BÁC — lead sai:** `check-email.md:48` ghi rõ *"🔒 CỐ Ý để TRỐNG — anh không đặt số @S148, script cấm tự chế mặc-định"* ⇒ đây là **cố-ý-chưa-đặt-CÓ-KHAI**, KHÁC HẲN *defined-but-unread*. Lead verify: xác nhận N1 đúng. 🔸 N1 khai thẳng nó **chưa đo lại 2 món kia** ⇒ 2 món đó vẫn đứng nhưng chưa được kiểm chéo lượt này. |
🔴 **Kết luận sơ bộ của lead: 9/9 lớp SE đều có ca THẬT.** Đây là **hội tụ ĐỘC LẬP** — 4 thư kéo về **SAU KHI** bookend @open đã chạy xong và các ca trên đã được ghi. SE không đọc thư rồi diễn lại. ⇒ tín hiệu **PROJECT-FIT cao**.
🔸 Khai mặt kia: lead mới soi **9 lớp lỗi**, **chưa** soi 7 GĐ và 12 TC — đó là việc của N1. Bảng này là **thước để kiểm N1**, không phải kết quả thay N1.

View File

@ -46,14 +46,210 @@
---
### GĐ-1..GĐ-6 `[ĐANG ĐO — append tiếp]`
### GĐ-1 — Nền chuẩn đặt tên, áp về phía trước
## §2 — TRỤC 2: 12 TC × bệnh SE `[ĐANG ĐO]`
**Hub đòi:** 1 văn bản chuẩn duy nhất phủ 6 nhóm tên + luật lane đơn trị · 1 vai giữ chuẩn quyền hẹp 2 lớp · sổ đổi tên chỉ-thêm-không-xoá cột "đã quét những đâu" (lệnh + số hit thật) · máy soi tên cổng, báo-cáo-thôi trước, in mẫu số · đối chứng 2 chiều + phản chứng · luật giữ-nguyên-tên-cũ + di trú 6 bước.
## §3 — TRỤC 3: 9 lớp lỗi × ca SE đã giẫm `[ĐANG ĐO]`
**SE đã có (mảnh, đo được):**
- Máy quét governance-MD: `scripts/governance-detectors.ps1` (1.964 dòng, 17 lưới: C1..C12 + H24-1..5 + H25×2 liệt bằng `grep -n "Write-Section" scripts/governance-detectors.ps1` = 20 hit gồm helper). Trong đó **C3 vocab-fork** = soi 1-khái-niệm-nhiều-tên.
- **Tách "con số lái thoát" vs "con số báo-cáo-thôi"** đúng nguyên văn GĐ-1(v) hub: `Write-InformFlag` counted SEPARATELY, "NEVER folded into $script:FlagCount" (`governance-detectors.ps1:65-72`, anti-Goodhart owner-set); output 2 dòng `TOTAL FLAGS` `INFORM-ONLY` (`:1941+`).
- Sổ họ-hàng-gần: `docs/governance/vocab-alias-map.md` **append-only, single-writer em-main, có cột lý-do-đổi, khai frozen-set** (sessions/ archive/ runs/ broadcasts/ không viết lại "giữ nguyên tên " chính luật này áp cho THUẬT NGỮ).
- Quy ước tên đang SỐNG rải rác: run-folder `YYYY-MM-DD-S<N>-<topic>` (90 folder tuân thủ `ls .claude/workflows/runs/ | wc -l` = 90) · sub-file regex máy đọc `^(sub-.+|.+-return)\.md$` (`governance-detectors.ps1` C11 body regex này BẢN S159 sau ca tên lọt lưới S153) · roster INFORM-only đọc SỐNG từ agent frontmatter, không hardcode (C11 body "a NEW monitor auto-joins").
- Bài học chống-hardcode-số đã thành văn trong máy: `hmw.js:9` + comment `:57` *"KHÔNG chép số — lesson S108, tái @S151: '17/17' viết cứng đã stale khi roster lên 20"*.
- Form-check vai: `scripts/agent-frontmatter-eol-check.ps1` (tồn tại, `ls scripts/`).
## §4 — Phát hiện ngoài đề bài / xung đột / VƯỢT-KHUNG `[ĐANG ĐO]`
**SE thiếu:** (1) **VĂN BẢN CHUẨN DUY NHẤT** phủ 6 nhóm (tên vai · nhãn lớp kiểm · thư mục run · tệp mốc phiên · nhãn tác vụ · tên sổ) hiện tán xạ trong personas/commands/engine-doc; (2) **vai giữ chuẩn** không tồn tại; (3) **sổ đổi tên cho TÊN-MÁY-ĐỌC** (vocab-alias-map chỉ cho thuật ngữ, KHÔNG cột "đã quét những đâu" dạng lệnh+hit); (4) **máy soi TÊN chuyên trách** C3/C11 soi vocab + khuôn FLAG, không soi 6 nhóm tên; (5) di trú 6 bước thành văn.
**Ca bệnh TC-11 thật của SE:** tên `sub-ctx-audit-*` lọt lưới C11(b) filter `^sub-<role>[-.]` (S153, đã S159 vết trong chính detector body: *"mirror of the C11(b) filter fix — ctx-audit FLAG-6"*); marker `_tiep-1.md` ghi sha 7-ký-tự khi 7 marker khác ghi 40 (S158, form-drift cùng loại marker).
**Xung đột:** không chỉ thiếu.
**Điều kiện vào:** GĐ-0 thi công CHƯA (đang làm). **SE KHÔNG khai `không áp dụng` GĐ-1 được một cách thật thà** (chưa chuẩn-duy-nhất tương đương kiểm được) GĐ-1 chốt mở khoá các sau.
## §5 — Fit-map 7 dòng (Phần A khuôn, bản đề xuất cho lead) `[CHỜ §1-§4]`
---
## §6 — Đề xuất thứ tự wave sơ bộ `[CHỜ §1-§5]`
### GĐ-2 — Lưới ghi đĩa và sổ mục lục vật chứng
**Hub đòi:** lane ghi nguyên văn mọi cửa phản biện · vai điểm danh cấm-sửa · máy điểm danh 4 vị từ (vắng/rỗng/cụt/nén-quá-tay) + vị từ bộ-tệp-nội-bộ-thư-mục · 3 nhịp (đầu phiên/sau-lượt-đắt/cuối phiên) · sổ mục lục 2 tầng trần-đo-bằng-lệnh trỏ-không-chép · điểm danh 2 nguồn ghi chênh lệch.
**SE đã có:**
- **Lane ghi nguyên văn:** run-folder TRACKED FLAT `run.md + sub-<role>-<i>.md + <stage>-synthesis.md` (`hmw.js:9` mode B, Harness-10) 90 folder; spec-pin trước spawn (H21); chính file này instance sống.
- **Máy đếm mồ-côi:** `scripts/nhip-no-probe.ps1` vế `run-chua-gom` orphan run-folder theo DUAL-ACCEPT port nguyên văn `tiep.md:40-53` (header script tự khai). Vị từ "vắng synthesis" = .
- **Gate con trỏ mục lục:** `scripts/memory-archive-gate.ps1` A7 L1-GATE mọi substring-pointer trong `<sub>/archive/_INDEX.md` phải resolve (SimpleMatch) + file exists + **size>0** PASS/FAIL. = vị từ VẮNG + RỖNG + MỤC-NÁT cho tầng agent-memory.
- **Sổ mục lục 2 tầng cho agent-memory:** MEMORY.md (L1 HOT) + `archive/_INDEX.md` (sha-keyed substring) per-role; **trần sống ở config**: `memory-budget.json` key `archive_gate.autoinject_cap_bytes` script ĐỌC khoá, thiếu key in `CONFIG-THIEU(...)` KHÔNG default (`nhip-no-probe.ps1` header contract (4)); `session_ctx.py` `_require_budget_kb` cùng triết . = đúng "trần tệp cấu hình chung, tài liệu trỏ khoá".
- **3 nhịp:** đầu phiên (bookend @open + Sàn-3) · cuối phiên (khối instruments `session-end.md:164`: measure-agent-memory + memory-archive-gate + crystallized-backfill + nhip-no-probe + mfe-eval AUTO mỗi closeout) · **sau-lượt-đắt: một phần** harvest per-turn primary (`hmw.js:9` C4) nhưng không máy điểm danh BẮT BUỘC ngay-sau-mỗi-lượt-đắt.
- **Vai quan sát cấm-sửa:** cặp obs `{harvest-curator, tooling-auditor}` chạy VÔ-ĐIỀU-KIỆN @session-end (`closeout-sentinel.ps1` header default -Roles); INFORM-only; ràng "cấm sửa" cưỡng chế bằng **git-diff commit-gate backstop** (error-ledger AS-10/G-015 propose-only sub vẫn Bash-write được, backstop THẬT diff-gate).
- **Secrets-sweep phủ trọn session-dir:** `session_ctx.py::secrets_sweep` rglob (S153: `_mind` tự vào lưới) "đích ghi nằm trong vùng quét mật" cho sessions/.
- **Bằng chứng lưới hoạt động thật @S180:** WAL verify-block "#53: 6/6 vai nặng dính, recover 6/6 **mất 0 byte**" nhờ artifact-đổ-ruột.
**SE thiếu:** (1) máy điểm danh **4-vị-từ hợp nhất trên run-folder** vị từ CỤT (thiếu đầu/thân) NÉN-QUÁ-TAY (so tự cùng đơn vị) chưa máy; AS-17 skeleton-ruột-rỗng + AS-19 nén-rơi-ý đều đang **nghi-thức, error-ledger tự khai "chưa cơ-khí-hoá"**; (2) **mục lục SỐNG cho runs/** `ls .claude/workflows/runs/ | grep -i index` = 0 hit (control-dương: cùng lệnh ls đếm được 90 folder) tầng-A "gói theo loại" trong hmw.js/tiep.md prose, tầng-B mục-lục-sống KHÔNG (nhip-no đếm tổng, không liệt ); (3) **điểm danh 2 nguồn** (đĩa mục lục, ghi chênh) chưa chưa mục lục; (4) khuôn-tối-thiểu tệp nguyên văn (tiêu đề + model tự khai + input ghim + kết luận) chưa thành văn bắt buộc mới END-line (AS-20 guard `END <slug> — VERDICT=`).
**Điều kiện vào:** GĐ-1 thi công hoặc miễn CHƯA THOẢ (GĐ-1 chưa).
---
### GĐ-3 — Nghi thức hai đầu phiên và cổng chặn bằng mã lỗi
**Hub đòi:** 4 nhãn lệch nghi thức (quên/tự-ý-bỏ/suy-giảm-hợp-lệ/bị-chặn) kèm vị từ đĩa · vai kiểm chỉ-đối-chiếu · vòng hỏi ngược đóng-khi-0-dòng-trống · cổng lỗi thang 4 trạng thái · tiền kiểm chi-phí-0 đầu MỌI cửa chọn cửa bằng ts-TRONG-tệp · vai kiểm 2 đầu phiên · luật tự trị 3 bậc · trần chi phí cửa hay dùng.
**SE đã có:**
- **Vai kiểm 2 đầu phiên ĐÚNG NGUYÊN VĂN:** cặp `lead-stale-auditor` + `lead-gap-auditor` spawn **VÔ-ĐIỀU-KIỆN mỗi đầu phiên** (`session-start.md:269`) **và MỌI closeout** (`session-end.md:119`), HÌNH B @S149. `ring2-audit` AUTO sau cặp, PIN đích-danh run-folder tươi (cấm glob-latest).
- **Đèn nợ 4 cửa dừng:** `nhip-no-probe.ps1` gọi tại `session-start.md:269` · `session-end.md:118` · `tiep.md:154` · `pause.md:113` cả 4 chỗ in "probe KHÔNG chặn"; vế-set canonical = chính script (`session-end.md:207`, gate đo nguyên văn dòng in chống stale).
- **Tiền kiểm chi-phí-0 khi nối mạch:** Sàn-3 probe @/tiep (WAL S180 dòng đầu: "Sàn-3 SẠCH 5/5") + `mind-check` ~140-300ms không chặn (`tiep.md:169`) + **anchor bằng carrier-commit `git log --diff-filter=A -1 -- <marker>`** (S158 chính "ts ghi TRONG tệp/lịch sử, KHÔNG tin mtime OS"; 8/8 resolve, sống-sau-squash by construction).
- **Máy FAIL-LOUD exit0 ( răng thật, chọn lọc):** `session-counter-tick.ps1` regression/missing-head exit0 no-write, fault-inject 5/5 @S149 (`session-start.md:246`); `h24-signal-write.ps1` class ngoài enum-đóng exit0 (header (1)).
- **Cửa-sau cho cửa-chết-sớm (lưới lùi):** `closeout-sentinel.ps1` M5 FLAG "audit đo rồi như chưa đo" nếu closeout thiếu delta role-dir; positive-control 5/5 lịch sử (`session-end.md:125`).
- **Theo dõi tái phạm:** error-ledger **2-strike promote** (header) AS-17 đã dùng thật (S150+S151 = 2-strike).
- **Luật tự trị (dạng SE):** hạ tầng ACTIVE-MARKS `.claude/governance/ACTIVE-MARKS.md` + 4 lệnh `/user-mark-{active,active-high,medium,disable}` (`ls .claude/commands/`) = posture tự-trị owner-gán dấu RC. **CHƯA ĐO** nội dung đủ "3 bậc" (tự · hồnhánh an toàn · hỏi khi mơ-hồ+phá-huỷ) cần `grep -n "bậc\|tự vá\|an toàn" .claude/governance/ACTIVE-MARKS.md`.
- Nhãn "suy-giảm-hợp-lệ" đã VĂN HOÁ dùng: nhip-no "probe-loi (khong chan)" · C12 note "MEASURED NOTHING... a 0 outside the window is not a green" · WAL ERRATA-block @S180 (3 ERRATA lead tự khai).
**SE thiếu / XUNG ĐỘT:**
- 🔴 **XUNG ĐỘT TRIẾT LÝ (lớn nhất cả gói):** hub GĐ-3 = "cổng CHẶN bằng mã lỗi, thang 4 trạng thái (trọn/thiếu-có-tên/không-xác-định/xung-đột)" thuốc căn cho TỰ-Ý. SE doctrine ngược: `governance-detectors.ps1` "**Exit 0 always (never fails build). FLAGs are advisory**" (`:1963`) + `closeout-sentinel` "exit ALWAYS 0, READ verdict-line" + probe-không-chặn 4 cửa. SE chặn-trước chỉ 2 máy (tick, signal-write) + hmw checkpoint throw (`hmw.js:131-132`); còn nghi-thức = lưới-sau + người. Hub tự nói sàn chức năng chỉ nâng không hạ chuyển detectors/sentinel sang lái-mã-thoát = **ĐỔI CƠ CHẾ → VƯỢT-KHUNG, cần anh + AI_INFRA**. Ghi cả 2 bên: hub ("cửa cổng trả lỗi thì không bỏ qua được"); SE (đèn không chặn điểm dừng người vắng vẫn thoát được phiên an toàn, đúng TC-07 của chính hub).
- 4 nhãn CHƯA thành văn như enum (SE AS-signature taxonomy 20 GIÀU HƠN nhưng KHÁC TRỤC: action-signature nhãn-ý-định; map được quên/tự-ý qua E-011/AS-15).
- Vòng hỏi ngược 5-cột đóng-khi-0-trống: chưa khuôn; gần nhất = bảng disposition từng-dòng (feedback S119) + FLAG-khuôn C11.
- Thang exit 4 trạng thái: không tồn tại bất kỳ máy nào.
- Tiền kiểm "đầu MỌI cửa": mới chắc /tiep + session-start; `/check-email`, `/adap-*`: **CHƯA ĐO** cần `grep -n "probe\|Sàn-3\|san-3" .claude/commands/check-email.md .claude/commands/adap-apply.md`.
- Trần chi phí cửa-hay-dùng: KHÔNG dụng cụ đo per-cửa (khớp TC-10 hub) SE doctrine "đo BYTE, CẤM quy token" (S158). Khai `KHÔNG ĐO ĐƯỢC` + nếu adopt thì trần = hướng-dẫn + nghĩa-vụ-khai (đúng chữ hub).
**Điều kiện vào:** GĐ-1 thi công/miễn CHƯA.
---
### GĐ-4 — Sổ yêu cầu chủ dự án và cơ chế chấm điểm (kéo sớm được)
**Hub đòi:** sổ 3 khối (việc-giao/sở-thích/phàn-nàn) lời NGUYÊN VĂN + vĩnh viễn cấm tái dụng · 2 mục mồi (làm-thẳng + lằn-ranh-đỏ liệt ; tự-trị-khi-vắng) · ghi-NGAY cắm vào tệp-luôn-nạp · tra-sổ-trước-khi-hỏi 2 chỗ · máy 0-phí phân biệt "chưa-có-dữ-liệu"⟂"đo-và-bằng-0" · đèn nợ mọi cửa dừng số-dán-nguyên-văn · vai đọc sổ 4 thấu kính + vai soi vai · thu hẹp vai cùng lượt · luật chấm điểm đã (công thức max(0,10mục-lặp2) · 4 tầng · 3 mốc niêm phong · thiếu phủ-sóng in KHÔNG ĐO ĐƯỢC cấm in điểm).
**SE đã có (mảnh — nhưng đây là GĐ SE HỔNG NHIỀU NHẤT):**
- Khung "đèn nợ + máy 0-phí" ĐÃ SẴN đúng chuẩn hub từng chi tiết: nhip-no-probe = read-only, exit-0, luôn-in, lỗi in " lỗi không chặn", đọc config không default **chỉ THIẾU 2 vế dữ liệu** (đang-treo, nhắc-lần-2) **không có sổ nguồn**.
- Ý thức "chưa-có-dữ-liệu 0": đã cài 2 máy (`nhip-no` CONFIG-THIEU in-line; C12 "MEASURED NOTHING" note). Khuôn để mở rộng sẵn.
- Tệp-luôn-nạp tồn tại đúng nghĩa: CLAUDE.md + auto-memory MEMORY.md (auto-inject mỗi lượt) chỗ cắm kỷ-luật-ghi-NGAY hợp lệ; kỷ luật ghi-ngay hiện cho MEMORY ("user explicitly asks... save immediately") nhưng KHÔNG sổ-yêu-cầu làm đích.
- Mảnh dữ liệu rải: việc-được-giao WAL chain + HANDOFF + `docs/changelog/migration-todos.md`; sở-thích 61 file auto-memory (`ls .claude/auto-memory/*.md | wc -l` = 61; **đề bài lead ghi 60 — số thật 61**, lệnh kèm) Why/How-to-apply nhưng KHÔNG nguyên-văn, KHÔNG mã-vĩnh-viễn, KHÔNG đếm-lần-nhắc; **lời-phàn-nàn: 0 chỗ chứa** `grep -rln "sở-thích\|phàn nàn" .claude/commands/ docs/governance/*.md` = **0 hit** (control-dương: "điểm dừng" cùng fileset = 3 file).
- 2 mục mồi: nguyên liệu SẴN ACTIVE-MARKS (tự-trị-khi-vắng, RC-mark owner-ký) + các lằn-ranh-đỏ ĐÃ RẢI trong feedback memories (đổi chế=anh · số nhịp=quyền anh · prod inspect-before-change · wipe owner-gated · outward report-before-stamp · "máy rộng UI hẹp" 409-rào) **chưa LIỆT KÊ 1 chỗ** đúng A6 (hub: cấm tả bằng tính từ).
- Bảo vệ tập-tín-hiệu-đóng (A10): **CÓ MÁY THẬT** `h24-signal-write.ps1` từ chối class ngoài enum (exit0, "a monitor may NOT invent a class") + dải `_frozen_until_owner` máy không được reset (nợ của owner). Phép thử A10 "đẩy nhãn lạ máy phải từ chối" = CHẠY ĐƯỢC HÔM NAY.
- Trần tự cột nguyên văn: khuôn sẵn (memory-budget.json pattern + "Keep entry 1.5K chars" gotcha #53).
- **Chấm điểm: 0 tồn tại** `grep -rn "chấm điểm" .claude/commands/*.md` = 0 hit thật (1 hit `rerank_score` khác nghĩa; control-dương cùng fileset "điểm dừng" = 3 file). Không tầng, không niêm phong, không khối in 2 cửa. SE thậm chí không nghi thức "hỏi anh chấm điểm" TC-12 SE = **vắng cơ chế hoàn toàn** (nặng hơn hub: hub treo, SE chưa từng sinh điểm).
**SE thiếu:** trọn sổ 3 khối + vĩnh viễn + máy 2 số + 2 vế đèn mở rộng + vai đọc sổ + định nghĩa A5 hỏi-lại-không-thông-tin-mới (hiện chỉ họ hàng: luật-4 hub SE "hỏi lại phải trả phí viện dẫn" CHƯA thành văn CHƯA ĐO: cần grep "viện dẫn" auto-memory) + toàn bộ luật chấm điểm.
**Xung đột/VƯỢT-KHUNG:** (a) luật chấm điểm hub bảo "áp thẳng không cần lại" NHƯNG thi hành = sửa `session-start.md`+`session-end.md` (in khối 2 cửa) + đẻ/gán 2 vai tầng-2/3 + "thu hẹp vai cùng lượt" (lead-gap-auditor đang soi phần yêu-cầu-chủ? chồng lấn phải chuyển giao khai) theo nguyên tắc SE (đổi nghi-thức 2 cửa + roster = quyền anh) đây **VƯỢT-KHUNG cục bộ: cần anh gật trước khi wire**, nội dung luật không cần hub lại. (b) Sổ 3 khối đặt "lane quản trị" = artifact mới cạnh WAL/HANDOFF nguy nguồn-đôi với WAL chain (SE luật "checklist = VIEW derive, CẤM file nguồn-đôi" `tiep.md:181`) thiết kế phải chọn: sổ = NGUỒN cho yêu-cầu-anh, WAL = mạch việc; ranh giới cần vẽ kẻo giẫm sàn-3.
**Điều kiện vào:** chỉ cần GĐ-1 (độc lập GĐ-2/3/5, hub cho kéo sớm) TC-01/TC-12 của SE đau thật ưu tiên cao.
---
### GĐ-5 — Cửa gọi mô hình đắt tiền
**Hub đòi:** mọi cửa đắt do chủ + tham số model tường minh · điều phối chỉ đóng-gói cấm diễn-giải-lại · cửa biên dịch ý định chỉ-ra-bản-nháp · gói ngữ cảnh 5 mảnh khai-chưa-có · sổ lượt-đắt khung-nhìn ghi-ngay-lúc-dựng-thư-mục · vai mới vào danh sách hợp lệ trước · vật chứng CHUNG GỐC.
**SE đã có (GĐ GẦN XONG NHẤT — phần lớn tương đương hoặc mạnh hơn):**
- **Cửa chỉ-anh-gõ:** H21 per-invocation `/fable-real`·`/fable-clone` chỉ sống trong lượt anh , không persist (`.claude/commands/fable-{real,clone}.md` tồn tại; `fable-real-runbook.md` §2.1-bis INVOCATION; CLAUDE.md khối operating-posture: "per-invocation, KHÔNG persist (H21)").
- **Tham số model tường minh + audit:** worker-tier-pin 14/14 opus+max (S124, frontmatter) · `TIER2_EXPECTED_FULL_ID` single-source (`hmw.js:73`) · `scripts/spawn-model-audit.ps1` PA-2b resolved-vs-expected (INFORMATIONAL, header tự khai) · **đo thật S126: 0-mismatch, control no-tier→opus dù lead=Fable** (`session-start.md:51`).
- **Spec-file 3-mục** (engine propose lead verify+ghi worker theo spec, H21) = họ hàng "cửa biên dịch ý định"; spec S180 này instance (4 khối: đề-bài/cách-làm/checklist/bất-biến đủ mục-tiêu/phạm-vi/acceptance/điều-cấm).
- **Vật chứng CHUNG GỐC ĐÚNG NGUYÊN VĂN:** fable-run HMW-run cùng đổ `.claude/workflows/runs/` (run-folder này = fable-real, nằm cạnh 89 folder khác); sổ riêng không tồn tại nên không "đường dẫn thứ hai".
- **Gói ngữ cảnh chuẩn hoá:** `tiep_reload` nạp NỀN theo khoá `memory-budget.json` (B1 cấm chép danh sách tệp `tiep.md:183`) + lớp mềm `_mind` + WAL-reconciled + `ctx-verifier` trả BẢN NẠP-LẠI 15 dòng + **LEAD-PHAI-NHAC-LAI chi-tiết-chỉ-biết-nếu-đã-đọc** ("đã nạp suông KHÔNG tính, metadata ts/hash KHÔNG tính") mạnh hơn khai-chưa-có của hub vế chống-nạp-giả.
- **Ghi-ngay-lúc-dựng:** mode-B em-main scaffold run-folder @P1 TRƯỚC fan-out (`hmw.js:9`); spec-pin trước spawn.
- Recovery lượt-chết: R5 3-nấc + dòng-sống-kể-cả-chết-giữa-chừng đã chứng minh @S180 (7 vai #53, 0 byte mất).
**SE thiếu / làm KHÁC (khai mục-6 khuôn báo cáo, không phải xin lỗi):**
- **Sổ lượt-chạy-đắt dạng KHUNG NHÌN: KHÔNG ** dữ liệu phân tán (WAL chain ghi verdict + engine-stamp `[engine: …]` trong diary từng vai + run-folders). 1 view {thời điểm · loại · đề bài · con trỏ · kết luận} chưa tồn tại. Chi phí dựng thấp (grep-derive từ runs/ + stamps).
- **Cửa duyệt chủ-dự-án giữa spec-nháp thi công:** SE KHÁC HÌNH anh duyệt ĐẦU ( lệnh + vai + đề bài), spec do LEAD verify rồi worker chạy luôn trong CÙNG invocation; hub muốn spec-nháp quay lại chủ duyệt rồi mới thi công. Với văn hoá SE (anh = đã trao), giữ cách SE hợp lệ theo "sàn chỉ nâng"; ghi làm-khác + do.
- "Điều phối cấm diễn-giải-lại lời chủ": SE chưa luật thành văn + chưa rào-nguyên-văn; hub tự khai chế của chính họ đang "bỏ qua khai" adopt mức LUẬT-THÀNH-VĂN trước, máy sau.
- Bẫy-3 hub (đăng vai TRƯỚC khi dùng): SE bài học cùng họ (E-009 custom-workflow không kế thừa guard; "17/17" stale) **CHƯA ĐO** ca "vai mới thiếu đăng nuốt ức" đúng nghĩa: cần grep error-ledger "roster\|đăng ".
**Điều kiện vào:** GĐ-1+GĐ-2 thi công/miễn + hạn mức hạn mức THẬT (phiên này chạy Fable). Không rơi vào nhánh `không áp dụng`.
---
### GĐ-6 — Niêm phong đồng bộ và bảng gốc
**Hub đòi:** cổng đồng bộ 4 tầng dán kết quả · trace ngược phạm-vi-tự-phình · cổng điểm danh số-kỳ-vọng-suy-từ-danh-sách + mutation-test · điều-kiện-vào-danh-sách trọn-gói-1-commit · đối chứng tên 2 chiều lần cuối · bảng gốc 12-TC mỗi-ô-số-kèm-lệnh · bản nháp dấu chờ-ký mã-dấu-trống · quét đồng bộ tài liệu tick-từng-cái · báo cáo cuối.
**SE đã có:**
- Họ hàng cổng-4-tầng: drift-audit tháng (CLAUDE.md:121 vừa chạy S179, verdict `tooling-auditor = PASS_WITH_FLAGS — 8`) + C2/B3 derived-staleness vs STATUS canonical + ring1/ring2 đối kháng (WAL S180: ring1 32Đ/6T · ring2 21Đ/0T) nhưng đó DOC-drift + lead-claim audit, **chưa phải trace ý-tưởng→spec→việc-thật 4 tầng**.
- Số-kỳ-vọng-suy-từ-danh-sách: pattern ĐÃ C11 (informRoles live-read) + hmw.js roster (không chép số); **mutation-test cho cổng roster: KHÔNG CÓ**.
- Bản-nháp-dấu chờ ký: **cơ chế RC-mark ĐÃ CÓ VÀ ĐANG DÙNG** `ACTIVE-MARKS.md` chứa dấu dạng `RC-pqhuy1987-<ts>` do anh cấp (fable-real-runbook.md trích RC-mark thật; luật hub món-4 cũng dùng đúng format RC này cùng chuẩn mesh).
- Quét đồng bộ tài liệu: khuôn tick-list trong nghi thức drift-audit (rules.md §6.49.4 dẫn theo CLAUDE.md:121).
- Khai máy-hay-tay (A16): VĂN HOÁ (AS-19 tự khai "nghi-thức, chưa cơ-khí-hoá"; drift-audit khai "em-main chạy thủ-công"; LỚP-9-fix S100 gỡ cron-claim ghost) **BẢNG A16 hợp nhất chưa có**.
**SE thiếu:** cổng đồng bộ 4 tầng + trace ngược tự-phình + mutation-test + bảng gốc 12-TC (chưa tồn tại §2 file này phôi) + báo cáo cuối.
**Điều kiện vào:** MỌI trong phạm-vi-áp-dụng đã thi công XA NHẤT, đúng thiết kế. Không làm đây trước khi các trước xong.
---
## §2 — TRỤC 2: 12 TC × bệnh SE
> 4 ô hub để CHỮ (TC-02·03·07·10) — GIỮ NGUYÊN CHỮ, chỉ thêm bằng chứng định tính phía SE, KHÔNG điền số.
| TC | SE bệnh? | Bằng chứng đo được trên kho SE (lệnh/đường dẫn) |
|---|---|---|
| **TC-01** nhắc nhiều lần mới làm | **CÓ (định tính; SỐ: KHÔNG ĐO ĐƯỢC — chưa có sổ đếm lần-nhắc, đúng cái GĐ-4 dựng)** | Ca thật: mất-uỷ-quyền-owner phải hỏi lại 3 lượt (`auto-memory/feedback_absence_looks_like_clean.md` "slot-index tái-dụng xoá IM-LẶNG... hỏi lại 3 lượt"); owner S165 phải ra luật `/pause` liệt từng đầu việc việc rơi (`feedback_pause_track_plan_progress.md`) |
| **TC-02** cho làm thẳng vẫn hỏi | **GIỮ CHỮ HUB: *chưa có dụng cụ*.** SE cũng 0 phép đếm. Định tính: SE ĐÃ chế mark-làm-thẳng (ACTIVE-MARKS + `/user-mark-active*` 4 lệnh, `ls .claude/commands/`) + luật derived-flush-không-gate (`feedback_derived_flush_execution.md`) thuốc-phân-biệt-2-loại mầm, phép đếm hỏi-lại chưa |
| **TC-03** model mạnh hiểu đúng hơn | **GIỮ CHỮ HUB: *chưa đủ mẫu*.** Định tính SE cùng chiều: `feedback_high_to_max_multiagent_quality.md` (Max cross-stack); S171 "đầy-đủ đúng" (invest 44KB bị 3 lane reviewer lật MEMORY.md S171); no-tieropus mặc định đo S126 |
| **TC-04** vật chứng lượt đắt sót | **CÓ — NẶNG NHẤT, và lưới đã dựng đang trả lãi** | Phiên S180: **7/7 vai #53** (WAL verify block ghi 6/6; coordinator xác nhận tôi = vai 7) nhưng "recover 6/6 mất 0 byte" nhờ ghi-đĩa-trong-lúc-làm; tally 72-cận-dưới qua S162 (`feedback_agent_return_garble_recover.md`); ca ngược-#53 S149-L1 (return OK đĩa KHÔNG) |
| **TC-05** vai soi ghi-đĩa cấm-sửa | **CÓ nhu cầu, ĐÃ CÓ 70%:** cặp obs {harvest-curator, tooling-auditor} vô-điều-kiện @close (`closeout-sentinel.ps1` header) + sentinel M5 + INFORM-only; ràng cấm-sửa = G-015/AS-10 git-diff backstop (error-ledger). Thiếu: máy 4-vị-từ (xem GĐ-2) |
| **TC-06** nghi thức tự-ý-bỏ | **CÓ — đo được:** drift-audit trễ 6 ngày tự khai (`CLAUDE.md:121` "trễ 6 ngày so hạn 08-01"); cả một lỗi sinh ra từ bệnh này: E-011/AS-15 "nghi-thức chạy tắt, máy lớp nghi-thức-có-chạy-không" (error-ledger); thuốc-tái-phạm ĐÃ (2-strike promote) |
| **TC-07** chủ vắng máy đứng chờ | **GIỮ CHỮ HUB: *chưa có dụng cụ*.** SE 0 bộ đếm đứng-chờ. chế chống sẵn: /pause·/tiep 1-đường (H22) + WAL + ACTIVE-MARKS autonomy + probe-không-chặn-điểm-dừng (thoát phiên an toàn không cần anh). WAL S180 "next: chờ anh chọn (a)(b)(c)" = đứng-chờ KHAI tại lằn ranh hợp lệ, không đếm được |
| **TC-08** audit trong dòng chỉ bắt cái sống lâu hơn | **CÓ — ca chuẩn + thuốc đã uống:** H2-F3 S149 coverage-miss (10 lượt invest 0 delta sổ, ngoài lưới C11(b) by-design MEMORY.md S149); thuốc = closeout-sentinel (cửa-sau, positive-control 5/5) + bookend @open bắt lọt phiên trước |
| **TC-09** chỗ ngồi lệch model không ai biết | **CÓ bệnh-gốc (nỗi sợ), MÁY ĐÃ DỰNG VÀ ĐO 0-mismatch:** `scripts/spawn-model-audit.ps1` (PA-2b) + `TIER2_EXPECTED_FULL_ID` (`hmw.js:73`) + đo S126 control-âm/dương đủ (`session-start.md:51`). Lệnh tái lập: `powershell -ExecutionPolicy Bypass -File scripts/spawn-model-audit.ps1` |
| **TC-10** đo tiêu thụ per-cửa | **GIỮ NGUYÊN CHỮ HUB: KHÔNG ĐO ĐƯỢC.** SE cũng không tồn tại dụng cụ; doctrine S158 "đo BYTE, CẤM quy token" (`MEMORY.md` S158). Nếu adopt trần: trần = hướng dẫn + nghĩa vụ khai khi vượt, đúng chữ hub |
| **TC-11** tên duy nhất, không rớt máy đọc | **CÓ — ≥3 ca:** `sub-ctx-audit-*` lọt C11(b) filter (S153 S159, vết trong detector body); `_tiep-1.md` sha 7-char vs 40 (S158); "17/17" hardcode stale (`hmw.js:57` comment). Máy soi tên tổng: chưa (GĐ-1) |
| **TC-12** chấm điểm treo | **CÓ — dạng nặng hơn hub: VẮNG CƠ CHẾ HOÀN TOÀN.** `grep -rn "chấm điểm" .claude/commands/*.md` = 0 hit thật (control "điểm dừng" = 3 file). Hub: điểm treo chờ chủ; SE: điểm chưa từng được sinh ra |
---
## §3 — TRỤC 3: 9 lớp lỗi × ca SE (đồng thuận nền lead 9/9 — bổ sung ca + file:line của invest)
| LỚP | SE giẫm? | Ca (của lead bổ sung invest) |
|---|---|---|
| **LỚP-1** quên ghi lúc mở | **RỒI, nhiều lần** | #53-family (7 vai @S180); S175 spawn TASK-RỖNG sống nhờ run.md dựng trước (MEMORY.md S175 META); ngược-#53 S149-L1 return-OK-đĩa-KHÔNG. Thuốc SE = scaffold @P1 + spec-pin trước spawn |
| **LỚP-2** thợ rèn không dao | **RỒI — gốc S149 + 3 ca lead đo HÔM NAY** | Gốc: "SE = rules-đủ máy-thiếu, 0 script GHI counter" (S149); lead @S180: harvest-curator mắc bẫy đơn-vị bài-học-nằm-trong-file-chính-nó · `lead-stale-auditor:45` chính stale-count · `ring2-audit:4` ghi "5 class" khi enum 6 (nguồn: run.md cùng thư mục tôi KHÔNG đo lại, tin điều kiện, đánh dấu lead-measured) |
| **LỚP-3** chấm chéo lần-1 KHÔNG ĐẠT mặc định | **RỒI — và SE đã lập kế hoạch có vòng vá** | S171 miễn-trừ 63 + 6 acceptance gãy khi chạy thật (MEMORY.md S171); S179 C7 bắt 2 MAJOR trong chính bản (commit `57e672f`); S180 ring1 32Đ/**6T** (WAL). Cấu trúc N1N5 của spec này TỰ CHỨA vòng phản biện = đúng thuốc |
| **LỚP-4** exit-0 không cờ | **RỒI — ca tươi HÔM NAY** | ERRATA lead 1 @S180: BƯỚC 0.9 tuyên "all=0" SAI khi 4 thư chưa áp (WAL verify block; control-dương loi-do-luong=1). SE đồng thời ĐÃ thuốc cấu trúc: tách TOTAL INFORM-ONLY 2 dòng (detectors `:1941+`) đọc thiếu dòng 2 tái phạm |
| **LỚP-5** số chép tay trôi | **RỒI, kinh niên — đã lên LUẬT B1** | Persona neo "40" stale tới 71 (S169); "17/17" (`hmw.js:57`); STATUS:467 công-thức-chữ tự-huỷ "trừ Designer+Snapshot cho 71 không phải 72" (WAL S180 NẶNG NHẤT ring1 tự tìm); thuốc = B1 trỏ-canonical-không-chép-số (CLAUDE.md nhiều chỗ) + C2/B3 detector |
| **LỚP-6** neo số dòng chết ngay sinh | **RỒI** | Lead @S180: `STATUS:8` trỏ `:479` row thật `:481`; bẫy "con-trỏ-số-dòng-vào-sổ-tái-sinh" (`feedback_resume_premise_reverify.md`); thuốc ĐÃ chuẩn: archive `_INDEX.md` substring-anchor + máy resolve `memory-archive-gate.ps1` A7 |
| **LỚP-7** tuyên gấp-đầy-đủ thân mục lục | **RỒI — kể cả CHÍNH FILE NÀY hôm nay** | AS-17 skeleton-ruột-rỗng 2-strike S150/S151 (error-ledger); S157 coordinator chặn skeleton @202K; **@S180: tôi bị coordinator bắt đúng lớp này** 7.049B khung đầy đủ, ruột 15%, sau 202K token đọc (datum §4) |
| **LỚP-8** nhãn đã-đóng hẹp hơn phạm vi | **RỒI** | Lead @S180: slot (70) `~~ĐÓNG~~` rider H24-2 còn sống; citation-trap gen-2 lây-qua-trích-dẫn 3 đời/1 wave (`feedback_citation_trap_selfreference.md`); permission-matrix header quên CÂY S122S164 (SKILL.md tự khai "dư-lượng bất-đối-xứng") |
| **LỚP-9** cưỡng chế tuyên chưa máy | **RỒI, ≥5 ca — và có văn hoá tự khai tốt** | Lead @S180: `tools-whitelist-no-teeth` · `session_ctx_kb` 0-reader · `pull_warn_days` khoá trống; +H18 S100 cron-claim CronList=0 (`feedback_h18_ghostwire_stamp_integrity.md`); +per-L keys tự khai GHOST-WIRE ngay trong doc (`session-start.md:119-121` " số hành-vi"); +S168 command-sống-trong-comment (`feedback_dryrun_finds_promised_but_unlanded.md`). A16 (khai máy/tay) = đúng thuốc, SE nên adopt nguyên khoản |
---
## §4 — Phát hiện ngoài đề bài · xung đột · VƯỢT-KHUNG · datum
1. **F-1 — 4 thư đang ở nấc DRAFT phía hub:** frontmatter cả 4 = `status: DRAFT` + `reviewer_gate: PENDING` + `nac: draft`, TRONG KHI thư chính tuyên "khi phát, mỗi món đi kèm dấu xác thực nội dung trạng thái đã duyệt; bản nháp thì không " hash canonical LẠI KHỚP 4/4. hoặc hub phát bản chưa flip nhãn, hoặc nhãn nấc không nằm trong vùng hash. **Không tự phán — nêu ở mục phản-biện-gửi-hub (khuôn B mục 8) khi adap-report.** KHÔNG chặn GĐ-0 phía SE (hash khớp = nội dung toàn vẹn).
2. **Datum LỚP-7 tự thân @S180 (ghi theo lệnh coordinator):** invest này đọc 202K token/27 tool-use nhưng chỉ đổ 7.049B (~15%) ra đĩa trước khi bị nhắc bản-đồ-về-lớp-lỗi tự giẫm đúng LỚP-7/LỚP-2 đang lập bản đồ. trong-phiên: nhát Edit này. Bài: **tỉ-lệ-đổ-ruột (byte-trên-đĩa / token-đã-đọc) là tín hiệu giám sát được** đề xuất thêm vào khuôn C11(b)/AS-17 dưới dạng ngưỡng mềm.
3. **Xung đột lớn duy nhất: exit-0-advisory ⟂ cổng-chặn-mã-lỗi** (chi tiết GĐ-3). VƯỢT-KHUNG anh + AI_INFRA. Các mục còn lại THIẾU chứ không NGƯỢC.
4. **VƯỢT-KHUNG cần anh (4 khoản):** (a) đổi chế độ exit của lớp detector/sentinel; (b) wire luật chấm điểm vào 2 cửa phiên + vai tầng-2/3 + thu-hẹp-vai-cũ; (c) sổ-3-khối = artifact lane quản trị mới cạnh WAL (nguy nguồn-đôi cần vẽ ranh); (d) đẻ vai mới (giữ-chuẩn-tên / đọc-sổ) đụng điều-kiện-vào-danh-sách trọn-gói (GĐ-6 (iii)) + roster.
5. **SUPERSEDE = 0 việc un-do phía SE** (bộ 5-phần 03-08 chưa từng phát; inbox chỉ 4 file 08-04 `ls broadcasts/inbox/ai_infra/ | grep 2026-08-0` khớp; đồng thuận nền lead).
6. **Số kho lệch nhỏ so đề bài giao (dùng số ĐO, kèm lệnh):** runs = **90** folder (đề bài: 87) `ls .claude/workflows/runs/ | wc -l`; auto-memory = **61** (đề bài: 60) `ls .claude/auto-memory/*.md | wc -l`; gotchas "87 mục": **CHƯA XÁC NHẬN** `grep -c "^## " docs/gotchas.md` = 19 ĐẾM SAI THƯỚC (header cấp-2 mục #n); cần `grep -cE "^#{2,4} #[0-9]+" docs/gotchas.md` hoặc đọc header file để lấy pattern thật. KHÔNG dùng 87 khi chưa tự đếm.
7. **Nhịp hub-hỏi-tiến-độ:** se thuộc nhóm bị hỏi MỖI PHIÊN (thư chính, bảng track) GĐ-0 đóng sớm giá trị quan hệ mesh, không chỉ nội bộ.
---
## §5 — Fit-map 7 dòng (Phần A khuôn — BẢN ĐỀ XUẤT, lead + anh quyết)
| Giai đoạn | Tên | Quyết định (đề xuất) | do / điều kiện | Người làm | Mốc dự kiến |
|---|---|---|---|---|---|
| GĐ-0 | Tiếp nhận bản đồ áp dụng | **áp dụng** | đang làm dở phiên này; còn: dòng đã-nhận `_index`, fit-map file rời, tệp theo dõi A0..A16, adap-report | em-main | S180-S181 |
| GĐ-1 | Nền chuẩn đặt tên | **áp dụng** (tailored) | KHÔNG khai không-áp-dụng được (chưa chuẩn-duy-nhất); viết 1 văn bản HỢP NHẤT trỏ máy sẵn (C3/C11/alias-map) + sổ đổi tên máy-đọc; vai-giữ-chuẩn = chờ anh (VƯỢT-KHUNG (d)) | em-main + investigator | wave 1 |
| GĐ-2 | Lưới ghi đĩa + mục lục vật chứng | **áp dụng** (nâng từ ~70%) | thêm vị-từ CỤT + NÉN-QUÁ-TAY (cơ-khí-hoá AS-17/AS-19) + mục-lục-sống runs/ + điểm danh 2 nguồn | em-main | wave 2 |
| GĐ-3 | Nghi thức 2 đầu + cổng lỗi | **áp dụng MỘT PHẦN — phần cổng-mã-lỗi HOÃN** | 4 nhãn + vòng-hỏi-ngược + liệt-kê-cửa-có-tiền-kiểm = áp; đổi exit-0gate = điều-kiện-gỡ-hoãn: anh + AI_INFRA quyết xung đột triết | em-main (phần áp) | wave 3 |
| GĐ-4 | Sổ yêu cầu chủ + chấm điểm | **áp dụng — sổ TRƯỚC, chấm điểm CHỜ ANH GẬT wire** | TC-01/TC-12 SE đau thật; sổ 3 khối + máy + 2 vế đèn = việc máy; khối chấm điểm đụng 2 cửa phiên = VƯỢT-KHUNG (b) | em-main + anh | wave 4 (sổ) · wave 4b (điểm, gated) |
| GĐ-5 | Cửa gọi model đắt | **áp dụng phần THIẾU nhỏ; phần lõi khai "đã có tương đương/mạnh hơn"** | đã có: per-invocation + tier-pin + spawn-audit + chung-gốc + ctx-pack chống-nạp-giả; thiếu: sổ-khung-nhìn lượt đắt + luật truyền-nguyên-văn thành văn; cửa-duyệt-spec = làm-KHÁC khai (mục 6 khuôn B) | em-main | wave 5 (nhẹ) |
| GĐ-6 | Niêm phong + bảng gốc | **hoãn** | điều kiện gỡ: mọi áp-dụng đạt *đã thi công*; khi gỡ: cổng 4 tầng + trace-ngược + mutation-test + bảng gốc 12-TC + bản-nháp-dấu (RC-mark sẵn) | em-main + anh | sau wave 5 |
Tự kiểm khi lead chép sang file bản đồ thật: `grep -c '^| GĐ-' <tệp-bản-đồ>` = 7 (chạy trên tệp bản đồ, KHÔNG trên khuôn/không trên file này file này bảng trên cũng 7 dòng, nhầm mẫu số ra 14, đúng bẫy hub cảnh báo).
---
## §6 — Thứ tự wave sơ bộ (cho N4 tham khảo — N4 mới là người chốt)
> Bất biến gói: mỗi wave trỏ ≥1 TC; điều-kiện-vào = wave trước thi-công hoặc miễn-có-khai.
- **W0 (đóng GĐ-0)** dòng "đã nhận" vào `broadcasts/_index.md` + tệp bản-đồ 7 dòng + tệp theo dõi A0-1..A16 + adap-report tiếp nhận. **TC chữa: điều kiện tồn tại của mọi TC.** Phụ thuộc: không. Chi phí: <1 giờ. Làm S180/S181.
- **W1 (GĐ-1)** chuẩn-tên hợp nhất + sổ-đổi-tên máy-đọc + (tùy anh) vai giữ chuẩn. **TC-11.** Phụ thuộc: W0. do đứng sớm: luật điều-kiện-vào GĐ-2..5 đều neo GĐ-1, SE không khai miễn được.
- **W2 (GĐ-2 nâng)** vị từ CỤT/NÉN (cơ-khí AS-17/19) + mục-lục-sống runs/ + điểm-danh-2-nguồn. **TC-04, TC-05.** Phụ thuộc: W1 (tên artifact chuẩn trước khi viết máy soi). Đây wave trả lãi nhanh nhất #53 7-vai/phiên bệnh đắt nhất đang chảy máu.
- **W3 (GĐ-3 phần áp)** 4 nhãn thành văn + vòng-hỏi-ngược khuôn + liệt từng-cửa-có-tiền-kiểm + luật tự-trị-3-bậc đối chiếu ACTIVE-MARKS. **TC-06, TC-07, TC-08.** Phần cổng-mã-lỗi: treo chờ anh+hub (không chặn wave sau hub cho GĐ-4 độc lập GĐ-3).
- **W4 (GĐ-4 sổ)** sổ 3 khối + vĩnh viễn + máy 2-số + nối 2 vế vào nhip-no + 2 mục mồi từ ACTIVE-MARKS + A5/A6 thành văn. **TC-01, TC-02(dụng cụ), TC-12(nền).** Phụ thuộc: W1. **W4b (chấm điểm)**: sau khi anh duyệt wire 2 cửa công thức + 3 mốc + 4 tầng giữ nguyên ruột theo luật đã .
- **W5 (GĐ-5 phần thiếu)** sổ-khung-nhìn lượt đắt (derive từ runs/ + engine-stamp) + luật truyền-nguyên-văn. **TC-03(nền mẫu), TC-09(duy trì), TC-04.** Nhẹ, thể ghép W2.
- **W6 (GĐ-6)** chỉ mở khi W1-W5 thi công: cổng 4 tầng + bảng gốc 12-TC + mutation-test + bản-nháp-dấu + báo cáo cuối cho hub. **TC-12 (tô xanh có bằng chứng) + toàn bảng.**
## §7 — Vét ô CHƯA ĐO (đợt 2, sau lệnh đổ-ruột của coordinator)
1. **Luật tự-trị 3-bậc (GĐ-3):** `grep -n "bậc|tự vá|mơ hồ" .claude/governance/ACTIVE-MARKS.md` 1 hit duy nhất "bậc-MẠNH" (tín hiệu Sàn-3, KHÁC nghĩa). **thang 3-bậc dạng hub (rõ→tự-vá · mơ-hồ→nhánh-an-toàn · hỏi-khi-phá-huỷ) CHƯA thành văn**; SE posture-mark owner-ký (Active-High/Active/Medium/Disable) = trục KHÁC (ai-được-tự-trị-đến-đâu per-cơ-chế, không phải cây-quyết-định-khi-vắng). Khoản GĐ-3(vii): CHƯA LÀM, nguyên liệu = 2 mục mồi GĐ-4 + ACTIVE-MARKS.
2. **Tiền kiểm ở cửa phụ (GĐ-3):** `check-email.md:45` FAIL-SOFT "check-email loi (khong chan)" cùng khuôn nhip-no nhưng đó **fail-soft, KHÔNG phải tiền-kiểm-soi-cửa-đã-đóng**. Cửa `/check-email`, `/adap-*`: **không có tiền kiểm** khi làm GĐ-3, liệt từng-cửa phải khai 2 cửa này "không sinh tệp mốc / chưa tiền kiểm".
3. 🔄 **BÁC MỘT PHẦN nền lead (lead mời bác):** lead xếp `pull_warn_days` khoá trống vào LỚP-9 ghost-wire. Đo lại: `check-email.md:48` khai **"🔒 `pull_warn_days` CỐ Ý để TRỐNG anh không đặt số @S148, script cấm tự chế mặc-định"** + vế-4 đã ĐỔI VAI thành chỉ-báo-sức-khoẻ-nghi-thức. đây **owner-gated-empty CÓ KHAI**, không phải "cưỡng chế tuyên chưa máy" máy , số quyền anh, sự trống ĐƯỢC khai đúng chỗ. 2 món ghost-wire còn lại của lead (tools-whitelist-no-teeth · session_ctx_kb 0-reader) tôi KHÔNG bác chưa đo lại, giữ nhãn lead-measured.
4. **Đếm gotchas:** 2 thước đã thử đều hỏng (`^## ` = 19 header-cấp-2 mục; max token `#N` = `#482` dính "Run #482" CI, không phải gotcha). **tổng gotcha = KHÔNG ĐO ĐƯỢC bằng thước đã thử; canonical = row trong `docs/STATUS.md` (đúng B1)** người sau muốn đếm phải mở file xem format đánh số inline rồi mới viết regex, đừng dùng số 87 của đề bài khi chưa tự đếm.
5. **A5 họ-hàng ("hỏi lại phải trả phí viện dẫn"):** `grep -rln "viện dẫn" .claude/auto-memory/*.md` = **0 hit** (control-dương: cùng thư mục ls được 61 file; cụm này nằm trong THƯ HUB luật-4, không phải memory SE). A5 chưa thành văn phía SE xác nhận kết luận GĐ-4.
6. **GĐ-5 bẫy-3 (vai mới thiếu đăng ký):** `grep -n "roster|đăng ký" docs/governance/error-ledger.md` = **0 hit** (control-dương: cùng file đọc được AS-13..AS-20 đầu phiên này). SE **chưa có hồ-sơ ca giẫm** bẫy này; họ hàng gần nhất = "17/17 stale" (hardcode-count) E-009 (custom-workflow không kế thừa guard). Khi GĐ-6 làm điều-kiện-vào-danh-sách, đây bẫy PHÒNG chứ không phải bẫy ĐÃ chảy máu.
**END sub-invest-fitmap-S180 — VERDICT=PHỦ-ĐỦ-7GĐ-12TC-9LỖI; 1 xung đột triết lý (exit-0 ⟂ cổng-chặn); 4 khoản VƯỢT-KHUNG; 1 bác-một-phần nền lead (pull_warn_days = owner-gated-empty có khai); GĐ-5 gần xong nhất, GĐ-4 hổng nhất; W0 đóng được ngay hôm nay.**

View File

@ -0,0 +1,14 @@
# sub-review-n2-S180 — Phản biện bản đồ áp dụng N1 (deep-pass N2)
> **Vai:** reviewer (N2, `/fable-real`, Fable 5) · **Phiên:** S180 (2026-08-07)
> **Vật soi:** `sub-invest-fitmap-S180.md` (48.433 B, 256 dòng — ĐÃ ĐỌC TRỌN 2 lượt Read)
> **Đối chiếu:** 4 thư gốc `broadcasts/inbox/ai_infra/2026-08-04-*` (đọc lại TỪ GỐC, không tin N1 thuật) + spec + run.md
> **Chế độ ghi:** GHI DẦN TRONG LÚC LÀM — mỗi finding append ngay khi chốt. File này KHÔNG có heading chờ-điền.
## Ghi nhận mở màn (đã chốt trước khi mở thư gốc)
- N1 fitmap cấu trúc: §0 tóm 4 thư · §1 7 GĐ · §2 12 TC · §3 9 lớp · §4 phát hiện/VƯỢT-KHUNG/datum · §5 fit-map 7 dòng đề xuất · §6 wave sơ bộ · §7 vét ô CHƯA ĐO (6 mục). END-line VERDICT có.
- N1 tự khai trung thực đáng ghi nhận: (a) datum LỚP-7 tự thân §4.2 (bị coordinator bắt skeleton 15%); (b) 3 chỗ nhãn `CHƯA ĐO` ở đợt 1 được vét lại ở §7 bằng lệnh thật; (c) nhãn `lead-measured` cho 3 ca LỚP-2 không tự đo lại — khai tin-có-điều-kiện; (d) bác-một-phần nền lead (pull_warn_days) có lệnh + trích chữ.
- Điểm sẽ soi nặng theo đề: T2 claims chống lưng cho "GĐ-2 ~70%", "GĐ-5 gần xong nhất", "GĐ-3 nửa" — từng file:line phải giải được; T5 phải tự tìm xung đột thứ 2 (N1 tuyên "xung đột lớn DUY NHẤT" §4.3 + GĐ-1/GĐ-2 đều ghi "Xung đột: không").
<!-- findings append từ đây xuống -->