45 KiB
45 KiB
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-05-21:瀏覽器測試守門與 PChome 熱路徑優化
- 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_conflicthard veto;同時把入門組納入套組詞,避免理膚寶水抗敏入門組被拿去跟單瓶乳液做總價比價。 - V10.393 組合包
+判定修正與 catalog 補強: marketplace matcher 的組合包件數判定會先排除SPF50+、PA++++等防曬係數加號,以及NTT80+AL414這類純型號碼串,避免把防曬品與 OPI 套組的規格/型號加號誤判成多一個商品組件;CeraVe 三件組 vs 兩件組仍維持multi_component_count_conflicthard 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-onlybrowse_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_promotionread-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-flashdefault,也會改回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_unavailablestats,且不再送 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,每天檢查近 24hai_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_receiptread-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 召回搜尋補品線與magicpressbroad terms。
2026-05-21:Browse.sh 爬蟲診斷與 PChome 色號比對強化
- V10.359 Browse.sh optional diagnostics: 新增
services/browse_sh_tool.py與scripts/tools/browse_sh_probe.py,可檢查或執行browseCLI;目前只定位為 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_evidenceread-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_auditread-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_closeoutservice、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_summaryservice、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_archiveservice、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_closeoutservice、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_commitservice、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_receiptservice、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_readinessservice、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_packageservice、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_writeservice、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_preflightservice、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_indexservice、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_handoffservice、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_summaryservice、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_bpprefix 分裂,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_insightsinsert 路徑補 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 Overviewprovisioning dashboard,覆蓋 EventRouter、safe action、replay、AutoHeal Prometheus 指標。 - Grafana 線上載入與 scrape 修復: 188 active Grafana 載入 4 dashboards;active Prometheus 補
momo-appscrape 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總筆數改用 rawCOUNT(*),避免 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.pystandalone 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-appV10.24,但 target 檢查發現blackbox-exporter未啟動、cadvisor因 host8080衝突未進入 monitoring DNS;改為 cAdvisor internal-only 並補 monitoring compose 守門測試。 - Active blackbox target 降噪: 線上 Nginx 與 curl 驗證目前有效 MOMO 入口為
https://mo.wooo.work;momo.wooo.work逾時、wooo.workDNS 不解析,先從 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-runnerrunner 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,確保 Flaskurl_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.routeshadow 從未生效。本輪先啟用 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以解決與 orphanmomo-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.shv2.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 主機備份目錄。