Repository navigation
fix(collaboration): recover archived linked work in request readback - #7836
Conversation
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
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.
Goal And Delivered Outcome
归档已完成的关联任务后,
todo list --todo-id能读到done,但接收方 Inbox 和现有委派详情却把它显示为不可核验,给出recover_evidence。原因是协作读回只查询活动队列。本 PR 保留活动队列缓存,对当前请求明确关联、但未在缓存中的任务复用 Core 的精确查询。真实 File / SQLite CLI 在基线均复现失败,修复后读回
done,接收方提示回传结果;原请求仍欠结果,任务完成不会被当作回复已经送达。loopx-project/loopx:main。实现基线73c5daab342afe8aa6c1a85dc92bc0bf352d9132;提交前已获取最新 main,后续 main 提交未改本 PR 三个路径。Author Declaration
Implemented against
docs/architecture/rfcs/loopx-overall-roadmap-v0.md§R3、docs/architecture/rfcs/controller-executor-unified-contract-v0.md§9 / C6,读取版本均为73c5daab342afe8aa6c1a85dc92bc0bf352d9132。本修复仅覆盖已有协作入口的关联任务读回,不宣称完成 C6。collaboration/links.py::_core_todos,read_linked_workdone,保留 answer owed,之后通过原请求返回实际结论;两种本地后端Scope And Continuation
完整范围为已有协作读回中的归档记录恢复;同一观察内缺失记录只查一次,避免全量读取归档。独立可回退的 adapter 修复,无数据迁移。
当前 manager-context / CLI / MCP / App 入口继续复用同一 reader。受限受众继续仅看到引用。完整 C6/C8、source-session Core Todo 支持、安装后自然使用、真实接收方采纳与完整成本收益保留给原有交付序列。
Validation
91008a1cd42358dfac7965781f5d5c73f9527010;提交前测试使用相同源码。done/return_answer并保留欠结果状态done且仍“待结论”git diff --check、双语 RFC diff 检查、diff-scoped semantic advisory(没有支持的新 carrier);npm run build:chat成功,现有 chunk 大小警告仍保留uv run --extra test loopx canary premerge --from-git-diff --git-diff-base origin/mainstandard:直接检查、编译、2 catalog canaries、8 risk smokes 全通过;不授予 merge 权限test_collaboration_goal_instance.py时,test_lost_answer_readback_cannot_invent_or_rebind_a_commitment[ambiguous_route]失败;独立隔离基线/候选各一次均在相同断言失败。该无关联 Todo 的既有路由歧义问题未修复,不将整套测试称为全绿夹具修正成本:最初归档 CLI 误用了不支持的参数,已纠正并与真实基线失败区分。浏览器最初采用的
source_session_v1项目不能走通通用 Core Todo 写入口;改用与已复现问题一致的隔离peer_v1consumer fixture 后完成上述读回。本 PR 不改变该 profile 边界,也不把初始失败记成产品通过。Visual Evidence
Type of Change
LoopX Area
无 merge、安装或发布操作;等待独立 exact-head review 与 CI。