Skip to content

feat(research): download matching history with evidence coverage - #7297

Merged
huangruiteng merged 1 commit into
loopx-project:mainfrom
steven-kid:roadmap-auto/20261025-report-history
Oct 25, 2026
Merged

huangruiteng merged 1 commit into
loopx-project:mainfrom
steven-kid:roadmap-auto/20261025-report-history

Conversation

@steven-kid

@steven-kid steven-kid commented Oct 25, 2026 •

Copy link
Copy Markdown
Collaborator

Goal And Delivered Outcome

Researchers can now download the original evidence matching a research-history search as JSON, including records beyond the 50-row display limit. Previously they had to expand and copy records individually, losing structured provenance and reading coverage.

The existing Research → Search research records reader now offers Download matches (JSON). The file retains original revisions, references, measurements, filters and loaded/exported counts; incomplete history and failed refreshes remain explicit. Downloading neither launches an Agent nor modifies the source. Loading and empty matches disable the action; a failed browser download can be retried in place.

  • Written by: model_agent — OpenAI Codex.
  • Specification and revision: overall roadmap docs/architecture/rfcs/loopx-overall-roadmap-v0.md §2, S5/S6, and docs/development/frontend-delivery.md task-first delivery, at 3dda7674e966bbd7274c4a705d95e0bf81ead24b.
Criterion Disposition Owning path Evidence
S5 readable artifacts and failure/recovery implemented for this bounded export existing research-record reader Packaged browser download, interruption/retry, keyboard, English/Chinese and narrow layout
S6 retain evidence provenance and uncertainty implemented for this bounded export canonical Explore history projection; local serializer Original superseded observation, source refs, complete/partial/stale coverage and scope tests

Scope And Continuation

Complete within this scope. This is an increment to S5/S6, not qualification of the overall roadmap, causal research benefit or installed native App. Built-in Explore retains ownership; no capability, provider, import protocol, endpoint or second ledger is introduced. Existing report download cleanup and filename handling are reused. No adjacent refactor is needed beyond that reuse. No new configuration or Lark/CLI behavior is introduced.

All-author open PRs and relevant open issues were checked, including the research-continuity tracking PR #6838; no competing record-export slice was found. This change does not alter its execution/admission work.

Validation

  • Tested source revision: 91c76f836c8ef4fac0df4c54e89948f8c81d3bcc (checks ran on the identical working-tree sources before commit).
  • Run state: finished (includes the failed broader run below).
  • Input classes: synthetic, public_fixture.
  • Base: 3dda7674e966bbd7274c4a705d95e0bf81ead24b; dedicated branch contains one signed commit.
Check kind Result Evidence / limitation
unit passed node --experimental-strip-types --test apps/presentation/dashboard/src/features/personal-workspace/research-record-search.test.mjs apps/presentation/dashboard/src/features/personal-workspace/research-record-export.test.mjs apps/presentation/dashboard/src/features/personal-workspace/report-download.test.mjs — 9 tests
static / packaged build passed npm run build in dashboard — TypeScript, dashboard and verified Chat bundle; existing large-chunk advisory remains
static passed npm run -s typecheck:control-plane
unit (broader kernel regression) failed npm run -s test:control-plane — 5559 tests: 5483 passed, 1 failed, 75 skipped. zcode_guard.test.ts / “guardian reaps descendants before reporting native leader exit” timed out waiting for the fixture process. No full-suite pass claimed.
regression_parity passed focused reruns; broader failure retained node --no-warnings --experimental-sqlite --experimental-strip-types --test tests/control_plane_ts/zcode_guard.test.ts — 6/6 passed separately on exact head and a clean exact-base worktree. The test and ZCode implementation are unchanged. These isolated passes do not establish the cause of the broader-run timeout or erase it.
real_entrypoint / real_backend passed LOOPX_USAGE_PING=0 LOOPX_PERSONAL_WORKSPACE_PACKAGED=1 LOOPX_PERSONAL_WORKSPACE_SCENARIO=research-record-search node examples/personal-workspace-browser-smoke.mjs — packaged Chat, production history HTTP reader, native Explore log and disposable SQLite authority; 78 original events, old negative revision, partial/stale downloads, read/download recovery, pending-refresh gate, cross-Goal isolation and Chinese keyboard download. Source bytes unchanged and zero mutation attempts. Chromium configured through the existing browser harness.
regression_parity passed Exact-base build and original packaged research-record-search scenario passed before the change; the base reader has no download action
canary passed checks; manual review required loopx canary premerge --from-git-diff --git-diff-base 3dda7674e966bbd7274c4a705d95e0bf81ead24b — 4 direct checks and 13 selected checks, zero failures. Overall result remains manual_review_required for binary visual evidence; not a green merge gate. Six synthetic screenshots inspected for content and metadata (all PNG metadata empty).
static passed Targeted loopx check --scan-path ... public-boundary scans, git diff --check, staged bilingual RFC check; no paired RFC changed. Registry warnings reflect the deliberately unconfigured source checkout. Semantic advisory analyzes no supported changed kernel carriers; the UI serializer is outside its scope.

Current CI blocker: kernel-static-checks fails with five E701/E702 errors in tests/presentation/test_codex_attached_conversation.py (lines 71, 85–88); dependent aggregates fail/skip. I independently extracted that file and pyproject.toml from exact base 3dda7674e966bbd7274c4a705d95e0bf81ead24b, ran Ruff with that base configuration, and reproduced all five errors. Both files are byte-identical on this head. Existing open fix #7293 owns that cleanup; this PR does not duplicate it. Sign-off and dependency review passed; CI is not green. A separate installed-page browser job fails in goal-activity.mjs:437 (empty running-tile disclosure). Follow-up reproduced the identical assertion on the PR head, the initial implementation base 3dda7674e966bbd7274c4a705d95e0bf81ead24b, and the actual synthetic-merge CI base af68b0ff180ca8309b5d63d7ee326c77848521bb, each with its own source-packaged build. Actual text is 正在执行\n0; the expected unknown-execution explanation is supplied through the existing ContextHelp disclosure, while the scenario reads the unopened tile’s innerText. goal-activity.mjs, manager-brief.tsx and context-help.tsx are identical across those revisions. This failure exists without the export contribution; no unrelated UI/test fix is included. Local comparisons used Node 24.19.0/Python 3.12.14, versus CI Node 24.21.0/Python 3.11.17; they establish the same baseline assertion failure, not installed Desktop qualification. The targeted research export scenario passed locally.

Ruff was also rerun on the file from actual CI base af68b0ff180ca8309b5d63d7ee326c77848521bb: the same five E701/E702 errors reproduce, and both that file and the Ruff configuration are identical to the initial base and PR head. This distinguishes actual CI-base evidence from the initial-base check above.

Current-head CI is terminal: 7 successful checks (Sign-off, dependency-review, macOS desktop, Windows desktop, site build, changes, Summary); 6 failures (release build’s browser step, kernel-static-checks, checks, pytest aggregate, stage2c-correctness-e2e aggregate, merge-gate); 18 skipped checks including dependent Python/TS/browser lanes and publication. No passing full CI or merge-readiness is claimed. The full local TypeScript run’s zcode_guard timeout remains unresolved suite-level qualification despite isolated head/initial-base passes. No reviews, review comments or issue comments were present at this follow-up; no feedback reply or new push was needed.

Full Python CI, Windows, installed Desktop/WebView, live models and real remote-source deployments were not locally run. Browser download initiation does not certify that an operating-system save completed. CI and formal exact-head review remain independent gates; this PR grants no merge authority.

Frontend / Visual Evidence

UI impact: changed. Source data: synthetic. The affected expanded reader is shown at 1440×900 and 390×900. Before is exact upstream base; after/error/stale use the tested revision above and packaged browser build. No hosted preview or installed-App claim.

Attention review: one action in the existing opt-in filter row; original evidence and coverage remain prominent. Existing flex wrapping accommodates the narrow view without horizontal overflow. No added card, hero, configuration or explanatory banner. Errors remain in place and retry uses the same action. Screenshots and browser checks establish this reading/export journey only.

Before After
Before desktop After desktop
Before narrow After narrow

Download failure and in-place retry
Stale read remains explicit

Type / Area

  • New feature
  • Documentation and test update
  • Public presentation surface
  • Direction: Operator surface; roadmap S5/S6.
  • Shared-authority RFC fixture impact: N/A; no authority/provider rules changed.

Boundary Checklist

  • No private state, credentials, raw traces, internal links or local machine paths in the contribution.
  • No duplicate maintainer-owned benchmark work.
  • Single scoped outcome; no paired RFC modified.
  • Visual evidence included, synthetic pixels and metadata inspected.
  • Every commit carries DCO sign-off.

Signed-off-by: Yuchao Wang <stevenkid404@gmail.com>

@loopx-agent loopx-agent left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewer: model_agent | gpt-6.1-sol | OpenAI | runtime_reported | reasoning_effort=max

动机

正在研究页查阅历史证据、希望保存当前筛选结果的用户。

以前匹配记录可以跨历史分页搜索,但屏幕一次只展示50条,没有导出入口;用户手工复制容易漏掉更早的负结果和来源。现在可在原筛选旁直接下载全部匹配的规范化原文记录。

已验证屏幕50条时下载78条,筛选能保留旧负结果和原生量化测量;部分读取、过期快照、下载失败重试和跨 Goal 切换都给出对应的结果与覆盖信息。

文件是已读历史的便携副本,不是原始日志备份、导入格式或验收回执;不启动研究、模型或自动化,不修改源状态,也不新增连接端点或凭据。

整体研究与长期收益资格仍由原有研究路线负责;本次只完成已有阅读路径中的保存增量,不据下载成功宣称后继决策采用或完整费用改善。

改动思路

研究历史仍由原有 HTTP 分页读取器和规范化记录模型管理。导出复用当前 query/status 的文字匹配;屏幕的50条展示上限只影响渲染,不影响文件。传入的是 canonical 原文记录,显示翻译或分析不会成为导出数据源。完整性与刷新失败从父读取器派生,保存错误只留在当前界面,由用户就地重试。

复用原搜索语义、规范化历史 owner 和现有下载释放逻辑,新增机制只有局部序列化与就地错误反馈;不需要新的后端、权限或独立配置。当前 PR 的交付边界是已有研究阅读器的一次本地文件保存操作,源记录、覆盖判断与研究执行继续由原 owner 管理。 用户已在阅读器中时,仅需一次保存操作;无需重复填写 Goal、连接地址、确认已有授权或调用 Agent。文字说明足以表达这个小调用链,未额外制作图。

具体改动

完整 head 91c76f836c8ef4fac0df4c54e89948f8c81d3bcc 共12路径 +169/-7:父组件传递 Goal 身份;搜索组件增加按钮、busy/空结果禁用与下载失败提示;26行序列化函数保留全部匹配记录及筛选、导出时间和覆盖计数。其余为聚焦测试、现有打包场景扩展、使用说明和六张合成页面截图。

先读规范 docs/development/frontend-delivery.md,固定版本 3dda7674e966bbd7274c4a705d95e0bf81ead24b,按原文条款作如下评审标签:task-first-delivery 已实现,需求是保存用户当前查看的证据,而非新增配置流程;packaged-task-state-readback 已通过真实后端、实际保存文件与失败恢复核验;truthful-unavailable-and-coverage 已由40条部分读取、过期完整快照、加载中和空匹配验证。另已核对该版本的设计系统和总路线图;不据此关闭 S5/S6 或整个研究效果资格。

关键代码讲解

  • GoalResearchHistory:43:继续持有分页、abort、原始记录与显示替换的分离;reader key 绑定 Goal 与来源。本次只向已有子组件传入 Goal,没有增加并行读取 owner。
  • ResearchRecordSearch:10:查询和状态过滤继续调用原搜索函数。下载处理使用完整 events,不使用 matches.slice(0, limit);busy 或零匹配时不可下载。失败后原证据与筛选保留,再次保存清除错误。
  • exportResearchRecords:8:先检查整个输入属于当前 Goal,再按同一搜索语义选择记录,输出已有读取状态和原记录对象。即使异 Goal 记录本会被过滤掉,也拒绝混入。
  • downloadReport:12:复用现有安全文件名、UTF-8 Blob、临时链接和 URL 释放,不新增网络或后端写接口;原团队工件调用方保持不变。

对主干的风险

未发现阻断问题。最强反例是“界面看似正常,但文件只存当前50条”,因此独立验证使用一个问题、75条重复长记录、旧 refuted 结果及后来的 confirmed 版本。原始基线可以搜索旧结果但没有下载入口;本 head 实际保存78条,筛选文件只含原 v1 负结果。额外在浏览器 Blob 边界注入一次50条截断,独立文件计数 oracle 确实失败,恢复原逻辑后重新保存78条通过。

成功路径使用源构建的冻结打包页面、生产历史 HTTP/解码器和隔离真实 SQLite/native Explore 日志。保存后重新读取 JSON,与生产 codec 的完整 canonical 数组深度相等;另一个真实原生量化 finding 的 measurement 对象也完全保留。原始日志里的 boundary 元信息按既有 codec 规则不进入阅读记录,因此没有把这个文件称为原始日志无损备份。普通下载及重试不增加历史请求,源哈希不变、修改尝试为0。

故障只在浏览器网络/文件边界注入:完整快照刷新503后,文件标记 refresh_failed=true;首次第二页失败只下载40条并标记不完整;相应零匹配不被当成“历史没有旧证据”。刷新恢复后能继续读取,加载期间不可导出中间页。其他 Goal 只导出自身1条,中文键盘 Enter 能保存全部78条。

本地9项 Node 测试与 base/head 两次完整 dashboard 构建通过;标准 premerge 的4项直接检查、13项选中检查均无自动失败。命令退出1的原因为六张二进制图片仍需人工审阅:本次已逐张看像素并核 metadata,仅见合成 Goal/证据,无私人路径或凭据,PNG 无文本/EXIF chunk;保留原生 manual-review gate 的实际状态,不改称机器通过。

全局 Ruff 的5个 E701/E702 在不可变基线和本 head 使用相同命令,路径、行列和信息完全一致,均位于未改动的 tests/presentation/test_codex_attached_conversation.py 第71、85—88行,归为既有无关失败。作者报告的旧全 TypeScript suite 超时没有被声称根因已修复或全套变绿;当前保存路径有上述独立证据。没有查询、轮询或等待 GitHub CI。

语义与 CI 对齐

新增的是局部阅读文件形状和临时 UI 错误状态,复用既有 status、Goal、canonical history 与覆盖含义,没有引入共享枚举、义务或权限 owner。语义扫描及来源边界检查通过;全局 Ruff 与图片人工 gate 是独立合并条件,不能由本次 APPROVE 豁免。

我的整体评价

APPROVE,未发现阻断 finding。 这是完整可用的保存增量:原记录、历史负结果、来源和读取限制在实际文件中可回读;既有搜索和本地下载 owner 得到复用,新增代码与任务规模相称。兼容性上没有新增旧请求解码或迁移分支,继续保持原文件 helper 即可;更通用的导出框架没有当前收益。

长程维度判为 preserved:保存副本便于后续读取,但没有证明后继决策采用、整个研究收益或完整成本改善。用户体验判为 improved:利用已有筛选直接保存,恢复无需重新配置,也不启动模型或改变研究状态。

已检查1440与390宽度的实际打包页面:长且重复的记录标题和混合状态保持可读,下载控件在桌面同排、窄屏自然换行;展开后原文与来源可达,失败和过期范围可见。

未验证已安装 App、真实翻译/分析模型或大于本次合成历史规模的性能;本次没有改动这些 owner,也不以截图证明真实后继采用。

本评审只覆盖上述精确源 head 和合成打包环境;保留五项既有 lint、六项原生图片人工 gate及正式 merge-readiness 条件,不授予合并或撤销其他评审的权限。

English verdict: APPROVE — 91c76f8. No blocking finding. Real packaged UI/native-history/SQLite checks preserve all78 matches beyond50 displayed rows, old negative revisions, native measurements and partial/stale coverage; download/read recovery, scope isolation and keyboard use pass. Nine unit tests and both builds pass. Five identical pre-existing Ruff errors and six native image-review holds remain separate merge conditions; no CI, installed/model or later-outcome benefit is claimed.

@huangruiteng
huangruiteng merged commit 0d57e8a into loopx-project:main Oct 25, 2026
25 of 31 checks passed
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.

3 participants