From b92ab92b376e476a563239d99f8f1e917fb3afc1 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 28 Sep 2026 07:13:34 +0000 Subject: [PATCH 1/2] test(plugin-detail): gate RelatedList's client-mode sort-button case on the object schema The case "keeps that button in client mode" gated only on the view type (`data-list`), which client mode satisfies on the first commit, then read the `Total` sort button synchronously. Since the sort-button row reads the masked stamp (objectui#10728), every column carries it until `getObjectSchema` resolves, so the button existed only once the schema commit had landed: a scheduling race (the #7007 trap described in the file's own docblock). It now awaits `settleObjectSchema(dataSource)`, the gate its windowed sibling already uses. Test-only: no retry, no raised timeout, no source change. Co-Authored-By: Claude Claude-Session: https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN --- .../src/__tests__/RelatedList.unmaterializedSort.test.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/plugin-detail/src/__tests__/RelatedList.unmaterializedSort.test.tsx b/packages/plugin-detail/src/__tests__/RelatedList.unmaterializedSort.test.tsx index 9dacf076bb..2ef1291793 100644 --- a/packages/plugin-detail/src/__tests__/RelatedList.unmaterializedSort.test.tsx +++ b/packages/plugin-detail/src/__tests__/RelatedList.unmaterializedSort.test.tsx @@ -216,8 +216,11 @@ describe('RelatedList — the sort-button row for a `list` card (#3950)', () => }); it('keeps that button in client mode', async () => { - renderList({ type: 'list', data: items }); + const dataSource = renderList({ type: 'list', data: items }); await waitFor(() => expect(h.schema?.type).toBe('data-list')); + // Since objectui#10728 the sort-button row reads the masked stamp, which + // covers every column until the object schema lands (#7007). + await settleObjectSchema(dataSource); expect(screen.getByRole('button', { name: /Total/ })).toBeTruthy(); }); From 3abab7ce5ae95095f5bed4d0b055e3342e18e7e4 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 28 Sep 2026 07:27:42 +0000 Subject: [PATCH 2/2] chore(changeset): declare the RelatedList sort-button gate test-only (empty frontmatter) `check-changeset-presence` counts every file under a released package's `src/`, test files included, so the test-only gate needs an explicit no-release declaration. Co-Authored-By: Claude Claude-Session: https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN --- .../10895-plugin-detail-relatedlist-client-sort-gate.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .changeset/10895-plugin-detail-relatedlist-client-sort-gate.md diff --git a/.changeset/10895-plugin-detail-relatedlist-client-sort-gate.md b/.changeset/10895-plugin-detail-relatedlist-client-sort-gate.md new file mode 100644 index 0000000000..b934ceaed3 --- /dev/null +++ b/.changeset/10895-plugin-detail-relatedlist-client-sort-gate.md @@ -0,0 +1,9 @@ +--- +--- + +Test-only, no package released: `RelatedList.unmaterializedSort.test.tsx`'s case "keeps that button in +client mode" now awaits the object schema before it reads the `Total` sort button. Since +objectui#10728 the sort-button row reads the masked stamp, which covers every column until +`getObjectSchema` resolves, and the case gated only on the view type, which client mode reaches on the +first commit. So whether the button existed when it was read depended on scheduling; on one merge-queue +build it did not (objectui#10895). No source file changes.