wal: flush 20260807T1357
This commit is contained in:
@ -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 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]`
|
||||
|
||||
> **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 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 (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 (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 (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` mà `: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 có 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ó" lần 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ừ 6→3, 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 có 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 HĐ 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.7→12 [`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.7→21 [`runs/2026-07-27-S156-bch-post-ceo-flow/`]:** verdict LAI — 13→21 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→HĐ pin V1 (`CreateContractFromEvaluationFeatures.cs:68-71`) · `GetEligiblePhases`+inbox 100% LEGACY ⇒ approver V2 mù HĐ 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]`
|
||||
- **S149→S152 (07-24→25) 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-16→20) 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-tier→opus DÙ 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/`.
|
||||
|
||||
@ -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` mà `: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.
|
||||
@ -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~~` mà **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.
|
||||
|
||||
@ -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ó 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 kê 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 mã 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 cũ" chính là 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 là BẢN VÁ 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ó 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) vì filter cũ `^sub-<role>[-.]` (S153, đã vá 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 có chuẩn-duy-nhất tương đương kiểm được) ⇒ GĐ-1 là chốt mở khoá các GĐ 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 là 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" = có.
|
||||
- **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 lý. = đú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 có 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 là 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 có quét bí 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) và NÉN-QUÁ-TAY (so ký tự cùng đơn vị) chưa có máy; AS-17 skeleton-ruột-rỗng + AS-19 nén-rơi-ý đều đang là **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" có trong hmw.js/tiep.md prose, tầng-B mục-lục-sống KHÔNG có (nhip-no đếm tổng, không liệt kê); (3) **điểm danh 2 nguồn** (đĩa ⟂ mục lục, ghi chênh) — chưa có vì chưa có 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 có 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 mã 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 là "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 exit≠0 (có răng thật, chọn lọc):** `session-counter-tick.ps1` — regression/missing-head ⇒ exit≠0 no-write, fault-inject 5/5 @S149 (`session-start.md:246`); `h24-signal-write.ps1` — class ngoài enum-đóng ⇒ exit≠0 (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 có mã dấu RC. **CHƯA ĐO** nội dung có đủ "3 bậc" (rõ→tự vá · mơ 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ệ" đã có 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 cơ 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ó lý ("cửa có cổng trả mã lỗi thì không bỏ qua được"); SE có lý (đè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 có AS-signature taxonomy 20 mã — 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 có 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 CÓ 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 + mã vĩnh viễn cấm tái dụng · 2 mục mồi (làm-thẳng + lằn-ranh-đỏ liệt kê; 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 dò 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ũ cùng lượt · luật chấm điểm đã ký (công thức max(0,10−mục-lặp≥2) · 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 dò 0-phí" ĐÃ CÓ SẴN và đúng chuẩn hub từng chi tiết: nhip-no-probe = read-only, exit-0, luôn-in, lỗi in "dò 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) vì **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 có 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 có cho MEMORY ("user explicitly asks... save immediately") nhưng KHÔNG có 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) có 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 CÓ SẴN — ACTIVE-MARKS (tự-trị-khi-vắng, RC-mark owner-ký) + các lằn-ranh-đỏ ĐÃ RẢI trong feedback memories (đổi cơ 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 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 (exit≠0, "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 ký tự cột nguyên văn: khuôn có 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 có nghi thức 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 + mã vĩnh viễn + máy dò 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ỉ có 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 ký 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ũ 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 có khai) ⇒ theo nguyên tắc SE (đổi nghi-thức 2 cửa + roster = quyền anh) đây là **VƯỢT-KHUNG cục bộ: cần anh gật trước khi wire**, dù nội dung luật không cần hub ký lại. (b) Sổ 3 khối đặt ở "lane quản trị" = artifact mới cạnh WAL/HANDOFF — nguy cơ 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ẽ rõ 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ủ gõ + 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 gõ, 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 là 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 và 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 có "đườ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 CÓ** — 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 và thi công:** SE KHÁC HÌNH — anh duyệt Ở ĐẦU (gõ 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 gõ = đã trao), giữ cách SE là hợp lệ theo "sàn chỉ nâng"; ghi làm-khác + lý do.
|
||||
- "Điều phối cấm diễn-giải-lại lời chủ": SE chưa có luật thành văn + chưa có rào-nguyên-văn; hub tự khai cơ chế của chính họ đang "bỏ qua có khai" ⇒ adopt mức LUẬT-THÀNH-VĂN trước, máy sau.
|
||||
- Bẫy-3 hub (đăng ký vai TRƯỚC khi dùng): SE có bài học cùng họ (E-009 custom-workflow không kế thừa guard; "17/17" stale) — **CHƯA ĐO** có ca "vai mới thiếu đăng ký nuốt ký ức" đúng nghĩa: cần grep error-ledger "roster\|đăng ký".
|
||||
**Điều kiện vào:** GĐ-1+GĐ-2 thi công/miễn + CÓ hạn mức — hạn mức 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 đó là 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 ĐÃ CÓ ở 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 mã 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 có trong nghi thức drift-audit (rules.md §6.4/§9.4 — dẫn theo CLAUDE.md:121).
|
||||
- Khai máy-hay-tay (A16): VĂN HOÁ có (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 là phôi) + báo cáo cuối.
|
||||
**Điều kiện vào:** MỌI GĐ trong phạm-vi-áp-dụng đã thi công — XA NHẤT, đúng thiết kế. Không làm gì ở đây trước khi các GĐ 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 có 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 vì 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 ĐÃ có cơ 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 có mầm, phép đếm hỏi-lại chưa có |
|
||||
| **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-tier→opus 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 mã lỗi sinh ra từ bệnh này: E-011/AS-15 "nghi-thức chạy tắt, máy mù lớp nghi-thức-có-chạy-không" (error-ledger); thuốc-tái-phạm ĐÃ có (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ờ. Cơ chế chống có 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ờ CÓ 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 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→vá 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 có (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 vì 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 nó 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 có điều kiện, đánh dấu lead-measured) |
|
||||
| **LỚP-3** chấm chéo lần-1 KHÔNG ĐẠT là mặc định | **RỒI — và SE đã lập kế hoạch có vòng vá** | S171 miễn-trừ 6→3 + 6 acceptance gãy khi chạy thật (MEMORY.md S171); S179 C7 bắt 2 MAJOR trong chính bản vá (commit `57e672f`); S180 ring1 32Đ/**6T** (WAL). Cấu trúc N1→N5 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 ĐÃ có thuốc cấu trúc: tách TOTAL ⟂ INFORM-ONLY 2 dòng (detectors `:1941+`) — đọc thiếu dòng 2 là 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` mà 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~~` mà 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 vá header quên vá CÂY S122→S164 (SKILL.md tự khai "dư-lượng bất-đối-xứng") |
|
||||
| **LỚP-9** cưỡng chế tuyên mà chưa có 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` "Có số ≠ có 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 và trạng thái đã duyệt; bản nháp thì không có" và 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 nó đang lập bản đồ. Vá 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 là 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 cơ 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ỉ có 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 là ĐẾ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 có 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) | Lý do / điều kiện | Người làm | Mốc dự kiến |
|
||||
|---|---|---|---|---|---|
|
||||
| GĐ-0 | Tiếp nhận và 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 có 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 mã 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-0→gate = điều-kiện-gỡ-hoãn: anh + AI_INFRA quyết xung đột triết lý | 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 dò + 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 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 GĐ á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 ký | 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ố là 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. Lý do đứng sớm: luật điều-kiện-vào — GĐ-2..5 đều neo GĐ-1, và 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 là wave trả lãi nhanh nhất — #53 7-vai/phiên là 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 kê 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 + mã vĩnh viễn + máy dò 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 đã ký.
|
||||
- **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ẹ, có 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 là "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 có 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` có FAIL-SOFT "check-email loi (khong chan)" cùng khuôn nhip-no — nhưng đó là **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 kê từng-cửa phải khai 2 cửa này "không sinh tệp mốc / chưa có 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, và script cấm tự chế mặc-định"** + vế-4 đã ĐỔI VAI thành chỉ-báo-sức-khoẻ-nghi-thức. ⇒ đây là **owner-gated-empty CÓ KHAI**, không phải "cưỡng chế tuyên mà chưa có máy" — máy có, số là quyền anh, và 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 có 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) và 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 là 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.**
|
||||
|
||||
@ -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 -->
|
||||
Reference in New Issue
Block a user