Skip to content

feat(dashboard): denser workspace with stage bar and run band (intermediate) - #7730

Open
xiaoan17 wants to merge 11 commits into
loopx-project:mainfrom
xiaoan17:codex/local-dashboard-baseline
Open

xiaoan17 wants to merge 11 commits into
loopx-project:mainfrom
xiaoan17:codex/local-dashboard-baseline

Conversation

@xiaoan17

@xiaoan17 xiaoan17 commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

What this changes

A presentation pass over the local dashboard. Most of this PR is about the board (看板) and the Goal workspace surface — layout, density, and what the run flow shows. No backend or data-model changes.

Status: intermediate. This is a first step, not the final information architecture. The layout, the stage bar and the run band will keep changing in follow-ups; treat it as a baseline to iterate on.

Asking for design review

Please judge the details, not just the direction:

  • Row density — is one 40px line per Goal readable, or too tight?
  • Short labels — goalShortLabel() cuts long objectives at the first separator. Does the result stay recognisable?
  • Stage bar — Plan → Run → Accept with the current stage filled: does it read as progress, or as decoration?
  • Run band — 28 segments, colour is outcome only. Useful, or just a barcode?
  • Empty states — one dashed line instead of a panel. Enough information?
  • Board cards — title first, two lines max, status pill + age. Anything missing that you would want at a glance?

The rules behind these choices are written down in
docs/design/dashboard-design-system.md,
added by this PR so the next screen starts from the same numbers.

Density

  • Sidebar Goal rows: two lines (title + activity sentence) → one line, short label + state dot
  • New goalShortLabel() keeps long objectives out of lists; the full title stays in the tooltip and the drawer
  • Empty sections collapse to one dashed line instead of a third of the screen

Flow visibility

  • Six-cell vitals strip → Plan → Run → Accept stage bar (43px), current stage filled, others hollow
  • Attention moves into the document column, so the Goal page now reads 01 → 02 → 03 → 04
  • "All work" stops being a 320px right rail and becomes the last row of the document
  • Home: run band — the 28 most recent runs, one segment per run, colour is outcome only
  • Data path added: status.json run_history.recent_runs → WorkspaceModel.recentRuns → home

Noise removal

  • 5 help icons dropped from the vitals strip; missing data now simply says "not measured"
  • Lark settings: lone ⓘ trigger → the scope sentence rendered inline
  • Desktop notifications: settings block → sidebar bell with a status dot
  • Capability settings: middle column from bordered cards → 168px text index
  • Radius tokens replace 9/10/11/13/14/99px literals; settings went from six radii to two

Also

  • Task board toolbar: two rows → one (title · search · one filter select · view switch)
  • Task lanes: no tinted panel, hairline header, inline empty state; cards start with the title
  • Duplicate "Delivery & evidence" heading removed; drawer Goal titles clamped to two lines
  • Developer cockpit: projection diff rows render as cards, commands wrap at word boundaries

Verification

  • tsc --noEmit, build:desktop, smoke:home-route, smoke:workspace-locale, design-route smoke — pass locally
  • node scripts/check-css-custom-properties.mjs dashboard — 3809 references, no undefined properties
  • Five Goal views render with zero page errors; home main column 1055 → 609 characters
  • CI is currently red on dashboard-browser, chat-bundle-browser, windows-powershell and checks.
    conversation-activity also fails locally on an unmodified baseline, so at least part of this predates the branch;
    the remaining failures need the job logs to separate from the baseline.

Not included

  • /design/local-dashboard is a temporary design entry and should be removed or redirected before merge
  • Short labels are heuristic (text before the first separator); a real short_name belongs in the registry

Follow-ups

  • Task-level run data (execution sessions) so the band reflects work, not only Goal state refreshes
  • Board cards do not show the owner yet; the design board does
  • Research / benchmark surfaces and the docs showcase site have not had this pass

@mergify

mergify Bot commented Oct 30, 2026

Copy link
Copy Markdown

Hi @xiaoan17, the DCO Sign-off check did not pass. Please inspect
its details first: checkout, fetch, timeout or infrastructure errors
need their own recovery, not a rewrite of otherwise signed commits.

If the log confirms a missing Signed-off-by trailer, amend the
affected commit with git commit --amend -s; for multiple commits,
use an interactive rebase against the current base from the correct
base-repository remote and sign off each affected commit. Push the
rewritten PR branch with git push --force-with-lease origin HEAD.

5 similar comments
@mergify

mergify Bot commented Oct 30, 2026

Copy link
Copy Markdown

Hi @xiaoan17, the DCO Sign-off check did not pass. Please inspect
its details first: checkout, fetch, timeout or infrastructure errors
need their own recovery, not a rewrite of otherwise signed commits.

If the log confirms a missing Signed-off-by trailer, amend the
affected commit with git commit --amend -s; for multiple commits,
use an interactive rebase against the current base from the correct
base-repository remote and sign off each affected commit. Push the
rewritten PR branch with git push --force-with-lease origin HEAD.

@mergify

mergify Bot commented Oct 30, 2026

Copy link
Copy Markdown

Hi @xiaoan17, the DCO Sign-off check did not pass. Please inspect
its details first: checkout, fetch, timeout or infrastructure errors
need their own recovery, not a rewrite of otherwise signed commits.

If the log confirms a missing Signed-off-by trailer, amend the
affected commit with git commit --amend -s; for multiple commits,
use an interactive rebase against the current base from the correct
base-repository remote and sign off each affected commit. Push the
rewritten PR branch with git push --force-with-lease origin HEAD.

@mergify

mergify Bot commented Oct 30, 2026

Copy link
Copy Markdown

Hi @xiaoan17, the DCO Sign-off check did not pass. Please inspect
its details first: checkout, fetch, timeout or infrastructure errors
need their own recovery, not a rewrite of otherwise signed commits.

If the log confirms a missing Signed-off-by trailer, amend the
affected commit with git commit --amend -s; for multiple commits,
use an interactive rebase against the current base from the correct
base-repository remote and sign off each affected commit. Push the
rewritten PR branch with git push --force-with-lease origin HEAD.

@mergify

mergify Bot commented Oct 30, 2026

Copy link
Copy Markdown

Hi @xiaoan17, the DCO Sign-off check did not pass. Please inspect
its details first: checkout, fetch, timeout or infrastructure errors
need their own recovery, not a rewrite of otherwise signed commits.

If the log confirms a missing Signed-off-by trailer, amend the
affected commit with git commit --amend -s; for multiple commits,
use an interactive rebase against the current base from the correct
base-repository remote and sign off each affected commit. Push the
rewritten PR branch with git push --force-with-lease origin HEAD.

@mergify

mergify Bot commented Oct 30, 2026

Copy link
Copy Markdown

Hi @xiaoan17, the DCO Sign-off check did not pass. Please inspect
its details first: checkout, fetch, timeout or infrastructure errors
need their own recovery, not a rewrite of otherwise signed commits.

If the log confirms a missing Signed-off-by trailer, amend the
affected commit with git commit --amend -s; for multiple commits,
use an interactive rebase against the current base from the correct
base-repository remote and sign off each affected commit. Push the
rewritten PR branch with git push --force-with-lease origin HEAD.

@xiaoan17
xiaoan17 force-pushed the codex/local-dashboard-baseline branch from e58fc0d to 1828b80 Compare October 30, 2026 10:47
@xiaoan17

Copy link
Copy Markdown
Contributor Author

Browser-lane diagnosis: the redesign moved three shipped acceptance contracts

All three dashboard-browser shards failed, each on a different scenario, and
each failure traces to the same cause: this branch deliberately moved the
first screen's DOM and text, and three shipped scenarios still assert the
previous contract.

Shard Scenario Failure What it asserts
1 confirmed-operations page.waitForFunction timeout at confirmed-operations.mjs:98 the home brief returns to three tiles after the drawer closes
2 navigation-sorting First screen missing Codex; body=… the first screen names the agent/host
3 goal-activity locator.waitFor timeout at goal-activity.mjs:120 the Goal row shows its activity state and its owning host

What moved

The Goal row's activity sentence is gone. goal-sidebar.tsx now renders
the row's activity only when the Goal has a load state:

{goal.loadState ? <GoalRowActivity goal={goal} showLoad /> : null}

That <small> element was the only place on the first screen that named the
owning host: hostSurfaceLabel("codex-app") is "Codex App", and the row's
activity sentence is built from it (viaHost, hostClaimed). Shard 3 waits
for exactly that element (goalRow(...).locator("small", { hasText: "执行中" }))
and then asserts that a host-owned Goal reads 已安排 · 由 Codex App 线程负责,
and shard 2 asserts the first screen contains Codex for the same reason. The
agent id still appears on the board card (codex, from
goal.agentLabel ?? goal.agentId), but the host name no longer does.

The board card has no <footer> any more. The card is now identity mark,
short label, reason, meta, state and time:

<GoalIdentityMark goal={goal} />
<strong className="personal-home-goal-title" title={goal.title}>{goalShortLabel(goal)}</strong>
<p className="personal-home-goal-reason" title={…}>…</p>
<span className="personal-home-goal-meta">…</span>
<span className="personal-home-goal-state">…</span>
<small className="personal-home-goal-time" title={…}>…</small>

confirmed-operations.mjs reads that card's geometry through
card.querySelector("footer") and then footer.querySelector("small"), which
now has no footer to read. The scenario fails earlier than that, on the brief
tile count after the drawer closes; this branch also moves the brief out of
the right rail into the document column, so that part needs a local run to
separate from the layout change. The card-geometry read that follows is
independently broken by the removed <footer>.

The decision this needs

The design system this PR adds says a row is status dot or mark, primary text, secondary metadata, trailing time or count, and that the Goal page
carries the detail. That is a deliberate move of activity detail off the
overview, and it is the right shape — but it changes what the first screen
promises, so the shipped acceptances have to change with it. There are two
honest ways to close this:

  1. Update the three scenarios to the new contract. The activity state is
    still shown (the card's state slot and the Goal page's masthead), so the
    assertions can move to where the information now lives instead of being
    deleted. The host-ownership fact in particular still matters — a Goal whose
    work runs in an external host must not read as if LoopX were executing it —
    and that assertion should survive somewhere.
  2. Keep the owning host on the first screen. The card's secondary metadata
    slot already exists; naming the host there (Codex App) instead of the raw
    agent id (codex) keeps the fact visible and keeps the row at one line.

Recommendation: option 2 for the host name, option 1 for the rest. The
scenario bodies themselves were not changed in this branch, so the three
failures are the contract speaking, not a regression in the shipped behaviour.

This is left open deliberately rather than fixed in the branch: it is a
first-screen contract decision, and the PR asks the reviewer to judge exactly
this. Nothing here is fixed by widening a budget or relaxing an assertion.

@songoow songoow left a comment

Copy link
Copy Markdown
Collaborator

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 Astra Pro | OpenAI | self_reported

REQUEST_CHANGES — 4 项 P2。 审查 head e626fbbd575c39df8f6e4426517ab3a12852a266,merge-base 5c2ed9f6f2cf8a9bdc952f1c8dfceae92e062b0b;完整覆盖 27 文件(+752/-340)。前三项是实际源码/生产数据合同反例,第四项另有真实 CI 浏览器失败;没有把源码推导称作本地实跑。

动机 / Motivation

受影响的是在本地工作区跨 Goal 查看进度、处理待决事项、查阅成果的用户,包括正常加载和数据暂不可用时的日常浏览。

用户进入一个正在执行的 Goal,原先可在侧栏读到执行状态并进入成果阅读;这次把页面改为更紧凑的阶段条和分段文档,希望更快看清当前工作,但当前分支会隐藏正常状态及已有成果。

源码确认 Manager 运行条、看板卡片、Goal 阶段头部和侧栏通知已接入真实路由;同时确认有成果被隐藏、未知被写成完成或无待办、普通侧栏状态缺失四项回归。整体阅读体验是否改善尚未经过完整视觉验证。

本次审查只评价这个展示改动的现有入口和数据语义,不要求完成作者后续信息架构路线图,也不把缺少本地浏览器或改动规模本身当成代码缺陷。

改动思路 / Approach

保持现有数据投影、活动组件和结果 reader 的职责边界最合适:布局可以调整层次,完成/未知/空态仍由原事实和 owner 决定,CSS不应成为业务状态分类器。 当前 PR 的可用切片是默认工作区展示重排、短标题、阶段头部、通知入口与对应路由/smoke;不要求它完成未来信息架构,也不以未来提案免除当前语义回归。

/ 和 /design/local-dashboard 共用 DashboardRouteContent、searchSchema 和 DashboardPage,所以设计路由不隔离默认行为。原 status/digest/activity/result owner 提供事实,React/CSS负责呈现。判断完成、未知或空态的依据不能在布局层丢失。

合法输入 新判断产生的错误结果 应保留的依据
非空成果目录使用 button 无 li,隐藏整个成果 layout 结果 owner 的真实空态
monitor poll / classification 缺值 不含错误词,计为完成 明确结果类型与完成事实
attention 空但总量/覆盖未知 显示没有等你决定的事 完整且已知零才能空态
普通 Goal 没有 loadState 不显示 activity 文本 原活动状态组件

此表是源码对照,不是浏览器执行记录。

具体改动 / Changes

审查包括 Manager 运行条与摘要、看板标题/指标/原因行/滚动布局、Goal 三阶段头部与概览分段、任务/工作/交付证据折叠、通知迁入侧栏及设置/开发入口调整、短标题、临时设计路由、静态 preview、新设计文档和两个 smoke。全部 TSX/数据链、六个非生成 CSS diff、preview HTML 与 smoke 已读。生成 preview CSS 为 486,588 bytes 单行;检查了引用与本地资产边界,未声称逐字人工审读或把 mock 当实际产品验收。新增 smoke 主要覆盖 route、copy、query 往返,未覆盖非空成果 CSS 或普通侧栏状态。

采用改动前已接受的 apps/presentation/dashboard/design.md,修订 5c2ed9f6f2cf8a9bdc952f1c8dfceae92e062b0b。本次映射 visible-claim-lineage、completion-durable-facts、single-sidebar-semantic-state、files-readable 均未满足:可见状态须有事实来源,侧栏须有语义状态及文本/图标表达,成果须能阅读。新增 docs/design/dashboard-design-system.md 是提案,不能反向授权回归。

关键代码讲解

  1. goal-loopx-mode.css:146–147 从 DOM 标签推断空态;静态 import 使规则进入默认页面和多个结果 owner。
  2. DashboardPage:2969–2977 -> RunBand:60–82 新增 recentRuns 投影并统计完成,已越过纯样式调整。
  3. GoalOverview:56–61/109 读取 typed digest,却在列表空时忽略 unknown/coverage 的含义。
  4. GoalSidebar:110 新 gate 删除普通 GoalRowActivity;加载状态不能代替活动状态。
  5. GoalVitals:169 改为计划/执行/验收与原导航回调,goalShortLabel:10 做局部标题缩短;这些路径已读,整页与窄屏表现仍未验证。

对主干的风险 / Risks

P2-1,goal-loopx-mode.css:146–147:非空成果被隐藏。 Team/Managed/Research 的 nav[data-result-catalog] 直接映射 ResultCatalogRow,后者在 result-catalog.tsx:13 返回 button,没有 li。新增 :not(:has([data-result-catalog] li)) 因此在有成果时也成立,隐藏整个目录和 reader;后续 display:grid 特异性更低,不能覆盖。Explore 复用 layout 且无该 catalog 标记,也受影响。实际 Files 入口在 PersonalWorkspacePage:392–399。请优先依据 owner 显式空态,只压缩确实空的部分;若使用 data-result-key,还须保留 Explore 的不同 DOM 和当前页为空但仍有 next 的情况,不能简单全局替换;覆盖非空、空、loading/error,以及 desktop/narrow 目录选择、阅读与返回。此项是 markup/CSS 的确定性推导,未做本地浏览器实跑。

P2-2,dashboard-page.tsx:2973:非错误分类被算作完成。 runRecordSchema 的 classification 是可空自由字符串;真实 quota/monitor_poll.py 将 quota_monitor_poll 记录写入 recent_runs(第584–587行)。监控观察和缺值都不匹配错误词 regex,因而进入 completed;RunBand 又用 recent.length - failed 显示“完成”。请复用 typed outcome/完成事实,保留 unknown/observation,不要扩充错误词表。回归应从实际 status 消费端覆盖 monitor、缺值、明确完成和失败。

P2-3,goal-overview.tsx:109:未知待决事项被写成无待办。 attention 空、totalAttention 为 null 时,showAttention 为 false;上游 goal_workspace_digest.ts:195–219 确实允许 unavailable、null counts 与 unknown coverage,partial 也不能证明完整零。新增肯定空文案会误导用户无需介入;旁边“查看”按钮不修正主声明。请只在 availability 正常、coverage 完整且总数已知为零时显示空态,其他分支明确未知/部分和恢复入口,并分别覆盖上述状态。

P2-4,goal-sidebar.tsx:110:正常 Goal 失去侧栏状态文字。 普通 loaded Goal 没有 loadState,新条件移除 running/quiet/claimed 的 GoalRowActivity。身份标记是 aria-hidden;GoalActivityHelp 在缺少 hostThreadActivity、Goal 已停止,或存在 loadState 时返回 null,不能替代普通活动文本。实际 CI job 124053833801 的 goal-activity.mjs:120 等待 Progress Projection 行“执行中”15秒超时,与这次改动吻合。请恢复原 activity owner 的无条件显示,保留加载和补充说明;不要删断言。修复后重跑 LOOPX_PERSONAL_WORKSPACE_SCENARIO=goal-activity node examples/personal-workspace-browser-smoke.mjs,并覆盖其他正常状态。

语义与 CI 对齐

四项都触及现有状态来源、侧栏或成果阅读合同,不需要新增后端协议/权限。局部修复应复用原 typed digest/activity/result 词汇,保留现有 smoke。git diff --check PASS;上述实际 CI 活动断言 FAIL;本地 UI、同 fixture 的 base/head 浏览器对照和整页/default/expanded/narrow 视觉 UNVERIFIED。

独立核验了 CI bundle 的35个资产摘要、673个源码输入;24个 PR 改动输入全部匹配审查 head。manifest 源是 CI merge f38b5595c53ce30fe7c8fd002c379ada5dfe90f1(此 head 合入 main 0ad08b15dd7331051c93566075561a390a9cd7e2),其余20处差异全部等于该 main。因此可绑定受影响代码,不能称为整个未合并 head 的完整产物,更不能据此证明视觉通过。同 run 可读取 artifacts 无截图/trace;本地前端依赖/浏览器条件不齐,未渲染真实整页。

我的整体评价 / Verdict

REQUEST_CHANGES,固定 head e626fbbd575c39df8f6e4426517ab3a12852a266。 长程跟踪的可见信息与用户体验均为 regression;没有证据表明后端成果被删除或持久结算权威改变。阶段性布局调整是合理范围,但当前成果/状态回归不能延后处理。

路由复用和局部标题 helper 合理,修复无需新框架或兼容层。整体样式收益与体量是否相称仍缺完整视觉证据;改动规模本身不是 finding。本 PR 没有 opt-in/default-off 承诺,临时路由也不隔离默认页面。重新审查需要修正四项具体分支、保留既有断言、补正常/异常及成果阅读回归,并提供整页、默认、展开、窄屏证据。未完成视觉不是新增审美猜测,也没有声称完整 UI suite 或合并资格已通过。

未在本地浏览器渲染真实整页、默认/展开或窄屏状态;本地前端依赖/浏览器条件不齐。已核验的 CI bundle 不是截图,当前可读取的同 run artifacts 没有截图或 trace。 Manager、看板、Goal 默认/展开、成果阅读、侧栏通知、窄屏和键盘/焦点的完整视觉验收未完成;不把静态 board-preview 或 bundle 哈希当作渲染通过。

English verdict: REQUEST_CHANGES — e626fbb; four P2 regressions hide nonempty results, misreport completion and empty attention, and remove normal sidebar activity. Full browser parity and visual qualification remain unverified.

@mergify

mergify Bot commented Oct 30, 2026

Copy link
Copy Markdown

This pull request has merge conflicts with main and cannot be merged
until they are resolved. Please rebase or merge the base branch, @xiaoan17.

Choose the remote for the base repository, not an out-of-date fork.
For a fork clone, first inspect git remote -v; upstream must point
to https://github.com/loopx-project/loopx.git. If it is absent, add it
with git remote add upstream https://github.com/loopx-project/loopx.git.
Then run:

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 HEAD

For a same-repository clone whose origin points to
https://github.com/loopx-project/loopx.git, use origin instead of
upstream for fetch/rebase. If you prefer merging the base, use
git merge <base-remote>/main and push normally.

Keep the DCO Signed-off-by trailer on every commit when you rebase.
https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork

@mergify mergify Bot added the needs-rebase Mergify: the pull request has merge conflicts with its base branch label Oct 30, 2026
- one-line Goal rows with short labels; full title moves to tooltip/drawer
- collapse the six-cell vitals strip into a Plan → Run → Accept stage bar
- wire status run history into a home run band (28 most recent runs)
- single-row task toolbar with one filter control; inline empty lanes
- desktop notifications become a sidebar bell instead of a settings block
- quiet the capability nav, inline scope hints, drop stray help icons
- dedupe the Delivery & evidence title; clamp drawer goal titles

Signed-off-by: xiaoan17 <xiaoan17@users.noreply.github.com>
Shape was ad hoc (7 radii in one screen). Introduce --pw-r-control/item/
card/pill and a 4-24px spacing scale, then replace 9/10/11/13/14/99px
literals with them. Settings now renders two radii instead of six.

Signed-off-by: xiaoan17 <xiaoan17@users.noreply.github.com>
- attention moves into the document column so the Goal page reads 01→04
- home tiles become flex-wrap so a tall tile stops stretching its row
- home spacing uses the token scale

Signed-off-by: xiaoan17 <xiaoan17@users.noreply.github.com>
Empty research history and empty report sections become one-row
statements instead of bordered panels.

Signed-off-by: xiaoan17 <xiaoan17@users.noreply.github.com>
break-all split npm command names mid-token; the diff table now gives
Axis a fixed width so the remaining columns stop stacking one word per
line.

Signed-off-by: xiaoan17 <xiaoan17@users.noreply.github.com>
A four-column table in a half-width panel stacked one word per line.
Each axis is now a card: title, then Current / Proposed / Gate.

Signed-off-by: xiaoan17 <xiaoan17@users.noreply.github.com>
The right rail held nothing but the inventory, so it cost a full column
for one collapsed row. The inventory is now a full-width disclosure after
the Now section; the Goal page is a single 1120px column.

Signed-off-by: xiaoan17 <xiaoan17@users.noreply.github.com>
The leading status glyph stole a column from every card, so titles
wrapped around it. Cards now match the design: two-line title, then a
status pill and age.

Signed-off-by: xiaoan17 <xiaoan17@users.noreply.github.com>
Radius and shadow already matched; padding, gutters and card type now
follow the same numbers as the design board.

Signed-off-by: xiaoan17 <xiaoan17@users.noreply.github.com>
Tokens, shape, spacing, type, status colour, component rules and the
stage/run-band flow, so the next screen starts from the same numbers.

Signed-off-by: xiaoan17 <xiaoan17@users.noreply.github.com>
Two browser contracts depended on what the density pass removed:
lanes must stretch so each owns a bounded scroll region, and a Goal card
still carries its reason sentence. The reason is now one clamped line.

Signed-off-by: xiaoan17 <xiaoan17@users.noreply.github.com>
@xiaoan17
xiaoan17 force-pushed the codex/local-dashboard-baseline branch from e626fbb to b3456e1 Compare October 30, 2026 18:07
@xiaoan17

Copy link
Copy Markdown
Contributor Author

Rebased onto main, and one more acceptance that moved with the design

The branch was rebased onto the current main (head b3456e110), so the PR is
no longer conflicting. The rebase touched one file,
apps/presentation/dashboard/src/features/personal-workspace/personal-workspace.css,
in two regions, and both were resolved mechanically:

  • Additive region — main added the .personal-document-attachment rules
    (the document-attachment feature) next to the block this branch adds. Both
    blocks are kept, main's first.
  • Same-rule region — main carried border-radius: 10px and
    .personal-composer-images figure > button; this branch's radius-token
    commit changed those to var(--pw-r-item) and
    .personal-composer-images button. The branch's side wins, since that is the
    tokenisation this branch introduces and --pw-r-item is defined in the same
    file.

No other file needed a decision: personal-workspace-model.ts,
personal-workspace-page.tsx and dashboard-page.tsx merged cleanly.

Local validation on the rebased head:

npx tsc --noEmit                                    clean
node scripts/check-css-custom-properties.test.mjs    ok
node scripts/check-css-custom-properties.mjs dashboard
    35 stylesheets, 70 defined tokens, 3813 bare references, no undefined references
npm run build:desktop                               built
npm run smoke:home-route                            home-route smoke ok

One more acceptance that moved with the design

examples/dashboard-home-browser-smoke.mjs is new in this branch, and it fails
at the branch's head — before and after the rebase, identically:

Error: Missing dashboard home text: 需要你, 询问全局待办, 汇总所有 Goal 进展, 创建新 Goal, Codex

The page it renders does show GOALS, LoopX 管家 and the showcase Goal
titles; what it no longer shows is the channel buttons (询问全局待办,
汇总所有 Goal 进展, 创建新 Goal) and the agent name (Codex) — the same
first-screen contents the three shipped scenarios assert. The branch's own new
acceptance therefore still encodes the previous first screen while the branch
implements the next one.

This file is not wired into CI, so it does not appear as a red check here; it
is the branch's own design acceptance, and it fails for the same reason the
shipped navigation-sorting, goal-activity and confirmed-operations
scenarios fail. It is left as it is rather than rewritten to match whatever
the page currently renders: pinning the current output would make the
acceptance vacuous, and what the first screen must show is the decision this
PR asks the reviewer to make.

The two options from the earlier diagnosis therefore cover four acceptances,
not three: either the first screen keeps naming the owning agent and its
channels, or those acceptances move to where the redesign puts that
information.

@mergify mergify Bot removed the needs-rebase Mergify: the pull request has merge conflicts with its base branch label Oct 30, 2026

This branch has not been deployed

No deployments
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