Skip to content

feat(explore): record quantitative results and return scoped feedback - #7011

Merged
loopx-agent merged 3 commits into
mainfrom
codex/explore-quantitative-feedback
Oct 21, 2026
Merged

loopx-agent merged 3 commits into
mainfrom
codex/explore-quantitative-feedback

Conversation

@loopx-agent

@loopx-agent loopx-agent commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

Explore findings currently retain narrative evidence but cannot carry a quantitative result into the graph or the next turn. This adds optional measurements to existing node-linked findings and returns comparable best/regression feedback through the existing Explore context.

For recorded results 8 → 9 → 6 → unknown, the best remains 9, the regression at 6 is −3, and unknown remains explicit. Candidate and result references identify which evidence to revisit. Latest follows canonical log append order, including tied and backfilled source timestamps; its ordinal is derived in the projection and is never persisted as a second fact. Lower-is-better metrics, zero and negative values are supported.

  • Owner and capture: the existing builtin Explore capability owns the TypeScript codec and comparison logic. Ordinary result writeback and explore finding --measurements-json use that owner; Python remains transport/persistence. Source refs must belong to the finding, and ordinary writeback binds the measurement to its input revision.
  • Comparability: compare only matching node, metric, unit, direction, comparison scope, input revision and evaluator. Producers declare task/resource/budget conditions in the scope and separate native evaluations from proxies. Corrected findings replace their previous measurement in comparisons while original versions remain in history.
  • Product journey: graph cards, research-history details and the existing result reader expose measurements and provenance. Next-turn context includes bounded feedback, prioritizes selected nodes and retains the older best before display pagination. Feedback pages reuse the existing result limit/offset/revision and optional node filter. Follow measurement_feedback_page.next_command to retrieve every group, including several metrics or conditions on one node. The revision includes the complete current measurement source rows, including manual findings; unchanged aggregates do not excuse changed evidence.
  • Limits: measurements remain source-reported evidence. Latest recorded does not identify the retained candidate; best does not establish acceptance or causality. This does not change branch ranking, enable Explore, launch experiments or grant execution authority. Actual agent adoption and outcome benefit remain to qualify with subsequent work.

Existing strict readers must be upgraded before producers opt into writing measurements. Historical logs are not rewritten, and rollback to a reader that rejects expanded events is not qualified.

The small shared codec/projection avoids separate UI and Python scoring implementations; the paging repair shares one continuation-command builder for the two derived views; legacy findings omit the new field and keep existing behavior. English and Chinese capability guidance describe capture and comparison semantics.

Validation

Tested head: f2ac2e8d2273318c81930d2d344bd067b527d9d1, base commit 21322fb1f1171c0bf7fdb9cb1112b66a1dd0dcf8. Latest target main 5bf58c1ca3d21919b15c662bc705c3e069bfb496 was also inspected; its intervening changes do not touch the Explore owners.

  • Python integration suites for measurements, ordinary result writeback and turn context: 109 passed. Covers real capture/replay, CLI zero capture, source binding, strict malformed-history failure/recovery, pagination and Explore disabled. The two source-clock regressions failed at the original head (latest 8 instead of 6) and pass at this head with latest 6/best 9/delta −3.
  • TypeScript measurement/writeback/history/turn-context suites: 38 passed. Covers regression, lower-is-better, unknown, comparison isolation, corrected sources, scoped feedback and complete multi-group pagination. The old head returned only 3 of 8 groups even with an expanded node read; the repair returns all 8 through projected CLI continuation commands without changing the log, rejects changed manual sources and rejects source changes that leave the best/latest aggregate unchanged.
  • Dashboard npm run build: passed, including TypeScript and packaged Chat bundle verification. Existing Vite chunk-size warning remains. UI/history sources and the built entry-asset hashes match the prior visual qualification; the paging repair changes the CLI/next-turn read, with no renderer change.
  • Standard loopx canary premerge --from-git-diff --git-diff-base origin/main --tier standard --timeout-seconds 180: 19 selected checks passed, plus direct checks. Public-boundary scan, bilingual RFC diff check and semantic advisory passed; the advisory does not prove semantic completeness.
  • Browser readback uses the packaged Chat UI with its real owning HTTP/history backend and an isolated synthetic registry/event log. Quality latest 76/best 82/−6 and runtime latest 1.9/best 1.1/−0.8 are visible; the narrow document remains 390px wide. A blocked history request reports failure while preserving already-read records; retry restores the graph, and Escape returns keyboard focus to it. The after screenshots use tied source timestamps at 9679b11d7cc1e5a786c0131b5a66b16050634a01; their six renderer/history source files and built entry assets are unchanged in the paging repair, so that visual evidence is reused. Fixture source hashes remain unchanged; execution services are unavailable and rejected writes remain rejected. No installed-runtime or experiment outcome qualification is claimed.

Visual evidence

Public-safe synthetic data only. After views use the tested head's built package. The before view substitutes the two existing presentation components from 6ac22206ee4268c0dda1fbec058bcb8d4f7aca00 against the same synthetic history; it is a presentation comparison, not baseline runtime qualification.

Before, desktop:

Before: Explore research graph without quantitative feedback

After, desktop first viewport:

After: node score and historical best, with quality and runtime regression feedback

After, narrow selected-node detail:

Narrow view: quantitative results, historical best and evaluation scope disclosure

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 loopx-agent left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Reviewer: actor_kind=model_agent; model=gpt-6.1-sol; provider=OpenAI; declaration_source=runtime_reported; reasoning_effort=max.

Approval conclusion (author-owned PR; GitHub blocks formal self-approval)

动机

使用 Explore 记录连续实验、再决定下一步工作的研究者和 Agent。
研究者记录同一条件下的三个候选结果 8、9、6 后,原来只能重新翻文字寻找较早的好结果;现在页面与下一轮上下文都保留最佳候选 9,并显示最新结果相对先前最佳值退步 3。
已验证普通写回和 CLI 能保留量化记录,页面与下一轮上下文能读出同口径最佳值、退步和未知。
本 PR 不改变任务排名、当前保留候选、验收状态或执行权限,也不启动实验。
真实 Agent 是否据此选择并采用更好的候选,以及实际成果和完整成本是否改善,仍需后续真实工作验证;本 PR 不能关闭这项验收。

改动思路

以既有 Explore finding 为唯一记录入口,给已有写回、CLI、研究图和下一轮上下文补齐同一份量化事实。TypeScript 负责校验和比较,Python 保持传输与持久化职责,React 直接读取共享投影。这样一次普通证据写回就能被后续工作读到,无需用户重填指标、另建 Goal、切到独立分析页面或增加确认轮次。查看节点和展开评测范围属于按需阅读。

场景 原行为 本次行为
同条件 8 → 9 → 6 保存文字,用户另找旧结果 最近记录 6、历史最佳 9、改善 −3,附候选与证据引用
最新值未知 没有统一量化语义 未知保留,最佳 9 仍可查,不补成 0
不同输入、评测或预算范围 容易在文字中混用 分成不同组,不计算跨组改善
超过默认页容量 较早信息可能难以找到 先计算全量最佳,再按来源版本分页

具体改动

审查的准确 head 为 f2ac2e8d2273318c81930d2d344bd067b527d9d1。接受的既有依据为 loopx/capabilities/explore/README.md,固定版本 5bf58c1ca3d21919b15c662bc705c3e069bfb496,而非用本 PR 新增说明自证验收。按原有章节逐项核对:Results From Ordinary Work Writeback 保留可选写回、关停隔离和原 claim/lease;Result Event Model 保留严格读取、历史与公开引用边界;Projection And Topology 保持由原始事实派生展示;Review Boundary 保持凭证、原始轨迹和本机路径不进入公开记录。

关键代码讲解

  1. normalizeExploreMeasurements 校验 1–8 项显式指标。有限数、0、负数和 null 分别保留;字符串、布尔分数、重复或未知字段、非公开引用会失败。普通 attachment 还核对输入版本与 finding 的证据引用,因此错误输入在追加前被拒绝。
  2. projectExploreMeasurementFeedback 按节点、指标、单位、方向、范围、输入和评测身份完整分组。它从来源追加顺序得出最近记录,先折叠全部同组证据再计算最佳与改善;最新值未知时仍保留先前最佳。历史更正替换当前比较值,旧版本仍可回看。
  3. projectExploreTurnContext 复用既有 limit/offset/revision 和下一页命令,选中节点优先。来源版本包含手动 finding 的完整记录,不能因为最佳值碰巧相同就忽略证据变化;旧游标明确失败,要求从第一页重读。
  4. build_explore_finding_event 把量化事实附到原 finding,复用原有哈希、追加、重放和 Todo 关联。排序序号、最佳与差值都来自投影,没有第二份持久化账本。新的 RPC 只接共享解码器;CLI 扩展原 finding 命令,没有新增能力开关。
  5. ExploreMeasurements 供原研究图详情、历史 finding 和结果阅读器共用。主要视图显示数值、方向和改善,范围与来源按需展开;历史单条记录不套用当前聚合差值。节点首屏的紧凑提示也来自共享结果,没有前端私自评分。

独立本地验证:49 项 TypeScript 测试、115 项 Python 测试、控制面类型检查和前端打包通过。真实一次写回、重复重放、CLI 读取、非法来源拒绝及损坏历史恢复都覆盖。相同三项真实调用回归在最初 PR head af5f1c6f5d8462ccf58e498e4991555b46075043 失败:时间戳相同/回填时得到最新 8 而非 6,多指标只能读出 3/8 组;当前 head 三项均通过。旧版与当前的四项对照保持关闭模式、无指标 attachment、旧上下文和续页的语义,仅对已披露的可选示例/新增建议做归一化。标准 premerge 的 19 项选择检查和直接检查、准确范围的 change-quality 回执、17 路径公开边界扫描及双语 RFC 检查均通过。CI 按当前策略未查询、未等待。

对主干的风险

比较口径仍由来源声明,严格类型不能证明评测真实有效,也不能阻止生产者把不同预算错误标成相同范围。因此这份反馈只说明已记录值之间的关系,不能代替独立评测。最新记录、历史最佳、当前保留候选和验收状态必须继续分开。新字段扩大了严格日志格式,应先升级共享日志的所有读取端再启用写入;退回不支持该字段的旧读取端未经资格验证,不能靠裁剪历史规避。

本次没有更改 authority-store、任务排名、配额、模型执行或权限。已有无指标记录与关闭模式经对照保持原语义。PR 描述里的桌面和窄屏图使用真实打包页面、拥有该历史的 HTTP 后端和隔离的合成数据;已核对截图版本到当前 head 的六处渲染/历史源码与构建入口资产一致,可以复用这些图。它们不能证明已安装 App 已更新,也不能证明真实 Agent 已采用建议。构建仅有现有的 Vite 体积提示,无未解决的必需验证失败。

我的整体评价

APPROVE:这是可以独立交付的量化证据增量,已有记录入口、读回页面和后续上下文消费者,范围与成本合理,未发现当前 head 的阻塞问题。复用既有 finding 和共享比较器优于另建一套指标协议;追加顺序与完整分页的回归也已用旧失败、现通过的证据核实。实际采用、原生保留成果和完整成本改善仍是明确的后续验收,不能用字段、测试数或本 PR 合并宣称已经完成。

English verdict: APPROVE — exact head f2ac2e8. Optional sourced Explore measurements reach existing capture, UI and next-turn feedback with scope isolation, append-order recency and complete revision-bound pagination. Independent local suites, regression counterfactuals and standard premerge passed. Actual agent adoption/outcome benefit and installed-App adoption remain unqualified; reader-first deployment is required. GitHub CI was not consulted under the configured policy.

@loopx-agent
loopx-agent merged commit d566521 into main Oct 21, 2026
27 of 33 checks passed
@loopx-agent
loopx-agent deleted the codex/explore-quantitative-feedback branch October 21, 2026 19:08

@loopx-agent loopx-agent left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Reviewer: model_agent; model=gpt-6.1-sol; provider=OpenAI; declaration_source=runtime_reported; reasoning_effort=max

Post-merge audit — two actionable P2 findings

本PR已于2026-10-21 19:08 UTC合并为 d5665210e24ddb7c2836a20579e7c684b5339fc6。以下为合并后审计:完整审查最终提交 f2ac2e8d2273318c81930d2d344bd067b527d9d1,不可变基线 21322fb1f1171c0bf7fdb9cb1112b66a1dd0dcf8,并在合并提交独立重跑两条原生CLI反例。既有批准讨论保留,当前fresh-audit计划基于新的可复现证据。

动机

连续记录候选评测、需要比较最近结果与同口径历史最佳的研究者和 Agent。

例如相同条件下先后得到 8、9、6,原来需要翻文字寻找旧候选;本次在已有工作回写、研究图和下一轮上下文中保留最近值 6、历史最佳 9、改善 −3,以及可回看的候选与来源。

当前已独立验证量化捕获、来源约束、追加顺序、未知值与现有页面读回;也复现了任务关联变化时续页重复和漏组,以及 CLI 顶层 null 被当成未提供并成功追加无指标记录。

本 PR 不证明来源评测真实、模型实际采用、当前保留候选、科学收益或完整成本;不改变任务排名、验收、配额或执行权限,也不启动实验。

已合并增量的两条输入/分页缺陷需要后续修复PR承接;实际 Agent 根据反馈采用候选及成果/完整成本,仍沿既有 Explore 研究验收推进。

改动思路

量化来源留在既有 Explore finding,共用一个 TypeScript codec/比较 owner;Python 只做 IO,React 只展示派生结果。这个归属减少重复规则,机制与实际调用者相称;当前缺口应在原 CLI 输入与分页依据中修复。

当前 PR 边界是可选的量化记录、既有页面和有界后续上下文,保留原权限、重放与关闭行为;无需扩成评分控制器或新的排序状态库,也不以数据送达宣称模型收益。

一次已有工作回写携带明确的指标、单位、方向、输入、评测和来源;原 JSONL 保存事实,当前 finding 折叠更正,共享比较器在展示限额之前计算同口径 best。下一轮上下文和现有 Goal 页面消费同一规则。用户无需重填指标、另建页面或增加确认轮次;选图、看节点和来源属于按需阅读。

不修改会继续依赖文字回查;前端抽取分数会推断来源并复制评分逻辑;另建指标库又增加同步和恢复负担。现有 owner 足够承载本次增量。共用 codec/比较器和 nextRead 命令构造器是合适的有界整合,剩余修复不需要扩大架构。

观察 本轮结果
同口径8→9→6,随后未知 best保留9,6的改善−3,未知不补成0
单节点8组、固定读取依据 较早9679只返回3/8;当前展开与分页均8/8
6个手动分组、任务关联在两页之间变化 旧revision仍接受,6行仅5个不同组
显式文件的顶层null 成功追加,但指标字段消失;条目value:null则正确保留未知

此表来自实际源码/CLI/后端观察,未把记录送达当成模型采用。

具体改动

独立依据为 loopx/capabilities/explore/README.md,spec_revision 21322fb1f1171c0bf7fdb9cb1112b66a1dd0dcf8。先读原有 Result Event Model、Results From Ordinary Work Writeback、Projection And Topology 与 Review Boundary;并核对同基线研究 RFC 的 owner 边界及11.5仍属提案的采用验收。当前main5bf58没有改动这些Explore owner,PR新增说明不作为独立自证。下列是原有无编号条款的评审映射标签。

条款映射 处置
EX-capture-source not_met:正向来源/输入绑定有效;显式CLI顶层null却绕过校验并提交无指标finding。
EX-bounded-context not_met:固定依据8组已完整,但真实任务关联变化仍可让旧续页漏组。
EX-history-integrity implemented:历史、更正、严格读取和失败恢复保留;排序序号是派生值。
EX-default-off implemented:完整关闭输出与基线相等;原回写可省略新字段,既有历史仍可读。
EX-authority implemented:未赋予排名、claim、lease、launch、额度或验收权威。
EX-adoption-qualification deferred:实际采用与匹配预算下的成果仍沿现有研究验收推进。

关键代码讲解

  1. normalizeExploreMeasurements:校验1–8项有限数或未知值,以及显式方向和有界来源。普通附件还约束输入版本与结果引用;同名指标不足以证明可比,评测真实性由来源承担。
  2. projectExploreMeasurementFeedback:按节点、指标、单位、方向、比较范围、输入和评测器分组,从追加顺序计算最近记录,保留历史最佳与更正后的当前事实。未知与零、best与保留候选/验收分别处理。
  3. projectExploreTurnContext:复用原limit/offset/revision;但119–121行按selectedRefs重排,而171–177行的手动测量依据没有包含这一顺序,导致第一条P2。
  4. finding CLI分支:文件JSON直接进入原builder;顶层null变为PythonNone,被builder当成未提供,导致第二条P2。问题在参数传输,数值比较器无需复制或另写校验规则。
  5. ExploreMeasurements:既有研究图、finding历史与结果阅读器共用数值/方向/来源展示,当前比较从共享owner读取。历史单条记录没有被冒充为当前聚合差值。

整个PR为17文件、+676/-16,包括111行TS owner、24行Python传输与38行共用UI。Python保留持久化/IO,前端保留呈现,不另设指标状态库。相关开放#6982处理原有comparison-candidate展开选择问题;它与本次新手动测量分页缺口分开,不能假定另一PR已经修复本提交。

对主干的风险

[P2] 将实际反馈排序依据绑定到页revision。 位置 loopx/control_plane/capabilities/explore_turn_context.ts:175。在planning开启、6个节点各有一条手动测量的隔离File环境中,真实Todo owner先把当前任务关联到node-0,CLI第一页返回node-0、node-5、node-4。随后只用原Todo更新入口将关联换为node-5,测量日志字节完全不变;执行原next_command仍exit0、revision相同,返回node-2、node-1、node-0并声称remaining=0。合计6行仅5个不同组,node-0重复,node-3漏掉;当前展开20条的同一CLI却能读到全部6组。

原因是新反馈顺序依赖当前selectedRefs,而hash只包含原测量来源;手动finding没有writeback标签时resultRows为空,原结果页的依据也不能覆盖这个变化。将实际反馈分组的有序身份或影响其排序的任务选择依据纳入既有页 revision;顺序变化时拒绝旧续页,或保留原快照顺序。复用原分页 owner,不新增持久化排序状态。 增加真实CLI跨页任务关联变化回归,断言旧续页拒绝或原快照完整覆盖;同时保留固定依据8/8及来源更正失效用例。当前绿色测试只验证测量来源变化,未覆盖这个排序输入变化。合并提交 d5665210e24ddb7c2836a20579e7c684b5339fc6 的同一原生CLI路径也复现5/6不同分组。

[P2] 显式文件顶层null必须先校验。 位置 loopx/cli_commands/explore.py:582。在同头原生CLI和独立严格日志读回中,--measurements-json文件仅含JSONnull时,命令exit0并追加finding,但没有measurements。相同入口传空数组会exit1且日志不变;合法指标对象中的value:null则成功保存未知。外层文档缺失形状与内层未知值是两个不同语义,不能都当成没传选项。显式提供 --measurements-json 时先经现有 measurement codec 校验文件顶层形状,再进入 finding builder;顶层 null 应拒绝且日志不变,合法条目 value:null 继续保留为未知。 回归同时覆盖省略选项、外层null、空数组及内层未知,保留原builder的正常可选调用语义。合并提交 d5665210e24ddb7c2836a20579e7c684b5339fc6 再次得到相同三种写入/拒绝结果。

独立正向检查仍成立:109项Python、38项TS通过;不可变base与当前head的控制面typecheck均通过;Dashboard及packaged Chat构建通过,保留原Vite大于500kB提示。标准native premerge 6项直接、19项选中检查全通过,零失败、skip或汇总警告。旧9679固定3/8问题由同一冻结来源、同一实际CLI oracle复现;当前8/8通过仅解决那一类输入,不能覆盖新的任务排序反例。没有查询或等待远端CI。

完整base/head关闭输出未作归一化即可相等;启用但无指标的旧结果仅增加一个可选示例和条件指导,已有数据、来源和页事实相同。原capture可选、范围、claim/lease、输入/来源、重放、权限与停止条款逐项保留,没有新增每轮测量义务。来源声明同口径不证明评测真实,也不会自动改变排名或保留候选。

实际打包页面配原生拥有历史的HTTP backend和11条合成事件,独立读出6/best9/−3、1.8/best1及未测量/best0;1280桌面和390窄屏无文档横向溢出,来源展开、失败保留3节点、重试恢复11/11、Escape返回图均验证。源文件保持不变、写入尝试0;未配置的分析/执行服务仍显示不可用。这些证据覆盖页面与后端,未声称已安装App或真实模型采用。

另运行原CI根模块约束,当前base/head均 1 failed、5 passed,147/145,相同模块集合与诊断,PR没有增加根模块;合并提交 d5665210e24ddb7c2836a20579e7c684b5339fc6 重跑也为相同147/145。保留这一独立主干资格限制,不要求本PR修改无关模块或提高门槛。原格式的共享读取端须先升级再启用新字段写入;旧读取端拒绝扩展日志已经实测,回退资格不能靠裁剪历史获得。

语义与 CI 对齐

这是对既有Explore finding、可选附件和派生页的扩展,没有新增全局状态词汇或评分权威。共享codec、来源事实和派生排序归属合理;两条P2分别违反完整一致续页与显式参数不被静默省略的当前边界。修复应复用原owner与现有校验器,重跑测量/回写/上下文Python、相应TS、typecheck和native premerge;无需降低预算、关闭检查或增设人工确认。

我的整体评价

合并后审计:REQUEST_CHANGES,最终提交 f2ac2e8d2273318c81930d2d344bd067b527d9d1 的两条P2已在合并版本复现,需后续修复PR承接。它是有价值的justified_increment,operator user_experience=improved:已有Goal即可阅读数值、方向、历史最佳与来源,无新增必需问答或确认。long_horizon=not_yet_proven:新的后续读回仍能漏组,显式捕获也存在成功却缺字段的分支,应先完成上述有界修复。

量化来源留在既有 Explore finding,共用一个 TypeScript codec/比较 owner;Python 只做 IO,React 只展示派生结果。这个归属减少重复规则,机制与实际调用者相称;当前缺口应在原 CLI 输入与分页依据中修复。

当前 PR 边界是可选的量化记录、既有页面和有界后续上下文,保留原权限、重放与关闭行为;无需扩成评分控制器或新的排序状态库,也不以数据送达宣称模型收益。

保留已验证的追加顺序、同口径比较、关闭隔离、打包读回与结构整合;由后续修复PR修正实际排序依据和显式文件形状,再按其精确提交复核。真实Agent采用、成果、完整成本、独立主干资格和合并授权仍分别判断。

English verdict: REQUEST_CHANGES — post-merge audit, follow-up fixes required; f2ac2e8d2273318c81930d2d344bd067b527d9d1 against 21322fb1f1171c0bf7fdb9cb1112b66a1dd0dcf8, with both defects reproduced at merged commit d5665210e24ddb7c2836a20579e7c684b5339fc6. Two actionable P2s: changing the selected Todo reference leaves a manual-measurement page revision unchanged, so the exact continuation returns only five distinct groups of six; and an explicitly supplied top-level null measurement file exits successfully while appending no measurement field. Bind the effective page order and validate present file input through the existing codec, preserving legitimate item value:null. Independent109Python/38TS, both control-plane typechecks, packaged build and6direct/19selected premerge checks pass. Root147/145 fails identically on base/head as a separate qualification hold. Existing approval discussion is preserved; actual model adoption, outcomes, complete costs and installed adoption remain unqualified.

goal, agent, resultNode, resultRows, resultRows.map(currentQuestion),
// Manual findings participate in feedback too, even without a writeback
// tag. Bind every compared source before paging either derived view.
...(measurementFeedback.length ? [findings.filter(row => row.measurements !== undefined

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[P2] Bind the revision to the effective feedback order. This remains reproducible at merged commit d566521. With six manual metric findings, resultRows is empty while measurementFeedback is prioritized by current selectedRefs. Updating the real selected Todo reference from node-0 to node-5 leaves the measurement log byte-identical and this revision unchanged. The exact original next_command then exits0 and reports remaining0, but the two pages contain only five distinct groups of six: node-0 repeats and node-3 is missing. Bind ordered group identity or all priority inputs in the existing revision, or retain a coherent original snapshot. Add a real Todo-change-between-pages CLI regression; fixed-source8-group paging and edited source-row tests do not cover this ordering input.

evidence_refs=args.evidence_ref,
tags=args.tag,
supersedes=args.supersedes,
measurements=(json.loads(Path(args.measurements_json).read_text(encoding="utf-8"))

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[P2] Validate a supplied file before collapsing it into optional absence. This also reproduces at merged commit d566521. A file containing JSONnull becomes PythonNone here; build_explore_finding_event skips its measurements validator, so the CLI exits0 and appends a finding without measurements despite the documented1-8item file shape. The actual CLI rejects[] without append and correctly persists an item with value:null. When this option is present, validate its parsed value with the existing codec before the optional builder. Add outer-null rejection/log-unchanged, omitted-option and valid item value:null cases.

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.

1 participant