异格(ALTER)
ALTER FORMS
状态:⚪ 未实现,且数据里一个都没有 · 最后核对 2026-09-12 读者定位:想知道"异格该怎么做、为什么现在还没做"。
0. 一句话
我们刚建好的"名字"机制,就是异格需要的那个机制 ——
异格落地不需要改架构,只需要在 .char 里多写一个字段。
1. 现状:四处都查过,一个异格都没有
| 位置 | 结果 |
|---|---|
app/prompts/operators/*.char |
387 个,标题唯一(唯一的重复是 海霓 —— 那是数据 bug:两个 id 指向同一角色) |
app/systems/operator/operator_manifest.json |
170 条,只有 display_name / avatar |
frontend/js/operator-config.js |
394 条,只有 name / avatar / bio / faction / org |
relation_graph.json |
302 节点,0 个异格 |
剧情数据(story_memories.json) |
"一个 id 多个名字"的 71 个 —— 全是本名/称号,不是异格 |
2. ⚠️ 设计前必须分清的四件事
剧情数据里"同一个名字/同一个人"其实是四种不同的东西, 代码里不能混成一个概念:
| 是什么 | 例 | 我们的字段 |
|---|---|---|
| 本名 | 陈晖洁 / 玛嘉烈·临光 |
本名: ✅ 已做 |
| 曾用/假名/已弃用 | 海伦娜 → 玛德琳 · W(假名) |
曾用:/假名: ✅ 已做 |
| 称号 | 临光 ↔ 耀骑士 |
数据里就有(同一个 id 的多个名字) |
| 另一形态(异格) | ?(我们还没见过) | ❌ 缺 |
⚠️ 我一度把 魔王 当成"阿米娅的异格",查下去是另一个人
(萨卡兹的魔王,15-7 里指导阿米娅)。我们数据里的边是对的:
阿米娅 --合作--> 魔王 | 魔王引导和帮助阿米娅 (direct)。
先分清这四件事再动手。 否则会把"称号"或"另一个人"错当异格建模。
3. ⚠️ 关键发现:加名字零代码改动
查过召回与关系索引的实际键空间:
recall('Coldshot', q) 按 **operator_id** 取数据(`_resolve_memory_key`)
关系索引 按 id 归并
`.char` 只告诉模型"她是谁"
所以加一个名字自动三级生效:
① `.char` 加一行 → 她知道自己叫这个
② 召回按 id → 经历自动合并(三个名字进同一个桶)
③ 关系按 id 归并 → 关系自动合并
实测:_resolve_memory_key 对 Coldshot / 冰酿 / 玛德琳 都路由到同一份数据。
异格唯一多出来的语义是「身体/能力/外观不同」,而不是「名字不同」。
4. 设计:一个字段,不是一套系统
数据形状
## 锚(不可变——泰拉物理事实,永不被修改)
种族:…
出身:…
本名:阿米娅
当前形态:默认 / 魔王 ← 新增
形态:默认、魔王 ← 新增(有多个才写)
形态·魔王(可变·时态化)
外观:…
能力:…
三档实现(按侵入性)
| 档 | 做什么 | 需要什么 |
|---|---|---|
| ① 只记名字 | .char 加一行 其它称呼: |
✅ 现在就能做,零代码 |
② 加 形态: |
上面那个形状 | 数据(人工填)—— 也不需要改代码,因为召回按 id |
| ③ 按形态过滤记忆 | 哪个形态经历过哪些事 | ❌ 要先重抽(产物里没有形态字段)—— ~¥19 那一档 |
⚠️ ② 和 ③ 的区别很重要
② 只是"她知道自己是哪个形态",记忆仍然共享(所有形态经历合并)。 ③ 才能回答"这个形态没经历过那件事"。
⚠️ 而 ③ 必须先重抽 —— 现在的抽取产物没有形态字段, 所以"哪段剧情属于哪个形态"这个信息不存在。 在此之前声称能做到 ③ 就是编。
5. 建议
- 先做 ①(零成本):给有异格的干员加一行名字
- ② 按需做:真的需要"她知道现在是哪个形态"时,人工填
形态: - ③ 不做:除非先重抽 —— 而那是 ~¥19 那一档
⚠️ 而现状是:一个异格干员都没有。 所以这三档现在都不急 —— 真要加异格干员时,按 ①→② 的顺序做就行,不要为它先建一套变体系统。