Repository navigation
fix(explore): preflight mixed source history recovery - #7778
loopx-agent merged 5 commits into
Conversation
Signed-off-by: song <liusongstep@gmail.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 90d7d460b0
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…plore-combined-history-preflight-20261101 Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> # Conflicts: # loopx/capabilities/explore/README.md # loopx/capabilities/explore/result_log.py
…plore-combined-history-preflight-20261101 Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
…plore-combined-history-preflight-20261101 Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
There was a problem hiding this comment.
Reviewer: model_agent; gpt-6.1-sol; OpenAI; runtime_reported; reasoning_effort=max
动机 / Motivation
读取已保存结论、恢复历史或在升级后重试原写回命令的 Explore 用户和工作代理。 恢复预览选择全部旧记录,不能明确区分可写子集与需要更正的历史冲突。 一条合法记录和两条矛盾记录一起缺失时,恢复合法一条、报告两条阻断,原候选不改;追加正确最新记录后再恢复。 已验证混合与全部阻断的预览、执行、更正恢复、重复执行以及并发拒绝;保留原候选字节和已有目标前缀。 本项只修复既有 Explore 的归因、历史读取及恢复,不启动实验,不证明候选采用、净效率或科学收益,也不扩张执行权限。
审查绑定 exact head 3752736。我参与了修复,以下是授权范围内的完整作者协助复核,不冒称独立作者审查。使缺失的已登记研究结果能够按预览恢复,同时明确保留归因冲突及更正路径。 不修改会继续造成错误比较或重复人工恢复;这次用实际旧 writer、原公开命令、正常新写入以及真实结果页核对两侧行为。
改动思路 / Approach
归因规则继续归 TS codec,不在 Python 或前端复制。结构合法的历史输入先到既有 primary owner 匹配不可变重试;新的 primary 和 ingestion intent 仍在产生效果前严格检查。历史读取保留原事实,当前投影隔离矛盾数量。已完成交付须匹配原 intent、source/time、canonical finding 和 Todo link,不会再次写图或任务。来源恢复复用同一个持锁文件效果;#7778 明确收紧为合格的已登记缺失 latest 子集,保留不合格原文并报告原因。
架构判断为 retain:数据规则、重放资格、provider IO 和显示各留在原 owner,诊断由事实派生,没有第二份需要手工同步的状态。默认开关、权限、调度与普通无附件路径不变;必需校验失败继续拒绝,observer 展示不能授权执行。更小且合法的方案正是在这些现有边界修复,无需迁移旧日志或增加通用 bypass。两个 PR 逐个保留,后继依赖前缀,便于审查和逆序回滚。
具体改动 / Changes
本次相对受测基线 7c4bf29 的有效切片为 5 文件、+350/-30。#7764 含归因、旧历史、完整 CLI、既有页面适配及合成回归;#7778 在其上单独审查五文件的 eligible subset 策略与更正恢复,没有撤销 snapshot 并发保护。原作者提交与 DCO 保留。最大新增成本是 925 行完整合成 primary fixture,它来自真实旧 CLI 并被永久负向回归消费,不是手造成功回执或真实用户日志。
关键代码讲解
- validate_explore_result_event_attribution:复用 typed measurement owner 做恢复预检;合格子集保留现有顺序,执行仍在锁内检查完整 canonical event IDs。
- reconcile_explore_source_history:复用 typed measurement owner 做恢复预检;合格子集保留现有顺序,执行仍在锁内检查完整 canonical event IDs。
- _append_validated_explore_result_events:复用 typed measurement owner 做恢复预检;合格子集保留现有顺序,执行仍在锁内检查完整 canonical event IDs。
规范基准:既有 Explore 契约,spec_revision=37cedac966dda06ad6605fc389abab8bc2686777,使用原章节/原句标识而不发明 RFC 编号。逐项核对:
- Result Event Model:implemented;历史事件身份、原始声明与后续更正可审计。
- Results From Ordinary Work Writeback:implemented;原 committed receipt/intent/source/time、canonical event 和 Todo link 共同限定重放。
- Successful replay needs no second graph event or Todo mutation:implemented;完整公开命令必须只读恢复成功。
- ordinary work and feature-off hooks retain their existing behavior:implemented;无附件、关闭 Explore 和无测量不能被新必填项或新效果捕获。
原 source-history 契约只恢复已登记且 canonical 缺失的旧结果;后继补充强制归因预检与局部 blocked 诊断,不冒称完整归档前缀。前端另外遵守既有设计契约的真实失败可见原则:保留 measurement_error、按需读完整原因与更正说明;使用单参数 wrapper 调用 normalizer,避免把 Zod parse context 当作共享测量上下文。三态 SSR 反例先失败后通过,合法值、隔离值与未测量不再混淆。
对主干的风险 / Risks
验证版本与复用说明:组合历史回归及103项TS使用的已解决源随后提交为c7d901bc5,113项入口/provider回归在b4f9e7f1完成;前缀17项在c0ce5eaa3完成。此后到7c4bf2906/37527360c,相关Explore生产/测试源未变;新增差异只有单独覆盖的provider streaming和4个前端文件。Git diff/blob已逐项核对,四个前端文件在两最终头字节一致。前端SSR、真实后端打包浏览器和六条源码/最终wheel原命令均另有最终源码检查;没有把早先测试改称在新commit重新执行。
最强反例是内部 replay 测试通过而真实公开命令仍提前失败。现在保持 base37ced 真实成功 CLI 的 Turn、原附件字节和参数不变,分别经前缀、组合和独立 wheel 的 File/SQLite 重放:全部 exit0、idempotent、hook invoked_count=0、业务文件哈希不变。四个永久 CLI 用例覆盖重复成功、冲突附件、缺失图和缺失 hook;其他测试覆盖 Todo link、source/time 和普通新输入。未把已持久化的字段或 mock 成功当成真实执行证据。
组合 Python 222 passed、2 个可选 Harbor skipped;TS 103 passed;前缀精确历史/CLI 17 passed。另有主干变更的 20 passed、7 个平台用例跳过,跳过未算通过。两份源的结构/身份/公开边界先验证;伪造、私密、未知字段和坏尾部拒绝,canonical 并发变化不能偷渡;只有数据 ValueError 形成 blocked 或 measurement_error,RuntimeError 仍传播。更正保留旧证据、合法 8 和更正 7 的比较语义通过。feature-off、无附件及无测量走原路径,诊断和 available 状态不会启动研究。
当前完整 premerge 有一项已有失败:run_host_process 在固定 main bc86585 和本头均为 91 statements、阈值 90,decision_points=49;同负载报告同一 finding、零 magnitude regression,目标文件与基线字节相同。这是已存在的 host 实现债务,未降低门槛或把失败改成通过。其余 catalog/risk、RFC 双语、diff、public scan、类型检查与 changed-invariant 验证按实际日志记录;未查询或等待 CI。页面以真实历史 HTTP owner、打包资源及 15 条混合状态合成结论在桌面和 390px 检查:冲突提示默认可见,原因/更正按需,键盘 Escape 保留选择,窄屏无溢出,合法值 8 可读,后端 mutation_attempts=0 且原 fixture 不变。未安装到运行中的 App,也未跑模型或原生 Windows/Harbor。
语义与 CI 对齐
复用现有 measurement/intent/event vocabulary;measurement_error 与 blocked_* 来自事实,不是 Goal 权威状态。#7778 新增的是能力局部、调用者可见的恢复状态,动态字符串不在静态 advisory 的完整推断范围,已手工核对其 preview/execute、孤儿与更正分支。普通新证据的归因拒绝是机器义务,追加更正是恢复指导;文档没有把两者混称。没有 substring/prose 猜测、静默开关变化、全局 gating 或 sink 删除权限。
我的整体评价 / Verdict
归因规则、不可变重试资格、锁内文件效果和可见诊断各归原 owner;没有复制权威,也没有额外用户确认。 五文件合格历史恢复后继,依赖已审前缀。
在真实历史 HTTP owner 与打包页面上查看 15 条混合状态结论:桌面选中结果保留清晰正文和单行冲突提示;390px 单列选择器保留全部条目,说明按需打开且不溢出,Escape 保留选择,合法值 8 可读。 未安装到运行中的 App;合成数据不证明实际模型采用。
problem_context=goal_achieved,long_horizon=improved、user_experience=improved;这里只表示可审计恢复和结果可读性改善,不证明真实研究效果或完整成本收益。observable_semantics=intentional_change_validated。完整历史兼容有真实旧 writer/primary 消费者,机制与问题相称;已应用的简化是复用原 immutable replay、同一 typed codec、共享持锁 append 和 ContextHelp,不增加平行状态或通用豁免。当前没有未解决的本切片阻断发现;旧 review 的具体失败分别有现头负向/真实入口证据,旧提交或已关闭线程本身不能证明修复。主干既有 ratchet 失败、可选环境和实际安装缺口均保留,合并仍须单独检查 exact-head readiness。
English verdict: APPROVE — exact head 3752736; strict new attribution, auditable legacy replay and qualified recovery/readback are verified. The unchanged baseline host-function ratchet failure and untested environments are disclosed.
The merge-base changed after approval.
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.
Post-merge exact-head audit — code approval conclusion
动机
需要从已登记的局部 Explore 历史恢复结果的维护者,会遇到这个问题。同一来源中有一个合法 finding 和两个归因冲突的 finding。旧恢复路径会全部导入并报告完成,之后只补 missing 的重试无法采用来源中的纠正版本;现在先恢复合法部分,明确报告两项 blocked,修正来源后可以再次恢复。
已在真实 File 和 SQLite authority 上通过公开 CLI 验证:合法部分可以恢复,冲突项有明确原因,向原来源追加合法纠正后两项恢复成功,重复执行不再追加事件。本次只证明局部历史恢复和纠正路径可用;不宣称首次实现数量比较隔离、完整前端交付、实际模型效果、远端 sink 投递或长期净收益。
改动思路
归因检查复用现有 TypeScript measurement codec,写入仍由原持锁 append 与 snapshot CAS 负责;Python capability 只编排来源恢复和诊断,没有新增 authority 或第二套状态规则。交付边界是已有 source-history-reconcile 的 eligible/blocked 预检、局部恢复和同源纠正,不包含执行新实验、修改 Core 业务状态或触发远端投递。
我把问题限定在恢复入口的可操作性:前置依赖已经会将冲突数量从比较中隔离,所以本 PR 的新增价值不能写成“首次避免错误比较”。实际新增结果是只导入可恢复部分,并让未导入的冲突项保留清楚的纠正入口。旧完整归档 replay 仍属于原 owner;针对 missing-source 的恢复调用新写入归因检查,是明确收紧的行为。
命令先完整严格读取 canonical 与登记来源,按 result_id 选最新候选,再排序与预检。预览只展示计划,执行沿用 snapshot CAS 和同一持锁 append,最后独立重读投影。来源文件和 canonical 旧前缀都不被重写,重复执行不会新增 event 或派生图边、Todo。无需增加版本分支、第二套 measurement owner 或通用控制面字段。
具体改动
本次独立审查与验证针对 43d4dea0c7025c72586022474bfafdf000928efd,实际基线 9fdef99d69654a969097719e04163b3c9a2ceaa0;完整 diff 为五文件 +350/-30,两个现有 Python 模块、capability README 和两个历史测试模块。
以改动前已接受的 loopx/capabilities/explore/README.md(9fdef99d69654a969097719e04163b3c9a2ceaa0)为依据;没有用本 PR 新写的 checkpoint 反过来证明完成。
Quantitative findings → implemented:复用已有定量归因规则,冲突 finding 留在 blocked;Result Event Model → implemented:保留 event/result 身份、旧前缀及重放幂等;Historical compatibility → implemented:完整归档继续可读,局部 missing 恢复明确区分合法部分与需要纠正的来源,不伪称历史坏数据已被修正。父级 Explore 长期收益和远端展示均不在本次完成声明内。
关键代码讲解
-
reconcile_explore_source_history:在任何 append 之前,把候选归因检查分成 eligible 与 blocked;合法的仍恢复,冲突的留下原因。expected snapshot 进入原 writer 后再单独重读,所以预览与执行使用同一计划,竞争写入由原 CAS 拒绝。 -
validate_explore_result_event_attribution:把已有定量 normalizer 暴露给恢复与普通写入复用。不是在恢复循环中再写一份数值判断;非定量 finding 仍可写,冲突定量数据在写入前报错。 -
_append_validated_explore_result_events:继续掌握持锁读取、旧前缀和精确 event id 的幂等追加。预检不会取代锁或 snapshot fence;已有不完整日志和竞争修改继续由原 owner 拒绝,纠正通过来源追加与重试完成。
对主干的风险
最强反例是“部分来源有合法结果,同时有较新的冲突定量结果”,仅测试完整归档幂等会漏掉它。我用同一个不可变四事件 fixture,分别在真实 File/SQLite、planning/off 四种组合运行公开 explore source-history-reconcile JSON/Markdown 预览与执行。base 四组都导入两项冲突并失去同源纠正效果;final43 四组全部通过:合法项恢复、两项 blocked 原因可见,向原来源追加合法纠正后恢复成功,重复调用无追加。禁用 extension、未登记未来来源、登记后可恢复、完整来源损坏先拒绝、来源字节与旧前缀及 Core 业务快照不变,均有实际回读。
PASS:final43 的 history/measurement/legacy CLI 三模块26项,加 source-reconcile/route 两模块37项;实际基线同类既有测试17+37项全部通过,无 skip。changed-file Ruff/compile、配置内 mypy17文件、双语 RFC diff、语义检查、严格 exact-scope CQR 通过。原生 premerge 六个直接检查和十九个选中检查完整执行,当前 gate 失败0。
FAIL(既存、非本 PR 引入):独立实际 base 与 head 的 maintainability ratchet 均为 exit1,签名都是 host_process_transport.run_host_process oversized decision function;unreviewed1、magnitude regressions0,相关源文件 blob 完全相同。原始失败保留,native premerge 列为 inherited advisory,没有放宽阈值或把失败改称通过。mypy 的配置范围也不代表所有改动文件都有完整静态类型覆盖。
首次独立夹具在 /var 与 canonical /private/var 的路径别名校验处、业务执行前失败;只修正私有夹具路径并使用新隔离目录重跑,未把环境问题归因为 PR 修复。初次 CQR 结果引用格式被拒绝,原失败保留,改为允许的现有 source-path evidence 后才记录成功。没有执行真实模型或远端 sink。
本次还确认了一个合并后流程缺口:final43 已合并,但完整早先 review5726564972 对应375且已 DISMISSED,没有完整 final43 结论。因此补发这份独立最终头审查。375→43 只改变三份其他测试,final43 与实际合并提交0e78a19的树相同;这些事实不能替代本次 final43 的实际重跑,也不能把旧测试数挪到新头。此处的代码批准结论不抹去漏审历史;原合并调用方为何跳过记录尚未查明或修复。今后 merge 前应核对当前 head 与完整 review record,本次不执行 merge、dismiss 或 thread resolve。
语义与 CI 对齐
本次复用既有类型与 owner;blocked 与状态后缀是 capability 内诊断投影,不是共享控制面新词表。这些行为由机器执行,不称为可忽略的建议,也不授予额外授权。默认未触达分支通过相同 fixture 和现有套件验证;语义 advisory 的“没有新 carrier”不替代实际 None/动态诊断行为分析。
CI 未查询、未轮询、未等待,也没有推断成功。当前审批依据是精确头独立验证、实际前后对照与失败归因;CI 未知不是拒绝批准的理由,任何真正引入的回归或必要证据缺口仍会阻止批准。
已检查完整五文件 diff 和公开 CLI dispatch,本次没有页面、布局或前端文案改动,visual_review 为 not_applicable。未重新观察浏览器或已安装产品;前序 PR 的截图和旧 head 的测试不作为本次独立验证。
我的整体评价
已在真实 File 和 SQLite authority 上通过公开 CLI 验证:合法部分可以恢复,冲突项有明确原因,向原来源追加合法纠正后两项恢复成功,重复执行不再追加事件。long_horizon 判断是限定边界内的恢复/续接改善;user_experience 判断是原操作与原输入身份能够完成,已有意图和授权无需多一次人工确认。没有给长期收益、完整父级验收或已安装版本采用记账。
已有 owner 足以承担这次变更;共用 attribution helper 是本域内有价值的简化,保留完整归档与真实恢复的差异有兼容依据。当前 diff 与问题匹配,没有为了体积更小而删掉错误处理或重放责任。未发现本次精确代码范围的阻塞回归。本次为已合并代码补记完整审查,不代表新的合并动作,也未宣称原流程调用方已修复。
English verdict: APPROVE — the final merged head preserves source integrity and provides independently verified partial recovery and correction; this post-merge audit backfills the missing exact-head record.
Goal and result
使缺失的已登记研究结果能够按预览恢复,同时明确保留归因冲突及更正路径。 一条合法记录和两条矛盾记录一起缺失时,恢复合法一条、报告两条阻断,原候选不改;追加正确最新记录后再恢复。
Validation and limits
PASS: combined Python 222 passed / 2 optional Harbor skipped; TypeScript 103 passed; exact-prefix history/public-CLI 17 passed. Additional current-main context/host cases: 20 passed / 7 platform skips. Control-plane and dashboard typecheck, configured mypy (17 source files), focused Ruff, CSS token check, semantic advisory, DCO, diff and bilingual RFC checks pass. Source and isolated final wheel repeat the original successful File/SQLite command with zero hook invocation and unchanged business hashes. Source-regression before/after and ordinary strict new-write negatives remain in the tests.
The full premerge retains an independently reproduced pre-existing failure: fixed main bc86585 and this head both report the unchanged run_host_process at 91 statements versus 90, decision_points=49, with zero magnitude growth. This is not a green full-canary claim or a relaxed threshold. Remaining selected checks and the changed invariant are covered by the saved local validation; GitHub CI was not queried. No real model, Harbor, Windows Host or installed-App qualification is claimed.
Visual evidence
User task: understand why a saved finding has no usable measurements and how to correct it. Before, a page containing valid measurements can fail parsing, and quarantine reasons are stripped. After, the same production HTTP/history owner and synthetic 15-finding input render legal values and visible excluded-measurement state; original diagnostics and correction guidance open in place. Desktop 1440x900 and narrow 390x844 inspected, including long repeated mixed-language/mixed-status rows, keyboard Escape, touch help and valid value 8. No horizontal overflow, mutation_attempts=0, source bytes unchanged.
Before assets: b4f9e7f (pre-UI repair). After assets: 7c4bf29 frontend, identical in 3752736; built packaged browser against disposable real backend, not installed App or scientific data. Screenshots are attached; no binary evidence or private state is committed. Optional technical causes stay in ContextHelp; the failure itself remains visible.
验证版本与复用说明:组合历史回归及103项TS使用的已解决源随后提交为c7d901bc5,113项入口/provider回归在b4f9e7f1完成;前缀17项在c0ce5eaa3完成。此后到7c4bf2906/37527360c,相关Explore生产/测试源未变;新增差异只有单独覆盖的provider streaming和4个前端文件。Git diff/blob已逐项核对,四个前端文件在两最终头字节一致。前端SSR、真实后端打包浏览器和六条源码/最终wheel原命令均另有最终源码检查;没有把早先测试改称在新commit重新执行。
Merge readiness: held by GitHub require_last_push_approval; current approval and last push share an identity. All current review threads are resolved.