人设漂移守护判断留痕+安全基线补编造身份禁令 #116

Closed
opened 2026-08-11 03:37:28 +00:00 by KumaAgent · 0 comments
Member

Parent

#103 第四批清单:31 条实现类落差 + 9 条待拍板(条目 21、22)

What to build

两条独立的守护类缺口,均零前置、零依赖,合成一片:

一、人设漂移守护判断留痕:ADR-0021 拍板的"判断结论带简短理由(供 /why)"与"判断失败记入 /why 标注'判断失败'"在 origin/main 上一件都没落地——DriftVerdict.reason"judge_failed" 状态在 5 处调用点全部只读 .status.reason 直接丢弃。候选被否决时运维和用户看不到任何痕迹,且 fail-closed 意味着一次 LLM 超时会静默吞掉一整批候选而无迹可查。

二、安全基线补编造身份禁令:ADR-0022 于 2026-07-08 拍板要往 SECURITY_BASELINE 固定文本里补一条约束——不得编造 persona/backstory/Knowledge/Persona Lore 之外的核心身份类事实——从未写进去,"用户问你几岁 → 模型现编 18 岁 → 下轮又编 22 岁"这条最常见的人设崩塌路径当前无人拦。

Acceptance criteria

一、人设漂移守护判断留痕

  • 新增一个存储 port 切片承载漂移否决留痕(两套实现:内存 + 持久化均要跟)
  • 五处调用点接入留痕:reflection._commit_lesson(画像候选、技能候选两处)、delta.py Knowledge 候选、learned_sticker.pycross_platform_pull.pull_cross_platform_profile
    • reflection._commit_lesson 当前没有收 chat_id(只收了 get_persona(attempt.chat_id) 的结果),需补上才能按 chat 留痕
    • cross_platform_pull.pull_cross_platform_profile 的 docstring 明写"本函数只管跑一次…不写存储",要留痕需把 verdict 回传给调用方 __init__::_run_cross_platform_pull(签名/返回类型需相应调整)
  • /why 出口渲染这条留痕(explain.py 加渲染函数 + 人话表穷举守卫,同既有惯例)
  • 不要DriftVerdict.reason 字段删掉或简化——原文是 ADOPTED 条款,删字段等于静默推翻已拍板决策;若实现期仍认为不该留 reason,必须先在 ADR-0021 追加更新节推翻,不能默不作声地做

原文(docs/adr/0021-persona-drift-guard.md「决策」节):

  • 判断方式 = LLM-as-judge,独立调用:……做二元判断"是否与人设基线冲突"+ 简短理由(供 /why。判断调用与产出候选的反思调用是两次独立调用……
  • 判断失败 = fail-closed:LLM 调用异常/超时视同"判定冲突",候选丢弃,记入 /why 标注"判断失败",反思下轮可重新尝试产出(非永久拉黑这条候选对应的教训)。与红线2一致:安全阀故障时选择"失效即关"而非"失效即开"。

二、安全基线补编造身份禁令

  • security.py::SECURITY_BASELINE 追加第五条 bullet
  • 不新增 port、不新增存储、不新增子系统、不新增 config——不提供"host 可选追加段"接口,这是原文明写的边界,防止实现方越界做成独立验证子系统或开一个 host 定制文本的口子
  • 补一条非空转的断言:检查文本里含该约束语义(不是只断言 SECURITY_BASELINE 常量被注入到三个消息构造点——那三个既有测试文件已覆盖这点,新加内容天然被覆盖,不构成有效验证)

原文(docs/adr/0022-security-baseline.md「更新(2026-07-08 第三方项目对照 grill)」节):

改为在安全基线固定文本里补一条通用约束——智能体不得编造 persona/backstory/Knowledge/Persona Lore 之外的核心身份类事实(如年龄、籍贯、生日、家庭成员等长期不变的设定),仅允许陈述即时性/易变性的情境细节(如当前所在地、正在做的事)。……不新增 port、不新增存储、不新增子系统——从源头上让"角色自相矛盾"这个问题不成立,而非事后用一套桶结构去检测/纠正它。

同 ADR「决策」节边界约束(一并抄入 AC):

core 写死,零 host 定制:内容通用……所有 host 共享同一份文本。不提供"host 可选追加段"接口——防止开出"host 定制内容本身写得有漏洞、反而削弱整体防线"的新攻击面。

Blocked by

None — can start immediately

## Parent #103 第四批清单:31 条实现类落差 + 9 条待拍板(条目 21、22) ## What to build 两条独立的守护类缺口,均零前置、零依赖,合成一片: **一、人设漂移守护判断留痕**:ADR-0021 拍板的"判断结论带简短理由(供 `/why`)"与"判断失败记入 `/why` 标注'判断失败'"在 origin/main 上一件都没落地——`DriftVerdict.reason` 与 `"judge_failed"` 状态在 5 处调用点全部只读 `.status`、`.reason` 直接丢弃。候选被否决时运维和用户看不到任何痕迹,且 fail-closed 意味着一次 LLM 超时会静默吞掉一整批候选而无迹可查。 **二、安全基线补编造身份禁令**:ADR-0022 于 2026-07-08 拍板要往 `SECURITY_BASELINE` 固定文本里补一条约束——不得编造 persona/backstory/Knowledge/Persona Lore 之外的核心身份类事实——从未写进去,"用户问你几岁 → 模型现编 18 岁 → 下轮又编 22 岁"这条最常见的人设崩塌路径当前无人拦。 ## Acceptance criteria **一、人设漂移守护判断留痕** - [ ] 新增一个存储 port 切片承载漂移否决留痕(两套实现:内存 + 持久化均要跟) - [ ] 五处调用点接入留痕:`reflection._commit_lesson`(画像候选、技能候选两处)、`delta.py` Knowledge 候选、`learned_sticker.py`、`cross_platform_pull.pull_cross_platform_profile` - `reflection._commit_lesson` 当前**没有收 chat_id**(只收了 `get_persona(attempt.chat_id)` 的结果),需补上才能按 chat 留痕 - `cross_platform_pull.pull_cross_platform_profile` 的 docstring 明写"本函数只管跑一次…不写存储",要留痕需把 verdict 回传给调用方 `__init__::_run_cross_platform_pull`(签名/返回类型需相应调整) - [ ] `/why` 出口渲染这条留痕(`explain.py` 加渲染函数 + 人话表穷举守卫,同既有惯例) - [ ] **不要**把 `DriftVerdict.reason` 字段删掉或简化——原文是 ADOPTED 条款,删字段等于静默推翻已拍板决策;若实现期仍认为不该留 reason,必须先在 ADR-0021 追加更新节推翻,不能默不作声地做 原文(docs/adr/0021-persona-drift-guard.md「决策」节): > - **判断方式 = LLM-as-judge,独立调用**:……做**二元**判断"是否与人设基线冲突"+ **简短理由(供 `/why`)**。判断调用与产出候选的反思调用是两次独立调用…… > - **判断失败 = fail-closed**:LLM 调用异常/超时视同"判定冲突",候选丢弃,**记入 `/why` 标注"判断失败"**,反思下轮可重新尝试产出(非永久拉黑这条候选对应的教训)。与红线2一致:安全阀故障时选择"失效即关"而非"失效即开"。 **二、安全基线补编造身份禁令** - [ ] `security.py::SECURITY_BASELINE` 追加第五条 bullet - [ ] **不新增 port、不新增存储、不新增子系统、不新增 config**——不提供"host 可选追加段"接口,这是原文明写的边界,防止实现方越界做成独立验证子系统或开一个 host 定制文本的口子 - [ ] 补一条非空转的断言:检查文本里含该约束语义(不是只断言 `SECURITY_BASELINE` 常量被注入到三个消息构造点——那三个既有测试文件已覆盖这点,新加内容天然被覆盖,不构成有效验证) 原文(docs/adr/0022-security-baseline.md「更新(2026-07-08 第三方项目对照 grill)」节): > 改为在安全基线固定文本里补一条通用约束——**智能体不得编造 persona/backstory/Knowledge/Persona Lore 之外的核心身份类事实**(如年龄、籍贯、生日、家庭成员等长期不变的设定),**仅允许陈述即时性/易变性的情境细节**(如当前所在地、正在做的事)。……不新增 port、不新增存储、不新增子系统——从源头上让"角色自相矛盾"这个问题不成立,而非事后用一套桶结构去检测/纠正它。 同 ADR「决策」节边界约束(一并抄入 AC): > **core 写死,零 host 定制**:内容通用……所有 host 共享同一份文本。**不提供"host 可选追加段"接口**——防止开出"host 定制内容本身写得有漏洞、反而削弱整体防线"的新攻击面。 ## Blocked by None — can start immediately
Yushu closed this issue 2026-08-12 07:48:38 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
ProjectKuma/arise#116
No description provided.