fix: 环境遥测拆独立类型 AmbientTelemetrySignal——堵住 chat_id 误标泄漏 (issue #153) #162
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/153-ambient-telemetry-signal"
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 #153
修复内容
按 ADR-0014(issue #108 grill Q3 更新节)修复一处真实隐私泄漏:环境遥测(per-user,如私人摄像头/设备感知流)此前复用 per-chat_id 的
EnvironmentSignal,chat_id由 host "挑一个会话当呈现载体"、代码不做任何校验——填成群聊时,基于私人遥测生成的回复会真实发进那个群、全体成员可见。environmental_awareness.py:新增AmbientTelemetrySignal(user_id, content, plugin_name),不带chat_id字段——从类型层面排除误标进群聊的可能,不是加一道校验。新增to_ambient_telemetry_signal(signal)转换函数:从已识别为遥测的EnvironmentSignal.subject_id派生user_id("真 user_id",遥测场景下事实上必填),chat_id从此完全不读取;subject_id缺失时 fail-closed 丢弃,不猜测、不回退。is_ambient_telemetry/白名单识别机制字节级不变。新增tier2_significance_score_for_telemetry(遥测内容恒 notable)与改写后接受新类型的render_ambient_telemetry_directive。EnvironmentSignal类文档本就是"原义"未被污染,模块级文档字符串重写为指向新类型。environment_pipeline.py:_process_environment_signal里遥测识别提到任何 chat_id 绑定/使用之前(包括死循环熔断计数——这一步在旧代码里比遥测判定更早,若不提前,即便最终发送目标是对的,熔断计数状态也会被 host 提供的 chat_id 污染)。识别出遥测后整体转交新函数_process_ambient_telemetry_signal,全程只用f"{user_id}.p"。runtime_loop.py:run_environment_signal去掉ambient参数(遥测不再经过这里);新增run_ambient_telemetry_signal,目标 chat_id 同样只从user_id推导。设计判断(已过对抗式验证)
"host 怎么把 user_id/content 交给 core 而不经 chat_id"这一步 ADR 原文没有讲到代码层面——两轮独立评审核实后确认:host 仍只实现同一个
to_environment_signalProtocol 方法(不新增 port,匹配 AC"不新增 host 侧映射机制"+"识别机制不变"两条约束),subject_id是唯一可用的真实 user_id 来源,chat_id转换后完全弃用。两轴 review 额外修复
run_ambient_telemetry_signal的query_text最初遗漏plugin_name,会让 host 配置的以插件名(如 "camera")为 trigger_keyword 的 Knowledge/Lore 静默失效——已修复并补变异测试验证过的回归测试。gate_pipeline.py/_process_ambient_telemetry_signal两处过期/缺失的说明性注释。测试
send_private_msg目标是f"{user_id}.p",且群聊自身的情感态/死循环熔断状态全程未被触碰。subject_id缺失时 fail-closed 丢弃的单测+e2e 测试。run_ambient_telemetry_signal的 Knowledge 触发注入回归测试。ruff check、lint-imports、uvx ty check均通过。