Skip to content

[harness eval #34793] Docs: Scope control input ids to each <Controls /> block instance#22

Open
valentinpalkovic wants to merge 1 commit into
nextfrom
try-pr-34793
Open

[harness eval #34793] Docs: Scope control input ids to each <Controls /> block instance#22
valentinpalkovic wants to merge 1 commit into
nextfrom
try-pr-34793

Conversation

@valentinpalkovic
Copy link
Copy Markdown
Owner

Synthetic fork PR for agentic harness eval against storybookjs#34793.

@valentinpalkovic valentinpalkovic added the ci:verify Trigger PR Verification Harness label May 14, 2026
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 14, 2026

Fails
🚫

PR is not labeled with one of: ["cleanup","BREAKING CHANGE","feature request","bug","documentation","maintenance","build","dependencies"]

🚫

PR is not labeled with one of: ["ci:normal","ci:merged","ci:daily","ci:docs"]

🚫 PR title must be in the format of "Area: Summary", With both Area and Summary starting with a capital letter Good examples: - "Docs: Describe Canvas Doc Block" - "Svelte: Support Svelte v4" Bad examples: - "add new api docs" - "fix: Svelte 4 support" - "Vue: improve docs"

Generated by 🚫 dangerJS against d80100e

github-actions Bot pushed a commit that referenced this pull request May 14, 2026
@github-actions
Copy link
Copy Markdown

Verify Harness

Verdict: regression (target internal-ui)

PR-added unit tests: ❌ failed — vitest exited 1 without writing a JSON report (likely setup error); see Action log

Files: code/addons/docs/src/blocks/controls/helpers.test.ts

vitest output (last 4KB)
 /tmp/claude/eval-sync-baselines-nested-no-legacy-50WnXo/remotes/excalidraw.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-storybook-version-CxY6Ub/remotes/mealdrop.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-storybook-version-CxY6Ub/remotes/wikitok.git
 * [new branch]      main -> main
Cloning into '/tmp/claude/eval-sync-staging-TsyOG5'...
warning: You appear to have cloned an empty repository.
done.
To /tmp/claude/eval-sync-baselines-auto-clone-50xT3s/remotes/mealdrop.git
 * [new branch]      main -> main
Cloning into '/tmp/claude/eval-sync-staging-FBordJ'...
warning: You appear to have cloned an empty repository.
done.
To /tmp/claude/eval-sync-baselines-auto-clone-50xT3s/remotes/wikitok.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-storybook-version-noop-L5Oq5l/remotes/mealdrop.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-storybook-version-dirty-7HoYTf/remotes/mealdrop.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-baselines-target-behind-wU0iBF/remotes/mealdrop.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-baselines-target-behind-wU0iBF/remotes/edgy.git
 * [new branch]      main -> main
Cloning into '/tmp/claude/eval-sync-baselines-target-behind-wU0iBF/edgy-remote-worktree'...
done.
To /tmp/claude/eval-sync-baselines-target-behind-wU0iBF/remotes/edgy.git
   424ce84..71ecfc4  main -> main
Cloning into '/tmp/claude/eval-sync-storybook-version-staging-ngs0Lp'...
warning: You appear to have cloned an empty repository.
done.
To /tmp/claude/eval-sync-storybook-version-auto-clone-D9QFTe/remotes/mealdrop.git
 * [new branch]      main -> main
(node:21) ExperimentalWarning: SQLite is an experimental feature and might change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
To /tmp/claude/eval-sync-storybook-version-skip-push-Tkubex/remotes/mealdrop.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-storybook-version-resume-push-xejg9y/remotes/mealdrop.git
 * [new branch]      main -> main
(node:21) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
(Use `node --trace-deprecation ...` to show where the warning was created)
(node:21) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
(Use `node --trace-deprecation ...` to show where the warning was created)
(node:21) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
(Use `node --trace-deprecation ...` to show where the warning was created)

������ Unhandled Error �������
Error: EROFS: read-only file system, open '/home/runner/work/_temp/unit-tests-report.json'
 � open node:internal/fs/promises:636:25
 � Object.writeFile node:internal/fs/promises:1205:14
 � JsonReporter.writeReport node_modules/vitest/dist/chunks/index.UpGiHP7g.js:3626:4
 � JsonReporter.onTestRunEnd node_modules/vitest/dist/chunks/index.UpGiHP7g.js:3613:3
 � Vitest.report node_modules/vitest/dist/chunks/cli-api.Cjt90eJu.js:13968:3
 � TestRun.end node_modules/vitest/dist/chunks/cli-api.Cjt90eJu.js:12591:3
 � node_modules/vitest/dist/chunks/cli-api.Cjt90eJu.js:13591:6
 � node_modules/vitest/dist/chunks/cli-api.Cjt90eJu.js:13601:11
 � node_modules/vitest/dist/chunks/cli-api.Cjt90eJu.js:13463:19

������������������������������
Serialized Error: { errno: -30, code: 'EROFS', syscall: 'open', path: '/home/runner/work/_temp/unit-tests-report.json' }




Replay: npx playwright show-trace on the trace.zip listed under "Artifacts" on the run summary page.

Screenshots

2026-05-14T13-47-10.490Z/pr-22-Controls-block-scopes-control-ids-per-instance-chromium/test-failed-1.png

2026-05-14T13-47-10.490Z/pr-22-Controls-block-scopes-control-ids-per-instance-chromium/test-failed-1.png

@valentinpalkovic valentinpalkovic force-pushed the next branch 3 times, most recently from fe2f521 to e537022 Compare May 14, 2026 14:09
@valentinpalkovic valentinpalkovic added ci:verify Trigger PR Verification Harness and removed ci:verify Trigger PR Verification Harness labels May 14, 2026
github-actions Bot pushed a commit that referenced this pull request May 14, 2026
@github-actions
Copy link
Copy Markdown

Verify Harness

Verdict: regression (target internal-ui)

Reason: Playwright assertion failed in: ? — TimeoutError: locator.waitFor: Timeout 10000ms exceeded. Call log: - waiting for locator('#storybook-preview-iframe').contentFrame().locator('#storybook-root:visible, #storybook-docs:visible').locator(':scope > *').first() at _util.ts:31 29 | await this.page.waitForURL((url) => url.search.includes('path')); 30 | const root = this.previewRoot(); > 31 | await root.locator(':s

PR-added unit tests: ❌ failed — vitest exited 1 without writing a JSON report (likely setup error); see Action log

Files: code/addons/docs/src/blocks/controls/helpers.test.ts

vitest output (last 4KB)
 /tmp/claude/eval-sync-baselines-nested-no-legacy-JljCzU/remotes/excalidraw.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-storybook-version-XyVdWd/remotes/mealdrop.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-storybook-version-XyVdWd/remotes/wikitok.git
 * [new branch]      main -> main
Cloning into '/tmp/claude/eval-sync-staging-DKf9Ga'...
warning: You appear to have cloned an empty repository.
done.
To /tmp/claude/eval-sync-baselines-auto-clone-v6jX9U/remotes/mealdrop.git
 * [new branch]      main -> main
Cloning into '/tmp/claude/eval-sync-staging-yHATjt'...
warning: You appear to have cloned an empty repository.
done.
To /tmp/claude/eval-sync-baselines-auto-clone-v6jX9U/remotes/wikitok.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-storybook-version-noop-Ff532I/remotes/mealdrop.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-storybook-version-dirty-O0PTp5/remotes/mealdrop.git
 * [new branch]      main -> main
Cloning into '/tmp/claude/eval-sync-storybook-version-staging-aL2Rfg'...
warning: You appear to have cloned an empty repository.
done.
To /tmp/claude/eval-sync-storybook-version-auto-clone-kQBEgj/remotes/mealdrop.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-baselines-target-behind-BZC9HY/remotes/mealdrop.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-baselines-target-behind-BZC9HY/remotes/edgy.git
 * [new branch]      main -> main
Cloning into '/tmp/claude/eval-sync-baselines-target-behind-BZC9HY/edgy-remote-worktree'...
done.
To /tmp/claude/eval-sync-baselines-target-behind-BZC9HY/remotes/edgy.git
   c11e185..b181dbd  main -> main
(node:21) ExperimentalWarning: SQLite is an experimental feature and might change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
To /tmp/claude/eval-sync-storybook-version-skip-push-kuMUjg/remotes/mealdrop.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-storybook-version-resume-push-LuieMA/remotes/mealdrop.git
 * [new branch]      main -> main
(node:21) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
(Use `node --trace-deprecation ...` to show where the warning was created)
(node:21) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
(Use `node --trace-deprecation ...` to show where the warning was created)
(node:21) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
(Use `node --trace-deprecation ...` to show where the warning was created)

������ Unhandled Error �������
Error: EROFS: read-only file system, open '/home/runner/work/_temp/unit-tests-report.json'
 � open node:internal/fs/promises:636:25
 � Object.writeFile node:internal/fs/promises:1205:14
 � JsonReporter.writeReport node_modules/vitest/dist/chunks/index.UpGiHP7g.js:3626:4
 � JsonReporter.onTestRunEnd node_modules/vitest/dist/chunks/index.UpGiHP7g.js:3613:3
 � Vitest.report node_modules/vitest/dist/chunks/cli-api.Cjt90eJu.js:13968:3
 � TestRun.end node_modules/vitest/dist/chunks/cli-api.Cjt90eJu.js:12591:3
 � node_modules/vitest/dist/chunks/cli-api.Cjt90eJu.js:13591:6
 � node_modules/vitest/dist/chunks/cli-api.Cjt90eJu.js:13601:11
 � node_modules/vitest/dist/chunks/cli-api.Cjt90eJu.js:13463:19

������������������������������
Serialized Error: { errno: -30, code: 'EROFS', syscall: 'open', path: '/home/runner/work/_temp/unit-tests-report.json' }




Replay: npx playwright show-trace on the trace.zip listed under "Artifacts" on the run summary page.

Screenshots

2026-05-14T14-24-30.931Z/pr-22-multiple-Controls-bl-797f2--produce-unique-control-ids-chromium/test-failed-1.png

2026-05-14T14-24-30.931Z/pr-22-multiple-Controls-bl-797f2--produce-unique-control-ids-chromium/test-failed-1.png

@valentinpalkovic valentinpalkovic added ci:verify Trigger PR Verification Harness and removed ci:verify Trigger PR Verification Harness labels May 14, 2026
github-actions Bot pushed a commit that referenced this pull request May 14, 2026
@github-actions
Copy link
Copy Markdown

Verify Harness

Verdict: regression (target internal-ui)

Reason: Playwright assertion failed in: ? — TimeoutError: locator.waitFor: Timeout 10000ms exceeded. Call log: - waiting for locator('#storybook-preview-iframe').contentFrame().locator('#storybook-root:visible, #storybook-docs:visible').locator(':scope > *').first() at _util.ts:31 29 | await this.page.waitForURL((url) => url.search.includes('path')); 30 | const root = this.previewRoot(); > 31 | await root.locator(':s

PR-added unit tests: ✅ passed — 6716 passed, 0 failed across 2118 suite(s)

Files: code/addons/docs/src/blocks/controls/helpers.test.ts

Replay: npx playwright show-trace on the trace.zip listed under "Artifacts" on the run summary page.

Screenshots

2026-05-14T14-39-19.398Z/pr-22-multiple-Controls-bl-0b919-der-unique-scoped-input-ids-chromium/test-failed-1.png

2026-05-14T14-39-19.398Z/pr-22-multiple-Controls-bl-0b919-der-unique-scoped-input-ids-chromium/test-failed-1.png

@valentinpalkovic valentinpalkovic added ci:verify Trigger PR Verification Harness and removed ci:verify Trigger PR Verification Harness labels May 15, 2026
@valentinpalkovic valentinpalkovic force-pushed the next branch 2 times, most recently from 80ccd7d to 745162d Compare May 15, 2026 16:58
@github-actions
Copy link
Copy Markdown

Verify Harness

Verdict: regression (target react-vite/default-ts)

Reason: boot failure (see regressionDetails)

Compile output (last 4KB)
Error: ENOENT: no such file or directory, mkdir '/home/runner/work/_temp/storybook-sandboxes/react-vite-default-ts/.verify-snapshot'
    at async mkdir (node:internal/fs/promises:855:10)
    at async snapshotSandbox (file:///home/runner/work/_temp/pr-head/scripts/verify/sandbox.ts:40:3)
    at async main (file:///home/runner/work/_temp/pr-head/scripts/verify-pr.ts:284:7)

PR-added unit tests: ✅ passed — 6716 passed, 0 failed across 2118 suite(s)

Files: code/addons/docs/src/blocks/controls/helpers.test.ts

Replay: npx playwright show-trace on the trace.zip listed under "Artifacts" on the run summary page.

@valentinpalkovic valentinpalkovic force-pushed the next branch 3 times, most recently from a11176d to 9de9d5b Compare May 15, 2026 17:25
@valentinpalkovic valentinpalkovic added ci:verify Trigger PR Verification Harness and removed ci:verify Trigger PR Verification Harness labels May 15, 2026
@github-actions
Copy link
Copy Markdown

Verify Harness

No verdict produced — the workflow failed before the harness ran (likely recipe-author dispatch, deny-regex, or lint). See run log for details.

@valentinpalkovic valentinpalkovic removed the ci:verify Trigger PR Verification Harness label May 15, 2026
@valentinpalkovic valentinpalkovic added the ci:verify Trigger PR Verification Harness label May 15, 2026
github-actions Bot pushed a commit that referenced this pull request May 15, 2026
@github-actions github-actions Bot added the verified-by-harness Verified by PR Verify Harness label May 15, 2026
@github-actions
Copy link
Copy Markdown

Verify Harness

Verdict: verified (target react-vite/default-ts)

Evidence (vision-check, claude-haiku-4-5-20251001): undetermined

Vision reasoning

The diff modifies control ID generation logic to include a controlsId parameter for scoping multiple <Controls> blocks on the same page. The Playwright recipe verifies this by checking that all [id^="control-"] attributes are unique and carry the correct prefix. However, the screenshots show a Storybook docs page but don't clearly display the actual HTML id attributes on individual control inputs—the test relies on DOM inspection (evaluateAll) rather than visual inspection. The change is not visually observable in the rendered UI itself, only in the underlying DOM attributes.

PR-added unit tests: ✅ passed — 6716 passed, 0 failed across 2118 suite(s)

Files: code/addons/docs/src/blocks/controls/helpers.test.ts, code/addons/vitest/src/vitest-plugin/agent-telemetry-reporter.test.ts, code/core/src/common/js-package-manager/NPMProxy.test.ts, code/core/src/common/js-package-manager/PNPMProxy.test.ts, code/core/src/common/js-package-manager/Yarn1Proxy.test.ts, code/core/src/common/js-package-manager/Yarn2Proxy.test.ts, code/core/src/core-server/server-channel/ai-setup-channel.test.ts, code/core/src/core-server/server-channel/ghost-stories-channel.test.ts, code/core/src/core-server/utils/checklist.test.ts, code/core/src/core-server/utils/ghost-stories/parse-vitest-report.test.ts, code/core/src/core-server/withTelemetry.test.ts, code/core/src/shared/utils/ai-checklist-flags.test.ts, code/core/src/shared/utils/analyze-test-results.test.ts, code/lib/create-storybook/src/commands/DependencyInstallationCommand.test.ts, code/lib/create-storybook/src/commands/PreflightCheckCommand.test.ts, code/lib/create-storybook/src/commands/ProjectDetectionCommand.test.ts, code/lib/create-storybook/src/commands/UserPreferencesCommand.test.ts, code/lib/create-storybook/src/generators/REACT_NATIVE/index.test.ts, code/lib/create-storybook/src/initiate.test.ts, code/lib/create-storybook/src/services/FrameworkDetectionService.test.ts, code/lib/create-storybook/src/services/ProjectTypeService.test.ts, code/lib/create-storybook/src/services/TelemetryService.test.ts

How Playwright validated this
test('multiple Controls blocks for same story get unique scoped input ids', async ({ page }, testInfo) => {
  const pageErrors: string[] = [];
  const consoleErrors: string[] = [];

  page.on('pageerror', (err) => {
    pageErrors.push(err.stack ?? err.message ?? String(err));
  });
  page.on('console', (msg) => {
    if (msg.type() === 'error') consoleErrors.push(msg.text());
  });

  const baseURL =
    process.env.STORYBOOK_URL ?? testInfo.project.use.baseURL ?? 'http://localhost:6006';

  try {
    await page.goto(
      `${baseURL}/?path=/story/addons-docs-blocks-controls--multiple-controls-for-same-story-on-same-page`
    );

    const recipe = new RecipePage(page, expect);
    await recipe.waitUntilLoaded();

    await expect(page.locator('#sb-errordisplay')).toBeHidden();

    const previewIframe = recipe.previewIframe();
    const previewRoot = recipe.previewRoot();
    await expect(previewRoot).toBeVisible();

    const controlIds = await previewIframe
      .locator('[id^="control-"]')
      .evaluateAll((els) => els.map((el) => el.id));

    expect(controlIds.length).toBeGreaterThan(0);

    const uniqueIds = new Set(controlIds);
    expect(uniqueIds.size).toBe(controlIds.length);

    const prefixes = new Set(
      controlIds
        .map((id) => {
          const m = id.match(/^control-([^-]+)-/);
          return m ? m[1] : null;
        })
        .filter((p): p is string => p !== null)
    );
    expect(prefixes.size).toBeGreaterThanOrEqual(2);

    await previewIframe.locator('body').screenshot({
      path: testInfo.outputPath('controls-blocks.png'),
      fullPage: true,
    });
  } finally {
    await testInfo.attach('pageErrors', {
      body: JSON.stringify(pageErrors),
      contentType: 'application/json',
    });
    await testInfo.attach('consoleErrors', {
      body: JSON.stringify(consoleErrors),
      contentType: 'application/json',
    });
  }

  expect(filterPageErrors(pageErrors)).toEqual([]);
});

Replay: npx playwright show-trace on the trace.zip listed under "Artifacts" on the run summary page.

Screenshots

2026-05-15T18-47-45.623Z/pr-22-Controls-block-scope-ee365--input-ids-to-each-instance-chromium/docs-controls.png

2026-05-15T18-47-45.623Z/pr-22-Controls-block-scope-ee365--input-ids-to-each-instance-chromium/docs-controls.png

2026-05-15T18-47-45.623Z/pr-22-Controls-block-scope-ee365--input-ids-to-each-instance-chromium/test-finished-1.png

2026-05-15T18-47-45.623Z/pr-22-Controls-block-scope-ee365--input-ids-to-each-instance-chromium/test-finished-1.png

@valentinpalkovic valentinpalkovic force-pushed the next branch 2 times, most recently from ad75ba9 to 099b6f7 Compare May 15, 2026 19:48
@valentinpalkovic valentinpalkovic added ci:verify Trigger PR Verification Harness and removed verified-by-harness Verified by PR Verify Harness ci:verify Trigger PR Verification Harness labels May 15, 2026
@github-actions
Copy link
Copy Markdown

Verify Harness

Verdict: regression (target react-vite/default-ts)

Reason: Playwright assertion failed in: ? — TimeoutError: locator.waitFor: Timeout 10000ms exceeded. Call log: - waiting for locator('#storybook-preview-iframe').contentFrame().locator('#storybook-root:visible, #storybook-docs:visible').locator(':scope > *').first() at _util.ts:31 29 | await this.page.waitForURL((url) => url.search.includes('path')); 30 | const root = this.previewRoot(); > 31 | await root.locator(':s

PR-added unit tests: ✅ passed — 6716 passed, 0 failed across 2118 suite(s)

Files: code/addons/docs/src/blocks/controls/helpers.test.ts, code/addons/vitest/src/vitest-plugin/agent-telemetry-reporter.test.ts, code/core/src/common/js-package-manager/NPMProxy.test.ts, code/core/src/common/js-package-manager/PNPMProxy.test.ts, code/core/src/common/js-package-manager/Yarn1Proxy.test.ts, code/core/src/common/js-package-manager/Yarn2Proxy.test.ts, code/core/src/core-server/server-channel/ai-setup-channel.test.ts, code/core/src/core-server/server-channel/ghost-stories-channel.test.ts, code/core/src/core-server/utils/checklist.test.ts, code/core/src/core-server/utils/ghost-stories/parse-vitest-report.test.ts, code/core/src/core-server/withTelemetry.test.ts, code/core/src/shared/utils/ai-checklist-flags.test.ts, code/core/src/shared/utils/analyze-test-results.test.ts, code/lib/create-storybook/src/commands/DependencyInstallationCommand.test.ts, code/lib/create-storybook/src/commands/PreflightCheckCommand.test.ts, code/lib/create-storybook/src/commands/ProjectDetectionCommand.test.ts, code/lib/create-storybook/src/commands/UserPreferencesCommand.test.ts, code/lib/create-storybook/src/generators/REACT_NATIVE/index.test.ts, code/lib/create-storybook/src/initiate.test.ts, code/lib/create-storybook/src/services/FrameworkDetectionService.test.ts, code/lib/create-storybook/src/services/ProjectTypeService.test.ts, code/lib/create-storybook/src/services/TelemetryService.test.ts

How Playwright validated this
test('Controls block scopes input ids per-instance (useId)', async ({ page }, testInfo) => {
  const pageErrors: string[] = [];
  const consoleErrors: string[] = [];

  page.on('pageerror', (err) => {
    pageErrors.push(err.stack ?? err.message ?? String(err));
  });
  page.on('console', (msg) => {
    if (msg.type() === 'error') consoleErrors.push(msg.text());
  });

  const baseURL =
    process.env.STORYBOOK_URL ?? testInfo.project.use.baseURL ?? 'http://localhost:6006';

  try {
    await page.goto(`${baseURL}/?path=/story/example-button--primary`);

    const recipe = new RecipePage(page, expect);
    await recipe.waitUntilLoaded();

    const errorDisplay = page.locator('#sb-errordisplay');
    await expect(errorDisplay).toBeHidden();

    const controlsTab = page.getByRole('tab', { name: /controls/i });
    await expect(controlsTab).toBeVisible({ timeout: 15000 });
    await controlsTab.click();

    const panel = page.locator('#storybook-panel-root');
    await expect(panel).toBeVisible();

    const controlEl = panel.locator('[id^="control-"]').first();
    await expect(controlEl).toBeAttached({ timeout: 15000 });

    const ids = await panel.locator('[id^="control-"]').evaluateAll((els) =>
      els.map((el) => el.id),
    );
    expect(ids.length).toBeGreaterThan(0);
    expect(new Set(ids).size).toBe(ids.length);

    for (const id of ids) {
      expect(id).toMatch(/^control-/);
    }

    await panel.screenshot({
      path: testInfo.outputPath('controls-panel.png'),
    });
  } finally {
    await testInfo.attach('pageErrors', {
      body: JSON.stringify(pageErrors),
      contentType: 'application/json',
    });
    await testInfo.attach('consoleErrors', {
      body: JSON.stringify(consoleErrors),
      contentType: 'application/json',
    });
  }

  expect(filterPageErrors(pageErrors)).toEqual([]);
});

Replay: npx playwright show-trace on the trace.zip listed under "Artifacts" on the run summary page.

@valentinpalkovic valentinpalkovic added ci:verify Trigger PR Verification Harness and removed ci:verify Trigger PR Verification Harness labels May 18, 2026
github-actions Bot pushed a commit that referenced this pull request May 18, 2026
@github-actions
Copy link
Copy Markdown

Verify Harness

Verdict: regression (target internal-ui)

Reason: Playwright assertion failed in: ? — TimeoutError: locator.waitFor: Timeout 10000ms exceeded. Call log: - waiting for locator('#storybook-preview-iframe').contentFrame().locator('#storybook-root:visible, #storybook-docs:visible').locator(':scope > *').first() at _util.ts:66 64 | await this.page.waitForURL((url) => url.search.includes('path')); 65 | const root = this.previewRoot(); > 66 | await root.locator(':s

PR-added unit tests: ✅ passed — 6764 passed, 0 failed across 2128 suite(s)

Files: code/addons/docs/src/blocks/controls/helpers.test.ts

How Playwright validated this
test('Controls block scopes control ids per instance', async ({ page }, testInfo) => {
  const pageErrors: string[] = [];
  const consoleErrors: string[] = [];

  page.on('pageerror', (err) => {
    pageErrors.push(err.stack ?? err.message ?? String(err));
  });
  page.on('console', (msg) => {
    if (msg.type() === 'error') consoleErrors.push(msg.text());
  });

  const baseURL =
    process.env.STORYBOOK_URL ?? testInfo.project.use.baseURL ?? 'http://localhost:6006';

  try {
    await page.goto(
      `${baseURL}/?path=/story/docs-blocks-controls--multiple-controls-for-same-story-on-same-page`
    );

    const sb = new RecipePage(page, expect);
    await sb.waitUntilLoaded();

    const errorDisplay = page.locator('#sb-errordisplay');
    await expect(errorDisplay).toBeHidden();

    const previewIframe = sb.previewIframe();
    const previewRoot = previewIframe.locator('#storybook-root');
    await expect(previewRoot).toBeVisible();

    const controlIds = await previewRoot
      .locator('[id^="control-"]')
      .evaluateAll((els) => els.map((el) => el.id));

    expect(controlIds.length).toBeGreaterThan(0);
    expect(new Set(controlIds).size).toBe(controlIds.length);

    const hasDisambiguator = controlIds.some((id) => {
      const parts = id.split('-');
      return parts.length >= 4;
    });
    expect(hasDisambiguator).toBe(true);

    await previewIframe.locator('body').screenshot({
      path: testInfo.outputPath('controls-blocks.png'),
    });
  } finally {
    await testInfo.attach('pageErrors', {
      body: JSON.stringify(pageErrors),
      contentType: 'application/json',
    });
    await testInfo.attach('consoleErrors', {
      body: JSON.stringify(consoleErrors),
      contentType: 'application/json',
    });
  }

  expect(filterPageErrors(pageErrors)).toEqual([]);
});

Replay: npx playwright show-trace on the trace.zip listed under "Artifacts" on the run summary page.

Screenshots

2026-05-18T06-32-27.804Z/pr-22-multiple-Controls-bl-86a92--produce-unique-control-ids-chromium/test-failed-1.png

2026-05-18T06-32-27.804Z/pr-22-multiple-Controls-bl-86a92--produce-unique-control-ids-chromium/test-failed-1.png

github-actions Bot pushed a commit that referenced this pull request May 18, 2026
@github-actions
Copy link
Copy Markdown

Verify Harness

Verdict: regression (target internal-ui)

Reason: Playwright assertion failed in: ? — TimeoutError: locator.waitFor: Timeout 10000ms exceeded. Call log: - waiting for locator('#storybook-preview-iframe').contentFrame().locator('#storybook-root:visible, #storybook-docs:visible').locator(':scope > *').first() at _util.ts:66 64 | await this.page.waitForURL((url) => url.search.includes('path')); 65 | const root = this.previewRoot(); > 66 | await root.locator(':s

PR-added unit tests: ✅ passed — 6764 passed, 0 failed across 2128 suite(s)

Files: code/addons/docs/src/blocks/controls/helpers.test.ts

How Playwright validated this
test('multiple Controls blocks for same story produce unique control ids', async ({ page }, testInfo) => {
  const pageErrors: string[] = [];
  const consoleErrors: string[] = [];

  page.on('pageerror', (err) => {
    pageErrors.push(err.stack ?? err.message ?? String(err));
  });
  page.on('console', (msg) => {
    if (msg.type() === 'error') consoleErrors.push(msg.text());
  });

  const baseURL =
    process.env.STORYBOOK_URL ?? testInfo.project.use.baseURL ?? 'http://localhost:6006';

  try {
    await page.goto(`${baseURL}/?path=/story/example-button--primary`);
    const sb = new RecipePage(page, expect);
    await sb.waitUntilLoaded();

    const searchBox = page.getByRole('searchbox', { name: /search for components/i });
    await searchBox.click();
    await searchBox.fill('MultipleControlsForSameStoryOnSamePage');

    const result = page
      .getByRole('option', { name: /multiple controls for same story on same page/i })
      .first();
    await expect(result).toBeVisible({ timeout: 10000 });
    await result.click();

    const previewIframe = page.frameLocator('#storybook-preview-iframe');
    const previewRoot = previewIframe.locator('#storybook-root:visible, #storybook-docs:visible');
    await expect(previewRoot).toBeVisible({ timeout: 15000 });

    await expect(page.locator('#sb-errordisplay')).toBeHidden();

    const controlIds = await previewIframe
      .locator('[id^="control-"]')
      .evaluateAll((els) => els.map((el) => el.id));

    expect(controlIds.length).toBeGreaterThan(0);
    const uniqueIds = new Set(controlIds);
    expect(uniqueIds.size).toBe(controlIds.length);

    const suffixCounts = new Map<string, number>();
    for (const id of controlIds) {
      const m = id.match(/-([^-]+)$/);
      if (m) suffixCounts.set(m[1], (suffixCounts.get(m[1]) ?? 0) + 1);
    }
    const duplicatedSuffixes = Array.from(suffixCounts.values()).filter((n) => n >= 2);
    expect(duplicatedSuffixes.length).toBeGreaterThan(0);

    await previewI

Replay: npx playwright show-trace on the trace.zip listed under "Artifacts" on the run summary page.

Screenshots

2026-05-18T06-43-10.424Z/pr-22-multiple-Controls-bl-2e3e9--produce-unique-control-ids-chromium/test-failed-1.png

2026-05-18T06-43-10.424Z/pr-22-multiple-Controls-bl-2e3e9--produce-unique-control-ids-chromium/test-failed-1.png

github-actions Bot pushed a commit that referenced this pull request May 19, 2026
@github-actions
Copy link
Copy Markdown

Verify Harness

Verdict: regression (target react-vite/default-ts)

Reason: Playwright assertion failed in: ? — TimeoutError: locator.waitFor: Timeout 10000ms exceeded. Call log: - waiting for locator('#storybook-preview-iframe').contentFrame().locator('#storybook-root:has(> *), #storybook-docs:has(> *)').locator(':scope > *').first() at _util.ts:75 73 | await this.page.waitForURL((url) => url.search.includes('path')); 74 | const root = this.previewRoot(); > 75 | await root.locator('

PR-added unit tests: ❌ failed — 6944 passed, 1 failed across 2178 suite(s)

Files: code/addons/docs/src/blocks/controls/helpers.test.ts

vitest output (last 4KB)
      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-dirty-a6aLRV/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-dirty-a6aLRV/remotes/edgy.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-nested-no-legacy-TjQ7Aq/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-nested-no-legacy-TjQ7Aq/remotes/excalidraw.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-XHKXQB/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-XHKXQB/remotes/wikitok.git
 * [new branch]      main -> main
Cloning into '/home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-staging-6Pu68K'...
warning: You appear to have cloned an empty repository.
done.
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-auto-clone-o6fZXM/remotes/mealdrop.git
 * [new branch]      main -> main
Cloning into '/home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-staging-Hsw6pe'...
warning: You appear to have cloned an empty repository.
done.
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-auto-clone-o6fZXM/remotes/wikitok.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-noop-i4nf9q/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-dirty-5TTpZX/remotes/mealdrop.git
 * [new branch]      main -> main
Cloning into '/home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-staging-QtblHw'...
warning: You appear to have cloned an empty repository.
done.
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-auto-clone-eOYKDd/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-target-behind-iN4sQ4/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-target-behind-iN4sQ4/remotes/edgy.git
 * [new branch]      main -> main
Cloning into '/home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-target-behind-iN4sQ4/edgy-remote-worktree'...
done.
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-target-behind-iN4sQ4/remotes/edgy.git
   6f32d13..e6ffcbb  main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-skip-push-p59mdz/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-resume-push-KJps1M/remotes/mealdrop.git
 * [new branch]      main -> main
(node:21) ExperimentalWarning: SQLite is an experimental feature and might change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
(node:21) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
(Use `node --trace-deprecation ...` to show where the warning was created)
(node:21) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
(Use `node --trace-deprecation ...` to show where the warning was created)
(node:21) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
(Use `node --trace-deprecation ...` to show where the warning was created)
JSON report written to /home/runner/work/_temp/pr-head/.verify-output/unit-tests-report.json

How Playwright validated this
test('multiple Controls blocks for the same story produce unique control ids', async ({
  page,
}, testInfo) => {
  const pageErrors: string[] = [];
  const consoleErrors: string[] = [];

  page.on('pageerror', (err) => {
    pageErrors.push(err.stack ?? err.message ?? String(err));
  });
  page.on('console', (msg) => {
    if (msg.type() === 'error') consoleErrors.push(msg.text());
  });

  const baseURL =
    process.env.STORYBOOK_URL ?? testInfo.project.use.baseURL ?? 'http://localhost:6006';

  try {
    await page.goto(
      `${baseURL}/?path=/story/docs-blocks-controls--multiple-controls-for-same-story-on-same-page`
    );

    const sb = new RecipePage(page, expect);
    await sb.waitUntilLoaded();

    const errorDisplay = page.locator('#sb-errordisplay');
    await expect(errorDisplay).toBeHidden();

    const previewIframe = sb.previewIframe();

    const controlEls = previewIframe.locator('[id^="control-"]');
    await expect(controlEls.first()).toBeAttached({ timeout: 15_000 });

    const ids = await controlEls.evaluateAll((els) => els.map((el) => el.id));
    expect(ids.length).toBeGreaterThan(0);
    expect(new Set(ids).size).toBe(ids.length);

    const setterEls = previewIframe.locator('[id^="set-"]');
    const setterCount = await setterEls.count();
    if (setterCount > 0) {
      const setterIds = await setterEls.evaluateAll((els) => els.map((el) => el.id));
      expect(new Set(setterIds).size).toBe(setterIds.length);
    }
  } finally {
    await testInfo.attach('pageErrors', {
      body: JSON.stringify(pageErrors),
      contentType: 'application/json',
    });
    await testInfo.attach('consoleErrors', {
      body: JSON.stringify(consoleErrors),
      contentType: 'application/json',
    });
  }

  expect(filterPageErrors(pageErrors)).toEqual([]);
  expect(filterConsoleErrors(consoleErrors)).toEqual([]);
});

Replay: npx playwright show-trace on the trace.zip listed under "Artifacts" on the run summary page.

Screenshots

2026-05-19T13-52-46.565Z/pr-22-multiple-Controls-bl-86a92--produce-unique-control-ids-chromium/test-failed-1.png

2026-05-19T13-52-46.565Z/pr-22-multiple-Controls-bl-86a92--produce-unique-control-ids-chromium/test-failed-1.png

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

Labels

ci:verify Trigger PR Verification Harness

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants