OoO
2b218589bd
ci(cd): 自動 apply pending migrations + paths trigger 補 migrations/**
...
CD Pipeline / deploy (push) Successful in 3m23s
- paths trigger 加 migrations/** → DB schema 變更自動觸發 CD
- 新增「套用待跑 migration」step → CD 自動跑 git diff HEAD~1 範圍內的 SQL
- 026 含 CONCURRENTLY 不包 -1 transaction(critic-A11 B2 修補一致)
- 失敗只 warn 不中斷 deploy(migrations 設計為 IF NOT EXISTS / WHERE NOT EXISTS 冪等)
merge 後第一次部署即會自動 apply migrations 024/025/026,
無需統帥 SSH 188 跑 psql。
Operation Ollama-First v5.0 / Phase 6 收尾 / CD 自動化補洞
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 23:12:20 +08:00
OoO
3ea7004a6f
refactor(p4)+docs(p5+p6): Meta 降頻 + LOCKED-GEMINI + ADR-028/029
...
Phase 4 A10 — OpenClaw 雙塔重劃
- run_scheduler.py: Meta 自審 cron 6h → 每日 12:00(月省 2.25M Gemini, +20% 達標)
- scheduler.py: 移除 icaim 內 2 處 inline meta 觸發
- openclaw_strategist 抽 _push_report_with_charts (call×3) + _collect_mcp_intel (call×2)
- 行數目標 -25% 未達(4 報告函數結構差異大,A10 採保守抽出避險)
- 主戰果:Meta 降頻月呼叫 300 → 30(-90%)
Phase 5 — 5 處 LOCKED-GEMINI 註解(涵蓋鎖定 7 場景)
- services/mcp_collector_service.py:32 (場景 #1 : Google Search Grounding)
- services/openclaw_strategist_service.py:40 (場景 #2/3/4: 週/月/年報)
- services/code_review_pipeline_service.py:46 (場景 #5 : 100K+ token diff)
- services/elephant_alpha_orchestrator.py:88 (場景 #6 : EA HITL)
- routes/openclaw_bot_routes.py:98 (場景 #7 : PPT 簡報)
Phase 6 A12 — 憲法級 ADR 三份
- ADR-028「LLM 路由統一準則」(269 行)
- 5 大支柱:三主機級聯 / Ollama 優先 / 雙塔分工 / Gemini 鎖 7 場景 / 可觀測性
- 8 個 provider 白名單(DB CHECK 對齊)
- 30+ caller 名單分「已實作 / 規劃中」
- ADR-029「Hermes-First 雙塔分工」(222 行)
- 12 項職責重劃表 + A7/A8/A10 落地對照
- Gemini 月支出 -23.5%(critic 第 3 輪 B5 算術修正)
- ADR-027 附錄(+69 行)
- 三主機架構(Primary/Secondary/Fallback)
- 4 條獨立 fallback 鏈
- 廢止「188 Ollama」概念
- README 索引更新
A11 critic 第 3 輪修補:5 BLOCKER 全清
- B1: 行數 1831 → 2677 (含 baseline 對照)
- B2: 場景 #4 行號 759/1267 → 1102/1628 + annual 不存在註明
- B3: 虛構 caller 改實存(ea_hitl_prefetch → ea_engine 等)
- B4: 白名單三層對齊(DB 8 = ADR 8 = token_report 補 ollama_secondary)
- B5: KPI 算術 50→38 = -23.5% 重核
services/telegram_templates.py: A5 daily_token_report() 函數
services/mcp_collector_service.py: 加 LOCKED-GEMINI 註解
services/elephant_alpha_orchestrator.py: 加 LOCKED-GEMINI 註解
103/103 unit test 全綠(zero regression)
Operation Ollama-First v5.0 / Phase 4 A10 + Phase 5 + Phase 6 A12
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 23:06:08 +08:00
OoO
838267c293
feat(p1+p3): logger 接 13 caller + Q&A/Nemotron/日報 feature flag 灰度
...
Phase 1 A4 — 13 個呼叫點接 ai_call_logger(覆蓋率 11.8% → 預估 50%+)
- TOP-1 nemoton_dispatcher: nemotron_dispatch caller (NIM 配額追蹤)
- TOP-2 openclaw_strategist: 4 reports (daily/weekly/monthly/meta) + qa caller
- TOP-3 hermes_analyst: hermes_analyst + hermes_intent (順修 commit 00591c5 殘留 bug)
- TOP-4 code_review_pipeline: code_review_hermes/openclaw/elephant 三鏈 (request_id 串)
- TOP-5 openclaw_bot_routes: openclaw_bot_main/gemini/nim 三層 fallback
Phase 3 A7 — OpenClaw Q&A → qwen3:14b(feature flag OFF)
- OPENCLAW_QA_OLLAMA_FIRST 灰度開關
- 繁中強制 system prompt + Gemini fallback chain
- _is_low_quality_response 品質守門(簡體字檢測 + 拒答訊號 + 結構分數)
- 黃金集 A/B 對照測試框架(10 樣本去 PII)
Phase 3 A8 — OpenClaw 日報 → Hermes 模板(feature flag OFF)
- OPENCLAW_DAILY_HERMES_TEMPLATE 灰度開關
- _compute_daily_kpi 純 SQL + Hermes 規則引擎
- _compute_gemini_insight 精簡 200 字洞察 prompt
- templates/daily_report_v2.j2 + _SafeUndefined 缺欄位優雅降級
- scripts/compare_daily_report_versions.py 雙版本盲測
Phase 3 A9 — Nemotron NIM → qwen3:14b(feature flag OFF)
- NEMOTRON_OLLAMA_FIRST 灰度開關(A2 紅燈:deepseek-r1 假支援,改 qwen3)
- _call_qwen3_dispatch + 既有 NIM tool_calls 解析共用
- 保留 ADR-004「🟡 [降級模式]」Hermes 規則引擎兜底
H6 PII fix — chat_id 進 ai_calls.meta 改 SHA1[:8](4 處 Bot Q&A)
Code Review pipeline — N3 動態 provider tag(gcp/secondary/111)+ A4 logger 三鏈
37 unit tests 全綠(routing 15 + golden 5 + qwen3 8 + daily template 8 + nemotron 1)
Operation Ollama-First v5.0 / Phase 1 A4 + Phase 3 A7+A8+A9
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 23:05:38 +08:00
OoO
078bf2683c
fix(adr-027): Phase 2 — ADR-027 4 破洞修補 + 移除寫死 111
...
config.py — B1+B2 lazy resolve
- get_ollama_host() 取代 import-time freeze 的 OLLAMA_HOST
- get_embedding_host() 取代 EMBEDDING_HOST
- 主機切換時不需重啟 Python 進程
services/ollama_service.py — B3+B4 三主機級聯
- resolve_ollama_host(primary, secondary, fallback) 三主機級聯
- Primary: 34.143.170.20 (SSD) — GCP 主主機
- Secondary: 34.21.145.224 (SSD) — 同等效能備援
- Fallback: 192.168.0.111 (HDD) — 最後一道防線
- _is_reachable: HTTP /api/version probe 取代 TCP socket(防 process 卡死假活)
- mark_unhealthy(host) 即時失效 cache,30s 內跳過該主機
- 14 unit tests 全綠
services/aider_heal_executor.py — N2
- 移除寫死 192.168.0.111,改用 get_ollama_host()
- AiderHeal 終於遵循 ADR-027 GCP 優先策略
Operation Ollama-First v5.0 / Phase 2 A6
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 23:05:11 +08:00
OoO
bb891f1a6e
feat(observability): ai_call_logger + 23:55 Telegram token 日報
...
services/ai_call_logger.py(300 行)— 統一 LLM 遙測層
- context manager log_ai_call() / decorator logged_ai_call()
- async fire-and-forget 寫 ai_calls,DB 失敗永不影響主流程
- kill-switch:連續 10 次失敗自動降級為 logger.info
- env AI_CALL_LOGGING_ENABLED=false 一鍵關閉
- COST_TABLE 集中 13 個模型計費(gemini/claude/nim/ollama)
- PII 保護:meta 只存 prompt_hash[:12],不存原文
- 22 unit tests 全綠
services/token_report_service.py(580 行)— 6 段落每日 23:55 日報
- Section 1-6: 總覽 / 供應商分布 / TOP10 caller / 成本預算 / 趨勢 / 告警建議
- 7 條告警規則 + Hermes 規則引擎智能建議
- HTML escape + 4096 字元雙保險
- Telegram 失敗 fallback 訊息
- ai_insights 寫入 PII safe(無 chat_id/username 落地)
- 30 unit tests 全綠
A11 critic 護欄:H6 chat_id PII fix(services/openclaw_bot_routes 4 處 → SHA1[:8])
Operation Ollama-First v5.0 / Phase 1 A4+A5
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 23:04:58 +08:00
OoO
4648673423
db(p1): ai_calls/mcp_calls/budgets schema + bge-m3 signature
...
migrations 024/025/026 — 統一 LLM 遙測 + 預算告警 + RAG 一致性護欄
- 024: ai_calls 表 + 5 索引 + 6 CHECK constraint(H1/H2/M3/L3)
- 025: mcp_calls + ai_call_budgets + 10 種子預算(含 ollama_secondary)
- 026: ai_insights.embedding_signature + pgcrypto + CONCURRENTLY index
A11 critic 三輪審查記錄完整保留:
- Phase 1 schema review: 2 BLOCKER + 4 HIGH + 6 MEDIUM 全處理
- Phase 1 final sign-off: 0 BLOCKER + 2 HIGH + 4 MEDIUM
- Phase 6 ADR review: 5 BLOCKER + 6 HIGH 全修
Operation Ollama-First v5.0 / Phase 0+1+6 護欄
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 23:04:42 +08:00
OoO
15800a29ac
[V-New] Ollama 主機切換:GCP 優先 / 111 自動備援架構 | services/ollama_service.py, docker-compose.yml
CD Pipeline / deploy (push) Successful in 12m19s
2026-05-03 16:03:00 +08:00
OoO
2f5666be08
feat(import): drive staleness gate active alert when DB stale >=3d (critic-approved)
...
Root cause (debugger 2026-05-02):
- drive_service.move_file 把 import 完的 Excel 搬到「已匯入」 → 工作夾空
- auto_import_from_drive 每 30 分跑一次 list 回空 → 走 line 671-677
silent return {success:True, file_count:0} → daily_sales_snapshot
自 4/27 12:54 後停更 8 天無任何告警
Patch:
Drive 空時加 staleness gate:查 DB MAX(snapshot_date),若距今 >=3 天
即呼叫既有 _send_data_stale_alert(commit dda0a06)發 Telegram 主動催促 BU 上傳。
critic 5 點修訂全照做:
1. session 自管:from database.manager import get_session + try/finally close
(此區段原本沒有 session 變數,在 line 708 才開)
2. 閾值 >=3 天:跨週末跨假期不上傳是常態,避免誤觸
3. 沿用 _send_data_stale_alert 既有 3 字串參數,不客製文案
4. dedupe key = 'upstream_drive':與下游 daily_report/weekly_strategy/
monthly_report 區隔,未來 ai_insights 查詢不混淆告警源
5. logger.error + exc_info=True:staleness 邏輯吞 try/except 不影響主流程
return success,但留 traceback 可觀測
Regression check:
- openclaw_strategist_service 不 import import_service → 無循環 import
- import path 'database.manager' 與 openclaw 既有用法一致(line 31)
- 找到檔案分支完全未動,主流程行為不變
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 13:10:55 +08:00
OoO
8b76e3872f
feat(ppt): competitor v4 — 5-forces strategic analysis (Wave 4 partial)
...
CD Pipeline / deploy (push) Successful in 2m49s
Wave 4 部分完成:competitor v4 五力升級(戰略視角)
generate_competitor_v4_ppt — 7 頁
- P1 封面:含整體領先/勢均力敵/落後徽章 + 三句話戰略指引
- P2 五力雷達圖(matplotlib polar)+ 右側 6 維度分數明細表(含雙條視覺化)
- P3 商品力 + 價格力(雙卡)
- P4 行銷力 + 服務力(雙卡)
- P5 品牌力 + 財務力(雙卡含 momo 8454/PChome 8044/蝦皮 SE/酷澎基本面)
- P6 AI 戰略整合(差異化建議)
- P7 附錄
新增 helper:_mpl_radar_png()
- matplotlib polar projection 五力雷達
- momo 焦糖橘 + 競品蜂蜜金
- 0-10 分尺度,含格線/標籤/圖例
query_competitor_5forces — 半實作
- 商品力:momo SKU 數從 DB 算 / 競品靜態 fallback
- 價格力:靜態(待擴 competitor_price_history 整合)
- 行銷力 / 服務力:靜態知識(電視購物頻道 / 24h 物流 / 訂閱制)
- 品牌力:靜態 + 預留 mcp_collector 整合空間
- 財務力:上市公司公開資訊(momo 8454 富邦集團、PChome 8044、SEA、酷澎)
每個維度自動算 momo - 競品差異 → 識別最大優勢力與最大劣勢力
_ppt_ai_analysis 加 is_5forces 分支
- 角色:BCG/麥肯錫資深戰略顧問
- 結構:整體競爭態勢 / 優勢加碼 / 劣勢補強或避戰 / SMART 三層 / 競爭風險
- max_tokens 2400
路由:
- /ppt competitor_v4 vs PChome(預設)
- /ppt competitor_v4 蝦皮 vs 蝦皮
- /ppt competitor_v4 酷澎 vs 酷澎
Telegram 按鈕:「⚔️ 競業五力 v4」
bump TEMPLATE_VERSIONS['competitor_v4'] = v4.0.0(新類型獨立版本)
簡化限制:商品力/價格力/品牌力的競品具體數據需後續擴 mcp_collector
(PChome SKU API、Dcard 品牌討論度量化等),靜態 fallback 已維持結構完整性
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 13:10:15 +08:00
OoO
ce270edc5d
docs(adr): ADR-026 PPT price_elasticity + complete v3 campaign roadmap
...
收尾 v3 PPT 戰役(ADR-022~026 共 5 份 ADR):
完成總計:
- 18 commits(38967ce → 16b169d)
- 16 種有效 PPT 報表
- 2 種 DEPRECATED(bcg / growth)
- 5 ADR 涵蓋完整戰役決策
報表角色覆蓋:
- 戰情/早會:daily / weekly
- BU 主管:monthly / quarterly / half_yearly / forecast / strategy
- CEO/CFO:annual / ttm / market_intel
- 採購/PM:vendor / category / new_product / price_elasticity
- 行銷:promo / promo_compare / customer / market_intel
- 競品:competitor
Wave 4 待辦(受資料層 / 外部整合限制):
- clv (需 user_id 會員系統)
- competitor v4 五力(需外部 SKU/品牌力資料整合)
- inventory / operations / finance(需新 DB schema)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 12:50:25 +08:00
OoO
16b169d3ee
feat(ppt): price_elasticity sweet spot report v3.1.0 (simplified)
...
CD Pipeline / deploy (push) Successful in 2m56s
Wave 3.3:價格彈性簡化版(採購/PM 定價策略用)
generate_price_elasticity_ppt — 7 頁
- P1 封面:含集中度徽章(過度集中/主流明確/分布健康)+ 三句話結論
- P2 KPI:SKU 數/總訂單/甜蜜點價位/甜蜜點 SKU 數
- P3 各價位桶訂單分布橫條(找甜蜜點,焦糖橘=最高訂單桶)
- P4 各價位桶業績分布橫條(評估高價帶健康度,業界基準 30-50%)
- P5 甜蜜點 TOP 5 SKU(明星價位代表商品,新品設計參考)
- P6 AI 採購策略洞察
- P7 附錄
query_price_elasticity(category, days)
- 對 SKU 算平均售價(總業績 / 數量)
- 7 個價位桶分組(< 200 / 200-500 / 500-1K / 1K-2K / 2K-5K / 5K-10K / > 10K)
- 識別「訂單數最多」的桶 = 價格甜蜜點
- 計算高價帶(>NT$2K)業績佔比(業界基準健康 30-50%)
- 選 sweet_spot 桶內 TOP 5 SKU 作為代表
簡化版限制(為後續 ADR 註明):
- 非完整 price_elasticity(需要時間序列定價變化資料)
- 但能展示「該品類消費者最買單的價位帶」這個關鍵採購洞察
_ppt_ai_analysis 加 is_price_elast 分支
- 角色:採購主管 + PM
- 結構:甜蜜點解讀 / 高低價帶結構 / SMART 三層 / 風險預警
- 含「斷層補強」概念(識別 SKU 數明顯偏少的價位區間)
- max_tokens 1700
路由:
- /ppt price_elasticity 全平台 90 天
- /ppt price_elasticity 美妝保養 單品類 90 天
- /ppt price_elasticity 美妝保養 30 自訂天數
Telegram 按鈕:「💰 價格彈性報告」
bump TEMPLATE_VERSIONS['price_elasticity'] = v3.1.0
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 12:48:15 +08:00
OoO
9862edeb44
docs(adr): ADR-025 PPT Wave 3 (new_product + market_intel_weekly)
...
Wave 3 完成 2 種橫向資訊整合型報表:
- new_product (95a74c3 ) — 30 天追蹤,PostgreSQL CTE 識別新品
- market_intel_weekly (fe3cba8 ) — 8 個外部 API 彙整,fail-safe 設計
累計報表清單:13 種有效 + 2 種 DEPRECATED + 4 種待資料層支援。
Wave 3 餘項(受資料層限制):
- clv (需 user_id)
- price_elasticity (需長期定價歷史)
- competitor v4 五力 (需外部 SKU/品牌力資料)
Wave 4 待辦(依資料層 schema):
- inventory / operations / finance
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 12:41:12 +08:00
OoO
fe3cba8496
feat(ppt): market_intel_weekly external signal aggregation v3.1.0
...
CD Pipeline / deploy (push) Successful in 3m6s
Wave 3.2:市場情報週報 — 把 mcp_collector 所有外部 API 彙整成一份內部簡報。
generate_market_intel_weekly_ppt — 7 頁
- P1 封面:本週重點/市場機會/風險警訊三句話(從 AI 自動抽)
- P2 節慶日曆 + 季節情境(雙卡)
- P3 電商新聞 + Google 熱搜(雙卡)
- P4 Dcard 口碑 + YouTube 爆紅(雙卡)
- P5 天氣 + 匯率(雙卡,影響消費行為)
- P6 AI 整合洞察與行動建議
- P7 附錄
外部資料來源(mcp_collector_service / mcp_context_service):
- mcp_collector.get_holiday_context() 節慶日曆(靜態)
- mcp_collector.get_seasonal_context() 季節情境(靜態)
- get_ecommerce_news() 電商產業新聞(Gemini Grounding)
- get_taiwan_trends() Google 台灣熱搜
- get_dcard_trends() Dcard 熱門討論
- get_youtube_trending() YouTube 爆紅商品
- get_taiwan_weather() 台灣天氣
- get_twbank_exchange_rates() 台幣匯率
每個外部 API 用 _safe() wrapper,失敗時填預設文字「(本次擷取失敗或無資料)」。
_ppt_ai_analysis 加 is_market_intel 分支
- 角色:行銷情報分析師 + BU 主管
- 結構:本週市場大事 / 消費者情緒口碑 / 競爭態勢差異化 / SMART 三層 /
外部風險預警
- max_tokens 2000
路由:
- /ppt market_intel 本週情報週報(自動對齊週一)
Telegram 按鈕:「🌐 市場情報週報」
bump TEMPLATE_VERSIONS['market_intel'] = v3.1.0
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 12:39:57 +08:00
OoO
95a74c3502
feat(ppt): new_product 30-day tracking report v3.1.0
...
CD Pipeline / deploy (push) Successful in 2m35s
Wave 3.1:新品追蹤報告(PM/採購用)
generate_new_product_ppt — 9 頁
- P1 封面:含新品力徽章(強勁/穩健/偏弱/疲弱,依業績佔比)+ 三亮點
- P2 KPI:新品總數/業績/佔比/平均單品業績 + AI 解讀
- P3 新品整體日業績曲線(爬榜軌跡 matplotlib)
- P4 新品依品類分佈橫條
- P5-P7 新品 TOP 50(自動分頁)
- P8 AI PM 戰術洞察
- P9 附錄
query_new_products(days_recent=30, days_baseline=60)
- PostgreSQL CTE:recent EXCEPT early
recent = 近 30 天有銷售
early = 31-90 天前有銷售
- 自動回傳:新品 TOP 50 / 子品類分佈 / 日業績曲線
- 含 ANY array 查詢新品集合的整體日業績
_ppt_ai_analysis 加 is_new_prod 分支
- 角色:PM 商品經理 + 採購主管
- 結構:新品力評估 / 明星新品識別 / 品類分佈與機會 / SMART 三層 / 風險預警
- SMART 行動含:加碼 TOP3 / 觀察排名 11-30 / 數據追蹤
- max_tokens 1800
業界基準:新品業績佔比 5-10% 為健康,>8% 強勁,<3% 偏弱
路由:
- /ppt new_product 預設近 30 天
- /ppt new_product 14 自訂追蹤天數
Telegram 按鈕:「🆕 新品 30 天追蹤」
bump TEMPLATE_VERSIONS['new_product'] = v3.1.0
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 12:37:06 +08:00
OoO
af6157f8ba
docs(adr): ADR-024 PPT Wave 2 (forecast + promo_compare) + deprecate bcg/growth
...
CD Pipeline / deploy (push) Successful in 2m41s
Wave 2 完成 2 種新報表:
- forecast_pre_event (9f04dc3 ) — 檔期前 14 天備戰策略 (BU 主管用)
- promo_compare (958f705 ) — 多活動 ROI 並排比較 (行銷主管覆盤)
正式廢除(DEPRECATED 標記,函式保留作 internal helper):
- bcg — 與 strategy 報表功能重疊(strategy 已含 BCG 五級分類)
- growth — 已被 quarterly + half_yearly + annual + ttm 完全取代
報表體系現況:16 種有效(v3 重做 6 + Wave 1 新增 8 + Wave 2 新增 2)+ 2 種
DEPRECATED;4 種角色覆蓋(採購/PM/行銷/CFO/CEO)。
forecast 核心:baseline 日均 × 21 天 × lift_factor,含 8 種檔期靜態知識
(雙11 1.65× / 母親節 1.40× 等),封面倒數天數徽章自動切換。
promo_compare 核心:N 場活動並排 KPI 表 + 拉抬 % 排序橫條 + 4 排名亮點
(最高拉抬/最低拉抬/最佳毛利/最高業績)。
Wave 3 待辦:market_intel_weekly / new_product / clv / price_elasticity
Wave 4 待辦:inventory / operations / finance(依資料層)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 12:30:35 +08:00
OoO
dda0a06bfd
fix(strategist): cast metadata_json text to jsonb for stale alert dedupe
...
critic post-review #1 (HIGH): `_send_data_stale_alert` 的 dedupe SQL 對
`ai_insights.metadata_json` (Column(Text)) 直接套用 `->>` operator,PG 會
raise `operator does not exist: text ->> unknown`,被外層 try/except 吞掉,
導致 dedupe 完全失效,daily/weekly/monthly 同日 stale 會送 2-3 次告警噪音。
修法:`metadata_json::jsonb->>'report_type'` 即時 cast Text→JSONB 再取 key
(寫入端用 json.dumps,內容為合法 JSON)。
影響:
- 僅修 services/openclaw_strategist_service.py:353 一行
- grep 確認全 repo 僅此一處 `metadata_json->>` 用法
- 不動 dedupe 視窗 / telegram 發送 / _save_to_ai_insights
- 不動 tests / requirements.txt / 其他檔案
Regression:cast 每次 stale 告警跑一次,效能影響可忽略;若歷史 row
metadata_json 內容非合法 JSON,cast 會 raise 並被 try/except 吞掉,
行為退回現狀(dedupe 失效,但不影響告警送出)。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 12:29:22 +08:00
OoO
958f705c8e
feat(ppt): promo_compare multi-promo ROI report v3.1.0
...
CD Pipeline / deploy (push) Has been cancelled
Wave 2.2:N 場促銷活動橫向比較(行銷主管覆盤用)。
generate_promo_compare_ppt — 5 頁
- P1 封面:含活動數徽章 + 排名亮點(最高拉抬/最低拉抬/最佳毛利)
- P2 並排 KPI 表:8 欄(活動/期間/天數/業績/訂單/毛利/業績拉抬/訂單拉抬)
支援 14 場以下並排顯示
- P3 業績拉抬橫條圖(matplotlib,按拉抬 % 排序)
- P4 AI 跨活動洞察(成功要素 / 失敗診斷 / SMART 三層)
- P5 附錄
路由:
- /ppt promo_compare 母親節:2026/05/05-2026/05/14|520:2026/05/18-2026/05/22|618:2026/06/14-2026/06/22
每場活動透過 query_promo_comparison 取 ROI 數據,自動產生 4 個排名。
_ppt_ai_analysis 加 is_promo_cmp 分支
- 角色:資深行銷主管
- 結構:整體比較 / 勝出活動成功要素 / 失敗活動診斷 / SMART 三層
- max_tokens 1600
Telegram 按鈕:「🆚 多活動比較」(await:promo_compare)
bump TEMPLATE_VERSIONS['promo_compare'] = v3.1.0
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 12:28:17 +08:00
OoO
9f04dc3951
feat(ppt): forecast_pre_event report v3.1.0 (BU pre-event battle plan)
...
CD Pipeline / deploy (push) Has been cancelled
Wave 2.1:檔期前瞻報告 — 給 BU 主管在檔期前 14 天決定備戰策略。
generate_forecast_pre_event_ppt — 7 頁
- P1 封面:含倒數天數徽章(備戰期/衝刺期/檔期中/已結束)+ 三段預期業績
- P2 KPI 三段對比:本期預期 / 去年同檔期 / Baseline 日均 / 已執行業績
- P3 去年同檔期業績曲線(matplotlib 折線,預測基準視覺化)
- P4 庫存盤點 TOP 30(基於 baseline 期銷量)
- P5 AI 戰術洞察
- P6 附錄
query_forecast_pre_event(event_name, event_date)
- baseline 期:檔期前 60-30 天(去除檔期前期效應)
- 去年同檔期:去年同日期 ± 7 天
- 本期準備窗口:檔期前 14 天到檔期後 7 天
- 預期業績 = baseline 日均 × 21 天 × lift_factor
- lift_factor 靜態知識(母親節 1.40 / 618 1.45 / 雙11 1.65 / 黑五 1.45 等)
_ppt_ai_analysis 加 is_forecast 分支
- 角色:BU 主管 + 行銷投放主管 + 採購三合一
- 結構:檔期定位 / 準備窗口進度 / 庫存戰術 / 廣告滿額門檻 /
SMART 三層(檔期前7/當日+3/檔期後7)/ 風險預警
- max_tokens 2000
路由:
- /ppt forecast 母親節 2026/05/12
- /ppt forecast 618 2026/06/18
Telegram 按鈕:「🎯 檔期前瞻報告」(await:forecast_event)
bump TEMPLATE_VERSIONS['forecast_pre_event'] = v3.1.0
煙霧測試:7 頁 140KB 全綠。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 12:25:42 +08:00
OoO
5461c92cf8
docs(adr): ADR-023 PPT system Wave 1 expansion (4 commits, 8 new types)
...
紀錄 Wave 1 擴展戰役:從 6 種 PPT 報表擴展到 14 種。
新增報表類型:
- vendor (b6fdb4f ) — 採購主管視角,集中度警示 + 議價優先
- quarterly / half_yearly / annual / ttm (1af96f5 ) — period_review 共用
generator 一份解 4 種,省 60% 程式碼
- category (d8260fc ) — PM/採購視角,90 天縱向 + 子品類 + CTE 新進榜
- customer (48e3dac ) — 行銷主管簡化 RFM,受限於無 user_id 做訂單級
技術亮點:
- 共用 Generator 模式(period_review 解 4 種)
- 期間徽章自動切換
- PostgreSQL CTE 做新進榜判定(recent EXCEPT early)
- 限制聲明的誠實設計(customer 無 user_id 註腳)
Wave 2-4 待辦清單見 ADR 內文。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 02:20:05 +08:00
OoO
48e3dacfc9
feat(ppt): customer analytics report v3.1.0 (simplified RFM, no user_id)
...
CD Pipeline / deploy (push) Successful in 2m49s
Wave 1.4:客戶/訂單分析報告(行銷主管用)— 受限於資料層無 user_id,
做訂單級分析而非完整 RFM。
generate_customer_analytics_ppt — 7 頁
- P1 封面:含客單定位徽章(高/中/低)+ 限制聲明(無 user_id 註腳)
- P2 KPI:總訂單/總業績/平均客單/高客單訂單數
- P3 客單價分佈:6 級分桶橫條(< NT$500 / 500-1K / 1-2K / 2-5K / 5-10K / >10K)
- P4 消費星期分佈:matplotlib 橫條(找熱門時段)
- P5 商品復購排行 TOP 30:同商品在多筆獨立訂單中的次數
- P6 AI 行銷洞察
- P7 附錄
query_customer_analytics
- AOV 分桶(CASE WHEN bucket)
- DOW 星期聚合(PostgreSQL EXTRACT(DOW))
- 復購商品(GROUP BY 商品名稱 HAVING COUNT(訂單) >= 5)
_ppt_ai_analysis 加 is_customer 分支
- 角色:資深行銷主管(10 年 RFM/CRM 經驗)
- 結構:訂單規模解讀 / 消費熱點 / 商品復購信號 / SMART 三層
- 長期建議:建立會員系統取得 user_id 升級完整 RFM
路由:
- /ppt customer 預設近 30 天
- /ppt customer 2026/04 指定月份
Telegram 按鈕:「👥 客戶/訂單分析」
bump TEMPLATE_VERSIONS['customer'] = v3.1.0
煙霧測試:7 頁 100KB 全綠。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 02:17:48 +08:00
OoO
d8260fcd25
feat(ppt): category deep dive report v3.1.0 (90-day single category)
...
CD Pipeline / deploy (push) Successful in 3m31s
Wave 1.3:單一品類 90 天縱向深度分析(PM/採購用)。
generate_category_deep_ppt(services/ppt_generator.py)— 12 頁
- P1 封面:含品類定位徽章(主力/成長/長尾)+ 新進榜商品 hero box
- P2 執行摘要:4 KPI(業績/訂單/毛利/SKU 數)+ AI 高階解讀
- P3 90 天日業績走勢(matplotlib 折線 + 日均線 + 高低點)+ 結論帶
- P4 子品類結構:橫條 + 帕雷托雙視圖
- P5-P7 TOP 50 商品(自動分頁)
- P8 TOP 30 廠商
- P9 新進榜商品專頁(近 30 天進榜,過去 60 天無交易判定)
- P10 AI 採購/PM 視角洞察
- P11 附錄
query_category_deep(routes/openclaw_bot_routes.py)
- 一次拉齊:kpis / daily(逐日) / top_products(50) / top_vendors(30) /
sub_categories(L2) / new_products(近 30 天 vs 60 天前比對)
- 用 PostgreSQL CTE 做新進榜判定(recent EXCEPT early)
_ppt_ai_analysis 加 is_category 分支
- 角色:採購主管 + PM 商品經理
- 結構:品類整體 / 90 天趨勢 / 子品類結構 / SKU 與廠商組合 /
SMART 三層 / 風險預警
- max_tokens 1800
路由:
- /ppt category 美妝保養 90 天深度(預設)
- /ppt category 美妝保養 30 自訂期間
Telegram 按鈕:「🗂 品類深度報告」(await:category_deep)
TODO:實作 await:category_deep 對應品類選擇互動(下一波)
bump TEMPLATE_VERSIONS['category'] = v3.1.0
煙霧測試:12 頁 300KB 全綠。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 02:14:07 +08:00
OoO
1af96f5be4
feat(ppt): period_review unified generator for quarterly/half/annual/ttm
...
CD Pipeline / deploy (push) Successful in 3m37s
Wave 1.2:用一份 generator 解 4 種時間維度報表(季/半年/年/TTM)。
generate_period_review_ppt(services/ppt_generator.py)— 12 頁
- 期間類型徽章自動切換(季報/半年報/年報/TTM 滾動)
- P1 封面:含業績狀態徽章 + elevator pitch + 期間動能
- P2 執行摘要:KPI v2 含 △% (vs 上季/上半/去年) + AI 解讀 + YoY 對比帶
- P3 月度業績走勢(matplotlib 折線:本期 + 上期 + 月均線 + 高低點)+ 4 卡指標
- P4 品類分析:橫條 + 帕雷托雙視圖
- P5-P7 TOP 50 商品(自動分頁)
- P8 TOP 30 廠商
- P9 MCP 市場情報
- P10 AI 結構化洞察
- P11 附錄
query_period_summary(routes/openclaw_bot_routes.py)
- 一次拉齊:kpis / monthly_breakdown / top_products(50) / top_categories(8) /
top_vendors(30)
- 自動算月度聚合(PostgreSQL TO_CHAR)
路由層加 4 種 sub_type 分支:
- /ppt quarterly [YYYY/Q1-4] 當季或指定季
- /ppt half_yearly [YYYY/H1-2] 當半年或指定半年
- /ppt annual [YYYY] 當年或指定年
- /ppt ttm 最近 12 個月(自動算到本月底)
每種自動抓三段資料:本期 + 上期同等 + 去年同期
- quarterly: 上季 + 去年同季
- half_yearly: 上半年 + 去年同半年
- annual: 去年 + 前年
- ttm: 上一個 TTM (24-12 月前) + 同上
_ppt_ai_analysis 加 is_period 分支
- 角色:策略顧問 + BU 主管 + CFO 三合一視角
- 結構:整體解讀 / 市場趨勢對位 / 月度走勢分析 / 品類結構 / 戰略級 SMART /
風險預警
- SMART 行動分三層:下期立即啟動(30 天)/ 下期戰略(60-90 天)/
下下期預備(6-12 月)
- max_tokens 2600,字數 1000-1300
Telegram 按鈕:報表選單加 4 顆季/半/年/TTM 按鈕
bump TEMPLATE_VERSIONS:quarterly / half_yearly / annual / ttm 全 v3.1.0
煙霧測試:4 種全綠,每份 12 頁 220KB。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 02:10:14 +08:00
OoO
b6fdb4f473
feat(ppt): awaken vendor report + v3.1.0 procurement strategy upgrade
...
CD Pipeline / deploy (push) Successful in 2m32s
Wave 1.1:把沉睡的 vendor generator 喚醒並全面升 v3.1.0:
generate_vendor_ppt(services/ppt_generator.py)— 8 頁
- P1 封面:含集中度警示徽章(健康分散 / 偏高 / 過高)+ 三句話策略要點
- P2 執行摘要:4 KPI 含 △% vs 上期 + 帕雷托 80/20 集中度結論帶
- P3 廠商業績排行:橫條 + 帕雷托雙視圖(matplotlib 暖色系)
- P4-P5 廠商明細表 TOP 30:含 △ 排名變化、🆕 新進榜、業績佔比 bar、
毛利率紅綠燈(綠 ≥15% / 黃 8~15% / 紅 <8%)
- P6 AI 採購策略洞察(結構化 8 段)
- P7 附錄
query_vendor_summary(routes/openclaw_bot_routes.py)
- 期間(單月/自訂日期區間)廠商業績聚合
- 計算 sales / profit / margin / qty / orders
- 同步抓上期同等期間做 vs 上期 △ 比對
_ppt_ai_analysis 加 is_vendor 分支
- 角色:採購主管 + 供應鏈管理顧問
- 結構:整體解讀 / 集中度與供應風險 / 議價優先 / SMART 行動 / 風險預警
- SMART 行動分三層:立即執行 / 中期強化 / 長期結構(含 OEM/ODM 自有品牌)
- 引用 MARKET_TREND_2026 共用知識基底
- max_tokens 1800,字數 800-1000
路由綁定 _generate_ppt_cmd
- /ppt vendor 當月廠商報告
- /ppt vendor 2026/04 指定月份
- /ppt vendor 2026/04/01-2026/04/15 自訂期間
- 自動抓上期同等期間做 △ 比對
Telegram 按鈕(menu_keyboards.py 的 _submenu_reports)
- 新增「🏭 廠商業績報告」進報表選單
bump TEMPLATE_VERSIONS['vendor'] v2.0 (DEPRECATED) → v3.1.0
煙霧測試:本機 venv 跑 vendor PPT 生成 8 頁 200KB 全綠。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 02:04:41 +08:00
OoO
abd722986e
fix(autoheal): preflight + shell || true 結合性 — 解 24h 100% no-op
...
CD Pipeline / deploy (push) Successful in 2m23s
Debugger 五階段方法論 root cause(2026-05-03):
ADR-020 政策層 100% 達成(reasoning 全 auto_fix=enabled),但 AiderHeal
執行層 24 小時 0 次 push 成功,全部 silent fail。
兩根因疊加:
#1 (config) AIDER_REPO_PATH=/home/wooo/ewoooc 在 110 主機不存在
→ 寫 SOP docs/runbooks/aider-heal-110-setup-sop.md 給統帥手動執行
#2 (code) setup_cmds 結尾 `git stash 2>&1 || true` 因 shell 結合性等同
`(A && B && C && D) || true`,cd 失敗整 chain rc=0 被吞,
line 261 if rc != 0 永不觸發 → setup_failed 從未被 log
#4 (code) 缺 preflight,環境壞掉時靜默走完整 pipeline 印 no_diff
本次程式碼修復:
• execute_code_fix 開頭加 L0 preflight(test -d $REPO/.git)
失敗 fail-fast + Telegram 嚴重告警 + 指向 SOP
• setup_cmds 改 `A && B && C && (D || true)` 用 subshell 限縮 || true
• 全檔 5 處 `cd $REPO_PATH` 統一改 `cd shlex.quote(REPO_PATH)`
避免下次有人複製 cd chain 又踩同類 shell quoting bug
SOP 同步處理 critic High-2 + Medium-6:
• 步驟 2 改用 SSH clone(git clone gitea-autoheal:...)
避免 HTTP clone 在 private repo 卡帳密 + 跟步驟 1 部署的 key 不關聯
• 步驟 4b 修引號嵌套(heredoc + 單引號保護),原版永遠 false positive
Critic 審過 Approve to commit;Medium-2/3/4(速率限制 / log 加 stderr /
新增 preflight unit test)排 follow-up,不阻擋本次。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 01:55:34 +08:00
OoO
5daa1a45d8
fix(strategist): plug stale gate gaps in daily/monthly + psutil dep + complete stale shape (critic post-review)
...
critic post-review 對 commit 9158bbe 找到 3 個 BLOCKER,本 patch 補完。
#1 daily/monthly 路徑沒套 stale gate(Critical)
- generate_daily_report() 在 _fetch_sales_summary(7) 後立刻檢查 sales.get("stale"),
避免 daily_sales_snapshot 過期時每天 09:00 復發 NT$0 偽日報
- generate_monthly_report() 在 _fetch_monthly_sales_summary 後檢查
revenue==0 and sku_count==0(_fetch_monthly_sales_summary 沒內建 stale 機制,
以「無資料」當訊號),避免月初產出 NT$0 偽月報
- 抽出 _send_data_stale_alert(report_type, last_date, period) 統一三條路徑共用,
以 ai_insights 表查近 24h 同 report_type 的 data_stale_alert 紀錄做 dedupe,
避免每天 daily/weekly 三份報告同時觸發 → 一天送多次告警噪音
- weekly stale 分支改用 _send_data_stale_alert(return shape 維持 status="error"
不動,保 9158bbe weekly dedupe/cache 機制下游語意)
- daily/monthly 採 critic 建議的 status="skipped";scheduler 既有 task 不檢查
status 也不 raise,EventRouter 不會被誤觸
#2 psutil 沒在 requirements.txt(Critical)
- requirements.txt 加 psutil>=5.9(ADR-019 Phase 2 要求 production 必裝)
- elephant_alpha_autonomous_engine._get_system_load_percentage 加註解:
ImportError fallback 是 queue-based 估算(pending=14→70%、≥18→90%),
與真實 CPU 無關,僅 dev defensive;prod 觸發即代表容器映像漏裝
#9 _fetch_sales_summary stale 分支 return shape 不完整(High)
- stale 分支補完 daily/current_7d_revenue/prev_7d_revenue/wow_pct/sku_count
- 數值欄位用 None(非 0):未套 stale gate 的上游 caller 在 prompt template
`:,.0f` 會 raise TypeError,比靜默 0 明顯,迫使呼叫端必須 stale gate
三問自審:
- 方案正確:daily 不再發 NT$0(_fetch_sales_summary 後立刻 gate);psutil 會被
pip install;stale shape None 在所有 caller 路徑要嘛被 gate 擋下要嘛 raise
- 影響完整:grep 確認 _fetch_sales_summary 三 caller(weekly/daily/monthly via
_fetch_monthly_sales_summary)皆已加 gate;無下游依賴 data_stale return 字串
- Regression 風險:stale shape 改 None 為純擴充無 caller 取數值欄位;scheduler
只讀 period/chart_count/action_count 不檢查 status;monthly revenue=0 gate
在實務 P0 異常時告警,比靜默產 NT$0 月報可接受
不在本 patch scope(critic 任務描述明示禁動):
- 9158bbe weekly dedupe/cache 機制(_acquire_weekly_strategy_send_lock 等)
- elephant_alpha Phase 1 已修部分(trigger/dispatch/method raise)
- run_scheduler.py 排程設定
- tests/ 內任何測試
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 01:54:21 +08:00
OoO
993bdda1fd
feat(ppt-ai): inject shared 2026 Taiwan e-commerce market knowledge to all 6 prompts
...
CD Pipeline / deploy (push) Successful in 2m25s
完成 project memory 待補事項:抽取共用市場趨勢常數 + 補齊未升級的 prompt。
新增 MARKET_TREND_2026 共用常數(routes/openclaw_bot_routes.py):
- 6 大關鍵檔期 + 拉動幅度(母親節 +30~50% 美妝 / 618 全品類 +30~50% / 雙11 +50~80%)
- 6 條 2026 熱門賽道(永續美妝/母嬰高端/機能性食品/IP 聯名/男性保養/寵物經濟)
- 4 大平台競爭定位(蝦皮/PChome/酷澎/momo)
Inject 到 5 條 prompt(monthly/strategy/promo/competitor/else):
- 月報、策略、促銷:原 prompt + MARKET_TREND_2026 知識基底
- 競品比較:補上 2026 熱門賽道做美妝/保健/母嬰專項分析的事實基礎
- daily/weekly(else 分支):完整重寫從 250 字 → 350-450 字 SMART 框架
+ 含市場機會與風險段(檔期卡位 + 競品風險)
bump 版本(所有 6 種 v3.x):
- daily v3.0.2 → v3.1.0
- weekly v3.0.2 → v3.1.0
- monthly v3.1.3 → v3.1.4
- strategy v3.0 → v3.1.0
- competitor v3.0 → v3.1.0
- promo v3.0 → v3.1.0
效果:6 種報表 AI 分析現在都有共同的市場事實基底,跨報表敘事一致;
單一資料來源避免「不同報表給的市場數字打架」問題。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 01:42:43 +08:00
OoO
9010a4e6fa
docs(adr): add ADR-022 PPT v3 redesign + warm paper + matplotlib + cache versioning
...
紀錄本次 PPT 全面重做的架構決策:
- 視覺:暖紙風(_BG_PAPER #F3EEE2)取代暖墨黑封面
- 圖表:matplotlib 暖色系(橫條/折線/帕雷托)取代 python-pptx 原生
- 字型:lxml 直寫 a:latin/a:ea 中英分軌(Consolas + JhengHei)
- 快取:TEMPLATE_VERSIONS 字典自動注入 cache key (tpl_ver)
- AI prompt:升級到顧問深度(市場趨勢脈絡 + SMART 框架)
- 安全:admin 白名單(OPENCLAW_ADMIN_USER_IDS)+ cleanup dry_run 預設
涵蓋 8 commit chain:38967ce → 3b0b4b3 → 52c06f6 → 1c81866 →
b5a2b09 → c7b7cee → 92b8035 → 5a7012f
Critic 全清紀錄:0 critical / 2 HIGH / 4 medium / 3 info 全部修補。
對應 memory:
- reference_ppt_system.md(既存)已更新到 v3 實況
- project_ppt_v3_campaign_20260502.md(新建)戰役紀錄含三大踩坑
- feedback_template_version_cache_pattern.md(新建)可重用設計模式
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 00:25:09 +08:00
OoO
5a7012f1fa
fix(ppt): AI parser drops empty-body sections + cap raised 6→10
...
CD Pipeline / deploy (push) Successful in 2m33s
實戰問題:升級 monthly AI prompt 後,AI 輸出多了【行銷與銷售行動建議
— SMART 框架】這個「主段」加 3 個 ■ 子段(本週/本月/下月)。原 parser:
1. ■ 子段被當成新 section(這是正確行為)
2. 但「行銷與銷售行動建議」主段自己 body 變空殼
3. 顯示成「(本段無內容)」醜陋占位
4. 加上 sections[:6] 切斷,後面的競爭定位/風險預警被丟掉
修補(services/ppt_generator.py:_parse_ai_sections):
- 過濾空 body section(len(body) < 5 視為空殼)
- 上限放寬 6 → 10(容納升級 prompt 後的 9 段:整體/市場/品類/熱銷/
MCP/本週/本月/下月/風險)
驗證:模擬 9 段輸入 → 過濾後得 6 個非空段,正確包含本週/本月/下月。
bump monthly v3.1.2 → v3.1.3
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 00:15:19 +08:00
OoO
92b80352cb
feat(ppt-ai): upgrade prompts to professional sales/marketing depth + 2026 market trends
...
CD Pipeline / deploy (push) Successful in 2m33s
需求:簡報 AI 分析必須詳盡且專業,能直接幫助銷售/行銷策略制定,
反映 2026 年台灣電商當下市場方向與趨勢。
升級三份 prompt(monthly / strategy / promo):
【共通強化】
- 角色從單純「分析師」升級為三合一:
策略顧問(BCG/麥肯錫經驗)+ 行銷主管(廣告 ROI、檔期)+ 採購(選品邏輯)
- 明確指明客戶與用途:「BU 主管會用本報告做下週的庫存與行銷預算決策」
- 全部加「市場趨勢脈絡」段,必須觸及:
(a) 當期關鍵檔期(母親節/520/618/雙11/雙12)對品類的歷史拉抬幅度
(b) 2026 熱門賽道:永續美妝、母嬰高端化、IP 聯名、敏弱肌、銀髮保健、
男性保養、寵物經濟、機能性食品
(c) 平台競爭:vs 蝦皮/PChome/酷澎 的免運門檻、直播帶貨、會員訂閱
- 行動建議升級為 SMART 框架(Specific / Measurable / Achievable /
Relevant / Time-bound),每條必須含商品名 + 量化目標 + 期限
- 禁用「可能/也許/建議考慮」等模糊用詞,要明確「必須做X、目標Y、期限Z」
【月報 monthly】
- 段落結構從 5 段擴為 7 段:整體解讀 / 市場趨勢 / 品類結構 / 熱銷洞察 /
MCP 整合 / SMART 行動建議 / 競爭定位與風險
- 行動建議從 6 條(每段2條)擴為 9 條(每段3條),含本週/本月/下月分層
- 字數 500-700 → 900-1200,max_tokens 1600 → 2400
【策略 strategy】
- 加市場趨勢脈絡段、SMART 框架行動建議
- 字數 400 → 600-800,max_tokens 900 → 1400
【促銷 promo】
- 市場信號解讀段升級為三段式(檔期對位 / 品類熱度 / 價格敏感度)
- 結合 2026 台灣電商熱搜賽道
效果:報告從「描述業績」升級為「告訴 BU 主管下週要做什麼、目標多少、何時完成」。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 00:08:36 +08:00
OoO
00591c5489
feat(ea-hitl): ADR-021 EA 升級審核 pre-fetch + 競價告警金額影響量化
...
根治 2026-05-02 統帥反映的三層 EA escalation 訊息空泛問題:
1. _escalate_to_human 對 price_drop_alert / market_opportunity /
threat_escalation 三類觸發,送 Telegram 前先 await Hermes 取具體
SKU 清單覆蓋 plan 元流程文字(5s 短超時,失敗 fallback 原 plan)
2. NemoTron 競價告警新增 _compute_business_impact helper:
過去 7 日營收流失(gap_pct>0 才算)+ 跟進競品建議價,
dispatch 主路徑 / 防線二 / Hermes rule fallback 三條全部 Python
獨裁注入,告警含「📉 NT$ X」「🎯 NT$ Y」具體金額
3. 補實 telegram_bot_service.handle_callback 的 momo:eig: prefix
handler,HITL「🛑 忽略此事件」按鈕首次有對應 audit 寫入
Critic 審查通過(5 項必修全綠):
- Critical-1: user_label HTML escape 防 Telegram username XSS
- High-1: pre-fetch 改 asyncio.wait_for(5s) 防阻塞 escalation
- High-2: 全部行缺金額時 return None 觸發 plan fallback
- Medium-2: 空 event_id callback 拒絕避免 audit 污染
- Medium-3: gap_pct≤0 時 revenue_loss_7d 強制歸 0 不誤導降價
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 00:03:38 +08:00
OoO
650ef4c5db
feat(deploy): ADR-020 — momo-app 容器加 CODE_REVIEW_AUTO_FIX_ENABLED 預設 true
...
CD Pipeline / deploy (push) Successful in 12m10s
接續 6cad59f:Python 端預設已改 true,但 188 容器透過 docker-compose
讀 env_file: .env,.env 沒設此 key 時容器仍視為 false(reasoning
顯示 auto_fix=flag_disabled)。本次在 momo-app environment 區塊明確
注入主開關,採 `${CODE_REVIEW_AUTO_FIX_ENABLED:-true}` 機制:
• .env 沒設 → true(預設生效)
• .env 顯式 true → true
• .env 顯式 false → false(保留 escape hatch)
CD pipeline 偵測到 docker-compose.yml 變更會走 rebuild path
(force-recreate momo-app),無需手動干預。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-02 23:52:49 +08:00
OoO
c7b7ceeb8d
fix(ppt): line chart resilience — sparse data + dense xtick + inset legend
...
CD Pipeline / deploy (push) Has been cancelled
實戰在 188 prod 抓到的問題:N=1 時 title/legend/data marker 全擠在頂部。
修補:
- 加 `sparse = n_pts <= 2` 旗標,N<=2 時:
* 略過平均水平線(單點下無意義且標籤撞 title)
* marker 加大(5 → 7)讓單點更顯眼
* 中央加「⚠ 期間僅 N 個資料點」提示框(圓角米底+焦糖橘邊)
* legend 改 lower right inset(避開 title)
* x 軸 set_xlim 加邊距避免 marker 貼牆
- 正常 N>=3:
* legend 從 bbox_to_anchor 上方移到 axes 內 upper right
(frameon=True 米底邊框,避免與 title 撞)
* xticklabel 在 N>14 時 rotation=45 ha=right(避免 30 點擠成一團)
* title pad 加大為 18
bump 版本:
- daily v3.0.1 → v3.0.2
- weekly v3.0.1 → v3.0.2
- monthly v3.1.1 → v3.1.2
本機驗證:
- N=1:「資料不足」提示框正確顯示,無重疊
- N=30:30 個 xticklabel 旋轉 45° 清楚分離,legend 右上 inset 不撞 title
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-02 23:52:04 +08:00
OoO
6cad59f83e
feat(code-review): ADR-020 全自動修復政策 — 拆掉 CRITICAL/HIGH HITL 閘門
...
CD Pipeline / deploy (push) Successful in 2m23s
post-deploy code review pipeline 改為「任何 finding 一律觸發 AiderHeal」,
局部覆寫 ADR-012 L3 HITL(不影響 schema migration / 流量切換 /
customer-facing 廣播 / AIOps prod SSH 等其他 L3 場景)。安全網改為
Git revert + Gitea CI/CD 健康檢查 + 主開關 CODE_REVIEW_AUTO_FIX_ENABLED。
實作:
• _ea_orchestrate / _guard_ea_decision / rule fallback 三條路徑統一為
has_findings AND AUTO_FIX_ENABLED → auto_fix=true
• _guard 強制 LLM 即使回 auto_fix=False 也升級為 true(核心保證)
• CODE_REVIEW_AUTO_FIX_ENABLED 預設 false → true
• Telegram 文案移除「需人工審查」,改顯示主開關狀態
• action_plan status pending_review → auto_disabled(語意對齊)
• aider_heal_executor 標頭 ADR-014 → ADR-020、補「直推 main」分支策略
文件:
• 新增 docs/adr/ADR-020-code-review-full-autoheal.md
• ADR-012 加 Note 行反向引用 ADR-020
• README 索引收錄
測試:tests/test_code_review_pipeline_security.py 反轉 HITL 期望,
新增 5 case(含 LLM 降級被 guard 拒絕、LLM human_review_needed=true 被改 false)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-02 23:44:01 +08:00
OoO
b5a2b09445
fix(ppt): matplotlib CJK fallback covers container Noto CJK JP variant
...
CD Pipeline / deploy (push) Successful in 2m19s
實戰驗證在 188 容器內發現:matplotlib font_manager 從 fonts-noto-cjk
ttc 檔只載入 'Noto Sans CJK JP' / 'Noto Serif CJK JP' 兩個變體(TC/SC/HK/KR
名稱未列入 ttflist),導致原本 fallback 清單比對失敗 → font.family 退到
'sans-serif'(DejaVu Sans)→ 中文 glyph 全部缺失印出 UserWarning。
修正:
- _mpl_setup() fallback 清單加入 'Noto Sans CJK JP' / 'Noto Serif CJK JP'
- 最終 fallback 加 substring match(涵蓋未列入但名稱含 CJK/PingFang/
JhengHei/YaHei/Source Han/WenQuanYi/Hiragino 的字型)
- _mpl_horiz_bar_png 內重複的 cjk_candidates 邏輯移除,改呼叫 _mpl_setup
避免兩處清單漂移
註:Noto Sans CJK JP ttc 檔本身含完整 CJK Unified Ideographs,可正常
渲染中文(漢字共用),只是字型名稱叫 JP 而已。
bump 模板版本(舊圖表中文方塊版本快取應失效重生):
- daily v3.0 → v3.0.1
- weekly v3.0 → v3.0.1
- monthly v3.1 → v3.1.1
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-02 23:38:51 +08:00
OoO
1c81866541
fix(ppt): final critic cleanup — Medium-1 OOXML order + Info-1/2 docs
...
CD Pipeline / deploy (push) Successful in 2m29s
清掉剩餘 critic finding(Medium-1 + Info-1 + Info-2):
Medium-1: _set_run_fonts 違反 OOXML CT_TextCharacterProperties 子元素順序
- 抽出 _insert_rpr_child(rPr, tag) helper:依 ECMA-376 §21.1.2.3 規定
的順序表(_RPR_CHILD_ORDER)找正確位置插入
- 找第一個排在 target 之後的子元素 → insert 前面;否則 append
- 當前 from-scratch 場景安全;未來改讀模板 .pptx 時也不會踩雷
- 驗證:產生 monthly v3.1,399 個 rPr 全部符合 schema 順序,0 違反
Info-1: cleanup_expired_ppt_cache docstring 補語意說明
- 明確說明 dry_run=True/False 時 deleted_files / deleted_rows / freed_bytes
欄位語意分別為「將刪除」預估值 vs「已實刪」實際值
Info-2: TEMPLATE_VERSIONS 標記退役 type
- growth / vendor / bcg 三個 type 從未實際落地(依 ADR-014 校正 2026-04-28)
- 加 DEPRECATED 註解,避免後人誤以為已支援
Info-3 SKIP(評估後不做):
- get_template_version import 改放模組頂部會 trigger ppt_generator 模組級
REPORTS_DIR.mkdir() 副作用,read-only filesystem 環境會掛
- 保留延遲 import 是 graceful degradation 的 intentional 設計
至此 critic 38967ce 審查清單全綠:
- 0 critical, 2 HIGH (3b0b4b3 ), 4 medium (52c06f6 + 本 commit), 3 info
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-02 17:39:27 +08:00
OoO
52c06f6861
fix(ppt): admin guard for destructive /cache commands (critic Medium-3)
...
CD Pipeline / deploy (push) Successful in 2m14s
Critic Medium-3:群組內任意成員可執行破壞性快取指令的問題。
新增機制:
- ADMIN_USER_IDS:新增 OPENCLAW_ADMIN_USER_IDS 環境變數
逗號分隔的 user_id;未設時退回 ALLOWED_USERS(向後兼容)
- _is_admin(user_id):fail-closed 判定函式
- _CURRENT_USER_ID_CTX:ContextVar 在 webhook 入口(msg + callback)
set 當前 user_id,避免改 handle_cmd 30+ 處呼叫端簽名
權限模型:
| 指令 | 權限 | 行為 |
| /cache status | 已授權 | 任何已授權用戶可看 |
| /cache cleanup [days] | 已授權 | 預設乾跑可預覽 |
| /cache flush <type> | admin | 拒絕非 admin |
| /cache cleanup [days] confirm | admin | 拒絕非 admin |
| /cache cleanup [days<1] confirm | - | 強制乾跑(防呆) |
非 admin 嘗試破壞性指令時,回傳清楚錯誤訊息引導設定環境變數。
admin 操作會額外寫 sys_log.warning 留軌跡(含 user_id)。
煙霧測試:
- syntax OK
- _is_admin(None) / _is_admin("abc") / _is_admin(unknown_id) 皆 False
- ContextVar set/get 行為正確
剩餘 Medium 1/2 + Info 類後續再處理(非緊急)。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-02 17:35:48 +08:00
OoO
3b0b4b3d42
fix(ppt): address critic findings on commit 38967ce (HIGH-1, HIGH-2, Medium-4)
...
CD Pipeline / deploy (push) Successful in 2m27s
Critic 審查 38967ce 找出 2 HIGH + 4 medium,本 commit 修最緊急三項:
HIGH-2: cleanup_expired_ppt_cache 預設 dry_run=False 危險
- 函式 default 改 dry_run=True(呼叫方需明確傳 False 才實刪)
- launchd 排程腳本改用 DRY_RUN 環境變數,預設 false→實刪,
但測試時可 DRY_RUN=true 安全跑
- /cache cleanup Telegram 指令預設乾跑,需加 confirm 才實刪
- /cache cleanup days<1 強制乾跑(防呆)
HIGH-1: matplotlib 三個 helper 缺 try/finally → 渲染失敗洩漏 figure
- _mpl_horiz_bar_png / _mpl_line_chart_png / _mpl_pareto_chart_png
全部用 try/except/finally 包住,例外時 plt.close() 仍執行
- 同時讓渲染失敗回 None(呼叫端自然 fallback 到原生 chart)
Medium-4: scripts/ppt_cleanup.sh PROJECT_DIR 寫死
- 改用相對路徑解析(cd $SCRIPT_DIR/..),手動執行不再需要設環境變數
- VENV_PY 找不到時 fallback 到系統 python3(容器友善)
- 新增 DRY_RUN 環境變數開關(預設 false)
煙霧測試:
- syntax OK (services/ppt_generator.py + routes/openclaw_bot_routes.py)
- monthly v3.1 重生 10 頁 290KB
- cleanup_expired_ppt_cache dry_run default = True ✓
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-02 17:23:02 +08:00
OoO
38967ceea3
feat(ppt): redesign all 6 reports to professional standard + cache versioning
...
CD Pipeline / deploy (push) Successful in 13m18s
PPT 模板全面升版至市場專業標準(McKinsey / BCG 月報級別):
Monthly v3.1(10 頁)
- 暖紙感封面(去黑底)+ elevator pitch(亮點/警訊/動能徽章)
- KPI 卡含 △% vs 上月 + 紅綠燈、YoY 同期對比帶
- matplotlib 業績趨勢折線(本月+上月+日均線+高低點)
- 品類分析雙視圖:橫條 + 帕雷托累計(80% 主力線)
- TOP 50 商品(自動分頁)+ vs 上月 △ 排名變化 / 🆕 新進榜
- MCP 情報 4 卡片結構化、AI 行動結構化分區、附錄頁
Daily / Weekly / Strategy / Promo / Competitor v3.0
- 統一暖紙封面、AI 頁去黑底改暖紙 + 焦糖橘色條
- 日週改 matplotlib 折線(含日均線、高低點)
- 全部加附錄頁(資料來源 / 計算口徑 / 模板版本)
Cache 版本控制
- TEMPLATE_VERSIONS 字典自動注入 cache key (tpl_ver)
- 模板升版舊快取自動 miss → 重生
- 新增 _invalidate_ppt_cache() 與 cleanup_expired_ppt_cache() helper
- 新增 /cache status / flush / cleanup Telegram 指令
字型系統
- _set_run_fonts() 用 lxml 直寫 a:latin/a:ea,中英分軌
- 中文走 Microsoft JhengHei,數字/英文走 Consolas(點陣等寬)
- Dockerfile 加 fonts-noto-cjk + fonts-noto-cjk-extra
部署排程
- scripts/install_ppt_cleanup.sh 一鍵安裝 launchd(每日 03:15)
- scripts/ppt_cleanup.sh 清 7 天前過期 PPT 檔 + DB row
資料層
- routes monthly: query_monthly_summary LIMIT 10 → 50,補 orders 欄位
- routes monthly: 拉 prev_month / prev_year 比較資料供 KPI △ 與商品 △ 計算
煙霧測試 6/6 全綠:
- 日報 v3.0 (5 頁) / 週報 v3.0 (6 頁) / 月報 v3.1 (10 頁)
- 策略 v3.0 (6 頁) / 促銷 v3.0 (6 頁) / 競品 v3.0 (5 頁)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-02 16:26:27 +08:00
OoO
0232dbb902
test(openclaw): assert /menu returns full main menu keyboard
2026-05-02 16:13:43 +08:00
OoO
3f40089d8c
fix(openclaw): show full main menu for wakeup phrases
CD Pipeline / deploy (push) Successful in 2m44s
2026-05-02 16:12:30 +08:00
OoO
7b6423fa67
fix(openclaw): route wakeup phrases back to menu
CD Pipeline / deploy (push) Successful in 2m55s
2026-05-02 16:03:49 +08:00
OoO
673982d83b
Fix OpenClaw callback command path from NL dispatch regression
CD Pipeline / deploy (push) Successful in 4m17s
2026-05-02 15:59:54 +08:00
OoO
76304602b1
fix(ppt): footer→bottom, font spec (Courier New/Microsoft JhengHei), 50-item paginated table, remove old single-page remnant
CD Pipeline / deploy (push) Successful in 2m41s
2026-05-02 15:32:54 +08:00
OoO
0b82350745
style(ppt): comprehensive warm-tone redesign - caramel KPI cards, warm paper MCP/AI pages, revenue ratio bars in product table, chart→caramel orange, cover with warm decorative bands
2026-05-02 15:20:02 +08:00
OoO
ccc0cef9be
feat(ppt): upgrade monthly AI prompt to 7-section expert template with MCP RAG integration, enrich data_summary with category/product breakdown
CD Pipeline / deploy (push) Successful in 2m47s
2026-05-02 15:06:16 +08:00
OoO
4c6e4ca5fb
style(ppt): align PPT palette perfectly with MOMO Pro v2 design tokens (Beige, Warm Ink, Caramel Orange) as per frontend upgrade roadmap
2026-05-02 15:01:55 +08:00
OoO
934adc957c
style(ppt): redesign ppt layouts, align palette with frontend, and add dedicated MCP RAG slide
2026-05-02 14:59:45 +08:00
OoO
9068d463bb
feat(ea): execute Phase 3 C-series architecture fixes to prevent recurrence
...
CD Pipeline / deploy (push) Successful in 2m37s
- C1: Removed weekly_strategy and meta_analysis from Elephant Alpha's SAFE_ACTIONS (orchestrator prompt and engine _ACTION_ZH) to prevent autonomous generation of scheduled reports
- C2: Removed hardcoded 0.85 confidence example from orchestrator prompt and implemented bounding validation (0.0~1.0) in _parse_strategic_decision
- C3: Expanded ADR-019 data freshness gate (_ppt_check_data_freshness) to cover /ppt weekly and /ppt strategy routes, proactively warning users of stale data
2026-05-02 14:39:10 +08:00
OoO
9158bbe1a6
fix(ea): execute Phase 2 B-series data quality and gate improvements
...
CD Pipeline / deploy (push) Successful in 2m40s
- B1 & B2: Updated SQL column names from 銷售金額 to 總業績 in openclaw_strategist_service.py and chart_generator_service.py
- B3: Removed bare except statements in DB fetchers to raise errors instead of failing silently
- B4: Implemented freshness gate (MAX(snapshot_date) < CURRENT_DATE - 2) in daily_sales_snapshot to prevent generating stale reports and send data stalled alerts
- B5: Replaced hardcoded 45.0 system load percentage with actual psutil CPU metric
2026-05-02 14:34:30 +08:00
OoO
e6df2fad28
fix(ea): remove weekly_strategy/meta_analysis from autonomous engine triggers (Phase 1 stopgap)
...
CD Pipeline / deploy (push) Successful in 2m39s
Critic-approved 3-point revision (REVISE → adopted):
1. Disable weekly_insight trigger at definition (line 279-285) — EA no
longer evaluates the 6h / >=5 ai_insights condition that fired
_generate_strategy_report without force_tg_alert=True.
2. Remove the openclaw weekly/meta dispatch table branches (line 591-606).
The 5 actions (generate_strategic_analysis, generate_weekly_strategy,
generate_market_analysis, generate_pricing_strategy,
generate_meta_analysis) now fall through to the existing
`raise ValueError(f"Unrecognized step: ...")` at line 631, which
_execute_decision's try/except converts into a circuit-breaker failure.
This is the correct failure semantics critic asked for.
3. Convert _generate_strategy_report / _generate_meta_report into hard
RuntimeError raisers and drop their imports of
openclaw_strategist_service. Deep insurance: any future caller crashes
immediately instead of silently bypassing dedupe.
Evidence: ai_insights logged 35+ duplicate weekly_strategy sends in 7 days
because EA's `_generate_strategy_report` invoked
generate_weekly_strategy_report() without force_tg_alert=True, bypassing
the run_scheduler.py weekly dedupe gate.
Out of scope (per task contract):
- run_scheduler.py:115 Monday 06:00 schedule — preserved (sole owner)
- services/openclaw_strategist_service.py — owned by B-series (SQL)
- Other EA triggers (price_drop_alert / market_opportunity /
threat_escalation / code_exception / resource_optimization) — preserved
- Other dispatch branches (hermes / nemotron / auto_heal / code_fix /
price_adjustment review) — preserved
- Did NOT add force_tg_alert=True defensive layer (critic flagged as
anti-pattern)
- Did NOT touch _TRIGGER_TO_DECISION_TYPE / _ALLOWED_ACTION_TYPES
Not pushed, not deployed. D1 deployment will be issued separately and
must use `docker compose up -d --no-deps --force-recreate momo-scheduler`
(per feedback_compose_restart_vs_up).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-02 13:12:14 +08:00