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