--- 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/