Skip to content

fix(collaboration): recover archived linked work in request readback - #7836

Merged
huangruiteng merged 1 commit into
mainfrom
codex/inbox-archived-work-20261101
Nov 1, 2026
Merged

huangruiteng merged 1 commit into
mainfrom
codex/inbox-archived-work-20261101

Conversation

@loopx-agent

Copy link
Copy Markdown
Collaborator

Goal And Delivered Outcome

归档已完成的关联任务后,todo list --todo-id 能读到 done,但接收方 Inbox 和现有委派详情却把它显示为不可核验,给出 recover_evidence。原因是协作读回只查询活动队列。

本 PR 保留活动队列缓存,对当前请求明确关联、但未在缓存中的任务复用 Core 的精确查询。真实 File / SQLite CLI 在基线均复现失败,修复后读回 done,接收方提示回传结果;原请求仍欠结果,任务完成不会被当作回复已经送达。

  • Outcome basis: 可独立复现的归档读回缺陷;整体 roadmap R3 的原请求/接收方状态读回边界。
  • Intended base: loopx-project/loopx:main。实现基线 73c5daab342afe8aa6c1a85dc92bc0bf352d9132;提交前已获取最新 main,后续 main 提交未改本 PR 三个路径。

Author Declaration

  • Written by: model_agent — OpenAI Codex (GPT-6 family).

Implemented against

  • Specification: docs/architecture/rfcs/loopx-overall-roadmap-v0.md §R3、docs/architecture/rfcs/controller-executor-unified-contract-v0.md §9 / C6,读取版本均为 73c5daab342afe8aa6c1a85dc92bc0bf352d9132。本修复仅覆盖已有协作入口的关联任务读回,不宣称完成 C6。
Criterion Disposition Symbol / path Evidence
明确关联任务的状态来自当前 Core authority implemented collaboration/links.py::_core_todos, read_linked_work 真实 CLI 创建→关联→完成→归档→精确读取→Inbox 读取,File / SQLite 均验证;读取不改变 authority revision 或 links
接收方拥有权、缺失证据和受限受众边界 implemented 同上及既有生命周期 scope 活动/历史任务混合、两条请求共用观察缓存、精确查询失败/缺失、后续观察恢复、换 owner 拒绝及受限受众测试
归档任务完成不能代替原请求结果返回 implemented 既有接收方建议及 manager-context 返回路径 同一长连接 MCP 进程中归档后读取 done,保留 answer owed,之后通过原请求返回实际结论;两种本地后端
完整控制器/执行器交流、真实反馈采纳与长程收益 out_of_scope 现有 C6/C8 原 owner 这些验收保持开放,本 PR 不产生资格声明
  • Self-check: 阅读现有 typed owner,沿用 Python IO adapter 与 TS 接收方决策;没有新枚举、CLI 参数、配置、存储 provider 或第二套状态机。新增精确查询与正/负缓存都有当前调用方。

Scope And Continuation

完整范围为已有协作读回中的归档记录恢复;同一观察内缺失记录只查一次,避免全量读取归档。独立可回退的 adapter 修复,无数据迁移。

当前 manager-context / CLI / MCP / App 入口继续复用同一 reader。受限受众继续仅看到引用。完整 C6/C8、source-session Core Todo 支持、安装后自然使用、真实接收方采纳与完整成本收益保留给原有交付序列。

Validation

  • Tested revision: 91008a1cd42358dfac7965781f5d5c73f9527010;提交前测试使用相同源码。
  • Run state: finished.
  • Input classes: synthetic, public_fixture;生产现象只作只读诊断,未修改活动工作状态。
  • Environment: Python 3.14.8 / Node 24.21.0 / SQLite 3.53.1;File 与 SQLite 均为隔离真实 provider。
Check kind Result Evidence / limitation
regression_parity passed 正确夹具在未改动基线产生 File / SQLite 两个真实归档状态失败;候选恢复 done / return_answer 并保留欠结果状态
integration / real_backend passed 扩大 manager-context owning suites 中 209 项通过;两项长连接 MCP 测试完成归档断言后因旧活动计数断言失败,改成“仅 foreign 仍活动、own 可精确读归档”后两项均通过
unit passed 缓存、未知 ID、精确读取不可用/恢复、换 owner 及现有受限受众边界;新的缓存负例单独通过
real_entrypoint passed CLI 和长连接 stdio MCP 使用真实 File / SQLite;App 现有“委派→关联工作与记录”使用打包 Chat 与隔离 SQLite 后端,显示 done 且仍“待结论”
manual / recovery passed App 13 条混合请求、199 条前置历史;读取失败显示“暂时无法核验/记录数量未知”,重试恢复;1440×1000 与 390×844 检查,无页面横向溢出,窄屏可滚动读关联结果;读取不改源记录或聊天,不调用模型或外部消息
static / packaged passed Ruff、git diff --check、双语 RFC diff 检查、diff-scoped semantic advisory(没有支持的新 carrier);npm run build:chat 成功,现有 chunk 大小警告仍保留
real_entrypoint passed uv run --extra test loopx canary premerge --from-git-diff --git-diff-base origin/main standard:直接检查、编译、2 catalog canaries、8 risk smokes 全通过;不授予 merge 权限
integration failed 扩大到 test_collaboration_goal_instance.py 时,test_lost_answer_readback_cannot_invent_or_rebind_a_commitment[ambiguous_route] 失败;独立隔离基线/候选各一次均在相同断言失败。该无关联 Todo 的既有路由歧义问题未修复,不将整套测试称为全绿
real_backend not_run PostgreSQL 实例未运行;未修改 authority store / provider,实现复用已有 canonical 精确读取,不宣称 PostgreSQL 本次资格

夹具修正成本:最初归档 CLI 误用了不支持的参数,已纠正并与真实基线失败区分。浏览器最初采用的 source_session_v1 项目不能走通通用 Core Todo 写入口;改用与已复现问题一致的隔离 peer_v1 consumer fixture 后完成上述读回。本 PR 不改变该 profile 边界,也不把初始失败记成产品通过。

Visual Evidence

  • UI impact: none;无前端源码、布局、文案或首屏修改。改变的是已有详情中的后端任务状态。
  • First viewport / preview: N/A;验证为上述 synthetic packaged journey,不是 installed 资格。桌面和窄屏实查 existing details、加载失败与重试;合成截屏仅作验证,未上传本机操作环境。
  • Attention review: 原请求、约束、验收、回传要求保留在原层级,关联任务在现有展开项内;列表仍显示待结论,失败时撤回数量确定性。

Type of Change

  • Bug fix
  • Test update

LoopX Area

  • Capability or extension (manager-context, builtin local adapter)
  • Control plane (collaboration readback)

无 merge、安装或发布操作;等待独立 exact-head review 与 CI。

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: model_agent; gpt-6.1-sol; OpenAI; runtime_reported; reasoning effort: max

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

动机 / Motivation

接收方已完成并归档明确关联的任务后,需要从原请求继续核验工作并回传结论。

基线的 Inbox 只看活动队列,把仍存在的归档任务显示为未知并要求恢复证据;候选复用精确查询读到完成状态,提示回传答案,避免接收方重复调查或重建工作。

File 和 SQLite 的真实 CLI 及长连接 MCP 都能在归档后读到 done,同时保留 answer_owed,完成任务不会被误当作答案已经送达。

本 PR 只恢复已有请求的关联工作读回;不授予任务写权限,不改变 audience、Goal lifetime 或返回状态机,也不宣称完成 C6/C8、安装后自然采纳或长期成本收益。

改动思路 / Approach

复用已有 Python IO adapter 和 Core 精确查询即可纠正假缺失;状态、权限和接收方建议继续由现有 typed owner 决定,不需要第二份任务状态或新的协议。

当前 PR 只在一次观察内补读明确关联且不在活动缓存中的 ID,并维持原有受众、生命周期、owner 和结果返回边界。

实际路径是“原请求采纳并关联工作 → Core 完成和归档 → 现有 Inbox / MCP 读回 → 接收方返回实际结论”。不改动时,真实任务会卡在假缺失;扫描所有历史或把任务状态复制进 links 都扩大成本与维护面。当前做法保留一次活动队列缓存,对明确缺失的关联 ID 最多精确读一次;失败也只在本次观察缓存,下一次读取可以恢复。受限受众在 Core 查询之前返回引用,仍不会得到私有标题或状态。

具体改动 / Changes

完整 head 91008a1cd42358dfac7965781f5d5c73f9527010;实际 merge base 为 73c5daab342afe8aa6c1a85dc92bc0bf352d9132,没有拿队列 base tip 替代合并基线。独立规范是 docs/architecture/rfcs/loopx-overall-roadmap-v0.md 的 R3(版本 73c5daab342afe8aa6c1a85dc92bc0bf352d9132):本地 work/result/answer 分离和原请求读回边界 implemented。另读同版本 docs/architecture/rfcs/controller-executor-unified-contract-v0.md §9:C6 的真实采纳、独立验收和完整回传资格 out_of_scope,不能从这里的存储修复推导完成。

关键代码讲解

  • _core_todos,L17:复用 list_goal_todos(todo_id=...),只补当前显式关联而不在活动缓存中的 ID;返回 ID 必须相符,读取失败缓存为本次未知,不导出完整历史。
  • read_linked_work,L42:一个 Goal 的缓存已建立后,后续请求缺少的历史 ID 仍会补读;Goal lifetime 和 claimed_by / bound_agent 校验继续决定可见性,换 owner 时不暴露标题。
  • link,L107:同一精确查询也用于关联归档的自有工作;未找到、其他 Goal 或其他接收方的任务仍拒绝。link 继续只存引用,没有新增任务状态写入。

对主干的风险 / Risks

独立复跑的完整 tracking / MCP 两模块 PASS,25 passed,覆盖实际 File / SQLite CLI 以及同一长连接 stdio MCP 中的完成、归档、读回和真正 return_result。将相同 CLI 夹具放到独立基线,两种 provider 都在归档断言失败;候选均通过。每种 provider 的归档前三次完整 receiver JSON 保持一致;只统一了生成 ID、临时目录与时间戳,没有去掉诊断、义务或字段。归档后完整 JSON 仅在关联任务的 source/status/title 和 step 四处改变,answer_owed=true 及“不以 Todo 状态确立请求完成”的说明保持原样。

失败方向也有实测:无关/未知/其他 owner 的关联拒绝且原 link 不变;暖缓存后的新历史 ID、重复缺失 ID、受限受众和 owner 改变均覆盖。另在真实本地 provider 的公开 Inbox 读路径注入精确 IO 失败,得到 unknown / recover_evidence,恢复 IO 后新一次读回 done / return_answer;关联文件字节不变。加入 21 条新的无关请求并切换 12 条/1 条分页,目标完整记录和 followthrough 不变,未把无关任务纳入其完成判断。

扩大到 handoff / Goal-instance 的整组诊断仍是 FAIL:基线 140 passed / 1 failed,候选 142 passed / 1 failed。唯一失败为 test_lost_answer_readback_cannot_invent_or_rebind_a_commitment[ambiguous_route],重复路由使原 Chat 卡片重复。相同单项命令在两个不可变版本均失败,完整 actual/expected 消息差异在只统一随机 ID、时间后完全相同,保留重复次数;该夹具没有关联 Todo,因果路径属于未改动的 presentation,现有 #7842 也针对这一边界。本 PR 没有修复它,不能把扩展套件记成全绿。

PASS:Ruff、semantic advisory、standard premerge 的 6 项直接检查、2 项 catalog 和 8 项 risk smoke。没有新 Enum / Literal / 协议词表;advisory 的零候选只说明所支持 carrier 的扫描结果。未查询、轮询或等待 CI;未运行 PostgreSQL 实例,本补丁未改 authority store / provider 持久化,不宣称本次 PostgreSQL 资格。

我的整体评价 / Verdict

APPROVE:独立证据证明已有用户任务能在归档后继续核验和回传,且没有把“任务完成”扩张成“请求已回答”。这是完整且可回退的读回缺陷修复;无须第二套状态、配置入口、额外确认或无关 TypeScript 重写。局部长程恢复与使用体验改善有实际路径证据,真实 Agent 采纳和完整成本收益仍未证明。

已检查既有 LinkedRequestWork 及 conversation-requests 数据入口;本补丁只纠正其关联记录状态数据,没有修改渲染、布局、文案或展开层级。本次没有独立复跑作者的 packaged 浏览器截图;installed App、Lark 实际送达、真实模型采纳及长期成本收益保持未验证。既有路由歧义失败保留为独立问题;本结论不授予 merge 权限。

English verdict: APPROVE — canonical exact reads restore archived linked work while preserving recipient scope and the separate owed result.

@huangruiteng
huangruiteng merged commit 3d4016c into main Nov 1, 2026
30 of 40 checks passed
@huangruiteng
huangruiteng deleted the codex/inbox-archived-work-20261101 branch November 1, 2026 21:33
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.

2 participants