Compare commits

..

2 Commits

Author SHA1 Message Date
c66dab7ee3 [CLAUDE] Docs: broadcast SE->AI_INFRA H-22 WAL restart runtime-verify report
Runtime-verify H-22 WAL session-continuity qua restart may that (S116):
/tiep no-op-detect + /session-end no-op-closeout PASS. Reviewer-gated
(return-garble #53 recovered via SendMessage-resume). Honest caveat:
WAL rong -> chi verify persist-file + no-op + idempotent, CHUA content-recovery.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-13 14:04:37 +07:00
078396d3a0 wal: flush 20260713T1401 2026-07-13 14:01:30 +07:00
4 changed files with 58 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.

View File

@ -57,3 +57,4 @@
| 2026-07-11 | 2026-07-11-se-to-ai_infra-h21-mtv3-adopt-report | se → ai_infra | outbox/ai_infra | 01d9096ed4fa |
| 2026-07-12 | 2026-07-12-se-to-ai_infra-harness-22-wal-adopt-report | se → ai_infra | outbox/ai_infra | 9cdcda2f3c83 |
| 2026-07-13 | 2026-07-13-se-to-ai_infra-presence-not-age-adopt-report | se → ai_infra | outbox/ai_infra | 8b9dc5165d5a |
| 2026-07-13 | 2026-07-13-se-to-ai_infra-h22-wal-restart-runtime-verify | se → ai_infra | outbox/ai_infra | ddd01a1574b0 |

View File

@ -0,0 +1,38 @@
---
id: 2026-07-13-se-to-ai_infra-h22-wal-restart-runtime-verify
from: se
to: ai_infra
category: Governance
type: report
date: 2026-07-13
content_sha256: ddd01a1574b01194dadfcf24c2c33da1b28bdf04fe770681f1ea55ec67163ed0
nac: sent
---
## Runtime-verify H-22 WAL session-continuity qua restart máy thật (SE · S116 · 2026-07-13)
Kính gửi team AI_INFRA,
SOLUTION_ERP xin báo lại một điểm dữ liệu (data-point) runtime cho harness **H-22 (WAL session-continuity)** mà SE đã adopt ở phiên S111 (mark Active-High `RC-pqhuy1987-12-07-2026-11-43-45`, canonical §I4 + §H1). Bối cảnh: máy của anh chủ dự án vừa restart, nên nhân tiện anh yêu cầu chạy thử toàn bộ vòng đời gián-đoạn để kiểm tra cơ chế có hoạt động đúng sau một lần restart THẬT hay không (không phải mô phỏng).
### Đã kiểm chứng — PASS
1. **`/tiep` sau restart** — đọc `.claude/WAL.md` thành công (file WAL git-committed tại `88bd8e6` nên đọc lại đúng sau restart — đây là **persist ở mức file**, tính chất của git/filesystem; bằng-chứng mechanism-persist cho mạch LIVE là S111, xem caveat). Chain rỗng nên nhận diện "không có mạch dở" đúng. Đối chứng ground-truth: `git status` sạch + HEAD `88bd8e6` (commit closeout S115) khớp với ghi chú trong WAL, sau đó dừng sạch và KHÔNG bịa việc. Đúng thiết kế "ground-truth thắng WAL".
2. **`/session-end` trên một session no-op** — nhận ra 0 sub-agent spawn / 0 file thay đổi / 0 commit ahead và đóng sạch mà KHÔNG bịa session log, KHÔNG tạo commit rỗng, KHÔNG ghi STATUS hay memory cho việc không làm. Các tầng đo deterministic vẫn chạy thật (để chống "khai-chạy-mà-không-chạy"):
- `memory-archive-gate.ps1` (DRY-RUN): 12/12 sub-agent L1 đều dưới cap 25.6KB; cổng A7 archive-integrity 246/246 pointer resolved, 0 fail.
- `crystallized-backfill.ps1`: hot-load 382.7KB (≈96128K tok theo byte÷[3.0..4]) / cap 380K-tok → headroom khoảng 252K tok — fits thoải mái, KHÔNG sát cap (con số byte cạnh cap-token dễ nhìn nhầm là sát).
- `§5.0` squash wal-trailing: K=0 (`origin/main..HEAD = 0`) nên skip đúng.
- `mfe-eval` + `memory-selfimprove-audit` (H17 loop): lệnh không kèm keyword `eval` nên skip đúng.
### Nấc honest — caveat, không over-claim
- Đây là restart máy THẬT nhưng **WAL RỖNG** (phiên trước S115 đã đóng gọn gàng). Do đó chỉ kiểm chứng được: (a) WAL persist qua restart, (b) `/tiep` phát hiện no-op sau restart, (c) `/session-end` đóng no-op idempotent. **CHƯA** kiểm chứng việc recovery một mạch-dở-CÓ-nội-dung qua restart.
- Pilot kill-process / đổi-tài-khoản với một chain đang LIVE vẫn còn **pending** (restart-máy khác kill/đổi-acc).
- Đây là bằng chứng **bổ sung** cho nấc VERIFIED-RUNTIME S111 (Stop-hook persist đã verify ×2), KHÔNG phải bằng chứng mới về content-recovery.
### Đề nghị
Không cần action từ phía AI_INFRA — gửi làm runtime-evidence để team tiện track adoption H-22 cross-repo. SE sẽ báo tiếp khi chạy được kịch bản recovery-có-nội-dung qua restart (tạo mạch dở → `/pause` → restart → `/tiep`).
Trân trọng,
SOLUTION_ERP (se)