360 green runs, and one test that would pass with the server down A developer gave an AI a Playwright + TypeScript test repository and ten test scenarios, producing 13 tests that passed 360 of 360 runs with retries disabled. Running the same UI tests against SauceDemo's deliberately buggy demo users exposed failures tied to each seeded bug, though one generated test would still pass with the server down, showing stability alone doesn't prove a test can fail. I gave an AI a Playwright + TypeScript repo and ten test scenarios. It wrote 13 tests. I ran every test in the repo 20 times with retries off: 360 runs, 360 passed. Then I read the tests. One of them would still pass if the server were down. This article covers: Everything is in a public repo: flakelab-dev/playwright-structure https://github.com/flakelab-dev/playwright-structure . The AI's raw output is committed before any fix, so you can check every claim here. Two public demo apps: SauceDemo https://www.saucedemo.com for UI and Restful Booker https://restful-booker.herokuapp.com/apidoc/index.html for API. config/environments.ts URLs per environment, picked with TEST ENV src/ pages/ Page objects: locators and actions, no business assertions api/ Typed API client + Zod schemas fixtures/ Wires pages, clients and auth together data/ Test data builders tests/ ui/ SauceDemo tests api/ Restful Booker tests playwright.config.ts Two projects, "ui" and "api"; retries off Four decisions matter most. 1. Fixtures do the setup. Tests only declare what they need. A test that asks for loggedInPage gets a browser that is already logged in: js test 'adding a product updates the cart badge', async { loggedInPage } = { await loggedInPage.addToCart 'Sauce Labs Backpack' ; await expect loggedInPage.cartBadge .toHaveText '1' ; } ; 2. The API client checks every response. Methods like createBooking validate the body with a Zod schema, and a failed call reports the URL, status and body: async function jsonOrThrow response: APIResponse : Promise