补漏:句柄归属跨 chat 未校验(可撤别群消息)+ 习得贴纸开关无命令(整个子系统恒不执行) #102
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?
1.
self_recall/edit不校验句柄归属 → 可用 A 群的句柄撤 B 群的消息ADR-0012「决策 → 2. 触发」+「6. 治理」:
实际:
runtime_loop.py的_handle_self_recall/_handle_edit拿到entry后从不比较entry.chat_id与本轮chat_id。查漏复核方已实测:在 gB 群用 gA 群的句柄撤回成功。ADR 把这条称作结构不变量,理由是「误撤比不撤更糟」。
风险有多真:句柄是 uuid4 前 12 位,跨会话猜不到——但模型记错句柄归属比猜句柄现实得多(同一模型在多个 chat 间轮转,句柄形如
m7的短标识极易串)。为什么测试没抓到:
tests/test_self_message_control.py全部用例都在单会话内——典型的「测试与被测守卫同构,守卫不存在也全绿」。_handle_self_recall/_handle_edit解析出entry后校验entry.chat_id == chat_id,不等即 fail-closed 不产生任何平台调用(同这两个函数里既有的「句柄不解析即不动」风格)。self_recall/edit,断言 egress 零调用。2. 习得贴纸的 opt-in 开关没有任何命令可以打开 → 整个子系统恒不执行
ADR-0024「决策」节第 4 条:
实际:
get_sticker_learning_enabled无行时返回False,而set_sticker_learning_enabled在src/零调用点、也没有对应的管理命令。后果:识别 → 去重 → 人设漂移守护 → 落库整条链永不触发,
search_stickers恒查空库。也就是 249 行learned_sticker.py+ 一张存储表 + 一个 Qdrant collection + 工具 schema + 一整套测试,产出为零。learned_sticker.py:12把这条跟进挂在「ADR-0010 运营面建好后」,而运营面已在 issue #83 宣布全部落地——前置早就满足了,只是没人回来接这根线。/settool加一条 per-chat 开关命令(走ports.is_admin校验,与其余管理命令同形)。tests/test_admin_commands_dispatch.py的「已覆盖集合 == 管理命令集合」断言会因为新增命令而红,那正是它该做的)。search_stickers能查到。别只断言"开关能写进去"——那不能区分"开关生效了"和"开关写了但链路仍不通"。Not in scope