34 KiB
investigator-codebase — archive 2026-07 (L2 verbatim, frozen additive)
Curated 2026-07-06 (em-main, hook-triggered L1->L2)
- 2026-07-03 S101 H19-adopt Lane-2 (mapping + model-tier compliance, WF1 investigate — VERDICT SOUND): ⭐ Mapping CORRECT: reviewer=final-review-gate (Category 1-6 adversarial + Smart-Friend anti-rubberstamp
reviewer.md:268-276+ live-curl deploy-verify = H19 §3a "cổng rà-soát cuối" exact) · investigator-codebase=ground-truth-lane (investigator-codebase.md:23-26file:line-evidence + sqlcmd + grep + "if uncertain say uncertain" = H19 §3b "xác-minh sự-thật chống bịa-số/dẫn-chứng"). NO better-fit: investigator-api=EXTERNAL-docs (WebFetch, out-of-scope internal-truth) · database-agent=narrow DB-lens (subset không phải general fact-verify). Model-tier checklist 12-pt: SE meets A1✅(settings pinclaude-fable-5[1m]—[1m]VALID in settings.json ≠ frontmatter; Fable-down→Opus 1M H5-fallback = A1/A2 frontier-1M allowed) A2✅ A3✅(all-inherit=all-top, 5-fn map) A4/A5/A6 N/A-by-form(no tier-2/helper layer) B1✅ B2✅ B3✅(11 role-names SE-own, 0 copied) C1✅(11/11model: inheritgrep) C2✅(hmw.jstierfield) C3✅(0[1m]in FRONTMATTER model: line — 4 grep hits ALL prose: README:9/12/16 Upgrade-notes + database-agent:46 checklist). ⚠️ Toggle-marker template EXACT-exists:.claude/hmw-mode.ongitignored AFTER!.claude/**last-match-wins (.gitignore:87); new.claude/model-real-mode.onMUST copy placement or gets un-ignored. ⚠️ Ảo-ensemble reuse: hmw.jsparallel():97 + synthesis machinery PRESENT (grep 10 hits) — but "S101 WF2 3-lane" is LIVE-mechanism NOT persisted artifact (runs/ = old 06-18 only, HMW-ephemeral S94+ pattern). VACUOUS-MET nuance TRUE: under all-inherit+Fable, 2 positions ALREADY top → H19 §4 "allow reach top-model" adds 0 runtime-delta; new value = toggle depth-control + Fable-outage multi-Opus>single-Opus. Tag[s101-h19-lane2, mapping-sound, 12pt-compliance, marker-template, vacuous-met]. - 2026-07-02 (S100 H18-adopt WF1
wf_50a817ce-a69— 3 lane ∥, on-behalf em main APPEND B3, return-only 0-residual): L1 measurer-coverage: 3/3 script (mfe-eval:216/selfimprove:133-137/archive-gate:106) GLOB-LIVE 0-hardcode — agent thứ 12 tự-cử; ⭐ ghost-wire-class MỚI: config-key defined-but-unread (memory-budget.json:54-55role_file_glob/diary_path_pattern— script re-hardcode giá trị TRÙNG → không detector nào flag vì cả 2 phía "đúng"; catch = grep key-name across scripts/) + latent skip-if-no-tools:(selfimprove:147, 0 affected 11/11 có). L2 ghost-wire+taxonomy: MAST=0 repo-wide (grep PHẢI case-sensitive\bMAST\b— insensitive dính "Master" noise); cron monthly = ghost-wire THẬT (CronList=0 + scheduler RỖNG 05-04 log + S96 chạy 13:04 em-main in-session); convention "auto = step em-main kích, no-OS-hook" nhất quán 5 nơi. L3 ledger-đo:_ledger.mdtrue-orphan-catch 0/15 lifetime (single-day artifact 06-18, 15 row/14 folder — mig54-R2 share) · mode-A coverage 0/8 S93+ · ⭐ "S71harvest/rỗng" = criterion-wording KHÔNG phải incident (đính chính claim em-main) · repo có 5 "ledger" khác tên → sweep grep_ledgerEXACT · hmw.js 0-touch. Tag[s100-h18-wf1, 3-lane, ghostwire-configkey-class, ledger-0-15, on-behalf]. - 2026-07-02 S98 verify-lane V2 post-flush (VERDICT PASS): detector 28→25 (derived-stale 11→8; wikilink 14 + vocab-fork 3 giữ by-design). 8 derived-stale còn = 100% FP-class count-token soft-net: CLAUDE.md:84 tests-tree "(6 test…)" · ef-core SKILL :94/:95 ("2/1 migration tách/GỘP" history) + :103/:111/:114 ("4/3/1 bảng" Budget-defer/Mig-15 module-local) + :162/:179 (heading "Revert 1 migration" + comment "Script từ 1 migration") — 0 genuine drift vs canonical 61/89/440/79; SKILL edit sáng (+rows 60/61 @:82-83) chỉ shift line-number FP cũ, 0 flag MỚI. ⭐ Grep gotcha: "Fable RESTORED" exact-string CHỈ STATUS:24 + session-start:29; agents/README dùng biến-thể "Fable 5 1M RESTORED" (:3) + "Fable-restore" (:12) — exact-phrase grep miss README dù substance đủ. HANDOFF:5 mega-line: bundle mEGqlNWc/Dnrp4PU1=#484, CeTA7Z82 chỉ trong note "= #483" (1 line match duy nhất cả file). 3 on-behalf append đúng-chỗ: database-agent :36 (cuối Log = EOF) · reviewer addendum TRONG-entry S97-bis :68 (câu cuối + marker on-behalf @S98) · impl-fe S97-Part2 :16 giữa badge:9/S97:19. cicd "S98" = 2× "(curate S98)" stub :73/:74, 0 material-tag. Ledger :7 Mode-A ephemeral note (wf mode-A vắng ledger-row ≠ orphan) + bảng 15 row :11-25 nguyên.
- 2026-07-01 S97 session-end feedback-audit (VERDICT CLEAN): Grep-verified capture readiness pre-close. ✅ gotcha #77/#78/#79 present
docs/gotchas.md:1301/1317/1325(format### N.count=79 = STATUS header — no self-count drift; all 3 have Triệu-chứng+Cơ-chế+Fix+Quy-tắc root-cause). ✅ #53 return-garble x6 (cicd 5/6) in BOTHfeedback_agent_return_garble_recover.md(Why-line ×5→×6 + structural root-cause: cicd MEMORY self-target ~17.1KB→curate-at-return→thinking-step=message-cuối=return-value; fix=archive-cicd-sớm NOT instruction) AND S97-log Parts 1/2/4 (lần-4/5/6). cicd MEMORY LIVE=17.5KB (confirms self-target). ✅ Mig 60 wrong-table BUG = 2-fix present: code (Mig 6120260701142752query Changelogs) + guard (gotcha #79 "xác định ĐÚNG bảng writer" + "verify marker-count prod trước"). Mig 60 code:29-31confirmedPurchaseEvaluationApprovals a...a.Comment LIKE= wrong. Both Mig 60/61 have 3-file rule. ✅ git status CLEAN, 0 stray.claudemisland, 0git add -Ain log, S97 workflows HMW-ephemeral (NOT persisted run-folders — consistent S94+ pattern, runs/ only old 06-18). ✅ Product decisions captured (STATUS/HANDOFF/log + commit-msg): "duyệt là fix"→#480 price-lock, "fix trọn"→Mig 60 endsBeforeCeo-runtime, "hiện luôn CEO duyệt"→#483 badge, Supplier-backlog "15-18 field"→STATUS Next-up. MINOR only: S97-log per-Part State footers show progression (Part-1:47"88 bảng gotcha 77" stale vs session-end "89/79" Part-4:113) — intentional per-part snapshot but mid-log reader sees stale count. No BLOCKING/MAJOR gaps. - 2026-07-01 Supplier Excel-import GAP audit (anh Kiệt FDC — 30-col "Database NCC & Nhà thầu phụ" cho bên Pro): ⭐ Entity CỰC LEAN 9 domain-prop (
Domain/Master/Supplier.cs:5-16: Code·Name·Type·TaxCode·Phone·Email·Address·ContactPerson·Note) + 8 audit inherited (Base/AuditableEntity). EFSupplierConfiguration.cs: Code len50 UNIQUE-filtered[IsDeleted]=0(:24, Mig47 #57), Name200, TaxCode20, Phone30, Email100, Address500, ContactPerson200, Note1000. enumSupplierType.cs:3-10= NhaCungCap1/NhaThauPhu2/ToDoi3/DonViDichVu4/ChuDauTu5 — KHÔNG có "Cả hai/Both" (FE mirrorfe-admin/types/master.ts:11-16identical). GAP 30→entity: 6✅ · 7⚠️collision · 17❌ no-home — Excel splits Address×2(invoice/office), Phone×2(company/contact), ContactPerson+role; ❌ Fax·Bank-acct×2·Legal-rep+role·GUQ+3-NAS-links·Status/blacklist·Referral·PMH-owner. ⚠️ S55 seedSeedRealMasterDataAsync(DbInitializer.cs:2768-2787) crams NĐD/bank/status/category vào free-textNote(:2771-73 TRUONGGIANG/TANPHU/TGN) — proof entity thiếu home. Seed UNGATED (called :128, idempotent-key=Code:2780) — KHÁC demo-master (SeedDemoMasterDataAsyncGATEDDemoSeed:Disabled:117, #75). POST any-auth (SuppliersController.cs:37-42S59). FE SHA-identical 2-app (c1760788, 253L, 9 fields). Prod 20 NCC (Type1×3+Type2×17; type3/4/5 wiped go-live S91 → "Cả hai" enum genuinely-needed). Precedent NAS-link =PE.HoSoLink nvarchar(1000)Mig52. Fork→em-main: core-widen ~15col+CaHai=6 vs satelliteSupplierDetail. → _INDEX pending. - 2026-06-29 S93 Harness-16 MFE ground-truth (WF1
wf_4c63e1bd): ⭐ MFE denominator extraction (deterministic, status-field KHÔNG grep): marks Active(-High) (ACTIVE-MARKS.md) + AS-class + Active-Guards (error-ledger.mdVerified✅) + recurring-gotcha (gotchas.md); dedup-by-AS-cross-reference (gotcha/guard mà AS-row trỏ#N/AS-N→ gộp) = 29 item. Per-role sub-coverage: denom = numbered anti-pattern/NEVER trongagents/<role>.md; numer = diaryagent-memory/<role>/MEMORY.md(KHÔNG project/user — bẫy trùng-tên H15-v3) match exact-id OR ≥2 content-word sau stop-list (đánh bại leading-verb-9/9-giả). Codifiedscripts/mfe-eval.ps1+ engine §H. (WF1 self-write reverted AS-10; em-main harvest single-writer.) → _INDEX.
Moved from L1 2026-07-14 (S117 hook-triggered curate @22.7KB — investigator-codebase self, mirror em-main 07-06 pattern)
-
2026-07-13 PE quote-NEGATIVE feature LENS Budget-consumers (ensemble, RETURN-only): anh Kiệt: cho nhập SỐ ÂM ô
form.thanhTien(báo giá/hạng mục) dialog "Thêm NCC"; RULE = âm=khoản-TRỪ NCC, ngân sách GIỮ NGUYÊN. ⭐ CRITICAL confirm: quote KHÔNG mutatePeWorkItemBudgets— budget chỉ ghi bởiUpdatePeBudgetPro/CcmCommandHandler(role-gated PRO/CCM,PeWorkItemBudgetFeatures.cs:105-107/175-177) + Adjust/SetCcmBudget; quote write-site (PurchaseEvaluationDetailFeatures.cs:308-345) chỉ đụng quote-field + re-deriveIsWinner, NEVER budget. 5 consumer đọcSUM(ThanhTien WHERE IsSelected): (1) winnerQuoteTotal DISPLAYPeFeatures.cs:1188-1191no-clamp (2) CCM-thresholdPeWorkflowService.cs:884-893guard>=ceoThresholdreject HIGH ko-reject-âm→âm cho CCM-finalize dễ hơn (3) giaTri CreateContract PER-WINNERCreateContractFromEvaluation:88-90,100→ Contract.GiaTri CÓ THỂ ÂM, BYPASSCreateContractCommandValidator.GiaTri>=0(ContractFeatures.cs:46, chỉ áp manual-create path) (4) "So-với-ngân-sách" block-B DISPLAYPeFeatures.cs:904-947budget read AsNoTracking untouched, soft-warn only (5) submit-guardPeWorkflowService.cs:196-209= GUARD DUY NHẤT REJECT:if Sum()<=0 → "chưa có giá chào thầu"— WHOLE-phiếu total, per-item âm OK miễn net>0. NO quote validator tồn tại (grep⌀UpsertPurchaseEvaluationQuoteCommandValidator) → âm đã flow BE 0-block, chỉ FE chặn. Keep-≥0 fields có validator: BudgetPeriodAmount/ApprovedPriceAmount/ProInitial/InitialAmount. ĐÃ allow-âm sẵn (unrelated): ProAdjustment/Adjustment/ExpectedRemainingAmount (PeFeatures.cs:345-348mirror-LeaveBalance). Tag[s115?, pe-negative-quote, budget-not-mutated, submit-guard-sum-le-0, giaTri-negative-bypass-validator, no-quote-validator]. -
2026-07-13 PE negative-quote LENS edge/precedent/test (fable-clone, RETURN-only; complements Budget-consumers entry ↑): ⭐ BE+DB đã cho âm; blocker = FE helper + submit-guard. (a)
parseVndPeDetailTabs.tsx:51strip[^\d]→ minus mất;formatVndInput:52n>0?:''→ âm+0 đều blank (lẫn "chưa báo giá"); AddSupplier gatethanhTien>0:2226 skip quote khi ≤0 (empty≡0 by-design); inline QuoteCellDialog :2870 always-POST (store 0 OK); fe-admin SHA-identical :51/:52/:2226. (b) precedent = OMIT validator:ExpectedRemainingAmountPurchaseEvaluationFeatures.cs:348 + LeaveBalanceAdjustmentDaysLeaveBalanceFeatures.cs:107; QuoteUpsertPurchaseEvaluationQuoteCommandDetailFeatures.cs:272 = NO validator (grep⌀) → BE nhận âm sẵn. (c) 0 test assert ThanhTien≥0. (d) gotcha #81 orthogonal (IsWinner==Any(IsSelected) bool≠sign → no phantom). (e) NO DB CHECK (HasCheckConstraintgrep⌀ whole Infra; col decimal(18,2) config:131). HARD-INTERACTION submit-guardSum()<=0PurchaseEvaluationWorkflowService.cs:206+FE:201 → net-≤0 BLOCKED "chưa có giá"; che CCM-threshold:891. NS-giữ-nguyên architectural (quote never write PeWorkItemBudgets; âm chỉ shift winnerQuoteTotal:1188). Tag[pe-neg-quote,parsevnd-strip-minus,sum<=0-guard,no-check-constraint,omit-validator,iswinner-orthogonal]. -
2026-07-12 (S111 H22 WAL deep-pass)
[engine: fable-real-single · Fable-S111]: H22 WAL adopt → READY_WITH_NUANCES + spec 3-mục (em-main gov/settings · w1 pause+tiep · w2 start/end delta · w3 hook+README). Chốt: (1).claude/settings*.jsonKHÔNG tồn tại → hooks-entry CREATE mới; hook = STAGED-until-verified (S100 ghost-wire, chỉ claim khi thấywal:commit phiên mới). (2) engine:402no-OS-hook = MÔ-TẢ (CAVEAT) không phải luật cấm;:116E.3 "hook fails-open ≠ gate" → persist-only TƯƠNG THÍCH, update :402; ACTIVE-MARKS 0 mark cấm-hook; H5 start:41chỉ cấm hook-switch MODEL. (3) AS-6 KHÔNG tăng: 2 runtime .json gitignored (.gitignore:124-125), hook commit LOCAL — push-set ≡ hôm nay. (4) cmd-PATH Git Bash trước WSL, bash 5.2.26 OK. (5).gitattributesexists broadcasts-scoped → append*.sh; repo 0 .sh = zero churn. (6) 16 command 0 trùng pause/tiep. (7) Stop-hook fire chỉ TURN-boundary → chết giữa workflow-turn = vật-liệu DISK uncommitted, /tiep đọc cả git status/disk. (8) run.md thiếu taskList snapshot. Learned: "luật cấm hook" phải phân MÔ-TẢ vs LUẬT trước khi đòi carve-out. L1@19.8KB → suggest em-main curate. -
2026-07-11 (S110 H21+MTv3 deep-pass)
[engine: fable-real-single · Fable-S110]: Task ground-truth 2 broadcast (H21 spec-file+per-invocation · MTv3 owner-choice) + inventory TOKEN toàn repo + SPEC 3-mục. Verdict PASS: (1) 12 persona file SẠCH 0-hit fable/engine-token (grep 2 vòng cảengine-đắt|top-model|ensemble) — NGƯỢC hub vòng-1 bắt persona-phụ lỗi; (2) MTv3 self-check regex §5 chính-thức 0-hit nhưng extended "lead LUÔN top-model" bắt 5 ACTIVE (engine:332 K.D · runbook:140/:455 · fable-real.md:17 · mark ACTIVE-MARKS:19) = regex-heuristic-miss class — sister diễn-đạt khác cụm regex; (3) hmw.js:38 comment "tier:'fable' khi hệ-trọng" = xung-đột MTv3 §1.3/H21 §3 (đường nâng hạng-nhất DUY NHẤT = owner gõ; comment cho lead-discretion) — comment-only fix; (4) hmw-mode.on = HỆ KHÁC (consent fan-out T3ultracode-hmw-mem-governance, content tự khai /ultra-on) — ngoài scope H21; (5) mega-line "VẪN ON" class = standing-imperative-trong-history-blurb (S109-header + HANDOFF NEXT-anh = ACTIVE cần sửa; blurb-body = snapshot giữ). Bẫy fidelity lớn nhất: MTv3 §1.2/1.3 "sub gán cứng hạng-hai" đọc như floor → tưởng phá H8 all-inherit; triage-reply S2 CÙNG NGÀY waive đích-danh ("không đổi gì với form all-inherit"). ⚠️ #53 garble lượt return đầu (trả status-line giữa-chừng thay verdict) → coordinator SendMessage re-emit trong-session = recover OK, diary ghi trước re-emit.
S125 hook-curate @23.9KB (em-main single-writer, moved-not-cut byte-exact tu MEMORY.md L1) - 2026-07-16
- PE FROZEN-Mig59 patchwork + go-live recon cluster (S87→S89, 8 entries verbatim →
archive/2026-06.md): key catches — AREA-4 LATENT #73-class BUG HoSoLink absolute-setPurchaseEvaluationFeatures.cs:280but PeHeaderForm PUT OMITS→clears (2 PUT mutually destructive, no preserve-test) · AREA-3 AllowApproverFinalize AUTO(Mig58)+finalizeByCcmDelegation OPT-IN(Mig54) coexist AUTO-first, ApplyApprovedPrice allow-list {Ncc,ProMin,ProMax,Ccm} · AREA-2 budget-matrix band-aidPeSuggestedPriceFeatures.cs:153-199PRO=drafter vs CCM=role authz-asymm · AREA-6 FE all 6-comp+3-pages SHA-mirror 2-app, #70 stale-echo · S89 AllowApproverFinalize-NOTE GAP BE-field-MỚI (flag onlycurrentLevelOptions, DTO no-carry→expose EndsBeforeCeo) · 06-24 winner=SINGLESelectedSupplierIdderived-3-site, terminal=per-Level bool · 06-23 urgent authz asymmetric, PE-create dropdownPeWorkspaceCreateView.tsx:94. - 2026-06-20 governance recon (both → archive/_INDEX): (a) landing-map —
harness-11-engine.md=CANONICAL engine (D5/6/7 safety-tier+D8 one-dir-lock+D9 single-writer+D10 Bash-residual+CAVEAT no-OS-hook);error-ledger.md=§L.a AS-1..13+§L.b 7-step; rules.md §6.6=objective-criteria; report-before-stamp ⊂ D7 (extend not duplicate→C3 vocab-fork). (b) Harness-14 = age/recency-decay KHÔNG căn-cứ cắt feature;memory-budget.json0 decaykeep_floor=5=newest-protect drains-OLDEST; detectors canonical-anchor-vs-STATUS+disk 0 age-window; EVALgolden-set-solution_erp.jsonl14q recall@5≥0.7 weekly-manual; anti-downgrade=H8 all-inherit PARTIAL (no generic rule grep 0). - PE recon cluster (S69→S76, verbatim → _INDEX): "Giá chào thầu" mục-c=
WinnerQuoteTotal=SUM(Quote.ThanhTien WHERE supplier==Selected) DERIVED 3-site; Budget gate=PURE ROLE no-phase (canEditPro/CcmPurchaseEvaluationFeatures.cs:800-801); submission-count-lock NEXISTS (grep 0); Value-threshold HOOK B=ApproveV2Async :816-845; PRO/CCM/CEO=Procurement/CostControl/Directorshorthand; V2 routing IGNORES roles (=ApproverUserId) 100% LINEAR. - Office/HRM recon cluster (S65→S69, verbatim → _INDEX): 21
Off_*keys, 10 office pages{fe-admin,fe-user}/src/pages/office/SHA-mirror (exc MyAttendance+AttendanceReport admin-only); golive-flip=removeRevokeTemporarilyHiddenModulesAsyncDbInitializer.cs:2040; Employee master-detail EXISTS, Dept FLAT pre-Mig51; NamGroup PURO=UI-skin hardcoded-navTree; gotcha #66index.css h1-4{color}OUTSIDE @layer→TW-v4 unlayered wins→heading MUSTtext-white!. - Governance/Harness recon cluster (S71, → _INDEX): H8 all-inherit FULLY adopted both layers (12/12 frontmatter + hmw.js resolveModel); run-trace "TRACKED" = 2-level (
git check-ignoreeligible vsgit ls-filescommitted — model works only postgit add); G-015 containment shift (Harness-2 "mọi tracked=vi-phạm" → H10 "tracked NGOÀI run-folder+code-disjoint=vi-phạm"). path-trap: bareruns/from repo-root = 0 → actual.claude/workflows/runs/(22 tracked). detector refine(b) =.claude/hooks/.claude/scriptsnot-exist (now S75 hasscripts/governance-detectors.ps1).
S117 — PE giá-chốt RANGE Min+Max invest (fable-real single, 07-14)
- ApprovedPrice WRITE = 1 site duy nhất
ApplyApprovedPriceOnFinalize(PurchaseEvaluationWorkflowService.cs:951-966, allow-list :950) gọi tại 3 nhánh DaDuyet :858 level-finalize / :896 ccm-delegation / :928 all-steps-done (skipToFinal :820 chỉ dời pointer, KHÔNG finalize-site thứ 4). READ prod = detail-DTO ONLY (PurchaseEvaluationFeatures.cs:1230→PurchaseEvaluationDtos.cs:285) + FE displayPeDetailTabs.tsx:1712/:1850-1863. ⭐ HĐ-gen KHÔNG đọc ApprovedPrice — GiaTri=SUM Quote.IsSelected per-winner (CreateContractFromEvaluationFeatures.cs:88-100LOCKED A1/D4) → range 0-impact contract/lũy-kế/list. Rec model A: +1 col nullableApprovedPriceMaxAmount+ source tokenProMinMax= radio thứ-5 (chỉ khi cả Min+Max present), no backfill, phiếu cũ nguyên. PRO-entry đã enforce Min≤Max (PeSuggestedPriceFeatures.cs:38-40). Panel+DetailTabs SHA-mirror 2-app NHƯNGtypes/purchaseEvaluation.tsKHÔNG mirror (SHA differ) — edit riêng từng app. Latent edge: winnerQuoteTotal subset-selected có thể ÂM (S116) vs validatorApprovedPriceAmount>=0:501→ transition reject khó hiểu. WIP S117 uncommitted CÙNG file PurchaseEvaluationFeatures.cs (endsBeforeCeo pointer-aware :642/:768/:1157) — vùng khác, merge-safe.[s117, pe-approved-price-range, prominmax]
S117 — PE lũy-kế "không bắt sau duyệt" RCA (fable-real single deep-pass)
- 2026-07-14 VERDICT: phiếu nguồn A/018 KHÔNG hề DaDuyet — Chương (Bước2 Cấp2
AllowApproverFinalize, badge "Duyệt thay CEO" = CONFIG-displayPeWorkflowPanel.tsx:364) duyệt KHÔNG tick ô OPT-IN "Cấp này KẾT THÚC" (S97 Part1 đảo default UNCHECKEDPeWorkflowPanel.tsx:57useState(false); FE gửi tường minh :203) → advance thường lên Bước3 CEO, Phase=10 ChoDuyet. Prod ground-truth: StepIdx=2 LvlOrd=1 EndedFin=0; changelog 13/07 12:23Z "Hoàn tất Bước 2/3, sang Bước 3 (Cấp 1)" no-finalize-marker; IsWinner=1 SelQ=1 (749.564M) → RC-2 refuted. Lũy-kế Row2 filterPhase==DaDuyet(PeFeatures.cs:906) ĐÚNG nguyên tắc Kenny "duyệt rồi mới bắc"; tính LIVE :886-918 no-store → xóa+tạo-lại phiếu-XEM vô ích. ⭐ Residual = DISPLAY-LIE nửa-còn-lại gotcha #78: non-DaDuyetendsBeforeCeo=config TRUE bất chấp pointer (detail:1152-1154literal: true; list:647-651subquery.Any()) → Bước3 mờ "Kết thúc tại Cấp 2" + chip list "⚑ Kết thúc·CCM" NGAY KHI phiếu nằm inbox CEO → user tưởng xong. 3 cơ chế chồng phân biệt: AllowApproverFinalize (Mig58 + opt-in S97) ≠ finalizeByCcmDelegation (Mig53/54 threshold — v04 CeoThresh=NULL không dùng) ≠ skipToFinal (Mig31 pointer-jump giữ ChoDuyet). Fix rec: vận-hành CEO-duyệt hoặc trả-lại→Chương tick; code = pointer-aware endsBeforeCeo (detail in-memory trivial, list EF-subquery kềnh), KHÔNG nới filter lũy kế.[engine: fable-real-single · Fable-S117] - 2026-07-15 (S122 — retro-harvest 7 orphan, 7 lane read-only qua
/hmwRUN-TRACEwf_5ce007c4-980; 7/7 done · 0 error · 1 RỖNG schema-fail · 526s · 836K tok): Task: đọc 7 run-folder "orphan" + truygit log→ đối-chiếu run ĐỊNH-làm vs THẬT-land, neo bằngfile:line/SHA THẬT; CẤM bịa sha, CẤM suy "chắc xong rồi" từ việc folder tồn-tại. Nấc: executed + lead verify từng cái. Evidence: 6/6 lane có return neo SHA thật, 0 garble →a829d0d(PE A1+EDGE-5, 2 file +513/−148) ·e100ef0+Mig 63 (Supplier Excel-import Phase B, 20 file +8268/−14) ·5fa11b5+Mig 64 (import v2, 28 file +7659/−105) ·d436af2+Mig 65 (multi-NCC, 18 file +7272/−425) ·88368fd(PE giá-ÂM, spec-match 7/7, S116 KHÔNG phải S113). 🔴 KẾT-QUẢ LẬT TIỀN-ĐỀ CỦA CHÍNH RUN — 0/7 là việc mất; 7/7 ĐÃ XONG, chỉ ghi synthesis SAI CHỖ. 6 folder có## synthesistrong THÂNrun.md(dạng-3) ·pe-negative-quoterải trong## Stages+## wf run-id(dạng-4,run.md:19ghi thẳng "PIPELINE COMPLETE — shipped + live-verified" + cicd PASS + bundle-hash + smoke 200) ⇒ thực-địa ≥4 dạng, doc thừa-nhận 2 ⇒ orphan-authority đo TÊN FILE, không đo NỘI DUNG ⇒ 8 dương-giả / 25 run = 32%. Bồi:8fa2fcckhoe "[H2 gate]" màgit show --statKHÔNG chạm folder ⇒ H2 đã soi + coi ĐÓNG, chỉ lệch tên. KHÔNG phải convention-cũ: cùng ngày 07-12,h22-wal-adoptghi dạng-1 cònS112-*ghi dạng-3 ⇒ thói-quen không nhất-quán. 🟢 3 kỹ-thuật lane đáng tái-dùng: (a) đo ordinal migration bằng sorted-listing (Mig 65= vị-trí 65/66) thay vì tin nhãnCLAUDE.md— doc là DẪN-XUẤT, phải neo vào file migration thật · (b) phân-biệt hash-lệch vs invariant-vỡ: session-log ghi FE-mirror SHA3e16dba5@S116 vs đĩa nay617b0aa0⇒ KHÔNG mâu-thuẫn (file tiến-hoá sau S116; invariant thật = "2 app identical với NHAU" vẫn nguyên,git diff --no-indexexit=0) — checker so-literal-hash sẽ kêu oan đúng chỗ này · (c) truy owner-decision VÀO TRONG CODE: cả 5 decision củasupplier-excel-importneo được ở code,:376cite thẳng số decision (// unknown → default (decision 5, không reject)). 🔸 Lane RỖNG ≠ mất dữ-liệu:parallel[3]schema-fail 0 return — nhưng synthesis nằm trên đĩa (run.md:8) ⇒ lead lấy lại nguyên vẹn + neo chéo từ 2 lane khác. Đúng/tiep §2: per-turn ≠ per-task — return mất theo phiên, file trên đĩa còn. File synthesis của folder đó tự khai nấc bằng-chứng THẤP HƠN 6 cái kia. 🔴 Lead-error lane cần biết: memoryPack lead bơm ghi "S113/pe-negative-quote" — SAI, là S116. Lane KHÔNG bị dắt (tự truy git raMon Jul 13 17:08:34 2026). ⇒ tiền-đề trong memoryPack CÓ THỂ SAI ⇒ luôn tự truy git, đừng tin brief. Tag[s122-retro-harvest, false-orphan-by-naming, 0-of-7-lost, ordinal-measured-not-labeled, lane-empty-disk-survives, brief-premise-wrong].
S125 hook-curate bo-sung (2 digest S105/S104 moved-not-cut)
- [→ git+session-log 07-07] S105 BVAAU cross-repo auth RCA: Q1 root-cause = FE Home MÙ session (bundle cũ relative
/apitrên site TĨNHweb.configloại^/api/→/api/auth/me404 → anonymous); fix API_BASE-absolute51c69fbLIVE. Q2 CRM1 hở 2 tầng (FE soft + APIenforceCrmGate:false) → flipAUTH_ENFORCE_CRM_GATE=true. Q3 Zalo "User_ID" KHÔNG có UI. Class "hub+site-tĩnh relative-/apichết im prod"; #53-garble-7 → SendMessage-resume recover. (verbatim → archive/2026-07.md) - [→ 07-12 LENS-3 entry above + git 07-06] S104 Supplier 30-field 🅰️ schema-invest WF
wf_5ac2cdb0: SUPERSEDED anchors giữ: ClosedXML 0.105.0 = Excel-standard (KHÔNG OpenXml-raw,csproj:8); reuse-existing-cols>parallel;UpdateSupplierCommand.cs:49-57blind-set=latent#73; seed fill-nulls-if-exists (DbInitializer.cs:2781);SupplierDtohand-projected 2-site (GetSupplierQuery.cs:21+ListSuppliersQuery.cs:48-50);Dialog.tsx:48max-h-70vh; extractui/PathLink.tsx. Chốt Mig 62 +18 nullable. (verbatim → archive/2026-07.md)
@S126 hook-curate batch (2026-07-16, em-main single-writer, moved-not-cut verbatim từ L1)
- S116 — PE negative-quote invest (fable-clone ensemble, 07-13): Hội-tụ FE-ONLY: BE/DB nhận âm sẵn (no validator/CHECK); NS giữ-nguyên architectural; 3 chốt FE parseVnd/format/gate; sign-aware
VndInlineEdit:1003tái dùng; chỉ submit-guard:206hard-reject. ⚠️ Lesson: quote sốngdetails[].quotesKHÔNGsuppliers[].quotes. Detail:.claude/workflows/runs/2026-07-13-pe-negative-quote/+ session-log S116 + archive/2026-07.md 2×LENS.[Opus-S116]
[S134 curate 2026-07-17 — hook-triggered @20.8KB, investigator-codebase self-curate] Verbatim các entry L1 bị thay stub
- S114 (07-12) PE multi-winner PER-HANG-MUC (fable-clone): Mig58/59 multi-winner = WHOLE-SUPPLIER (
PurchaseEvaluationSupplier.IsWinner);Quote.IsSelectedper hang-muc×NCC = latent-hook Mig12 nay LIVE (Mig65 backfill re-key winner-truth IsWinner→IsSelected = CARDINALITY-CHANGE #2). winnerQuoteTotal=SUM(Quote WHERE IsSelected)PeFeatures.cs:1188. #1 open: N-win 1 hang-muc split KHOI-LUONG hay full-price (schema thieu per-winner volume). Tag[s114, pe-multiwinner-per-hangmuc, quote-isselected-live]. - S113 (07-12) Supplier import v2 (5-lane ensemble): selection consumers qua ListSuppliersQuery (
PeDetailTabs:2222+ContractCreatePage:321+dashboard); chot IsPublic-bool + dedup-MST+Code + fail-closed default. Prod 37 NCC. 1 lane #53-garble→em-main recover. Tag[s113, supplier-import-v2, ma-ncc=code]. - S112 (07-12) Supplier Excel-import + PE sign-off (fable-clone): Supplier 27/27 bijective (Mig62 SHIPPED prod); dedup Code CI-collation → normalize-case TRUOC store; PE bypass = go/gate
ApplyDrafterBypassOnSubmitAsync; EDGE-5 drafter-forge-Reject REACHABLE. Tag[s112, supplier-mapping, pe-bypass-a1, edge5-reachable]. - [→ archive/2026-07.md] 2026-07-13 PE negative-quote 2× LENS (Budget-consumers + edge/precedent/test) — key giữ: budget-not-mutated-by-quote (architectural) · submit-guard
Sum()<=0:206duy-nhất reject · no-quote-validator · parseVnd strip-minus · giaTri-âm bypass validator · gotcha #81 orthogonal-dấu. Executed S116; anchors sống trong S116/S117 entries. - [→ git 07-12 · superseded by S115 entry above] PE per-HANGMUC multi-winner LENS BE-consumer-audit: 3 cardinality axes —
SelectedSupplierIdsingle (legacy) · Mig58IsWinner=WHOLE-SUPPLIER liên-danh ·Quote.IsSelectedper hangmuc×supplier (S114 made LIVE). 5 money consumers keyed off IsSelected now (winnerQuoteTotal/submit-guard/ccm-threshold/giaTri/budget-block-B). ~6 test files. Tag[pe-multiwinner, per-hangmuc, quote-isselected, cardinality]. - [→ git 07-12] Supplier-import-v2 LENS-3 FE-dialog-UX: SupplierImportDialog+SuppliersPage SHA-identical 2-app; dialog 2-step preview→confirm round-trips
preview.rows→ per-row edit feasible;ExpectedHeaderTokens30-token bakedSupplierExcelImportService.cs:35-68= template single-source; Mã NCC=Code; import authz-mismatch BE[Roles=Admin,CatalogManager]vs FESuppliers/Createopen. Tag[s112, supplier-import-v2, fe-lens3, import-authz-mismatch]. - [→ git 07-12 · Mig64 IsPublic shipped since] Supplier import-v2 LENS-4 public/visibility recon: 3 SELECTION consumers ALL hit
GET /suppliersListSuppliersQuery (SuppliersPage:83 · PeDetailTabs:2222 · ContractCreatePage:321); DISPLAY-of-existing joins by stored SupplierId MUST NOT filter (ContractFeatures/PeFeatures/Dashboard); write-guard backstopsContractFeatures.cs:64+PurchaseEvaluationSupplierFeatures.cs:49. Rec fail-closed default + storedIsPublic bit. Tag[s112b, supplier-visibility, fail-closed-default]. - [all verbatim → archive/2026-07.md] S98 verify-lane (detector 28→25, 8 derived-stale=FP vs canonical 61/89/440/79; grep exact misses README variant) · S97 feedback-audit (#77/#78/#79
gotchas.md:1301/1317/1325; #53-garble×6=cicd MEMORY-self-target ~17.5KB; Mig60 wrong-table Approvals→Mig61 Changelogs) · 07-01 Supplier-predecessor SUPERSEDED by 07-06 · S93 MFE denom=marks/AS/guards dedup-AS-xref=29, coverage exact-id OR ≥2-content-word. - S129 (07-16 đêm) adap 2 errata EOL 3-lane
wf_3fccd7d1: T0 sweep = SE 0 defect-site (counter duy-nhấtagent-frontmatter-eol-check.ps1byte-level pre-satisfy fix①③; pattern hỏng chỉ ở mention-site). T1: 19i/-textđều declared-binary 0-suspect — filter mẫu erratum thiếu docx/xlsx = 13 dương-giả trên SE (tailor-per-class!); generator-drift thật duy-nhấtmfe-eval.ps1:204Set-Content UTF8 = BOM+CRLF (blob mang BOM 3-byte); W0.6 = EOL-only A/B, trục-quote UNDETERMINED — đừng over-read. T2: nấc thật = 4 gated + 3 discipline (đừng kê "7/7" phẳng — R1 MAJOR). 2 bẫy tự-mắc đáng nhớ:git log -- <file> | tail -1= first-touch KHÔNG phải policy-landing (.gitattributes08c703606-15 vs92de58f07-15) · story "40 = +1 agent mới" BỊA — số scoped=39, delta=skills/README.mdngoài glob SKILL.md (meta-count class). #53 WRITE-lane 2/3 lane — journal cứu trọn, em-main scribe. Tag[s129, adap-errata-eol, byte-counter-pre-satisfy, bom-in-blob, tail1-first-touch-trap]
Moved @S160 (2026-07-29) — verbatim from L1 (moved-not-cut)
-
S155 (07-27) PE xóa-phiếu màn DUYỆT [24 finding,
runs/2026-07-27-S155-pe-delete-approver/sub-invest-be-1.md]: DELETE/api/purchase-evaluations/{id}ĐÃ CÓ (PurchaseEvaluationsController.cs:146, authz = class[Authorize]TRẦN) nhưng allow-list{DangSoanThao,TuChoi}(PurchaseEvaluationFeatures.cs:1404) chặn ChoDuyet.Remove()=SOFT gián tiếp quaAuditingInterceptor.cs:56-62— lớp #81-EXT indirect. Lũy kế:PeBudgetAccumulator.cs2 hàm/4 call-site DUY NHẤT; ChoDuyet ăn số 2 chỗ (ComputeAsync:54PrevSubmitted +ComputePendingAsync:114PendingSelected);TraLaiKHÔNG triệt tiêu;TuChoirơi khỏi 100% phép cộng. Query 0 dòngIsDeleted→ dựa globalHasQueryFilter(PurchaseEvaluationConfiguration.cs:84) ⇒ soft-del TỰ rớt, không sửa accumulator. Snapshot Mig67 KHÔNG re-compute. 🔴 Cascade 6 FK (:75-80) không bao giờ chạy vì soft ⇒ conBaseEntityở lại = rác ẩn. Git khảo cổ TRÚNG: "chỗ cho hủy" = nút Từ chối, gỡ6db195d12-06 S60; guardPurchaseEvaluationWorkflowService.cs:101-106còn sống tự trỏ "Xóa phiếu khi còn Bản nháp" = chính cái lỗ. 0 tiền lệ hủy chứng-từ in-flight; khuôn gần nhấtCancelMeetingBookingHandler(MeetingFeatures.cs:457, Status=Cancelled NOT IsDeleted). Tag[s155, pe-delete-approver, s60-tuchoi-removal-hole, soft-delete-no-cascade] -
S155 (07-27) PE xóa-phiếu FE/authz-slice [18 finding,
runs/2026-07-27-S155-pe-delete-approver/sub-invest-fe-2.md]: Khối HÀNH ĐỘNG =components/pe/PeWorkflowPanel.tsx:458-506byte-identical 2 app (md502671be6…, cùng PeDetailTabs/PeListPanel/ListPage) ⇒ sửa-1-bên-là-sót. Gate 3 tầng:?pendingMe=1→readOnly={!pendingMe}(ListPage:590/:676) ·next=workflow.nextPhasesBE-source (:257) ·blockedByV2Level(:99-103isAdmin ∥ actor∈currentApproval.approvers). 🔴 Plumbing xóa ĐÃ NỐI SẴN vào màn duyệt:onDelete={del.mutate}truyền ởListPage:573+:668(api.delete('/purchase-evaluations/:id'):90) nhưng nút chết vìPeDetailTabs:445đòimode==='workspace' && canEditPhase && !readOnly; nút hiện chỉ ở:460phase===DangSoanThao. Authz 2 tầng: PE vùng FE = 0-hitusePermission|PermissionGuard(guard chỉ sống ở Master+Users, khuônDepartmentsPage:101 action="Delete");menuKeys.tsKHÔNG có constPe_*(chỉ root:23) —Pe_*sinh BEMenuKeys.cs:134-141, seedDbInitializer:1870-1877, FE khớp bằng regexLayout.tsx:120(fe-admin:107LỆCH, thiếu WfView). 🔴Pe_*KHÔNG ∈MenuKeys.All⇒Program.cs:82-89không đăng-ký policyPe_*.{action}(0 dynamic provider) ⇒ dùng[Authorize(Policy="Pe_…")]= policy-chưa-tồn-tại; dùng được ngay =PurchaseEvaluations.Delete(root ∈ All, +GetMyMenuTreeQuery:66-72choPe_*KẾ THỪA cờ CRUD từ root ⇒ 0 key mới, 0 migration). Ma trận enumeratedb.MenuItems(PermissionFeatures.cs:20) nên ô Delete đã hiện sẵn. Q6: thêm-nút KHÔNG kích 4-place (0 route/page/staticMapLayout.tsx:56-106);Pe_*resolve nhánh regex:119-134KHÔNG qua staticMap. Tag[s155, pe-delete-fe-authz, two-app-byte-identical, pe-keys-not-in-All]