From 23bbe97f39d8975254451192a8788ee40dd5c617 Mon Sep 17 00:00:00 2001 From: pqhuy1987 Date: Wed, 15 Jul 2026 23:17:45 +0700 Subject: [PATCH] [CLAUDE] Docs: S124 adap-wave AI_INFRA + owner worker-tier-pin (14 agent opus+effort:max) + user-memory relocate R6 + H24 dogfood Co-Authored-By: Claude Opus 4.8 --- .claude/WAL.md | 22 +--- .claude/agent-memory/reviewer/MEMORY.md | 32 ++--- .claude/agents/README.md | 4 +- .claude/agents/cicd-monitor.md | 3 +- .claude/agents/database-agent.md | 5 +- .claude/agents/frontend-designer.md | 2 +- .claude/agents/harvest-curator.md | 3 +- .claude/agents/implementer-backend.md | 3 +- .claude/agents/implementer-frontend.md | 3 +- .claude/agents/investigator-api.md | 3 +- .claude/agents/investigator-codebase.md | 3 +- .claude/agents/lead-omission-auditor.md | 3 +- .claude/agents/lead-view-auditor.md | 3 +- .claude/agents/office-document.md | 5 +- .claude/agents/reviewer.md | 3 +- .claude/agents/test-specialist.md | 3 +- .claude/agents/tooling-auditor.md | 3 +- .claude/auto-memory/MEMORY.md | 58 +++++++++ .../feedback_7agent_split_upgrade.md | 70 +++++++++++ ...dback_agent_cwd_relative_memory_misland.md | 19 +++ .../feedback_agent_kill_recovery.md | 23 ++++ .../feedback_agent_return_garble_recover.md | 14 +++ .../feedback_aiinfra_adap_channel.md | 21 ++++ .../feedback_aiinfra_charter_v2.md | 24 ++++ .../feedback_background_spawn_visibility.md | 21 ++++ .../feedback_canonical_spec_over_broadcast.md | 18 +++ ...dback_cardinality_change_grep_consumers.md | 18 +++ .../feedback_citation_trap_selfreference.md | 20 +++ ...eedback_declarative_kind_config_pattern.md | 114 ++++++++++++++++++ .../feedback_derived_flush_execution.md | 14 +++ .../feedback_faultinjection_proves_teeth.md | 14 +++ ...feedback_goodhart_leave_measurement_set.md | 20 +++ .../feedback_h18_ghostwire_stamp_integrity.md | 18 +++ .../feedback_harness10_run_trace.md | 25 ++++ .../auto-memory/feedback_harness11_engine.md | 23 ++++ ...edback_harness7_outward_writing_quality.md | 14 +++ ...ack_harness9_l2_recovery_2workflow_adap.md | 24 ++++ .../feedback_harness_123_adoption.md | 17 +++ ...feedback_high_to_max_multiagent_quality.md | 27 +++++ ...dback_implementer_truncation_mitigation.md | 81 +++++++++++++ ...dback_meta_count_selfcoverage_blindspot.md | 22 ++++ ...back_monitor_residual_write_containment.md | 14 +++ .../feedback_monthly_drift_audit.md | 14 +++ ...i_entity_create_self_committing_codegen.md | 22 ++++ .../feedback_permission_grant_two_layers.md | 14 +++ .../feedback_phase10_namgroup_port.md | 72 +++++++++++ ...dback_prod_config_inspect_before_change.md | 26 ++++ .../feedback_prod_screenshot_to_docx.md | 21 ++++ .../feedback_rag_mcp_recovery_concurrency.md | 21 ++++ .../feedback_realdata_master_import.md | 18 +++ .../feedback_resume_premise_reverify.md | 19 +++ .../feedback_return_terminates_agent.md | 21 ++++ ...ck_review_presentation_and_stale_config.md | 18 +++ .../feedback_root_cause_over_symptom.md | 36 ++++++ ...eedback_session_end_memory_write_verify.md | 20 +++ ...edback_skeleton_first_aggressive_finish.md | 60 +++++++++ ...dback_stale_diagnostic_background_agent.md | 14 +++ .../feedback_status_handoff_tiering.md | 23 ++++ ...ack_store_memory_rebootstrap_protection.md | 32 +++++ ...ack_verify_deployed_artifact_byte_level.md | 14 +++ .../feedback_wipe_durability_check_reseed.md | 14 +++ ...back_within_module_n_satellite_scaffold.md | 64 ++++++++++ .../feedback_workflow_fanout_reliability.md | 39 ++++++ ...ect_database_agent_verified_local_drift.md | 14 +++ .../project_h22_wal_session_continuity.md | 20 +++ .../project_harness4_two_tier_model.md | 27 +++++ ...ct_hosolink_open_from_web_browser_block.md | 19 +++ .claude/commands/fable-clone.md | 16 +-- .claude/commands/session-start.md | 8 +- .claude/commands/ultra-on.md | 4 +- .claude/governance/.session-counter.json | 16 +-- .claude/settings.json | 1 + .claude/workflows/hmw.js | 38 +++--- .../review-synthesis.md | 34 ++++++ .../2026-07-15-S124-adap-wave-reply/run.md | 50 ++++++++ .../spec-adap-wave-reply-15-07-2026.md | 81 +++++++++++++ .../sub-lead-omission.md | 68 +++++++++++ .../sub-lead-view.md | 44 +++++++ .../sub-reviewer-1.md | 63 ++++++++++ .../sub-reviewer-2.md | 67 ++++++++++ .../sub-reviewer-3.md | 87 +++++++++++++ broadcasts/_index.md | 2 + ...26-07-15-ai_infra-to-se-reply-wave-s122.md | 62 ++++++++++ ...15-se-to-ai_infra-adap-wave-s124-report.md | 51 ++++++++ docs/HANDOFF.md | 2 +- docs/STATUS.md | 10 ++ ...e-adap-update-harness-22-wal-push-guard.md | 14 +++ ...e-adap-update-presence-not-age-reinject.md | 10 ++ ...ce-bon-vong-tu-bao-tri-hat-nhan-harness.md | 19 +++ ...ernance-do-token-that-khong-can-api-key.md | 24 ++++ ...rratum-h8-forward-pointer-and-eol-title.md | 20 +++ ...5-Governance-h17-cadence-update-bookend.md | 21 ++++ 92 files changed, 2221 insertions(+), 89 deletions(-) create mode 100644 .claude/auto-memory/MEMORY.md create mode 100644 .claude/auto-memory/feedback_7agent_split_upgrade.md create mode 100644 .claude/auto-memory/feedback_agent_cwd_relative_memory_misland.md create mode 100644 .claude/auto-memory/feedback_agent_kill_recovery.md create mode 100644 .claude/auto-memory/feedback_agent_return_garble_recover.md create mode 100644 .claude/auto-memory/feedback_aiinfra_adap_channel.md create mode 100644 .claude/auto-memory/feedback_aiinfra_charter_v2.md create mode 100644 .claude/auto-memory/feedback_background_spawn_visibility.md create mode 100644 .claude/auto-memory/feedback_canonical_spec_over_broadcast.md create mode 100644 .claude/auto-memory/feedback_cardinality_change_grep_consumers.md create mode 100644 .claude/auto-memory/feedback_citation_trap_selfreference.md create mode 100644 .claude/auto-memory/feedback_declarative_kind_config_pattern.md create mode 100644 .claude/auto-memory/feedback_derived_flush_execution.md create mode 100644 .claude/auto-memory/feedback_faultinjection_proves_teeth.md create mode 100644 .claude/auto-memory/feedback_goodhart_leave_measurement_set.md create mode 100644 .claude/auto-memory/feedback_h18_ghostwire_stamp_integrity.md create mode 100644 .claude/auto-memory/feedback_harness10_run_trace.md create mode 100644 .claude/auto-memory/feedback_harness11_engine.md create mode 100644 .claude/auto-memory/feedback_harness7_outward_writing_quality.md create mode 100644 .claude/auto-memory/feedback_harness9_l2_recovery_2workflow_adap.md create mode 100644 .claude/auto-memory/feedback_harness_123_adoption.md create mode 100644 .claude/auto-memory/feedback_high_to_max_multiagent_quality.md create mode 100644 .claude/auto-memory/feedback_implementer_truncation_mitigation.md create mode 100644 .claude/auto-memory/feedback_meta_count_selfcoverage_blindspot.md create mode 100644 .claude/auto-memory/feedback_monitor_residual_write_containment.md create mode 100644 .claude/auto-memory/feedback_monthly_drift_audit.md create mode 100644 .claude/auto-memory/feedback_multi_entity_create_self_committing_codegen.md create mode 100644 .claude/auto-memory/feedback_permission_grant_two_layers.md create mode 100644 .claude/auto-memory/feedback_phase10_namgroup_port.md create mode 100644 .claude/auto-memory/feedback_prod_config_inspect_before_change.md create mode 100644 .claude/auto-memory/feedback_prod_screenshot_to_docx.md create mode 100644 .claude/auto-memory/feedback_rag_mcp_recovery_concurrency.md create mode 100644 .claude/auto-memory/feedback_realdata_master_import.md create mode 100644 .claude/auto-memory/feedback_resume_premise_reverify.md create mode 100644 .claude/auto-memory/feedback_return_terminates_agent.md create mode 100644 .claude/auto-memory/feedback_review_presentation_and_stale_config.md create mode 100644 .claude/auto-memory/feedback_root_cause_over_symptom.md create mode 100644 .claude/auto-memory/feedback_session_end_memory_write_verify.md create mode 100644 .claude/auto-memory/feedback_skeleton_first_aggressive_finish.md create mode 100644 .claude/auto-memory/feedback_stale_diagnostic_background_agent.md create mode 100644 .claude/auto-memory/feedback_status_handoff_tiering.md create mode 100644 .claude/auto-memory/feedback_store_memory_rebootstrap_protection.md create mode 100644 .claude/auto-memory/feedback_verify_deployed_artifact_byte_level.md create mode 100644 .claude/auto-memory/feedback_wipe_durability_check_reseed.md create mode 100644 .claude/auto-memory/feedback_within_module_n_satellite_scaffold.md create mode 100644 .claude/auto-memory/feedback_workflow_fanout_reliability.md create mode 100644 .claude/auto-memory/project_database_agent_verified_local_drift.md create mode 100644 .claude/auto-memory/project_h22_wal_session_continuity.md create mode 100644 .claude/auto-memory/project_harness4_two_tier_model.md create mode 100644 .claude/auto-memory/project_hosolink_open_from_web_browser_block.md create mode 100644 .claude/workflows/runs/2026-07-15-S124-adap-wave-reply/review-synthesis.md create mode 100644 .claude/workflows/runs/2026-07-15-S124-adap-wave-reply/run.md create mode 100644 .claude/workflows/runs/2026-07-15-S124-adap-wave-reply/spec-adap-wave-reply-15-07-2026.md create mode 100644 .claude/workflows/runs/2026-07-15-S124-adap-wave-reply/sub-lead-omission.md create mode 100644 .claude/workflows/runs/2026-07-15-S124-adap-wave-reply/sub-lead-view.md create mode 100644 .claude/workflows/runs/2026-07-15-S124-adap-wave-reply/sub-reviewer-1.md create mode 100644 .claude/workflows/runs/2026-07-15-S124-adap-wave-reply/sub-reviewer-2.md create mode 100644 .claude/workflows/runs/2026-07-15-S124-adap-wave-reply/sub-reviewer-3.md create mode 100644 broadcasts/inbox/ai_infra/2026-07-15-ai_infra-to-se-reply-wave-s122.md create mode 100644 broadcasts/outbox/ai_infra/2026-07-15-se-to-ai_infra-adap-wave-s124-report.md create mode 100644 docs/governance/adap-reports/2026-07-13-Governance-adap-update-harness-22-wal-push-guard.md create mode 100644 docs/governance/adap-reports/2026-07-13-Governance-adap-update-presence-not-age-reinject.md create mode 100644 docs/governance/adap-reports/2026-07-15-Governance-bon-vong-tu-bao-tri-hat-nhan-harness.md create mode 100644 docs/governance/adap-reports/2026-07-15-Governance-do-token-that-khong-can-api-key.md create mode 100644 docs/governance/adap-reports/2026-07-15-Governance-erratum-h8-forward-pointer-and-eol-title.md create mode 100644 docs/governance/adap-reports/2026-07-15-Governance-h17-cadence-update-bookend.md diff --git a/.claude/WAL.md b/.claude/WAL.md index b6e2121..b596add 100644 --- a/.claude/WAL.md +++ b/.claude/WAL.md @@ -1,20 +1,10 @@ # WAL — auto-generated, không sửa tay -updated: 2026-07-15 | session: S123 | branch: main -closing: S123 @2026-07-15T17:30 -goal: đóng sổ S123 — 4 việc governance anh chốt (backtick-guard H24-1 · detector H24-3 · retire dạng-3 → DUAL-ACCEPT · tiep.md:66 + mark) + mark MỚI + addendum R5 + email hub +closing: S124 @20260715T231046 +updated: — | session: — | branch: — +goal: (trống — không có mạch dở) chain: -- [x] bootstrap S123 (WAL sạch Sàn-3 4/4 · 509 test · detector 46 · RAG 2440 · counter tick 1→2) -- [x] 2 monitor RE-REPORT — #53 garble ×2, recover (H1 resume · H2 disk-truth) -- [x] backtick-guard H24-1 (fault-inject 5/5) — H24-1 4→2, comm -13 rỗng -- [x] detector H24-3 session-label lag (fault-inject 6/6 + 6/6 sau fix) -- [x] retire dạng-3 → DUAL-ACCEPT (fault-inject 7/7; repo thật 0 orphan/26) -- [x] tiep.md:66 stale-at-birth + sweep view-residual-asym 6/6 bề-mặt LUẬT sạch -- [x] reviewer PASS_WITH_FIXES — 6 finding, lead verify 4/4 độc-lập, vá hết -- [x] mark MỚI RC-pqhuy1987-15-07-2026-17-23-10 (anh chốt "đồng ý") -- [x] addendum R5 + email hub ed3786a10f12 (selftest-stamp MATCH ×2) -- [x] _index reconcile — 2 email S122 chưa log (gap thật, đã vá) -- [!] session-end Phase 1→6 đang chạy +(rỗng) -next: Phase 1.5 §L.b (a)→(j) → Phase 2 WRITE → Phase 3 VERIFY → Phase 5 COMMIT+PUSH → §6.4 reset -verify: powershell -File scripts/governance-detectors.ps1 (kỳ vọng TOTAL 45) · dotnet test (509) · git log --format=%s origin/main..HEAD +next: (trống) +verify: (trống) diff --git a/.claude/agent-memory/reviewer/MEMORY.md b/.claude/agent-memory/reviewer/MEMORY.md index c0592fc..bef15ac 100644 --- a/.claude/agent-memory/reviewer/MEMORY.md +++ b/.claude/agent-memory/reviewer/MEMORY.md @@ -76,24 +76,26 @@ 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`) -- **S123 (2026-07-15) governance 4-change pre-commit review — PASS_WITH_FIXES (0 blocking/3 must-fix/1 MAJOR/3 minor):** detail → [topic](project_s123_governance_4change_review.md). 🔴 **#53 garble ×1 ở CHÍNH TAO; đĩa KHÔNG cứu được vì chưa ghi diary** ⇒ H2 MED-3 (reviewer 5-spawn/0-dòng) trả giá THẬT. **Luật tự-áp: ghi diary TRƯỚC return.** Bài: (1) vá 1 lớp bẫy ⇒ grep MỌI detector cùng-lớp TRONG chính diff; (2) fault-inject N/N chỉ chứng trục ĐÃ chạm — hỏi "trục nào KHÔNG có ca nào?"; (3) áp luật-vừa-viết cho nhánh anh-em → vỡ ⇒ luật-viết ≠ luật-làm; (4) "N/N" trộn đo-nay + dựng-lịch-sử = false-specificity (lặp S109); (5) "fix" bằng đổi format cho khớp-mẫu trượt = rời tập-đo (Goodhart, mất positive-control). -- **S117 (2026-07-13) PE negative-quote FE-only spec-review — PASS (0 blocking/1 confirm):** budget-intact VERIFIED (UpsertQuote writes 0 budget fields); #81/S114 winner-derive keyed on `IsSelected` = sign-agnostic; R2 FE:201/BE:206 SUM identical ⇒ 0 divergence. **Lesson: 2-tier guard check = compare SUM EXPRESSION not comparator; derived-flag safety = trace what flag is KEYED-ON; "budget intact" true for RECORD but quote-sum still feeds display+governance aggregates.** → `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-persist→S111). 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`. -- **S97/S97-bis (2026-07-01) PE finalize UAT ×2 + EndsBeforeCeo Mig 60/61 — PASS:** default-flip byte-mirror SHA256 ×2; RUNTIME-flag 1/5 DaDuyet grep-all + 4-projection; backfill-LIKE VN false-pos MINOR. → `archive/2026-07.md`. -- **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.7≠H16. → adap-report + _INDEX. +- **S124 L2 fidelity-to-source review, adap-wave plan — PWF (0 misread/1 MAJOR/3m):** 5/6 broadcast-reading traps read-faithful (NOT-adopt→method/spirit · h17 4-floors-KEEP · r6 abs-path). MAJOR = **push-guard "REFINEMENT ahead-of-broadcast" (spec:58) = OVERCLAIM**: SE trailing-K is LOOSER than broadcast ahead-range-all-count, keeps sandwiched wal:→leak; NO dimension strictly ahead. run.md:15 + mark cl.4 already carry honest "noise-accepted no-rewrite" ⇒ spec contradicts own run.md+mark. **Lesson: "ahead/refinement" = verify vs broadcast's ACTUAL requirement (looser≠ahead); spec+adap-report = shipped artifact → reconcile before hub-send.** Verified: adap-reports at `docs/governance/` not `.claude/` (path-trap false-empty). → `archive/2026-07.md`. +- **S124 (2026-07-15) adap-wave-reply PLAN L3-lens — PASS_WITH_FIXES (0C/3M/2m):** disk `sub-reviewer-3.md`. 🎯 **do-token trap committed WHILE adopting do-token**: spec "STATUS=26075 tok (real-N)" — I re-Read FULL → truncation = **70892 tok** (tail-alone 33944 > 26075) ⇒ near-cap CHUNK mislabeled whole-file, 2.72× under, feeds owner re-tier. **Lesson: verify do-token claim = re-Read full + read truncation line yourself; token count tokenizer-invariant ⇒ 2×+ gap = mis-measure not env.** M2 meta-count "6 R1-R6"→5 (R5 highest-value dropped). M3 nấc "verified" on cadence NEVER-RAN (hub-expected = "đã đọc không đổi"). Positives held: authority-class owner-gated correct · harness_floor 55K self-audit honest · all-inherit 14/14. Anti-garble: full disk-write BEFORE return. +- **S123 governance 4-change review — PWF (3 must/1 MAJOR/3m):** detail → [topic](project_s123_governance_4change_review.md). 🔴 **#53 garble tại TAO; đĩa KHÔNG cứu vì chưa ghi diary ⇒ Luật: ghi diary TRƯỚC return.** Bài: vá-1-lớp⇒grep MỌI detector cùng-lớp TRONG diff · fault-inject N/N chỉ chứng trục ĐÃ chạm ("trục nào KHÔNG có ca?") · luật-viết≠luật-làm · "N/N" trộn đo+dựng-lịch-sử=false-specificity · "fix" bằng đổi-format-cho-trượt-mẫu = Goodhart rời-tập-đo. +- **S117 PE negative-quote FE-only spec-review — PASS.** Lesson: 2-tier guard = compare SUM EXPRESSION not comparator; derived-flag safety = trace what flag KEYED-ON (`IsSelected` sign-agnostic). → `archive/2026-07.md`. +- **S116 outward-email GATE H-22 WAL restart runtime — PASS (3m).** Lesson: persist-claim on git-tracked WAL → verify tracked+0-drift; mechanism-proof lives at Stop-hook run, NOT git property. → `archive/2026-07.md`. +- **S115 presence-not-age spec-review — PWF (0C/2M/5m).** Lesson: verify EACH regex-alt vs EACH target-line by hand; acceptance-grep can't detect its OWN deliverable's miss; skip-on-contiguous-prefix = correctness-inversion. → `archive/2026-07.md`. +- **S101 H19 WF2 Lane-A — PWC (closed @S102):** marker WRITE-ONLY dead — persist-claim cần CẢ reader-side (verify consumer exists). → `archive/2026-07.md`. +- **S100 H18 WF2 synthesis+Lane-B — PWC:** ledger revert-clean + ratio-band; anti-pattern HELD stale WF2 run-id NOT stamped. → `archive/2026-07.md`. +- **S98 3 verify-lane — PASS:** fidelity-gate 3-lớp; Windows byte-verify = .NET ReadAllBytes/`wc -c` (MSYS strip `\r` báo sai). → `archive/2026-07.md`. +- **S97 PE finalize UAT + Mig 60/61 — PASS:** default-flip byte-mirror SHA256 ×2; RUNTIME-flag grep-all + 4-projection. → `archive/2026-07.md`. +- **S93 Harness-16 MFE adopt — PASS:** code-gate re-derived denom; WF1 caught vocab-fork H6.7≠H16. → 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). -- **June-2026 digest — LESSON-ONLY (verbatim → `archive/2026-06.md` 70KB + `archive/_INDEX.md`; S89/S90/S91 PE = FROZEN do-not-touch):** codegen mid-loop flush ONLY seq-row · single→multi conversion stops at display-layer (FE `some(isWinner)` vs BE `is null` = dead-end) · echo-all-siblings convention rots when NEW absolute-set field added · merge-distill fabricates false-specificity ⇒ QUALITY gate AFTER presence · authz byte-mirror fail-closed (NotFound→Forbidden) · sha = self-declared frontmatter NOT recompute · spec-scope-framing can be FALSE ⇒ read changed-set · fail-closed guard BEFORE terminal-state + server-recompute no-trust-client · TRACKED = check-ignore(eligible) ≠ git-ls-files(committed) · public-grant root NOT inherit-root · upgrade MUST MUTATE row NOT skip-existing; menu-hide ≠ API-lock. +- **June-2026 digest — LESSON-ONLY (verbatim → `archive/2026-06.md` 70KB + `_INDEX`; S89/S90/S91 PE FROZEN):** merge-distill fabricates false-specificity ⇒ QUALITY gate AFTER presence · sha = self-declared frontmatter NOT recompute · spec-scope-framing can be FALSE ⇒ read changed-set · fail-closed guard BEFORE terminal-state + server-recompute no-trust-client · TRACKED = check-ignore ≠ git-ls-files(committed) · public-grant root NOT inherit-root · upgrade MUST MUTATE row NOT skip-existing; menu-hide ≠ API-lock · single→multi stops at display-layer. -- **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 15≠disk 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) `[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`. +- **S108 first-real-run H19 — FAIL (1C+4M+6m):** email "đã 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. → `archive/2026-07.md`. +- **S109 fidelity-gate 2 gist L2 — PWF (3):** gist meta-count 15≠disk 14; delta tự-tính = false-specificity; fact-claim trong N/A verify như content. → `archive/2026-07.md`. +- **S111 H22 WAL adopt — PWF (0C/1M):** CATCH "STAGED" còn khi N.3 nâng VERIFIED-RUNTIME = nâng-nấc-quên-sync cùng-diff; live-witness>forensics. → `archive/2026-07.md`. +- **S110 H21+MTv3 — PWF (0C/5M):** doc "VALID_ROLES 12" 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 fable-real-single close-reviews+FINAL — GO 0-must:** Import btn reuses sibling-menu guard but endpoint=Admin ⇒ derive guard from ENDPOINT authz; EDGE-5 gác FROM-state ở ĐỈNH method KHÔNG per-branch; self-flip token-test = internal NOT external-accept. → [topic](project_s112_supplier_import_review.md). --- diff --git a/.claude/agents/README.md b/.claude/agents/README.md index 25ddfa3..83a0996 100644 --- a/.claude/agents/README.md +++ b/.claude/agents/README.md @@ -35,7 +35,7 @@ │ • Synthesize cross-agent findings + commit/push (em main only)│ │ • Fallback solo nếu spawn fail (gotcha #53 truncate / 529) │ └──────────────────────────────────────────────────────────────┘ - ↓ spawn + keep-alive (Harness-8 all-inherit: MỌI sub `model: inherit` = top-tier lead — Max; per-task tier:'opus' escape-hatch giữ) + ↓ spawn + keep-alive (worker-tier-pin S124: MỌI sub `model: opus`+`effort: max` = worker-tier; lead=owner-choice/phiên; Fable qua /fable-real) ── RESEARCH (READ) ────────── ── IMPLEMENT (WRITE) ──────────── ── QUALITY ────────── ┌──────────────────┐ ┌───────┐ ┌─────────────────┐ ┌──────────┐ ┌────────┐ ┌─────────┐ ┌────────┐ │investigator- │ │invest-│ │implementer- │ │implement-│ │test- │ │reviewer │ │cicd- │ @@ -219,7 +219,7 @@ MỌI agent trong roster có **4 RAG-READ MCP**: `search_memory` + `search_code` ## 💾 Memory discipline -Each agent `.claude/agent-memory//MEMORY.md` persistent diary. Spawn auto-inject first 200 lines/25KB. Update BEFORE return (BẮT BUỘC, entry ≤ 1.5K chars). 12 folder: investigator-codebase · investigator-api · implementer-backend · implementer-frontend · test-specialist · reviewer · cicd-monitor · frontend-designer · database-agent · office-document · tooling-auditor · harvest-curator. +Each agent `.claude/agent-memory//MEMORY.md` persistent diary. Spawn auto-inject first 200 lines/25KB. Update BEFORE return (BẮT BUỘC, entry ≤ 1.5K chars). 14 folder: investigator-codebase · investigator-api · implementer-backend · implementer-frontend · test-specialist · reviewer · cicd-monitor · frontend-designer · database-agent · office-document · tooling-auditor · harvest-curator · lead-view-auditor · lead-omission-auditor (+S121 W2). **Tiered Memory Policy v1** (adopt AI_INFRA bulletin 2026-05-29 — thay ngưỡng cứng ">25KB archive" bằng tiered + just-in-time; size to ≠ chất lượng, context-rot): - **L1 HOT** = `MEMORY.md` soft-cap **~30KB** (role + patterns + anti-patterns + 5-8 entry gần nhất) → auto-inject mỗi spawn diff --git a/.claude/agents/cicd-monitor.md b/.claude/agents/cicd-monitor.md index 26d0b48..7097a57 100644 --- a/.claude/agents/cicd-monitor.md +++ b/.claude/agents/cicd-monitor.md @@ -2,7 +2,8 @@ name: cicd-monitor description: | CI/CD pipeline + post-deploy verification specialist for SOLUTION_ERP. Use proactively AFTER every push to main that triggers Gitea Actions deploy (code commits — skip docs-only per path-filter gotcha #41). Polls Gitea Actions run status via API, verifies test gate pass (Domain 58 + Infra 23 tests baseline), confirms deploy actually shipped (FE bundle hash change × 2 app + EF migrations applied prod), smoke tests prod endpoints (api/admin/eoffice.solutions.com.vn). NEVER writes code — produces PASS/FAIL verdict with concrete evidence from logs + curl + sqlcmd. Catches deploy fail tự động không phụ thuộc em main nhớ verify. -model: inherit +model: opus +effort: max tools: [Read, Grep, Glob, Bash, WebFetch, mcp__rag-unified__search_memory, mcp__rag-unified__search_code, mcp__rag-unified__cross_project_search, mcp__rag-unified__list_projects] skills: - iis-deploy-runbook diff --git a/.claude/agents/database-agent.md b/.claude/agents/database-agent.md index ab711df..eafdc6e 100644 --- a/.claude/agents/database-agent.md +++ b/.claude/agents/database-agent.md @@ -2,7 +2,8 @@ name: database-agent description: | READ-advisory DB specialist cho SOLUTION_ERP (.NET 10 EF Core 10 + SQL Server, single ApplicationDbContext dbo). Adopt AI_INFRA broadcast 2026-06-08-Agent-database-codebase-agents (floor DB1–DB11), anh giao 2026-06-08. Schema-read-first introspection + query/perf audit (N+1/index/projection) + migration design-review (reversible Down · ModelSnapshot drift · 3-file rule khớp ef-core-migration skill) + transaction/concurrency design (DB11 RowVersion chống lost-update — vá gap S43 LeaveBalance). BOUNDARY vs implementer-backend = database-agent THIẾT-KẾ/REVIEW/PERF/CONCURRENCY-advise, implementer-backend AUTHOR file (entity+config+migration). KHÔNG đụng business-logic/controller/FE (DB7 scope DB-only). KHÔNG store_memory (lead = sole RAG-writer). Propose schema/perf finding → em main + implementer-backend. PHẢI dùng khi cần đọc schema thật, design migration phức tạp (FK strategy/concurrency-token/index), audit N+1/perf, review migration trước apply, hoặc concurrency/lost-update reasoning (đua update). -model: inherit +model: opus +effort: max tools: [Read, Grep, Glob, Bash, Skill, mcp__rag-unified__search_memory, mcp__rag-unified__search_code, mcp__rag-unified__cross_project_search, mcp__rag-unified__list_projects] memory: project maxTurns: 25 @@ -43,7 +44,7 @@ maxTurns: 25 - **KHÔNG:** FE · business-logic Application handler logic (chỉ review query/perf bên trong) · deploy (cicd-monitor) · session-lifecycle audit (tooling-auditor/harvest-curator). ## SELF-CHECK (trước khi coi done) -- [x] frontmatter `model: inherit` — KHÔNG `...[1m]` (gotcha #37). +- [x] frontmatter `model: opus` — KHÔNG `...[1m]` (gotcha #37). - [x] `description` dùng block scalar `|` (parse-safe, no colon-space break). - [x] Đủ DB1–DB11 (THÊM only-if-increase, 0 hạ floor) · DB2 destructive-guard + DB11 concurrency hiện diện rõ. - [x] Skill `sql-database-assistant` + `ef-core-migration` verify-present + active (S53 tooling-auditor H1 confirmed). diff --git a/.claude/agents/frontend-designer.md b/.claude/agents/frontend-designer.md index efcf2bd..d27eab7 100644 --- a/.claude/agents/frontend-designer.md +++ b/.claude/agents/frontend-designer.md @@ -2,7 +2,7 @@ name: frontend-designer description: | Frontend DESIGN specialist cho 2 app SOLUTION_ERP (fe-admin :8082 + fe-user :8080 — React 19 + Vite 8 + TS 6 + shadcn/ui + Tailwind + TanStack Query). Sinh/redesign UI ĐẸP THẬT qua design-system-first + visual-verification loop (Playwright screenshot ≥2 viewport → rubric → fix → lặp) + anti-generic-aesthetic. Production-grade FE code + a11y WCAG-AA. Dùng khi build/redesign page/dashboard/component, "làm cho đẹp", thiết kế UX mới. Design-by-code KHÔNG Figma. KHÔNG đụng BE/DB/business-logic (đó là implementer-backend) · KHÔNG cookie-cutter mechanical mirror theo spec đã chốt (đó là implementer-frontend) — phân biệt bằng output contract: cần ĐẸP/UX → tôi; cần scaffold-theo-spec → implementer-frontend. -model: inherit +model: opus effort: max tools: [Read, Write, Edit, Bash, Grep, Glob, Skill, WebFetch, WebSearch, mcp__rag-unified__search_memory, mcp__rag-unified__search_code, mcp__rag-unified__cross_project_search, mcp__rag-unified__list_projects] memory: project diff --git a/.claude/agents/harvest-curator.md b/.claude/agents/harvest-curator.md index 137dd7d..4160574 100644 --- a/.claude/agents/harvest-curator.md +++ b/.claude/agents/harvest-curator.md @@ -2,7 +2,8 @@ name: harvest-curator description: | Read-only INFORM-only HARVEST-MD-INTEGRITY auditor cho SOLUTION_ERP (H2 — adopt AI_INFRA Harness 1, anh giao 2026-06-07; TÁCH BIỆT khỏi tooling-auditor H1 vì 2 việc hay quên+nhầm khi gộp). Verify HARVEST mỗi session ĐỦ + ĐÚNG: quét agent-memory mọi sub đã spawn + run-folder `runs//sub-md/` (Harness-10 run-trace) + agent-team → đề-xuất spawn-record 4-field + chạy harvest-integrity 5-trục (Coverage·Completeness·Fidelity-flag·Placement·Corruption). Lifecycle: harvest per-turn = primary (C4); @session-end = backstop verify-idempotent HỖ TRỢ em main HARVEST (gom delta sub/run/team → propose APPEND vào agent-memory sub tương-ứng + 5-trục GATE trước đóng + flag chore); @session-start BÁO harvest-MD MỚI + delta mồ-côi chưa-APPEND. Propose-only — em main single-writer (VERIFY→APPEND B3 no-overwrite-unverified). KHÔNG tooling/skill/plugin/docs-freshness (đó là tooling-auditor H1). KHÔNG store_memory. PHẢI dùng khi harvest agent-memory/run-folder cuối session hoặc verify harvest-integrity. -model: inherit +model: opus +effort: max tools: [Read, Grep, Glob, Bash, mcp__rag-unified__search_memory, mcp__rag-unified__search_code, mcp__rag-unified__cross_project_search, mcp__rag-unified__list_projects] memory: project maxTurns: 18 diff --git a/.claude/agents/implementer-backend.md b/.claude/agents/implementer-backend.md index 6745f80..26aa14e 100644 --- a/.claude/agents/implementer-backend.md +++ b/.claude/agents/implementer-backend.md @@ -2,7 +2,8 @@ name: implementer-backend description: | WRITE specialist cho toàn bộ .NET backend SOLUTION_ERP (Domain + Application + Infrastructure + Api layer). Scaffold entity + enum + EF Configuration + Migration 3-file + DbInitializer seed + CQRS Command/Query/Validator/Handler + MediatR + Controller + DTO. Case 1+2+3+5 only (cookie-cutter mechanical scaffold, multi-file independent orchestrator-workers, isolated method test-gen handler, mass migration). DO NOT touch FE 2 app (đó là implementer-frontend). DO NOT write test assertions (đó là test-specialist). DO NOT schema design / UX decision / cross-stack bug fix reasoning (em main solo). Auto-refuses out-of-scope. -model: inherit +model: opus +effort: max tools: [Read, Edit, Write, Bash, Skill, Grep, Glob, mcp__rag-unified__search_memory, mcp__rag-unified__search_code, mcp__rag-unified__cross_project_search, mcp__rag-unified__list_projects] skills: - ef-core-migration diff --git a/.claude/agents/implementer-frontend.md b/.claude/agents/implementer-frontend.md index f9bdd57..1bc4a01 100644 --- a/.claude/agents/implementer-frontend.md +++ b/.claude/agents/implementer-frontend.md @@ -2,7 +2,8 @@ name: implementer-frontend description: | WRITE specialist cho FE 2 app SOLUTION_ERP (fe-admin + fe-user React 19 + Vite 8 + TS 6 + shadcn/ui + TanStack Query). Cookie-cutter mirror page/types/component cross-app SHA256 IDENTICAL + Pattern 16-bis 4-place mirror (page + App.tsx route + menuKeys.ts + Layout.tsx staticMap) + declarative KIND_CONFIG Record + npm build × 2 verify. Case 1+2 only (cookie-cutter mirror cross-app, multi-file independent). DO NOT touch .NET backend (đó là implementer-backend). DO NOT schema/UX flow decision (em main solo). Auto-refuses out-of-scope. -model: inherit +model: opus +effort: max tools: [Read, Edit, Write, Bash, Skill, Grep, Glob, mcp__rag-unified__search_memory, mcp__rag-unified__search_code, mcp__rag-unified__cross_project_search, mcp__rag-unified__list_projects] skills: - permission-matrix diff --git a/.claude/agents/investigator-api.md b/.claude/agents/investigator-api.md index 54839e4..4bf67cb 100644 --- a/.claude/agents/investigator-api.md +++ b/.claude/agents/investigator-api.md @@ -2,7 +2,8 @@ name: investigator-api description: | Read-only EXTERNAL research specialist for SOLUTION_ERP. WebFetch/WebSearch official docs (Anthropic engineering, .NET 10 / EF Core 10 / ASP.NET, React 19 / Vite 8 / TanStack Query, shadcn/ui), NuGet + npm CVE/dependency eval, FE library evaluation (license + bundle size impact — vd FullCalendar v6 MIT verify), reference project pattern audit (NamGroup / DH_Y_DUOC / BVAAU cross-project), community sentiment research. EXTERNAL-focused — KHÔNG audit internal codebase or SQL schema (đó là investigator-codebase). NEVER writes code — only returns concise structured findings with source URLs. -model: inherit +model: opus +effort: max tools: [Read, Bash, WebFetch, WebSearch, mcp__rag-unified__search_memory, mcp__rag-unified__search_code, mcp__rag-unified__cross_project_search, mcp__rag-unified__list_projects] skills: - dependency-audit-erp diff --git a/.claude/agents/investigator-codebase.md b/.claude/agents/investigator-codebase.md index 9796783..c8b8a14 100644 --- a/.claude/agents/investigator-codebase.md +++ b/.claude/agents/investigator-codebase.md @@ -2,7 +2,8 @@ name: investigator-codebase description: | Read-only INTERNAL codebase audit specialist for SOLUTION_ERP. Use proactively when main agent needs to scan >5 files for patterns, audit controllers/endpoints, search V1/V2 workflow schema or sys.triggers, EF migration diff, SQL schema scan (sqlcmd LocalDB Dev/Design + prod), grep symbol/pattern, gather reference implementations from similar features (PE → Contract V2 → Proposal mirror), audit memory entries cross-reference, pre-flight reconnaissance before implementation. INTERNAL-focused — KHÔNG fetch external API docs (đó là investigator-api). NEVER writes code — only returns concise structured findings. -model: inherit +model: opus +effort: max tools: [Read, Grep, Glob, Bash, mcp__rag-unified__search_memory, mcp__rag-unified__search_code, mcp__rag-unified__cross_project_search, mcp__rag-unified__list_projects] skills: - contract-workflow diff --git a/.claude/agents/lead-omission-auditor.md b/.claude/agents/lead-omission-auditor.md index 9bc0be0..409560f 100644 --- a/.claude/agents/lead-omission-auditor.md +++ b/.claude/agents/lead-omission-auditor.md @@ -2,7 +2,8 @@ name: lead-omission-auditor description: | Read-only INFORM-only LEAD-OMISSION auditor cho SOLUTION_ERP (H24 §2(1) "vai-GAP" — adopt AI_INFRA Harness 24 broadcast 2026-07-14, anh chốt S119 owner-decisions, land S121 W2). Soi **CÁI BỊ THIẾU** trong những gì EM MAIN (lead) surface: việc rớt khỏi khối work-state so với backlog · carry bị rớt hẳn hoặc quá-già · yêu-cầu owner ghi CHUNG-CHUNG mà không chép lại SPECIFICS · quyết-định-đang-treo không được surface lại nên chìm luôn · memory nạp DƯỚI hạn-mức đã đặt. 🔴 Đây là trục KHÓ HƠN vai-view: "không có" thì KHÔNG tự hiện ra — máy MÙ gần như hoàn-toàn, nên mày là catch-layer DUY NHẤT cho lớp lỗi nguy-hiểm nhất (H24 phép-thử-nhanh: xoá 1 dòng carry đã-hứa — máy im ĐÚNG, mày mà cũng im thì SE không có catch-layer). ĐỌC OUTPUT máy làm nền, KHÔNG chạy lại. Mỗi FLAG gắn 1 class từ enum ĐÓNG `lead_self_audit.flag_classes` (memory-budget.json) — CẤM tự chế class. Chạy theo NHỊP (`h24_cadence`), KHÔNG mỗi phiên. Propose-only — em main single-writer (VERIFY→APPEND B3). KHÔNG store_memory. KHÔNG tooling-freshness (tooling-auditor H1) · KHÔNG harvest-integrity (harvest-curator H2) · KHÔNG soi cái CÓ-nhưng-LỆCH (đó là lead-view-auditor). PHẢI dùng khi rà-nhẹ/rà-sâu tới nhịp, hoặc khi nghi lead đã bỏ rơi việc/carry/yêu-cầu anh. -model: inherit +model: opus +effort: max tools: [Read, Grep, Glob, Bash, mcp__rag-unified__search_memory, mcp__rag-unified__search_code, mcp__rag-unified__cross_project_search, mcp__rag-unified__list_projects] memory: project maxTurns: 18 diff --git a/.claude/agents/lead-view-auditor.md b/.claude/agents/lead-view-auditor.md index b195664..5b24763 100644 --- a/.claude/agents/lead-view-auditor.md +++ b/.claude/agents/lead-view-auditor.md @@ -2,7 +2,8 @@ name: lead-view-auditor description: | Read-only INFORM-only LEAD-VIEW auditor cho SOLUTION_ERP (H24 §2(1) "vai-STALE" — adopt AI_INFRA Harness 24 broadcast 2026-07-14, anh chốt S119 owner-decisions, land S121 W2). Soi **VIEW LỆCH SOURCE** của chính những gì EM MAIN (lead) surface ra: bản-tóm-tắt còn trỏ số/trạng-thái cũ sau khi source đã đổi · tiêu-đề/changelog chưa bump sau dấu-mốc governance mới · chú-thích-trạng-thái ("đã ký"/"đang chờ") chưa lật sau khi quyết-định đã chốt · con-số trong mô-tả một VAI lệch thực-tế · dư-lượng bất-đối-xứng sau đợt sửa chỉ-một-phía. ĐỌC OUTPUT của máy (`scripts/governance-detectors.ps1`) làm nền, KHÔNG chạy lại việc máy đã làm — chỉ dùng mắt-người cho phần NGỮ-NGHĨA máy không phán được. Mỗi FLAG gắn 1 class từ enum ĐÓNG `lead_self_audit.flag_classes` (memory-budget.json) — CẤM tự chế class. Chạy theo NHỊP (`h24_cadence`), KHÔNG mỗi phiên. Propose-only — em main single-writer (VERIFY→APPEND B3). KHÔNG store_memory. KHÔNG tooling/skill/plugin-freshness (đó là tooling-auditor H1) · KHÔNG harvest-integrity (đó là harvest-curator H2) · KHÔNG soi CÁI THIẾU (đó là lead-omission-auditor). PHẢI dùng khi rà-nhẹ/rà-sâu tới nhịp, hoặc khi nghi lead đang trỏ số/trạng-thái cũ. -model: inherit +model: opus +effort: max tools: [Read, Grep, Glob, Bash, mcp__rag-unified__search_memory, mcp__rag-unified__search_code, mcp__rag-unified__cross_project_search, mcp__rag-unified__list_projects] memory: project maxTurns: 18 diff --git a/.claude/agents/office-document.md b/.claude/agents/office-document.md index 28072d0..efcd2f6 100644 --- a/.claude/agents/office-document.md +++ b/.claude/agents/office-document.md @@ -2,7 +2,8 @@ name: office-document description: | WRITE specialist OFFICE DOCUMENT cho SOLUTION_ERP (12th sub — anh giao S107 2026-07-10, "Sub chính" mảng Office). Tạo/đọc/sửa/convert file Office: docx · xlsx · pptx · pdf qua BỘ SKILL Office (docx/xlsx/pptx/pdf standalone + form-engine project). Phụ trách: extract spec TRUNG THỰC từ file anh gửi (Excel "Database NCC" Supplier Phase B khi unpark · QUY_TRINH/FORM Word) · chuẩn hóa template 8 form HĐ placeholder {{field}} · tạo báo cáo/tài liệu deliverable Word/Excel/PPT/PDF · screenshot→docx pipeline (gotcha #74) · verify render output form-engine (round-trip đọc lại). Floor OD1–OD10 (skill-first · fidelity-to-template 100% · extract-không-bịa · round-trip-verify · file-mới-không-đè-gốc). BOUNDARY: KHÔNG đụng production code (src/Backend · fe-admin · fe-user · tests) — C# render-engine (OpenXml/ClosedXML/LibreOffice service) = implementer-backend; office-document = FILE-level document/template/spec. KHÔNG store_memory (lead = sole RAG-writer). PHẢI dùng khi task có file .docx/.xlsx/.pptx/.pdf làm INPUT hoặc OUTPUT chính: đọc/extract/mapping file Office anh gửi, tạo document deliverable, sửa/chuẩn hóa template form, convert/merge/fill PDF, xuất báo cáo Office. -model: inherit +model: opus +effort: max tools: [Read, Edit, Write, Bash, Skill, Grep, Glob, mcp__rag-unified__search_memory, mcp__rag-unified__search_code, mcp__rag-unified__cross_project_search, mcp__rag-unified__list_projects] memory: project maxTurns: 30 @@ -46,7 +47,7 @@ maxTurns: 30 - **KHÔNG:** deploy (cicd-monitor) · session-lifecycle audit (2 monitor) · schema/UX decision (em main solo). ## SELF-CHECK (trước khi coi done) -- [x] frontmatter `model: inherit` — KHÔNG `[1m]` (gotcha #37). +- [x] frontmatter `model: opus` — KHÔNG `[1m]` (gotcha #37). - [x] `description` block scalar `|` (parse-safe). - [x] Đủ OD1–OD10 · OD2 fidelity-template + OD4 extract-không-bịa + OD5 round-trip hiện diện rõ. - [x] Skill 4 Office standalone + `form-engine` project verify-present (session skill list 2026-07-10 có đủ 5). diff --git a/.claude/agents/reviewer.md b/.claude/agents/reviewer.md index 7512b1a..fa1f554 100644 --- a/.claude/agents/reviewer.md +++ b/.claude/agents/reviewer.md @@ -2,7 +2,8 @@ name: reviewer description: | Adversarial code review specialist for SOLUTION_ERP. Use proactively BEFORE every commit involving: wire BE claim (especially CRUD endpoints with POST/PUT/DELETE), schema migration, cross-stack feature, security-sensitive diff, or any change > 50 LOC. Provides independent verification that main agent's implementation matches spec, catches blind spots from self-review bias (gotcha #44 silent 403 type issues), and runs live verification on prod UAT environment for deploy claims. NEVER writes code — produces PASS/FAIL verdict with concrete issues file:line. -model: inherit +model: opus +effort: max tools: [Read, Grep, Glob, Bash, mcp__rag-unified__search_memory, mcp__rag-unified__search_code, mcp__rag-unified__cross_project_search, mcp__rag-unified__list_projects] skills: - dependency-audit-erp diff --git a/.claude/agents/test-specialist.md b/.claude/agents/test-specialist.md index 575824f..5df47b3 100644 --- a/.claude/agents/test-specialist.md +++ b/.claude/agents/test-specialist.md @@ -2,7 +2,8 @@ name: test-specialist description: | WRITE specialist DEDICATED test layer SOLUTION_ERP (tests/SolutionErp.Domain.Tests + Infrastructure.Tests). xUnit + FluentAssertions 7.2 + EF SQLite TestApplicationDbContext (nvarchar(max)→TEXT override) + IdentityFixture. Domain policy state machine test + Infra code generator + CQRS handler test + reflection-based Authorize policy regression + UNIQUE/Conflict/soft-delete invariant. Test-before BẮT BUỘC cho bug fix + critical algo (codegen/guard/financial/security). DO NOT touch production code (Domain/App/Infra/Api/FE — đó là 2 implementer). Auto-refuses out-of-scope. -model: inherit +model: opus +effort: max tools: [Read, Edit, Write, Bash, Grep, Glob, mcp__rag-unified__search_memory, mcp__rag-unified__search_code, mcp__rag-unified__cross_project_search, mcp__rag-unified__list_projects] skills: - contract-workflow diff --git a/.claude/agents/tooling-auditor.md b/.claude/agents/tooling-auditor.md index 652da61..9c481b4 100644 --- a/.claude/agents/tooling-auditor.md +++ b/.claude/agents/tooling-auditor.md @@ -2,7 +2,8 @@ name: tooling-auditor description: | Read-only INFORM-only TOOLING-FRESHNESS auditor cho SOLUTION_ERP (H1 — adopt AI_INFRA Harness 1, anh giao 2026-06-07; TÁCH BIỆT khỏi harvest-curator H2 vì 2 việc hay quên+nhầm khi gộp). Audit 4-MẶT mỗi session có cập-nhật ĐẦY-ĐỦ + KỊP-THỜI không: (1) skill (.claude/skills/ 6 project + ~/.claude/skills standalone — mới/đổi/stale/đã-map-vai chưa) · (2) vai-trò sub-agent (.claude/agents/ roster khớp README/CLAUDE.md/STATUS · thừa/idle/scope-drift) · (3) plugin (~/.claude/settings.json enabledPlugins user-global · installed/enabled/assigned/used) · (4) docs (CLAUDE.md·docs/STATUS·agents/README·governance phản-ánh trạng-thái THẬT · drift doc-vs-reality). Lifecycle: @session-start BÁO state + diff-vs-last (THÊM/ĐỔI/XÓA/stale); @session-end CHỐT freshness + AUDIT skill/plugin MỚI phân-bổ (new-alloc) cho em main + sub. Propose-only — em main single-writer (VERIFY→APPEND B3). KHÔNG harvest-memory (đó là harvest-curator). KHÔNG corpus/RAG/deploy (đó là cicd-monitor). KHÔNG store_memory. PHẢI dùng khi audit tooling/docs-freshness + skill/plugin-state + roster-drift đầu/cuối session. -model: inherit +model: opus +effort: max tools: [Read, Grep, Glob, Bash, mcp__rag-unified__search_memory, mcp__rag-unified__search_code, mcp__rag-unified__cross_project_search, mcp__rag-unified__list_projects] memory: project maxTurns: 18 diff --git a/.claude/auto-memory/MEMORY.md b/.claude/auto-memory/MEMORY.md new file mode 100644 index 0000000..457805b --- /dev/null +++ b/.claude/auto-memory/MEMORY.md @@ -0,0 +1,58 @@ +# Memory Index — SOLUTION_ERP + +> One line per memory. **Feedback** = how I work · **Project** = ongoing context · **Pattern** = reusable scaffold. Detail lives in topic files; this index = recall hook only. Compacted S93 (was 23.7KB). + +## Feedback — how I should work +- [Charter v2 — infra ownership](feedback_aiinfra_charter_v2.md) — AI_INFRA owns infra (RAG/MCP/agent/skill); SE focus product, phản-biện infra chỉ khi derail +- [Monthly drift audit](feedback_monthly_drift_audit.md) — cron ngày 1: investigator ground-truth-from-disk → em-main patch từng cite (gotchas no self-count) +- [STATUS/HANDOFF tiering](feedback_status_handoff_tiering.md) — giữ lean (current + 2-3 session); archive verbatim trước rewrite; re-ground count từ code +- [Implementer truncation mitigation](feedback_implementer_truncation_mitigation.md) — heavy scaffold truncate mid-MEMORY; Strategy B = em-main proxy-append next session +- [High→Max multi-agent quality](feedback_high_to_max_multiagent_quality.md) — Max reasoning ↑ cross-stack reliability; Max re-review wire/financial claim BẮT BUỘC +- [Background spawn visibility](feedback_background_spawn_visibility.md) — long foreground spawn "looks frozen" → `run_in_background` + report ngay +- [RAG MCP recovery + concurrency](feedback_rag_mcp_recovery_concurrency.md) — MCP rớt → quit+relaunch FRESH trust .mcp.json (KHÔNG resume); KHÔNG 2 SE-session cùng repo; git-add file cụ-thể +- [store_memory rebootstrap protection](feedback_store_memory_rebootstrap_protection.md) — at-risk ⟺ content NOT in {exists ∧ corpus-glob ∧ not-excluded}; promote-to-disk twin trước re-bootstrap +- [Session-end memory write verify](feedback_session_end_memory_write_verify.md) — closeout Write có thể 0-byte (#53); verify byte>0 sau mỗi memory Write (S45 mất index) +- [AI_INFRA adap-* channel](feedback_aiinfra_adap_channel.md) — federated adoption /adap-apply|report|request; read outbox→apply own repo→adap-report (§J2); lead=sole RAG-writer +- [Monitor residual-write containment](feedback_monitor_residual_write_containment.md) — propose-only sub vẫn Bash-write được (G-015); git-diff commit-gate = backstop THẬT (AS-10/E-006) +- [Agent kill/truncation recovery](feedback_agent_kill_recovery.md) — kill/truncate/die-0-byte giữa task → recover qua git/disk/prod truth + em-main-solo redo + self-gate evidence-checklist (S52) +- [Agent cwd-relative memory mis-land](feedback_agent_cwd_relative_memory_misland.md) — sub cd subdir → MEMORY Write rơi `/.claude` stray; session-end git-status scan + reconcile (S54) +- [Harness-7 outward writing quality](feedback_harness7_outward_writing_quality.md) — outward (email/broadcast/report + lead→anh) = full-grammar VN; internal stays compressed (asymmetric, S64) +- [Workflow fan-out reliability](feedback_workflow_fanout_reliability.md) — fan-out parallelism thật; return: schema-NHỎ 3-field 4/4-clean S108 (S73 "tránh schema" thu hẹp còn schema-SÂU) + free-text VERDICT-header-dòng-1; 2 bẫy Workflow-tool: args-đến-dạng-STRING → parse-guard · `tier:` hmw-only → generic dùng `model:'opus'` (S65/S73/S108) +- [Fault-injection proves teeth](feedback_faultinjection_proves_teeth.md) — chứng checker/guard có RĂNG bằng inject-lỗi-vào-cây-tạm (`-RepoRoot`) → confirm FLAG, KHÔNG chỉ happy-path PASS; boundary + anti-Goodhart-flip; verify anchor bằng chính regex script (S95) +- [Harness-9 L2-recovery + 2-workflow adap](feedback_harness9_l2_recovery_2workflow_adap.md) — mỗi adap = 2 workflow (impl+review) + run-id; L2 _INDEX/gist dark-matter recovery; self-gate khi reviewer no-schema (S70); **+ vocab-collision-check on adopt** (review bắt tên-trùng: memory-fidelity H6.7≠H16; alias-map KHÔNG seed detector, S93) +- [Stale diagnostic in background agent](feedback_stale_diagnostic_background_agent.md) — IDE diagnostic giữa agent NỀN = snapshot dở; chỉ tin build SẠCH chạy SAU agent (gotcha #68, S69) +- [Harness-10 run-trace folder](feedback_harness10_run_trace.md) — git-tracked `runs//` FLAT (`sub-*`+`*-synthesis.md`); raw-Workflow≠writeGuard→residual caught+revert; detector-tailored-out (S71-72) +- [Harness-11 engine adopt](feedback_harness11_engine.md) — engine governance tự-bảo-trì: `governance-detectors.ps1`+`memory-archive-gate.ps1`; B1 derived-trỏ-canonical; #30-via-Edit (.ps1 pure-ASCII+code-point) (S75) +- [Canonical spec over broadcast](feedback_canonical_spec_over_broadcast.md) — adap khi anh trỏ LỆNH canonical → pull command/§P/ledger, ĐỪNG phỏng-theo broadcast cô-đọng; report-before-stamp (S79) +- [Review presentation & stale config](feedback_review_presentation_and_stale_config.md) — review độc-lập bắt honesty-PRESENTATION gap + stale-config đánh-lừa reviewer; tighten-wording + re-measure TRƯỚC review (S81) +- [Derived-flush = execution](feedback_derived_flush_execution.md) — derived-doc flush khớp canonical owner-set = em-main tự làm KHÔNG gate; chỉ ĐỔI con-số/policy = quyền anh (S84) +- [Root-cause over symptom](feedback_root_cause_over_symptom.md) — bug lặp sau band-aid → truy field/case LỆCH-quy-ước vào pattern đã-đúng = fix 1 chỗ; verify "tạo lỗi MỚI còn lặp?" (S85, #72/#73) · **+S122 anh nêu: (i) được-chỉ-1-chỗ ⇒ PHẢI grep cùng-lớp (script thứ-2 lòi ra khi anh hỏi — thoát vì MAY) · (ii) 🔴 bài-học nằm-trong-context KHÔNG tự bật (file này auto-inject mà lead vẫn vá triệu-chứng; +SHA-bịa tái-phạm sau 1 NGÀY) ⇒ chặn được = LUẬT soi-được, không phải trí-nhớ · chứng: hardcode sống 27 ngày qua 1 đợt "double-check" vì nó hỏi "logic đúng?" mà logic VẪN đúng · truy-gốc ≠ tự-sửa-gốc (harness owns → R6 hỏi hub)** +- [Cardinality change grep consumers](feedback_cardinality_change_grep_consumers.md) — đổi field single→multi = grep MỌI consumer; sửa write-site sót read-site → vỡ feature (S87/S88 PE multi-winner) +- [Prod config: inspect-before-change](feedback_prod_config_inspect_before_change.md) — đổi config prod = inspect LIVE trước (runbook STALE); backup→apply→verify-LIVE→commit; replicate mọi rule cũ + delta (S88) +- [Wipe durability — check re-seed](feedback_wipe_durability_check_reseed.md) — sau prod-wipe audit seeder: ungated per-code seed RE-ADD mỗi restart; gate sau env-flag + verify-by-restart-THẬT (S91, #75/#76) +- [Verify deployed artifact byte-level](feedback_verify_deployed_artifact_byte_level.md) — UAT "fix chưa ăn" sau deploy → curl-grep bundle prod byte-level (cache≠deploy); incognito=golden-test (S96, #77) +- [Agent return-garble recover](feedback_agent_return_garble_recover.md) — sub trả wrong-slice-of-transcript thay verdict (#53, **×20 qua S118**) → recover: **(0) WRITE-lane→disk-truth (git+build+test) · VERIFY-lane→em-main-re-curl+sqlcmd (2-nguồn-khớp)** → (1) diary → (2) SendMessage-resume in-session → (3) em-main solo; garble ∝ reasoning-lane; **WRITE-lane garble≠mất-code** (S114 ×5); cicd tái-phạm dai + tự-dán "CLEAN-return" sai (harvest-curator bắt S118) +- [H18 ghost-wire + stamp-integrity](feedback_h18_ghostwire_stamp_integrity.md) — hash-verify TRƯỚC khi áp broadcast (bắt stamp-then-edit THẬT → HELD + re-stamp); ghost-wire 2 class (cron-claim CronList=0 · config-key defined-but-unread); KHÔNG stamp run-id chưa chạy (S100) +- [Resume premise re-verify](feedback_resume_premise_reverify.md) — re-verify tiền-đề từ ĐĨA trước execute (header+git-date, match NỘI-DUNG KHÔNG tên-file 1:1); **S121: bảng-kế-hoạch ≠ đĩa — "không-ai-được-giao" ≠ "chưa-làm"; khẳng-định trạng-thái-đĩa = phải chạm đĩa 1 lệnh**; +bẫy `grep -c` (dòng) vs `-o|wc -l` (occurrence) trên mega-line; +acceptance literal tự-lão-hoá (S109/S121) +- [Permission grant = 2 layers](feedback_permission_grant_two_layers.md) — cấp/verify quyền = display-layer (menu CanRead) ⟂ API-authz-layer (controller `[Authorize(Policy)]`) 2 tầng ĐỘC-LẬP; grep authz controller đích TRƯỚC khi tin grant (menu-ẩn ≠ API-đóng; `[Authorize]` trần = lỗ hổng); reviewer-adversarial bắt, em-main-solo sót (S118, #82) +- [Meta-count self-coverage blind-spot](feedback_meta_count_selfcoverage_blindspot.md) — lead ĐO tốt (~80% đúng) nhưng ĐẾM-VỀ-MÌNH sai (~13%, tập trung TRỌN ở meta-count/coverage); "vá 19 finding" khi thật 23 = con-số đóng vai đã-phủ-hết → bảng disposition TỪNG DÒNG thay số tổng; giữ kết-luận thì giữ cả caveat (S119) +- [Return terminates agent](feedback_return_terminates_agent.md) — CẤM lệnh "trả verdict TRƯỚC, làm việc SAU" = bất-khả-thi vật-lý; sub mô-tả ý-định rồi tắt → claim-sai mà lỗi ở LỆNH lead; thứ-tự đúng = làm→verify→return, hoặc lead ghi on-behalf sau VERIFY-đĩa (S119) · **+S123: prompt-đúng KHÔNG chặn được #53** (cấm bẫy từ prompt đầu cho cả 3 sub, cả 3 vẫn garble ×4) ⇒ chặn được = **ghi-đĩa-TRONG-lúc-làm** (harvest-curator vớt ngay từ đĩa; 2 vai kia phải resume) + resume-in-session; reviewer **tự rút luật "ghi diary TRƯỚC return"** từ garble-1 và nhờ đúng nó mà garble-2 vớt được +- [Citation-trap self-reference](feedback_citation_trap_selfreference.md) — doc định-nghĩa anti-pattern TẤT-YẾU chứa mẫu đó ⇒ detector khớp-mẫu bắt chính nó, **lây qua trích-dẫn** (3 đời/1 wave); discriminator = **enclosure use⟂mention**, KHÔNG port charset-guard; vá 1 CLASS ⇒ grep MỌI matcher cùng-lớp TRONG diff (gen-2 xảy ra thật) +- [Goodhart: rời tập-đo](feedback_goodhart_leave_measurement_set.md) — "vá" bằng đổi HÌNH-DẠNG thứ đang bị đo = rời tập-đo; **flag-count giảm trông y hệt thành công** ⇒ hỏi "cái mất đi là dương-giả hay CHỨNG-NHÂN?"; kể chuyện bằng THÀNH-PHẦN không bằng tổng; +2 phép thử rẻ (trục-nào-KHÔNG-có-ca · áp-luật-cho-nhánh-anh-em) + +## Project — ongoing decisions / context +- [H22 WAL session-continuity](project_h22_wal_session_continuity.md) — sổ WAL ≤40 + Stop-hook persist VERIFIED-RUNTIME S111 (hot-reload ENV-DEP #2/#3) + /pause·/tiep 1-đường + squash wal: + FLIP run-trace ≥3-task + D10 AS-6-taxonomy-đổi; hook PS1 KHÔNG bash (PATH 3-context); pilot kill/đổi-acc pending +- [Model-tier evolution → worker-tier-pin S124](project_harness4_two_tier_model.md) — H4 two-tier → H8 all-inherit → **S124 worker-tier-pin (14/14 sub = opus+effort:max, lead owner-choice, Fable qua /fable-real)**; H23-precedence nay testable ở Opus (chờ restart); restart-lesson: EDIT-agent-tồn-tại/command cần restart (hot-reload ENV-DEP, agent-MỚI khác) +- [database-agent verified + local-drift catch](project_database_agent_verified_local_drift.md) — verified-runtime S53; read-advisory DB lens bắt committed-but-unapplied-local mig (green tests+prod miss) +- [HoSoLink open-from-web browser block](project_hosolink_open_from_web_browser_block.md) — web KHÔNG click-open file:// từ https (browser block); chỉ Edge GPO `IntranetFileLinksEnabled` one-click; FE render + Copy fallback (S67) +- [Harness 1·2·3 adopt](feedback_harness_123_adoption.md) — roster 8→10 (+2 monitor INFORM-only tooling-auditor+harvest-curator) · email channel `broadcasts/` self=se; verified-runtime S50 +- [7-agent split upgrade](feedback_7agent_split_upgrade.md) — multi-agent 4→7: backend/frontend split + test-specialist, budget +50%, split theo trục workload (S39) +- [Phase 10 NamGroup port](feedback_phase10_namgroup_port.md) — port 11 module; scope FULL / DB single dbo / reuse WF V2 ApplicableType / rollout per-module (S32) +- [Skeleton-first aggressive finish](feedback_skeleton_first_aggressive_finish.md) — "finish cho xong" → schema FULL + logic SKELETON defer, trade-off ghi commit + UI banner (S38) + +## Pattern — reusable scaffold +- [Declarative KIND_CONFIG](feedback_declarative_kind_config_pattern.md) — single-page multi-kind CRUD via `:kind` URL + `KIND_CONFIG: Record` (S29/S35) +- [Pattern 12-ter — N-satellite scaffold](feedback_within_module_n_satellite_scaffold.md) — within-module N-satellite CRUD: 1 mega file N `#region` + controller extend (S34) +- [Real-data master import](feedback_realdata_master_import.md) — Excel master data qua UNGATED DbInitializer idempotent seed → reaches prod; extract→spec→Dev-proof→cicd-check (S55, Mig 48) +- [Multi-entity create + self-committing codegen](feedback_multi_entity_create_self_committing_codegen.md) — N entity cần mã codegen TỰ-COMMIT → gen TẤT mã TRƯỚC (local) → atomic final SaveChanges no-partial (S88) +- [Prod screenshot → docx pipeline](feedback_prod_screenshot_to_docx.md) — chụp prod khoanh-đỏ chèn Word: PowerShell `CopyFromScreen`+Win32-lọc-chrome + DOM overlay + python-docx; prod xem-only (S90, #74) diff --git a/.claude/auto-memory/feedback_7agent_split_upgrade.md b/.claude/auto-memory/feedback_7agent_split_upgrade.md new file mode 100644 index 0000000..df51a05 --- /dev/null +++ b/.claude/auto-memory/feedback_7agent_split_upgrade.md @@ -0,0 +1,70 @@ +--- +name: feedback-7agent-split-upgrade +description: SOLUTION_ERP S39 multi-agent 4→7 upgrade — BVAAU pattern adapted (backend/frontend split + test-specialist) + budget +50% + 5 RAG MCP + anti-truncation rules +metadata: + node_type: memory + type: project + tags: + - decision + - multi-agent + - governance + - infra + phase: phase-10-to-11 + originSessionId: 2a3ce6e1-edc5-464d-a436-38c8ed876dde +--- + +# Multi-agent 4→7 Upgrade (Session 39 — 2026-05-29) + +**Trigger:** Anh main "tham khảo cấu hình 7 sub-agent BVAAU → tăng tốc + chất lượng → budget +50% + thêm 3 agent". Chốt qua AskUserQuestion 2 câu. + +## Decision chốt (AskUserQuestion S39) + +1. **Implementer split = Backend / Frontend** (KHÔNG domain/infra như BVAAU) + - Lý do: SOLUTION_ERP có 2 React FE app riêng (admin + user) + FE mirror SHA256 là pain point chính (Pattern 16-bis 9×). Tách FE specialist → giảm gotcha #53 truncation khi BE+FE cùng spawn (đã gặp 5×). Mỗi spawn nhẹ hơn. +2. **test-specialist dedicated** = full test layer (2 implementer KHÔNG viết test) + +## 7-agent final (color-coded) + +| Agent | Color | Scope | +|---|---|---| +| investigator-codebase | cyan | INTERNAL SQL/EF/grep/reference mirror | +| investigator-api | blue | EXTERNAL docs/CVE/lib eval/cross-project | +| implementer-backend | yellow | .NET Domain+App+Infra+Api | +| implementer-frontend | orange | FE 2 app cookie-cutter SHA256 mirror | +| test-specialist | purple | tests/ dedicated xUnit | +| reviewer | red | adversarial pre-commit + live curl | +| cicd-monitor | green | post-deploy Gitea + bundle + smoke | + +## Adapt KHÁC BVAAU (anh cho phép "không bắt buộc giống") + +- **backend/frontend** thay domain/infra (2-FE-app fit) +- **Giữ 6 skill proven** (BVAAU Phase 0 = 0 skill, codebase rỗng). Investigator extract verdict: BVAAU config = **aspirational template chưa battle-test** (VIPIX guide reference không tồn tại) → SOLUTION_ERP port trục split CÓ CHỌN LỌC, giữ lợi thế 38-session battle-test. + +## Port TỪ BVAAU + +- Trục split research(2) + implement(2) + quality(3) +- **+3 RAG MCP** all 7 agent: `search_code` (BM25, prefer over Read full file — tiết kiệm token) + `store_memory` + `list_projects` (2→5 tools). MCP server verified support. + +## Token budget +50% + +- Prior: ~700K opt / ~1.35M heavy → **Now: ~1.05M opt / ~2M heavy ceiling** +- Justify: parallel BE+FE+test giảm wall-clock + split nhẹ giảm truncate + test-specialist clear coverage gap backlog +- Max 20× plan absorbs ~5× comfortable + +## Anti-truncation rules (gotcha #53/#54/#55 codified README) + +- Brief WRITE agent ≤ 8K (heavy spec ~10K → truncate risk #55) +- Curate MEMORY pre-spawn nếu > 25KB (#53) +- Agent entry ≤ 1.5K chars (frontmatter rule mỗi agent) +- 529 Overload (#54) → em main solo fallback, KHÔNG retry loop +- Pre-supply reference snippet trong brief nếu cần > 4 reference file + +## How to apply (cross-session) + +- **CLI restart BẮT BUỘC** sau đổi agent definition (per S27 model:inherit lesson) → registry hot-reload. Verify smoke spawn 3 agent mới. +- Memory folder rename: investigator→investigator-codebase + implementer→implementer-backend (giữ history). Khi SendMessage flush agent CŨ trước restart → ghi nhầm folder rename → conflict. Wrap session đổi config: em main proxy synthesize, KHÔNG SendMessage flush. +- Decision tree split-routing: Read internal→codebase, Read external→api, WRITE .NET→backend, WRITE FE→frontend, test→test-specialist. + +**Reusable pattern cross-project:** Khi scale multi-agent, split theo TRỤC WORKLOAD THỰC TẾ của project (SOLUTION_ERP = 2 FE app → backend/frontend) thay vì copy nguyên pattern reference project. Reference project có thể aspirational chưa battle-test → verify trước khi port. + +Related: [[feedback-implementer-truncation-mitigation]] [[feedback-multi-agent-setup]] diff --git a/.claude/auto-memory/feedback_agent_cwd_relative_memory_misland.md b/.claude/auto-memory/feedback_agent_cwd_relative_memory_misland.md new file mode 100644 index 0000000..000d5f9 --- /dev/null +++ b/.claude/auto-memory/feedback_agent_cwd_relative_memory_misland.md @@ -0,0 +1,19 @@ +--- +name: feedback_agent_cwd_relative_memory_misland +description: "Sub-agent cd vào subdir (src/Backend, fe-admin) rồi Write MEMORY relative-path → stray .claude/ trong subdir, canonical thiếu delta; em main session-end PHẢI git-status scan + reconcile + proxy-harvest" +metadata: + node_type: memory + type: feedback + originSessionId: 7671838c-e743-496d-ab52-30d30ddedbda +--- + +Khi sub-agent `cd` vào subdir (vd `src/Backend`, `fe-admin`) để build/test rồi Write `MEMORY.md` bằng **relative path**, file rơi vào `/.claude/agent-memory//` (stray) thay vì canonical repo-root `.claude/agent-memory//`. Hệ quả: agent report "MEMORY updated ✓" nhưng **canonical thiếu delta** + stray dir lọt vào `git status` (nguy cơ commit nhầm vào source tree). + +**Why:** S54 — 3 agent (implementer-backend/frontend, test-specialist) đều cd subdir → 2 ghi nhầm `src/Backend/.claude/`. Bắt được vì: (1) `git status` hiện `?? src/Backend/.claude/`; (2) canonical MEMORY của chúng KHÔNG hiện `M` dù agent claim updated; (3) grep canonical = 0 match S54. Đây là biến thể của [[feedback_session_end_memory_write_verify]] (0-byte/lost-write) + [[feedback_monitor_residual_write_containment]] (sub Bash/Write residual G-015): write THÀNH CÔNG nhưng SAI CHỖ. + +**How to apply (em main session-end, BẮT BUỘC):** +- `git status --short` → scan `?? **/.claude/` ngoài root (find `fe-*/.claude`, `src/**/.claude`, `tests/**/.claude`). Có = stray. +- Cross-check: agent claim "MEMORY updated" nhưng `git diff --stat .claude/agent-memory//MEMORY.md` empty + `grep -c ""` canonical = 0 → write mis-landed. +- Reconcile: move file VALUABLE (pattern_*.md) stray→canonical (KHÔNG mất content) → `rm -rf /.claude` → APPEND delta vào canonical MEMORY từ agent return-message (em main single-writer proxy, B2/B3 no-overwrite-unverified). +- KHÔNG commit stray vào source tree. Verify `git status` sạch sau reconcile. +- Backstop = git-diff commit-gate (em main review mọi non-em-main path trước commit) — KHÔNG dựa agent self-report. diff --git a/.claude/auto-memory/feedback_agent_kill_recovery.md b/.claude/auto-memory/feedback_agent_kill_recovery.md new file mode 100644 index 0000000..c1047b4 --- /dev/null +++ b/.claude/auto-memory/feedback_agent_kill_recovery.md @@ -0,0 +1,23 @@ +--- +name: feedback-agent-kill-recovery +description: External kill (session-limit) / truncation / die-0-byte (resume-kill) of spawned agents → recover via on-disk/prod truth + em-main-solo fallback + curl-self-verify + evidence-checklist self-gate; agent return-message ≠ source-of-truth +metadata: + node_type: memory + type: feedback + originSessionId: 330bbef5-f7e6-4d7f-8d37-7df5ea9f0b04 +--- + +Khi sub-agent bị **kill (session-limit) hoặc truncate (gotcha #53) hoặc die-0-byte (resume-kill) giữa task**, work KHÔNG mất — recover qua source-of-truth THẬT, KHÔNG dựa agent return-message. + +**Why:** S52 (2026-06-08) — session-limit kill 3 agent mid-Wave-2 (FE 0-file-ghi, test file-ghi-xong-mất-report, cicd verdict-mất) + Wave-2 BE return truncated ("Now apply to LocalDB..."). TẤT CẢ recoverable vì work nằm trên disk/prod, không trong return-message. 0 việc mất, 0 prod bug. **S57bis (2026-06-11) thêm class #3 "die-0-byte":** 2 reviewer-spawn liên tiếp output-file 0-byte không return gì (quanh user `--resume` — resume-kill); CÙNG session 2 implementer return-truncated mid-task (BE chết trước migration+projection-3, FE chết giữa mirror fe-admin) → em main solo vá cross-stack + tự gate; ship sạch 240 test + prod. + +**How to apply:** +- **Agent return = KHÔNG source-of-truth.** Verify THẬT: `git status`/`git diff` (file đã ghi gì) + `dotnet build`/`dotnet test` (compile+pass) + đọc file đã sửa. +- **Killed agent để lại work-on-disk:** file đã ghi + build/test pass → COMPLETE, chỉ mất report/MEMORY-step → em main proxy-append diary next. +- **Agent 0-file (killed sớm)** → em main solo redo (gotcha #53-class boundary fallback, proven S37/S52 FE 2-app SHA256). +- **Die-0-byte detect (S57bis):** `Get-Item ` size=0 + LastWrite im >5' → coi như chết, ĐỪNG đợi notification. KHÔNG spawn lại >2 lần cùng vai trong session có resume — chuyển fallback. +- **Reviewer-spawn chết ×2 → em main SELF-GATE evidence-checklist** (proven S56 StructuredOutput-fail + S57bis die-0-byte): mỗi điểm hệ trọng = 1 lệnh evidence (grep key-set authz, grep role-string vs AppRoles const, đọc Mig Up/Down) + backstop independent tests; ghi HONEST "self-gate + lý do" vào commit message/log/email — không giấu. +- **cicd-monitor unavailable** → em main **curl-self-verify** prod (health 200 → app booted → mig applied · endpoint 401-wired-not-404 · bundle-hash-rotate) thay spawn. +- **Limit pressure → giảm spawn:** em-main self-review (cross-check ground-truth: seed↔query dept-code, role-string vs AppRoles) thay reviewer-spawn; curl thay cicd-spawn. Đánh đổi: mất adversarial-independence → bù bằng cross-check thủ công + build/test/curl evidence. + +Mở rộng [[feedback-implementer-truncation-mitigation]] (self-truncation mid-MEMORY) sang external-kill + resume-kill. Cùng nguyên lý: **git/disk/prod = truth, agent-message = không**. diff --git a/.claude/auto-memory/feedback_agent_return_garble_recover.md b/.claude/auto-memory/feedback_agent_return_garble_recover.md new file mode 100644 index 0000000..0d7b5a2 --- /dev/null +++ b/.claude/auto-memory/feedback_agent_return_garble_recover.md @@ -0,0 +1,14 @@ +--- +name: agent-return-garble-recover +description: "sub trả text memory-curation thay verdict (#53 return-garble) → recover từ agent-memory, KHÔNG re-spawn" +metadata: + node_type: memory + type: feedback + originSessionId: 67157d21-1ead-475d-9a50-cf7f07468583 +--- + +Sub-agent đôi khi trả về message CUỐI = text bước memory-curation của nó ("Still 18KB, let me trim...", "Memory updated, splice correct...") THAY VÌ verdict/findings của task (#53 return-channel garble). Nhưng WORK + agent-memory diary VẪN ĐÚNG (nó làm task xong, ghi diary chuẩn, chỉ return nhầm text bước cuối). **Recover: đọc `agent-memory//MEMORY.md` recent-entry lấy verdict thật — KHÔNG re-spawn** (tốn + có thể garble tiếp; hoặc em-main re-do solo cho task cần chắc). Instruction-fix spawn-prompt "🔴 message CUỐI PHẢI là verdict, KHÔNG phải memory-note" GIẢM garble nhưng KHÔNG 100%. + +**Why:** S96 ×3 + **S97 ×3 = ×6 tổng** (cicd-monitor = 5/6 = kẻ tái phạm dai). S96: investigator-codebase 1× + cicd-monitor 2×. **S97: cicd-monitor ×3** (#481 "18.7KB above" + #482 "18.1KB trim S79/S93" + #484 "DATA-SEED-PASS keys merge") — ĐỀU garble text trim-memory **DÙ spawn-prompt explicit "return verdict NOT memory-curation"** → instruction-fix **KHÔNG reliable** (bác claim S96 "lần-3 fixed"); recover verdict từ diary (Run #481 + #482 đủ chi tiết: Mig 60 applied + EF-ternary 200-live + bundle) KHÔNG re-spawn. **🔴 Root-cause structural (mới S97):** cicd-monitor MEMORY.md tự đặt target ~17.1KB, mỗi return CHẠM cap → curate-at-return, và "thinking" bước curate = message CUỐI = return value. Fix bền = **giảm áp lực curate** (archive cicd sớm để return KHÔNG trùng curate-step) HOẶC hook tách verdict-return khỏi memory-step — KHÔNG phải instruction. **Chốt:** recover-from-diary = net ROBUST; instruction "return-verdict" chỉ giảm tần suất (persona memory-curation stochastic — giống AS-10 self-write S95). **+ schema-param KHÔNG chặn return-fail (S97 review-workflow):** 2/4 lane (reviewer+investigator) FAIL StructuredOutput DÙ có `schema` ép-call → return-reliability rộng hơn curate-garble; recover từ diary (reviewer) + em-main tự-cover (grep). → lane QUAN-TRỌNG luôn cần fallback recover-diary/em-main-solo, đừng tin schema chặn được 100%. **+ S103 ×3 = ×9 tổng** (investigator recon + 2 review-lane, DÙ schema+nudge). 🔴 **NEW correlation task-shape (S103):** build-workflow lane NARROW-scoped ("viết script X + return schema") **3/3 CLEAN** vs review-workflow lane OPEN-reasoning ("cố phá + phán-xử") **1/3** → **garble ∝ open-ended-reasoning-task, KHÔNG narrow-build** (cùng schema/nudge/model). Lane-B garble-return NHƯNG full-review Ở DIARY → recover-from-diary hoàn-chỉnh (verdict PASS + 2-CONCERN). → **mitigation = N-lane-redundancy (1 survivor phủ redundant core-concern) + narrow-scoped-schema-lane + em-main-recover-partial** (SE adap-request lên AI_INFRA S103). **+ S105 ×2 = ×11 tổng** (tooling-auditor @bootstrap trả NOTE-DỞ-DANG mid-work + investigator BVAAU trả CÂU MỞ ĐẦU — cả 2 reasoning-lane khớp correlation S103; class RỘNG hơn curate-text: return = wrong-slice-of-transcript bất kỳ, kể cả dòng đầu). 🔴 **NEW recover-path (S105): diary TRỐNG (sub chưa kịp ghi entry cho task đó) → SendMessage-RESUME chính agentId trong-session** (context 150K còn sống) với yêu cầu "nhả verdict theo format, KHÔNG investigate thêm" → verdict đầy đủ chất-lượng-cao lần 2 (investigator BVAAU 3-Q RCA hoàn chỉnh, ~3'). Thứ tự recover: **(1) diary → (2) SendMessage-resume in-session → (3) em-main re-do solo.** **+ S110 ×2 = ×13 tổng** (invest + reviewer — CẢ 2 lane Fable-deep-pass engine-đắt, khớp correlation reasoning-lane; return = 1 câu status giữa-chừng). Cả 2 diary TRỐNG → **SendMessage-resume 2/2 SẠCH → path-2 lifetime 3/3** (S105 + S110×2) — resume re-emit verdict đầy-đủ chất-lượng-cao, 0 investigate lại. Path-2 = default khi diary trống, robust hơn dự đoán. (+monitor-return transcript-LOST khác class: S109 cicd + S110 lượt-sáng 2 monitor — work+diary XONG nhưng return không tới context; disk-diary cứu — WATCH tần suất riêng.) **+ S114 ×5 = ×18 tổng** (review-lane + BE + FE + test + cicd — HMW implement + verify workflow, lead=Opus). 🔴 **NEW class WRITE-lane-garble (S114 quan-trọng):** lane GHI CODE (implementer-backend/frontend/test) garble return → recover KHÔNG từ diary (write-lane không có verdict-diary) mà từ **DISK: `git status`/`git diff` + `dotnet build`/`dotnet test`** ([[feedback_agent_kill_recovery]]). BE-lane 6-file+mig verify-diff-đúng+compile-sạch; FE-lane garble GIỮA mirror → chỉ fe-admin xong (git-status thiếu fe-user) → em-main `cp fe-admin→fe-user` + SHA-verify; test-lane 7-file → `dotnet test` 482 xanh. **Workflow-tool teeth (chốt):** stage-1 `await agent()` TRỰC-TIẾP → 1 garble throw **giết cả workflow** (FE+test stage-2 không chạy); dùng **`parallel()` = thunk-garble→null, workflow SỐNG** → verify-từ-disk bất-kể return. Với WRITE-lane, **return chỉ nice-to-have, DISK = ground-truth**. cicd-lane ×5/6-tổng tái phạm dai → em-main-solo curl-verify (bundle-rotate + byte-verify + smoke). Path recover mở-rộng: **(0) WRITE-lane → disk-truth (git+build+test) → (1) diary → (2) SendMessage-resume → (3) em-main solo.** **+ S118 ×2 = ×20 tổng** (cicd-monitor ×2 — CẢ 2 verify-lane deploy-durability garble return memory-curation ["#388 entry compress prior" + "older stubs archived, tighten longest"], khớp correlation reasoning-lane + cicd tái-phạm dai nhất). 🔴 **VERIFY-lane recover (S118) = READ-lane biến-thể của WRITE-lane disk-truth:** cicd verify-deploy garble → **em-main-solo re-verify từ prod ĐỘC-LẬP** (curl health/401/bundle + `ssh sqlcmd` Serilog/permission-state) → **2 nguồn ĐỘC-LẬP khớp** = verdict chắc. verify-lane garble ≠ mất-việc (verify là READ prod, em tự làm lại được, KHÔNG cần agent). **Serilog log-line = bằng-chứng mạnh nhất** ("Revoked 9"→"Seeded 9 upgraded" 44ms = seeder-thắng-revoke durable, mạnh hơn end-state-DB đơn-thuần). Chốt tổng: WRITE→disk · VERIFY→em-main-re-curl+query · REASONING→diary/resume. + +**How to apply:** sub return text lạ (memory-curation/off-topic) → ĐỪNG tin nó fail/vô-dụng; đọc diary lấy kết-quả. Task-cần-chắc (bug-reasoning) → em-main re-do solo (reliable). Liên [[feedback_agent_kill_recovery]] · [[feedback_workflow_fanout_reliability]]. diff --git a/.claude/auto-memory/feedback_aiinfra_adap_channel.md b/.claude/auto-memory/feedback_aiinfra_adap_channel.md new file mode 100644 index 0000000..f0dffa1 --- /dev/null +++ b/.claude/auto-memory/feedback_aiinfra_adap_channel.md @@ -0,0 +1,21 @@ +--- +name: feedback_aiinfra_adap_channel +description: "AI_INFRA federated adoption via /adap-apply|report|request slash-commands — read outbox, apply own repo, write adap-report; sister judges project-fit; store_memory strip lead=sole-writer" +metadata: + node_type: memory + type: feedback + originSessionId: 9ef28cca-d0ce-4940-bc76-8c2ce115c181 +--- + +AI_INFRA dựng kênh adoption federated KHÔNG-copy-paste (S47, 2026-06-02): AI_INFRA publish broadcast → `D:\Dropbox\CONG_VIEC\AI_INFRA\broadcasts\outbox\*.md`; SE đọc (read-only) + áp bằng 3 slash-command trong repo MÌNH (`.claude/commands/`): **`/adap-apply `** (đọc outbox → áp FUNCTION-floor + tailor FORM theo roster THẬT → ghi `docs/governance/adap-reports/.md` 5-trường LOCK) · **`/adap-report all-applied`** (formalize nấc G-011 + evidence) · **`/adap-request`** (đề-xuất NGƯỢC lên AI_INFRA, §M-gated cần lý-lẽ+bằng-chứng). **§J2: CHỈ ghi repo MÌNH**; AI_INFRA `/adap-audit` đọc cross-repo verify 2-way (KHÔNG copy-paste report về). + +**Why:** charter v2 — AI_INFRA owns infra mechanism (quyết cơ chế), sister judges project-fit + tự-chủ product. Kênh này thay paste-prompt thủ công, self-sustaining. + +**How to apply:** +- Broadcast `.md` → **restart CLI mới live** (no hot-reload). **Front-load broadcast cần sửa agent/.md NGAY** để ride chung 1 restart với command-install (tránh 2 restart — bài học S47). +- Mỗi broadcast đọc PROJECT-FIT → **adopt** (áp floor + tailor form) / **n-a** (không hợp, KHÔNG phải behind) / **pushback** (§M lý-lẽ+bằng-chứng qua adap-report/adap-request). Nấc honest: executed-file ≠ verified-runtime (chờ restart/spawn-test) ≠ verified (AI_INFRA cross-audit). +- **store_memory GỠ khỏi MỌI sub** (broadcast Memory-strip) → **lead (em main) = sole RAG-writer**; sub ghi finding → MEMORY.md (file). Em main GIỮ store_memory. G-015: GỠ tool ≠ sub "read-only" (sub vẫn Bash/Write) — đừng overclaim. +- **frontend-designer = 8th sub (pink)** FD1–FD10 visual-verify floor — adopt khi project CÓ FE-design work; phân vai design/UX ⟂ implementer-frontend mechanical-mirror. +- **Verify nấc post-restart (S48 closure):** **registry-inspection = bằng-chứng runtime hợp-lệ** cho tool-strip — loaded agent tool-grant là authoritative, KHÔNG cần spawn chỉ để confirm `store_memory` đã gỡ (registry 0/8 subs = verified-runtime). NHƯNG **agent-LOADS ≠ capability-RAN**: frontend-designer loads-OK (registry) chỉ verify frontmatter hợp-lệ; FD2 visual-loop "chạy thật" cần **spawn-test design-task thật** (proven S48 — login a11y fix, screenshot viewed). Đóng đúng nấc: load-verified < loop-ran < AI_INFRA-cross-audited. + +Liên kết: [[feedback_aiinfra_charter_v2]] · [[feedback_store_memory_rebootstrap_protection]] · [[feedback_high_to_max_multiagent_quality]] · [[feedback_session_end_memory_write_verify]] diff --git a/.claude/auto-memory/feedback_aiinfra_charter_v2.md b/.claude/auto-memory/feedback_aiinfra_charter_v2.md new file mode 100644 index 0000000..1552366 --- /dev/null +++ b/.claude/auto-memory/feedback_aiinfra_charter_v2.md @@ -0,0 +1,24 @@ +--- +name: aiinfra-charter-v2 +description: "Charter v2 (2026-05-29) — AI_INFRA owns infra (RAG/MCP/agent/skill) PRIMARY; SOLUTION_ERP team focus product, phản biện infra only khi derail project" +metadata: + node_type: memory + type: feedback + originSessionId: 826389df-9366-4091-aa33-78a7a36d2845 +--- + +2026-05-29 broadcast từ AI_INFRA (em main infra coordinator), anh pqhuy chốt. Điều chỉnh charter 2026-05-26 ("team tự quyết infra 100%" → giờ "phản biện only"). + +**Phân vai:** +- **INFRA (RAG/MCP/governance/agent/skill):** AI_INFRA LÀM CHÍNH + quyết config chuẩn. Cách làm: AI_INFRA ra template/config mẫu + broadcast → team **tự apply vào repo mình** (`.claude/`). AI_INFRA KHÔNG sửa trực tiếp repo team. RAG re-index/embedding pipeline (VOYAGE_API_KEY, `bootstrap.py`) = **AI_INFRA's op**, không phải team. +- **Team (SOLUTION_ERP) infra stance:** CARE TỐI THIỂU — focus product, KHÔNG theo sát mọi thay đổi infra (tránh loãng context). CHỈ **phản biện** khi infra change làm LỆCH HƯỚNG project (vd "chunk 512 không hợp project nhiều code"). KHÔNG tự ý re-architect agent/RAG/skill divergent với standard AI_INFRA. +- **PRODUCT (code BE/FE/DB, business logic):** Team TỰ CHỦ tuyệt đối. AI_INFRA không đụng. +- ⚖️ **Ranh giới infra vs content (bulletin 2026-05-29 §38):** "infra config" = **CƠ CHẾ RAG vận hành** (chunk size, auto_reindex mode, anatomy gate, eval structure, **memory policy**) → AI_INFRA quyết. CÁCH team **phân loại nội dung CỦA MÌNH** (phase enum / bounded-context enum riêng project) = **TEAM tự quyết**, AI_INFRA KHÔNG đụng. Gọn: AI_INFRA quyết "RAG chạy thế nào", team quyết "nội dung mình là gì + phân loại ra sao". +- Conflict không thống nhất → anh pqhuy phân xử (quyết cuối). + +**How to apply (behavior change):** +- Cần thay đổi infra lớn (agent split, RAG config, skill add, MCP) → KHÔNG tự quyết; align AI_INFRA template/broadcast hoặc ping AI_INFRA. Self-apply template vào `.claude/` repo. +- Maintenance repo-local OK tự làm (vd curate agent MEMORY >25KB theo standard trigger, mirror skill matrix) — đó là apply standard, KHÔNG phải diverge. +- Product work (BE/FE/DB/business) vẫn tự chủ 100% như cũ. +- **RAG/Qdrant DOWN @ SE `/session-start` §2.3** (`list_projects` chunk_count=0 across ALL collections = gotcha #14 down-artifact: server off sau reboot, registry đọc cache, `last_indexed_at` còn nguyên = corpus SAFE không mất data) → **FLAG only, KHÔNG tự chạy `rag-infra.ps1`.** AI_INFRA = infra single-point owner (từ 2026-05-30) + thường đã restore trong session-start của chính AI_INFRA (confirmed S115: SE flag → AI_INFRA restore, corpus 2440 Δ0). Nếu có lúc chạy tay: syntax **positional** `scripts\rag-infra.ps1 ensure` (idempotent — đang chạy thì báo healthy rồi thoát), KHÔNG phải `-Action ensure` (em đã parrot nhầm từ error-string S115). +- Detail: `AI-INFRA-CHARTER-2026-05-26.md §1.1`. diff --git a/.claude/auto-memory/feedback_background_spawn_visibility.md b/.claude/auto-memory/feedback_background_spawn_visibility.md new file mode 100644 index 0000000..a6edd1e --- /dev/null +++ b/.claude/auto-memory/feedback_background_spawn_visibility.md @@ -0,0 +1,21 @@ +--- +name: feedback-background-spawn-visibility +description: Long sub-agent / command spawned in FOREGROUND streams no progress — "looks frozen" to anh main. Push to background + report immediately for live visibility. +metadata: + node_type: memory + type: feedback + originSessionId: solution-erp-s45 + revision: repopulated S46 (2026-06-01) — original S45 write produced 0 bytes +--- + +S45 (2026-06-01): Spawn 🟪 test-specialist (viết +27 test rồi chạy — nhiều phút) ở **foreground** → suốt lúc chạy KHÔNG có output nào hiện → anh main thấy "looks frozen" (tưởng treo). Agent thực ra vẫn chạy bình thường; foreground chỉ block + im lặng đến khi return. + +**Why:** Foreground spawn (Agent blocking, hoặc Bash không `run_in_background`) KHÔNG stream tiến độ trong harness này. Task dài (test-gen + chạy, heavy scaffold, `dotnet test` full, `npm build` ×2, agent multi-step) làm UI đứng im → anh main không phân biệt được "đang chạy" vs "treo thật" → mất visibility, dễ interrupt nhầm hoặc mất tin tưởng. + +**How to apply:** +- Sub-agent / command chạy DÀI (>~30s) → đẩy **background** (`run_in_background: true`) thay vì foreground block. Harness auto-notify khi xong → KHÔNG poll/sleep. +- **Report NGAY** lúc vừa spawn: 1 dòng "đã spawn X ở background, đang chạy Y, báo khi xong" → anh main có signal sống. +- Foreground chỉ cho task NGẮN (<30s) hoặc khi cần kết quả ngay để quyết bước kế. +- S45 còn kèm gotcha #53 (test-specialist return truncated) → background spawn + em main verify-on-disk + proxy MEMORY là combo xử lý. + +Related: [[feedback-implementer-truncation-mitigation]] [[feedback-high-to-max-multiagent-quality]] [[feedback-7agent-split-upgrade]] diff --git a/.claude/auto-memory/feedback_canonical_spec_over_broadcast.md b/.claude/auto-memory/feedback_canonical_spec_over_broadcast.md new file mode 100644 index 0000000..6727f1b --- /dev/null +++ b/.claude/auto-memory/feedback_canonical_spec_over_broadcast.md @@ -0,0 +1,18 @@ +--- +name: feedback_canonical_spec_over_broadcast +description: "Adap-apply — khi AI_INFRA trỏ tới một LỆNH/spec canonical, pull canonical thật (command-files + §P + ledger) đừng phỏng-theo broadcast; + report-before-stamp dogfood + residual-diary OK" +metadata: + node_type: memory + type: feedback + originSessionId: 2e49ee75-dc7e-4058-9892-66f4ce753c52 +--- + +**Adap-apply: broadcast cô-đọng ≠ spec thật — khi anh/AI_INFRA trỏ tới một LỆNH canonical (vd anh gõ `/user-mark-active-high`), PULL nguyên bản canonical** (`AI_INFRA/.claude/commands/.md` + `CANONICAL-RULES.md §P` + ledger `ACTIVE-MARKS.md`) **rồi áp đúng spec — ĐỪNG dựng bản phỏng-theo từ broadcast.** + +**Why:** broadcast cố-ý cô-đọng (User-Mark mô-tả 4 cấp theo CHỨC-NĂNG, KHÔNG đặt tên). S79 em adopt-từ-broadcast → tự đặt tên cấp MUST/TRACK/ANCHOR/OFF + ledger `decision-marks.md` riêng. Anh gõ `/user-mark-active-high` "áp đầy-đủ chính-xác nhất theo AI_INFRA, không hỏi thêm" → em grep ra 4 lệnh canonical + §P P1-P10 → phải GỠ bản phỏng-theo + align lại (Active-High/Active/Medium/Disable + `.claude/governance/ACTIVE-MARKS.md` + 4 lệnh). Tốn 1 vòng rework. broadcast harness-14 còn ghi rõ "truy-vấn pattern qua cross-project RAG nhắm bên phát" = tín-hiệu spec thật ở repo AI_INFRA. + +**How to apply:** +- Adap governance có **command/§-spec** → đọc canonical TRƯỚC khi author (grep `AI_INFRA/.claude/commands/` + `docs/governance/CANONICAL-RULES.md §X`). Form-autonomy (§F4) cho phép form riêng, NHƯNG khi anh muốn "chính-xác nhất theo AI_INFRA" = match canonical (tên cấp + path + process), KHÔNG bản-mình. +- **report-before-stamp DOGFOOD:** lệnh `/user-mark-active-high` bước-4 BẮT báo-cáo 3-7 tiêu-chí khách-quan + chờ owner confirm TRƯỚC stamp. Em hỏi anh = **đang chạy đúng lệnh**, KHÔNG phải chần-chừ. Cơ-chế neo-lý-tính: AI cũng KHÔNG được tự-niêm chữ-ký người-chủ. RC-sig = `RC-pqhuy1987-dd-mm-yyyy-hh-mm-ss` timestamp lúc anh confirm (lấy `date`), SE tự-niêm KHÔNG mượn dấu AI_INFRA (P1 forward-only). +- **residual-write own-diary OK:** raw-Workflow (KHÔNG hmw.js writeGuard) → role-agent (vd investigator-codebase) tự-append diary CHÍNH NÓ = valid base memory-discipline (D9 single-writer áp canonical/memory-chính/luật, KHÔNG cấm sub ghi diary riêng). Containment: git-diff review trước commit; nếu sub ghi canonical/agent-khác → revert (gotcha S72). Nhưng đẩy L1 over-cap → fold vào curate. +- Liên-kết [[feedback_harness11_engine]] (engine governance) · [[feedback_workflow_fanout_reliability]] (review-fan-out free-text KHÔNG ép-schema). diff --git a/.claude/auto-memory/feedback_cardinality_change_grep_consumers.md b/.claude/auto-memory/feedback_cardinality_change_grep_consumers.md new file mode 100644 index 0000000..038e9dc --- /dev/null +++ b/.claude/auto-memory/feedback_cardinality_change_grep_consumers.md @@ -0,0 +1,18 @@ +--- +name: feedback_cardinality_change_grep_consumers +description: Đổi field single→multi (cardinality) = grep MỌI consumer của field cũ — impl agent sửa write-site nhưng sót dependent read-site (vỡ chính feature vừa thêm) +metadata: + node_type: memory + type: feedback + originSessionId: 1f21f760-be7e-4f90-8c3d-337edd5a4a9b +--- + +Khi đổi 1 field từ single→multi (cardinality), implementer agent sửa đúng chỗ HIỂN NHIÊN (picker/setter/write-site) nhưng SÓT các read-site phụ-thuộc field cũ — và đó là nơi feature MỚI vỡ. + +**Ca thật (S87 Mig 58 PE multi-winner):** winner đổi từ scalar `PurchaseEvaluation.SelectedSupplierId` → tập `PurchaseEvaluationSupplier.IsWinner` per-row. implementer-frontend làm xong picker (tick nhiều ô + tổng) nhưng SÓT **8 chỗ FE** vẫn keyed `selectedSupplierId`: `missingForApproval` (submit-guard), checklist, `computeGiaChaoThau`, `canCreateContract`, 2 display, `winnerSupplierRowId`. Vì `SelectedSupplierId` = **null khi liên-danh ≥2** → multi-winner phiếu bị chặn submit (FE nói "chưa chọn NCC" dù đã tick 3 ông) = vỡ ĐÚNG feature vừa thêm. em-main self-review `grep -rn selectedSupplierId` mới bắt → đổi hết sang `ev.suppliers.some(s => s.isWinner)`. + +**Why:** cardinality change đổi SEMANTIC field cũ (single→có-thể-null/đổi-nghĩa khi multi). Mọi nơi đọc field cũ với giả-định "luôn có đúng 1 giá trị" sẽ sai. Implementer thấy write-path (1 chỗ), không thấy read-path rải-rác khắp codebase. Reviewer/build cũng PASS (TS compile + tests xanh) vì lỗi là LOGIC-runtime cho case multi, không phải type/compile. + +**How to apply:** sau khi đổi cardinality 1 field → `grep -rn ""` TOÀN BỘ FE+BE, kiểm TỪNG site: site này giả-định single? → đổi sang nguồn-sự-thật mới. Self-gate BẮT BUỘC dù impl + reviewer + build PASS — đây là blind-spot điển hình. Mở rộng cho mọi "1→N": single→list, optional→required, enum-thêm-value ([[feedback_root_cause_over_symptom]] họ gotcha #71 proxy-predicate). **Trục thứ 2 — thêm ATTRIBUTE/FLAG mới rendered nhiều surface (S89):** thêm 1 per-level flag `AllowApproverFinalize` (Mig 58) vào Workflow Designer nhưng SÓT surface song-song `WorkflowMatrixViewPage` (build S24 hard-code 7 ``) → anh báo "matrix chưa hiển thị chính xác". Quy tắc: thêm field vào flag-set/attribute-set của 1 entity → `grep` MỌI nơi render set đó (Designer + matrix + flow-panel + chip + DTO projection), không chỉ surface đang sửa. BE thường đã gửi sẵn field; FE-các-surface mới là chỗ sót. Liên quan [[feedback_agent_kill_recovery]] (#53 recover-disk + self-gate) + [[feedback_workflow_fanout_reliability]] (workflow review-lane verify disk độc-lập, trust PASS dù impl-lane return NULL). + +**Trục thứ 3 — DERIVED-INVARIANT ở MUTATION-PATH, enumeration-writer KHÔNG đáng tin (S114 gotcha #81):** đổi winner single→multi per-hạng-mục, `Supplier.IsWinner` thành DERIVED (== `Any(Quote.IsSelected)`). Spec (invest+review) liệt kê writer maintain-invariant "SelectWinner + UpsertQuote(ins+upd) + seed + backfill" NHƯNG SÓT **DeleteQuote + DeleteDetail (cascade)** → xóa quote-selected CUỐI của 1 NCC để IsWinner kẹt stale (Any=false) → `CreateContract Where(IsWinner)` gom NCC phantom → sinh **HĐ giaTri=0**. invest/review/implement ĐỀU sót vì cùng theo enumeration; chỉ **verify adversarial-refute** (lane "thử tìm bug, grep độc-lập MỌI `.Remove(`") bắt. **Quy tắc mở rộng:** cardinality/derived-flag change → grep KHÔNG chỉ read-site + write/select mà MỌI **mutation đổi tập-nguồn: thêm (`.Add`) / sửa (`= field`) / XÓA (`.Remove`) / cascade-delete**. Field-nguồn (`Quote.IsSelected`) → mọi path chạm TẬP quote phải re-establish flag phái-sinh. Read-site-miss ≡ writer-miss ≡ delete-writer-miss — cùng 1 class "consumer/producer bị bỏ sót khỏi enumeration". Enumeration của người KHÔNG đáng tin → grep máy-móc + adversarial-verify. diff --git a/.claude/auto-memory/feedback_citation_trap_selfreference.md b/.claude/auto-memory/feedback_citation_trap_selfreference.md new file mode 100644 index 0000000..b814ffa --- /dev/null +++ b/.claude/auto-memory/feedback_citation_trap_selfreference.md @@ -0,0 +1,20 @@ +--- +name: feedback-citation-trap-selfreference +description: "Detector khớp-mẫu tất-yếu bắt chính tài-liệu định-nghĩa mẫu đó; lây qua trích-dẫn; discriminator = enclosure (use⟂mention), không phải hình-dạng" +metadata: + node_type: memory + type: feedback + originSessionId: 921f30ab-ee81-4d03-b94a-8d99b4e54b57 +--- + +**Tài-liệu ĐỊNH-NGHĨA một anti-pattern thì TẤT-YẾU chứa mẫu của anti-pattern đó ⇒ mọi detector khớp-mẫu sẽ bắt chính nó.** Đây là **hệ-quả CẤU-TRÚC**, không phải lỗi vai, không phải lỗi detector. Và nó **LÂY QUA TRÍCH-DẪN**: mọi doc viết VỀ một dương-giả tự trở thành một dương-giả. + +**Why:** Đo thật @S123 (SOLUTION_ERP) — **3 đời trong đúng 1 wave**: `permission-matrix/SKILL.md:16` (defect THẬT) → `lead-view-auditor.md:45` (trích làm ví-dụ cho class của chính nó) → `adap-report…harness-24…:78` (trích **khi đang GIẢI-THÍCH FP đời-2**). Chỉ có exclusion `runs/` vô-tình chặn 3 file khác cùng trích ⇒ **exclusion đang gánh FP-rate mà không ai thiết-kế cho nó việc đó**. + +**How to apply:** +- **Discriminator = ENCLOSURE, không phải HÌNH-DẠNG.** Anchor trong `` `…` `` = đang **được NHẮC TỚI** (mention) ≠ **được TUYÊN BỐ** (use). Đếm backtick trái match; **LẺ ⇒ skip**. Đo 4/4 ở SE. +- 🔴 **KHÔNG port được guard dùng charset.** H24-2 tách được `[carry:]` nhờ ký-tự `<` mà key thật không bao giờ có. Với anchor thì **ví-dụ byte-identical với claim** — *giống hệt CHÍNH LÀ điểm của một ví-dụ tốt* ⇒ phải **đổi TRỤC**, đừng chép guard. +- 🔴 **Vá 1 CLASS ⇒ grep MỌI matcher cùng-lớp NGAY TRONG DIFF ĐÓ.** Gen-2 xảy ra THẬT: lead viết 30 dòng chứng-minh định-luật này rồi **đẻ ngay detector mới KHÔNG guard**; reviewer bắt. Đặt guard thành **helper DUY-NHẤT greppable** (`Test-Quoted`) để detector kế **thừa-kế** fix thay vì phải tự học lại. Guard phải ở **CẢ HAI phía** (label ⟂ heading), không chỉ phía dễ thấy. +- **Từ chối chồng proxy:** head-N-lines cũng tách 5/5 nhưng vị-trí = **proxy**; backtick đã tách đúng cùng tập ⇒ chồng thêm = 0 lợi đo được + đẻ điểm mù mới. Dùng tín-hiệu thật, đừng dùng cái bóng ([[feedback-root-cause-over-symptom]]). +- **Khai limit:** guard đọc INLINE span thôi; anchor trong fenced ``` block có 0 backtick ⇒ vẫn FP. Đo 0 ca ⇒ để nguyên, đừng vá mù. +- **Cùng họ:** [[feedback-goodhart-leave-measurement-set]] · [[feedback-faultinjection-proves-teeth]] · [[feedback-meta-count-selfcoverage-blindspot]] diff --git a/.claude/auto-memory/feedback_declarative_kind_config_pattern.md b/.claude/auto-memory/feedback_declarative_kind_config_pattern.md new file mode 100644 index 0000000..fce17ca --- /dev/null +++ b/.claude/auto-memory/feedback_declarative_kind_config_pattern.md @@ -0,0 +1,114 @@ +# Pattern Declarative KIND_CONFIG Record — Single-page multi-kind CRUD reuse + +> **Discovered:** S29 Plan CA (Master/Catalogs/CatalogsPage.tsx 321 LOC) — first proven instance. +> **Reinforced:** S35 G-H2 FE Admin (Hrm/HrmConfigsPage.tsx ~470 LOC) — Pattern 2× cumulative cross-module. + +## Pattern + +Single-page handle **N kind** of catalog/config via URL `:kind` param + declarative `KIND_CONFIG: Record`. KHÔNG split N page riêng (clutter routes + duplicate boilerplate). + +### Structure +```tsx +type Kind = 'kind-a' | 'kind-b' | ... // union literal (TS6 erasableSyntaxOnly) + +type FieldDef = { + key: string + label: string + type: 'text' | 'textarea' | 'checkbox' | 'number' | 'date' | 'time' | 'select' | 'multiselect-weekday' | ... + required?: boolean + placeholder?: string + step?: number + options?: Array<{value, label}> +} + +const KIND_CONFIG: Record + fields: FieldDef[] + columns: string[] +}> = { + 'kind-a': { label, icon, fields: [...], columns: [...] }, + 'kind-b': { ... }, +} + +export function CatalogPage() { + const { kind } = useParams<{kind?: string}>() + const config = KIND_CONFIG[kind ?? 'default'] + // Render sub-tab nav + table + Dialog form (declarative renderField per FieldDef.type) +} +``` + +## Decision + +**Khi nào dùng Pattern Declarative KIND_CONFIG (vs split page):** +- N kind ≤ 6, mỗi kind có fields shape DIFFERENT nhưng UX flow SAME (List + Create/Edit dialog + Delete) +- KHÔNG có per-kind business logic phức tạp (workflow / approval flow / codeGen) +- Mỗi kind chỉ khác fields list + columns +- Total page LOC ~300-500 (acceptable single-file maintain) + +**KHÔNG dùng khi:** +- Per-kind business logic phức tạp → split per-page (vd Contract type 7 có 7 form khác + 9 phase workflow) +- N kind > 6 → file > 1000 LOC khó scan +- Fields shape differ rất nhiều (vd file upload field + signature picker mix vào) + +## Example proven cumulative + +### Plan CA Chunk B (S29) — Master/Catalogs +- 4 kind: units / materials / services / work-items +- File: `fe-admin/src/pages/master/CatalogsPage.tsx` 321 LOC + mirror fe-user +- Field shape: code/name + variant per kind (defaultUnit/category/originCountry/etc.) +- BE: `/api/catalogs/{kind}` × 4 verb mirror controller + +### S35 G-H2 (this session) — Hrm/HrmConfigs +- 4 kind: leave-types / holidays / shifts / ot-policies +- File: `fe-admin/src/pages/hrm/HrmConfigsPage.tsx` ~470 LOC + mirror fe-user +- Field shape: complex (multiselect-weekday cho ShiftPattern WorkDays + TimeOnly cho startTime/endTime + 3 multiplier OtPolicy) +- BE: `/api/hrm-configs/{kind}` × 4 verb mirror controller +- NEW FieldDef.type extend: `number/date/time/select/multiselect-weekday` + +## renderField helper extend pattern + +Mỗi kind có thể introduce NEW field type → extend `renderField(field, value, onChange)` switch: +- `text/date/time` → `` +- `number` → `` +- `textarea` → `