Commit Graph
629 Commits
Author SHA1 Message Date
Lucas Berger e8a9ce4ea9 docs(state): record phase 8 context session 2026-06-11 08:50:02 -04:00
Lucas Berger c3cee0baae docs(08): capture phase context 2026-06-11 08:50:02 -04:00
Lucas Berger 4303a1b680 docs(07): code-review --fix complete — 5 warnings fixed, re-review status clean 2026-06-11 08:00:55 -04:00
Lucas Berger 9c38dd33ff fix(07): WR-02 explicit readiness flag + WR-01 /api/me dev-bypass gate in global-setup 2026-06-11 07:51:51 -04:00
Lucas Berger 5322cfc2b0 fix(07): WR-06 correct misleading 'remove by reload' comments to describe evaluate(remove) 2026-06-11 07:51:45 -04:00
Lucas Berger 2b745adb29 fix(07): WR-05 drop redundant unroute calls (per-test context isolation handles cleanup) 2026-06-11 07:51:41 -04:00
Lucas Berger c564fc67a1 fix(07): WR-07 prove SW block via getRegistration, skip when SW unavailable 2026-06-11 07:51:34 -04:00
Lucas Berger 789e87a360 docs(07): mark deep-review blockers BL-01/BL-02 resolved (53c3ca5); verification addendum 2026-06-11 07:39:58 -04:00
Lucas BergerandClaude Opus 4.8 53c3ca56b8 fix(07-04): make calendar populated-state test non-vacuous (BL-01) + deterministic seed window (BL-02)
Deep review found the calendar 'populated state' assertions were vacuous:
- getByText('Nothing here').toHaveCount(0) targeted CalendarShell's EmptyState,
  which CalendarShell NEVER renders (success branch always mounts ScheduleXCalendar;
  EmptyState.tsx is dead code, imported by nothing). The check was permanently green
  regardless of the seed — a regression dropping all events would have shipped green.
- .sx-react-calendar-wrapper renders on any successful auth, with or without events,
  so it never proved the seed reached the UI.

Replaced the dead-EmptyState check with a real DB→UI proof: assert the seeded event
title 'Seeded Test Event' is rendered in the grid. Verified non-vacuous — passes with
the seed on both profiles; with /api/events mocked to [] the title is absent (would fail).

BL-02: the seed anchored the event at now+24h. Both phone profiles render the
month-agenda view of the CURRENT month, so on a month's last day 'tomorrow' falls into
the next month and vanishes from the grid, making the new visibility assertion date-fragile.
Re-anchored to noon-today (UTC) — always today's local date, always in the current-month view.

Verified: full 58-test suite passes both profiles; typecheck clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 07:38:41 -04:00
Lucas Berger f52b722b9b docs(07): deep code review report (2 blockers, CR-01 verified resolved) 2026-06-11 07:32:58 -04:00
Lucas Berger 84921a0464 docs(phase-07): evolve PROJECT.md after phase completion 2026-06-11 02:30:21 -04:00
Lucas Berger 407bf1e91c docs(phase-07): complete phase execution 2026-06-11 02:29:36 -04:00
Lucas Berger 3b4fd9a5b1 docs(07): add phase verification report 2026-06-11 02:29:17 -04:00
Lucas Berger e105dce9de docs(07): mark CR-01 resolved in review report 2026-06-11 02:24:11 -04:00
Lucas BergerandClaude Opus 4.8 fcc680e553 fix(07-02): fail-closed guard on global-setup seed (CR-01, data-loss prevention)
global-setup.ts TRUNCATEs four tables against whatever DB_* points at, with no
production guard — an operator with prod DB_* still exported could wipe lists/
list_items/list_shares/calendar_events. The README promised a DEV_AUTH_BYPASS
guardrail the code never enforced. Adds a fail-closed guard mirroring
apps/api/src/auth/devBypass.ts: hard NODE_ENV==='production' check first, then
require DEV_AUTH_BYPASS==='true' before opening any DB connection. README updated
with the test-process env requirement (run command + CI runner env).

Verified: guard throws without DEV_AUTH_BYPASS; full 58-test suite passes with it.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 02:23:38 -04:00
Lucas Berger 8458dc25eb docs(07): add code review report 2026-06-11 02:20:32 -04:00
Lucas Berger 10e570b21d docs(07-04): complete state coverage plan — calendar.spec.ts + lists.spec.ts 2026-06-11 02:13:34 -04:00
Lucas Berger b074b4abb2 feat(07-04): add lists.spec.ts — populated and empty-state tests (TEST-01)
- Populated state: asserts 'Open list: E2E Grocery List' button visible + listitem count ≥1 + 'No lists yet' absent + no overflow
- Empty state: routes /api/lists to 200 [] before goto, asserts 'No lists yet' + 'Tap + to create' visible + no overflow; unroutes after
- Seeded DB not mutated — empty state is network-simulated (T-07-11 / D-06)
- No absolute URLs; both states pass Rule 2 overflow check
2026-06-11 02:11:44 -04:00
Lucas Berger 17b625b6fe feat(07-04): add calendar.spec.ts — populated, error, auth-bypass + SW precondition tests
- Populated state: asserts .sx-react-calendar-wrapper visible + 'Nothing here' absent
- Error state: mocks /api/events* to 500, asserts 'Couldn't load events' heading + Retry ≥44px + no overflow; unroutes after
- TEST-02 preconditions: asserts nav landmark visible (authed reach) + URL on localhost (no Authelia redirect) + navigator.serviceWorker.controller null (SW block)
- No absolute URLs; route mocks paired with unroute (T-07-11)
2026-06-11 02:11:36 -04:00
Lucas BergerandClaude Opus 4.8 c44bcc9c37 chore(07): gitignore Playwright harness outputs (test-results, reports)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 02:07:07 -04:00
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