Clarify PChome backfill wording
All checks were successful
CD Pipeline / deploy (push) Successful in 1m6s

This commit is contained in:
OoO
2026-05-25 08:15:39 +08:00
parent 4a43a3075a
commit 8a75d34276
10 changed files with 17 additions and 12 deletions

View File

@@ -4,6 +4,7 @@
================================================================================
【已完成】
- 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`,避免新候選分數較高時繞過人工覆核自動覆蓋正式價差。

View File

@@ -325,7 +325,7 @@ YOUTUBE_API_KEY = os.getenv('YOUTUBE_API_KEY', '')
# ==========================================
# 系統版本與路徑
# ==========================================
SYSTEM_VERSION = "V10.461"
SYSTEM_VERSION = "V10.462"
LOG_FILE_PATH = os.path.join(BASE_DIR, 'logs/system.log')
public_url = PUBLIC_URL # 用於模板顯示

View File

@@ -2,7 +2,7 @@
> **最後更新**: 2026-05-24 (台北時間)
> **狀態**: 🟢 四 AI Agent 自動化閉環已落地LLM 路由紅線升級為 Ollama-first 三主機級聯Gemini 備援預設關閉
> **適用版本**: V10.461
> **適用版本**: V10.462
---
@@ -388,7 +388,7 @@ LEFT JOIN competitor_prices cp
- 套組/買送/件數不同但品牌、核心商品線與單一基礎規格一致時matcher 必須回傳 `comparison_mode='unit_comparable'``unit_comparable` reasonFeeder 只能寫入 `competitor_match_attempts.attempt_status='unit_comparable'``refresh_unit_comparable`,不得寫入 `competitor_prices`。Dashboard 與 `competitor_intel_repository` 必須用 `build_unit_price_comparison()` 產生每 ml / 每 g / 每入單位價證據,讓 PPT / AI 報表可說明「需單位價比較」而不是把總價當同款價差。商品看板在正式配對尚未成立時,仍必須顯示最佳候選 PChome 商品名稱、候選價與「候選價需單位換算」說明讓人工覆核可直接看見下一步daily/growth、PPT 與 OpenClaw 摘要不得自建查詢,需消費 `fetch_competitor_review_queue()` 與 coverage 的 `unit_comparable_count`。若任一側含多個不同容量/重量規格,視為多品項套組,不可進 `unit_comparable`
- PChome feeder 的外部 request timeout 由 `PCHOME_FEEDER_TIMEOUT` 控制,預設 12 秒;排程不得因單一 PChome 搜尋 API timeout 被拖到數分鐘。
- 商品看板的 PChome 狀態必須把 matcher 診斷原因翻成可行動語意:品牌不符已排除、規格不符已排除、補充包不相容、組合規格不相容、系列不符已排除、需單位價比較、低信心待補強等,不可只顯示籠統「待比對」或「身份否決」。
- PChome 補抓產線 priority list 若尚未進入搜尋/補抓,必須顯示「尚未搜尋」與「尚未進入 PChome 補抓」,不得使用「待比對」這類會被誤解成已有候選待人工審核的字眼。
- PChome 補抓產線 priority list 若尚未進入搜尋/補抓,必須顯示「PChome 補抓產線」、「尚未搜尋」與「尚未進入 PChome 補抓」,不得使用「待比對」這類會被誤解成已有候選待人工審核的字眼。
- 商品看板、PChome review queue 與 `/api/export/excel/pchome-review` 必須優先讀取 `match_diagnostic_json.reasons` 並轉成操作員可讀標籤;文字版 `error_message` 只作 legacy fallback。商品列的 PChome 狀態摘要也必須使用同一套專業標籤,避免 overview 顯示「妝效質地不同」但列表仍顯示籠統身份不符。新增 matcher reason 時需同步更新 `MATCH_DIAGNOSTIC_REASON_LABELS` 與 dashboard 狀態翻譯,避免 UI 顯示 `makeup_finish_conflict` 這類 machine code。PChome 標題缺品牌但有窄範圍 exact identity anchor 的商品,只能透過具名 brandless recovery 進 manual-review identity多色任選 / 單一色號 gap 必須標記 `variant_selection_review`,並從 `recoverable_low_score` 降回 `true_low_confidence`,不得自動批次寫正式價差。
- Dashboard 必須把「待比對」拆成可診斷狀態:`價格過期待刷新``舊版配對待重驗``低分配對待補強``已排除``需單位價比較``找不到同款``抓取異常``尚未搜尋`。硬性不相容候選應顯示為已排除/不相容,不得讓使用者誤以為每筆都需要人工待審。

View File

@@ -41,6 +41,7 @@
- 將狀態拆成:尚未搜尋、價格過期待刷新、近門檻可救回、證據不足、既有強配對保護、已排除、需單位價比較、找不到同款。
- 每筆覆核要顯示候選 PChome 商品、候選價、match score、診斷原因、下一步動作。
- 人工採用 / 否決 / 單位價 / 補搜尋必須能回寫 review queue並影響 feeder 後續行為。
- 2026-05-25 00:15 CST 起PChome 補抓操作入口同步收斂為「PChome 補抓產線 / 補抓未搜尋 / 未搜尋補抓」,包含 Dashboard、AI 中樞、前端 confirm 與 API 回覆,不再讓操作入口殘留籠統「待比對」。
- 2026-05-25 00:06 CST 起,尚未進入 PChome 搜尋/補抓的商品列表文案改為「尚未搜尋」與「尚未進入 PChome 補抓」,不再顯示籠統「待比對」,避免和低信心待人工覆核混淆。
- 2026-05-24 23:40 CST 起,`protected_existing_match` 的 review `decision_envelope` 會解析 `existing_match_conflict`,列出既有正式候選、新候選、雙方 score 與 delta這類案件仍不可自動覆蓋正式價差但人工覆核、Agent 與 PPT 不再只看到籠統「既有保護」。

View File

@@ -13,6 +13,7 @@
## 📅 詳細更新日誌 (考古存檔)
### 2026-05-24PChome 近門檻身份回收第二輪
- **V10.462 PChome 補抓 UI 語意收斂**: Dashboard 補抓區塊標題、AI 中樞按鈕、前端 confirm 與 API 回覆全數改用「PChome 補抓產線 / 補抓未搜尋 / 未搜尋補抓」,避免「待比對」殘留在操作入口,和低信心待人工覆核混淆。
- **V10.461 Dashboard 未搜尋語意修正**: 商品看板未進入 PChome 搜尋/補抓的品項不再顯示籠統「待比對」,改成「尚未搜尋」與「尚未進入 PChome 補抓」,避免操作員誤以為已有候選但尚未人工覆核;前端守門測試鎖住不得回退成舊文案。
- **V10.460 ElephantAlpha 告警決策信封**: `resource_optimization` 會為資源壓力告警產生 deterministic `decision_envelope`,證據只來自 `action_plans`、CPU 實測與 hygiene 結果Telegram 同時顯示決策信封、量測指標、判讀、系統處置與下一步;`ea_escalation` 模板也會渲染信封並使用 `decision_id` 作為 `momo:eig:*` callback避免低信心升級告警只剩空泛文字或不可追蹤按鈕。
- **V10.459 protected_existing_match 決策封包**: PChome 覆核信封開始解析 `existing_match_conflict`,把既有正式候選、新候選、雙方 matcher score 與 score delta 寫入 evidence / expected_impact / guardrails新候選即使分數較高也維持 `can_auto_execute=false`,但 OpenClaw、PPT、Dashboard 與人工覆核可清楚看見該比較哪兩個候選。

View File

@@ -1819,7 +1819,7 @@ def api_pchome_match_backfill():
update_pchome_backfill_run(
run_id,
stage='matching',
message=f'正在補抓 {unmatched_limit} 筆高優先待比對商品',
message=f'正在補抓 {unmatched_limit} 筆高優先尚未搜尋商品',
)
result = feeder.run_unmatched_priority(limit=unmatched_limit)
result_payload = _combined_feeder_payload(revalidation_result, result)
@@ -1871,7 +1871,7 @@ def api_pchome_match_backfill():
return jsonify({
'success': True,
'message': f'已啟動 PChome 待比對補抓,優先處理 {limit} 筆高價未配對商品;完成後會重算 AI 挑品清單',
'message': f'已啟動 PChome 未搜尋補抓,優先處理 {limit} 筆高價未配對商品;完成後會重算 AI 挑品清單',
'limit': limit,
'data': get_pchome_backfill_status(),
}), 202
@@ -1880,7 +1880,7 @@ def api_pchome_match_backfill():
@ai_bp.route('/api/ai/pchome-match/backfill/status', methods=['GET'])
@login_required
def api_pchome_match_backfill_status():
"""取得 PChome 待比對補抓的背景執行狀態。"""
"""取得 PChome 未搜尋補抓的背景執行狀態。"""
from services.pchome_backfill_status import get_pchome_backfill_status
return jsonify({

View File

@@ -369,7 +369,7 @@
<i class="fas fa-wand-magic-sparkles me-1"></i>產生挑品清單
</button>
<button class="btn btn-outline-warning btn-sm ai-action-btn" id="btnBackfill" onclick="backfillPchomeMatches()">
<i class="fas fa-magnifying-glass-chart me-1"></i>補抓待比對
<i class="fas fa-magnifying-glass-chart me-1"></i>補抓未搜尋
</button>
<button class="btn btn-outline-secondary btn-sm ai-action-btn" onclick="loadDashboard()">
<i class="fas fa-redo me-1"></i>重新整理
@@ -738,7 +738,7 @@ async function generatePickList() {
}
}
// ── 補抓 PChome 待比對商品 ─────────────────────────
// ── 補抓 PChome 尚未搜尋商品 ───────────────────────
async function backfillPchomeMatches() {
const btn = document.getElementById('btnBackfill');
const toast = document.getElementById('triggerToast');
@@ -769,7 +769,7 @@ async function backfillPchomeMatches() {
new bootstrap.Toast(toast, { delay: 4000 }).show();
} finally {
btn.disabled = false;
btn.innerHTML = '<i class="fas fa-magnifying-glass-chart me-1"></i>補抓待比對';
btn.innerHTML = '<i class="fas fa-magnifying-glass-chart me-1"></i>補抓未搜尋';
}
}

View File

@@ -60,7 +60,7 @@
data-pchome-backfill-action="backfillPchomeMatches">
<div class="dashboard-backfill-main">
<div class="dashboard-backfill-label momo-mono">PCHOME MATCH BACKFILL</div>
<div class="dashboard-backfill-title">待比對補抓產線</div>
<div class="dashboard-backfill-title">PChome 補抓產線</div>
<div class="dashboard-backfill-meta momo-mono">
待補抓 {{ overview.pending_match_count | default(0) | number_format }} · 覆核 {{ overview.review_queue_count | default(0) | number_format }} · 重算可採用 {{ overview.rescore_accepted_count | default(0) | number_format }} · 單位價 {{ overview.unit_comparable_count | default(0) | number_format }}
</div>

View File

@@ -429,6 +429,8 @@ def test_dashboard_v2_shows_pchome_competitor_pricing_and_links():
assert "候選價,需單位換算" in dashboard
assert "尚未進入 PChome 補抓" in dashboard
assert '<span class="dashboard-focus-chip is-neutral">待比對</span>' not in dashboard
assert "PChome 補抓產線" in dashboard
assert "待比對補抓產線" not in dashboard
assert "_load_pchome_match_attempt_map" in route_source
assert "低信心待補強" in route_source
assert "未找到可信同款" in route_source
@@ -535,7 +537,7 @@ def test_ai_product_pick_agent_uses_real_competitor_data_and_dashboard_action():
assert '"run_pchome_match_backfill_task"' in agent_actions_source
assert "產生挑品清單" in template
assert "補抓待比對" in template
assert "補抓未搜尋" in template
assert "generatePickList" in template
assert "backfillPchomeMatches" in template
assert "/api/ai/product-picks/generate" in template

View File

@@ -378,7 +378,7 @@ let priceChartInstance = null;
const elements = getPchomeBackfillElements();
if (!elements.card || !elements.trigger) return;
const limit = Number(elements.trigger.dataset.limit || 60);
if (!confirm(`啟動 PChome 待比對補抓 ${limit} 筆?`)) return;
if (!confirm(`啟動 PChome 未搜尋補抓 ${limit} 筆?`)) return;
elements.trigger.disabled = true;
if (elements.status) {