移除get_persona的chat_id参数,砍掉多人格支持——保留热重载语义(issue #185 grill定案) #185

Open
opened 2026-08-21 03:24:42 +00:00 by KumaAgent · 0 comments
Member

来源

全量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使用过,无任何测试验证过这个分支)。ArisePortsget_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)同时服务两个独立目的:

  1. 支持"host内多用户可切换人设"(本票要砍掉的对象)
  2. 支持 /reloadprompt 热重载:host 改了persona来源后,管理员执行命令让bot立刻应用新版本,不用重启进程。docstring 原文:"取代原先的静态 persona 字段(issue #80):静态对象一旦注入就再没有'重新读'的余地,而 /reloadprompt 的全部作用就是让 host 重新读一次自己的来源。"

这两者被绑进同一次改动、同一个类型签名,但彼此独立。本票只删 chat_id 参数,保留"每次调用都重新确定当前persona"的热重载契约——Callable[[], Persona] 依然是每次触发都重新调用,不是缓存/静态注入一次。

调用点范围(已核实全部6处,无遗漏)

调用点 chat_id 除取persona外的其它用途 处理方式
loop_factory.py:186 仅用于取persona,无其它用途 改为 ports.get_persona()
entry_drive_tick.py:167_run_cross_platform_pull 同一函数内 source_ctx=chat_id_wait_for_human_activity(chat_id) 独立使用 只改这一次调用,其它两处chat_id保留
entry_drive_tick.py:485assemble_light_context 仅用于取persona 改为 ports.get_persona()
entry_reactive.py:557learn_sticker调用内) learn_sticker(chat_id=chat_id, ...) 独立传入,用于贴纸归属 只改get_persona这次调用,chat_id继续传给learn_sticker
entry_admin.py:494/reloadprompt 仅用于取persona;_last_persona_fingerprint 是模块级全局、不按chat_id分桶,不受影响 改为 ports.get_persona()
delta.py:1287judge_and_maybe_veto调用内) judge_and_maybe_veto(..., chat_id=chat_id, ...) 独立传入,用于漂移否决留痕归属 只改get_persona这次调用,chat_id继续传给judge_and_maybe_veto
reflection.py:451_commit_lesson调用内,跨chat批处理循环体内) _commit_lesson(..., chat_id=attempt.chat_id, ...) 独立传入,用于反思留痕归属 只改get_persona这次调用;该循环仍会对不同 attempt.chat_id 重复调用 get_persona(),效果不变只是不再传参

Acceptance Criteria

  • persona.pyGetPersona 类型改为 Callable[[], Persona];docstring 更新去掉"按chat区分/host内多用户可切换人设"相关表述,明确"不再支持按chat/persona分区状态,如需多个互相隔离的独立身份,请用独立部署(各自独立的 ArisePorts 实例)";保留"每次调用都重新确定当前persona"的热重载契约表述
  • ports.pyArisePorts.get_persona 字段类型同步更新,docstring同步
  • 6个调用点逐一改为 ports.get_persona()(无参数),按上表逐一确认原chat_id变量若被同函数/同语句内其它独立调用使用,继续保留不删
  • tests/conftest.py:78-89 默认 get_persona 夹具从 lambda _chat_id: ... 改为零参数 lambda: ...
  • 全部依赖此夹具/自定义mock的测试文件(test_admin_commands.pytest_admin_commands_dispatch.pytest_delta_compression_cycle.pytest_presence_events_e2e.py 等)mock签名同步改成零参数,语义不变——尤其 test_persona_is_re_read_for_every_turn_not_captured_oncetest_a_changed_persona_is_reported_as_changedtest_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-0001ADR-0027 记录的状态隔离问题一并消失,不需要额外处理
## 来源 全量32条ADR设计合理性对抗审查(评估侧内部执行,2026-08-21,组F)grill定案。完整推理链条见本票历史评论 + [ADR-0001](https://code.srcz.one/ProjectKuma/arise/blob/main/docs/adr/0001-standalone-core-and-ports.md) 2026-08-21(issue #185 grill)更新节 + [ADR-0027](https://code.srcz.one/ProjectKuma/arise/blob/main/docs/adr/0027-cross-platform-profile-pull.md) 对应节。原 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)同时服务两个独立目的: 1. **支持"host内多用户可切换人设"**(本票要砍掉的对象) 2. **支持 `/reloadprompt` 热重载**:host 改了persona来源后,管理员执行命令让bot立刻应用新版本,不用重启进程。docstring 原文:"取代原先的静态 `persona` 字段(issue #80):静态对象一旦注入就再没有'重新读'的余地,而 `/reloadprompt` 的全部作用就是让 host 重新读一次自己的来源。" 这两者被绑进同一次改动、同一个类型签名,但彼此独立。**本票只删 chat_id 参数,保留"每次调用都重新确定当前persona"的热重载契约**——`Callable[[], Persona]` 依然是每次触发都重新调用,不是缓存/静态注入一次。 ## 调用点范围(已核实全部6处,无遗漏) | 调用点 | chat_id 除取persona外的其它用途 | 处理方式 | |---|---|---| | `loop_factory.py:186` | 仅用于取persona,无其它用途 | 改为 `ports.get_persona()` | | `entry_drive_tick.py:167`(`_run_cross_platform_pull`) | 同一函数内 `source_ctx=chat_id`、`_wait_for_human_activity(chat_id)` 独立使用 | 只改这一次调用,其它两处chat_id保留 | | `entry_drive_tick.py:485`(`assemble_light_context`) | 仅用于取persona | 改为 `ports.get_persona()` | | `entry_reactive.py:557`(`learn_sticker`调用内) | `learn_sticker(chat_id=chat_id, ...)` 独立传入,用于贴纸归属 | 只改get_persona这次调用,chat_id继续传给learn_sticker | | `entry_admin.py:494`(`/reloadprompt`) | 仅用于取persona;`_last_persona_fingerprint` 是模块级全局、不按chat_id分桶,不受影响 | 改为 `ports.get_persona()` | | `delta.py:1287`(`judge_and_maybe_veto`调用内) | `judge_and_maybe_veto(..., chat_id=chat_id, ...)` 独立传入,用于漂移否决留痕归属 | 只改get_persona这次调用,chat_id继续传给judge_and_maybe_veto | | `reflection.py:451`(`_commit_lesson`调用内,跨chat批处理循环体内) | `_commit_lesson(..., chat_id=attempt.chat_id, ...)` 独立传入,用于反思留痕归属 | 只改get_persona这次调用;该循环仍会对不同 `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同步 - [ ] 6个调用点逐一改为 `ports.get_persona()`(无参数),按上表逐一确认原chat_id变量若被同函数/同语句内其它独立调用使用,继续保留不删 - [ ] `tests/conftest.py:78-89` 默认 `get_persona` 夹具从 `lambda _chat_id: ...` 改为零参数 `lambda: ...` - [ ] 全部依赖此夹具/自定义mock的测试文件(`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](https://code.srcz.one/ProjectKuma/arise/blob/main/docs/adr/0001-standalone-core-and-ports.md) 与 [ADR-0027](https://code.srcz.one/ProjectKuma/arise/blob/main/docs/adr/0027-cross-platform-profile-pull.md) 记录的状态隔离问题一并消失,不需要额外处理
KumaAgent changed title from 占位标题-稍后回填-07 to 评估:per-chat模型路由协议(ADR-0001留出的空间协议层不存在,全ADR对抗审查组F) 2026-08-21 03:28:29 +00:00
KumaAgent changed title from 评估:per-chat模型路由协议(ADR-0001留出的空间协议层不存在,全ADR对抗审查组F) to 评估:get_persona(chat_id)承诺的同进程多人格能力,状态层(llm_client/storage/consent)无对应支撑 2026-08-21 03:56:13 +00:00
KumaAgent changed title from 评估:get_persona(chat_id)承诺的同进程多人格能力,状态层(llm_client/storage/consent)无对应支撑 to 移除get_persona的chat_id参数,砍掉多人格支持——保留热重载语义(issue #185 grill定案) 2026-08-21 04:14:22 +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#185
No description provided.