Repository navigation
chore(testing): remove the one-off browser-tools benchmark - #6525
Conversation
…vs playwright-cli Fixture server with 20 hostile-UI fixtures and 12 agent task pages, tool-neutral graders with plain-CDP reference solutions, a scripted L1 runner for both CLIs, an L2 trial harness with per-run tool isolation and a transcript parser, and a clean local runner on claude -p --bare. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
…ot its name Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
Hide the fixture state readout and the hydration readiness line from agents, shorten per-run session ids for agent-browser's socket path limit, accept the coupon defect's visible symptom in the T04 grader, and drop an F19 step that waited on hidden text. Records the 25-trial pilot results. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
The maintainer comments in each fixture describe its trap, and an agent that read the page source got the answer (T09's even named the injection test). Results gathered while they were served move to a superseded file and are not scored; the full run restarts on fresh trials. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
aggregate.mjs turns a dated results directory into summary.json and summary.md under the pre-registered win rule. The README documents the layers, rubric, grading and how to re-run the suite. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
…1.22 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
Partial results committed early so a container restart cannot lose them. The run continues; this file is replaced when it completes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
All 125 L2 trials are in (120 default-arm, 5 content-boundaries arm), every one passed, so the pre-registered rule names no reliability winner and the routing rows stay. The Alternatives entry records the secondary differences and links the suite. Results now carry a <scratch> placeholder instead of container paths. Adds the testing plugin's changelog fragment. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
…10-07 Records what the numbers do not show, each with the trials behind it, and scores the judged rubric rows. The scripted-layer row fills in when that run completes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
…files The aggregator's log line used an em dash, and the pilot and superseded result files still carried this container's scratch paths; both now use the same <scratch> placeholder as the scored results. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
312 scripted runs (26 fixture variants, 2 delays, 3 repeats): both tools pass 138 of 156 on different fixtures, no row flaky; agent-browser is about 3.5x faster per fixture. summary.md and summary.json now cover both layers, FINDINGS.md gains the scripted-layer section, and the aggregator prints readable L1 failure rows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
Runs each vendored skill's own update script in its read-only check mode every Monday and on dispatch, and fails the run when one reports upstream drift, so GitHub's failed-workflow notification reaches the maintainers with no Claude routine or account involved. Informational: outside ci-status, read-only token, no secrets, opens nothing. The scripts disagree on exit codes, so each matrix row states how its script signals drift; a CLI missing from the runner never counts. A local run of every row today flags firecrawl, playbooks boris and skill-authoring, and context7, and passes playwright and dometrain. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
…dd reference contents Audit of /playwright:playwright against the skill-authoring guidance and the repo's own rules. The skill gate now passes with no warnings. - Gotchas observed in the 2026-10-07 browser-tools benchmark: fill does not blur, refs are refused after a re-render, clicks can land before hydration, short toasts outrun per-command startup, uncaught exceptions show in console, and Linux containers lack the chrome channel. - Sessions close by name: kill-all and close-all reach every playwright-cli browser on the machine, so they stop being routine setup. - SKILL.md points at upstream defaults with an as-of date and recheck trigger instead of restating them; adds a Next section. - Contents lists on the six reference files over 100 lines, plus snapshot --boxes and generate-locator from upstream 0.1.22. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
… 0056 issue reference The README states why the plugin keeps wrapping Microsoft's skill: the upstream 0.1.22 skill's gaps against the skill-authoring guidance, as of 2026-10-07, with the recheck trigger, as issue 6448 asks for Playwright. ADR 0056's agent-browser entry no longer says issue 6475 tracks agent-browser; that issue probes playwright-cli's own attach --extension. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
…es gate run-bare.sh drives the browser-tools benchmark with `claude -p`. It is a maintainer harness, not something the plugin runs on a user's machine, so the call carries the convention's inline prereq-ok exemption instead of a plugin-wide prerequisite declaration. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
The uncaught-exceptions and Linux chrome-channel gotchas sat on one line, so they rendered as a single garbled bullet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
- Void a trial that invokes the compared CLI it was not assigned: parseTranscript takes the trial's tool and flags calls to the other one. Re-parsing all 125 graded trials voids none, so the results stand. - Look a bare CLI name up on PATH before following its symlink; readlink -f alone resolved it against the working directory, so run-bare.sh could not find the shipped skill without *_BIN set. - Point the README's ADR 0056 link at the file's real name. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
The unassigned-CLI check matched only a segment starting with the other CLI, a /<cli> path, or npx. Env-var prefixes, wrappers (env, command, exec, which), subshells and $(...) slipped past. It now matches the CLI name as a whole word wherever a command or path tail can sit. Re-parsing the 125 graded trials still voids none. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
- exec-bit: aggregate.mjs and fixtures/server.mjs carry a shebang, so they are now executable. - editorconfig: l1.json ends with a newline, and run-l1.mjs writes one. - typos: the fixtures' `sav` answer-code prefix and a `quantit` regex carry the inline spellchecker:disable-line directive; one British spelling is corrected. Benchmark results are recorded run output, so the Spell-check step excludes plugins/testing/benchmarks/*/results/**, next to the vendor and judge-calibration exclusions. Touching that workflow puts two existing comment misspellings in scope, now fixed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
The whole-word match also fired on mentions of the other CLI in echo text, grep patterns and comments. commandWords() now drops quoted text (keeping a double-quoted command substitution) and comments, splits the string into simple commands (including subshells and $(...)), skips VAR=value prefixes and wrappers that run their argument (env, command, exec, npx, which, sudo, time, nohup), and compares the basename of the command word. 26 cases pass; re-parsing the 125 graded trials voids none. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
… CLI commandWords() dropped every quoted string, so "agent-browser" status slipped past. A quoted single word is now unquoted in place, and quoted text with whitespace becomes a placeholder word, so a quoted mention in an argument (echo "agent-browser", grep -v "agent-browser") stays clean. 31 cases pass; re-parsing the 125 graded trials voids none. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
Quote stripping ran before comment stripping, so a quoted CSS id such as '#x' was unquoted to #x and then read as a comment, deleting a chained call to the other CLI. Quotes and comments are now matched in one left-to-right pass, and a quoted string is unquoted only when it is a plain word, so 'x;agent-browser' cannot become a command split. The case table moves into lib/transcript.test.mjs (38 cases), which the affected-tests selector now maps transcript.mjs to. Re-parsing the 125 graded trials still voids none. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
commandWords() skipped a wrapper's flags one token at a time, so a flag's separate value (env -C /tmp, sudo -u root) was read as the command and the unassigned CLI behind it was missed. After a wrapper, the command is now the first later word naming a compared CLI, else the first non-flag word. 44 cases pass; re-parsing the 125 graded trials voids none. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
plan-test-lanes refused transcript.test.mjs because no lane runs a bare Node suite: run-plugin-tests.sh discovers only *.test.sh. The wrapper follows the fingerprint.test.sh pattern: find node, run the suite, forward its exit status. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
…ention Scanning every word after a wrapper for a compared CLI voided trials like `time grep -l agent-browser *.log`, where grep is the command. commandWords() now skips a wrapper chain one flag at a time and lets a flag listed in VALUE_FLAGS (env -u/-C/-S, sudo -u/-g/-D..., time -f/-o, exec -a, npx -p/-c) consume its value, so the command word is resolved as Bash runs it. 50 cases pass; re-parsing the 125 graded trials voids none. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
The benchmark lived inside the shipped testing plugin, so every install carried a fixture server, CDP drivers and raw run logs no user runs. Its verdict is already recorded where it is used: ADR 0056 (Alternatives considered) and the playwright README and Gotchas. - Delete plugins/testing/benchmarks/ and its unreleased changelog fragment, so testing ships unchanged from 0.23.0. - Drop the Spell-check exclusion that only covered its results. - ADR 0056 and the playwright Gotchas evidence line now point at the recorded result instead of the deleted files; playwright 0.10.1. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
…t-1adkab # Conflicts: # plugins/playwright/CHANGELOG.md
The removal touches plugins/testing/, so the fragment gate needs a fragment; bump: none records that testing ships unchanged from 0.23.0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
Claude finished @kyle-sexton's task in 44s —— View job Security review (
|
|
Claude finished @kyle-sexton's task in 2m 9s —— View job Code review (
|
|
claude-security-review has reviewed this pull request through b71e063; a later push is reviewed from there. |
|
claude-review has reviewed this pull request through b71e063; a later push is reviewed from there. |
|
| GitGuardian id | GitGuardian status | Secret | Commit | Filename | |
|---|---|---|---|---|---|
| 37941187 | Triggered | Username Password | 6428664 | plugins/testing/benchmarks/browser-tools/lib/cases.mjs | View secret |
🛠 Guidelines to remediate hardcoded secrets
- Understand the implications of revoking this secret by investigating where it is used in your code.
- Replace and store your secret safely. Learn here the best practices.
- Revoke and rotate this secret.
- If possible, rewrite git history. Rewriting git history is not a trivial act. You might completely break other contributing developers' workflow and you risk accidentally deleting legitimate data.
To avoid such incidents in the future consider
- following these best practices for managing and storing secrets including API keys and other credentials
- install secret detection on pre-commit to catch secret before it leaves your machine and ease remediation.
🦉 GitGuardian detects secrets in your source code to help developers and security teams secure the modern development process. You are seeing this because you or someone else with access to this repository has authorized GitGuardian to scan your pull request.
No related issue: repository cleanup the owner asked for after #6477 merged.
Summary
#6477 added a browser-CLI benchmark under
plugins/testing/benchmarks/browser-tools/. That directory sits inside the shippedtestingplugin, so every install would carry a fixture server, CDP drivers, and raw run logs that no user runs. The benchmark was a one-off. Its verdict, playwright-cli stays the default and agent-browser is not adopted, is already recorded where it is used: ADR 0056 under Alternatives considered, plus the playwright README and## Gotchas. This PR removes the benchmark and the clutter that came with it.Fix
plugins/testing/benchmarks/(52 files) and its unreleased changelog fragment.bump: nonefragment fortesting. It records that the plugin ships unchanged from 0.23.0, so the release bot deletes it and releases nothing..github/workflows/pr-require-checks.yml: drop the Spell-check exclusion that only covered the benchmark's results folder./playwright:playwright: the Gotchas evidence line cites ADR 0056 instead of the deletedFINDINGS.md. The plugin goes to 0.10.2, on top of the 0.10.1 docs-link release that landed onmainmeanwhile, with a CHANGELOG entry.Verification
git grep benchmarks/browser-toolsreturns nothing.mainall pass:--check,--check-required)--check-bump,--check-order,--check-preserved)plan-test-lanes(0 unmapped)Related
🤖 Generated with Claude Code
https://claude.ai/code/session_01Py2vMPypYELv5S61e1sCyK