Repository navigation
fix(workspace): preserve bookmarked research during incomplete reads - #8226
Conversation
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.1-sol · OpenAI · runtime_reported · reasoning_effort=max
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
动机 / Motivation
打开已停止 Goal 的研究书签、阅读存量分析的用户会遇到这两处错误。原页面把尚未返回的停止历史当成 Goal 不存在,或者同时显示原文读取失败与没有已保存分析。修复后书签能等待完整目录并通过读取重试恢复,失败状态也不再冒充空结果。以上是本次实际复现并核验的变化,不以测试数量代替用户结果。
这次只认可存量研究结果的读取与恢复,不涉及生成分析、恢复 Goal、合并、安装或科学收益认定。原研究交付的安装宿主、跨来源完整恢复与实际采用验收仍开放。这是一个可单独回退的有效增量:停止历史晚到或服务暂时不可读,不再迫使用户重新选择已知的 Goal 和研究入口。
改动思路 / Approach
不修改会保留真实失效书签及相互矛盾的状态;只修空列表分支,仍会遗漏非空活动目录下的历史读取失败。方案复用既有完整读取状态和原文错误状态,不增加持久化字段、独立状态机或第二个 Python 决策 owner。当前 PR 的边界是两个前端读取消费者与相应回归,既有权限、来源隔离和分析执行接口保留原 owner。
DashboardPage 先读取活动目录,再由 loadGoalArchive 读取停止历史并核对来源修订。完整目录成功后,统一判断书签是否确实不存在;加载、错误和来源切换期间保留原请求。分析面板则让现有 AnalysisReadState 承担错误与读取重试,不再追加一个含义相反的空结果动作。重试按钮仍只读,不能将不可读结果转成新分析。
| 已知状态 | 原行为 | 当前 head |
|---|---|---|
| 活动目录为空,停止历史未返回 | 清空有效书签 | 保留请求,等待历史 |
| 停止历史读取失败 | 可能清空书签 | 保留请求和历史重试 |
| 完整目录确认不存在 | 清空无效书签 | 保留该行为 |
| 原文读取失败 | 错误与“没有分析”并存 | 显示既有错误与读取重试 |
这是源码控制流的说明;执行证据来自下述主干/当前 head 的匹配回归与原生只读旅程。
具体改动 / Changes
没有独立公开的已接受书面功能规范;审查依据是可复现缺陷、普通读取任务及既有前端任务/恢复原则,没有把补丁自身的断言升级成上游规范。已读取 frontend-delivery.md 与贡献/设计规则,参照修订为 ac62962255322cd80a5b701a4187c6f47bc17d8c。
关键代码讲解
- DashboardPage 的 Goal URL 协调:保留来源切换与加载栅栏,要求 URL 来源的历史读取达到
ready。删除零行时单独清空的重复分支后,完整空目录与非空目录共用相同的不存在判断。 - loadGoalArchive:未改写其 producer。匹配修订成功、冲突与读取失败仍由既有 owner 产生
ready/error,原来的侧栏重试可恢复进展。补丁消费这个事实,没有新添人工同步标记。 - ResearchAnalysisPanel:只在完整成功的空读取下显示没有保存结果。
loading/readError/originalReadError使用既有错误/重试;有原文结果时的完整问题、理由、引用、未知和成本范围不变。
两个已有 smoke 分别保护路由时序和中英文读取状态。主干基线 ac62962 使用与 head 相同的最终 harness 和 fixture:书签断言得到空 Goal id;面板断言发现不完整读取声称无分析。当前 9a044d4 两项均通过。额外的匹配渲染覆盖 16 个状态,其中 10 个可写或成功空结果状态字节相同,6 个不完整只读状态按预期纠正。
原生只读验证另外检查三个存量包,每包 6 个完整问题、36 条完整理由及引用范围均一致;语言切换、原文引用键盘返回、Back 和冷读取失败后的重试已实际经过页面。来源/包/任务身份没有靠合成数据代替。该验证没有产生写请求或新分析,原有源文件与作业集合不变。私有标识、内容和截图未公开;公开描述只附合成负态的首屏。
对主干的风险 / Risks
最值得反驳的是:新条件可能让真正不存在的书签永久停留,或让读取错误阻断其他合法工作。最终浏览器回归同时覆盖空/非空活动目录、历史错误、读取重试、重新打开、完整目录后的无效 Goal 清理,以及仍可使用的其他 Goal。恢复 owner 仍是已有目录读取和原文读取控件,没有增加权限或执行门。可写分支与成功空结果的匹配渲染也排除了把只读修复扩大为执行行为变化。
早期运行暴露了旧 smoke 的重复文本定位和过早重试等待;最终脚本改为定位当前任务视图并等待本次响应,未删验收断言或放宽产品限制。主干反证使用该终稿 harness,避免把脚本变化误当产品修复。原生服务曾使一次 30 秒页面等待超时,随后在同页读到明确失败状态并完成只读恢复;这不支持延迟或稳定性提升的结论。
PASS:严格 TypeScript 与打包、两项终稿 smoke、匹配基线反证、4 项 direct + 5 项 selected premerge 及精确范围质量回执。CI 按当前配置未查询或等待,保持独立的合并门。现有原生 HTTP 服务的部署 Git 修订未确认,因此不能把当前前端验证称为已安装 App 资格。此次没有新闭集词汇或协议;沿用已有 WorkspaceGoalArchiveLoadState 与读取快照错误字段,保留有界语义扫描的局限。
我的整体评价 / Verdict
这是有效且合比例的读取增量,维护成本主要是两条既有分支的纠正和原有 smoke 的反例,继续抽象成新模块没有当前收益。long_horizon 判为 preserved:完整证据、来源身份和既有作业保留,重复进入和恢复不会新增执行或费用;不据此宣称科学或长程效果已提高。user_experience 判为 improved:已知书签恢复为无需补充信息的直接入口,错误与空结果得到区分。
已检查默认、展开与恢复页面及 390px 负态;原问题、完整理由、引用和未知仍可到达,公开截图保留了实际错误状态。并发辅助服务不可用时的窄屏警告堆叠仍占较多阅读区域,这是已观察的既有局限,不作为完整窄屏阅读验收。安装 WebView、Lark 以及全部辅助服务恢复后的页面不在本次验证范围。
本结论针对 8226@9a044d41021c6ccffbe0f9f6b083a378e8dc73a4 的完整四文件范围。作者复核未发现阻塞问题;发表为 COMMENTED,不替代独立维护者评审、CI 或合并授权。
English verdict: APPROVE the bounded reader fix; independent review and merge authorization remain separate.
Goal And Delivered Outcome
A bookmarked Research view for a stopped Goal returned to the manager home before stopped history arrived. The empty active projection was treated as proof that the Goal did not exist. Separately, a failed saved-original lookup could display both a read error and “This source has no saved analysis yet.”
This change preserves the requested Goal while source coverage is incomplete, including archive failure and retry. Only a completed source read can clear a genuinely absent Goal. Failed or pending saved-original reads retain the existing read error/retry without asserting absence.
main, verified atac62962255322cd80a5b701a4187c6f47bc17d8c.Author Declaration
Written by OpenAI Codex (GPT-6 family),
model_agent, using theloopx-agentGit/GitHub identity.Implemented against
No separate written feature specification; the reproduced defects and invariants below are the basis. Existing task-first and failure/recovery guidance: frontend delivery.
dashboard-page.tsxexisting archive-read phase and route fencegoal-research-analysis.tsxexisting read stateSelf-check: read the owning source, loading/merge behavior, repository instructions and final diff; ran the checks below. Existing typed owners are reused. The duplicate zero-row navigation branch is removed; no new schema, permission, provider or Python decision owner is introduced.
Scope And Continuation
Complete within this four-file reader fix. Existing regression scripts are extended; their stale broad-text selector and revision-response wait are corrected so they observe the visible task view and the current retry. Successful empty reads and existing complete-source cleanup retain their behavior.
The broader research delivery remains open for installed-host and adoption acceptance. This proposal is independently reversible and does not activate a stopped Goal, install a build, merge changes or launch a model/solver run.
Validation
9a044d41021c6ccffbe0f9f6b083a378e8dc73a4.finished.synthetic,public_fixture,authorized_private_read_only.staticpassednpm run build --prefix apps/presentation/dashboard: strict TypeScript, dashboard and verified packaged Chat bundle. Existing chunk-size warning retained.regression_paritypassednpm run smoke:workspace-progressive --prefix apps/presentation/dashboard: immutable main baseac62962, built with the exact final regression harness, fails the stopped-only bookmark assertion. Current head passes all 19 groups, including delayed/failed archive, retry, reload, real absence, desktop/390px and zero mutations. The before screenshot remains the earlier9d276f6capture; the affected baseline readers are identical.integrationpassednpm run smoke:research-analysis-read --prefix apps/presentation/dashboard: bilingual panel states; language/key/scope mismatch and abort controls; saved-original fallback and citation through the real disposable LoopX HTTP/artifact owner, with unchanged source and no writes.regression_paritypassedac62962at the incomplete-read absence assertion. A matched 16-state Chinese/English rendering comparison retains byte-identical markup for 10 legal writable/successful-empty states and corrects the 6 incomplete read-only states.real_backendpassedreal_entrypointpassedstaticpassedloopx canary premerge --from-git-diff --git-diff-base origin/main: 4 direct and 5 selected checks passed, including bilingual RFC, semantic vocabulary and public-boundary checks. Exact-scope change-quality receipt is valid.manualnot_runCoverage: the browser regression exercises the shipped router with controlled partial/error responses. The native read-only journey qualifies real stored content and recovery without fresh analysis. Unrelated full Python suites and provider promotion/performance tests were not selected for these TSX/MJS consumer changes. No causal benefit, latency improvement or complete-cost claim is made.
Frontend / Visual Evidence
changed; no CSS/layout changes.syntheticonly in attachments. These are actual packaged Chat first viewports, with deliberately unavailable auxiliary APIs to expose the failure boundary.9d276f6discarded the valid stopped-Goal bookmark while its archive request was pending.9a044d4preserves the same Goal and Research view after archive failure and retry; unavailable research APIs remain visible with their existing recovery controls.Type of Change
LoopX Area
Technical Direction
Operator surface and IM integration; ordinary reproduced reader repair. Shared-authority RFC fixture impact: N/A, no authority/provider migration or promotion is claimed.
Boundary Checklist