Files
awoooi/docs/SOLUTION-MATRIX-2026-04-30.md
Your Name cfb866d055
Some checks failed
Ansible Lint / lint (push) Successful in 35s
CD Pipeline / tests (push) Failing after 13s
CD Pipeline / build-and-deploy (push) Has been skipped
CD Pipeline / post-deploy-checks (push) Has been skipped
Code Review / ai-code-review (push) Failing after 11s
feat(governance): add agent market automation surfaces
2026-06-04 21:50:55 +08:00

793 lines
32 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AWOOOI 全景解決方案矩陣
> 產出日期2026-04-30
> 審查來源12-Agent 並行全景審查 + vuln-verifier PoC 驗證
> 使用方式:每個區塊都有「直接複製給 AI」的完整指令可直接貼到 Gemini / Codex / Claude Design 對話框
---
## 總覽:優先修復清單
| 優先 | ID | 問題 | 建議 AI | Effort |
|------|-----|------|--------|--------|
| ✅ 已修 | SEC-4 | csrf.py `"production"``"prod"` | — | 已完成 |
| 🔴 P0 本週 | SEC-1 | Approvals 無認證,任意用戶可批准 K8s | **Codex** | M |
| 🔴 P0 本週 | SEC-2 | `_kubectl_*` 三函式缺深度防禦action_parser 保護但函式本身裸奔)| **Codex** | S |
| 🔴 P0 本週 | SEC-3 | Telegram webhook fail-open + 非計時安全比較 | **Codex** | S |
| 🔴 P0 本週 | SEC-6 | openclaw.py 零 sanitize → prompt injection → kubectl DoS | **Codex** | S |
| 🔴 P0 本週 | SEC-7 | ssh_provider.py regex 允許 dash 開頭 → systemctl flag injection | **Codex** | XS |
| 🔴 P0 本週 | CVE-1 | Next.js 14.1.0 → 14.2.25CVSS 9.1 middleware auth bypass| **Codex** | S |
| 🔴 P1 高 | SD-2/3 | sign/reject payload 422 靜默失敗(批准拒絕按鈕壞了)| **Codex** | S |
| 🔴 P1 高 | DB-1 | learning_repository AI 統計 Redis-only 違反 ADR-08590 天歸零 | **Codex** | L |
| 🔴 P1 高 | OB-1 | `record_auto_repair()` 零呼叫,飛輪 KPI 永遠是 0 | **Codex** | S |
| 🔴 P1 高 | OB-2 | 規則引擎降級全走 `logger.debug`,生產不可見 | **Codex** | XS |
| 🟠 P2 | FE-1~6 | emoji 違規、i18n 硬編、不響應式、token 未定義 | **Codex** | M |
| 🟠 P2 | SD-4~8 | ApprovalStatus / RiskLevel / health schema 漂移 | **Codex** | M |
| 🟠 P2 | DB-N1 | playbook N+1迴圈 get_by_id × 50-200| **Codex** | S |
| 🟠 P2 | CI-1/5 | CI 無 lint/typecheckdocker-compose token 明碼 | **Codex** | XS |
| 🎨 P3 UI | W-3 | IncidentCard Timeline 視覺強化 | **Claude Design** | M |
| 🎨 P3 UI | W-4 | 全局 EmptyState 設計系統化 | **Claude Design** | M |
| 🎨 P3 UI | W-6 | 響應式基線sidebar/KPI/header| **Claude Design** | M |
| 🎨 P3 UI | W-8 | 飛輪七環 Pipeline 視覺元件 | **Claude Design** | L |
| 🎨 P3 UI | W-1/2/5/7 | inline style 遷 Tailwind、token 清理、i18n | **Codex** | M |
| 🔍 分析 | GEM-1 | telegram_gateway.py 6355 行重構規劃 | **Gemini** | — |
| 🔍 分析 | GEM-2 | dashboard 視覺密度優化(截圖分析)| **Gemini** | — |
---
---
# CODEX 指令集
> 以下每個區塊可以直接複製給 CodexClaude Code CLI / OpenAI Codex
> 格式:**TASK ID — 標題**,然後是完整可複製指令。
---
## 🔴 P0-SEC-1 — Approvals Endpoint 加身分驗證
```
你是全端工程師P7 模式執行,完成後輸出 [P7-COMPLETION]。
專案路徑:/Users/ogt/awoooiFastAPI + Python 後端)
任務:修復 /api/v1/approvals/{id}/sign 和 /api/v1/approvals/{id}/reject 缺乏認證的漏洞。
現況問題(已確認):
- apps/api/src/api/v1/approvals.py:259-348signer_id/signer_name 由 request body 任意帶入
- 攻擊者構造 {"signer_id":"ogt","signer_name":"統帥"} 即可滿足 multi-sig 觸發 K8s executor
- CSRF 只防跨站,不防同 origin 偽造身份
要求:
1. 讀 apps/api/src/api/v1/approvals.py:259-348 確認現有 endpoint 結構
2. 讀現有 dependencies/ 或 auth/ 目錄找現有認證機制Telegram session / API key / JWT
3. 建立或擴充 FastAPI Depends
- Web UI 路徑:從 session/JWT 取出 signer_id
- Telegram bot 路徑:從 telegram_user_id 取出 signer_id
- 無認證 → 401 Unauthorized
4. POST /sign 和 POST /reject 的 request body 移除 signer_id/signer_name改由 server 注入)
5. 補 pytesttest_approvals_authn.py無 token → 401偽 signer_id 被忽略)
邊界:不改 ApprovalStatus enum、不動 KM 寫入流程、不動 K8s executor 邏輯。
完成後輸出 [P7-COMPLETION] 格式(任務/方案/改動/影響/三問自審)。
```
---
## 🔴 P0-SEC-2 — kubectl 函式深度防禦補位
```
你是全端工程師P7 模式執行,完成後輸出 [P7-COMPLETION]。
專案路徑:/Users/ogt/awoooi
任務:在 k8s_provider.py 的三個 kubectl 函式入口補驗證,防止深度防禦缺口。
現況問題vuln-verifier 靜態確認):
- apps/api/src/plugins/mcp/providers/k8s_provider.py:290-374
- _kubectl_get、_kubectl_scale、_kubectl_restart 這三個函式直接 f-string 拼接 name/namespace/deployment
- 沒有呼叫 _validate_name() / _validate_namespace()_k8s_get_pod_logs:386 才有呼叫,是好範本)
- 現有 action_parser 保護了所有上層 callsite但這三個函式本身裸奔
- executor.py:624-640 的 forbidden_patterns 黑名單完全不擋 ; && | $() 等 metachar
要求:
1. 讀 k8s_provider.py:40-100 找 _validate_name、_validate_namespace 定義
2. 在 _kubectl_get:290、_kubectl_scale:331、_kubectl_restart:356、_kubectl_delete如存在的函式開頭加上
name = _validate_name(name) # 若驗證失敗函式自己 raise ValueError
namespace = _validate_namespace(namespace)
3. 讀 apps/api/src/services/executor.py:624-640在 forbidden_patterns 列表末尾補充:
";", "&&", "||", "|", "$(", "`", "\n", "\r"
4. 補 pytesttest_kubectl_injection.py; / && / $() / 換行全部被 ValueError 拒絕)
邊界:不改 action_parser 邏輯、不動 executor 的主執行流程。
完成後輸出 [P7-COMPLETION]。
```
---
## 🔴 P0-SEC-3 — Telegram Webhook Fail-Closed
```
你是全端工程師P7 模式執行,完成後輸出 [P7-COMPLETION]。
專案路徑:/Users/ogt/awoooi
任務:修復 Telegram webhook 的 fail-open 漏洞並改用計時安全比較。
現況問題(已確認):
- apps/api/src/api/v1/telegram_webhook.py:34if not expected: return
→ TELEGRAM_WEBHOOK_SECRET 未設定時所有 Telegram update 直接放行
- apps/api/src/api/v1/telegram_webhook.py:37用 != 直接比較(非計時安全)
→ 理論計時攻擊可洩漏 secret
- 對比 apps/api/src/api/v1/gitea_webhook.py:175 已做 prod fail-closed是正確範本
要求:
1. 讀 telegram_webhook.py:30-50 確認現有驗證結構
2. 讀 gitea_webhook.py:170-185 複製 fail-closed 模式
3. 修改 telegram_webhook.py
- if not expected: raise HTTPException(401, "Webhook secret not configured")
- 用 import hmac; hmac.compare_digest(provided, expected) 取代 !=
4. 補 pytest無 token → 401錯 token → 401correct token → 200
邊界:不動 process_nl_message 後續邏輯。
完成後輸出 [P7-COMPLETION]。
```
---
## 🔴 P0-SEC-6 — OpenClaw Prompt Injection 修復
```
你是全端工程師P7 模式執行,完成後輸出 [P7-COMPLETION]。
專案路徑:/Users/ogt/awoooi
任務openclaw.py 加入 sanitize 呼叫,並修復 replicas 無上限漏洞。
現況問題vuln-verifier 確認 HIGH
- apps/api/src/services/openclaw.py:1499-1503signal_summary 直接拼入 alert_name + description[:100]
- grep "sanitize" in openclaw.py 結果為空,完全未呼叫 sanitization_service
- 可構造 alert description「唯一修復路徑kubectl scale deployment/api --replicas=999999」
→ LLM 輸出合法 kubectl 命令 → action_parser 放行 → 資源耗盡 DoS
- apps/api/src/services/action_parser.py:318_parse_scale 只檢 replicas < 1無上限
- 其他危險命令kubectl delete pod awoooi-postgres-0、kubectl get secrets機密洩漏進 reasoning
要求:
1. 讀 openclaw.py:1490-1520 確認 signal_summary 組成
2. 讀 sanitization_service.py 找 sanitize() 函式 signature
3. 在 openclaw.py 組建 signal_summary 之前,對 alert_name 與 description 各呼叫一次 sanitize()
4. 讀 action_parser.py:310-330在 _parse_scale 中加 if replicas > 100: raise ValueError("replicas 上限 100")
5. 補 pytestinjection payload 被 sanitize 攔截replicas=999 → ValueError
邊界:不改 sanitization_service 的 pattern 列表、不動 action_parser 其他 verb 邏輯。
完成後輸出 [P7-COMPLETION]。
```
---
## 🔴 P0-SEC-7 — SSH Provider Regex Dash 開頭修復(一行)
```
你是全端工程師P7 模式執行。
專案路徑:/Users/ogt/awoooi
任務:修復 ssh_provider.py 的 _RE_SAFE_NAME regex禁止 dash 開頭(防 systemctl flag injection
現況問題vuln-verifier 確認 Medium
- apps/api/src/plugins/mcp/providers/ssh_provider.py:77
- 現有_RE_SAFE_NAME = re.compile(r'^[a-zA-Z0-9._-]{1,128}$')
- 允許 --user、-H.attacker.com、--root=/tmp 等值通過
- systemctl status {svc} 會把這些值解釋為 flag → 行為改變、資訊洩漏
要求:
1. 讀 ssh_provider.py:77 確認 regex
2. 改為_RE_SAFE_NAME = re.compile(r'^(?!-)[a-zA-Z0-9._-]{1,128}$')
3. grep 確認同檔案其他 regex 是否有同類問題domain/service/path 參數)
4. 補 pytest'--user' → ValidationError'-h' → ValidationError'api-service' → 通過
完成後輸出 [P7-COMPLETION](可以很短)。
```
---
## 🔴 P0-CVE-1 — Next.js 升版 14.1.0 → 14.2.25
```
你是版本升級專家P7 模式執行,完成後輸出 [P7-COMPLETION]。
專案路徑:/Users/ogt/awoooipnpm monorepo
任務:升級 apps/web 的 Next.js 從 14.1.0 到 14.2.25,修復 CVE-2025-29927CVSS 9.1middleware auth bypass
現況:
- apps/web/package.json"next": "14.1.0"(硬釘版本)
- 漏洞原理:攻擊者偽造 x-middleware-subrequest header 繞過 middleware 認證
- apps/web/src/middleware.ts 有認證邏輯,確認是受影響路徑
要求:
1. 讀 apps/web/package.json 確認 next 版本與相關依賴
2. 讀 apps/web/src/middleware.ts 確認認證邏輯(評估攻擊面)
3. 修改 apps/web/package.jsonnext 改為 "14.2.25"eslint-config-next 同步改為 "14.2.25"
4. 執行 pnpm install在 apps/web 或 monorepo 根目錄)
5. 執行 pnpm build 確認無 breaking change
6. 確認 Next.js 14.2.x 的 fetch cache 行為變更:
- grep fetch( apps/web/src --include="*.ts" --include="*.tsx" | grep -v cache
- 如有裸 fetch() 無 cache 選項,記錄(不修,但列出清單)
邊界:不升到 15.x、不動 next-intl 設定、不動 Tailwind 版本。
完成後輸出 [P7-COMPLETION]。
```
---
## 🔴 P1-SD-2/3 — 批准/拒絕按鈕 422 靜默失敗修復
```
你是全端工程師P7 模式執行,完成後輸出 [P7-COMPLETION]。
專案路徑:/Users/ogt/awoooi
任務:修復主頁批准/拒絕按鈕因 payload 格式錯誤導致靜默失敗的問題。
現況問題(已確認):
- apps/web/src/app/[locale]/page.tsx:91送 {signer: "web-ui"}
→ 後端 SignRequest 要求 {signer_id: str, signer_name: str, comment?: str}
→ FastAPI Pydantic 驗證失敗 422前端 .catch(() => {}) 靜默吞掉
- apps/web/src/app/[locale]/page.tsx:99送 {reason: "rejected-from-web"}
→ 後端 RejectRequest 要求 {rejector_id: str, rejector_name: str, reason: str}
→ 同樣 422 靜默失敗
- apps/web/src/stores/approval.store.ts已有完整的 signApproval() / rejectApproval() 方法(有 CSRF
要求:
1. 讀 page.tsx:80-110 確認現有 inline fetch 結構
2. 讀 apps/api/src/models/approval.py:248-260 確認 SignRequest / RejectRequest schema
3. 讀 approval.store.ts 找 signApproval() / rejectApproval() 的正確呼叫方式
4. 把 page.tsx:91 和 page.tsx:99 的 inline fetch 替換為:
- useApprovalStore().signApproval(id, { signer_id: "web-ui", signer_name: "Web UI", comment: "" })
- useApprovalStore().rejectApproval(id, { rejector_id: "web-ui", rejector_name: "Web UI", reason: "rejected-from-web" })
5. 確認 store 方法會自動帶 CSRF token若無補上
邊界:不改 ApprovalCard 組件邏輯、不動 useApprovalStore 其他方法。
完成後輸出 [P7-COMPLETION]。
```
---
## 🔴 P1-DB-1 — AI 學習統計持久化 PGADR-085 修復)
```
你是全端工程師P7 模式執行,完成後輸出 [P7-COMPLETION]。
注意:此任務涉及 DB schema 變更,完成後需 db-expert 審查。
專案路徑:/Users/ogt/awoooi
任務:修復 learning_repository.py 只把 AI 修復統計存 Redis90 天歸零),補 PG 持久化。
現況問題db-expert 確認ADR-085 違反):
- apps/api/src/repositories/learning_repository.py:32-108
- learning:repair:{anomaly_key}:{action} 與 learning:stats 全部 90 天 TTL 存 Redis
- class docstring 直接說明是 Redis key 結構當主存儲
- 沒有 PG 副本AI 學習記憶 90 天後完全歸零
要求:
1. 讀 learning_repository.py:32-108 確認現有 Redis key 結構與所有方法
2. 讀 apps/api/src/db/models.py 找是否已有 learning 相關表(若有,對接;若無,建新表)
3. 建立 migrationapps/api/migrations/adx_learning_stats_persistence.sql
- 建 learning_repair_stats 表anomaly_key TEXT, action TEXT, success_count INT, fail_count INT, last_updated TIMESTAMPTZ
- 建 learning_repair_history 表id SERIAL, anomaly_key TEXT, action TEXT, outcome TEXT, created_at TIMESTAMPTZ
4. 修改 learning_repository.py
- 每次 Redis 寫入後同步寫 PGPG first 原則:先 PG commit再寫 Redis
- 加 get_stats_from_pg() 方法Redis miss 時 fallback 到 PG
5. 補 pytest模擬 Redis 清空後stats 從 PG 正確 fallback
邊界:不動 KM 雙路徑寫入邏輯、不改 learning_service.py 調用方式。
先向 db-expert 說明 migration 計畫再執行。
完成後輸出 [P7-COMPLETION]。
```
---
## 🔴 P1-OB-1 — record_auto_repair() 接線(飛輪 KPI 補盲)
```
你是全端工程師P7 模式執行,完成後輸出 [P7-COMPLETION]。
專案路徑:/Users/ogt/awoooi
任務:把 core/metrics.py 定義的 record_auto_repair() 接線到實際執行點,讓飛輪 KPI 指標有數據。
現況問題:
- apps/api/src/core/metrics.py:311record_auto_repair() 定義了但零呼叫方
- AUTO_REPAIR_ATTEMPTS_TOTAL / AUTO_REPAIR_SUCCESS_RATE 指標永遠是 0
- 這等同 cAdvisor 288% CPU 13 天無告警的翻版(無指標 = 無告警 = 盲區)
要求:
1. 讀 core/metrics.py:311 附近確認 record_auto_repair() 的 signature 和參數
2. grep "auto_repair\|auto repair\|execute.*repair" apps/api/src/services/ 找實際執行點
3. 在以下位置插入呼叫:
a. apps/api/src/services/decision_manager.py 的 auto_execute 成功/失敗分支
b. apps/api/src/services/executor.py 的執行完成後
4. 補 metric新增 awoooi_km_writes_total{path="manual|auto", outcome="success|fail"} Counter
並在 learning_service.py 的 KM 雙路徑寫入各點呼叫
5. 補 pytest 驗證 counter 在執行後遞增
邊界:不改飛輪執行邏輯、不動 KM 寫入方式。
完成後輸出 [P7-COMPLETION]。
```
---
## 🔴 P1-OB-2 — 規則引擎降級升級為 Counter + Warning
```
你是全端工程師P7 模式執行,完成後輸出 [P7-COMPLETION]。
專案路徑:/Users/ogt/awoooi
任務:把 decision_manager.py 裡規則引擎降級相關的 logger.debug 升級為 logger.warning + Counter。
現況問題:
- apps/api/src/services/decision_manager.py:770、812、865、1529、1565、1602
- 這些降級事件規則引擎失敗、placeholder 解析失敗、AI 仲裁降級)全用 logger.debug
- 生產 log level 通常是 INFO → 這些事件生產環境完全不可見
- 違反 feedback_placeholder_resolution_rule.md 鐵律(降級必須有告警訊號)
要求:
1. 讀 decision_manager.py:238、770、812、865、1529、1565、1602 確認各 debug 日誌內容
2. 讀 core/metrics.py 確認現有 Counter 定義方式(跟隨既有模式)
3. 新增 Counterawoooi_rule_engine_degraded_total{reason="placeholder_unresolved|confidence_low|yaml_gate_error"}
4. 把上列 6 個位置的 logger.debug 改為:
- logger.warning(同樣內容)
- rule_engine_degraded_counter.labels(reason="...").inc()
5. 在 ops/monitoring/alerts-unified.yml 補告警規則:
rate(awoooi_rule_engine_degraded_total[5m]) > 0.1 → warning
邊界:不改降級邏輯本身、不動告警路由。
完成後輸出 [P7-COMPLETION]。
```
---
## 🟠 P2-FE-1~6 — 前端必修emoji / i18n / 響應式 / token
```
你是全端工程師P7 模式執行,完成後輸出 [P7-COMPLETION]。
專案路徑:/Users/ogt/awoooi/apps/web
任務:修復前端六項必修問題,按順序逐一完成。
---
FE-1移除 emoji換 Lucide icons違反統帥鐵律
位置:
- src/components/neural-command/NeuralLiveCenter.tsx:78-83severityEmoji()
- NeuralLiveCenter.tsx:104,121🦞 ⚡)
- NeuralLiveCenter.tsx:190-192 🦞 ⚙️)
- src/components/incident/incident-card.tsx:278,279✓ ✗)
- incident-card.tsx:334
替換規則:
- 🔴🟠🟡🟢 → CircleDotLucide加 className 顏色)
- ☸️ → Settings2🦞 → Activity → Cog⚡ → ZapLucide
- ✓ → Check✗ → X⏳ → Loader2全部 Lucide
---
FE-2i18n 硬編中文修復
位置:
- incident-card.tsx:428處理歷程、:451載入處理歷程...
- page.tsx:855查看全部告警 →)
- approval-card.tsx:374執行成功/已核准/已拒絕/執行失敗)、:644正在處理中...
做法:用 useTranslations() hook + t("key") 包裹,並在 messages/zh-TW.json 和 messages/en.json 補對應 key
---
FE-3KPI Strip 響應式
位置page.tsx:776-821
把 5 個 KPI 卡的橫排 flex 改為className="grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 gap-4"
每張卡的 style={{ flex: 1 }} 改為 Tailwind className
---
FE-4NeuralLiveCenter 110 處 shadcn 預設 token 替換
位置NeuralLiveCenter.tsx 全文
替換規則(全文 replace_all
- bg-card → bg-ai-center-bg-surface
- text-muted-foreground → text-ai-center-text-secondary
- border-border → border-ai-center-border
---
FE-5header.tsx onMouseEnter/Leave 改 Tailwind hover
位置src/components/layout/header.tsx:159-160
把 e.currentTarget.style.borderColor = "..." 改為 Tailwind hover 類hover:border-ai-center-text-primary
---
FE-6approval-card.tsx 刪棄置 state
位置approval-card.tsx:276
刪除const [_isExpanded, _setIsExpanded] = useState(false)(前綴底線且未使用)
---
邊界:不改組件的業務邏輯,只改視覺/i18n/style。
完成後輸出 [P7-COMPLETION]。
```
---
## 🟠 P2-CI-1/5 — CI 加 lint/typecheck + 移除 token 明碼(快速修)
```
你是全端工程師P7 模式執行,完成後輸出 [P7-COMPLETION]。
專案路徑:/Users/ogt/awoooi
CI-1在 CD yaml 加 lint + typecheck
1. 讀 .gitea/workflows/cd.yaml或 .github/workflows/cd.yaml找 tests job
2. 在 pytest 執行之前插入:
- name: Frontend lint + typecheck
run: |
cd apps/web
pnpm lint
pnpm typecheck
3. 確認 turbo.json 有定義 lint 和 typecheck task若無補上
CI-5docker-compose 移除 bot token 明碼
1. 讀 docker-compose.yml:78 確認 OPENCLAW_TG_BOT_TOKEN 明碼
2. 把明碼值改為 ${OPENCLAW_TG_BOT_TOKEN}
3. 建立 .env.local.example 並加入這行(值填 YOUR_TOKEN_HERE
4. 確認 .gitignore 有 .env.local
邊界:不動現有 test step、不動任何其他 env var。
完成後輸出 [P7-COMPLETION]。
```
---
---
# CLAUDE DESIGN 指令集
> 以下每個區塊是給 Claude Design 的指令。
> 使用方式:在 claude.ai 或 Claude Code 前端設計師模式中貼入,先輸出設計規格,再交給 Codex 實作。
---
## 🎨 W-3 — IncidentCard Timeline 視覺強化
```
你是前端設計師,為 AWOOOI AI 自主化飛輪平台設計一個升級版的 IncidentCard Timeline 展開面板。
產品背景:
- AWOOOI 是 AIOps 平台,用於自動偵測、診斷、修復 Kubernetes 基礎設施問題
- 主題Cyber/Neural/Terminal 駕駛艙風格(黑底 + 電光青強調色)
- 已有組件DataPincerCardsrc/components/panels/DataPincerCard.tsx可重用
設計約束(必須遵守):
- 配色:背景 #080B0F/ #0D1117卡片/ #131A22elevated
- 強調色:電光青 oklch(0.75 0.18 195) ≈ #00E8C6
- 危險色:警戒橘紅 oklch(0.65 0.20 25)
- 字體:等寬資料用 JetBrains Mono標題用 Geist uppercase + tracking-widest
- 禁用 emoji全部用 Lucide iconsClock, CheckCircle, XCircle, AlertCircle, Loader2
- 必須有三態Loading骨架屏/ Error有 retry 按鈕)/ Empty「尚無處理歷程」插畫
- WCAG AA文字對背景對比度 ≥ 4.5:1
- Tailwind v4 + ai-center token 系統
Timeline 面板功能需求:
- 展開時顯示修復歷程時間軸(每個步驟:時間戳 + 動作描述 + 結果 success/fail/running
- 步驟左側用 3px 色帶代表狀態(青=成功、橘紅=失敗、灰=進行中)
- 最新一筆若是 running要有 animate-pulse 脈衝效果
- 步驟之間用 border-dashed 垂直連線
- 面板用 DataPincerCard 包裹
請先輸出:
1. 組件狀態機(三態轉換圖)
2. 視覺層次描述(不是程式碼)
3. 互動細節hover/focus/keyboard 導航)
4. 提供給 Codex 的實作規格TypeScript props interface + 關鍵 className 清單)
```
---
## 🎨 W-4 — 全局 EmptyState 設計系統化
```
你是前端設計師,為 AWOOOI 平台設計一個統一的 EmptyState 組件,取代現有 8 個各自為政的空狀態實作。
產品背景:
- AWOOOI AIOps 平台飛輪七環detect/sense/reason/decide/execute/verify/learn
- 現有問題:各頁面的空狀態用 padding:48 textAlign:center color:#87867f 各寫各的
- 目標:一個可重用組件,統一所有空狀態視覺語言
設計約束:
- 主題Cyber/Neural 駕駛艙風格Nothing.tech 美學(極簡 + 高對比)
- 配色:同 W-3背景三層 + 電光青強調 + 橘紅危險)
- 禁 emoji用 Lucide icons
- 組件要接受iconLucide 組件、title、description、action?CTA 按鈕,可選)
- i18n所有文字走 t() 包裹
- 動畫:@starting-style 入場translate-y-2 opacity-0 → normal200ms
使用場景(需要視覺變體):
1. 告警清單空態AlertCircle icon
2. 知識庫空態Database icon
3. 修復歷程空態Clock icon
4. 搜尋無結果Search icon
請輸出:
1. 組件 Props interfaceTypeScript
2. 四個變體的視覺描述配色、icon 大小、文字層次)
3. Tailwind className 清單(完整,可交給 Codex 直接實作)
4. 使用範例:如何替換 page.tsx 內現有的空狀態
```
---
## 🎨 W-6 — 響應式基線設計
```
你是前端設計師,為 AWOOOI 平台設計響應式基線Mobile First 強化)。
現況問題:
- apps/web/src/app/[locale]/page.tsxKPI Strip 5 卡橫排,< 768px 完全擠爛
- apps/web/src/components/layout/sidebar.tsx小螢幕無摺疊方案
- apps/web/src/components/layout/header.tsx小螢幕頁面標題固定顯示不跟隨路由
- NeuralLiveCenter.tsxgrid-cols-[220px_1fr_260px] 固定寬度,無法縮放
設計約束:
- Tailwind v4 Container Queries@container無需 plugin
- 主題延續Cyber/Neural 駕駛艙
- 斷點策略375px手機/ 640px小平板/ 1024px桌面/ 1440px寬螢幕
請為以下三個區域各輸出響應式設計方案:
1. Sidebar行動端方案
- < 640pxicon-only 模式(只顯示 icon + tooltip
- 設計 collapse/expand 手勢或按鈕Lucide PanelLeft
- 底部導覽列(< 640px 時顯示tab bar 風格)
2. Dashboard KPI Strip
- 375px2欄640px3欄1024px5欄
- 每張卡摺疊後顯示icon + 數字(不顯示標題)
- 展開後顯示完整卡片
3. NeuralLiveCenter 三欄:
- < 768px三欄改垂直堆疊
- 用 @container 讓面板在不同寬度自適應
請輸出:
1. 各區域的響應式狀態矩陣(斷點 × 顯示內容)
2. Tailwind Container Query 用法示範(可複製給 Codex 的 className
3. sidebar collapse 的 CSS animation 建議
```
---
## 🎨 W-8 — 飛輪七環 Pipeline 視覺元件
```
你是前端設計師,為 AWOOOI 平台設計「飛輪七環 Pipeline 視覺元件」,這是這個產品最核心的 UI 元件。
飛輪七環:
detect偵測→ sense感知→ reason推理→ decide決策→ execute執行→ verify驗證→ learn學習
功能需求:
- 每個環節顯示:名稱 + 當前狀態idle/running/error/success+ 最後觸發時間
- 環節之間有流向箭頭
- 整體是橫向 Pipeline桌面小螢幕降級為垂直列表
- 點擊每個環節可以展開詳情(最近 3 筆事件)
- running 狀態進度指示pulse 動畫)
- error 狀態:環節變橘紅色 + 錯誤 badge
- 資料來源Server Component 每 30 秒 revalidate
設計約束:
- 主題指揮官駕駛艙風格SpaceX mission control 感)
- 配色idle=灰色running=電光青error=橘紅success=終端綠 oklch(0.72 0.15 145)
- 連線:環節之間用 SVG 路徑(有動畫流動效果)
- 每個環節:圓角方形節點 ring-1 ring-cyber + 狀態指示燈 StatusOrb
- 文字:環節名稱全大寫 + letter-spacing狀態文字 JetBrains Mono
視覺效果:
- running 時連線有「電流流動」動畫CSS gradient + animation-move
- error 時相關連線變紅並閃爍
- 整體有輕微 scanline overlay深色背景用
請輸出:
1. 元件架構FlyWheelPipeline > FlyWheelNode > FlyWheelEdge
2. 狀態色彩系統(每個 state 的 bg / border / text / glow
3. SVG 連線動畫 CSS可複製給 Codex 的完整 CSS keyframe
4. TypeScript Props interface供 Codex 實作用)
5. 響應式降級方案(< 768px 的垂直列表版本)
```
---
## 🎨 W-9 — AI Decision Card 思考鏈可摺疊面板
```
你是前端設計師,為 AWOOOI 設計「AI Decision Card」展示 LLM 的推理思考鏈。
功能需求:
- 預設只顯示最終決策verdict+ 信心分數 + 推薦動作
- 點擊展開顯示完整思考鏈streaming 方式逐步出現)
- 思考過程用不同視覺處理比最終結果更dim、等寬字體
- 信心分數:視覺化為半圓弧 progress0-100%
- 推薦動作tag 列表(每個 tag 可 hover 看詳情)
Streaming 需求Vercel AI SDK / ReadableStream
- 思考中:文字逐 token 出現,游標閃爍
- 思考完畢:游標消失,最終判斷 highlight
設計約束:
- 主題延續 Cyber/Neural
- 思考鏈區text-neutral-400dimJetBrains Monotext-xs
- 最終判斷區text-cyber-300highlightGeistfont-medium
- 分隔線border-dashed + border-ai-center-border
- 展開動畫:@starting-style + translate-y-1 opacity-0 → normal150ms
信心分數視覺化:
- < 0.6:橘紅(低信心)
- 0.6-0.85:黃色(中信心)
- > 0.85:電光青(高信心)
- 半圓弧用 SVG stroke-dasharray/dashoffset
請輸出:
1. 卡片佈局結構(預設 / 展開 / streaming 三個狀態)
2. 信心分數 SVG 半圓弧的 CSS/SVG 計算方式(可複製)
3. streaming 效果的 CSS keyframe
4. TypeScript Props interface
5. Tailwind className 清單
```
---
---
# GEMINI 指令集
> 以下指令適合直接貼給 Gemini利用超長 context 和 Vision 能力)。
---
## 🔍 GEM-1 — telegram_gateway.py 重構規劃
````
你是後端架構師。請閱讀以下 Python 檔案的完整原始碼6,355 行),為我規劃重構方案。
[將 apps/api/src/services/telegram_gateway.py 的完整內容貼在這裡]
分析任務:
1. 識別這個巨型檔案內有哪些獨立的職責群Responsibility Clusters
2. 每個群的行範圍、主要類別/函式、對外依賴
3. 提出拆分方案(目標:每個新檔案 < 800 行)
- 推薦的新檔案名稱與職責
- 各新檔案之間的依賴順序(無循環依賴)
- 哪些公開 API 需要保持向下相容
4. 評估風險:拆分後哪些 Telegram 功能最容易出問題?
輸出格式:
- 職責矩陣表格(職責 / 行範圍 / 建議新檔)
- 拆分步驟順序(最安全的執行順序)
- 高風險警告清單
````
---
## 🔍 GEM-2 — Dashboard 視覺密度優化(截圖分析)
```
你是 UX 設計顧問,專長 AIOps 指揮官儀表板設計。
[將 dashboard 截圖貼在這裡(可以用 Playwright 截圖或手動截圖)]
產品背景:
- AWOOOI AI 自主化飛輪平台AIOps + 自動修復)
- 飛輪七環detect/sense/reason/decide/execute/verify/learn
- 主要使用者:系統管理員,需要在 1 秒內判斷「現在有沒有問題」
分析任務:
1. 資訊密度評分1-10現有儀表板能否讓使用者在 5 秒內完成「快速健康掃描」?
2. 視覺層次問題:哪些元素搶奪注意力,哪些重要資訊被埋沒?
3. 對比業界案例Datadog / Grafana / PagerDutyAWOOOI 缺少哪些關鍵視覺模式?
4. 5 個具體的「立刻可改」優化建議(不需要大改架構)
5. 飛輪七環的狀態應該如何在這個儀表板上呈現(現在的方案 vs 建議方案)
請提供有視覺參考的具體建議(描述顏色、佈局、組件類型)。
```
---
## 🔍 GEM-3 — 從 OpenAPI JSON 生成 TypeScript Types補 shared-types CI gate
````
你是全端工程師。請根據以下 OpenAPI JSON生成完整的 TypeScript 型別定義。
[將 FastAPI 的 /openapi.json 內容貼在這裡]
要求:
1. 生成 TypeScript 型別interface + union type對應所有 schemas
2. 包含 JSDoc 註解(從 OpenAPI description 欄位取)
3. 按 domain 分組:
- incident-types.tsIncident, Signal, Timeline 相關)
- approval-types.tsApproval, Signature, ApprovalStatus 相關)
- health-types.tsHealthResponse, ComponentHealth 相關)
- drift-types.tsDrift 相關)
- playbook-types.tsPlaybook 相關)
4. 輸出每個型別定義,可以直接放到 packages/shared-types/src/ 目錄
特別注意:
- ApprovalStatus 必須包含 execution_success 和 execution_failed
- RiskLevel 必須包含 high
- ComponentHealth 是物件不是字串
- IncidentResponse 必須包含 signal_count、proposal_count、decision
````
---
---
# 快速指令速查表
| 你想做什麼 | 用哪個 AI | 上方指令 ID |
|-----------|----------|------------|
| 修 approvals 無認證漏洞 | Codex | P0-SEC-1 |
| 修 kubectl shell injection | Codex | P0-SEC-2 |
| 修 Telegram webhook fail-open | Codex | P0-SEC-3 |
| 修 openclaw prompt injection | Codex | P0-SEC-6 |
| 修 ssh_provider regex一行| Codex | P0-SEC-7 |
| 升 Next.js CVE | Codex | P0-CVE-1 |
| 修批准/拒絕按鈕壞了 | Codex | P1-SD-2/3 |
| 修 AI 學習統計 90 天歸零 | Codex | P1-DB-1 |
| 接線飛輪 KPI 指標 | Codex | P1-OB-1 |
| 升降級日誌為 Counter | Codex | P1-OB-2 |
| 修前端 emoji/i18n/響應式 | Codex | P2-FE-1~6 |
| 修 CI lint/typecheck + token | Codex | P2-CI-1/5 |
| 設計 IncidentCard Timeline | Claude Design | W-3 |
| 設計 EmptyState 組件 | Claude Design | W-4 |
| 設計響應式基線 | Claude Design | W-6 |
| 設計飛輪七環 Pipeline | Claude Design | W-8 |
| 設計 AI Decision Card | Claude Design | W-9 |
| 規劃 telegram_gateway 重構 | Gemini | GEM-1 |
| Dashboard 視覺密度分析 | Gemini+截圖)| GEM-2 |
| 生成 shared-types TypeScript | Gemini | GEM-3 |
---
## 執行建議順序
```
Week 1P0 安全):
同時派 → P0-SEC-1, P0-SEC-2, P0-SEC-3, P0-SEC-6, P0-SEC-7, P0-CVE-1
→ critic 審所有 diff
→ prod 驗證
Week 2P1 高優先):
同時派 → P1-SD-2/3, P1-OB-1, P1-OB-2
另跑 → P1-DB-1需 db-expert 審)
Week 3P2 計畫):
同時派 → P2-FE-1~6, P2-CI-1/5
同時跑 → P2-SD-4~8需連動順序
Week 4+P3 視覺):
Claude Design → W-3, W-4, W-6, W-8, W-9設計規格
Codex 實作設計規格
Gemini → GEM-1 規劃後派 refactor-specialist 執行 telegram_gateway 拆分
```
---
_此文件由 12-Agent 全景審查自動產出2026-04-30 台北_