Commit Graph
909 Commits
Author SHA1 Message Date
Lucas BergerandClaude Opus 4.8 4cd7931c3c fix(07-03): make e2e typecheck pass — add DOM lib to tsconfig.e2e, cast styleHandle el to Element
Playwright transpiles specs without typechecking (esbuild), so layout.spec.ts ran
green while `tsc -p tsconfig.e2e.json` failed: page.evaluate(() => document...)
callbacks need the DOM lib, and styleHandle.evaluate((el) => el.remove()) typed el as
Node (no .remove()). Phase 8 CI runs the typecheck gate, so this would have broken CI.
Adds DOM/DOM.Iterable to the e2e tsconfig (also covers 07-04 specs) and casts el to Element.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 02:06:15 -04:00
Lucas Berger f8227855dc docs(07-03): complete layout.spec.ts plan 2026-06-11 02:02:54 -04:00
Lucas Berger 52e14a88db feat(07-03): layout.spec.ts — UI-SPEC Rules 1-4 + harness self-validation
- Rule 1: boundingBox assertions for BottomTabBar Calendar/Lists tabs (≥44px),
  PhoneNav settings button (≥44px), New Event FAB (≥56px) on both profiles
- Rule 2: scrollWidth ≤ clientWidth on /calendar and /lists
- Rule 3: BottomTabBar in-viewport (bottom edge ≤ viewport height), PhoneNav visible
- Rule 4: navigation landmark locatable by role+name (getByRole with accessible name)
- Self-validation: addStyleTag injection proves Rule 1 tracks geometry (20px height <44),
  proves Rule 2 detects overflow (2000px body width); both recover after removal
- Runs on iphone (WebKit/390px) and pixel (Chromium/412px) profiles; 30 tests pass
2026-06-11 02:00:46 -04:00
Lucas Berger d3c6726301 fix(07-02): MariaDB TIMESTAMP format in global-setup seed
- Replace ISO 8601 'T' separator with space in dtstart_utc value
- MariaDB TIMESTAMP requires 'YYYY-MM-DD HH:MM:SS', not 'YYYY-MM-DDTHH:MM:SSZ'
- Was causing 'Incorrect datetime value' error blocking all e2e harness runs
2026-06-11 02:00:38 -04:00
Lucas Berger 8f0846c8c6 docs(07-02): complete globalSetup seed plan 2026-06-11 01:53:07 -04:00
Lucas Berger 535ba11cda docs(07-02): add e2e/README.md — run instructions and security guardrails
- Documents pnpm test:e2e run commands and single-profile / headed variants
- Documents DEV_AUTH_BYPASS=true must be set before API starts (Pitfall 5)
- States production compose MUST NOT set DEV_AUTH_BYPASS (Elevation of Privilege)
- Lists PLAYWRIGHT_BASE_URL and DB_* env vars (all credentials env-only, never hardcoded)
- States no storageState file is used (D-01 — no expiring session cookie)
- Describes globalSetup readiness gate + seed anchors (Milk/Eggs/Seeded Test Event)
- Notes Phase 8 CI scope and --with-deps WebKit requirement
2026-06-11 01:50:58 -04:00
Lucas Berger 53498e3408 feat(07-02): implement globalSetup — /health readiness gate + deterministic DB seed
- Poll baseURL/health with 60s timeout; throw on expiry (D-08 readiness gate)
- TRUNCATE list_items, list_shares, lists, calendar_events (FK checks toggled)
- INSERT IGNORE calendars guard for id=10 (Pitfall 4 CI resilience)
- Seed one timed calendar_event on calendar_id=10 (uid: e2e-seed-event-001)
- Seed E2E Grocery List (owner_id=1, is_shared=true) + list_shares + Milk/Eggs items
- Add mysql2@3.22.4 devDependency to apps/pwa (needed for global-setup types)
- No @playwright/test imports — plain Node.js only (Pitfall 2)
2026-06-11 01:50:10 -04:00
Lucas Berger e7fdf798dd docs(07-01): complete playwright harness foundation plan 2026-06-11 01:45:45 -04:00
Lucas Berger 4536987915 chore(07-01): isolate vitest glob from e2e, add tsconfig.e2e.json typecheck gate
- Add exclude: ['e2e/**', 'node_modules/**'] to vitest.config.ts test block
  to prevent Playwright specs from being picked up by Vitest jsdom runner
- Add tsconfig.e2e.json extending main tsconfig with node types for
  playwright.config.ts and e2e/**/* typecheck coverage
- Add @types/node to pwa devDependencies (required by playwright.config.ts)
- Update typecheck script to run both src and e2e tsc passes
- 191 unit tests still pass; no e2e import errors in vitest run
2026-06-11 01:43:26 -04:00
Lucas Berger 44fea2c5e2 feat(07-01): add playwright.config.ts with two-profile device matrix
- Two projects: iphone/WebKit (iPhone 14) + pixel/Chromium (Pixel 7)
- serviceWorkers: 'block' on both profiles per D-02/Pitfall 15
- env-driven baseURL via PLAYWRIGHT_BASE_URL (D-08/Rule 8)
- globalSetup ref to e2e/global-setup.ts (Plan 02 implements)
- webServer manages vite only with reuseExistingServer (D-10)
- no storageState, no toHaveScreenshot per D-01/UI-SPEC Rule 6
- add e2e/global-setup.ts placeholder (stub) so config path resolves
2026-06-11 01:41:44 -04:00
Lucas Berger 0c24f77bdb chore(07-01): install @playwright/test@1.60.0, add test:e2e scripts
- Add @playwright/test@1.60.0 to apps/pwa devDependencies (pinned, not floated)
- Install WebKit and Chromium browser engines via playwright install
- Add test:e2e, test:e2e:ui, test:e2e:headed scripts to apps/pwa/package.json
- Add root workspace test:e2e delegate script to package.json
2026-06-11 01:40:30 -04:00
Lucas Berger 32deab91fd docs(07): create phase plan 2026-06-10 22:43:26 -04:00
Lucas Berger ed206c3732 docs(07): create mobile-test-harness phase plan (4 plans, 3 waves) 2026-06-10 22:39:08 -04:00
Lucas Berger 7a089421dd docs(07): add validation strategy 2026-06-10 22:24:52 -04:00
Lucas Berger ad927e04d2 docs(07): research phase — Playwright mobile harness assertion strategy and config patterns 2026-06-10 22:23:13 -04:00
Lucas Berger 3cee2b394d docs(state): record phase 7 UI-SPEC approval 2026-06-10 22:12:27 -04:00
Lucas Berger 179766d447 docs(07): mobile UI quality-bar contract (UI-SPEC)
Adds 07-UI-SPEC.md for Phase 7 (Mobile Test Harness). Documents the
assertable mobile-UI quality bar the harness enforces: touch-target
thresholds (≥44px), no-horizontal-overflow rule, two-profile viewport
matrix (iPhone 14/WebKit + Pixel 7/Chromium), role-based accessible name
requirements, empty/error-state copy anchors, screenshot omission rationale,
and CI portability rules. Locks D-01 through D-10 from CONTEXT.md as the
assertion contract.
2026-06-10 22:11:18 -04:00
Lucas Berger c4b2f55ccf docs(state): record phase 7 context session 2026-06-10 21:49:33 -04:00
Lucas Berger 2477741337 docs(07): capture phase context 2026-06-10 21:49:28 -04:00
Lucas Berger 16d031629e docs: tag 1 pending todo with resolves_phase after milestone v1.1 roadmap 2026-06-10 21:34:42 -04:00
Lucas Berger ab02cdb1ba docs: create milestone v1.1 roadmap (6 phases) 2026-06-10 21:34:42 -04:00
Lucas Berger a31636e718 docs: v1.1 research (stack/features/architecture/pitfalls/summary) 2026-06-10 21:34:42 -04:00
Lucas Berger 9bd0f536fd docs: define milestone v1.1 requirements 2026-06-10 21:34:42 -04:00
luckberg a373df15ab Delete README 2026-06-10 20:45:24 -04:00
Lucas Berger 3696a85afc chore(graphify): rebuild knowledge graph artifacts 2026-06-10 18:52:20 -04:00
Lucas Berger 361bd8f800 chore: phase branching + graphify auto_update; ignore graph build-status and tmp scratch 2026-06-10 18:52:19 -04:00
Lucas Berger 3ed7fc8da8 docs: start milestone v1.1 Operability & Polish 2026-06-10 18:52:19 -04:00
Lucas Berger a9c3304c4e docs: generate project documentation 2026-06-10 18:17:51 -04:00
Lucas Berger 581b31916b chore: archive phase directories from completed milestones 2026-06-10 17:56:40 -04:00
luckberg b2dacf9940 Merge pull request 'chore: archive v1.0 milestone' (#2) from gsd/v1.0-milestone-archive into main 2026-06-10 17:50:55 -04:00
Lucas Berger 53b916601f chore: remove REQUIREMENTS.md for v1.0 milestone 2026-06-10 17:47:21 -04:00
Lucas Berger 1f361a9473 chore: archive v1.0 milestone files 2026-06-10 17:47:15 -04:00
luckberg 083ffcfe4e Merge pull request 'Milestone v1.0: FamilySync MVP' (#1) from gsd/v1.0-milestone into main
Reviewed-on: #1
v1.0
2026-06-10 17:39:18 -04:00
Lucas Berger 88728426f8 docs: ship v1.0 milestone -- Gitea PR #1 2026-06-10 17:23:49 -04:00
Lucas Berger 756e2b86ad docs(06): add phase verification report, patterns map, and iter2 review/fix 2026-06-10 17:22:34 -04:00
Lucas Berger e805585770 docs(06): refresh code review report to clean after auto-fix 2026-06-10 17:00:52 -04:00
Lucas Berger 52927851da docs(06): add code review fix report 2026-06-10 17:00:32 -04:00
Lucas Berger 7ac4c29ea9 fix(06): IN-06 fold long DESCRIPTION line per RFC 5545 in weekly-count3 fixture 2026-06-10 16:56:06 -04:00
Lucas Berger 1ab9710066 fix(06): IN-05 extract duplicated dialog focus-trap into shared useFocusTrap hook 2026-06-10 16:55:30 -04:00
Lucas Berger a570135a8d fix(06): IN-02 document resolveDefaultView is an SSR guard, not breakpoint logic 2026-06-10 16:54:12 -04:00
Lucas Berger 8b79d499f6 fix(06): IN-01 correct stale CalendarOccurrence.id comment to ev-<uid>-<epochMs> form 2026-06-10 16:53:52 -04:00
Lucas Berger d4a0ed7bf3 fix(06): WR-08 require well-formed timed shape before new Date() in parseDateTime 2026-06-10 16:53:38 -04:00
Lucas Berger 0511a23886 fix(06): WR-06 bound post-write targeted resync with 10s timeout so a hang cannot wedge drain 2026-06-10 16:53:13 -04:00
Lucas Berger 9f88068d77 fix(06): WR-05 also match SessionExpiredError by name across module-graph boundaries 2026-06-10 16:52:47 -04:00
Lucas Berger 746c3c70d7 fix(06): WR-04 use local-date helper in calendarStore instead of UTC toISOString slice 2026-06-10 16:52:33 -04:00
Lucas Berger ac0f8d282b fix(06): WR-03 sanitize recurrenceCount input and require finite integer >= 1 2026-06-10 16:51:59 -04:00
Lucas Berger 5724fe85d2 fix(06): WR-02/WR-07 require end date for bound=until and guard non-empty startDate compare 2026-06-10 16:51:41 -04:00
Lucas Berger eb00ec7dfb fix(06): WR-01 gate all-day SQL branch on hasRrule=0 to stop duplicate occurrences 2026-06-10 16:51:19 -04:00
Lucas Berger d101aa899d fix(06): CR-01 validate recurrenceUntil as YYYY-MM-DD to close RRULE injection 2026-06-10 16:51:06 -04:00
Lucas Berger 924d8e2347 test(06): persist residual iOS device-only items as UAT 2026-06-10 16:42:52 -04:00