环境遥测:私人环境信号跳过 tier-1 直达 tier-2 候选评估 #73

Merged
Yushu merged 2 commits from feature/68-ambient-environment-signal into main 2026-07-25 04:19:02 +00:00
Member

Closes #68

What

让 host 提供的私人环境信号(摄像头/设备活动感知,经 host 侧 LLM/VLM 预筛选)也能给机器人一点"氛围感",但走一条跳过 tier-1、直达 tier-2 候选评估的分流路径——"群氛围"这个概念不适用私人感知流,混进 tier-1 的 energy 传染会把"用户自己在设备前忙"误判成"群里很热闹"。不新增任何字段/类型,复用现有 EnvironmentSignal 契约。

实现要点

  • 识别方式:新增静态 config arise_ambient_telemetry_pluginsfrozenset[str],默认空集),host 把摄像头/设备活动这类来源的 plugin 标识填进来;纯谓词 is_ambient_telemetry 按名单判断。默认空集下判定恒为假,未接入遥测源的部署不会多出任何新行为。
    • 按名单而非某个保留取值/魔法前缀声明:host 可以同时接多个源(camera/device-activity)且各自保留独立 plugin 名,stimulus_label 与渲染文本仍能区分是哪一路,配置本身也让"这个部署接了哪些源"一眼可见。
    • 只看 plugin 不看 action——plugin 标识来源本身,action 标识来源内发生了什么,同一来源的所有 action 必然同属遥测类。
  • 跳过的边界:跳过的只是"喂 tier-1 EMA"这一步,不是整条 tier-2 路径。解锁门槛、显著性打分、两级门控、"看了也不说"的沉默权利全都照常。同时刻意不写 last_stimulus_label/last_stimulus_time——那是 tier-1 抗刷状态,写了反而会污染普通环境信号的重复判定。
  • 独立渲染措辞:新增 render_ambient_telemetry_directive。既有措辞把场景写死成"刚才群里发生了这件事",对私人感知流是喂给模型的事实错误,会诱导它对着群做出不相干的反应;新措辞压低存在感("你注意到")并显式点出"对方也未必知道你能感知到这些"(PRD user story 6"不希望产生被监视般的神经质反应")。既有渲染函数输出逐字节不变,既有测试断言零改动。
  • RuntimeLoop.run_environment_signal 新增 ambient: bool = False 关键字,只决定用哪个渲染器——组装管线/门控/沉默权利完全一致。

Review

/code-review 两轴(Standards + Spec)已跑。Spec 轴做了变异测试验证守卫真的生效,并逐字节比对确认既有渲染函数输出未变。修复的发现:

  • 两轴各抓到同一处的两面(一个改动同时解决):遥测分流原先自己读一次快情感态存进 fast_state,而 else 分支同名变量装的是"刚更新过的新状态"——一名两义,调用点看不出拿到哪种;且 _evaluate_unified_gateaffective_state=None 的既定行为本就是"自己读当前值",那次读是冗余的。改为分流时保持 None 交给门控解析,变量恢复 new_fast_state 这个准确的名字。
  • 补齐两处设计理由(Spec 轴提问):为何只看 plugin 不看 action;为何刻意不写抗刷状态、遥测自身的复读约束为何交给沉默预算(tier-2 显著性打分对任何来源都不做重复折扣,不是遥测特有缺口,ADR-0014 明确说沉默权利由两级门控自动继承)。
  • 测试 fixture telemetry_plugins 实为 setter,改名 set_telemetry_plugins

Tests

全仓库 957 个测试通过(新增 15 个:is_ambient_telemetry 与遥测措辞纯函数、fast/slow 情感态处理前后不变的 AC 点名断言、连续遥测信号不累积群 energy、名单外插件照常走 tier-1、遥测照常进 tier-2 且用遥测措辞、锁定时/平淡时照常沉默)。

变异测试复核:强制 ambient=False 挂 3 条新测试,强制 ambient=True 挂 3 条(含 2 条既有测试)——守卫两个方向都真的被覆盖。

Closes #68 ## What 让 host 提供的私人环境信号(摄像头/设备活动感知,经 host 侧 LLM/VLM 预筛选)也能给机器人一点"氛围感",但走一条**跳过 tier-1、直达 tier-2 候选评估**的分流路径——"群氛围"这个概念不适用私人感知流,混进 tier-1 的 energy 传染会把"用户自己在设备前忙"误判成"群里很热闹"。不新增任何字段/类型,复用现有 `EnvironmentSignal` 契约。 ## 实现要点 - **识别方式**:新增静态 config `arise_ambient_telemetry_plugins`(`frozenset[str]`,默认空集),host 把摄像头/设备活动这类来源的 plugin 标识填进来;纯谓词 `is_ambient_telemetry` 按名单判断。默认空集下判定恒为假,未接入遥测源的部署不会多出任何新行为。 - 按名单而非某个保留取值/魔法前缀声明:host 可以同时接多个源(`camera`/`device-activity`)且各自保留独立 plugin 名,`stimulus_label` 与渲染文本仍能区分是哪一路,配置本身也让"这个部署接了哪些源"一眼可见。 - 只看 `plugin` 不看 `action`——plugin 标识来源本身,action 标识来源内发生了什么,同一来源的所有 action 必然同属遥测类。 - **跳过的边界**:跳过的只是"喂 tier-1 EMA"这一步,不是整条 tier-2 路径。解锁门槛、显著性打分、两级门控、"看了也不说"的沉默权利全都照常。同时刻意不写 `last_stimulus_label`/`last_stimulus_time`——那是 tier-1 抗刷状态,写了反而会污染普通环境信号的重复判定。 - **独立渲染措辞**:新增 `render_ambient_telemetry_directive`。既有措辞把场景写死成"刚才群里发生了这件事",对私人感知流是喂给模型的事实错误,会诱导它对着群做出不相干的反应;新措辞压低存在感("你注意到")并显式点出"对方也未必知道你能感知到这些"(PRD user story 6"不希望产生被监视般的神经质反应")。既有渲染函数输出**逐字节不变**,既有测试断言零改动。 - `RuntimeLoop.run_environment_signal` 新增 `ambient: bool = False` 关键字,只决定用哪个渲染器——组装管线/门控/沉默权利完全一致。 ## Review `/code-review` 两轴(Standards + Spec)已跑。Spec 轴做了变异测试验证守卫真的生效,并逐字节比对确认既有渲染函数输出未变。修复的发现: - **两轴各抓到同一处的两面**(一个改动同时解决):遥测分流原先自己读一次快情感态存进 `fast_state`,而 else 分支同名变量装的是"刚更新过的新状态"——一名两义,调用点看不出拿到哪种;且 `_evaluate_unified_gate` 对 `affective_state=None` 的既定行为本就是"自己读当前值",那次读是冗余的。改为分流时保持 `None` 交给门控解析,变量恢复 `new_fast_state` 这个准确的名字。 - **补齐两处设计理由**(Spec 轴提问):为何只看 `plugin` 不看 `action`;为何刻意不写抗刷状态、遥测自身的复读约束为何交给沉默预算(tier-2 显著性打分对任何来源都不做重复折扣,不是遥测特有缺口,ADR-0014 明确说沉默权利由两级门控自动继承)。 - 测试 fixture `telemetry_plugins` 实为 setter,改名 `set_telemetry_plugins`。 ## Tests 全仓库 957 个测试通过(新增 15 个:`is_ambient_telemetry` 与遥测措辞纯函数、fast/slow 情感态处理前后不变的 AC 点名断言、连续遥测信号不累积群 energy、名单外插件照常走 tier-1、遥测照常进 tier-2 且用遥测措辞、锁定时/平淡时照常沉默)。 变异测试复核:强制 `ambient=False` 挂 3 条新测试,强制 `ambient=True` 挂 3 条(含 2 条既有测试)——守卫两个方向都真的被覆盖。
host 提供的私人常驻感知流(摄像头/设备活动,经 host 侧 LLM/VLM 预筛选)
复用现有 EnvironmentSignal 契约,不新增任何字段/类型;core 靠 host 静态
声明的来源名单(arise_ambient_telemetry_plugins,默认空集)识别,自己不做
任何内容层面的预筛选。

命中名单的信号跳过 tier-1(不喂群氛围传染 EMA,也不写抗刷刺激记录),只读
当前快情感态供 tier-2 门控用——"群氛围"不适用私人感知流,混进 tier-1 会把
"用户自己在设备前忙"误判成"群里很热闹"。跳过的只是喂 EMA 这一步,解锁门槛
/显著性打分/两级门控/"看了也不说"的沉默权利全都照常。

遥测走独立渲染措辞(render_ambient_telemetry_directive):既有措辞把场景
写死成"群里发生",对私人感知流是喂给模型的事实错误,会诱导它对着群做出
不相干的反应;新措辞压低存在感并显式点出"对方未必知道你能感知到这些"。
既有渲染函数与既有测试断言零改动。

默认空集下判定恒为假,未接入遥测源的部署不会多出任何新行为。
Standards + Spec 两轴各抓到同一处的两面,一个改动同时解决:
遥测分流原先自己读一次快情感态存进 `fast_state`,而 else 分支里同名变量装
的是"刚更新过的新状态"——一个名字两种含义,调用点看不出拿到的是哪种;且
`_evaluate_unified_gate` 对 `affective_state=None` 的既定行为本就是"自己读
当前存储值",那次读是冗余的。改为遥测分流保持 `None` 交给门控解析,变量
恢复 `new_fast_state` 这个准确的名字。

补文档(Spec 轴提问"这是否符合本意"):`is_ambient_telemetry` 只看 `plugin`
不看 `action`——plugin 标识来源本身,action 标识来源内发生了什么,同一来源
的所有 action 必然同属遥测类,要求 host 两处各编码一遍纯属冗余。

补文档(Spec 轴指出的复读约束疑虑):遥测分流刻意不写 last_stimulus_label
——那是 tier-1 抗刷状态,写了会污染普通信号的重复判定;遥测自身的复读约束
交给沉默预算,且 tier-2 显著性打分对任何来源都不做重复折扣,这不是遥测特有
缺口,ADR-0014 明确说沉默权利由两级门控自动继承。

测试 fixture `telemetry_plugins` 是个 setter,改名 `set_telemetry_plugins`。

已用变异测试复核守卫真的生效:强制 ambient=False 挂 3 条新测试,强制
ambient=True 挂 3 条(含 2 条既有测试)。
Yushu merged commit 3160243753 into main 2026-07-25 04:19:02 +00:00
Yushu deleted branch feature/68-ambient-environment-signal 2026-07-25 04:19:03 +00:00
Sign in to join this conversation.
No description provided.