

Also from Kynth Studios


Also from Kynth Studios


Also from Kynth Studios
12345# Studio E2E Test Review Rules67All comments are **advisory**.89## Selector Priority (best to worst)10111. **`getByRole` with accessible name** — most robust, tests accessibility1213```typescript14 page.getByRole('button', { name: 'Save' })15```16172. **`getByTestId`** — stable, explicit test hooks1819```typescript20 page.getByTestId('table-editor-side-panel')21```22233. **`getByText` with exact match** — good for unique text2425```typescript26 page.getByText('Data API access', { exact: true })27```28294. **`locator` with CSS** — use sparingly, more fragile30```typescript31 page.locator('[data-state="open"]')32```3334## Patterns to Flag3536- **XPath selectors** — fragile to DOM changes3738```typescript39 // BAD40 locator('xpath=ancestor::div[contains(@class, "space-y")]')41```4243- **Parent traversal with `locator('..')`** — breaks when structure changes4445```typescript46 // BAD47 element.locator('..').getByRole('button')48```4950- **`waitForTimeout`** — never use; wait for something specific instead5152```typescript53 // BAD54 await page.waitForTimeout(1000)5556 // GOOD — wait for UI element57 await expect(page.getByText('Success')).toBeVisible()5859 // GOOD — wait for API response60 const apiPromise = waitForApiResponse(page, 'pg-meta', ref, 'query?key=table-create')61 await saveButton.click()62 await apiPromise63```6465- **`force: true` on clicks** — make elements visible first instead6667```typescript68 // BAD69 await menuButton.click({ force: true })7071 // GOOD — hover to reveal, then click72 await tableRow.hover()73 await expect(menuButton).toBeVisible()74 await menuButton.click()75```7677- **Broad `filter({ hasText })` on generic elements** — may match multiple elements; scope to specific containers instead7879## Good Practices to Encourage8081- Scope selectors to containers: `page.getByTestId('side-panel').getByRole('switch')`82- Add `aria-label` to icon-only buttons in source code for better test selectors83- Use `test.describe.configure({ mode: 'serial' })` for tests sharing database state84- Add messages to expects: `await expect(locator, 'why').toBeVisible({ timeout: 30000 })`8586Canonical standard: `.claude/skills/studio-e2e-tests/SKILL.md`87
One repository carrying more than one format is the comparison this product exists for: does anyone actually write different content in each file, or is one a copy of the other?
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| supabase/supabase.github/instructions/studio-composition-patterns.instructions.md · 108k | Copilot instructions | stylegitapiui+1 | 61/100 | 14 days ago | |
| supabase/supabase.github/instructions/studio-copy.instructions.md · 108k | Copilot instructions | uiagent-behaviourdocs | 25/100 | 14 days ago | |
| supabase/supabase.github/instructions/studio-error-handling.instructions.md · 108k | Copilot instructions | gitdo-not | 57/100 | 14 days ago | |
| supabase/supabase.github/instructions/studio-shadcn-components.instructions.md · 108k | Copilot instructions | gituido-not | 55/100 | 14 days ago | |
| supabase/supabase.github/instructions/studio-shortcuts.instructions.md · 108k | Copilot instructions | stylegitdo-not | 61/100 | 14 days ago | |
| supabase/supabase.github/instructions/studio-telemetry.instructions.md · 108k | Copilot instructions | stylegitdo-notdocs | 65/100 | 14 days ago | |
| supabase/supabase.github/instructions/studio-testing.instructions.md · 108k | Copilot instructions | testtypestesting-strategygit+1 | 55/100 | 14 days ago | |
| supabase/supabaseapps/studio/CLAUDE.md · 108k | CLAUDE.md | testlint-formatstyletesting-strategy+1 | 81/100 | 14 days ago | |
| supabase/supabase.claude/CLAUDE.md · 108k | CLAUDE.md | testlint-formatstylearch+1 | 97/100 | 14 days ago | |
| supabase/supabase.claude/skills/vercel-composition-patterns/AGENTS.md · 108k | AGENTS.md | styleapiuido-not | 45/100 | 14 days ago | |
| supabase/supabase.github/copilot-instructions.md · 108k | Copilot instructions | lint-formatstylegitagent-behaviour | 56/100 | 14 days ago |
Same format, overlapping stack, ranked by quality.
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| louislam/uptime-kuma.github/copilot-instructions.md · 90k | Copilot instructions | setupbuildtestlint-format+9 | 100/100 | 14 days ago | |
| chihebnabil/lovable-boilerplate.github/instructions/global.instructions.md · 63 | Copilot instructions | buildlint-formatstylearch+4 | 100/100 | 14 days ago | |
| HerringtonDarkholme/megarepo.github/copilot-instructions.md · 17 | Copilot instructions | setupbuildtestlint-format+7 | 100/100 | 14 days ago | |
| bagisto/bagisto.github/copilot-instructions.md · 28k | Copilot instructions | setupbuildteststyle+5 | 97/100 | 14 days ago | |
| JCodesMore/ai-website-cloner-template.github/copilot-instructions.md · 31k | Copilot instructions | buildlint-formatstylearch+3 | 97/100 | 7 days ago | |
| thangaram611/second-brain.github/copilot-instructions.md · 0 | Copilot instructions | setupteststylearch+4 | 96/100 | 14 days ago | |
| nerolis-lab/nerolis-lab.github/copilot-instructions.md · 32 | Copilot instructions | setupbuildtestlint-format+11 | 96/100 | 14 days ago | |
| darkmatter/nixmac.github/copilot-instructions.md · 25 | Copilot instructions | setupbuildtestlint-format+8 | 96/100 | 14 days ago |
A badge carrying the measured quality of the strongest agent config file in this repository, out of 100. It reads from this index every time somebody loads your page, so it changes when the measurement changes and there is nothing to keep up to date. Free, no account, and the value is not something you or we can set by hand.
[](https://rulestack.kynth.studio/configs/supabase-supabase-github-instructions-studio-e2e-tests-instructions)Would rather not hotlink us? Every badge is also served in shields.io’s endpoint schema, so shields renders the image and your readers never talk to our domain:
Published by Toolproof, the masthead over this index and eight others. The method behind the number is at toolproof.kynth.studio/methodology, and the whole thing is readable as JSON with no key at /api.