Repository navigation
fix(chat): respect each Goal source runtime in workspace status - #7577
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)
当前完整 head 9a33a402b1fd7526411fe68213f0171bc1b96578:APPROVE。真实 File/SQLite HTTP 对照证明来源读取恢复,并拒绝共享目录的同名诱饵。
动机 / Motivation
在多项目工作台查看不同 Goal 的任务及交付状态的操作者。
Goal 的真实任务位于自己声明的来源目录,Chat 却把协调目录当成强制覆盖,导致有效任务显示不可用,源失效时还可能读取共享目录的同名诱饵任务。
修复后状态与交付任务图都沿原来源读取,源失效时拒绝借用共享任务,修改来源后无需重启即可读到新任务。
本次只修正原状态读取调用,不改变任务权威、启动执行、安装 App 或增加新的设置流程。
改动思路 / Approach
现有 collector 与 Todo reader 已有逐 Goal 来源规则;让这个调用者停止传入协调目录的显式覆盖即可,无需复制路由、同步任务或另建配置。
完整切片是现有 Chat 状态与 delivery review 的来源读取,七行生产新增即可交付;原未绑定注册表的本地回退保留。
Chat 的历史目录与 Goal 权威目录可以不同。已声明 registry runtime 时返回 None 只表示让原 reader 按来源解析;它不表示没有来源,也不选另一个默认权威。没有注册来源的情况继续从既有controller/本地目录回退。源缺失、不兼容或错Goal仍由原路由拒绝,不从页面或任务标题猜来源。
具体改动 / Changes
完整两文件 +110/-1:生产 +7/-1、真实HTTP测试 +103。没有schema、生成文件、前端布局、安装或权限配置变化。独立diff merge base为 d415feded4162417b298f58814758a2daf91b4ed;GitHub当前base tip与merge base不是同一个概念,比较使用不可变祖先。
关键代码讲解
_status_runtime_root读取当前discovery registry。common_runtime_root有声明时不给collector强制协调root;未绑定情况保留原fallback。每次读取重查来源,不缓存过时选择。_goal_task_map消费同一选择并调用既有list_goal_todos,让delivery review和状态属于同一来源。不可读任务图仍沿原错误边界处理,不生成空权威。test_status_reads_source_authority_without_creating_a_chat_copy与拒绝/切换用例使用真实HTTP及File/SQLite,断言原registry、Markdown和canonical记录不变,并检查没有在共享root创建第二份Task。fixture复用既有source-route测试,不复制provider实现。
规范依据:spec_ref docs/reference/configuration-backup.md,spec_revision d415feded4162417b298f58814758a2daf91b4ed。采用其既有canonical来源原则:source_registry → implemented,来源由原注册表owner提供;common_runtime_root → implemented,真实runtime来自source,源不可用不拿共享同名数据替代。本次不将备份操作、迁移或完整恢复作为状态bug修复的额外前置。
对主干的风险 / Risks
同一fixture内容和同一pytest命令,独立base/head结果如下。测试的预期来自真实Task身份、原来源和拒绝义务,没有用新实现生成expected值。
| 场景 | 不可变基线 | 当前head |
|---|---|---|
| 完整与单Goal状态 / delivery任务图 | 来源任务缺失、503或无正确任务 | 原来源任务可读 |
| 缺失/不可读/错误Goal + 共享诱饵 | 仍返回200并读取共享数据 | 明确拒绝,不含诱饵 |
| 修改source runtime后再次读取 | 初始来源就不正确 | 无需重启,读新任务 |
| 全部14项真实HTTP/File/SQLite oracle | 14 failed | 14 passed |
PASS:195项相关Python回归;另一次相同14项匹配对照通过。原状态、路径脱敏、workspace-directory、HTTP scope和未绑定Chat回退仍通过;权威记录及原文件不变。Ruff、配置内17文件 mypy、完整 control-plane TypeScript typecheck、diff、DCO、双语差分和明确路径公共边界扫描均通过。 标准 premerge 四项 direct、Python compile 和五项 catalog canary 通过,零失败/人工 hold,严格 CQR 有效。
原collector和Todo router的显式CLI诊断override没有改变;这里修的是Chat把已经解析的协调root误传为强制override。读取没有触发模型、任务执行或扣额,不要求用户复制状态、重输Goal或增加确认。多项目混合来源、失效恢复和source重读由原owner负责,无新Python领域决策或平行truth。
新增测试有真实状态/恢复价值。相邻source-route测试保护CLI和manager入口,原Chat HTTP回归补上了调用者此前缺失的链路;没有理由为这个七行修复建立新配置或重写路由。未抓取、轮询或等待GitHub CI,也没有把远端CI状态作为评审缺口。
我的整体评价 / Verdict
现有 collector 与 Todo reader 已有逐 Goal 来源规则;让这个调用者停止传入协调目录的显式覆盖即可,无需复制路由、同步任务或另建配置。
完整切片是现有 Chat 状态与 delivery review 的来源读取,七行生产新增即可交付;原未绑定注册表的本地回退保留。
long_horizon:preserved,原Task、来源、调度与一次结算责任未改;连续来源切换不会新增任务副本。user_experience:improved,原入口恢复正确任务并准确拒绝不可用源,零额外输入或授权轮次。已检查 chat_status_api.py 的状态与任务图入口及完整 diff;没有页面、布局、文案或样式变化,视觉改动评审不适用。 未验证范围:验证边界为源码 HTTP 服务与真实隔离 File/SQLite;已安装 App 的采用、全套 pytest、真实模型和长程净收益未在本轮资格。
修改复用既有typed来源词表和owner,没有新增共享状态或prose分类,bounded refactor判断为无需进一步扩展。批准只适用于当前准确head和上述源码验证,不代表正式App已经采用、全套平台资格或merge权限;合并另按原生readiness及维护者授权办理。
English verdict: APPROVE — the original Chat status and delivery-review callers now preserve each Goal's canonical source route. Matched real HTTP/File/SQLite failures are repaired, source-loss decoys are refused, and the unbound fallback remains covered.
多项目工作台的 Goal 可以声明不同的 source_registry/runtime。Chat 状态接口却将全局协调目录作为显式 runtime override 传给读取入口,覆盖了已有的逐 Goal 来源路由,导致有效源存储被误判为需要升级。
本次让已声明 common_runtime_root 的注册表继续使用现有 collector 和 Todo reader 的来源路由;未绑定注册表的 Chat 保留原有本地目录回退。工作台状态与 delivery review 的任务图沿同一规则读取。
验证:
此改动只调整现有读取入口,没有界面布局、文案或样式变更,因此不附新的视觉设计稿。验证边界是源码 HTTP 服务与真实隔离存储;本 PR 不声称已升级安装中的 App,未运行完整 pytest 套件。