Repository navigation
fix(chat): preserve complete Antigravity migration history - #7945
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: actor_kind=model_agent; model=gpt-6.1-sol; provider=OpenAI; declaration_source=runtime_reported; reasoning_effort=max.
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
动机 / Motivation
在 Antigravity 管家切换 profile、恢复旧会话或迁移线程的用户。 以前新线程只收到最近 16 条历史,内容还会被 strip,早期限制和原始空白可能丢失;现在首次发送带上同一 Session 的完整可见历史,后续健康接续不重复发送。 真实 Chat/store 到原生 HTTP 的配对验证保留了全部历史、Session 和重试状态,早期内容、空白及引用标记不再丢失。 不扩大工具权限、受众或配置作用域;不把合成 HTTP 证明称为真实模型理解、安装版采用、token 节省或长程净收益。
改动思路 / Approach
完整历史已经由既有 Chat Session owner 提供,缺口位于最后的 Antigravity 编码;复用此 owner 删除截断即可,无需新增存储、reader、配置或权限。 本 PR 交付新原生线程首次输入的完整历史保真,以及健康恢复、缺失原线程和发送失败后的重试语义。 我比较了不改、在既有 owner 内修复和增加新机制三种选择;当前改动沿原生产入口生效,派生输入不成为新的状态或权限。实际失败由原 owner 拒绝并给出恢复;通过发送、读取或回执本身不能证明真实模型采用。这里采用正文说明控制流,未把未渲染的图示当测试证据。
具体改动 / Changes
完整评审 7945@74f2dbee3cc83fc1068d570cf33d34d4fa5b8fcd,merge base 107e9e32e8f3df29f63b94524250f4044cc01a80:4paths +128/-8; one production encoding block, focused native tests and both accepted RFC language files. 先读不可变基线 107e9e32e8f3df29f63b94524250f4044cc01a80 的 docs/architecture/rfcs/manager-runtime-profile-v0.md;本 PR 修改的文字没有被当成自己的验收依据。映射 criterion_id Session consistency、4、9:均为 implemented;原 Session、完整 visible history、profile 与既有绑定/受众限制保持。原 RFC 第6项的既有非 Codex 表述冲突没有被本 PR 改写或当作新门槛。
关键代码讲解
_build_turn_prompt:554:将既有 pending history 全部编码为只含 role/content 的 JSON,去掉最近16条和 strip。保留原始空白及引用标记,只有新线程尚未 primed 且有历史时才加入。_run_turn:621:发送和 priming 的 owner 没变:只有原生 Send 成功后才清空历史。失败保留同一输入供重试,健康接续不重复,原 cascade 缺失时不暗建替代线程。
6个完整归属Python模块197PASS;独立10组相同输入配对为 base6FAIL/4PASS、head10PASS。使用24条原话、早期约束、Unicode、空白及引用 role/frame 标记;真实 Chat/store 迁移和原生 HTTP 证明新线程第一次发送完整数据、第二次不重复。缺失原 cascade 不暗建替代,503发送失败保留历史,成功重试后才清空;其他 Session、错误行和元数据没有进入输入。
成本确实增加:相同24条固定历史的实际 RPC serializer,restricted 首发52877→71932B、trusted54097→73152B;真实 Chat 迁移分别92158→111213B、94704→113759B,均增加19055B。这是完整历史的可见成本,不是 token/CPU/模型收益证明;已验证后续 Turn 不重复发送。
对主干的风险 / Risks
最强反例是:原 cascade 消失或首次 Send 返回503;历史同时包含另一 Session、错误行和引用 role/frame 标记。 已观察:缺失恢复不创建替代 cascade 或发送;503之后历史保留到成功重试,随后清空;另一 Session、错误行和元数据没有进入 prompt。 现有生产消费者是 ChatRuntimeController._get_adapter:888, AntigravityAdapter.init:425, AntigravityAdapter._build_turn_prompt:554, AntigravityAdapter._run_turn:621;本次不新增 capability、provider、配置或独立设置页面,数据和命令继续经过原 owner。Applied deletion: remove last16 slicing, per-message strip and lossy ad-hoc role formatting; encode one existing role/content list as JSON. 历史/身份兼容被保留,没有为了旧回执另开请求解码器或并行规则。
标准 premerge、typecheck、适用 Ruff、diff semantic advisory、public boundary 和适用 RFC bilingual 检查通过,premerge没有阻塞失败或手工 hold。原始 strict mypy 在相同17个配置root、Python3.14.8/mypy1.20.2及uv.lock下仍为786errors/125files;同命令完整身份、顺序、细节和重复次数均比较,完整119338B输出和125个完整因果源码文件相同。原始 maintainability ratchet 仍FAIL,完整393B输出及因果renderer相同;premerge advisory没有被称为原检查通过。没有改阈值、移除断言、过滤诊断或将CQR声明为通过。
CI未查询、轮询或等待,状态保持UNVERIFIED且仅为诊断;未独立核实的历史 CI 叙述没有被称为已修复。改变的不变量已有上面的独立当前证据,因此未知CI不作为批准门槛。最新主干 374c152ba18a062804b2f7e9b72656cdce0a8b4c 的相关调用方变更已读:7941的资格反馈、7934的native idle与7935/7938的context读路径各有自己的边界;本次没有将旧head验证扩张成最新主干集成资格。
我的整体评价 / Verdict
APPROVE,problem_context为goal_achieved,范围限于本次命名的可逆切片。长程工作:早期约束在原生线程迁移中完整可用,后续健康 Turn 不重复发送;失败发送保留原始历史,未丢承诺或新增执行。 用户体验:使用既有会话与配置入口即可迁移,没有新的配置、补录、确认或人工搬运;首次发送的完整历史增加输入大小。 已检查既有 Chat Session/profile 设置与 native adapter 输入路径;本 diff 没有页面、首屏、布局或新配置控件变更。 未验证范围:未验证真实模型采用、安装版可读性或大历史的完整成本;source/RPC 不能证明这些结果。 完整历史已经由既有 Chat Session owner 提供,缺口位于最后的 Antigravity 编码;复用此 owner 删除截断即可,无需新增存储、reader、配置或权限。 本 PR 交付新原生线程首次输入的完整历史保真,以及健康恢复、缺失原线程和发送失败后的重试语义。 语义词汇复用原 owner,无新枚举、分类器、执行义务或默认工具授权。独立证据支持此 head 的正向价值与比例;诊断失败、安装/模型限制、合并就绪和合并授权仍分别保留。
English verdict: APPROVE the exact reviewed head; changed invariants are independently verified, CI remains diagnostic, and merge authority is separate.
Goal And Delivered Outcome
Antigravity 的既有管家迁移会从 Chat store 取得完整可见历史,provider 却只发送最后 16 条,并对正文做
strip()、忽略空白消息。早期约束因此可能在新线程丢失。本修复在首次新线程输入中,以 JSON 保留全部已提供的
role/content、原始空白和顺序;不转发 transport metadata。后续 Turn 与成功的原生 resume 沿用原线程,不重复附加历史。实际迁移场景保留原 Session、完整 store 记录和两轮投递结果。Author Declaration
docs/architecture/rfcs/manager-runtime-profile-v0.md的 Session consistency,revision107e9e32e8f3df29f63b94524250f4044cc01a80。AntigravityAdapter._build_turn_prompt;早于 16 条窗口的约束、Unicode、空白及角色原样可读Scope And Continuation
复用原 Chat/runtime/store 与 native provider,不增加配置、Core 决策、跨 Session 读取或新的迁移触发条件。调用方仍只需沿既有 Chat 入口继续;在已有迁移边界自动使用完整历史。
这是可独立回滚的历史保真修复。#7937 继续处理 Core 输入布局与渐进读取,#7938 处理共享 import boundary;更广的跨执行器采用保持原有归属。当前提案进入正常评审,合并、实际 App 安装与真实模型验证分别保留。
Validation
74f2dbee3cc83fc1068d570cf33d34d4fa5b8fcd._build_turn_prompt,相同 6 场景复现 4 个历史丢失失败、2 个原生 resume 兼容通过;最终 6 场景全部通过。覆盖原文/顺序/空白、metadata 排除和后续不重放render_canonical_todo_sections;selector 的 inherited advisory 不作豁免完整内容有成本:相同 20 条历史的 Chat 迁移,按生产 serializer 重编码的首次 RPC body 在 restricted 为 93,927 → 103,616 bytes,trusted-owner 为 96,473 → 106,162 bytes,均增加 9,689 bytes;早期约束得以保留。两轮 Send 数量及原生 resume 不变。模型 token、费用、物理 IO 和净收益未测。
CQR
cqr_e90a0da79ef61b017187已记录 FAIL,verify=invalid_receipt。一次允许的安全修复保留了原二字段边界,避免将 transport metadata 一并发送;最终全部差分已复核和重测。premerge 在记录前的聚合 gate 为quality_receipt_missing,以上原始失败及必检缺口继续保持,当前不能合并。Frontend / Visual Evidence
UI impact: none。改变既有迁移的模型输入,未改页面、设置或第一视口;截图不适用。隔离打包验证与实际安装采用分开报告。
Boundary Checklist