style(obs): compact budget workbench copy
Some checks failed
CD Pipeline / deploy (push) Has been cancelled
Some checks failed
CD Pipeline / deploy (push) Has been cancelled
This commit is contained in:
@@ -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。
|
||||
|
||||
@@ -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 成本治理狀態。
|
||||
|
||||
## 參考來源
|
||||
|
||||
|
||||
@@ -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。
|
||||
|
||||
已完成 / 下一步,必須照順序:
|
||||
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
<div class="container-fluid mt-3">
|
||||
<section class="gov-hero">
|
||||
<section class="gov-hero" data-density-guardrail="compact-budget-workbench">
|
||||
<div class="gov-kicker"><i class="fas fa-wallet me-1"></i> AI 成本治理 · 預算 / 節流 / 知識策略</div>
|
||||
<h1 class="gov-title">AI 成本治理艙</h1>
|
||||
<div class="gov-mode-row" aria-label="AI 成本狀態模式"><span class="gov-mode">成本守門</span><span class="gov-mode">節流狀態</span><span class="gov-mode">知識策略</span></div>
|
||||
<p class="gov-subtitle">控制 AI 花費與節流狀態,把預算留給能推動業績的任務。</p>
|
||||
<div class="gov-actions"><button class="btn btn-warning btn-sm" onclick="forceThrottle()"><i class="fas fa-bolt me-1"></i>立即重算節流狀態</button><span class="text-muted small">預算超線時立即重算節流。</span></div>
|
||||
<div class="gov-actions"><button class="btn btn-warning btn-sm" onclick="forceThrottle()"><i class="fas fa-bolt me-1"></i>重算節流</button><span class="text-muted small gov-action-note">預算超線時立即重算節流。</span></div>
|
||||
<div class="gov-command">
|
||||
<div class="gov-signal"><div class="gov-label">當月花費</div><span class="gov-value">${{ "%.2f"|format(total_spent.value) }}</span><div class="gov-note">預算 ${{ "%.2f"|format(total_budget.value) }}</div></div>
|
||||
<div class="gov-signal"><div class="gov-label">預算使用率</div><span class="gov-value {% if total_ratio >= 110 %}status-bad{% elif total_ratio >= 80 %}status-warn{% else %}status-good{% endif %}">{{ "%.0f"|format(total_ratio) }}%</span><div class="gov-note">全供應商加總</div></div>
|
||||
@@ -83,7 +87,7 @@
|
||||
<section class="gov-panel mt-3"><div class="gov-panel-head"><div><div class="gov-label">商業產出</div><h2 class="gov-panel-title">AI 價格決策 7 日</h2></div></div><div class="gov-panel-body"><div class="gov-mini-grid">{% for p in price_rec_7d %}<div class="gov-mini"><span class="gov-label">{{ obs_label.strategy(p.strategy) }}</span><strong>{{ p.count }}</strong><small class="text-muted">信心 {{ "%.2f"|format(p.avg_confidence) }}</small></div>{% endfor %}</div></div></section>
|
||||
{% endif %}
|
||||
|
||||
<p class="text-muted mt-3"><small><i class="fas fa-robot me-1"></i>AI 成本治理艙</small></p>
|
||||
<p class="text-muted mt-3 gov-footer-copy"><small><i class="fas fa-robot me-1"></i>AI 成本治理艙</small></p>
|
||||
</div>
|
||||
|
||||
{% set budget_payload = {
|
||||
|
||||
36
tests/test_budget_text_density_guardrails.py
Normal file
36
tests/test_budget_text_density_guardrails.py
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user