罗德岛通讯与技术部

异格(ALTER)

ALTER FORMS

recall('Coldshot', q) 按 operator_id 取数据(_resolve_memory_key)

状态:⚪ 未实现,且数据里一个都没有 · 最后核对 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_keyColdshot / 冰酿 / 玛德琳 都路由到同一份数据。

异格唯一多出来的语义是「身体/能力/外观不同」,而不是「名字不同」。


4. 设计:一个字段,不是一套系统

数据形状

## 锚(不可变——泰拉物理事实,永不被修改)
种族:…
出身:…
本名:阿米娅
当前形态:默认 / 魔王              ← 新增
形态:默认、魔王                   ← 新增(有多个才写)

形态·魔王(可变·时态化)
外观:…
能力:…

三档实现(按侵入性)

做什么 需要什么
① 只记名字 .char 加一行 其它称呼: 现在就能做,零代码
② 加 形态: 上面那个形状 数据(人工填)—— 也不需要改代码,因为召回按 id
③ 按形态过滤记忆 哪个形态经历过哪些事 要先重抽(产物里没有形态字段)—— ~¥19 那一档

⚠️ ② 和 ③ 的区别很重要

② 只是"她知道自己是哪个形态",记忆仍然共享(所有形态经历合并)。 ③ 才能回答"这个形态经历过那件事"。

⚠️ 而 ③ 必须先重抽 —— 现在的抽取产物没有形态字段, 所以"哪段剧情属于哪个形态"这个信息不存在在此之前声称能做到 ③ 就是编。


5. 建议

  1. 先做 ①(零成本):给有异格的干员加一行名字
  2. ② 按需做:真的需要"她知道现在是哪个形态"时,人工填 形态:
  3. ③ 不做:除非先重抽 —— 而那是 ~¥19 那一档

⚠️ 而现状是:一个异格干员都没有。 所以这三档现在都不急 —— 真要加异格干员时,按 ①→② 的顺序做就行,不要为它先建一套变体系统