Files
awoooi/apps/api/migrations/phase7_playbooks_table.sql
OG T 72d7536ead
Some checks failed
CD Pipeline / build-and-deploy (push) Has been cancelled
feat(auto-repair): 完整自動修復閉環 + KM 沉澱串接
1. DB Migration: playbooks 資料表 (phase7_playbooks_table.sql)
   - 這是自動修復無法啟動的根本原因 — table 從未建立
   - 5 個索引: status/tags/alert_names/source_incidents/created_at
   - 已在 prod DB 執行

2. playbook_service: 萃取後自動沉澱 KM
   - extract_from_incident() 完成後 fire-and-forget _write_to_km()
   - 內容含症狀模式、修復步驟、信心度、來源 Incident

3. approval_execution: 執行結果沉澱 KM
   - _trigger_learning() 後 fire-and-forget _write_execution_result_to_km()
   - 成功/失敗記錄都寫入,category=execution_result

完整閉環:
告警 → AI分析 → 查Playbook → 決策 → 執行 → 結果寫KM
                                              ↓
                              Incident解決 → KM(knowledge_extractor)
                                          → Playbook萃取 → KM

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-04 11:54:15 +08:00

59 lines
2.0 KiB
SQL

-- Phase 7: Playbook 萃取功能 — playbooks 資料表
-- 建立時間: 2026-04-04 (台北時區)
-- 建立者: Claude Code (Phase 7 補齊 migration)
-- 對應設計: memory/project_playbook_design.md
-- 對應模型: apps/api/src/models/playbook.py
CREATE TABLE IF NOT EXISTS playbooks (
-- 識別
playbook_id VARCHAR(32) UNIQUE NOT NULL,
-- 元資料
name VARCHAR(256) NOT NULL,
description TEXT NOT NULL DEFAULT '',
status VARCHAR(32) NOT NULL DEFAULT 'draft', -- draft|approved|deprecated
source VARCHAR(32) NOT NULL DEFAULT 'extracted', -- extracted|manual
-- 症狀模式 (SymptomPattern JSON)
symptom_pattern JSONB NOT NULL DEFAULT '{}',
-- 修復步驟 (list[RepairStep] JSON)
repair_steps JSONB NOT NULL DEFAULT '[]',
estimated_duration_minutes INT NOT NULL DEFAULT 5,
-- 來源追溯
source_incident_ids TEXT[] NOT NULL DEFAULT '{}',
ai_confidence DECIMAL(4,3) NOT NULL DEFAULT 0.0,
-- 統計數據
success_count INT NOT NULL DEFAULT 0,
failure_count INT NOT NULL DEFAULT 0,
last_used_at TIMESTAMPTZ,
-- 人工標記
approved_by VARCHAR(128),
approved_at TIMESTAMPTZ,
tags TEXT[] NOT NULL DEFAULT '{}',
notes TEXT,
-- 時間軸
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- 索引
CREATE INDEX IF NOT EXISTS idx_playbooks_status
ON playbooks(status);
CREATE INDEX IF NOT EXISTS idx_playbooks_tags
ON playbooks USING GIN(tags);
CREATE INDEX IF NOT EXISTS idx_playbooks_alert_names
ON playbooks USING GIN((symptom_pattern->'alert_names'));
CREATE INDEX IF NOT EXISTS idx_playbooks_source_incidents
ON playbooks USING GIN(source_incident_ids);
CREATE INDEX IF NOT EXISTS idx_playbooks_created_at
ON playbooks(created_at DESC);