Repository navigation
test(showcase,ui-live): re-point the two nightly live specs to what record page v3 draws - #28009
Conversation
…ecord page v3 draws record-history-display: at 1440x900 a non-worked object's Timeline switch is off, so the stream is folded into the closed Activity card at the related column's foot. The spec now asserts the switch is off and the card is closed, opens it, and reads the Changes chip inside it. detail-shapes (Contoso): re-pin the tabbed tier at 780x800, derived from the measured icon-rail sidebar and the 760 px view floor, and re-point the prominence assertions to v3: primary lists are body tables in the Details tab, the rest self-fetch behind the Related tab. Claude-Session: https://claude.ai/code/session_01QSeKYmTYfaPbLQD4BJfomW Co-authored-by: Claude <noreply@anthropic.com>
…pen stream has an Activity chip of its own Claude-Session: https://claude.ai/code/session_01QSeKYmTYfaPbLQD4BJfomW Co-authored-by: Claude <noreply@anthropic.com>
|
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW 席位核对 — ACCEPT · domain:devx#2 · head
|
Part of #27114 — the two record-page-v3 reds of nightly run 41009107101 (reading 6516358130). The card stays open until a scheduled
Nightly tiersrun is green.Clause-②: no
Metadata-protocol: none
维护者速读
ui/e2e/live/record-history-display.spec.ts、examples/app-showcase/e2e/detail-shapes.spec.ts),让它们按记录页 v3 实际画出的界面去找元素;产品代码零改动。Nightly tiers在 main 上红了两例。一例是 1440 宽下"时间线"开关默认关、事件流折在关闭的「动态」卡片里;另一例是 fix(plugin-detail,app-shell,components): record page round 2 — related OFF draws no column or rail, one segmented panel control in the header row, three columns in a 1440 window with the sidebar #27473 把两栏下限改成 760 px 视图后,1200 宽已不再是标签页布局,而且 v3 把主相关列表画成详情页里的表格、不再是独立标签。examples/app-showcase/e2e/detail-shapes.spec.ts的 Contoso 用例(视口推导注释与新的 v3 断言);②ui/e2e/live/record-history-display.spec.ts第 2 步(先断言开关关闭、卡片折叠,再点开「动态」卡片)。cd examples/app-showcase && OS_TEST_TIERS=nightly pnpm exec vitest run,预期Test Files 2 passed (2)。What changes
Two test files only, each re-pointed at what record page v3 draws, measured under the nightly harness itself. No product change, no retry, no timeout raised, no test renamed, skipped or deleted.
1.
ui/e2e/live/record-history-display.spec.ts(driven bytest/console-live-specs.live.test.ts). H1 holds. At 1440x900 the nightly harness (a built Console on a fresh database) draws the three-column tier.showcase_accountis not a worked object: it declares nostageField, no lifecycle optionkindand noenable.files. So the reader's Timeline switch defaults to off, and the stream is folded into the closed Activity card at the related column's foot. That card does not mount its blocks until it is opened, so the Changes chip never appeared. The failure snapshot readsgroup "Panels"withbutton "Timeline"(not pressed) andregion "Activity"with a collapsedbutton "Activity". The spec now opens that card the way a reader does, and asserts each step:aria-pressed="false";aria-expanded="false", is clicked, then reads"true";I picked opening the card over pressing the Timeline segment. The card is where the stream sits by default, and opening it changes no stored preference. The toggle is named by its heading, because the open stream has an "Activity" filter chip of its own. The first attempt matched both (a strict-mode violation) and was corrected in the second commit. The first assertion carries the 15 s page-open budget the spec already gave its first element.
2.
examples/app-showcase/e2e/detail-shapes.spec.ts, Contoso case (driven bytest/showcase-smoke.live.test.ts). H2 holds, and there is a second staleness under it.Width. Measured on this harness with a fresh context and no sidebar cookie: from 768 px (
MOBILE_BREAKPOINT) to 1000 px the sidebar comes up as its 48 px icon rail. The tier flips between 808 px (two columns) and 800 px (tabs), which is window minus 48 against the 760 px view floor. 1024 px and up have the sidebar expanded, and at 1200 the tier istwo-columnwith no tablist. Below 768 px the mobile shell gives the view the whole window, and 760 px drew two columns. So the desktop tabbed tier is a window of 768 to 807 px. The case is pinned at 780x800: 732 px of view, 28 px under the floor and 12 px above the mobile breakpoint. An expanded sidebar only narrows the view further.Prominence. Even inside the tabbed tier, v3 (objectstack#27055 Target 8) draws
relatedList: 'primary'lists, Invoices and Projects, as body tables in the Details tab. They are no longer tabs of their own. The strip at 780 px isDetails 5 / Related 3 / Timeline. The case now asserts:INV-1002) and the Projects table (Data Platform), their rows read at open;Carl Fox). This replaces the oldwaitForTimeout(1500)plus "panel text is non-empty", which an empty state would also pass.The flat-details, money-strip and footer assertions are unchanged.
Tier choice. The case's own header names its invariant: "related-heavy → related lists surface as tabs (prominence rule)". So the case stays in the tabbed tier with a derived viewport, and only its prominence assertions move to v3's rendering. Re-pointing it to the column tier would drop the only live-smoke pin on the tab strip. Every other page in this smoke runs at the Desktop Chrome viewport, which is a column tier. The tab strip is also what the drawer and the split pane draw at every width. The header bullet is updated to say this.
Tests
Repro at base d5951c8 (the nightly invocation): both reds
OS_TEST_TIERS=nightly pnpm exec vitest run --maxWorkers=2inexamples/app-showcase, underos-verify-lock:e2e/detail-shapes.spec.ts:173:expect(locator).toBeVisible() failed · Locator: getByRole('tab', { name: /Details/i }) · element(s) not found. It failed on both attempts, the retry included.1 failed · 52 passed (3.1m).e2e/live/record-history-display.spec.ts:92:TimeoutError: locator.waitFor: Timeout 15000ms exceededongetByRole('region', { name: /^(Timeline|时间线)$/ }).locator('[data-stream-filter="changes"]').1 failed · 19 passed (1.8m).Test Files 2 failed (2)·VERDICT command-exit 1.Green at head 6becc88 (same invocation)
53 passed (2.7m)20 passed (1.6m)Test Files 2 passed (2)·Tests 2 passed (2)·VERDICT command-exit 0Teeth: revert both fixes on top of the head, watch both cases fail, restore
The script carries a
traprestore. Both files were restored to base withgit restore --source=d5951c8e37(tree only). Mutated blobs024da82966/486a7df9e4equal the base blobs. Fix-marker counts dropped to 0 / 0.detail-shapes.spec.ts:156(getByRole('tab', { name: /Details/i })not found;1 failed · 52 passed) andrecord-history-display.spec.ts:62(locator.waitFor: Timeout 15000ms;1 failed · 19 passed).Test Files 2 failed (2)·VERDICT command-exit 1.git checkout HEAD --. The restored blobsd355411757/2961a09237equal the HEAD blobs,git diff HEADis 0 bytes andgit status --porcelainis empty.Typecheck
pnpm --filter @objectstack/example-showcase typecheckandui'stype-check:e2eboth pass:VERDICT command-exit 0.--listFilescounts each edited spec once in its program:e2e/detail-shapesis in the showcase tsconfig, andrecord-history-displayis inui/tsconfig.e2e.json.Acceptance notes
RECORD_PAGE_TWO_COLUMN_MIN_WIDTHmoves, this case is where it surfaces, as a missing tablist. The comment carries the derivation so the next re-pin is a re-measure, not a guess.record-history-displaynow relies on the reader default (timeline off for a non-worked object). It asserts that default explicitly, so a run against a long-lived local stack whose browser stored the switch as on fails on a named assertion, not on a timeout.detail-shapes.spec.tsstill says Contoso has "2 invoices". The seed has three (INV-1002, INV-1003, INV-1005). It is a comment outside this card's surface, left as is.Verification
Local gates: dispatch-gates --commands derived 37 over the 2 paths; all exit 0
Each gate ran with its exit code captured to disk before any pipe. 35 exited 0 first time. Two were reruns, not reds:
pnpm check:dual-build-cjs-loadsfirst exited 3 (PREREQUISITE NOT MET: 7 packages outside the touched closure had nodist/). After building them it exited 0:113 published require entry point(s) across 70 package(s) load.pnpm check:query-options-erasurehit my own 280 s per-gate cap (124). Rerun uncapped, it exited 0:ratchet holds: 50 unswept non-test site(s) in 15 file(s), none new.The reconciliation
dispatch-gates --rananswered37 derived famil(ies) accounted for — 37 run, 0 NOT-MEASURED (a DERIVED zero — all 37 recorded an exit code and none of them is 3), exit 0.check:nul-bytesexit 0, and the control-byte self-scan of both files found nothing. The families CI runs are read off this PR's check-runs.dogfood_battery: n/a, because there is no!in the title and no(narrowing)arm.skip-changeset: both files are test specs in packages that publish nothing (ui/e2e/**, and the private@objectstack/example-showcase).Generated by Claude Code