移除get_persona的chat_id参数,砍掉多人格支持——保留热重载语义(issue #185 grill定案) #185
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
来源
全量32条ADR设计合理性对抗审查(评估侧内部执行,2026-08-21,组F)grill定案。完整推理链条见本票历史评论 + ADR-0001 2026-08-21(issue #185 grill)更新节 + ADR-0027 对应节。原 issue #184(PullConsent persona_id维度)已并入本票关闭。
结论
砍掉"同进程按chat切换人设"这个能力(YAGNI——从落地至今从未被任何host使用过,无任何测试验证过这个分支)。
ArisePorts除get_persona外几乎全部port(llm_client/storage/embedding_client/resource/get_tools/六池成本账本)都是全chat共用的进程级单例,只有get_persona一个孤例承诺"按chat区分身份",且从未被兑现过。决策:
GetPersona类型从Callable[[str], Persona]收窄为Callable[[], Persona]——只删chat_id参数,不动 callable 形态本身。关键澄清:不要连带砍掉热重载能力
get_persona是 callable(而非静态字段)这件事,历史上(issue #80)同时服务两个独立目的:/reloadprompt热重载:host 改了persona来源后,管理员执行命令让bot立刻应用新版本,不用重启进程。docstring 原文:"取代原先的静态persona字段(issue #80):静态对象一旦注入就再没有'重新读'的余地,而/reloadprompt的全部作用就是让 host 重新读一次自己的来源。"这两者被绑进同一次改动、同一个类型签名,但彼此独立。本票只删 chat_id 参数,保留"每次调用都重新确定当前persona"的热重载契约——
Callable[[], Persona]依然是每次触发都重新调用,不是缓存/静态注入一次。调用点范围(已核实全部6处,无遗漏)
loop_factory.py:186ports.get_persona()entry_drive_tick.py:167(_run_cross_platform_pull)source_ctx=chat_id、_wait_for_human_activity(chat_id)独立使用entry_drive_tick.py:485(assemble_light_context)ports.get_persona()entry_reactive.py:557(learn_sticker调用内)learn_sticker(chat_id=chat_id, ...)独立传入,用于贴纸归属entry_admin.py:494(/reloadprompt)_last_persona_fingerprint是模块级全局、不按chat_id分桶,不受影响ports.get_persona()delta.py:1287(judge_and_maybe_veto调用内)judge_and_maybe_veto(..., chat_id=chat_id, ...)独立传入,用于漂移否决留痕归属reflection.py:451(_commit_lesson调用内,跨chat批处理循环体内)_commit_lesson(..., chat_id=attempt.chat_id, ...)独立传入,用于反思留痕归属attempt.chat_id重复调用get_persona(),效果不变只是不再传参Acceptance Criteria
persona.py:GetPersona类型改为Callable[[], Persona];docstring 更新去掉"按chat区分/host内多用户可切换人设"相关表述,明确"不再支持按chat/persona分区状态,如需多个互相隔离的独立身份,请用独立部署(各自独立的ArisePorts实例)";保留"每次调用都重新确定当前persona"的热重载契约表述ports.py:ArisePorts.get_persona字段类型同步更新,docstring同步ports.get_persona()(无参数),按上表逐一确认原chat_id变量若被同函数/同语句内其它独立调用使用,继续保留不删tests/conftest.py:78-89默认get_persona夹具从lambda _chat_id: ...改为零参数lambda: ...test_admin_commands.py、test_admin_commands_dispatch.py、test_delta_compression_cycle.py、test_presence_events_e2e.py等)mock签名同步改成零参数,语义不变——尤其test_persona_is_re_read_for_every_turn_not_captured_once、test_a_changed_persona_is_reported_as_changed、test_a_refused_reloadprompt_never_asks_the_host_for_persona这几条守护热重载行为的测试应该继续通过,不是被删除或改变断言CONTEXT.md/docs/design.md对应措辞同步修正("host内多用户可切换人设、每人设独立model/provider路由完全由host组合已有能力实现"这类表述需要移除或改写为"不支持")Not in scope
/reloadprompt命令本身的行为(继续每次重新查询、指纹比对逻辑不变)llm_client/storage等其它port的单例设计——本票落地后"同进程多人格"这个前提被移除,ADR-0001 与 ADR-0027 记录的状态隔离问题一并消失,不需要额外处理占位标题-稍后回填-07to 评估:per-chat模型路由协议(ADR-0001留出的空间协议层不存在,全ADR对抗审查组F)评估:per-chat模型路由协议(ADR-0001留出的空间协议层不存在,全ADR对抗审查组F)to 评估:get_persona(chat_id)承诺的同进程多人格能力,状态层(llm_client/storage/consent)无对应支撑评估:get_persona(chat_id)承诺的同进程多人格能力,状态层(llm_client/storage/consent)无对应支撑to 移除get_persona的chat_id参数,砍掉多人格支持——保留热重载语义(issue #185 grill定案)