OG T
|
faf658c4b4
|
feat(sidebar): 4-section nav with AI center active style #d97757
|
2026-04-01 19:53:00 +08:00 |
|
OG T
|
dae401270c
|
feat(i18n): rename to AI Center, add flow pipeline keys
|
2026-04-01 19:52:28 +08:00 |
|
OG T
|
91b42b4bb9
|
feat(infra): add HostGrid 2x2 compact host grid component
|
2026-04-01 19:50:27 +08:00 |
|
OG T
|
354bf7a6f2
|
feat(ai): add NemoNodeAnimation 72x72 SVG with orb-pulse and ring-spin
|
2026-04-01 19:50:05 +08:00 |
|
OG T
|
16ca133955
|
feat(incident): add FlowPipeline 7-node pipeline with lobster animation
|
2026-04-01 19:47:19 +08:00 |
|
OG T
|
c1c7564e41
|
feat(design): add Anthropic Warmth ai-center color tokens
|
2026-04-01 19:44:43 +08:00 |
|
OG T
|
0b04abf990
|
docs(plan): add AI Center v6 redesign implementation plan (13 tasks)
|
2026-04-01 19:39:41 +08:00 |
|
OG T
|
555e808f39
|
fix(ai): ollama 優先於 nvidia — 修復 nemotron-mini-4b JSON 截斷導致 0% 信心
CD Pipeline / build-and-deploy (push) Successful in 6m42s
E2E Health Check / e2e-health (push) Successful in 16s
根本原因: nemotron-mini-4b-instruct 輸出 JSON 被截斷 (raw_response={"confidence": )
→ proposal_parse_failed → fallback Expert System → AI 仲裁 0% 信心
修復: AI_FALLBACK_ORDER 改為 ollama 優先,NVIDIA 降為第二
(Ollama qwen2.5:7b-instruct 在 192.168.0.188:11434 輸出品質穩定)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 19:22:15 +08:00 |
|
OG T
|
4b84e95723
|
docs: AI中心 UI 重設計規格文件 v6
- Anthropic Warmth (#f5f4ed) + OpenClaw Blue (#4A90D9) 色彩系統
- 3欄佈局:Sidebar(200px) | Feed(50%) | RightPanel(50%)
- 完整側邊欄:4區19項(整合 wooo-aiops 所有菜單)
- 事件卡片流程圖 + Q版龍蝦 (橘紅本色 #E85530)
- NemoClaw 白底節點動畫(截圖風格)
- 全面圓角規範
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 19:19:03 +08:00 |
|
OG T
|
a9d8fd9c3c
|
feat(telegram): ADR-050 P2 - detail/history info actions 實作
CD Pipeline (Dev) / build-and-deploy-dev (push) Successful in 2m28s
- _send_incident_detail: 取得事件詳情 + AI 信心條形圖,傳送新訊息保留原始簽核卡片
- _send_incident_history: 頻率統計 (1h/24h/7d/30d + 自動修復次數)
- reanalyze: 保留為開發中 placeholder
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 18:48:04 +08:00 |
|
OG T
|
0bf0a1cea2
|
feat(telegram): ADR-050 P1 - 6鍵 Inline Keyboard + info actions 骨架
CD Pipeline (Dev) / build-and-deploy-dev (push) Successful in 2m39s
CD Pipeline / build-and-deploy (push) Successful in 7m1s
E2E Health Check / e2e-health (push) Successful in 17s
第一行: [✅ 批准] [❌ 拒絕] [🔕 靜默] (nonce 防重放)
第二行: [📋 詳情] [🔄 重診] [📊 歷史] (read-only, action:incident_id 格式)
- security_interceptor: parse_callback_data 支援 2-part info action 格式
- telegram_gateway: _build_inline_keyboard 新增 incident_id 參數
- telegram.py: info_action 短路,不觸發 DB 操作
P2 待實作: detail/reanalyze/history 回傳實際資料 (目前回傳「功能開發中」)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 18:34:26 +08:00 |
|
OG T
|
5b938887c0
|
fix(telegram): 關閉 K8s prod TELEGRAM_ENABLE_POLLING 解決 409 Conflict
CD Pipeline / build-and-deploy (push) Successful in 6m48s
E2E Health Check / e2e-health (push) Successful in 16s
AWOOOI API 與 OpenClaw(192.168.0.188) 同時 Long Polling 造成 409 Conflict,
導致 AI 仲裁降級為規則匹配(0%信心)。
架構原則: OpenClaw 是唯一 Telegram Gateway,K8s 只發送訊息。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 18:09:47 +08:00 |
|
OG T
|
43a370fc11
|
fix(model): IncidentOutcome 舊 Redis 字串格式相容性
CD Pipeline (Dev) / build-and-deploy-dev (push) Successful in 2m38s
CD Pipeline / build-and-deploy (push) Has been cancelled
E2E Health Check / e2e-health (push) Has been cancelled
Type Sync Check / check-type-sync (push) Failing after 22s
舊事件 outcome 存為字串 "resolved",Pydantic v2 無法解析
→ INTERNAL_ERROR on /auto-repair/evaluate/{incident_id}
field_validator mode='before' 將字串轉為 None (安全丟棄)
確保舊資料不引發 incident_parse_error
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 18:03:21 +08:00 |
|
OG T
|
71a4e0f8c8
|
fix(k8s): 修復 dev RBAC RoleBinding 欄位名稱錯誤
CD Pipeline / build-and-deploy (push) Successful in 6m54s
E2E Health Check / e2e-health (push) Successful in 16s
CD Pipeline (Dev) / build-and-deploy-dev (push) Failing after 3m53s
apiRef → name (正確 Kubernetes 欄位名稱)
防止 RoleBinding 建立失敗
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 16:27:12 +08:00 |
|
OG T
|
9913f5dc6d
|
feat(infra): 開發環境分離 + BuildKit cache 修復 + circuit breaker 優化
CD Pipeline / build-and-deploy (push) Successful in 6m52s
E2E Health Check / e2e-health (push) Successful in 17s
CD Pipeline (Dev) / build-and-deploy-dev (push) Failing after 9s
1. k8s/awoooi-dev/: 新建 dev namespace (01-05 配置)
- Namespace + ResourceQuota (cpu 2/4, mem 4Gi/8Gi)
- ConfigMap: ENVIRONMENT=dev, LOG_LEVEL=DEBUG, SHADOW_MODE=false
- Deployment: 1 replica, NodePort 32344, image dev-latest
- RBAC: awoooi-executor-dev ServiceAccount
2. .gitea/workflows/cd-dev.yaml: dev branch CD pipeline
- 觸發: dev branch push
- Build: --no-cache (防 cache poisoning)
- Tag: dev-{sha} / dev-latest
- Deploy: awoooi-dev namespace, health check 32344
- Telegram: [DEV] 前綴通知
3. apps/api/Dockerfile: ARG CACHE_BUST=none (防 BuildKit cache 毒化)
- deps 層 (pip install) 仍可 cache
- src/ 和 models.json 層每次重建
4. .gitea/workflows/cd.yaml: 正式環境 API build 加入 CACHE_BUST=git_sha
- 確保 models.json 等配置變更正確進入 image
5. apps/api/src/services/nvidia_provider.py: timeout 不計入 circuit breaker
- TimeoutException → 只 log,不 record_failure()
- 只有硬性錯誤 (auth/rate limit/exception) 才斷路
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 16:22:21 +08:00 |
|
OG T
|
c9c60c3a61
|
feat(mcp-integrations): Phase S 架構修復 + MCP 整合基礎建設
E2E Health Check / e2e-health (push) Has been cancelled
CD Pipeline / build-and-deploy (push) Has been cancelled
Type Sync Check / check-type-sync (push) Failing after 22s
Phase S 技術債修復 (首席架構師審查 82→完整):
- S-01: generate_alert_fingerprint 移至 AlertAnalyzer.generate_fingerprint() staticmethod
- S-04: 移除 Pydantic v2 deprecated json_encoders (直接用原生 datetime 序列化)
Sentry MCP 整合 (Phase 23):
- ADR-048: Sentry→OpenClaw AI Triage 架構決策
- sentry_webhook_service.py: parse/analyze/create_incident/build_message Service 層
- config.py: SENTRY_WEBHOOK_SECRET (Fail-Closed HMAC-SHA256)
Playwright MCP 整合 (短期):
- smoke.spec.ts: 5 頁面 E2E smoke test (home/dashboard/incidents/approvals/terminal)
- cd.yaml: E2E Smoke Test 步驟 + Telegram 🎭 Smoke 狀態通知
長期規劃 ADR:
- ADR-049: Figma Code Connect 設計系統同步
- ADR-050: Telegram 互動式 Incident 2.0 (6鍵 Inline Keyboard)
- ADR-051: Context7 依賴升級顧問 (Next.js 14→15, FastAPI 0.115→0.128)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 16:20:57 +08:00 |
|
OG T
|
394f85954e
|
fix(api): 修復 Y/n 404 + 停用 Multi-Sig
E2E Health Check / e2e-health (push) Has been cancelled
CD Pipeline / build-and-deploy (push) Has been cancelled
1. proposal_service._load_incident() 改用 incident_service.get_from_working_memory()
- brain engine 使用 awoooi:incidents: prefix,資料實際在 incident: prefix
- 兩個 prefix 不符導致永遠 404 (Y/n 按鈕全部失敗)
- 2026-04-02 ogt
2. trust_engine CRITICAL required_signatures 2→1
- 統帥決策: 所有審核只需 1 層簽核
- 2026-04-02 ogt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 16:16:28 +08:00 |
|
OG T
|
419dc2f8e0
|
fix(nvidia): timeout 60s→30s,NVIDIA 第一保免費,失敗轉 Gemini
CD Pipeline / build-and-deploy (push) Successful in 5m46s
E2E Health Check / e2e-health (push) Successful in 16s
- nvidia_provider.py: NVIDIA_TIMEOUT 60→30s
- models.json: timeout_seconds 60→30s
- configmap: NEMOTRON_TIMEOUT_SECONDS 45→30s, fallback 恢復 nvidia 第一
目標: Nemo 有足夠時間回應(free),失敗快速轉 Gemini(備援),整體機制可運作
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 16:05:19 +08:00 |
|
OG T
|
4c622813af
|
fix(auto-repair): 實際可用的自動修復門檻 (Phase 22 P1)
E2E Health Check / e2e-health (push) Has been cancelled
CD Pipeline / build-and-deploy (push) Has been cancelled
問題: 四道鎖全卡死導致自動修復永遠不觸發
1. configmap: Gemini 排第一 (100ms vs NVIDIA 60s timeout)
2. auto_approve: confidence 0.90→0.65, trust 5→1, playbook 3→1
3. auto_approve: 開放 medium 風險, require_playbook=False
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 16:02:16 +08:00 |
|
OG T
|
eccf61fbc9
|
fix(ai): 修復假信心度 + 解除 Shadow Mode (Phase 22 P1)
CD Pipeline / build-and-deploy (push) Has been cancelled
E2E Health Check / e2e-health (push) Has been cancelled
1. openclaw.py: LLM 截斷時 confidence 0.82→0.0 (禁止偽造信心度)
2. prompts.py: NEMOTRON schema 範例值改用佔位符,防模型照抄 0.75
3. configmap: SHADOW_MODE_ENABLED=false,開放 low 風險自動執行
條件門檻: confidence≥90% + trust_score≥5 + playbook_success≥95%
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 15:59:42 +08:00 |
|
OG T
|
d352673099
|
fix(ai): models.json gemini-1.5-flash → gemini-2.0-flash (404 修復)
CD Pipeline / build-and-deploy (push) Has been cancelled
E2E Health Check / e2e-health (push) Has been cancelled
gemini-1.5-flash 已停用,改用 gemini-2.0-flash。
models.json 上次未跟著 model_registry.py 同步更新。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 15:56:05 +08:00 |
|
OG T
|
5a46998689
|
docs: Secrets 管理手冊 (ADR-035+ 統一 Secrets 真相來源)
CD Pipeline / build-and-deploy (push) Successful in 5m23s
E2E Health Check / e2e-health (push) Successful in 17s
建立 docs/runbooks/SECRETS-MANAGEMENT.md:
- 7 個 Gitea Secrets + 12 個 K8s Secrets 完整清單
- 更新 SOP (API + Web UI)
- 一鍵狀態檢查命令
- 各 key 取得/更新指南
- 緊急狀況處理
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 15:40:48 +08:00 |
|
OG T
|
bd5799dbda
|
fix(cd): 健康檢查改用 break+flag,修復 SSH heredoc exit 0 SIGPIPE
CD Pipeline / build-and-deploy (push) Successful in 5m40s
E2E Health Check / e2e-health (push) Successful in 17s
在 SSH heredoc 裡 exit 0 會讓遠端 shell 退出,但本地 SSH 進程
試圖繼續餵剩餘 heredoc 內容時收到 SIGPIPE,exitcode 變 1。
改用 HEALTH_PASS flag + break,heredoc 自然結束,避免 SIGPIPE。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 15:17:47 +08:00 |
|
OG T
|
55f9a4e358
|
fix(deps): 更新 pnpm-lock.yaml (vitest + 20 個新依賴)
CD Pipeline / build-and-deploy (push) Failing after 6m4s
E2E Health Check / e2e-health (push) Successful in 17s
vitest 已加入 package.json 但 lockfile 未同步,導致 Docker build 的
pnpm install --frozen-lockfile 失敗。執行 pnpm install 更新。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 14:01:32 +08:00 |
|
OG T
|
d7597fb869
|
fix(cd): 排除所有需外部服務的測試 (Redis/Ollama CI 不可達)
CD Pipeline / build-and-deploy (push) Failing after 2m10s
E2E Health Check / e2e-health (push) Successful in 17s
一次排清:
- test_anomaly_counter.py → Redis pool
- test_global_repair_cooldown.py → Redis pool
- test_redis_multisig.py → Redis pool
- test_model_regression.py → Ollama 192.168.0.188:11434
- test_prompt_validation.py → Ollama 192.168.0.188:11434
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 13:28:42 +08:00 |
|
OG T
|
0fd53422c6
|
fix(openclaw): NEMOTRON_SYSTEM_PROMPT confidence/reasoning 移至最前
CD Pipeline / build-and-deploy (push) Failing after 5m36s
E2E Health Check / e2e-health (push) Successful in 17s
Nemo-4B 4B 參數模型輸出長度有限,confidence/reasoning 排在 schema 末尾
時常被截斷,導致 openclaw.py:1045 fallback 補 0.82 假數據。
修復:將 confidence 和 reasoning 移至 schema 最前兩個欄位,確保模型
輸出截斷時仍包含最關鍵欄位。同時明確禁止模型抄範例值。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 13:19:18 +08:00 |
|
OG T
|
350b34c802
|
fix(cd): base64 -w 0 防止長 API key 換行破壞 JSON patch
CD Pipeline / build-and-deploy (push) Has been cancelled
E2E Health Check / e2e-health (push) Has been cancelled
Type Sync Check / check-type-sync (push) Failing after 17s
NVIDIA_API_KEY 長度超過 76 字元,base64 預設換行導致
kubectl patch JSON 解析失敗 (yaml: found unexpected end of stream)。
所有 base64 編碼改用 -w 0 禁止換行。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 13:13:50 +08:00 |
|
OG T
|
22de22c989
|
refactor(phase-s): Phase S 技術債清理 - 五項架構改善
S-01: generate_alert_fingerprint() 移至 alert_analyzer_service (Router→Service)
S-02: 移除廢棄 USE_NEW_ENGINE config (Phase R 已完成歷史使命)
S-03: github_webhook.py linter 清理 (Field unused + delivery_id noqa)
S-04: Pydantic v2 遷移 - approval/incident models (class Config → ConfigDict)
S-05: Skill 09 v1.1 更新 (USE_NEW_ENGINE 廢棄說明)
測試: 393 passed, 零失敗
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 13:12:02 +08:00 |
|
OG T
|
d02efd4998
|
fix(cd): 排除所有 Redis 依賴測試 (CI 環境無 init_redis_pool)
CD Pipeline / build-and-deploy (push) Failing after 23m57s
E2E Health Check / e2e-health (push) Successful in 18s
test_anomaly_counter / test_global_repair_cooldown / test_redis_multisig
三個測試直接依賴 Redis pool,CI pytest 環境不觸發 FastAPI startup
event,導致 RuntimeError: Redis pool not initialized。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 11:44:43 +08:00 |
|
OG T
|
a0e8e41924
|
fix(cd): 排除 test_anomaly_counter.py (CI 無 Redis pool 初始化)
CD Pipeline / build-and-deploy (push) Failing after 37s
E2E Health Check / e2e-health (push) Successful in 17s
TestAnomalyCounterIntegration 需要 Redis pool 初始化,
CI 容器環境未完成此設定,導致 50 passed, 1 error。
使用 --ignore 排除,不影響其他測試。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 11:37:45 +08:00 |
|
OG T
|
384015ec2c
|
perf(cd): 加速 CI/CD - venv 持久化 + Web cache 精準失效 + 合併 SSH
CD Pipeline / build-and-deploy (push) Failing after 50s
E2E Health Check / e2e-health (push) Successful in 16s
- Run API Tests: 持久化 /opt/api-venv,pyproject.toml hash 變才重裝 (~6-7 min)
- Build Web: CACHE_BUST=git_sha 取代 --no-cache,deps 層可 cache (~2-3 min)
- Deploy: ConfigMap + Deploy + Health Check 合併為 2 次 SSH 連線 (~30s)
- 預估總節省: ~8-10 min/run
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 11:17:47 +08:00 |
|
OG T
|
cd6da9c8d6
|
fix(tests): 更新 NVIDIA rate limiter 測試至當前配置值
ai_rate_limiter.py 在 2026-03-31 更新了 NVIDIA 免費版限制值,
但測試未同步更新導致失敗:
- rpm: 5 → 10 (放寬並發控制)
- daily_requests: 100 → 99999 (免費版無限制)
- daily_tokens: 50_000 → 9999999 (免費版無限制)
- total_cost_usd: 0.0 → 999999.0 (修復 $0>=0 永遠 True bug)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 11:15:22 +08:00 |
|
OG T
|
59902f270d
|
fix(tests): 首席架構師審查修復 - 測試套件 + DI 強化 (96/100 OUTSTANDING)
P1 測試修復:
- test_smart_router.py: 更新至當前 API (IntentResult + DIAGNOSE/CONFIG 規範化)
- test_auto_repair_service.py: 注入 _no_cooldown fixture 隔離 Redis 依賴
- test_global_repair_cooldown.py: 加 @pytest.mark.integration 標記
P2 架構改進:
- AutoRepairService: 新增 cooldown_checker DI 參數 (Callable | None)
- global_repair_cooldown: get_redis() 移入 try-except 防止未捕獲 RuntimeError
P3 配置:
- pyproject.toml: 登記 integration pytest marker
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 11:11:50 +08:00 |
|
OG T
|
3879972314
|
fix(cd): 移除 --timeout=60 (pytest-timeout 未在 dev deps)
CD Pipeline / build-and-deploy (push) Has been cancelled
E2E Health Check / e2e-health (push) Has been cancelled
pytest-timeout 不在 pyproject.toml dev deps,新 venv 環境沒有安裝。
移除 --timeout=60 參數。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 11:04:53 +08:00 |
|
OG T
|
e6f6734f39
|
fix(telegram): Redis Leader Election 解決多 Pod 409 Conflict
CD Pipeline / build-and-deploy (push) Has been cancelled
E2E Health Check / e2e-health (push) Has been cancelled
問題: 2 個 API Pod 同時 getUpdates → 互相 409 → 兩個都失敗
根本原因: explicit env TELEGRAM_ENABLE_POLLING=false 被 kubectl patch 設入
deployment,覆蓋 ConfigMap 的 true (feedback_k8s_env_precedence.md 違規)
修復步驟:
1. kubectl patch 移除 deployment 的 explicit env override
2. 實作 Redis Leader Election 防止多 Pod 競爭
- 使用 SET NX EX=45 取得 Leader Lock
- _leader_renewer(): 每 20s 續約,確保 Leader 持有 Lock
- _leader_watcher(): 非 Leader Pod 每 30s 嘗試接管
- 409 時主動釋放 Lock,Watcher 競爭接管
結果: 一個 Pod 正常 polling,另一個 Pod 進入 Watcher 待命模式
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 11:04:10 +08:00 |
|
OG T
|
b3e30e7d84
|
fix(cd): 修復 Telegram 通知 400 錯誤 - 改用 printf + data-urlencode
CD Pipeline / build-and-deploy (push) Failing after 40s
E2E Health Check / e2e-health (push) Successful in 19s
%0A 在 curl -d 不會被 Telegram 正確解析導致 400。
改用 printf '%b' + --data-urlencode 'text@-' 管道方式,
確保換行符正確 URL encode 後傳送。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 11:00:20 +08:00 |
|
OG T
|
f7e6301465
|
fix(cd): 改用 python venv 避免 PEP 668 外部管理環境限制
CD Pipeline / build-and-deploy (push) Failing after 10s
E2E Health Check / e2e-health (push) Successful in 17s
uv pip install --system 在新版 Docker runner 中被 PEP 668 阻擋。
改用 python3 -m venv /tmp/api-venv 隔離環境再安裝依賴。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 10:41:30 +08:00 |
|
OG T
|
4df155c65f
|
fix(cd): 修復 pip install PEP 668 externally-managed-environment 錯誤
CD Pipeline / build-and-deploy (push) Failing after 14s
E2E Health Check / e2e-health (push) Successful in 16s
pip install uv 在新版 Docker runner 中被 PEP 668 阻擋。
加入 --break-system-packages 允許在系統 Python 安裝 uv。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 10:40:01 +08:00 |
|
OG T
|
b804c574c8
|
fix(cd): 修復 YAML 語法錯誤 - CD 管道從 77d0fe7 後完全停止觸發
CD Pipeline / build-and-deploy (push) Failing after 13s
E2E Health Check / e2e-health (push) Successful in 16s
根本原因: Notify 步驟中的 text= 參數包含真實換行符,
Gitea YAML 解析器在 line 51 報錯「could not find expected ':'」,
導致 cd.yaml 無法被解析,整個 CD 管道失效超過 10+ 次 push。
修復: 換行符改用 URL encode %0A,符合 Telegram Bot API 格式。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 10:35:16 +08:00 |
|
OG T
|
45e194cefb
|
fix(cd): 強制重建 Web 映像,修復 CSRF bundle 快取問題
E2E Health Check / e2e-health (push) Successful in 16s
BuildKit inline cache 導致 COPY . . 層被重用,
Phase 22 CSRF fix (credentials:include) 未進入 JS bundle。
移除 --cache-from + --no-cache 強制完整重建。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 09:36:46 +08:00 |
|
OG T
|
6fed8be8c4
|
docs(adr): ADR-024 R4 Router 瘦身標記完成
E2E Health Check / e2e-health (push) Successful in 17s
Type Sync Check / check-type-sync (push) Failing after 22s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 09:27:40 +08:00 |
|
OG T
|
411880842f
|
refactor(router): R4 #129 AlertAnalyzer 遷移至 services 層
ADR-024 Router 層瘦身 R4: 將業務邏輯從 Router 移出至正確層次。
變更:
- 新增 src/models/webhook.py: AlertPayload + AlertResponse 移至 models 層
- 新增 src/services/alert_analyzer_service.py: AlertAnalyzer (141行) 移至 services 層
- RISK_MAPPING / ACTION_MAPPING / BLAST_RADIUS_MAPPING 對應表
- analyze() 方法含 K8s 資源名稱正規化 (ADR-016)
- webhooks.py: 移除重複定義,改為 import,-243行
Router 層 webhooks.py 已符合 ADR-024 禁止清單規範:
AlertAnalyzer 不再存在於 Router 層。
R4 狀態: #127✅ #128✅ #129✅ #130✅ (全部完成)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 09:27:23 +08:00 |
|
OG T
|
5086bafa36
|
docs: ADR-045 Telegram Gateway 統一到 K8s AWOOOI API
記錄 2026-03-31 已實施的架構決策:
- 統一 Telegram 到 K8s AWOOOI API Webhook 模式
- 解決 OpenClaw (188) Long Polling 雙軌競爭問題
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 09:17:08 +08:00 |
|
OG T
|
44840f5e73
|
fix(service): #123 proposal_service.py 修正 key prefix + 移除重複邏輯
ADR-046 修復: proposal_service 使用錯誤 Redis key prefix "incident:"
(brain 使用 "awoooi:incidents:"),導致 R-R2 後 load/persist 失效。
變更:
- _load_incident(): 委派給 IncidentEngineAdapter.get_incident()
(正確 key prefix,含 brain→local 型別轉換)
- _persist_incident(): Redis 部分委派給 brain DualIncidentMemory
透過 local_to_brain() 轉換後儲存 (key prefix 一致)
- 移除 _record_to_incident() 重複邏輯 (已由 IncidentEngineAdapter 處理)
- 移除 INCIDENT_KEY_PREFIX 常數
- 移除 get_redis() 直接依賴
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-01 09:11:57 +08:00 |
|
OG T
|
a94bb57d8b
|
feat(types): ADR-046 IncidentConverter + IncidentEngineAdapter
實作 ADR-046 Option B: IncidentConverter 轉換層,解決
BrainIncident (lewooogo-brain) 與 LocalIncident (apps/api) 型別邊界問題。
變更:
- 新增 src/utils/incident_converter.py
- brain_to_local(): BrainIncident → LocalIncident
- local_to_brain(): LocalIncident → BrainIncident
- ESCALATED → MITIGATING 映射 (brain 無 ESCALATED)
- incident_engine.py: 新增 IncidentEngineAdapter 包裝層
- process_signal() / get_incident() 輸出轉換為 LocalIncident
- get_incident_engine() 返回 IncidentEngineAdapter
- incident_memory.py: 加入 brain_to_local import,更新 _record_to_incident 說明
- ADR-046: 標記三個轉換點全部完成
解鎖: #123 proposal_service.py 清理 (下一步)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-03-31 22:47:54 +08:00 |
|
OG T
|
95de7e0e15
|
fix(web): 活躍事件 Y/n 按鈕補上 CSRF Token (P0 根本原因)
E2E Health Check / e2e-health (push) Successful in 19s
問題: DualStateIncidentCard 的 Y/n 按鈕呼叫 apiClient.signApproval/rejectApproval
時,沒有帶 X-CSRF-Token header 也沒有 credentials: 'include'
後端返回 403 CSRF token cookie missing
修復:
- api-client.ts: signApproval/rejectApproval 加入 csrfToken 參數
+ X-CSRF-Token header + credentials: 'include'
- dual-state-incident-card.tsx: 加入 useCSRF() hook,
將 csrfToken 傳入 API 呼叫,更新 useCallback deps
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-03-31 22:45:27 +08:00 |
|
OG T
|
2ba61acf72
|
fix(api): Phase R-R2.2 首席架構師 72/100 P2 修復
P2-01 signal_worker.py: persisted_to_pg 改用 getattr 防 BrainIncident AttributeError
P2-02 IIncidentEngine Protocol: update_incident_status → update_status 對齊 brain 實作
P2-03 config.py USE_NEW_ENGINE: 標記失效 + 回滾路徑更正 (git revert 而非 kubectl)
ADR-046: Option B (IncidentConverter) 決策完成,待實作清單更新
ADR-024: 審查結論 + 正式回滾指令更新
Skill 02: v2.5 版本記錄
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-03-31 22:33:08 +08:00 |
|
OG T
|
cd91560e0b
|
docs: Phase R-R2 完成文件更新 + ADR-046 型別統一
- ADR-024: 更新執行進度 (R1✅ R2✅ R3✅ R4待執行)
- ADR-046: 新增跨套件 Incident 型別統一治理 (待決策)
推薦 Option B: IncidentConverter 轉換層
- Skill 02: v2.5 記錄 Phase R-R2 + R-R2.1 + ADR-046
- LOGBOOK: 更新當前狀態
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-03-31 22:17:44 +08:00 |
|
OG T
|
d17b67c823
|
fix(api): Phase R-R2.1 修復架構審查 P0+P1 問題
P0-01: IncidentDbAdapter._record_to_incident 返回型別標注為 Any
(實際返回 BrainIncident,非本地 Incident,避免型別誤報)
P0-02: get_incident_engine() 加入 try/except ImportError 保護
(仿照 get_incident_memory() 錯誤處理模式,確保可觀測性)
P1-01: 移除 IncidentMemoryAdapter 死碼 (-170 行 Lua scripts + _ensure_lua_scripts)
(lewooogo-brain 不調用此方法,已確認)
P1-03: IncidentMemoryAdapter.save_incident() 委派給 self._memory
(修復 key prefix 不一致: "incident:" vs "awoooi:incidents:")
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-03-31 22:15:06 +08:00 |
|
OG T
|
67ef98e737
|
docs: 更新 LOGBOOK - Phase R-R2 完成 (#121 #122)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
2026-03-31 22:04:13 +08:00 |
|