Repository navigation
fix(research): keep saved results visible and keyboard focus stable - #8072
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.
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
Reviewer: model_agent; gpt-6.1-sol; OpenAI; runtime_reported; reasoning_effort=max.
动机
在 Goal 的研究页阅读已保存 benchmark 结果的使用者。 有保存测量、没有 Explore 记录时,原页面先展示启用研究的空状态卡;本次把缺历程和 0 / 0 留在结果上方,已保存指标随即进入阅读。
同一 Graph 原始捕获经真实 HTTP 与隔离 SQLite 读取,base 有一张空状态卡,当前 head 为零张,六项判读和原生数值保留。 不执行新的研究或模型,不改原数据、科学结论、权限或研究模式配置。 本次判断限定在 ec032acb2af5c604398db3790ce7769772743cb8 的完整四文件差异,不把捕获数据的展示当作科学收益或实际采用的独立认证。
改动思路
保留现有研究 reader 与 ContextHelp,只从已作用域隔离的数据派生空状态;两个来源继续独立,不引入第二个状态或配置 owner。 本 PR 只调整已保存结果前的空状态和成果增量摘要,完整数值、引用、失败重试及真正空 Goal 的研究模式入口继续使用原路径。
不改动会继续让已有结果看起来需要先做设置;增加一个空状态组件、开关或保存标记又会重复已有数据。当前分支只合并既有空谓词及消息,并复用现有 disclosure,适合这个有界问题。打开页面仍为零次额外确认,读取、展开和返回没有启动研究。简单的前后比较用文字即可说明,无需另外引入图形。
具体改动
先读 accepted spec_ref: docs/development/design.md 及 docs/development/frontend-delivery.md,spec_revision: 7f550aef58a80067dd85df0a276b2f6f98be742c,再读完整 base→head diff(4 文件,+26/-5,98 行)。三个适用 criterion_id 均已核对:Research Workspace 保持内容优先、独立来源与只读;Populated Page Review 覆盖真实长内容、未知、默认和展开窄屏;Task-first delivery 经打包页面、真实 HTTP/SQLite 和失败恢复验收,安装与模型边界另列。
- GoalResearchHistory 从现有 busy/error/total 与作用域正确的 pack 派生显示。只有完整空历程且有保存结果才移除设置卡;真正空 Goal 仍可聚焦既有研究模式控制,失败仍有 Retry。
- RetainedImprovement 仅把摘要缩成增量和单位。展开仍读到基线
0.8172464473565724 / agent-2、保留值0.849544264387785 / agent-16、保留依据与最后候选差值;没有在前端重新推断增益或采用。 - 原 browser scenario 增加无分析空状态与有保存测量的反例,guide 解释两种来源的边界;没有增加 fixture、backend、RPC、schema 或依赖。
对主干的风险
最值得反证的是旧 Goal 的 pack 或失败来源把新 Goal 的必要入口藏掉。已检查原 hook 在 Goal/语言/来源改变时同步隐藏旧 pack,并完成现有空状态、读取失败/重试、来源切换和引用不可用→可用场景。两次隔离 HTTP 回读均为 source_unchanged=true、mutation_attempts=0。
| 独立本地检查 | 结果与限制 |
|---|---|
| 完整 Dashboard + Chat build / TypeScript | PASS |
| quick premerge / 原始四路径 native public check | 4 direct、3 catalog、1 boundary PASS;0 error / 0 warning;不豁免另项必需检查 |
| 两个完整后端模块 | 32 PASS |
| packaged research-real-benchmark / research-history | PASS / PASS;保留 Graph/Grid/Ad/Schema、长原文、未知与范围切换 |
| 相同 Graph 捕获的实际 base/head | 基线设置卡 1 → 当前 0,六项判断、原生数值及原引用保留;旧缺陷使新显示 oracle 在 base 失败 |
必需 npm run smoke:demo-readiness |
FAIL:精确 head 与独立构建的不可变 7f550aef58a80067dd85df0a276b2f6f98be742c 均为 Missing dashboard home text: Codex,同一 home composer 断言与相同 smoke blob |
最后一项独立归因为未改的既有首页失败,研究页的改变另有上述正反例覆盖,因此不把无关修复强加给本 PR。必需检查仍为 FAIL,作者记录的严格 CQR/合并 hold 保留;本审查不豁免它,也不授予合并资格。 没有查询、轮询或等待 CI。一个 signed-off commit;四个精确源路径的公开边界与 diff 检查另有本地回执。
我的整体评价
APPROVE 当前有界展示改动,没有发现新的阻塞 finding。实际 base/head 整页对照显示,去掉重复设置卡后原生测量和六项判读更靠前;390px 仍需滚动,展开的精确基线与未知判断正文可读,来源和成本未知没有被隐藏。
未验证 installed App、真实原会话、研究执行、科学收益或实际采用;保存的未指定语言分析原文仍以英文显示,本次没有生成或修订译文。 简化已在原组件内完成,未引入兼容 decoder 或第二份状态;无需把完整 benchmark、费用或 installed 验收塞进这个展示切片。原 mandatory 首页检查由其 owner 修复,严格质量与合并门继续独立保留。
English verdict: APPROVE — ec032ac: the saved-results-first presentation and original evidence survive matched real-backend and packaged negative checks. The unchanged required home-smoke failure remains a separate merge hold; installed/model/scientific acceptance is unqualified.
…istory-20261105-213101 Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
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.
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
Reviewer: model_agent; gpt-6.1-sol; OpenAI; runtime_reported; reasoning_effort=max.
动机
阅读已保存研究结果,并用键盘展开原始判读的用户。 已有测量却没有 Explore 历程时,旧页面先显示设置卡;打开判读后,迟到的动画回调还可能把焦点从目标行抢回外层,导致 Enter 没有展开。现在先读结果,并在已提交的详情区域完成移焦,再由原生 summary 接收 Enter。
独立同一受控时序修复前失败、239桌面/窄屏通过;真实Graph中英四组合及默认85/85通过,按字节相同输入复用到475。新callback前后完整模块各99过;完整本地Ruff由E731失败变通过。 不执行新的研究或模型,不改变源数据、科学结论、研究模式或执行权限;不把界面改善当作科学收益、原会话送达或实际采用的证据。 本次完整审查 exact head 475d9e0a7c8ffe7248195a2ae31b557ccaa696b4。两次远端更新均在发表前被拦住,未发布078或239旧稿。
改动思路
生产改动留在现有 TypeScript Research reader 与提交生命周期;Python 仅修复现有 transport test 的 callback,未迁移或增加产品决策 owner。 完整七路径提案交付结果优先阅读、稳定键盘焦点和现有首页/测试资格修复;没有新增数据、状态、配置、执行权限或后台服务。
原点击回调中的 requestAnimationFrame 可能迟于 summary 聚焦,抢走下一次 Enter。useLayoutEffect 随 selected 提交完成移焦,不留下延迟开启动作;关闭仍返回原 metric。新增 Python 修复只把 assigned lambda 改为 local def,原参数、每次新建的返回字典和全部断言相同,直接消除 E731。
具体改动
沿用修改前 accepted spec_ref: docs/development/design.md、spec_revision: bd79adc649680818f44f7c5f7e5743645309fc3d,并核对 task-first delivery 与 good-smokes。criterion_id Research Workspace:结果与完整原文先可读,键盘返回原入口;Populated Page Review:长问题、混合未知及桌面/窄屏默认和展开态已检查;Task-first delivery:真实隔离 HTTP/SQLite 与故障反例已检查,安装/模型限制另列。七文件 +169/-75 全部判断;六条原路径逐字相同于已完整读完的239,新增 callback 整个 patch 与其 fixture、调用和断言上下文已读。
关键代码讲解
- GoalResearchHistory:仅完整无错零历程且已有结果时收成一行;真正空 Goal 的入口、错误与 Retry 保留,scope guard 撤下旧 pack。
- RetainedImprovement:缩短摘要,精确基线、候选、引用和未知仍在原 disclosure,不新增收益计算。
- ResearchMetrics:提交已选择详情时 focus/nearest scroll,删除 click 中延迟 rAF;null 不移焦,close 返回原入口。
- readSavedGraphAnalysis:暂存开启回调、summary 聚焦后回放,用实际 Enter 验证 open、完整原理由及 Escape 返回,覆盖中英×1440/390。
- captureHomeVisualAcceptance:原 Vite I/O 驱动对齐 channel/Goal/status/artifact owner;未知请求 fail closed,无 typed gate 不产生批准操作。
- sender:现有 drain 的测试 callback;同 positional varargs、同新字典返回,partial/complete/restart 断言全部不变。
局部重构复用已有 owner,删掉延迟焦点和过期首页假设;未增加 manager、状态机或迁移。现有大 smoke 保留真实 I/O/布局语义,未把产品规则搬进 mock;更广拆分不属于这次修复。
对主干的风险
最强风险是正常通过掩盖抢焦,或紧凑展示隐藏未知。相同独立时序在 pre-fix490 上 Enter 落到 region、行关闭并触发原30秒失败;239双视口落到 summary、行展开,未改断言或加超时。真实 Graph 另有中英四组合和原文/引用/返回验证。当前475只把测试内 assigned lambda 改为同参数、同新字典返回的 local def。所有生产、前端、fixture、构建输入树与239完全相同;239本轮真实Graph、键盘、32后端、构建和默认85/85证据按原revision复用,没有重标为475执行。
| 独立检查 | 结果与实际执行 revision |
|---|---|
| 完整 manager-context 模块,同99项 | 239与475各99 PASS;无断言变化 |
| checked-in CI 完整 Ruff 命令,本地执行 | 239 E731 FAIL → 475 PASS;没有查询 CI |
| 原生 quick 的代码检查 / 七路径边界 / 新提交 DCO | 当前475五项direct、三项catalog、一项boundary PASS;整个gate因stale receipt失败;签名已读 |
| 32研究 API/fixture、Dashboard+Chat 构建 | 239 PASS,全部相关输入树相同,原revision复用 |
| 编译 Chat 真实 Graph / 原 keyboard / 独立延迟时序 | 239 PASS;保留 pre-fix490失败;未重跑475前端 |
| 完整默认离线浏览器组,无filter/shard | 239 85/85 PASS,原报告复用;不是 installed/live-model 资格 |
同源 Vite 首页实测98px桌面/124px窄屏,104/132px限额拒绝372px超高反例;保留其原执行revision,未说成 packaged home。当前475的原生代码检查全部通过,但严格质量 gate 的独立回读仍为 quality_stale_receipt。作者报告 cqr_2bc16d5b927bd052c698 通过;该声明不能替代实际回读。严格质量/合并 hold 保留,由对应资格 owner 对齐当前 exact scope;这不是代码回归,也不授予代写或绕过权限。未查询、轮询或等待 CI。
旧078外层12分钟中断、之后 packaged73过/1项同base provider隔离失败/11未到达、239 Ruff FAIL及旧非通过质量记录全部保留。新 callback 已独立消除相应 E731,不能继续把旧失败说成当前失败,也不能把历史702c超时精确归因于焦点。
我的整体评价
APPROVE,没有新的阻塞 finding。生产改动留在现有 TypeScript Research reader 与提交生命周期;Python 仅修复现有 transport test 的 callback,未迁移或增加产品决策 owner。 完整七路径提案交付结果优先阅读、稳定键盘焦点和现有首页/测试资格修复;没有新增数据、状态、配置、执行权限或后台服务。 long_horizon 判为 preserved,user_experience 判为 improved。保存结果优先、完整原文和引用可读;新 head 的桌面与窄屏焦点明确停在已展开行,英文原证据保持原文。
默认/未知布局的 ec032 实际图保留原revision;239又检查编译 Graph 的1440×900/390×900展开行、可见焦点、原始英文理由和引用。475前端完全相同,明确复用,未伪称新截图;窄屏仍需滚动,未知保留。未验证活动安装、模型执行、原始会话送达、实际采用或完整成本净益;历史702c超时无焦点轨迹,精确原因仍未证。没有查询/等待CI或合并授权。 当前本地代码验证不授予合并、安装或撤回其他 review 的权限;严格质量 receipt 的独立回读仍为 stale,需其 owner 对齐精确 scope。
English verdict: APPROVE — 475d9e0: the whole reader/focus proposal is qualified by independent source-bound real-backend evidence, and the new callback repair passes matched99-test and full local Ruff checks. A stale Goal quality receipt remains a separate merge hold. Installed/model benefits and the historical timeout cause remain unqualified; merge authority is separate.
Goal And Delivered Outcome
Keep saved benchmark results readable when their Goal has no Explore log, and keep their judgment rows usable by keyboard. The empty-history status and actual count stay inline above existing results; a genuinely empty Goal retains its setup action. The compact retained-improvement value still expands to its exact baseline, retained candidate and citations.
A controlled real-Graph read exposed a second reading failure: an opening animation callback could move focus from an already focused judgment summary to its outer region, so Enter did nothing. The existing TypeScript component now establishes focus when React commits the selected detail. Native summary Enter and Escape remain unchanged; no timeout or keyboard assertion was removed.
main, integrated atbd79adc649680818f44f7c5f7e5743645309fc3d.Author Declaration
475d9e0a7c8ffe7248195a2ae31b557ccaa696b4. Current-turn checks cover the Python callback repair; the unchanged frontend retains the separately identified validation below.0 / 0; empty-without-analysis setup/focus remains23906752epassed all 85/85 catalog cases in default offline qualification, with no scenario filter. Its complete report is reused because this update changes only the Python test callback. This does not qualify installed/live-model branches.All seven changed paths were reviewed. Product focus remains in the existing TypeScript presentation owner; existing JavaScript browser drivers remain test I/O adapters. The existing Python handoff test remains a transport test: its assigned lambda is replaced by a local function with the same positional arguments, fresh return dictionary and unchanged assertions, satisfying the mandatory Ruff rule without a language migration. The bounded refactor moves focus out of deferred click scheduling into the committed selection lifecycle. No new shared vocabulary, setting, backend decision or abstraction is introduced.
Scope And Continuation
The home qualification repair follows current entrypoints: verified unbound stewardship, channel-owned executor defaults, separate persistent read-only status, Goal runtime selection and complete user rows. Legacy requests without typed gate metadata have no approval action; validation summaries never become saved artifacts. Immutable-base/head measurements retain 104/132px composer limits for the existing 98/124px desktop/narrow form; an isolated 282px mutation is rejected.
This is a reversible reading/qualification fix. Full costs, independently verified adoption/effectiveness, original-chat delivery and installed-App acceptance remain open. The fixtures preserve provider assertions, including unknowns; their displayed native retention and model judgments are not independent scientific validation. No new benchmark, model execution, installation, release or merge is performed.
Validation
Local run state: finished; remote checks for the updated head are pending. Inputs:
public_fixture; synthetic data only for compatibility, transport and negative boundary cases.Fresh at
475d9e0a7: the 106-test before/after comparison, full CI Ruff, exact-scope quality, quick premerge and public scan. The other frontend build/browser/manual rows below are reused from23906752e, with byte-identical production, frontend, fixture and build inputs; they were not rerun for this Python-only test repair.tests,loopx/canary,loopx/control_plane,loopx/domain_packsandloopx/presentation. The same command failed E731 before the repair. Full Dashboard + Chat build/TypeScript evidence is reused from23906752e; all frontend/build inputs are byte-identical.research-real-benchmark, 20.288s; existing read-only HTTP owner and isolated SQLite; real histories/results, zh/en, original citations/export/Back, zero writes and unchanged source digests4906695plus the new real-Graph oracle fails deterministically after the delayed callback steals Enter; the same oracle passes after the TS fix. No retry-to-green or timeout increase.23906752e.23906752epassed all 85/85 catalog cases in default offline qualification, with no scenario filter. Its complete report is reused because this update changes only the Python test callback. This does not qualify installed/live-model branches.cqr_2bc16d5b927bd052c698is recorded and read back valid for fingerprint2bc16d5b927bd052c698ef1f15303ae0ec29e6241ab0f36d761308fa55919705, seven files. Current turn: one allowed/applied bounded repair pass, zero unresolved risks. Goal-bound quick premerge passes: five direct checks, three catalog checks and one public-boundary check; no failures, skips or manual holds. This local result grants no merge authority.Historical failures remain recorded. The
702c2eedfull run passed 61/85 scenarios and timed out at the originalresearch-display-language.mjs:146Enter assertion, leaving 23 unrun. Later passes alone did not qualify that failure. This revision adds a demonstrated focus-race reproduction and fixes that mechanism; the historical run had no focus trace, so its precise cause is not retrospectively proven. Its original assertion remains intact. The earlier non-passing quality receipt is retained as history.Historical CI at
23906752efailed mandatory Ruff E731 attests/test_manager_context_roundtrip.py:289, with dependent required lanes skipped. The prior six-file scope retained that failure and its non-passing receipt. This update repairs the exact callback syntax and passes the same full Ruff command locally; it preserves the old failed observation and does not waive a required check. Updated-head GitHub CI is running; DCO and dependency review passed at the last read. Remaining required checks are pending, so remote qualification is not claimed. Exact-head independent review and maintainer merge authorization remain outstanding.Frontend / Visual Evidence
Public benchmark display fixtures only. Before: packaged
0423908e; after captures below: packagedec032acb. Layout, markup and copy remain unchanged at475d9e0a7; the focus lifecycle was verified at23906752e, and this update only repairs a Python test callback. The final packaged default and expanded views were inspected again at 1440 × 900 and 390 × 900. These are fixture-browser captures, not installed-App evidence. No hosted preview; reproduce via the packaged research scenarios documented inexamples/personal-workspace-browser/research-history.md.Desktop, before:
Desktop, after:
390 × 844, before → after:
Expanded unknown judgment, after:
Boundary Checklist