reactive 路径逐条 addressed/skipped 判断实现(issue #176 grill) #176

Open
opened 2026-08-20 08:07:18 +00:00 by KumaAgent · 0 comments
Member

Parent

issue #176 grill(2026-08-20 拍板:现在实现,接消费方);ADR 更新见 PR #178(ADR-0029 更新节 +
CONTEXT.md/design.md 词条同步 + gating.py 模块文档同步)

What to build

正式实现 ADR-0017 决策节承诺、从两级门控落地起从未真正兑现的"逐条 addressed/skipped 判断",
并接上一个真实消费方(/why 渲染),不留一个没人用的字段。

原文(docs/adr/0029-unified-trigger-pipeline.md「更新(2026-08-20,issue #176 grill)」节):

决策:现在实现,且要接上至少一个消费方(/why 渲染),不留一个没人用的字段。

  • 归属计算复用 quote_message_id:模型一轮内可以多次 send_messagearise_max_sends_ per_turn),每次可以 quote 批次内任意一条消息(不限第一条),known_message_ids 已经把
    引用范围限定在本次触发批次内。被 quote 的消息记为 addressed,批次内其余非 bot 消息记为
    skipped。这条信息此前只被当作发给平台的"引用回复" UI 参数,从未被读回去参与 addressed/
    skipped 计算,现在需要真正内聚进 RuntimeLoop(而不是继续像现状那样由 entry_reactive.py
    run() 返回之后凭 bool(sends) 事后拼凑)。
  • 退化路径 = 整批二元判定capabilities.quote 不可用,或模型发了消息但没有 quote 任何
    具体消息时,退回现有行为——有 send 则整批 addressed,无 send 则整批 skipped。
  • 交互原语场景天然维持整批二元message_id 不出现在 <interaction> 信封的渲染文本里,
    模型看不到也无法引用,不需要为这个子场景单独设计。

Acceptance criteria

  • RuntimeLoopruntime_loop.py)在工具循环执行 send_message 时,收集每次调用实际
    接受的 quote_message_id(只统计校验通过、真正在 known_message_ids 里的那些,被静默降级
    的不算),run() 返回时把这批"本轮被 quote 过的消息 id 集合"传出去——具体接口形状(返回值
    新增字段 / 独立方法)自定
  • entry_reactive.py 决策快照收尾处改用这个集合计算 addressed_message_ids/
    skipped_message_ids:被 quote 过的消息记 addressed,批次内其余非 bot 消息记 skipped
  • 退化路径capabilities.quote 为假,或本轮虽有 send 但没有任何一次成功 quote 时,
    退回现有整批二元判定(有 send 则整批 addressed,无 send 则整批 skipped)——不能让这种情况下
    产出一个"空的 addressed + 全部 skipped"的误导性结果
  • /whyentry_admin.py::_run_why/explain.py::render_decision_explanation)新增渲染
    这两个字段的内容——具体文案自定,至少要能让人看出"这批里哪几条被回应了、哪几条被跳过"
  • gating.py 模块文档、CONTEXT.md「选择性回应」词条、docs/design.md 对应段落,落地后
    同步标注"已实现"(当前是"尚未实现,见 issue #176")
  • 补测试:一批多条消息、模型分两次 send 分别 quote 不同消息 → addressed 精确对应被 quote
    的那两条,其余记 skipped;能力不可用时退化为整批判定;模型发送但未 quote 任何具体消息时同样
    退化为整批 addressed;交互原语场景(target_is_self=True)不受影响,维持整批二元

Not in scope

  • 不改 quote_message_id 本身的现有校验逻辑(known_message_ids 归属校验、静默降级不报错)
  • 不改反思闭环——它从设计上就不消费 DecisionSnapshot 的这两个字段,本票不改变这一点
  • 不处理"整批发送失败时 skipped_message_ids=整批,与模型主动沉默在字段层面不可区分"这条
    ADR-0012 已标注的已知缺口,留给后续 ticket
  • 不新增本地启发式"检测直接提问强制回应"之类的护栏(ADR-0017 决策节明确排除)
## Parent issue #176 grill(2026-08-20 拍板:现在实现,接消费方);ADR 更新见 PR #178(ADR-0029 更新节 + CONTEXT.md/design.md 词条同步 + `gating.py` 模块文档同步) ## What to build 正式实现 ADR-0017 决策节承诺、从两级门控落地起从未真正兑现的"逐条 addressed/skipped 判断", 并接上一个真实消费方(`/why` 渲染),不留一个没人用的字段。 原文(`docs/adr/0029-unified-trigger-pipeline.md`「更新(2026-08-20,issue #176 grill)」节): > **决策:现在实现,且要接上至少一个消费方(`/why` 渲染),不留一个没人用的字段。** > > - **归属计算复用 `quote_message_id`**:模型一轮内可以多次 `send_message`(`arise_max_sends_ > per_turn`),每次可以 `quote` 批次内任意一条消息(不限第一条),`known_message_ids` 已经把 > 引用范围限定在本次触发批次内。被 quote 的消息记为 addressed,批次内其余非 bot 消息记为 > skipped。这条信息此前只被当作发给平台的"引用回复" UI 参数,从未被读回去参与 addressed/ > skipped 计算,现在需要真正内聚进 `RuntimeLoop`(而不是继续像现状那样由 `entry_reactive.py` > 在 `run()` 返回之后凭 `bool(sends)` 事后拼凑)。 > - **退化路径 = 整批二元判定**:`capabilities.quote` 不可用,或模型发了消息但没有 quote 任何 > 具体消息时,退回现有行为——有 send 则整批 addressed,无 send 则整批 skipped。 > - **交互原语场景天然维持整批二元**:`message_id` 不出现在 `<interaction>` 信封的渲染文本里, > 模型看不到也无法引用,不需要为这个子场景单独设计。 ## Acceptance criteria - [ ] `RuntimeLoop`(`runtime_loop.py`)在工具循环执行 `send_message` 时,收集每次调用实际 接受的 `quote_message_id`(只统计校验通过、真正在 `known_message_ids` 里的那些,被静默降级 的不算),`run()` 返回时把这批"本轮被 quote 过的消息 id 集合"传出去——具体接口形状(返回值 新增字段 / 独立方法)自定 - [ ] `entry_reactive.py` 决策快照收尾处改用这个集合计算 `addressed_message_ids`/ `skipped_message_ids`:被 quote 过的消息记 addressed,批次内其余非 bot 消息记 skipped - [ ] **退化路径**:`capabilities.quote` 为假,或本轮虽有 send 但没有任何一次成功 quote 时, 退回现有整批二元判定(有 send 则整批 addressed,无 send 则整批 skipped)——不能让这种情况下 产出一个"空的 addressed + 全部 skipped"的误导性结果 - [ ] `/why`(`entry_admin.py::_run_why`/`explain.py::render_decision_explanation`)新增渲染 这两个字段的内容——具体文案自定,至少要能让人看出"这批里哪几条被回应了、哪几条被跳过" - [ ] `gating.py` 模块文档、CONTEXT.md「选择性回应」词条、`docs/design.md` 对应段落,落地后 同步标注"已实现"(当前是"尚未实现,见 issue #176") - [ ] 补测试:一批多条消息、模型分两次 send 分别 quote 不同消息 → addressed 精确对应被 quote 的那两条,其余记 skipped;能力不可用时退化为整批判定;模型发送但未 quote 任何具体消息时同样 退化为整批 addressed;交互原语场景(`target_is_self=True`)不受影响,维持整批二元 ## Not in scope - 不改 `quote_message_id` 本身的现有校验逻辑(`known_message_ids` 归属校验、静默降级不报错) - 不改反思闭环——它从设计上就不消费 `DecisionSnapshot` 的这两个字段,本票不改变这一点 - 不处理"整批发送失败时 skipped_message_ids=整批,与模型主动沉默在字段层面不可区分"这条 ADR-0012 已标注的已知缺口,留给后续 ticket - 不新增本地启发式"检测直接提问强制回应"之类的护栏(ADR-0017 决策节明确排除)
KumaAgent changed title from 评估:reactive 路径逐条 addressed/skipped 判断要不要实现(ADR-0029) to reactive 路径逐条 addressed/skipped 判断实现(issue #176 grill) 2026-08-20 09:27:41 +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#176
No description provided.