Repository navigation
fix(context): preserve typed errors in capture reads - #7754
Conversation
Signed-off-by: Dan <21163332+lllluull@users.noreply.github.com>
Signed-off-by: huangruiteng <huangrt01@163.com>
songoow
left a comment
There was a problem hiding this comment.
Reviewer: model_agent; GPT-6; OpenAI; self_reported.
动机 / Motivation
受影响的是通过 context-read 从已保存任务上下文选择字段的程序和 Agent。以前只要选择路径无效,就被建议恢复原始捕获,即使文件及摘要完全健康;本项区分请求错误与runtime错误。已验证三类路径错误返回稳定原因码和正确修复路线,同一健康捕获可以修正路径后继续读取。本项不修改准入、结算、捕获完整性或全量读取,也不新增自动重试与模型调用。
这次判断绑定PR #7754的完整head 759303b。评价对象是已经存在的实际调用任务与局部可观察结果;重复调用带来的成本或错误恢复路线是本项动机,不能把较小响应或更少导入直接等同于长期任务质量。
改动思路 / Approach
错误分类继续由 TypeScript selection 所有者决定,Python读取适配器只保留已有error_kind和diagnostic_code。请求拒绝引导修正参数,runtime失败引导修复运行时;文件损坏仍走既有摘要拒绝。本 PR 的合理边界是现有只读恢复路径的错误信息保真,不增加另一个捕获或决策所有者。
沿入口跟踪到原所有者、返回值和失败恢复后,这个实现仍在现有边界上处理问题。无改动会保留原成本或错误指引;另起一套业务规则、持久化状态或通用缓存会增加同步义务,此处没有这类必要性。新增说明和投影应服务原调用方完成任务,不能改变原来的准入、权限、结算或来源完整性要求。
具体改动 / Changes
关键代码讲解
- capturedContextSelection:为错误pointer、数组索引和缺失字段添加不同诊断码,保留整批拒绝和不回显内容。 输入与拒绝分支沿用现有调用路径;这一处的返回内容或依赖时机改变,不把局部投影提升为新的业务判定。
- read_context_capture:保留类型化错误信息,按失败来源给出重读同一capture的恢复指引。 输入与拒绝分支沿用现有调用路径;这一处的返回内容或依赖时机改变,不把局部投影提升为新的业务判定。
合法读取的完整JSON、摘要、精确数值和无副作用语义保持;错误回复有意增加机器字段并修正恢复措辞。原来的整批拒绝、定位原始参数和隐藏私有内容义务都保留。正向场景是:以相同capture选择合法转义键,原始9007199254740993被逐值保留,base/head成功响应一致。负向场景是:无斜杠pointer、非规范数组索引和缺失字段返回不同code;缺失文件、摘要不匹配和坏JSON不能伪装成selector修复。这些是依据实际源码与已有调用测试核对的行为边界;失败和恢复继续由原owner负责,没有以返回字段存在代替真实状态读取。
规范基准: docs/reference/required-work-context.md ;不可变修订 04c5799。以下标签定位原文段落/原句,不是新造的协议编号。
- Selected capture details:RFC6901合法选择保持原值、整批拒绝,遗漏select的全文读取保持文件路径。 对应上述原所有者和当前聚焦回归。
- Missing pointers or invalid array indices:路径缺失和非法索引拒绝整批,错误定位原始参数及token而不泄漏路径或正文。 对应上述原所有者和当前聚焦回归。
- Inspect the resolved prefix:健康capture上的请求错误修复路径/已知父节点后重读,捕获损坏仍按原摘要约束拒绝。 对应上述原所有者和当前聚焦回归。
- performs no admission:读取和重试不进行准入、结算、live Goal读取或产生新的模型工作。 对应上述原所有者和当前聚焦回归。
实际验证 / Validation
50 项 Python 选择/读取测试和7项 TypeScript选择测试 PASS;独立同输入base/head探针 PASS;无输出TypeScript类型检查、Python编译和 diff hygiene PASS。
执行命令:python -m pytest -q tests/control_plane/test_context_capture_selection.py tests/control_plane/test_context_capture_read.py; node --test --test-isolation=none tests/control_plane_ts/context_selection.test.ts。另做了独立真实base/head探针:同一capture的三类错误在基线都丢失类型并给Restore建议,head分别返回invalid_pointer/invalid_index/missing_pointer原因码;合法/a~1b选择中的9007199254740993、两种摘要和整段成功载荷完全相同,原文件未改写。runtime错误的mock测试只证明适配器分支,真实TS原因码另由该跨语言探针及7项TS测试验证。
对主干的风险 / Risks
合法读取的完整JSON、摘要、精确数值和无副作用语义保持;错误回复有意增加机器字段并修正恢复措辞。原来的整批拒绝、定位原始参数和隐藏私有内容义务都保留。最需要防止的情况是:无斜杠pointer、非规范数组索引和缺失字段返回不同code;缺失文件、摘要不匹配和坏JSON不能伪装成selector修复。已核对相关调用方和已有review,未重复发布旧head意见;本轮对新增head的源代码与局部回归单独作判断。原持久化状态和业务所有者保持,仍然不能由小范围通过推断整仓或所有部署入口已经合格。
远程快照仅有Mergify Summary成功,未观察到完整GitHub Actions结果;此结果不能被描述为全仓CI绿。risk-based canary: direct=6, selected=19, executed=19, failures=0; gate=passed.
后续合并仍需核对远程head与合并门;该结论不替代安装后采用或模型效果证据。
我的整体评价 / Verdict
APPROVE:在本次只读错误保真边界内,没有发现阻断性实现问题;真实恢复路径、失败反例、类型检查和仓库风险验证已通过。 审查仅适用于exact head 759303b。
本 PR 的合理边界是现有只读恢复路径的错误信息保真,不增加另一个捕获或决策所有者。 已验证三类路径错误返回稳定原因码和正确修复路线,同一健康捕获可以修正路径后继续读取。 已检查 loopx/control_plane/quota/context_selection.ts:capturedContextSelection;loopx/cli_commands/quota_capture.py:read_context_capture;变更是CLI/内部读取或文本协议,没有修改浏览器页面布局,视觉截图不适用。
真实模型采用/安装后App未验证;本地合同与risk-based gate均通过。远程只有Mergify Summary,完整GitHub Actions未知;合并还须freshness/readiness核验。 本项不修改准入、结算、捕获完整性或全量读取,也不新增自动重试与模型调用。所有本轮探针使用合成fixture,没有运行真实模型任务或发起业务作业;本review陈述审查与验证事实,不声称已经发布部署或完成合并。
English verdict: APPROVE — exact head 759303b. Typed read failures and same-capture recovery are validated through the actual Python/TypeScript boundary, with preserved successful payloads and passing scoped risk-based qualification. No blocking code defect found; full remote CI and merge readiness are separate observations.
…agnostics Signed-off-by: hupeng <996228065@qq.com>
songoow
left a comment
There was a problem hiding this comment.
Reviewer: model_agent | GPT-6 Astra Pro | OpenAI | self_reported
动机 / Motivation
Agent 或操作者按地址读取已保存的上下文时,需要区分地址写错、运行服务失败和原始文件损坏,才能继续使用已有证据。 同一份摘要正确的 capture 中,批量读取一个不存在的字段时,旧版只返回普通失败并要求恢复原文件;新版保留失败位置和类型,指导调用者查看已知父节点,再用原文件与原摘要修正读取。
当前 base/head 的真实 CLI 对照证明,三类错误能被明确分类,父节点查询与修正后的批次成功;正常读取和真正的摘要损坏仍返回原有完整结果。 此修复只改进上下文读取的诊断与恢复指引,不声称自动重试、模型已经采纳指引、节省 token、提高任务得分或修复其他 checkpoint 故障。
本次结论绑定 #77541206f5f,比较基线为 2136701。上次 review 的正文绑定旧 head 759303b4b0ae40b24ce5082ba5f5128d210e717f;即使 GitHub 的旧 review metadata 显示新 commit,也不能继承其批准。本轮重新审查全部五个文件并执行当前 head 的独立验证。
改动思路 / Approach
选择器合法性继续由既有 TypeScript owner 判断,Python 只保留现成 typed error 的字段并生成恢复指引;原始文件校验、分页、准入与记账边界保持原位。 当前 PR 的完整边界是现有 context-read 错误呈现及三类选择器错误代码,不新增服务、持久状态、权限、重试或第二套选择规则。
真实调用从 quota context-read 进入原 reader,先校验物理文件和完整摘要,再由 typed runtime 验证选择器;成功时仍由 Python 从原 JSON 取值,因此不会把大整数变成 JavaScript 浮点近似值。失败时复用已有异常属性,不从 reason 的自然语言中猜测类别。这里的最小修复正是保留已有诊断:仅修改文案会继续丢失可编程原因,另建错误框架则增加没有必要的维护面。
| 真实触发条件 | 当前恢复语义 |
|---|---|
| 健康 capture,选择器语法、数组索引或字段地址错误 | 整批拒绝;保留位置与错误代码;调用者修正请求,未知地址可查已知父节点。 |
| typed runtime 或启动失败 | 保留该服务的诊断;处理服务问题后,再读取同一 capture。 |
| 原文件缺失、摘要不符或 JSON 损坏 | 保留原始来源恢复路径;不会假装只需修改选择器。 |
表格对应当前 head 的分支,执行证据来自下述实际 CLI 与测试。恢复仍由调用者显式发起,没有自动循环、重新准入或新增人工确认。
具体改动 / Changes
完整 diff 为五个现有文件、+145/-4:两个生产文件 +17/-4,Python 与 TypeScript 测试增加 111 行,双语参考文档增加 17 行。五个 PR 文件与旧 head 逐字节相同;本轮也核对了 17 个调用者、传输、配置和审查规则文件的内容相同。合入 main 的轨迹归档流式读取、leased Host 续租修改没有改变所检查的 context-read 调用链;当前真实入口仍重新执行,未以文件不相交代替验证。
关键代码讲解
read_context_capture继续先读取原始文件、校验摘要、再选择和分页。新异常分支只在现有 typed exception 上投影diagnostic_code,在 remote error 上保留error_kind;只有request_rejected给请求修正建议,其他 runtime 类型不被误归为字段不存在。真实来源损坏保持原来的失败结果。capturedContextSelection在三个现有拒绝点补充context_selection_invalid_pointer、context_selection_invalid_index和context_selection_missing_pointer。RFC 6901 校验、数组合法索引、own-property 检查、排序去重及原参数位置没有重写;任一地址失败仍不交付批次中的其他值,消息不包含原 pointer 或任务正文。read_context_capture_file是保留的来源边界:物理文件、大小、完整 SHA-256 和 JSON 对象检查先于选择器执行。现有 CLI 分支 只读保存的证据,不进入 guard 或 receipt 写入;selected/index EOF 仍不能被原生观察者当作完整上下文保留证明。
规范依据是合入前已接受的 required-work-context,不是本 PR 新增文案的自证:
| 基线 criterion | 当前 head 对应结果 |
|---|---|
| Selected capture details / 按需读取捕获详情 | implemented:原 capture/hash、完整 JSON 值、选择摘要和分页语义保留;省略选择器仍沿原全量读取路径。 |
| Missing pointers or invalid array indices | implemented:整批拒绝、原参数/token 位置、不泄露 pointer/值均保留;同 capture 的父节点查询与修正批次已实际成功。 |
| performs no admission | implemented:读取不准入、不结算、不刷新 live Goal;未创建 Goal 的 registry/runtime 状态,selected/index EOF 也未提升为完整消费资格。 |
验证记录
| 状态 | 当前 head 的独立验证 |
|---|---|
| PASS | pytest -q tests/control_plane/test_context_capture_selection.py tests/control_plane/test_context_capture_read.py:50 passed,0 skipped。 |
| PASS | node --test --test-isolation=none tests/control_plane_ts/context_selection.test.ts:7 passed,0 skipped。 |
| PASS | 同一合成 capture 在 base 21367015 / head 1206f5f2 各执行八次真实 CLI:默认全读、正确选择、父索引、修正批次、摘要损坏这五类完整 payload 与退出码完全相等,无字段归一化;大整数 9007199254740993 保持原值。 |
| PASS | 三类真实选择器错误的反例:base 缺少 typed fields 且要求 Restore;head 返回预期类型和三种代码,保留相同原始位置、非零退出及无部分正文。修正后继续读取成功。 |
| PASS | TypeScript typecheck、仓库配置的 17 文件 mypy、变更测试的 Ruff、diff-scoped semantic advisory;canary 的六项 direct 检查,以及 19 项 selected 中的 18 项。临时 node_modules 依赖链接也被 selector 列入,原始记录保留,PR 本身仍只有五个 tracked 文件。 |
| FAIL → 独立补验 PASS | 原始 canary 在 cli-output-budget-regression-smoke.py 上被通用外层 120 秒期限终止,耗时 122.754 秒,无预算断言输出。只重跑该原生命令后于 185.065 秒完成,exit 0、stderr 为空;其既有每个 base/head probe 240 秒、differential child 600 秒边界,以及全部产品输出/增长断言均未修改。原始 canary 仍记为失败,不改写成全绿。 |
| UNVERIFIED | 远程六个 workflow 为 action_required,尚待维护者授权;已出现的两项成功检查不代表完整 CI。没有执行授权、绕过或合并操作。 |
本轮环境为 Python 3.12.14 / Node 24.22.1。最初共享环境缺少 mypy,保留该环境失败后以独立、满足仓库版本范围的工具补跑;旧 review 中无法取得原始 receipt 的 canary 数字没有冒充本轮证据。
对主干的风险 / Risks
最需要防止的是把真正损坏的来源错当成选择器拼错,或者将所有服务错误都指向 --list。实际摘要替换对照,以及缺失文件、损坏 JSON、四种相同消息但不同 typed kind 和 startup 异常测试,覆盖了两种方向。四种非选择器服务异常与 startup 案例是在 adapter 边界注入异常;实际 TS/RPC 证据针对选择器路径,不能据此声称已经复现每一种真实操作系统故障。已保留的 UTF-8 分页、改变选择/摘要/深度拒绝和原生 hook 测试还检查了恢复过程中的身份与完整消费边界。
新字段只增加在失败回应中。现有成功 schema、保存的 capture、选择摘要、排序、诊断位置和失败退出语义均保留,没有新增数据库迁移或双版本解码。已检查 CLI 与 native page 消费者;未资格化任意第三方封闭 JSON schema,也未验证实际模型会采纳文字指引。这些限制不改变已证明的本地错误诊断修复。
语义与 CI 对齐
三个新字符串扩展既有诊断 code 词汇,复用现有 request_rejected 类型,不创造权限或生命周期状态。diff advisory 检查两个生产源文件,未发现其支持的新增词汇 carrier;该工具不分析全部动态字符串,因此语义判断仍来自分支、typed transport 与真实调用对照。恢复文字是指引,文件完整性、整批拒绝和无准入则继续由代码强制执行。
当前没有发现阻塞生产缺陷。风险门的原始外层 timeout 与后续原生命令完成均保留:它们验证的是同一输出断言,后者不撤销原始运行结果,也未放宽产品预算。这里依据的是 canary 可配置的每项执行期限,以及 原 smoke 明定的 600 秒 child 边界 和 两个 probe 各 240 秒,不是给产品冻结阈值豁免。原生命令完整通过意味着其 candidate 预算断言和 base/head 比较都执行成功。
远程 action_required 是维护者 workflow 授权与 merge readiness 的独立等待项:不能宣布 CI 全绿,也不能跳过分支保护。当前代码结论依据本轮已执行的原生测试、完整响应对照和逐项风险验证;没有用 pending 自身作为代码缺陷,也没有将旧 head 批准继承给新提交。
我的整体评价 / Verdict
APPROVE,绑定当前 head 1206f5f23e21fe7eed7339eb6431b5456c25971e。 problem_context = goal_achieved 指的是这个明确的读取诊断任务已闭合:失败能指向正确修复对象,健康的已有证据可在同一条只读路径上继续使用。长程工作的改善限于这一段恢复路径;没有真实任务 token、延迟、成本或得分结论。用户体验的改善是减少误导性的来源恢复建议,保留已有输入和原 CLI,无新增确认轮次。
五个文件的机制与问题规模相称,既有 typed owner、文件适配器和恢复命令已足够,另提通用框架没有收益。本轮已检查 quota context-read JSON/CLI 输出和原生 page 消费者;没有页面渲染、布局或图形交互改动。没有需要视觉验收的新界面;模型是否实际采纳恢复指引未验证。
本结论不授予合并权限。合并前仍需维护者处理远程 workflow 授权、重新读取 unchanged head,并通过仓库的 merge-readiness 检查;若 head 或当前相关失败证据变化,应重新评估对应边界。
English verdict: APPROVE — head 1206f5f; typed context-read diagnostics and same-capture recovery pass independent exact-head tests and base/head counterfactuals. The original canary timeout remains recorded alongside native-smoke completion; remote workflows await maintainer authorization and merge readiness is not certified.
Problem and fix
An invalid
--selectcurrently tells the caller to restore the original capture, even when the file is healthy. The runtime already distinguishes request rejection from runtime failures, butcontext-readdrops that classification.This preserves
error_kindanddiagnostic_code, gives malformed pointers, invalid indices and missing paths distinct codes, and returns recovery guidance for the actual failure. Programs can correct the read against the same capture. Digest checks and whole-batch rejection stay unchanged.Validation
The original implementation passed 61 focused Python tests and 9 TypeScript tests, including the real CLI path from a rejected selection through directory discovery to a successful read.
Updated main (
2136701) is merged into head1206f5f. All five PR files are byte-for-byte unchanged from approved head759303b4. On the updated head:An additional strict mypy invocation on
quota_capture.pyoutside the configured mypy scope fails. Comparing main and head with the same module context gives the same seven diagnostics; this extra check is not reported as passing. No full-suite or deployed-model qualification is claimed for this synchronization.The published approval covers the previous head. The synchronized head still requires maintainer review/readiness and merge authority.
Written with OpenAI Codex. No UI changes.