# EwoooC 專案歷史紀錄 (History Logs)

## 📌 重大里程碑
- **2026-04-29**: ADR-018 四 AI Agent 自動化控制面立案，Hermes / NemoTron / OpenClaw / ElephantAlpha 的告警、自癒、記憶與 HITL 邊界完成文件化。
- **2026-04-29**: ADR-017 Phase 3f 模組化收尾立案，啟動 DB metadata、路由雙註冊、cache、scheduler、模板與死碼清理六線收斂。
- **2026-04-18**: 專案正式正名為 **EwoooC**，AI 治理架構 Phase 4 結案（V10.3）。
- **2026-02-13**: WOOO AIOps SaaS 核心模組完成。
- **2026-01-24**: 曾嘗試遷移至 K3s（後於 04-18 審計確認回歸 Docker Compose）。
- **2026-01-12**: 專案啟動，MOMO 監控系統初版。

---

## 📅 詳細更新日誌 (考古存檔)

### 2026-06-01：PChome 比價新鮮度操作閉環
- **V10.601 Gemini / 111 治理收斂與全 repo 已知密鑰清除**: 正式 `ai_calls` 近 24 小時與近 7 天 provider 彙總確認沒有 Gemini 出站，Gemini 仍由 `GEMINI_API_HARD_DISABLED=true` 與 `GEMINI_FALLBACK_ENABLED=false` 擋住。清除舊 K8s manifest、n8n workflow、監控/auto-repair scripts、Superset 文件、Google Drive token 檔與歷史文件中的已知實密鑰，改成占位符並新增 secret 掃描測試；OpenClaw 日/週/月/Meta 等敘事長報告改為 GCP-A/GCP-B only，不再讓 `openclaw_meta` fallback 到 111 承接長文生成。
- **V10.600 AI Intelligence 競品表前台標籤收斂**: PChome 競品表 footer 改為使用者可理解的身份比對說明，不再顯示 TTL 與全域門檻等工程參數。前端 tag renderer 只把 `identity_v2`、`match_type_exact`、`price_alert_exact`、`evidence_*`、`match_*` 等已知 matcher 診斷轉成中文 badge，未知內部 tag 不顯示，避免把 raw matcher code 暴露到營運畫面。
- **V10.599 全站巡檢降載與前端工作溝通隔離**: 新增 CONSTITUTION 第 14.2 條，禁止把施工紀錄、版本發布說明、AI 工作視窗判斷、Codex/Claude 評估或 Gitea 推版語氣放進使用者可見前端頁面。市場情報停用頁改成輕量產品狀態頁，移除 `system_version` 與工程文案；ICAIM 競情 dashboard API 新增 120 秒快取、900 秒 stale fallback、PostgreSQL 5 秒 statement timeout、LATERAL 最新價查詢與 DISTINCT ON 最新 PChome identity row，避免全站巡檢或使用者開頁時被重型查詢拖慢。
- **V10.584 PChome Nick 去重 + stale recovery 單品窄門**: PChome `Nick` 進 matcher 前會去除 HTML 標籤、星號行銷文與重複品名，避免同一個 `29g / 100ml` 被副標重複計數後誤判 `component_count_conflict`。依 10 筆正式 stale recovery 診斷，新增 NIVEA 妮維雅霜 100ml、Schick 舒綺敏感肌除毛刀片 3 入、TS6 沁涼潔淨慕斯 100g 的具名 exact total-price alignment；IBL 沐浴精+洗髮精 vs 洗髮精、唇釉色號目錄款、Paula's Choice 效期/金蓋差異仍維持 identity review。
- **V10.583 Paula's Choice 身體乳 PChome Nick 具名 alignment**: matcher 新增 Paula's Choice `2%水楊酸身體乳210ml二入` 的窄範圍 alignment，讓 PChome `Nick` 補出的 `水楊酸身體乳雙入組 / 210ml x2` 可和 MOMO 品名對齊並進 `exact / total_price / price_alert_exact`。此版不泛用放寬中文入數；`118ml二入組(金蓋限定版)` 對上 PChome 效期品仍維持 `manual_review / identity_review`，不寫正式價差。
- **V10.582 PChome 比價通知專業分級 + Nick 副標身份證據**: NemoTron 價格決策信封補齊 `momo_price`、`competitor_price`、`candidate_gap_pct` 與 `sales_7d_delta_pct`，避免 EventRouter / Telegram 模板拿不到核心價格事實。價格決策模板新增「通知分級」，將 `match_type / price_basis / alert_tier` 翻成直接價格威脅、單位價覆核、身份覆核或壓制告警，並同步顯示操作邊界；單位價或 identity 未確認時明確禁止以總價直接判定價格威脅。PChome crawler 另保留 `Nick` 副標為 `match_name` 給 matcher 使用，UI/DB 顯示仍用原品名，讓容量、入數、濃度資訊可參與比對。
- **V10.581 重複單品組 retryable revalidation 接線**: 將 V10.580 的安全 matcher 線接到 `run_retryable_candidate_revalidation()`，但只收 `true_low_confidence` 中舊診斷已是 `match_type=exact / price_basis=manual_review`、沒有 review block，且命中具名安全商品線的候選。這讓 Bioneo / Cetaphil / Avene / Schick / KOSE 等重複單品組可以小批次重評並由最新版 matcher 決定是否寫入正式 `competitor_prices`，仍不開放泛用高分掃描。
- **V10.580 PChome 重複單品組 total-price 窄門 + 核心油種 veto**: matcher 將同品牌、同入數、同基礎規格且名稱高度對齊的重複單品組，從 `exact / manual_review` 收斂到 `exact / total_price / price_alert_exact`；正式部署前以最新 `true_low_confidence` 重算，213 筆高分候選中僅 7 筆符合自動寫入安全條件。同步新增 NEW DIRECTIONS 甜杏仁油 vs 杏桃核仁油 hard veto，避免同容量同按壓頭但核心油種不同的候選被誤放行；PChome 端缺規格的 Paula's Choice 雙入組仍停在 manual review。
- **V10.579 PChome 高信心 total-price safe family + Code Review timeout 收斂**: matcher 新增 SAB 私密防護舒緩噴霧 30ml 與 Herbacin 小甘菊 20ml 護手霜的窄範圍 total-price safe 路徑。這些候選仍必須通過既有 score、hard veto、variant/commercial gap 與 overwrite protection；Herbacin 柔皙 vs 野生玫瑰跨 variant 反測維持不進正式價差。目的在不放寬 `MIN_MATCH_SCORE` 的前提下，把可證明同款的高信心 `true_low_confidence` 轉進正式比價覆蓋。同版將 Code Review GCP-B secondary timeout 預設由 60 秒收斂到 25 秒，GCP-A preflight 不通且 GCP-B 生成卡住時更快回 deterministic local degraded，不呼叫 Gemini/111。
- **V10.578 Code Review 靜態掃描 timeout 誤報修正**: Hermes deterministic scan 對 `requests.get/post/put/delete/patch` 改檢查同一呼叫 block 的後續行，已在多行呼叫中帶 `timeout=` 時不再報「HTTP request 未設定 timeout」。這修掉 V10.577 preflight helper 被 Code Review 自己誤判為 MEDIUM 的噪音。
- **V10.577 Code Review Ollama host preflight**: OpenClaw 架構評估在 explicit GCP host generate 前先以短 `/api/version` 探測健康度；若 GCP-A 從 188 連線 timeout，會快速跳到 GCP-B `gemma3:4b`，避免每次等 primary generate timeout。此 preflight 只作用於 Code Review Ollama-first 路徑，仍維持 111 預設禁用、Gemini hard-disabled 預設不呼叫。
- **V10.576 PChome backlog lane 與 GCP-only Ollama retry 修補**: `/api/ai/pchome-match/backfill/status` 的 coverage 與 operation backlog 同步輸出 `catalog_variant_review`、`catalog_unit_review`、`catalog_identity_review`，讓 Dashboard 操作建議可直接跳到三條人工隊列。同版修正 `OllamaService.generate(allow_111_fallback=False)`：若 resolver 已快取到 111，會改試尚未嘗試的 GCP-A/GCP-B allowlist，不再直接 `all 0 hosts failed`，同時仍避免長分析落到 111。
- **V10.575 PChome 型錄可比覆核 lane 分流**: `catalog_comparable` 進一步拆成 `catalog_variant_review`、`catalog_unit_review` 與 `catalog_identity_review`。Coverage SQL、review queue filter、Dashboard 分段、decision envelope 與 Webcrumbs host data 共用同一套 helper，將選項/色號/款式、入數/商業條件、身份採用三種人工閉環路徑分開統計與瀏覽；仍維持 HITL，不自動寫正式價差。
- **V10.574 PChome 型錄/任選可比覆核隊列**: 將 V10.572 的 `catalog_comparable_count` 派生口徑正式接進 PChome review queue。高分、無 hard veto、具同品線身份證據但仍有任選/型錄/商業條件待確認的 `true_low_confidence` 會進獨立 `catalog_comparable` 篩選、狀態標籤與 decision envelope；真正 `true_low_confidence` 會排除這批候選，避免重複出現在「證據不足」。此變更不放寬 `MIN_MATCH_SCORE`、不寫正式 `competitor_prices`、不算 exact matched，只把最有機會人工批次確認的候選變成可操作隊列。
- **V10.574 市場情報 Source Governance → Fetch Target bridge**: 新增 `/api/market_intel/mcp_fetch_target_source_governance_review`、preview service 與市場情報頁 bridge panel，交叉審核 Professional Source Governance 與 MCP Fetch Target Review。此 gate 要求每個 target `platform_code/source_key` 都能對上已通過治理的公開 source contract，並同步納入 deployment readiness preview-safe check 與 production smoke target；API/UI 仍不抓外站、不讀 robots/sitemap、不開 DB、不寫檔、不執行 CLI、不掛 scheduler。
- **V10.572 PChome 決策支援覆蓋率分層**: 覆蓋率不再只有 exact `decision_ready_rate`。`fetch_competitor_coverage()` cache 升到 v11，新增 `catalog_comparable_count`、`decision_support_count`、`decision_support_rate` 與非 exact 支援數；只納入高分、無 hard veto、同時具型錄/任選/商業條件訊號與強身份證據，且排除品類、品線、入數、香味、型號、價格極端等硬衝突的候選。Dashboard、daily、growth 與 backfill JS 同步顯示「決策支援覆蓋率 / 精準可告警覆蓋 / 型錄可比 / 單位價」，提升可用情報覆蓋但不污染正式 `matched`。
- **V10.571 PChome pending 覆蓋率搜尋召回**: `competitor_price_feeder` 預設每個商品最多搜尋詞由 5 組提升為 6 組，並新增 `PCHOME_FEEDER_SEARCH_COVERAGE_RESCUE_ENABLED`。補抓流程會在主要 matcher 搜尋詞與原始名稱 fallback 之間加入狹義 coverage rescue terms，保留 `5.5g` / `2.4g` 等小數規格，並過濾外出清潔、卸除髒汙、卸防曬等非身份核心噪音。正式 pilot 顯示 CeraVe / TUNEMAKERS / Embryolisse / Neogence / NIVEA 這類雙語品牌商品常卡在 PChome 搜尋召回，因此補上「英文品牌 + 中文品牌 + 核心身份 + 規格」窄搜尋詞；`品牌 + 品類 + 規格` 仍只對安全品類開放，目標是提升 pending/no_result 候選取得率，同時維持 matcher hard veto 與 `MIN_MATCH_SCORE` 不變。
- **V10.570 PChome 身份 / 報價證據契約**: `score_marketplace_match()` 現在會在 `match_diagnostic_json` 內輸出 `identity_evidence` 與 `offer_evidence`，把品牌、品類、identity anchor、型號、規格、入數、variant guardrail 與價格 offer 拆層保存。`competitor_intel_repository` 會把這些證據轉成 `difference_highlights` 與 decision envelope 的 identity / offer evidence，讓覆核頁、PPT、OpenClaw、Webcrumbs 與 Telegram 摘要都能理解「為何同款 / 為何不同 / 價格只是報價證據不是身份證據」。
- **V10.569 Webcrumbs 比價信封摘要串接**: `build_webcrumbs_marketplace_host_data()` 讀取 `fetch_competitor_review_queue()` 後統一走 `summarize_review_decision_envelopes()`，在 host data payload 輸出 `reviewDecisionBrief`，並於 metadata 增加 `review_queue_count`、`hitl_count`、`auto_execute_blocked_count` 與 `decision_envelope_source`。Webcrumbs / Shared UI 現在和 Telegram、OpenClaw、PPT 共用同一份 PChome 覆核信封摘要，仍維持只讀、不呼叫 LLM、不抓外站、不寫 DB；同版收錄 `docs/guides/external_professional_benchmark.md` 作為外部專業做法週巡檢落地準則入口。
- **V10.568 價格類決策信封專業 brief**: `decision_envelope` 的價格 / PChome 覆核事件在 Telegram EventRouter 直送時，改以「標的、價格證據、比對證據、人工下一步」四段式排版呈現，保留 `momo:eig:` 忽略按鈕且不進 L1/L2 AI 重摘要。`competitor_intel_repository` 同步在 review queue 信封 subject 補上 `momo_price` / `competitor_price`，讓 Telegram、PPT、Webcrumbs 與 AI 摘要可共用同一份價格證據，不再各自補查或重組。
- **V10.567 MCP 市場洞察 GCP-only fallback**: `MCPCollectorService._ollama_topic_fallback()` 改成只使用 GCP-A / GCP-B Ollama，失敗後保守回本地 fallback，不再把市場洞察長分析轉嫁到 111。預設 timeout 收斂為 25 秒、`num_predict` 收斂為 500，避免 Elephant Alpha 在 GCP-A/GCP-B 短暫不可用時撞 60 秒總上限或造成 111 負載尖峰；Gemini 仍維持 `GEMINI_API_HARD_DISABLED=true` 預設硬封鎖。
- **V10.565 PChome 覆蓋率操作建議**: 補強 `/api/ai/pchome-match/backfill/status`，將低覆蓋率拆成 `operation_backlog`：刷新舊 identity、重評近門檻、補抓未配對、人工覆核、單位價覆核與過期搜尋救援預覽；並新增 `recommended_next_action`，Dashboard 狀態摘要會直接顯示建議下一步，避免使用者只看到低覆蓋率卻不知道該按哪條產線。
- **V10.563 正式 preview 假可救候選收斂**: 針對正式 `retryable_candidate_preview` 露出的 M.A.C 蜜粉與 SAUGELLA 菁萃潔浴凝露案例補 guard。M.A.C 單邊明確色號（如 `#絕絕紫`）會進 `variant_selection_review`，維持 `true_low_confidence`；SAUGELLA 潤澤 / 日用型 / 加強 / 黃金女郎型互斥，直接 hard veto，避免同品線不同私密清潔款式被當成 recoverable low_score。
- **V10.566 市場情報 Professional Source Governance**: 新增 `/api/market_intel/mcp_professional_source_governance`、preview service/gates/sample 與市場情報頁卡片，將 robots/REP、sitemap/lastmod、JSON-LD / schema.org structured data、canonical URL、rate limit、公開資料邊界、provenance、snapshot hash 與 idempotency key 納入 source contract。此 gate 只審核操作員治理摘要，不抓外站、不讀 robots/sitemap、不開 DB、不寫檔、不掛 scheduler；deployment readiness 同步新增 preview-safe 檢查與 production smoke target。
- **V10.561 PChome 比價補強前端分段回饋**: Dashboard 的 PChome 操作卡改名為「比價補強產線」，手動按鈕與確認文案同步說明三段流程；結果摘要會顯示刷新、重評、補抓各自的 matched/total，讓操作員能判斷覆蓋率改善來自舊 identity 新鮮度回補、近門檻 matcher 回刷，或 pending 商品 fresh search 補抓。
- **V10.560 手動 PChome 比價補強三段式串接**: `/api/ai/pchome-match/backfill` 與每日 scheduler 口徑對齊，手動執行時先小批次刷新過期 `identity_v2`，再跑近門檻候選重評，最後補抓高優先未配對商品。回傳結果新增 `stale_identity_refresh` 分段統計，讓後續 Dashboard、簡報與 AI 決策能區分覆蓋率改善來自舊 identity 新鮮度回補、matcher 回刷，還是 fresh search 補抓。
- **V10.559 retryable 有效身份新鮮度收斂**: `_fetch_retryable_candidate_skus()` 的既有 identity 阻擋條件改成只接受 `cp.expires_at > CURRENT_TIMESTAMP`，不再讓 `expires_at IS NULL` 的未知新鮮度舊配對壓住近門檻候選回刷。未知新鮮度仍由 expired identity refresh / recovery 路徑處理，最後寫入仍必須通過現行 matcher、hard-veto、auto write safety 與 stronger existing production match 保護。
- **V10.558 legacy focused identity reason 回刷補漏**: `_fetch_retryable_candidate_skus()` 在 V10.557 的具名 identity guard 之外，補上歷史資料缺 marker 的情境：舊 attempt 若沒有新版 `focused_exact_total_price_safe`，但已有具名 `focused_exact_identity_*` 且該 identity 屬於 matcher total-price safe set，並且舊分數已達全域 `MIN_MATCH_SCORE`，可進近門檻重評。仍要求無 hard veto、`exact_identity`、無 commercial / variant / count / bundle 阻擋，最後由最新版 matcher 決定是否能寫正式價差。
- **V10.557 focused reason-based 回刷具名 identity guard**: V10.555 的結構化 reason 回刷再收緊，`_fetch_retryable_candidate_skus()` 不只要求 `focused_exact_total_price_safe`，還必須同時命中一條具名 `focused_exact_identity_*` 且該 identity 來自 matcher 的 total-price safe set。這避免只有總開關、缺少身份線索的舊 attempt 被納入回刷；rom&nd、Solone、Summer’s Eve 等 review-only focused line 仍被測試鎖在自動價差線外。
- **V10.556 GCP-B model fallback 防 111 過載**: `OllamaService.generate()` 現在會在 GCP-B 對 coder/large 模型使用 host-compatible fallback（預設 `gemma3:4b`），避免 GCP-B 缺 `qwen2.5-coder:7b` 時直接被標成 unhealthy 並把流量推到 111。HTTP 404 且訊息為 model not found 時視為模型缺失，不再 mark 整台 host unhealthy；其他 HTTP / timeout 仍照舊標 unhealthy。主機順序仍是 GCP-A → GCP-B → 111。
- **V10.555 focused total-price reason-based 回刷窄門**: `_fetch_retryable_candidate_skus()` 新增結構化 diagnostics reason 回刷入口，舊 attempt 若已帶 `focused_exact_total_price_safe` 且命中 matcher 的 `FOCUSED_IDENTITY_TOTAL_PRICE_REASONS`，即可進近門檻重評，不再完全依賴手寫商品名 SQL。此路徑仍要求分數下限、無 hard veto、`exact_identity`，並套用 commercial / variant / count / bundle 等阻擋理由；rom&nd、Solone、Summer’s Eve 等 review-only focused line 不在 total-price reason set，仍不會被推入自動價差。
- **V10.554 香氛 / 精油 focused exact 回刷接線**: Herb24 晨霧純精油擴香儀黑色、Pavaruni 40 香味 10ml 精油、Pavaruni 20 香味 450g 香氛蠟燭、Derma 大地有機植萃護膚油 150ml 已明確列入 matcher 的 `focused_exact_total_price_safe`，並接入 `_fetch_retryable_candidate_skus()` 的近門檻舊候選回刷入口。SQL 仍要求 `low_score / refresh_low_score / true_low_confidence`、分數下限、無 hard veto、`exact_identity`，且排除變體、商業條件與件數衝突；Laundrin、好物良品融蠟燈、Yuskin 等帶人工覆核訊號的品線不納入本輪自動回刷。
- **V10.553 current PPT/AI 比價結果查詢瘦身**: `fetch_competitor_comparison_results()` 不再用 `ROW_NUMBER() OVER (PARTITION BY p.id ...)` 掃 `price_records` 取得 current/latest MOMO 價格，改為 `JOIN LATERAL` 逐商品取最新價；有指定 `end_date` 的歷史報表仍把 `pr.timestamp < DATE(:end_date) + INTERVAL '1 day'` 放在 lateral 子查詢中，保留「截止日前最新 MOMO 價」語意。這降低簡報、OpenClaw/AI payload 與比價匯出在大量價格紀錄下的查詢成本。
- **V10.552 決策查詢新鮮度口徑收斂**: Top competitor risks、PChome review queue、review sample 與 current PPT/AI 比價結果全部改成只吃 `cp.expires_at > CURRENT_TIMESTAMP` 的有效 PChome identity_v2 價格，不再把 `expires_at IS NULL` 當作有效現價。未知新鮮度現在只作 coverage 診斷與刷新入口，不會被用來產生價格風險、簡報、AI 決策或從覆核隊列中排除。
- **V10.551 未知新鮮度刷新與補抓排序收斂**: `expires_at IS NULL` 的 identity_v2 價格現在會被 `_fetch_expired_identity_skus()` 與 `_fetch_expired_identity_recovery_skus()` 視為需要刷新 / 可搜尋救援的未知新鮮度資料，避免 V10.549 已排除出可決策覆蓋率後卻沒有刷新入口；兩條路徑都改用 `JOIN LATERAL` 取最新 MOMO 價，不再做 product-wide window scan。`_fetch_unmatched_priority_skus()` 同步改為 lateral latest price，且把低風險 `no_result / refresh_no_result` 排到補抓前段，讓安全召回詞優先投入最可能回收的 SKU。
- **V10.550 安全搜尋召回詞補強**: `competitor_price_feeder` 在既有精準搜尋詞之外，對低風險穩定品類補上一組 `品牌 + 品類` recall keyword，提升 `no_result / refresh_no_result` 找到候選的機率；高 variant 風險商品如美甲片、指甲油、唇彩、香氛/精油、粉底、防曬與含任選/色號/款式/香味的商品不走通用召回。DASHING DIVA 仍保留既有 line-specific recall 與 PChome sort fallback；本次不更動 `MIN_MATCH_SCORE`、hard veto、auto write safety 或 stronger existing match 保護。
- **V10.549 比價新鮮度 KPI 口徑收斂**: `fetch_competitor_coverage()` cache 升到 v10，`expires_at IS NULL` 不再混入 `fresh_matches` / `decision_ready_rate`，改拆成 `unknown_freshness_matches` 與 `unknown_freshness_rate`，讓「可用比價覆蓋率」只代表有明確未過期時間的 identity 價格。Dashboard、daily、growth 同步顯示未知新鮮度與「未形成有效身份配對」，第一屏資料時間改看最新有效 PChome 價格抓取，並把價格方向文案改為 `PChome 價格壓力` / `MOMO 價格優勢`。
- **V10.548 focused exact 舊候選回刷接線**: `_fetch_retryable_candidate_skus()` 的 focused true-low / rescore 窄門新增 3W CLINIC 膠原蛋白粉底液 50ml x2、花美水 Moisture/Inclear 1.7g x3、KUSSEN 寶寶益菌屁屁膏 50ml 3 入、Lab52 齒妍堂嬰幼兒 / 汪汪隊牙刷 2 入。這些品線在 matcher 測試中已是 `exact / total_price / price_alert_exact`，本次只讓舊 `true_low_confidence` / `rescore_accepted_current` 候選能被新版 matcher 重新判斷；仍不放寬 `MIN_MATCH_SCORE`、hard veto、auto write safety 與 stronger existing match 保護。
- **V10.547 單位價覆核洞察與證據鏈保留**: `manual_unit_price_required` 現在會和 `unit_comparable` 一樣重新產生單位價比較，並轉成 `unit_price_insight`，明確標示 PChome 或 MOMO 哪邊單位價較低、差距百分比、嚴重度與操作建議；Dashboard 覆核卡、商品列、決策信封與 OpenClaw/PPT 摘要都可讀到這個訊號。人工覆核寫回 `competitor_match_attempts` 時也會在欄位存在時保留原始 `match_diagnostic_json`、`comparison_mode`、`hard_veto`、`diagnostic_codes`，`competitor_match_reviews.candidate_diagnostic` 同步附帶 JSON 證據，避免人工閉環後只剩狀態文字。
- **V10.546 近門檻舊候選回刷隊列補漏**: `run_retryable_candidate_revalidation()` 的候選來源不再只看每個 SKU 最新一筆 attempt。新增 `legacy_unmasked_attempt`，當最新狀態是 `no_result` / `refresh_no_result` / `expired_match` 時，可回撈同 SKU 早期 `low_score`、`recoverable_low_score`、`true_low_confidence` 或 `rescore_accepted_current` 的近門檻候選，再交給最新版 matcher 重評。此入口仍要求 candidate product id、分數下限、無 hard veto、`exact_identity`，且不打開人工否決、單位價、identity_veto 或 protected existing match，避免為了覆蓋率破壞安全邊界。
- **V10.545 Dashboard 比價覆蓋率口徑收斂**: 商品看板與 PChome 覆核頁把「身份覆蓋率」與「可用比價覆蓋率」拆成明確欄位，coverage cache 更新為 v9 並回傳 `identity_coverage_*`、`pending_identity_count`、`stale_identity_count`、`last_decision_ready_crawled_at`。覆核 KPI 改只計算真正待處理狀態，人工否決 / 人工單位價 / 需補研究另列 `manual_closed_count`，避免人工閉環候選被混進待審總數。Dashboard 的 PChome competitor map 也改成只取新鮮、有效價格、identity_v2 的最新 row，資料新鮮度改看可用比價 row，不再被無效或低信心抓取紀錄撐高。
- **V10.544 變體安全與 YES 工具線收斂**: 延續近門檻 `low_score` 救回，但把安全邊界補得更硬。新增 YES 德悅氏指甲工具精準線，只有同品牌、同工具線、同尺寸且同亮面/霧面/可收納/三面等關鍵款式時才進 `total_price`，並接入 revalidation SQL。同步新增未知香味差異與無型號指彩色名差異 hard veto：MUJI / COCODOR 不同香型、OPI 無型號不同色名不再被高分誤配；HOOOME 暖燈陶瓷/玻璃/水晶/金屬等材質差保留人工覆核。搜尋詞對護手霜、擴香瓶、無型號指彩優先帶上香味/色名，提升 crawler 找到真同款候選的機率。
- **V10.543 rescore accepted 窄門回刷與高信心線補強**: `run_retryable_candidate_revalidation()` 追加 `rescore_accepted_current` 窄門，只允許已進人工池且命中具名 focused exact 品線的候選重新評分，仍由 matcher 判定是否可寫正式價差。新增 SK-II 青春露 330ml 兩入、AMIINO 安美諾美白修護霜 30ml、YES 腳指甲剪刀 10.5cm、YES 極細指甲緣硬皮剪刀 9cm 的 total-price 安全線；同時新增指甲油型號衝突防線，ANNY `A10.074.60` vs `A10.500`、OPI 不同 `ISL...` 型號都會 hard veto，不會為了拉覆蓋率誤配色號。
- **V10.542 可用比價覆蓋率口徑拆分**: `fetch_competitor_coverage()` 新增 `decision_ready_matches` / `decision_ready_rate`，以「高信心 identity 且價格仍新鮮」除以 ACTIVE 商品數，和 `match_rate`（身份覆蓋）及 `fresh_match_rate`（已配對中的新鮮率）分開。Dashboard 第一屏改顯示可用比價覆蓋率，daily / growth / Webcrumbs / OpenClaw payload 同步輸出，避免使用者把舊截圖的低價格可用率、身份覆蓋率與新鮮率混成同一個 KPI。
- **V10.541 高信心覆核池 exact 線再收斂**: 從正式覆核頁抓到多筆 `rescore_accepted_current` 仍卡人工的同款：The Ordinary 咖啡因 EGCG（MOMO 單側漏 30ml）、Natures Care 綿羊油同入數、TOMOON 指甲剪同 L/S 尺寸、HH 私密潔淨露+私密衣物手洗精雙 200ml、SEBAMED 護潔露 200ml x2、YES 德悅氏 9cm 剪刀。新增 focused total-price 規則與 revalidation SQL；TOMOON / O.P.I 仍要求同型號或同尺寸，避免跨款式誤配。
- **V10.540 O.P.I 指彩精準型號救回**: 正式覆核頁面顯示多筆 O.P.I 類光繚 / 如膠似漆指彩因 score 0.76~0.83 停在 `rescore_accepted_current` 人工池，但雙方都有明確 `ISL...` 型號（如 ISLL87、ISLL00、ISLN25）。新增 `opi_gel_polish_exact_model` focused total-price 規則：必須同品牌、同類光繚指彩線、共享型號 token；不同型號/色號不自動通過。同步接入 revalidation SQL，讓舊 `true_low_confidence` 指彩候選可批次重評。
- **V10.539 任選 catalog focused exact 與 commercial 防線**: 新增 FLORTTE 水果沙拉眼線液筆 0.5ml、露得清護手霜 56g 無香/有香、Kanebo ALLIE 持采亮化 UV 防曬水凝乳 60g 的 focused total-price 規則，條件是雙方同品牌、同品線、同規格且任選 catalog 語意一致；同步接入 `run_retryable_candidate_revalidation()`。同時修正 focused bypass：若存在 `commercial_condition_gap`（例如即期品），不得移除 `variant_selection_review`，避免商業狀態差異被自動寫入正式價差。
- **V10.538 ai_calls provider CHECK 對齊**: 正式 scheduler Hermes/Ollama 全失敗時會以 `provider=ollama_other` 記錄未知/未選定 host，但 `ai_calls.chk_ai_calls_provider` 舊白名單未包含此 telemetry bucket，導致觀測寫入再撞 CHECK。新增 migration 043 放行 `ollama_other`，並讓 `ai_call_logger` 將空值、unknown、非白名單 provider 字串正規化為允許值；`ollama_other` 僅作遙測分類，不是模型路由目標。
- **V10.537 focused exact revalidation queue 接線**: V10.536 只補 matcher 規則會影響新抓取，但無法批次回收既有 `true_low_confidence` 舊候選。`run_retryable_candidate_revalidation()` 新增 focused true-low 窄門：花美水 Relax、St.Clare 私密呼呼、BIOPEUTIC 果酸、台塑生醫、Elizabeth Arden 與理膚寶水若無 hard veto 與型別/款式/香味/件數/組合阻擋，可進重評；`variant_selection_review` 僅在這些具名安全線允許重跑，其他人工池不打開。
- **V10.536 高分 true_low_confidence focused exact 救回**: production 抽樣顯示剩餘未覆蓋集中在 `identity_veto` 與 `true_low_confidence`，其中部分 1.0 分樣本是同品牌、同品線、同規格/同組合，但因多件組或護唇/私密護理類型辨識保守而停在 manual review。新增花美水 Relax、St.Clare 私密呼呼、BIOPEUTIC 果酸、台塑生醫嬰兒沐浴洗髮、Elizabeth Arden 八小時護唇膏、理膚寶水全面修復潤唇膏的 focused total-price 規則；不放寬 `MIN_MATCH_SCORE`，也不移除色號/香味/款式防線。
- **V10.535 ElephantAlpha price trigger 查詢瘦身**: 正式 scheduler 日誌顯示 `price_drop_alert` trigger 對整張 `price_records` 做 `DISTINCT ON` 最新價造成 statement timeout。`price_drop_alert`、`market_opportunity` 與 EA DB evidence prefetch 改為先篩最近有效 PChome identity_v2 競品，再用 `JOIN LATERAL` 只查該 SKU 最新 MOMO 價格，保留 match_score/tags/diagnostic evidence 給 Telegram HITL，不再用全表最新價子查詢。
- **V10.534 rescore accepted gate 收緊與語意修正**: 正式 96 筆 `rescore_accepted_current` 盤點顯示多數仍是 `manual_review / identity_review`，且有 2 筆 `no_match / none / suppress` 混入。收緊 `classify_match_attempt_row()`：`no_match`、`price_basis=none`、`alert_tier=suppress` 不得 gate pass；新增 `--retract-unsafe-accepted` 可把既有 unsafe accepted 退回 `true_low_confidence`。Dashboard / daily / growth / OpenClaw 文案改成「重算待人工覆核」，明確表示仍需人工確認身份後才可寫正式價差。
- **V10.533 ElephantAlpha legacy OpenClaw advisory 相容**: 正式 scheduler 日誌出現 `Unrecognized step: agent=openclaw action=generate_dynamic_pricing_strategy`，屬於舊協調器把建議型策略文字放進 execution plan。執行器現在將 `generate_dynamic_pricing_strategy` 納入既有 OpenClaw advisory no-op 清單，只記錄 skipped，不觸發 circuit breaker，也不轉成自動調價或外部呼叫。
- **V10.532 coverage / review queue 口徑對齊**: V10.531 materialize 96 筆 `rescore_accepted_current` 後，DB 最新狀態正確，但 `/api/ai/pchome-match/backfill/status` 的 `rescore_accepted_count` 仍為 0。原因是 coverage 的 `attempt_status` 統計只看「完全沒有 identity」商品，而 review queue 看的是「沒有新鮮有效 identity」商品。改為以 `fresh_competitor` 排除條件統計，讓 stale identity 的重算可採用待審能正確上屏；正式價差表仍未被 rescore materialize 寫入。
- **V10.531 PChome 安全 exact 規則補強**: production refresh 顯示大量舊 identity 不是分數不足，而是被多件組 / 護唇品 variant 防線過度保守地擋在 `identity_review`。新增 `safe_multi_component_exact_total_price`：同品線、同規格、同數量且商品型別完全對齊、無 variant / count / bundle / commercial / unit-price 阻擋時，才可進 `exact / total_price / price_alert_exact`；另補 DHC 純欖護唇膏 1.5g、FRUDIA 蜂蜜藍莓護唇膏 10g、SEBAMED 嬰兒護唇膏 4.8g x2、理膚寶水滋養修護潤唇膏 4.7ml focused total-price。回歸測試保留 HH 混合組、TS6 香味衣物手洗精、粉底色號與蠟燭 catalog 不自動放行。
- **V10.530 retryable preview 輕量化與 recover-stale 安全閘**: 正式站 profiling 證實 `/api/ai/pchome-match/backfill/status` 剩餘瓶頸在 `revalidation_preview`，約 12 秒；`_fetch_retryable_candidate_skus()` 改為先取每個 SKU 最新 attempt 並縮小到可重評候選，再 `JOIN LATERAL` 取單一最新 MOMO 價，不再對全量 `price_records` 做商品 window scan。正式 smoke 也顯示過期 identity fresh-search rescue 小批次 5 筆耗時約 109 秒且 0 筆成功，因此 Dashboard 移除「救援過期 40 筆」按鈕，只保留 `stale_recovery_preview` 只讀觀測；後端 `/api/ai/pchome-match/recover-stale` 保留但需明確設定 `PCHOME_STALE_RECOVERY_ENABLED=true` 才能執行，避免低成功率慢任務拖住正式 worker。
- **V10.529 recover-stale 名稱風險擋詞補強**: 過期 identity 搜尋救援新增 `+`、`x2`、`*2` 等組合暗示，以及湛藍、麋香、海洋、玫瑰、薰衣草、生理呵護、日用型、清爽、潤澤等常見變體 / 香味 / 版本詞；避免同品牌同規格但不同香味、不同膚感或不同使用情境的 stale pair 進慢速 fresh search。
- **V10.528 recover-stale preview 輕量化**: V10.527 的救援隊列在正式站 preview 時曾造成 status API 超時。改為雙階段篩選：SQL 從過期 `competitor_prices` 小集合出發，只做 identity_v2、過期、exact/total_price/price_alert_exact 等必要條件並限制候選量，再用 `JOIN LATERAL` 取 ACTIVE 商品最新 MOMO 價；variant / catalog / commercial condition / 高風險名稱訊號改在 Python 對小樣本過濾，避免 `/api/ai/pchome-match/backfill/status` 因全量 price_records、JSONB + regex preview 查詢拖垮。
- **V10.527 PChome 過期 identity 搜尋救援隊列收斂**: V10.526 production smoke 發現直接對全部過期 `identity_v2` 做 rescue 會把香氛 / 色號 / 目錄款 / 商業狀態差異等人工覆核型 stale pair 送進慢速 fresh search，20 筆耗時 361 秒且 0 筆成功。新增 `_fetch_expired_identity_recovery_skus()` 作為救援專用隊列，只收既有正式診斷為 `exact_identity / total_price / price_alert_exact` 且無 variant、catalog、commercial condition、count、bundle、unit-price 等阻擋理由的舊配對；名稱含任選、多款、香味、色號、即期、融燭燈、香氛蠟燭等高風險訊號先排除。
- **V10.526 PChome 重評預覽與過期 identity 搜尋救援**: `/api/ai/pchome-match/backfill/status` 新增 60 秒快取的 `revalidation_preview` 與 `stale_recovery_preview`，Dashboard 補抓產線顯示「可重評 / 窄門 / 可救援」數字；兩個 preview 都只讀 DB，不啟動 PChome 搜尋、不呼叫 LLM、不寫 `competitor_match_attempts` 或正式價格表。另新增 `/api/ai/pchome-match/recover-stale` 與「救援過期 40 筆」按鈕，對過期 `identity_v2` 先查既有 product_id，只有在舊 ID 缺失或低分時才走受控 fresh-search recovery，最後仍經 hard veto、auto price write safety 與 overwrite protection 才能寫入正式比價。
- **V10.525 高分 review-gated exact 舊候選窄門重評**: `run_retryable_candidate_revalidation()` 保持主戰場為 `low_score / refresh_low_score / recoverable_low_score`，只額外收 Beauty Foot、KAMERIA、TS6、Vaseline 這批已由 V10.523 補 focused exact 規則的 `true_low_confidence` 舊候選。入口要求舊分數 >= 0.95、仍為 `exact_identity`、具備 `strong_exact_spec_match`，且不得含 `commercial_condition_gap`、variant、count、bundle、refill 等阻擋理由；讓已驗證真同款可被回刷，不把整個人工審核池自動打開。
- **V10.524 PChome 過期價格刷新手動入口**: 商品看板 PChome 補抓產線新增「刷新過期 120 筆」按鈕與 `/api/ai/pchome-match/refresh-stale`，背景執行既有 `run_expired_identity_refresh()`，只刷新已建立 `identity_v2` 的 PChome product_id，不跑 fresh search recovery、不呼叫 LLM；完成後重算 AI 挑品並清除 Dashboard / competitor intel cache，讓 `stale_matches` 從觀測指標變成可直接操作的任務。
- **V10.523 高分真同款 exact identity 比價規則補強**: 針對正式環境反覆出現、分數已達 1.0 但因 `multi_component_pair` 或 variant review gate 被留在人工審核的真同款，補 Beauty Foot 足膜、KAMERIA 積雪草足膜、TS6 蜜愛潤滑液 / 蜜桃煥白凝膠 / 極淨白+煥白組合、Vaseline 嬰兒高純修護凝膠 focused exact identity。這些案例只有在品牌、品線、容量 / 重量與入數完全對齊時才進 `exact / total_price / price_alert_exact`；TS6 香味衣物手洗精等款式敏感商品仍維持 `manual_review`，全域 `MIN_MATCH_SCORE` 與 overwrite 保護不變。
- **V10.522 PChome backfill status 附帶 coverage snapshot**: `/api/ai/pchome-match/backfill/status` 在背景任務狀態外同步回傳 read-only `fetch_competitor_coverage()` 摘要，包含身份覆蓋、新鮮率、過期價格與待補抓數；Dashboard 補抓產線即使尚無最近 run result，也會顯示「身份覆蓋 / 新鮮 / 待刷新 / 待補抓」，讓操作員能分辨下一步該跑 expired identity refresh 還是 unmatched backfill。此狀態端點不寫 DB、不呼叫 LLM、不抓外站。

### 2026-05-31：Webcrumbs 共用 UI Runtime 與市場情報 writer approval
- **V10.521 比價新鮮度 stale 指標上屏**: 首頁比價監控總覽、PChome 補抓產線、daily 競價覆蓋與 growth 比價資料品質同步顯示 `stale_matches` / 價格過期數，讓操作員能分清「已確認同款但價格待刷新」與「尚未找到身份配對」，不再只看到新鮮率下降。過期 identity refresh 也優先刷新 `total_price / price_alert_exact` 的正式價差配對，讓最能進決策與告警的舊價格先回新鮮。
- **V10.520 PChome 過期價格刷新快慢路徑拆分**: `run_expired_identity_refresh()` 改為只刷新已確認 `identity_v2` 的既有 PChome product_id；若 product_id 已查不到或回傳後低分，不再同步跑慢速 fresh search recovery，而是記錄 `refresh_no_result` / low-score 並交給 `run_retryable_candidate_revalidation()` 的近門檻救援路徑。這能避免正式回刷 500+ 筆時被少數缺失 ID 拖到長時間卡住，讓價格新鮮度批次回升更可控。
- **V10.519 Webcrumbs host data metadata 對齊新覆蓋率口徑**: Webcrumbs host data metadata 同步輸出 `fresh_match_count`、`fresh_match_rate`、`stale_match_count` 與 `pending_match_count`，讓共用 UI / 其他專案 proxy 能分清身份覆蓋與價格新鮮度，不再只看到舊的 matched_count / coverage_rate。
- **V10.518 PChome 覆蓋率與新鮮度拆分**: 修正比價監控總覽把價格 TTL 過期誤算成「未覆蓋」的產品口徑，`fetch_competitor_coverage()` 現在分開回報 `valid_matches`（identity 覆蓋）、`fresh_matches`（價格新鮮）、`stale_matches` 與 `fresh_match_rate`；首頁、業績與成長頁同步顯示身份覆蓋與價格新鮮。PChome 快取 TTL 預設由 6h 改 48h，並將每日 expired identity refresh / retryable / unmatched limits 改為環境變數，預設提升到 1200 / 240 / 240，避免已建立 identity 的商品因刷新量不足被長期視為無覆蓋。
- **V10.517 PChome near-threshold 比對 hotfix**: 新增 Lab52 齒妍堂汪汪隊嬰幼兒牙刷 2 入組 focused exact identity，讓真同款可進 `exact / total_price / price_alert_exact`；同時補 Les nez 香氛融蠟燈款式選擇 gap 與 Time Leisure 香薰蠟燭香味 gap，將不同款式 / 單側香味候選留在覆核或 veto，不讓它們進 recoverable 自動回刷。測試鎖住 Dashing Diva、Pavaruni、Recipe Box、Lactacyd 與 feeder recoverable 邊界。
- **V10.516 Webcrumbs host data 授權回歸測試**: 新增 Flask runtime 測試，直接重現 `DISABLE_LOGIN=true` 下 `/api/webcrumbs/marketplace-host-data` 必須回 401 且不得組裝真實 host data；同時鎖住 `X-Internal-Key` 與登入 session 可取得敏感 seed、未授權 `/webcrumbs` 只注入 `auth_required` 空狀態，避免後續改動再讓 public 診斷頁洩漏 MOMO/PChome SKU 與價差。
- **V10.515 Webcrumbs host data 硬性授權**: 發現正式環境一般 `@login_required` 可能因 `DISABLE_LOGIN=true` 放行後，為 `/api/webcrumbs/marketplace-host-data` 與 `/webcrumbs` inline seed 加上獨立授權判斷；只有登入 session 或 `X-Internal-Key` 可取得真實 SKU/價差，未授權時只回 `auth_required` 空狀態，避免 public runtime 診斷頁洩漏正式比價資料。
- **V10.514 Webcrumbs host data read-only API**: 新增登入後 `/api/webcrumbs/marketplace-host-data`，回傳與 `/webcrumbs` inline seed 相同的 MOMO/PChome exact 價差 host data contract，供 plugin、QA 與其他專案 proxy 驗證；API boundary 明確標示 `writes_database=false`、`calls_llm=false`、`fetches_external=false`，且只允許 exact / total_price / price_alert_exact 摘要。
- **V10.513 外部工具診斷 payload 模組化**: 新增 `services/external_tool_payload_service.py`，把 Metabase/Grist/Webcrumbs 診斷頁 payload 與 Webcrumbs host data 組裝從 `routes/system_public_routes.py` 移出；route 保持 HTTP glue 與 asset proxy，避免 Webcrumbs live plugin 與比價 host data 持續把公開系統 route 撐成大檔。
- **V10.512 Webcrumbs MOMO/PChome host data**: 新增 `services/webcrumbs_host_data_service.py`，讓 `/webcrumbs` live plugin preview 復用 `competitor_intel_repository.fetch_top_competitor_risks()` 與 coverage，將 exact / total_price / price_alert_exact 的只讀價差摘要轉成 `StockPlatformSharedUI.marketSnapshot` / `aiCandidate`；不呼叫 LLM、不抓外站、不寫 DB，無風險或讀取失敗時仍輸出安全空狀態。
- **V10.511 Webcrumbs host data 安全空狀態**: `/webcrumbs` 會注入 `StockPlatformSharedUI.marketSnapshot` / `aiCandidate` 的診斷空資料，避免 Shared UI Hub plugin 因資料源未接入而 fallback 顯示假市場數字、假 AI 候選或假信心分數。
- **V10.510 Webcrumbs live plugin 試點**: `/webcrumbs` 診斷頁不再只顯示 runtime 設定，新增 `StockPlatformSharedUI.allowedPluginUris` 與同源 `/webcrumbs-assets/plugins/finance.market-ticker-strip/0.1.0`、`finance.ai-candidate-card/0.1.0` live plugin embed，讓 shared-ui loader、plugin asset proxy 與頁面初始化時序能在 momo-pro 內直接驗收。
- **V10.509 市場情報 MCP Fetch Candidate Queue Writer Review Decision Approval Writer Preflight gate**: 新增 `/api/market_intel/mcp_fetch_candidate_queue_writer_review_decision_approval_writer_preflight` 與 UI preview，只審核 human approval 通過後的 operator writer preflight 摘要；要求 approval linkage、writer_preflight_id、target operation、row count、dedupe keys、approved decision 到 target review_state 的逐列映射、decision/approval/preflight evidence refs、artifact paths、matched row exact-identity/variant/overwrite guard 與 operator confirmation 對齊，且 API 不讀 token、不執行 CLI、不開 DB、不寫 preflight/approval/decision/match、不更新 review_state、不補 queue、不掛 scheduler，只放行到後續 CLI review / run package 設計。
- **V10.508 Webcrumbs 同源 asset proxy 收斂**: 正式頁面 runtime 預設改走 `/webcrumbs-assets/loader/webcrumbs-compatible-loader.js`，由 momo-pro 代理 188 Shared UI Hub 的 allowlist asset path（`loader/`、`plugins/`、`demo/`），避免 `webcrumbs.wooo.work` 公網 TLS、Basic Auth 或入口轉發尚未完成時造成頁面 script 載入失敗；`/webcrumbs` 診斷頁同步顯示 asset upstream，`WEBCRUMBS_PLUGIN_BASE_URL` 預設改為同源 `/webcrumbs-assets/plugins`。
- **V10.507 Webcrumbs 共用 UI Runtime 接入**: 新增 `WEBCRUMBS_*` 設定、`/webcrumbs` 診斷頁、全站 `ewoooc_base.html` runtime script 載入守門與側欄入口；runtime 僅允許自架固定版本 URL，禁止正式環境使用官方 `@latest`，並新增 `docs/guides/webcrumbs_shared_runtime.md` 與 ADR-037 記錄共用 microfrontend/plugin loader 邊界。
- **V10.506 市場情報 MCP Fetch Candidate Queue Writer Review Decision Approval gate**: 新增 `/api/market_intel/mcp_fetch_candidate_queue_writer_review_decision_approval` 與 UI preview，只審核 review decision 通過後的 operator human approval 摘要；要求 decision linkage、approval identity、target table、row count、dedupe keys、`approved_for_writer_preflight` approval result、decision/approval evidence refs、artifact paths、matched row exact-identity/variant/overwrite guard 與 operator confirmation 對齊，且 API 不讀 token、不執行 CLI、不開 DB、不寫 approval record、不寫 decision record、不更新 review_state、不寫 match result、不補 queue、不掛 scheduler，只放行到後續 writer preflight 設計。新 endpoint 拆到 `routes/market_intel_mcp_review_routes.py`，避免既有 MCP run route 繼續膨脹。

### 2026-05-24：PChome 近門檻身份回收第二輪
- **V10.505 市場情報 MCP Fetch Candidate Queue Writer Review Decision gate**: 新增 `/api/market_intel/mcp_fetch_candidate_queue_writer_review_decision` 與 UI preview，只審核 review inventory 通過後的 operator candidate queue review decision 摘要；要求 decision identity、target table、row count、dedupe keys、`needs_review` 現態、允許決策集合、evidence refs、matched row exact-identity/variant/overwrite guard 與 operator confirmation 對齊，且 API 不讀 token、不執行 CLI、不開 DB、不寫 decision record、不更新 review_state、不寫 match result、不補 queue、不掛 scheduler，只放行到 decision approval / writer preflight 設計。
- **V10.504 市場情報 MCP Fetch Candidate Queue Writer Review Inventory gate**: 新增 `/api/market_intel/mcp_fetch_candidate_queue_writer_review_inventory` 與 UI preview，只審核 writer review handoff 通過後的 operator read-only candidate queue inventory 摘要；要求 handoff identity、target table、row count、dedupe keys、review_state、artifact paths、read-only query result、missing/duplicate rows 與 operator confirmation 對齊，且 API 不讀 token、不執行 CLI、不開 DB、不寫 queue、不更新 review_state、不做 inventory query、不掛 scheduler，只放行到後續人工 candidate queue review。
- **V10.503 市場情報 MCP Fetch Candidate Queue Writer Review Handoff gate**: 新增 `/api/market_intel/mcp_fetch_candidate_queue_writer_review_handoff` 與 UI preview，只審核 post-closeout inventory review 通過後的 operator candidate queue review handoff 摘要；要求 inventory linkage、handoff identity、target table、row count、artifact paths、review contract、forbidden API actions 與 operator confirmation 對齊，且 API 不讀 token、不執行 CLI、不開 DB、不寫 queue、不更新 review_state、不掛 scheduler，只放行到人工 candidate queue review。
- **V10.502 AiderHeal 自動修復診斷鏈修正**: `execute_code_fix()` 改為先檢查 ADR-020 檔案白名單再執行 110 preflight，避免 `tests/...` 這類不得自動修的 finding 被誤報成 `/home/wooo/ewoooc` preflight 失敗；Code Review 完成通知會把全數不在白名單的 finding 標成需人工處理，不再宣稱已觸發 AiderHeal；白名單同步放行 `services/routes/database` 子目錄 Python 檔，preflight 通知帶 stderr/stdout 細節，健康檢查接受正式 `/health` 回傳的 `healthy`。
- **V10.501 市場情報 MCP Fetch Candidate Queue Writer Post-Closeout Inventory Review gate**: 新增 `/api/market_intel/mcp_fetch_candidate_queue_writer_post_closeout_inventory_review` 與 UI preview，只審核 closeout review 通過後的 operator live inventory read-only 摘要；要求 closeout linkage、row count、inventory artifact、closeout review artifact、read-only query result、missing/duplicate rows 與 operator confirmation 對齊，且 API 不讀 token、不執行 CLI、不開 DB、不寫 queue、不做 inventory query、不掛 scheduler，只放行到 candidate queue review handoff。
- **V10.500 市場情報 MCP Fetch Candidate Queue Writer Run Closeout Review gate**: 新增 `/api/market_intel/mcp_fetch_candidate_queue_writer_run_closeout_review` 與 UI preview，只審核 receipt review 通過後的 operator closeout 摘要；要求 receipt linkage、closeout artifact、receipt review artifact、post-closeout inventory plan、writer output / post-write smoke / backup manifest、rollback note 與 operator confirmation 對齊，且 API 不讀 receipt 原文、不讀 token、不執行 CLI、不開 DB、不寫 queue、不做 post-closeout query、不掛 scheduler，只放行到 read-only post-closeout inventory review。
- **V10.499 市場情報 MCP Fetch Candidate Queue Writer Run Receipt Review gate**: 新增 `/api/market_intel/mcp_fetch_candidate_queue_writer_run_receipt_review` 與 UI preview，只審核操作員 shell writer run 後貼回的 receipt 摘要；要求 readiness linkage、run package id、候選/dedupe keys、writer output、post-write smoke、backup path 與 operator confirmation 對齊，且 API 不讀 receipt 原文、不讀 token、不執行 CLI、不開 DB、不寫 queue、不做 post-write query、不掛 scheduler，只放行到 closeout review。
- **V10.498 市場情報 MCP Fetch Candidate Queue Writer Run Readiness gate**: 新增 `/api/market_intel/mcp_fetch_candidate_queue_writer_run_readiness` 與 UI preview，只審核 run package review 後的 operator readiness 證據；要求 run readiness artifact、reviewed sample、備份、read-only preflight 與 post-write smoke 路徑安全，並確認 CLI-only、approval token shell-only、無 API/DB/file/scheduler 副作用。API 不產檔、不讀 token、不執行 CLI、不開 DB、不寫 queue、不掛 scheduler，只放行到後續 run receipt review。
- **V10.497 市場情報 MCP Fetch Candidate Queue Writer Run Package Review gate**: 新增 `/api/market_intel/mcp_fetch_candidate_queue_writer_run_package_review` 與 UI preview，只審核 CLI review 後的 operator run package 草案；要求 package identity、artifact manifest、operator shell command sequence、candidate/dedupe keys 與 CLI review 完全對齊，且 API 不產檔、不讀 approval token、不執行 CLI、不開 DB、不寫 queue、不掛 scheduler，只放行到 run readiness review。
- **V10.496 市場情報 MCP Fetch Candidate Queue Writer CLI Review gate**: 新增 `/api/market_intel/mcp_fetch_candidate_queue_writer_cli_review` 與 UI preview，只審核 writer preflight 後的 CLI review 草案；要求 script path、target table、preflight id、payload row count、candidate/dedupe keys 與 command argv 完全對齊，並禁止 `--execute`、`--apply-real-write`、`--approval-token` 進 API payload，且 API 不執行 CLI、不讀 token、不寫檔、不開 DB、不寫 queue、不掛 scheduler。
- **V10.495 市場情報 MCP Fetch Candidate Queue Writer Preflight gate**: 新增 `/api/market_intel/mcp_fetch_candidate_queue_writer_preflight` 與 UI preview，只審核 queue review 後的 writer preflight 草案；要求 `target_table=market_alert_review_queue`、`write_mode=cli_only_later`、dedupe strategy、insert columns、payload rows 與候選 key 完全對齊，且 API 不開 DB、不執行 CLI、不建立 queue、不更新 review_state、不寫 DB、不連外、不掛 scheduler。
- **V10.494 市場情報 MCP Fetch Candidate Queue Review gate**: 新增 `/api/market_intel/mcp_fetch_candidate_queue_review` 與 UI preview，只審核 candidate handoff 後的人工 queue review 草案；要求候選 key 完全對齊、`review_state=needs_review`、allowed actions 限人工確認/否決/延後、`queue_write_status=not_persisted`，且 API 不建立 queue、不更新 review_state、不寫 DB、不連外、不掛 scheduler。
- **V10.493 市場情報 MCP Fetch Candidate Handoff Review gate**: 新增 `/api/market_intel/mcp_fetch_candidate_handoff_review` 與 UI preview，只審核 parser review 後的候選交接包；要求 source/candidate key 完全對齊、queue policy 維持 `manual_candidate_review` / `preview_only`、候選數維持小批次，且 API 不建立 queue、不寫 DB、不讀 artifact、不連外、不掛 scheduler。
- **V10.491 市場情報 MCP Fetch Result Parser Review gate**: 新增 `/api/market_intel/mcp_fetch_result_parser_review` 與 UI preview，只審核操作員 shell parser 後貼回的結構化摘要；API 不讀 artifact、不執行 parser CLI、不抓外站、不寫檔、不開 DB、不掛 scheduler，且會阻擋 raw HTML/body/snapshot、secret/token 欄位與 side-effect flags。
- **V10.489 PChome 低分同款人工覆核回收與 gate-pass 風險邊界**: `marketplace_product_matcher` 新增三個窄範圍 focused identity：TS6 超美白香氛誘霜 120g/ml、W 修護保養蝸牛特潤修護面膜 6 片、Derma 大地 Eco 植萃護膚油 2 入。這些樣本只升到 `identity_review / manual_review`，不進 `price_alert_exact`；同版補 Clarins 身體油不同線、命名組合品數量反轉、isLeaf 香型數量不一致 hard veto，HOOOME 大理石暖燈單側設計差留人工覆核。
- **V10.488 市場情報 MCP Fetch Run Receipt gate**: 新增 `/api/market_intel/mcp_fetch_run_receipt` 與 UI preview，只審核操作員 shell dry-run 後貼回的 receipt；API 不執行 CLI、不抓外站、不寫檔、不開 DB、不掛 scheduler，且會阻擋 secret/token 欄位與 side-effect flags。
- **V10.473 背景 embedding 讀取 host_health skip**: `OllamaService.generate_embedding(..., allow_111_fallback=False)` 會先查最近 `host_health_probes`；若 GCP-A/GCP-B 在 20 分鐘視窗內已由 runtime probe 標成 unhealthy，背景 embedding 直接跳過該節點並開短暫 GCP circuit，不等待 30 秒 timeout、不落 111。DB 讀取失敗時 fail-open 回原本 retry，避免觀測層阻斷 embedding。
- **V10.472 GCP Ollama failover rootless 診斷**: 新增 `scripts/ops/diagnose_ollama_gcp_failover.sh` 與 DevOps SOP，可不需 root 檢查 GCP-A/GCP-B/111 direct、110 proxy `11435/11436` 與 GCP-B `bge-m3` runtime。現況確認：GCP-A `22/11434` refused、GCP-B `22/11434` open 但 SSH key denied、GCP-B embed OK、110:11435 502、110:11436 OK；primary 修復需 GCP/SSH 或 110 root 權限。
- **V10.471 GCP-B embedding timeout 校準**: GCP-B `bge-m3` `/api/embed` 直接實測約 6.4s / 7.3s / 23.5s，原 `OLLAMA_EMBED_MAX_TIMEOUT=15` 與 host health `OLLAMA_HOST_HEALTH_EMBED_TIMEOUT=8` 會誤判慢但成功的 embedding；預設改為 30s。背景 embedding 仍只跑 GCP-A/GCP-B，不落 111。
- **V10.470 Ollama host health 實作探針**: `run_host_health_probe()` 對 GCP-A / GCP-B 在 `/api/tags` 成功後追加短 `bge-m3` `/api/embed` probe，避免 GCP-B 出現 tags/version 正常、但實際 embedding runner 20s timeout 時仍被標 healthy；111 預設不做背景 embedding probe，避免監測任務把 fallback Mac 載入 `bge-m3`。
- **V10.469 Background embedding 降級語意修正**: `OllamaService.generate_embedding(..., allow_111_fallback=False)` 在 GCP-A/GCP-B 全失敗時會開啟短暫 failure circuit 並記 WARNING，不再把背景 `bge-m3` 降級熔斷每分鐘寫成 ERROR；同步或允許三主機 fallback 的 embedding 全失敗仍維持 ERROR，保留真正阻塞型故障訊號。
- **V10.468 Ollama import-time / embedding 熔斷治理**: `config.OLLAMA_HOST`、`HERMES_URL`、`EMBEDDING_HOST` 舊相容常數改成靜態核准 env reader，不再於 import 時呼叫 `resolve_ollama_host()`，避免 GCP-A/GCP-B 短暫拒連時把 process 常數 freeze 到 111。`generate_embedding(..., allow_111_fallback=False)` 在 GCP-A/GCP-B 都失敗後會開短暫 GCP embedding circuit，避免背景任務每筆重打兩台故障主機；111 仍不承接背景 `bge-m3`。維運盤點曾見 110 proxy 11435/11436 因 GCP 11434 refused 回 502；部署 smoke 時 GCP-B `/api/version` 已恢復 200 並成為動態路由落點，GCP-A 22/11434 仍 refused，後續需以 GCP 權限恢復 primary Ollama 主機或 SSH key。
- **V10.467 Focused exact total-price 安全通道**: `marketplace_product_matcher` 新增窄範圍 `focused_exact_total_price_safe` lane，僅針對正式近門檻樣本中同品牌、同品名、同規格/同入數的 3W CLINIC 粉底液 2入、花美水凝膠 3支、The Ordinary 咖啡因 EGCG 30ml、KUSSEN 屁屁膏 3入、Bone 擴香禮盒、1990 融燭燈白色款與 CANMAKE 淚袋盤，讓 `exact/manual_review` 可升到 `exact/total_price/price_alert_exact`；未放寬 `MIN_MATCH_SCORE`，DASHING DIVA、唇彩、香味、色號/款式敏感商品仍維持 variant / veto 保護。Production pilot 已將 SKU `6101639`、`10074951`、`7760902`、`TP00074980000005`、`14774766`、`10142589`、`10262470`、`10262471`、`11308520` materialize 到人工覆核隊列，`true_low_confidence` 802→793、`rescore_accepted_current` 38→47；`6101784` 即期品因商業條件不同仍留在低信心覆核。
- **V10.466 Rescore latest-state duplicate 修正與 7 SKU pilot**: `materialize_rescore_accept_reviews()` 的 duplicate 判斷改看最新 attempt，而不是歷史任一 accepted；若後續 crawler 又把同 SKU/候選覆蓋成 `true_low_confidence`，可重新追加 `rescore_accepted_current` 讓 Dashboard latest-state 正確進人工覆核。Production pilot 已將 SKU `14756069`、`11159042`、`13842560`、`8394210`、`15192547`、`10509765`、`10603780` materialize 到人工覆核隊列；`competitor_prices` 目標計數維持 7、`competitor_price_history` 目標計數維持 210，未寫正式價差表。
- **V10.465 Embedding GCP fallback 修正**: `OllamaService.generate_embedding(..., allow_111_fallback=False)` 若 resolver 因 unhealthy cache 回 111，會強制改試尚未嘗試的 GCP-A/GCP-B，不再直接 `break` 造成 `tried=[]` 或只試單台 GCP-B；背景 embedding 仍不允許落 111。
- **V10.464 Rescore SKU pilot 篩選**: `audit_competitor_match_attempt_rescore.py` 與 `fetch_match_attempt_rescore_rows()` 增加 `--sku` / `skus` 篩選，可針對 DR.WU 這類明確 cohort 做 3-10 筆精準 materialize，不必為了 pilot 掃整批 `true_low_confidence`。
- **V10.463 DR.WU / 達爾膚品牌 alias**: `marketplace_product_matcher` 補 `DR.WU / DR WU / DRWU / 達爾膚` 正規化，讓正式樣本中同規格玻尿酸保濕精華乳、杏仁酸亮白煥膚精華不再因品牌 token 不同被降成 brandless identity review；測試鎖住 exact / total_price / price_alert_exact。
- **V10.462 PChome 補抓 UI 語意收斂**: Dashboard 補抓區塊標題、AI 中樞按鈕、前端 confirm 與 API 回覆全數改用「PChome 補抓產線 / 補抓未搜尋 / 未搜尋補抓」，避免「待比對」殘留在操作入口，和低信心待人工覆核混淆。
- **V10.461 Dashboard 未搜尋語意修正**: 商品看板未進入 PChome 搜尋/補抓的品項不再顯示籠統「待比對」，改成「尚未搜尋」與「尚未進入 PChome 補抓」，避免操作員誤以為已有候選但尚未人工覆核；前端守門測試鎖住不得回退成舊文案。
- **V10.460 ElephantAlpha 告警決策信封**: `resource_optimization` 會為資源壓力告警產生 deterministic `decision_envelope`，證據只來自 `action_plans`、CPU 實測與 hygiene 結果，Telegram 同時顯示決策信封、量測指標、判讀、系統處置與下一步；`ea_escalation` 模板也會渲染信封並使用 `decision_id` 作為 `momo:eig:*` callback，避免低信心升級告警只剩空泛文字或不可追蹤按鈕。
- **V10.459 protected_existing_match 決策封包**: PChome 覆核信封開始解析 `existing_match_conflict`，把既有正式候選、新候選、雙方 matcher score 與 score delta 寫入 evidence / expected_impact / guardrails；新候選即使分數較高也維持 `can_auto_execute=false`，但 OpenClaw、PPT、Dashboard 與人工覆核可清楚看見該比較哪兩個候選。
- **V10.458 OpenClaw / PPT 決策信封摘要**: 新增 `summarize_review_decision_envelopes()` 作為 PChome 覆核信封共用摘要 formatter；OpenClaw 週報/日報/月報、OpenClaw Bot competitor PPT data_summary 與 PPT KPI slide 都使用同一份 HITL / 資料品質 / action / trace 摘要，不再各自手寫 attempt_status 翻譯。
- **V10.457 Dashboard / Excel 決策信封連動**: 商品看板 PChome 覆核卡顯示 `decision_envelope` 的決策等級、資料品質、HITL 與 trace；`/api/export/excel/pchome-review` 匯出新增決策信封 ID、建議代碼、責任人、資料品質、自動執行允許、阻擋原因與證據摘要，讓下載檔仍保留不可自動寫正式價差的 guardrails。
- **V10.456 review queue 決策信封**: `fetch_competitor_review_queue()`、`fetch_competitor_review_queue_page()` 與 `/api/pchome-review/queue` 每筆 PChome 覆核候選都輸出 `decision_envelope`，包含標的 SKU/PChome 候選、match evidence、建議人工動作、預期價差、資料品質與「不可自動寫正式價差」guardrails；review queue cache key 升到 v3，避免正式環境沿用舊 payload。
- **V10.455 EventRouter 決策信封直送**: 已帶 `decision_envelope` 的價格/覆核事件會略過 L1/L2 AI 重新摘要，直接用 Telegram 證據模板通知；決策信封新增標的區塊，顯示 SKU、商品名稱、PChome 候選 ID/名稱，避免 NemoTron 已有實證的價格告警被二次生成文字稀釋或產生額外模型呼叫。
- **V10.455 rescore variant retraction CLI**: `audit_competitor_match_attempt_rescore.py --retract-variant-accepted` 可找出最新仍為 `rescore_accepted_current` 且帶 `variant_selection_review` 的 SKU，追加 `true_low_confidence` 退回列；保留歷史 audit trail，不刪資料、不寫正式價格表。
- **V10.454 production rescore 入人工覆核隊列**: 以 latest-sku-only 口徑重算 745 筆 `true_low_confidence`，先追加 2 筆人工覆核列；V10.454 gate 補上 `variant_selection_review` 排除後，SKU `8884618` KATE 怪獸級持色唇膏（MOMO 多款任選 vs PChome 單一水光款）已退回最新 `true_low_confidence`，最終只保留 SKU `10922465` Herbacin 小甘菊護手霜 20ml 為 `rescore_accepted_current`。這次只寫 `competitor_match_attempts` 人工覆核列，未寫 `competitor_prices` / `competitor_price_history`，並已清除 Dashboard 與 competitor intel cache。
- **V10.454 feeder / rescore 正式寫入閘門**: `CompetitorPriceFeeder` 現在只允許 `exact + total_price + price_alert_exact` 的 matcher 結果自動寫入 `competitor_prices`；`manual_review`、`identity_review`、`variant_selection_review`（例如 MOMO 多款任選唇膏對 PChome 單一水光款）會保留在 `true_low_confidence` 覆核，不得因分數剛過門檻而污染正式比價資料。Rescore audit 也會把 `variant_selection_review` 擋在 `accepted_current` 之外。
- **V10.453 matcher 安全回收規則**: 新增 Herbacin 小甘菊護手霜 20ml brandless 同款 anchor；修正 `EX8` 型號不再被誤解析為 `x8` 入數；新增香氛固體凝膠 / 空氣芳香劑一側泛稱、一側明確香味或 No. 款式的 `aroma_scent_variant_conflict` veto。這輪目標是讓 retryable replay 可救回真同款，同時先封住 MIRAE 入數與 GONESH 香味款式的假陽性。
- **V10.452 PChome rescore audit 最新狀態口徑**: `scripts/audit_competitor_match_attempt_rescore.py` 與 `fetch_match_attempt_rescore_rows()` 預設改成先取每個 SKU 最新 attempt，再套用 status / reason 篩選，與 Dashboard review queue 一致；需要回看歷史候選時才使用 `--include-historical-candidates`，避免舊低信心紀錄讓已修正、已否決或已入隊 SKU 重複回到操作報表。
- **V10.451 low_score 操作分流拆分與 queue API**: Dashboard 比價覆核頁不再只給一個籠統低信心分頁；新增「近門檻可救」「證據不足」「低信心舊候選」三個篩選，`competitor_intel_repository.REVIEW_STATUS_FILTER_GROUPS` 同步提供對應分流，`/api/pchome-review/queue` 也能用同一套 `review_status` 做 read-only smoke / operator tools 查詢，讓 matcher 回刷、人工覆核、OpenClaw 報表能分清楚可自動回收、應保守等待、與需補搜尋的候選。
- **V10.450 PChome 覆核 fast-count UI 語意與重算可採用指標**: 預設全量覆核頁跳過 exact count 時，模板會以「約」標記快取總數，避免操作員把快取總數誤認為即時計算；搜尋、分類與單一狀態分流仍保留精準總數。`fetch_competitor_coverage()` 同步輸出 `rescore_accepted_count`，Dashboard、daily/growth 與 OpenClaw 摘要會把「重算可採用待審」獨立顯示，不再只混在一般覆核隊列。
- **V10.449 PChome 覆核 exact count 條件修正**: 只有預設「全部覆核、無搜尋、無分類」頁跳過 exact count；若使用搜尋詞、分類篩選或單一 review status，仍保留精準總數，避免操作員分頁資訊失準。
- **V10.448 PChome 覆核全量頁跳過 exact count**: `review_status=all` 改用 shared overview cache 的待處理總數作為分頁總數提示，當頁只查 50 筆；單一狀態分流仍保留 exact count，避免每次操作全量覆核頁都為總筆數重掃整個 review queue。
- **V10.447 PChome 覆核頁查詢方向反轉**: review queue page 改由最新 `competitor_match_attempts` 的可覆核狀態先縮小候選，再 join ACTIVE 商品與最新價，並用 `NOT EXISTS` 排除已有有效 `identity_v2` 正式 PChome 價格；避免「全部覆核」每次先掃全站 ACTIVE 商品後才過濾，提高核心比價覆核頁可操作性。
- **V10.446 PChome 覆核頁 overview timeout 修正**: 覆核頁輕量 render path 的總覽改讀既有 shared dashboard cache / stale cache；若快取不存在，只用目前覆核頁資料補足 review count 與狀態分流，不再即時呼叫 `_load_competitor_decision_overview(session)` 的重型 SQL，避免正式資料量下 statement timeout。
- **V10.445 PChome 覆核頁輕量渲染路徑**: `filter=pchome_review` 直接走覆核隊列專用 render path，不再先建完整 Dashboard `unique_items`；當頁只查 50 筆覆核 SKU 的商品資料、最新價、昨日價與週前價，仍沿用同一張新版表格、狀態分流、PChome 候選說明與人工覆核按鈕，降低核心比價覆核頁的全站資料負載。
- **V10.444 PChome 覆核頁查詢瘦身**: `fetch_competitor_review_queue_page()` 將原本 count + page 兩次重跑 review CTE 改成單次 SQL 的 `total_rows` + `paged_rows` 查詢，同步取得總數與頁面資料，降低 `/?filter=pchome_review` 對 `latest_momo` / `latest_attempt` / `valid_competitor` 的重複掃描；正式站小批次 rescore 入隊後，用於維持核心比價覆核頁可操作速度。
- **V10.443 PChome rescore 人工覆核入隊**: `scripts/audit_competitor_match_attempt_rescore.py --apply-accepted` 只會把最新版 matcher 已通過門檻的舊低信心候選追加為 `rescore_accepted_current` attempt，進入商品看板人工覆核隊列；不寫 `competitor_prices`、不寫 `competitor_price_history`，必須由操作員按「採用同款」後才正式更新 PChome 價差。Dashboard 補上「重算可採用待審」分流與狀態文案，避免安全回刷候選混在一般低信心項目裡。
- **V10.442 CI/CD legacy GitLab 探測降噪**: `/cicd` 舊 GitLab pipeline API 預設改為 disabled，除非明確設定 `GITLAB_ENABLED=true` 並提供 `GITLAB_TOKEN`，否則不再打 `192.168.0.110:8929` 或 SSH fallback；正式 responsive smoke 造訪 `/cicd` 時只呈現可診斷空狀態，不再把已退役 GitLab endpoint 的 connection refused / permission denied 寫成錯誤噪音。
- **V10.441 PChome matcher re-score audit**: 新增 read-only `competitor_match_attempt_rescore_audit` 服務與 `scripts/audit_competitor_match_attempt_rescore.py`，可針對既有 `competitor_match_attempts` 用最新版 matcher 重新分類成 `accepted_current` / `unit_comparable_current` / `identity_veto_current` / `low_score_current`，預設不寫 DB、不更新正式價格；商品看板同步補蘭蔻/達特醫/hoi/Saugella/Lactacyd 等 focused matcher reason 中文標籤。正式抽樣中 31 筆舊 `strong_exact_spec_match` 低信心資料，最新版 matcher 可讀出 10 筆 gate pass、1 筆單位價、11 筆 hard veto、9 筆仍低信心，作為後續人工覆核與批次回刷前的安全量化。
- **V10.440 Mustela 爽身潤膚乳同款 anchor**: marketplace matcher 新增 `慕之幼爽身潤膚乳` identity anchor，並讓標題中插入「加量版」時仍可抽出同一身份詞；正式樣本 `【Mustela 慕之恬廊】慕之幼 加量版爽身潤膚乳 500mlX2入` vs `【慕之恬廊】慕之幼爽身潤膚乳(500毫升X2入)` 由 0.741 提升到 0.801，維持 `hard_veto=false`、人工 review 型態，不放寬全域門檻、不寫正式 `competitor_prices`。
- **V10.439 外部 BI / 資料協作入口收斂**: `/metabase`、`/grist` 保持在 momo-pro 內部診斷 bridge，不再出現空白頁或錯連其他專案；`.env.example` 與 bi profile 的 Grist 預設 URL 改為 `https://mo.wooo.work/grist` / `GRIST_APP_HOME_URL`，測試同步守住 `grist.wooo.work` 與 `awoooi` 不再回到 app/template/env/compose 導覽設定。外部工具頁 H1 移除 viewport font scaling，改用新版 token 與手機 media query。
- **V10.438 PPT QA 失敗重跑精準化**: `/observability/ppt_audit_history` 的 QA 失敗與 issue triage 卡片會從 PPT 檔名前綴推回原始 `report_type`，不再把所有視覺 QA 失敗硬編成 daily 重跑；單筆「重跑」會以 `force=true` 呼叫補齊 API，並在產生前只失效同一 `report_type + parameters` 的 active `ppt_reports` cache，避免重新產出仍命中舊簡報。頁面也把 audit lane 的預覽按鈕補上，讓失敗檔案可直接站內回放 PDF/PPTX 預覽。
- **V10.437 業績圖表載入韌性與 QA 升級**: `analysis-chart-theme.js` 的 Chart.js loader 加入 4.5 秒 timeout 與 jsDelivr → unpkg → cdnjs 三來源 fallback；若外部 CDN 卡住或失敗，`/daily_sales`、`/growth_analysis` 會切到既有 HTML snapshot / fallback 圖表，不再留下空白圖表框。`check_sales_charts_runtime.js` 也從「canvas 有墨點」升級為檢查非零 dataset、可見元素、彩色資料筆跡與 canvas ink，避免只有座標軸的假通過。
- **V10.436 daily_sales snapshot_date 型別修復**: `/daily_sales` 日期窗口查詢改為依 DB dialect 明確 cast：PostgreSQL 使用 `"snapshot_date"::date` 並把參數 `CAST(:start_date AS date)` / `CAST(:end_date AS date)`，SQLite 使用 `date("snapshot_date")`；metadata / fingerprint 查詢同步引用 cast 後日期，避免正式庫 `snapshot_date` 為 text 時出現 `text = date` / `text >= date` 類型錯誤。後台 `chart_generator_service.monthly_overview_chart()` 的月業績 SQL 也改為 `snapshot_date::date`，防止報表圖表因 text 欄位而空白。
- **V10.435 商品列 PChome 狀態診斷翻譯**: Dashboard 商品列的 `_build_pchome_match_status()` 補上 `makeup_finish_conflict`、`nail_tool_function_conflict`、`schick_razor_line_conflict`、`variant_selection_review` 等具體狀態文案；`_load_pchome_match_attempt_map()` 同步解析 `match_diagnostic_json` 產生 `diagnostic_reasons` / `diagnostic_reason_text`，讓 overview、覆核隊列、商品列表與 Excel 的診斷語意一致。
- **V10.434 PChome 人工覆核閉環補搜尋**: 商品看板 PChome review queue 新增「補搜尋」人工決策按鈕，對應 `needs_research` → `manual_needs_research`；`manual_rejected`、`manual_unit_price_required`、`manual_needs_research` 納入全部覆核隊列與「人工閉環」篩選，避免操作員按完否決/單位價/補搜尋後項目從列表消失、後續無法追蹤。
- **V10.433 PChome 覆核診斷標籤與 variant 回刷補強**: `competitor_intel_repository` 的 review queue / 商品看板 / Excel export 改為優先讀取 `match_diagnostic_json.reasons`，再 fallback 文字版 `error_message`；同步補 `makeup_finish_conflict`、`nail_tool_function_conflict`、`schick_razor_line_conflict`、`variant_descriptor_conflict` 等操作員可讀標籤，讓商品列表顯示「妝效質地不同、工具功能不同、除毛刀品線不同」而不是 raw machine code。matcher 另補 MUJI 精油芬香護手霜的 brandless exact recovery，PChome 標題缺品牌但身份詞與 50g 規格一致時可進 manual-review identity；peripera 多色任選 vs 單一色號會標記 `variant_selection_review` 並留在 `true_low_confidence`，避免被誤列為可批次救回。
- **V10.432 近門檻比價 hard-veto 補強**: marketplace matcher 不放寬 `MIN_MATCH_SCORE`，針對正式 `true_low_confidence` 前段新增窄範圍防錯配：M.A.C `MACximal` 柔霧唇膏 vs 緞光唇膏標記 `makeup_finish_conflict`、ERBE 指甲清垢棒 vs 指甲緣刨刀標記 `nail_tool_function_conflict`、Schick 舒芙 vs 舒綺仕女除毛刀標記 `schick_razor_line_conflict`，三者皆進 hard veto；同時把 `潤膚乳` / `身體乳` / `嬰兒乳液` / `寶寶乳液` 納入乳液型別，讓慕之幼爽身潤膚乳等真同款回刷更穩定。新增測試鎖住 MUJI 護手霜、Mustela 慕之幼潤膚乳、Herbacin 小甘菊護手霜可 exact，並確保高 variant 錯配不被 focused rule 推進。
- **V10.431 Telegram callback byte-safe**: `triaged_alert()` 的 `momo:eig:*` HITL callback 改為依 UTF-8 byte 長度截斷，不再用字元數截斷；中文或過長 `event.id` / `decision_envelope.decision_id` 仍會保留可追蹤 payload，且保證 `callback_data` 不超過 Telegram 64-byte 限制，避免專業排版告警因 callback 太長而整則送出失敗。
- **V10.430 NemoTron 決策 callback 追蹤 ID 修補**: `NemoTronDispatcher._send_telegram()` 會把 `decision_envelope.decision_id` 提升為 EventRouter `event.id`；`triaged_alert()` 也會在上游缺 `event.id` 時改用 `decision_id` 產生 `momo:eig:*` callback，避免價格決策通知的「忽略此事件」audit 落成 `unknown` 而無法追查。
- **V10.429 111 / NemoTron 治理回歸補齊**: 補齊 `.env.example` 中 111 circuit breaker、111 allowlist proxy、部署 smoke、資料庫與 Redis runtime keys，並同步大檔 inventory 行數，讓完整測試可覆蓋最新 `V10.425`–`V10.428` 變更；此版不放寬商品比對門檻、不修改 `competitor_prices` 寫入規則。
- **V10.428 NemoTron 價格決策信封落地**: `NemoTronDispatcher` 的 `price_alert` 與 `human_review` 事件現在會產生 12 Agent 共用 `decision_envelope`，把同款證據、價差、七日銷量變化、營收流失、建議行動、HITL guardrails、資料品質與 trace 同步寫入 EventRouter event 與 KM metadata；這讓 Telegram、AI 觀測台、PPT QA 與後續 Agent 協作能讀同一份可稽核證據，而不是各自解析告警文字。
- **V10.427 111 fallback circuit breaker**: `OllamaService` 在選到 111 final fallback 前先讀 `ai_calls` 近 60 分鐘比例；若 Ollama 呼叫 >=20、111 >=5 且占比 >=5%，會短暫跳過 111 並清除 resolved host cache，避免 111 在已偏高時繼續承接長任務。DB 觀測失敗採 fail-open，避免觀測層故障反向中斷 GCP-A/GCP-B 正常路由。
- **V10.426 111 proxy 拒絕日誌去重**: `ollama111_allow_proxy.py` 對同一來源 IP 的 reject log 預設 60 秒去重，保留 110 / 121 被擋的可觀測性，同時避免旁路 VM 持續探測時把 111 的 proxy log 與磁碟 I/O 刷高。
- **V10.425 111 fallback 使用率護欄**: Scheduler 每 15 分鐘只讀 `ai_calls` 檢查 111 Ollama fallback 使用率，預設 60 分鐘內 Ollama 呼叫 >=20、111 呼叫 >=3 且占比 >=5% 才推 Telegram，並列出 111 caller Top 5；此護欄只觀測與告警，不改路由、不寫 DB、不重啟服務，讓 111 被異常承接高負載時可即早發現。
- **V10.424 111 proxy LaunchAgent 安裝路徑穩定化**: `install_ollama111_allow_proxy.sh` 會把 proxy script 複製到 `~/.local/share/momo-pro-system/ollama111_allow_proxy.py` 後再寫入 LaunchAgent，避免 111 重啟或 iCloud repo 路徑未掛載時代理失效；同時清空舊 stderr log，讓安裝後狀態更容易判讀。
- **V10.423 12 Agent 決策信封**: `triaged_alert()` 支援 `decision_envelope` 結構化區塊，讓 Hermes / NemoTron / OpenClaw / ElephantAlpha 與後續 12 角色決策統一輸出 `severity`、`evidence`、`recommended_action`、`expected_impact`、`confidence`、`guardrails` 與 `trace`；缺證據時必須明確標記資料品質與 HITL 邊界，避免再出現空泛效益預測或不可追溯告警。
- **V10.422 111 proxy LaunchAgent 持久化**: 新增 `scripts/ops/install_ollama111_allow_proxy.sh`，在 111 以 user LaunchAgent 安裝 `com.momo.ollama111-allow-proxy`，啟動時設定 `OLLAMA_HOST=127.0.0.1:11434`、重啟 Ollama、載入 allowlist proxy，避免重開機或重新登入後 111 又回到 LAN 全開狀態。
- **V10.421 Kanebo Milano / hoi 蠟燭品類防錯配**: marketplace matcher 追加 `kanebo_milano_type_conflict` 與 `hoi_candle_line_conflict`，將 Kanebo Milano Collection 蜜粉餅 vs 絕色香水、hoi 日京山風香氛蠟燭 vs hoi!LAB 實驗室香氛蠟燭經典篇列為 hard veto；同品牌、同系列字樣或同容量仍不可跨品類/跨產品線直接比價。
- **V10.420 111 Ollama LAN allowlist proxy**: 追查 111 高負載時確認來源不是 momo-pro，而是 110 上 `awoooi-cd` 臨時測試與 121 VMware VM 直接打 `192.168.0.111:11434`，繞過 `ai_calls` 與 momo-pro router 載入 7B runner。新增 `scripts/ops/ollama111_allow_proxy.py`，將真實 Ollama 收斂到 `127.0.0.1:11434`，由 user-space proxy 綁 `192.168.0.111:11434` 並預設只允許 111 本機與 188 生產宿主；110 / 121 會被 reset，111 fallback 保留給 momo production。
- **V10.419 Dr.Hsieh LabSmart 精華品線防錯配**: marketplace matcher 追加 `dr_hsieh_labsmart_line_conflict`，只針對 Dr.Hsieh/達特醫的 `LabSmart Hi-Tech` / `LabSmart Classic` 精華被拿去對 `神經醯胺多重修復保濕精華液` 的近門檻錯配做 hard veto；同品牌同容量但不同產品線不再因規格相同停在 `true_low_confidence` 或被誤推進比價。
- **V10.419 production pilot**: 正式回刷 SKU `10413050` / `10413051`，兩筆 Dr.Hsieh LabSmart 精華 vs 神經醯胺多重修復精華皆由 `true_low_confidence` 轉為 `identity_veto`，`diagnostic_codes=["dr_hsieh_labsmart_line_conflict"]`；`matched` 維持 1619、`true_low_confidence` 753→751、`identity_veto` 4011→4013，無正式 `competitor_prices` 覆寫。
- **V10.418 bge-m3 一致性檢查不打 111**: `verify_embedding_consistency()` 預設只比對 GCP-A / GCP-B，不再每週把 111 Mac 納入 bge-m3 背景驗證；新增 `EMBED_CONSISTENCY_INCLUDE_111=false` 預設，只有救急需要驗證 fallback 模型時才 opt-in。這補上 V10.417 後仍會由監測任務載入 111/GCP-B embedding runner 的缺口。
- **V10.417 Embedding/RAG 背景負載保護**: `OllamaService.generate_embedding()` 新增 `allow_111_fallback`、timeout cap、輸入長度 cap 與 `/api/embed keep_alive=1m`；OpenClaw learning worker 與 RAG 查詢預設只跑 GCP-A → GCP-B，不再把 `bge-m3` 背景 embedding / semantic RAG 轉嫁到 111。預設 `OLLAMA_EMBED_TIMEOUT=15`、`OLLAMA_EMBED_MAX_TIMEOUT=15`、`OLLAMA_EMBED_MAX_CHARS=4000`，避免 embedding worker 在 GCP-B/111 長時間常駐或拖住 runner。
- **V10.416 私密清潔 / 彩妝用途 / 棉棒 / 蘭蔻品線防錯配**: marketplace matcher 追加窄範圍 hard-veto guard，讓 SAUGELLA 日用/加強 vs 黃金女郎型、Lactacyd 清新舒涼 vs 生理呵護、LUNASOL 頰彩 vs 眼彩、MUJI 細軸棉棒 vs 黑色棉棒、LANCOME 超極光晶露 vs 超極限肌因精華露不再停留在模糊 `true_low_confidence`，而是以 `*_variant_conflict` / `makeup_usage_conflict` / `lancome_line_conflict` 明確拒絕；不調整 `MIN_MATCH_SCORE`，也不放寬真同款進 matched 的門檻。
- **V10.416 production pilot**: 正式回刷 7 筆近門檻錯配樣本，SAUGELLA 2 筆、LUNASOL 頰彩 vs 眼彩、LANCOME 超極光 vs 超極限、我的心機兒童防曬 vs 海洋友善防曬、Lactacyd 清新舒涼 vs 生理呵護、MUJI 細軸棉棒 vs 黑色棉棒皆更新為 `identity_veto`；`matched` 維持 1619、`true_low_confidence` 759→753、`recoverable_low_score` 1→0、`identity_veto` 4004→4011，無正式 `competitor_prices` 覆寫。
- **V10.415 Hermes 預設不落 111 + 比對保護**: `OllamaService.generate()` 新增 `allow_111_fallback` 參數，預設維持三主機相容；Hermes intent / competitor analyst 改以 `HERMES_ALLOW_111_FALLBACK=false` 預設只跑 GCP-A → GCP-B，兩台都不可用時交給規則引擎或 DB 證據 fallback，不再把批量價格分析與意圖分類轉嫁到 111。同版 marketplace matcher 將防曬類列入 variant-sensitive，排除 SPF/PA/UVA/UVB 這類規格 token 被誤當型號，避免「兒童防曬乳」與「海洋友善保濕防曬乳」誤配；Recipe Box 兒童防曬氣墊粉餅保留精準同品線例外；另新增 `pack_quantity_difference`，讓 Beauty Foot 足膜 5入 vs 4入走 unit comparable，不再卡在低信心。
- **V10.415 production pilot**: 上線後以 SKU `12670442` 單筆回刷驗證 Beauty Foot 足膜 5入 vs 4入：最新 attempt 由 `true_low_confidence` 轉為 `refresh_unit_comparable`，`diagnostic_codes` 補上 `pack_quantity_difference` / `unit_comparable`，`matched` 不增加、正式 `competitor_prices` 不覆寫；整體最新分布由 `true_low_confidence=760, refresh_unit_comparable=64` 變為 `true_low_confidence=759, refresh_unit_comparable=65`，符合「可單位價覆核但不可直接當同款總價告警」邊界。
- **V10.414 MCP fetch run readiness gate**: 新增 `mcp_fetch_run_readiness` read-only builder、GET/POST endpoint、UI run readiness 審核面板與 deployment readiness smoke target，在 run package 後檢查 command preview、receipt path、artifact path、節流/timeout/dry-run-first 與操作員 shell-only 邊界；API/UI 不執行 CLI、不抓外站、不寫檔、不開 DB、不掛 scheduler，只放行到人工 shell dry-run 與後續 receipt gate。
- **V10.413 Code Review 預設保護 111 fallback**: production `ai_calls` 顯示 GCP-A 不可達時，Code Review OpenClaw 會先耗掉 primary timeout，再讓 GCP-B 撐到 60s，最後落到 111 `llama3.2` 成功，造成 111 與 GCP-B 高負載。新增 `CODE_REVIEW_ALLOW_111_FALLBACK=false` 預設：Code Review 的 Hermes LLM scan / OpenClaw assessment 只跑 GCP-A → GCP-B；只有明確設 true 才把部署後重分析丟給 111。若 GCP-A/GCP-B 都失敗且 Claude/Gemini 未顯式開啟，改回 deterministic 本地降級摘要，不呼叫 Gemini，也不再用 111 承接非即時重分析。
- **V10.412 MCP fetch run package gate**: 新增 `mcp_fetch_run_package` read-only builder、獨立 route extension、GET/POST endpoint、UI run package 審核面板與 deployment readiness smoke target，將已通過的 target review 轉成操作員可覆核的 command argv preview 與 receipt path 契約；API/UI 不執行 CLI、不抓外站、不寫檔、不開 DB、不掛 scheduler，只放行到後續 run readiness review。
- **V10.411 rom&nd / Summer’s Eve / Solone 近門檻 review-only 回收**: marketplace matcher 追加三條窄範圍 focused identity：rom&nd 果汁唇釉 2.0 catalog、Summer’s Eve 舒摩兒全肌防護浴潔露 2入、Solone 持久眼線筆；皆只進 `identity_review` / manual-review，不直接價格告警。production pilot 已回刷 3/3，`matched` 1616→1619、`true_low_confidence` 763→760；rom&nd 染眉膏 ZO&FRIENDS 色號、Summer’s Eve 雙天王任選、Lactacyd 清新舒涼 vs 生理呵護、MAC 柔霧 vs 緞光、NIVEA / 曼秀雷敦包數差異仍不自動救回，維持準確率優先。
- **V10.410 Code Review timeout 梯度改為保護 111**: 部署後實測顯示 GCP-A 從 188 失聯時，Code Review 仍會先等 primary 45s，GCP-B 完整審查 prompt 又常因 25s 太短而 timeout，最後轉落 111。`CODE_REVIEW_OLLAMA_TIMEOUT` 預設收斂為 `15s`，`CODE_REVIEW_OLLAMA_SECONDARY_TIMEOUT` 放寬為 `60s`；Hermes LLM scan 若啟用則 primary `15s`、secondary `45s`。目標是 A 掛時更快讓位給 B，並給 B 足夠時間完成，避免過早壓到 111。
- **V10.409 MCP fetch target review gate**: 新增 `mcp_fetch_target_review` read-only builder、GET/POST endpoint、UI target review 審核面板與 deployment readiness smoke target，讓 manual fetch handoff 通過後，先審核 adapter registry 公開入口、每平台節流、樣本數、timeout 與 rollback plan；API/UI 不保存 payload、不發外部 request、不開 DB、不寫入、不掛 scheduler，也不會自動打開 manual fetch。
- **V10.408 OPI 指甲油 catalog review-only 回收**: marketplace matcher 針對 OPI 類光繚指甲油加入同系列 catalog focused identity，只在「白日夢遊」或「驕傲果凍」系列名雙方一致時進 `identity_review`；12色/11色視為可選色號數差異，不當作販售件數，跨系列仍維持 suppress。production pilot 已回刷 KATE 怪獸級持色唇膏限量款與兩個 OPI SKU 共 3/3，`matched` 1613→1616、`true_low_confidence` 766→763，三筆皆為 `alert_tier_identity_review` / `price_basis_manual_review`，不進 Hermes 直接價格告警。
- **V10.407 Hermes/OpenClaw runner 熱駐留收斂**: V10.406 後續觀測顯示 GCP-B 仍會被 Hermes/OpenClaw 的 `24h` keep-alive runner 壓高 load，導致 GCP-B generate timeout 後轉落 111。`HERMES_KEEP_ALIVE` 與 `OPENCLAW_STRATEGY_OLLAMA_KEEP_ALIVE` 改為 env 可控且預設 `5m`，並補測試禁止 OpenClaw strategy 再硬寫 `keep_alive="24h"`；GCP-A 目前從 188 仍逾時，需另行修復主機/防火牆。
- **V10.406 Code Review Ollama keep-alive 收斂**: production audit 顯示 Gemini 24h 已為 0，但 GCP-A `34.143.170.20:11434` 從 188 逾時、GCP-B 曾因多個 Ollama runner 長駐造成 generate timeout，導致部署後 Code Review 轉落 111。`CODE_REVIEW_OLLAMA_KEEP_ALIVE` 預設由 `24h` 改為 `5m`，讓 GCP-B/111 的 code review runner 不再長時間常駐；實測已重啟 GCP-B Ollama 並確認 `gemma3:4b` 可於約 6.2s 完成短生成。
- **V10.405 MCP manual fetch handoff gate**: 新增 `mcp_manual_fetch_handoff` read-only builder、GET/POST endpoint、UI handoff package 審核面板與 deployment readiness smoke target，讓 runtime promotion package 搭配操作員公開頁面、節流、無登入/反爬、無 DB、無 scheduler 確認後，只放行到人工 fetch gate operator review；API/UI 不保存 payload、不打 health、不開 DB、不抓外站、不掛 scheduler，也不會自動打開 manual fetch。
- **V10.404 Hermes 競價威脅漏斗只吃 direct alert**: `HermesAnalystService.fetch_candidates()` 的 `competitor_prices` JOIN 新增硬條件，只讓 `match_type=exact`、`price_basis=total_price`、`alert_tier=price_alert_exact` 的 identity_v2 配對進入 Hermes 競價威脅分析；`identity_review`、`unit_price_review` 與 `suppress` 仍保留在 dashboard / 人工覆核資料流，但不再消耗 Hermes token 或被上游視為直接價格威脅候選。production fresh 配對分布顯示直接告警約 497 筆、覆核型約 216 筆，本版將兩者在 AI 威脅入口切開。同版 matcher 追加 KATE 怪獸級持色唇膏、植村秀武士刀眉筆筆蕊、The Forest 焦糖楓葉擴香禮盒等近門檻 review-only 回收線，仍只進人工覆核，不直接價格告警。
- **V10.403 近門檻候選重驗擴池**: production 最新 72h attempt audit 顯示 7853 筆近門檻/被擋候選中，有 105 筆可被現行 matcher 回收，其中 46 筆已達 `price_alert_exact`、59 筆只進 `identity_review`。`CompetitorPriceFeeder._fetch_retryable_candidate_skus()` 擴大每日 revalidation 候選池，納入 `true_low_confidence`、`unit_comparable`、`refresh_unit_comparable` 與高分 `identity_veto`；但仍要求 PChome product_id、`best_match_score >= 0.70`，且正式寫入前必須由現行 matcher 重判、通過 hard-veto 與既有配對保護。
- **V10.402 catalog variant identity-review 回收**: marketplace matcher 新增 Johnson’s 嬰兒潤膚乳 catalog 對同香型、IM MEME 涼感定妝噴霧、SO NATURAL FIXX 定妝噴霧三條 review-only focused identity，讓同品線 catalog / variant 候選可脫離 `true_low_confidence` 但只進 `identity_review`，不直接價格告警；同版明確保留 MUJI 品牌缺漏護手霜等 brandless catalog 案例在低信心，避免品牌缺漏與多款任選同時存在時被過度救回。
- **V10.401 focused identity 邊界整理**: 將 Laundrin TOKYO 車用夾式消臭芳香劑判定抽成 `_has_laundrin_tokyo_car_freshener_alignment()`，並在 variant descriptor guard 中豁免同一條強身份線，避免 TOKYO / 車用 / 芳香劑語序差異造成誤擋。Yuskin 經典乳霜 30g 6 入組改用 `_has_exact_count_alignment()` 判斷包數，保留 6入 vs 6盒這類同數量但不同容器字詞的人工覆核路徑。
- **V10.400 氣墊粉餅補充蕊包數正規化**: marketplace matcher 針對氣墊粉餅新增保守的 `cushion_refill_pack_alignment`，只在一側明確為 `一盒兩蕊 / 2蕊`、另一側為單規格 `15g x2` 這類乘數包裝時，解除 `multi_component_conflict` 並進 `identity_review`。CLIO 羽緻無限緞光氣墊粉餅「一盒兩蕊」可被同款覆核；`2盒4蕊` 對 `15g x2` 仍維持 hard veto。同版補香氛蠟燭、TOKYO 車用消臭芳香劑、融蠟燈與有機護膚油 search identity anchors。離線 audit 759 筆 accepted 從 753 提升到 754，剩餘 5 筆 fresh veto 皆為應擋的套組/品類差異。
- **V10.399 多香味 catalog 價格告警降級**: marketplace matcher 新增 `variant_selection_review`，當一側是無明確選項的商品線、另一側列出多個具名香味/款式選項時，允許同款身份回收但只進 `identity_review`，不直接進 `price_alert_exact`。首個正式案例是 HH 女性私密衣物抗菌手洗精 200ml 對 PChome 白麝香/清新花園/寶貝粉香多香味 listing；此規則避免把多香味 catalog 價格誤當單一 variant 精準比價。
- **V10.398 true low confidence 保守回收**: marketplace matcher 針對正式前段 `true_low_confidence` 補一輪 focused exact identity lines，讓 Baan 嬰兒修護唇膏、植村秀 3D 極細防水眼線膠筆、YSL 恆久完美透膚煙染腮紅、HH 私密植萃美白緊緻凝露、Lab52 學習刷牙漱口水、Benefit 經典菲菲染唇液、Herb24 晨霧純精油擴香儀、Pavaruni 40 香味 10ml 精油與 GATSBY 爆水擦澡濕巾等近門檻真同款可被回收；未放寬 `MIN_MATCH_SCORE`。同版保留 peripera 多色任選對單一色號、LUNASOL 頰彩對眼彩組、MUJI 細軸棉棒對黑色棉棒的低信心保護，並讓多組件套組即使達強身份證據也停在 `identity_review`，避免總價被誤當精準價格告警。

### 2026-05-21：瀏覽器測試守門與 PChome 熱路徑優化
- **V10.397 離線 audit false negative 收斂**: marketplace matcher 針對 audit 剩餘 fresh bad 補三個保守修正：`200ml+200ml` 這類括號內規格串不再被計成額外組件；Kiehl’s `1號護唇膏` 的 `1` 視為商品線名稱而非色號；P.SHINE BEAUTY FOOT 雙面足部去硬皮磨砂棒以品牌 + 足部硬皮磨砂棒語意進 `identity_review`。同批補 focused exact identity lines，讓 Biodance、SAB、LUSH、Kanebo、ARTMIS、Nailmatic、小浪、YUNMI、AQUIESSE、資生堂等低分但強證據同款被正確拉回；高證據 exact 才可進 `price_alert_exact`，證據不足者仍進 `identity_review`。離線 audit fresh bad 從 9 降到 6，剩餘皆為多組件/套組差異。
- **V10.396 多選 catalog 對 generic count 組合放行**: marketplace matcher 對「多款任選 catalog listing」對上同數量 generic `N入組` 候選新增保守豁免：需品牌、品類、基礎規格與數量一致，且 generic 端沒有具名色款/香味選項，才不觸發 `variant_option_conflict`。John’s Blend 香氛擴香罐 85g 任選 3 入 vs PChome 3入組會進 `identity_review`，不直接價格告警。
- **V10.395 離線競品身份 audit 工具**: 新增 `scripts/audit_competitor_identity_jsonl.py`，可把 production DB 匯出的 competitor identity JSONL 在本機重跑 current matcher，輸出 accepted / veto / low-score / fresh bad 摘要與樣本；工具不連 DB、不寫 DB，用來取代在 188 app container 內全量重掃造成的 memory 壓力。
- **V10.394 多色 catalog / 入門組防錯配**: marketplace matcher 補「琥珀橙 / 干邑棕 / 賽車綠」等車用香氛色款詞，當 MOMO 是多色/多款 catalog listing、PChome 是單一色款候選時會保留 `variant_option_conflict` hard veto；同時把 `入門組` 納入套組詞，避免理膚寶水抗敏入門組被拿去跟單瓶乳液做總價比價。
- **V10.393 組合包 `+` 判定修正與 catalog 補強**: marketplace matcher 的組合包件數判定會先排除 `SPF50+`、`PA++++` 等防曬係數加號，以及 `NTT80+AL414` 這類純型號碼串，避免把防曬品與 OPI 套組的規格/型號加號誤判成多一個商品組件；CeraVe 三件組 vs 兩件組仍維持 `multi_component_count_conflict` hard veto。同版收緊品牌 alias 判定，避免只有品牌名就觸發商品線加成，並補 Baan 貝恩嬰兒修護唇膏「原味/草莓」catalog listing 放行。
- **V10.392 組合包件數防錯配**: marketplace matcher 新增 `multi_component_count_conflict`，當 MOMO 與 PChome 都是 `+`/`＋` 組合包但組件數不同時直接進 `not_comparable`，避免三件組被拿去跟兩件組做總價告警；同步把該原因加入 evidence flags，讓告警與審核畫面可以清楚顯示「組合包件數不同」。
- **V10.391 多款任選 catalog listing 防錯配**: marketplace matcher 新增 `catalog_variant_listing_alignment`，當 MOMO/PChome 雙方都是多款/多色/多香味任選 listing，且商品線、規格與類型一致時，可放行香氛擴香罐、香氛蠟燭等 catalog 型同款；同時把 Relove 菸鹼醯胺 vs 胺基酸私密清潔凝露列為變體衝突，並讓 competitor feeder 不再只因 `strong_exact_spec_match` 就把低分候選視為 recoverable，避免只同規格但品線不同的商品回寫正式比價。
- **V10.390 PChome 近門檻商品比對規則**: marketplace matcher 補 17 組近門檻真同款召回與錯配防線，包含 OBgE 防曬棒、ARTMIS 私密清潔慕斯、Seche Vite 快乾亮油、TAICEND 屁屁噴、femfresh / VIGILL 私密清潔、Solone 眼部飾底乳、HYDSTO 車載香薰、小米 S101 刮鬍刀、PRAMY 定妝噴霧、I'M MEME 修容打亮棒、檜山坊滾珠精油、ARM&HAMMER 體香膏、Brush Baby WildOnes 電動牙刷與 Palmer's 按摩乳；同時把香氛/私密慕斯/定妝噴霧 finish 差異列為 variant-sensitive，避免不同香味、蔓越莓 vs 金縷梅、柔焦霧面 vs 水光亮面被誤推成直接價格告警。
- **V10.388 精華乳 / 精華霜變體防錯配**: marketplace matcher 新增精華類 formulation conflict guard，當共享 identity anchor 只到「精華」但一側是「精華乳」、另一側是「精華霜 / 精華液」時會標記 `variant_descriptor_conflict` 並壓低同款分數，避免自白肌等同品牌相近品線被錯推成 PChome/MOMO 可直接價格告警。Competitor feeder 同步會用最新 matcher 重新驗舊配對；若舊 `identity_v2` 已被現行 matcher 判成低分或 veto，允許新的高信心候選替換，避免歷史錯配卡住正式 `competitor_prices`。
- **V10.387 EA 比價 HITL 告警證據排版**: Elephant Alpha 的 DB evidence 與 Hermes pre-fetch action 現在會把 PChome/MOMO 同款證據帶進 Telegram：`match_type`、`price_basis`、`alert_tier` 與 `match_score` 會獨立成「證據」行，讓人工審核能分辨高信心同款、總價可比、單位價覆核與身份覆核，不再只看到乾巴巴的 `MOMO vs PChome` 長句。同版 marketplace matcher 補 Relove「私密潔淨凝露」identity anchor 與聯名款搜尋噪音，避免 PLAY BOY / 小虎等活動詞壓過真同款名稱。
- **V10.386 Gemini compose hard default / KATE 唇膏比對**: `docker-compose.yml` 針對 `momo-app`、`scheduler`、`telegram-bot` 明確釘住 `GEMINI_API_HARD_DISABLED=true` 與 `GEMINI_FALLBACK_ENABLED=false` 的預設，讓 `.env` 保留 API key 時也不會自動產生 Gemini 付費出站；AI SOT 與 compose 測試同步鎖定此契約。同版 marketplace matcher 補 KATE/凱婷「柔霧裸唇膏」identity anchor，避免 MOMO 長標含東京夜喫茶系列與任選文案時漏掉 PChome 同款短標。
- **V10.385 Lactacyd / MAQuillAGE 櫃別同款比對**: Marketplace matcher 補強 Lactacyd 私密潔浴露多款任選長標與 PChome 短標同款放行，並橋接「資生堂東京櫃」與 `MAQuillAGE 心機彩妝` 在「心機星魅蜜光圈潤唇膏」上的櫃別/品牌 alias，避免真同款被 `brand_conflict` 擋掉。
- **V10.384 Karadium 無規格眼影棒同款放行**: Marketplace matcher 對 Karadium「閃亮珍珠眼影棒」新增品牌 + 強 identity anchor 加分，當 PChome 標題省略 1.4g 規格但品名/品牌高度一致、無變體衝突與 hard veto 時仍可進入 exact identity 告警候選，避免同款因規格缺字漏報。
- **V10.383 EA JSON fallback / EDM cache 自癒 / 比對別名補強**: Elephant Alpha 協調器現在可容忍 fenced JSON 與混文字 JSON；若仍無法解析，會改用 DB/Hermes 實證產生保守人工覆核決策，不再輸出舊式 OpenClaw 策略 plan 或自動調價暗示。EDM promo dashboard shared cache 遇到損毀 pickle 會自動刪除並重建，避免每個 worker 重複噴 `UnicodeDecodeError`。Marketplace matcher 補上 Curel/珂潤、Karadium 與兩個強 identity anchor 測試，降低真同款漏報。
- **V10.382 唇膏 exact identity 寬價差豁免**: marketplace matcher 對「同品牌 + 共享唇膏 identity anchor + 規格完全一致 + 無色號/變體衝突」的唇膏類商品，允許 sequence score 略低時仍套用 `price_penalty_suppressed_wide_exact_identity`；這只處理 PChome/MOMO 標題順序與行銷字差異造成的真同款漏報，不放寬顯性色號不同的 hard veto。
- **V10.381 browse.sh 比價診斷計畫**: PChome feeder 在 `no_result`、`no_match`、低信心、單位價覆核、既有配對保護與爬蟲錯誤時，會把 read-only `browse_diagnostic_json` 寫入 `competitor_match_attempts`，內含 PChome search URL 與建議 `browse get/open` 命令；正式排程仍 API-first，`PCHOME_FEEDER_BROWSE_SH_EXECUTE_ENABLED=false` 預設不自動開瀏覽器，避免瀏覽器彈窗、登入或密碼提示干擾。
- **V10.380 111 Ollama final fallback 收斂**: 111 Mac fallback 從救急路徑改成更短的保護路徑，`OLLAMA_111_MAX_TIMEOUT` 預設由 45s 收緊到 20s，並新增 `OLLAMA_111_NUM_PREDICT=512` 輸出上限；落到 111 時仍會降級重模型到 `llama3.2:latest`、縮 `num_ctx=4096`、`keep_alive=5m`，避免 GCP-A/GCP-B 短暫 timeout 後把長篇 Hermes/OpenClaw 工作轉嫁到 111 造成 swap 與 load 飆高。
- **V10.379 MCP runtime promotion gate**: 新增 `mcp_runtime_promotion` read-only builder、GET/POST endpoint、UI promotion package 審核面板與 deployment readiness smoke target，將 MCP activation evidence 與 runtime smoke receipt 合併審核，讓 completion audit 的 runtime 缺口可由人工收據明確補齊。
- **V10.379 只讀安全邊界**: 本階段不保存 payload、不打 health、不開 DB、不抓外站、不掛 scheduler，也不會因 promotion 通過自動打開人工 fetch gate；正式 fetch / DB write / scheduler attach 仍需各自獨立 gate。
- **V10.378 AI 推薦頁首屏 Gemini 防漏**: `/ai_recommend` 首屏狀態快照新增 provider sanitization，即使舊 cache / env 內出現 `default_provider='gemini'` 或 `recommended_provider='gemini'`，也會回到 `ollama`，避免 UI 把 Gemini 顯示成主推薦路徑；`/api/ai/set_provider` 同步正規化 provider 輸入，保留 Gemini 只能作 Ollama 失敗備援的拒絕訊息。
- **V10.377 Gemini 主路徑防漏補強**: `AIProviderService._get_recommended_provider()` 不再於 Ollama 不通時推薦 `gemini` 作為主提供者；`llm_model_router` 的 `ea_engine` 即使 caller 傳入 `gemini-2.0-flash` default，也會改回 `hermes3:latest`，需要深推理才升 `deepseek-r1:14b`；`ElephantAlphaOrchestrator` 的 OpenClaw registry / system prompt 改為 Ollama-first，避免 L3 HITL prompt 繼續把 Gemini 當主模型描述。同步補 AI SOT 與防回歸測試。
- **V10.376 Recipe Box 同款防曬漂移比對**: `services/marketplace_product_matcher.py` 對 Recipe Box 多效提亮防曬霜新增 shared identity anchor 加分，當 MOMO 長標含兒童/無毒/天然彩妝等行銷詞、PChome 以「韓兔 多效提亮防曬霜」呈現時仍可判定同款；同步測試鎖住 `shared_identity_anchor_recipe_box_line`，避免平台名稱漂移讓同款價格告警漏報。
- **V10.375 過期活動爬蟲排程 opt-in**: `run_scheduler.py` 將固定 LPN 的 `edm_task` / `festival_task` 改為 `MOMO_ENABLE_LEGACY_EDM_SCHEDULE=true` 才註冊，季節活動 `mothers_day_2026` / `valentine_520_2026` / `labor_day_2026` 改為 `MOMO_ENABLE_SEASONAL_PROMO_SCHEDULE=true` 才註冊；`services/data/crawler_config.json` 同步暫停已失效的 mothers_day LPN，避免 scheduler 定時打過期 MOMO 活動頁造成 Selenium browser loop 與無效負載。手動 API / CLI 指定 LPN 仍保留；同版整合 NIVEA/OPI 等比價搜尋 noise 與 identity anchor 補強。
- **V10.374 EDM 失效頁告警止血**: `scheduler.py` 新增 MOMO EDM alert guard，`run_edm_task` / `run_festival_task` / `run_promo_event_task` 遇到「很抱歉此EDM不存在」時會接受 browser alert、寫入 `Skipped / edm_unavailable` stats，且不再送 EventRouter failure，避免 festival / mothers_day 過期活動頁重新累積 Telegram queue；同版整合 REJURAN 麗駐蘭唇膏同款在價格比過寬時的 exact-identity 價格懲罰豁免。
- **V10.373 PChome 同款名稱漂移整合**: 整合並修正 concurrent matcher work，新增 MAC/M.A.C 品牌 alias、Yuskin 經典乳霜 4入/4盒組同數量 bundle equivalent、AHC 瞬效 B5 玻尿酸關鍵字重排 anchor；修復 `_count_score()` 縮排破壞與 unreachable code，讓新增測試可穩定通過。
- **V10.372 Smoke 與 EventRouter queue 修復**: 修正 AI automation smoke 對 NemoTron fallback 的 class 判斷，改接受實際存在的 `NemotronDispatcher._hermes_rule_fallback`，避免 Hermes fallback 正常卻被誤報 critical；EventRouter 失敗佇列回放改為重建短版 HTML-safe 訊息，escape 標題/摘要/trace/error 並限制長度，避免舊 Selenium stacktrace 的 `<unknown>` 造成 Telegram HTTP 400 反覆卡住；同版整合 LUDEYA 蜂王玫瑰商品線在 MOMO/PChome 名稱漂移時的 identity anchor alias。
- **V10.371 品牌缺失同款放行**: marketplace matcher 新增 `brandless_exact_identity` 加分，只限「一側有品牌、一側缺品牌」但 shared identity anchor 夠長、規格/序列/中文名相似度都高且無 hard veto 的案例；覆蓋小米有品小浪智能感應自動噴香機，讓 PChome 標題省略品牌時仍可進入同款告警候選。
- **V10.370 Gemini runtime sentinel**: AI automation smoke 新增 `Gemini 出站費用 sentinel`，每天檢查近 24h `ai_calls.provider='gemini'` 的 calls/tokens/cost/top callers；若 `GEMINI_API_HARD_DISABLED=true` 仍有 Gemini 記錄，smoke 直接升為 critical。scheduler 09:10 摘要推播前會先執行一次只讀 smoke，讓 Gemini 費用異常不再依賴人工打開 `/ai_automation_smoke` 才被發現。
- **V10.369 Gemini 防復發測試與極端價差同款放行**: 新增靜態測試禁止 production code 在 `services.gemini_guard` / `config.py` 之外直接讀 `GEMINI_API_KEY`，並要求所有 Gemini SDK/REST 出站點必須經 `get_gemini_api_key()`；比價 matcher 針對「同品牌 + 明確 identity anchor + 規格完全一致」但競品價格極端偏低的原生露/眉筆案例抑制價格懲罰，避免真同款因價格差被錯降級，同時補回既有 hard-veto 安全斷言。
- **V10.368 比價搜尋錨點強化**: marketplace matcher 補 LUDEYA 蜂王玫瑰外泌微臻霜、雅詩蘭黛微分子肌底原生露、Za / PERIPERA 眉筆眉彩等低信心邊界品牌的 identity anchor，並把「兩入組 / 任選色號 / 多色可選 / 櫻花輕盈版」歸為搜尋噪音，讓 MOMO → PChome 搜尋詞更聚焦於同款身份與規格，不被包裝組合或色號選項帶偏。
- **V10.367 Gemini hard egress kill switch**: 新增 `GEMINI_API_HARD_DISABLED=true` 預設硬封鎖，中央 `services.gemini_guard` 會在 hard switch 未解鎖時拒絕 `GEMINI_API_KEY`，即使 `GEMINI_FALLBACK_ENABLED=true` 也不會初始化 SDK 或 REST 出站。Code Review/OpenClaw/MCP/通用 AI fallback 保留 emergency path，但必須同時設 `GEMINI_API_HARD_DISABLED=false` 與 `GEMINI_FALLBACK_ENABLED=true`，必要時再用 `GEMINI_ALLOWED_CONTEXTS` 限定 caller。
- **V10.366 MCP runtime smoke receipt review**: 新增 `mcp_runtime_smoke_receipt` read-only builder、GET/POST endpoint、UI receipt JSON 審核面板與 deployment readiness smoke target，讓操作員貼上 `/api/market_intel/mcp_readiness?execute=true&timeout=3` 的實際收據後，判斷 external/internal MCP runtime 是否可升級為已驗收。
- **V10.366 只讀安全邊界**: 本階段不保存 payload、不打 health、不開 DB、不抓外站、不掛 scheduler；若收據含 DB write/commit/scheduler/writes 旗標或原始 readiness blocked reasons，會直接阻擋。
- **V10.365 專業比價分級連動**: MOMO/PChome matcher 新增 `match_type`、`price_basis`、`alert_tier` 與 evidence flags，將「高信心同款 / 同商品不同包裝 / 同系列不同款 / 可比但需覆核 / 非同款」寫入 diagnostics 與 tags；feeder、競價情報 repository、Hermes payload、NemoTron 派發與 Telegram 告警格式同步讀取同一份分級。NemoTron 也新增硬閘門：非 `exact + total_price + price_alert_exact` 的項目即使模型回傳 price alert，也會改走人工覆核，避免不同包裝或同系列不同款被直接建議降價。
- **V10.364 111 context cap**: 111 fallback 即使降到 `llama3.2:latest`，Ollama 仍可能用 131k context 啟動 runner，導致 3B 模型也吃到 10GB+；新增 `OLLAMA_111_NUM_CTX=4096`，落到 111 時強制縮 context，並把 `llama3.2:latest` 加入零成本模型表，避免觀測台 unknown model warning。
- **V10.363 Dashing Diva variant-safe search**: PChome/MOMO matcher 針對 Dashing Diva 美甲片補「商品頁目錄有 30片/盒、MOMO 標題省略片數」的安全豁免，只限同品牌、同美甲片線、同具名款式錨點；搜尋詞也優先帶出 `月影柔霧`、`銀絲柔彩` 等款式名，降低同系列不同款式互撞。
- **V10.362 111 fallback shrink-to-3B**: 111 Mac 實測 `hermes3` / `qwen2.5-coder` 雖是 7B/8B，但 large context runner 仍會佔用 6-10GB RSS 並推高 swap；111 fallback 改為所有 7B+、vision 與 long-context 文字生成都降級到 `llama3.2:latest`，`ai_calls.model` 也會記錄實際降級模型並把原請求模型放入 `meta.requested_model`。
- **V10.361 111 fallback resource guard**: 實測 111 Mac 高 load 主要來自 Codex app / WindowServer 前台負載，且 Ollama 曾因 fallback 載入 `qwen3:14b` 造成 16GB RAM / swap 壓力；已手動 unload 111 上的重模型，並讓 `OllamaService.generate()` 落到 111 時自動把 14B+ 模型降到 `OLLAMA_111_MODEL_FALLBACK`、`keep_alive` 縮至 `OLLAMA_111_KEEP_ALIVE=5m`、timeout 封頂 `OLLAMA_111_MAX_TIMEOUT=45`。GCP-A/GCP-B 仍可跑 `qwen3:14b`，111 只做短時最後備援。
- **V10.360 browser smoke guard**: `tests/test_image_fetch.py` 改為預設 skip，只有 `RUN_MOMO_BROWSER_TESTS=1` 才會打開外部 MOMO 網站；手動執行時預設 headless，並關閉 Chrome password manager/autofill，避免一般 pytest 觸發瀏覽器與密碼允許提示。
- **Scheduler Selenium 防彈窗**: `managed_scraper_resources()` 補 `credentials_enable_service=false`、`profile.password_manager_enabled=false` 與 Autofill/PasswordManager feature disable，降低背景 Selenium 觸發密碼管理提示的機率。
- **PChome dashboard hot path**: `competitor_intel_repository.py` 的 coverage / review queue 最新 MOMO 價格查詢改用 `JOIN LATERAL ... ORDER BY pr.timestamp DESC, pr.id DESC LIMIT 1`，避免 window function 掃描造成首頁與覆核隊列熱路徑變慢；Dashing Diva 召回搜尋補品線與 `magicpress` broad terms。

### 2026-05-21：Browse.sh 爬蟲診斷與 PChome 色號比對強化
- **V10.359 Browse.sh optional diagnostics**: 新增 `services/browse_sh_tool.py` 與 `scripts/tools/browse_sh_probe.py`，可檢查或執行 `browse` CLI；目前只定位為 MOMO/PChome selector、XHR 與 network trace 探勘，不進 scheduler 主路徑，也不直接寫正式競品價格。
- **MOMO/PChome matcher 色號防錯配**: `marketplace_product_matcher.py` 補護甲油、洗手慕斯、足膜精準搜尋，搜尋詞保留 `4.2ml` 這類小數規格；唇釉、妝前乳、素顏霜等顯性色號/色系不一致時會 hard veto，避免同系列不同色號被推成正式價差。
- **導入限制**: 本機 Node 16 目前因 `icu4c` 動態庫缺失無法啟動，browse.sh 需待 Node 修復或於乾淨主機安裝後才可實跑；repo 內先保留 optional wrapper、測試與 playbook。

### 2026-05-21：市場情報 MCP 啟用證據審核
- **V10.358 MCP activation evidence review**: 新增 `mcp_activation_evidence` read-only builder、GET/POST endpoint、UI redacted evidence 審核面板與 deployment readiness smoke target，讓操作員貼上 env/health/router/telemetry/fallback 證據後判斷能否補齊 external/internal MCP runtime 缺口。
- **只讀安全邊界**: 本階段不保存 payload、不打 health、不啟動 MCP、不執行 docker/SSH、不開 DB、不抓外站、不掛 scheduler；payload 只允許 redacted/boolean，真實 secret 字串與任何 DB write/fetch/scheduler 證據會被阻擋。

### 2026-05-21：市場情報 MCP 完整度稽核
- **V10.357 MCP completion audit**: 新增 `mcp_completion_audit` read-only builder、GET endpoint、UI 面板與 deployment readiness smoke target，彙整外部 MCP design/runtime、內部 tool contract/runtime、activation runbook 與 fetch gate 狀態。
- **只讀安全邊界**: 本階段只做完整度稽核，不啟動 MCP、不打 health、不執行 docker/SSH、不開 DB、不寫檔、不抓外站、不掛 scheduler；外部 MCP runtime complete 仍需 operator 依 runbook 啟用與 health 驗證。

### 2026-05-21：市場情報 Telegram dispatch report catalog record final closeout gate
- **V10.356 report catalog record final closeout gate**: 新增 `candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_final_closeout` service、POST endpoint、UI 按鈕與 deployment readiness smoke target，在 archive summary gate 後覆核 catalog record identity、artifact traceability、sections、DB commit/post-write smoke、pipeline complete 與無後續 follow-up。
- **只讀安全邊界**: 本階段是 catalog record pipeline terminal preview；API/UI 不讀 approval/Telegram token、不呼叫 LLM、不產報表、不派送 Telegram、不開 DB、不寫檔、不執行 CLI、不寫 catalog record、不 commit、不更新 `review_state`、不掛 scheduler。

### 2026-05-21：市場情報 Telegram dispatch report catalog record archive summary gate
- **V10.355 report catalog record archive summary gate**: 新增 `candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive_summary` service、POST endpoint、UI 按鈕與 deployment readiness smoke target，在 archive gate 後整理 catalog record identity、artifact traceability、DB commit/post-write smoke、archive manifest/retention policy 與後續 final closeout separate gate。
- **只讀安全邊界**: 本階段只放行到後續 report catalog record final closeout gate；API/UI 不讀 approval/Telegram token、不呼叫 LLM、不產報表、不派送 Telegram、不開 DB、不寫檔、不執行 CLI、不寫 catalog record、不 commit、不更新 `review_state`、不掛 scheduler。

### 2026-05-21：市場情報 Telegram dispatch report catalog record archive gate
- **V10.354 report catalog record archive gate**: 新增 `candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_archive` service、POST endpoint、UI 按鈕與 deployment readiness smoke target，在 closeout gate 後審核 closeout/commit/run receipt/writer output/post-write smoke/backup 封存證據、archive manifest/retention policy 與後續 archive summary separate gate。
- **只讀安全邊界**: 本階段只放行到後續 report catalog record archive summary gate；API/UI 不讀 approval/Telegram token、不呼叫 LLM、不產報表、不派送 Telegram、不開 DB、不寫檔、不執行 CLI、不寫 catalog record、不 commit、不更新 `review_state`、不掛 scheduler。

### 2026-05-20：市場情報 Telegram dispatch report catalog record closeout gate
- **V10.353 report catalog record closeout gate**: 新增 `candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_closeout` service、POST endpoint、UI 按鈕與 deployment readiness smoke target，在 commit gate 後審核 catalog record identity、DB commit/post-write smoke 證據、操作員 closeout 確認與後續 archive separate gate。
- **只讀安全邊界**: 本階段只放行到後續 report catalog record archive gate；API/UI 不讀 approval/Telegram token、不呼叫 LLM、不補產報表、不派送 Telegram、不開 DB、不寫檔、不執行 CLI、不寫 catalog record、不 commit、不更新 `review_state`、不掛 scheduler。

### 2026-05-20：市場情報 Telegram dispatch report catalog record commit gate
- **V10.352 report catalog record commit gate**: 新增 `candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_commit` service、POST endpoint、UI 按鈕與 deployment readiness smoke target，在 run receipt 後審核外部 CLI catalog record DB commit、post-write smoke、操作員 commit gate 確認與後續 closeout separate gate。
- **只讀安全邊界**: 本階段只放行到後續 report catalog record closeout gate；API/UI 不讀 approval/Telegram token、不呼叫 LLM、不補產報表、不派送 Telegram、不開 DB、不寫檔、不執行 CLI、不寫 catalog record、不 commit、不更新 `review_state`、不掛 scheduler。

### 2026-05-20：市場情報 Telegram dispatch report catalog record run receipt
- **V10.351 report catalog record run receipt**: 新增 `candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_receipt` service、POST endpoint、UI 按鈕與 deployment readiness smoke target，在 run readiness 後審核外部 CLI writer output、catalog record key/hash、DB commit receipt 與 post-write smoke。
- **只讀安全邊界**: 本階段只放行到後續 report catalog record commit gate；API/UI 不讀 approval/Telegram token、不呼叫 LLM、不補產報表、不派送 Telegram、不開 DB、不寫檔、不執行 CLI、不寫 catalog record、不 commit、不更新 `review_state`、不掛 scheduler。

### 2026-05-20：市場情報 Telegram dispatch report catalog record run readiness
- **V10.348 report catalog record run readiness**: 新增 `candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_readiness` service、POST endpoint、UI 按鈕與 deployment readiness smoke target，在 run package 後檢查 payload manifest、manual CLI command、backup/dry-run、run receipt 與 postwrite smoke 條件。
- **只讀安全邊界**: 本階段只放行到後續 report catalog record run receipt gate；API/UI 不讀 approval/Telegram token、不呼叫 LLM、不補產報表、不派送 Telegram、不開 DB、不寫檔、不執行 CLI、不寫 catalog record、不更新 `review_state`、不掛 scheduler。

### 2026-05-20：市場情報 Telegram dispatch report catalog record run package
- **V10.347 report catalog record run package**: 新增 `candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_run_package` service、POST endpoint、UI 按鈕與 deployment readiness smoke target，在 record write gate 後整理 payload manifest、CLI command bundle、backup/dry-run trace 與後續 run readiness separate gate。
- **只讀安全邊界**: 本階段只放行到後續 report catalog record run readiness gate；API/UI 不讀 approval/Telegram token、不呼叫 LLM、不補產報表、不派送 Telegram、不開 DB、不寫檔、不執行 CLI、不寫 catalog record、不更新 `review_state`、不掛 scheduler。

### 2026-05-20：市場情報 Telegram dispatch report catalog record write gate
- **V10.344 report catalog record write gate**: 新增 `candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_record_write` service、POST endpoint、UI 按鈕與 deployment readiness smoke target，在 catalog write preflight 後檢查 catalog record key/schema/hash trace、operator dry-run、backup 與 commit separate gate。
- **只讀安全邊界**: 本階段只放行到後續 report catalog record run package gate；API/UI 不讀 approval/Telegram token、不呼叫 LLM、不補產報表、不派送 Telegram、不開 DB、不寫檔、不寫 catalog record、不更新 `review_state`、不掛 scheduler。

### 2026-05-20：市場情報 Telegram dispatch report catalog write preflight
- **V10.342 report catalog write preflight gate**: 新增 `candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_write_preflight` service、POST endpoint、UI 按鈕與 deployment readiness smoke target，在 report catalog index 後整理 catalog record identity、write source trace、record schema preflight 與 runtime safety。
- **只讀安全邊界**: 本階段只放行到後續 report catalog record write gate；API/UI 不讀 approval/Telegram token、不呼叫 LLM、不補產報表、不派送 Telegram、不開 DB、不寫 catalog preflight file、不寫 catalog record、不更新 `review_state`、不掛 scheduler。

### 2026-05-20：市場情報 Telegram dispatch report catalog index
- **V10.339 report catalog index gate**: 新增 `candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_index` service、POST endpoint、UI 按鈕與 deployment readiness smoke target，在 report catalog handoff 後整理 catalog index identity、handoff source trace、index manifest 與 runtime safety。
- **只讀安全邊界**: 本階段只放行到後續 report catalog write preflight gate；API/UI 不讀 approval/Telegram token、不呼叫 LLM、不補產報表、不派送 Telegram、不開 DB、不寫 catalog index file、不寫 catalog record、不更新 `review_state`、不掛 scheduler。

### 2026-05-20：市場情報 Telegram dispatch report catalog handoff
- **V10.338 report catalog handoff gate**: 新增 `candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_catalog_handoff` service、POST endpoint、UI 按鈕與 deployment readiness smoke target，在 report archive summary 後整理 catalog identity、artifact manifest、section keys 與 hash traceability。
- **只讀安全邊界**: 本階段只放行到後續 report catalog index gate；API/UI 不讀 approval/Telegram token、不呼叫 LLM、不補產報表、不派送 Telegram、不開 DB、不寫 catalog record、不更新 `review_state`、不掛 scheduler。

### 2026-05-20：市場情報 Telegram dispatch report archive summary
- **V10.335 report archive summary gate**: 新增 `candidate_queue_review_ai_summary_persistence_telegram_dispatch_report_archive_summary` service、POST endpoint、UI 按鈕與 deployment readiness smoke target，在 report archive 後整理 report identity、archive traceability、integrity review 與 runtime safety sections。
- **只讀安全邊界**: 本階段只放行到後續 report catalog handoff gate；API/UI 不讀 approval/Telegram token、不呼叫 LLM、不補產報表、不派送 Telegram、不開 DB、不寫檔、不更新 `review_state`、不掛 scheduler。

### 2026-05-20：PChome 核心比價準確率與補抓可觀測性
- **V10.334 MOMO/PChome matcher 強化**: 補常見品牌 alias 與任選/平輸/國別 noise 收斂，並加入刀把/刀片/刀頭件數解析、同品牌不同系列硬否決，避免為了提高覆蓋率把 Gillette/Schick 等不同系列錯配成同款。
- **近門檻候選重新評分**: `CompetitorPriceFeeder` 新增 `run_retryable_candidate_revalidation()`，優先重評舊 `low_score` 中 0.70 以上、非 hard veto 且有 PChome product_id 的候選，再補抓高價未配對商品；排程與手動 API 都會納入這段流程。
- **PChome 補抓產線狀態**: 商品看板新增 PChome backfill status card，後端以 JSON 狀態檔記錄 queued/revalidating/matching/generating_picks/clearing_cache/completed/failed、結果統計與最近 run，避免手動補抓後沒有進度與錯誤上下文。

### 2026-05-20：重開機後首頁熱路徑索引持久化
- **Dashboard / PChome 慢查詢修復**: 主機重開機後 `https://mo.wooo.work/` 首頁可用但多次逾時，實際瓶頸集中在首頁與 PChome coverage 查詢掃描 `products`、`price_records`、`competitor_match_attempts`。線上先補三個索引讓首頁恢復 200，並新增 `migrations/040_dashboard_hot_path_indexes.sql` 將修復持久化到 fresh restore / DB rebuild 流程。
- **Growth Analysis 冷快取修復**: `/growth_analysis` 在 `monthly_summary_analysis` 落後時會改掃 `realtime_sales_monthly` 聚合，冷計算約 14 秒；修正為 source fingerprint 未變時延長共享快取有效期，匯入流程仍主動清除快取，避免資料未變卻反覆掃大表。
- **PChome backfill pilot**: V10.328 diagnostics 欄位上線後先跑小批次，刷新過期 identity_v2 30 筆（11 筆成功更新）、高價未配對 15 筆全被低信心/單位價擋下；樣本確認多數 hard veto 正確，另補 `strong_component_line_match` 處理 Gennies 類同品牌完整多組件套組。

### 2026-04-29：ADR-017 Phase 3f 模組化收尾啟動
- **DB metadata 救急**: `database/manager.py` 改為顯式載入 permission / AI / autoheal / import / vendor / realtime_sales ORM，PostgreSQL 初始化透過 process-local guard + advisory lock 執行 `Base.metadata.create_all()`，避免新環境漏表與一般流量重複碰 DDL。
- **realtime_sales_monthly 補 ORM**: 新增 `database/realtime_sales_models.py`，並同步 `docker/postgres/init/01-init.sql` 欄位，避免 fresh volume 先建出窄表後造成匯入欄位靜默遺失。
- **啟動自檢**: `app.py` 啟動時檢查 34 張 expected metadata tables，缺表直接 fail fast，防止「看似啟動成功但 create_all 漏表」。
- **路線校正**: 12-Agent 盤點確認 3f-1 需先處理 API shadow 與 `system_bp` prefix 分裂，3f-3 需先補 EventRouter 同步告警 facade，再改 scheduler 裸 `except`。

### 2026-04-29：AI 自動化閉環與四 Agent 控制面
- **ADR-018 立案**: 正式把 ElephantAlpha 納入 Hermes / NemoTron / OpenClaw 之外的 L3 Orchestrator，形成四 AI Agent 自動化控制面。
- **通知鏈補強**: EventRouter 補 AI 失敗降級、Telegram file queue、成功後 replay、去重冷卻與 silence 檢查。
- **自癒安全回看**: AutoHeal 保護 `momo-db` / `momo-postgres`，DB/DNS 無法安全修復時降級為 alert / wait retry。
- **記憶閉環**: raw `ai_insights` insert 路徑補 embedding enqueue；OpenClaw learning 支援 stale reset 與 missing embedding backfill。
- **L2 action 落地**: `flag_for_human_review`、`route_to_km`、`mark_for_relearn` 改為可審計 OpenClaw memory 寫入。
- **可觀測性落地**: `/metrics` 匯出 EventRouter dispatch/latency、safe action、Telegram replay、AutoHeal action/duration 指標。
- **Smoke Dashboard**: 新增 `/ai_automation_smoke` 與 `/api/ai-automation/smoke`，提供四 Agent 閉環 read-only 快檢。
- **Smoke 趨勢保存**: Smoke API 追加 JSONL 精簡紀錄，dashboard 顯示最近 OK / Warning / Critical 趨勢。
- **Smoke 趨勢管理**: Dashboard 增加 JSONL 匯出、清理與每日摘要，清理範圍限定 smoke history 檔。
- **Smoke 每日摘要推播**: 新增 Telegram 手動推播 API 與 momo-scheduler 每日 09:10 摘要任務，只讀 smoke history。
- **Grafana AI 觀測**: 新增 `MOMO AI Automation Overview` provisioning dashboard，覆蓋 EventRouter、safe action、replay、AutoHeal Prometheus 指標。
- **Grafana 線上載入與 scrape 修復**: 188 active Grafana 載入 4 dashboards；active Prometheus 補 `momo-app` scrape job，並修復 gunicorn preload LocalProxy boot crash。
- **CD 健康檢查強化**: Gitea Actions health check 改為 internal container health + external URL 雙檢查，降低 rebuild 後短暫 502 誤判。
- **CD Sync reload 修復**: rsync 後明確 restart 三容器，避免 bind-mounted Python 檔案更新但 gunicorn/scheduler/bot process 未 reload。
- **CD Gunicorn 掛載強化**: `momo-app` 補 `./gunicorn.conf.py:/app/gunicorn.conf.py:ro`，避免容器 restart 後回吃 image 內舊 gunicorn 設定。
- **Metrics schema drift 降噪**: `/metrics` 的 `realtime_sales_monthly` 總筆數改用 raw `COUNT(*)`，避免 ORM 欄位 drift 造成 Prometheus scrape warning。
- **CD Rebuild 切換強化**: rebuild 模式改成先 build 成功、再短暫 stop/rm/recreate 三應用容器，避免 no-cache build 長時間 502。
- **ElephantAlpha NIM fallback 強化**: production 帳號呼叫 Ultra 253B 會 404，預設改用可呼叫的 Nemotron Super 49B v1.5，並加入 70B / 8B fallback。
- **DatabaseManager 連線池收斂**: PostgreSQL 每 worker pool 收斂為 `pool_size=2/max_overflow=3`，並以 cache 重用 engine/session。
- **Ollama embedding API 遷移**: embedding client 優先使用官方 `/api/embed`，舊節點才 fallback `/api/embeddings`，降低 deprecated endpoint 與 timeout 風險。
- **Scheduler 例外記錄強化**: 清除 `scheduler.py` 靜默 `except/pass`，Chrome 清理、EDM optional 欄位、備份 insight/Telegram 失敗均保留 log。
- **AI metrics baseline 觀測**: `/metrics` 在尚無 AI 自動化事件時仍輸出 `momo_ai_*` zero-baseline series，避免 app 重啟後 Grafana/Prometheus 看不到 metric names。
- **ElephantAlpha transient fallback**: NVIDIA NIM primary model timeout、connection error、429 與 5xx 會嘗試下一個 fallback model，400 等非暫時性請求錯誤不重試。
- **模組化治理守門**: 盤點 15 個超過 800 行 Python 大檔，新增 `docs/guides/modularization_governance.md` 與 `tests/test_modularization_governance.py`，防止未分類巨檔再長出來。
- **Legacy 5888 入口清理**: 刪除 `tests/main_test.py` standalone Flask 死碼，測試與自動匯入文件改用 Port 80 `/auto_import` 入口。
- **OpenClaw Bot 第一刀拆分**: Telegram API send/retry/file upload helper 移到 `services/openclaw_bot/telegram_api.py`，`routes/openclaw_bot_routes.py` 往 thin Blueprint 收斂。
- **EDM Dashboard endpoint 修復**: 部署後健康檢查抓到活動看板排序連結少 `edm.` blueprint 前綴，修正模板 endpoint 推導並補 5 個活動頁排序連結回歸測試。
- **Monitoring exporter 修復**: Prometheus 已能 scrape `momo-app` V10.24，但 target 檢查發現 `blackbox-exporter` 未啟動、`cadvisor` 因 host `8080` 衝突未進入 monitoring DNS；改為 cAdvisor internal-only 並補 monitoring compose 守門測試。
- **Active blackbox target 降噪**: 線上 Nginx 與 curl 驗證目前有效 MOMO 入口為 `https://mo.wooo.work`；`momo.wooo.work` 逾時、`wooo.work` DNS 不解析，先從 active UAT blackbox targets 移除，避免舊域名噪音誤導告警。
- **action_plans schema drift 修復**: CodeReview pipeline 寫入 action plan 時發現線上表只有 NemoTron Group B 欄位；啟動期 PostgreSQL metadata repair 會補 `action_type` / `description` / `priority` / `metadata_json` 與 index，恢復 AI code review action plan 閉環。
- **Gitea runner label 隔離**: EWOOOC CD workflow 改用 `ewoooc-host`；110 的 `/home/wooo/act-runner` runner config 必須只宣告 `ewoooc-host`，避免 user-level runner 混接 AWOOOI workflow。
- **CD sync hot reload**: 一般 Python/模板同步不再 `restart momo-app`，改為 `docker kill -s HUP momo-pro-system` 讓 Gunicorn 熱重載 workers，只重啟 scheduler / telegram-bot；Gunicorn 關閉 `preload_app`，確保 HUP 後 workers 會 import 新版 app code。
- **OpenClaw Bot 第二刀拆分**: Inline Keyboard builders 移到 `services/openclaw_bot/menu_keyboards.py`，透過 `configure_menu_keyboards()` 注入 `latest_date/_GOALS/TAIPEI_TZ`，route 檔下降到 5,240 行並補選單回歸測試。
- **CD sync mount drift guard**: 發現舊 app 容器未掛載 `app.py/config.py` 時，rsync 後服務檔已更新但 `/health` 版本仍卡 image 內舊檔；CD sync 會檢查 mount，僅 drift 時一次性 recreate momo-app，其餘維持 HUP 熱重載。
- **CD 單檔 bind mount inode 修復**: `app.py/config.py` 單檔 bind mount 會被 rsync/tar 的 inode replacement 卡住舊檔，CD rsync 改用 `--inplace`，避免 HUP reload 後仍讀到舊版本。
- **Frontend V2 視覺基準立案**: `MOMO Pro/` prototype 與 `docs/guides/frontend_upgrade_roadmap.md` 成為前端更版依據，AGENTS/CONSTITUTION 改以米色工作台、暖墨文字、焦糖橘 accent 與新版 shell 規範作為後續 UI 基準。
- **Frontend V2 Phase 0 assets**: 新增 `static/css/ewoooc-tokens.css`、`static/css/ewoooc-shell.css`、`templates/ewoooc_base.html` 與 `_ewoooc_shell.html`，先建立可重用 shell，不替換既有頁面；憲章補「真實資料與真實頁面」紅線，禁止假資料冒充完成。
- **Dashboard V2 feature flag**: `/` 預設仍走既有 `dashboard.html`，`/?ui=v2` 才渲染 `dashboard_v2.html`；新版頁沿用既有 dashboard 真實資料與篩選/排序參數，不建立 mock 商品或假 KPI。
- **Frontend V2 static mount**: `momo-app` 補 `./web/static:/app/web/static:ro`，確保 Flask `url_for('static', filename='css/ewoooc-*.css')` 會從實際 `STATIC_DIR=/app/web/static` 讀到 V2 CSS；保留 `./static:/app/static:ro` 供 local-dev Nginx/舊資產相容。
- **EDM Dashboard V2 feature flag**: 五個活動看板入口預設仍走既有 `edm_dashboard.html`，加上 `?ui=v2` 才渲染 `edm_dashboard_v2.html`；新版頁沿用既有活動真實 `grouped_items/slot_stats/scheduler_stats`。

### 2026-05-01：Frontend V2 營運頁推進
- **Vendor Stockout V2 production default**: `/vendor-stockout` 預設渲染 `vendor_stockout_index_v2.html`，`?ui=legacy` 才回舊頁；統計來自正式 `VendorStockout/VendorList/VendorEmail/EmailSendLog` 查詢，不建立假資料。
- **Vendor Stockout List V2 production default**: `/vendor-stockout/list` 預設渲染 `vendor_stockout_list_v2.html`，`?ui=legacy` 才回舊頁；清單、批次、搜尋、分頁與狀態統計都從正式 `VendorStockout` 查詢組裝，並移除重複的 `web/templates/vendor_stockout_index_v2.html`。
- **Vendor query service extraction**: Vendor V2 首頁統計與缺貨清單 query 移到 `services/vendor_stockout_query_service.py`，`routes/vendor_routes.py` 由約 1,821 行降至 1,675 行，回到 request parsing + template rendering，避免巨型 Blueprint 繼續承接資料組裝邏輯。
- **Vendor stockout API query extraction**: `/vendor-stockout/api/stockout/list` 與 `/vendor-stockout/api/stockout/batches` 的 query/serialization 移入同一個 `services/vendor_stockout_query_service.py`，保留既有 JSON shape，`routes/vendor_routes.py` 再降至約 1,565 行。
- **Vendor management query extraction**: `/vendor-stockout/api/vendor/list` 與 `/vendor-stockout/api/vendor/<vendor_code>` 的 query/serialization 移入 `services/vendor_stockout_query_service.py`，保留既有 JSON shape，`routes/vendor_routes.py` 再降至約 1,485 行。
- **Health-safe monitoring runtime**: 健康檢查失敗盤點確認 Blackbox 打 Dashboard 首頁 `/` 會觸發重型查詢並和 `/health` 搶 worker；188 與 110 active blackbox 均改打 `/health`，Gunicorn 預設改為 `gthread` + `GUNICORN_THREADS=4`，CD 也會在 monitoring target 變更時重新載入 Prometheus/blackbox。

### 2026-04-28~29：Phase 3e 重構大戰 + daily_sales cache 隱形 bug 根除
- **app.py 縮減 -10.8%**: 7,386 → 6,590 行，11 commits 全綠零 502。
- **抽 Blueprint**: `/api/categories` → `category_routes.py` (8fce73b)；`/api/test_url` + `/brand_assets` → `misc_routes.py` (e676840)。
- **揭發 4 個改進版死碼**: refactor-specialist 28 條雙重 URL 等價性矩陣指出 `/growth_analysis`、`/daily_sales`、`/api/export/excel/abc`、`/api/run_task` 在 routes/*.py 已重構但因 Flask first-registered-wins 規則被 app.py 同 URL `@app.route` shadow 從未生效。本輪先啟用 daily_sales (8fefea0)，餘三條待後續。
- **daily_sales cache 機制重構** (ADR-016): 「匯入 15323 筆但業績頁面看不到」隱形 bug 根因 = gunicorn 4 worker 各持獨立 module-level dict。先嘗試 N-POST broadcast hack 命中率僅 9.4%（debugger + web-researcher + migration-engineer 三方共識）；改用 DB fingerprint (`MAX(snapshot_date), COUNT(*)`) 雙閘失效 (3971fd4)，強一致無浪費。
- **clear_cache endpoint 加 `@login_required`**: 修 critic HIGH-3，外部 POST 無 auth 回 400（CSRF + login 雙重攔截）。
- **hook 9 PoC 強化** (136e65b): vuln-verifier 對 `.claude/hooks/momo-prod-guard.js` 跑 9 條 PoC 8 條繞過 → 補強 heredoc / writable CTE / multi-statement / pg_read_file / COPY FROM PROGRAM / `/run/secrets` / `/proc/*/environ` 全擋。
- **12 Agent 並行作戰實踐**: 8 完成 + 4 rate-limited；學到 critic 必須先於 fullstack-engineer 完成（feedback_agent_dispatch_order.md）。
- **殘留 HIGH-2 技術債**: app.py 仍 43 處 `_SALES_PROCESSED_CACHE`（sales_analysis 等獨立 cache）待後續抽 `services/cache_manager.py`。

### 2026-04-28：AI 引擎穩定性與 CI/CD 幽靈容器大規模修復
- **幽靈容器排除**: 發現 `docker-compose.yml` 漏掛載 `routes` 目錄，導致 Telegram Bot 長期執行舊代碼。
- **埠位衝突修復**: 移除 `depends_on: postgres` 以解決與 orphan `momo-db` 的 5432 埠位競爭問題。
- **CI/CD 強化**: `cd.yaml` 引入 `--no-cache` 與 `docker compose restart` 以應對快取損壞與容器識別問題。
- **AI 備援優化**: 放寬 Ollama 健康檢查至 10s，請求超時至 180s，修復 Gemini 429 速率限制與 MCP 404 報錯。
- **網站 502 修復**: 手動恢復因容器重建中斷的 110-188 SSH 隧道。

### 2026-02-13：重開機服務修復與 Clawdbot 整合
- 更新 `system_startup.sh` v2.0，移除 Harbor 相關邏輯。
- 重新設計 Monitor 首頁，移除不存在的服務連結。
- 實作 Ollama Server 端的 `Clawdbot` 整合腳本。

### 2026-02-09：域名健康監控與服務修復
- 新增 `domain-health-monitor.sh`，每 5 分鐘自動巡檢。
- 修復 n8n Task Runner 403 錯誤。

### 2026-02-07：CI/CD Dashboard 與 Registry 遷移
- 完全移除 Harbor，改用輕量級 Docker Registry。
- 開發 CI/CD Dashboard 頁面 (`/cicd`)。

### 2026-01-28：核心問題修復
- **502 Bad Gateway**: 發現 Docker 網路棧故障，新增自動重啟機制。
- **OOM 問題**: 修復業績匯入進程因記憶體消耗過大被 SIGKILL 的問題。
- **Ollama 監控**: 實作 AI 服務器健康專項監控。

---

## 🛠️ 過往技術爭議與決策 (ADR 前身)
- **資料流向**: 確立 `daily_sales_snapshot` 為 SOT，同步至 `realtime_sales_monthly`。
- **快取機制**: 使用 `FileLock` 解決 Gunicorn 多 Worker 重建快取競爭。
- **時區處理**: 強制使用 `Asia/Taipei` 並於 SQLite 存儲 naive datetime。

---
*詳細原始紀錄請參閱 Git Commit History 或 110 主機備份目錄。*
