fix(prompt): scope B_NOTIFY injection to miloco background sessions - #479
fix(prompt): scope B_NOTIFY injection to miloco background sessions#479idootop wants to merge 3 commits into
Conversation
B_NOTIFY 原先无条件注入所有会话,导致 agent 在与用户正常对话、只是回答提问时
也把 miloco-notify skill 当成硬前置绕一圈;常规 cron 里还曾把一次汇报拖到 120s
超时。
改为只注入 miloco 后台会话——由感知引擎 / miloco 定时任务 / 规则与任务事件拉起、
turn 跑在后台、回复对用户不可见,只能按 skill 主动推送才算送达的那些会话。
新增 isMilocoBackgroundSession / is_miloco_background_session(TS 与 Python 1:1),
两条线索任一命中即算:
- sessionKey 有 miloco 段(按 `:` 切段,等于 miloco 或以 miloco- 开头)——覆盖
dispatcher `_ROUTE` 的 agent:main:miloco{,-rule,-suggest}、schedule runner 的
miloco-schedule:<cron_id>,以及 hermes 侧的 miloco:cron:… / miloco-rule-<id>
- cron 消息头里的 job 名带 miloco——isolated cron 的 sessionKey 是
agent:<id>:cron:<jobId>:run:<runId>,jobId 随机、看不出归属,只能从
`[cron:<jobId> <jobName>]` 认领;miloco 自管的 4 个 job 都叫 miloco-*
注意没有按 profile != "minimal" 来判:schedule runner 用
`[cron:<name>]` + `miloco-schedule:<id>`,miloco 自己的定时任务恰好落在 minimal,
按 profile 切会把「到点主动播报」的通知能力一起砍掉。
同时重写 B_NOTIFY 正文:作用域已由注入侧收敛,正文不再写「当面回答用户提问除外」
这类例外句——那句在语音 lane 反而是错的,语音提问的答复同样得经 TTS 推回去。
miloco-notify skill 的 description 与「何时激活」一并按触发源改写:闸门生效后,
常规对话里能拉起它的就只剩 description,而其中「设备反馈」等措辞同样有歧义。
|
👋 感谢提交 PR @idootop!维护者会尽快 review。 提交前请确认:
|
[PR #479]: fix(prompt): scope B_NOTIFY injection to miloco background sessions作者: idootop 修改方案要解决的问题: 整体方案(三条主线 + 一条 skill 侧同步):
关键设计原则:
测试覆盖:
问题上轮 ci-bot 四条问题修复验证:
本轮独立扫描:对三条主线(判定闸门逻辑、组装侧门控接线、SKILL.md 文档一致性)+ 跨层一致性(openclaw 与 hermes 双端对齐、dispatcher 结论LGTM — 上轮四条问题全部修复,hermes 侧生效路径已接通并有端到端测试兜底,判定闸门双端对齐,SKILL.md 渠道配置例外消除。 由 review-pr skill v1.6 生成 |
hermes 侧 pre_llm_call 是 noop(miloco-plugin/__init__.py:70),inject_context 根本不会被调用。唯一生效路径是 dispatcher → send_turn → build_system → _build_prepend,而它没接门控参数——上一版合入会把「## 通知用户」从所有 backend lane(interaction / bind / rule / suggestion)里整片摘掉,感知告警会被写进一条 没人收得到的回复里。 门控判据用 miloco 侧 session_key,不是 hermes 的 session_id:_map_session 给每个 id 都加了 `miloco:` 前缀,按段切必然命中,拿它当判据门控恒为真、等于没判。 owner-channel 投递(onboarding)回复会推到车主 IM,用户看得见,故按 delivery.deliver 传 None——语义对齐 openclaw webhooks/agent.ts 的 effectiveSessionKey。 其余 review 意见: - SKILL.md 把「渠道配置」标为激活规则的唯一例外(description + 正文),消解 「不在对话里加载」与「配渠道要加载」的表面矛盾 - cron 头改词首匹配 MILOCO_JOB_RE = /(?:^|[\s:])miloco-/,避免用户自建的 「巡检 miloco 日志」这类 job 名被认领成后台会话(TS / Python 双端同步) - B_NOTIFY 去掉「用户要配置通知渠道」从句:配渠道必然发生在用户说话的会话里, 而那种会话已不注入本块(双端同步) 测试补在生效路径上(回退修复后 2 failed)。为此 conftest 复刻 install-hermes.sh 的摊平部署布局,否则 adapter.py 的 `from .context_injection import` 在仓库布局下 解析不到,build_system 永远测不着——这正是这个洞能溜过去的原因。
|
四条都已修,commit b6c1592。其中 🔴 的修法与建议不同,说明如下。 🔴 门控接在死路径上 —— 确认,但建议的修法无效问题属实且比描述的更严重:hermes 侧 但不能传
改用 miloco 侧 notify_session_key = None if delivery.get("deliver") else session_key判据是「本轮回复用户看不看得见」,语义对齐 openclaw 🟡 / 🔵① / 🔵② 按建议修
测试:补在生效路径上新增 为此 全绿:hermes 239 passed / 2 skipped,openclaw 170 passed, 两点补充:PR 描述里的注入表是 openclaw 侧的review 提到的 hermes
所以那张表描述的是 openclaw 行为,hermes 侧只有 dispatcher 那五种事件。 |
问题
B_NOTIFY原先无条件注入所有会话。两个后果:miloco-notifyskill 当成硬前置绕一圈。原文里「而不是当面回答用户此刻的提问」这个例外句夹在句中容易被忽略,紧跟其后的「典型场景」又列了「设备反馈」,把刚排除的场景拉了回来。方案
把
B_NOTIFY收敛到只注入 miloco 后台会话——由感知引擎 / miloco 定时任务 / 规则与任务事件拉起、turn 跑在后台(deliver=false)、回复对用户不可见,只能按 skill 主动推送才算送达的那些会话。其余会话(用户 IM、常规 cron、CLI 主会话)自身的回复就能到人,不再注入。新增
isMilocoBackgroundSession/is_miloco_background_session(TS 与 Python 端 1:1),两条线索任一命中即算::切段后判「等于miloco或以miloco-开头」。覆盖 dispatcher_ROUTE的agent:main:miloco{,-rule,-suggest}、schedule runner 的miloco-schedule:<cron_id>,以及 hermes 侧的miloco:cron:…/miloco-rule-<id>。agent:<id>:cron:<jobId>:run:<runId>,jobId 由宿主随机生成、看不出归属,只能从[cron:<jobId> <jobName>]里的 job 名认领;miloco 自管的 4 个 job 都叫miloco-*(见home-profile/scheduler.tskCronTasks)。agent:main:miloco(感知 / 语音 / bind 交互 lane)agent:main:miloco-rule/-suggestmiloco-schedule:<cron_id>(backend 定时任务)miloco-*cron job(perception-digest / home-patrol / …)[cron:<id> PTM 汇报])顺带一提:
onboarding事件经resolveTarget: "owner-channel"改写成车主 IM 会话跑,这条闸门下自然不再注入——那个 turn 的回复本来就在用户眼前,符合预期。B_NOTIFY 正文重写
作用域已由注入侧收敛,正文就不再靠「而不是当面回答用户此刻的提问」这种例外句消歧。那句在语音 lane 反而是错的:语音提问的答复同样得经 TTS 推回去。新正文只讲这类会话里该怎么做——本轮有信息要传达就先读 skill,不需要告知任何人就做完即止。同时把最含糊的「设备反馈」改成「设备异常」。
skill 侧同步
闸门生效后,常规对话里能拉起
miloco-notify的就只剩 skill description,而它原本也含「设备反馈」这类歧义词。description 与「何时激活」一并改成按触发源判定,并显式排除「汇报用户刚让你做的设备操作结果」。只改源目录plugins/skills/(plugins/openclaw/skills/是 gitignore 的同步产物)。已知取舍
miloco-notify不再是常驻硬前置,改为靠 skill description 自行发现加载。B_CAPABILITIES里「通过语音 / IM / 米家推送送达」仍在,配置通知渠道那句也保留在 description 中。miloco(agent:miloco:telegram:…)会误判成后台会话而多注入一段——等同本次改动前的行为,无功能损失,未额外加区分。验证
新增覆盖:闸门的 12 种 sessionKey 形态、cron 头认领 / 不认领、正文提到 miloco 不算数;组装层新增「用户 IM 不注入」「rule / suggest 仍注入」「miloco 定时任务(minimal)仍注入」「miloco cron vs 用户 cron」。原「minimal(cron) 含 miloco-notify」的断言按新语义翻转。