Repository navigation
feat(dashboard): compose a readable Goal workspace with truthful vitals - #6191
Conversation
Compile the six Goal vitals (state lifecycle, work, needs you, agent time, cost, last activity) from typed facts in one pure reducer. Absent usage stays unknown instead of zero, both usage values share one window, monitors never count as work, done never shrinks below the owner count, a host claim or Todo write is not activity, and a stop with an observed open turn reads as finishing. Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Co-authored-by: Cursor <cursoragent@cursor.com>
…-first overview Every Goal view now keeps the breadcrumb, title, Stop/Resume control and a six-cell vitals strip rendered from goal_workspace_digest_v0. Stop confirms in place, keeps the Goal selected and reads back 'Stopping / Turn finishing' while an observed turn closes; Resume keeps the owner's reviewed preview. Overview leads with Direction (objective plus revision-bound criteria) and Needs you; the 24h usage block moves into the strip. The Board and the strip share isGoalWorkTodo so their counts agree. Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Co-authored-by: Cursor <cursoragent@cursor.com>
… smoke Add the goal-masthead scenario (vitals semantics, Board agreement, vital focus targets, Stop confirm/cancel/readback, reviewed Resume, unmeasured usage, phone fit, English labels) and move the activity and unknown-usage checks from the removed header chip and overview block to the vitals strip. Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Co-authored-by: Cursor <cursoragent@cursor.com>
Use the shipped Stop / 已停止 vocabulary for the masthead control, bind the State vital to the existing activity presenter, exclude agent-lane last_activity_at (a Todo-write hint) from Last activity, defer the needs_you work class to M2, and record the M1 checkpoint for #6191 with passed, untested and deferred acceptance kept distinct. Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Co-authored-by: Cursor <cursoragent@cursor.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent | gpt-6.1-sol | OpenAI | runtime_reported | xhigh
Request changes conclusion (author-owned PR; GitHub blocks formal self-review)
Exact head: 2f214d21ef4a01858a408c4f08033379750f38de. Baseline: 5bf53ec6e4019670bf1c47aa508968bf1b3e6f39.
动机
正在 Goal 页查看进展、处理待决定事项或停止自动工作的主人。原页面只显示标题和活动提示,停止入口在侧栏,操作后离开 Goal,主人还要重新找到它才能确认结果;成本另在概览中段。新页面把六项概况和停止入口保留在各视图,并让停止后继续在当前 Goal 回读。真实打包页面能原地停止、恢复和重新加载结果,任务文件不变;但有21项待主人决定时,新指标只显示3且不说明截断,尚不能提供可信的整体概况。这是 M1 页面组合,不交付 M2 工作分组/轨道、M3 新验收操作或 M4 动效,不增加执行、额度、调度或宿主强停权限。
改动思路
纯 TS read model 派生展示,保留既有执行观察与 goal.lifecycle effect owner;新增 UI 有实际 caller,无第二持久权威源。需修的是摘要完整性传递,不需要另建调度、任务或验收框架。本 PR 交付 M1 常驻页头、六项概况、停止/恢复回读和只读 Direction;源截断真值缺口在这个切片内,不能推给 M2。 页面读取已有 Todo、执行观察、验收和使用量,再交给纯 TypeScript reducer 生成六项展示;它不写状态。停止/恢复仍由原 goal.lifecycle 的预览、指纹、幂等应用和回读负责。停止只改变新自动 Turn 的资格,不能据此声称当前工具调用已被强停。
真实最短操作为页头停止→一次效果确认→当前 Goal 回读;恢复沿用一次 reviewed preview。独立打包页面验证了取消、停止、刷新后仍保留 Goal、恢复、失败后可重试;重复 API 应用返回原回执,不改任务文件。新组合有用户价值,完整性判断必须留在来源 owner,展示列表长度不能替代完整统计。
具体改动
18个文件,+1002/-41:新增 reducer194行、masthead202行/CSS76行;接入 header、Overview、Tasks、model/status计数、页面生命周期选择和68行中英文文案;新增 reducer139行与 browser194行测试,并更新 fixture、旧活动/排序断言和 TS 编译入口。没有新 CLI、Lark、provider、持久状态或调度规则。
关键代码讲解
compileGoalWorkspaceDigest:只派生展示。排除 standing monitor、保留权威 done count、缺少测量保持 null,Agent time/Cost 同一窗口;目前attention只按收到的 items 计数,缺少源完整性。useGoalWorkspaceDigest:复用既有 execution owner,接入 todo/open/done、host activity 和 usage;第30行把已经截断的model.userTodos直接变成完整 attention,是本次阻塞的入口。requestGoalLifecycle:只给 masthead 传keepGoalSelected;已有 pending集合、Goal/operation核对、preview/apply、失败回滚和状态刷新继续工作。Sidebar 默认仍可离开 Goal。GoalOverview:Direction/只读条件提前,verification revision 不匹配时保持未核验,已有交付/证据区域仍在;不会自动执行验证或宣布 Goal 完成。
评审框架:M1 task RFC,版本 13e57b29e043d35983dee402d9b83e78ebfc044e。这是链接任务的阶段约束,#6162 仍是单独开放 PR,不能把其作者 checkpoint 当维护者验收;现有 design/frontend 的 truthful-state 要求独立适用。V1 not_met:真实21项只显示3;V2 not_met:Work复用 Board谓词并标示截断,Needs you没有保留完整性;V4 implemented:真实 UI 回读、B/H指纹拒绝/幂等与重复确认;V6 not_met:已有 en/zh、1440/1024/390、focus测试通过,真实部分注意事项状态缺失;V9 implemented:浏览、切页与聚焦没有 action 写请求。M2、M3、M4 out_of_scope:按同一框架原阶段继续,本 PR 不被要求一次完成整个工作区。
对主干的风险
[P2] 保留“等你决定”的完整统计或明确展示截断。 在独立 disposable Goal 中创建21项 open User Todos;真实 /status.json 返回 user_todos.open_count=21、items12,project_asset.user_todos.open=21、items3。既有 todosFromProjectAssetSummary 选择这3项;新 adapter 丢掉全量 count,再由 reducer blocking.length 得到3,GoalVitals 在所有 Goal 视图显示“等你决定 3”,没有部分标识。旧版本本来只展示有限卡片;新增完整概况复用了它的有限列表,不能以旧卡片也显示3为新指标的真值依据。若最老事项在截断外,当前“最早”时间也只代表可见子集。
最小修复:沿用现有注意事项 owner,把规范计数及完整性送入 typed digest;无法取得完整阻塞计数时显示部分/未知,并限制最早等待时间的范围;补真实 status→打包页面超过列表上限的回归。 在真实 producer→build bundle 路径补超过3/12上限的断言,不能只把手填数组扩大后测试 reducer。复跑 node --no-warnings --experimental-strip-types --test tests/control_plane_ts/goal_workspace_digest.test.ts,以及 LOOPX_PERSONAL_WORKSPACE_PACKAGED=1 LOOPX_PERSONAL_WORKSPACE_SCENARIO=goal-masthead node examples/personal-workspace-browser-smoke.mjs(指定已安装 Playwright)。当前两项注意事项夹具通过,不覆盖这个反例。
本轮独立验证:reducer11通过;packaged goal-masthead通过(包括语言/窄屏/focus/正常无写入);真实生命周期相关后端50+14项通过;base/head dashboard和Chat bundle、head control TS和CSS检查通过。真实 B/H HTTP 同样输入得到 resume→stop→resume、重复 apply 原回执、stale HTTP409且无receipt/activation effect、Todo字节保持。Ego真实页面确认 Stop/Resume/reload、Escape取消、损坏来源失败提示与恢复重试,重复确认仅产生一个preview/apply并回读已停止。
初次调用缺tsx、误用根目录 build、未装dashboard依赖的CSS检查和不完整inventory参数,属于验证入口设置问题;保留原失败,改用锁文件依赖、源码解释器和仓库支持的原生检查,没有放松产品断言。独立HTTP探针也纠正了默认active表示及409错误读取,之后两端相同用例通过。按当前策略没有查询、轮询或等待CI。真实外部宿主收尾/heartbeat移除与 live-team 没有执行;合成 host observation只能证明展示。
语义与 CI 对齐
六个work display值是本 reducer的本地词汇;沿用现有todo/execution/lifecycle owner,没有新共享持久权威。开发 advisory明确报告该候选,完整 semantic-vocabulary-drift-smoke.py 检查已回读 exit0;这不证明注意事项来源完整。阻塞涉及现有“完整统计与有限展示分离”的契约,不是要求注册一个新词汇或用CI替代真实来源验证。没有 substring denylist、领域专用核心义务或把机器强制规则称作guidance;M1默认展示变化在PR User journey和阶段checkpoint明确披露。
我的整体评价
REQUEST_CHANGES。 原地停止和跨视图概况的方向合理,体量与实际caller相称;纯TS投影与已有effect owner的边界应保留。长期调度/任务/回放契约在独立B/H验证中保留;用户体验因把有限注意事项误呈现为完整数值而倒退,M1目前未达到真实指标验收。完成上述源完整性修复,并用真实打包producer复现21项后再评审当前新head。
Future-facing pass:已复用Board的monitor排除谓词;相邻最值得做的有界改进是把现有owner计数/coverage送入同一typed读模型,避免UI再维护第二个计数语义。没有必要新增框架、平行状态或要求M2–M4先交付。同账户COMMENTED记录评审结论,GitHub正式self-review限制不改变这个head的阻塞事实;评审不授予merge权限。
English verdict: REQUEST_CHANGES - head 2f214d2. The new Needs-you vital reports an unqualified 3 for a real Goal with 21 pending decisions because the adapter recounts a bounded overview list. Preserve authoritative counts/coverage or explicitly render partial/unknown, including the oldest-waiting scope; add a real status-to-packaged-UI cap regression. Reducer 11, relevant backend 64, packaged scenario, source builds/types/CSS and real baseline/head lifecycle replay/stale/readback pass. Existing bounded cards do not justify the new whole-Goal metric. No CI or physical external-host qualification is claimed.
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
…delivery-20261011 Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
…oducer Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
Use the shipped Stop / 已停止 vocabulary for the masthead control, bind the State vital to the existing activity presenter, exclude agent-lane last_activity_at (a Todo-write hint) from Last activity, defer the needs_you work class to M2, and record the M1 checkpoint for #6191 with passed, untested and deferred acceptance kept distinct. Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com> Co-authored-by: Cursor <cursoragent@cursor.com>
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
…xture 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 | xhigh
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
Exact head: d6dbabcc137de4c9d311545e8ece9b03f6e88eef. Baseline: 43643a5e5dd25a05382c232824ebeb806ce45e25. 没有发现当前切片的阻塞问题;这是作者账户的 COMMENTED 审查结论,不是另一位维护者批准,也不授予合并权限。
动机
返回 Goal 页面查看工作、处理待决事项和停止自动工作的用户。 原页面把进展、成本和停止入口分散呈现,停止后还要重新寻找 Goal;概览只有三条事项时会把真实的二十一项显示成三项。新页面保留上下文,把目标与验收、六项读数和待决入口放到同一页,并保留来源总数及截断说明。 同一公开合成数据的真实打包界面能读回目标、验收状态和待决总数;隔离真实后端的停止与恢复记录仍有效,当前页面不离开 Goal。 本 PR 不增加执行、额度、调度或宿主强停权限,也不交付完整工作轨道、回访增量或真实模型协作验收。 完整 M1 验收、安装版 App、深色对比度、200% 缩放以及真实主人修正后的独立验收与接收仍未完成;已有后续阶段继续承担这些边界。
改动思路
展示真值统一在纯 TypeScript 摘要中;读取不会写状态,停止与恢复仍走现有生命周期 owner,不需要新框架或第二套计数。 本 PR 交付默认 Goal 页组合、常驻六项读数、原地生命周期回读及截断事项的完整性传递;M2–M4 和完整 GQ08/GQ09 验收仍在既有阶段。
真实生产器输出的二十一项总数与十二/三条有限列表必须分开传递。修复复用现有 open_count / open,不再用显示列表长度制造全量统计;总数缺失时保持未知,截断时也不能宣称知道全局最早等待时间。顶部和右侧共同调用摘要,安静 Goal 不新增空卡片。读取无写操作;停止只有一次效果确认,恢复沿用既有 reviewed preview。原 sidebar 的导航选择保持原状,新的页头操作原地回读。
相比只改标签,这个已确认的页面组合让主人在一次返回中看懂目标、条件、工作和下一步;相比新建页面或后端规则,它保留既有 route、effect owner 和失败恢复。手机验收条件占更多竖向空间,待决列表更靠后,顶部指标提供直达入口;这项成本在同数据对比中公开。
具体改动
当前完整净差异为 36 个路径,文本 +1828/-94,另有六张公开合成截图。主体是纯 TS 展示摘要、页头和 Overview/CSS;接入原 status adapter、已有生命周期流程、双语文案,并复用 Board 的 monitor 排除谓词。验证增加真实 producer 的有限列表路径和页面回归;文档替换旧组合指导,没有提交私人 Goal 状态或原始运行日志。
关键代码讲解
compileGoalWorkspaceDigest:从已解析事实派生计数、完整性和测量窗口;输入缺失不变成零,partial 不能提供全局 oldest,主机声明不能变成观察到的活动。它不读文件、不取时钟、不写状态。useGoalWorkspaceDigest:接入现有执行观察、Todo 来源总数、使用量和主机事件。顶部与右侧都使用它,下一次计数策略变化只需修改一个展示 owner。GoalOverview:展示目标及当前 revision 的验收条件,分别标明已核验、未通过、尚未核验;右侧保留 21 的 owner 总数,显示仅列出 3 项,空截断列表仍能查看任务,安静页面不留空卡片。它不触发验收验证。requestGoalLifecycle:保留原 pending、preview/apply、拒绝和 reconcile。页头只增加keepGoalSelected的导航选项,不重建生命周期决策或扩大远端执行权。
规范:docs/architecture/rfcs/goal-workspace-surface-v0.md,固定已接受版本 6cb05f449053f1fa704210864d79f9b9612ce18c,见接受的 RFC。V1 implemented:未知/零、测量窗口和真实 producer 计数;V2 implemented(M1 strip/Board/rail 范围):共用工作定义并披露截断;V9 implemented:读、刷新和导航无 action/quota/validator 请求。V4 deferred 的完整出口:真实隔离后端 Stop/Resume 和目标消失拒绝已验证,但本次不把它升级成全部 stale-fingerprint、double-click、宿主移除组合都合格。V6 deferred 的完整出口:语言、尺寸、键盘、reduced motion、quiet/partial 已覆盖;深色对比度和200%仍未测。M2、M3、M4 out_of_scope:按已接受阶段继续。本结论没有宣布完整 M1 或 GQ08/GQ09 完成。
对主干的风险
最强反例是小夹具通过但真实生产器把 21 项截断为 12/3 项。旧的 2f214d21 审查指出顶部数值错误;本轮在 3eb7b9df 又实际捕获右侧 3 != 21。修复现在经过真实 collect_status → 打包 parser/adapter → 摘要 → 顶部和右侧,而不是仅扩大手填数组。初次右侧修复也让未知的安静 Goal 多出空卡片,navigation 场景实际失败;改为“有列出事项或已知正总数”后完整 51 场景再次通过。保留了失败记录,没有删除断言或用最新一次绿色覆盖未解释的相关风险。
完整 Python 在 3eb7b9df9751ee1b1fe7003ef25c1b808454d8a8 终态为 20,711 passed、335 skipped、517 subtests;TS 为 4,413 passed、37 环境门控 skipped。随后只改 Overview、其浏览器回归和图片;Python、typed owner、依赖字节相同。最终前端在 1327ee2767410e37dd70c461274214a0c2c3e214 完成 fresh build 和全部 51 packaged 场景,源码与本 head 相同。六张图片另做真实基线/当前打包视觉检查。此前的部分 Python 失败属于历史候选,未冒称已全部解释或在新 head 重新跑了完整 Python。
仓库声明的 Ruff、mypy、类型、状态契约、conversation returns、语义和公开边界检查通过;原19项风险检查及4项直接检查保留明确源版本,Overview 新增变化由 fresh 全量打包覆盖。额外扩大范围的 Ruff 仍报告两处未改 adapter 的 E731/F401:相同解释器、配置和命令的不可变基线与当前 head 诊断签名一致,已独立归因;这是 failed 的额外诊断,不是把要求降级。原生当前36文件范围质量回读为 pass。按审查策略未查询、轮询或等待 CI。
真实生命周期证据使用隔离 ChatHTTPServer/ChatActionService 和临时 authority,目标在确认后消失时拒绝、没有重建或假成功;相关后端及调用分支未改,最终 UI 集成重新覆盖。截图的操作夹具只证明呈现,不能证明持久化、物理宿主收尾或真实模型接收。没有改 PostgreSQL authority store,因此不宣称其运行资格。
语义与 CI 对齐
展示 closed sets 留在 local typed presentation;沿用现有 Todo/execution/lifecycle 词汇与 authority。没有新增 substring 分类、领域专用核心义务或把 enforced 规则称作 guidance。开发 advisory 和完整 semantic smoke 都已执行;这些检查不代替真实有限来源的回归。默认 Overview、共同7天/24小时窗口和折叠输入的变化在 PR 及对比图披露;窗口差额不能称为新增花费。
我的整体评价
APPROVE 这个 justified_increment。 长期执行与恢复的 owner、持久结果和无操作读取路径保持,用户体验在原地回读和计数真值上改善。手机竖向成本、未测深色/200%、安装版与真实模型边界已经公开。纯展示 owner、现有作用权限及主题相称,未引入第二状态源;本地 display vocab 也未伪装成共享权威协议。
有界 future-facing pass 已应用:strip/Board 共用 work predicate、strip/rail 共用摘要、删除 list recount 和缺失默认零。无需 compatibility wrapper 或新框架;更大的 activity owner 移动与完整工作轨道保留在现有阶段。此前源完整性 finding 在当前真实生产器→页面路径已修复。#6162 已合并,但其旧日期 checkpoint 是历史事实,不能拿来覆盖当前 formal ready 与验证,也不能把本切片升级成整个 RFC 验收。维护者仍需正式 review/merge;本记录不会自动合并。
English verdict: APPROVE — exact head d6dbabc, a justified Goal-page presentation increment. Real producer21/queue12/overview3 now retains21 in both persistent vital and decision rail; partial global-oldest claims are suppressed and unknown stays unknown. The final UI build and all51 packaged scenarios passed, including the earlier failing rail and quiet-page cases. Full Python20711 and TS4413 passing evidence is reused from the explicitly identified unchanged-owner revision, not relabeled as a new-head execution. The broader optional Ruff failures are independently base-equivalent. Installed/live-model adoption, full M1–M4, dark contrast/200% and complete physical-host lifecycle qualification remain outside this approval. Author-owned COMMENTED conclusion; maintainer merge authority remains separate.
Goal and result
A returning Goal owner had to reconcile a title/activity chip, separate usage and direction panels, and a sidebar Stop that navigated away after success. This change keeps the Goal open, places six scoped vitals beside Stop/Resume, and makes Overview a document with one objective, a criteria checklist and an owner decision rail. Reading views fold the composer while keeping suggestions available.
Basis: roadmap S5 and the Goal Workspace M1 proposal in #6162. GQ08/GQ09 inform the journey; this presentation slice does not qualify their full model-backed outcomes. Written by model agents, including OpenAI Codex (GPT-6 family); existing proposal commits are preserved.
The bounded attention fix reuses the existing Goal-group blocking projection and owner totals. Missing
open_count/opennow remain absent in the client parser instead of becoming zero; a partial list cannot claim a global oldest wait. Top strip and decision rail consume the same digest instead of recounting three displayed items. Unknown and empty bounded lists retain their recovery route; a quiet Goal still avoids an empty decision card. Per-decision gate categorization is unchanged.Ownership: existing TypeScript presentation, activity, acceptance and lifecycle owners. No new capability, endpoint, persisted state or execution authority. The digest display classes and view-region vocabulary stay local to presentation. Frontend and packaged Chat changed; CLI and Lark contracts are unchanged. The default Goal Overview composition changes. Source first-screen approval was obtained before these commits.
Visual evidence
All images compare actual packaged main at
43643a5e5dd25a05382c232824ebeb806ce45e25with this candidate using the same public synthetic fixture and frozen clock. Desktop is 1440×1000; phone is 390×844. These are rendered builds, not design proposals or installed-App/live-model qualification. The attention pair crops the decision region under the same real status-producer input: 21 open decisions, 12 queue items, three overview items.Attention/craft review: the objective is the one hero; value-over-label vitals and a hairline owner rail replace grouping-only cards and repeated Overview/usage headings. Work, decisions and Stop remain reachable without leaving the Goal. Unknown, blocked and failed observations stay visible. Shared motion tokens respect reduced motion, and the observed-live glyph requires execution evidence.
Validation
Delivery head:
d6dbabcc137de4c9d311545e8ece9b03f6e88eef, based on43643a5e5dd25a05382c232824ebeb806ce45e25. Existing history is preserved; the latest main already contains the registry-loader census correction. Inputs are synthetic/public fixtures and disposable state. Full Python and control-plane TypeScript suites reached terminal success at3eb7b9df9751ee1b1fe7003ef25c1b808454d8a8. Since then only Overview, its browser regression and six public screenshots changed: the Python/typed owner/dependency bytes remain identical. The final Overview bytes at1327ee2767410e37dd70c461274214a0c2c3e214are identical to this delivery head and passed a fresh build plus all 51 packaged scenarios. Visual assets were separately inspected; no earlier source run is relabeled as a run at the new head. Exact-scope quality qualification passed after independent base/head attribution of an optional broad Ruff diagnostic. Repository-declared lint passed; no required check was waived. Ready for review is separate from merge readiness and authorization.Reproduce the principal UI checks:
Scope and continuation
This is a reviewable Goal-page composition increment. Original-channel correction/adoption, the full owner/rail lenses, since-seen semantics and real model/team qualification retain their existing owners and acceptance. The companion RFC #6162 is now merged into main. Its earlier dated checkpoint records the old draft and failed candidate; this PR provides the current qualification and formal ready status without rewriting that history or promoting the remaining M1–M4 gates. Installed-App rollout, 200% zoom and full dark-contrast qualification are not claimed.
Future-facing pass applied: one shared work predicate for strip and Board; no number-tween helper or duplicate execution/usage authority; missing count provenance survives the existing schema, and bounded attention reuses the typed digest. The broader activity-owner move and completed-history projection remain outside this reversible slice. Every commit has DCO sign-off. This runtime/presentation PR is left for maintainer review and merge.
Mobile tradeoff: the expanded criteria occupy more vertical space before the decision list; the persistent Needs-you vital links directly to that region. The 24-hour baseline cost and seven-day candidate cost represent different labeled windows, never newly incurred spend. Installed-App rollout, 200% zoom, dark contrast and complete model/team acceptance remain unqualified.