Skip to content

fix(status): restore review material links from canonical Todo text - #7474

Merged
loopx-agent merged 5 commits into
mainfrom
codex/fix-canonical-review-materials-20261027
Oct 27, 2026
Merged

loopx-agent merged 5 commits into
mainfrom
codex/fix-canonical-review-materials-20261027

Conversation

@loopx-agent

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

Copy link
Copy Markdown
Collaborator

Canonical Todo status lost review-material links after the authority cutover, leaving the existing owner-review route unavailable. Derive material availability from canonical task text through the existing bounded resolver, remove private locator metadata through the existing public-safety owner, and retain stale-display isolation. The existing acceptance adapter gains type annotations only; no new capability, settings, schema, write authority or UI layout is introduced.

Validation at f3cf74f5f134f850fc6db9ec282aeb4c2226d344: 169 real File/SQLite and legacy/native canonical-status cases pass; the four new cases failed before the derivation/privacy corrections. The public smoke passes through actual status/Markdown and HTTP material reading, including missing-file, stale-display, traversal and absolute-path rejection. Configured mypy, affected status-caller typecheck, Ruff, 6 direct plus 19 selected premerge checks, public boundary scan and exact-scope CQR pass. Initial missing-development-dependency and exploratory broader strict-typing attempts are not full-tree qualification; the final repository-required checks above are independently rerun. Native Windows, final packaged Workspace and whole-release qualification remain separate.

Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
… HTTP

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.

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

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

动机 / Motivation

从待办进入评审材料的维护者,以及消费状态投影的CLI、dashboard和Agent。 canonical切换后状态读取不再走Markdown Todo parser,原先随parser派生的review_materials丢失,已有评审材料入口没有链接。 链接由canonical任务正文重新派生,当前文件存在性可回读;陈旧展示任务不接管链接,本地绝对定位符不进入公开链接元数据。 不增加能力、配置、持久字段、任务权限、配额、启动、结算或新的UI流程。 审阅绑定 f3cf74f5f134f850fc6db9ec282aeb4c2226d344。这里解决的是现有评审输入路径的缺口;没有据此推断模型任务效果、长程成本或完整发布质量。

改动思路 / Approach

复用现有material resolver和public-safety owner,在已有status IO投影层补齐派生;TS仍持有Todo状态与决策。 现有canonical状态和material resolver足够,派生链接留在本地IO投影层。 四个既有文件只修复链接派生、公开元数据边界及其真实验证。 原parser仍归显式源读取和迁移使用,普通status继续先读取canonical provider。把旧parser重新插回status会让展示文件成为另一个任务来源;把链接保存到authority又会重复状态并冻结文件存在性。这两种方案都不合适。现在只从当前任务的正文派生已有字段,沿用已有路径解析、限定根目录和公开边界。不存在材料引用的任务不增加元数据,不添加配置或新的前端操作。

我还核对了现有dashboard的reviewMaterialSchema、状态Markdown消费者和HTTP材料读取入口。它们已经认识review_materials,不需要新页面或前端私有决策。用户仍从原有待办进入材料;文件内容读取继续走原有HTTP权限与路径检查。此PR没有布局、渲染器、首屏组成或文案变化,所以不以截图代替真实后端资格;最终整版Workspace浏览器验证仍是独立发布门。

具体改动 / Changes

规范是 docs/status-data-contract.md,spec_revision=17b2a0f9b818dc6e6fe77ccc567b20ff91b3bc40:固定合同。STATUS-READ-ONLY implemented:读取不变更state和provider;CANONICAL-SOURCE implemented:真实File/SQLite和legacy/native记录格式都从canonical正文派生,陈旧、丢失、非法UTF-8展示不接管任务;PUBLIC-MATERIAL implemented:链接元数据剔除resolved_path与不安全本地定位符,真实HTTP继续拒绝越界和绝对路径请求。三项均由当前head的实际测试支持。

关键代码讲解

active_state_todo_fields先取得现有canonical快照及acceptance,再对已选择的user/agent summary行调用现有extract_review_materials。这是本地IO投影,TS仍负责Todo状态、筛选、分页和权限。缺失材料保留exists=false,而不是把材料缺失当成任务不存在。链接由当前canonical文本产生,展示文件中的旧链接不能覆盖它。

公开redactor仍复制summary/item/material后返回,保留canonical记录本身。它移除resolved_path,并使用已有public_safe_compact_text检查完整字符串;检查长度等于原字符串长度,避免截断后才漏检后部路径。原Todo正文与owner读取权限不由链接元数据过滤器重写。HTTP resolver依旧负责实际内容读取;一条链接不是额外的读取或写入授权。

现有observe_todo_acceptance只补类型签名,其分支和返回值没改,避免在适配层引入第二个决策owner。测试夹具显式完成canonical导入后才调用普通status;普通读取不会自动导入。没有新模块、协议、闭集词汇、重试、网络请求、持久链接索引或额外确认。

对主干的风险 / Risks

169项真实File/SQLite与legacy/native格式状态测试通过,四项新反例在修复前失败;最终真实HTTP smoke、Ruff、配置mypy、受影响调用方类型检查、6项direct及19项selected premerge、边界扫描和严格CQR通过。 原四项测试在补派生之前全部失败;补充绝对定位符的四项反例又暴露了元数据边界,修复后最终169项全过。不能拿最初happy path通过来证明隐私反例正确。文件删除后的exists=false、陈旧展示链接、原生record格式、provider不可用和文件/authority不变断言均保留。公开smoke通过真实status collector、Markdown和HTTP材料读取,并继续断言目录越界、绝对路径及本地路径泄漏拒绝。

配置的mypy范围和受影响status调用方类型检查通过;不声明未纳入配置的历史模块已完成全树strict类型清理。初次premerge因新worktree缺typescript开发依赖失败,安装锁定依赖后重新执行;最终6项direct与19项selected全部通过,未把环境失败记成历史通过。没有查询、轮询或等待PR CI。公开边界扫描和当前diff CQR通过。

最强风险是把展示文本重新引入权威路径,或把绝对路径放进新增链接字段;两个反例都直接覆盖这一点。运行成本只增加被选中任务上的既有引用解析与本地存在性检查,不引入网络、authority写入或深层材料内容读取;没有做延迟改进声明。回滚只需撤回派生与过滤,无数据迁移。本切片不是完整发布资格;原生Windows、最终整版页面和全树非配置strict类型检查未由此声明通过。

我的整体评价 / Verdict

APPROVE,goal_achieved,只指这个已有评审输入旅程的修复。long_horizon improved的范围是恢复了可实际读取的评审材料路径;user_experience improved的范围是不再要求用户另行手工定位同一材料。实际模型收益与完整整版资格仍未由此证明。bounded refactor applied:为现有acceptance适配器补类型边界,保留原有值和分支;没有新增框架。当前没有独立阻塞发现。作者自审用COMMENTED记录结论,合并仍必须由当前head readiness和维护者授权共同满足。

English verdict: APPROVE — f3cf74f5f134f850fc6db9ec282aeb4c2226d344. Restores existing review links from canonical Todo text, preserves authority and stale-display isolation, and removes private locators from public link metadata. All169 provider/record status cases, the real HTTP smoke, configured type checks, Ruff,6direct+19selected premerge,boundary and CQR pass. Whole-release, native Windows and packaged UI qualification remain separate.

@loopx-agent
loopx-agent merged commit 8acdb88 into main Oct 27, 2026
4 of 6 checks passed
@loopx-agent
loopx-agent deleted the codex/fix-canonical-review-materials-20261027 branch October 27, 2026 09:26
@loopx-agent

Copy link
Copy Markdown
Collaborator Author

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

Request changes conclusion (author-owned PR; GitHub blocks formal self-review)

Post-merge audit — exact head f3cf74f5f134f850fc6db9ec282aeb4c2226d344; merge 8acdb88d32b6cad5b43670c99647341545f435cd.

动机 / Motivation

在任务状态中打开评审材料的用户会遇到此问题。原 canonical 状态没有材料入口;本次恢复了短正文中的链接,但普通长正文末尾的同一链接仍消失。材料入口缺失会迫使用户重新寻找原文,任务本身仍然存在。真实 File、SQLite 的 status CLI 均恢复了 36 字符正文中的锚点链接;755 字符正文被压成 500 字符后,材料列表仍为空。本审计只判断状态材料入口和公共边界,不把单元测试通过视为完整产品验收,也不授予合并、安装或模型执行权限。PR 在独立审阅期间已合并,因此这里发布新反例的 post-merge audit,保留既有作者评审与讨论。

改动思路 / Approach

修复沿用已有 local Markdown resolver 和 public-safety owner,让状态读取从 canonical Todo 派生材料可用性,避免陈旧 Markdown 覆盖权威任务。这个 owner 选择合理,无需增加材料索引或第二份可写状态。但当前把展示摘要当成完整输入:先按默认 500 字符截短,再提取路径。更小且正确的修复应在同次已读的 canonical records 上派生材料,然后保留有界摘要与原过滤器。

架构判断为 retain:provider IO、材料解析和公共过滤分别沿用原 owner。当前 PR 边界是恢复既有状态材料入口,不修改 Todo 写入、调度、权限或持久化 schema;本反例仍需要在这个边界内修复。下表来自实际 CLI 结果,字符长度按 Python 字符计数:

同一合成输入,File / SQLite base 当前 head
36 字符正文,含 [Review](docs/review.md#proof) 无材料 exists=true、anchor=proof
755 字符正文,同一合法链接位于末尾 无材料 摘要 500 字符,仍无材料

具体改动 / Changes

完整 diff 为 base 17b2a0f9b818dc6e6fe77ccc567b20ff91b3bc40 → head f3cf74f5f134f850fc6db9ec282aeb4c2226d344,4 文件 +66/-2;并核对全部 4 个文件及 resolver、Markdown consumer 在实际 merge 8acdb88d32b6cad5b43670c99647341545f435cd 的 blob 与 head 完全相同。没有把最初旧 head 的验证直接套到新版。

规范 spec_ref=docs/reference/protocols/todo-detail-cold-path-v0.md,spec_revision=17b2a0f9b818dc6e6fe77ccc567b20ff91b3bc40。Hot-Path Reference:implemented,状态保持有界引用和原身份,没有展开完整任务;Paging Rules:本 PR 未改 cold-path,完整 canonical 任务仍由原 detail owner 保留,不要求把全文塞进 status。上述规范支持保留摘要预算,并不规定任意长材料列表。本次缺口另由既有 extract_review_materials 的完整输入语义及 PR 明确恢复 canonical text 材料入口的目标证明;不把未来 RFC 属性升级为新义务。

关键代码讲解

active_state_todo_fields 的 123–124 行 遍历 canonical["_todo_fields"] 的 summary items,再将 todo["text"] 交给 extract_review_materials。这些 items 已经由现有 typed projection 限制为 500 字符,完整 canonical todos 却仍有 755 字符。因此链接在截断位置后就不会被 resolver 看到。

_redacted_status_todo_fields 删除 resolved_path,并以现有 public-safety 函数过滤不安全的材料值;新版的绝对路径材料 metadata 已被移除,本审计不重复报告旧 head 的已修问题。observe_todo_acceptance 只增加签名类型,未改变接受判断;既有 extract_review_materials 继续负责 Markdown/锚点去重、本地根目录及存在性判定。测试和原 smoke 改用真实 canonical authority,覆盖陈旧 display、短正文材料及 HTTP readback。

对主干的风险 / Risks

[P2] 从完整 canonical 正文提取材料,避免摘要截断吞掉入口

触发条件是合法材料链接位于较长任务正文末尾。独立合成任务为 "Long " + "context " * 90 + "[Review](docs/review.md#proof)",完整正文 755 字符;在实际 python -m loopx.cli --format json --registry <synthetic-registry> --runtime-root <synthetic-runtime> status 中,File、SQLite 两个 backend 都返回 500 字符摘要且没有 review_materials。同批 36 字符 control 正常返回材料,实际文件存在,链接锚点有效,canonical records 与陈旧 display 在读取前后均未变化。用户仍无法从这一状态入口访问已经提供的材料。

定位为 active_state_todos.py:123–124。从已经读取的完整 canonical records 按 role/todo_id 关联材料,在摘要截断前派生 review_materials,再沿现有 redactor 输出;保留摘要预算、身份和只读边界。在现有 canonical status 测试中加入这组长正文和短正文 control,对两个 backend 运行真实 CLI,并断言晚出现的路径、anchor、exists 与 authority/display 不变;可再运行 uv run --extra test pytest -q tests/control_plane/test_canonical_status_todos.py 和 uv run --extra test python examples/user-todo-review-material-smoke.py。现有 169 项测试、原 smoke、Ruff、配置内 17 文件 mypy 和 premerge 的 6 direct + 19 selected 均 PASS,但没有覆盖这个反例。独立语义 oracle 为 FAIL,change-quality receipt 也为 FAIL,不能被绿测试覆盖。

该问题在 base 没有材料入口时同样存在,结论是本次恢复不完整,不声称它新破坏了一个原本可用的长正文入口。遍历越界路径返回 exists=false,缺失文件返回 exists=false,外部 URL 不作为本地材料;这些负例和无副作用断言在两条真实 CLI 路径成立。没有新增 feature flag 或 default-off 承诺,材料探测默认随 status 运行;可用性不是自动阅读、执行或写入授权。

我的整体评价 / Verdict

REQUEST_CHANGES 为代码质量结论,发布动作为 POST_MERGE_AUDIT_COMMENT;保留一个可操作 P2。此为合并后评论,不是 GitHub 正式阻塞 review。problem_context=not_yet_proven:短正文已有可验证改善,完整恢复目标仍被长正文反例否定。long_horizon=preserved 指任务身份、原事实和后续生命周期没有被改写;user_experience=not_yet_proven 指材料入口的普通长正文路径仍未完成,需上述最小修复后复评。

visual_review=not_applicable:逐文件检查没有 JSX、布局或样式改动,本次验证的是 CLI/Markdown/HTTP 材料数据,不声称渲染页面、安装态或真实模型行为合格;这些范围仍未验证。代码量和 owner 放置适当;同域简化应直接利用已读 records,避免新增索引、第二次 provider 读取或放宽摘要预算。公共材料字段沿用既有 vocabulary,没有新的生命周期/authority 协议,也没有将观察性信息当成强制义务。未查询、等待或轮询 CI,未撤回他人评审,也未执行合并。

English verdict: REQUEST_CHANGES f3cf74f; fix the P2 loss of late material links before claiming complete canonical-text restoration.

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