feat(chat): coordinate governed teams with inline Goal LoopX mode - #4700
Conversation
huangruiteng
left a comment
There was a problem hiding this comment.
Request changes conclusion (author-owned PR; GitHub blocks formal self-review)
审阅对象:PR #4700,exact head 49365ab934ce804b034e99f5a91b3bd3afe8af56,base main。本次审阅该 exact head 的完整增量(11 files, +1032/-16)。
动机
Goal Chat 此前每条消息只消费一个上游 turn,因此"在同一条对话里继续推进 Codex 原生工作"没有明确、有界的位置:operator 要么逐条重发、丢失 objective 与累计用量,要么把工作挪出对话,于是对话本身的状态、中断与刷新入口都无法描述正在进行的工作。这个 PR 要解决的就是这件事:在既有 Goal Chat 里加入显式的原生 Goal 续跑(/goal start --tokens N OBJECTIVE、/goal status、/goal resume --tokens N),同时保留原对话、流、运行控制与历史作为唯一用户界面。
值得注意的是它没有扩权:原生 complete/blocked/paused/budgetLimited/usageLimited 都被定义为 host 观察,不会完成 LoopX 的 Goal/Todo,也不提供 action/handoff receipt;文档明确声明不构成 Lark/Ark/DSH 的续跑对等。这是一个完整可用的增量,而不是把调度器搬进 Chat。
改动思路
复用既有 owner,把"监督"与"LoopX 编排"分开:
- 新驱动
loopx/chat_codex_goal.py只做 Codex 传输监督:命令文法与激活校验、thread/goal/get|set激活/暂停/恢复、单次 Chat turn 内观察多个原生 turn、把 stale 通知降级为"重新读取权威状态"而不是生命周期判定、在原生 limit 时中断在飞工作、在 completion 先到时保留最终回答。文档里明确"没有业务阶段脚本、没有第二个 LoopX 调度器"。 - 会话/准入层(
loopx/chat_runtime.py)负责"谁能激活":submit_turn先做命令解析与validate_goal_chat,_run_turn再要求conversation_scope == owner_goal,因此外部排队输入、attached host、manager/task 通道、非 Codex endpoint 都被拒绝,而不是被悄悄接管。 - 激活前先写会话绑定(
upstream_mode=chat_native_goal),恢复时先暂停原生 Goal 再接受新工作,绝不 fork 或重置;协调上下文/工具升级时保留原生会话绑定(显式新建 Session 才换工具),与合并后的 #4696 作用域交接边界不冲突。 - 共享发送循环里修正 turn 绑定顺序:只有当事件 turn id 与已知 turn 不一致时才丢弃,且不再让 stale
turn/started反向改写已知 turn——这样恢复原生 Goal 后残留的历史通知不会把旧输出漏进普通消息。 - 模型/effort 默认值改为跟随实际选中的 endpoint(显式 override 与机器默认仍保持优先级),避免"选了 A adapter 却按 B endpoint 解析默认模型"。
具体改动
运行时代码:loopx/chat_codex_goal.py(+322,新增驱动:parse_native_goal_command/validate_goal_chat/NativeGoalStatus/CodexGoalDriver.run|pause|_observe|_response);loopx/chat_runtime.py(+75 左右)在 adapter 上挂 goal_driver、interrupt_turn/close_session 先暂停、准入与作用域校验、激活前写 upstream_mode、恢复时暂停、上下文升级保留绑定、endpoint 感知的默认值;loopx/chat_agent.py(+6/-2)调整 turn 事件绑定顺序;loopx/chat_manager.py(+5/-2)让已选 endpoint 决定默认模型/effort。
文档:新增 docs/reference/goal-chat-continuation.md(+101,包含命令语义、token 含义、暂停/恢复/回滚规则与作用域边界),并更新两份中英双语 RFC(执行模式、桌面执行前端)。
测试:新增 tests/test_chat_codex_goal.py(+428,覆盖普通消息不激活、非法命令无 host effect、错误绑定拒绝、多 turn 与 stale 通知调和、resume 保留 objective 与用量、丢失激活响应后的调和与暂停、超时暂停、暂停失败关闭已接管传输、原生响应不提供 action/completion 权限、replay 复用既有 turn、恢复暂停同一 thread 不分叉、激活前 Stop、普通发送忽略历史 turn、预算上限中断在飞工作、外部排队输入不可激活)与 tests/test_chat_executor_profile.py(+74)。
关键代码讲解
parse_native_goal_command/validate_goal_chat:文法锚定、token 上限 2^31-1、objective ≤3000 字符、resume不接受 objective;激活要求 managed Codex endpoint、非 attached_host、channel_id == goal.<goal_id>、无附件。普通消息直接返回 None,因此"默认关闭"是产品级事实而非文档承诺。CodexGoalDriver.run:先 drain 旧事件、再写绑定、再激活(journal-before-effect);resume要求既有状态非 active/complete 且预算大于已用量;start拒绝静默替换未完成的原生 Goal;异常路径_stop_owned_transport_on_failure会暂停,暂停失败则关闭自己拥有的传输,避免留下无人观察的原生 Goal。_observe:只消费当前 turn 的事件;thread/goal/updated只触发一次权威读取;turn/completed(failed)与非重试error转成 typed 终态错误;终止条件要求"无在飞 turn 且队列为空",因此 completion 先到不会截断最终回答;原生 limit 会立即中断而不是再等一次请求。_response:把 host 事实(status/tokenBudget/tokensUsed)写成 note,并强制proposals: []、protected_action: None,非终态时给出host_tool_gate与恢复提示——即"原生完成不等于 LoopX 验收"在响应结构上可见。_run_turn的原生分支:先判owner_goal作用域,再写upstream_mode,再挂 driver,最后在finally清掉 driver;这段是"仅本地 owner 可激活"的落点,也是下面阻断问题所在的位置。
对主干的风险
这个 PR 触及共享的 Chat 发送循环与 adapter 生命周期,因此风险必须逐条看:
- 默认关闭与隔离:只有
/goal命令构造 driver;外部排队输入在submit_turn即被拒(测试断言status == failed、错误指向 local owner、host calls 为零);attached host、manager/task 通道、非 Codex endpoint 均被拒。 - 不泄漏:共享循环的改动是"丢弃与本 turn id 不一致的事件",并阻止 stale
turn/started反向改写已知 turn(test_ordinary_send_ignores_historical_native_turn_started断言旧 turn 输出不会进入普通回答)。 - 不留孤儿:Stop/超时/错误/恢复都走暂停;恢复路径按精确 thread 暂停而非分叉;协调上下文升级保留绑定。
- 不越权:响应结构上
proposals为空、protected_action为 None,且文案说明 LoopX 验收不变;文档明确 limit/complete 都只是 host 观察。 - 回归面:
tests/test_chat*.py全量 296 个测试在该 head 通过,覆盖既有 Chat 运行时/服务/agent 路径。
阻断发现 [P1]:loopx/chat_runtime.py:777 与 loopx/chat_runtime.py:1191 用 assert isinstance(adapter, CodexAppServerAdapter) 表达"只可能是 Codex adapter"这一不变量。问题是它既不是强制,也不是好的失败方式:在 python -O 下断言整体消失,driver 会在非 Codex adapter 上继续执行、随后以无关的 AttributeError 失败;在正常运行时 AssertionError 会被外层 except Exception 吞掉,被报成通用 resume_failed/turn 失败,掩盖真正的编程错误。这不是风格问题——本仓库自己的质量门禁在该 head 上正是因此失败:SonarCloud 对这两行报两个 CRITICAL BUG(python:S5779),质量门禁结论为 D Reliability Rating on New Code (required >= A),loopx pr-review --check-merge-readiness 4700@49365ab934ce804b034e99f5a91b3bd3afe8af56 因此返回 ready=false(status_checks_failed、repository_merge_state_blocked,另有 head review 缺失)。
最小修复:把两处断言改成显式 typed 守卫,例如 if not isinstance(adapter, CodexAppServerAdapter): raise ValueError("/goal continuation requires the managed Codex endpoint in the existing Goal Chat.")(或复用既有 typed 错误),并保留恢复路径现有的 pause/close 行为;随后在新 head 上重跑质量门禁。回归测试:在 tests/test_chat_codex_goal.py 增加一个用非 Codex adapter 驱动 chat_native_goal 会话//goal 命令的用例,断言得到 typed 拒绝而不是 AssertionError。
非阻断建议(不改变行为,可与修复同批处理):SonarCloud 另外标记 /goal 解析正则为回溯风险(python:S8786,chat_codex_goal.py:64)以及 _observe 认知复杂度过高(python:S3776,第 242 行)。
本地验证(该 exact head 的独立 worktree):pytest -q tests/test_chat_codex_goal.py tests/test_chat_executor_profile.py -> 30 passed;pytest -q tests/test_chat*.py -> 296 passed。hosted CI:28 项中 27 项通过(checks、kernel-static-checks、pytest、merge-gate、dashboard-acceptance、test-shard 1-4、stage2c、node 兼容性、windows-powershell、Sign-off、build、dependency-review、sonar 全绿),唯一失败为上述 SonarCloud 质量门禁。未复跑 PR 正文所述的 live packaged app-server 场景(多次分析、limit 回读、interrupt、resume、重启)。
我的整体评价
REQUEST_CHANGES。功能设计本身是清晰且克制的:监督放在 Codex 传输层,激活限本地 owner 的 Goal Chat,用量由 host 自己记账,失败即暂停、恢复不分叉,原生完成在响应结构与文档里都明确"不是 LoopX 验收"。默认关闭、外部输入拒绝、历史通知隔离、replay 复用既有 turn 这些边界都有对应测试,共享 Chat 运行时全量 296 个测试通过,说明改动没有破坏普通对话路径。
但当前 head 不能直接合并:两处 assert 把"必须是 Codex adapter"这一不变量变成了"可能消失、且失败时被吞进通用错误"的检查,直接导致仓库必需的质量门禁失败,--check-merge-readiness 也据此判定未就绪。修复很小(两行显式守卫 + 一个用例 + 重跑门禁),改完就只剩 SonarCloud 的两条非阻断建议与合并状态问题。除此之外没有发现其他阻断项;残余不确定性是本次未复跑 live app-server 场景,以及共享循环"丢弃异 turn 事件"的取舍(若某天 host 在 turn/start 回报 id X 后又实际启动 Y,会表现为等待超时而非串流;当前用历史 turn 测试覆盖了预期场景)。
English verdict: REQUEST_CHANGES - #4700 at exact head 49365ab adds opt-in native Codex Goal continuation (/goal start|status|resume) inside the existing managed Goal Chat with a provider driver that observes multiple native turns, journals upstream_mode=chat_native_goal before activation, pauses on stop/timeout/error/recovery without forking, keeps the read-only sandbox and strips action/acceptance authority (proposals: [], protected_action: None); it is local-owner-only, rejects external queued input/attached hosts/other channels, and the shared turn-notification ordering now drops stale turns. Verified at the head: 30 focused tests in the changed files and 296 tests across tests/test_chat*.py pass, and hosted CI is 27/28 green - but the required SonarCloud quality gate fails (D Reliability Rating on New Code) because the two new assert isinstance(adapter, CodexAppServerAdapter) guards in loopx/chat_runtime.py:777 and :1191 express a real invariant as an assert that vanishes under -O and is swallowed by the surrounding except Exception handlers (CRITICAL BUG python:S5779), leaving --check-merge-readiness at ready=false (status_checks_failed, repository_merge_state_blocked). Minimum repair: replace both with an explicit typed guard plus one regression test driving a non-Codex adapter, then re-run the gate. Non-blocking advisories: the /goal parse regex backtracking risk (python:S8786) and _observe cognitive complexity (python:S3776).
49365ab to
43df4fc
Compare
huangruiteng
left a comment
There was a problem hiding this comment.
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
Exact head: 8239e3aeaa6f047a88523739721e810bde1d23a3; reviewed base: 147e5636f83e160df5a7d1f79a36f0bdbf4dfc3c.
动机
本次按更新后的完整需求重新审查:Goal 对话可以直接承担项目 coordinator,在输入框旁开启持续推进,组织授权成员,并将可核验结果返回同一对话。判断依据是 Goal Chat 操作契约、session/frontend RFC 的本次检查点与 overall roadmap 的小团队交付路径。
此前 native-only 版本能持续调用模型,但缺少成员工具和产品入口。单加按钮仍不能组织团队;业务 phase 脚本又会替模型决定工作顺序。当前实现补齐了这条已批准的产品路径。它没有据此宣布整个协作路线图完成。
改动思路
沿用三个已有责任边界:Chat 拥有会话、消息与传输;原生 Codex Goal 拥有自身运行及用量;现有 Delegations 和 TS Todo/验收契约拥有成员执行与接受结果。管家保留跨 Goal 的接入与提醒职责,项目对话和注册 peer 都可以承担协调角色,角色本身不增加授权。
审查了 base/head 的 Delegations、conversation scope、Chat ingress 与直接调用者。Chat 新工具和原有 MCP 路径调用同一个成员服务,未复制验收状态机。loopx_mode 是不能由“已注册”推导的所有者运行意图;native/member 展示只是观察,不能替代 canonical 状态。成员展示有数量边界,执行目录和验收不依赖展示列表的完整性。
本次相关整理是抽出 ingress IO、复用前端会话准备和流式返回路径,保持原接口与持久化行为;HTTP 实现放在 mode service,server 的指标额度仅增加四行路由。没有另建业务调度器。
具体改动
GoalLoopXMode→updateLoopXMode→ HTTP →ChatLoopXMode.apply:首次原地配置协调身份、成员执行配置和总 token 额度,之后直接开启、暂停或恢复。现有 Kanban 不变,前端打包产物保留上一代生产资源。planChatMode:TS 统一检查本机所有者 Goal、Codex runtime、当前 Turn、注册身份、执行绑定及原生状态。普通对话、挂接会话、外部输入和角色标签不会自行取得运行权限;恢复额度必须大于已使用量。ChatLoopXMode.prepare:把宿主固定身份的工具接到Delegations,模型自行决定分工和顺序;每次调用复查配置,单个 sender 禁止并发驱动多个对话。成员可通过相同服务继续委派。accepted必须重新检查 canonical Todo、验收绑定和产物内容。CodexGoalDriver._observe:保留多轮正文,避免后续结构化总结覆盖前一轮完整报告;complete/blocked 等待该轮输出,额度限制仍及时中断。暂停/恢复保留原线程、objective 和累计用量。- 消息仍使用已有 ingress ledger:queue 在后续原生轮次开始时注入,inbox 由模型主动读取,steer 定向当前轮次;丢失 queue 确认记为 uncertain,不自动重放,也不把 steer 失败偷偷降级成排队。
- 首次显式开启需要升级闲置执行器以挂载工具,保留本地会话历史及实际 model/effort;已有未结束原生 Goal 时拒绝替换。
chat_manager的默认模型解析跟随已选 endpoint,chat_agent隔离历史异 Turn 通知。 - 上次审查指出的两处
assert isinstance已替换成显式CodexChatAgentError,恢复失败仍关闭错误 adapter;新增错配回归。参考文档、双语 RFC 与prepare-chat示例同步了使用和回滚边界。
对主干的风险
最强反例是“模型说完成、mock 返回 accepted,但实际任务或产物不成立”。本次使用真实 packaged Goal Chat、local Codex、两个本地 DSH 和两个云端 Ark 成员验证,包含 Ark → DSH 嵌套委派。独立验收确认四项成员任务完成;最终报告引用四个精确产物哈希,并正确得到标准化 FCF 40 → 25,差值 −15、期间不可比、一个独立来源家族和旧转载数字失效。根协调员目录只直接包含三个绑定,第四份嵌套依赖通过已验收上级产物采用,未将“目录未展示”当作“任务不存在”。
还实际执行了成员运行中暂停、服务重启后恢复、queue/inbox/steer 送达及持久化读回。调试期间确实出现过报告被后续总结覆盖,修复后重新核验最终正文和哈希;不是仅根据测试 fixture 宣称协作成功。原生运行 complete 时,canonical Goal 仍 active、报告 Todo 仍 open,证明运行结束没有越权结项。实验云端资源已清理。
本地验证:
- 155 项 Python 回归通过,覆盖 mode/native lifecycle、上下文恢复、profile、普通对话、消息/重放、store/broker/CORS;6 项 TS admission/delegation 用例通过。
- TypeScript typecheck、packaged frontend build、Ruff、Chat server smoke、真实文件系统 ingress base/head 对照通过;对照保留完整冲突诊断和 0600 权限,只归一化随机会话 ID/时间。
- 桌面及 390px 手机页面操作/读回通过,手机无横向溢出。默认关闭时没有成员工具或执行效果;开启入口作为有意新增的界面能力已披露。
- 最终 canary:5 个直接检查 + 19 个选定检查,0 失败。此前 module growth 和提交差异末尾空行检查的失败已修正,未计为通过。完整公开差异的隐私扫描通过。
- 最终质量回执
cqr_9b9be14794f3bfe151ef为 valid;33 个文件,scope9b9be14794f3bfe151ef25ce47d3e71640b78ae17f01d3ca5174b34c8aa5fda5。safe-fix allowed/applied,1 次收尾修正;0 blocker/warning/advisory。该回执不授予合并权限。
本次评审配置为 wait_for_ci=false,没有查询或等待远端 CI,也不声明 SonarCloud 已转绿。旧审查的 regex/复杂度非阻断建议仍保留。主要剩余限制是 Codex experimental Goal API、Chat 服务生命周期,以及未验证无人值守 daemon、Lark 控制和其他主力驱动等价行为。暂停不取消已启动成员,回滚前需先暂停/关闭服务并保留成员证据。
我的整体评价
APPROVE,无剩余阻断发现。 本次解决了批准范围内从开启、成员协作、纠偏、恢复到原地返回结果的完整路径;新增代码成本主要来自真实的生命周期和恢复边界,直接复用已有控制面比新增调度体系更合适。共享语义沿用已有术语和验收权威,没有以 mode/native complete 扩大角色权限。
策略 revision 6 的结构化评审检查通过;完整 base-to-head 已审查,未继承上一轮结论。该 PR 涉及 runtime/control-plane,按仓库规则留给维护者合并。
English verdict: APPROVE - #4700 at 8239e3a delivers opt-in Goal Chat coordination through existing governed delegation and TS acceptance, inline controls and distinct queue/inbox/steer. Real Codex/DSH/Ark execution qualified four member artifacts including nested adoption, pause/restart/resume and complete report retention without canonical Goal settlement. 155 Python tests, 6 TS cases, typechecks/build, filesystem parity and 5 direct + 19 selected canaries passed; exact quality receipt is valid. The prior assert guards are fixed. Remote CI was not consulted under wait_for_ci=false; experimental provider, daemon and other lead/Lark parity limits remain. Maintainer merge required.
Merge decision — heldExact head: Self-merge was not executed.
Required next step: resolve the |
Signed-off-by: huangruiteng <14976749+huangruiteng@users.noreply.github.com>
… scope Signed-off-by: huangruiteng <14976749+huangruiteng@users.noreply.github.com>
Signed-off-by: huangruiteng <14976749+huangruiteng@users.noreply.github.com>
…ation Signed-off-by: huangruiteng <14976749+huangruiteng@users.noreply.github.com>
Signed-off-by: huangruiteng <14976749+huangruiteng@users.noreply.github.com>
Signed-off-by: huangruiteng <14976749+huangruiteng@users.noreply.github.com>
Signed-off-by: huangruiteng <14976749+huangruiteng@users.noreply.github.com>
Signed-off-by: huangruiteng <14976749+huangruiteng@users.noreply.github.com>
8239e3a to
5630ada
Compare
huangruiteng
left a comment
There was a problem hiding this comment.
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
Exact head: 5630ada554e41c4a87949178700e3c9d99bc12b1; integration base: bdc1c160444a83d6332da442110ce08b9d5ecbe3.
动机
按所有者明确要求,重新审查整个 #4700,并在验证后自合并。本次交付是现有 Goal 对话中的持续协调:原地开启、组织已授权成员、暂停恢复并接收可核验结果。依据是 Goal Chat 操作契约 与 session/frontend RFC。它是 R2/R3 的可用增量,不代表通用 Agent 创建、attached-host 自动唤醒或整个团队路线图已经完成。
只加按钮不足以提供成员工具和恢复;业务 phase 脚本会替模型决定顺序。当前方案让模型决定分工和纠偏,宿主限制身份、配置和执行范围。
改动思路
沿用 Chat 会话/流、原生 Codex Goal 生命周期、现有 Delegations 和 TS Todo 验收,分别承担传输、持续运行和成员接受结果。管家仍负责跨 Goal 接入,项目对话或普通注册 peer 负责范围内协调,角色本身不扩大权限。
核对了最新主线的 #4706 委派 CLI、#4699 Todo 生命周期、#4713 完整工作计数及 #4723/#4725 命令退役;本 PR 使用保留的 canonical 完成入口,没有复制验收规则。Ingress IO 从原 store 提取后保持公开方法和落盘语义;前端复用 session/stream 路径。注册、按钮可见、配置保存都不是运行证据。
具体改动
关键代码讲解
GoalLoopXMode和现有页面回调:配置、开启、暂停、恢复、用量与成员观察都在 Goal 对话。首次状态读取尚未返回时,一次点击也会准备会话并打开设置。旧实现已在延迟首次读取的浏览器场景中复现设置等待超时;修复后源码和打包版本通过,保存配置没有启动任何 Turn。planChatMode:TS 检查本机 owner Goal、managed Codex、注册身份、有效绑定、当前 Turn 和原生状态。恢复必须使用累计额度,外部或 attached 会话不能靠角色名获得权限。ChatLoopXMode.apply/prepare:固定 requester 和配置摘要,以单航班锁保护 sender;每次工具调用复查绑定。start/read/wait/resume 都使用现有 Delegations,成员可以在自己的授权范围继续协调。accepted 仍需当前 canonical 完成和未改变的产物。CodexGoalDriver._observe:原线程内观察多个 native Turn,保留前面的实质报告;错误、超时和恢复会暂停原生运行。模型报告完成与 canonical Goal/报告 Todo 完成明确分离。ChatIngressStore:复用原 ledger 的重放/冲突处理。queue 等后续原生 Turn,inbox 等主动读取,steer 定向当前 Turn;不确定送达不自动重放,steer 失败不降级为 queue。
同时更新默认模型的 endpoint 解析、历史异 Turn 事件过滤、HTTP 路由、双语 RFC、操作说明、prepare-chat 示例和打包资源。首次工具升级保留本地历史及实际 model/effort,禁止替换未结束的原生 Goal。
对主干的风险
最强反例是工具返回 accepted,但真实 Todo、依赖或文件已经失效。新的完整评审没有继承旧批准:当前代码重新核验先前真实 Codex+两 DSH+两 Ark 实验的四份成员产物、嵌套依赖和报告哈希,结论仍为 FCF 40→25、差值 −15、期间不可比、一个独立来源家族;报告 Todo 仍 open,Goal 仍 active。原实验的 pause/restart/resume 和三种消息回执仍保留。这是既有真实实验的当前独立读回,不宣称本次重新启动了四个云端/本地成员。 该证据源为旧 head 8239e3a,本次比对核心原生/模式实现及新主线调用者后复用;最终委派测试再次执行当前完成链路。
本次新执行的实际 Codex app-server 检查通过 ChatRuntimeController 提交只读 native Goal,完成并保存结果,重复请求返回原 Turn。观察到单次在途请求可超过 token allowance,与文档中的非硬上限语义一致。
本地验证:319 项 Chat/CLI 回归通过;最新 Todo 主线整合后再跑 63 项 native/mode/实际委派测试通过;8 项 TS admission/scope/delegation 测试、typecheck、Ruff、配置范围内 mypy、前端 build 通过。打包 workspace 全部 8 场景通过,慢首次读取回归额外通过。真实 HTTP 普通对话检查通过,base/head 文件系统 ingress 的重放、完整冲突诊断、状态读回和 0600 权限一致。最终 canary:5 个直接检查+19 个选定检查通过,0 失败、0 manual hold;质量回执 cqr_c8c538b93ad0ae1cad1d 对当前 39 文件差异有效,未在质量评审后应用新的 safe-fix。
语义与 CI 对齐
状态使用 TS 转换和原生枚举,没有以自然语言分类替代权限。普通路径的 prompt、输入与 store 合同保留;新的可见开启入口是已披露的变化。Server 的回归预算实测 1514→1518 行,增加的是四行路由,主体在独立 mode owner;没有删语义或缩扫描范围。当前 review policy revision 7、wait_for_ci=false:执行本地验证,不查询或等待远端 CI。
主要限制:依赖 experimental Codex Goal API 和 Chat 服务生命周期;暂停不取消已派发成员;尚未验证无人值守 daemon、Lark 模式控制及其他主力驱动等价。回滚前暂停服务并保留成员证据。对话中的最近成员列表仍不是完整 fleet inventory,这属于后续恢复入口的明确边界。
我的整体评价
APPROVE,无阻断发现。 该增量可独立操作、测试和回滚。相关简化已采用:共享 ingress、session/stream 和委派/验收 owner;不再增加另一套调度器。修复范围限原始会话体验和合并兼容,没有借此次合并扩展权限。本次所有者明确授权自合并;合并仍以此 exact head 的 readiness 检查为准。
English verdict: APPROVE - #4700 at 5630ada provides opt-in continuous Goal Chat coordination over existing delegation and TS acceptance. Whole-diff review covers native recovery, distinct input delivery, default-off behavior, inline controls and packaged output. 319 broad regressions, 63 final integration cases, 8 TS cases, complete packaged workspace scenarios, real Codex replay and filesystem parity passed. Historical mixed-team artifacts were independently requalified, not represented as a fresh live launch. Experimental provider, daemon, attached-host wake and Lark parity limits remain. Owner explicitly authorized self-merge; remote CI was not consulted under resolved policy.
Goal Chat can continuously coordinate authorized DSH/Ark members in the existing conversation. Configure Enable LoopX once beside the composer, then start, pause or resume there. First enable also opens settings when the initial status request is still pending; saving settings does not start work.
The model chooses work order and recovery. TS conversation admission, existing Delegations, canonical Todo completion and independent acceptance retain their ownership. The Codex host driver preserves the native thread/objective/usage and substantive reports across turns. Queue, inbox and exact-turn steer use distinct durable receipts. The local steward keeps cross-Goal intake and attention; project conversations and registered peers reuse the same collaboration service.
Validation: 319 Chat/CLI regressions; 63 final native/mode/delegation integration cases after latest Todo integration; 8 TS contracts; typecheck, Ruff, mypy, frontend build, full packaged workspace scenarios and slow-first-snapshot regression; real Codex continuation/replay, HTTP ordinary Chat and filesystem ingress parity. Previously executed two-DSH/two-Ark evidence was requalified through current independent acceptance: four accepted artifacts, nested adoption, exact report hashes, normalized FCF 40→25 (−15), incompatible periods and one source family. This requalification was a persisted-evidence readback, not a fresh four-member launch.
First activation upgrades an idle executor's tools while preserving local history/model; unfinished native Goals cannot be replaced. The lead keeps its read-only sandbox. Pause does not cancel members, native completion does not settle the report Todo or canonical Goal, and token allowance can be exceeded by in-flight requests. Unattended daemon, generic Agent provisioning, automatic attached-lead wake and Lark/other-lead parity remain unqualified. See operating guide and updated bilingual session/frontend RFCs.
Local evidence, credentials and private project context are excluded. The owner explicitly authorized this exact PR's self-merge after renewed review and local validation; configured review policy does not consult remote CI.