microsoft/playwright
14 rules learned from 2,000 merged PRs: the files and habits in microsoft/playwright that kept needing a fix after merge.
- Merged PRs read
- 2,000
- Needed a fix
- 182 (9.2%)
- Reverted
- 53
- Merged between
- 2026-03-26 and 2026-11-11
Tested on PRs the rules had never seen
17 of the 67 code PRs that breached a rule needed a fix (25%), against 13 of the 114 that breached none (11%).
Rules were learned from older PRs, then tested on later PRs they hadn't seen. How we tested
| PR | Title and the rule it breached | What happened |
|---|---|---|
| fix(zip): reject on malformed archives instead of crashingFragile area: packages/utils/ (12 of 18 earlier PRs needed a fix) | fixed in #43725, 3 days later | |
| fix(aria): honor reflected label referencesFragile area: packages/injected/ (13 of 25 earlier PRs needed a fix) | fixed in #43722, 3 days later | |
| fix(clock): format an explicit timestamp of 0 as the epoch in Intl.DateTimeFormatFragile area: packages/injected/ (13 of 25 earlier PRs needed a fix) | fixed in #43523, 4 days later |
Fix-prone files and folders
PRs that touched these paths needed a follow-up fix more often than the 23% repo average. Counts are PRs that touched the path.
- Hotspot: packages/playwright-core/src/client/channels.d.ts
19 of 28 earlier PRs that changed this needed a fix.
9 clean, 19 fixed (68%) - Hotspot: packages/playwright-core/src/tools/dashboard/dashboardApp.ts
14 of 21 earlier PRs that changed this needed a fix.
7 clean, 14 fixed (67%) - Hotspot: packages/playwright-core/src/server/channels.d.ts
18 of 27 earlier PRs that changed this needed a fix.
9 clean, 18 fixed (67%) - Hotspot: packages/playwright-core/src/tools/mcp/extensionContextFactory.ts
7 of 11 earlier PRs that changed this needed a fix.
4 clean, 7 fixed (64%) - Hotspot: packages/playwright-core/src/server/browserContext.ts
15 of 24 earlier PRs that changed this needed a fix.
9 clean, 15 fixed (63%) - Hotspot: packages/protocol/src/validator.ts
18 of 29 earlier PRs that changed this needed a fix.
11 clean, 18 fixed (62%) - Fragile area: packages/protocol/
31 of 54 earlier PRs that changed this needed a fix.
23 clean, 31 fixed (57%) - Fragile area: packages/dashboard/
10 of 18 earlier PRs that changed this needed a fix.
8 clean, 10 fixed (56%) - Hotspot: packages/playwright-core/src/tools/cli-client/program.ts
10 of 19 earlier PRs that changed this needed a fix.
9 clean, 10 fixed (53%) - Fragile area: utils/generate_types/
22 of 42 earlier PRs that changed this needed a fix.
20 clean, 22 fixed (52%) - Fragile area: packages/utils/
14 of 27 earlier PRs that changed this needed a fix.
13 clean, 14 fixed (52%) - Hotspot: packages/playwright-client/types/types.d.ts
36 of 72 earlier PRs that changed this needed a fix.
36 clean, 36 fixed (50%) - Fragile area: packages/html-reporter/
6 of 12 earlier PRs that changed this needed a fix.
6 clean, 6 fixed (50%) - Fragile area: packages/trace-viewer/
9 of 18 earlier PRs that changed this needed a fix.
9 clean, 9 fixed (50%)
Conventions
Habits most PRs here follow, where PRs that broke them needed a fix more often. Counts on each bar are the PRs that broke it.
No habit here made the list.
Recent PRs that needed a fix
Rules flagged 75 recent PRs, and 21 of those needed a fix (28%), against 14% of all recent PRs. These are the 15 with the strongest rule that needed a fix, with the PR that fixed each.
| PR | Title | Size | Rule it breached | What happened |
|---|---|---|---|---|
| feat(webmcp): add page.webmcp API | +2,531 -135 | touches packages/playwright-core/src/client/channels.d.ts9 clean, 19 fixed | reverted | |
| chore(webmcp): remove enable/disable and toolsChanged event | +137 -1,562 | touches packages/playwright-core/src/client/channels.d.ts9 clean, 19 fixed | fixed in #43121, 3 days later | |
| feat(locator): add a context-wide visibility default | +1,069 -97 | touches packages/playwright-core/src/client/channels.d.ts9 clean, 19 fixed | reverted | |
| feat(evaluate): add "world" option to evaluate methods | +538 -203 | touches packages/playwright-core/src/client/channels.d.ts9 clean, 19 fixed | reverted | |
| feat(api): add APIRequestContext.cookies and clearCookies | +546 -75 | touches packages/playwright-core/src/client/channels.d.ts9 clean, 19 fixed | fixed in #43074, 1 day later | |
| feat(evaluate): opt in to Map and Set serialization | +411 -131 | touches packages/playwright-core/src/client/channels.d.ts9 clean, 19 fixed | reverted | |
| feat(tracing): allow configuring the screenshots size | +237 -12 | touches packages/playwright-core/src/client/channels.d.ts9 clean, 19 fixed | reverted | |
| feat(webauthn): add signCount to virtual credentials | +201 -37 | touches packages/playwright-core/src/client/channels.d.ts9 clean, 19 fixed | fixed in #43132, 4 days later | |
| fix(client-certificates): reestablish a way to explicitly send no client certificate for an origin | +199 -25 | touches packages/playwright-core/src/client/channels.d.ts9 clean, 19 fixed | reverted | |
| chore(recorder): move fill coalescing back to collapseActions | +56 -13 | touches packages/playwright-core/src/client/channels.d.ts9 clean, 19 fixed | fixed in #42627, 11 days later | |
| feat(extension): allow disabling controlled tab groups | +110 -29 | touches packages/playwright-core/src/tools/mcp/extensionContextFactory.ts4 clean, 7 fixed | fixed in #43970, 6 days later | |
| fix: do not send proxy credentials to website auth challenges | +62 -28 | touches packages/playwright-core/src/server/browserContext.ts9 clean, 15 fixed | reverted | |
| Revert "fix: do not send proxy credentials to website auth challenges (#43342)" | +28 -62 | touches packages/playwright-core/src/server/browserContext.ts9 clean, 15 fixed | fixed in #43482, 2 days later | |
| fix(client-certificates): respect launch proxy and proxy.bypass | +41 -9 | touches packages/playwright-core/src/server/browserContext.ts9 clean, 15 fixed | fixed in #42909, 1 day later | |
| feat(reporter): introduce TestStep.subtitle, unify step formatting | +712 -475 | touches packages/protocol/23 clean, 31 fixed | fixed in #42515, 6 days later |
Get this for your own repo
Precall reads your repo's history the same way and comments on new PRs that touch the spots that kept breaking.