Skip to content

fix(workspace): keep activity observation gaps scoped to Agent lanes - #6973

Merged
huangruiteng merged 1 commit into
mainfrom
codex/goal-activity-observation-20261021
Oct 21, 2026
Merged

huangruiteng merged 1 commit into
mainfrom
codex/goal-activity-observation-20261021

Conversation

@loopx-agent

Copy link
Copy Markdown
Collaborator

A missing host observation could produce a Goal-wide “no activity” badge beside verified execution from another Agent. The sidebar now keeps execution, ended turns and observation coverage separate. Missing data is neutral; genuine cadence misses remain visible. One nearby disclosure shows each Agent, host and read reason on hover, focus or tap, without navigating or executing work.

The existing TypeScript activity read model owns the change. Status already carries host reasons; the projection now retains them. Complete idle, stopped, claim-only and unrecognized-mode behavior remains covered. Incomplete or unreadable host coverage cannot certify all-host idleness. The bounded host reader, source identities, permissions and execution clocks are unchanged.

Validation: activity decision-table regressions; 69 existing host observer/provider tests; TypeScript/build and CSS token checks; packaged activity, populated showcase and Goal hierarchy journeys. Mixed active/missing/stale lanes, all unavailable reasons, refresh recovery, desktop/390px, English/Chinese and keyboard/hover/touch were exercised. The same activity UI oracle rejects immutable base c97f921e2f18fbd7e155495b7eb5029031c97fe3. The standard risk-based premerge result is recorded in review.

Visual evidence

Synthetic workspace data through the packaged UI, source bbcc68e0f2e54bf7f056b7b1630415fe33fb04b3. This is packaged browser evidence, not a claim of installed native App adoption. The normal entry and navigation remain; per-Agent detail is optional, with zero additional required confirmation rounds.

Before After
Before: a lane miss becomes a Goal alert After: activity and scoped coverage

390px sidebar and the shared observation disclosure

Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>

@loopx-agent loopx-agent left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewer: model_agent · gpt-6.1-sol · OpenAI · runtime_reported · reasoning_effort=max

Approval conclusion (author-owned PR; GitHub blocks formal self-approval)

动机

查看多个 Agent 共用 Goal 侧栏的工作区用户。一个线程仍在执行,另一个线程的本机历史不可读;旧侧栏却给整个 Goal 加上缺少活动的告警,让用户误判并反复核查。现在保留已观测执行,缺失观测以中性缺口显示,各线程的身份、状态和原因可以就近查看。本 PR 不扩大宿主历史扫描、不推断未知线程正在执行,也不改变运行权限、调度或模型调用。合入后仍需核对正式 App 的实际采用;底层受限历史确实无法识别的回合继续保持未知。

改动思路

复用现有 TypeScript 状态归约和 ContextHelp,就能同时保留真实执行与观测缺口;没有引入新的活动权威或需用户维护的配置。当前 PR 只修复状态消费与说明入口,宿主读取预算和执行生命周期保持原 owner。旧做法把某一线程的活动时间窗,压成整个 Goal 的告警;修复后,执行事实仍来自原生回合或托管会话,而缺失、陈旧和观测不完整只表达读取覆盖。最近完成的回合不会被升级为正在执行。直接隐藏所有告警虽然更小,却会丢失真实缺口;扩大宿主扫描则增加另一个 IO 政策,因此此处选择既有状态归约和同一个可访问说明入口。说明按钮与 Goal 导航互为兄弟节点,打开说明不切换 Goal、不触发任务。

输入 此版本的可见结果
有真实执行,另有缺失或陈旧线程 保留执行与自身时钟,缺口按线程计数
所有宿主记录不可读 中性“状态不可读”,不证明空闲或停工
读取恢复且回合已结束 清除旧缺口,不生成执行中状态

具体改动

依据变更前的 docs/development/design.md,规格版本为 c97f921e2f18fbd7e155495b7eb5029031c97fe3。Earn The User's Attention 的观测活性与未知保留要求已实现;Explanations On Demand 的必要不确定性可见、悬浮/键盘/触屏同入口要求已实现。新增设计文字是在已有规则下明确多 Agent 的边界,并不是用新规则为现有实现背书。

关键代码讲解

  • goalExecution 先选有效原生/托管执行;当没有已确认执行时,未知、遗漏或过旧的未结束宿主观测不能由空会话列表推成空闲。领取时间与活动时间继续分开,已停止、需用户处理和已知等待条件仍保留。
  • goalObservationGaps 从现有状态与时间窗逐项归约,同一坏时间记录只计一次缺口。缺少预期周期不等于超时;这组本地显示数不成为新的执行权威。
  • useGoalActivity 用简短缺口标记代替逐线程段落;真实陈旧信息仍可见,全部不可读只写一次。DashboardPage 只补传原响应已有的 reason,不增加后端读取。
  • GoalActivityHelp 复用 ContextHelp,说明 Agent、宿主、回合状态、时间和失败原因。侧栏移除重复箭头,为状态保留宽度;中文/英文、主题 token、窄屏定位和来源切换后的说明生命周期一起检查。删除已无生产调用的旧数组归约与重复文案,而不是保留第二套兼容分支。

其余改动是现有活动单测、同一个打包浏览器场景、设计准则和三张合成状态截图。没有新模块、持久化格式、权限开关、宿主扫描策略或模型操作。

对主干的风险

主要风险是“去掉误报”同时隐藏真缺口,或新增标记挤掉主状态。实际整屏截图确实发现过后者;最终版本缩短标记,并检查文字实际裁切容器,而非只检查 DOM 存在。打包场景覆盖活跃/完成/未知/陈旧混合、全部不可读的多类原因、刷新恢复,以及桌面、390px、双语、悬浮与键盘 Escape 返回;真实主图及父子导航场景通过。

同一个 UI oracle 在不可变基线失败,在本 head 通过;六条未受影响的读模型分支逐值相同,三种线程顺序下活动与缺口计数相同。既有宿主 provider 的 69 项验证已通过,相关源码在此 head 未变。首次验收对一个不同生命周期的 Goal 错用了仅适用已安排状态的标签,已改为检查结束事实、无 live 状态和旧缺口消失;隔离基线的共享依赖目录干扰也已恢复,最终准确 head 的重新构建与打包验收通过。这些历史失败保留,未冒充产品验收通过。

标准 premerge 的 4 项直接检查、4 项 catalog、8 项选中风险检查及公开边界检查均通过。自动选择主要命中文档面,因此额外执行了与改动直接相关的 TypeScript、构建、CSS、状态决策表和打包旅程。按当前策略未查询远程 CI。宿主读取仍受现有预算限制,不能从此 PR 推断每个长回合都已可识别;底层未知会继续如实显示,回退也只需回退此单一前端提交。

我的整体评价

APPROVE,准确 head bbcc68e0f2e54bf7f056b7b1630415fe33fb04b3。这是一个可独立审阅和回退的产品修正,剩余正式安装采用在合入后验收;不表示整个研究工作台或其他未完任务已经结束。long_horizon 判定 preserved:没有调度、权威状态或后续接续副作用;user_experience 判定 improved:原入口零新增必需确认轮次,局部未知不再盖过真实执行,来源说明按需可读。

复用现有 TypeScript 状态归约和 ContextHelp,就能同时保留真实执行与观测缺口;没有引入新的活动权威或需用户维护的配置。当前 PR 只修复状态消费与说明入口,宿主读取预算和执行生命周期保持原 owner。本次采用既有词汇和类型,未引入公共状态协议;局部归约和可访问说明是合适边界。已做同域简化,删除无调用旧 selector;不增加旧请求解码、平行配置或另一套提示框。没有现存证据阻塞此 head;评审同意与合并权限、分支保护及正式 App 采用仍分别判断。

English verdict: APPROVE — bbcc68e0f2e54bf7f056b7b1630415fe33fb04b3 keeps observed execution independent of per-Agent coverage gaps, preserves unknowns and ended turns, and exposes causes through the existing accessible disclosure. Exact-head packaged UI, base/head counterexamples, provider reuse, TypeScript/CSS and local premerge checks pass. Remote CI was not consulted; installed native adoption is the next separate verification.

@huangruiteng
huangruiteng merged commit 5fb961c into main Oct 21, 2026
30 of 42 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants