Tagged for #600 (Workbench shell rebuild).
`packages/workbench/tests/packed-release.e2e.test.ts` (pre-#629, line 341) asserted
```ts
page.getByRole('heading', { name: 'Skills' })
```
which is a Playwright strict-mode violation once the Skills page renders its `Source skills` tree heading — Playwright's `name` is a substring, case-insensitive match unless `exact: true`. It failed `Release gates` on #616 (run 33961556212) and passed on re-run, so it surfaced as a flake, not a defect.
#629 removed that page and that locator, so nothing is broken on `main` today. Filing so the rebuilt shell's acceptance tests don't reintroduce the pattern:
- `getByRole(..., { name, exact: true })` or a `data-testid` (`workbenchTestIds`) for headings whose text is a prefix/substring of another heading on the same page (`Skills` / `Source skills` / `Generated skills`, `MCP` / `MCP App`, …).
- `workbench-acceptance.ts` is the natural home for a shared `expectHeading(page, name)` that always passes `exact: true`.
Tagged for #600 (Workbench shell rebuild).
`packages/workbench/tests/packed-release.e2e.test.ts` (pre-#629, line 341) asserted
```ts
page.getByRole('heading', { name: 'Skills' })
```
which is a Playwright strict-mode violation once the Skills page renders its `Source skills` tree heading — Playwright's `name` is a substring, case-insensitive match unless `exact: true`. It failed `Release gates` on #616 (run 33961556212) and passed on re-run, so it surfaced as a flake, not a defect.
#629 removed that page and that locator, so nothing is broken on `main` today. Filing so the rebuilt shell's acceptance tests don't reintroduce the pattern: