Repository navigation
Show original conversation read failures without setup detours - #7608
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>
There was a problem hiding this comment.
Reviewer: model_agent; GPT-6; OpenAI; self_reported
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
未发现阻断问题。评审对象为 b73821a9a8021f5a2d0d67e5d7af936972034988;这是作者自评,不是独立他人批准。宿主执行归因不可用,因此只声明已知模型系列。
动机 / Motivation
面向重新打开原飞书会话的用户。原连接或历史正文不可读时,旧页面会显示空工作区欢迎语;连接不可读时还提示安装运行环境。新页面显示原会话的读取状态,并保留原有重试。草稿保留,发送继续禁用;临时源或正文恢复后仍读取同一会话,明确解绑不会被恢复动作重新授权。范围限于原会话读取状态的展示,不改变连接授权、Session、发送和模型执行。
不改动会继续让用户把读取失败当成没有历史,甚至去做无关的环境安装。这个修复完成的是已复现的显示缺陷,不能据此宣布整个会话同步或原生撤权验收完成。
改动思路 / Approach
复用既有绑定读回、历史读取阶段和空状态组件;局部派生值只决定显示,不建立新的授权或重试状态。当前 PR 只修原会话读取失败及加载时的误导显示,并在既有打包回归中覆盖恢复;不扩展数据源或执行路径。原会话入口先由现有 Core 验证绑定,再由读钩子提供 Session、错误与历史阶段;页面消费这些事实,不从提示文案推断授权,也不维护另一份可用性状态。保留原有重试和输入拦截,比增加新的恢复控制器更直接。
| 状态 | 实际结果 |
|---|---|
| 源或正文暂时不可读 | 显示读取失败,保留草稿并阻止发送 |
| 临时读取恢复 | 回到同一原会话,正文不重复 |
| Core 已明确解绑 | 源恢复和重试仍不能重新授权,不借用其他会话 |
具体改动 / Changes
规范依据是 docs/development/frontend-delivery.md,固定版本 0d4bf99a4aa6080f2774f3c4477fb4adc1b5ac46(原文)。task-first-3 已落实为真实绑定、六份长答复及读取失败/恢复反例;task-first-4 已落实为打包界面、真实 HTTP/Core/SQLite、窄屏、英文和独立状态读回。没有为匹配实现而重写规范。
关键代码讲解
- PersonalWorkspacePage.originalSourceUnresolved 只派生原来源是否尚无 Session,供显示使用,不是新的授权字段。
- ChannelTimeline 的 emptyState 同时读取来源和既有 history phase,区分正在读取、不可读和真正可显示的结果。运行环境提示仅在来源已解析后参与显示,避免以来源失败诊断执行器缺失。
- verifyBoundReadRecovery 复用现有绑定夹具。先等待 HTTP 服务完成双来源启动,再验证正文 503、源身份失联恢复、真实解绑和重开。网络故障只替换一次快照读取;授权规则由实际 Core 执行。最后逐项核对 Session 数、原消息、原线程和 native request 数,浏览器写请求为零。
其余四个文件是合成界面的前后及恢复截图;Chat 生成包没有提交。全 PR 为 130 行新增、2 行删除,主要增量是跨真实读边界的回归,未增加生产 IO、状态存储、CLI 或迁移。
对主干的风险 / Risks
最有力的反例是「来源验证成功但正文读取失败」。第一版 623d1c955fbc550921a1770cbc0f6e005ab716d5 在此仍显示空工作区,已由实际打包路径复现;当前版本使用已有历史阶段修复,完整回归通过。旧基线也能用同一绑定夹具触发原始空状态断言失败。这些失败保留,不把后续绿色结果当成对旧问题的推测解释。
PASS:Chat 类型检查和构建、完整 conversation-return 浏览器回归,以及 standard premerge 的 4 个 direct、11 个 selected 自动检查。CI 策略为 wait_for_ci=false,未查询或轮询远端 CI。premerge 原报告仍列出 4 个二进制图像人工检查项;已逐图查看像素、确认合成数据来源,并核验 PNG 不含文本或 EXIF 元数据。文字扫描通过;不能用文字扫描替代这些图像检查。
该改动没有新协议、持久化状态、权限决策或 default-off 功能,复用现有类型与组件。尚未进行已安装原生 WebView、真实账号撤权或付费模型测试,不能外推这些范围。合并后的安装仍需既有部署条件,当前评审不授予新的生产访问权。
我的整体评价 / Verdict
long_horizon 为 preserved:反复读取和重开保留原 Session、消息与草稿,未执行新的工作。user_experience 为 improved:错误任务指引消失,原连接重试成为明确的下一步,不增加确认轮次。已查看失联前后完整首屏、六份长答复恢复后的正文和底部,以及窄屏失败状态;主提示与真实读取状态一致,重试可见,错误安装引导消失。未验证已安装原生 WebView 和真实飞书账号的撤权操作;本次结果限定为打包浏览器与隔离运行时。
机制与问题规模相称,复用现有 owner,兼容格式和后台执行路径均未改变。b73821a9a8021f5a2d0d67e5d7af936972034988 的源码、完整打包反例与恢复结果支持 APPROVE;合并还必须通过当前 head 的 readiness 和既有授权。作者自评不等于他人批准,也不等于安装完成。
English verdict: APPROVE — b73821a9a8021f5a2d0d67e5d7af936972034988 corrects original-conversation read-state presentation; packaged real HTTP/Core recovery and negative tests pass. Native installed revocation remains outside this qualification.
Reopening a disconnected original conversation showed an empty-workspace welcome and an execution-runtime installation prompt. The page now uses the existing bound-source readback to show loading or unavailable state and offer the original connection retry.
The existing packaged conversation-return smoke now exercises the real HTTP/Core binding owner: transcript HTTP read failure with a valid source, temporary source loss and recovery, explicit revocation, retry/reopen, retained drafts, isolation from other conversations, English and narrow layout, with unchanged Sessions/messages/model requests and no browser writes. The old 451-row history and asynchronous-return recovery checks remain in the default run.
Validation: Chat build/typecheck and the complete packaged conversation-return smoke pass. The new regression fails on the previous UI. Changed text passes the native public-boundary scanner; the four synthetic screenshots were inspected visually. Standard premerge ran 4 direct and 11 selected checks without failures; it retains 4 binary-image manual-review flags, addressed by the visual review. This qualifies the packaged browser, not an installed native WebView or live Lark account revocation.
Visual evidence
Built source at this head; disposable SQLite/Chat/Core runtime, synthetic provider/model identity, no personal data. Reopening keeps the original failure visible and removes unrelated installation work.
Before · Narrow · Populated recovery