wal: flush 20260713T1401

This commit is contained in:
pqhuy1987
2026-07-13 14:01:30 +07:00
parent 88bd8e666d
commit 078396d3a0
2 changed files with 19 additions and 27 deletions

View File

@ -7,18 +7,17 @@
## 📁 Area memory (L2 on-demand — Read khi review vùng tương ứng)
- [S62 PE budget soft-warning](project_s62_pe_budget_soft_warning.md) — PASS: hard-block→soft-warning; submit-guard intact + validator giữ `BudgetPeriodAmount>0`, row8 negative-safe (additive-only). Validator class `PurchaseEvaluationFeatures.cs:317`.
- [Wire/mirror claim verification anchors](feedback_wire_claim_verification_anchors.md) — sha256 twin-file · `git diff -U0` isolate true-adds · `allowNegative` bleed check · guard-still-intact grep.
- [S89 PE budget-sectionB review](project_s89_pe_sectionb_review.md) — investigator 3/3 upheld (do-not-touch FROZEN) + CAUGHT MISSED #70 race: Block B PRO row3/row8 share adjustMut + cross-echo `ev` stale + NO `||peFetching` (every other cell gated). authz-lens ≠ concurrency-lens.
- [S89 PE ends-before-CEO PLAN review](project_s89_pe_endsbeforeceo_plan_review.md) — CONCERN: BE 3-field design sound (Mig 58 col committed, no mig) but FE coverage gap — 4 PeUrgentChips render-sites, plan covered only 2 (missed InboxPage:290 despite BE Inbox A2 updated + wrong ListPage dir path).
- [S89 finalize-note PLAN review](project_s89_finalize_note_plan_review.md) — CONCERN: plan ground-truth 100% accurate (all file:line verified incl self-flagged); gaps = note doesn't say intermediate approvers still sign + skipToFinal-last-level corner + Dev DB 9 migs behind.
- **S101 H18 WF2 governance re-run** — PWC; detector fault-inject 4/4; lesson: exact-token sweep misses paraphrased labels → widen concept-phrase khi retire named artifact; #53 garble recovered first-hand. → `archive/2026-07.md`.
- [S103 H20+crystallized-backfill review](project_s103_h20_crystallized_backfill_review.md) — WF2 PASS (fable-clone ensemble); 6/6 hash recompute MATCH + 4 already-met verified file:line. **Lesson: multi-axis warning phải nằm trong OUTPUT của script, không chỉ doc** — reader chạy script inline.
- **S101 H19 WF2 review LANE-C (adap-reports+honesty)** — PASS; 4 hash recompute MATCH; hex→SHA = recompute CẢ strip/no-strip chứng content-hash ≠ commit-SHA. → `archive/2026-07.md`.
- [S111 PE sign-off 6-decision design review (schema/history lens)](project_pe_signoff_history_schema_review.md) — GO-WITH-ADJ; Decision-5 opinion-history: RECOMMEND (a) append-only table, REJECT (b) version-col (drops UNIQUE + breaks UPSERT read every site), (c) Changelog zero-mig fallback. Hook @ ApproveV2Async UPSERT :784-790. Decision-3 caller-safe (SlaExpiryJob=Contract-only, not PE). A1 breaks 4 bypass tests.
- [PE multi-NCC per-hạng-mục cardinality#3 review (consumer-completeness lens)](project_pe_multiwinner_perhangmuc_review.md) — PASS_WITH_ADJ; 6 BE read-site inventory COMPLETE (grep 1:1, no sót — unlike S87). 2 MUST: (1) giaTri isSingle/detailsSum branch silent-financial under per-hạng-mục; (2) derive-completeness — seed:1310-1316 sets IsSelected never IsWinner → seeded phiếu empty names + CreateContract throws. Lesson: derived source-of-truth = EVERY write-path of base field must re-derive.
- [S89 PE budget-sectionB review](project_s89_pe_sectionb_review.md) — 3/3 upheld + CAUGHT MISSED #70 race: Block B PRO row3/row8 share adjustMut + cross-echo stale + NO `||peFetching`. authz-lens ≠ concurrency-lens.
- [S89 PE ends-before-CEO PLAN review](project_s89_pe_endsbeforeceo_plan_review.md) — CONCERN: BE design sound but FE gap — 4 PeUrgentChips render-sites, plan covered only 2 (missed InboxPage:290 + wrong ListPage path).
- [S89 finalize-note PLAN review](project_s89_finalize_note_plan_review.md) — CONCERN: plan ground-truth 100% accurate; gaps = note omits intermediate-approvers-still-sign + skipToFinal-last-level corner + Dev DB 9 migs behind.
- **S101 H18/H19 WF2 governance re-run + LANE-C** — PWC/PASS; detector fault-inject 4/4; 4 hash recompute MATCH (hex→SHA strip/no-strip proves content-hash ≠ commit-SHA); lesson: exact-token sweep misses paraphrased labels → widen concept-phrase khi retire named artifact; #53 garble recovered. → `archive/2026-07.md`.
- [S103 H20+crystallized-backfill review](project_s103_h20_crystallized_backfill_review.md) — WF2 PASS; 6/6 hash recompute MATCH + 4 already-met verified. Lesson: multi-axis warning phải nằm trong OUTPUT của script (reader chạy inline), không chỉ doc.
- [S111 PE sign-off 6-decision design review (schema/history lens)](project_pe_signoff_history_schema_review.md) — GO-WITH-ADJ; Decision-5 opinion-history: RECOMMEND append-only table, REJECT version-col (drops UNIQUE + breaks UPSERT). Hook @ ApproveV2Async UPSERT :784-790. Decision-3 caller-safe (SlaExpiryJob=Contract-only). A1 breaks 4 bypass tests.
- [PE multi-NCC per-hạng-mục cardinality#3 review](project_pe_multiwinner_perhangmuc_review.md) — PASS_WITH_ADJ; 6 BE read-site inventory COMPLETE (grep 1:1). 2 MUST: giaTri isSingle/detailsSum silent-financial; seed sets IsSelected never IsWinner → empty names + CreateContract throws. Lesson: derived src-of-truth = EVERY write-path re-derive.
- [S113 Supplier import v2 close-review (owner anh Kiệt)](project_s113_supplier_import_v2_review.md) — GO-WITH-ADJ 2 must-fix: consumers (PeDetailTabs:2222 + ContractCreatePage:321 ×2app) DON'T pass published=true → drafts leak into pickers (R4/R6 "ẩn" undelivered) + CreateSupplier:86 missing IsPublic=true. Dedup/publish/mig/authz SOLID. Lesson: "filter added" ≠ "drafts hidden" — grep-all-consumer + create write-path.
- [S114 PE multi-NCC per-hạng-mục BE-financial close-review](project_s114_pe_multi_ncc_perhangmuc_financial_review.md) — NEEDS-FIX 1 MUST: 6 financial-SUM đều→IsSelected (grep độc-lập, 0 sót) NHƯNG DeleteQuote:396 + DeleteDetail:262(cascade) KHÔNG re-derive IsWinner → stranded winner → phantom HĐ GiaTri=0 @CreateContract:56 + FE row kẹt; reachable "Xóa" btn:2897; 0 test. Lesson: derived-invariant re-establish MỌI mutation kể cả DELETE.
- [PE multi-NCC per-hạng-mục spec review (winner-truth cardinality lần 3)](project_pe_multi_ncc_perhangmuc_specreview.md) — PASS_WITH_ADJ. MUST: CreateContract isSingle→detailsSum (`:76-77,89-90`) over-count khi 1-winner≠cả-gói, phá `Σgiari==winnerQuoteTotal`; spec cite `84-93` LOẠI isSingle = bẫy partial-re-key S87. SHOULD: derive-integrity 3 write-path (winner-cmd + UpsertQuote:308/332 + seed:1257 KHÔNG set IsWinner). 6-site IsWinner grep ĐỦ (0 sót). Lesson: grep write-path field-NGUỒN (IsSelected) không chỉ field-đọc; cite-range bọc branch-decision.
- [S114 PE multi-NCC per-hạng-mục IMPL review (winner-truth flip lần 3)](project_s114_multi_ncc_perhangmuc_impl_review.md) — NEEDS-FIX. CAUGHT MUST: DeleteQuote (`PurchaseEvaluationDetailFeatures.cs:371-397`) KHÔNG re-derive IsWinner → xóa quote IsSelected cuối (nút Xóa FE:2897) VỠ invariant → phantom winner + HĐ giá 0 (CreateContract:56 Where(IsWinner)). Spec A2 enumerate writer sót DeleteQuote. Lesson: cardinality grep-consumer PHẢI gồm Delete-handler field-nguồn; spec-enum writer KHÔNG đáng tin. SOLID: 5 SUM IsSelected + test non-tautology (threshold-cross 1.2tỷ/500tr, giaTri 300/800/2000) + 2-app hash ae3788e9.
- [S114 PE per-hạng-mục BE-financial review](project_s114_pe_multi_ncc_perhangmuc_financial_review.md) — NEEDS-FIX: 6 financial-SUM→IsSelected (0 sót) but DeleteQuote:396 + DeleteDetail:262 KHÔNG re-derive IsWinner → stranded winner → phantom HĐ GiaTri=0. Lesson: derived-invariant re-establish MỌI mutation kể cả DELETE.
- [PE per-hạng-mục spec review (winner-truth lần 3)](project_pe_multi_ncc_perhangmuc_specreview.md) — PASS_WITH_ADJ. MUST: CreateContract isSingle→detailsSum (`:76-90`) over-count 1-winner≠cả-gói. Lesson: grep write-path field-NGUỒN (IsSelected) không chỉ field-đọc; cite-range bọc branch-decision.
- [S114 PE per-hạng-mục IMPL review (flip lần 3)](project_s114_multi_ncc_perhangmuc_impl_review.md) — NEEDS-FIX. CAUGHT: DeleteQuote (`...Features.cs:371-397`) KHÔNG re-derive IsWinner → xóa quote cuối (nút Xóa FE:2897) VỠ invariant → phantom winner + HĐ giá 0. Lesson: cardinality grep-consumer PHẢI gồm Delete-handler field-nguồn; spec-enum writer KHÔNG đáng tin. SOLID: 5 SUM + non-tautology test + hash ae3788e9.
---
@ -74,7 +73,8 @@ Adversarial pre-commit reviewer SOLUTION_ERP. Read-only verify + live curl prod
## 📅 Recent activity (compressed — full verbatim → `archive/2026-06.md` + `archive/2026-07.md` via `archive/_INDEX.md`)
- **S115 (2026-07-13) `/fable-real` spec-review presence-not-age adopt (D1 docs + D2 hmw.js STOP-HARD + D3 archive-gate) — PASS-WITH-FIXES (0C/2M/5m):** sub = `runs/2026-07-13-presence-not-age-adopt/spec-review-fable-real.md`. **M1: acceptance-grep can't detect its OWN deliverable's miss** — D2 crit-4 regex `fail-soft.*default subagent\|degrade về default subagent` catches only 1/3 doc-lines (misses ultra-on:21 "cảnh báo" + README:208 order fail-soft-AFTER) → 0-hits=false-PASS; fix = bare-token grep + human-classify vs frozen-history, NOT narrow ordered-pattern. **M2: "skip element" bolted on contiguous-prefix cut = correctness inversion** — naive `if protected continue` leaves skipped entry ABOVE cutLine → STILL archived while code thinks excluded; needs non-contiguous per-entry byte-sum; DRY-RUN bounds harm but 0 acceptance tests after-est. **Lessons: (1) `parallel()` = runtime-builtin NOT in-repo → premise unverifiable-from-source but design robust-under-BOTH-truth-values = endorse-with-caveat; (2) grep-acceptance must bare-token+classify; (3) verify EACH regex-alt vs EACH real target-line by hand; (4) node --check HAS teeth + top-level return/await pass via CJS wrapSafe (empirical > theory).** Spec faithful (3 floors+rec-3+3 honest-notes verified on-disk), scope-clean, honest-caveated; no Smart-Friend lower. → `archive/2026-07.md`.
- **S116 (2026-07-13) outward-email GATE se→ai_infra H-22 WAL restart runtime-verify — PASS (0 over-claim/3 minor):** 6/6 ground-truth re-run MATCH (#5+#6 EXACT: archive-gate 12/12 sub<25.6KB + A7 246/246 pointers; crystallized 382713B/380K-tok/252K headroom). Caveat STRONG+prominent (defers real-persistS111). Minor: (a)-persist WEAK `.claude/WAL.md` git-committed 0-drift survives-restart = git property NOT WAL-mechanism. Lesson: persist-claim on git-tracked WAL verify tracked+0-drift; mechanism-proof lives at Stop-hook run. `archive/2026-07.md`.
- **S115 (2026-07-13) `/fable-real` spec-review presence-not-age adopt PASS-WITH-FIXES (0C/2M/5m):** M1 acceptance-grep can't detect its OWN deliverable's miss (narrow regex 1/3 doc-lines false-PASS; fix bare-token+classify). M2 skip-element on contiguous-prefix cut = correctness-inversion. Lesson: verify EACH regex-alt vs EACH target-line by hand; `parallel()` runtime-builtin robust-under-both = endorse-with-caveat. `archive/2026-07.md`.
- **S101 H19 fable-clone WF2 Lane-A (toggle) PWC, CONCERN closed @S102:** marker WRITE-ONLY dead artifact persist-claim cần CẢ reader-side (verify consumer exists, not just producer); reader BƯỚC 0.5b wired S101-cuối. `archive/2026-07.md`.
- **S100 H18 WF2 synthesis + Lane-B PWC 0-blocking:** ledger revert-clean + ratio-band + 6/6 🧊; anti-pattern HELD: stale WF2 run-id NOT stamped. `archive/2026-07.md`.
- **S98 (2026-07-02) 3 verify-lane PASS (minor):** fidelity-gate 3-lớp (verbatim+pointer-arith+ground-truth-code); Windows byte-verify = .NET ReadAllBytes/`wc -c`/`od -c` (MSYS strip `\r` báo sai). `archive/2026-07.md`.
@ -82,31 +82,19 @@ Adversarial pre-commit reviewer SOLUTION_ERP. Read-only verify + live curl prod
- **S93 (2026-06-29) Harness-16 MFE adopt (WF2 3-lane) PASS 0-blocking:** code-gate re-derived denom-29; READ-ONLY-budget 1 write-op; WF1 caught vocab-fork H6.7H16. adap-report + _INDEX.
- **S92 (2026-06-29) PROD-security hide 5 menu-groups admin-only (uncommitted) PASS (1 note):** A-E upheld; CatalogManager Danh-mục stripped (by-spec, 0 users). [project_s92_admin_only_modules_revoke.md](project_s92_admin_only_modules_revoke.md).
- **S91 (2026-06-25) PE create-contract 1→N multi-winner (FROZEN) — PASS:** codegen mid-loop SaveChanges flush ONLY seq-row; GiaTri per-winner Quote-sum; positional DTO 3 sites; FE byte-mirror; 419 PASS. → `archive/2026-06.md`.
- **S90 (2026-06-25) PE stability D1 (FROZEN) — PASS:** Block B re-key IsWinner; CEO-notify SaveChanges (was never-flush); HoSoLink null-safe; #70 ||peFetching; 413 PASS. → `archive/2026-06.md`.
- **S89-bis (2026-06-25) AREA-6 FE-consumers (FROZEN) — 4/4 + 1 NEW:** create-contract joint-winner DEAD-END (FE `some(isWinner)` vs BE `SelectedSupplierId is null`). → `archive/2026-06.md`.
- **S89 (2026-06-25) AREA-4 workflow-edit (FROZEN) — 3 confirm/1 do-not-touch:** HoSoLink #73 clear-on-partial + NEW 2nd call-site PeDetailTabs:817. → `archive/2026-06.md`.
- **S86 (2026-06-24) PE Section B 3-cột (Mig 59) — PASS:** authz byte-mirror UpdatePeSuggestedPriceCcm (NotFound→Forbidden fail-closed); FE canEditCcm BIT-EXACT; 402 PASS. → `archive/2026-06.md`.
- **S82 (2026-06-21) Harness-15-v2 adopt — 3/3 PASS (3 MINOR):** `broadcasts/_index.md` sha = self-declared frontmatter NOT recompute → đọc frontmatter trước khi flag index-vs-file mismatch. → _INDEX.
- **S76 (2026-06-19) PE budget 3-cột Mig 56 — PASS:** #70 race fixed (useIsFetching gate); Badge mirror gate bit-for-bit; SURPRISE spec "KHÔNG migration" FALSE → đọc changed-set thật. → _INDEX S76.
- **S72* (2026-06-18) Mig 54 PE giá-đề-xuất + CCM-finalize OPT-IN — PASS:** fail-closed guard throw BEFORE Phase=DaDuyet; bypass = 3 gate + server-recompute no-trust-client. → _INDEX S72*.
- **S71 (2026-06-18) Harness-10 run-trace — PASS/GAPS:** "TRACKED" = check-ignore(eligible) vs git-ls-files(committed), model post `git add`. → _INDEX S71*.
- **S69 (2026-06-17) Office re-skin + golive authz — PASS:** re-skin = grep api-call+queryKey sorted -u byte-equal; public-grant root NOT inherit-root; accent -800 silent Tailwind v4. → _INDEX S69*.
- **S65 (2026-06-16) public HRM + PE mục E — PASS:** upgrade MUST MUTATE row NOT skip-existing when prior revoke false (S58-class); menu-hide ≠ API-lock. → _INDEX S65*.
- **S88 (2026-06-25) Fidelity-gate L2 gist distill — FAIL (fabrication-by-merge):** gist gán "Mig 45" cho cluster 2-episode (Master=Mig 47) — merge-distill fabricates false-specificity; QUALITY gate after presence gate. → `archive/2026-06.md`.
- **June-2026 archived digest (detail `archive/2026-06.md` + `_INDEX`; S89/S90/S91 PE = FROZEN do-not-touch):** S91 create-contract 1N multi-winner (codegen mid-loop flush ONLY seq-row; positional DTO 3-site; 419 PASS). S90 stability D1 (Block B re-key IsWinner; CEO-notify never-flush fix; #70 ||peFetching). S89-bis AREA-6 joint-winner DEAD-END (FE `some(isWinner)` vs BE `SelectedSupplierId is null`). S89 AREA-4 HoSoLink #73 clear-on-partial + 2nd call-site PeDetailTabs:817. S88 fidelity-gate FAIL: merge-distill fabricates false-specificity (QUALITY gate AFTER presence). S86 PE Section B authz byte-mirror NotFoundForbidden fail-closed. S82 Harness-15-v2: sha=self-declared frontmatter NOT recompute. S76 PE budget: #70 useIsFetching gate + spec-scope-framing can be FALSE (read changed-set). S72 Mig 54: fail-closed guard BEFORE DaDuyet + server-recompute no-trust-client. S71 Harness-10: TRACKED=check-ignore(eligible) vs git-ls-files(committed). S69 Office re-skin: grep byte-equal + public-grant root NOT inherit-root. S65: upgrade MUST MUTATE row NOT skip-existing; menu-hide API-lock.
- **S108 (2026-07-10 first-real-run H19) FAIL (1C+4M+6m):** email claim "đã sửa comment" khi hmw.js chưa sửa. Lesson: outward-claim "đã sửa X" phải cat X trước gate; grep stale-claim theo CLASS sau fix đại diện. `archive/2026-07.md`.
- **S109 (2026-07-10 fidelity-gate 2 gist L2) PASS_WITH_FIXES (3):** gist meta-count 15disk 14; delta tự-tính +8.8KB = self-computed false-specificity; N/A-just over-claim fact-claim trong N/A verify như content. `archive/2026-07.md`.
- **S111 (2026-07-12 H22 WAL adopt) PASS_WITH_FIXES (0C/1M):** fault-inject 2-ca PASS; CATCH CAVEAT "STAGED" còn khi N.3 nâng VERIFIED-RUNTIME = nâng-nấc-quên-sync cùng-diff; live-witness>forensics (commit GIỮA review = chứng hook fire). → `archive/2026-07.md`.
- **S110 (2026-07-11 H21+MTv3 adopt) — PASS_WITH_FIXES (0C/5M):** doc "VALID_ROLES 12" nhưng code=10 → claim-về-code grep lại kể cả reword; supersede trỏ adap-report chưa tạo = dangling. → `archive/2026-07.md`.
- **S112 (2026-07-12) close-reviews `[fable-real-single]` — GO-WITH-ADJ ×2:** (import) FE Import btn reuses Suppliers.Create guard but endpoint = Admin/CatalogManager → dead button drafters → **derive guard from ENDPOINT authz not sibling-menu**; (PE sign-off) EDGE-5 terminal-lock sót admin-override SVC:290 → **gác FROM-state ở ĐỈNH method KHÔNG per-branch**; A1 mở CEO-skip mới. → [topic](project_s112_supplier_import_review.md), `archive/2026-07.md`.
- **S112 (2026-07-12) import BE-close + FINAL bundle — GO 0-must-fix:** 6 axes PASS; adjust applied (30 ExpectedHeaderTokens byte-identical NFC + `.Normalize(FormC)` both sides; guard @top SVC:66). UAT by-design: A1 bỏ auto-terminal-on-submit. **Lessons: self-flip token-test = internal-consistency NOT external-file-accept; build/test-green nhận theo claim, review LOGIC bằng đọc; byte-diff token-array TAY.**`archive/2026-07.md`.
- **S112 (2026-07-12) `[fable-real-single]` close-reviews + FINAL bundle — GO 0-must-fix:** (import) Import btn reuses Suppliers.Create guard but endpoint=Admin/CatalogManager → dead button derive guard from ENDPOINT authz not sibling-menu; (PE sign-off) EDGE-5 terminal-lock sót admin-override SVC:290 → gác FROM-state ở ĐỈNH method KHÔNG per-branch; A1 mở CEO-skip. FINAL 6-axes PASS + 30 ExpectedHeaderTokens byte-identical NFC. Lesson: self-flip token-test = internal-consistency NOT external-file-accept; byte-diff token-array TAY. → [topic](project_s112_supplier_import_review.md), `archive/2026-07.md`.
---
## 🔄 Curate trigger
- Hook-cap **>17.1KB** (24.4KB read-limit — đổi từ ~30KB cũ, S109) → archive recent → L2 `archive/<period>.md` (append additive) + `_INDEX.md` substring pointer. Stale >3mo → remove.
- **S116 curate (self, 2026-07-13, hook 21.4KB→<17.1KB):** moved S115+S116 verbatim `archive/2026-07.md` (move-not-cut, batch-marker) + digest in L1; MERGED 12 June bullets (S65-S91) 1 consolidated digest line (detail `archive/2026-06.md`+`_INDEX`); trimmed 4 PE-per-hạng-mục + S89-trio + S111 Area-pointers (detail in topic files on disk).
- **S113 curate (self, 2026-07-12, hook 21.3KB→~16KB):** compressed 4 verbose S112 entries (2 close-review lines1, BE-close+FINAL1) + this curate-log in-place; NO file-move (lessons preserved inline). digest kept L1. **+review-lane addendum:** 4 verbatim ALSO moved `archive/2026-07.md` + 4 `_INDEX` pointer (move-not-cut) + trimmed 2 digest.
- **S109 curate:** moved 4 verbatim S100/S101 `archive/2026-07.md` +4 pointer.
- **S102 recovery (em-main):** cut-not-moved ×5 @`f229b07` recovered từ git. **Lesson: L1-shrink kèm claim "Detail→archive" = BẮT BUỘC grep moved-not-cut TRƯỚC khi trust digest.**

View File

@ -40,3 +40,7 @@
- **2026-07-12 (S112 PE sign-off approach-review PRE-fan-out+deploy, security/governance lane) `[fable-real-single]`:** **GO-WITH-ADJUSTMENTS.** (1) EDGE-5 decision-3 hard-lock: spec placement (reject-branch SVC:92 + EnsureCanReject:321 + handler) **INCOMPLETE — bỏ sót admin-override path SVC:290** (`if(isAdmin) evaluation.Phase=targetPhase`) → admin un-terminal DaDuyet bằng decision=Approve (KHÔNG qua reject). Fix = 1 guard TOP-of-method sau `var fromPhase` SVC:53. Lesson: **terminal-lock gác FROM-state ở ĐỈNH method, KHÔNG rải per-branch** (per-branch bỏ sót admin/fall-through). (2) CEO-skip decision-2: A1 (creator tự ký ô mình thay auto-bypass) **TẠO đường CEO-skip MỚI** multi-step-có-CEO — trước A1 bypass advance-qua slot creator (bỏ check finalize); sau A1 creator qua ApproveV2Async → slot có `AllowApproverFinalize`=true + tick → DaDuyet bỏ CEO (SVC:867). invest-C "đã tồn hôm nay" IMPRECISE (chỉ đúng 1-step-no-CEO). Escalate owner. Lesson: **đổi auto-advance→manual-approve = mở lại per-slot flag mà auto-path che khuất** — re-scan flag khi đổi ai-đi-qua-code-nào.
- **2026-07-12 (S112 Supplier Excel-import close-review PRE-deploy, BE+ADJUST) `[fable-real-single]`:** **GO-WITH-ADJ.** 6 axes PASS: OrdinalIgnoreCase preview+confirm (BuildCiIndex:446/batchByCode:157/seen:158), FillNulls:381-409 skip Code/Name/Type, all-or-nothing gate:137-152 pre-mutate + SaveChanges:188, parser abs Cell:284 (KHÔNG CellsUsed) +#REF!→null:289 +NAS-raw:290 +fingerprint-Ordinal-reject:223, Mig 63 reversible+3-file+snapshot:3330, col→field 30/30 OK (Code=col4 viết-tắt, Name=col5 tên-cty). REQUIRED adjust = bake 30 real token → ExpectedHeaderTokens:37-66 (nguồn test RealFileHeaderTokens:420-451 == brief exact; Case 9 auto-flip). **CAUGHT (MAJOR de-risk): Unicode NFC/NFD** — test dựng workbook từ literal NFC nên KHÔNG chứng file Excel THẬT accept; đề `.Normalize(FormC)` NormalizeHeader:306. Lesson: self-flip token-test = internal-consistency KHÔNG external-file-acceptance (artifact ngoài repo = bất-khả-verify).
- **2026-07-12 (S112 FINAL pre-commit+deploy review — BÓ 2-feature PE-signoff + Supplier-import) `[fable-real-single]` — VERDICT GO (0 must-fix):** Cả 2 close-review adjust ĐÃ áp đúng. **F1 PE**: EDGE-5 guard đúng ĐỈNH-method SVC:66 (sau fromPhase:53) exempt admin+system, precede CẢ 5 branch incl admin-override:306 (:306 vốn `if(isAdmin)` nên non-admin không tới) + EnsureCanRejectV2Async:332 untouched; A1 minOwn=Min(Order):607 bypass<minOwn no-auto-sign pointer-stop `if(minOwn>1)`:637 (StepIdx giữ 0 từ submit:265), 4 nhánh (auto-sign/next-Bước/step2/terminal) DELETED; History CHANGE4:751-777 log opinion-cũChangelog TRƯỚC 4 dòng overwrite, chỉ non-empty, keyed per-level-row (matchingLevel.Id) chỉ fire khi CÙNG-NV re-sign, enum Workflow=5/Update=2 tồn. Tests 8-new/4-updated adversarial-grade (EDGE-5 system-exempt chứng qua msg "không hỗ trợ"≠"kết thúc"; history 2-boundary). **F2 import**: 30 ExpectedHeaderTokens==test byte-identical all-NFC (script verify 0-mismatch); NormalizeHeader FormC:313 áp cả 2 phía; endpoint [Authorize(Roles=Admin,CatalogManager)] = pattern Update/Delete; Mig 63 = 2 nullable additive (prod-safe, expansion-cols từ Mig 62 `778fc98` deployed per 4-NCC-in-prod). **Nice-to-have (KHÔNG block)**: (a) test comment :31-37 + svc :31-34 stale "BEST-GUESS chưa khớp" (đã bake) misleading, harmless; (b) test NormalizeJoin:407-414 thiếu `.Normalize(FormC)` svc:313 moot token toàn NFC nhưng latent nếu sau thêm token NFD. **UAT-visible behavior change (by-design, không phải bug)**: A1 bỏ auto-terminal-on-submit TP tạo phiếu-1-bước-tự-là-cấp-cuối GIỜ phải bấm Duyệt thêm 1 lần (trước tự DaDuyet). **Lesson: Case-9 self-adjusting (shouldMatch tính runtime) PASS ≠ chứng real==expected → phải diff byte-level 2 mảng token TAY; build/test-green (458) nhận theo claim, review logic bằng đọc.**
<!-- ===== S116 curate batch (2026-07-13) moved 2 verbose entries (S115, S116) from L1 (hook >17.1KB) ===== -->
- **S115 (2026-07-13) `/fable-real` spec-review presence-not-age adopt (D1 docs + D2 hmw.js STOP-HARD + D3 archive-gate) — PASS-WITH-FIXES (0C/2M/5m):** sub = `runs/2026-07-13-presence-not-age-adopt/spec-review-fable-real.md`. **M1: acceptance-grep can't detect its OWN deliverable's miss** — D2 crit-4 regex `fail-soft.*default subagent\|degrade về default subagent` catches only 1/3 doc-lines (misses ultra-on:21 "cảnh báo" + README:208 order fail-soft-AFTER) → 0-hits=false-PASS; fix = bare-token grep + human-classify vs frozen-history, NOT narrow ordered-pattern. **M2: "skip element" bolted on contiguous-prefix cut = correctness inversion** — naive `if protected continue` leaves skipped entry ABOVE cutLine → STILL archived while code thinks excluded; needs non-contiguous per-entry byte-sum; DRY-RUN bounds harm but 0 acceptance tests after-est. **Lessons: (1) `parallel()` = runtime-builtin NOT in-repo → premise unverifiable-from-source but design robust-under-BOTH-truth-values = endorse-with-caveat; (2) grep-acceptance must bare-token+classify; (3) verify EACH regex-alt vs EACH real target-line by hand; (4) node --check HAS teeth + top-level return/await pass via CJS wrapSafe (empirical > theory).** Spec faithful (3 floors+rec-3+3 honest-notes verified on-disk), scope-clean, honest-caveated; no Smart-Friend lower.
- **S116 (2026-07-13) outward-email GATE se→ai_infra H-22 WAL restart runtime-verify — PASS (0 over-claim / 3 minor):** file `broadcasts/outbox/ai_infra/2026-07-13-se-to-ai_infra-h22-wal-restart-runtime-verify.md`. 6/6 ground-truth re-run MATCH — #1 rev-list=0 · #2 tree clean (modulo email-artifact itself untracked) · #3 HEAD=88bd8e6 · #4 WAL empty-template · #5+#6 EXACT: archive-gate 12/12 sub<25.6KB (tightest investigator-codebase 25237, 363B headroom) + A7 246/246 pointers 0-fail; crystallized 382713B/380K-tok cap/252429-tok headroom. Caveat section STRONG+prominent (own §header "Nấc honest", bold WAL RỖNG/CHƯA, enumerates a/b/c verified vs content-recovery NOT; line31 defers real-persistS111 Stop-hook×2). No implicit "full restart-recovery verified". **Minor: (1) caveat item (a) "WAL persist qua restart" evidentiary-WEAK — `.claude/WAL.md` git-COMMITTED @88bd8e6 empty-template 0-drift → post-reboot existence = git/filesystem guarantee NOT WAL-mechanism proof (self-corrected by line31 defer-to-S111); (2) unit-notation "382.7KB / 380K-tok" juxtaposes bytes-vs-tokens (382.7KB≈95-127K tok not 382.7K) — looks scarier/understates headroom, "(fits)+252K" resolves; (3) current tree clean modulo email-artifact-itself (untracked).** Lesson: persist-claim on git-tracked WAL verify tracked+0-drift FIRST; "file survives restart" = git/filesystem property, mechanism-persist proof lives at Stop-hook run (S111). No Smart-Friend lower report well-calibrated toward humility.