--- phase: 07-mobile-test-harness plan: 01 type: execute wave: 1 depends_on: [] files_modified: - apps/pwa/package.json - apps/pwa/playwright.config.ts - apps/pwa/vitest.config.ts - apps/pwa/tsconfig.json - package.json autonomous: true requirements: [TEST-01, TEST-02] user_setup: [] must_haves: truths: - "playwright test --list reports exactly two projects: iphone and pixel" - "Vitest does NOT pick up e2e/*.spec.ts files (no glob collision)" - "Both WebKit and Chromium browser engines are installed for @playwright/test" - "tsc --noEmit passes in apps/pwa with the new playwright.config.ts and e2e/ files in scope" artifacts: - path: "apps/pwa/playwright.config.ts" provides: "Two-project device matrix (iPhone/WebKit, Pixel/Chromium), serviceWorkers block, env baseURL, globalSetup ref, vite-only webServer, trace/artifact config" contains: "devices['iPhone 14']" - path: "apps/pwa/vitest.config.ts" provides: "exclude e2e/** so Vitest's default *.spec.ts glob does not collide with Playwright specs" contains: "exclude" - path: "apps/pwa/package.json" provides: "@playwright/test devDependency + test:e2e scripts" contains: "test:e2e" key_links: - from: "apps/pwa/playwright.config.ts" to: "apps/pwa/e2e/global-setup.ts" via: "globalSetup config option" pattern: "globalSetup.*global-setup" - from: "apps/pwa/playwright.config.ts" to: "PLAYWRIGHT_BASE_URL env" via: "use.baseURL env-driven" pattern: "PLAYWRIGHT_BASE_URL" --- Stand up the Playwright test-harness foundation in `apps/pwa`: add `@playwright/test` as a dev dependency, install the WebKit + Chromium browser engines, author `playwright.config.ts` with the two-profile device matrix (iPhone/WebKit + Pixel/Chromium), and isolate the new `e2e/*.spec.ts` glob from the existing Vitest `*.spec.ts` default glob. This is the blocking dependency for the seed plan and all spec plans. Purpose: Every downstream plan (global-setup, layout/calendar/lists specs) imports from `@playwright/test` and runs under this config. Nothing else in the phase can land until the config matrix, browser engines, and glob isolation exist. Output: `apps/pwa/playwright.config.ts`, the `@playwright/test` dev dep + installed browsers, `vitest.config.ts` exclude, package.json scripts, and `e2e/` brought into the `tsc --noEmit` gate. @$HOME/.claude/gsd-core/workflows/execute-plan.md @$HOME/.claude/gsd-core/templates/summary.md @.planning/PROJECT.md @.planning/ROADMAP.md @.planning/STATE.md @.planning/phases/07-mobile-test-harness/07-CONTEXT.md @.planning/phases/07-mobile-test-harness/07-RESEARCH.md @.planning/phases/07-mobile-test-harness/07-PATTERNS.md @.planning/phases/07-mobile-test-harness/07-VALIDATION.md Task 1: Install @playwright/test + browser engines, wire package.json scripts apps/pwa/package.json, package.json - apps/pwa/package.json — current scripts block (`dev`, `build`, `preview`, `typecheck`, `test`) and devDependencies; mirror naming - package.json (root) — workspace script convention: `pnpm --filter @familysync/