1260 lines
168 KiB
Plaintext
1260 lines
168 KiB
Plaintext
|
||
================================================================================
|
||
前端 V3 守門落地 + FastAPI 重新評估 (2026-05-12) [IN PROGRESS]
|
||
================================================================================
|
||
|
||
【已完成】
|
||
- V10.553 優化 current PPT/AI 比價結果查詢:`fetch_competitor_comparison_results()` 的 current/latest MOMO 價格改用 `JOIN LATERAL` 取單品最新價,移除 `ROW_NUMBER() OVER (PARTITION BY p.id ...)` window scan;歷史報表的 `end_date` cutoff 仍保留在 lateral 子查詢內,維持「指定期間截止日前最新 MOMO 價」語意不變。這能降低簡報、OpenClaw/AI payload 與比價匯出在大量 price_records 下的查詢成本。
|
||
- V10.552 收斂決策查詢的新鮮度口徑:`fetch_top_competitor_risks()`、PChome review queue、review sample 與 current PPT/AI 比價結果都不再把 `expires_at IS NULL` 當成有效現價,只接受 `expires_at > CURRENT_TIMESTAMP` 的 PChome identity_v2 價格。未知新鮮度只留在 coverage 的診斷欄位與 V10.551 刷新入口,不再進入價格風險、簡報、AI 決策或覆核排除條件。
|
||
- V10.551 收斂未知新鮮度刷新與補抓排序:`_fetch_expired_identity_skus()` / `_fetch_expired_identity_recovery_skus()` 將 `expires_at IS NULL` 視為必須刷新或可搜尋救援的未知新鮮度 identity,和 V10.549「未知新鮮度不算可決策覆蓋率」口徑對齊;兩條路徑改用 `JOIN LATERAL` 取最新 MOMO 價,移除 product-wide window scan。`_fetch_unmatched_priority_skus()` 也改用 lateral 最新價,並優先重搜低風險 `no_result / refresh_no_result`,讓 V10.550 的安全召回詞先用在最可能被救回的商品。
|
||
- V10.550 補安全搜尋召回詞:`_build_variant_recall_search_plan()` 對低風險穩定品類新增 `品牌 + 品類` 的補搜尋詞,讓 `no_result / refresh_no_result` 更有機會找到 PChome 候選後再交給 matcher 安全判斷;美甲片、指甲油、唇彩、香氛/精油、粉底、防曬、任選/色號/款式等高 variant 風險商品不走通用召回,DASHING DIVA 仍只走既有 line-specific recall + sort fallback。此變更不改 `MIN_MATCH_SCORE`、hard veto、fresh-search write safety 或 stronger existing match 覆寫保護。
|
||
- V10.549 收斂比價新鮮度 KPI 口徑:coverage cache 升到 v10,`expires_at IS NULL` 不再算進「可用比價 / decision ready」,改拆成 `unknown_freshness_matches` / `unknown_freshness_count`,避免沒有到期時間的舊資料被當成可直接決策的新鮮價格。Dashboard / daily / growth 同步顯示未知新鮮度與「未形成有效身份配對」,並把 PChome/MOMO 價格方向文案改成 `PChome 價格壓力` / `MOMO 價格優勢`,降低誤讀。
|
||
- V10.548 接線更多 focused exact 舊候選回刷:把 matcher 已驗證可安全走 total-price 的 3W CLINIC 膠原蛋白粉底液 50ml x2、花美水 Moisture/Inclear 1.7g x3、KUSSEN 寶寶益菌屁屁膏 50ml 3 入、Lab52 齒妍堂嬰幼兒/汪汪隊牙刷 2 入接進 `_fetch_retryable_candidate_skus()` focused true-low / rescore 窄門。這只擴大「舊候選可被新版 matcher 重評」的入口,不改 `MIN_MATCH_SCORE`、hard veto、auto price write safety 或既有覆寫保護。
|
||
- V10.547 強化單位價覆核洞察:`manual_unit_price_required` 不再只是人工狀態,覆核隊列與商品看板會重新帶出單位價換算、MOMO/PChome 單位價方向、差距百分比與處理建議;決策信封 / OpenClaw / PPT 摘要可讀到 `unit_price_insight`。人工覆核寫回也會保留原始 `match_diagnostic_json` / comparison mode / diagnostic codes,避免後續簡報、審計或 AI 策略只剩人工文案而失去 matcher 證據鏈。
|
||
- V10.546 補近門檻舊候選回刷隊列:`run_retryable_candidate_revalidation()` 新增 `legacy_unmasked_attempt`,當最新狀態是 `no_result` / `refresh_no_result` / `expired_match` 時,可回撈同 SKU 早期近門檻候選交給最新版 matcher 重評;仍要求 candidate id、分數下限、無 hard veto、exact_identity,且不打開人工否決、單位價、identity_veto 或 protected existing match。
|
||
- V10.545 收斂 Dashboard 比價覆蓋率口徑:coverage cache 升到 v9,新增身份覆蓋、可用比價、新鮮度、待補身份、過期身份與人工閉環欄位;商品看板和 PChome 覆核頁改只把真正待處理狀態算進「比價覆核」,人工已否決 / 人工單位價 / 需補研究改列為人工閉環;PChome competitor map 只吃有效價格、新鮮、identity_v2 最新 row,資料新鮮度也改看可用比價 row。
|
||
- V10.544 收斂變體安全與 YES 指甲工具線:新增 YES 德悅氏指甲剪附除垢銼刀、腳皮銼腳板、藍寶石銼刀、三面拋光棒與 6/8cm 指甲剪的精準 total-price 線,要求同品牌、同工具名稱、同尺寸與同亮面/霧面/可收納/三面/不掉屑等款式訊號;同步接進 revalidation SQL。新增 MUJI / COCODOR 未知香味差異與 OPI 無型號不同色名 hard veto,HOOOME 暖燈材質差留人工覆核,搜尋詞也會優先帶香味/色名,提升 crawler 精準候選率。
|
||
- V10.543 打通 `rescore_accepted_current` 窄門回刷:已進人工覆核池的候選若命中具名 focused exact 線,可進 `run_retryable_candidate_revalidation()` 重新評分;新增 SK-II 青春露 330ml 兩入、AMIINO 安美諾 30ml、YES 腳指甲剪刀 10.5cm、YES 極細指甲緣硬皮剪刀 9cm 的安全 total-price 線,並補 ANNY / OPI 指甲油型號 code hard veto,避免不同色號被錯配。
|
||
- V10.542 拆開「可用比價覆蓋率」與「身份覆蓋率」:`decision_ready_rate = fresh identity / ACTIVE 商品數`,Dashboard 第一張 KPI 改顯示真正可進入決策、圖表、簡報的比價資料比例;daily / growth / Webcrumbs / OpenClaw payload 同步輸出,避免把身份覆蓋、新鮮率、價格可用率混成單一數字。
|
||
- V10.541 補正式覆核頁高信心 exact 線:The Ordinary 咖啡因 EGCG 單側漏 30ml、Natures Care 綿羊油同入數 125ml/125m、TOMOON 指甲剪同 L/S 尺寸、HH 私密潔淨露+衣物手洗精雙 200ml、SEBAMED 護潔露 200ml x2、YES 德悅氏 9cm 剪刀;都同步進 revalidation SQL,且 TOMOON/O.P.I 不同型號或尺寸仍不得自動通過。
|
||
- V10.540 補 O.P.I 類光繚指彩精準型號線:雙方同為 O.P.I 類光繚 / 如膠似漆指甲油或指彩,且共享 `ISL...` 型號 token 時才允許 total-price;不同型號/色號仍不得自動寫入。同步把此族群接進 `true_low_confidence` revalidation 窄門,降低高信心指彩候選卡在人工覆核池的比例。
|
||
- V10.539 補 PChome 任選 catalog focused exact 線:FLORTTE 水果沙拉眼線液筆 0.5ml、露得清護手霜 56g 無香/有香、Kanebo ALLIE 持采亮化 UV 防曬水凝乳 60g 雙方皆任選時可走 total-price;同步接進 revalidation queue。focused bypass 新增 commercial condition 防線,`即期品` 等商業狀態差異不會被自動寫入正式價差。
|
||
- V10.538 修 ai_calls provider CHECK 對齊:Hermes/Ollama 全失敗或未選定 host 時的 `ollama_other` 只作 telemetry bucket,migration 043 放行此值,`ai_call_logger` 也會將空值/unknown/非白名單 provider 正規化,避免觀測寫入失敗。
|
||
- V10.537 將 V10.536 focused exact 線接進 `run_retryable_candidate_revalidation()` 窄門:既有 `true_low_confidence` 舊候選若命中新品線且無 hard veto / 型別、款式、香味、件數、組合阻擋,就可重新走 matcher 寫入正式價差;有色號/香味/即期等阻擋仍不進回刷。
|
||
- V10.536 補 PChome 高分 `true_low_confidence` 安全救回線:新增花美水 Relax 薰衣草潤滑凝膠 1.7g x3、St.Clare 私密呼呼慕斯 x2 / 慕斯+噴霧組、BIOPEUTIC 果酸煥膚水凝乳 20% 150ml、台塑生醫嬰兒沐浴洗髮 3 件組、Elizabeth Arden 八小時護唇膏 SPF15 3.7g x3、理膚寶水全面修復潤唇膏 7.5ml focused total-price 規則;這些都要求同品牌、同品線與同規格/同組合,仍保留色號、香味、款式敏感品的 `variant_selection_review` 防線。
|
||
- V10.535 修 ElephantAlpha 價格 trigger statement timeout:`price_drop_alert` / `market_opportunity` / DB evidence prefetch 改為先篩最近有效 PChome identity_v2,再用 `JOIN LATERAL` 查單一 SKU 最新 MOMO 價格;保留 match_score/tags/diagnostic evidence,避免 scheduler 週期性重查整張 `price_records`。
|
||
- V10.534 收緊 PChome rescore accepted gate:`no_match / price_basis=none / alert_tier=suppress` 不得再進 `rescore_accepted_current`,並新增 `--retract-unsafe-accepted` 退回舊的 unsafe accepted rows;Dashboard / daily / growth / OpenClaw 文案改為「重算待人工覆核」,避免操作員把人工覆核隊列誤解為可直接採用或可自動寫價。
|
||
- V10.533 補 ElephantAlpha legacy OpenClaw advisory 相容:`generate_dynamic_pricing_strategy` 與既有 `generate_market_strategy` / `generate_resource_optimization_strategy` 一樣只記錄為 skipped,不再觸發 `Unrecognized step` 與 circuit breaker;避免舊協調器輸出的建議型動態定價步驟被誤解為真正可執行任務。
|
||
- V10.532 修正 PChome coverage / review queue 口徑落差:`fetch_competitor_coverage()` 的 `attempt_status` / `rescore_accepted_count` / `actionable_review_count` 改跟 review queue 一樣統計「沒有新鮮有效 identity」的商品,而不是只看「完全沒有 identity」;這讓已過期 identity 的 `rescore_accepted_current` 待審能正確顯示在 Dashboard / 狀態 API。
|
||
- V10.531 補 PChome matcher 過度保守的安全 exact 線:同品線、同規格、同數量的多件組若沒有 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 規則。負例仍鎖住混合組、香味款、粉底色號與蠟燭 catalog,不放寬全域門檻。
|
||
- V10.530 輕量化 PChome 狀態 preview 並暫停 `recover-stale` 主操作入口:`_fetch_retryable_candidate_skus()` 先從最新 `competitor_match_attempts` 縮小可重評候選,再用 `JOIN LATERAL` 只取該 SKU 最新 MOMO 價,避免 `/api/ai/pchome-match/backfill/status` 因 `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 改成輕量雙階段篩選:SQL 從過期 `competitor_prices` 小集合出發,只做 identity_v2、過期、exact/total_price/price_alert_exact 等必要條件並限制候選量,再用 `JOIN LATERAL` 取 ACTIVE 商品最新 MOMO 價;variant / catalog / commercial condition / 高風險名稱訊號改在 Python 對小樣本過濾,避免正式站看板狀態端點因全量 price_records、JSONB + regex 過重查詢拖垮 app worker。
|
||
- V10.527 收斂 PChome 過期 identity 搜尋救援隊列:`recover-stale` 不再直接吃全部過期 `identity_v2`,改走 `_fetch_expired_identity_recovery_skus()`,只收既有正式診斷為 `exact_identity / total_price / price_alert_exact` 且無 variant、catalog、commercial condition、count、bundle、unit-price 等阻擋理由的舊配對;名稱含任選、多款、香味、色號、即期、融燭燈、香氛蠟燭等高風險訊號也先排除,避免慢速 fresh search 把人工覆核型 stale pair 全部掃進來。
|
||
- V10.526 將 PChome 近門檻重評池與過期 identity 搜尋救援變成可觀測、可操作產線:`preview_retryable_candidate_revalidation()` / `preview_expired_identity_recovery()` 都是 read-only,不啟動 PChome 搜尋、不呼叫 LLM、不寫 DB;`/api/ai/pchome-match/backfill/status` 回傳 `revalidation_preview` / `stale_recovery_preview`,Dashboard 顯示「可重評 / 窄門 / 可救援」數字,並新增「救援過期 40 筆」按鈕呼叫 `/api/ai/pchome-match/recover-stale`,只在舊 PChome 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 這批已補 focused exact 規則、舊分數 >= 0.95、無商業狀態 / 款式 / 入數 / 組合阻擋理由的 `true_low_confidence` 進窄門重評,讓 V10.523 的安全規則可以實際回收舊資料,不把所有人工審核候選打開。
|
||
- V10.524 將「待刷新」變成可操作入口:商品看板 PChome 補抓產線新增「刷新過期 120 筆」按鈕,呼叫 `/api/ai/pchome-match/refresh-stale` 背景執行 `run_expired_identity_refresh()`,只刷新既有 `identity_v2` 的 PChome product_id,不跑 fresh search recovery、不呼叫 LLM,完成後重算 AI 挑品並清除 Dashboard / 競價快取。
|
||
- V10.523 補一批高分真同款 exact identity 比價規則:Beauty Foot 足膜、KAMERIA 積雪草足膜、TS6 蜜愛潤滑液 / 蜜桃煥白凝膠 / 極淨白+煥白組合、Vaseline 嬰兒高純修護凝膠在規格、入數、品牌與品線完全對齊時可進 `exact / total_price / price_alert_exact`,讓可用比價覆蓋增加;同時保留 TS6 香味衣物手洗精等 variant-sensitive 款式在 `manual_review`,不放寬全域門檻。
|
||
- V10.522 將 PChome 補抓狀態 API 接上 read-only coverage snapshot:`/api/ai/pchome-match/backfill/status` 會同步回傳身份覆蓋、新鮮率、待刷新與待補抓數,Dashboard 補抓產線即使沒有最近任務結果,也能直接判讀下一步該刷新過期價格或補抓未搜尋商品。
|
||
- V10.521 將比價新鮮度 stale 指標上屏:首頁 KPI / PChome 補抓產線 / daily / growth 都顯示價格過期數,讓操作員分清「已確認同款但價格待刷新」與「尚未找到身份配對」;過期 identity refresh 也優先刷新 `total_price / price_alert_exact` 的正式價差配對。
|
||
- V10.520 拆開過期價格刷新與搜尋救援:`run_expired_identity_refresh()` 只刷新既有 `identity_v2` PChome product_id,不再因少數 product_id 查不到或低分而同步進入慢速 `fresh_search_recovery`;缺失 / 低分候選交給 `run_retryable_candidate_revalidation()` 處理,避免正式刷新 500+ 筆時被外部搜尋拖死,讓價格新鮮度可以穩定批次回升。
|
||
- V10.519 對齊 Webcrumbs host data metadata 與新版比價覆蓋口徑:`services/webcrumbs_host_data_service.py` 會同時輸出身份覆蓋、價格新鮮、過期配對與待補抓數,讓 shared-ui plugin / 其他專案 proxy 不會把 `coverage_rate` 誤讀成價格可用率。
|
||
- V10.518 修正 PChome 比價覆蓋率口徑與新鮮度產線:`fetch_competitor_coverage()` 改拆「身份覆蓋」與「價格新鮮」,覆蓋率不再因 `expires_at` 過期被歸零;首頁 / 業績 / 成長頁同步顯示身份覆蓋、價格新鮮數與新鮮率。PChome 快取 TTL 預設由 6h 改 48h,並把每日 expired identity refresh / retryable / unmatched limits 改為環境變數,預設提高到 1200 / 240 / 240,避免 1800+ 已配對 identity 因刷新量不足長期失效。
|
||
- V10.517 補 PChome 近門檻比對安全 exact 與香氛 variant 防線:Lab52 齒妍堂汪汪隊嬰幼兒牙刷 2 入組可由低分區提升為 `exact / total_price / price_alert_exact`;Les nez 香氛融蠟燈不同款式、Time Leisure 香薰蠟燭單側香味款式會被留在覆核 / veto,不再進 recoverable 自動回刷,避免為了壓低 low_score 而錯配款式。
|
||
- V10.515 補 Webcrumbs host data 硬性授權:即使正式環境 `DISABLE_LOGIN=true` 讓一般 `@login_required` 放行,`/api/webcrumbs/marketplace-host-data` 仍必須有登入 session 或 `X-Internal-Key` 才能取真實 SKU/價差;`/webcrumbs` 未授權時只注入 `auth_required` 空狀態,避免 inline seed data 公開正式比價資料。
|
||
- V10.514 新增 Webcrumbs MOMO/PChome host data read-only API:`/api/webcrumbs/marketplace-host-data` 回傳與 `/webcrumbs` inline seed 相同的登入後 JSON contract,提供 plugin / QA / 其他專案 proxy 驗證;API boundary 明確標示不寫 DB、不呼叫 LLM、不抓外站,只允許 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,`system_public_routes.py` 從 600+ 行降至 500 行內。
|
||
- V10.512 Webcrumbs live plugin 接上 MOMO/PChome 只讀 host data:新增 `services/webcrumbs_host_data_service.py`,復用 `competitor_intel_repository.fetch_top_competitor_risks()` / coverage,把 exact / total_price / price_alert_exact 價差摘要轉成 `StockPlatformSharedUI.marketSnapshot` / `aiCandidate`;不呼叫 LLM、不抓外站、不寫 DB,無風險或失敗時仍輸出安全空狀態。
|
||
- V10.511 Webcrumbs live plugin 補 host data 安全空狀態:`/webcrumbs` 會注入 `StockPlatformSharedUI.marketSnapshot` / `aiCandidate` 的診斷空資料,避免 plugin fallback demo 數字被誤認成真實市場或 AI 建議。
|
||
- V10.510 Webcrumbs 從 runtime 接線推進到專案內 live plugin 試點:`/webcrumbs` 會設定 `StockPlatformSharedUI.allowedPluginUris` 並嵌入同源 `/webcrumbs-assets/plugins/finance.market-ticker-strip/0.1.0`、`finance.ai-candidate-card/0.1.0`,用同一頁同時驗 runtime、plugin proxy 與共享 UI loader 初始化。
|
||
- V10.509 新增市場情報 MCP Fetch Candidate Queue Writer Review Decision Approval Writer Preflight 安全預覽 gate:只審核 human approval 通過後由操作員貼回的 writer preflight 摘要,確認 approval identity、writer_preflight_id、row count、dedupe keys、approved decision 到 target review_state 的逐列映射、decision/approval/preflight evidence refs、exact identity / variant / overwrite guard 與 operator boundary;API 不讀 token、不執行 CLI、不開 DB、不寫 preflight/approval/decision/match、不更新 review_state、不補 queue、不掛 scheduler,只放行到後續 CLI review / run package 設計。
|
||
- V10.508 Webcrumbs 轉為 momo-pro 同源 asset proxy:`WEBCRUMBS_RUNTIME_URL` 預設改為 `/webcrumbs-assets/loader/webcrumbs-compatible-loader.js`,新增 allowlist proxy 只代理 188 Shared UI Hub 的 `loader/`、`plugins/`、`demo/`,避免 `webcrumbs.wooo.work` 公網 TLS / Basic Auth 尚未收斂時影響正式頁面載入;`/webcrumbs` 診斷頁同步顯示 asset upstream。
|
||
- V10.507 接入 Webcrumbs 共用 UI Runtime:新增 `WEBCRUMBS_*` 環境設定與 `/webcrumbs` 診斷入口,`ewoooc_base.html` 會在 runtime 啟用且 URL 有效時載入自架 Webcrumbs script;側欄新增 Webcrumbs 入口,並補 `docs/guides/webcrumbs_shared_runtime.md` 作為跨專案接入手冊。生產仍需固定版本與自架 plugin URI,不使用官方 `@latest`。
|
||
- V10.506 新增市場情報 MCP Fetch Candidate Queue Writer Review Decision Approval 安全預覽 gate:只審核 review decision 通過後由操作員貼回的人工 approval 摘要,確認 approval identity、row count、dedupe keys、approved decision、evidence refs、exact identity / variant / overwrite guard 與 operator boundary;API 不讀 token、不執行 CLI、不開 DB、不寫 approval/decision/match、不更新 review_state、不補 queue、不掛 scheduler,只放行到後續人工 approval writer preflight 設計。
|
||
- V10.505 新增市場情報 MCP Fetch Candidate Queue Writer Review Decision 安全預覽 gate:只審核 review inventory 通過後由操作員貼回的人工 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 與 forbidden API actions;API 不讀 token、不執行 CLI、不開 DB、不寫 decision record、不更新 review_state、不寫 match result、不補 queue、不掛 scheduler。UI 同步新增 Decision gates / Inventory link / Decision summary / Decision rows / Boundary next 預覽區。
|
||
- V10.504 新增市場情報 MCP Fetch Candidate Queue Writer Review Inventory 安全預覽 gate:只審核 writer review handoff 通過後由操作員貼回的 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 與 forbidden API actions;API 不讀 token、不執行 CLI、不開 DB、不寫 queue、不更新 review_state、不做 inventory query、不掛 scheduler。主 gate 拆為 inventory / gates / sample 三檔,避免單檔膨脹。
|
||
- V10.503 新增市場情報 MCP Fetch Candidate Queue Writer Review Handoff 安全預覽 gate:只審核 post-closeout inventory review 通過後的人工 candidate queue review 交接包,確認 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。
|
||
- V10.502 修正 AiderHeal 自動修復診斷鏈:先做 ADR-020 檔案白名單再打 110 preflight,`tests/` finding 會明確略過而不誤報 repo preflight;Code Review 完成通知會把全數不在白名單的 finding 標成需人工處理,不再宣稱已觸發 AiderHeal;白名單放行 `services/routes/database` 子目錄 Python 檔,preflight 通知帶 stderr/stdout 細節,健康檢查同時接受 `/health` 回 `ok` 與 `healthy`。
|
||
- V10.501 新增市場情報 MCP Fetch Candidate Queue Writer Post-Closeout Inventory Review 安全預覽 gate:只審核 closeout review 後由操作員 shell 完成的 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。
|
||
- V10.500 新增市場情報 MCP Fetch Candidate Queue Writer Run Closeout Review 安全預覽 gate:只審核 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。
|
||
- V10.499 新增市場情報 MCP Fetch Candidate Queue Writer Run Receipt Review 安全預覽 gate:只審核操作員 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。
|
||
- V10.498 新增市場情報 MCP Fetch Candidate Queue Writer Run Readiness 安全預覽 gate:只審核 run package review 後的操作員 readiness 證據,確認 run readiness artifact、reviewed sample、備份、read-only preflight 與 post-write smoke 路徑安全,以及 CLI-only / approval token shell-only 邊界;API 不產檔、不讀 token、不執行 CLI、不開 DB、不寫 queue、不掛 scheduler。
|
||
- V10.497 新增市場情報 MCP Fetch Candidate Queue Writer Run Package Review 安全預覽 gate:只審核 CLI review 通過後的 operator run package 草案,要求 package id、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:只審核 writer preflight 後的 CLI review 草案,確認 script path、target table、preflight id、payload row count、candidate/dedupe keys 與 command argv;禁止 API 執行 CLI、禁止 `--execute` / `--apply-real-write` / `--approval-token` 進 payload,API 不讀 token、不寫檔、不開 DB、不寫 queue、不掛 scheduler。
|
||
- V10.495 新增市場情報 MCP Fetch Candidate Queue Writer Preflight 安全預覽 gate:只審核 queue review 後的 writer preflight 草案,確認 target_table、write_mode、dedupe strategy、insert columns、payload rows 與候選 key 對齊;API 不開 DB、不執行 CLI、不建立 queue、不更新 review_state、不寫 DB、不連外、不掛 scheduler。
|
||
- V10.494 新增市場情報 MCP Fetch Candidate Queue Review 安全預覽 gate:只審核 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:只審核 parser review 後的候選交接包,確認 source/candidate key 對齊、queue policy 仍是 manual preview、候選數維持小批次、無 raw/secret/side-effect;API 不建立 queue、不寫 DB、不讀 artifact、不連外、不掛 scheduler。
|
||
- V10.492 收緊 PChome 近門檻自動回刷隊列:`retryable_candidate_revalidation` 不再把 `identity_veto`、`unit_comparable`、`true_low_confidence` 納入每日自動回刷;只處理 `recoverable_low_score` 與 legacy `low_score / refresh_low_score`,並要求無 hard veto、仍在 `exact_identity`、且具備同品線/identity anchor 證據。這讓「可救回」與「正確阻擋」在操作層面真正分流,避免為了壓低 low_score 而重跑不該自動推進的候選。
|
||
- V10.491 新增市場情報 MCP Fetch Result Parser Review 安全預覽 gate:只審核操作員貼回的 parser 結構化摘要,對齊 receipt source/path、候選必要欄位、公開 URL、小批次上限與 raw HTML/secret/side-effect 風險;API 不讀 artifact、不執行 parser CLI、不抓外站、不寫 DB、不掛 scheduler。
|
||
- V10.489 補 PChome 低分同款人工覆核回收與 gate-pass 風險邊界:TS6 超美白香氛誘霜 120g/ml、W 修護保養蝸牛特潤修護面膜 6 片、Derma 大地 Eco 植萃護膚油 2 入,從低信心升成 `identity_review` 人工覆核候選;Clarins 輕盈美體護理油 vs 身體調和護理油、台塑生醫嬰兒沐浴/洗髮組合數量反轉、isLeaf 私密慕絲香型數量不一致改 hard veto;HOOOME 大理石暖燈 vs 泛稱經典款改留 `variant_selection_review`。正式價差表仍需人工採用才會寫入。Production 已部署 `/health=V10.489`;500 筆 read-only audit 由 V10.486 基線 `gate_pass=129 / identity_veto=1 / still_low=370` 收斂為 `gate_pass=124 / identity_veto=4 / still_low=372`。測試:完整 `pytest` 1289 passed / 9 skipped。
|
||
- V10.488 新增市場情報 MCP Fetch Run Receipt 安全預覽 gate,只審核操作員 dry-run receipt,不執行 CLI、不抓外站、不寫 DB。
|
||
- V10.486 補 PChome near-threshold 風險邊界:NEW DIRECTIONS 甜杏仁油 vs 酪梨油直接 `core_ingredient_line_conflict` hard veto;COCODOR 經典擴香瓶多款任選 vs generic、KAMERIA 足膜任選三款 vs 單一涼感足膜、Hakugen 白元入浴劑橘盒/綠盒不同變體都保留 `variant_selection_review`,不進可採用 gate。Production 已部署 `/health=V10.486`;240 筆 near-threshold audit `gate_pass 83→79`、`identity_veto 0→1`、`still_low 157→160`。測試:`tests/test_marketplace_product_matcher.py`、`tests/test_competitor_match_attempts_persistence.py`、`tests/test_competitor_match_attempt_rescore_audit.py` 通過。
|
||
- V10.485 補 NITORI 香氛噴霧器短型號防線:read-only near-threshold pilot 找到唯一 gate pass 為 5510 vs J82 LBR,不應入隊;matcher 現在會把 `J82` 這類短英數型號納入 NITORI diffuser model conflict,與 5510 / YX168 等不同型號一樣 hard veto。Production 已部署 `/health=V10.485`;120 筆 near-threshold audit 由 `gate_pass=1` 變 `gate_pass=0`,accepted audit `scanned=89 / gate_pass=89 / still_low=0`。測試:`tests/test_marketplace_product_matcher.py`、`tests/test_competitor_match_attempts_persistence.py`、`tests/test_competitor_match_attempt_rescore_audit.py` 通過。
|
||
- V10.484 拆分 PChome manual gate:POWERMAN 男性私密養護液 30ml、PHYSIOGEL AI 冰鎮精華露 200ml 2入、TS6 緊彈水嫩凝膠 40g、DERMA 寶寶洗髮沐浴露 150/500ml、Clarins 黃金亮眼萃 20ml、Cetaphil 長效潤膚乳 237/473ml 等明確同款可走 `exact / total_price / price_alert_exact`;COCODOR 大豆蠟燭單側多款任選改留 `variant_selection_review`,Pavaruni 雙側 20 香味蠟燭不受新型錄保護誤傷。Production 曾部署 `/health=V10.484`,並退回 COCODOR 舊 accepted 風險 1 筆。測試:`tests/test_marketplace_product_matcher.py`、`tests/test_competitor_match_attempts_persistence.py`、`tests/test_competitor_match_attempt_rescore_audit.py` 通過。
|
||
- V10.483 收斂舊 gate pass 風險:NARS 遮瑕蜜任選、LOREAL 玻尿酸啵啵精華水/液態紫熨斗 vs 水光精華、SEBAMED 洗髮乳任選、Schick 舒綺 2-in-1 型號落差、TAICEND 保護膜 vs 噴霧,現在都會保留高分但加 `variant_selection_review` 與專屬 reason,不再被 rescore 自動送進 accepted queue。Production 已部署 `/health=V10.483`;目標 5 SKU audit `gate_pass=0 / still_low=5`,並用 `--retract-variant-accepted` 退回 4 筆舊 accepted 變體風險,latest accepted audit `scanned=90 / gate_pass=90 / still_low=0`。測試:`tests/test_marketplace_product_matcher.py`、`tests/test_competitor_match_attempts_persistence.py`、`tests/test_competitor_match_attempt_rescore_audit.py` 通過。
|
||
- V10.482 補 exact variant-safe 回收:LUSH 櫻之花身體噴霧 200ml、ARTMIS 金縷梅/蔓越莓私密清潔慕斯 250ml、SO NATURAL FIXX 120ml plain 與 Baan 原味/草莓同 catalog,若雙方同品名、同規格且同明確 variant,移除過度保守的 `variant_selection_review` 並進 `exact / total_price / price_alert_exact`;SO NATURAL 經典款/光澤款/霧面款/夏日款 catalog 對單款 120ml 仍維持人工覆核。Production 已部署 `/health=V10.482`,並只 materialize 5 筆新增 exact-line SKU 到 `rescore_accepted_current`,最新 accepted audit `scanned=94 / gate_pass=94 / still_low=0`。測試:`tests/test_marketplace_product_matcher.py`、`tests/test_competitor_match_attempts_persistence.py`、`tests/test_competitor_match_attempt_rescore_audit.py` 通過。
|
||
- V10.481 補 rescore accepted retraction 工具缺口:`--retract-variant-accepted` 不只看舊 row 已存的 `diagnostic_codes`,也會用當前 matcher 重判 latest `rescore_accepted_current`;若新版規則已變成 `variant_selection_review / low_score_current`,會追加退回 `true_low_confidence`,避免舊 accepted queue 殘留不該採用候選。Production 已先保守 materialize 15 筆安全 SKU,再退回 7 筆舊 accepted 變體風險;最終 `rescore_accepted_current=89`,accepted audit `gate_pass=89 / still_low=0`。
|
||
- V10.480 依 production accepted-current 風險樣本補安全閘門:rom&nd 零絲絨/果凍唇釉不可被果汁唇釉多款 listing 誤收為同款;Relove 潔淨凝露若一側為傳明酸/淨白活性變體改送 `variant_selection_review`;1990 融燭燈不同設計(歐式可彎 vs 韓風原木底座)改 hard veto。此版先清 accepted queue 風險,再做保守 materialize。
|
||
- V10.479 依 production audit 再補二階風險:Cetaphil 修護乳 vs 潔膚露改 hard veto;私密防護慕絲二款可選 vs 單一香型、雪芙蘭滋養霜 vs 單側清爽型改走 `variant_selection_review`,避免仍殘留在 accepted queue。
|
||
- V10.478 補 PChome 高分錯配 / catalog 變體防線:精油/香氛類若兩側明確香味不同(如檸檬草 vs 茶樹)直接 veto;NOW 椰子油膏 vs 乳木果油、港香蘭漢本 vs 艾魔菈爽身粉改為商品線硬擋;多色/多香/數字區間 catalog 對單一款式(粉餅盒、眉筆、眼線膠筆、車用擴香蕊等)只進 `variant_selection_review`,不自動進 accepted queue。
|
||
- V10.477 補 PChome 高分錯配防線:SPF 數值不同(如 SPF25 vs SPF50)直接 veto;MAKE UP FOR EVER 定妝噴霧 vs 活氧水不同線直接 veto;多款任選對單一款(私密潔浴露、身體去角質、乳液、染眉膏等)與單側色號改送 `variant_selection_review`,避免高分候選誤入 accepted queue。
|
||
- V10.476 補 PChome 商品比對「商業條件差」防線:即期品、效期/保存期限、盒損、福利品等條件若只出現在單側,matcher 會加 `commercial_condition_gap` + `variant_selection_review`,保留高分但不讓 rescore 自動進 accepted queue。這可避免 3W CLINIC 粉底液、KAMERIA 足膜、Sisley 全能乳液這類同名但商品狀態不同的候選被當成一般正品價差。
|
||
- V10.475 補 PChome rescore 操作與高分錯配防線:`scripts/audit_competitor_match_attempt_rescore.py` 預設不再只掃 `strong_exact_spec_match`,避免漏掉 `focused_exact_*` 等新版 matcher 理由;matcher 新增暖燈 S/M/L 尺寸差、NITORI 香氛噴霧器型號差的 hard veto,並把彩妝色號單邊出現的高分候選送進 `variant_selection_review`,避免 LA MER 氣墊等色號型商品被誤入 accepted queue。測試:`tests/test_marketplace_product_matcher.py`、`tests/test_competitor_match_attempts_persistence.py`、`tests/test_competitor_match_attempt_rescore_audit.py` 通過。
|
||
- V10.474 補 PChome near-threshold matcher / feeder 下一階段:新增 HOOOME 白色經典香氛暖燈與 Gdesign Aroma Lava 2.0 的窄範圍 total-price exact 回收;Recipe Box 可撕式水性兒童指甲油只進 identity_review,不自動寫正式價差;Pavaruni 蠟燭 vs 精油、DASHING DIVA 不同款式仍維持 veto/低信心。known-id refresh 現在會對 hard-veto 舊候選執行 fresh search recovery,missing known-id 若 fresh search 只找到低分候選也會保留 best candidate + diagnostics,而非落成 `refresh_no_result`;正式覆寫保護新增 stronger existing guard,避免較弱新候選以高分覆蓋既有強正式配對。測試:`tests/test_marketplace_product_matcher.py`、`tests/test_competitor_match_attempts_persistence.py`、`tests/test_competitor_match_attempt_rescore_audit.py` 通過。
|
||
- V10.473 補背景 embedding host_health skip:`allow_111_fallback=false` 會讀最近 `host_health_probes`,跳過 runtime unhealthy 的 GCP 節點(預設 20 分鐘,DB fail-open),避免每筆任務都等待已知壞節點 timeout;路由安全不變,不把背景 embedding 落 111。
|
||
- V10.472 補 GCP Ollama failover rootless 診斷:新增 `scripts/ops/diagnose_ollama_gcp_failover.sh`,可一鍵檢查 GCP-A direct、GCP-B direct、111、110:11435、110:11436 與 GCP-B `bge-m3` runtime;目前輸出確認 GCP-A `11434` refused、GCP-B direct/embed OK、110:11435 502、110:11436 OK。110 無免密 sudo、GCP-A 22 refused、GCP-B SSH key denied,因此 primary 修復需 GCP/SSH 或 110 root 權限;應用層維持 GCP-A → GCP-B → 111,不把背景 embedding 落 111。
|
||
- V10.471 依 GCP-B `bge-m3` 實測 latency 調整 embedding timeout,已部署正式環境並確認 `/health=V10.471`:GCP-B `/api/embed` 三次實測約 6.4s / 7.3s / 23.5s,原本 `OLLAMA_EMBED_MAX_TIMEOUT=15` 與 host health `8s` 會誤殺慢但成功的 embedding;已將背景 embedding cap 與 host health model probe timeout 預設調為 30s。正式 smoke 顯示容器內 embedding 回 1024 維、耗時 10.07s;手動 host health probe 後最新狀態為 GCP-A unhealthy、GCP-B healthy、111 healthy。路由安全不變:背景 embedding 仍只跑 GCP-A/GCP-B,不落 111。
|
||
- V10.470 強化 Ollama host health probe,已部署正式環境並確認 `/health=V10.470`:scheduler 與觀測台 host health 對 GCP-A / GCP-B 除 `/api/tags` 外,再做短 `bge-m3` `/api/embed` 實作探針;可抓出 GCP-B「tags/version 正常但 embedding runner 8s timeout」這類假健康。111 預設不做背景 embedding probe,避免監控任務把 `bge-m3` 載入 fallback Mac。正式 smoke 後 `host_health_probes` 最新狀態為 GCP-A unhealthy、GCP-B unhealthy、111 healthy。
|
||
- V10.469 將背景 embedding 的 GCP-only 全失敗改為專業降級語意,已部署正式環境並確認 `/health=V10.469`:`allow_111_fallback=False` 時若 GCP-A/GCP-B 都不可用,開啟 failure circuit 並記 WARNING,不再把可預期的背景熔斷每分鐘打成 ERROR;同步 / 允許 fallback 的 embedding 全失敗仍保留 ERROR。Smoke 顯示 GCP-B `/api/version` 可用,但 `/api/embed` 仍可能 15s timeout,下一步需修 GCP-A primary 與 GCP-B runner/model 負載。
|
||
- V10.468 補 Ollama import-time 防凍結與背景 embedding GCP failure circuit,已部署正式環境並確認 `/health=V10.468`:`config.OLLAMA_HOST` / `HERMES_URL` / `EMBEDDING_HOST` 舊相容常數不再於 import 時 probe network,也不會因 GCP-A/GCP-B 暫時拒連而 freeze 到 111;動態 caller 仍走 `get_*()` / `OllamaService` 三主機級聯。當 `allow_111_fallback=False` 且 GCP-A/GCP-B 皆失敗時,短暫熔斷 60 秒,不重複打兩台 GCP、不落 111,降低 app/scheduler 因連續 embedding timeout 造成的 log 與 worker 壓力;部署 smoke 時 GCP-B `/api/version` 已恢復 200 並成為動態路由落點,GCP-A `22/11434` 仍拒連,需後續用 GCP 權限修復 primary Ollama 主機。
|
||
- V10.467 補 PChome focused exact total-price 安全通道:針對正式近門檻樣本中已確認同品牌、同品名、同規格/同入數的 3W CLINIC 粉底液 2入、花美水凝膠 3支、The Ordinary 咖啡因 EGCG 30ml、KUSSEN 屁屁膏 3入、Bone 擴香禮盒、1990 融燭燈白色款與 CANMAKE 淚袋盤,從 `exact/manual_review` 收斂為 `exact/total_price`;未放寬 `MIN_MATCH_SCORE`,DASHING DIVA、唇彩、香味、色號/款式敏感商品仍維持 variant / veto 保護。Production pilot 已將 9 筆安全 SKU 送入 `rescore_accepted_current`,`true_low_confidence` 802→793、`rescore_accepted_current` 38→47;`6101784` 即期品保留在 `true_low_confidence`。
|
||
- V10.466 修正 rescore audit duplicate 判斷:只在「最新 attempt 已是同候選 `rescore_accepted_current`」時跳過;若歷史曾 accepted、但後續 crawler 又追加低信心列,允許重新 materialize,避免 Dashboard latest-state 仍停在 `true_low_confidence`。Production pilot 已將 SKU `14756069`、`11159042`、`13842560`、`8394210`、`15192547`、`10509765`、`10603780` 送入人工覆核隊列;只寫 `competitor_match_attempts`,`competitor_prices` / `competitor_price_history` 未變。
|
||
- V10.465 修正 embedding fallback-disabled 控制流:`allow_111_fallback=False` 時若 resolver 回 111,不再直接退出或只試單台 GCP-B,會強制改試尚未嘗試的 GCP-A/GCP-B;背景 embedding 仍不落 111。
|
||
- V10.464 補 rescore audit 精準 SKU pilot:`audit_competitor_match_attempt_rescore.py --sku` 可只掃指定 SKU,再搭配 `--apply-accepted` 只把通過新版 matcher 的目標 SKU 追加到 `rescore_accepted_current` 人工覆核隊列,不寫正式價格表。
|
||
- V10.463 補 DR.WU / 達爾膚品牌 alias:同規格 `DR.WU 達爾膚` 與 `DR.WU` 候選不再被當成 brandless identity review,會以既有 exact_identity / total_price / price_alert_exact 閘門處理;未調整 `MIN_MATCH_SCORE`,保留 variant / hard veto 保護。
|
||
- V10.462 進一步收斂 PChome 補抓 UI 語意:Dashboard 區塊標題改為「PChome 補抓產線」,AI 中樞按鈕、前端確認與 API 訊息改為「補抓未搜尋 / 未搜尋補抓」,避免操作員把尚未搜尋的工作誤判成已有候選待審。
|
||
- V10.461 修正商品看板 PChome 補抓優先清單的狀態語意:尚未進入搜尋/補抓的品項改顯示「尚未搜尋」與「尚未進入 PChome 補抓」,並補前端守門測試禁止回退成籠統「待比對」,避免操作員把未搜尋誤判成已有候選待人工覆核。
|
||
- V10.460 收斂 daily/growth 圖表空白誤判與 ElephantAlpha 告警信封:`page-daily-sales.js`、`page-growth.js` 的 chart 判斷改為至少有一個非零資料點才繪製 Chart.js,避免全 0 序列只畫座標軸;`resource_optimization` / `ea_escalation` 改輸出 deterministic `decision_envelope`,只使用 action_plans、CPU 實測與 hygiene evidence,不再輸出空泛「48 小時效益」敘事。
|
||
- V10.459 強化 PChome `protected_existing_match` 決策封包:解析 `existing_match_conflict` 的既有候選、新候選與雙方 score,寫入 `decision_envelope.evidence` / `expected_impact` / `guardrails`,並把下一步明確標成「比較既有正式候選與新候選」;仍保持 `can_auto_execute=false`,避免新候選分數較高時繞過人工覆核自動覆蓋正式價差。
|
||
- V10.458 將 OpenClaw / 競品 PPT 接上 PChome 覆核 `decision_envelope` 摘要:`competitor_intel_repository.summarize_review_decision_envelopes()` 成為共用 formatter,OpenClaw 週報/日報/月報與競品簡報 data_summary / KPI slide 都讀同一份信封文字,避免策略報告與 PPT 各自翻譯覆核狀態或遺失 HITL guardrails。
|
||
- V10.457 將 PChome 覆核 `decision_envelope` 連到人工操作面:Dashboard 覆核卡新增決策等級、資料品質、HITL/trace 信封摘要;`/api/export/excel/pchome-review` 匯出同步增加決策信封 ID、決策類型、建議代碼、責任人、資料品質、自動執行允許與證據摘要,讓線上操作與下載檔都保留同一份 guardrails。
|
||
- V10.456 將 PChome 覆核隊列接上 `decision_envelope` contract:`fetch_competitor_review_queue()` 與 `/api/pchome-review/queue` 每筆候選都輸出同一份 SKU、PChome 候選、match evidence、recommended_action、expected_impact 與 HITL guardrails,Dashboard、Agent、Telegram、PPT 後續不得再各自重建比價判讀格式;同版將 review queue cache key 升到 v3,避免正式環境沿用舊 payload。
|
||
- V10.455 讓 EventRouter 對 `decision_envelope` 事件走直送證據模板:NemoTron / 價格比對已產生 SKU、PChome 候選、match evidence 與 HITL guardrails 時,不再進 L1/L2 AI 重新摘要,避免額外模型呼叫與告警文字二次發散;Telegram 決策信封同步補「標的」區塊,顯示 SKU、商品與 PChome 候選。同版補 `audit_competitor_match_attempt_rescore.py --retract-variant-accepted`,可把最新仍帶 `variant_selection_review` 的 `rescore_accepted_current` 批次追加退回 `true_low_confidence`,且不寫正式價差表。
|
||
- V10.454 補 feeder / rescore 正式寫入安全閘門:matcher 若只到 `manual_review` / `identity_review` / `variant_selection_review`,例如 MOMO 多款任選唇膏對 PChome 單一款式,只能進 `true_low_confidence` 覆核,不得由 retryable replay、known identity refresh 或 rescore accepted 語意自動寫入 `competitor_prices` 正式價差。
|
||
- V10.453 補 PChome matcher 安全回收規則:新增 Herbacin 小甘菊護手霜 20ml brandless 同款 anchor;修正 `EX8` 型號不可被誤解析成 `x8` 入數;新增 GONESH / 香氛固體凝膠的一側泛稱、一側明確香味或 No. 款式 veto,避免近門檻 replay 把不同香味、不同入數商品錯寫成正式價差。
|
||
- V10.452 修正 PChome rescore audit 掃描口徑:`audit_competitor_match_attempt_rescore.py` 預設先取每個 SKU 最新 attempt,再套用 status / reason 篩選,和 Dashboard review queue 的最新狀態一致;舊 SKU/候選考古掃描需明確加 `--include-historical-candidates`,避免已修正或已入隊商品被舊低信心紀錄重複推回報表。
|
||
- V10.451 拆分 PChome `low_score` 操作分流並補 read-only queue API:比價覆核頁把近門檻可救、證據不足、低信心舊候選拆成獨立篩選;repository 同步提供 `recoverable_low_score`、`true_low_confidence`、`legacy_low_score` 三個 status filter,`/api/pchome-review/queue` 可直接用同一套 review_status 做 smoke / operator tools 查詢,讓回刷、人工覆核與報表不再把所有低信心候選混在一起。
|
||
- 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,降低全量覆核頁互動成本。
|
||
- V10.447 反轉 PChome 覆核頁查詢方向:review queue page 先從最新 `competitor_match_attempts` 的可覆核狀態縮小候選,再 join ACTIVE 商品與最新價,並用 `NOT EXISTS` 排除已有有效 identity_v2 正式價;避免每次「全部覆核」先掃全站 ACTIVE 商品。
|
||
- V10.446 修正 PChome 覆核頁輕量路徑的 overview timeout:覆核頁總覽改讀已存在的 shared dashboard cache / stale cache,沒有快取時只用目前覆核頁資料補足狀態,不再現場跑 `_load_competitor_decision_overview(session)` 的重型後備 SQL。
|
||
- V10.445 補 PChome 覆核頁輕量渲染路徑:`filter=pchome_review` 不再先建完整 Dashboard `unique_items`,改為只查覆核當頁 50 筆商品、當前價、昨日價與週前價,再沿用同一張新版表格與人工覆核按鈕;降低核心比價覆核頁的全站資料負載。
|
||
- V10.444 瘦身 PChome 覆核頁查詢:`fetch_competitor_review_queue_page()` 將覆核隊列總數與當頁資料合併在單一 SQL 內取回,避免 `/?filter=pchome_review` 為 count/page 重複掃 `latest_momo`、`latest_attempt`、`valid_competitor` CTE;保留狀態分流、人工覆核與正式價格寫入保護不變。
|
||
- V10.443 補 PChome rescore 人工覆核入隊:`audit_competitor_match_attempt_rescore.py --apply-accepted` 只追加 `rescore_accepted_current` attempt 進人工覆核隊列,不直接寫 `competitor_prices` / `competitor_price_history`;商品看板新增「重算可採用」分流與狀態文案,讓可救回候選先由人審確認再正式更新價差。
|
||
- V10.442 降噪 `/cicd` 舊 GitLab 探測:沒有明確啟用 `GITLAB_ENABLED=true` 與 token 時,不再打退役的 `192.168.0.110:8929` 或 SSH fallback,正式 responsive smoke 造訪 `/cicd` 只呈現空 pipeline 狀態,不污染 app logs。
|
||
- V10.441 補 PChome matcher re-score audit 與商品看板原因標籤:新增 read-only `competitor_match_attempt_rescore_audit` / `scripts/audit_competitor_match_attempt_rescore.py`,可用最新版 matcher 重新分類既有 `competitor_match_attempts`,預設不寫 DB、不更新正式價格;商品看板同步補蘭蔻/達特醫/hoi/Saugella/Lactacyd 等 focused matcher reason 中文標籤,讓「待對比」能拆成商品線不符、款式版本不符、可回刷或仍低信心。
|
||
- V10.439 收斂外部 BI / 資料協作入口:`/metabase`、`/grist` 正式頁維持 momo-pro 內部診斷 bridge,`.env.example` 與 bi profile Grist 預設改回 `https://mo.wooo.work/grist` / `GRIST_APP_HOME_URL`,並補測試禁止 `grist.wooo.work` / `awoooi` 回流到導覽設定;外部工具頁標題字級改用新版 token 與手機 media query。
|
||
- 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.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.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.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 與操作員安全確認合併成「可進人工 fetch gate 審核」的交接收據;API/UI 不保存 payload、不打 health、不開 DB、不抓外站、不掛 scheduler,也不會自動打開 manual fetch。
|
||
- 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 合併成可審核的 runtime promotion package;API/UI 不保存 payload、不打 health、不開 DB、不抓外站、不掛 scheduler,也不會自動打開人工 fetch gate。
|
||
- V10.366 補市場情報 MCP runtime smoke 收據審核:新增 `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 是否可升級為已驗收;API/UI 不保存 payload、不打 health、不開 DB、不抓外站、不掛 scheduler,且會阻擋任何 DB write/commit/scheduler/writes 旗標或原始 readiness blocked reasons。
|
||
- V10.360 收斂瀏覽器自動開啟與 PChome 熱路徑:`tests/test_image_fetch.py` 改成 `RUN_MOMO_BROWSER_TESTS=1` 才會跑,預設 headless 且關閉 Chrome 密碼管理,避免一般 pytest 自動打開 MOMO 網站與觸發密碼允許提示;scheduler Selenium 同步關閉 password manager/autofill;PChome coverage/review queue 熱查詢改用 `JOIN LATERAL` 取 active 商品最新價,並補 Dashing Diva 品線召回搜尋詞。
|
||
- V10.359 導入 Browse.sh 可選爬蟲診斷與強化 MOMO/PChome 色號比對:新增 `BrowseShTool` wrapper、probe CLI 與操作手冊,讓 browse.sh 只作 selector/XHR/network trace 探勘、不進正式 scheduler;matcher 補護甲油/洗手慕斯/足膜精準搜尋詞,保留小數規格,並對唇釉、妝前乳、素顏霜等顯性色號/色系不一致候選做 hard veto,避免同系列不同色號污染正式價差。
|
||
- V10.358 補市場情報 MCP 啟用證據審核:新增 `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 缺口;API/UI 不保存 payload、不打 health、不啟動 MCP、不執行 docker/SSH、不開 DB、不抓外站、不掛 scheduler,且會阻擋真實 secret 字串與任何 DB write/fetch/scheduler 證據。
|
||
- V10.357 補市場情報 MCP 完整度稽核:新增 `mcp_completion_audit` read-only builder、GET endpoint、UI 面板與 deployment readiness smoke target,彙整外部 MCP design/runtime、內部 tool contract/runtime、activation runbook 與 fetch gate 狀態;API/UI 不啟動 MCP、不打 health、不執行 docker/SSH、不開 DB、不寫檔、不抓外站、不掛 scheduler。
|
||
- V10.356 補市場情報 candidate queue review AI summary Telegram dispatch report catalog record final closeout gate:新增 read-only report catalog record final closeout builder、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;API/UI 不讀 approval/Telegram token、不呼叫 LLM、不產報表、不派送 Telegram、不開 DB、不寫檔、不執行 CLI、不寫 catalog record、不 commit、不更新 review_state、不掛 scheduler。
|
||
- V10.355 補市場情報 candidate queue review AI summary Telegram dispatch report catalog record archive summary gate:新增 read-only report catalog record archive summary builder、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;API/UI 不讀 approval/Telegram token、不呼叫 LLM、不產報表、不派送 Telegram、不開 DB、不寫檔、不執行 CLI、不寫 catalog record、不 commit、不更新 review_state、不掛 scheduler。
|
||
- V10.354 補市場情報 candidate queue review AI summary Telegram dispatch report catalog record archive gate:新增 read-only report catalog record archive builder、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;API/UI 不讀 approval/Telegram token、不呼叫 LLM、不產報表、不派送 Telegram、不開 DB、不寫檔、不執行 CLI、不寫 catalog record、不 commit、不更新 review_state、不掛 scheduler。
|
||
- V10.353 補市場情報 candidate queue review AI summary Telegram dispatch report catalog record closeout gate:新增 read-only report catalog record closeout builder、POST endpoint、UI 按鈕與 deployment readiness smoke target,在 commit gate 後審核 catalog record identity、DB commit/post-write smoke 證據、操作員 closeout 確認與後續 archive separate gate;API/UI 不讀 approval/Telegram token、不呼叫 LLM、不補產報表、不派送 Telegram、不開 DB、不寫檔、不執行 CLI、不寫 catalog record、不 commit、不更新 review_state、不掛 scheduler。
|
||
- V10.352 補市場情報 candidate queue review AI summary Telegram dispatch report catalog record commit gate:新增 read-only report catalog record commit builder、POST endpoint、UI 按鈕與 deployment readiness smoke target,在 run receipt 後審核外部 CLI catalog record DB commit、post-write smoke、操作員 commit gate 確認與後續 closeout separate gate;API/UI 不讀 approval/Telegram token、不呼叫 LLM、不補產報表、不派送 Telegram、不開 DB、不寫檔、不執行 CLI、不寫 catalog record、不 commit、不更新 review_state、不掛 scheduler。
|
||
- V10.351 補市場情報 candidate queue review AI summary Telegram dispatch report catalog record run receipt:新增 read-only report catalog record run receipt builder、POST endpoint、UI 按鈕與 deployment readiness smoke target,在 run readiness 後審核外部 CLI writer output、catalog record key/hash、DB commit receipt 與 post-write smoke;API/UI 不讀 approval/Telegram token、不呼叫 LLM、不補產報表、不派送 Telegram、不開 DB、不寫檔、不執行 CLI、不寫 catalog record、不 commit、不更新 review_state、不掛 scheduler。
|
||
- V10.348 補市場情報 candidate queue review AI summary Telegram dispatch report catalog record run readiness:新增 read-only report catalog record run readiness builder、POST endpoint、UI 按鈕與 deployment readiness smoke target,在 run package 後檢查 payload manifest、manual CLI command、backup/dry-run、run receipt 與 postwrite smoke 條件;API/UI 不讀 approval/Telegram token、不呼叫 LLM、不補產報表、不派送 Telegram、不開 DB、不寫檔、不執行 CLI、不寫 catalog record、不更新 review_state、不掛 scheduler。
|
||
- V10.347 補市場情報 candidate queue review AI summary Telegram dispatch report catalog record run package:新增 read-only report catalog record run package builder、POST endpoint、UI 按鈕與 deployment readiness smoke target,在 record write gate 後整理 payload manifest、CLI command bundle、backup/dry-run trace 與後續 run readiness separate gate;API/UI 不讀 approval/Telegram token、不呼叫 LLM、不補產報表、不派送 Telegram、不開 DB、不寫檔、不執行 CLI、不寫 catalog record、不更新 review_state、不掛 scheduler。
|
||
- V10.344 補市場情報 candidate queue review AI summary Telegram dispatch report catalog record write gate:新增 read-only report catalog record write builder、POST endpoint、UI 按鈕與 deployment readiness smoke target,在 write preflight 後檢查 catalog record key/schema/hash trace、operator dry-run、backup 與 commit separate gate;API/UI 不讀 approval/Telegram token、不呼叫 LLM、不補產報表、不派送 Telegram、不開 DB、不寫檔、不寫 catalog record、不更新 review_state、不掛 scheduler。
|
||
- V10.342 補市場情報 candidate queue review AI summary Telegram dispatch report catalog write preflight:新增 read-only report catalog write preflight builder、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。
|
||
- V10.339 補市場情報 candidate queue review AI summary Telegram dispatch report catalog index:新增 read-only report catalog index builder、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。
|
||
- V10.338 補市場情報 candidate queue review AI summary Telegram dispatch report catalog handoff:新增 read-only report catalog handoff builder、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。
|
||
- V10.335 補市場情報 candidate queue review AI summary Telegram dispatch report archive summary:新增 read-only report archive summary builder、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。
|
||
- V10.334 強化 MOMO/PChome 核心比價第二波:matcher 補常見品牌 alias、任選/平輸/國別 noise 收斂、刀把/刀片/刀頭等件數解析與系列衝突硬否決,避免 Gillette/Schick 同品牌不同系列或刀片數被誤當同款;新增近門檻候選重新評分流程,會把舊 low_score 中 0.70 以上且非 hard veto、有 PChome product_id 的候選先批次重評,再補抓高價未配對商品;商品看板新增 PChome 補抓產線狀態卡,顯示 run id 階段、成功/低信心/無結果/挑品寫入與錯誤,不再讓核心比價補抓變成黑盒。
|
||
- V10.333 補市場情報 candidate queue review AI summary Telegram dispatch report archive:新增 read-only report archive builder、POST endpoint、UI 按鈕與 deployment readiness smoke target,在 report closeout 後審核 archive/closeout/receipt/report output artifact path、hash/章節、archive manifest、retention policy 與後續 archive summary separate gate;API/UI 不讀 approval/Telegram token、不呼叫 LLM、不補產報表、不派送 Telegram、不開 DB、不寫檔、不更新 review_state、不掛 scheduler。
|
||
- V10.332 補市場情報 candidate queue review AI summary Telegram dispatch report closeout:新增 read-only report closeout builder、POST endpoint、UI 按鈕與 deployment readiness smoke target,在 report run receipt 後審核 closeout artifact、receipt/report artifact path、hash/章節覆核、後續 report archive separate gate 與 runtime boundary;API/UI 不讀 approval/Telegram token、不呼叫 LLM、不補產報表、不派送 Telegram、不開 DB、不寫檔、不更新 review_state、不掛 scheduler。
|
||
- V10.331 強化 PChome 比價 matcher 邊界:正式端 pilot 先刷新 30 筆過期 identity_v2、補抓 15 筆高價未配對 SKU,確認 structured diagnostics 開始寫入;針對「同品牌、同核心多組件、無任何否決理由、價格正常」但因規格文字不完整卡在 0.74x 的候選,新增 strong_component_line_match 窄門補分,避免 Gennies 類完整套組被誤留在低信心,同時維持雙入組對單品、容量衝突、不同品牌與補充瓶硬否決。
|
||
- V10.330 補市場情報 candidate queue review AI summary Telegram dispatch report run receipt:新增 read-only report run receipt builder、POST endpoint、UI 按鈕與 deployment readiness smoke target,在 report run readiness 後審核人工/獨立 job 產出的 report receipt、artifact path/hash、必要章節、summary hash 與 runtime boundary;API/UI 不讀 approval/Telegram token、不呼叫 LLM、不補產報表、不派送 Telegram、不開 DB、不寫檔、不更新 review_state、不掛 scheduler。
|
||
- V10.329 優化 `/growth_analysis` 冷快取策略:source fingerprint 未變時,成長分析共享快取由 30 分鐘延長為 6 小時有效;每日匯入仍會主動清除快取,避免資料更新後沿用舊圖表,同時降低正式端重啟或冷 worker 重新掃 `realtime_sales_monthly` 的 14 秒級等待。
|
||
- V10.328 強化 MOMO/PChome 核心比價準確性第一波:補高頻品牌 alias、中文商品線 bigram 訊號、保健/包裝同義單位與買送件數解析,搜尋詞改為品牌/核心/主規格三層;PChome 比對嘗試與正式快照補存 URL、圖片、庫存與結構化 diagnostics,商品列表用 tone 分流顯示尚未搜尋、低信心、身份否決、單位價與過期狀態,不再把不同問題全部壓成灰色待比對;同步持久化首頁 / PChome coverage 熱路徑索引,避免重開機後慢查詢回歸。
|
||
- V10.327 補 OpenClaw fallback 可觀測性:週報、月報、Meta、日報洞察、每日報告的 Gemini/NIM 備援 caller 納入 caller registry、AI 觀測台 agent group 與 Telegram 狀態統計,並補 MCP collector Ollama-first regression test,避免 fallback 真實使用量在觀測層被歸類成未知或漏算。
|
||
- V10.326 補市場情報 candidate queue review AI summary Telegram dispatch report run readiness:新增 read-only report run readiness builder、POST endpoint、UI 按鈕與 deployment readiness smoke target,在 report run package 後整理 report generation readiness manifest、manual report command boundary、artifact path gate 與後續 report run receipt gate;API/UI 不讀 approval/Telegram token、不呼叫 LLM、不派送 Telegram、不開 DB、不寫檔、不產報表、不更新 review_state、不掛 scheduler。
|
||
- V10.325 收斂 Gemini 主路徑:OpenClaw 週/月/meta/日報洞察、Telegram PPT 分析與 MCP fallback 全部改成先走 OllamaService 的 GCP-A → GCP-B → 111 三主機級聯;Gemini 只在 Ollama/NIM 不可用後作備援。Elephant Alpha resource_optimization 告警補上待處理 action_plans 焦點列表,避免只報隊列數字卻沒有可執行對象。
|
||
- V10.324 補市場情報 candidate queue review AI summary Telegram dispatch report run package:新增 read-only report run package builder、POST endpoint、UI 按鈕與 deployment readiness smoke target,在 report input 後整理 run package contract、evidence refs、package sections 與後續 report run readiness gate;API/UI 不讀 approval/Telegram token、不呼叫 LLM、不派送 Telegram、不開 DB、不寫檔、不產報表、不更新 review_state、不掛 scheduler。
|
||
- V10.323 收斂市場情報 seed writer token hardening drift:正式端 service smoke 已確認 `seed_writer_cli_status` 不再回吐 `approval_token_hint`、不洩漏環境 token;輸出補 `api_reads_approval_token=false`、`api_executes_cli=false`、`api_writes_database=false`,讓 API/CLI 邊界可被 regression test 與 smoke 明確驗證。
|
||
- V10.322 修正 Telegram 決策/審核推播舊入口:`price_decision_notify()` 改用 `send_telegram_with_result()` 統一套用 HTML sanitizer 與多 chat 結果彙整,並補齊 `price_decision(report_url=...)` 相容;RAG awaiting review 推播改用正確 `chat_ids=[...]` 呼叫,避免 Stage 4 人工審核按鈕因參數名錯誤完全送不出去。
|
||
- V10.321 修正 Telegram HTML 發送格式:所有 `sendMessage` / `sendPhoto` caption 在 HTML parse mode 送出前會把 `<br>` / `<br/>` / `<BR />` 統一轉成換行,避免 Telegram Bot API 回 `Unsupported start tag "br"` 造成告警或報告送出失敗。
|
||
- V10.320 補市場情報 candidate queue review AI summary Telegram dispatch report input:新增 read-only report input builder、獨立 report route extension、UI 按鈕與 deployment readiness smoke target,在 archive summary 後整理 report input sections、report contract、message evidence 與 dispatch audit traceability;API/UI 不讀 approval/Telegram token、不呼叫 LLM、不派送 Telegram、不開 DB、不寫檔、不產報表、不更新 review_state、不掛 scheduler。
|
||
- V10.319 補市場情報 candidate queue review AI summary Telegram dispatch archive summary:新增 read-only archive summary builder、POST endpoint、UI 按鈕與 deployment readiness smoke target,在 Telegram dispatch archive 後整理 message identity、dispatch audit、artifact manifest 與後續 report input sections;API/UI 不讀 approval/Telegram token、不呼叫 LLM、不派送 Telegram、不開 DB、不寫檔、不更新 review_state、不掛 scheduler。
|
||
- V10.318 收緊 Elephant Alpha HITL 告警治理:`ea_escalation` 只有真正含 SKU/價格比較的 actions 才排成 TOP 待審 SKU 卡片;非 SKU 診斷改為「待確認事項」,並用測試鎖住價格類低信心但無 DB/Hermes 實證時只 suppress、不寫 human_review、不發 Telegram,避免空泛告警打擾人工審核。
|
||
- V10.317 修正 PChome 比價覆蓋率分子:`fetch_competitor_coverage()` 的 valid_matches 改成 `ACTIVE + 有 MOMO 最新價` 商品與有效 PChome `identity_v2` 價格的交集,不再把非活躍或無 MOMO 現價的舊 competitor_prices 列入覆蓋率,避免 daily/growth/PPT/AI 報表高估比價資料品質。
|
||
- V10.315 修正競品簡報/報表指定日期取價:`fetch_competitor_comparison_results()` 在有 start/end date 時改讀 `competitor_price_history` 的期間快照,MOMO 價格也取期間結束前最新價;沒有指定日期才使用目前有效 `competitor_prices`,避免把今天的 PChome 快取價塞回歷史 daily/growth/PPT 判讀。
|
||
- V10.314 擴大 PChome 候選池與搜尋韌性:PChome 搜尋 API 改為依 limit 掃多頁並對 429/5xx/timeout 做有限重試;feeder 預設每個商品最多 5 組搜尋詞、每詞 20 候選、2 頁,且搜尋清理不再刪掉括號/方括號內的品牌與規格,讓正確候選更有機會進 matcher,而不是長期停在「待對比」。
|
||
- V10.312 強化 PChome 商品身份比對防錯配:matcher 開始解析 mg/mcg 劑量、件組套組與多規格集合,60ml+150ml vs 60ml+20ml、10mg vs 20mg、10片 vs 10盒、精華 vs 化妝水都會進硬否決或單位價覆核,不再靠單一規格重疊放行;覆核診斷同步新增「劑量差異」標籤,降低核心比價錯配污染 daily/growth/PPT/AI 分析。
|
||
- V10.311 統一競品價差語意:`fetch_competitor_comparison_results()`、competitor PPT 與 OpenClaw competitor prompt 全部改用 `MOMO - PChome`,正值代表 MOMO 較貴 / PChome 低價壓力,負值代表 MOMO 價格優勢;避免 daily/growth 顯示價格壓力但 PPT/AI 反向解讀。
|
||
- V10.310 強化 MOMO/PChome 核心比價閉環:PChome feeder 搜尋候選只有強同款 `0.90` 才提前停止,避免第一個 0.76 次佳候選卡掉後續精準搜尋詞;人工否決的候選會被跳過並改挑下一個候選,不再讓已否決商品長期阻塞同 SKU。人工 `reject_identity`、`unit_price_required`、`needs_research` 會立即讓同候選正式 `competitor_prices` 過期,Dashboard 即使尚有舊價也不再顯示正式總價差;手機版比價覆核欄位標籤、覆核按鈕冒泡與候選證據顯示同步修正。
|
||
- V10.308 修正商品列表 PChome 比價閉環狀態:`manual_rejected`、`manual_unit_price_required`、`manual_needs_research` 不再掉回籠統「待比對」,改顯示「人工已否決 / 人工標記單位價 / 人工要求補搜尋」與後續 feeder 行為說明,避免人工覆核後 UI 看起來像沒有處理。
|
||
- V10.307 將 PChome 人工覆核成效接進 daily/growth/PPT 共用資料出口:`fetch_competitor_coverage()` 讀取 `competitor_match_reviews` 最新決策,輸出人工採用、人工否決、人工單位價與採用率;`daily_sales` 與 `growth_analysis` 的比價資料品質區塊直接顯示這些閉環指標,讓報表與簡報不只看待審數,也能看人工處理成效。
|
||
- V10.305 將 PChome 人工覆核回饋接回 feeder:下一輪搜尋若命中已被 `reject_identity` 否決的同一候選,會記錄 `manual_rejected` 並跳過正式寫入;已被標記 `unit_price_required` 的候選只保留單位價比較,不寫入正式總價差;人工 `accept_identity` 可保守覆蓋低分門檻但會打 `manual_review/manual_accept` 標籤,讓核心比價閉環可被後續報表與簡報追蹤。
|
||
- V10.304 補 PChome 比價人工覆核決策閉環:新增 `competitor_match_reviews`、`/api/pchome-review/<sku>/decision` 與商品看板覆核列「採用同款 / 否決候選 / 標記單位價」動作;只有人工採用同款才寫入 `competitor_prices` + `competitor_price_history`,否決與單位價標記只追加 manual attempt 並關閉本輪覆核,避免錯配污染核心價差。
|
||
- V10.302 補 PChome 比價覆核匯出與診斷原因:`filter=pchome_review` 每筆覆核把 matcher `reasons=` 翻成品牌不符、商品線不符、容量差異、組合差異、需單位價、價差極端等可行動標籤;新增 `/api/export/excel/pchome-review` 匯出完整覆核隊列、人工處置、候選 PChome、單位價比較與原始診斷,避免核心比價只停在籠統「待對比」。
|
||
- V10.301 補市場情報 candidate queue review AI summary Telegram dispatch gate:新增 `/api/market_intel/manual_sample_review/candidate_queue_review_ai_summary_persistence_telegram_dispatch_gate` 與 UI 按鈕,在 summary persistence closeout 後檢查 Telegram 訊息契約、channel label、artifact path、token 外洩風險與後續 run package promotion;API/UI 仍不讀 approval/Telegram token、不呼叫 LLM、不開 DB、不寫檔、不派送 Telegram、不掛 scheduler。
|
||
- V10.300 補商品看板比價覆核狀態分流:`filter=pchome_review` 新增全部、需單位價、身份否決、低信心、價格過期、找不到同款 segmented 篩選與分頁保留參數,讓 6,000+ 筆覆核隊列能依 matcher 診斷類型分批處理;同步修正覆核列表表頭/分頁連結狀態保留。
|
||
- V10.299 補市場情報 candidate queue review AI summary persistence run closeout:新增 `/api/market_intel/manual_sample_review/candidate_queue_review_ai_summary_persistence_run_closeout` 與 UI 按鈕,在 receipt 通過後收尾 metadata_json persistence gate,確認 closeout artifact、操作員確認與後續 Telegram dispatch 必須另開 gate;API/UI 仍不讀 approval token、不執行 CLI、不連 DB、不寫 `metadata_json`、不派送 Telegram、不掛 scheduler。
|
||
- V10.298 補市場情報 candidate queue review AI summary persistence run receipt:新增 `/api/market_intel/manual_sample_review/candidate_queue_review_ai_summary_persistence_run_receipt` 與 UI 按鈕,審核操作員貼回的 metadata_json CLI writer output、post-write smoke、dedupe key、summary payload hash、artifact path 與 token 外洩風險;API/UI 仍不讀 approval token、不執行 CLI、不連 DB、不寫 `metadata_json`、不派送 Telegram、不掛 scheduler。
|
||
- V10.297 將 PChome 單位價覆核隊列接回商品看板第一屏:KPI 顯示待處理/需單位價覆核數,焦點區列出候選 PChome 商品、候選價、match score 與人工動作;新增 `filter=pchome_review` 的比價覆核隊列,讓使用者可直接進入待處理 SKU,不再只在 daily/growth/PPT 摘要看到統計。
|
||
- V10.296 補核心 MOMO/PChome 比價第三層語意與覆核閉環:同核心商品但買送、套組、件數不同且只有單一基礎規格時標記 `unit_comparable`,只寫入 `competitor_match_attempts`;商品看板、daily/growth 報表、OpenClaw/PPT 摘要共用 `competitor_intel_repository` 的覆核隊列,顯示「需單位價比較」、候選商品、候選 PChome 價格與單位價換算證據;多容量/多品項套組仍保持不可比較,避免把不同販售組合直接寫進正式總價差。
|
||
- V10.289 重排 Elephant Alpha L3 HITL `ea_escalation` Telegram 告警:改成專業 incident brief 格式,分成決策狀態、背景摘要、風險摘要、TOP 待審 SKU 與建議處置;價格行動會拆出 MOMO/PChome 價格、價差、人工處置與 PChome ID,避免長 bullet 難讀。
|
||
- V10.284 關閉 Code Review Hermes LLM scan 預設路徑:Step 2 改 deterministic fast static scan,不再讓部署後先卡三段 Ollama timeout;若需要 LLM scan 可用 `CODE_REVIEW_HERMES_LLM_SCAN_ENABLED=true` 顯式開啟,仍只走本地矩陣、不走 Gemini。
|
||
- V10.283 將 Code Review Hermes scan 收斂為 fast compact prompt:預設 2 檔 × 900 字、輸出 384 tokens,仍走 GCP-A → GCP-B → 111 本地矩陣,避免部署後 code_review_hermes 先卡三段 timeout。
|
||
- V10.282 補齊 Code Review Hermes scan 本地模型矩陣:掃描階段也走 GCP-A `qwen2.5-coder:7b` → GCP-B `gemma3:4b` → 111 `hermes3:latest`,避免 `hermes3` 在三主機各卡 35s 後只留下 error;Hermes scan 不會啟用 Gemini。
|
||
- V10.281 強化 Code Review OpenClaw 本地備援矩陣:主機順序仍為 GCP-A → GCP-B → 111,但改成 GCP-A `qwen2.5-coder:7b`、GCP-B `gemma3:4b`、111 `hermes3:latest`,三段本地 Ollama 全失敗後才允許 Claude/Gemini 備援。
|
||
- V10.279 收斂 Code Review Ollama-first 路徑:OpenClaw assessment 預設改 `qwen2.5-coder:7b` + 45s/host timeout,Hermes scan 改 compact snippet + 35s/host timeout,避免三主機各卡 120s 後被迫觸發 Gemini 備援。
|
||
- V10.278 補 PChome 競價摘要 30 分鐘共享快取與 feeder/backfill 主動清除,並新增市場情報 `candidate_queue_review_ai_summary_preflight` 預覽 gate;API 只檢查未來摘要輸入與 Ollama-first/Gemini-backup-only policy,不呼叫 LLM、不派 Telegram、不寫 DB、不掛 scheduler。
|
||
- V10.276 修正 ElephantAlpha 價格類 Hermes prefetch timeout:`price_drop` / `market_opportunity` trigger 直接把 SQL 命中的 MOMO / PChome 價差實證轉成 HITL action lines,完整 Hermes LLM prefetch 預設關閉;無 DB 實證仍只記 suppressed telemetry / cooldown,不寫 `human_review`、不發空 Telegram。
|
||
- V10.266 強化核心 MOMO/PChome 比價鏈路:新增 `marketplace_product_matcher.py` 身份比對、只讓 `identity_v2` 且分數 ≥ 0.76 的高信心配對進 Dashboard/AI/Excel/Daily/Growth/PPT,並建立 `competitor_intel_repository.py` 統一圖表與簡報資料出口;同品牌但不同型號、不同組數、套組/單品或多品項不一致會進待審,不進正式比價。
|
||
- V10.267 專業化 ElephantAlpha `resource_optimization` 告警:不再讓 LLM 生成「48 小時預期效益 / 已執行」敘事,改由程式量測 action queue、P1/P2、pending_review、逾時項目與 CPU load;單純 backlog 不發 Telegram,只有可行動資源壓力才寫 `ai_insights(resource_pressure)` 並發送量測型告警。
|
||
- V10.254 續補 `/growth_analysis` 快取命中效能:PostgreSQL source fingerprint 加 60 秒短 TTL,匯入 realtime_sales_monthly 後同步清除 growth shared cache 與短快取,避免快取命中仍頻繁掃大表 COUNT。
|
||
- V10.253 修正 Elephant Alpha L3 HITL 空告警:價格類與資源調配低信心事件若沒有 Hermes/實證資料,只記 suppressed telemetry 與 cooldown,不寫 pending human_review、不發 Telegram;`resource_optimization` 會保留 queue/load 原始指標供追查。
|
||
- V10.251 修正 OpenClaw Q&A 備援遙測:Ollama 主路徑仍為 GCP-A → GCP-B → 111,Gemini 只記為 `openclaw_qa_gemini_fallback`,NIM 只記為 `openclaw_qa_nim`;AI Calls 會把 legacy `openclaw_qa + gemini` 標成 Gemini 備援,避免再次誤判 Gemini-first。
|
||
- V10.251 穩定 `/growth_analysis` 正式站速度:成長分析快取從單 worker memory 擴充為 `data/growth_analysis_cache.pkl` 跨 worker 共享快取,避免 Gunicorn 冷 worker 偶發掃明細表造成 5 秒級 TTFB;補 `tests/test_cache_manager.py` 覆蓋 shared file roundtrip 與清除行為。
|
||
- V10.249 收斂 `/observability/ppt_audit_history` 手機與平板第一屏密度:將 4 個產線訊號從 hero 內移出成獨立狀態列,手機版維持 2 欄狀態卡並降低 hero 卡片間距;本機 10 個 AI 觀測台頁面 rendered visual contract 全數通過,PPT 頁 hero 高度 desktop/tablet/mobile 為 214/361/398px。
|
||
- V10.246 強化 `/observability/ppt_audit_history` 視覺 QA runtime 可讀性:功能開關、轉檔器與視覺模型改成中文 checklist,Vision QA 狀態卡直接顯示 runtime 就緒資訊,DB 產出狀態統一為「已產出」。
|
||
- V10.245 重整 `/observability/ppt_audit_history` 首屏資訊階層:改成簡報操作摘要、最新可預覽簡報、下一步動作與自適應報表類型 segmented grid;產線覆蓋矩陣改為下方驗收明細,避免一進頁只看到大量「產線狀態」或類型按鈕右側溢出。
|
||
- V10.242 修正 `/metabase`、`/grist` 外部工具入口:全域導覽固定回 momo-pro 內部橋接頁,避免資料協作錯連其他專案站;入口頁補路由狀態、設定診斷與可用替代分析入口,降低空白頁誤判。
|
||
- V10.221 補 `/observability/ppt_audit_history` AiderHeal 背景任務可見性:正在修復中的簡報會顯示於產線頁,並提供 JSON 狀態端點讓派工後即時刷新,避免重新整理後不知道是否已在修。
|
||
- V10.218 補 `/observability/ppt_audit_history` AiderHeal 去重鎖:同一份簡報已在背景修復時,再次點擊會回「已在執行中」,避免重複開 SSH / 模型 / git 修復流程。
|
||
- V10.217 讓 `/observability/ppt_audit_history` 的 AiderHeal 派工改為非阻塞背景任務:頁面立即回「已排入」,修復工作在背景執行,避免瀏覽器與 Gunicorn worker 等 SSH、模型與 git push 到超時。
|
||
- V10.216 修正 `/observability/ppt_audit_history` 的 AiderHeal 派工斷點:失敗簡報即使只有 `issues_found` 診斷摘要也能一鍵送修,並修正 `execute_code_fix` 參數與 dict 回傳解析,避免按鈕 400/500。
|
||
- V10.215 強化 `/observability/ppt_audit_history` 視覺問題追蹤:將 `issues_found` 拆成投影片、問題類型、問題文字與回放入口,新增「視覺問題追蹤」面板,讓問題簡報能直接定位與預覽。
|
||
- V10.213 補 `/observability/ppt_audit_history` 視覺 QA 診斷摘要:審核歷史與 Action Queue 直接顯示 `ppt_audit_results.issues_found` 的投影片問題,讓「有問題」可追查,不再只剩問題數或空白錯誤欄。
|
||
- V10.212 修正 PPT 視覺 QA 的 Ollama 三主機 fallback:當 Primary/Secondary request timeout 超過 unhealthy TTL 時,第三輪仍強制打 111 final fallback;PPT 截圖送模型前轉輕量 JPEG、縮小輸出 token,降低單檔審核耗時。
|
||
- V10.211 補 `/observability/ppt_audit_history` 全類型視覺 QA:審核歷史不再限 daily,頁面新增「立即視覺 QA」非阻塞補跑,結果寫入 `ppt_audit_results`;模型失敗時也保留 slide error,避免產線狀態只剩空白。
|
||
- V10.210 補 `/observability/ppt_audit_history` 審核歷史同頁回放:每筆 daily 視覺審核紀錄的動作欄新增「回放」按鈕,沿用 PDF 預覽抽屜並保留下載/開新頁,讓問題追查不必再回檔案表找簡報。
|
||
- V10.208 修正 `/observability/ppt_audit_history` 同頁預覽抽屜 selector:Modal 標題改用獨立 `data-ppt-preview-modal-title`,避免與多個預覽連結的資料屬性衝突。
|
||
- V10.207 強化 `/observability/ppt_audit_history` 同頁線上預覽:所有可預覽簡報按鈕改為開啟頁內 PDF 預覽抽屜,保留開新頁與下載,降低產線頁來回跳轉成本並改善手機操作。
|
||
- V10.205 補 `/observability/ppt_audit_history` 本頁批次 PDF 預熱:Preview Workbench 可一鍵預熱頁面上尚未快取的 PPTX,沿用單檔 JSON 端點逐一建立 PDF 快取並即時更新狀態。
|
||
- V10.203 補 `/observability/ppt_audit_history` 單檔 PDF 預熱操作:未快取的可預覽 PPTX 會顯示「預熱 PDF」,透過 JSON 端點建立 PDF 快取並即時更新頁面狀態。
|
||
- V10.201 強化 `/observability/ppt_audit_history` 線上預覽可診斷性:產線清單不觸發轉檔即可顯示 PDF 預覽快取狀態,Pipeline Health、Preview Workbench 與已產檔案表同步標記「PDF 快取 / 首次轉檔」。
|
||
- V10.199 讓 `/observability/ppt_audit_history` Action Queue 可直接處理異常:待補齊與異常優先項目新增單一報表「重跑」按鈕,透過既有非阻塞背景產線排入指定 report_type。
|
||
- V10.197 強化 `/observability/ppt_audit_history` Action Queue:新增「異常優先」lane,將產出失敗、PPTX 檔案異常、視覺 QA 失敗拉到最前面,並顯示錯誤訊息與可預覽入口。
|
||
- V10.196 補 `/observability/ppt_audit_history` Action Queue:把待補齊、可預覽、視覺 QA、DB 寫入集中成工作隊列,讓使用者不用在多張卡與表格間找下一個處理點。
|
||
- V10.194 重整 `/observability/ppt_audit_history` 產線資訊階層:新增 Pipeline Health、五段式流程階段、排程/覆蓋/DB/預覽/視覺 QA 狀態摘要,讓「已產生」改為可判斷的目標產生、其他版本、待排程補齊等狀態。
|
||
- V10.192 補 `/observability/ppt_audit_history` 最近可預覽簡報 workbench:最新 4 份 PPT 直接在控制台下方提供線上預覽與下載,降低使用者找檔案的操作成本;完整檔案清單仍保留在下方表格。
|
||
- V10.190 補 `/observability/ppt_audit_file/<filename>` 站內線上預覽:PPTX 由 LibreOffice 轉 PDF 快取後以 iframe 預覽,保留原始 PPTX 下載;Dockerfile 加 `libreoffice-impress`,compose 預設啟用 `PPT_VISION_ENABLED=true`,PPT 產線頁新增視覺 QA 停用原因與更精簡的控制台式排版。
|
||
- V10.188 補強 `/observability/ppt_audit_history` PPT 視覺 QA 產線:頁面明確呈現每日、每週、每月、每季、每半年、每年定期產出節奏,並顯示 `ppt_generation_runs` DB 寫入紀錄;保留自動補齊缺漏與資料庫/檔案覆蓋狀態。
|
||
- V10.187 修正 `/daily_sales`、`/growth_analysis` 圖表空白:Chart JSON 改從 `<template>.content.textContent` 讀取,補空資料診斷狀態;成長分析改用 realtime 明細新鮮度覆蓋過期月結摘要,並為 growth cache 加入資料指紋。
|
||
- V10.151 接續前端 V3 全站 UI/UX:廠商缺貨 `/vendor-stockout/vendor-management`、`/vendor-stockout/send-email`、`/vendor-stockout/history` 改走新版 `ewoooc_base.html` shell 與 `page-vendor-tools.css`,移除舊紫藍 navbar/live route。
|
||
- V10.151 補 `/abc_analysis/detail` 新版 ABC 詳情頁與安全 loading state,移除 raw HTML fallback,資料表維持正式快取資料來源與匯出連結。
|
||
- V10.151 補 `/login` 新版登入頁:暖紙背景、點陣視覺、EwoooC 品牌、手機版 390px 無水平 overflow。
|
||
- V10.151 本機全站 responsive overflow guard 通過 147/147;`?ui=legacy` 入口已不再回到舊 `dashboard.html` / `edm_dashboard.html` / vendor legacy templates。
|
||
- 新版設計系統資產已落到正式 Flask static path:`web/static/css/ewoooc-tokens.css`、`web/static/css/ewoooc-shell.css`、`web/static/css/ewoooc-dotmatrix.css`、`web/static/css/page-*.css` 與對應 `web/static/js/page-*.js`。
|
||
- V3 page-level 資產已補做設計規範清理:移除 UI 表面殘留 radial-gradient / pure-white rgba / `bg-white` header,AI 推薦頁 keyword 狀態改用語意 class。
|
||
- `ewoooc_base.html` 補 `extra_head` / `content` / `extra_scripts` 相容 block,支援新版包混用 block 命名,避免頁面空白或互動 JS 不輸出。
|
||
- Base CSS 載入順序已補齊 `ewoooc-tokens-v2-alias.css`,符合 V3 spec 的 tokens → alias → shell → dotmatrix 順序。
|
||
- `_ewoooc_shell.html` 更新為 V3 側欄結構,保留正式路由連結與 AI 觀測台完整導覽 label。
|
||
- 高風險替換已退回:`dashboard_v2.html` 與 `templates/admin/*` 觀測台頁保留現行真實功能版,拒絕使用會移除 PChome / AI 挑品 / 歷史價格 / 觀測台真實資料的 prototype 空殼。
|
||
- AI 觀測台 CSS canonical 與 Flask mirror 已通過同步檢查:`./scripts/quick_review.sh --check-observability-css`。
|
||
- AI 觀測台 UI guard 已更新為 V3 token 化規範,不再要求舊版 sidebar 漸層片段,並通過 `./scripts/quick_review.sh --observability-ui`。
|
||
- 新增 ADR-036:FastAPI 可作為 strangler migration 中期方向,但不得作為前端 V3 前置條件;後端重構先抽 service 與補 contract,不做 Flask→FastAPI 大爆炸。
|
||
- `/sales_analysis` 修正 V3 首次進頁 JSON context 合約:`category_data` 與模板 fallback 補齊,避免 Jinja `Undefined` 進入 `tojson` 造成 error handler。
|
||
- 本機瀏覽器 QA 完成:`/sales_analysis`、`/daily_sales`、`/monthly_summary_analysis`、`/ai_recommend`、`/auto_import`、`/vendor-stockout/*` 均載入 V3 shell、無錯誤 banner、console error 0。
|
||
- 正式環境已推版:白名單同步 55 個 V3 runtime 檔案與 `config.py` 版本號,僅 recreate `momo-app`,未碰 `momo-db`、未使用 `--remove-orphans`;`https://mo.wooo.work/health` 回報 V10.91,V3 頁面 smoke 與觀測台 production QA 均通過。
|
||
- 版本同步至 V10.91。
|
||
- 依使用者截圖回饋修正 `/daily_sales`:KPI 改為首屏摘要格、日曆密度提升、桌機 1440 與手機 390 均無整頁水平 overflow。
|
||
- 依使用者截圖回饋修正 `/edm`:寬螢幕內容最大寬度調整至 1600px、活動表格限制在局部 scroll container、手機版無整頁水平 overflow。
|
||
- 新增 `scripts/check_v3_responsive_ui.js`,覆蓋 23 個主要 route 的 desktop/mobile responsive smoke;本機通過 46/46。
|
||
- 移除 V3 主要頁面 CSS 內殘留負字距,符合新版排版規範。
|
||
- 版本同步至 V10.92。
|
||
- 正式環境 V10.92 已白名單部署:備份 `/tmp/codex_v3_1092_predeploy_20260512_164549.tgz`,只 recreate `momo-app`,未碰 `momo-db`、未使用 `--remove-orphans`。
|
||
- 正式驗證通過:`https://mo.wooo.work/health` 回報 V10.92,觀測台 production QA PASS,23 個主要 route 的 desktop/mobile responsive smoke 46/46 PASS。
|
||
- 人工視覺 QA 追修 `/growth_analysis` 手機 KPI 可讀性:KPI 卡片改為暖墨文字、左側 accent、明確數字層級,避免淡底反白造成首屏不可讀。
|
||
- 版本同步至 V10.93。
|
||
|
||
【下次待辦】
|
||
- V10.93 白名單部署後補正式 health 與 responsive smoke 結果。
|
||
- 為 FastAPI strangler 補 endpoint inventory:先列 route owner、資料來源、auth/CSRF/session 需求與 smoke URL,再決定第一批可遷移 API。
|
||
- `production_v3 3/templates/dashboard.html` 與 `production_v3 3/templates/observability/*` 不得直接覆蓋正式頁;需先補回真實資料功能後才可進入替換候選。
|
||
|
||
================================================================================
|
||
跨平台市場情報模組 (ADR-035 / 2026-05-06) [IN PROGRESS]
|
||
================================================================================
|
||
|
||
【已完成】
|
||
- ADR-035:定義跨平台市場活動情報系統、feature flags、market_* schema、爬蟲安全邊界與分階段 rollout。
|
||
- 模組化盤點:更新 `docs/memory/code_modularization_inventory_20260430.md`,標記市場情報不可塞回 `app.py`、`scheduler.py`、`routes/sales_routes.py` 等大檔。
|
||
- Phase 1 安全骨架:新增 `routes/market_intel_routes.py`、`services/market_intel/`、`templates/market_intel/disabled.html`,預設只顯示 disabled 狀態。
|
||
- Phase 2 schema 骨架:新增 `database/market_intel_models.py`,定義 `market_platforms`、`market_campaigns`、`market_campaign_snapshots`、`market_campaign_products`、`market_product_price_history`、`market_product_matches`、`market_crawler_runs`。
|
||
- Metadata 守門:`database/manager.py` 顯式 import market_intel models,`app.py` expected metadata tables 已同步。
|
||
- 安全開關:`.env.example` 補 `MARKET_INTEL_ENABLED=false`、`MARKET_INTEL_CRAWLER_ENABLED=false`、`MARKET_INTEL_WRITE_ENABLED=false`。
|
||
- Phase 3 read-only adapter 骨架:新增 `services/market_intel/adapters/`,目前註冊 MOMO 與 PChome,僅回傳 discovery plan,不發 HTTP request、不寫 DB、不掛 scheduler。
|
||
- Phase 4 手動 dry-run discovery:新增 `services/market_intel/discovery_runner.py` 與 `/api/market_intel/manual_discovery`。預設 `fetch=false` 只回 planned;`fetch=true` 也必須在 `MARKET_INTEL_ENABLED` 與 `MARKET_INTEL_CRAWLER_ENABLED` 同時開啟時才允許 HTTP,且仍不寫 DB、不掛 scheduler。
|
||
- Phase 5 parser 診斷層:新增 `services/market_intel/html_diagnostics.py`,手動 fetch 成功後只萃取 title、page_hash、link count、campaign link candidates,不建立正式 campaign/product。
|
||
- Phase 6 平台別 scorer:MOMO/PChome adapter 提供 URL/text 加權規則,diagnostics 同時輸出 generic_score 與 platform_score,仍只用於候選排序與人工診斷。
|
||
- Phase 7 confidence bands:diagnostics 將候選標成 `high` / `medium` / `low`,並輸出 `confidence_reason`;只作人工審核提示,不自動建立活動。
|
||
- Phase 8 candidate preview API:新增 `/api/market_intel/candidate_preview`,把本次 discovery diagnostics 候選合併排序,支援 `min_band` 與 `limit`,只供人工預覽,不入庫。
|
||
- Phase 9 UI preview panel:`templates/market_intel/disabled.html` 讀取 `/api/market_intel/candidate_preview?fetch=false`,顯示安全空狀態與 flags,不做自動外部 fetch。
|
||
- Phase 10 platform seed plan:新增 `/api/market_intel/platform_seed_plan`,只產生 adapter registry 對應的 `market_platforms` seed rows 與 gate 狀態,不寫 DB。
|
||
- Phase 11 Coupang read-only adapter:新增 Coupang 酷澎 adapter,以官方台灣站與火箭跨境入口作為公開 discovery 起點,預設不發 request、不寫 DB、不掛 scheduler。
|
||
- Phase 12 Shopee read-only adapter:新增 Shopee 蝦皮 adapter,以公開首頁與 Shopee Mall 入口作為 discovery 起點;不得登入、碰會員券、購物車、帳號池或反爬繞過。
|
||
- Phase 13 platform seed write guard:新增 `/api/market_intel/platform_seed_write_guard`,只回報寫入前 gate 與阻擋原因,預設永遠不寫 DB。
|
||
- Phase 14 platform seed writer dry-run:新增 `/api/market_intel/schema_smoke` 與 `/api/market_intel/platform_seed_writer_plan`,實際檢查 ORM metadata 並產生 parameterized upsert preview,不建立 session、不 commit。
|
||
- Phase 15 writer preview panel:`templates/market_intel/disabled.html` 讀取 `/api/market_intel/platform_seed_writer_plan`,顯示 schema smoke、upsert preview 與 blocked reasons,仍不寫 DB。
|
||
- Phase 16 deployment readiness panel:新增 `/api/market_intel/deployment_readiness` 與 UI「推版準備檢查」,明確回報尚未正式推版、尚未 commit/push、部署 SOP 與 production smoke 尚待人工執行。
|
||
- Phase 17 deployment handoff checklist:`/api/market_intel/deployment_readiness` 補人工步驟、備援方案、安全部署邊界、production smoke targets 與 `python backup_system.py` 備份要求;UI 直接顯示,不執行任何 git/部署/DB 操作;版本同步至 V10.87。
|
||
- Phase 18 write approval runbook:新增 `/api/market_intel/write_approval_runbook` 與 UI「正式寫入批准檢查」,列出 schema smoke、備份、migration review、feature flag、人工批准、rollback 等 gate;預設 `ready_for_real_write=false`、`database_session_created=false`、`database_commit_executed=false`;版本同步至 V10.88。
|
||
- Phase 19 migration blueprint:新增 `/api/market_intel/migration_blueprint` 與 UI「Schema migration 草案」,產生 `migrations/032_market_intel_core_schema.sql` 建議內容、migration apply command shape 與 seed writer command design;預設 `file_created=false`、`migration_executed=false`、`database_commit_executed=false`,且 forward SQL 只允許 additive DDL;版本同步至 V10.89。
|
||
- Phase 20 migration file draft:新增本地草稿檔 `migrations/032_market_intel_core_schema.sql`,blueprint API 會檢查檔案存在且內容與 blueprint 相符;仍然 `migration_executed=false`、`database_session_created=false`、`database_commit_executed=false`;版本同步至 V10.90。
|
||
- Phase 21 seed writer CLI skeleton:新增 `scripts/market_intel_seed_writer.py`、`services/market_intel/seed_writer_cli.py` 與 `/api/market_intel/seed_writer_cli_status`;CLI 可輸出 seed writer blocked plan,但即使帶 `--execute` 與 approval token 也會拒絕真寫入,維持 `database_session_created=false`、`database_commit_executed=false`;版本同步至 V10.94。
|
||
- Phase 22 app-only release gate:`/api/market_intel/deployment_readiness` 改為區分「安全檢查已可進 app-only 推版」與「API 不執行部署動作」;新增 `mode=app_only_release_gate`、`execution_boundary`,維持 `api_runs_migration=false`、`api_writes_database=false`、`production_deployed=false`;版本同步至 V10.95。
|
||
- 正式環境 V10.95 已白名單部署:備份 `/tmp/codex_market_intel_v1095_predeploy_20260512_194041.tgz` 與 compose 備份 `/tmp/docker-compose.market-intel-v1095-mount-20260512_194827.yml`,同步 market_intel runtime 檔案並補 app-only `scripts/`、`migrations/` mount 後僅 recreate `momo-app`,未碰 `momo-db`、未使用 `--remove-orphans`;`https://mo.wooo.work/health` 回報 V10.95,market_intel schema/writer/readiness/migration/seed execute-block smoke 通過。
|
||
- Phase 23 seed transaction preview:`/api/market_intel/seed_writer_cli_status` 內新增 `transaction_preview`,輸出 `market_platforms` idempotent upsert SQL template、parameter hash、diff 狀態與 runtime order;UI 新增「Seed CLI 交易預覽」panel;仍維持 `database_session_created=false`、`transaction_opened=false`、`database_commit_executed=false`;版本同步至 V10.96。
|
||
- 正式環境 V10.96 已白名單部署:備份 `/tmp/codex_market_intel_v1096_predeploy_20260512_211619.tgz`,僅同步 market_intel runtime/docs/test 檔案並 recreate `momo-app`,未碰 `momo-db`、未使用 `--remove-orphans`;`https://mo.wooo.work/health` 回報 V10.96,`seed_writer_cli_status` dry-run/execute-block、deployment readiness 與正式頁 UI smoke 均通過。
|
||
- Phase 24 read-only DB schema probe:新增 `/api/market_intel/schema_db_probe` 與 UI「正式 DB Schema 探針」panel;預設 `execute=false` 只回 planned、不連 DB,人工 smoke 才可用 `execute=true` 查正式 DB catalog;不使用 `DatabaseManager()`、不呼叫 `create_all()`、不建立 ORM session、不寫入、不 commit;版本同步至 V10.97。
|
||
- 正式環境 V10.97 已白名單部署:備份 `/tmp/codex_market_intel_v1097_predeploy_20260512_214226.tgz`,僅同步 market_intel runtime/docs/test 檔案並 recreate `momo-app`,未碰 `momo-db`、未使用 `--remove-orphans`;`https://mo.wooo.work/health` 回報 V10.97,`schema_db_probe` planned/read-only execute、seed execute-block、deployment readiness 與正式頁 UI smoke 均通過。
|
||
- Phase 25 platform seed DB diff probe:新增 `/api/market_intel/platform_seed_db_diff` 與 UI「平台 Seed DB 差異探針」panel;預設 `execute=false` 只回 planned、不連 DB,人工 smoke 才可用明確只讀參數比對 adapter seed 與 `market_platforms` 既有 rows;不使用 `DatabaseManager()`、不建立 ORM session、不寫入、不 commit;版本同步至 V10.98。
|
||
- 正式環境 V10.98 已白名單部署:備份 `/tmp/codex_market_intel_v1098_predeploy_20260512_220309.tgz`,僅同步 market_intel runtime/docs/test 檔案並 recreate `momo-app`,未碰 `momo-db`、未使用 `--remove-orphans`;`https://mo.wooo.work/health` 回報 V10.98,`platform_seed_db_diff` planned/read-only execute、seed execute-block、deployment readiness 與正式頁 UI smoke 均通過;正式 DB 只讀 diff 顯示 `market_platforms` 目前 0 筆,四平台 seed 仍 missing,符合未正式寫入狀態。
|
||
- Phase 26 platform seed CLI writer:`scripts/market_intel_seed_writer.py` 支援 CLI-only 受控寫入,必須同時帶 `--execute`、`--apply-real-write` 與確認 token 才會以 SQLAlchemy Core 短 transaction upsert `market_platforms`;API 仍不執行寫入,不建立 ORM session、不連外、不掛 scheduler;V10.101 補強 insert 顯式寫入 `created_at` / `updated_at`,避免正式 schema 無 default 時觸發 not-null rollback。
|
||
- 正式環境 V10.101 已白名單部署:備份 `/tmp/codex_market_intel_v10100_predeploy_20260513_103809.tgz`、`/tmp/codex_market_intel_v10101_predeploy_20260513_104053.tgz` 與 seed 前快照 `/tmp/codex_market_platforms_v10100_before_20260513_103809.json`;僅 recreate `momo-app`,未碰 `momo-db`、未使用 `--remove-orphans`。CLI seed 首次因 timestamp not-null rollback,V10.101 修正後成功 insert `momo/pchome/coupang/shopee` 四筆 seed;read-only diff 顯示 existing=4、missing=0、matching=4,正式頁 console error 0。
|
||
- 2026-05-13 Codex 只讀複核:`https://mo.wooo.work/health` 回報 V10.111;`/api/market_intel/status` 仍為 `enabled=false`、`crawler_enabled=false`、`write_enabled=false`、`dry_run_only=true`、phase 26;`/api/market_intel/platform_seed_db_diff?execute=true&platform=all` 只讀確認 `market_platforms` 已有 `momo/pchome/coupang/shopee` 四筆,`existing_seed_count=4`、`missing_codes=[]`、`database_write_executed=false`。
|
||
- V10.323 已補正式端 seed writer token-hardening smoke:`seed_writer_cli_status` 不回吐 `approval_token_hint`、不洩漏環境 token,且明確標示 API 不讀 approval token、不執行 CLI、不寫 DB。
|
||
- Phase 27 legacy source bridge preview:新增 `services/market_intel/legacy_source_bridge.py` 與 `/api/market_intel/legacy_source_bridge`,只讀盤點既有 `promo_products`、`competitor_prices`、`competitor_price_history`,產生導入 `market_*` 的 mapping / dedupe / blocked operation preview;預設 `execute=false` 不連 DB,`execute=true` 也只做 read-only query,不寫 DB、不建立 ORM session、不連外、不掛 scheduler;UI 新增「既有資料橋接預覽」panel;版本同步至 V10.182。
|
||
- Phase 45 migration live smoke preview:新增 `/api/market_intel/migration_live_smoke` 與 UI「正式 DB 只讀 smoke」panel;預設 `execute=false` 只回 planned,人工 smoke 才可用 `execute=true` 整理 catalog / seed diff 結果,不執行 migration、不寫 DB、不跑 rollback、不掛 scheduler;版本同步至 V10.207。
|
||
- Phase 46 live DB inventory preview:新增 `/api/market_intel/live_db_inventory` 與 UI「正式 DB 庫存總覽」panel;預設 `execute=false` 不連 DB,人工 smoke 才可用 `execute=true` 對 `market_*` tables 做只讀 count / group by,建立平台、活動、商品、比對、告警與 crawler run 基準;版本同步至 V10.209。
|
||
- Phase 47 manual sample fetch plan:新增 `/api/market_intel/manual_sample_plan` 與 UI「人工樣本 Fetch 計畫」panel;預設只輸出平台順序、每平台 1 個公開入口、MCP gate、操作員步驟與備援,不抓外站、不寫 DB、不建立 crawler run、不掛 scheduler;版本同步至 V10.214。
|
||
- Phase 48 manual sample acceptance contract:新增 `/api/market_intel/manual_sample_acceptance` 與 UI「樣本結果驗收契約」panel;定義 sample result 必要欄位、diagnostics 欄位、驗收門檻、拒收條件、人工決策與升級順序,不載入 sample result、不抓外站、不允許候選導入、不寫 DB;版本同步至 V10.215。
|
||
- Phase 49 manual sample result review:新增 `services/market_intel/manual_sample_review.py`、`/api/market_intel/manual_sample_review` 與 UI「樣本結果審核預覽」panel;以純函式評估人工 sample result 是否可進候選預覽,預設不載入結果、不抓外站、不存檔、不寫 DB、不允許候選導入、不掛 scheduler;版本同步至 V10.216。
|
||
- Phase 50 manual sample review evaluate:新增 `/api/market_intel/manual_sample_review/evaluate` POST 與 UI JSON 審核入口,允許操作員貼入單筆 sample result 即時回傳 PASS/BLOCK;不保存 payload、不回吐完整 HTML、不寫 DB、不建立候選活動、不允許候選導入、不掛 scheduler;版本同步至 V10.219。
|
||
- V10.220 補 Phase 50 UI POST CSRF header:`manual_sample_review/evaluate` 保持 CSRF 保護,頁面 fetch 送出 `X-CSRFToken`,不豁免安全檢查。
|
||
- Phase 51 manual sample candidate handoff:新增 `/api/market_intel/manual_sample_review/candidate_handoff` POST 與 UI handoff 按鈕,將已通過審核的 sample result 轉成只讀候選活動 preview payload;不保存 handoff、不建立 review queue、不寫 market_*、不允許候選導入、不掛 scheduler;版本同步至 V10.222。
|
||
- Phase 52 manual sample candidate queue draft:新增 `services/market_intel/manual_sample_candidate_queue.py`、`/api/market_intel/manual_sample_review/candidate_queue_draft` POST 與 UI queue 草案按鈕,將 handoff 候選轉成只讀人工審核 queue draft;不建立正式 queue、不保存草案、不寫 market_*、不自動核准候選、不掛 scheduler;版本同步至 V10.223。
|
||
- V10.224 補 PPT 報表覆蓋矩陣:`/observability/ppt_audit_history` 將每個定義簡報同列串起 DB 寫入、線上預覽、視覺 QA 與交付狀態,並提供預覽、預熱、重跑操作,避免只顯示「目標已產生」。
|
||
- Phase 53 manual sample candidate queue approval:新增 `/api/market_intel/manual_sample_review/candidate_queue_approval` POST 與 UI 送審 gate 按鈕,將 queue draft row preview 對齊既有 `market_alert_review_queue` 契約,檢查必填欄位、寫入 flags、備份與人工批准 gate;不建立 approval record、不寫 review queue、不開 DB transaction、不掛 scheduler;版本同步至 V10.225。
|
||
- V10.226 補 PPT 視覺 QA runtime checklist:`/observability/ppt_audit_history` 在視覺模型未就緒時顯示 Feature Flag、LibreOffice、Vision Model 三段檢查與下一步操作,避免只看到「停用」而不知道卡在哪。
|
||
- Phase 54 manual sample candidate queue transaction:新增 `/api/market_intel/manual_sample_review/candidate_queue_transaction` POST 與 UI transaction preview 按鈕,將 queue row preview 轉成 `market_alert_review_queue` idempotent insert statement、payload hash 與 rollback plan;不開 DB connection、不開 transaction、不 commit、不建立 approval record;版本同步至 V10.227。
|
||
- V10.228 補 PPT 視覺 QA 背景狀態卡:新增 `/observability/ppt_audit/vision_status` 與頁面 Vision QA 狀態卡,讓立即視覺 QA 排入後可看 queued/running/completed/error 與最近審核摘要,不必刷新猜測。
|
||
- V10.229 修正 PPT 視覺 QA 多 worker 狀態漂移:將 queued/running/completed/error 寫入 `/app/data/ppt_vision_audit_status.json` runtime state,所有 Gunicorn worker 共用同一份狀態並阻擋重複排入。
|
||
- Phase 55 candidate queue writer CLI gate:新增 `/api/market_intel/manual_sample_review/candidate_queue_writer_status` POST、`scripts/market_intel_candidate_queue_writer.py` 與 UI writer gate 按鈕,定義 `MARKET_INTEL_QUEUE_WRITE_APPROVAL` 一次性 token、execute/apply flags、備份、migration smoke 與 rollback gate;本階段仍不開 DB connection、不寫 `market_alert_review_queue`、不 commit、不掛 scheduler;版本同步至 V10.230。
|
||
- Phase 56 candidate queue writer preflight:新增 `/api/market_intel/manual_sample_review/candidate_queue_writer_preflight` POST 與 `services/market_intel/candidate_queue_writer_preflight.py`,檢查 transaction payload key 到 `market_alert_review_queue` 欄位映射、缺欄與 dedupe unique index;頁面預設 execute=false 不連 DB,CLI 可明確 `--read-only-preflight` 只讀 catalog;版本同步至 V10.232。
|
||
- Phase 57 candidate queue writer CLI transaction:`scripts/market_intel_candidate_queue_writer.py` 在 CLI-only 情境支援受控 transaction,必須同時通過 transaction payload、read-only preflight、`--execute`、`--apply-real-write`、一次性 token、備份確認與 migration live smoke 才會以 SQLAlchemy Core idempotent insert `market_alert_review_queue`;API/UI 仍不傳 token、不連 DB、不寫 queue、不掛 scheduler;版本同步至 V10.234。
|
||
- V10.235 補 PPT 視覺 QA stale recovery:背景狀態寫入 worker PID;若部署 reload 後舊 PID 已不存在,`/observability/ppt_audit/vision_status` 會自動把 running 轉為可診斷 error 並允許重新排入,避免人工清 runtime state。
|
||
- Phase 58 candidate queue writer post-write smoke:新增 `services/market_intel/candidate_queue_writer_postwrite_smoke.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_writer_postwrite_smoke` 與 UI smoke 按鈕,依 transaction preview 的 dedupe key 只讀查詢 `market_alert_review_queue`,讓 CLI 真寫入後可驗證 row 是否存在;頁面預設 execute=false 不連 DB、不寫 queue、不 commit、不掛 scheduler;版本同步至 V10.236。
|
||
- Phase 59 candidate queue writer operator drill:新增 `services/market_intel/candidate_queue_writer_operator_drill.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_writer_operator_drill` 與 UI drill 按鈕,組裝 reviewed sample、備份、read-only preflight、CLI writer、post-write smoke 的操作員順序;API/UI 不讀 approval token、不執行 CLI、不連 DB、不寫 queue、不 commit、不掛 scheduler;版本同步至 V10.237。
|
||
- V10.238 補業績圖表 runtime QA 與分析 tabs 窄版修正:新增 `quick_review --sales-charts` 檢查 `/daily_sales`、`/growth_analysis` 的 Chart.js ready、可繪製資料集與 canvas 非空白;同時把分析報表 tabs 手機版改為自適應 grid,避免 Metabase/Grist 外部連結超出右側。
|
||
- Phase 60 candidate queue writer run package:新增 `services/market_intel/candidate_queue_writer_run_package.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_writer_run_package` 與 UI run package 按鈕,整理正式 CLI 小流量寫入前的 payload manifest、required artifacts、command bundle、operator signoff 與 rollback plan;API/UI 不產檔、不讀 approval token、不執行 CLI、不連 DB、不寫 queue、不 commit、不掛 scheduler;版本同步至 V10.240。
|
||
- Phase 61 candidate queue writer run readiness:新增 `services/market_intel/candidate_queue_writer_run_readiness.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_writer_run_readiness` 與 UI readiness 按鈕,檢查 reviewed sample 檔案路徑、備份路徑、preflight 輸出、migration live smoke、shell-only token acknowledgement 與禁止 token 進 API;API/UI 不產檔、不讀 approval token、不執行 CLI、不連 DB、不寫 queue、不 commit、不掛 scheduler;版本同步至 V10.245。
|
||
- Phase 62 candidate queue writer run receipt:新增 `services/market_intel/candidate_queue_writer_run_receipt.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_writer_run_receipt` 與 UI receipt 按鈕,審核 CLI 寫入後的 writer output、post-write smoke、dedupe key 一致性與 artifact 路徑;API/UI 不回吐 receipt 原文、不讀 approval token、不執行 CLI、不連 DB、不寫 queue、不掛 scheduler;版本同步至 V10.247。
|
||
- Phase 63 candidate queue writer run closeout:新增 `services/market_intel/candidate_queue_writer_run_closeout.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_writer_run_closeout` 與 UI closeout 按鈕,在 receipt 通過後檢查 closeout artifact、操作員人工 queue review/read-only inventory 確認與安全 promotion gate;API/UI 不回吐原始 receipt、不讀 approval token、不執行 CLI、不連 DB、不寫 queue、不掛 scheduler;版本同步至 V10.248。
|
||
- Phase 64 candidate queue review handoff:新增 `services/market_intel/candidate_queue_review_handoff.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_review_handoff` 與 UI handoff 按鈕,將 writer closeout 轉成人工 queue review / read-only inventory 交接契約;API/UI 不讀 approval token、不查 DB、不更新 review_state、不補寫 queue、不掛 scheduler;版本同步至 V10.251。
|
||
- Phase 65 candidate queue review inventory:新增 `services/market_intel/candidate_queue_review_inventory.py`、`routes/market_intel_review_routes.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_review_inventory` 與 UI inventory 按鈕,把 handoff、post-write smoke、live DB inventory 合併成只讀人工審核庫存檢查;預設不連 DB,人工只讀查詢仍不更新 review_state、不補寫 queue、不讀 token、不掛 scheduler;版本同步至 V10.252。
|
||
- Phase 66 candidate queue review decision:新增 `services/market_intel/candidate_queue_review_decision.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_review_decision` 與 UI decision 按鈕,將通過 inventory 的 queue row 整理成人工決策草案;API/UI 不更新 review_state、不寫 decision record、不讀 token、不掛 scheduler;版本同步至 V10.254。
|
||
- Phase 67 candidate queue review decision approval:新增 `services/market_intel/candidate_queue_review_decision_approval.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_review_decision_approval` 與 UI approval gate 按鈕,檢查人工決策草案是否可進入下一個 CLI-only transaction preview;API/UI 不更新 review_state、不寫 decision record、不建立 approval record、不讀 token、不掛 scheduler;版本同步至 V10.255。
|
||
- Phase 68 candidate queue review decision transaction:新增 `services/market_intel/candidate_queue_review_decision_transaction.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_review_decision_transaction` 與 UI transaction preview 按鈕,將 approval update preview 轉成 `review_state` update statement、payload hash 與 rollback plan;API/UI 不更新 review_state、不開 DB connection、不執行 CLI、不讀 token、不掛 scheduler;版本同步至 V10.256。
|
||
- Phase 69 candidate queue review decision writer CLI gate:新增 `services/market_intel/candidate_queue_review_decision_writer_cli.py`、`scripts/market_intel_review_decision_writer.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_review_decision_writer_status` 與 UI writer gate 按鈕,先建立 shell-only review_state writer gate 與 command bundle;writer implementation 本階段保持 disabled,API/UI 不讀 token、不執行 CLI、不連 DB、不更新 review_state、不掛 scheduler;版本同步至 V10.257。
|
||
- Phase 70 candidate queue review decision writer preflight:新增 `services/market_intel/candidate_queue_review_decision_writer_preflight.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_review_decision_writer_preflight` 與 UI preflight 按鈕,檢查 writer status、review_state update payload、狀態轉換與禁止 token 進 API;API/UI 即使收到 execute/apply_real_write 也不連 DB、不執行 CLI、不更新 review_state、不 commit、不讀 token、不掛 scheduler;版本同步至 V10.258。
|
||
- V10.259 補 Phase 70 preflight 合約與 OCLearn queue 時區:preflight 補 planned/read-only catalog probe 欄位、dedupe unique index 檢查與 route 重複註冊清理;OCLearn embedding queue 的 created_at/updated_at/stale cutoff 改為台北 naive,避免 UTC/台北時間差讓 processing 任務卡住。
|
||
- Phase 71 candidate queue review decision writer post-write smoke:新增 `services/market_intel/candidate_queue_review_decision_writer_postwrite_smoke.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_review_decision_writer_postwrite_smoke` 與 UI smoke 按鈕,人工 CLI 更新 review_state 後可用 dedupe key 只讀驗證 row 是否存在且 state 符合預期;API/UI 預設不連 DB,execute=true 也只讀查詢,不更新 review_state、不 commit、不讀 token、不掛 scheduler;版本同步至 V10.260。
|
||
- Phase 72 candidate queue review decision writer operator drill:新增 `services/market_intel/candidate_queue_review_decision_writer_operator_drill.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_review_decision_writer_operator_drill` 與 UI drill 按鈕,將 review_state CLI 更新前後的 transaction JSON、備份、preflight、CLI writer、post-write smoke 與 rollback plan 組成可稽核操作順序;API/UI 不讀 token、不執行 CLI、不連 DB、不更新 review_state、不 commit、不掛 scheduler;版本同步至 V10.261。
|
||
- Phase 73 candidate queue review decision writer run package:新增 `services/market_intel/candidate_queue_review_decision_writer_run_package.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_review_decision_writer_run_package` 與 UI package 按鈕,將 review_state transaction、preflight、operator drill、writer gate、post-write smoke、必要 artifact 與 rollback plan 組成正式 CLI 更新前的可稽核 run package;API/UI 不寫檔、不讀 token、不執行 CLI、不連 DB、不更新 review_state、不 commit、不掛 scheduler;版本同步至 V10.262。
|
||
- Phase 74 candidate queue review decision writer run readiness:新增 `services/market_intel/candidate_queue_review_decision_writer_run_readiness.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_review_decision_writer_run_readiness` 與 UI readiness 按鈕,檢查 review_state CLI 更新前的 transaction JSON、備份、preflight、shell-only token 與 post-write smoke 計畫是否齊備;API/UI 不寫檔、不讀 token、不執行 CLI、不連 DB、不更新 review_state、不 commit、不掛 scheduler;版本同步至 V10.264。
|
||
- Phase 75 candidate queue review decision writer run receipt:新增 `services/market_intel/candidate_queue_review_decision_writer_run_receipt.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_review_decision_writer_run_receipt` 與 UI receipt 按鈕,審核 review_state CLI 更新後的 writer output、post-write smoke、dedupe key 一致性、artifact 路徑與 token 外洩風險;API/UI 不回吐 receipt 原文、不讀 token、不執行 CLI、不連 DB、不更新 review_state、不 commit、不掛 scheduler;版本同步至 V10.266。
|
||
- Phase 76 candidate queue review decision writer run closeout:新增 `services/market_intel/candidate_queue_review_decision_writer_run_closeout.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_review_decision_writer_run_closeout` 與 UI closeout 按鈕,在 review_state receipt 通過後整理 closeout gate、操作員 closeout artifact、post-closeout read-only inventory 確認與 promotion 摘要;API/UI 不回吐 receipt 原文、不讀 token、不執行 CLI、不連 DB、不更新 review_state、不 commit、不掛 scheduler;版本同步至 V10.268。
|
||
- Phase 77 candidate queue review decision post-closeout inventory:新增 `services/market_intel/candidate_queue_review_decision_post_closeout_inventory.py`、`routes/market_intel_review_post_routes.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_review_decision_post_closeout_inventory` 與 UI inventory 按鈕,在 review_state closeout 後整理 post-write smoke、live inventory、dedupe key 與 review_state 結果;API/UI 不讀 token、不執行 CLI、不更新 review_state、不寫 DB、不 commit、不掛 scheduler;版本同步至 V10.270。
|
||
- Phase 78 candidate queue review completion archive:新增 `services/market_intel/candidate_queue_review_completion_archive.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_review_completion_archive` 與 UI archive 按鈕,在 post-closeout inventory 通過後整理 receipt、closeout、inventory、dedupe key、review_state row snapshot 與 artifact path manifest;API/UI 不寫檔、不讀 token、不執行 CLI、不更新 review_state、不寫 DB、不 commit、不掛 scheduler;版本同步至 V10.273。
|
||
- Phase 79 candidate queue review archive summary:新增 `services/market_intel/candidate_queue_review_archive_summary.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_review_archive_summary` 與 UI summary 按鈕,在 review completion archive 後整理可供摘要/報表審核的結構化輸入;API/UI 不呼叫 LLM、不派送 Telegram、不寫檔、不讀 token、不執行 CLI、不更新 review_state、不寫 DB、不 commit、不掛 scheduler;版本同步至 V10.276。
|
||
- Phase 80 candidate queue review AI summary preflight:新增 `services/market_intel/candidate_queue_review_ai_summary_preflight.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_review_ai_summary_preflight` 與 UI preflight 按鈕,在 archive summary 後檢查 Ollama-first 三主機級聯與 Gemini 備援邊界;API/UI 不呼叫 LLM、不派送 Telegram、不寫檔、不讀 token、不執行 CLI、不更新 review_state、不寫 DB、不 commit、不掛 scheduler;版本同步至 V10.278。
|
||
- Phase 81 candidate queue review AI summary run package:新增 `services/market_intel/candidate_queue_review_ai_summary_run_package.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_review_ai_summary_run_package` 與 UI package 按鈕,在 AI summary preflight 後整理手動 Ollama 摘要任務包、prompt contract 與輸出 schema;API/UI 不呼叫 LLM、不派送 Telegram、不寫 run package、不讀 token、不執行 CLI、不更新 review_state、不寫 DB、不 commit、不掛 scheduler;版本同步至 V10.280。
|
||
- Phase 82 candidate queue review AI summary output receipt:新增 `services/market_intel/candidate_queue_review_ai_summary_output_receipt.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_review_ai_summary_output_receipt` 與 UI receipt 按鈕,在 run package 後驗收人工 Ollama 摘要輸出的 schema、evidence_refs 與 model_route;API/UI 不呼叫 LLM、不派送 Telegram、不寫 receipt、不讀 token、不執行 CLI、不更新 review_state、不寫 DB、不 commit、不掛 scheduler;版本同步至 V10.285。
|
||
- Phase 83 candidate queue review AI summary persistence preflight:新增 `services/market_intel/candidate_queue_review_ai_summary_persistence_preflight.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_review_ai_summary_persistence_preflight` 與 UI preflight 按鈕,在 output receipt 後整理 future CLI-only `market_alert_review_queue.metadata_json.ai_summary_review` persistence contract、payload hash 與 metadata patch preview;API/UI 不呼叫 LLM、不派送 Telegram、不寫 preflight、不寫 summary record、不寫 metadata_json、不讀 token、不執行 CLI、不更新 review_state、不寫 DB、不 commit、不掛 scheduler;版本同步至 V10.286。
|
||
- Phase 84 candidate queue review AI summary persistence transaction:新增 `services/market_intel/candidate_queue_review_ai_summary_persistence_transaction.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_review_ai_summary_persistence_transaction` 與 UI transaction 按鈕,在 persistence preflight 後產生 future CLI-only `metadata_json` UPDATE statement preview、parameter preview 與 rollback plan;API/UI 不開 DB、不執行 SQL、不寫 transaction、不寫 summary record、不寫 metadata_json、不讀 token、不執行 CLI、不更新 review_state、不派送 Telegram、不呼叫 LLM、不 commit、不掛 scheduler;版本同步至 V10.287。
|
||
- Phase 85 candidate queue review AI summary persistence writer preflight:新增 `services/market_intel/candidate_queue_review_ai_summary_persistence_writer_preflight.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_review_ai_summary_persistence_writer_preflight` 與 UI writer preflight 按鈕,在 transaction preview 後檢查 CLI-only writer contract、metadata_json backup requirement、post-write smoke requirement 與 artifact path gate;API/UI 不開 DB、不執行 SQL、不寫 preflight、不寫 summary record、不寫 metadata_json、不讀 token、不執行 CLI、不更新 review_state、不派送 Telegram、不呼叫 LLM、不 commit、不掛 scheduler;版本同步至 V10.290。
|
||
- Phase 86 candidate queue review AI summary persistence run package:新增 `services/market_intel/candidate_queue_review_ai_summary_persistence_run_package.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_review_ai_summary_persistence_run_package` 與 UI run package 按鈕,在 writer preflight 後整理 payload manifest、CLI command bundle、required artifacts、operator signoff 與 rollback plan;API/UI 不開 DB、不執行 SQL、不寫 run package、不寫 summary record、不寫 metadata_json、不讀 token、不執行 CLI、不更新 review_state、不派送 Telegram、不呼叫 LLM、不 commit、不掛 scheduler;版本同步至 V10.294。
|
||
- Phase 87 candidate queue review AI summary persistence run readiness:新增 `services/market_intel/candidate_queue_review_ai_summary_persistence_run_readiness.py`、POST `/api/market_intel/manual_sample_review/candidate_queue_review_ai_summary_persistence_run_readiness` 與 UI readiness 按鈕,在 run package 後檢查 artifact path、metadata_json backup、read-only preflight、shell-only token 與 post-write smoke 計畫;API/UI 不開 DB、不執行 SQL、不寫 readiness artifact、不寫 metadata_json、不讀 token、不執行 CLI、不更新 review_state、不派送 Telegram、不呼叫 LLM、不 commit、不掛 scheduler;版本同步至 V10.297。
|
||
- V10.248 補市場情報 390px preview panel QA:sample review 工具列改為 textarea + 可換行 action rail,移除舊的硬編 8 欄 grid;`check_responsive_overflow` 新增 `--screenshot-all`,本機 390x844 `/market_intel` 真頁面 QA 通過且 overflow=0。
|
||
- V10.250 補 Code Review Gemini 備援遙測護欄:Ollama 主路徑失敗時 `fallback_to` 明確指向 `code_review_openclaw_gemini`,測試鎖住「Gemini 不得記成 `code_review_openclaw` 主 caller」;AI Calls 觀測台會把 legacy `code_review_openclaw + gemini` 顯示成 Gemini 備援,避免誤判 Gemini-first。
|
||
- Schema smoke:`tests/test_market_intel_skeleton.py` 檢查 `Base.metadata` 內含 ADR-035 八張 `market_*` tables。
|
||
- Desktop UI QA:本機只註冊 `market_intel_bp` 的 Flask harness 載入 `/market_intel`,確認 Phase 15、候選預覽、writer preview、安全 flags、點陣暖紙視覺正常,console error 0。
|
||
- API QA:`/api/market_intel/schema_smoke` 通過 7 張表與 `market_platforms` 必要欄位檢查;`/api/market_intel/platform_seed_writer_plan` 回傳 4 筆 dry-run upsert preview,`writes_executed=false`,四平台皆 `blocked_dry_run_only`。
|
||
- Narrow viewport UI QA:in-app browser 窄版畫面確認側欄收合、卡片不水平爆版、候選狀態顯示 `momo/pchome/coupang/shopee:planned`。
|
||
- 測試:新增 `tests/test_market_intel_skeleton.py`,確認預設 flags 全關、adapter 不允許 network/write/scheduler,手動 discovery / candidate preview 預設不發 request,parser/scorer/confidence 診斷只輸出 JSON,UI 只使用 `fetch=false`,platform seed plan 只讀且需 gate。
|
||
|
||
【下次待辦】
|
||
- 下次市場情報 seed writer 只需保留定期 smoke,確認 `approval_token_hint` 不回歸且 `api_reads_approval_token=false`、`api_executes_cli=false`、`api_writes_database=false`。
|
||
- 正式推版前需實際執行 worktree scope review、`python backup_system.py`、commit/push 目標變更、讀 deployment SOP 與 ADR-011,且只跑 `/health` 與市場情報頁 smoke。
|
||
- 下一步才可在明確批准且具備真實 reviewed sample JSON 後做正式 DB 的 queue writer CLI 小流量 operator run;先用 run readiness、run package、operator drill、post-write smoke、run receipt、run closeout 與 queue review handoff 做順序與只讀驗證,預設 API/UI 不得寫 DB,也不得執行 migration。
|
||
- 市場情報 UI 後續頁面必須沿用 V2 暖紙、暖墨、等寬數字與點陣風格,禁止複製巨型分析頁 template 模式。
|
||
|
||
================================================================================
|
||
AI 自動化閉環治理同步 (2026-04-29) [DONE]
|
||
================================================================================
|
||
|
||
【已完成】
|
||
- ADR-018:四 AI Agent 自動化控制面立案。
|
||
- Memory:新增 `docs/memory/ai_automation_closure_20260429.md`。
|
||
- Guide/Skills 替代:新增 `docs/guides/ai_automation_session_sop.md`。
|
||
- SOT:更新 `docs/AI_INTELLIGENCE_MODULE_SOT.md` 至 V10.11 AI Automation Metrics Scrape 架構。
|
||
- Codex 規則:更新 `AGENTS.md`、`CONSTITUTION.md`、ADR/memory 索引。
|
||
- Prometheus 指標化:新增 EventRouter / AutoHeal / safe action / replay in-process metrics,並接入 `/metrics`。
|
||
- 線上 smoke dashboard:新增 `/ai_automation_smoke` 與 `/api/ai-automation/smoke`,覆蓋 EventRouter、AutoHeal、NemoTron fallback、OpenClaw embedding queue、ElephantAlpha HITL。
|
||
- Smoke 趨勢保存:`/api/ai-automation/smoke` 每次快檢追加 JSONL 精簡紀錄,dashboard 顯示最近趨勢。
|
||
- Smoke 趨勢管理:新增 JSONL 匯出、清理與每日摘要。
|
||
- Smoke 每日摘要:新增 Telegram 手動推播 API 與 momo-scheduler 每日 09:10 排程入口。
|
||
- Grafana 視覺化:新增 `MOMO AI Automation Overview` provisioning dashboard,覆蓋 EventRouter、safe action、replay、AutoHeal 指標。
|
||
- Grafana 線上部署:188 active Grafana 已載入 4 個 dashboard,`MOMO AI Automation Overview` provisioning 成功。
|
||
- Prometheus scrape 修復:active monitoring stack 新增 `momo-app` scrape job,目標 `momo-pro-system:80/metrics`。
|
||
- Gunicorn preload 修復:`post_fork` 略過 Flask/Werkzeug request-bound LocalProxy,避免 worker boot fail。
|
||
- CD 健康檢查強化:改為 internal container health + external `mo.wooo.work` 雙檢查,重試窗延長到約 3 分鐘。
|
||
- CD Sync reload 修復:rsync 後明確 `docker compose restart momo-app scheduler telegram-bot`,避免檔案已同步但 process 仍跑舊版。
|
||
- CD Gunicorn 掛載強化:`momo-app` 明確掛載 `./gunicorn.conf.py:/app/gunicorn.conf.py:ro`,避免重啟後吃到 image 內舊版設定。
|
||
- Metrics schema drift 降噪:`realtime_sales_monthly` 總筆數改用 raw `COUNT(*)`,避免 ORM 欄位 drift 造成 Prometheus scrape warning。
|
||
- CD Rebuild 切換強化:rebuild 模式改為先 `docker compose build --no-cache momo-app` 成功,再 stop/rm/recreate 三應用容器,避免長時間 502。
|
||
- ElephantAlpha NIM fallback 強化:預設改用 production 可呼叫的 `nvidia/llama-3.3-nemotron-super-49b-v1.5`,Ultra 253B 權限 404 時自動 fallback。
|
||
- DatabaseManager 連線池收斂:PostgreSQL 每 worker pool 調整為 `pool_size=2/max_overflow=3`,避免多 route 重複 new manager 時吃滿連線。
|
||
- Ollama embedding 強化:改為優先 `/api/embed`,舊節點才 fallback `/api/embeddings`,並新增 `EMBEDDING_TIMEOUT`。
|
||
- Scheduler 例外記錄強化:清除 `scheduler.py` 靜默 `except/pass`,資源清理、EDM 可選欄位、備份 insight/通知失敗全改為可診斷 log。
|
||
- AI metrics baseline 觀測:`/metrics` 在尚無 AI 自動化事件時仍輸出 `momo_ai_*` zero-baseline series,避免重啟後 Grafana/Prometheus 看不到 metric names。
|
||
- ElephantAlpha transient fallback:NVIDIA NIM timeout、connection error、429 與 5xx 會嘗試下一個 fallback model;400 等非暫時性請求錯誤不重試。
|
||
- 模組化治理守門:新增 `docs/guides/modularization_governance.md`、`docs/memory/code_modularization_inventory_20260430.md` 與 `tests/test_modularization_governance.py`,盤點並鎖住 15 個 >800 行 Python 大檔。
|
||
- Legacy 5888 入口清理:刪除 `tests/main_test.py` standalone Flask 死碼,測試與自動匯入文件改用 Port 80 入口。
|
||
- OpenClaw Bot 第一刀拆分:Telegram API send/retry/file upload helper 已移至 `services/openclaw_bot/telegram_api.py`,避免 Blueprint 持續承接 delivery glue。
|
||
|
||
【下次待辦】
|
||
- 繼續依 inventory 拆 `routes/openclaw_bot_routes.py`:下一刀優先拆 menu keyboard 或 report formatting。
|
||
- 觀察 Prometheus scrape 後 `momo_ai_*` baseline 與非 baseline 事件序列是否持續穩定。
|
||
- Superset panel 設定與 Smoke 摘要成效觀察。
|
||
|
||
================================================================================
|
||
品牌資產最終處理與維護 (Phase 7) [DONE]
|
||
================================================================================
|
||
|
||
26. [已完成] 品牌圖檔格式轉換:
|
||
- 使用 `convert_assets.py` 生成多種格式。
|
||
- 產出格式:TIFF, JPG, EPS, AI (PDF), SVG (x3 款 Logo)。
|
||
- 位置:/Users/ogt/momo_pro_system/export_assets
|
||
- 已部署至伺服器並建立品牌資產庫頁面:https://momo.wooo.work/brand_assets
|
||
|
||
27. [已完成] 維護頁面文案更新與部署:
|
||
- 文案已更新為:「正在進行系統升級,為了提供更穩定的網站服務,系統正在進行必要的維護與優化,造成不便,敬請見諒」
|
||
- 已同步至 GCP 生產環境。
|
||
|
||
================================================================================
|
||
WOOO TECH 公司入口網站 (Phase 8) [NEW PROJECT]
|
||
================================================================================
|
||
|
||
28. [待辦] 公司入口網站開發 (wooo.work):
|
||
- 將使用 **Flutter Web** 開發。
|
||
- 需在獨立專案中進行(非 momo_pro_system)。
|
||
- 詳細規劃文件:implementation_plan_wooo_website.md
|
||
|
||
【網站定位】
|
||
- 新創公司 WOOO TECH 的數位門面
|
||
- 整合各子系統產品的導航與介紹
|
||
- 一級域名:wooo.work
|
||
- 子系統:momo.wooo.work, [未來產品].wooo.work
|
||
|
||
【頁面結構】
|
||
- 首頁:Hero Section + 產品卡片
|
||
- 產品介紹頁:各系統功能詳情
|
||
- 公司介紹:願景、使命
|
||
- 聯繫我們:表單或 Email
|
||
|
||
【視覺風格】
|
||
- 延續 WOOO 品牌:漸變紫藍 + 深色科技感 + 玻璃質感
|
||
- 動態流暢的互動效果
|
||
|
||
【待確認】
|
||
- DNS 託管商 (wooo.work)
|
||
- 公司簡介文案
|
||
- 是否需要多語言支援
|
||
|
||
|
||
|
||
|
||
【環境區分】
|
||
|
||
1. 開發/測試環境(本機 VS Code):
|
||
- 位置:macOS 本機 (/Users/ogt/momo_pro_system)
|
||
- 用途:開發新功能、測試、除錯
|
||
- 啟動方式:`python app.py`
|
||
- 訪問:http://localhost:5000 或 http://127.0.0.1:5000
|
||
- 資料庫:data/momo_database.db (本機 SQLite)
|
||
|
||
================================================================================
|
||
完整部署流程 (2026-01-13)
|
||
================================================================================
|
||
|
||
【部署完成狀態】
|
||
✅ 網站:https://momo.wooo.work
|
||
✅ 響應時間:1.7-2 秒
|
||
✅ SSL 有效期:2026-04-13
|
||
✅ Google Drive 自動匯入:每 30 分鐘
|
||
✅ 爬蟲任務:每小時執行
|
||
✅ 自動備份:已配置
|
||
|
||
================================================================================
|
||
日常開發工作流程
|
||
================================================================================
|
||
|
||
【本機開發流程】
|
||
|
||
1. 啟動開發環境:
|
||
cd /Users/ogt/momo_pro_system
|
||
python app.py
|
||
# 訪問:http://localhost:5000
|
||
|
||
2. 開發新功能:
|
||
- 編輯程式碼
|
||
- 本機測試
|
||
- 確認功能正常
|
||
|
||
3. 測試資料庫變更:
|
||
- 修改 database/models.py
|
||
- 執行 python init_db.py
|
||
- 驗證資料庫結構
|
||
|
||
4. 版本控制(如果使用 Git):
|
||
git add .
|
||
git commit -m "描述變更內容"
|
||
|
||
【版本同步檢查】
|
||
|
||
⚠️ 重要:每次更新後確認本機和 GCP 版本一致
|
||
|
||
1. 檢查關鍵文件的修改時間和大小:
|
||
# 本機
|
||
ls -lh /Users/ogt/momo_pro_system/app.py
|
||
ls -lh /Users/ogt/momo_pro_system/dashboard.html
|
||
|
||
# GCP
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="ls -lh ~/momo_pro_system/app.py ~/momo_pro_system/dashboard.html"
|
||
|
||
2. 比對檔案 MD5 雜湊值(確保內容完全一致):
|
||
# 本機
|
||
md5 /Users/ogt/momo_pro_system/app.py
|
||
|
||
# GCP
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="md5sum ~/momo_pro_system/app.py"
|
||
|
||
3. 檢查最近更新的文件:
|
||
# 本機(最近 1 天內修改的 Python 和 HTML 文件)
|
||
find /Users/ogt/momo_pro_system -type f \( -name "*.py" -o -name "*.html" \) -mtime -1 -ls
|
||
|
||
# GCP
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="find ~/momo_pro_system -type f \( -name '*.py' -o -name '*.html' \) -mtime -1 -ls"
|
||
|
||
4. 版本追蹤建議:
|
||
✅ 每次更新後記錄更新時間和文件清單
|
||
✅ 使用 Git 進行版本控制(未來可考慮)
|
||
✅ 重大更新前先備份 GCP 當前版本
|
||
✅ 更新後測試關鍵功能確認正常
|
||
|
||
【常用維護命令】
|
||
|
||
# 查看服務狀態
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="sudo systemctl status momo"
|
||
|
||
# 查看即時日誌
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="sudo journalctl -u momo -f"
|
||
|
||
# 重啟服務
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="sudo systemctl restart momo"
|
||
|
||
# 停止服務
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="sudo systemctl stop momo"
|
||
|
||
# 啟動服務
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="sudo systemctl start momo"
|
||
|
||
# 查看 Nginx 狀態
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="sudo systemctl status nginx"
|
||
|
||
# 重新載入 Nginx 配置
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="sudo nginx -t && sudo systemctl reload nginx"
|
||
|
||
# 檢查 SSL 證書狀態
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="sudo certbot certificates"
|
||
|
||
# 手動更新 DuckDNS IP
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="~/duckdns/duck.sh && cat ~/duckdns/duck.log"
|
||
|
||
# 查看資源使用狀況
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="free -h && df -h && top -bn1 | head -n 15"
|
||
|
||
【維護模式管理】
|
||
|
||
# 啟用維護模式(顯示維護頁面,停止應用服務)
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="./enable_maintenance.sh"
|
||
|
||
# 禁用維護模式(恢復正常服務)
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="./disable_maintenance.sh"
|
||
|
||
# 維護模式說明:
|
||
# - 維護模式會將網站切換到靜態維護頁面
|
||
# - 顯示「系統維護中」訊息和即時時鐘
|
||
# - SSL/HTTPS 持續運作
|
||
# - 適用於系統更新、資料庫維護等需要暫停服務的場景
|
||
# - 維護頁面位置:~/momo_pro_system/maintenance.html
|
||
|
||
================================================================================
|
||
系統備份策略
|
||
================================================================================
|
||
|
||
【本機備份】
|
||
- 執行:python backup_system.py
|
||
- 或在系統設定頁面點擊「系統備份」按鈕
|
||
- 位置:backups/ 目錄
|
||
- 最新備份:momo_pro_system_backup_20260113_111011_V9.4.zip (261 MB)
|
||
|
||
【生產環境備份】
|
||
|
||
✅ 已設置每日自動備份(每天凌晨 2:00)
|
||
|
||
1. 自動備份配置:
|
||
- 執行時間:每天 02:00(台北時間 10:00)
|
||
- 備份腳本:~/daily_backup.sh
|
||
- 備份位置:~/momo_backups/
|
||
- 保留期限:最近 7 天
|
||
- 備份內容:
|
||
* 資料庫(momo_database.db)
|
||
* 配置文件(config/)
|
||
* Google Drive 憑證
|
||
* 系統配置(Nginx, systemd)
|
||
* DuckDNS 配置
|
||
* 最近 7 天日誌
|
||
|
||
2. 查看備份狀態:
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="ls -lh ~/momo_backups/*.tar.gz | tail -5"
|
||
|
||
3. 查看備份日誌:
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="tail -50 ~/momo_backups/backup.log"
|
||
|
||
4. 手動執行備份:
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="~/daily_backup.sh"
|
||
|
||
5. 下載備份到本機:
|
||
gcloud compute scp momo-server:~/momo_backups/momo_production_backup_*.tar.gz \
|
||
/Users/ogt/momo_pro_system/backups/ --zone=asia-east1-a
|
||
|
||
6. 恢復備份:
|
||
# 解壓備份檔
|
||
tar -xzf momo_production_backup_YYYYMMDD_HHMMSS.tar.gz
|
||
# 恢復資料庫
|
||
cp momo_production_backup_*/momo_database.db ~/momo_pro_system/data/
|
||
# 重啟服務
|
||
sudo systemctl restart momo
|
||
|
||
================================================================================
|
||
故障排除指南
|
||
================================================================================
|
||
|
||
【問題:網站無法訪問】
|
||
1. 檢查服務狀態:
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="sudo systemctl status momo nginx"
|
||
|
||
2. 檢查防火牆:
|
||
gcloud compute firewall-rules list --filter="name:allow-http*"
|
||
|
||
3. 檢查 DNS 解析:
|
||
nslookup momo.wooo.work
|
||
|
||
【問題:網站速度慢】
|
||
1. 檢查資源使用:
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="free -h && df -h && ps aux | grep python"
|
||
|
||
2. 檢查 Gunicorn workers:
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="ps aux | grep gunicorn"
|
||
|
||
3. 查看應用日誌:
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="sudo journalctl -u momo -n 100 --no-pager"
|
||
|
||
【問題:SSL 證書過期】
|
||
1. 檢查證書狀態:
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="sudo certbot certificates"
|
||
|
||
2. 手動續期:
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="sudo certbot renew"
|
||
|
||
【問題:Google Drive 自動匯入失敗】
|
||
1. 檢查日誌:
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="sudo journalctl -u momo | grep -i 'google drive' | tail -n 20"
|
||
|
||
2. 檢查憑證檔案:
|
||
gcloud compute ssh momo-server --zone=asia-east1-a \
|
||
--command="ls -lh ~/momo_pro_system/config/google_*.{json,pickle}"
|
||
|
||
3. 手動測試:
|
||
gcloud compute ssh momo-server --zone=asia-east1-a
|
||
cd ~/momo_pro_system
|
||
source venv/bin/activate
|
||
python -c "from services.google_drive_service import GoogleDriveService; g=GoogleDriveService(); print(g.list_files())"
|
||
|
||
【問題:504 Gateway Timeout】
|
||
原因:某些頁面(如 sales_analysis)需要處理大量數據(31 萬+ 筆記錄),
|
||
超過 Nginx 預設的 60 秒 timeout。
|
||
|
||
解決方案(已修復 2026-01-13):
|
||
1. 增加 Nginx proxy timeout 到 300 秒:
|
||
- proxy_read_timeout 300s;
|
||
- proxy_connect_timeout 300s;
|
||
- proxy_send_timeout 300s;
|
||
|
||
2. 如需調整 timeout,編輯 Nginx 配置:
|
||
gcloud compute ssh momo-server --zone=asia-east1-a
|
||
sudo nano /etc/nginx/sites-available/momo
|
||
# 修改 location / { 區塊內的 proxy_*_timeout 值
|
||
sudo nginx -t && sudo systemctl reload nginx
|
||
|
||
3. 如問題持續,考慮:
|
||
- 查詢優化(已添加 11 個索引)
|
||
- 增加 Gunicorn timeout(目前 120 秒)
|
||
- 實作分頁或快取機制
|
||
- 升級 VM 規格(✅ 已升級:e2-standard-2, 8GB RAM)
|
||
|
||
效能優化歷程:
|
||
- 2026-01-13: Nginx timeout 增加到 300 秒
|
||
- 2026-01-13: VM 記憶體從 4GB 升級到 8GB(解決 OOM 問題)
|
||
- 記憶體使用率:從 94% 降至 7.5%,可用記憶體 6.9GB
|
||
|
||
【VM 規格升級方法】
|
||
如需再次升級 VM 規格:
|
||
1. 停止實例:gcloud compute instances stop momo-server --zone=asia-east1-a
|
||
2. 更改類型:gcloud compute instances set-machine-type momo-server --machine-type=e2-standard-4 --zone=asia-east1-a
|
||
3. 啟動實例:gcloud compute instances start momo-server --zone=asia-east1-a
|
||
4. 驗證升級:gcloud compute ssh momo-server --zone=asia-east1-a --command="free -h"
|
||
|
||
可用機器類型:
|
||
- e2-standard-2: 2 vCPU, 8GB RAM (當前)
|
||
- e2-standard-4: 4 vCPU, 16GB RAM
|
||
- e2-standard-8: 8 vCPU, 32GB RAM
|
||
|
||
================================================================================
|
||
重要檔案位置
|
||
================================================================================
|
||
|
||
【本機環境】
|
||
- 專案根目錄:/Users/ogt/momo_pro_system/
|
||
- 資料庫:data/momo_database.db
|
||
- 配置檔:config.py, .env
|
||
- Google Drive:config/google_credentials.json, config/google_token.pickle
|
||
- 備份目錄:backups/
|
||
- 日誌目錄:logs/
|
||
|
||
【生產環境 (VM)】
|
||
- 專案目錄:/home/ogt/momo_pro_system/
|
||
- 虛擬環境:/home/ogt/momo_pro_system/venv/
|
||
- 資料庫:/home/ogt/momo_pro_system/data/momo_database.db
|
||
- 配置檔:/home/ogt/momo_pro_system/.env
|
||
- Systemd 服務:/etc/systemd/system/momo.service
|
||
- Nginx 配置:/etc/nginx/sites-available/momo
|
||
- SSL 證書:/etc/letsencrypt/live/momo.wooo.work/
|
||
- DuckDNS 腳本:/home/ogt/duckdns/duck.sh
|
||
- Gunicorn 日誌:
|
||
- Access: /home/ogt/momo_pro_system/logs/gunicorn-access.log
|
||
- Error: /home/ogt/momo_pro_system/logs/gunicorn-error.log
|
||
- 系統日誌:sudo journalctl -u momo
|
||
|
||
================================================================================
|
||
系統重啟後待辦事項清單
|
||
================================================================================
|
||
|
||
【本機開發環境重啟】
|
||
|
||
1. 啟動系統:
|
||
cd /Users/ogt/momo_pro_system
|
||
python app.py
|
||
|
||
2. 驗證匯入功能 (關鍵):
|
||
- 進入「系統設定」頁面,匯入 Excel 報表。
|
||
- 觀察終端機日誌,確認出現「自動去重」或「已建立新資料表」的訊息。
|
||
- 若重複匯入相同檔案,應顯示「發現 X 筆重複資料,已忽略」。
|
||
|
||
3. 檢查資料顯示:
|
||
- 進入「業績分析」頁面 (/sales_analysis)。
|
||
- 確認 '狀態' 欄位是否正確顯示 'F' (目前系統處於原始匯入模式,未執行強制轉 0)。
|
||
|
||
4. 決定清理策略:
|
||
- 目前 app.py 中的「智慧資料清理」邏輯已被註解掉 (約第 1160 行)。
|
||
- 若確認資料無誤且不需要自動轉型,可維持現狀。
|
||
- 若需要恢復清理功能,請取消註解並重啟 app.py。
|
||
|
||
5. 系統備份:
|
||
- 確認一切正常後,點擊「系統備份」按鈕或執行 `python backup_system.py`。
|
||
|
||
【進階報表與策略分析規劃 (Phase 2)】
|
||
|
||
6. [已完成] 營運成長報表 (Growth Strategy):
|
||
- 建立獨立頁面 `growth_analysis.html`。
|
||
- 實作 MoM (月增率) / YoY (年增率) 雙軸趨勢圖。
|
||
- 實作 YTD (年初至今) 累計達成率。
|
||
- 實作 客單價 (AOV) 趨勢分析。
|
||
|
||
7. [已完成] BCG 矩陣分析 (波士頓矩陣):
|
||
- 已在業績分析頁加入散佈圖,並自動計算中位數劃分四象限。
|
||
- 視覺化顯示:明星(黃)、金牛(綠)、問題(藍)、瘦狗(灰)。
|
||
|
||
8. [已完成] ABC 分析 (帕累托法則):
|
||
- 已實作 A/B/C 類商品佔比計算與視覺化。
|
||
- 已加入 Excel 匯出功能,包含 ABC 分類欄位。
|
||
|
||
9. [已完成] 廠商獲利能力排行:
|
||
- 已在業績分析頁新增廠商排行表格。
|
||
- 顯示總業績、毛利額、毛利率、SKU 數與平均單品產值。
|
||
|
||
10. [已完成] 淡旺季熱力圖:
|
||
- 已實作 Month x Category 熱力圖。
|
||
- 透過氣泡大小與顏色深淺,視覺化呈現各分類在不同月份的業績表現。
|
||
|
||
【系統優化與維護 (Phase 3)】
|
||
|
||
11. [已完成] 業績分析頁面效能優化:
|
||
- 實作 Server-side AJAX 載入列表資料,解決頁面卡頓問題。
|
||
- 優化篩選邏輯與快取機制。
|
||
|
||
12. [已完成] 淡旺季熱力圖匯出:
|
||
- 實作點擊氣泡匯出該月份分類明細的功能。
|
||
|
||
13. [已完成] 廠商排行與詳細列表優化:
|
||
- 廠商排行:新增佔比、銷量、ASP 欄位,並優化版面高度。
|
||
- 詳細列表:改為多維度聚合 (商品+品牌+廠商+分類),新增品牌、均價、退貨率欄位。
|
||
|
||
14. [已完成] ABC 分析列表增加商品ID欄位:
|
||
- 在 ABC 詳細報表頁面與匯出 Excel 中增加「商品ID」欄位。
|
||
|
||
【待辦功能與驗證 (Phase 4)】
|
||
|
||
15. [待辦] 廠商排行互動優化:
|
||
- 實作點擊廠商名稱,自動跳轉並篩選該廠商的所有商品。
|
||
|
||
16. [待辦] 商品看板庫存顯示:
|
||
- 研究是否能從爬蟲抓取一般商品的庫存量 (目前僅 EDM/Festival 有抓取)。
|
||
- 若可行,在商品看板列表加入庫存欄位。
|
||
|
||
17. [已完成] 當日業績看板 (Daily Sales Dashboard):
|
||
【功能目標】
|
||
- ✅ 建立新頁面 `/daily_sales`,用於每日業績快照的分析與追蹤。
|
||
|
||
【資料表設計】
|
||
- ✅ 新建資料表 `daily_sales_snapshot`。
|
||
- ✅ 欄位結構與 `realtime_sales_monthly` 相同,並額外增加 `snapshot_date` (日期) 欄位。
|
||
- ✅ 實作自動去重機制,避免重複匯入相同日期的資料。
|
||
|
||
【Excel 匯入功能】
|
||
- ✅ 提供 Excel 上傳功能,欄位對應 `realtime_sales_monthly` 結構。
|
||
- ✅ 智慧匯入:從 Excel 的「日期」欄位自動拆分 snapshot_date(支援單檔多日)。
|
||
- ✅ 匯入後自動記錄快照日期,保留歷史記錄供比較分析。
|
||
|
||
【KPI 卡片顯示】
|
||
- ✅ 6 個核心指標卡片,每個指標計算 DoD% 和 WoW%:
|
||
1. 總業績 (DoD%, WoW%)
|
||
2. 總成本 (DoD%, WoW%)
|
||
3. 毛利 (DoD%, WoW%)
|
||
4. SKU 數 (DoD%, WoW%)
|
||
5. 客單價 (DoD%, WoW%)
|
||
6. 總銷量 (DoD%, WoW%)
|
||
- ✅ KPI 卡片文字對比度優化(白色文字 + 陰影)
|
||
|
||
【分析圖表】
|
||
- ✅ 每日業績趨勢圖(混合圖表:柱狀 + 折線)
|
||
- ✅ DoD 成長率圖(條件著色)
|
||
- ✅ WoW 成長率圖(前 7 天灰色 + 第 8 天起彩色 + 說明工具提示)
|
||
- ✅ 商品 Top 10 排行(橫向柱狀圖)
|
||
|
||
【業績行事曆視圖】(全新功能)
|
||
- ✅ 完整月份行事曆,顯示每日業績、毛利、SKU、客單價、銷量
|
||
- ✅ 星期標註(週一~週日)
|
||
- ✅ 2026 年台灣國定假日標註(根據人事行政總處公佈)
|
||
- ✅ DoD 顏色系統:紅色 = 正成長,綠色 = 負成長
|
||
- ✅ DoD 百分比標籤顯示(右上角)
|
||
- ✅ 行事曆文字對比度優化(彩色背景上的白色文字 + 陰影)
|
||
- ✅ 點擊日期切換查看詳細業績
|
||
- ✅ 月份切換按鈕(上個月/下個月)
|
||
|
||
【詳細列表】
|
||
- ✅ 顯示當日各分類的業績明細(分類層級聚合)
|
||
- ✅ 支援 DataTables 排序、搜尋、分頁功能
|
||
|
||
【日期選擇功能】
|
||
- ✅ 下拉選單顯示所有可用日期
|
||
- ✅ 切換日期時,KPI、圖表、列表同步更新
|
||
- ✅ 行事曆與日期選擇器連動
|
||
|
||
【UI/UX 優化】(2026-01-12 完成)
|
||
- ✅ 行事曆視覺優化:移除彩色背景,改用白底黑字 + DoD 徽章(上漲紅色、下跌綠色)
|
||
- ✅ 金額格式改為完整顯示(千分位):$123,456 取代 $123K
|
||
- ✅ 移除行事曆日期格中的重複星期顯示(標題列已有星期標註)
|
||
- ✅ 國定假日標籤改為日期右側顯示(inline layout)
|
||
- ✅ 響應式設計優化:
|
||
• 手機版採用橫向滾動(min-width: 700px)
|
||
• KPI 標籤改用 emoji 圖示(💰業績、📊毛利、📦SKU、🛒客單、📈銷量)
|
||
• 平板與手機適配字體大小與間距
|
||
• 新增滾動提示訊息
|
||
|
||
【多維度分析強化】(2026-01-12 完成)
|
||
- ✅ 每日趨勢圖:多 Y 軸顯示(業績/毛利、客單價、銷量)
|
||
- ✅ DoD 圖表:4 條線(業績、毛利、客單價、銷量)
|
||
- ✅ WoW 圖表:4 條線 + 前 7 天灰色顯示 + 工具提示說明
|
||
- ✅ 行事曆每格顯示 5 項指標(業績、毛利、SKU、客單價、銷量)
|
||
- ✅ 毛利計算修正:自動計算 (revenue - cost)
|
||
|
||
【廠商維度增強】(2026-01-12 完成)
|
||
- ✅ Top 10 商品:顯示格式改為「商品名稱 (廠商名稱)」
|
||
- ✅ 分類業績明細:新增廠商欄位,顯示廠商名稱(非 ID)
|
||
- ✅ 欄位優先順序修正:['廠商名稱', '廠商', 'Vendor', 'Supplier']
|
||
|
||
【系統配置更新】(2026-01-12 完成)
|
||
- ✅ 服務端口從 5888 改為 80
|
||
- ✅ 資料庫路徑確認:data/momo_database.db
|
||
|
||
【已完成測試】
|
||
- ✅ 行事曆顯示 5 項指標(完整金額 + 千分位)
|
||
- ✅ 2026 年國定假日正確標註
|
||
- ✅ DoD 徽章顏色系統(紅色上漲、綠色下跌)
|
||
- ✅ WoW 圖表灰色線條邏輯(前 7 天無對比資料)
|
||
- ✅ 行事曆文字清晰可讀(白底黑字 + DoD 徽章)
|
||
- ✅ 月份切換功能
|
||
- ✅ 日期選擇功能
|
||
- ✅ 手機版橫向滾動(行事曆、分類列表、Top 10 圖表)
|
||
- ✅ 廠商名稱顯示(Top 10 + 分類明細)
|
||
- ✅ 手機版 KPI 文字可見性優化(行事曆標籤由灰色改為深色)
|
||
- ✅ 毛利率百分比顯示(顯示於毛利金額右側)
|
||
- ✅ DoD/WoW 徽章對比度優化(改用深色背景白色文字)
|
||
- ✅ 分類業績明細表格手機版滾動(min-width: 800px)
|
||
- ✅ Top 10 商品圖表手機版滾動(min-width: 400-500px)
|
||
|
||
【修正的檔案】
|
||
- app.py (第 3376-3450 行):多維度圖表數據準備(DoD/WoW 計算、毛利計算、廠商維度)
|
||
- app.py (第 3416, 3459 行):廠商欄位優先順序修正
|
||
- app.py (第 3456-3492 行):台灣國定假日資料
|
||
- app.py (第 3548-3628 行):行事曆數據計算(客單價、銷量、毛利)
|
||
- app.py (第 3752-3791 行):行事曆數據準備函式(margin_rate 計算)
|
||
- app.py (多處):服務端口從 5888 改為 80
|
||
- daily_sales.html (第 42-287 行):CSS 樣式重構(白底黑字、DoD 徽章、響應式設計)
|
||
- daily_sales.html (第 106-114 行):Top 10 圖表響應式滾動容器樣式
|
||
- daily_sales.html (第 177-200 行):行事曆 HTML(5 項指標完整顯示)
|
||
- daily_sales.html (第 227-242 行):行事曆 KPI 文字顏色與毛利率樣式
|
||
- daily_sales.html (第 260-262, 277-279 行):手機版 Top 10 圖表最小寬度設定
|
||
- daily_sales.html (第 387 行):毛利率百分比顯示(inline 於毛利右側)
|
||
- daily_sales.html (第 408-521 行):DoD/WoW 徽章改用深色背景
|
||
- daily_sales.html (第 580-588 行):Top 10 圖表容器結構(加入滾動提示與響應式容器)
|
||
- daily_sales.html (第 605-640 行):分類列表表格響應式容器(加入滾動提示)
|
||
- daily_sales.html (第 644-896 行):Chart.js 多維度圖表配置
|
||
|
||
【系統架構優化與重構 (Phase 5)】
|
||
|
||
18. [已完成] 商品看板視覺優化 (V9.2):
|
||
【爬蟲效能優化】(2026-01-12 完成)
|
||
- ✅ 商品圖爬取改用 i_code 直接構造 CDN URL
|
||
- ✅ 格式:https://m.momoshop.com.tw/moscdn/goods/{i_code}_m.webp
|
||
- ✅ 移除複雜 DOM 查詢(8+ CSS 選擇器),速度提升 20-30%
|
||
- ✅ 提高圖片載入準確性與穩定性
|
||
|
||
【UI/UX 全面升級】(2026-01-12 完成)
|
||
- ✅ 統一紫色主題風格(#667eea, #764ba2)與 Daily Sales 一致
|
||
- ✅ 現代化漸變效果(卡片、按鈕、表頭)
|
||
- ✅ 商品卡片懸停動效(陰影、縮放)
|
||
- ✅ 表格樣式優化(漸變表頭、hover 效果)
|
||
- ✅ 商品圖片懸停效果(放大、邊框、陰影)
|
||
- ✅ 分頁按鈕圓角與漸變設計
|
||
|
||
【版面與排版修正】(2026-01-12 完成)
|
||
- ✅ 修正按鈕群組排版(全部、新上架、漲價、跌價、下架)
|
||
- ✅ 修正表格文字可見性(tbody 文字顏色 #2c3e50)
|
||
- ✅ 修正商品列表標題區塊(增加 card-body 包裹)
|
||
- ✅ 商品 ID 字體放大至 0.875rem(原 small class)
|
||
- ✅ 商品 ID 改用紫色主題色(#667eea)
|
||
|
||
【互動體驗增強】(2026-01-12 完成)
|
||
- ✅ 價格顯示 hover 效果(背景漸變、放大、陰影)
|
||
- ✅ 複製品號視覺回饋優化(✅ emoji + 縮放動畫)
|
||
- ✅ 歷史圖表 Modal 視覺升級(漸變標題、圓角、陰影)
|
||
- ✅ 圖表優化:漸變填充、平滑曲線、動態點樣式
|
||
- ✅ Tooltip 優化:emoji 圖示、深色背景、紫色邊框
|
||
- ✅ 圖表動畫:1 秒平滑動畫(easeInOutQuart)
|
||
|
||
【修正的檔案】
|
||
- scheduler.py (第 228-244 行):商品圖 URL 構造邏輯
|
||
- app.py (第 88 行):版本號更新至 V9.2
|
||
- dashboard.html (第 166-331 行):完整 CSS 重構
|
||
- dashboard.html (第 462-500 行):商品列表標題區塊結構調整
|
||
- dashboard.html (第 548-550 行):商品 ID 樣式修正
|
||
- dashboard.html (第 582-587 行):價格顯示互動效果
|
||
- dashboard.html (第 730-813 行):圖表漸變與動畫配置
|
||
- dashboard.html (第 777-789 行):複製回饋動畫
|
||
|
||
19. [已完成] 商品看板 KPI 卡片重構與新增指標 (V9.3):
|
||
【需求整合】(2026-01-12 完成)
|
||
- ✅ 將原有 4 張 KPI 卡片整合為 2 張卡片
|
||
- ✅ 新增 7 個關鍵業務指標
|
||
- ✅ 優化視覺層次與資訊密度
|
||
- ✅ 提升使用者體驗與數據可讀性
|
||
|
||
【卡片 1:商品監控概況】(2026-01-12 完成)
|
||
- ✅ 監控商品總數(千分位格式化)
|
||
- ✅ 今日新增商品數
|
||
- ✅ 週增長(過去 7 天新增商品數)
|
||
- ✅ 價格穩定商品數(7 天內無變價)
|
||
|
||
【卡片 2:今日價格動態】(2026-01-12 完成)
|
||
- ✅ 上排:漲價 / 降價 / 下架(3 個主要變動指標)
|
||
- ✅ 中排:平均漲幅 / 平均跌幅 / 活躍度(價格分析)
|
||
- ✅ 下排:最活躍分類 / 最大變動(關鍵商業指標)
|
||
|
||
【新增 KPI 指標】(2026-01-12 完成)
|
||
- ✅ 平均漲幅:漲價商品平均價格變動
|
||
- ✅ 平均跌幅:降價商品平均價格變動
|
||
- ✅ 今日活躍度:有價格變動的商品百分比
|
||
- ✅ 週增長:過去 7 天新增商品數
|
||
- ✅ 價格穩定商品數:7 天內價格無變化的商品數
|
||
- ✅ 最活躍分類:今日變動商品數最多的分類
|
||
- ✅ 最大變動:單一商品最大價格變動(含商品名稱)
|
||
|
||
【後端數據計算】(2026-01-12 完成)
|
||
- ✅ 平均漲跌幅計算邏輯(sum / count)
|
||
- ✅ 活躍度百分比計算(變動商品 / 總商品 * 100)
|
||
- ✅ 最大變動商品查找(絕對值比較)
|
||
- ✅ 週增長查詢(7 天內 min(timestamp) 的商品數)
|
||
- ✅ 價格穩定商品統計(7 天內 distinct(price) == 1)
|
||
- ✅ 最活躍分類統計(category_activity 字典統計)
|
||
|
||
【前端視覺優化】(2026-01-12 完成)
|
||
- ✅ 新增 .kpi-grid CSS 樣式(3 欄網格佈局)
|
||
- ✅ 新增 .kpi-item 樣式(漸變背景、hover 效果)
|
||
- ✅ 顏色區分:increase (紅色) / decrease (綠色) / neutral (灰色)
|
||
- ✅ 響應式設計:手機版改為單欄佈局
|
||
- ✅ 卡片 1 藍色漸變背景(與 Daily Sales 風格一致)
|
||
- ✅ 卡片 2 白色背景 + 網格佈局(清晰易讀)
|
||
|
||
【修正的檔案】
|
||
- app.py (第 494-554 行):新增 KPI 計算邏輯
|
||
- app.py (第 659-692 行):render_template 傳遞新 KPI 數據
|
||
- app.py (第 88 行):版本號更新至 V9.3
|
||
- dashboard.html (第 369-421 行):新增 KPI 網格樣式
|
||
- dashboard.html (第 440-448 行):響應式設計更新
|
||
- dashboard.html (第 477-585 行):完整 2 張卡片 HTML 結構
|
||
|
||
20. [待辦] 爬蟲邏輯統一與效能優化 (Scheduler):
|
||
- 將 run_momo_task 的優化邏輯 (批次寫入、無例外查找) 套用到 run_edm_task 與 run_festival_task。
|
||
- 提升 EDM 與購物節爬蟲的穩定性與速度。
|
||
|
||
21. [待辦] 首頁 (Dashboard) 效能優化:
|
||
- 對 get_consolidated_data 實作短時間快取 (5-10分鐘),減少資料庫全表掃描。
|
||
- 評估改用 SQL 分頁取代記憶體分頁。
|
||
|
||
22. [待辦] 程式碼重構與模組化:
|
||
- 將 app.py 的路由拆分為 Blueprints (dashboard, analysis, api)。
|
||
- 將資料處理邏輯移至 services 層。
|
||
|
||
23. [待辦] 清理冗餘程式碼:
|
||
- 移除 database/manager.py 中不再使用的 update_data 函式。
|
||
|
||
【系統安全強化 (Phase 6) - URGENT】
|
||
|
||
=== 重大安全風險 (Critical - 須立即修復) ===
|
||
|
||
24. [CRITICAL] 移除硬編碼敏感資訊:
|
||
- 檔案: config.py (第 17, 22, 26, 35, 40, 173 行)
|
||
- 問題: 所有 API 金鑰、密碼、Token 直接寫在程式碼中
|
||
• LOGIN_PASSWORD = "0936223270"
|
||
• TELEGRAM_BOT_TOKEN = "8075645931:AAH-EGKMo8ZC4QJs-Nc1_0s92xHrGdQvdpg"
|
||
• LINE_CHANNEL_ACCESS_TOKEN = "nD6MSXjB2FyB111zpT6Yik5B275mi6olHjjf94VnqN..."
|
||
• EMAIL_HOST_PASSWORD = "jopokbhdpnnborjd"
|
||
• NGROK_AUTH_TOKEN = "36e27NM5V7sUJ8QxJIAAWCp7sUv_3brtcrBarYvcP3SbvFKhF"
|
||
- 風險: 任何有權限看到程式碼的人都能取得所有帳密,可接管系統
|
||
- 修復:
|
||
1. 安裝 python-dotenv: pip install python-dotenv
|
||
2. 建立 .env 檔案存放所有敏感資訊
|
||
3. 將 .env 加入 .gitignore
|
||
4. 更新 config.py 改用 os.getenv() 讀取環境變數
|
||
5. **立即更換所有已外洩的密碼與 Token**
|
||
|
||
25. [CRITICAL] 修復 SQL Injection 漏洞 #1:
|
||
- 檔案: app.py (第 2539, 3469 行)
|
||
- 問題: 使用字串插值直接組合 SQL 查詢
|
||
• df_existing = pd.read_sql(f"SELECT * FROM {table_name}", engine)
|
||
• df = pd.read_sql(f"SELECT {', '.join(req_cols)} FROM {table_name}", db.engine)
|
||
- 風險: 攻擊者可透過惡意表格名稱執行任意 SQL 命令,竊取或刪除資料
|
||
- 修復: 使用參數化查詢,或建立白名單驗證表格/欄位名稱
|
||
|
||
26. [CRITICAL] 修復 SQL Injection 漏洞 #2:
|
||
- 檔案: database/manager.py (第 43, 52, 57 行)
|
||
- 問題: ALTER TABLE 語句使用字串插值組合 SQL
|
||
• session.execute(text(f"ALTER TABLE products ADD COLUMN updated_at TIMESTAMP DEFAULT '{now_str}'"))
|
||
- 風險: 若 now_str 包含單引號可導致 SQL injection
|
||
- 修復: 使用 SQLAlchemy 的 literal() 或驗證輸入格式
|
||
|
||
=== 高風險漏洞 (High - 本週內修復) ===
|
||
|
||
27. [HIGH] 強化登入驗證機制:
|
||
- 檔案: auth.py (第 30-41 行)
|
||
- 問題:
|
||
• 明文密碼比對 (input_password == LOGIN_PASSWORD)
|
||
• 無登入失敗次數限制
|
||
• 無帳號鎖定機制
|
||
• 使用簡單電話號碼作為密碼
|
||
- 風險: 易遭受暴力破解攻擊
|
||
- 修復:
|
||
1. 使用 werkzeug.security 的 generate_password_hash / check_password_hash
|
||
2. 實作登入失敗計數 (IP-based)
|
||
3. 5 次失敗後鎖定 5 分鐘
|
||
4. 要求更換為強密碼 (8+ 字元,含英數符號)
|
||
|
||
28. [HIGH] 加入 CSRF 防護:
|
||
- 檔案: app.py (多處 POST 路由)
|
||
- 問題: 所有 POST/PUT/DELETE 端點皆無 CSRF Token 驗證
|
||
- 風險: 攻擊者可偽造請求執行未授權操作 (如刪除資料、修改設定)
|
||
- 修復:
|
||
1. 安裝 Flask-WTF: pip install Flask-WTF
|
||
2. 在 app.py 設定 app.config['WTF_CSRF_ENABLED'] = True
|
||
3. 在所有表單加入 {{ csrf_token() }}
|
||
4. 為 AJAX 請求設定 X-CSRFToken header
|
||
|
||
29. [HIGH] 修復路徑遍歷漏洞:
|
||
- 檔案: app.py (第 2069-2070 行)
|
||
- 問題: 未驗證檔案路徑是否超出允許目錄
|
||
• potential_path = os.path.join(BASE_DIR, 'web/static/screenshots', filename)
|
||
- 風險: 攻擊者可使用 ../../../etc/passwd 存取系統檔案
|
||
- 修復: 使用 pathlib.Path.resolve() 確保路徑在合法目錄內
|
||
|
||
30. [HIGH] 檔案上傳驗證:
|
||
- 檔案: app.py (第 2406-2422 行)
|
||
- 問題: 上傳 Excel 檔案無驗證
|
||
• 未檢查副檔名
|
||
• 未檢查檔案大小
|
||
• 未驗證 MIME type
|
||
- 風險: 可上傳惡意檔案 (如 webshell, 病毒),或透過大檔案導致 DoS
|
||
- 修復:
|
||
1. 白名單副檔名: ['xlsx', 'xls', 'csv']
|
||
2. 限制檔案大小: 10MB
|
||
3. 使用 werkzeug.utils.secure_filename() 清理檔名
|
||
4. 驗證 MIME type
|
||
|
||
=== 中風險漏洞 (Medium - 本月內修復) ===
|
||
|
||
31. [MEDIUM] 缺少 HTTP 安全標頭:
|
||
- 檔案: app.py (全域)
|
||
- 問題: 未設定安全相關 HTTP headers
|
||
- 風險: 易受 XSS、點擊劫持、MIME type sniffing 攻擊
|
||
- 修復: 在 @app.after_request 加入以下 headers:
|
||
• X-Content-Type-Options: nosniff
|
||
• X-Frame-Options: DENY
|
||
• X-XSS-Protection: 1; mode=block
|
||
• Strict-Transport-Security: max-age=31536000
|
||
• Content-Security-Policy: default-src 'self'
|
||
|
||
32. [MEDIUM] Session 安全性不足:
|
||
- 檔案: auth.py (第 34 行)
|
||
- 問題: Session cookie 設定不安全
|
||
- 風險: Session 易被劫持或遭 CSRF 攻擊
|
||
- 修復: 在 app.py 設定:
|
||
• app.config['SESSION_COOKIE_SECURE'] = True # HTTPS only
|
||
• app.config['SESSION_COOKIE_HTTPONLY'] = True # 防 XSS
|
||
• app.config['SESSION_COOKIE_SAMESITE'] = 'Lax' # 防 CSRF
|
||
• app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=2)
|
||
|
||
33. [MEDIUM] 弱亂數產生器:
|
||
- 檔案: app.py (第 720 行)
|
||
- 問題: 使用時間戳生成 ID
|
||
• new_id = int(time.time() * 1000)
|
||
- 風險: ID 可預測,攻擊者可猜測其他資源 ID
|
||
- 修復: 使用 secrets.randbits(64) 產生密碼學安全的隨機數
|
||
|
||
34. [MEDIUM] 敏感資訊洩漏:
|
||
- 檔案: 多個日誌輸出
|
||
- 問題: 日誌可能記錄敏感資料 (密碼、Token、個資)
|
||
- 風險: 日誌檔若外洩會暴露機密資訊
|
||
- 修復:
|
||
1. 檢視所有 log.info / log.debug 輸出
|
||
2. 實作密碼遮罩函式 (顯示前 2 後 2 碼,中間用 * 遮蔽)
|
||
3. 避免記錄完整 Token 或信用卡資訊
|
||
|
||
35. [MEDIUM] SSRF / Open Redirect 風險:
|
||
- 檔案: app.py (第 756-778 行)
|
||
- 問題: 未驗證外部 URL 就發送請求
|
||
• response = requests.get(url, headers=headers, timeout=10)
|
||
- 風險: 攻擊者可探測內網服務或發動 SSRF 攻擊
|
||
- 修復:
|
||
1. 建立 URL 白名單或黑名單
|
||
2. 禁止存取私有 IP (127.0.0.1, 10.0.0.0/8, 192.168.0.0/16)
|
||
3. 使用 urllib.parse 驗證 URL 格式
|
||
|
||
36. [MEDIUM] 資源耗盡風險:
|
||
- 檔案: app.py (多處查詢)
|
||
- 問題:
|
||
• 查詢結果無分頁限制
|
||
• 無請求速率限制
|
||
• 檔案上傳無大小限制
|
||
- 風險: 攻擊者可發送大量請求或上傳大檔案導致服務中斷
|
||
- 修復:
|
||
1. 安裝 Flask-Limiter: pip install Flask-Limiter
|
||
2. 設定 API 速率限制 (如 100 requests/min)
|
||
3. 設定 app.config['MAX_CONTENT_LENGTH'] = 10 * 1024 * 1024 # 10MB
|
||
4. 資料庫查詢加入 LIMIT 與分頁
|
||
|
||
37. [MEDIUM] 缺少授權檢查:
|
||
- 檔案: app.py (多個路由)
|
||
- 問題: 部分路由未加 @login_required 裝飾器
|
||
- 風險: 未登入使用者可存取受保護功能
|
||
- 修復: 檢視所有路由,確保需要登入的端點都有 @login_required
|
||
|
||
=== 後續安全維護建議 ===
|
||
|
||
38. [建議] 定期安全掃描:
|
||
- 使用工具定期檢測漏洞:
|
||
• bandit (Python 程式碼安全掃描): pip install bandit && bandit -r .
|
||
• pip-audit (依賴套件漏洞掃描): pip install pip-audit && pip-audit
|
||
• semgrep (進階程式碼分析): https://semgrep.dev/
|
||
- 建議每月執行一次,或於部署前執行
|
||
|
||
39. [建議] 建立安全開發規範:
|
||
- 制定 secure coding guidelines 文件
|
||
- Code review 時檢查安全性
|
||
- 使用 pre-commit hooks 執行安全掃描
|
||
- 定期更新依賴套件至最新版本
|
||
|
||
40. [建議] 備份與災難復原計畫:
|
||
- 確保資料庫定期備份
|
||
- 建立系統還原 SOP
|
||
- 測試備份還原流程
|
||
- 考慮實作異地備份
|
||
|
||
================================================================================
|
||
【業績分析儀表板邏輯定義 (2026-01-15 修復確認)】
|
||
================================================================================
|
||
所有後續開發與維護,必須嚴格遵守以下邏輯與定義:
|
||
|
||
1. 數據聚合維度 (Aggregation Granularity):
|
||
- Dashboard Top 3 卡片:
|
||
* 聚合鍵: `[商品ID, 商品名稱]` (不可僅用名稱,避免同名不同規商品混淆)。
|
||
* 顯示名稱: 僅顯示 `商品名稱` (前端截斷)。
|
||
* 目的: 確保卡片數值與詳細列表中的單品數值完全一致。
|
||
- 詳細列表 (Modal):
|
||
* 聚合鍵: `[商品ID, 商品名稱, 品牌, 廠商名稱, 商品館(分類)]`。
|
||
* 目的: 提供最完整的商品細節。
|
||
|
||
2. 利潤計算邏輯 (Profit Logic):
|
||
- 通用公式:
|
||
* 若資料源存在「利潤」欄位 (`col_profit`): 優先使用 `SUM(col_profit)`。
|
||
* 若無: 使用 `SUM(總業績) - SUM(總成本)`。
|
||
- 應用範圍:
|
||
* 所有 KPI 卡片 (利潤、毛利率)。
|
||
* 所有圖表 (BCG 矩陣)。
|
||
* 詳細列表 SQL 查詢。
|
||
* Excel 匯出功能。
|
||
|
||
3. 欄位映射與動態性 (Dynamic Column Mapping):
|
||
- 機制: 必須優先從 `_SALES_PROCESSED_CACHE` 讀取 `cols_map`。
|
||
- 禁止行為: 嚴禁在 SQL 查詢中硬編碼中文欄位名稱 (如 "商品館", "品牌", "總業績")。
|
||
- 變數使用: 必須使用變數 (如 `col_category`, `col_amount`) 構建 SQL。
|
||
|
||
4. 篩選連動性 (Filter Consistency):
|
||
- 全域連動: 任何全域篩選條件 (日期、分類、品牌、廠商、價格區間、毛利區間、關鍵字) 必須同時作用於:
|
||
* 主畫面所有圖表 (趨勢圖、圓餅圖、長條圖)。
|
||
* Top 3 商業洞察卡片。
|
||
* 點擊卡片後的詳細列表 (Modal)。
|
||
* 詳細列表的 Excel 匯出。
|
||
|
||
================================================================================
|
||
【V10.490 OpenClaw 舊策略 Action 相容修補】
|
||
================================================================================
|
||
2026-05-31:
|
||
- 正式日誌觀察到 ElephantAlpha 執行器收到 `agent=openclaw action=generate_market_strategy` 時,被誤判為未知步驟。
|
||
- 本次修補將 `generate_market_strategy` 納入既有 OpenClaw advisory no-op 清單,與 `generate_resource_optimization_strategy` 一致:
|
||
* 只記錄 skipped warning
|
||
* 不觸發 circuit breaker
|
||
* 不執行外部策略動作
|
||
* 不變更任何價格或正式候選資料
|
||
- 已補測試:舊策略 action 可安全跳過,未知 action 仍維持 fail-fast。
|