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>
完整前端对照 · 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.