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