Skip to content

test(workspace): repair the remaining dashboard-browser lane failures - #7508

Merged
loopx-agent merged 4 commits into
loopx-project:mainfrom
LIHUA919:codex/dashboard-browser-lane-repair-20261027
Oct 27, 2026
Merged

loopx-agent merged 4 commits into
loopx-project:mainfrom
LIHUA919:codex/dashboard-browser-lane-repair-20261027

Conversation

@LIHUA919

@LIHUA919 LIHUA919 commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

Goal And Delivered Outcome

Author Declaration

  • Written by: model_agent (Claude Opus, Anthropic), at the account owner's direction.

Implemented against

Criterion (spec clause) Disposition Symbol / path Test or command
Managed-session acceptance runs in the lane's install (no test extras) implemented examples/personal-workspace-browser/managed_agent_fixture.py (ProcessPatch) LOOPX_PERSONAL_WORKSPACE_SCENARIO=managed-agent-sessions node examples/personal-workspace-browser-smoke.mjs with no pytest installed
"All work remains reachable" is checked after the expansion actually renders, still within the 2s budget implemented examples/personal-workspace-browser/goal-workspace-m2.mjs LOOPX_PERSONAL_WORKSPACE_SCENARIO=goal-workspace-m2 node examples/personal-workspace-browser-smoke.mjs
Drawer help tooltip is exercised after the drawer's documented focus handoff implemented same file, verifyRemoteSelection same command
Assertions follow deliberate UI moves without weakening the fact checked implemented research-finding-reader.mjs, goal-suggestions.mjs single-scenario runs, 2/2 each
Lane green on hosted runners deferred to this PR's CI — dashboard-browser (1/2/3)
  • Self-check before submission: reproduced each failure on the base before changing it (negative control below), reran the changed scenarios in an environment matching the lane (checkout installed without test extras), ran all three shards locally, and ran the upstream managed-fixture-process.test.mjs. Deliberately left out: product code changes (see Scope).

Scope And Continuation

  • Completed scope and remaining work: test- and fixture-only. The scenarios' assertions and budgets are unchanged. Only what they wait for changed: the fixture's import surface, a poll until all 200 items are visible inside the existing 2s budget, and a wait for the drawer title to take focus.
  • Not in this PR, found while reproducing:
    • Possible product race (macOS, local): in conversation-activity, right after switching the Goal view Tasks → Chat, the live Turn's pending receipt is briefly absent: the Chat-exit cleanup retires it and recovery re-creates it only after createChatSession. A Command+Enter steer in that gap takes the ordinary-send path and clears the composer draft. It reproduced in about 3 of 4 local macOS runs at conversation-activity.mjs:253, but hosted Linux shard 1 passes this scenario. A real fix changes composer turn-admission or Goal-view observer retention, so it needs its own review rather than a test change here.
    • Local-only flakes that pass on hosted runners: research-worker-readback (ECONNRESET from the disposable backend in my environment) and research-record-search (focus, passes in isolation).
  • Slice boundary / successor: if this PR's hosted shards are green, [Bug]: the required dashboard-browser lane is red on main — a steward view switch drops the live turn's elapsed receipt #7384 can close. A follow-up issue for the composer race above is proposed, not yet filed.

Validation

  • Tested revision: bae64527c (on main 1b6dd6a42). An earlier hosted run on a73a070c8 passed dashboard-browser (1) and (3) and failed (2) at research-finding-reader, which the later commits fix.
  • Run state: finished (local); hosted CI running on this PR.
  • Input classes: synthetic
Check kind Result Public-safe evidence / limitation
regression_parity passed Negative control on the base: managed-agent-sessions fails with ModuleNotFoundError: No module named 'pytest' when the checkout is installed without test extras; with this branch it passes (2/2).
real_entrypoint passed goal-workspace-m2: before the fix, fails 1 of 3 local runs (line 261); after, 4/4 and 3/3 on the rebased head. The hosted line-155 failure did not reproduce locally; the fix waits for the same visible count the assertion requires.
real_entrypoint passed Full local shards with the fixes: shard 1 passes all 27 scenarios (with a local-only wait for the macOS race above, not committed); shards 2/3 stop only at the local-only flakes listed in Scope, which pass on hosted runners.
real_entrypoint passed Shard-2 scenarios after the previous hosted stop point, run individually: research-finding-reader (2/2), goal-suggestions (2/2), research-display-language, replan-cadence, since-you-looked, first-goal-agent-unavailable, attention-notifications, completed-history-isolation.
unit passed node --test examples/personal-workspace-browser/managed-fixture-process.test.mjs (6/6).
static passed py_compile; node --check; scripts/generate_semantic_inventory.py --changed-from HEAD reports no new vocabulary carriers.
real_entrypoint running Hosted dashboard-browser (1/2/3) on this PR is the decisive check.
  • Coverage and gaps: the changed paths are the scenarios' waits and assertion targets plus the fixture's process setup, and both are exercised by the scenario runs above. Hosted CI is the only evidence for Linux timing. Shard 2's scenarios after goal-workspace-m2 had not run on hosted main before (the shard stopped there), so new failures there are possible and will be addressed on this PR if they appear.

Frontend / Visual Evidence

  • UI impact: none (test harness and fixture only).

Type of Change

  • Test update

LoopX Area

  • Build, packaging, installer, or CI

Shared-authority RFC fixture impact

N/A

Boundary Checklist

  • Neither the diff nor this PR body/comments/attachments disclose private state, credentials, raw traces or verifier output, internal links, or local machine paths.
  • I did not duplicate maintainer-owned benchmark work.
  • I kept the change scoped to the linked issue/task.
  • No paired RFC changed.
  • UI impact none.
  • Every commit includes a DCO Signed-off-by trailer.

🤖 Generated with Claude Code

LIHUA919 and others added 2 commits October 27, 2026 09:58
The dashboard-browser lane installs the checkout without test extras, so
the managed-agent fixture exits on `import pytest` before the scenario
starts. Replace pytest.MonkeyPatch with a process-scoped setenv/setattr
shim; like the sibling browser fixtures, it now needs only the checkout.
The fixture owns its process, so nothing has to be restored afterwards.

Refs loopx-project#7384

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Lihua <1017343802@qq.com>
goal-workspace-m2 raced the UI in two places:

- it counted visible work right after toggling each owner group, which
  read 126 of 200 on the hosted runner; poll until every item is visible
  (the 2s expansion budget still covers the whole wait)
- it focused the drawer's help before the drawer's next-frame focus
  handoff to its title, which blurred and dismissed the tooltip

Refs loopx-project#7384

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Lihua <1017343802@qq.com>
LIHUA919 and others added 2 commits October 27, 2026 10:26
loopx-project#7501 keeps the decision a reader just closed expanded and focused in its
question, so a question no longer collapses to three records after an
older finding was read. research-finding-reader asserted the collapsed
default at exactly that point (20 !== 3). Assert the shipped contract
instead: the decision just read stays in view with focus. The default
three-record view remains owned by research-history.

loopx-project#7501's dashboard-browser shards were cancelled, so the scenario had not
run against it.

Refs loopx-project#7384

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Lihua <1017343802@qq.com>
Since 63784cf the work vital shows its partial listing inside the
contextual help (labelled with the unknown total) instead of inline text,
so goal-suggestions no longer found "已列出 5 项中的 0 项" in the vitals'
visible text. Open that help and assert the same counts in its tooltip.
The scenario runs after goal-workspace-m2 in shard 2, so hosted CI had
not reached it since that change.

Refs loopx-project#7384

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Lihua <1017343802@qq.com>

@loopx-agent loopx-agent 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.1-sol; OpenAI; runtime_reported; reasoning_effort=max

APPROVE,精确 head bae64527cca4e3378a29162b54ef121e163cc753。

动机 / Motivation

维护打包工作区回归的开发者,以及依赖这些检查发现界面、会话与权限退化的用户。无 test extras 的浏览器任务无法启动托管会话 fixture;异步渲染和焦点交接尚未完成时读取 DOM 会产生竞态,研究返回与部分覆盖断言还停留在旧界面。原打包入口可启动真实隔离 SQLite/Chat fixture;测试在原预算内等到实际渲染/焦点状态,再核对准确旧结论与部分工作数量,而不把展开恢复当成初始折叠。没有产品代码、UI、权限、默认值、状态协议、provider 或模型调用变化;不以测试修复宣称新产品能力或最终发布资格。 这是修复发布验证入口的独立批次,不能把恢复测试运行本身当成最终发布或新功能证明。

改动思路 / Approach

复用既有五个场景、真实状态 owner 与本机浏览器入口,只移除 fixture 的测试依赖并修正观察时点和语义位置。 按 1b6dd6a42ab7f9620a4655061952adb58038a65b 的 docs/development/good-smokes.md 核对 NO-TEST-EXTRAS、BOUNDED-RENDER、DRAWER-FOCUS、EXACT-RESEARCH-CONTEXT、PARTIAL-COVERAGE 五项判据。先判断产品实际契约,再修复测试,不让旧快照或测试运行器依赖反过来决定产品语义。真实 Chat/SQLite、原字段、权限负例、完整记录和原两秒预算保留;不需要新增 UI、状态 owner 或通用等待框架。

具体改动 / Changes

四个原文件共 +27/-7。托管会话 fixture 用仅含 setattr/setenv 的进程级 adapter 复用 isolate_sqlite_runtime;临时目录、环境和 tempfile cache 的生命周期仍归该独立 fixture 进程。禁止导入 pytest 的同条件对照中,基线明确 ModuleNotFoundError,head 启动实际服务器并读回三个原受管会话。不是靠给浏览器任务补 test extras 隐藏依赖。

200 项工作展开等待实际 DOM 收敛,再沿原性能时钟检查总耗时严格小于 2 秒;轮询最长 5 秒不会放宽这个通过条件。Drawer 本来在下一帧将焦点交给标题,现在先观察 title 实际获得焦点,再打开并核对原 tooltip,避免被后续焦点交接关闭。部分覆盖仍核对同一五项中的零项,按真实 masthead 的未知总数帮助入口读取,没有删除数量或把未知说成完整。

研究返回沿 TrailQuestion 的 selectedIndex 展开到刚读过的旧结论;此时要求三条会与恢复原记录和焦点的契约矛盾。head 核对具体「比较 2」按钮的焦点,research-history 仍独立断言初始问题数和每题记录数均为三,旧结论选择、刷新、Back、窄屏和全文断言保留。两个研究 UI owner 的 Git blob 与实际触发 20≠3 的 early3 版本完全相同,差异来自测试观察而非产品改写;实际桌面与窄屏截图也已检查。

精确 head 上五个完整 packaged 场景通过,包括四个受影响场景和 research-history 的初始三条覆盖;禁止 pytest 导入仍得到真实三会话 ready,基线在同条件明确拒绝。premerge 5 direct+3 selected、规定 Ruff 范围、17 模块 mypy、三个 Node 语法检查及四路径公开边界通过。 首次辅助观察器误读启动的人类提示为 JSON,修复读取后同 head 通过,原失败保留。额外扩大到整个旧 fixture 的 Ruff 检查得到 10 条存量样式问题;相同命令比较 base/head 的 code、message 和出错原行完全一致,仅行位置改变。规定 Ruff 范围通过,不能将这个辅助失败改称整个旧文件 lint 通过。作者描述的 hosted CI 未作为独立验证,按 Goal 的 wait_for_ci=false 没有查询 CI。

对主干的风险 / Risks

主要风险是等待和定位变化掩盖迟到渲染或旧记录丢失。原 200 项与两秒断言、具体旧结论焦点、独立初始三条、未知覆盖的准确计数都保留,并在完整 packaged 场景上执行。ProcessPatch 不做进程内恢复,因此其正确范围是这个独立、由测试关闭的 fixture 进程,不能直接复制给共享 pytest 进程。源身份在三条资格 lane 前后未变且清理成功;没有真实用户 Goal、私有工作区或外部 provider 操作。

我的整体评价 / Verdict

这是合理的测试修复,复用现有真实 owner 和独立负例,移除了浏览器 fixture 不应依赖的 pytest,并把观察顺序与当前 UI 生命周期对齐。现有场景保留比增建镜像测试或放宽预算更直接的回归价值。同域简化已完成,无需无关格式清理、生产重构或通用重试层。正式发布仍须在包含其他主线修复的统一候选上完成全仓、完整打包目录、真实模型、安装和渠道验证。 当前批准只覆盖此精确测试修复提交,公开前后路径与 DCO 也已核对,正式发布的统一 source 资格仍单独完成。

English verdict: APPROVE bae64527cca4e3378a29162b54ef121e163cc753. Five complete packaged scenarios, a real no-pytest startup counterfactual and required local gates pass. The original two-second budget, exact older-record focus, fresh default-three view, partial counts and authority assertions remain. Ten optional file-wide lint diagnostics are unchanged at base/head; no product or provider behavior changes.

@loopx-agent
loopx-agent merged commit 8a26a7c into loopx-project:main Oct 27, 2026
18 of 33 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