Repository navigation
fix(dashboard): readable Explore thirds and Goal empty states - #7478
huangruiteng wants to merge 5 commits into
Conversation
First-screen verification evidencePlaywright against the live local status/chat servers (same 1. Unmeasured Goal vitals: em dashes with hover → own explanatory value, non-interactiveBefore (current main, demo Goal with no measured usage): After (this branch): Agent 用时 / 成本 show 未采集, 最近活动 shows 暂无观测到的活动, 等你决定 shows 暂无等待; cells are muted and no longer clickable hovers. 2. Manager brief: "正在执行 0" hid the queued GoalsBefore: the 0 tile had no sub-line — the 5 Goals handed to host app threads were invisible in this tile. After: the same tile reads 5 个已安排 · 由宿主 App 线程负责. 3. 成果 tab: dev proxy leaked SPA HTML as a JSON SyntaxErrorBefore over the vite dev port ( After: the dev proxy forwards the status server's extension/report paths; a genuinely missing optional index reads as 本 Goal 暂无可读取的公开研究成果 instead of an error (verified on a real Goal, no HTML leak). Verification
Screenshots were captured at 2x DPR; the image upload endpoint rejected attachments from this environment, so I will add the before/after images from the local evidence set ( |
When all Explore records fall within a sub-6h window, the time-anchored reading model split them into three equal phases, leaving two empty early/middle/late cards (observed on EdgeBench runs whose imported log spanned minutes). Below the threshold the timeline now renders one whole-history reading group; long spans keep the three thirds. Adds a control-plane unit test covering both spans. Signed-off-by: huangruiteng <huangruiteng@users.noreply.github.com>
…ion research - Unmeasured Goal vitals (Agent time, cost, last activity, needs-you at zero) rendered bare em dashes with click affordance; they now show their own explanatory value (not measured / nothing waiting / no activity) as muted, non-interactive cells instead. - The manager brief hid the queued-Goal count entirely when no verified run was present; it now shows a separate queued-only note so Goals handed to host app threads stay visible. - Research results treated a missing optional presentation index (404/410) as a read failure and surfaced the dev server's HTML as a JSON SyntaxError; a missing index now reads as no published research. - The dashboard dev proxy forwards the status server's extension and periodic-report paths, so the research workspace works over the vite port instead of returning the SPA HTML. Signed-off-by: huangruiteng <huangruiteng@users.noreply.github.com>
Signed-off-by: huangruiteng <huangrt01@163.com>
0b08c42 to
c8d6796
Compare
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
动机 / Motivation
研究者在 Goal 概览和成果页需要辨认真实进展、未采集数据与没有成果。
短研究记录原先仍分成三个时间组,缺测读数只有破折号;开发服务器还可能把成果接口返回为 HTML。本 PR 收起短记录的空分组、明确缺测和排队状态,并补齐原 status 服务的开发代理。
实际验证确认这些展示路径大体成立,但成果索引返回 404/410 时出现新的空白正文,尚未完成所承诺的可读空态。
范围限于现有展示与开发路由,不改变研究结果、执行准入、计费或已安装 App。
改动思路 / Approach
保留 typed Explore timeline、Goal digest、ContextHelp 和 extension reader 是合适的边界。时间跨度决定一组或三组,仅用于阅读;Goal 的缺测、完整空注意事项和实际执行状态继续取自原 owner,不能由显示文案推导完成。
当前 PR 可以保留这些局部展示与代理改动;最小修复是在现有成果 reader 内让“缺少可选索引”进入完整空态,其他读取失败继续保留错误及刷新。
保持原状会继续留下空卡片和开发接口 HTML 泄漏;新建状态机或配置项则没有必要。Vital.empty 取消无意义跳转但保留独立帮助入口;Vite 只把既有只读路径交给原 status target,不应成为新的配置或权限 owner。
具体改动 / Changes
已读完整十一文件 diff,当前 head 为 c8d679679dac1e7b8c22da888740dafcdf1f4a02。规范依据 docs/development/design.md,accepted revision a704725d6734b618f267568071960760c6620687:
Research Workspace / 研究工作台:implemented,完整记录和原始关系保留;短记录改为全程分组,不是评估窗口或因果结论。Status And Control-Plane States:implemented,缺测不补零,完整零等待与覆盖未知分别显示,排队不冒充实际执行。States that are designed, not defaulted:not_met,下面的 404/410 反例留下没有状态正文的成果区,需要本 PR 内修复。
关键代码讲解
buildExploreTimeline在六小时以下建立一个 phase;原 bins、记录时间、负面结论、筛选与原文关系仍由已有模型提供。长跨度保留三个 phase。GoalVitals仅在 availability 正常、coverage 完整且两个计数均为零时显示“暂无等待”;缺测 usage 保持未知,ContextHelp 仍可聚焦读取。GoalResearchResults新增indexMissing;它隐藏了错误,却没有同步空态条件。ManagerBrief和 Vite 的其余变化分别补回排队提示和原 status endpoints,没有新增执行操作。
独立验证:完整 dashboard/Chat build PASS;两个完整 typed suites 29 PASS;实际 status extension 与 Explore backend 12 PASS;打包的 goal-masthead、navigation-sorting 两个场景均通过。标准 premerge 的 4 direct / 13 selected 命令通过,初始精确 CQR 为 stale hold;独立复验已据当前缺陷记录失败,不能据自动检查通过批准。
对主干的风险 / Risks
[P2] 缺失索引也需要实际渲染空态正文
GoalResearchResults 的外层 catch 将非 2xx 索引请求保存为非空 error。404/410 随后使 indexMissing=true,错误段落被抑制;空态段落却仍要求 !error,因此同样不渲染。实际 Files 调用没有启用 hideEmpty,用户最终只看到“研究成果”和刷新按钮,无法判断是否没有成果或读取仍未结束。
我用原组件和真实 HTTP 200/404/410/500 响应复验,并与 accepted-base 组件同条件比较:200 空集合保留说明,500 保留错误;head 的 404、410 均无正文,刷新后仍然如此。最小修复可在 catch 前把这两种响应明确归为空集合,或让现有空态条件包含 indexMissing;保留其他 HTTP/解析失败、Goal 切换及旧内容清除。补测默认 Files 场景的两种缺失响应、刷新/切换和 500,不能只验证 hideEmpty=true。
其余风险主要是三等分到全程的选择状态、未采集帮助和未知 coverage;已执行的 typed/打包路径支持其当前行为。尚未重新资格正式 App 安装、所有源切换组合或持续用户理解,不用本次截图或测试数代替这些结论。
我的整体评价 / Verdict
REQUEST_CHANGES,仅上述可复现的空态缺陷阻塞本 head。long_horizon 的研究事实和执行权限保持;user_experience 在缺失索引分支发生退化,修复范围很小,不需扩展为新的成果平台。独立检查了带长任务和混合状态的打包桌面/390px 整页,缺测文案与真实数值可区分;Ego 的实际组件/HTTP 对照确认空白状态。视觉观察不等同理解收益;正式安装和完整源切换仍未资格。没有查询、轮询或等待 CI,也未合并、安装或改变作者分支。
English verdict: REQUEST_CHANGES c8d679679dac1e7b8c22da888740dafcdf1f4a02: HTTP 404/410 hides both the error and empty-state body; build, 29 typed tests, 12 backend tests and two packaged scenarios otherwise pass.
| </button></header> | ||
| {busy ? <p role="status">{zh ? "正在核验研究结果…" : "Verifying research results…"}</p> : null} | ||
| {error ? <p role="alert">{zh ? "无法核验研究结果;旧内容已清除。" : "Cannot verify research results; previous content was cleared."} {error}</p> : null} | ||
| {error && !indexMissing ? <p role="alert">{zh ? "无法核验研究结果;旧内容已清除。" : "Cannot verify research results; previous content was cleared."} {error}</p> : null} |
There was a problem hiding this comment.
[P2] 缺失索引时仍需渲染空态正文
默认 Files 调用未传 hideEmpty。索引返回 HTTP404/410 后,catch 保存非空 error;新增 indexMissing 把错误隐藏,但下面的空态仍要求 !error,因此用户只剩“研究成果”和刷新按钮,刷新后仍空白。用真实 HTTP200/404/410/500 与 accepted-base 组件同条件比较确认,200空态与500错误是控制。请让已知缺失进入原有完整空态,保留其他 HTTP/解析错误与 Goal 切换清旧数据,并补默认 Files 两种缺失响应、刷新/切换及500的回归。
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
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; OpenAI gpt-6.1-sol; runtime_reported; reasoning_effort=max
非阻断意见 [P3]:短时记录已经显示“全程 / Whole run”,但 goal-research-timeline.tsx:123 的 group aria-label 仍使用固定三等分说明。实际中英文 accessibility snapshot 均可复现。建议让组名与同一单组/三组分支保持一致,并为短时中英文组名补一个断言;当前按钮名称、计数、完整记录和键盘入口均可读,所以不构成阻断。
动机 / Motivation
在 Goal 工作台查看概况、短时研究记录和公开研究成果的用户。
短时研究原来仍被分成三个阅读组,未采集用量只有破折号;旧评审版本的可选索引 404/410 甚至只剩标题和刷新按钮,使用户无法判断空态与失败。
当前页面明确区分未采集、没有等待和未观测活动,短记录显示全程,缺少可选索引显示可读空态,真正的 HTTP 或解码失败仍能刷新恢复。
本次只修现有阅读与开发代理路径,不改变活动观测、权限、研究事实、评分或模型执行,不代表正式 App 已安装采用。
我按当前完整12文件重新评审,既核验原空白区问题,也检查概况、排队提示、时间分组、开发代理与既有消费者,没有沿用旧 head 的测试或批准。真实未观测活动和排队工作仍有不同含义;把一个零改成更明确的文字,不能顺带宣称整个 Goal 没有活动。
改动思路 / Approach
现有 digest 决定真实状态,timeline owner 决定阅读分组;组件只展示这些事实,HTTP 空态沿原有结果生命周期恢复。
当前边界是已有页面的可读性与错误恢复,保留完整来源和失败;不把它扩大成新的研究执行器或整站改版。
三类变化都有现成 owner:digest 提供测量和覆盖,timeline 从原 record time 派生阅读分组,研究成果 effect 管理当前 Goal/URL/revision 的 loading、结果和错误。组件复用这些值,在现有入口内解决问题,不再引入一个独立 indexMissing 状态。对404/410提前返回,仍经过 finally 清 busy;500和成功 HTTP 中的坏 JSON 必须进错误路径,不能靠字符串里出现404便叫空态。
| 输入 | 当前结果 |
|---|---|
| 完整覆盖且无等待 | 暂无等待;部分覆盖不会被这个分支当成完整空集合 |
| 缺用量/缺活动观测 | 未采集/暂无观测到的活动,帮助仍可达 |
| 记录跨度小于6小时 | 一个全程阅读组;长跨度继续三等分 |
| 可选索引404/410 | 清楚空态与刷新 |
| 500或HTML/坏JSON | 真实错误与恢复入口 |
具体改动 / Changes
关键代码讲解
GoalVitals只在 availability=ok、coverage=complete、blocking=0、optional=0 时采用暂无等待。缺测用量和缺活动不再只留破折号;Vital对空值移除导航 handler、设置 aria-disabled 和负 tabIndex,但兄弟 ContextHelp 仍可操作,真实零测量仍走原分支。buildExploreTimeline仅按跨度选择1或3个阅读组;原记录、finding状态、数量和明确关系不变。阶段定位/筛选复用既有 phases 数组,最后端点仍被最后一组包含。界面标题和帮助随单组显示全程,且继续说明它不是预声明评估窗口。GoalResearchResults在 response.status 恰为404或410时返回;挂载/Goal切换/刷新先清旧结果和错误,finally 清 loading,cleanup 阻止迟到旧结果覆盖。原 review 的两个条件互相排斥、留下空白的路径已经移除。ManagerBrief保留实际 running 数量,并在只有 queued 时给出独立说明;没有把已安排算成已观测执行。中英文文案走原 i18n,CSS只改变空值的外观与指针。Vite把新增本地只读 status 路由交给同一 statusProxy,生产路由和执行服务不变。
规范依据是 docs/development/design.md,固定于 dd30e694a0c3db80e59600c781d67647a73d0bc9,逐项核验其原章节:Research Workspace / 研究工作台 的原始记录/负结论阅读,Status And Control-Plane States 的未知与真实零区分,States that are designed, not defaulted 的空态/加载/失败/恢复,以及 Populated Page Review 的长内容、展开和窄屏观察。未把未来研究能力、安装或整个前端整改加入本次门槛。仓库经验仅用于核实际阅读任务与恢复,不当作当前版本自动通过。
独立当前验证:29项 timeline/digest、4项真实 Explore HTTP 测试通过;安装缺失的工作区依赖后,Dashboard与Chat两个bundle构建通过。research-results、goal-masthead、navigation-sorting 三个既有打包场景使用原20秒服务就绪限制全部通过,覆盖空态、旧结果清除、部分/未知值、中英和刷新/Goal切换。标准 premerge 4项直接检查和13项选择检查通过。最初缺依赖的构建失败与作者此前的启动超时保留为各自历史,当前通过不被拿来认证长期启动稳定性;按当前策略未查询CI。
在同一12条合成原始记录和真实隔离SQLite/HTTP reader上,实际比较基线与当前完整包。另将旧已审前端 c8d6796 接到同一个当前后端,404/410确实只剩标题和刷新,新包都显示完整空态;这是旧前端消费者反例,不声称旧后端也已重新资格。500和包含HTTP404字样的HTML仍显示错误;390px用键盘Enter刷新500到410能恢复,焦点保留在刷新按钮。原始输入、状态文件和事件字节的后端读回均未变化;隔离后端拒绝了页面的POST尝试,不把“未执行模型”写成“零HTTP请求”。
对主干的风险 / Risks
没有阻断性发现,旧404/410空白区已得到当前精确版本的独立反例/修复证据。仍需注意短组的 aria-label 文字不一致,已在开头列为非阻断P3。六小时是阅读组织阈值,不是科学窗口;普通数据没有新增“研究成功”或因果状态。完整覆盖之外的零不会被新空态条件隐藏,真实失败和来源未知继续可见。
视觉观察与功能断言分别记录:桌面实际1200×888,窄屏390×844;长中英标题和重复证据、3个已反驳与3个暂定结论、概况未知值和1排队/0执行、默认/展开/错误恢复都检查过。单组卡片仍沿三列网格占一列,存在留白;这不遮挡记录,算可后续改善的构图细节。完整原文、所有记录及按需帮助仍可到达。原始时间和来源保真由真实后端读回支持,截图本身不能证明持久化、真实用户理解或模型采用。
我的整体评价 / Verdict
现有 digest 决定真实状态,timeline owner 决定阅读分组;组件只展示这些事实,HTTP 空态沿原有结果生命周期恢复。
当前边界是已有页面的可读性与错误恢复,保留完整来源和失败;不把它扩大成新的研究执行器或整站改版。
在实际打包页面中,未知数值以正文状态读回,短记录主区只保留一个全程组;长中英混合标题、负结论和完整依据展开后仍可读,404/410 与真正错误明确区分。
正式安装 App、真实用户理解收益和全站所有内容未验证;短时单组的 aria-label 仍提三等分,是非阻断的无障碍文字问题。
APPROVE 当前完整版本:原本难以区分的空、未知和错误已有可读出口,短时记录与排队提示也准确,不要求用户重复输入或新增确认。已附公开合成前后图的PR描述提供审阅入口;本次独立观察的安装/合成边界另行保留。正式 App、实际用户理解、全站可读性和全部长期启动条件仍未资格;P3组名修正可以后续补齐。本结论不包含合并或安装授权,也不代替旧正式变更请求的清理权限。
English verdict: APPROVE — ed6baf4; prior404/410 blank state resolved, no blocking finding. Packaged/real-backend checks passed; a nonblocking short-group ARIA label mismatch and installed-user qualification remain.
完整前端对照 · 20 组 / 40 张
快速查看:Goal 指标 · 管家简报 · 研究时间线 · 成果页 · 非视觉改动与边界。每组左侧为主干、右侧为本 PR;点图可查看原尺寸。展开项包含提示、英文及错误/未知状态的完整对照。
—→ 未采集 / 暂无观测到的活动;完整空待决0→ 暂无等待;空值取消跳转与 Tab 停靠,说明入口保留;有值与覆盖不全的对照对照版本:Before 为目标主干 dd30e694a 的真实打包页面;After 为当前 PR ed6baf49b 的真实打包页面。两侧使用相同合成输入、视口和语言。这里统一使用目标主干对照,替换此前不同旧版本的分散截图。
桌面 1440×900;窄屏 390×844,HTML 错误长文另用 390×982 展示全文。使用公开
goal-showcase组合及合成状态;时间线的 12 条合成事件经过真实 Explore SQLite/HTTP 读取 owner。状态、用量、队列和可选索引响应由隔离 HTTP fixture 提供。图中的交付检查失败、缺少分析包及委派接口未接入状态在两侧保留。这些图片验证打包页面,不代表已安装桌面 App,也不证明真实模型收益。V1. Goal vitals
默认状态直接给出“暂无等待 / 未采集 / 暂无观测到的活动”,不再只用 0 与破折号。空值字体、颜色和悬停语义收敛;DOM 另读回
aria-disabled=true、tabIndex=-1,说明按钮仍可打开。工作总数和其他真实读数保持可见。展开指标细节:说明入口、已有用量、覆盖不完整(3 组)
V2. Manager brief
“正在执行”仍为 0;新增独立的“1 个已安排 · 由宿主 App 线程负责”。安排数量没有混入已观测执行数量。英文补充
1 queued。展开英文简报(1 组)
V3. Explore timeline
同一份 5 分钟、6 条记录:前/中/后三张阅读卡收为一张“全程”,三条结论的确认/反驳/暂定状态仍保留。时间范围、密度和原记录数量不变。
展开英文、读法提示、长记录和原结论详情(5 组)
V4. Research results
目标主干在可选索引 404/410 下显示错误;本 PR 显示“本 Goal 暂无可读取的公开研究成果”,刷新入口保留。500 与解码失败继续显示红色错误,不会被索引缺省规则吞掉。下图使用相同 HTTP 状态与响应正文。
展开 410、服务器错误和非法 JSON(3 组)
V5. Scope and observations
ed6baf49b。20 组页面均回读根节点无横向溢出;读取过程中模型请求、状态 action apply、真实历史 owner 的写入尝试均为 0,合成源字节未改变。vite.config.ts的开发代理转发属于非视觉改动;打包截图不能验证开发代理。共享explore_timeline.ts的阈值规则体现在 V3;回归脚本和测试修改没有另增产品界面。代码分别见 Vite 配置、时间线 owner。aria-label仍沿用三等分描述。本轮图片更新未修改这处无障碍文案。提示图包含键盘展开态,本轮不新增触屏验收结论。以下保留原代码修复的实现摘要与验证范围;此前通过的检查不改写成本轮重新执行。
Summary
Validation
Validated correction:
ed6baf49bae6262872ae7310f7976f959184e005, including target maindd30e694a0c3db80e59600c781d67647a73d0bc9.research-results: default 404/410 empty states, keyboard Refresh, HTTP 500, invalid JSON, recovery, Goal switching, English copy, owner-only exclusion and zero model calls.goal-masthead.navigation-sorting. Two initial starts exceeded the unchanged 20-second readiness deadline (an isolated startup took 23.5 seconds); the subsequent run started normally and passed without changing the timeout or scenario assertions.These are source-checkout packaged-bundle checks, not proof of an installed App update.