Skip to content

fix(vc): 隔离监听群人工追问输出协议 - #941

Merged
deepcoldy merged 1 commit into
deepcoldy:masterfrom
XiangYu-BD:fix/vc-listener-im-output
Aug 28, 2026
Merged

fix(vc): 隔离监听群人工追问输出协议#941
deepcoldy merged 1 commit into
deepcoldy:masterfrom
XiangYu-BD:fix/vc-listener-im-output

Conversation

@XiangYu-BD

@XiangYu-BD XiangYu-BD commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

问题

自动会议投递会要求模型使用内部 JSON 协议,供 Botmux 判断是否要向监听群发布增量:

{"decision":"skip"}
{"decision":"publish","content":"..."}

监听群中的人工 @Bot 会路由到同一个会议 receiver session,以复用已有会议上下文。

旧实现没有在人工追问回合显式覆盖自动投递的 JSON 输出协议。因此模型可能沿用上一轮自动纪要的格式,最终被作为人工回复原样渲染到监听群,暴露内部控制 JSON。

修复

  1. 为监听群人工 @Bot 追问注入可信的自然语言输出约束,明确禁止输出或解释内部 decision/publish JSON;
  2. 增加发送端兜底:若已有会话上下文仍导致人工回复返回合法的 {"decision":"publish","content":"..."},仅向用户展示其中的 content
  3. 自动会议投递保持原有严格行为:仍要求并解析 skip/publish JSON 协议,不改变自动纪要的投递规则。

回归测试

新增覆盖:

  • 监听群人工追问具有独立的自然语言输出协议;
  • 人工追问错误继承自动投递的 publish JSON 时,只渲染 content 正文,不显示控制 JSON;
  • 会议投递、监听群回复和受控发送策略仍保持原有行为。

已执行:

corepack pnpm test -- --run \
  test/vc-meeting-listener-output-protocol.test.ts \
  test/bridge-final-output-retry.test.ts \
  test/vc-meeting-delivery-receiver.test.ts \
  test/vc-meeting-send-policy.test.ts \
  test/vc-meeting-im-reply.test.ts
# 131 passed

corepack pnpm build
# passed

影响范围

仅影响带有可信 vcMeetingImTurnOrigin 的监听群人工追问回合。

  • 自动会议投递仍使用原有 skip/publish 协议;
  • 普通飞书会话不受影响;
  • 不改变会议权限、事件订阅或受控会议动作的授权规则。

@XiangYu-BD
XiangYu-BD requested a review from deepcoldy as a code owner August 19, 2026 11:56

@deepcoldy deepcoldy left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

隔离监听群人工追问输出协议方向正确,逻辑自洽。

已核验:

  • 两条路径互斥不重叠——自动投递(dispatchAttempt 有值)走 delivery-request instruction 通道注入严格 JSON 协议;人工 IM 追问(dispatchAttempt undefined + 有 origin)走新的自然语言约束 + 发送端兜底拆包。不双重注入,自动投递零回归。
  • 主防线(提示注入)是出口无关的,普通 lane 与 codex-app sidecar lane 均注入到。
  • 兜底作用域为「模型未显式 send 的原始 final text」出口;receiver 会话的流式/辅助卡片已由既有抑制门全部挡住。
  • envelope 三态(publish / skip / invalid)处理完备:invalid 逐字透传是正确取舍,避免误伤合法回答;拆包后仍走 neutralizeLarkAtTags。

测试验证(在 PR 合入当前 master 的合并结果上执行,非仅 PR 分支):

  • bun run build 通过(exit 0)
  • VC 相关 6 个测试文件 272/272 通过
  • 反向变异:移除发送端拆包赋值后,新增回归用例变红,确认该修复承重

非阻断 follow-up 建议(不影响合入):

  1. 模型显式 botmux send 路径无 envelope 检测,且自 send 后 final_output 被抑制、兜底不触发。主防线已覆盖该出口,且人工回合本就以 send 为预期答复通道,基率极低。后续可在 send 命令门做「检测到 envelope 即 log + 拒发」,而非静默拆包(静默拆会误伤用户要求解释 JSON 格式的合法场景)。
  2. daemon 侧协议注入与 IM skip 兜底分支目前无带牙断言(仅断言常量字符串内容)。建议补 vcMeetingApplicationContext 在存在 IM origin 时前置该约束的纯函数断言。

@deepcoldy
deepcoldy merged commit bdd4802 into deepcoldy:master Aug 28, 2026
@github-actions

Copy link
Copy Markdown

🚀 Released in v3.18.2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants