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
Lucas Berger
43650bb65e
docs(06): add code review report
2026-06-10 16:35:09 -04:00
Lucas Berger
fa90b7cf86
docs(phase-06): finalize 06-04/05/06 summaries + tracking
...
- 06-04-SUMMARY: pulse keyframe checkpoint PASS (playwright-cli); CP-04.3 iOS device-only noted
- 06-05-SUMMARY: TDD RED/GREEN + dead-end guard follow-up fix; playwright-cli cold-load + 401 PASS
- 06-06-SUMMARY: end-tracking/recurrence-bound/series-prompt/all-day-pill; Schedule-X selector fix noted
- ROADMAP: mark 06-04/05/06 complete; phase 6 row updated to 6/6 Complete 2026-06-10
- STATE: phase 06 position/status updated; 3 new metric rows; 6 new decisions; phase-level UX fixes (AppNav/BottomTabBar) documented; residual device-only items added to Blockers
2026-06-10 16:30:01 -04:00