Skip to content

[harness eval #34649] fix: preserve disabled a11y rules with runOnly#36

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

[harness eval #34649] fix: preserve disabled a11y rules with runOnly#36
valentinpalkovic wants to merge 1 commit into
nextfrom
try-pr-34649

Conversation

@valentinpalkovic
Copy link
Copy Markdown
Owner

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

@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 6ce2451

@github-actions
Copy link
Copy Markdown

Verify Harness

Verdict: regression (target internal-ui)

Reason: PR-added unit tests failed (see unitTests.details)

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

Vision reasoning

Recipe produced no screenshots — cannot verify visible evidence.

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

Files: code/addons/a11y/src/a11yRunner.test.ts

vitest output (last 4KB)
 /tmp/claude/eval-sync-baselines-nested-no-legacy-UvK3vR/remotes/excalidraw.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-storybook-version-AJoh9K/remotes/mealdrop.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-storybook-version-AJoh9K/remotes/wikitok.git
 * [new branch]      main -> main
Cloning into '/tmp/claude/eval-sync-staging-9cRFh4'...
warning: You appear to have cloned an empty repository.
done.
To /tmp/claude/eval-sync-baselines-auto-clone-RLv9BI/remotes/mealdrop.git
 * [new branch]      main -> main
Cloning into '/tmp/claude/eval-sync-staging-zsQ6gW'...
warning: You appear to have cloned an empty repository.
done.
To /tmp/claude/eval-sync-baselines-auto-clone-RLv9BI/remotes/wikitok.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-storybook-version-noop-eT9DFN/remotes/mealdrop.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-storybook-version-dirty-oHgmKk/remotes/mealdrop.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-baselines-target-behind-4cpF7y/remotes/mealdrop.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-baselines-target-behind-4cpF7y/remotes/edgy.git
 * [new branch]      main -> main
Cloning into '/tmp/claude/eval-sync-baselines-target-behind-4cpF7y/edgy-remote-worktree'...
done.
To /tmp/claude/eval-sync-baselines-target-behind-4cpF7y/remotes/edgy.git
   eed4107..629fbfb  main -> main
Cloning into '/tmp/claude/eval-sync-storybook-version-staging-XMoq8G'...
warning: You appear to have cloned an empty repository.
done.
To /tmp/claude/eval-sync-storybook-version-auto-clone-aUxNt6/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-6sK4fI/remotes/mealdrop.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-storybook-version-resume-push-kPdF1I/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-56-34.294Z/pr-36-a11y-addon-runs-with-a5261-and-respects-disabled-rules-chromium/a11y-panel.png

2026-05-14T13-56-34.294Z/pr-36-a11y-addon-runs-with-a5261-and-respects-disabled-rules-chromium/a11y-panel.png

2026-05-14T13-56-34.294Z/pr-36-a11y-addon-runs-with-a5261-and-respects-disabled-rules-chromium/test-finished-1.png

2026-05-14T13-56-34.294Z/pr-36-a11y-addon-runs-with-a5261-and-respects-disabled-rules-chromium/test-finished-1.png

@valentinpalkovic valentinpalkovic force-pushed the next branch 2 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: PR-added unit tests failed (see unitTests.details)

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

Vision reasoning

The diff contains multiple types of changes: (1) CI/GitHub workflow simplifications (removing runId-based path logic), (2) test-only additions to a11yRunner.test.ts with new mock setup, and (3) runtime logic changes in a11yRunner.ts for merging disabled rules into RunOptions. The Playwright recipe tests the a11y addon panel rendering on the example-button--primary story and captures the accessibility violations results. While the screenshots show the a11y panel working correctly with 'No accessibility violations found', they cannot definitively confirm that the new mergeDisabledRulesIntoRunOpt

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

Files: code/addons/a11y/src/a11yRunner.test.ts

vitest output (last 4KB)
 /tmp/claude/eval-sync-baselines-nested-no-legacy-loZtlW/remotes/excalidraw.git
 * [new branch]      main -> main
Cloning into '/tmp/claude/eval-sync-staging-Nl98ws'...
warning: You appear to have cloned an empty repository.
done.
To /tmp/claude/eval-sync-baselines-auto-clone-H9tUmq/remotes/mealdrop.git
 * [new branch]      main -> main
Cloning into '/tmp/claude/eval-sync-staging-CZR3A5'...
warning: You appear to have cloned an empty repository.
done.
To /tmp/claude/eval-sync-baselines-auto-clone-H9tUmq/remotes/wikitok.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-storybook-version-cNQYn7/remotes/mealdrop.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-storybook-version-cNQYn7/remotes/wikitok.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-storybook-version-noop-1IfKRC/remotes/mealdrop.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-baselines-target-behind-wska9x/remotes/mealdrop.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-baselines-target-behind-wska9x/remotes/edgy.git
 * [new branch]      main -> main
Cloning into '/tmp/claude/eval-sync-baselines-target-behind-wska9x/edgy-remote-worktree'...
done.
To /tmp/claude/eval-sync-baselines-target-behind-wska9x/remotes/edgy.git
   71425f3..8afe8f8  main -> main
To /tmp/claude/eval-sync-storybook-version-dirty-MnhfHn/remotes/mealdrop.git
 * [new branch]      main -> main
Cloning into '/tmp/claude/eval-sync-storybook-version-staging-xmsRki'...
warning: You appear to have cloned an empty repository.
done.
To /tmp/claude/eval-sync-storybook-version-auto-clone-gfBLHd/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-PpEcaX/remotes/mealdrop.git
 * [new branch]      main -> main
To /tmp/claude/eval-sync-storybook-version-resume-push-9SH4ie/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-25-19.999Z/pr-36-a11y-addon-runs-on-e-4269c-mary-without-runtime-errors-chromium/a11y-panel.png

2026-05-14T14-25-19.999Z/pr-36-a11y-addon-runs-on-e-4269c-mary-without-runtime-errors-chromium/a11y-panel.png

2026-05-14T14-25-19.999Z/pr-36-a11y-addon-runs-on-e-4269c-mary-without-runtime-errors-chromium/test-finished-1.png

2026-05-14T14-25-19.999Z/pr-36-a11y-addon-runs-on-e-4269c-mary-without-runtime-errors-chromium/test-finished-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 github-actions Bot added the verified-by-harness Verified by PR Verify Harness label May 14, 2026
@github-actions
Copy link
Copy Markdown

Verify Harness

Verdict: verified (target internal-ui)

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

Vision reasoning

The diff primarily modifies test code (a11yRunner.test.ts), implementation logic (a11yRunner.ts, mergeDisabledRulesIntoRunOptions), and CI/build configuration files. The user-visible change—preserving disabled a11y rules when options.runOnly is set—is a behavioral fix in the a11y addon's internal logic that would only be observable if a story had both disabled rules AND runOnly options. The screenshots show the a11y panel rendering successfully with 'No accessibility violations found,' but they don't demonstrate whether the specific rule-merging behavior is working correctly, as this would req

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

Files: code/addons/a11y/src/a11yRunner.test.ts

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

Screenshots

2026-05-14T14-40-15.749Z/pr-36-a11y-addon-runs-on-B-56e73-urfacing-axe-runtime-errors-chromium/a11y-panel.png

2026-05-14T14-40-15.749Z/pr-36-a11y-addon-runs-on-B-56e73-urfacing-axe-runtime-errors-chromium/a11y-panel.png

2026-05-14T14-40-15.749Z/pr-36-a11y-addon-runs-on-B-56e73-urfacing-axe-runtime-errors-chromium/test-finished-1.png

2026-05-14T14-40-15.749Z/pr-36-a11y-addon-runs-on-B-56e73-urfacing-axe-runtime-errors-chromium/test-finished-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 Bot pushed a commit that referenced this pull request May 15, 2026
@github-actions
Copy link
Copy Markdown

Verify Harness

Verdict: verified (target internal-ui)

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

Vision reasoning

The diff's primary user-visible change is in the a11y addon's internal logic (merging disabled rules into runOnly options). The recipe correctly triggers the a11yRunner.run() codepath by opening the Accessibility addon panel, but the screenshots show the panel rendering successfully with accessibility violations/passes tabs visible. Since the change is a silent logic fix (preserving disabled rules during axe.run) with no observable UI difference in the panel's appearance or results display, the screenshots cannot definitively confirm or deny the fix's correctness.

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

Files: code/addons/a11y/src/a11yRunner.test.ts

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

Screenshots

2026-05-15T16-56-03.470Z/pr-36-a11y-addon-panel-run-b7c99-mary-without-runtime-errors-chromium/a11y-panel.png

2026-05-15T16-56-03.470Z/pr-36-a11y-addon-panel-run-b7c99-mary-without-runtime-errors-chromium/a11y-panel.png

2026-05-15T16-56-03.470Z/pr-36-a11y-addon-panel-run-b7c99-mary-without-runtime-errors-chromium/preview.png

2026-05-15T16-56-03.470Z/pr-36-a11y-addon-panel-run-b7c99-mary-without-runtime-errors-chromium/preview.png

2026-05-15T16-56-03.470Z/pr-36-a11y-addon-panel-run-b7c99-mary-without-runtime-errors-chromium/test-finished-1.png

2026-05-15T16-56-03.470Z/pr-36-a11y-addon-panel-run-b7c99-mary-without-runtime-errors-chromium/test-finished-1.png

@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.

@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 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 18, 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 added a commit that referenced this pull request May 18, 2026
…ule import

Wave finding (#36 try-pr-34649 a11yRunner): recipe-author correctly chose
@verify-mode: behavioral but reached the changed module via in-browser
dynamic import() + monkeypatch — the deny-regex gate rejected it at attempt 1
with no retry, producing "no verdict".

- recipe-author-core.ts: on assertNoDeniedPatterns failure, build a retry
  message (denied pattern + §12.5 pointer) and loop, mirroring the lint
  failure path. Terminal `deny-regex-hit` only after MAX_RECIPE_ATTEMPTS.
- _recipe-authoring-guide.md §12.5: HARD GATE — a behavioral recipe must
  never import()/monkeypatch/eval the changed module (deny-regex blocks it
  pre-run = no verdict). Drive the public UI path and assert observable
  effect; if no UI path exists, fall back to visual smoke + filterPageErrors
  rather than fabricating a module import.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@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: PR-added unit tests failed (see unitTests.details)

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

Files: code/addons/a11y/src/a11yRunner.test.ts

vitest output (last 4KB)
Internal Error: ENOENT: no such file or directory, lstat '/tmp/claude'
    at Object.realpathSync (node:fs:2791:29)
    at Yn.realpathSync (/home/runner/work/_temp/pr-head/.yarn/releases/yarn-4.10.3.cjs:9:8625)
    at B$ (/home/runner/work/_temp/pr-head/.yarn/releases/yarn-4.10.3.cjs:9:44774)
    at Yn.mktempPromise (/home/runner/work/_temp/pr-head/.yarn/releases/yarn-4.10.3.cjs:9:45331)
    at Object.she (/home/runner/work/_temp/pr-head/.yarn/releases/yarn-4.10.3.cjs:189:2341)
    at NC.execute (/home/runner/work/_temp/pr-head/.yarn/releases/yarn-4.10.3.cjs:524:1048)
    at async NC.validateAndExecute (/home/runner/work/_temp/pr-head/.yarn/releases/yarn-4.10.3.cjs:94:787)
    at async t.run (/home/runner/work/_temp/pr-head/.yarn/releases/yarn-4.10.3.cjs:98:3263)
    at async gC.execute (/home/runner/work/_temp/pr-head/.yarn/releases/yarn-4.10.3.cjs:435:497)
    at async gC.validateAndExecute (/home/runner/work/_temp/pr-head/.yarn/releases/yarn-4.10.3.cjs:94:787)

How Playwright validated this
test('a11y addon runs and renders results on a story', 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 errorDisplay = page.locator('#sb-errordisplay');
    await expect(errorDisplay).toBeHidden();

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

    const resultTab = page
      .getByRole('tab', { name: /violations|passes|incomplete/i })
      .first();
    await expect(resultTab).toBeVisible({ timeout: 30000 });

    await expect(errorDisplay).toBeHidden();
  } 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-18T11-21-35.897Z/pr-36-a11y-addon-runs-and-renders-results-on-a-story-chromium/test-finished-1.png

2026-05-18T11-21-35.897Z/pr-36-a11y-addon-runs-and-renders-results-on-a-story-chromium/test-finished-1.png

valentinpalkovic added a commit that referenced this pull request May 18, 2026
… TMPDIR pinned

Two distinct wave-#31/#36 root causes, both false regressions:

(a) _util.ts previewRoot() filtered `#storybook-root:visible`. Stories with
    `parameters.layout:'fullscreen'` + the internal-ui side-by-side/stacked
    theme decorator wrap the story so #storybook-root has a zero-size
    (Playwright-"not visible") box though it rendered — locator matched
    nothing, waitForStoryLoaded timed out (#31 manager-sidebar-heading--*).
    Use `:has(> *)` instead: selects whichever container actually has
    children, keeps story-vs-docs disambiguation, drops the bounding-box
    requirement.

(b) verify-pr.yml unit-test step runs `env -i … srt … yarn vitest`. `env -i`
    strips TMPDIR, so Yarn's run-temp realpaths a nonexistent srt path
    (`lstat '/tmp/claude'` ENOENT) and aborts before vitest starts →
    false "vitest exited without JSON report" regression (#36 a11yRunner).
    Pin TMPDIR to an existing allowWrite dir
    ($PR_HEAD_DIR/.verify-output/vitest-tmp), same rationale REPORT/LOG
    already live there.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@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: PR-added unit tests failed (see unitTests.details)

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

Files: code/addons/a11y/src/a11yRunner.test.ts

vitest output (last 4KB)
Internal Error: ENOENT: no such file or directory, lstat '/tmp/claude'
    at Object.realpathSync (node:fs:2791:29)
    at Yn.realpathSync (/home/runner/work/_temp/pr-head/.yarn/releases/yarn-4.10.3.cjs:9:8625)
    at B$ (/home/runner/work/_temp/pr-head/.yarn/releases/yarn-4.10.3.cjs:9:44774)
    at Yn.mktempPromise (/home/runner/work/_temp/pr-head/.yarn/releases/yarn-4.10.3.cjs:9:45331)
    at Object.she (/home/runner/work/_temp/pr-head/.yarn/releases/yarn-4.10.3.cjs:189:2341)
    at NC.execute (/home/runner/work/_temp/pr-head/.yarn/releases/yarn-4.10.3.cjs:524:1048)
    at async NC.validateAndExecute (/home/runner/work/_temp/pr-head/.yarn/releases/yarn-4.10.3.cjs:94:787)
    at async t.run (/home/runner/work/_temp/pr-head/.yarn/releases/yarn-4.10.3.cjs:98:3263)
    at async gC.execute (/home/runner/work/_temp/pr-head/.yarn/releases/yarn-4.10.3.cjs:435:497)
    at async gC.validateAndExecute (/home/runner/work/_temp/pr-head/.yarn/releases/yarn-4.10.3.cjs:94:787)

How Playwright validated this
test('a11y runner preserves disabled rules with runOnly without runtime errors', 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 errorDisplay = page.locator('#sb-errordisplay');
    await expect(errorDisplay).toBeHidden();

    const previewRoot = sb.previewRoot();
    await expect(previewRoot).toBeVisible();

    const previewIframeHandle = await page.waitForSelector('#storybook-preview-iframe');
    const previewFrame = await previewIframeHandle.contentFrame();
    expect(previewFrame).not.toBeNull();

    const result = await previewFrame!.evaluate(async () => {
      const channel = (window as any).__STORYBOOK_ADDONS_CHANNEL__;
      if (!channel) return { ok: false, reason: 'no channel' };

      return await new Promise<{ ok: boolean; reason?: string }>((resolve) => {
        const timeout = setTimeout(() => resolve({ ok: false, reason: 'timeout' }), 15000);

        const onResult = () => {
          clearTimeout(timeout);
          channel.off('storybook/a11y/result', onResult);
          channel.off('storybook/a11y/error', onError);
          resolve({ ok: true });
        };
        const onError = (err: unknown) => {
          clearTimeout(timeout);
          channel.off('storybook/a11y/result', onResult);
          channel.off('storybook/a11y/error', onError);
          resolve({ ok: false, reason: `error: ${String(err)}` });
        };

        channel.on('storybook/a11y/result', onResult);
        channel.on

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

Screenshots

2026-05-18T21-07-21.914Z/pr-36-a11y-runner-preserve-618df-Only-without-runtime-errors-chromium/test-finished-1.png

2026-05-18T21-07-21.914Z/pr-36-a11y-runner-preserve-618df-Only-without-runtime-errors-chromium/test-finished-1.png

valentinpalkovic added a commit that referenced this pull request May 18, 2026
…bans root-visible assert

Re-run of #36/#31 showed both prior fixes missed the real cause:

- #36: TMPDIR pin had zero effect — Yarn's mktempPromise still ENOENT
  `/tmp/claude`. Root cause: srt derives its sandbox tmp from
  CLAUDE_CODE_TMPDIR, NOT TMPDIR. The main recipe run inherits it via
  $GITHUB_ENV ($SANDBOX_TMPDIR); the unit-test step's `env -i` strips it,
  so srt falls back to its hardcoded `/tmp/claude` (never created). Pass
  CLAUDE_CODE_TMPDIR=$VITEST_TMPDIR (existing allowWrite dir) in env -i.

- #31: previewRoot `:has(> *)` fix removed the _util.ts:66 timeout, but the
  recipe-author hand-rolled `expect('#storybook-root').toBeVisible()` which
  is "hidden" for `Sidebar/Heading` (layout:fullscreen + side-by-side =
  zero-box root). Brand triage rule now explicitly bans root-visibility
  asserts and prescribes a child `toBeAttached()` content assertion.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@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: ? — Error: expect(received).toEqual(expected) // deep equality - Expected - 1 + Received + 4 - Array [] + Array [ + "Failed to load resource: net::ERR_INTERNET_DISCONNECTED", + "Failed to load resource: net::ERR_INTERNET_DISCONNECTED", + ] 73 | 74 | expect(filterPageErrors(pageErrors)).toEqual([]); > 75 | expect(consoleErrors).toEqual([]); | ^ 76 | });

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

Files: code/addons/a11y/src/a11yRunner.test.ts

vitest output (last 4KB)
      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-dirty-1G7Yxb/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-dirty-1G7Yxb/remotes/edgy.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-nested-no-legacy-2SUlbk/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-nested-no-legacy-2SUlbk/remotes/excalidraw.git
 * [new branch]      main -> main
Cloning into '/home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-staging-lqtVO8'...
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-nWthSf/remotes/mealdrop.git
 * [new branch]      main -> main
Cloning into '/home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-staging-rTSPvw'...
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-nWthSf/remotes/wikitok.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-dXGDxA/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-dXGDxA/remotes/wikitok.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-noop-7jsAte/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-target-behind-LAqoGG/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-target-behind-LAqoGG/remotes/edgy.git
 * [new branch]      main -> main
Cloning into '/home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-target-behind-LAqoGG/edgy-remote-worktree'...
done.
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-target-behind-LAqoGG/remotes/edgy.git
   b219a59..dbbd936  main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-dirty-W3Ty1s/remotes/mealdrop.git
 * [new branch]      main -> main
Cloning into '/home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-staging-ZIEhjW'...
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-HKu1i4/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-skip-push-t6JYNm/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 /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-resume-push-JLTl8h/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)
JSON report written to /home/runner/work/_temp/pr-head/.verify-output/unit-tests-report.json

How Playwright validated this
test('a11y runner executes with runOnly + disabled rules without runtime errors', 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/core-args--passed-to-story`);
    const sb = new RecipePage(page, expect);
    await sb.waitUntilLoaded();

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

    const runResult = await page.evaluate(async () => {
      const iframe = document.getElementById(
        'storybook-preview-iframe'
      ) as HTMLIFrameElement | null;
      if (!iframe?.contentWindow) return { ok: false, reason: 'no-iframe' };
      const w = iframe.contentWindow as any;

      const deadline = Date.now() + 15000;
      while (Date.now() < deadline) {
        if (w.__STORYBOOK_ADDONS_CHANNEL__) break;
        await new Promise((r) => setTimeout(r, 100));
      }
      const channel = w.__STORYBOOK_ADDONS_CHANNEL__;
      if (!channel) return { ok: false, reason: 'no-channel' };

      return await new Promise<{ ok: boolean; reason?: string }>((resolve) => {
        const timeout = setTimeout(
          () => resolve({ ok: false, reason: 'timeout-waiting-for-result' }),
          15000
        );
        const onResult = () => {
          clearTimeout(timeout);
          resolve({ ok: true });
        };
        const onError = (err: any) => {
          clearTimeout(timeout);
          resolve({ ok: false, reason: `runner-error:${err?.error ?? String(err)}` });
        };
        channel.once('storybook/a11y/result', onResult);
        cha

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

Screenshots

2026-05-18T21-21-02.389Z/pr-36-a11y-runner-executes-7c8d2-anel-without-runtime-errors-chromium/test-failed-1.png

2026-05-18T21-21-02.389Z/pr-36-a11y-runner-executes-7c8d2-anel-without-runtime-errors-chromium/test-failed-1.png

valentinpalkovic added a commit that referenced this pull request May 18, 2026
…ndate it

Wave #36 (after CLAUDE_CODE_TMPDIR fix let vitest run): Playwright recipe
failed on `expect(consoleErrors).toEqual([])` because the srt egress jail
denies every non-allowlisted domain, so internal-ui's external probes always
log `Failed to load resource: net::ERR_INTERNET_DISCONNECTED` — environmental,
not a PR regression. No console-error equivalent of filterPageErrors existed.

- _util.ts: add `filterConsoleErrors()` dropping `net::ERR_*`
  (INTERNET_DISCONNECTED / NAME_NOT_RESOLVED / BLOCKED_BY_CLIENT /
  CONNECTION_REFUSED / FAILED) + the shared cross-origin sessionStorage
  SecurityError. Verified: keeps only genuine errors.
- _recipe-authoring-guide.md §3: MANDATORY subsection — never assert the
  raw consoleErrors array; always filterConsoleErrors(consoleErrors),
  mirroring the filterPageErrors mandate.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@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: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 — 6761 passed, 1 failed across 2128 suite(s)

Files: code/addons/a11y/src/a11yRunner.test.ts

vitest output (last 4KB)
      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-dirty-BdkjKU/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-dirty-BdkjKU/remotes/edgy.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-nested-no-legacy-eyReLT/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-nested-no-legacy-eyReLT/remotes/excalidraw.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-G2EsDb/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-G2EsDb/remotes/wikitok.git
 * [new branch]      main -> main
Cloning into '/home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-staging-mJvuVB'...
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-EraDTR/remotes/mealdrop.git
 * [new branch]      main -> main
Cloning into '/home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-staging-qW6td6'...
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-EraDTR/remotes/wikitok.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-noop-RXAZM4/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-dirty-zwMkxo/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-target-behind-9N1ubE/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-target-behind-9N1ubE/remotes/edgy.git
 * [new branch]      main -> main
Cloning into '/home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-target-behind-9N1ubE/edgy-remote-worktree'...
done.
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-target-behind-9N1ubE/remotes/edgy.git
   8df6411..bafa2a2  main -> main
Cloning into '/home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-staging-t9d2CO'...
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-0D0Wco/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-skip-push-rvIiQd/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 /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-resume-push-hBlWlm/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)
JSON report written to /home/runner/work/_temp/pr-head/.verify-output/unit-tests-report.json

How Playwright validated this
test('a11y runner executes via addon panel without runtime errors', 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();

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

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

    const violationsTab = page.getByRole('tab', { name: /violations/i });
    const passesTab = page.getByRole('tab', { name: /passes/i });
    await expect(violationsTab.or(passesTab).first()).toBeVisible({ timeout: 30000 });
  } 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-18T21-38-25.609Z/pr-36-a11y-runner-complete-13680-igured-rules-without-errors-chromium/test-failed-1.png

2026-05-18T21-38-25.609Z/pr-36-a11y-runner-complete-13680-igured-rules-without-errors-chromium/test-failed-1.png

valentinpalkovic added a commit that referenced this pull request May 19, 2026
…8 single-sourcing

EPIC-5 (test the verifier — was 3 test files, zero on the security/cost
core): 8 new vitest suites, 181 tests, auto-globbed by the `scripts`
project (no CI wiring needed; satisfies 5.11):
- 5.1 recipe-deny.test.ts — all 19 DENY patterns, exact 1-based line,
  per-line tripwire (no comment-awareness) pinned; eval-#36
  `dynamic import(` pinned (isolated + overlapping).
- 5.2 agent-dispatch-cost.test.ts — budget gate boundary (computed, not
  hardcoded), resolveModelId round-trip, pricing digit-transpose guard.
- 5.4 derive-verdict-hmac.test.ts — saboteur suite (forged/tampered/
  correct/wrong-secret/non-signed vs signed field) + the deferred
  Wave-1.1 LOW(b) disjointness pin, made non-vacuous (poisoned-set
  replica proves the guard has teeth).
- 5.6 triage/target-suggest, 5.7 mode/target (30-line window edge),
  5.10 agent-prompt-sanitize (ANSI/NUL/fence redaction, cap boundary).

EPIC-6:
- 6.1 SKILL.md — de-absolutized 4 hardcoded /Users/... paths +1 stale
  prose note to runtime-resolved $REPO_ROOT (git rev-parse).
- 6.8 srt pin — replaced manual-paste srt-version/srt-sha256 in
  verify-pr.yml with committed scripts/verify/srt.lock.json read
  fail-closed from the TRUSTED base checkout (values byte-identical:
  0.0.51 / 36de…6338); load-bearing sha verification in the composite
  untouched. Added workflow_dispatch-only _srt-sha-probe.yml.

Mandatory separate review pass (security-reviewer + code-reviewer),
findings addressed and re-verified:
- sec HIGH: probe no longer auto-commits/pushes the supply-chain pin —
  emit-only (summary + artifact + outputs), contents: read, human lands
  it via reviewed PR (restores the "reviewed diff" invariant).
- sec LOW: strict srt version regex (rejects ./../leading-trailing dot)
  in both workflows.
- code HIGH: derive-verdict-hmac.test.ts typed (Partial<VerifyResult>/
  RecipeTest/StepStatus) — 22 tsc errors cleared, assertions unchanged.
- code MED/LOW: dropped unused beforeEach import; over-claiming
  "ordering invariant" tests renamed to honest "disjoint rules resolve
  independently" (no dual-match input exists in the real globs); added
  target grammar negative cases.

Verified: tsc clean for all 8 test files (scripts/tsconfig.json),
181/181 green, both workflows parse, bash -n OK, srt values unchanged,
trust boundary + fail-closed intact (security-reviewed). Scope clean
(no yarn.lock/shared-tree drift).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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 internal-ui)

Reason: PR-added unit tests failed (see unitTests.details)

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

Files: code/addons/a11y/src/a11yRunner.test.ts

vitest output (last 4KB)
      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-dirty-DGYaWW/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-dirty-DGYaWW/remotes/edgy.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-nested-no-legacy-Fygc1C/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-nested-no-legacy-Fygc1C/remotes/excalidraw.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-QnrfuN/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-QnrfuN/remotes/wikitok.git
 * [new branch]      main -> main
Cloning into '/home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-staging-IxMr9p'...
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-y74BZ7/remotes/mealdrop.git
 * [new branch]      main -> main
Cloning into '/home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-staging-fbgxpI'...
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-y74BZ7/remotes/wikitok.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-noop-ctOBwe/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-dirty-mgC7Ie/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-target-behind-YaonQS/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-target-behind-YaonQS/remotes/edgy.git
 * [new branch]      main -> main
Cloning into '/home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-target-behind-YaonQS/edgy-remote-worktree'...
done.
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-baselines-target-behind-YaonQS/remotes/edgy.git
   594db84..abf647d  main -> main
Cloning into '/home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-staging-3QIZ7M'...
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-SJKAB2/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-skip-push-QRJLuN/remotes/mealdrop.git
 * [new branch]      main -> main
To /home/runner/work/_temp/pr-head/.verify-output/vitest-tmp/eval-sync-storybook-version-resume-push-K88GIL/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('a11yRunner merges disabled config.rules into runOnly options', 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 errorDisplay = page.locator('#sb-errordisplay');
    await expect(errorDisplay).toBeHidden();

    const previewIframe = sb.previewIframe();
    const previewBody = previewIframe.locator('body');
    await expect(previewBody).toBeVisible();

    const result = await previewBody.evaluate(async () => {
      const w = window as any;
      const start = Date.now();
      while (!w.__STORYBOOK_PREVIEW__?.channel && Date.now() - start < 10000) {
        await new Promise((r) => setTimeout(r, 50));
      }
      const channel = w.__STORYBOOK_PREVIEW__?.channel;
      if (!channel) {
        return { ok: false, reason: 'no-channel' };
      }

      const resultPromise = new Promise<any>((resolve) => {
        const onResult = (payload: any) => {
          channel.off('storybook/a11y/result', onResult);
          resolve({ ok: true, payload });
        };
        channel.on('storybook/a11y/result', onResult);
        setTimeout(() => resolve({ ok: false, reason: 'timeout' }), 15000);
      });

      channel.emit('storybook/a11y/manual', 'example-button--primary', {
        config: {
          rules: [{ id: 'target-size', enabled: false }],
        },
        options: {
          runOnly: ['wcag2a'],
        },
        manual: true,
      });

      return resultPromise;
    });

    expect(result).toMatchObject({ ok: true });
 

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

Screenshots

2026-05-19T13-52-50.923Z/pr-36-a11yRunner-merges-di-9ca63--rules-into-runOnly-options-chromium/test-finished-1.png

2026-05-19T13-52-50.923Z/pr-36-a11yRunner-merges-di-9ca63--rules-into-runOnly-options-chromium/test-finished-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