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

32 KiB
Raw Permalink Blame History

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 台北