Files
awoooi/apps/api/migrations/phase8_symptoms_hash.sql
OG T 3455044457
Some checks failed
CD Pipeline / build-and-deploy (push) Failing after 38s
Type Sync Check / check-type-sync (push) Failing after 35s
feat(phase25): Nemotron 主動防禦三方向 P0+P1+P2 完整實作
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>
2026-04-04 12:35:05 +08:00

49 lines
2.3 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- 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 需要重建(若有的話)
-- 若無 constraintPostgreSQL 的 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 $$;