P0 - DIAGNOSE Privacy-First Routing: - ai_router.py: _local_fallback_chain [NEMOTRON→OLLAMA→REJECT] - DIAGNOSE 意圖 override 改為 NEMOTRON (原 OLLAMA) - DIAGNOSE fallback 使用 local-only 鏈,不觸碰雲端 - 全部失敗時 REJECT + Telegram 通知 - config.py: NEMOTRON_DIAGNOSE_TIMEOUT_SECONDS=30, OLLAMA_DIAGNOSE_TIMEOUT_SECONDS=60 - nemotron.py: 根據 context[task_type] 選擇 timeout P1 - Knowledge Auto-Harvesting: - models/knowledge.py: EntryType.AUTO_RUNBOOK + ANTI_PATTERN + symptoms_hash - EntryStatus.PUBLISHED (ANTI_PATTERN 直接發布,無需審核) - models/playbook.py: SymptomPattern.compute_hash() (16字元確定性 hash) - services/runbook_generator.py: NemotronRunbookGenerator (v1.1) - generate_runbook() → AUTO_RUNBOOK (DRAFT) + Telegram 審核 card - generate_anti_pattern() → ANTI_PATTERN (PUBLISHED) + Telegram 通知 - 使用 nvidia.chat() (正確介面),Nemotron 超時時 Minimal fallback - knowledge_service.py: check_anti_pattern(symptoms_hash, days=7) - db/models.py: symptoms_hash VARCHAR(16) + ix_knowledge_symptoms_hash - repositories/knowledge_repository.py: create() 支援 symptoms_hash + status - auto_repair_service.py: anti_pattern_gate 在 decide() + runbook hook 在 execute() - migrations/phase8_symptoms_hash.sql: ALTER TABLE + partial index + PUBLISHED constraint P2 - Config Drift Detection: - models/drift.py: DriftItem/DriftReport/DriftLevel/DriftIntent/DriftStatus - services/drift_detector.py: GitStateReader + K8sStateReader + DriftDetector - services/drift_analyzer.py: 白名單過濾 + DriftLevel 分級 - services/drift_interpreter.py: NemotronDriftInterpreter(意圖分析,不生成修復指令) - services/drift_remediator.py: rollback(kubectl apply) + adopt(git push gitea) - api/v1/drift.py: POST /scan, GET /reports, POST /rollback, POST /adopt - migrations/phase9_drift_reports.sql: drift_reports 表 - k8s/drift-cronjob.yaml: 每小時自動掃描 CronJob Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
49 lines
2.3 KiB
SQL
49 lines
2.3 KiB
SQL
-- Phase 25 P1: Knowledge Auto-Harvesting — symptoms_hash 欄位
|
||
-- 用於 Anti-Pattern 閉環攔截的確定性症狀 hash
|
||
-- 建立時間: 2026-04-04 (台北時區)
|
||
-- 建立者: Claude Code (Phase 25 P1)
|
||
--
|
||
-- 執行方式: psql -h 192.168.0.188 -U awoooi -d awoooi -f phase8_symptoms_hash.sql
|
||
|
||
-- 1. knowledge_entries 表新增 symptoms_hash 欄位
|
||
ALTER TABLE knowledge_entries
|
||
ADD COLUMN IF NOT EXISTS symptoms_hash VARCHAR(16);
|
||
|
||
-- 2. 建立 index 加速 Anti-Pattern 閘門查詢
|
||
-- 查詢條件: entry_type='anti_pattern' AND symptoms_hash=:hash AND created_at>=:cutoff
|
||
CREATE INDEX IF NOT EXISTS idx_knowledge_anti_pattern_hash
|
||
ON knowledge_entries (entry_type, symptoms_hash, created_at)
|
||
WHERE entry_type = 'anti_pattern' AND symptoms_hash IS NOT NULL;
|
||
|
||
-- 3. EntryStatus 新增 PUBLISHED(用於 ANTI_PATTERN 直接發布)
|
||
-- PostgreSQL CHECK constraint 需要重建(若有的話)
|
||
-- 若無 constraint,PostgreSQL 的 VARCHAR 欄位可直接存入任意值,無需 ALTER。
|
||
-- 確認 status 欄位是否有 CHECK constraint:
|
||
-- SELECT conname, consrc FROM pg_constraint
|
||
-- WHERE conrelid = 'knowledge_entries'::regclass AND contype = 'c';
|
||
|
||
-- 若有 CHECK constraint(如 status IN ('draft', 'review', 'approved', 'archived')),
|
||
-- 需執行以下(請先確認 constraint 名稱):
|
||
-- ALTER TABLE knowledge_entries DROP CONSTRAINT IF EXISTS knowledge_entries_status_check;
|
||
-- ALTER TABLE knowledge_entries ADD CONSTRAINT knowledge_entries_status_check
|
||
-- CHECK (status IN ('draft', 'review', 'approved', 'archived', 'published'));
|
||
|
||
-- 安全執行版本(自動處理 CHECK constraint):
|
||
DO $$
|
||
DECLARE
|
||
v_conname text;
|
||
BEGIN
|
||
SELECT conname INTO v_conname
|
||
FROM pg_constraint
|
||
WHERE conrelid = 'knowledge_entries'::regclass AND contype = 'c' AND conname LIKE '%status%';
|
||
|
||
IF v_conname IS NOT NULL THEN
|
||
EXECUTE format('ALTER TABLE knowledge_entries DROP CONSTRAINT %I', v_conname);
|
||
ALTER TABLE knowledge_entries ADD CONSTRAINT knowledge_entries_status_check
|
||
CHECK (status IN ('draft', 'review', 'approved', 'archived', 'published'));
|
||
RAISE NOTICE 'Updated status CHECK constraint: % → added published', v_conname;
|
||
ELSE
|
||
RAISE NOTICE 'No status CHECK constraint found, skipping';
|
||
END IF;
|
||
END $$;
|