# Knowledge Base 設計文件

> **版本**: v1.0
> **日期**: 2026-04-02
> **作者**: ogt + Claude Code
> **狀態**: 已批准，待實作

---

## 背景與目標

打造 AWOOOI 知識庫系統，讓工程師與 AI 管理人員可查閱 SRE 知識，同時作為 OpenClaw 決策的 Context 來源。

**已確認決策**:
- 使用者：工程師 + AI 管理人員
- 知識來源：AI 自動萃取為主，人工審核補充
- 用途：人工查閱 + AI 自動引用（兩者兼備）
- 資料結構：兩層架構（底層知識條目 + Playbook 為特殊關聯）
- UI：左側分類導航 + 頂部搜尋 + 右側詳情

---

## 架構決策

| 項目 | 決策 | 理由 |
|------|------|------|
| Playbook 邊界 | **分離**，用 `related_playbook_id` 關聯 | 執行語意 ≠ 查閱知識，職責不同 |
| Migration | **K8s Job**（沿用現有方式）| 4 個 table，Alembic 是過度工程 |
| Vector Search | **Phase 1 跳過**，關鍵字 + tag | Phase 2 再評估 pgvector |

---

## 資料模型

### KnowledgeEntry（新 PostgreSQL table）

```sql
CREATE TABLE knowledge_entries (
  id              UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  title           VARCHAR(255) NOT NULL,
  content         TEXT NOT NULL,           -- Markdown
  entry_type      VARCHAR(50) NOT NULL,    -- 'incident_case' | 'runbook' | 'best_practice' | 'postmortem'
  category        VARCHAR(100) NOT NULL,   -- 對應左側分類樹
  tags            JSONB DEFAULT '[]',      -- string[]
  source          VARCHAR(20) NOT NULL,    -- 'ai_extracted' | 'human'
  status          VARCHAR(20) NOT NULL DEFAULT 'draft', -- 'draft' | 'review' | 'approved'
  related_incident_id UUID REFERENCES incidents(id) ON DELETE SET NULL,
  related_playbook_id VARCHAR(255),        -- Playbook Redis key（非 FK）
  view_count      INTEGER DEFAULT 0,
  created_by      VARCHAR(100),
  created_at      TIMESTAMPTZ DEFAULT NOW(),
  updated_at      TIMESTAMPTZ DEFAULT NOW()
);

CREATE INDEX idx_knowledge_entries_type     ON knowledge_entries(entry_type);
CREATE INDEX idx_knowledge_entries_category ON knowledge_entries(category);
CREATE INDEX idx_knowledge_entries_status   ON knowledge_entries(status);
```

### entry_type 分類

| type | 說明 |
|------|------|
| `incident_case` | AI 從 Incident 萃取的案例分析 |
| `runbook` | 手動建立的操作手冊 |
| `best_practice` | 最佳實踐文章 |
| `postmortem` | 事後分析報告 |

### category 分類樹（左側導航）

```
全部
├── 基礎設施
│   ├── K8s / K3s
│   ├── 資料庫
│   └── 網路
├── 應用層
│   ├── API 服務
│   └── 前端
├── AI 系統
│   ├── OpenClaw
│   └── Playbook
└── 安全 / 合規
```

---

## API 設計

Base path: `/api/v1/knowledge`

| Method | Path | 說明 |
|--------|------|------|
| GET | `/` | 列表（支援 `category`, `type`, `status`, `q` 搜尋, `tags` 篩選）|
| GET | `/{id}` | 單筆（同時 view_count +1）|
| POST | `/` | 建立新條目 |
| PATCH | `/{id}` | 更新（含狀態流轉）|
| POST | `/{id}/approve` | 審核通過（status: draft/review → approved）|
| DELETE | `/{id}` | 軟刪除（status → archived）|
| GET | `/categories` | 取得分類樹（含各類數量）|
| GET | `/search` | 關鍵字搜尋（title + content + tags）|

---

## 後端分層架構

遵循 leWOOOgo 積木化原則：

```
apps/api/src/
├── db/models.py              # 新增 KnowledgeEntry ORM class
├── models/knowledge.py       # Pydantic Schema (Request/Response)
├── repositories/
│   ├── interfaces.py         # 新增 IKnowledgeRepository Protocol
│   └── knowledge_repository.py  # PostgreSQL CRUD 實作
├── services/
│   └── knowledge_service.py  # 業務邏輯（搜尋、狀態流轉、view_count）
└── api/v1/
    └── knowledge.py          # Router，prefix /knowledge
```

---

## 前端設計

### 頁面結構

```
/knowledge-base
├── 左側分類導航 (w-52, 固定)
│   ├── 全部 (N)
│   ├── 基礎設施 (N)
│   ├── 應用層 (N)
│   ├── AI 系統 (N)
│   └── 安全/合規 (N)
├── 主區域
│   ├── 頂部搜尋欄 + 篩選 (type / source / status)
│   ├── 結果列表
│   │   └── KnowledgeCard (title, type badge, tags, view_count, 相關 Playbook)
│   └── 空態
└── 右側詳情 Panel (抽屜式，點擊條目開啟)
    ├── 標題 + meta
    ├── Markdown 渲染
    ├── 相關 Playbook 連結
    └── 審核操作（approve / 回 review）
```

### KnowledgeCard

```
┌─────────────────────────────────────────┐
│ [type badge]  標題文字               👁 12 │
│ category · source · 2026-04-01          │
│ [tag] [tag] [tag]                       │
│ 🔗 相關 Playbook: restart-api-server    │
└─────────────────────────────────────────┘
```

### 狀態標示

| status | 顯示 | 顏色 |
|--------|------|------|
| `draft` | 草稿 | gray |
| `review` | 審核中 | warning（黃）|
| `approved` | 已批准 | healthy（綠）|

---

## Migration K8s Job

參考 `k8s/jobs/migrate-phase18-audit-logs.yaml`，建立：

```
k8s/jobs/migrate-knowledge-entries.yaml
```

執行 `CREATE TABLE knowledge_entries ...` + index。

---

## Phase 2（未來）

- pgvector 語意搜尋
- OpenClaw 在評估 Incident 時自動 RAG 查詢 Knowledge Base
- Embedding 自動化（建立 entry 時觸發）
