OG T
|
604d8eea37
|
fix(schema-drift): 補齊 prompts.py + Claude API schema enum 同步 (ADR-090)
CD Pipeline / build-and-deploy (push) Successful in 12m27s
問題: fe77e6d 擴充了 models/ai.py enum 至 8 值,但兩個地方未同步:
1. core/prompts.py L77: 缺 INVESTIGATE、OBSERVE
2. core/prompts.py L176 (NEMOTRON_SYSTEM_PROMPT): 缺 APPLY_HPA、INVESTIGATE、OBSERVE
3. openclaw.py L564 (_call_claude tools schema): 舊 4 值 enum 約束
影響: LLM 不知道可以輸出 INVESTIGATE/OBSERVE,只能選舊 4 值
修復: 三處統一對齊 8 個 suggested_action 值
RESTART_DEPLOYMENT|DELETE_POD|SCALE_DEPLOYMENT|APPLY_HPA|TUNE_RESOURCES|INVESTIGATE|OBSERVE|NO_ACTION
Closes: ADR-090 Prompt-Model 三層同步鐵律
2026-04-17 ogt + Claude Sonnet 4.6
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-17 22:10:18 +08:00 |
|
OG T
|
e4bc3ec0ee
|
docs(hard-rules): Prompt-Model 同步鐵律 — LLM Schema Drift 禁令
血的教訓 (2026-04-17): SuggestedAction enum prompt/model 不同步
→ NemoTron 輸出 investigate → Pydantic 爆炸 → 全系統 fallback 待分析
新增強制鐵律:
- 修改 prompts.py 必須同步更新 models/ai.py
- 接收 LLM JSON 的 Model 必須有 validator + fallback
- 禁止靜默死亡(必須 log 具體失敗欄位)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-17 21:48:50 +08:00 |
|
AWOOOI CD
|
8e43d52afb
|
chore(cd): deploy fe77e6d [skip ci]
|
2026-04-17 13:45:54 +00:00 |
|
OG T
|
fe77e6d297
|
fix(ai): SuggestedAction enum 擴充 + Pydantic fallback 防護
CD Pipeline / build-and-deploy (push) Successful in 10m48s
Type Sync Check / check-type-sync (push) Failing after 2m52s
根本原因: NemoTron 輸出 "investigate" → Pydantic 只接受 4 個值 → 爆炸
→ openclaw_analysis_parse_failed → analysis_result=None → 全部 fallback 卡片顯示「待分析」
修復:
1. SuggestedAction enum 新增 INVESTIGATE/OBSERVE/APPLY_HPA/TUNE_RESOURCES
(prompt.py 列了 6 個,enum 只有 4 個,prompt/model 不同步是根源)
2. normalize_suggested_action validator: uppercase + 別名映射 + 未知值 fallback NO_ACTION
確保任何 LLM 輸出都不會讓 Pydantic 爆炸導致 analysis_result = None
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-17 21:36:36 +08:00 |
|
AWOOOI CD
|
5d715e16ee
|
chore(cd): deploy c759b4e [skip ci]
|
2026-04-17 08:38:18 +00:00 |
|
OG T
|
c759b4eeab
|
fix(webhook+decision): ADR-089 async webhook + 超時髒資料修復
CD Pipeline / build-and-deploy (push) Successful in 10m16s
P0 — Webhook async (ADR-089):
- Alertmanager 收到告警立即回 202,不再同步等 90s LLM
- 新增 _process_new_alert_background():LLM 分析/Approval/Incident/Telegram 全進背景
- 根治 Alertmanager Fallback 風暴(超時 → 重送 → 指數退避風暴)
P1 — 超時髒資料 (decision_manager):
- _package_to_proposal_data: blocked_reason 禁止進 desc_parts(禁進卡片)
- _push_decision_to_telegram: suggested_action fallback 改「待分析」,禁止 description 流入
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-17 16:29:24 +08:00 |
|
AWOOOI CD
|
f2ac5d01c6
|
chore(cd): deploy 9d6aa7e [skip ci]
|
2026-04-17 08:24:05 +00:00 |
|
OG T
|
9d6aa7ea45
|
feat(trust): ADR-088 Trust Score 持久化 — L4 自動放行核心
CD Pipeline / build-and-deploy (push) Successful in 10m40s
TrustScoreManager 從記憶體升級為 PostgreSQL 持久化,
Pod 重啟後信任分數不再歸零,AI 能真正累積到 L4 自動放行門檻。
變更:
- migrations/adr088_trust_score_persistence.sql: trust_records 表
- db/models.py: TrustRecordDB ORM model
- repositories/interfaces.py: ITrustRepository Protocol
- repositories/trust_repository.py: PG upsert ON CONFLICT DO UPDATE
- services/trust_engine.py: bulk_load() 啟動 warm-up
- services/learning_service.py: _persist_trust() + 2 call sites
- main.py: 啟動時 load_all() → bulk_load()
流程: 批准 5 次 → score=5 寫入 DB → Pod 重啟 → warm-up 讀回
→ evaluate_adjusted_risk MEDIUM→LOW → 自動執行
2026-04-17 ogt + Claude Sonnet 4.6(亞太): ADR-088
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-17 16:14:44 +08:00 |
|
AWOOOI CD
|
148d59a0e4
|
chore(cd): deploy 1ae9e9f [skip ci]
|
2026-04-17 07:32:22 +00:00 |
|
OG T
|
ba8cf6105d
|
docs(adr): ADR-086 Telegram UI 清洗規範 + ADR-087 AutoApprove kubectl 閘門
ADR-086: Telegram 通知卡片 UI 清洗規範
- _parse_debate_summary() 設計決定與各 TYPE 欄位清洗規則
- TYPE-3 鍵盤重構:批准/拒絕永遠第一行
- 技術債:_parse_debate_summary 提升模組層級(P1-1)
ADR-087: AutoApprove 安全強化 — kubectl 強制執行閘門
- 條件 1d 設計:_raw_action 語意 + NO_EXECUTABLE_ACTION reason
- Solver Nemo 格式 kubectl 驗證
- 降級指令改為真實 kubectl 唯讀調查
- min_trust_score=0 保留理由記錄(TrustEngine 記憶體持久化技術債)
- P0-2 風險記錄:kubectl exec 未加入 _DESTRUCTIVE_PATTERNS
2026-04-17 ogt + Claude Sonnet 4.6(亞太): Session 技術債清理
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-17 15:25:34 +08:00 |
|
OG T
|
1ae9e9f389
|
fix(code-review): P0-1 action fallback 語意修正 + P1-2 reason enum + P2-2 secops 清洗
CD Pipeline / build-and-deploy (push) Successful in 10m7s
Code Review 發現 (2026-04-17 首席架構師審查):
P0-1 auto_approve.py 條件 1d 語意修正:
- 原:用 `action` 變數(已 fallback = action or kubectl_command)做 kubectl 判斷
→ action="" + kubectl_command="kubectl get pods" → action="kubectl get pods" → 1d 通過
→ _kubectl_cmd 與 action 同值(重複判斷同一來源),掩蓋 action 本身是自然語言的情況
- 修:改用 proposal_data.get("action", "") 原始值(_raw_action)
→ 直接檢查 action 欄位本身,邏輯語意明確
P1-2 auto_approve.py NO_EXECUTABLE_ACTION 新增:
- 新增 AutoApproveReason.NO_EXECUTABLE_ACTION enum 值
- 條件 1d 改用此 reason(原 NO_PLAYBOOK 語意為「無匹配 Playbook」,不適用此場景)
- 避免污染 KM 飛輪學習資料的根因分類(ADR-068)
P2-2 decision_manager.py secops 分支:
- threat_behavior 改用 _parse_debate_summary → 取 diagnosis 欄位
- 與 BUG-A/BUG-C 修復一致,不再傾倒完整 debate_summary 前 150 字
ADR-082: Phase 2 多 Agent 協作
2026-04-17 ogt + Claude Sonnet 4.6(亞太): Code Review 後修正
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-17 15:23:35 +08:00 |
|
AWOOOI CD
|
b80836329e
|
chore(cd): deploy 93205ce [skip ci]
|
2026-04-17 06:58:39 +00:00 |
|
OG T
|
93205ceab0
|
fix(auto_approve+solver): P1 kubectl gate + P2 Nemo path kubectl 強制
CD Pipeline / build-and-deploy (push) Successful in 9m56s
P1 安全漏洞 (auto_approve.py):
- 新增條件 1d:action 必須含 kubectl 關鍵字才可自動執行
- Solver 經 OpenClaw Nemo 路徑輸出自然語言 → 條件 1c 通過但無法執行
- 修復:自然語言 action → 降級人工審核(NO_PLAYBOOK reason)
P2 執行障礙 (solver_agent.py):
- Nemo 格式路徑:action_title 不含 kubectl → return [] → 觸發 _degraded_plan
- _default_action_for_category:舊自然語言 → 真實 kubectl 調查指令
- 降級路徑現在輸出 kubectl get/top/exec 等唯讀指令,可被 auto_approve 1d 正確評估
ADR-082: Phase 2 多 Agent 協作
2026-04-17 ogt + Claude Sonnet 4.6(亞太): P1+P2 hotfix
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-17 14:49:53 +08:00 |
|
OG T
|
f421e652d3
|
fix(telegram): BUG-C TYPE-3 排版清洗 + 批准/拒絕永遠置頂(ADR-075 UI 第三波修復)
CD Pipeline / build-and-deploy (push) Has been cancelled
Checkpoint 1 — decision_manager.py TYPE-3 root_cause 清洗:
- 舊: root_cause=_smt(reasoning, 500) → debate_summary 全文(診斷/方案/審查/質疑)全部傾倒到 AI 診斷欄
- 新: _parse_debate_summary 只取 diagnosis 欄位 + _smt 截斷 300 字
- 移除 _requires_human 變數(已無用途)
Checkpoint 2 — telegram_gateway.py _build_inline_keyboard 按鈕順序重構:
- 舊: K8s 類別按鈕置頂,批准/拒絕受 requires_human_approval 控制 → 死卡
- 新: [✅ 批准][❌ 拒絕] 永遠第一行,K8s/DB/Host 操作按鈕置後
- 移除 requires_human_approval 參數(邏輯已簡化為無條件置頂)
修改範圍: decision_manager.py else 路由段 + _build_inline_keyboard + send_approval_card 簽名,
telegram_gateway.py 模板/訊息格式零改動。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-17 14:42:29 +08:00 |
|
AWOOOI CD
|
682f974a37
|
chore(cd): deploy 418d735 [skip ci]
|
2026-04-17 06:23:07 +00:00 |
|
OG T
|
418d73540b
|
fix(telegram): BUG-A TYPE-1 + BUG-B TYPE-4D 資料前處理(ADR-075 UI 第二波修復)
CD Pipeline / build-and-deploy (push) Successful in 10m25s
BUG-A (TYPE-1 純資訊通知):
- 舊: message=reasoning[:200] → debate_summary 全文傾倒(診斷/方案/審查/質疑一起出現)
- 新: _parse_debate_summary(reasoning) 只取 diagnosis 欄位 + _smt 截斷 200 字
BUG-B (TYPE-4D Config Drift):
- 舊: diff_summary=description[:500] → LLM 輸出的 JSON 原文直接顯示在 <pre> 區塊
- 新: JSON Catcher — json.loads(description) 成功則格式化「📝建議操作/📖說明/⏪回滾方案」
失敗 (JSONDecodeError/TypeError/AttributeError) → 平滑降級為純文字截斷
僅修改 decision_manager.py 路由準備段,telegram_gateway.py 模板層零改動。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-17 14:14:10 +08:00 |
|
AWOOOI CD
|
f677b72114
|
chore(cd): deploy 6baa2e9 [skip ci]
|
2026-04-17 06:07:05 +00:00 |
|
OG T
|
6baa2e91da
|
fix(telegram): 修復死卡按鈕 + 重複渲染 + 智能截斷三連修
CD Pipeline / build-and-deploy (push) Successful in 10m26s
問題 1 — 批准/拒絕按鈕消失(死卡)
根因:_build_inline_keyboard 有 alert_category 動態按鈕時走 category 路徑,
approve/reject 行被跳過 → requires_human_approval 卡片無審核扳機
修復:新增 requires_human_approval 參數;True 時強制在動態按鈕後插入批准/拒絕行
影響:decision_manager 傳入 proposal_data.requires_human_review
問題 2 — TYPE-8M 三欄重複渲染
根因:diagnosis/system_impact/probable_cause 全用 reasoning[:100] → 同一段字
修復:新增 _parse_debate_summary(),拆分 debate_summary 的「診斷/方案/安全審查/質疑」
各欄位填入不同語意的組件
問題 3 — 幽靈截斷「質疑:無(通」
根因:粗暴 [:N] 在括號/中文字中間切斷
修復:新增 _smart_truncate(),在句子邊界(。!?;,)截斷,補 …[截斷] 標記
驗證:verify_telegram_ui.py 全部通過(括號平衡 ✅、欄位不重複 ✅、按鈕存在 ✅)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-17 13:57:42 +08:00 |
|
AWOOOI CD
|
f9b052d648
|
chore(cd): deploy 0ab92c2 [skip ci]
|
2026-04-17 05:37:19 +00:00 |
|
OG T
|
0ab92c20d6
|
fix(telegram): root_cause 截斷上限 300→500 — 修復「質疑:無(通」幽靈重現
CD Pipeline / build-and-deploy (push) Successful in 10m31s
根因:debate_summary 結構為「診斷(≤220字);方案;安全審查;質疑」
診斷假設長時總長超過 300 chars → root_cause 截斷在「通」字
修復:300 → 500(Telegram 單卡 4096 限制,安全)
2026-04-17 ogt + Claude Sonnet 4.6
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-17 13:28:16 +08:00 |
|
OG T
|
58d9c0637a
|
fix(drift): drift_narrator 改用 OpenClaw AI Router — 修復「研判原因」空白
根因:drift_narrator_service.py 的 _generate_narrative() 直接呼叫
Ollama httpx (192.168.0.111:11434),繞過 AI Router,無 fallback。
192.168.0.111 為死亡 IP → httpx 連線失敗 → 降級 fallback_narrative()
→ fallback 中 interpretation.explanation 存在但顯示層截斷 → 空白
修復:改用 get_openclaw().call(prompt),統一走 AI Router
同 drift_interpreter.py 的修法(d952435)
移除 unused httpx import
2026-04-17 ogt + Claude Sonnet 4.6
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-17 13:28:16 +08:00 |
|
AWOOOI CD
|
0247058d92
|
chore(cd): deploy 5dae610 [skip ci]
|
2026-04-17 05:26:42 +00:00 |
|
OG T
|
5dae6108fb
|
fix(cd): rebase 衝突改 -X theirs,kustomization.yaml 永遠採用當次 image tag
CD Pipeline / build-and-deploy (push) Successful in 10m47s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-17 13:17:20 +08:00 |
|
AWOOOI CD
|
2f3d2faf4d
|
chore(cd): deploy ce731c8 [skip ci]
|
2026-04-17 04:49:52 +00:00 |
|
OG T
|
e0bfcc7bd6
|
fix(phase5): 修復 Solver action 格式 — 強制輸出 kubectl 命令
CD Pipeline / build-and-deploy (push) Failing after 9m33s
根因:_build_prompt() 的 action 範例為 "restart_service:awoooi-api"(自訂格式),
LLM 模仿此格式輸出自然語言描述而非 kubectl 命令。
影響鏈:
Solver action = 自然語言描述
→ auto_approve Condition 1c 拒絕(無 kubectl 關鍵字)
→ _auto_execute() 永不被調用
→ blast_radius_calculator 永不被調用
→ blast_radius_score fill rate = 0/14 = 0%(Phase 5 驗收指標未達)
修復:
1. blast_radius 參考從抽象描述改為實際 kubectl 命令示例
2. 明確要求 action 欄位必須是真實 kubectl 命令(不可用自然語言)
3. 正確範例:kubectl rollout restart deployment/awoooi-api -n awoooi-prod
預期效果:LLM 輸出 kubectl 命令 → auto_approve 通過(低 blast_radius 情境)
→ blast_radius_calculator 被調用 → fill rate 趨向 100%
2026-04-17 ogt + Claude Sonnet 4.6
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-17 12:44:36 +08:00 |
|
OG T
|
ce731c8ceb
|
fix(ci): volume mount 不可 rm -rf,改 find -mindepth 1 -delete
CD Pipeline / build-and-deploy (push) Failing after 2m41s
/opt/api-venv 是 Docker volume mount,刪目錄本身會 Device or resource busy
改清空內容保留 mount point
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-17 12:26:37 +08:00 |
|
OG T
|
b7c2b691bb
|
fix(p2-backlog): 修復 suggested_action「待分析」— action 空時 fallback 到 description
CD Pipeline / build-and-deploy (push) Failing after 1m26s
根因:_push_decision_to_telegram() 的 suggested_action 只有兩條路:
- action 有值 → 顯示 action[:120]
- action 空 → 顯示「待分析」
但 _package_to_proposal_data() 已從 hypothesis 組出 description
(含「根因:...(信心 X%);方案:...」),此時 action="" 卻還是顯示「待分析」
導致 SRE 在 Telegram 卡片看不到 AI 的診斷結論。
修復:action 空時,優先用 description[:120] 作為 suggested_action
(description 已包含根因摘要,比「待分析」有意義)
fallback chain: action → description → "待分析"
2026-04-17 ogt + Claude Sonnet 4.6
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-17 11:48:49 +08:00 |
|
OG T
|
78b9bfa2ac
|
ci: 觸發 pipeline 驗證 python3.11 runner image + 快取
|
2026-04-17 11:43:24 +08:00 |
|
AWOOOI CD
|
f5ca9bfb1b
|
chore(cd): deploy 0388e50 [skip ci]
|
2026-04-17 03:30:44 +00:00 |
|
OG T
|
0388e50d0e
|
fix(p1-backlog): 修復「待分析」死結與 Telegram 訊息截斷
CD Pipeline / build-and-deploy (push) Successful in 30m25s
問題 1:REQUEST_REVISION → 待分析
根因:safe_candidates=[] → selected=None → recommended_action=None
→ decision_manager action="" → TG 卡顯示「待分析」(資訊流斷裂)
修復 coordinator_agent.py:
無安全候選時回退至 Solver 原始最優方案
標記「[Reviewer 未核准,僅供參考] {action}」
SRE 永遠能看到 AI 建議,資訊流絕不中斷
問題 2:debate_summary 在 (blast_radius... 中間截斷顯示 (bl
根因:root_cause=reasoning[:150] — 150 字元對中文 debate_summary 過短
修復 decision_manager.py:
root_cause 截斷 150 → 300
suggested_action 截斷 80 → 120
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-17 11:12:02 +08:00 |
|
AWOOOI CD
|
00e9fb8d4b
|
chore(cd): deploy d952435 [skip ci]
|
2026-04-17 02:46:34 +00:00 |
|
OG T
|
d952435b60
|
fix(drift): 改用 OpenClaw AI Router 取代 Ollama httpx 直連
CD Pipeline / build-and-deploy (push) Successful in 32m34s
根因:_call_nemotron() 直接呼叫 Ollama httpx(settings.OLLAMA_URL)
繞過 AI Router,無 fallback → "All connection attempts failed"
→ Telegram 卡顯示「意圖分析失敗:All connection attempts failed」
修復:改走 get_openclaw().call(prompt)
自動享有 Provider 降級與 fallback 機制(與其他 Agent 一致)
廢棄:BUG-001 httpx 直連繞過法(nvidia_provider 介面已穩定)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-17 10:27:39 +08:00 |
|
OG T
|
0c15fa5988
|
refactor(decision): 狀態機重構 — YAML NO_ACTION 閘門上移至決策路由中樞
CD Pipeline / build-and-deploy (push) Has been cancelled
架構師指令(2026-04-17):通知層禁止查詢業務邏輯。
撤銷 c05bcdb 的 inline YAML 查詢(義大利麵補丁),
將 NO_ACTION / INVALID_TARGET 判斷移至正確位置。
重構方向:
① 移除 _push_decision_to_telegram() 的 inline YAML 查詢
→ 通知層只做 blocked_reason → NotificationType 轉譯(Single Responsibility)
② 新增 decide() 第 4c 步:YAML NO_ACTION 路由閘門
位置:_dual_engine_analyze() 返回後、auto_approve.evaluate() 之前
邏輯:
- NO_ACTION → blocked_reason="YAML: NO_ACTION" + is_informational_only=True
→ 短路跳過 auto_approve + Blast Radius → TYPE-1(或 critical → TYPE-4)
- INVALID_TARGET → blocked_reason="INVALID_TARGET-..." → 短路 → TYPE-4
- 閘門查詢失敗 → 靜默降級,繼續正常流程
Checkpoint 覆蓋:
CP1 上移 YAML 評估層 ✅
CP2 短路跳過 auto_approve ✅
CP3 通知層純粹轉譯 ✅
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-17 10:20:01 +08:00 |
|
OG T
|
c05bcdbbd4
|
fix(decision): inline YAML NO_ACTION 補查 — 修復 Phase 2 路徑盲點
CD Pipeline / build-and-deploy (push) Failing after 4m0s
根因:Phase 2 (agent debate → auto_approve 拒絕 → 直接推 TG) 不經過
auto_execute() 的 YAML check,Coordinator 不設 blocked_reason。
PostgreSQL disk / host resource 等 NO_ACTION 規則告警在 Phase 2
路徑仍顯示「ACTION REQUIRED」卡片(TYPE-3),而非 TYPE-1 資訊卡。
修復:_push_decision_to_telegram() 在 blocked_reason 為空時,補做一次
alertname inline YAML 查詢,任何路徑(Phase 2 / Expert / Webhook)
都能正確偵測 NO_ACTION → TYPE-1 / critical NO_ACTION → TYPE-4。
生產驗證觸發:INC-20260416-C365D0 PostgreSQL disk alert 顯示 ACTION REQUIRED
而非 TYPE-1,確認全景 Code Review 遺漏此執行路徑。
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-17 10:15:28 +08:00 |
|
AWOOOI CD
|
f9d08de3a2
|
chore(cd): deploy 149065e [skip ci]
|
2026-04-16 16:05:05 +00:00 |
|
OG T
|
149065e3de
|
perf(e2e): CI smoke test 改 retain-on-failure 降低錄影 overhead
CD Pipeline / build-and-deploy (push) Successful in 51m8s
E2E Health Check / e2e-health (push) Successful in 3m18s
video/screenshot 從 'on' 改為 retain-on-failure/only-on-failure
CI 遠端 smoke test 預計從 13min+ 降至 ~1min
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-16 23:44:20 +08:00 |
|
AWOOOI CD
|
a6a1d4d95c
|
chore(cd): deploy 83ab5e3 [skip ci]
|
2026-04-16 15:24:24 +00:00 |
|
OG T
|
83ab5e32d7
|
fix(happy-path): Happy Path 全境加固 — INVALID_TARGET + critical NO_ACTION + 空指令攔截
CD Pipeline / build-and-deploy (push) Has been cancelled
問題 1 (P0) — deployment/unknown 無效重啟:
- alert_rule_engine: 追蹤 _invalid_target flag,回傳 blocked_reason="INVALID_TARGET-..."
- decision_manager: auto_execute 路徑偵測 INVALID_TARGET → 提早返回 + TYPE-4 人工確認
- auto_approve: 新增條件 1c — action 為空字串直接拒絕,防止誤報「即將執行」
問題 2 (P1) — critical+NO_ACTION 靜默:
- decision_manager: blocked_reason 感知層重構
① INVALID_TARGET → TYPE-4
② NO_ACTION + critical → TYPE-4(升級,SRE 不可錯過)
③ NO_ACTION + 非 critical → TYPE-1(維持純資訊卡)
問題 3 (P1) — 規則匹配信心黑洞:
- auto_approve 條件 1c 確保空 action 不通過 auto-approve
即便 is_rule_based=True 也無法在無指令時自動執行
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-16 22:57:50 +08:00 |
|
OG T
|
0077ff9758
|
fix(solver): 傳遞 hypothesis 作為 alert_context 給 OPENCLAW_NEMO
CD Pipeline / build-and-deploy (push) Has been cancelled
根因:solver 呼叫 openclaw.call(prompt) 不傳 context
→ nemo fallback 把 prompt[:500](系統說明「軍師 Agent」)
當 signal description → LLM 回傳垃圾方案描述
修復:把 top.description 放進 alert_context.signals
讓 nemo 看到真實根因假設(與 diagnostician 同模式 7eb8375)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-16 22:51:30 +08:00 |
|
OG T
|
92b39ab840
|
fix(no-action-notify): YAML NO_ACTION 告警改為 TYPE-1 資訊通知(移除無意義審核按鈕)
CD Pipeline / build-and-deploy (push) Has been cancelled
根因:
- host_resource/postgresql_disk_monitoring YAML 規則設 NO_ACTION
- 但 classify_notification() 不知道 NO_ACTION
- confidence=0.2(感應器無資料)→ 判為 TYPE-4(信心不足需人工審核)
- SRE 看到「審核批准/拒絕」按鈕,卻沒有任何自動修復動作可執行 → 毫無意義
修復:
- _push_decision_to_telegram 偵測 blocked_reason 含 "NO_ACTION"
- 強制 _notif_type = TYPE-1(純資訊通知,無審核按鈕)
- SRE 看到資訊卡「主機 CPU/負載/磁碟告警 (觀察即可)」而非假的審核請求
2026-04-16 ogt + Claude Sonnet 4.6 (台北時區)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-16 22:37:15 +08:00 |
|
OG T
|
7eb837567d
|
fix(diagnostician): 修復 'AI 深度診斷' 垃圾根因顯示
CD Pipeline / build-and-deploy (push) Has been cancelled
根因三層鏈:
1. openclaw.call(prompt) 不傳 context
2. OPENCLAW_NEMO fallback 把 prompt[:500](系統說明文字)當 signal description
3. Nemo LLM 回傳 action_title="調查 AWOOOI SRE 系統的偵探 Agent"(任務描述)
4. _extract_hypotheses() 用 action_title 作為根因假設描述 → Telegram 顯示垃圾
修復:
- openclaw.call() 新增 alert_context 可選參數,透傳給 _call_with_fallback
- diagnostician._analyze() 建立 alert_context(incident_id + evidence_summary as signal)
→ nemo 使用結構化 API 收到真實感應器資料而非系統說明文字
- _extract_hypotheses() nemo 格式轉換:優先用 reasoning(為什麼)作為假設描述
而非 action_title(做什麼)— reasoning 更接近根因分析
2026-04-16 ogt + Claude Sonnet 4.6 (台北時區)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-16 22:34:48 +08:00 |
|
OG T
|
54d6818b8d
|
fix(sensors+rules+dedup): 全景三根因修復 — asyncssh缺失/YAML規則空洞/重複卡片
CD Pipeline / build-and-deploy (push) Has been cancelled
Fix 1: asyncssh 未安裝 → sensors_succeeded 永遠=0
- apps/api/pyproject.toml 加入 asyncssh>=2.14.0
- 根因:ssh_provider.py 的 import asyncssh 在 try/except 外,ImportError 直接噴出
- 效果:15 個 SSH tool 全部恢復可用
Fix 2: YAML 規則空洞 → HostHighLoadAverage/PostgreSQLDiskGrowthRate 落 generic_fallback → restart
- 合併 host_cpu_high 為 host_resource_alert,覆蓋 25+ 個主機層 alertname
- 新增 postgresql_disk_monitoring 規則,覆蓋磁碟增長/exporter/vacuum 類告警
- 所有主機層/磁碟監控告警 → NO_ACTION,禁止 kubectl restart
Fix 3: 同一 incident 被多 pod 同時處理 → 送出 3 張重複 Telegram 卡
- decision_manager.get_or_create_decision(): ANALYZING 狀態加入早返回
- 根因:ANALYZING 不在 (READY/EXECUTING/COMPLETED) 條件 → pod-B/C 各自建新 token
2026-04-16 ogt + Claude Sonnet 4.6 (台北時區)
|
2026-04-16 22:23:49 +08:00 |
|
AWOOOI CD
|
f08d175365
|
chore(cd): deploy 02a2761 [skip ci]
|
2026-04-16 13:12:57 +00:00 |
|
OG T
|
02a276127e
|
fix(sensors+drift+repair-card): 全景修復三個節點問題
CD Pipeline / build-and-deploy (push) Successful in 1h1m39s
Fix 1: sensors 7/8 失敗 — SSH host 短名展開 (pre_decision_investigator.py)
根因: Prometheus instance label 為 "110:9100",split(":")[0]="110"
SSH_MCP_ALLOWED_HOSTS 存完整 IP "192.168.0.110" → 7 個 SSH 工具全部失敗
修復: 加入 _SHORT_HOST_MAP,"110"→"192.168.0.110",四台主機全覆蓋
Fix 2: Config Drift 誤報 — K8s 預設欄位加入白名單 (drift_detector.py)
根因: kubectl rollout restart 後 restartedAt annotation 被偵測為 "medium" drift
restartPolicy/dnsPolicy/terminationGracePeriodSeconds 等 K8s 自動填入欄位未白名單
修復: _DEFAULT_ALLOWLIST_FIELDS 加入 13 個 K8s 執行時自動填入欄位
Fix 3: 修復請求卡內容垃圾 — fallback 帶入真實 error context (failure_watcher.py)
根因: LLM 分析失敗時 root_cause = "規則引擎分類: K8S_ERROR"(無任何有用資訊)
修復: fallback 改為 "[K8S_ERROR] {operation_type} 在 {target_resource} 失敗\n錯誤:{error_message[:200]}"
2026-04-16 ogt + Claude Sonnet 4.6(亞太)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-16 20:50:06 +08:00 |
|
AWOOOI CD
|
5a2bfc3699
|
chore(cd): deploy 513232e [skip ci]
|
2026-04-16 12:34:19 +00:00 |
|
OG T
|
513232e90b
|
fix(decision_manager): Agent 分析結果覆寫 Webhook 垃圾 action
CD Pipeline / build-and-deploy (push) Successful in 28m30s
根因 (INC-20260416-C365D0 事故完整根因分析):
- Webhook inline LLM 建立 ApprovalRecord.action = "kubectl rollout restart awoooi-prod"
- Agent 分析正確(postgres disk → NO_ACTION)但只發新 Telegram 卡,未覆寫 DB
- 用戶批准 Agent 卡 → 系統查 incident_id → 找到 Webhook 舊 ApprovalRecord
→ 執行垃圾 action(rollout restart 一個磁碟告警!)
修復:
- approval_db.py: 新增 update_action_by_incident_id()(按 incident_id 更新 PENDING 記錄)
- decision_manager.py: Agent 確認 action 後立即覆寫 ApprovalRecord
若 action="" (NO_ACTION): 存 "NO_ACTION - {description}" 讓用戶知道 Agent 建議觀察
用戶批准時執行的是 Agent 的正確建議,而非 Webhook 的通用 action
2026-04-16 ogt + Claude Sonnet 4.6(亞太)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-16 20:07:15 +08:00 |
|
OG T
|
a258d87767
|
fix(webhooks+prompts): 修復 LLM 對所有告警一律輸出「重啟 AWOOOI 服務」的根本問題
CD Pipeline / build-and-deploy (push) Has been cancelled
根因 (INC-20260416-C365D0 postgres 磁碟告警事故):
1. alert_context 中 alertname 埋在 labels 深處,LLM 看到 alert_type="custom" → 不知道是什麼告警
2. 快取鍵用 alert_type:target_resource → 不同 alertname 共用同一快取 → 全部回傳第一個 LLM 結果
3. 系統 Prompt 無 alert-category 指導 → LLM 永遠輸出 kubectl rollout restart
修復:
- webhooks.py: alert_context 置頂加入 alertname + alert_category + annotations
- openclaw.py: 快取鍵改用 alertname:target_resource(告警名稱才是主要識別符)
- prompts.py: OPENCLAW_SYSTEM_PROMPT + NEMOTRON_SYSTEM_PROMPT 加入 Alert-Specific Analysis Rules
database/storage 告警 → NO_ACTION + 調查指令;K8s 告警 → 對應重啟指令
禁止對非 K8s 告警輸出 kubectl rollout restart deployment/awoooi-prod
2026-04-16 ogt + Claude Sonnet 4.6(亞太)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-16 19:56:13 +08:00 |
|
AWOOOI CD
|
6048102139
|
chore(cd): deploy 9239538 [skip ci]
|
2026-04-16 11:08:30 +00:00 |
|
OG T
|
9239538b4d
|
fix(ci): 修復 apt index 失敗導致 python3.11 找不到
CD Pipeline / build-and-deploy (push) Successful in 42m19s
症狀:apt-get update 下載 index 失敗 → python3.11 裝不上 → CI 全部失敗
修復:clean apt cache + --fix-missing + deadsnakes PPA fallback + python3 symlink fallback
影響:所有 2026-04-16 的修復 commit 都因此無法部署
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-16 18:49:35 +08:00 |
|
OG T
|
8b2a3df64b
|
fix(telegram): 修復 Telegram 卡片 description 顯示 debug garbage
CD Pipeline / build-and-deploy (push) Failing after 3m12s
問題:description = debate_summary[:500],用戶看到的是內部審計文字
修復:從 diagnosis.top_hypothesis + action_plan.top_candidate 組出人類可讀摘要
格式:「根因:[描述](信心 X%);方案:[動作]」
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
2026-04-16 18:42:13 +08:00 |
|