diff --git a/.claude/agent-memory/harvest-curator/MEMORY.md b/.claude/agent-memory/harvest-curator/MEMORY.md index 4fd988c..c5f3fb0 100644 --- a/.claude/agent-memory/harvest-curator/MEMORY.md +++ b/.claude/agent-memory/harvest-curator/MEMORY.md @@ -40,3 +40,4 @@ H2 harvest-MD-integrity auditor **SOLUTION_ERP-self**. Read-only + **propose-onl - **2026-07-02 (S99 @start RE-REPORT — post-S98 same-day):** Verdict 🟢 gần-CLEAN — duy nhất 1 delta mồ-côi = cicd `:73` entry **#485 (rn 371) `8a249c5` GO** mtime 11:06:03 SAU commit-cuối 10:57:45 = orphan-by-construction (post-closeout verify, precedent S58 #385/#386) · fidelity ARITHMETIC-verified độc lập: push-range `310b9fc..8a249c5` = 23 file = 22 .md + đúng 1 non-md `memory-budget.json` khớp claim từng-chữ · tag "S98" ĐÚNG (hết drift sau patch S98) → propose COMMIT vào bundle đầu S99, KHÔNG revert. 3 orphan-append S98 **đóng thật tại HEAD** (db-agent `:36` gộp 4th+5th · reviewer `:72` addendum Part-5 · impl-fe `:16` hook Part-2 — đủ 4-field + on-behalf label). Orphan run **0/16** ledger all-closed (mode-A note live; folder mới=0 từ 06-18, chỉ `_ledger.md` mtime 07-02 committed). 0-byte=0 ×2 nơi · tail 11/11 `0a` · U+FFFD hit đều quoted-cũ (cicd `archive/2026-06.md:26` #377 + archive MÌNH — L1 mình + cicd L1 SẠCH sau curate). Chore: impl-be 23.9KB sát cap 25.6KB watch (đứng im từ 06-25, không phình). **Self-curate S99:** L1 19.9→~9KB, S50-S66 → `archive/2026-06.md` (17072B, 14 entry, moved-not-cut grep 5/5) — hook-triggered, trong quyền diary-mình. Wrote OWN diary. Tag `[s99-start, cicd-485-orphan-sane, arithmetic-fidelity, self-curate-L2, clean]`. - **2026-07-02 (S100 @start RE-REPORT — post-S98+S99, on-behalf em main APPEND B3):** Verdict 4-trục ALL-CLEAN + 1 live-delta. (1) Delta S98/S99 committed đúng nhà (`4263d63`/`8a249c5`/`c112be9`), 0 mtime>HEAD; duy nhất tooling L1 dirty 14:38:42 = entry S100 tự-ghi (NOT-in-HEAD) → commit bundle bootstrap. (2) Mồ-côi 0: S98 2-monitor + 3 orphan-append S97 đóng + cicd #485 tại `:73` · S99 2-monitor đủ 4-field. (3) Orphan run 0/14, ledger 0 `⏳`, mode-A by-design. (4) 0-byte 0/11 · tail 11/11 `0a` · U+FFFD 2-file quoted-cũ known · tooling archive spot-check 3-hit moved-not-cut · impl-fe gist ADDITIVE. INFORM: S99 push `8a249c5..525a01a` (9 .md docs-only, CI path-filter skip) chưa cicd-verify — optional. Chore: impl-be 23.9KB đứng-im 06-25 watch · fe-designer 21.5KB + reviewer 20.7KB > self-target 17.1KB garble-pressure watch. Method-new: monitor song-song ghi diary GIỮA 2 batch scan → batch-1 status/mtime = stale-snapshot, re-check trước khi phán dirty/orphan. Tag `[s100-start, 4-truc-clean, tooling-l1-live-delta, on-behalf]`. - **2026-07-03 (S101 @start + @closeout — on-behalf em-main APPEND B3):** @start RE-REPORT ALL-PASS/CLEAN (0-orphan · 0-byte 0/11 · 0-corruption + cicd #486 dirty-delta fidelity-verified→commit). @closeout **GATE PASS 5/5 trục** (S101 = 2 commit `f229b07` H18-WF2-closeout + `e350660` H19-formal-adopt): Coverage COMPLETE 6 spawn-touchpoint (2 monitor + WF1-invest investigator-cb + WF2-H18/H19 reviewer ×2), Corruption U+FFFD=0/11 · tail-0a=11/11, close-gate **0 July-run-folder** (mode-A ephemeral confirmed) → 0-orphan. 🔴 **AS-10 Fidelity-call: LEGIT harvest NOT residual-violation** — WF1+WF2 lanes tự-ghi agent-memory (frontmatter "update-MEMORY-before-return" override HMW-return-only) NHƯNG verify ĐỘC-LẬP content khớp lane-verdict (reviewer README:51-fix landed-verbatim hunk `@@-48,5+48,5`, 0 fabrication) + containment intact committed → **KEEP đúng per keep-if-correct** (KHÁC S95-default-revert vì S101-writes CLEAN, quyết bằng Fidelity-gate KHÔNG tự-phán). Cross-link H19 §K.C GAP-3 dogfood-validate "N-lane-return-only = convention KHÔNG mechanism" (fire 6, catch 6, 0 escape). Chore-watch: impl-be 23955B near-cap 93.6% (đứng-im 06-25) · reviewer 20728→19357 net-shrink healthy · self diary 8434B healthy. Method-#5 self-trap: empty-grep từ `+-`-filter choking leading-bullet → dùng method-#5 fix (false-alarm caught). Tag `[s101-gate-pass-5truc, as10-fidelity-legit-keep, gap3-dogfood, on-behalf]`. +- **2026-07-06 (S102 @start RE-REPORT — self-write per em-main instruction):** Model self-report `claude-fable-5`. Coverage/Completeness/Corruption CLEAN: git-porcelain 0 dirty ⟹ **0 delta mồ-côi by-construction** (mtime agent-memory ≤18:31:37 < closeout `3e2c18b` 18:32:11, method-#3) · orphan-run **14/14 PASS** folder-scan, 0 folder July = 3 WF S101 mode-A by-design · 0-byte 0/11 · tail 11/11 `0a` · U+FFFD L1 0/11 (2 archive hit quoted-cũ known). AS-10 KEPT entries reviewer VERIFIED intact: `:13` H18 `wf_955643c3` + `:14` H19 Lane-C + `:22` H19 Lane-A (f229b07/e350660). 🔴 **CATCH ×2 FLAG (miss của chính gate S101 mình):** (1) f229b07 XÓA 5 verbatim (S97·S97-bis·S98×3) khỏi reviewer L1, digest claim "Detail → archive/2026-06.md" nhưng grep 0/0/0 + archive mtime 06-20 = **cut-not-moved**, verbatim chỉ còn `git show 5ee32c0:` → propose recover → `reviewer/archive/2026-07.md` + _INDEX; (2) `:72` pointer `project_s100_h18_wf2_synthesis.md` chưa-từng-tồn-tại (git log --all rỗng) = dead-satellite; minor `:22` lạc section Role-baseline. Đối-chứng: cicd f229b07 nén IN-PLACE (giữ one-liner trong L1) = pattern sạch. **Method-new: L1 net-shrink + claim "Detail→archive" = PHẢI grep archive moved-not-cut TRƯỚC khi PASS — "net-shrink healthy" S101 là verdict thiếu trục.** Chore: impl-be 23955B idle · fe-designer 21.5K / inv-cb 20.6K / reviewer 19.4K / cicd 18.4K > self-target 17.1K watch. Tag `[s102-start, cut-not-moved-catch, dead-pointer, 0-orphan-delta]`. diff --git a/.claude/agent-memory/reviewer/MEMORY.md b/.claude/agent-memory/reviewer/MEMORY.md index 190c0d1..d529f25 100644 --- a/.claude/agent-memory/reviewer/MEMORY.md +++ b/.claude/agent-memory/reviewer/MEMORY.md @@ -19,8 +19,6 @@ Adversarial pre-commit reviewer SOLUTION_ERP. Read-only verify + live curl prod UAT (`*.solutions.com.vn`). Tools: Read, Grep, Glob, Bash (curl + git diff + sqlcmd read) + 5 RAG MCP. Skills: `dependency-audit-erp` + `contract-workflow` + `permission-matrix`. Output: PASS/FAIL + concrete issues file:line. NEVER write code. -**S101 H19 fable-clone WF2 Lane-A (toggle mechanism) — PASS_WITH_CONCERNS (1 CONCERN, 0 BLOCKING):** 3 Lane-A asks all CONFIRMED — (Q1) `/fable-real`=Write · `/fable-clone`=Remove-Item mirror ultra-on/off, both carry no-hot-reload warning; (Q2) semantic INVERSE (marker-absent=ảo-DEFAULT · present=thật) consistent across 8 statements + `git check-ignore .claude/fable-real-mode.on`=IGNORED (line 92 AFTER `!.claude/**` neg line 83, verified `check-ignore -v`) + tracked cmd-file NOT-ignored; (Q3) GAP-1 scope-guard "N lane CÙNG 1 vai, KHÔNG mixed-roster" pinned in BOTH cmd-files + §K.C, and hmw.js VALID_ROLES independently confirmed = all 9 roles no 2-position gate (resolveModel unrestricted) → GAP-1 leak framing ACCURATE not fabricated. **CONCERN (refutation that landed):** marker is a WRITE-ONLY dead artifact — `/fable-real.md:10` claims "Mode persist qua marker → SỐNG qua session/compact" but NOTHING reads `fable-real-mode.on`; `/session-start` BƯỚC 0.5 reads only `hmw-mode.on` and was NOT extended (session-start.md unmodified in git status, empty grep for any reader). Write half-loop exists, read→report→route half-loop absent → wording overstates mechanism. Non-blocking because vacuously-met-today (all-inherit → 2 positions ALREADY top-model → 0 runtime-delta; toggle manual/owner-driven by design) — bites only when Fable returns + tiering resumes. **Anti-pattern: mirror-a-toggle copies the WRITER side but silently drops the READER side** — a persist-claim needs BOTH write-on-set AND read-on-session-start; verify the consumer exists, not just the producer. Vacuously-met disclosure itself was clean (§K.D + mark both say "KHÔNG overclaim runtime-delta"). - --- ## 🚨 Recurring bug patterns (catch priority) @@ -67,13 +65,12 @@ Adversarial pre-commit reviewer SOLUTION_ERP. Read-only verify + live curl prod --- -## 📅 Recent activity (compressed — full verbatim → `archive/2026-06.md` via `archive/_INDEX.md`) +## 📅 Recent activity (compressed — full verbatim → `archive/2026-06.md` + `archive/2026-07.md` via `archive/_INDEX.md`) -- [S100 H18 WF2 synthesis + Lane-B](project_s100_h18_wf2_synthesis.md) — SYNTHESIS reviewer 2-lane JSON→overall **PASS_WITH_CONCERNS** (LaneA PASS + LaneB PWC, neither BLOCKING). Re-verified indep: ledger +2/0-del revert-clean · ratio-band replaced `|diff|>=10` · glob replaced 3-fixed-list · 6/6 consumers 🧊-marked · every LIVE `_ledger` marked (unmarked=history) · CONCERN workflows/README:51 no-token points-authoritative=non-block · KEY anti-pattern HELD (stale WF2 `wf_31ea3985` NOT stamped, both placeholders await fresh run). Prior S100-bis Lane-B PASS (2 minor) folded in. - - -- **S98 (2026-07-02) 3 verify-lane (fidelity-gist impl-fe + cicd L1-curate + mega-line re-tier) — all PASS (minor only):** Lessons: fidelity-gate 3-lớp = verbatim + pointer-arithmetic + ground-truth-code cho MỌI diễn-giải vượt-verbatim (honest-empty > bịa filler) · Windows byte-verify GROUND-TRUTH = `.NET ReadAllBytes`/`wc -c`/`od -c` (MSYS grep/sed strip `\r` báo sai) · conservation-proof = arithmetic full-accounting > spot-check; Read-tool truncate >2K → PS ReadAllLines+ordinal IndexOf. Detail → `archive/2026-06.md`. -- **S97/S97-bis (2026-07-01) PE finalize UAT ×2 app + EndsBeforeCeo CONFIG→RUNTIME Mig 60/61 (anh Kiệt FDC) — PASS (0 issue):** default-flip opt-out→opt-in byte-mirror SHA256 ×2; RUNTIME-flag set DUY-NHẤT 1/5 DaDuyet-nhánh (grep-all) + 4-projection nhất-quán + Mig 3-file OK + backfill-LIKE VN-chuỗi = false-pos MINOR-only; EF-ternary List/Inbox CONFIRMED-runtime via test-in-395. Detail → `archive/2026-06.md`. +- **S101 H19 fable-clone WF2 Lane-A (toggle mechanism) — PASS_WITH_CONCERNS (1 CONCERN, 0 BLOCKING):** 3 Lane-A asks all CONFIRMED — (Q1) `/fable-real`=Write · `/fable-clone`=Remove-Item mirror ultra-on/off, both carry no-hot-reload warning; (Q2) semantic INVERSE (marker-absent=ảo-DEFAULT · present=thật) consistent across 8 statements + `git check-ignore .claude/fable-real-mode.on`=IGNORED (line 92 AFTER `!.claude/**` neg line 83, verified `check-ignore -v`) + tracked cmd-file NOT-ignored; (Q3) GAP-1 scope-guard "N lane CÙNG 1 vai, KHÔNG mixed-roster" pinned in BOTH cmd-files + §K.C, and hmw.js VALID_ROLES independently confirmed = all 9 roles no 2-position gate (resolveModel unrestricted) → GAP-1 leak framing ACCURATE not fabricated. **CONCERN (refutation that landed):** marker is a WRITE-ONLY dead artifact — `/fable-real.md:10` claims "Mode persist qua marker → SỐNG qua session/compact" but NOTHING reads `fable-real-mode.on`; `/session-start` BƯỚC 0.5 reads only `hmw-mode.on` and was NOT extended (session-start.md unmodified in git status, empty grep for any reader). Write half-loop exists, read→report→route half-loop absent → wording overstates mechanism. Non-blocking because vacuously-met-today (all-inherit → 2 positions ALREADY top-model → 0 runtime-delta; toggle manual/owner-driven by design) — bites only when Fable returns + tiering resumes. **Anti-pattern: mirror-a-toggle copies the WRITER side but silently drops the READER side** — a persist-claim needs BOTH write-on-set AND read-on-session-start; verify the consumer exists, not just the producer. Vacuously-met disclosure itself was clean (§K.D + mark both say "KHÔNG overclaim runtime-delta"). *(dời từ Role-baseline @S102 — H2 Placement-flag; NOTE @S102: reader BƯỚC 0.5b ĐÃ wire tại S101-cuối → CONCERN closed, marker có consumer.)* +- **S100 H18 WF2 synthesis + Lane-B** — SYNTHESIS reviewer 2-lane JSON→overall **PASS_WITH_CONCERNS** (LaneA PASS + LaneB PWC, neither BLOCKING). Re-verified indep: ledger +2/0-del revert-clean · ratio-band replaced `|diff|>=10` · glob replaced 3-fixed-list · 6/6 consumers 🧊-marked · every LIVE `_ledger` marked (unmarked=history) · CONCERN workflows/README:51 no-token points-authoritative=non-block · KEY anti-pattern HELD (stale WF2 `wf_31ea3985` NOT stamped, both placeholders await fresh run). Prior S100-bis Lane-B PASS (2 minor) folded in. +- **S98 (2026-07-02) 3 verify-lane (fidelity-gist impl-fe + cicd L1-curate + mega-line re-tier) — all PASS (minor only):** Lessons: fidelity-gate 3-lớp = verbatim + pointer-arithmetic + ground-truth-code cho MỌI diễn-giải vượt-verbatim (honest-empty > bịa filler) · Windows byte-verify GROUND-TRUTH = `.NET ReadAllBytes`/`wc -c`/`od -c` (MSYS grep/sed strip `\r` báo sai) · conservation-proof = arithmetic full-accounting > spot-check; Read-tool truncate >2K → PS ReadAllLines+ordinal IndexOf. Detail → `archive/2026-07.md` (recovered S102 — cut-not-moved f229b07). +- **S97/S97-bis (2026-07-01) PE finalize UAT ×2 app + EndsBeforeCeo CONFIG→RUNTIME Mig 60/61 (anh Kiệt FDC) — PASS (0 issue):** default-flip opt-out→opt-in byte-mirror SHA256 ×2; RUNTIME-flag set DUY-NHẤT 1/5 DaDuyet-nhánh (grep-all) + 4-projection nhất-quán + Mig 3-file OK + backfill-LIKE VN-chuỗi = false-pos MINOR-only; EF-ternary List/Inbox CONFIRMED-runtime via test-in-395. Detail → `archive/2026-07.md` (recovered S102 — cut-not-moved f229b07). - **2026-06-29 S93 Harness-16 MFE adoption review (WF2 `wf_13e3d35a` 3-lane PASS 0-blocking):** ⭐ code-gate re-derived denom-29 + leading-verb-trap DEFEATED (`NEVER commit push`→0 content-word) + READ-ONLY-budget proof (1 write-op `.mfe-state.json`); WF1-reviewer caught BLOCKING vocab-fork (memory-fidelity H6.7≠H16 → MFE+alias-map §H). Detail → adap-report harness-16-mfe. → _INDEX. - **S92 (2026-06-29) Adversarial PROD-security hide 5 menu-groups admin-only on eoffice (uncommitted) — PASS (0 blocking, 1 awareness note):** A-E all upheld; CatalogManager Danh-mục access stripped (intended-by-spec, role assigned to 0 users post-S89, flag em-main only). Detail + per-attack file:line → [project_s92_admin_only_modules_revoke.md](project_s92_admin_only_modules_revoke.md). @@ -94,5 +91,6 @@ Adversarial pre-commit reviewer SOLUTION_ERP. Read-only verify + live curl prod ## 🔄 Curate trigger - >~30KB → archive recent → L2 `archive/.md` (byte-exact append) + `_INDEX.md` substring pointer. Stale >3mo → remove. +- **S102 recovery (em-main, 2026-07-06):** H2 Fidelity-FLAG **cut-not-moved ×5** tại `f229b07` (S101 nén L1, digest claim "Detail → archive" nhưng verbatim chưa move — chỉ còn trong git) → recovered 5 entry (S97/S97-bis/S98×3, content-exact từ `git show 5ee32c0`) vào `archive/2026-07.md` MỚI + `_INDEX.md` +5 pointer (count=1 verified); 2 digest-pointer L1 re-point 2026-06→2026-07; dead-link `:72` `project_s100_h18_wf2_synthesis.md` (chưa từng tồn tại) reformat bỏ link; entry H19 Lane-A dời Role-baseline→Recent + note CONCERN-closed (BƯỚC 0.5b reader đã wire). **Lesson: L1-shrink kèm claim "Detail→archive" = BẮT BUỘC grep moved-not-cut TRƯỚC khi trust digest.** - **Last curate: 2026-06-20 S80 (em-main, archive-gate keep-floor-hit → manual)** (45.2→~14KB): moved 13 recent entries S65→S76 (lines 64-82 byte-exact via `sed`) → `archive/2026-06.md` (32.7→70KB, +13 entries) + `_INDEX.md` +13 substring pointers (all verified count=1). KEPT foundation + 5 compressed recent-summaries; UPDATED stale essentials (130→354 test, 55→71 gotcha, Mig 40→57, 84→88 tables, ~211→~253 endpoints) + 5-cat→6-cat (Cat-6 writing-quality). gist NOT updated (em-main distill later). - **Prev curate: 2026-06-18 S71** (36.7→24.2KB): moved 10 entries; KEPT foundation + newest cluster. **Prev S70** (42.5→24.8KB): built `_INDEX.md` + `.gist.md` gen:1. **Prev S40** (28.4→18KB). diff --git a/.claude/agent-memory/reviewer/archive/2026-07.md b/.claude/agent-memory/reviewer/archive/2026-07.md new file mode 100644 index 0000000..c502e94 --- /dev/null +++ b/.claude/agent-memory/reviewer/archive/2026-07.md @@ -0,0 +1,10 @@ +# Reviewer Agent — Archive 2026-07 (L2 verbatim, FROZEN additive-only) + +> **Recovered S102 (2026-07-06):** 5 entry verbatim (S97 · S97-bis · S98×3) bị **cut-not-moved** tại commit `f229b07` (S101 nén L1, digest claim "Detail → `archive/2026-06.md`" nhưng verbatim chưa từng được move — H2 harvest-curator Fidelity-FLAG S102). Trích **content-exact** từ `git show 5ee32c0:.claude/agent-memory/reviewer/MEMORY.md` (PS .NET per-line match, line-ending normalize LF, 0 ký tự mất). Thứ tự giữ nguyên như L1 gốc (newest-first: S98×3 → S97-bis → S97). +> Quy tắc file: NEVER rewrite existing bytes; entry mới APPEND cuối file. Map: `archive/_INDEX.md`. + +- **S98 (2026-07-02) FIDELITY GATE gist impl-frontend 2026-H1 (10 record → 6 cụm + 5 reflection) — PASS-với-sửa (1 minor):** 34/34 substring-pointer count==1 (grep -o -F đếm occurrence, gồm cặp bẫy "gotcha #50"≠"gotcha#50" resolve 2 record khác nhau đều hợp-cảnh). 3 interpretive-flag verify GROUND-TRUTH ngoài verbatim: double-rAF (code ListPage:270 comment "2 rAF để browser commit translate-x-full TRƯỚC" + duration-200) · 2 PageHeader song-song (4 file disk thật ×2 app) · wildcard `ev.*Note` theo-từng-mut (đúng 3 call-site 1770/1785/1841). FLAG cwd-misland hướng-chéo: session-log S76:40 CORROBORATE verbatim (cd fe-admin → rơi fe-user/.claude) + .gitignore L109-111 comment trung-tính → draft trung-tính ĐÚNG, không sửa hướng. Sửa duy nhất: R4 parenthetical nói chuỗi "nằm trong chính gist" — misleading, chuỗi resolve count==1 trong archive. Lesson: fidelity-gate 3 lớp = so-verbatim + pointer-arithmetic + ground-truth-code cho MỌI chỗ gist DIỄN GIẢI vượt verbatim; honest-empty BẤT-NGỜ="không" > bịa filler; verbatim TỰ mâu-thuẫn (S52-vs-S53) → gist flag discrepancy chứ KHÔNG resolve bịa (anti-S88-fabrication-by-merge, lần này draft làm đúng). +- **S98 (2026-07-02) VERIFY LANE V3 cicd-monitor L1-curate moved-not-cut — PASS (0 blocking, 3 minor):** sha256 line-level backup-L73/74 == archive-L7/8 (2398/1909B text) + byte-arithmetic đóng EXACT (removed 4309 raw − stubs 1451 = 2858 = size-delta 19917→17059) + diff duy-nhất `73,74c73,74` + CR/LF profile 86/86→86/86 không đổi + FROZEN archives 0-diff + _INDEX 78=2+39+20+6+7+3+1 pointer-resolve count==1. **Tool-lesson Windows byte-verify:** MSYS grep/sed/awk = TEXT-MODE strip `\r` (grep -c `\r` báo 0 trên file CRLF thuần!); od-token-pipeline đếm sai (641 vs 86 — token-split artifact); ground-truth = `.NET ReadAllBytes` / `wc -c` / `tr` pipe / `od -c` tail. Moved entries CRLF→LF normalize (encoding-only, 0 ký tự mất — Write tool ghi file mới LF uniform). Minor caught: MEMORY.md "Last curate" ledger vẫn S80 (S98 chưa ghi sổ, discoverable qua stub "(curate S98)"); archive-header chữ "byte-exact" đúng trừ CR-terminator. +- **S98 (2026-07-02) VERIFY LANE V1 re-tier mega-line STATUS/HANDOFF conservation (uncommitted) — PASS (0 mismatch):** blurb S94+S93 cắt khỏi mega-line = VERBATIM trong archive tier-S98 (STATUS IndexOf ordinal 9412/11090 · HANDOFF 6147/7775; HEAD cross-check cùng blurb, HANDOFF lệch +51 = đúng bundle-hash morning-edit TRƯỚC blurb). **Proof-of-no-other-deletion = arithmetic full-accounting** prefix+b94+sep(` · `,3)+b93+tail(125=old-pointer) == lineLen exact ×2 file — mạnh hơn spot-check. Old-pointer tái hiện trong pointer mới (archive-S98 + archive-S94 đều =1). Kỹ thuật-bẫy: commonPrefix lấn 1-char (`*` đầu `**Prev` trùng `*` mở italic pointer mới) → Replace-decompose trên removed-region FAIL giả; fix = IndexOf(blurb) trên FULL line. Line-count bằng (92/92, 12/12) → index-by-index diff enumerate đủ 6+2 dòng vào allowed-list. Flagged: archive `??` UNTRACKED — phải `git add` cùng commit kẻo pointer gãy. Read-tool truncate dòng >2K = KHÔNG verify được mega-line → PS ReadAllLines UTF8 + ordinal IndexOf là đường duy nhất. +- **S97-bis (2026-07-01) PE EndsBeforeCeo CONFIG→RUNTIME + Mig 60 backfill (bug anh Kiệt FDC, cross-stack+mig, live UAT) — PASS (0 issue):** field `EndedByLevelFinalize` set true DUY NHẤT nhánh level-finalize service:871 (grep-all confirm 5 nhánh DaDuyet: 671 drafter-auto / 873 finalize-SET / 911 ccm-delegation / 943 all-steps-CEO / 1049 V1-legacy — chỉ 873 set, 4 nhánh còn lại giữ false = đúng semantics). 4 projection nhất quán: detail ternary `phase==DaDuyet?field:true` (:1153) · List/Inbox `Phase==DaDuyet?field:config-subquery` (:647/:767) · ListApproved direct field (filter DaDuyet :176). **Migration 3-file OK** (Designer+Snapshot có bit-NOT-NULL-default-false); backfill marker `LIKE N'%Duyệt KẾT THÚC tại%'` KHỚP-EXACT service comment:883 (system prefix, user-comment nối SAU) + table `PurchaseEvaluationApprovals` verified (config:148+DbSet) + `Phase=7`=DaDuyet verified enum. ccm-delegation comment `[CCM duyệt done miễn CEO]` KHÔNG match backfill → false nhất-quán runtime. **EF-translate ternary List/Inbox CONFIRMED runtime** (không giả định): `PeDraftVisibilityTests` gọi ListPurchaseEvaluationsQuery full-projection nằm trong 395 Infra PASS. FE 2-app SHA256-IDENTICAL `b7abbc2f`, gate `finalizeFlowStep=endsBeforeCeo?find:null` + banner:278 + type `endsBeforeCeo:boolean` có sẵn 2 DTO. **Build slnx 0w/0e + 440 test (45D+395I) 0-fail + tsc×2 exit-0** (self-verified, không tin claim). Test repro `peFinButWentCeo` (cùng-config finalize + field=false → EndsBeforeCeo=FALSE) = contrast quyết-định runtime-vs-config, xuất sắc. **Anti-pattern-none:** 11-file đúng-scope 0-drift, extend-in-place test NET+0-method giữ 440. Lesson: backfill LIKE-2-wildcard trên chuỗi VN-đặc-thù = false-positive risk MINOR-lý-thuyết (chỉ phiếu DaDuyet-hiện-tại 1-lần, UAT ít-phiếu) KHÔNG đủ FAIL. Config→runtime split đúng: chỉ THÊM chính-xác cho DaDuyet, non-DaDuyet giữ heads-up config như trước = không regression. **Re-affirmed @S97 Part-5 session-review lane** (spawn fail-return-schema → verdict recovered từ chính entry này per #53-recover-from-diary; em-main grep bổ-sung: 0 wrong-table pattern nào khác ngoài Mig 60 — đã fix Mig 61). *(addendum on-behalf H2-proposed @S98)* +- **S97 (2026-07-01) PE finalize UAT ×2 app: reword badge + đảo default checkbox opt-out→opt-in (uncommitted, prod-live anh Kiệt FDC) — PASS (0 issue):** 4 hunk/file × 2 = 8 total, 12ins/12del, no thừa. E1 `useState(true→false)` L57 · E2 reset `setApplyLevelFinalize(false)` L221 · E3 helper-text reword (strings KHỚP spec verbatim) · E4 badge `không trình tới`→`Kết thúc tại {finalizeLevelName ?? finalizeStepName ?? 'cấp trên'}` + template-literal title. **SHA256 full-file IDENTICAL** `bcf812fd…` ×2 + git-diff --no-index exit-0. **Comment L121 `không trình tới` INTACT** (bare-string 2-site: comment giữ + JSX đổi) + **`e.target.checked` handler L664 INTACT** (spec correctly NOT flip). Logic-non-break VERIFIED: default-false → eligible-untick → `sendPrice`(L171)=false + `shouldPickPrice`(L496)=false → price-picker KHÔNG bắt (spec pt6 ✓); payload L200 `(approverFinalizeEligible ? applyLevelFinalize : true)` = pre-existing S96 opt-out no-op cho non-eligible, unaffected by flip. Type `finalizeStepName/LevelName: string|null` (purchaseEvaluation.ts:149-150) → `??`-chain TS-safe. 0 BE/test/mig leak. Build fresh ~17:55 ×2 (fe-user hash `DxUomy4C` KHỚP impl-claim; fe-admin rotate `DkyQ0xCd`→disk `l_kwCZIF` = #69 normal). Anti-pattern-none: precedent-backed cosmetic+default-flip, byte-mirror tight. diff --git a/.claude/agent-memory/reviewer/archive/_INDEX.md b/.claude/agent-memory/reviewer/archive/_INDEX.md index 113cefd..78836c5 100644 --- a/.claude/agent-memory/reviewer/archive/_INDEX.md +++ b/.claude/agent-memory/reviewer/archive/_INDEX.md @@ -54,3 +54,10 @@ 2026-06-18 · adap review R1 · S71 Harness-10 run-trace frozen-evidence-clean + containment-4file-sync + gitignore-exit-trap · substring:"S71 Harness-10 adap run-trace convention — Stage-3 REVIEW" → `2026-06.md` 2026-06-19 · adversarial spawn · S76 Part1 PE budget MA-TRẬN 3 cột Mig 56; MAJOR race cross-field-echo-worsened; fullIsEstimate-improve · substring:"S76 Part1 PE budget MA-TRẬN 3 cột Mig 56" → `2026-06.md` 2026-06-19 · adversarial spawn (Lens-2) · S76 Part2+3 PE budget-edit BADGE display-only; role-set-mirrors-gate; spec-vs-diff-mismatch · substring:"S76 Part2+3 PE budget-edit BADGE" → `2026-06.md` + + +2026-07-01 · adversarial spawn (prod-live UAT anh Kiệt FDC) · S97 PE finalize reword badge + đảo default checkbox opt-out→opt-in; SHA256 ×2 IDENTICAL; comment L121 + handler L664 INTACT · substring:"S97 (2026-07-01) PE finalize UAT" → `2026-07.md` +2026-07-01 · adversarial spawn (cross-stack+mig) · S97-bis EndsBeforeCeo CONFIG→RUNTIME Mig 60 backfill; runtime-flag set 1/5 nhánh DaDuyet; 4-projection nhất-quán; EF-ternary confirmed-runtime · substring:"S97-bis (2026-07-01) PE EndsBeforeCeo" → `2026-07.md` +2026-07-02 · fidelity-gate lane · S98 gist impl-frontend 2026-H1 PASS-với-sửa; 34/34 pointer count==1; 3 interpretive-flag ground-truth-verify · substring:"S98 (2026-07-02) FIDELITY GATE gist impl-frontend" → `2026-07.md` +2026-07-02 · verify lane V3 · S98 cicd-monitor L1-curate moved-not-cut; sha256 line-level + byte-arithmetic EXACT; MSYS text-mode strip-CR trap · substring:"S98 (2026-07-02) VERIFY LANE V3 cicd-monitor" → `2026-07.md` +2026-07-02 · verify lane V1 · S98 re-tier mega-line conservation; arithmetic full-accounting; commonPrefix 1-char trap; untracked-archive git-add flag · substring:"S98 (2026-07-02) VERIFY LANE V1 re-tier mega-line" → `2026-07.md` diff --git a/.claude/agent-memory/tooling-auditor/MEMORY.md b/.claude/agent-memory/tooling-auditor/MEMORY.md index 8a0deef..2a725e8 100644 --- a/.claude/agent-memory/tooling-auditor/MEMORY.md +++ b/.claude/agent-memory/tooling-auditor/MEMORY.md @@ -42,3 +42,4 @@ H1 tooling-freshness auditor **SOLUTION_ERP-self**. Read-only + **propose-only** - **2026-07-02 (S100 @start RE-REPORT — ALL-4 PASS, F1/F3 fix-verified, F2 carry):** HEAD `525a01a`, tree CLEAN (cicd-MEMORY dirty S99 đã commit trong `c112be9`). ①SKILL PASS: 6+23+14 identical; last-touch skills/ = `4263d63` S98 (0 đổi từ S99-verify); ef-core `:3` B1+Mig61 khớp disk-61, skills/README:20 fresh. ②ROSTER PASS 11=11=11 (README:1 "11-agent" = STATUS:24), 11/11 inherit, last-touch agents/ = S98. ③PLUGIN PASS 18/15/3 (settings:17-35) + marketplace 35 + xhigh:37 + `claude-fable-5[1m]`:11 — identical, 0 new-alloc. ④DOCS PASS: **F1 FIXED-verified** (STATUS:6 flip-note "hồi-tố @S99-start" + In-Progress:34 "(S99)" row-stale-gỡ, chỉ còn :38 PE-phân-quyền pending; HANDOFF:5 khớp) · **F3 FIXED-verified** (session-start:44 B1-pointer, grep 0 "(68)") · **F2 OPEN-tracked** (session-start `:8`/`:62` SendMessage-note còn — HANDOFF:5 NEXT-em carry chờ runtime-verify, KHÔNG new-drift). Counts khớp disk: Mig 61 · gotcha 79 (grep `^### [0-9]`) · 89 bảng · test 440 (canonical-consistent). NOTE-minor: S99 không blurb riêng (docs-micro-session, documented inline flip-note + commit-title) — acceptable, S100-closeout tự quyết. Carry-debt: schema-diagram §16+ ERD · monthly count-grep +commands/*.md. Method: session KHÔNG-đổi-tooling → `git log -- .claude/skills/` last-touch = shortcut verify mạnh hơn re-read từng file. Tag `[s100-start, 4-mat, all-pass, f1-f3-verified, f2-carry]`. - **2026-07-03 (S101 @start RE-REPORT — ALL-4 PASS + MODEL-DRIFT, on-behalf em-main APPEND B3):** HEAD `5ee32c0`, tree 1-dirty (cicd MEMORY M #486 pre-existing). ①SKILL PASS 6+23+14 (2 detector-flag ef-core/contract-workflow = FP module-local, numbers MATCH canonical). ②ROSTER PASS 11=11=11, 11/11 inherit, ASCII-diagram cosmetic-drift known-debt. ③PLUGIN PASS 18/15/3 + marketplace 35 + xhigh + `claude-fable-5[1m]`:11 identical, 0 new-alloc. ④DOCS PASS (S100 closeout clean; F2 SendMessage + F3 count both fixed-verified). 🔴 **MODEL-DRIFT (inherit-chain data-point #4 = DIVERGENT):** this spawn + lead + WF2-reviewer all self-report **`claude-opus-4-8`** (NOT `claude-fable-5` S98/S99) while `settings.json:11` still pins `claude-fable-5[1m]` → **Fable unavailable S101 → H5-fallback tự-kích** (revert-free, no frontmatter change). "Fable RESTORED S98" = point-in-time NOT steady-state → em-main reconciled STATUS:24 + agents/README:3 with S101-runtime caveat. Lesson: **inherit-chain self-report = runtime availability probe — verify each session, don't trust last-session model claim.** Tag `[s101-start, 4-mat, all-pass, model-drift-opus, h5-fallback-reactivated]`. - **2026-07-03 (S101 @closeout CHỐT — on-behalf em-main APPEND B3):** HEAD `e350660`, tree CLEAN, 2 commit S101 pushed (`f229b07` H18-closeout + `e350660` H19-adopt). ①SKILL/COMMAND **DELTA: command 14→16** (+`fable-real.md`+`fable-clone.md` H19 thật/ảo-toggle — verified `ls|wc`=16; 🔴 **là COMMAND KHÔNG phải skill** — SlashCommand-tier ≠ `skills//SKILL.md` Skill-tier, đừng conflate "auto-registered skill"; skill vẫn **6+23**) + session-start BƯỚC 0.5b + send-email 6c present. **KHÔNG command-catalog canonical** trong docs → 2 fable-* KHÔNG tạo catalog-drift, KHÔNG cần doc-register. ②ROSTER 11=11=11 (H19 0 agent mới, dùng reviewer+investigator-cb sẵn), 11/11 inherit. ③PLUGIN 18/15/3 identical + xhigh + pin-fable giữ (revert-free dù runtime-Opus), 0 new-alloc. ④DOCS PASS: H19 đầy-đủ path:line-verified (engine §K:315-334 + ACTIVE-MARKS:19 RC-verbatim + STATUS:6/:24/:40 + HANDOFF + session-log + 4 adap-report). 🔴 **model self-report `claude-opus-4-8` = inherit-chain data-point #5 DIVERGENT-confirmed** (Fable vẫn unavailable). **new-alloc: NOTHING-TO-ALLOCATE.** **Flags:** F-H19a LOW (agents/README+reviewer+investigator-cb 0 H19-note → **DEFER** vacuously-inert + no-catalog + single-sourced §K; note khi Fable-về + toggle-first-run có runtime-delta) · F-H19b VERY-LOW (session-start BƯỚC-0.6 Fable-steady → em-main FIXED S101 +Opus-caveat). Baseline command-count 14→**16** (self-fix note). Tag `[s101-closeout, 4-mat-chot, command-14-16, model-drift-5, f-h19a-defer, on-behalf]`. +- **2026-07-06 (S102 @start RE-REPORT — ALL-4 PASS + FABLE VỀ LẠI, inherit-chain data-point #6):** HEAD `3e2c18b` (=S101 closeout), tree CLEAN, 0 commit sau S101 → disk S102-pre == S101-end. **Model: spawn này self-report `claude-fable-5`** = Fable RESTORE lần 2 (chuỗi S98 Fable → S101 Opus → S102 Fable — availability per-session, đúng lesson S101). ①SKILL PASS 6+23; ef-core `:3`/`:19` B1-pointer + Mig 61 khớp disk-61 (`ls` Migrations = 61). ②ROSTER PASS 11 file = 11 kỳ-vọng, 11/11 `model: inherit` line-5; S101-window: harvest-curator.md + agents/README.md M-only, 0 agent THÊM/XÓA. ③PLUGIN PASS 18/15/3 (settings:17-35) + marketplace 35 + xhigh:37 + `claude-fable-5[1m]`:11 identical, 0 new-alloc. ④DOCS PASS: (a) BƯỚC 0.5b hiện diện session-start:27-33; (b) fable-real/clone semantics inverse ĐÚNG (real=tạo marker :10 / clone=xóa :8), registry loaded = restart đã xảy ra; (c) **model-note S101-Opus cần S102-reconcile 3 vị-trí: STATUS:24 · agents/README:3 · session-start:37 (BƯỚC 0.6)** — đề xuất APPEND data-point giữ S101 làm history; (d) marker KHÔNG tồn tại + gitignore:92 + not-tracked. **Trigger-met: BƯỚC 0.5b:33 "nhắc anh khi Fable về + phân-tầng"** → em-main nhắc anh H19 tiering. Command 16 (brief "~20" = overestimate; 16 = đúng đủ, hmw ≠ command-file). Counts khớp: Mig 61 · gotcha 79 (grep) · test 440 · 89 bảng. F-H19a defer-condition "khi Fable-về" cũng MET → em-main cân nhắc note. Tag `[s102-start, 4-mat, all-pass, fable-restore-2nd, model-note-reconcile-3]`. diff --git a/.claude/agents/README.md b/.claude/agents/README.md index f48c2c5..78cab8c 100644 --- a/.claude/agents/README.md +++ b/.claude/agents/README.md @@ -1,6 +1,6 @@ # Multi-agent SOLUTION_ERP — Master Coordination Guide (11-agent) -> **Architecture:** 11 sub-agents **all-inherit top-tier (Harness-8 2026-06-16 — thay thế two-tier Harness-4)** + em main **Fable 5 (1M) Max** coordinator — **9 product/quality** (7 core + frontend-designer pink S47 + database-agent read-advisory S52) + **2 monitor INFORM-only** (`tooling-auditor` H1 + `harvest-curator` H2, 2026-06-07 Harness 1). Tier: **toàn bộ 11 sub `model: inherit`** (ăn top-tier model của lead — ✅ **Fable 5 1M RESTORED, runtime-verified S98 2026-07-02**: 2 monitor spawn-test self-report `claude-fable-5`; giai đoạn fallback Opus H5 S62→S97 kết thúc; ⚠️ **S101 2026-07-03 runtime = Opus lại** — lead + 2 monitor + WF2-reviewer inherit self-report `claude-opus-4-8`, settings pin fable → Fable unavailable phiên này, H5-fallback revert-free [chi-tiết STATUS §Sub-agents]) · effort **Max** (env machine-wide). SE KHÔNG có lớp helper/gopher rẻ (cả 11 đều substantive memory-bearing → cả 11 lên inherit). *(Trước H8: 4 promote inherit + 7 demote pin `claude-opus-4-8` — lịch sử ở Upgrade 2026-06-10 + S66 dưới.)* +> **Architecture:** 11 sub-agents **all-inherit top-tier (Harness-8 2026-06-16 — thay thế two-tier Harness-4)** + em main **Fable 5 (1M) Max** coordinator — **9 product/quality** (7 core + frontend-designer pink S47 + database-agent read-advisory S52) + **2 monitor INFORM-only** (`tooling-auditor` H1 + `harvest-curator` H2, 2026-06-07 Harness 1). Tier: **toàn bộ 11 sub `model: inherit`** (ăn top-tier model của lead — ✅ **Fable 5 1M RESTORED, runtime-verified S98 2026-07-02**: 2 monitor spawn-test self-report `claude-fable-5`; giai đoạn fallback Opus H5 S62→S97 kết thúc; ⚠️ **S101 2026-07-03 runtime = Opus lại** — lead + 2 monitor + WF2-reviewer inherit self-report `claude-opus-4-8`, settings pin fable → Fable unavailable phiên này, H5-fallback revert-free [chi-tiết STATUS §Sub-agents]; ✅ **S102 2026-07-06 runtime = Fable trở lại** — self-report `claude-fable-5` ×3 [lead + 2 monitor], per-session availability) · effort **Max** (env machine-wide). SE KHÔNG có lớp helper/gopher rẻ (cả 11 đều substantive memory-bearing → cả 11 lên inherit). *(Trước H8: 4 promote inherit + 7 demote pin `claude-opus-4-8` — lịch sử ở Upgrade 2026-06-10 + S66 dưới.)* > **Upgrade S52 (2026-06-08 — AI_INFRA broadcast `2026-06-08-Agent-database-codebase-agents`):** **+database-agent (read-advisory DB specialist, floor DB1–DB11)** — schema/query/migration-design-review/perf/concurrency (DB11 RowVersion vá lost-update S43). Tailor READ-tier (implementer-backend vẫn author) · color OMIT (8 standard hết) · `store_memory` strip. `codebase-agent` = **SKIP n-a** (investigator-codebase đã cover grep/audit + `csharp-lsp` Windows no-op). ✅ **verified-runtime** — spawned OK S53 (first real spawn, caught Mig 46 committed-but-unapplied-local drift) + S56 2× (pre-golive-verify schema-stream + golive-harden design+review). DB11 lost-update fix landed S56 (atomic ExecuteUpdate + Serializable tx, gotcha #58). > Pattern: Anthropic Building Effective Agents orchestrator-workers + Cognition "writes single-threaded" hybrid + post-deploy automated watchdog. > **Upgrade S39 (2026-05-29):** 4→7 agent (split investigator + implementer, +test-specialist) + budget +50% + 5 RAG MCP per agent. Reference BVAAU 7-agent config (adapted, NOT copied — SOLUTION_ERP 2-FE-app fit + 6 skill proven battle-test 38 session). Prior: S20t12 initial 3 + S21t1 +cicd-monitor. diff --git a/.claude/commands/session-start.md b/.claude/commands/session-start.md index 2a16f37..1626846 100644 --- a/.claude/commands/session-start.md +++ b/.claude/commands/session-start.md @@ -34,7 +34,7 @@ Em main đọc `.claude/fable-real-mode.on` → **BÁO ngay** (mode phán-quyế ## 📋 BƯỚC 0.6 — Model-availability check (H5 — adopt S63) -Em main xác nhận **lead model resolve được** đầu session. Lead SE = **Fable 5 (1M) Max** (per H4). **DOWN** = lỗi `"Model isn't available — claude-fable-5[1m]"` → fallback **`/model claude-opus-4-8[1m]`** (Opus 4.8 · 1M · Max — top-tier, KHÔNG hạ §A1; **KHÔNG sửa frontmatter agent** — promote `inherit` tự theo lead → two-tier tạm collapse single-tier Opus, **revert-FREE** khi Fable về). Phản xạ THỦ-CÔNG (không hook tự-switch). ✅ **Fable RESTORED 2026-07-02 (S98)** — lead chạy `claude-fable-5[1m]` (settings.json:11) + spawn-test inherit ×2 monitor self-report `claude-fable-5` → H5.6 hoàn tất, caveat suspended-2026-06-12 (fallback Opus S62→S97) đã gỡ. Nếu DOWN lại → fallback theo quy trình trên. ⚠️ **S101 (2026-07-03): runtime = Opus LẠI** (Fable unavailable — lead + 3 spawn inherit-chain self-report `claude-opus-4-8`) → H5-fallback tự-kích, revert-free; "RESTORED S98" = point-in-time KHÔNG steady-state (chi-tiết STATUS §Sub-agents). +Em main xác nhận **lead model resolve được** đầu session. Lead SE = **Fable 5 (1M) Max** (per H4). **DOWN** = lỗi `"Model isn't available — claude-fable-5[1m]"` → fallback **`/model claude-opus-4-8[1m]`** (Opus 4.8 · 1M · Max — top-tier, KHÔNG hạ §A1; **KHÔNG sửa frontmatter agent** — promote `inherit` tự theo lead → two-tier tạm collapse single-tier Opus, **revert-FREE** khi Fable về). Phản xạ THỦ-CÔNG (không hook tự-switch). ✅ **Fable RESTORED 2026-07-02 (S98)** — lead chạy `claude-fable-5[1m]` (settings.json:11) + spawn-test inherit ×2 monitor self-report `claude-fable-5` → H5.6 hoàn tất, caveat suspended-2026-06-12 (fallback Opus S62→S97) đã gỡ. Nếu DOWN lại → fallback theo quy trình trên. ⚠️ **S101 (2026-07-03): runtime = Opus LẠI** (Fable unavailable — lead + 3 spawn inherit-chain self-report `claude-opus-4-8`) → H5-fallback tự-kích, revert-free; "RESTORED S98" = point-in-time KHÔNG steady-state (chi-tiết STATUS §Sub-agents). ✅ **S102 (2026-07-06): Fable resolve lại bình thường** (lead + 2 monitor self-report `claude-fable-5`) → fallback-S101 đóng; giữ phản xạ probe mỗi phiên (availability = per-session, không tin note phiên trước). ## Phase 1 — READ (load context) diff --git a/docs/STATUS.md b/docs/STATUS.md index 51a0b30..e726ce9 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -21,7 +21,7 @@ | Gotchas | **79** | +1 S97 (**#79** backfill soi NHẦM bảng — transition-marker "[Duyệt KẾT THÚC]" nằm ở `PurchaseEvaluationChangelogs.ContextNote` KHÔNG phải `PurchaseEvaluationApprovals` → Mig 60 backfill match 0, phiếu finalize-CCM giữ flag=0 hiện sai "Đã được CEO duyệt"; fix Mig 61 query đúng bảng. PE 2 bảng lịch-sử tách vai [Approvals=ai-duyệt record :745 · Changelogs=chuyển-phase+marker LogTransition :1073]; verify marker-count prod trước khi tin backfill). +1 S97 (**#78** display-flag suy CONFIG thay RUNTIME → nói dối khi instance lệch config: `endsBeforeCeo` từ "workflow CÓ cấp finalize" thay "phiếu NÀY finalize" → phiếu lên CEO báo sai "không qua CEO"; nặng sau S97 default-flip opt-in; fix field runtime `EndedByLevelFinalize` Mig 60. Flag = "instance ĐÃ làm-gì" KHÔNG "config CÓ THỂ"). +1 S96 (**#77** SPA deploy bundle cache-lag: team thấy UI CŨ dù đã deploy + Ctrl+F5 — index.html no-cache ĐÚNG-chuẩn + JS hash-immutable nhưng browser giữ tab-SPA-mở/cache-local → verify bundle prod **BYTE-LEVEL** (curl + grep string-fix trong `/assets/index-.js`) phân-biệt cache-vs-deploy; **incognito = golden-test**; no-service-worker nên clear-site-data đủ). +2 S91 (**#76** deploy render config từ `.example` KHÔNG phải file-gitignored → prod thiếu setting tới khi điền tay · **#75** seed ungated per-code RESURRECT data đã-wipe mỗi restart → gate sau env-flag `DemoSeed:Disabled` + verify-by-restart-thật). +1 S90 (**#74** Chrome-MCP screenshot kẹt SPA-SignalR `document_idle` → PowerShell `CopyFromScreen` + Win32 lọc-process-`chrome.exe`). +2 S85 (**#72** lệch giờ +7h — DateTime lưu UTC nhưng serialize thiếu 'Z' → FE `new Date()`=local → `UtcDateTimeJsonConverter` global ép UTC-with-Z · **#73** UpdateDraft absolute-set CLEAR field SÓT khỏi pattern null-safe = bug-class S42 → guard `if (request.X is not null)`). +1 S78 **#71** (thêm enum value vào entity DÙNG-CHUNG → pollute UI/guard phân-loại theo PROXY-predicate `supplierId===null` thay vì enum tường minh; file-khi-duyệt purpose=5 lẫn "Bảng so sánh" + false-pass submit-guard → grep mọi field-proxy predicate loại value mới + build-verify TỪNG app; em-main grep no-leak bắt trước deploy). +1 S76 **#70** (FE absolute-set echo field anh-em từ server-snapshot + `invalidate()` fire-and-forget → cửa-sổ stale-echo mất-dữ-liệu khi lưu 2 ô liên-tiếp; guard `useIsFetching` gate nút Lưu tới khi refetch land; reviewer workflow bắt, impl self-review sót). +1 S72 **#69** FE bundle-hash non-deterministic + `deploy.yml` rebuild-FE-unconditional → bundle rotate kể cả commit governance (SPA-fallback-200 trap; cicd Run #312). +2 S69: **#67** Tailwind v4 accent palette thiếu stop (teal/violet/amberx/greenx chỉ 50/100/500/600/700; dùng -300 → teal/violet rơi DEFAULT Tailwind sai-hệ, amberx/greenx drop hẳn — build PASS, phải soi dist CSS) · **#68** IDE TS diagnostic giữa background-agent/workflow = snapshot dở-dang (TS server bắn mỗi save), chỉ tin build SẠCH sau-cùng (2× session này: re-skin + PE-FE đều false-alarm). Prev +1 S68 **#66** Tailwind v4 rule element thô `h1-h4{color:#0b1220}` viết NGOÀI `@layer` thắng utility `text-white` → heading render đen; fix ĐIỂM `text-white!` (important, grep dist confirm), KHÔNG move `@layer` (load-bearing ~30+ heading toàn app). Prev +1 S65 **#65** build csproj con (vd `SolutionErp.Api.csproj`) ≠ `dotnet build SolutionErp.slnx` (gồm tests) → miss test-compile khi đổi chữ ký record command (CreateDepartmentCommand +ParentId) → CI CS7036 FAIL-gated Run #291 (deploy chặn, prod nguyên — test-gate làm đúng việc). Fix: build full slnx trước push BE signature-change. Prev +2 S61: **#63** EF scaffold tự sinh `RenameColumn` SAI-semantics khi drop+add cùng type (test xanh không bắt — SQLite EnsureCreated không replay migration) · **#64** `dotnet ef database update` áp Design-DB 0-rows ≠ Dev-DB → data-migrate `Sql()` chạy thật lần đầu trên prod. Prev +2 S59 (#61 sqlcmd `-f 65001` · #62 rename natural-key UPDATE trước deploy) | | User memory | **31** | +S84 `feedback_derived_flush_execution` (derived→canonical flush = em-main execution KHÔNG gate user-confirm; monitor INFORM-only ≠ cần-anh-duyệt; chỉ ĐỔI-con-số/policy = quyền anh). +S79 `feedback_canonical_spec_over_broadcast` (adap pull canonical-command/§P đừng phỏng-theo broadcast + report-before-stamp dogfood + residual own-diary OK). +S75 `feedback_harness11_engine` (engine governance tự-bảo-trì + gotcha #30-via-Edit + multi-workflow-verify + git-add-specific lesson). re-ground S71 (H1 disk-count: 25 `feedback_*` + 3 `project_*`; STATUS "21" stale từ S64). +S71 `feedback_harness10_run_trace` (run-trace + 3 lesson). Prev +1 S64 `feedback_harness7_outward_writing_quality`; re-grounded S54 base 19 | | Skills | 6 | 3 domain + 3 ops | -| Sub-agents | **11** | **all-inherit top-tier (Harness-8 S66 06-16 — thay thế two-tier H4):** em main Fable 5 (1M) Max (✅ **Fable RESTORED S98 2026-07-02** — lead self-report `claude-fable-5` + settings `claude-fable-5[1m]`; fallback-Opus H5 S62→S97 kết thúc, H5.6 hoàn tất) ⚠️ **S101 2026-07-03: runtime lead = Opus 4.8** (lead + 2 monitor + WF2 reviewer inherit đều self-report `claude-opus-4-8`; settings vẫn pin `claude-fable-5[1m]` → **Fable unavailable phiên này → H5-fallback tự-kích, revert-free, KHÔNG sửa frontmatter**; "Fable RESTORED S98" = point-in-time KHÔNG phải steady-state — inherit-chain resolve theo availability runtime) · **cả 11 sub `model: inherit`** (7 demoted `claude-opus-4-8` flip S66; SE không có helper/gopher rẻ → cả 11 lên top-tier) · effort Max. 9 product/quality + 2 monitor INFORM-only. Nấc H8 = **runtime-verified S98 (2026-07-02)** — spawn-test inherit-chain ×2 monitor self-report `claude-fable-5` (cả đội tự lên Fable khi lead restore, 0 sửa frontmatter — đúng thiết kế all-inherit). Prev two-tier H4 runtime-verified S57bis (spawn-test 2 chiều). | +| Sub-agents | **11** | **all-inherit top-tier (Harness-8 S66 06-16 — thay thế two-tier H4):** em main Fable 5 (1M) Max (✅ **Fable RESTORED S98 2026-07-02** — lead self-report `claude-fable-5` + settings `claude-fable-5[1m]`; fallback-Opus H5 S62→S97 kết thúc, H5.6 hoàn tất) ⚠️ **S101 2026-07-03: runtime lead = Opus 4.8** (lead + 2 monitor + WF2 reviewer inherit đều self-report `claude-opus-4-8`; settings vẫn pin `claude-fable-5[1m]` → **Fable unavailable phiên này → H5-fallback tự-kích, revert-free, KHÔNG sửa frontmatter**; "Fable RESTORED S98" = point-in-time KHÔNG phải steady-state — inherit-chain resolve theo availability runtime; ✅ **S102 2026-07-06: Fable VỀ LẠI runtime** — lead + 2 monitor inherit self-report `claude-fable-5` → H5-fallback S101 kết thúc, pattern availability per-session xác nhận [S98 Fable → S101 Opus → S102 Fable], BƯỚC 0.6 probe mỗi phiên) · **cả 11 sub `model: inherit`** (7 demoted `claude-opus-4-8` flip S66; SE không có helper/gopher rẻ → cả 11 lên top-tier) · effort Max. 9 product/quality + 2 monitor INFORM-only. Nấc H8 = **runtime-verified S98 (2026-07-02)** — spawn-test inherit-chain ×2 monitor self-report `claude-fable-5` (cả đội tự lên Fable khi lead restore, 0 sửa frontmatter — đúng thiết kế all-inherit). Prev two-tier H4 runtime-verified S57bis (spawn-test 2 chiều). | | RAG chunks | **2429** | re-verify S80 (`list_projects` — alive, +6 vs S63's 2423). Stale `last_indexed 05-29` (S42-S62 via store_memory stopgap; full re-index = AI_INFRA op cần VOYAGE_API_KEY). | **Bundle hash live (prod):** admin **`mEGqlNWc`** · user **`Dnrp4PU1`** (S97 — **Run #484** `fb2dfa9` Mig 61 data-fix backfill; bundle rebuild **#69-benign** [0 FE-src change, review-workflow cicd re-snapshot LIVE → `CeTA7Z82`/`CGaAyXen` #483 đã bị #484 rebuild rotate]; backfill A/005/A/008 flag 0→1 prod-verified). **Prev #483** — admin **`CeTA7Z82`** · user **`CGaAyXen`** (S97 — **Run #483** `9e12e80` badge "✅ Đã được CEO duyệt" phiếu đi-hết-lên-CEO [PeFinalizeChip single-source + 6 call-site 2-app, đối xứng chip "⚑ Kết thúc·X"]; FE-only tận-dụng endsBeforeCeo runtime, no BE/mig; JS rotate CSS-frozen #69; byte-#77 "Đã được CEO duyệt" PRESENT cả 2 app + prev-badge additive no-regression; Mig 60 frozen; smoke 200×3 + PE-list 200). **Prev #482** — admin **`DR9q2VUy`** · user **`Bgz8u4E5`** (S97 — **Run #482** `8037fa0` endsBeforeCeo config→RUNTIME [Mig 60 `EndedByLevelFinalize`]: **Mig 60 applied prod** (history-top + col-default-0 EXISTS + backfill=0 UAT-no-marker + sys.tables **89** pre==post); **EF-ternary SQL-Server LIVE-confirmed** GET /purchase-evaluations 200 items=9 + PE-detail `31faef0d` 200 **endsBeforeCeo=False phase=7** = runtime-path chạy = **bug fixed LIVE** (NOT 500); JS rotate 2-app PeWorkflowPanel gate-diff, CSS frozen #69-REFINE; byte-#77 `endsBeforeCeo` PRESENT in-bundle; smoke 200×3. reviewer PASS 0-issue + test 440. **Prev #481** — admin **`Cf0o8dx8`** · user **`x8rppRAK`** (S97 — **Run #481** `1c8fb6a` PE finalize 2-fix [badge "không trình tới"→"Kết thúc tại {cấp}" + đảo default checkbox opt-in]; JS rotate real-FE 2-app `PeWorkflowPanel` diff, CSS frozen `Bbtesa6B`/`BmuPz_Dy` #69-REFINE logic-only; **byte-level #77** NEW `Kết thúc tại`+helper PRESENT / OLD `không trình tới`+`Đã BỎ tick` ABSENT; real-size 1.64/1.54MB; Mig 59/88-table frozen; smoke 200×3. FE-only mirror SHA `bcf812fd`, 0 BE/mig/test). **Prev S96** — admin **`COYAX-yQ`** · user **`0MU-kb4N`** (S96 — **Run #480** `0c2f9f6` price-lock; chuỗi 3 PE deploy #478 `e657faa` checkbox-opt-out → #479 `36cbf8b` chuông-stale-clear (BE-only) → #480 `0c2f9f6` khóa-giá-sau-duyệt, cicd PASS each ~5m; **FE JS rotate THẬT** (PeWorkflowPanel #478 + PeDetailTabs #480, 2-app) real-size 1.64/1.54MB vs 919b SPA-trap, CSS frozen #69-REFINE; Mig 59 frozen 0-mig; +Run #477 `ba4b8e0` NCC seed no-mig prod 21 NCC. **Verify byte-level:** prod `0MU-kb4N` CHỨA checkbox-fix ("BỎ tick"/"Đã BỎ tick") + "✅-static" cũ MẤT → checkbox "ko-được" = browser-cache KHÔNG deploy-fail). **Prev S95** — admin **`0T6vVJST`** · user **`BGXEVZO6`** (S95 — **Run #476** `18a17f5` H17 governance-only deploy; bundle rotate benign #69 CSS-frozen, prod 200×3, Mig 59 unchanged; cicd re-snapshot LIVE — pre-deploy `CkZ1MjC1`/`_-gpX7_Y`, mega-line S93 `CDn40vpV`/`CoPmPBg7` đã bị deploy trung-gian rotate từ S94). **Prev S85** — admin **`aKuNip19`** · user **`BUsL0HeQ`** (S85 — **Run #341** `49ac086` lệch-giờ TZ serialize UTC-with-Z; FE frozen #339+#341 BE-only. Chuỗi ~10 deploy #334→#341 buổi UAT anh Kiệt CV PRO: #334 `5a61254` batch CV PRO 6-fix → #335-#338 6 vòng UAT → #339 `1263c0d` workflow-preserve bug-class S42 → #341 `49ac086` TZ; #342 `d4f6021` docs+cicd BE-frozen, bundle giữ-nguyên gotcha #69-REFINE). **Prev S78** — admin **`CsJetgZH`** · user **`BVS0ApIm`** (S78 — **Run #330** `7886fd0` PE attach-file khi duyệt; bundle ROTATE từ S77 `BqKD3Y23`/`Cn-i349D` dù NO migration enum-only — gotcha #69 non-determ rebuild; cicd ship-proof byte-stable + fake-hash control). **Prev S77** — admin **`BqKD3Y23`** · user **`Cn-i349D`** (S77 — **Run #329** `e823694` banner Trả-lại; cuối chuỗi 10 deploy #320→#329 cùng ngày, cicd PASS each: #320 pill `DsSg6RRz`-era → #321 focus → #322 revert → #323 Mig57+notes `CPm4LTqm`/`BWJUAqEI` → #324 số-âm-đỏ `C6fx-0ea`/`N3sW4Div` → #325 indent `BhnNMucS`/`B1VebpXc` → #326 cờ-gấp-asymmetric `DwXqn37C`/`COXMCv7E` → #327 decouple `B0gboSAg`/`DbDg7pM-` → #328 notify (BE-only, FE frozen) → #329 banner **`BqKD3Y23`**/**`Cn-i349D`**). **Prev S76** — admin **`jOqxW4-p`** · user **`DbsznVvR`** (S76 — **Run #319** `21d1f4e` bảng lưới `` ngân sách viền-ô; chuỗi S76 cùng ngày: #318 `e33481e` feature ma-trận-3-cột + badge quyền-NS `BhFDF9IJ`/`BAkuRl3C` → #319 **`jOqxW4-p`**/**`DbsznVvR`**, cicd PASS each, smoke 3×200, Mig 56 applied prod #318). **Prev S74** — admin **`BYF5vIMJ`** · user **`CB-tiRxd`** (S74 — **Run #315** `8655ebf` Mig 55 CcmNote, cicd PASS ~4m54s: Mig 55 applied prod CcmNote nvarchar(1000) nullable · sys.tables 88 · smoke 4×200 · 0 regression). **Prev S73** — admin **`Bv3jUCNo`** · user **`BWlMBQz6`** (Run #314 `6aa4dcb` FE empty-candidates guard fix; chuỗi 2 deploy: #313 `1d86abc` feature `OlNyG9OD`/`DSzSLVtL` → #314 **`Bv3jUCNo`**/**`BWlMBQz6`**, cicd PASS each). **Prev S72** — admin **`fc_xkNpJ`** · user **`DP-tBcg0`** (Run #312 governance commit `18fced6`; bundle ROTATE do **non-deterministic hash + deploy rebuild-FE-unconditional** (gotcha #69) — 0 FE source change, prod state/DB GIỮ NGUYÊN). **Prev S69** — admin **`BgNCjwsG`** · user **`CBvh0vtf`** (Run #308 PE cờ gấp + ngưỡng CCM; chuỗi 4 deploy session: #305 Văn phòng số foundation → #306 re-skin 10 page → #307 Office golive (BE-only) `Wt54PHYl`/`B99fMU6X` → #308 **`BgNCjwsG`**/**`CBvh0vtf`**). **Prev S68** — admin **`CNUv1jxY`** · user **`CpOskeS1`** (S68 — Run #304 `37752eb` fix tên đen→trắng; chuỗi #303 `6983609` `D532XZKG`/`CuFaBoWt` → #304 **`CNUv1jxY`**/**`CpOskeS1`**, cicd PASS each). **Prev S67** — admin `CcrZqfht`/user `DniDFUB_` (S67 — 6 deploy Run #297→#302; admin rotate chuỗi #298`xkSz9BfE`→#300`PxiZQkaw`→#301`I1fpLeYw`→#302**`CcrZqfht`** · user #297`BumgrwCJ`→#300`B36hGoKd`→#301`DrQYkzh0`→#302**`DniDFUB_`**; #299 tests BE-only cả 2 frozen, cicd PASS each). **Prev S65** — admin `BDwV5d0X`/user `DbVv6rsf` (Run #293-295). Prev S62 admin `0xKYGhhf`/user `C81ZdG9G` (Run #286). **Prev S59:** admin `B1DtNT9C` · user `D6uF3Mln` (Run **#282** `792c030` FINAL — bỏ nút Thêm hạng mục; ships kèm `80b64dd` gỡ Điều khoản TT, #281 cancelled-benign ancestor-verified). Chuỗi S59 cùng ngày: #280 `69997da` (`BKy_8OO9`/`XcZ6PRyA`, ships kèm `f21c55d` table-fixed #279-cancelled) · #278 `9c330d2` self-approve+quick-add-NCC (`BSh2fG2X`/`D22KfpPc`, authz probe 4/4) · #277 `faed59f` SearchableSelect (`ex7Tc92G`/`DzUeSk96`) · #276 `c869d26` rename 71 PMH (`BBA0KSWu`/`DzdTI18G`) · #275 `bbd1554` dọn demo WorkItems (FROZEN BE-only) · #274 `0eafcd3` tree 4 tầng (`DuU7OTym`/`DWyeTzf3`) · #273 `56882ac` wipe + tree v1 (`R9uGRxvw`/`DikfX1RD`). Prev S58: Run #386 `3ebaf84` admin `DMm9rtNA`/user `BUkOMn_Y` (chi tiết session log S58).