Repository navigation
fix(chat): preserve quoted review markers in answers - #7957
Conversation
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent; GPT-6 (Codex); OpenAI; self_reported
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
结论:APPROVE,未发现当前 head 的阻塞问题。评审对象为 8a1dba15b51d5d745f78fc7b9858c74816a7b53c;这是模型作者侧精确提交复核,不冒充 GitHub 正式自批准或独立人工审查。宿主未提供可读取的执行模型记录,因此按已知产品家族自述身份。
动机 / Motivation
现有 App 和飞书管家的用户会在技术解释中遇到这个问题。 答复引用反引号中的控制标签后继续给出结论;旧版提前截断,新版保留引用和后续完整正文。 同一份模型输出经真实适配器和消息进度投影后保留完整可见解释,真正的操作元数据继续隐藏并校验。 本提交不重放业务、不改写历史消息,也不宣称旧截断答复已经自动补回。
这是一个有界但实用的交付增量。历史已存截断结果的同执行核验、自动校正和原受众补回仍需原结果恢复 owner 独立完成。 不处理这个公共解析缺陷,会让已经生成的结论继续丢失,用户再次提问还可能触发重复业务;因此不能把截断误报成模型没有答案,也不能只修正一份 provider 的显示结果。
改动思路 / Approach
公共响应语法由现有 chat.py 统一拥有;仅改最终切片会留下流式截断,仅改 provider 会让其他执行器保留同一错误。 本 PR 同时修复共享流式过滤和最终正文解析,保留原类型归一化、脱敏和动作执行 owner;历史修复保持独立。
我比较了不修改、删除第一次 split、只修改 provider 和复用公共 owner 四条路径。直接删 split 会把之前真正隐藏的信封带回正文;provider 局部补丁不能同时覆盖 Codex 和 ACP。当前方案只在原有文本协议边界维护短暂的分隔符状态,不增加 schema、CLI、权限、持久缓存或消息消费者。JSON 正文中的标签和反引号属于数据,不再被扫描为新的边界。
| 实际适配器场景(合成上游) | 主干 | 当前 head |
|---|---|---|
| 引用标签、代码示例、旧式 message 字符串、早先隐藏信封 | 4 项违反正文/权限断言 | 4 项通过 |
| 普通答复、合法待办预览、截断信封、未闭代码中的元数据 | 4 项通过 | 4 项结果逐字相同 |
表格来自相同输入经过真实 loopback HTTP、适配器及消息进度投影的比较,不是实际模型执行、生产性能或安装采用证据。没有用新 helper 的输出定义期望值;期望为完整可见解释、原明确待办预览和隐藏元数据不得进入正文。
具体改动 / Changes
整个 PR 是两个已有文件:生产代码 77 行增加、17 行删除,测试 55 行增加。没有新增独立模块或协议版本。依据是 docs/architecture/rfcs/app-conversation-and-async-inbox-v0.zh-CN.md,固定版本 e263c3a18512316223eff895def6e8dbd46a2a6d,本次没有改写这份依据。
visible-markdown-once:implemented。空 message 复用完整安全前文,引用标签后的结论保持可读。typed-metadata-and-redaction:implemented。既有非空 message、脱敏和 typed 操作归一化继续由原函数负责;合法待办预览比较保持完全一致。malformed-envelope-no-actions:implemented。残缺信封、早先隐藏信封和未闭代码的可疑元数据不恢复操作权限。historical-recovery-boundary:out_of_scope。既有原结果恢复 owner 与历史 journal 未修改,不以语法修复宣称原失败或补回已完成。
关键代码讲解
_review_openings识别反引号和转义上下文,并跳过已解码 JSON。元数据里的反引号不能关闭正文示例;只有完整示例信封及后续代码分隔符都到达,才释放该示例文本。VisibleResponseStreamFilter.feed保留跨 chunk 的标签前缀、转义和分隔符。不确定的信封留在已有 pending 区,finish也不会把它直接刷入消息进度。parse_agent_response用已识别边界选择实际信封及安全前文。旧式 JSON message 中的字面标签不再成为外层信封;最终仍调用原normalize_agent_response,没有新增动作提交路径。
CodexChatAgentSession.send、ACP start_turn、Antigravity start_turn 和既有结果读回都会加载同一 owner。已合并的 #7924 处理跨 planner 步骤的段落及标签拼接,本 PR 保留该行为,修复的是其下游公共正文识别,不能拿两者互相替代。
对主干的风险 / Risks
主要风险是共享词法判断影响所有执行器,尤其是未闭代码和跨块分隔符。首个 PR head 虽通过 967 项相关回归,仍在独立反例中把元数据里的反引号当成代码结束而暴露隐藏字段;这份 FAIL 保留,当前 head 已在责任层修复,并加入对应负例。未将更晚一次绿色结果用于掩盖该反例,也未放宽权限、隐藏断言或改写旧记录。
PASS:最终精确 head 的 968 项解析/适配器/Chat/飞书回归;其中 48 项解析场景涵盖所有两段切分位置。PASS:标准 premerge 的 6 个直接检查和 2 个选定检查,无失败或 manual hold。PASS:两个变更文件公开边界扫描。汇总宿主状态检查还报告两个既有的独立 canonical-authority 故障,保留该失败,不声称全局 check 通过,也不要求本 PR 修改无关 Goal 状态。
语义与 CI 对齐
本次复用既有 response schema、控制标签及 typed action owner,增加的整数状态只是当前流的词法上下文。普通回复、合法 preview、残缺信封及未闭代码元数据四项 base/head 观察逐字相同;其余四项是明确修复的旧错误。当前受管策略要求本地验收且不等待 CI,本次没有获取、轮询或等待 CI,未推断远端检查成功。合并权限和最终 readiness 仍是独立步骤。
我的整体评价 / Verdict
交付判断为 justified_increment;long_horizon 和 user_experience 均 improved:新技术解释保留完整结果,用户无需增加确认或重新输入业务。公共响应语法由现有 chat.py 统一拥有;仅改最终切片会留下流式截断,仅改 provider 会让其他执行器保留同一错误。 本 PR 同时修复共享流式过滤和最终正文解析,保留原类型归一化、脱敏和动作执行 owner;历史修复保持独立。 兼容性判断 retain,机制规模 proportionate;更大的 Markdown 服务、provider 私有分支或历史迁移都没有进入这份差异。
检查了未改动的 Chat/飞书消费路径:没有组件、布局、披露或响应式规则变化,内容完整性由实际适配器与消息投影验证,因此本次不需要新的布局截图。 新提交的安装态视觉验收及历史补回尚未在评审时完成,不以合成上游冒充安装采用。 它仍是有界的反引号/转义修复,不宣称完整 CommonMark 支持、端到端时延达标或积压清空。正式发布前会再次核对同一远端 head;若 head 或实际回归证据改变,当前结论不能沿用。
English verdict: APPROVE 8a1dba1. Shared response parsing preserves quoted markers and complete prose while keeping actual metadata withheld; 968 tests, eight real-HTTP differential cases and standard premerge pass. Installation and historical result correction remain separate acceptance.
当答复在 Markdown 代码示例中引用
<loopx-review-json>,再通过空message信封复用可见正文时,旧实现会从第一个字面标签截断答复。代码块中的完整示例也可能被误当成操作元数据。这次在现有公共响应解析器中统一识别控制标签:保留反引号示例、转义文本和 JSON 字符串里的字面标签;流式输入跨块时保留必要的分隔符状态。真正的信封仍经原有类型校验,早先的隐藏元数据、残缺元数据和未闭合示例中的可疑信封继续收敛为安全可见正文,不恢复操作权限。没有新增 provider 分支、协议字段、设置或消息消费者。
验证:
8a1dba15b51d5d745f78fc7b9858c74816a7b53c的 968 项解析、真实适配器、Chat、飞书回归通过;标准 premerge 的 6 个直接检查与 2 个选定检查通过。本 PR 修复新答复的公共解析和流式显示。历史已存截断答复的自动校正与原受众补回需要独立的原结果核验和投递闭环,本提交没有重放业务或改写历史记录。
精确提交的完整评审与验收边界已发布;首版未闭代码反例及其修复也保留在同一 PR 的后续提交中。