人设漂移守护判断留痕+安全基线补编造身份禁令 #121
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/116-drift-guard-trace-and-identity-baseline"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #116
Summary
两条独立的守护类缺口,均零前置、零依赖,合成一片:
/why)"与"判断失败记入/why标注'判断失败'"两条 ADOPTED 条款此前一件都没落地——五处调用点(反思闭环画像/技能候选、Delta 压缩 Knowledge
候选、习得贴纸、跨平台动态拉取)拿到
DriftVerdict后只读.status == "pass",判否/判断失败直接丢弃,候选被否决时运维和用户看不到任何痕迹。
drift_veto.py:DriftVetoRecord/存储 port 切片(内存+持久化)+judge_and_maybe_veto/record_veto_if_needed两个组合入口,per-chat保留环形状仿
decision_snapshot.py但独立实现。reflection._commit_lesson补上了此前缺失的chat_id参数。cross_platform_pull.pull_cross_platform_profile本身不写存储(可能被抢占取消),返回类型改为
PullOutcome{candidate, verdict},由调用方entry_drive_tick._run_cross_platform_pull按需落痕。/why追加渲染这条留痕(explain.render_drift_vetoes+ 人话表穷举守卫,同既有惯例)。
SECURITY_BASELINE追加第五条 bullet("不得编造 persona/backstory/Knowledge/Persona Lore 之外的核心身份类
事实"),不新增 port/存储/子系统/config,纯文本追加;补一条非空转的语义
断言测试(不只是断言常量被注入到既有三处消息构造点)。
Review
两轴 review(sonnet,Standards + Spec 轴并行,随后对抗式复核)抓到 3 条
确认成立的发现,全部已修复;1 条 low 严重度发现经复核判定不成立(有具体
理由,未采纳):
cross_platform_pull判否后没有走judge_and_maybe_veto,而是在entry_drive_tick.py里手写了一份等价的if verdict.status != "pass"判断,与模块文档"唯一入口"的表述矛盾——已拆出
record_veto_if_needed(judge_and_maybe_veto的后半段)给entry_drive_tick.py复用,"该不该留痕"判定收敛回一份代码,同步订正两处失实文档措辞,补一条等价性回归测试。
PullOutcome去 Optional 化后asyncio.gather的类型推断失效,basedpyright 报 2 个新错(不挡 CI 实际用的
ty,但影响本地 IDE 体验)——改用显式
list[asyncio.Task[Any]]收集后再 gather,basedpyright验证归零。
/why理论上"有留痕但无决策快照"会提前返回、看不到留痕——复核逐一追了五处留痕调用点的触发前提,确认当前代码结构下这个
场景不可达(每条留痕产生路径都必然先经过一次会写决策快照的门控评估),
判定不成立。
Test plan
uv run pytest:1688 passeduv run ruff check .:cleanuv run basedpyright src/nonebot_plugin_arise/entry_drive_tick.py:0 errorsdocs分支本地提交(不推送)