feat(workspace): show the whole Goal as a work map in Overview - #5429
huangruiteng wants to merge 12 commits into
Conversation
Add the work_item.task_graph.goal_topology effect so TypeScript owns admission, relation edges and prerequisite depth for every non-archived Todo of one Goal, with explicit omitted, missing-endpoint and cycle counts. Python renders the public-safe goal_task_map_v0 projection and the cold delivery-review read returns it beside the bounded chain. Deferred Todos now render as waiting instead of done in every lens. Signed-off-by: huangruiteng <huangrt01@163.com>
Seed successors, unblocks links and resume conditions through the todo lifecycle so the demo Goal's dependencies are readable data instead of note prose, and let gate approval resume blocked work through the existing typed lifecycle. Signed-off-by: huangruiteng <huangrt01@163.com>
Draw every task, decision and monitor with recorded relations, focus on current work or everything, trace the selected item's lineage, open task details in place and disclose incomplete coverage. Phones get a list. A changed workspace now re-reads the delivery snapshot automatically instead of showing a stale alert on load; the chain defaults to list view. Signed-off-by: huangruiteng <huangrt01@163.com>
Record W1 (Goal work map) with W2 live state and W3 outputs in the Live Team Workspace RFC, point roadmap S5 at the track, and teach the Overview work map, refresh behavior and CLI readback in the user guide. Signed-off-by: huangruiteng <huangrt01@163.com>
…dable Lineage no longer creates false cycles: a follow-up recorded opposite to a dependency adds no ordering, and cycle_edge_count counts only dependency loops, which now also clear topology_complete. An unreadable Todo source returns goal_map: null instead of failing the whole delivery review. Signed-off-by: huangruiteng <huangrt01@163.com>
Current work now shows active work, its direct prerequisites and what open decisions unblock; long finished histories collapse into a count. Unconnected chains get their own framed grid, decision chains first. A shared owner is shown once, links into archived or other-Goal work become a footnote, and the unlinked strip previews eight items. Signed-off-by: huangruiteng <huangrt01@163.com>
|
This pull request has merge conflicts with Choose the remote for the base repository, not an out-of-date fork. git fetch upstream
git rebase upstream/main
# Resolve each conflict, git add the resolved files, then git rebase --continue.
git push --force-with-lease origin HEADFor a same-repository clone whose Keep the DCO |
Signed-off-by: huangruiteng <huangrt01@163.com> # Conflicts: # demo/workspace/__main__.py
huangruiteng
left a comment
There was a problem hiding this comment.
Request changes conclusion (author-owned PR; GitHub blocks formal self-review)
评审结论:REQUEST_CHANGES,审阅 head 8c767e4475561603a0cafb649af530ae6ab01287,比较基线 31480ca039d36fcb07d6e6d8447082bf803d4a96。工作地图的只读架构和完整交付切片有价值;目前有一项 P2,会把未知的缺失依赖解释成已知的范围外关联。
动机
用户需要在概览看清整个 Goal 的任务形状、待决定事项与其解锁的工作。旧交付链仅展开当前工作及有限前序,任务列表又没有关联关系。此 PR 将整体关系放在既有概览中,选择、查看前后项、打开详情并返回原选择,不增加设置或确认步骤。这是 RFC 的 W1 展示增量;实时执行、产物采用及完整团队验收仍由既有 L1/W2/W3 负责,不能由节点数量或合成截图宣告完成。
改动思路
入口继续使用冷读取 GET /api/chat/delivery-review。Python 从既有 Todo 来源读取完整未归档清单,复用公共安全文本与状态归一化;TS effect 负责准入、关系和层级,并复用 planning_relations 的关系目录。返回新增的 goal_task_map_v0,前端解析后绘图,不另存依赖或决定执行资格。相比扩大状态热路径里的局部链,这个独立冷投影既保留预算边界,也使撤回较容易;旧链仍有真实的预算及准入差异,保留它合理。
真实 disposable demo 的后端返回 22 节点、17 条关系,地图可追溯场地决策及后续押金任务;既有详情抽屉可打开并返回选中项。通过原有完成接口回放合成场地决策后,独立 Todo 读取显示该 gate open→done、预订工作 blocked→open,地图再次读取完整。此证据覆盖实际存储和 HTTP 路径,未运行真实 Agent,也未声称已安装 App 或长期团队运行资格。
具体改动
关键代码讲解
projectGoalTaskGraphTopology(loopx/control_plane/work_items/task_graph.ts:147)先纳入未完成项,再纳入其已完成直接前序和剩余历史;依赖决定层级,冲突方向的延续仅作为关系绘出。依赖环、缺失端点和截断分别进入完整性字段。共用的decodeRows/relationEdges保留旧链的排序契约,effect handler 注册新只读入口。build_goal_task_map(loopx/control_plane/work_items/task_graph.py:973)将 TS 拓扑转换成任务、用户决定、监控节点;不输出 note、证据正文或日志。共用状态函数将deferred改为waiting,不再把调度终止当作交付完成。chat_status_api._goal_task_map读取原有 Todo owner;来源不可读时只让地图为null,保留其余评审内容。goalWorkMapLayout(apps/presentation/dashboard/src/data/goal-work-map.ts:34)生成当前/全部两种布局,折叠多项已完成前序,按连通组排列;GoalWorkMapView负责连线、选中关系、检查器、缩放、未关联事项与手机列表。显示层不写入任务状态,也不授予新执行权限。DeliveryReview(apps/presentation/dashboard/src/features/personal-workspace/delivery-review.tsx:57)集成地图、复用详情及导出,并在来源变化后延时重读;重读前暂停导出和来源跳转,失败后保留已有画面。旧链改为默认列表。Zod 解析器校验 Goal、节点与端点身份,双语 Markdown 导出保留完整快照与 limits。
其余改动也纳入评审:demo 将 prose 依赖迁移成现有 successor / unblocks / resume 条件,删除手动 reopen;TS/Python 测试、前端 smoke、packaged 浏览器场景验证对应关系、布局与错误分支;双语 copy、用户指南、投影协议及两种语言的 RFC/路线图记录 W1 的范围与默认变化。没有新增存储、调度器、安装指令或第二个执行规则 owner。未来重构检查认可此次共用行解码和关系投影;不要求把预算不同的旧链强行改造成整图 lens。
对主干的风险
[P2] 未知缺失端点不能直接降级为“已归档或其他 Goal”。 具体分支 仅看 missing_endpoint_count > 0 就返回 outside_links。但是 TS 统计的是“不在本次来源清单中的引用”,没有证明引用确实归档或属于其他 Goal。真实 HTTP 反例中,当前工作记录 resume_when=todo_done:todo_never_existed,来源完整、无节点遗漏或环;后端正确返回 missing_endpoint_count=1, topology_complete=false。前端解析后却隐藏 Some work is not on this map,并显示“1 links point to archived or other-Goal work and are not drawn”。用户会把丢失的前置工作理解为正常范围边界,失去需要修复的提示。现有 smoke 人工将缺失计数解释成归档,故仍通过。
最小修复:对未经证明的缺失保持 partial,使用“缺失或范围外引用”这类真实措辞;若要保留安静的范围外类别,再由既有来源 owner 明确区分已确认归档/跨 Goal 与未知。分别覆盖不存在、归档、跨 Goal、来源截断四类,重跑 npm run smoke:delivery-review、packaged goal-work-map 场景和真实 delivery-review 读取;不能只把当前失败断言改成 outside_links。
语义与 CI 对齐
goal_task_map_v0 是新的共享只读投影;关系/enforcement 复用既有 TS 目录,monitor 复用现有 task class,focus/tone/coverage 为本地展示枚举。语义 advisory 在支持范围内为零项,无法覆盖全部前端字面量;以上端点分类是经真实来源反例确认的语义问题。默认 deferred 状态、自动刷新和旧链默认列表的变化已在协议、指南和 PR 说明披露。没有 default-off 声明或新增准入门禁,地图也不授权协作生命周期或 Goal 验收。
独立验证:Python 36 项来源/HTTP/拓扑/demo/信封测试、28 项 CLI 预算/规划测试;TS 26 项拓扑与 handler 测试;前端 delivery-review smoke、打包构建及 packaged 地图场景通过;图 fixture、状态读取和热路径预算 smoke、7 项文档资产校验通过。使用相同合成输入分别读取 base/head 的正常、缺失、deferred、132 项、重排和归档案例:仅归一化生成时间,除已披露的 deferred 状态变化外旧链一致,来源文件未被读取动作修改。132 项显示 120 项并明确遗漏 12 项;归档和未知引用都能产生相同缺失计数,正好证明该计数不足以支持前端分类。独立缺失提示断言失败于当前 head。未查询 CI。GitHub 当前另有与主干的合并冲突,需要作者整合后重新核对新 head。
我的整体评价
整图冷投影、移动端列表和原地详情是可独立撤回的、有用的 W1 切片,代码与它的真实调用规模相称。持续工作的控制面边界保持不变;合成决策的后续恢复已验证。用户体验在正常路径改善,但缺失依赖被误述使异常路径退化,因此本 head 暂不能批准。建议只修复来源完整性分类、补上独立反例,并解决主干冲突后重审,不扩大到新的依赖存储或无关协作框架。评审已完成,合并由维护者决定。
English verdict: REQUEST_CHANGES - 8c767e4; unresolved endpoints are falsely classified as archived or cross-Goal links, suppressing the incomplete-map notice. Real HTTP counterexample reproduced; 64 Python and 26 TS cases, packaged map scenario and focused smokes passed. Main conflicts remain; maintainer merges.
Signed-off-by: huangruiteng <huangrt01@163.com>
Signed-off-by: huangruiteng <huangrt01@163.com>
huangruiteng
left a comment
There was a problem hiding this comment.
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
Exact head: 4c1e16425615fe1c7b8c7a19c1baaa3be1a8cdcf
无剩余阻断发现。原稿将缺失关系端点解释为其他 Goal/历史事项的做法缺少事实依据,已改为明确的不完整提示;本评审覆盖修复后的整个 PR,而非仅这一个修复。
动机
当前概览的选中事项前序图无法回答整个 Goal 正在做什么、哪些事项独立、谁负责以及哪里等待用户。这个 PR 交付 live-team Workspace RFC 的 W1 工作地图:从已有 Todo 和关系形成可检查的全局视图,并进入已有详情与审批。它不宣称完成 L1/G1 的真实团队执行、W2/W3 的实时活动或成果验收。
改动思路
继续使用 canonical Todo 快照、已有 planning relation 和 TypeScript task-graph owner。新增全 Goal 冷读 lens,与原前序 lens 共用行解码和关系翻译;Python 仅投影安全字段,App 仅布局、选中和导航。没有新增图状态库、调度规则、完成规则或后台轮询。相比只加列表,地图能展示依赖;相比新建通用图框架,这个设计保持在既有 owner 内且可直接回退。普通路径是选中决策、查看已有详情、预览并确认一次,地图本身没有审批权限。
具体改动
projectGoalTaskGraphTopology(loopx/control_plane/work_items/task_graph.ts:146)先保留未完成工作、直接完成前提,再补历史;保留节点间所有记录关系,区分 lineage 与 dependency,并显式报告缺失、截断和依赖环。对向 lineage 不会被误判成执行依赖环。原选中前序图的预算与语义保留。build_goal_task_map(loopx/control_plane/work_items/task_graph.py:973)将 typed effect 适配为只读goal_task_map_v0,区分用户决策、任务与监控,展示已有负责人,排除原始 note/evidence;deferred 展示等待,不能算交付完成。冷/api/chat/delivery-review增加可选 map,旧响应仍可用原图回退。GoalWorkMapView(apps/presentation/dashboard/src/features/personal-workspace/goal-work-map.tsx:30)提供当前/全部、关联链、独立事项、完成上下文折叠、选中 lineage 与详情导航;窄屏显示列表。读取过期时等待冷读刷新,详情与导出不会使用旧快照。文案、样式、解析器和 Markdown 导出一起更新。goalWorkMapCoverage(apps/presentation/dashboard/src/data/goal-work-map.ts:112)现在将缺失端点保持为 partial,不猜测外部 Goal 或归档原因。独立 oracle 对原稿运行确实失败,修复后通过。
示例只添加合成场景的 typed 关系,保留已合入 #5415 的 decision_scope 和 canonical completion,解决合并冲突时删除了重复 seed 调用。双语 RFC/路线图与用户/协议指南明确 W1 边界,未提升团队或输出验收。新增测试放在已有 Python/TS/交付评审及浏览器入口;生成的 registry I/O manifest 只更新两处 source line。未来维护边界检查已应用:共用关系/解码,避免第二图 owner 和第二审批 writer;没有加入预测性的 provider 或抽象框架。
对主干的风险
主要风险是漂亮的图掩盖不完整数据、把历史关系误读成完成条件、过期详情选错对象,或截图测试通过而真实审批没有恢复工作。针对这些风险,41 项 Python 集成验证覆盖 HTTP、真实 Todo reader、示例状态与 canonical gate;26 项 TS 图及 runtime handler 测试、控制面 typecheck、交付评审 smoke 和 verified packaged build 均通过。打包浏览器场景检查键盘选中、正确 gate/task 详情、返回、有限冷读、partial 状态与 390px 无横向溢出。
另外通过实际打包 App 与隔离的真实服务走通 22 节点/17 关系的地图:预览前后全部 66 条 Todo 不变;一次确认后只有该用户决策 open→done、直接依赖任务 blocked→open,其余 64 条(含其他 Goal)保持一致,地图计数随即更新。浏览器 fixture 没有替代这项 durable readback。初次全树 semantic census 因两处 reader 行号变动失败,重新生成 manifest 后检查通过;最终 canary premerge 19 项通过、零失败,change-quality 最终 diff 有效。按当前 review policy 不读取或等待远端 CI。没有付费模型、benchmark 或活跃生产 Goal 写入。未验证 live Agent 执行和 W2/W3,是明确的非目标;当前证据只证明这份源码的打包 App。
我的整体评价
APPROVE。这是一份有实际用户路径的完整 W1 切片:能理解全 Goal 的已记录工作、看到等待自己的决策,并通过现有权限边界恢复直接依赖工作。只读 lens、显式 completeness 与 canonical effect owner 保持了可回退性和事实边界。已修复原稿的不当缺失分类与示例冲突,完成整个 diff 的风险验证;合并仍需当前 exact-head readiness 与用户授权,不由本评审自动授予。
English verdict: APPROVE - 4c1e16425615fe1c7b8c7a19c1baaa3be1a8cdcf. Complete read-only Goal work map in the existing typed owner; unsupported missing-link classification fixed. Focused Python/TS, packaged interaction, real scoped decision readback, semantic qualification and 19 premerge checks passed. No live-team/output promotion is claimed.
Signed-off-by: huangruiteng <huangrt01@163.com>
Signed-off-by: huangruiteng <huangrt01@163.com>
Signed-off-by: huangruiteng <huangrt01@163.com>
huangruiteng
left a comment
There was a problem hiding this comment.
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
Exact head: 1e4ff548dfb651afc3dccba82d2df8541c80975a
无剩余阻断发现。原稿将缺失关系端点解释为其他 Goal/历史事项的做法缺少事实依据,已改为明确的不完整提示;本评审覆盖修复后的整个 PR,而非仅这一个修复。
动机
当前概览的选中事项前序图无法回答整个 Goal 正在做什么、哪些事项独立、谁负责以及哪里等待用户。这个 PR 交付 live-team Workspace RFC 的 W1 工作地图:从已有 Todo 和关系形成可检查的全局视图,并进入已有详情与审批。它不宣称完成 L1/G1 的真实团队执行、W2/W3 的实时活动或成果验收。
改动思路
继续使用 canonical Todo 快照、已有 planning relation 和 TypeScript task-graph owner。新增全 Goal 冷读 lens,与原前序 lens 共用行解码和关系翻译;Python 仅投影安全字段,App 仅布局、选中和导航。没有新增图状态库、调度规则、完成规则或后台轮询。相比只加列表,地图能展示依赖;相比新建通用图框架,这个设计保持在既有 owner 内且可直接回退。普通路径是选中决策、查看已有详情、预览并确认一次,地图本身没有审批权限。
具体改动
projectGoalTaskGraphTopology(loopx/control_plane/work_items/task_graph.ts:146)先保留未完成工作、直接完成前提,再补历史;保留节点间所有记录关系,区分 lineage 与 dependency,并显式报告缺失、截断和依赖环。对向 lineage 不会被误判成执行依赖环。原选中前序图的预算与语义保留。build_goal_task_map(loopx/control_plane/work_items/task_graph.py:973)将 typed effect 适配为只读goal_task_map_v0,区分用户决策、任务与监控,展示已有负责人,排除原始 note/evidence;deferred 展示等待,不能算交付完成。冷/api/chat/delivery-review增加可选 map,旧响应仍可用原图回退。GoalWorkMapView(apps/presentation/dashboard/src/features/personal-workspace/goal-work-map.tsx:30)提供当前/全部、关联链、独立事项、完成上下文折叠、选中 lineage 与详情导航;窄屏显示列表。读取过期时等待冷读刷新,详情与导出不会使用旧快照。文案、样式、解析器和 Markdown 导出一起更新。goalWorkMapCoverage(apps/presentation/dashboard/src/data/goal-work-map.ts:112)现在将缺失端点保持为 partial,不猜测外部 Goal 或归档原因。独立 oracle 对原稿运行确实失败,修复后通过。
示例添加合成场景的 typed 关系,保留已合入 #5415 的 decision_scope 和 canonical completion,解决合并冲突时删除了重复 seed 调用。双语 RFC/路线图与用户/协议指南明确 W1 边界,未提升团队或输出验收。合入最新主干 #4915/#5416 后,发现准备阶段发生在隔离进程之前;现在 prepare/advance/serve 共用现有隔离入口,先设置最小环境再导入实际状态运行时,既不读取个人默认 registry,也不迁移个人状态。已有记录补齐类型。新增测试放在已有 Python/TS/交付评审及浏览器入口;生成的 registry I/O manifest 只更新两处 source line。未来维护边界检查已应用:共用关系/解码,避免第二图 owner 和第二审批 writer;没有加入预测性的 provider 或抽象框架。
对主干的风险
主要风险是漂亮的图掩盖不完整数据、把历史关系误读成完成条件、过期详情选错对象,或截图测试通过而真实审批没有恢复工作。针对这些风险,41 项 Python 集成验证覆盖 HTTP、真实 Todo reader、示例状态与 canonical gate;26 项 TS 图及 runtime handler 测试、控制面 typecheck、交付评审 smoke 和 verified packaged build 均通过。打包浏览器场景检查键盘选中、正确 gate/task 详情、返回、有限冷读、partial 状态与 390px 无横向溢出。
另外通过实际打包 App 与隔离的真实服务走通 22 节点/17 关系的地图:预览前后全部 66 条 Todo 不变;一次确认后只有该用户决策 open→done、直接依赖任务 blocked→open,其余 64 条(含其他 Goal)保持一致,地图计数随即更新。浏览器 fixture 没有替代这项 durable readback。初次全树 semantic census 因两处 reader 行号变动失败,重新生成 manifest 后检查通过;两个合成个人默认 registry 同时存在时,独立 CLI oracle 对原代码确实失败;修复后 prepare/replay 成功且两份 registry 字节不变。41 项 Python 检查在隔离进程中复跑,ruff/mypy 也通过。最终 canary premerge 19 项通过、零失败,change-quality 最终 diff 有效。初次 pytest 包装工具选到了不受支持的 Python,按 source-checkout 环境固定解释器后原检查和全部 canary 通过,保留失败记录;未修改验证条件。按当前 review policy 不读取或等待远端 CI。没有付费模型、benchmark 或活跃生产 Goal 写入。未验证 live Agent 执行和 W2/W3,是明确的非目标;当前证据只证明这份源码的打包 App。
我的整体评价
APPROVE。这是一份有实际用户路径的完整 W1 切片:能理解全 Goal 的已记录工作、看到等待自己的决策,并通过现有权限边界恢复直接依赖工作。只读 lens、显式 completeness 与 canonical effect owner 保持了可回退性和事实边界。已修复原稿的不当缺失分类与示例冲突,完成整个 diff 的风险验证;合并仍需当前 exact-head readiness 与用户授权,不由本评审自动授予。
English verdict: APPROVE - 1e4ff548dfb651afc3dccba82d2df8541c80975a. Complete read-only Goal work map in the existing typed owner; unsupported missing-link classification fixed. Focused Python/TS, packaged interaction, real scoped decision readback, semantic qualification and 19 premerge checks passed. No live-team/output promotion is claimed.
Goal Overview now shows recorded work across the whole Goal: dependencies, responsible agents, progress and owner decisions. Selecting an item opens the existing Todo or attention detail; decisions still use scoped preview and explicit confirmation.
The map is a read-only cold projection in the existing TypeScript task-graph owner, with current/all focus, relationship inspection, independent work and a mobile list. Missing/capped/cyclic data remains visibly partial. The original missing-endpoint classification and the demo merge conflict are repaired; #5415/#5421 are integrated.
Validation: 41 Python integration tests, 26 typed graph/runtime tests, control-plane typecheck, delivery-review smoke, verified packaged build and packaged keyboard/mobile scenario passed. Demo prepare/advance/serve now enter isolation before discovery; a dual-personal-registry counterfactual and Python typing passed. An actual isolated App decision preview preserved all 66 Todos; confirmation changed only the selected gate and its direct dependent, with refreshed map readback. Final semantic qualification and 19 premerge checks passed.
This delivers RFC W1, not live Agent execution, L1/G1 team promotion or W2/W3 output acceptance. Reuses canonical relations/decisions; no graph store, scheduler or persisted-state migration.