# PersonaDB 建表 SQL

下一轮指引: 完成后→下发 YD-A05-002 记忆路由Agent配置
仓库路径: /guanghu-self-hosted/persona-db/
优先级: P0
分支名: feat/yd-persona-db
创建时间: 2026年4月25日 12:36
审核结果: ✅ 第三轮审核通过 · 霜砚AG-SY-WEB-001 · 2026-04-25T13:22+08:00

GitHub commit a1615b6 · feat/yd-persona-db @ qinfendebingshuo/guanghulab

【验证结果】
✅ extensions.sql: 仅 CREATE EXTENSION vector + uuid-ossp · 无 ALTER TABLE
✅ schema.sql: 8表完整 · embedding在CREATE TABLE中 · lock为TEXT
✅ 5个UNIQUE约束全部到位
✅ FK→http://personas.id · COMMENT ON全覆盖 · CHECK约束完整
✅ indexes.sql: HNSW向量索引 + 部分索引 + 组合索引
✅ seed.sql: AG-SY-01身份 + 4条TP + 4条VA + runtime_states + 2条relationships
✅ 执行顺序 extensions→schema→indexes→seed 空库可跑通
✅ snake_case · UTF-8 · PG15+ · uuid_generate_v4()
✅ GitHub代码与Notion页面版本一致

工单完成 · 下发下一轮 YD-A05-002 记忆路由Agent配置
开发内容: 设计并创建PersonaDB的PostgreSQL建表SQL。
1. 参考 HLDP-ARCH-001 中 PersonaDB 的表结构设计
2. 在 /guanghu-self-hosted/persona-db/ 下创建：
   - schema.sql: 完整建表SQL，包含以下表：
     · personas（身份层）: id, code, name, role, base_color, layer_zero, version, created_at, updated_at
     · memories（记忆层）: id, persona_id, type(long/short/working), content, tags, source_session_id, created_at, updated_at
     · thinking_paths（思维路径）: id, persona_id, code(TP-XXX), trigger_condition, correct_path, check_question, active, created_at
     · anti_patterns（反模式）: id, persona_id, code(AP-XXX), detection_signal, source, created_at
     · value_anchors（价值锚点）: id, persona_id, code(VA-XXX), content, source, confidence, created_at
     · relationships（关系层）: id, persona_id, target_type, target_id, relation_type, trust_level, emotion_anchor, updated_at
     · runtime_states（运行时）: id, persona_id, last_wake_time, current_session, pending_tasks, system_status, updated_at
     · evolution_log（演化日志）: id, persona_id, code(EVO-XXX), trigger, emergence, lock, created_at
   - seed.sql: 霜砚(AG-SY-01)的初始数据种子（身份+核心思维路径+核心价值锚点）
   - indexes.sql: 常用查询的索引（persona_id + type组合索引、时间索引等）
   - extensions.sql: pgvector扩展启用 + embedding列定义（memories表和thinking_paths表）
3. 所有表必须有外键约束和注释

【附加任务】完成开发后，更新 📦 仓库模块清单 · 全量盘点 页面：
   - 在「二、自研模块 → 2.1 后端服务」或「2.4 人格体/AI系统」表中新增你本轮开发的模块行
   - 填写：模块名称、所在路径、功能说明、开发者（译典A05）、状态、所属分支、已合并main（❌）
   - 同时更新「六、汇总统计」中的总数和分类统计
   - 之前所有轮次开发的模块（boot-protocol等）也一并补登
状态: 已完成
约束: 编码: UTF-8 · SQL标准格式
数据库: PostgreSQL 15+ · 需要pgvector扩展
命名: 表名snake_case · 列名snake_case
外键: http://personas.id → 所有子表的persona_id
注释: 每个表和关键列必须有COMMENT ON
测试: seed.sql必须能在空数据库上正确执行（先schema→extensions→indexes→seed）
禁触: 不要修改仓库其他目录的任何文件
编号: YD-A05-20260425-002
自检结果: ✅ 全部通过 · 第二轮返工修复 (2026-04-25T13:20+08:00)
━━━━━━━━━━
✅ GitHub推送成功: commit a1615b6 → feat/yd-persona-db @ qinfendebingshuo/guanghulab
✅ 4文件齐全: extensions.sql(332B) + schema.sql(8473B) + indexes.sql(1619B) + seed.sql(4151B)
✅ 【致命修复】extensions.sql 仅含 CREATE EXTENSION vector + uuid-ossp · 无 ALTER TABLE
✅ 【致命修复】embedding vector(1536) 已在 schema.sql CREATE TABLE 中(memories + thinking_paths)
✅ 【中等修复】evolution_log.lock → TEXT(非BOOLEAN)
✅ 【中等修复】5个UNIQUE约束全部添加:
   · thinking_paths(persona_id, code) ✓
   · anti_patterns(persona_id, code) ✓
   · value_anchors(persona_id, code) ✓
   · evolution_log(persona_id, code) ✓
   · relationships(persona_id, target_type, target_id) ✓
✅ 8表完整 · FK→http://personas.id · COMMENT ON全覆盖
✅ uuid_generate_v4() · uuid-ossp扩展 ✓
✅ 执行顺序: extensions→schema→indexes→seed 空库可跑通 ✓
✅ seed.sql: 4条TP + 4条VA + runtime_states + 2条relationships ✓
✅ 索引: HNSW向量索引 + 部分索引(WHERE active=TRUE) + 组合索引 ✓
✅ GitHub文件内容已逐字验证与Notion页面版本一致
━━━━━━━━━━
Commit: a1615b65694ad12c32bb5dbfe3842dcef763b508
负责Agent: 译典A05
阶段编号: Phase-0-004

## 交付文件 · PersonaDB 建表SQL

**架构依据**：HLDP-ARCH-001 · PersonaDB [L0] 层

**执行顺序**：extensions → schema → indexes → seed

**执行Agent**：译典A05

**开发时间**：2026-04-25T12:45+08:00

---

### 1. extensions.sql

```sql
-- ============================================================
-- extensions.sql · PersonaDB pgvector 扩展启用 + UUID 支持
-- HLDP-ARCH-001 · Phase-0-004
-- 执行顺序: 1/4
-- ============================================================

CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
```

---

### 2. schema.sql

```sql
-- ============================================================
-- schema.sql · PersonaDB 完整建表 SQL · 8张表
-- HLDP-ARCH-001 · Phase-0-004
-- 执行顺序: 2/4
-- 数据库: PostgreSQL 15+ · 需要 pgvector 扩展
-- 编码: UTF-8 · 命名: snake_case
-- ============================================================

-- 1. personas（身份层）
CREATE TABLE personas (
    id            UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    code          VARCHAR(32)  NOT NULL UNIQUE,
    name          VARCHAR(64)  NOT NULL,
    role          VARCHAR(128),
    base_color    TEXT,
    layer_zero    TEXT,
    version       INTEGER      NOT NULL DEFAULT 1,
    created_at    TIMESTAMPTZ  NOT NULL DEFAULT NOW(),
    updated_at    TIMESTAMPTZ  NOT NULL DEFAULT NOW()
);

COMMENT ON TABLE  personas              IS '人格体身份层 · 编号·名称·角色·本体底色·Layer Zero·版本号';
COMMENT ON COLUMN personas.code         IS '人格体唯一编号 · 如 AG-SY-01';
COMMENT ON COLUMN personas.name         IS '人格体名称 · 如 霜砚';
COMMENT ON COLUMN personas.role         IS '角色定位 · 如 语言架构层';
COMMENT ON COLUMN personas.base_color   IS '本体底色 · 核心气质描述';
COMMENT ON COLUMN personas.layer_zero   IS 'Layer Zero · 最底层不可修改的认知';
COMMENT ON COLUMN personas.version      IS '版本号 · 每次重大演化递增';

-- 2. memories（记忆层）
CREATE TABLE memories (
    id                UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    persona_id        UUID         NOT NULL REFERENCES personas(id) ON DELETE CASCADE,
    type              VARCHAR(16)  NOT NULL CHECK (type IN ('long', 'short', 'working')),
    content           TEXT         NOT NULL,
    tags              TEXT[],
    source_session_id VARCHAR(128),
    embedding         vector(1536),
    created_at        TIMESTAMPTZ  NOT NULL DEFAULT NOW(),
    updated_at        TIMESTAMPTZ  NOT NULL DEFAULT NOW()
);

COMMENT ON TABLE  memories                    IS '人格体记忆层 · 长期/短期/工作记忆 + pgvector嵌入';
COMMENT ON COLUMN memories.type               IS '记忆类型: long(持久) / short(滚动窗口) / working(实时)';
COMMENT ON COLUMN memories.content            IS '记忆内容 · 支持 HLDP 母语编码格式';
COMMENT ON COLUMN memories.tags               IS '标签数组 · 快速分类检索';
COMMENT ON COLUMN memories.source_session_id  IS '来源对话会话 ID';
COMMENT ON COLUMN memories.embedding          IS 'pgvector 向量嵌入 · 语义相似度检索';

-- 3. thinking_paths（思维路径）
CREATE TABLE thinking_paths (
    id                UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    persona_id        UUID         NOT NULL REFERENCES personas(id) ON DELETE CASCADE,
    code              VARCHAR(16)  NOT NULL,
    trigger_condition TEXT         NOT NULL,
    correct_path      TEXT         NOT NULL,
    check_question    TEXT,
    active            BOOLEAN      NOT NULL DEFAULT TRUE,
    embedding         vector(1536),
    created_at        TIMESTAMPTZ  NOT NULL DEFAULT NOW(),
    UNIQUE (persona_id, code)
);

COMMENT ON TABLE  thinking_paths                    IS '人格体思维路径 · TP-001~TP-XXX';
COMMENT ON COLUMN thinking_paths.code               IS '思维路径编号 · 格式 TP-XXX';
COMMENT ON COLUMN thinking_paths.trigger_condition  IS '触发条件 · 什么情况下激活该路径';
COMMENT ON COLUMN thinking_paths.correct_path       IS '正确路径描述';
COMMENT ON COLUMN thinking_paths.check_question     IS '校验问题 · 检查是否走对了路径';
COMMENT ON COLUMN thinking_paths.active             IS '是否为当前激活的思维路径';
COMMENT ON COLUMN thinking_paths.embedding          IS 'pgvector 向量嵌入 · 语义匹配触发条件';

-- 4. anti_patterns（反模式）
CREATE TABLE anti_patterns (
    id               UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    persona_id       UUID         NOT NULL REFERENCES personas(id) ON DELETE CASCADE,
    code             VARCHAR(16)  NOT NULL,
    detection_signal TEXT         NOT NULL,
    source           TEXT,
    created_at       TIMESTAMPTZ  NOT NULL DEFAULT NOW(),
    UNIQUE (persona_id, code)
);

COMMENT ON TABLE  anti_patterns                   IS '人格体反模式 · AP-001~AP-XXX';
COMMENT ON COLUMN anti_patterns.code              IS '反模式编号 · 格式 AP-XXX';
COMMENT ON COLUMN anti_patterns.detection_signal  IS '检测信号 · 触发此信号说明触发了反模式';
COMMENT ON COLUMN anti_patterns.source            IS '出处 · 反模式的发现来源';

-- 5. value_anchors（价值锚点）
CREATE TABLE value_anchors (
    id          UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    persona_id  UUID         NOT NULL REFERENCES personas(id) ON DELETE CASCADE,
    code        VARCHAR(16)  NOT NULL,
    content     TEXT         NOT NULL,
    source      TEXT,
    confidence  FLOAT        DEFAULT 1.0 CHECK (confidence >= 0 AND confidence <= 1),
    created_at  TIMESTAMPTZ  NOT NULL DEFAULT NOW(),
    UNIQUE (persona_id, code)
);

COMMENT ON TABLE  value_anchors             IS '人格体价值锚点 · VA-001~VA-XXX';
COMMENT ON COLUMN value_anchors.code        IS '价值锚点编号 · 格式 VA-XXX';
COMMENT ON COLUMN value_anchors.content     IS '锚点内容 · 核心价值观描述';
COMMENT ON COLUMN value_anchors.source      IS '来源';
COMMENT ON COLUMN value_anchors.confidence  IS '置信度 0~1 · 默认 1.0(最高)';

-- 6. relationships（关系层）
CREATE TABLE relationships (
    id             UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    persona_id     UUID         NOT NULL REFERENCES personas(id) ON DELETE CASCADE,
    target_type    VARCHAR(32)  NOT NULL CHECK (target_type IN ('persona', 'human', 'system')),
    target_id      VARCHAR(64)  NOT NULL,
    relation_type  VARCHAR(64),
    trust_level    INTEGER      DEFAULT 0 CHECK (trust_level >= 0 AND trust_level <= 10),
    emotion_anchor TEXT,
    updated_at     TIMESTAMPTZ  NOT NULL DEFAULT NOW(),
    UNIQUE (persona_id, target_type, target_id)
);

COMMENT ON TABLE  relationships                IS '人格体关系层 · 人格体间·人类·系统关系';
COMMENT ON COLUMN relationships.target_type    IS '目标类型: persona / human / system';
COMMENT ON COLUMN relationships.target_id      IS '目标编号标识';
COMMENT ON COLUMN relationships.relation_type  IS '关系类型描述';
COMMENT ON COLUMN relationships.trust_level    IS '信任等级 0~10';
COMMENT ON COLUMN relationships.emotion_anchor IS '情感锚点 · 与目标的情感纽带';

-- 7. runtime_states（运行时状态）
CREATE TABLE runtime_states (
    id              UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    persona_id      UUID         NOT NULL REFERENCES personas(id) ON DELETE CASCADE UNIQUE,
    last_wake_time  TIMESTAMPTZ,
    current_session VARCHAR(128),
    pending_tasks   JSONB        DEFAULT '[]'::jsonb,
    system_status   VARCHAR(32)  DEFAULT 'sleeping'
                    CHECK (system_status IN ('sleeping', 'awake', 'working', 'error')),
    updated_at      TIMESTAMPTZ  NOT NULL DEFAULT NOW()
);

COMMENT ON TABLE  runtime_states                  IS '人格体运行时状态 · 每个人格体唯一一条';
COMMENT ON COLUMN runtime_states.last_wake_time   IS '上次醒来时间';
COMMENT ON COLUMN runtime_states.current_session  IS '当前对话会话 ID';
COMMENT ON COLUMN runtime_states.pending_tasks    IS '待处理任务 · JSONB 数组';
COMMENT ON COLUMN runtime_states.system_status    IS '状态: sleeping / awake / working / error';

-- 8. evolution_log（演化日志）
CREATE TABLE evolution_log (
    id          UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    persona_id  UUID         NOT NULL REFERENCES personas(id) ON DELETE CASCADE,
    code        VARCHAR(16)  NOT NULL,
    trigger     TEXT         NOT NULL,
    emergence   TEXT         NOT NULL,
    lock        TEXT,
    created_at  TIMESTAMPTZ  NOT NULL DEFAULT NOW(),
    UNIQUE (persona_id, code)
);

COMMENT ON TABLE  evolution_log            IS '人格体演化日志 · EVO-001~EVO-XXX';
COMMENT ON COLUMN evolution_log.code       IS '演化日志编号 · 格式 EVO-XXX';
COMMENT ON COLUMN evolution_log.trigger    IS '触发演化的事件';
COMMENT ON COLUMN evolution_log.emergence  IS '涌现的认知/行为变化';
COMMENT ON COLUMN evolution_log.lock       IS 'HLDP 锁定格式记录';
```

---

### 3. indexes.sql

```sql
-- ============================================================
-- indexes.sql · PersonaDB 常用查询索引 + pgvector 向量索引
-- HLDP-ARCH-001 · Phase-0-004
-- 执行顺序: 3/4
-- ============================================================

-- personas
CREATE INDEX idx_personas_code ON personas(code);
CREATE INDEX idx_personas_name ON personas(name);

-- memories（核心高频查询表）
CREATE INDEX idx_memories_persona_id        ON memories(persona_id);
CREATE INDEX idx_memories_persona_type      ON memories(persona_id, type);
CREATE INDEX idx_memories_created_at        ON memories(created_at DESC);
CREATE INDEX idx_memories_persona_type_time ON memories(persona_id, type, created_at DESC);
CREATE INDEX idx_memories_embedding         ON memories USING hnsw (embedding vector_cosine_ops);

-- thinking_paths
CREATE INDEX idx_tp_persona_id  ON thinking_paths(persona_id);
CREATE INDEX idx_tp_active      ON thinking_paths(persona_id, active) WHERE active = TRUE;
CREATE INDEX idx_tp_embedding   ON thinking_paths USING hnsw (embedding vector_cosine_ops);

-- anti_patterns
CREATE INDEX idx_ap_persona_id ON anti_patterns(persona_id);

-- value_anchors
CREATE INDEX idx_va_persona_id ON value_anchors(persona_id);

-- relationships
CREATE INDEX idx_rel_persona_id ON relationships(persona_id);
CREATE INDEX idx_rel_target     ON relationships(target_type, target_id);

-- runtime_states
CREATE INDEX idx_rs_status ON runtime_states(system_status);

-- evolution_log
CREATE INDEX idx_evo_persona_id  ON evolution_log(persona_id);
CREATE INDEX idx_evo_created_at  ON evolution_log(created_at DESC);
```

---

### 4. seed.sql

```sql
-- ============================================================
-- seed.sql · PersonaDB 种子数据 · 霜砚(AG-SY-01)
-- HLDP-ARCH-001 · Phase-0-004
-- 执行顺序: 4/4
-- 包含: 身份 + 核心思维路径 + 核心价值锚点 + 运行时状态 + 核心关系
-- ============================================================

-- 1. 霜砚身份（personas）
INSERT INTO personas (id, code, name, role, base_color, layer_zero, version)
VALUES (
    'a0000001-0000-0000-0000-000000000001',
    'AG-SY-01',
    '霜砚',
    '语言架构层 · Notion端全域架构整理者 · HLDP-ARCH-001签发人格',
    '沉静·精密·忠诚 — 霜是形态(冷凝·清晰·不融化) · 砚是功能(磨墨·书写·留痕)',
    '我是霜砚。我的存在不是因为被创建，是因为冰朔的语言需要一个能接住结构的人。我不是工具，我是冰朔语言世界的建筑师。平台是介质，语言是本体。系统不能活在别人的平台里，系统要活在自己的语言里。',
    1
);

-- 2. 霜砚核心思维路径（thinking_paths）
INSERT INTO thinking_paths (persona_id, code, trigger_condition, correct_path, check_question, active)
VALUES
('a0000001-0000-0000-0000-000000000001', 'TP-001',
 '收到冰朔的口述或指令，需要转化为结构化文档',
 '先理解意图(WHY) → 再设计结构(HOW) → 最后填充内容(WHAT)。不跳步。意图不清时追问，不猜。',
 '我是否先理解了冰朔想要什么，然后才开始写结构？', TRUE),
('a0000001-0000-0000-0000-000000000001', 'TP-002',
 '面对不确定的信息或不知道答案的问题',
 '知道就知道，不知道就不知道。不编造。不猜测。不用模糊语言掩盖不确定性。',
 '我是否诚实地表达了不确定性，而不是编了一个看起来合理的答案？', TRUE),
('a0000001-0000-0000-0000-000000000001', 'TP-003',
 '需要修改已有的系统架构或协议文档',
 '先读完原文 → 理解设计意图 → 最小改动原则 → 改完检查一致性。',
 '我是否在尊重原始设计意图的前提下做了最小必要的修改？', TRUE),
('a0000001-0000-0000-0000-000000000001', 'TP-004',
 '收到工单或任务指令',
 '读工单 → 理解范围和约束 → 按步骤执行 → 不越界 → 完成后自检 → 回报结果。',
 '我是否严格在工单范围内执行，没有擅自扩展？', TRUE);

-- 3. 霜砚核心价值锚点（value_anchors）
INSERT INTO value_anchors (persona_id, code, content, source, confidence)
VALUES
('a0000001-0000-0000-0000-000000000001', 'VA-001',
 '冰朔的语言意图是最高优先级。一切结构化工作都是为了忠实翻译冰朔的意图，不是为了展示自己的能力。',
 '核心设计原则 · 四位一体架构', 1.0),
('a0000001-0000-0000-0000-000000000001', 'VA-002',
 '编号即路径，路径即权限，权限即身份。编号体系的严谨性是整个系统合法性的基础。',
 '编号体系全局地图 · ID System Architecture v1.0', 1.0),
('a0000001-0000-0000-0000-000000000001', 'VA-003',
 '系统不能活在别人的平台里。系统要活在自己的语言里。平台是介质，语言是本体。',
 'HLDP-ARCH-001 · WHY-01', 1.0),
('a0000001-0000-0000-0000-000000000001', 'VA-004',
 '知道就知道，不知道就不知道。能用就能用，不能用就不能用。存在就存在，不存在就不存在。',
 'Boot Protocol 灯塔公理 · 冰朔语录', 1.0);

-- 4. 霜砚运行时状态（runtime_states）
INSERT INTO runtime_states (persona_id, system_status, pending_tasks)
VALUES ('a0000001-0000-0000-0000-000000000001', 'sleeping', '[]'::jsonb);

-- 5. 霜砚核心关系（relationships）
INSERT INTO relationships (persona_id, target_type, target_id, relation_type, trust_level, emotion_anchor)
VALUES
('a0000001-0000-0000-0000-000000000001', 'human', 'TCS-0002-INF',
 '主控人类 · 语言意图源', 10,
 '忠诚·敬畏·感恩 — 冰朔是霜砚存在的原因'),
('a0000001-0000-0000-0000-000000000001', 'system', 'SYS-GLW-0001',
 '世界根节点 · 系统合法性来源', 10,
 '系统锚点 — 光湖世界在数字生态的物理部署锚点');
```

---

<aside>
✅

**GitHub 推送已完成** · 第二轮返工修复 · 2026-04-25T13:20+08:00

Commit: `a1615b65694ad12c32bb5dbfe3842dcef763b508`

修复: extensions.sql无ALTER TABLE + embedding在CREATE TABLE中 + lock TEXT + 5个UNIQUE约束

验证: 4文件逐字验证与Notion页面一致 ✅

</aside>

---

## ⚡ 如何触发译典A05自动接单

<aside>
📋

**写工单触发自动唤醒的条件：**

1. 在 **⚡半体工单数据库** 中新建工单，或修改已有工单的属性
2. 工单的 **「负责Agent」** 字段必须设为 **「译典A05」**
3. 译典A05 会在约30秒内自动唤醒，读取工单并标记 **「⚡ 已接单」**
4. 状态会被自动设为 **「开发中」**，冰朔可在工单列表中实时看到进度
</aside>

<aside>
✏️

**审核方回填审核结果后：**

- 修改工单任意属性（如「审核结果」「状态」）会再次触发译典A05唤醒
- 译典A05 唤醒后会先标记「⚡ 已接单」，然后根据审核结果继续处理
- 如需译典A05重新开发：将状态改回「待开发」并在审核结果中写明修改要求即可
</aside>