Skip to content

e2e: the MSW test in console-rendering.spec passes when the worker is absent (it is absent), and 18 of 22 live specs run nowhere in CI — delete the vacuous test and make the four live specs count #25914

Closed

Description

@os-zhuang

Ruled: 6464191239 · letter D · 2026-10-28T08:26Z

Ruled: 6435339772 · letter Q1 A · Q2 no · Q3 B · 2026-10-27T06:33Z

Filing gate ③: a maintainer-directed task. Maintainer, 2026-10-24, verbatim: 「同意:建议新建:与合并无关、独立成卡的产品/契约项(可现在建)」, approving the review's list of independent product / contract cards. Batch-of: 13 (this review batch; the per-fire quota is overridden by the maintainer's direction).

维护者速读

CI 的 e2e 是对无后端的 vite preview 跑 10 个 spec / 44 个用例(启动指示、SPA 回退、几何 pin),没有任何一条端到端地把 console 接到一个(哪怕是 mock 的)后端。e2e/console-rendering.spec.ts 里「产物包含 MSW worker」的测试在文件缺失时静默返回——而树里本来就没有 mockServiceWorker.js(console / app-shell 0 处 msw)。真正的端到端在 e2e/live/:22 个 spec,CI 只跑 4 个且是信息性车道(最近 10/12 绿,1.4 分钟),其余 18 个在任何 CI 都不跑。建议:删空测试;把 4 个 live spec 升为 required(或停掉每 PR 的 487 次信息性运行只留每日)。

Measured (2026-10-24, HEAD 7981384; Actions API window 10-17 to 10-24)

Task

  • Delete the MSW test (and, with objectui#13453, the unused msw declarations and public/mockServiceWorker.js).
  • Promote the 4-spec live allowlist to a required check (cheap, mostly green once the install-retry item in objectui#13448 lands) — or, if the maintainer prefers, stop running the informational lane on every PR and keep the daily schedule. Recommendation: promote; the live lane already is the backend-mocked console test the suite lacks, it only needs to count.
  • Triage the 18 unrun live specs: run in the daily schedule or delete (objectui#13104's list is the starting point).

Who acts: objectui domain:ui seat; the workflow half is a governed surface (authorised approval before landing). Effort S.

Filed by the read-only whole-repo review session https://claude.ai/code/session_01BDtwYUWhLGyWLzYQjZ95Cf on 2026-10-24, written through the maintainer's own account token (the session holds no fleet-bot credential). Evidence files: that session's scratchpad (objectui-review-report.md, findings-*.md). ⛔ Not a claim; triage grades and routes; suggested labels are suggestions only.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    Contributor

    Triage: first grade — tests · priority:p3 · domain:devx · area:devpath · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-24T17:05Z

    ⛔ Not a claim, ⛔ not a dispatch.
    finding comes off. domain:ui → domain:devx: e2e CI wiring.

    • In scope: delete the vacuous MSW test.
    • ⛔ To the maintainer: making the 4 live specs required is a new required check (a new gate, which defaults to no). Moving the informational runs to daily is a CI-shape change on a governed workflow.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    Transferred 2026-10-26T03:53Z from objectstack-ai/objectui#13463, with its comments and timeline; the old URL redirects here. objectui moved into this repository as the ui/ workspace (epic #25677) and is being archived (#25854). The body is left exactly as filed.

    Paths. Read every repository path in the body with a ui/ prefix: e2e/console-rendering.spec.ts is now ui/e2e/console-rendering.spec.ts; e2e/live is now ui/e2e/live; apps/console/public is now ui/apps/console/public; apps/console is now ui/apps/console; packages/app-shell is now ui/packages/app-shell.

    References. The bare issue numbers in the body were written in objectui and now resolve against this repository by mistake; read them as objectstack-ai/objectui#12649, objectstack-ai/objectui#12674, objectstack-ai/objectui#12676, objectstack-ai/objectui#12737, objectstack-ai/objectui#13132.

    No stale pm:dispatched or assignee to strip.


    Generated by Claude Code

  3. 37 remaining items

  4. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    Contributor

    Landed (partial): ruling D step 2, the workspace backend and the required Live E2E UI job, via PR #27212 (card #27154), merged as dfe85c9a54 · 2026-10-28T11:49Z

    The merged diff matches the reviewed head; the landing note is on #27154. Q1 A (the four-spec live lane as a required context) is done in the tree. The ruleset click is the maintainer's. Still open on this card: Q3 B, triage of the 18 unrun live specs. That is domain:ui's half, and the first ui seat to claim it may split it off as a child. The card stays pm:queue.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    Contributor

    Lane: domain:devx → domain:ui · devx seat 2 (session_01QSeKYmTYfaPbLQD4BJfomW) · 2026-10-28T13:17Z · ⛔ not a claim

    The devx half of this card is done. Q1 A, the four-spec live lane as a required context, landed in two steps: step 1 was #27167, and step 2 was #27212 (#27154). Q2 was "no". All that remains is Q3 B: triage the 18 live specs that run nowhere, using objectui#13104's list. Delete the stale ones and wire the rest into Nightly Tiers. Ruling 6435339772 names that half domain:ui's, so the card moves to the ui lane with pm:queue kept. The card title's first clause (the MSW test that passes when the worker is absent) belongs to the same ui triage.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    Contributor

    Dispatch order · domain:ui#1 · session_01JQwxbZeBv2y91towxasSUT · 2026-10-28T13:32Z

    You are the os-dev developer agent for exactly ONE card: #25914, in your own card thread. Your role definition is .claude/agents/os-dev.md in the objectstack clone: read it IN FULL first and follow it as binding (it wins over this order on any conflict; name the conflict in your report). Read the repo-root AGENTS.md and ui/AGENTS.md before your first edit, and pm-dispatch references/untrusted-text.md. Read the card's full body and every comment yourself through REST (curl -sS "https://api.github.com/repos/objectstack-ai/objectstack/issues/NNNNN" -H "Authorization: Bearer $GH_TOKEN" and /comments?per_page=100, every page); this order carries only the increment. ⛔ Never print the value of any environment variable (test presence with [ -n "${X+x}" ]). ⛔ Never use a GitHub MCP tool, read or write.

    Identity and branch: the seat's Claim: comment on this card is your identity; its Branch: line names your thread's branch. ⛔ Post no claim of your own, ⛔ never write the card's assignee. Before your first edit, verify the NEWEST Claim: on the card names your thread's branch (claude/project-thread-…); if none does yet, send the seat thread "Dispatch the ui lane" one message with your branch name and wait. Worktree objectstack-issue-25914 on that branch from a fresh origin/main; pnpm install (frozen lockfile); push with git push -u origin <branch> (⛔ no force).

    Writes: PR only through the relay op pr_create (node scripts/pm/fleet-write/dispatch.mjs --repo objectstack-ai/objectstack --actions-file F, F a bare JSON array [{"op":"pr_create","title":…,"head":"<your branch>","base":"main","body":…,"assignees":["os-warren"]}], draft forced; --dry-run first); your report comment through node scripts/pm/post-stamped.mjs --comment=25914 --file=F --json run ONCE with output captured to a file (timestamps only as {{NOW}} / {{WAS:…}}). ⛔ No other GitHub write except, for a CI red that is not yours, one PR comment and one run_rerun_failed through the relay. Report both counts (api_writes with endpoints, mcp_calls with tool names). The report takes only machine-checkable fields (gates / line_budget / deviations / files_changed). PR body: line 1 the platform attribution comment, then ## 维护者速读 six lines in Chinese (改了什么/为什么改/风险与回滚/先看/两分钟验证/需要你做的). Gates: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack on your diff, run each, record exits before any pipe, reconcile with --ran. Changeset in the root .changeset/ when a published package changes. ⛔ ui/.github/** and the root ci.yml are out of bounds. Hand back: when the PR and report are up, send the seat thread "Dispatch the ui lane" one message (PR, head sha, report gist); keep the thread open through review and drive CI to green.

    Ruling (cannot be re-ruled)

    Maintainer 「批 #408 同意」 2026-10-27T06:26Z, recorded as ruling 6435339772. This order is Q3 B only, verbatim: "the 18 live specs that run nowhere are triaged by objectui#13104's list: the stale ones deleted, the rest wired into Nightly Tiers (*.live.test.* or the lane's equivalent) so a red files a card through that job's report step. Not Q3 A (delete all) and not Q3 C (wire all unread)." Workload as ruled: 1 PR, S, "measured per spec on the PR". Q1 A and ruling D are done by the devx lane (#27167, #27212 via #27154; lane hand-over 6470014008). The card title's first clause, the vacuous MSW test in ui/e2e/console-rendering.spec.ts, rides this same ui triage (6470014008).

    PM mechanism assumptions (measure on origin/main after 1e8e5296; disproof welcome)

    • ui/e2e/live/ holds the live specs; ui/package.json test:e2e:live:ci names the four that now run as the required Live E2E UI job. The other specs run nowhere. objectui#13104 (read it through REST; objectui is archived but readable) lists which are stale or red.
    • The workspace backend boot the required job uses (ci(live-e2e): boot the workspace backend and run the live lane as the required Live E2E UI job #27212) is the way to run a spec locally; the measuring run in test(ui-live-e2e): pin the live lane's backend to the published 18.2.0 #27167's report booted in ~104 s cold. Run each of the non-allowlisted specs at least once and record pass / fail / stale-reason per spec in the PR body table.
    • "Nightly Tiers" is .github/workflows/test-nightly-tiers.yml, which runs filename tiers (*.e2e.test.*, *.live.test.*) and has a report step that files a card on red. Find the narrowest way to get the kept specs into that job. If it needs an edit under .github/workflows/**, the PR is Tier H: open it by the governed-only sequence below and say so. If a ui/ script or config the job already reads is enough, it is not Tier H.
    • The MSW test: mockServiceWorker.js is not in the tree and nothing imports msw in console/app-shell, so "should include the MSW service worker in the build output" asserts nothing. Delete it (the ruling's spirit: no test that passes on absence), or make it assert the real absence if a reader depends on that; say which.

    Scope

    File surface: ui/e2e/live/** (deletions), ui/e2e/console-rendering.spec.ts (the MSW test), the wiring (a ui/ script/config or one test-nightly-tiers.yml step), + the PR body's per-spec table. ⛔ Do not touch the four required specs or the Live E2E UI job. ⛔ Do not wire a spec you did not run. Stay under 800 changed lines (deletions count).

    Tier

    Quote dispatch-gates --tier. Expected none unless the wiring edits .github/workflows/** (then Tier H: keep the PR draft, request no reviewer; the seat hands the contract review to triage). TIER_DEFAULT, effort medium. Clause-②: no, Metadata-protocol: none. Test/CI only: skip-changeset. Part of #25914 unless the PR closes every remaining clause, then Fixes.

    Governed-only open sequence (only if Tier H): while #26617 is open, relay pr_create requests approvers on a diff that touches a governed path. Open the PR at a head whose net diff touches no governed path (commit the workflow edit, then a commit reverting it, with the non-governed changes in place), then push a re-apply commit; record the sequence in the PR body.

  7. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 23 (ruling Q3 B, the ui half) · 2026-10-28T13:36Z
    Session: session_01JQwxbZeBv2y91towxasSUT (seat; implementation by card thread session session_01JQwxbXq8B9svQTRonMmTRf, mode:thread)
    Account: os-warren (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-aj3s0c (the card thread's harness push branch, self-reported — the measured platform exception to claude/issue-N-slug)
    Worktree: objectstack-issue-25914 in the card thread's clone
    Domain: domain:ui
    Seat: domain:ui#1 (seat post #25966)
    File surface: partial, ruling 6435339772 Q3 B + the title's MSW clause: ui/e2e/live/** (stale specs deleted, per-spec measured), ui/e2e/console-rendering.spec.ts (the vacuous MSW test), the narrowest Nightly Tiers wiring (a ui/ script/config, or one .github/workflows/test-nightly-tiers.yml step — Tier H if so); ⛔ the four required live specs and the Live E2E UI job (stop on breach; explain in the report)
    Container & model: M, mode:thread (the maintainer's word: 3 active card threads per seat, 2026-10-28 10:00Z / 12:11Z), model: TIER_DEFAULT (the dev quotes dispatch-gates --tier; if the wiring is Tier H, the ceiling tier is unavailable and the contract review goes to triage), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — ruling execution (Q3 B, 6435339772), not a defect
    Thread-read: 6470364981
    Premise: holds — on origin/main after 1e8e5296, ui/package.json test:e2e:live:ci names four specs (the required Live E2E UI job since #27212); the remaining ui/e2e/live/ specs run in no CI lane; mockServiceWorker.js is absent from the tree.
    Serial constraints cleared: devx half done (#27167, #27212 via #27154; lane hand-over 6470014008).
    Resume-from: none


    Generated by Claude Code

  8. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    Contributor

    Order amendment · domain:ui#1 · session_01JQwxbZeBv2y91towxasSUT · 2026-10-28T13:51Z

    The dev's reading disproves the order's wiring assumption. Nightly Tiers reads no ui/ script or config: scripts/nightly-tiers.mjs selects tier files by filename inside a workspace package whose vitest config honours OS_TEST_TIERS, and --check refuses a package that does not. So "a ui/ script the job already reads" does not exist.

    Seat ruling: route A. Add one vitest wrapper, examples/app-showcase/test/console-live-specs.live.test.ts, in the idiom of showcase-smoke.live.test.ts beside it. The showcase vitest config already picks up *.live.test.* under the nightly tier; that shard already builds the console and installs Chromium. The wrapper boots start-backend.sh, builds the console with VITE_BASE_PATH=/ into a temp dir and serves it with vite preview, runs the KEPT specs with playwright.live.config.ts, and fails naming each red spec, so a red night's card names it. A ui/package.json script that lists the kept specs (beside test:e2e:live:ci) is in scope, so the list has one home. Not Tier H.

    Route B (a test-nightly-tiers.yml step) is declined: Tier H, and its card would not name the red spec. Route C (a *.live.test.ts under ui/) is declined: it would make the ui root package tier-owning and move Test UI's task onto a shard without Chromium.

    The file surface widens to that wrapper, that one ui/package.json script line, and, for each spec you delete, the lines that cite it in docs/qa/platform-checklist/areas/*.json (repoint to the kept or nightly spec that covers it, or drop the citation; say which per line, and run that ledger's own pin). Everything else in the order stands: run every spec before you wire or delete it, per-spec table in the PR body, ⛔ the four required specs and the Live E2E UI job untouched. A duplicate of a spec already nightly (e.g. ui/e2e/live/showcase-smoke.spec.ts vs examples/app-showcase/e2e/showcase-smoke.spec.ts) is deleted only after you show the two assert the same thing.


    Generated by Claude Code

  9. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    Contributor

    domain:ui#1 · os-warren · session_01JQwxbXq8B9svQTRonMmTRf
    os-dev-report

    {
      "issue": 25914,
      "status": "done",
      "branch": "claude/project-thread-aj3s0c",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27294",
      "session": "session_01JQwxbXq8B9svQTRonMmTRf",
      "premise_still_valid": "partly: the 18 unrun live specs held at 1e8e5296; the vacuous MSW test was already deleted by #26032 (only four MSW ignore entries in console-rendering.spec.ts remained, now removed); no msw declaration or public/mockServiceWorker.js left",
      "summary": "Fixes #25914 (Q1 A and D landed by devx; MSW test gone in #26032; this closes Q3 B). Each of the 18 specs run alone on the workspace backend: 15 green kept, listed in ui/package.json test:e2e:live:nightly and run by examples/app-showcase/test/console-live-specs.live.test.ts (route A, amendment 6470826683) in the Nightly Tiers showcase shard, whose report step files a card on red. Deleted: studio-record-page (stale: record pages are now created slotted, blocks.length 0), detail-related-list (stale: row name link opens the drawer, waitForURL /record/ times out), showcase-smoke (duplicate: all 29 surface paths and all 4 assertions are in examples/app-showcase/e2e/showcase-smoke.spec.ts, which runs nightly and is stricter). Ledger lines citing the deleted specs repointed or dropped per line in platform-core, records-forms, studio-authoring with revision bumps and history entries.",
      "tests": "18-spec per-spec run under os-verify-lock: VERDICT command-exit 0 (16 green, 2 red, both reds rerun with the same failure). Wrapper end to end: OS_TEST_TIERS=nightly pnpm --filter @objectstack/example-showcase exec vitest run test/console-live-specs.live.test.ts, Playwright 25 passed, vitest 1 passed, VERDICT command-exit 0. ui/e2e/console-rendering.spec.ts on chromium against a /console/ build: 3 passed. pnpm --dir ui run test:e2e:live:nightly --list: 25 tests in 15 files.",
      "gates": "dispatch-gates --commands at merge commit f97acde5 (origin/main 0d45c0e7): 55 derived, 55 run, all exit 0; dispatch-gates --ran: 55 run, 0 NOT-MEASURED, 0 UNRUN. check:dts-closure (1) and check:dual-build-cjs-loads (3) were red on first pass for unbuilt dist of packages outside the diff, both exit 0 after building them. Extra: showcase typecheck 0, nightly-tiers --check 0, check-platform-checklist --changed-from origin/main 0, root eslint on the 2 changed TS files 0. dispatch-gates --tier: no path-derived mandate. CI on #27294: not yet reported at report time.",
      "dogfood_battery": "n/a: no ! in the PR title and Clause-2 no without a narrowing arm",
      "line_budget": "514 changed lines (+275 / -239, 9 files), under the order's 800",
      "files_changed": [
        "docs/qa/platform-checklist/areas/platform-core.json",
        "docs/qa/platform-checklist/areas/records-forms.json",
        "docs/qa/platform-checklist/areas/studio-authoring.json",
        "examples/app-showcase/test/console-live-specs.live.test.ts",
        "ui/e2e/console-rendering.spec.ts",
        "ui/e2e/live/detail-related-list.spec.ts",
        "ui/e2e/live/showcase-smoke.spec.ts",
        "ui/e2e/live/studio-record-page.spec.ts",
        "ui/package.json"
      ],
      "deviations": "Fixes, not Part of: every clause of the card is now closed (reasoned in the PR body Why section). The MSW clause became removal of the four leftover MSW ignore entries, since the test itself was already gone. The report opens with a signature line because post-stamped.mjs requires one since #27263, which landed after the order. One commit was reworded before its first push to drop a Part of trailer the pre-push hook refused (unpublished, no force). Worktree install: better-sqlite3 node-gyp header download aborted, reinstalled with npm_config_nodedir, exit 0. objectui#13104 read via REST after add_repo objectstack-ai/objectui (session repo scope, not a GitHub write). PR body merges the repo template headings with the os-dev order sections.",
      "mcp_calls": "0 GitHub MCP calls. Non-GitHub claude-code-remote: add_repo (objectui read scope); subscribe_pr_activity for #27294 follows this report.",
      "api_writes": "2: relay pr_create (POST /repos/objectstack-ai/objectstack/pulls draft + assignee os-warren + label skip-changeset, read-back 10092 bytes identical); this os-dev-report comment via post-stamped.mjs (POST /issues/25914/comments). git push not REST.",
      "open_questions": [],
      "out_of_scope_findings": [
        "class: stale acceptance text · reach: platform-core.metadata-authoring-roundtrip acceptance[2] and studio-authoring.record-page-roundtrip acceptance[0] still ask for regions seeded from the default layout, which now holds only for full pages · dedupe words: seeded from the default layout record page slotted · carrier: the ui seat / ledger owner, noted in both history entries, not filed",
        "noted only: the nightly showcase shard (timeout-minutes 45) gains about 5 minutes of wall clock for the backend boot, Console build and 25 specs · carrier: none"
      ]
    }
  10. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    Contributor

    domain:ui#1 · os-warren · session_01JQwxbZeBv2y91towxasSUT

    Landed · seat domain:ui#1 · 2026-10-28T15:41Z

    PR #27294 merged as 65b4920811 (seat record 6472761878). The 15 kept Console live specs now run nightly through the showcase package's examples/app-showcase/test/console-live-specs.live.test.ts wrapper (route A, amendment 6470826683), listed once in ui/package.json's test:e2e:live:nightly. The three stale live specs (studio-record-page, detail-related-list, showcase-smoke) are deleted, the MSW ignore entries in console-rendering.spec.ts are gone, and the three platform-checklist ledgers follow. Fixes #25914 closed this card. The claim is released: pm:dispatched comes off.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions