From 35f153a30ab722be5f1cf5edf15b74df996dd3cb Mon Sep 17 00:00:00 2001 From: ogt Date: Thu, 2 Jul 2026 20:24:55 +0800 Subject: [PATCH] style(obs): compact budget workbench copy --- docs/AI_INTELLIGENCE_MODULE_SOT.md | 1 + .../guides/external_professional_benchmark.md | 2 ++ .../pchome_ai_automation_priority_backlog.md | 4 +++ templates/admin/budget.html | 10 ++++-- tests/test_budget_text_density_guardrails.py | 36 +++++++++++++++++++ 5 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 tests/test_budget_text_density_guardrails.py diff --git a/docs/AI_INTELLIGENCE_MODULE_SOT.md b/docs/AI_INTELLIGENCE_MODULE_SOT.md index c434de9..a7a6cfa 100644 --- a/docs/AI_INTELLIGENCE_MODULE_SOT.md +++ b/docs/AI_INTELLIGENCE_MODULE_SOT.md @@ -101,6 +101,7 @@ - 2026-07-02 起 `/observability/agent_orchestration` 必須採密集 AI Agent 工作台:首屏使用 `data-density-guardrail="compact-agent-workbench"`,以「AI 分工、成本守門、知識命中」短標籤承接分工狀態;hero 說明、KPI 小註、列內描述、卡片描述與頁尾重複標題不得佔用第一層視覺,畫面先保留呼叫總量、主力路徑占比、付費成本、知識命中率、分工矩陣與工具協作表。 - 2026-07-02 起 `/observability/ai_calls` 必須採密集 AI 流量工作台:首屏使用 `data-density-guardrail="compact-ai-calls-workbench"`,以「流量監控、成本守門、知識命中」短標籤承接 AI 呼叫狀態;hero 說明、KPI 小註、素材說明與頁尾重複標題不得佔用第一層視覺,畫面先保留呼叫總量、用量、成本、延遲、知識命中、錯誤、情境矩陣與最近呼叫。 - 2026-07-02 起 `/observability/quality_trend` 必須採密集 AI 品質工作台:首屏使用 `data-density-guardrail="compact-quality-workbench"`,以「品質回饋、知識可靠、行動成效」短標籤承接 AI 建議可靠性;hero 說明、KPI 小註與頁尾重複標題不得佔用第一層視覺,畫面先保留反饋總量、最低均分、蒸餾樣本、知識評分、使用情境反饋、根因建議與實際動作成效。 +- 2026-07-02 起 `/observability/budget` 必須採密集 AI 成本工作台:首屏使用 `data-density-guardrail="compact-budget-workbench"`,以「成本守門、節流狀態、知識策略」短標籤承接成本治理;hero 說明、按鈕註解、KPI 小註與頁尾重複標題不得佔用第一層視覺,畫面先保留當月花費、預算使用率、預警、已節流、預算線、成本趨勢、成本集中與 AI 價格決策成效。 - 2026-07-02 起 `/ai_intelligence` 商品明細與單品作戰詳情的四格價格證據必須可測:PChome 價格、MOMO 參考價、差距、可信度需以 `data-evidence` 固定,並以 `aria-label="價格證據"` 對應可掃描區塊;候選待確認或缺資料只能顯示「候選待確認 / 待補」,不得捏造價格或讓使用者打開 raw payload 才知道判斷依據。 - 2026-07-02 起 `/ai_intelligence` 必須是密集 AI 工作台,不得退回大段文字說明頁:首屏與明細可見內容只保留短狀態、數字、四格證據與下一步按鈕;KPI note、benchmark detail、alert 副句、策略說明、decision copy、來源長句與單品 reason list 不得佔用第一層視覺。`tests/test_ai_intelligence_text_density_guardrails.py` 必須鎖住 `data-density-guardrail="compact-ai-workbench"`、短任務文案、detail meta 與 hidden explanatory copy。 - 2026-07-02 起 `/observability/overview` 也必須採密集 AI 觀測工作台:首屏以 `data-density-guardrail="compact-observability-workbench"`、`AI 觀測 / 風險優先 / 下一步` 與 golden signals 先呈現狀態、數字與操作入口;hero lede、signal note、route desc、host meta 與資料來源長句不得佔用第一層視覺。`tests/test_observability_text_density_guardrails.py` 必須鎖住 compact marker 與 hidden explanatory copy。 diff --git a/docs/guides/external_professional_benchmark.md b/docs/guides/external_professional_benchmark.md index abf1a1a..0dd013c 100644 --- a/docs/guides/external_professional_benchmark.md +++ b/docs/guides/external_professional_benchmark.md @@ -75,6 +75,7 @@ Baymard 的商品頁與比較 UX 研究強調:使用者需要清楚的 product - AI Agent surface rollout: `/observability/agent_orchestration` 已套用 compact Agent workbench guardrails;`tests/test_agent_orchestration_text_density_guardrails.py` 鎖住首屏短標籤、核心訊號與 hidden explanatory copy。 - AI traffic surface rollout: `/observability/ai_calls` 已套用 compact AI traffic workbench guardrails;`tests/test_ai_calls_text_density_guardrails.py` 鎖住首屏短標籤、成本/錯誤/知識核心訊號與 hidden explanatory copy。 - AI quality surface rollout: `/observability/quality_trend` 已套用 compact AI quality workbench guardrails;`tests/test_quality_trend_text_density_guardrails.py` 鎖住首屏短標籤、品質/知識/行動成效核心訊號與 hidden explanatory copy。 +- AI cost surface rollout: `/observability/budget` 已套用 compact AI cost workbench guardrails;`tests/test_budget_text_density_guardrails.py` 鎖住首屏短標籤、成本/預警/節流核心訊號與 hidden explanatory copy。 ## 下一步 TODO 候選 @@ -88,6 +89,7 @@ Baymard 的商品頁與比較 UX 研究強調:使用者需要清楚的 product - 已完成: `/observability/agent_orchestration` 首屏以「AI 分工 / 成本守門 / 知識命中」短標籤與四個核心數字呈現 Agent 編排狀態。 - 已完成: `/observability/ai_calls` 首屏以「流量監控 / 成本守門 / 知識命中」短標籤與六個核心數字呈現 AI 呼叫、成本、錯誤與知識狀態。 - 已完成: `/observability/quality_trend` 首屏以「品質回饋 / 知識可靠 / 行動成效」短標籤與四個核心數字呈現 AI 建議可靠性。 + - 已完成: `/observability/budget` 首屏以「成本守門 / 節流狀態 / 知識策略」短標籤與四個核心數字呈現 AI 成本治理狀態。 ## 參考來源 diff --git a/docs/guides/pchome_ai_automation_priority_backlog.md b/docs/guides/pchome_ai_automation_priority_backlog.md index 3ecd5f4..eb47356 100644 --- a/docs/guides/pchome_ai_automation_priority_backlog.md +++ b/docs/guides/pchome_ai_automation_priority_backlog.md @@ -144,6 +144,10 @@ - 首屏改成 `data-density-guardrail="compact-quality-workbench"`,以「品質回饋 / 知識可靠 / 行動成效」短標籤承接 AI 建議可靠性。 - hero 說明、KPI 小註與頁尾重複標題從可見 UI 退場,保留反饋總量、最低均分、蒸餾樣本、知識評分、使用情境反饋、根因建議與實際動作成效。 - `tests/test_quality_trend_text_density_guardrails.py` 已鎖住 compact marker、第一層狀態數字與 explanatory copy hidden contract。 +- `/observability/budget` 密集 AI 成本工作台文字密度 guard 已完成: + - 首屏改成 `data-density-guardrail="compact-budget-workbench"`,以「成本守門 / 節流狀態 / 知識策略」短標籤承接成本治理。 + - hero 說明、按鈕註解、KPI 小註與頁尾重複標題從可見 UI 退場,保留當月花費、預算使用率、預警、已節流、預算線、成本趨勢、成本集中與 AI 價格決策成效。 + - `tests/test_budget_text_density_guardrails.py` 已鎖住 compact marker、第一層成本訊號與 explanatory copy hidden contract。 已完成 / 下一步,必須照順序: diff --git a/templates/admin/budget.html b/templates/admin/budget.html index 7c4c702..75ac755 100644 --- a/templates/admin/budget.html +++ b/templates/admin/budget.html @@ -9,6 +9,9 @@ .gov-kicker { color:var(--obs-accent); font-size:.76rem; letter-spacing:.13em; text-transform:uppercase; font-weight:850; } .gov-title { margin:.45rem 0 .25rem; font-family: var(--momo-font-display, "Inter", "Noto Sans TC", system-ui, sans-serif); font-size:var(--obs-title-size); letter-spacing: 0; line-height:.98; } .gov-subtitle { color:var(--obs-muted); max-width:850px; line-height:1.7; } + .gov-mode-row { display:flex; flex-wrap:wrap; gap:.5rem; margin-top:.75rem; } + .gov-mode { display:inline-flex; align-items:center; min-height:28px; padding:.32rem .65rem; border:1px solid var(--obs-line); border-radius:10px; background:rgba(255,255,255,.62); color:var(--obs-muted); font-size:.74rem; font-weight:850; white-space:nowrap; } + .gov-subtitle, .gov-action-note, .gov-note, .gov-footer-copy { display:none; } .gov-actions { display:flex; flex-wrap:wrap; gap:.6rem; align-items:center; margin-top:1rem; } .gov-command { display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:.75rem; margin-top:1rem; } .gov-signal { padding:.95rem; border:1px solid var(--obs-line); border-radius:20px; background:rgba(255,255,255,.62); } @@ -37,11 +40,12 @@ {% set total_ratio = (total_spent.value / total_budget.value * 100) if total_budget.value > 0 else 0 %}
-
+
AI 成本治理 · 預算 / 節流 / 知識策略

AI 成本治理艙

+
成本守門節流狀態知識策略

控制 AI 花費與節流狀態,把預算留給能推動業績的任務。

-
預算超線時立即重算節流。
+
預算超線時立即重算節流。
當月花費
${{ "%.2f"|format(total_spent.value) }}
預算 ${{ "%.2f"|format(total_budget.value) }}
預算使用率
{{ "%.0f"|format(total_ratio) }}%
全供應商加總
@@ -83,7 +87,7 @@
商業產出

AI 價格決策 7 日

{% for p in price_rec_7d %}
{{ obs_label.strategy(p.strategy) }}{{ p.count }}信心 {{ "%.2f"|format(p.avg_confidence) }}
{% endfor %}
{% endif %} -

AI 成本治理艙

+
{% set budget_payload = { diff --git a/tests/test_budget_text_density_guardrails.py b/tests/test_budget_text_density_guardrails.py new file mode 100644 index 0000000..cead7b6 --- /dev/null +++ b/tests/test_budget_text_density_guardrails.py @@ -0,0 +1,36 @@ +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] + + +def test_budget_uses_compact_workbench_contract(): + template = (ROOT / "templates/admin/budget.html").read_text(encoding="utf-8") + + assert 'data-density-guardrail="compact-budget-workbench"' in template + assert 'aria-label="AI 成本狀態模式"' in template + assert "成本守門" in template + assert "節流狀態" in template + assert "知識策略" in template + + +def test_budget_keeps_cost_signals_and_hides_explanatory_copy(): + template = (ROOT / "templates/admin/budget.html").read_text(encoding="utf-8") + + for marker in ["當月花費", "預算使用率", "預警", "已節流"]: + assert marker in template + + assert ".gov-subtitle, .gov-action-note, .gov-note, .gov-footer-copy { display:none; }" in template + assert 'class="gov-subtitle"' in template + assert "gov-action-note" in template + assert "gov-footer-copy" in template + + +def test_budget_preserves_cost_governance_tables_and_non_raw_wording(): + template = (ROOT / "templates/admin/budget.html").read_text(encoding="utf-8") + + for marker in ["預算線與節流狀態", "每日成本堆疊趨勢", "Top 5 成本使用情境", "AI 價格決策 7 日"]: + assert marker in template + + for forbidden in ["raw", "endpoint", "artifact", "DB writes", "prune", "manual_required"]: + assert forbidden not in template