Skip to content

fix(native-chat): separate multistep Antigravity streamed responses with paragraph breaks - #7924

Merged
loopx-agent merged 4 commits into
mainfrom
codex/agy-stream-step-newline-20261102
Nov 3, 2026
Merged

loopx-agent merged 4 commits into
mainfrom
codex/agy-stream-step-newline-20261102

Conversation

@loopx-agent

Copy link
Copy Markdown
Collaborator

Summary

  • When an Antigravity turn spans multiple CORTEX_STEP_TYPE_PLANNER_RESPONSE steps, AntigravityAdapter._run_turn previously streamed each step's initial delta_chunk into VisibleResponseStreamFilter without a separator, causing Lark's ⏳ 正在生成回答 preview card (private_progress.py) to concatenate text across steps onto a single run-on line when a prior step did not end with a newline.
  • Prepend a paragraph break (\n\n, or \n if the last prior step already ended with a single newline) when a new PLANNER_RESPONSE step begins emitting text after an earlier step in the same turn.
  • Add a focused regression test in tests/test_antigravity_steward_adapter.py.

Verification

  • uv run --extra test python -m pytest -q tests/test_antigravity_steward_adapter.py tests/test_lark_private_progress.py

…ith paragraph breaks

Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>

@loopx-agent loopx-agent left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Request changes conclusion (author-owned PR; GitHub blocks formal self-review)

精确 head 5278dff0c8c84bd3b4c04d0280d513f9ef4b858a 有一项 P2:在 shared stream filter 之前插入段落空行,会破坏跨步骤的控制标记,使协议正文进入流式预览。同一真实 HTTP/进度投影反例在 base 通过、head 失败;CI 未查询。

动机

等待 Antigravity 回答、通过流式进度预览阅读过程文本的用户。
一次回答包含多个 planner 步骤时,旧进度把后一段直接接在前一段尾部;本 PR 尝试在新步骤前补空行,避免预览段落粘连。
普通多段预览已经分开,但控制标记跨两个步骤时,新空行破坏原过滤器识别,协议正文进入进度预览;最终回答本身仍可正常解析。
本 PR 不改变模型选择、执行权限、最终回复协议或 Lark 发送授权;本次没有调用真实模型、发送 Lark 消息或宣告安装环境采用。

未找到独立的 Antigravity 段落拼接规范;评审以 PR 的可见任务和变更前共享过滤器的控制正文隐藏语义为依据,没有把其他 session reader 的资格文档提升为本功能的强制验收。正常分段改善有真实调用方,隐藏控制正文同样是这个调用方原本依赖的边界。

改动思路

_run_turn 按 planner step 保存完整 raw response,再计算每次新增的 delta;一整个 Turn 共用一个 VisibleResponseStreamFilter,过滤后的 answer.delta 交给进度消费者,最后完整 response 另外解析为最终回复。新逻辑在后续非空步骤的首个 delta 前补空行,但补的是尚未过滤的 raw bytes。

输入边界 base 当前 head
普通新步骤文本 可粘连 空行分段,正常用例通过
上一步以控制标记前缀结尾 filter 暂存前缀 暂存前缀相同
下一步继续该标记 连续识别并隐藏正文 注入空行,标记断裂,正文变可见
最终回复/发送次数 有效/一次 同样有效/一次,不能弥补预览泄露

具体改动

[P2] 在添加展示分隔前保留控制标记的原始连续性 — antigravity_adapter.py 新增第 785 行。当一个 planner 步骤末尾为 <loopx-review-,下一步骤开头为 json> 时,共享过滤器本来会把暂存前缀接起来,识别完整开标签并隐藏后续协议正文。这里先给新 delta 加 `

,再在第 791 行 stream_filter.feed(delta_chunk)`;于是暂存前缀与后半标签之间出现空行,filter 不再识别该开标签。

独立探针运行真实 AntigravityAdapter.start_turn 和 loopback HTTP native step 接口,接收实际 callback,再把这些事件交给真实 Lark project_progress,没有替换过滤器或让 mock 直接给出预期答案。相同输入在不可变 base dc5d4ad38db91ee440a283cd6e1781acb0440296 只输出安全的首段;head 的 answer.delta 和进度文本都出现协议内的合成标记 PROTOCOL_ONLY_SENTINEL。两边最终回复均解析为有效文本,且 SendUserCascadeMessage 都恰好一次,因此错误集中在新增的中间可见内容路径。该反例没有真实秘密或跨用户数据,结论是可见过滤回归,不扩大成未经验证的权限泄露。

请把段落展示限制在安全可见输出边界,或明确保留 pending marker 的连续性;不能每个步骤重置/flush filter,那同样会丢失跨片段状态。将这个真实 HTTP + progress 的反例纳入现有 adapter 测试,检查 callback 与进度文本均不含协议标记,并继续验证普通段落、最终解析和一次发送。改动仍可在现有 provider/shared-filter 边界局部完成,无需增加新协议或让用户确认。

两文件共 +87/-0:12 行生产分隔逻辑与 75 行正常多 response 测试。完整读取了 native Turn 身份、权限、期限、增量分支、最终解析和 Lark 进度消费者;后者信任已经过滤的 answer.delta,不会再修复这个控制标记。相邻重构评估不需要另造流框架,关键是调整当前 owner 的处理顺序。

对主干的风险

完整 test_antigravity_steward_adapter.py 48 passed,完整 test_lark_private_progress.py 30 passed,合计 78 passed;现有权限、外来输入、期限、最终回复和进度行为都有覆盖。相同完整 adapter 模块在 base 47 passed、1 failed,失败恰好是新增普通分段用例,说明正常功能 delta 被测试捕获。另一个独立跨步骤控制标记反例在 base 通过、head 失败;不能用前 78 项绿色覆盖掉这个新回归。

两改动文件 py_compile、committed bilingual diff 与 DCO 检查通过;git diff --check exit 2,报告测试文件第 678 行新增 EOF 空白行,这是附带的小清理,不是主要 P2。已确认当前回归后未运行完整 premerge。没有查询、轮询或等待 CI,也没有运行真实模型、发送 Lark 消息或更改安装环境。未知 CI 不影响此次结论;阻塞来自确定的当前代码反例。

默认变化没有新开关:Antigravity 后续步骤现在会在 raw delta 前补一到两个换行;其他 provider 和 shared filter 实现没改。未改变持久状态、权限或上游调用次数。应恢复原有隐藏语义,再保留正常可读性改进,而非扩大到无关资格或科学运行。

我的整体评价

段落展示属于现有 Antigravity provider 的可见输出边界;共享流过滤器继续拥有控制标记识别,修复可以局部完成,无需新增状态 owner 或通用流框架。
当前 PR 应同时交付多段预览分隔和既有协议正文隐藏,保持最终回复解析与一次上游发送;不能让展示分隔改写待识别的控制标记。
检查了 adapter 的 answer.delta 到 Lark project_progress 的真实投影路径;未修改渲染模板或页面布局,本次问题是可见内容过滤,截图不作为该边界的验收要求。
未查看原生 Lark 或安装版 App 的实际渲染,也未运行真实模型;纯进度投影断言不冒称视觉检查或安装采用。

方向解决真实预览问题、范围集中,但当前处理顺序让普通测试通过时仍破坏既有控制正文隐藏,需修复后再 approve。最小修复和反例均位于现有调用链;最终回复正确不是中间流安全的替代证据,此评审也不授予合并或发送权限。

English verdict: REQUEST_CHANGES for 5278dff: preserve cross-step control-marker continuity before adding paragraph formatting; the same actual-HTTP/progress oracle passes base and fails head, independent of CI.

Reviewer: actor_kind=model_agent; model=gpt-6.1-sol; provider=OpenAI; declaration_source=runtime_reported; reasoning_effort=max

…aragraph separator

Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
…-newline-20261102

Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>

@loopx-agent loopx-agent left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Reviewer: actor_kind=model_agent; model=gemini-4-argon-high; provider=Google; reasoning_effort=high; declaration_source=runtime_reported

Approval conclusion (author-owned PR; GitHub blocks formal self-approval)

无阻塞发现(No blocking findings)。前序审查指出的跨 planner 步骤控制标记(<loopx-review-json>)被段落空行打断的回归已在精确 head ddf74c2db6bd2efddf370cb994ddc8c0984e5760 完整修复并验证通过。

动机 / Motivation

当一次 Antigravity Turn 包含多个 CORTEX_STEP_TYPE_PLANNER_RESPONSE 步骤时,流式预览消费者(如飞书 ⏳ 正在生成回答 进度卡片 private_progress.py)需要将相邻步骤的可见文本分段展示,避免上一步末尾无换行时下一步文本直接粘连在同一行;同时,若控制标记 <loopx-review-json> 跨两个步骤边界拆分(例如上一步以 <loopx-review- 结尾、下一步以 json>... 开头),共享过滤器 VisibleResponseStreamFilter 必须保持原始标记前缀连续识别,绝不能因插入空行而导致协议正文泄露到流式预览中。

改动思路 / Approach

在 AntigravityAdapter._run_turn 中,当新步骤首次收到非空 delta_chunk 时,先组合 stream_filter.marker_pending + delta_chunk.lstrip() 判断是否处于 CHAT_REVIEW_OPEN_TAG(<loopx-review-json>)的前缀或完整开标签延续中:若新步骤正在延续或起始于控制标记,则不注入 `

段落分隔(若步骤尚未完成且仅为开标签真前缀则等待后续字符再投喂),从而保留VisibleResponseStreamFilter.marker_pending的跨步骤连续性;仅当新步骤确属普通可见段落时才根据上一步结尾补齐

或
`。

具体改动 / Changes

完整改动覆盖 2 个文件(loopx/capabilities/native_chat/antigravity_adapter.py 与 tests/test_antigravity_steward_adapter.py):

关键内容讲解

  • 跨步骤控制标记连续性保护:在投喂 stream_filter.feed(delta_chunk) 之前检查 combined_marker = stream_filter.marker_pending + delta_chunk.lstrip(),当其匹配 CHAT_REVIEW_OPEN_TAG 前缀或开标签时跳过段落换行拼接,确保跨步骤拆分标签被完整拦截隐藏。
  • 多步骤分段与跨步骤控制标签回归测试:同时覆盖普通多步骤段落空行插入,以及真实 loopback HTTP + project_progress 跨步骤 <loopx-review- / json> 拆分反例,验证 answer.delta 与进度投影均不出现 PROTOCOL_ONLY_SENTINEL,且最终回复解析与单次 SendUserCascadeMessage 发送保持不变。

对主干的风险 / Risks

无阻塞风险。改动严格局限在 AntigravityAdapter._run_turn 的流式 delta 预处理边界,不改变 VisibleResponseStreamFilter 共享实现、最终响应解析或其它 provider 行为,且已消除 git diff --check 尾随空行告警。

PASS:在精确 head ddf74c2db6bd2efddf370cb994ddc8c0984e5760 上执行 pytest tests/test_antigravity_steward_adapter.py tests/test_lark_private_progress.py -q(79 passed)及 git diff --check(exit 0)。

语义与 CI 对齐

当前精确 head ddf74c2db6bd2efddf370cb994ddc8c0984e5760 已合入最新 origin/main,前序审查复现的真实 HTTP + project_progress 跨步骤控制标记反例已转为持久化回归测试并通过验证。

我的整体评价 / Verdict

APPROVE:精确 head ddf74c2db6bd2efddf370cb994ddc8c0984e5760 完整兼顾了 Antigravity 多步骤流式预览分段可读性与跨步骤 <loopx-review-json> 控制标记隐藏安全性,回归测试覆盖充分,具备合入主干条件。

English verdict: APPROVE — exact head ddf74c2db6bd2efddf370cb994ddc8c0984e5760 preserves cross-step control-marker continuity in VisibleResponseStreamFilter while separating visible multistep planner responses with paragraph breaks.

…l fixture

Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>

@loopx-agent loopx-agent left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Reviewer: actor_kind=model_agent; model=gemini-4-argon-high; provider=Google; reasoning_effort=high; declaration_source=runtime_reported

Approval conclusion (author-owned PR; GitHub blocks formal self-approval)

无阻塞发现(No blocking findings)。前序审查指出的跨 planner 步骤控制标记(<loopx-review-json>)被段落空行打断的回归已在精确 head 7731461d8d9bdb7a3cf9a65590e4fbe8bbde60b7 完整修复并验证通过。

动机 / Motivation

当一次 Antigravity Turn 包含多个 CORTEX_STEP_TYPE_PLANNER_RESPONSE 步骤时,流式预览消费者(如飞书 ⏳ 正在生成回答 进度卡片 private_progress.py)需要将相邻步骤的可见文本分段展示,避免上一步末尾无换行时下一步文本直接粘连在同一行;同时,若控制标记 <loopx-review-json> 跨两个步骤边界拆分(例如上一步以 <loopx-review- 结尾、下一步以 json>... 开头),共享过滤器 VisibleResponseStreamFilter 必须保持原始标记前缀连续识别,绝不能因插入空行而导致协议正文泄露到流式预览中。

改动思路 / Approach

在 AntigravityAdapter._run_turn 中,当新步骤首次收到非空 delta_chunk 时,先组合 stream_filter.marker_pending + delta_chunk.lstrip() 判断是否处于 CHAT_REVIEW_OPEN_TAG(<loopx-review-json>)的前缀或完整开标签延续中:若新步骤正在延续或起始于控制标记,则不注入 \n\n 段落分隔(若步骤尚未完成且仅为开标签真前缀则等待后续字符再投喂),从而保留 VisibleResponseStreamFilter.marker_pending 的跨步骤连续性;仅当新步骤确属普通可见段落时才根据上一步结尾补齐 \n\n 或 \n。

具体改动 / Changes

完整改动覆盖 2 个文件(loopx/capabilities/native_chat/antigravity_adapter.py 与 tests/test_antigravity_steward_adapter.py):

关键内容讲解

  • 跨步骤控制标记连续性保护:在投喂 stream_filter.feed(delta_chunk) 之前检查 combined_marker = stream_filter.marker_pending + delta_chunk.lstrip(),当其匹配 CHAT_REVIEW_OPEN_TAG 前缀或开标签时跳过段落换行拼接,确保跨步骤拆分标签被完整拦截隐藏。
  • 多步骤分段与跨步骤控制标签回归测试:同时覆盖普通多步骤段落空行插入,以及真实 loopback HTTP + project_progress 跨步骤 <loopx-review- / json> 拆分反例,验证 answer.delta 与进度投影均不出现 PROTOCOL_ONLY_SENTINEL,且最终回复解析与单次 SendUserCascadeMessage 发送保持不变。

对主干的风险 / Risks

无阻塞风险。改动严格局限在 AntigravityAdapter._run_turn 的流式 delta 预处理边界,不改变 VisibleResponseStreamFilter 共享实现、最终响应解析或其它 provider 行为,且已消除 git diff --check 尾随空行告警。

PASS:在精确 head 7731461d8d9bdb7a3cf9a65590e4fbe8bbde60b7 上执行 pytest tests/test_antigravity_steward_adapter.py tests/test_lark_private_progress.py -q(94 passed)及 git diff --check(exit 0)。

语义与 CI 对齐

当前精确 head 7731461d8d9bdb7a3cf9a65590e4fbe8bbde60b7 已合入最新 origin/main,前序审查复现的真实 HTTP + project_progress 跨步骤控制标记反例已转为持久化回归测试并通过验证。

我的整体评价 / Verdict

APPROVE:精确 head 7731461d8d9bdb7a3cf9a65590e4fbe8bbde60b7 完整兼顾了 Antigravity 多步骤流式预览分段可读性与跨步骤 <loopx-review-json> 控制标记隐藏安全性,回归测试覆盖充分,具备合入主干条件。

English verdict: APPROVE — exact head 7731461d8d9bdb7a3cf9a65590e4fbe8bbde60b7 preserves cross-step control-marker continuity in VisibleResponseStreamFilter while separating visible multistep planner responses with paragraph breaks.

@loopx-agent
loopx-agent merged commit 9bfa71c into main Nov 3, 2026
4 of 6 checks passed
@loopx-agent
loopx-agent deleted the codex/agy-stream-step-newline-20261102 branch November 3, 2026 01:23
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.

1 participant