Commit Graph
100 Commits
Author SHA1 Message Date
Lucas Berger e039c85a22 docs(16): create phase plan — 6 plans, 2 waves (dep audit, security checks, image hygiene)
SEC-01/02, DEP-01/02, IMG-01/02/03, CI-03. Wave 1: image-hygiene runtime guard (TDD), audit+outdated wrappers (TDD), eslint-plugin-security fold, gitleaks config+baseline+.dockerignore. Wave 2: ci.yml security job + gate wiring, publish.yml hygiene assertions + boot-smoke. esbuild GHSA-gv7w-rqvm-qjhr waivered in 16-02 before the gate goes live.
2026-06-12 23:23:18 -04:00
Lucas Berger bfc93584d7 docs(16): add validation strategy 2026-06-12 23:08:05 -04:00
Lucas Berger 4929a79eee docs(16): research phase — gitleaks, eslint-plugin-security, pnpm audit/outdated, image hygiene 2026-06-12 23:06:20 -04:00
Lucas Berger 7d30e0bfab docs(state): record phase 16 context session 2026-06-12 22:50:57 -04:00
Lucas Berger 75b82f472c docs(16): capture phase context 2026-06-12 22:50:52 -04:00
Lucas Berger 2d50c7b515 docs(roadmap): add Phase 16 (CI dep audit, security & image hygiene); fold in + remove backlog 999.17
Publish / publish (push) Successful in 6s
2026-06-12 22:08:29 -04:00
Lucas Berger 656da005d6 docs: fix backlog 999.17 dir name (drop spurious null- prefix) 2026-06-12 21:41:15 -04:00
Lucas Berger f742583842 docs: add backlog item 999.17 — define & enforce dev/prod image boundary 2026-06-12 21:41:02 -04:00
Lucas Berger 17c1f63d4c docs(state): record phase 10 context session 2026-06-12 21:37:32 -04:00
Lucas Berger 52506cdc2d docs(10): capture phase context 2026-06-12 21:37:26 -04:00
Lucas Berger 89411ce44b style(09): prettier-format outboxWorker.test.ts (fix CI format check)
CI / changes (pull_request) Successful in 2s
CI / fast-checks (pull_request) Successful in 1m20s
CI / api (pull_request) Successful in 58s
CI / harness (pull_request) Successful in 3m52s
CI / gate (pull_request) Successful in 1s
2026-06-12 21:12:17 -04:00
Lucas Berger 777910c86a docs(09): add code review fix report + refresh review after fixes
CI / changes (pull_request) Successful in 2s
CI / fast-checks (pull_request) Failing after 54s
CI / api (pull_request) Successful in 58s
CI / harness (pull_request) Successful in 3m51s
CI / gate (pull_request) Failing after 0s
2026-06-12 21:01:55 -04:00
Lucas Berger b7767af825 fix(09): IN-01 guard __resetDrainState against production use 2026-06-12 20:59:53 -04:00
Lucas Berger b724b3e932 fix(09): WR-03/IN-03/IN-04 add drain-listener teardown, test-only __resetDrainState, and remove stale RED @ts-ignore 2026-06-12 20:51:49 -04:00
Lucas Berger e1ffddf8dc fix(09): WR-02 make initOutboxTrigger idempotent and retain the unsubscribe handle via stopOutboxTrigger 2026-06-12 20:51:32 -04:00
Lucas Berger d3163f2281 fix(09): IN-02 extract shared resolveFinalRrule helper to deduplicate the update/create RRULE decision tree 2026-06-12 20:50:52 -04:00
Lucas Berger b8bb6e7671 fix(09): IN-01 add ordering comments cementing signalOutboxDrain() stays after the enqueue commit 2026-06-12 20:50:26 -04:00
Lucas Berger 8307a7b713 fix(09): WR-01 defer outbox drain emit to a microtask so a throwing listener cannot corrupt the enqueue route response 2026-06-12 20:50:21 -04:00
Lucas Berger 1bc1f134a7 docs(09): refresh code review report
CI / changes (pull_request) Successful in 2s
CI / fast-checks (pull_request) Failing after 56s
CI / api (pull_request) Successful in 59s
CI / harness (pull_request) Successful in 3m55s
CI / gate (pull_request) Failing after 1s
2026-06-12 17:24:08 -04:00
Lucas Berger ffc1f52f2b docs(phase-09): evolve PROJECT.md after phase completion
CI / changes (pull_request) Successful in 2s
CI / fast-checks (pull_request) Failing after 56s
CI / api (pull_request) Successful in 1m0s
CI / harness (pull_request) Successful in 4m0s
CI / gate (pull_request) Failing after 1s
2026-06-12 17:09:34 -04:00
Lucas Berger 03f02a1207 docs(phase-09): complete phase execution 2026-06-12 17:08:54 -04:00
Lucas Berger 551b751b81 docs(09): add code review report 2026-06-12 17:04:55 -04:00
Lucas Berger fff5789a5f docs(09-02): complete enqueue-site signal wiring plan
- 09-02-SUMMARY.md: 4 signalOutboxDrain() sites + initOutboxTrigger() startup wiring
- STATE.md: plan position advanced, metrics recorded
- ROADMAP.md: plan progress updated
- REQUIREMENTS.md: CAL-15 marked complete
2026-06-12 16:59:27 -04:00
Lucas Berger 0ebdf4864d feat(09-02): wire initOutboxTrigger() at startup under isMainModule() in index.ts
- extend outboxWorker import to include initOutboxTrigger alongside startOutboxWorker
- call initOutboxTrigger() immediately after startOutboxWorker() inside isMainModule() guard
- gated by isMainModule() so tests importing app never register the drain listener (Pitfall 4)
2026-06-12 16:57:52 -04:00
Lucas Berger 30eff3dcdb feat(09-02): add signalOutboxDrain() after each of four enqueue sites in events.ts
- import signalOutboxDrain from '../lib/outboxTrigger.js'
- Site 1 (POST /create): fire-and-forget signal after outbox insert, before 202
- Site 2 (PATCH edit-as-move): signal after await db.transaction() resolves, not inside callback (D-03)
- Site 3 (PATCH same-calendar update): signal after outbox insert, before 202
- Site 4 (DELETE): signal after outbox insert, before 202
2026-06-12 16:57:21 -04:00
Lucas Berger 9164619ccd docs(09-01): complete outbox drain trigger wiring plan 2026-06-12 16:54:20 -04:00
Lucas Berger 2b113045f7 feat(09-01): add scheduleOutboxDrain, drainRequested, initOutboxTrigger; route setInterval through wrapper
- Add import { onOutboxDrain } from outboxTrigger.js
- Add let drainRequested = false (D-05 trailing-re-drain flag)
- Export scheduleOutboxDrain(): void — isDraining guard + drainRequested loop (D-05/T-09-01)
  drainRequested=false reset precedes recursive call (Pitfall 3)
  errors caught via .catch to prevent crash (D-02/T-09-03)
- Export initOutboxTrigger(): void — registers onOutboxDrain(() => scheduleOutboxDrain())
- startOutboxWorker setInterval body: scheduleOutboxDrain() replaces runOutboxDrain().catch()
  15 * 1000 interval unchanged (D-08)
- runOutboxDrain body/isDraining guard/finally unchanged (D-02/D-07)
- Fix trigger-wiring tests: add beforeAll(initOutboxTrigger) to wire EventEmitter listener;
  fix Test C mock to return empty rows on trailing drain (correct D-07 behaviour)
- 30/30 outboxWorker tests GREEN; tsc --noEmit clean
2026-06-12 16:52:36 -04:00
Lucas Berger bcde073729 test(09-01): add failing trigger-wiring tests for SC-1, D-05, D-07
- Import scheduleOutboxDrain (not yet exported — causes RED)
- Import signalOutboxDrain from outboxTrigger.ts
- Add describe block 'scheduleOutboxDrain — trigger wiring (D-09)' with 3 tests:
  Test A SC-1: signalOutboxDrain() fires drain promptly without timer advance
  Test B D-05: two mid-drain signals collapse to exactly one trailing re-drain
  Test C D-07: concurrent scheduleOutboxDrain() calls dispatch exactly once via isDraining guard
- 27 pre-existing tests unmodified and passing; 3 new tests failing (RED)
2026-06-12 16:48:41 -04:00
Lucas Berger 1e12d702a1 feat(09-01): create outboxTrigger.ts zero-dependency EventEmitter signal module
- Module-level singleton EventEmitter, single subscriber, no setMaxListeners
- Export signalOutboxDrain(): void — fire-and-forget drain signal (D-04)
- Export onOutboxDrain(handler): () => void — register/unsubscribe listener
- Only imports node:events; zero internal dependencies (no circular import risk)
2026-06-12 16:47:39 -04:00
Lucas Berger a78c7241d6 docs(09): add pattern map 2026-06-12 14:28:32 -04:00
Lucas Berger 5fdbd11475 docs(09): create phase plan 2026-06-12 14:28:09 -04:00
Lucas Berger b22c92ae92 docs(09): create phase plan (2 plans, 2 waves) — outboxTrigger + drain signal wiring 2026-06-12 14:21:37 -04:00
Lucas Berger 555f4c80f8 docs(phase-9): add validation strategy 2026-06-12 14:11:10 -04:00
Lucas Berger 106574df1d docs(09): research phase — faster write-back trigger wiring 2026-06-12 14:09:26 -04:00
Lucas Berger b104d73cb5 docs(state): record phase 9 context session 2026-06-12 14:02:28 -04:00
Lucas Berger 2a11e86bca docs(09): capture phase context 2026-06-12 14:02:21 -04:00
Lucas Berger 2b4eb5d6ba docs(phase-15): complete phase execution
Publish / publish (push) Successful in 6s
2026-06-12 11:20:09 -04:00
Lucas Berger 62252ce434 docs(15-03): complete plan 03 — branch protection finalized (fast-checks + gate), publish.yml comment 2026-06-12 11:20:09 -04:00
Lucas Berger a6e2474379 docs(phase-15): record deferred 15-03 operator checkpoint
CI / changes (pull_request) Successful in 6s
CI / fast-checks (pull_request) Successful in 1m23s
CI / api (pull_request) Successful in 59s
CI / harness (pull_request) Successful in 3m55s
CI / gate (pull_request) Successful in 1s
2026-06-12 10:59:48 -04:00
Lucas Berger da623ac234 docs(15-03): update publish.yml safety-gate comment to name new required checks
- Replace "three required checks (CI / fast-checks, CI / api, CI / harness)"
  with the new gating surface: CI / fast-checks + CI / gate
- Note that CI / api and CI / harness are conditionally skipped on doc-only PRs
  and gated via the always-running CI / gate aggregate
- Comment-only change; no job/step/env/trigger modified
2026-06-12 10:56:03 -04:00
Lucas Berger 0278e2080a docs(phase-15): update tracking after wave 2 2026-06-12 10:54:26 -04:00
Lucas Berger c0c217019c chore: merge executor worktree (worktree-agent-afb241c0e741e819e) 2026-06-12 10:53:47 -04:00
Lucas Berger e153f7c355 docs(15-02): complete plan 02 summary — changes job + gate aggregate 2026-06-12 10:53:22 -04:00
Lucas Berger 547b12ca4a feat(15-02): add always-running gate aggregate job (Gitea-safe per-job result checks)
- gate job needs [fast-checks, changes, api, harness] with if: always()
- gate fails (exit 1) when fast-checks != success
- gate accepts success OR skipped for api and harness, fails on any other result
- uses individual needs.X.result checks (not wildcard) — Gitea 1.26.2 bug #31007
- once merged, emits CI / gate commit-status required by Plan 03 branch-protection update
2026-06-12 10:52:18 -04:00
Lucas Berger 72604385bc feat(15-02): add changes job and gate api/harness on code output
- insert changes job (dorny/paths-filter@v4) before fast-checks
- changes job: permissions pull-requests:read, outputs code, no checkout
- code filter lists positive patterns: **/*.ts, apps/**, pnpm-lock.yaml, Dockerfile, etc.
- api job: needs [changes] + if combined with needs.changes.outputs.code == 'true'
- harness job: same needs/if pattern as api
- services, env, and step bodies unchanged in both heavy jobs
2026-06-12 10:51:20 -04:00
Lucas Berger 20ebd90554 docs(phase-15): update tracking after wave 1 2026-06-12 10:49:12 -04:00
Lucas Berger cd6be1b9c3 chore: merge executor worktree (worktree-agent-ad1b2de59871ef5b9) 2026-06-12 10:47:56 -04:00
Lucas Berger 4c5efb0604 docs(15-01): complete markdown lint gate plan — SUMMARY.md 2026-06-12 10:47:17 -04:00
Lucas Berger 46bea03757 feat(15-01): fix 13 markdown violations + wire md:lint to fast-checks CI step
- Fix MD040 (11 bare fences): add language tags (text/bash) across 7 files
- Fix MD031 (2 violations): add blank lines around fence in GETTING-STARTED.md
- Wire 'Markdown lint' step to fast-checks job (after Format check, before Typecheck)
- Reformat .markdownlint-cli2.jsonc per Prettier (trailing commas in JSONC)
- pnpm md:lint exits 0; pnpm format:check exits 0; gate can fail on bare fence (verified)
2026-06-12 10:46:01 -04:00
Lucas Berger adb7641c19 feat(15-01): add markdownlint-cli2 + md:lint script + root config
- Install markdownlint-cli2@0.22.1 as root workspace devDependency
- Add md:lint script (no glob args — globs/ignores live in config file)
- Create .markdownlint-cli2.jsonc with prettier preset + content rules
- Enable MD001/MD024/MD040/MD031/MD051/MD052; disable MD041/MD034/MD036
- Glob: docs/**/*.md, *.md, apps/**/*.md; ignores .planning/** and node_modules
2026-06-12 10:42:52 -04:00
Lucas Berger 4728c41539 docs(phase-15): mark phase execution started 2026-06-12 10:40:07 -04:00
Lucas Berger c687efce27 docs(15): record planning complete + roadmap wave annotations 2026-06-12 10:30:50 -04:00
Lucas Berger e19d4736c7 docs(15): create phase plan — doc-only CI skip + markdown lint
3 plans across 3 waves:
- 15-01: markdownlint-cli2 config/script/step + fix 13 baseline violations (SC-4)
- 15-02: ci.yml changes job + conditional api/harness + always-running gate (SC-1/2, SC-3 YAML)
- 15-03: operator branch-protection checkpoint + publish.yml comment (SC-3)
2026-06-12 10:28:56 -04:00
Lucas Berger 899528eeb3 docs(phase-15): add pattern map 2026-06-12 10:22:37 -04:00
Lucas Berger 18cf62b702 docs(phase-15): add validation strategy 2026-06-12 10:19:08 -04:00
Lucas Berger e84911de10 docs(15): research phase - doc-only CI skip + markdown lint 2026-06-12 10:17:53 -04:00
Lucas Berger 23fb238443 docs(roadmap): add markdown linting to Phase 15 scope
Publish / publish (push) Successful in 6s
2026-06-12 09:52:34 -04:00
Lucas Berger 300a07ab4b docs: review backlog — promoted 999.17 to Phase 15, removed 6 stale promoted stubs
Publish / publish (push) Successful in 7s
2026-06-12 09:47:12 -04:00
Lucas Berger cf48fa8e1b docs(phase-14): complete phase execution
CI / fast-checks (pull_request) Successful in 1m20s
CI / api (pull_request) Successful in 57s
CI / harness (pull_request) Successful in 3m56s
2026-06-12 09:10:18 -04:00
Lucas Berger f9fc7bbda2 docs(14): add code review report 2026-06-12 09:07:20 -04:00
Lucas Berger f75bc4239f style(14-01): apply prettier formatting to layout.spec.ts for CI format:check gate
CI / fast-checks (pull_request) Successful in 1m22s
CI / api (pull_request) Successful in 59s
CI / harness (pull_request) Successful in 3m58s
2026-06-12 08:31:33 -04:00
Lucas Berger 214e59d6e2 docs(phase-14): update tracking after wave 1 2026-06-12 08:27:39 -04:00
Lucas Berger 1c7775a022 chore: merge executor worktree (worktree-agent-aaafe3c94f936d618) 2026-06-12 08:25:19 -04:00
Lucas Berger 492adbc8b3 docs(14-01): complete desktop e2e coverage plan
- 85 passed, 5 skipped, 0 failed across iphone + pixel + desktop
- SC-1/SC-2/SC-3 all satisfied
2026-06-12 08:24:31 -04:00
Lucas Berger bfc49d199d chore(14-01): update spec headers + README for desktop profile, cosmetic CI step rename
- Updated calendar.spec.ts header to list all three profiles (iphone/pixel/desktop)
- Updated lists.spec.ts header to list all three profiles (iphone/pixel/desktop)
- Updated e2e/README.md preamble to add 'Desktop Chrome (1280x720)'
- Added --project=desktop example to README run-commands block
- Updated README full-suite command comment to name all three profiles
- Cosmetic: ci.yml step-name and comment updated to mention desktop (no plumbing change)
- Full suite verified: 85 passed, 5 skipped (3 desktop geometry + 2 parity guards), 0 failed
2026-06-12 08:23:10 -04:00
Lucas Berger 29035999ea feat(14-01): desktop-skip three mobile-only layout assertions, add D-04 parity
- Added test.skip(testInfo.project.name === 'desktop') to the two safe-area-inset
  BottomTabBar in-viewport tests (BottomTabBar returns null at >=768px on desktop)
- Added test.skip(testInfo.project.name === 'desktop') to the 56x56 FAB geometry test
  (on desktop 'New Event' resolves to the toolbar button, not the 56px FAB)
- Added desktop-only D-04 parity test asserting 'New Event' toolbar button height >=44px
  guarded by test.skip(testInfo.project.name !== 'desktop')
- Updated header jsdoc to list all three profiles including desktop
- All mobile assertions preserved (toBeGreaterThanOrEqual(56) and (44) still present)
2026-06-12 08:20:06 -04:00
Lucas Berger d3bc69657b feat(14-01): add desktop Playwright project (Desktop Chrome, 1280x720, no hasTouch)
- Appended 'desktop' project entry after 'pixel' in playwright.config.ts projects array
- Uses devices['Desktop Chrome'] with serviceWorkers: 'block' (D-02/Pitfall 15)
- No baseURL override — inherited from top-level use block (D-08)
- Updated file header jsdoc: three-profile matrix, added --project=desktop example
2026-06-12 08:19:04 -04:00
Lucas Berger 5c3bd5c1ea docs(14): record planning complete + pattern map 2026-06-12 08:10:03 -04:00
Lucas Berger 8742dd43a4 docs(14): create phase plan 2026-06-12 08:07:37 -04:00
Lucas Berger d8cdbcfc14 docs(state): record phase 14 context session 2026-06-12 07:57:10 -04:00
Lucas Berger 2daeb49b89 docs(14): capture phase context 2026-06-12 07:57:03 -04:00
Lucas Berger 5ab463ccbb docs: add backlog 999.17 (CI doc-only PR skip) + remove stale graph.html
CI / fast-checks (pull_request) Successful in 1m19s
CI / api (pull_request) Successful in 58s
CI / harness (pull_request) Successful in 3m16s
2026-06-11 22:29:26 -04:00
Lucas Berger cfb2fd3cf9 docs(graph): refresh knowledge-graph artifacts (rebuilt at 63ae0c6 — 5924 nodes/6053 edges)
CI / fast-checks (pull_request) Successful in 1m22s
CI / api (pull_request) Successful in 1m0s
CI / harness (pull_request) Successful in 3m29s
2026-06-11 22:25:27 -04:00
Lucas Berger 213aeba347 docs: refresh CI + lint/format docs (Phase 8 + Phase 13)
CI / fast-checks (pull_request) Successful in 1m23s
CI / api (pull_request) Successful in 1m0s
CI / harness (pull_request) Successful in 3m27s
2026-06-11 22:21:23 -04:00
Lucas Berger 0eb43c93d7 fix(13): ignore .pnpm-store in Prettier — CI puts pnpm's store in-workspace so format:check walked into it
CI / fast-checks (pull_request) Successful in 1m23s
CI / api (pull_request) Successful in 1m4s
CI / harness (pull_request) Successful in 3m29s
2026-06-11 21:32:14 -04:00
Lucas Berger fc5b06d343 Merge remote-tracking branch 'origin/main' into gsd/phase-13-real-lint-gate-eslint
CI / fast-checks (pull_request) Failing after 1m47s
CI / api (pull_request) Successful in 1m0s
CI / harness (pull_request) Successful in 3m30s
# Conflicts:
#	.planning/ROADMAP.md
2026-06-11 21:25:14 -04:00
Lucas Berger f16316c6fd docs(quick-260611-tfc): WR-01 sw.ts notificationclick fallback fix 2026-06-11 21:16:38 -04:00
Lucas Berger af78ccc8b9 fix(quick-260611-tfc): make notificationclick openWindow fallback reachable
- Add .then(navigated) check: opens new window when client.navigate() resolves null
- Add .catch(): opens new window when client.focus() or client.navigate() rejects
- Both branches guarded by self.clients.openWindow per spec
- Returned chain (not floating) satisfies no-floating-promises gate
- All other behaviour preserved: close(), url extraction, post-loop fallback
2026-06-11 21:14:14 -04:00
Lucas Berger f06216b567 docs(13): add code review report 2026-06-11 21:08:54 -04:00
Lucas Berger 90d94febea docs(13): mark phase complete — tracking updates 2026-06-11 21:00:55 -04:00
Lucas Berger 8a53e9d1ee docs(13): phase verification — passed (9/9), 2 live-CI human items 2026-06-11 20:59:51 -04:00
Lucas Berger 743c7d92f0 fix(13-03): exclude .planning from Prettier so the format gate stays green
GSD planning artifacts (.planning/**) are rewritten by tooling on every workflow
run and are never hand-formatted. Including them in Prettier scope caused
pnpm format:check to exit 1 on virtually every future PR, making the SC-3
green baseline impossible to hold. Add .planning/ to .prettierignore, mirroring
the same rationale as dist/ and apps/api/src/db/migrations/.

Real source docs (README.md, docs/**) remain in Prettier scope.
No playwright-report/, test-results/, or coverage/ directories exist to ignore.
2026-06-11 20:50:45 -04:00
Lucas Berger f153b7199d docs(13-03): complete Prettier reformat + CI format gate plan 2026-06-11 20:44:52 -04:00
Lucas Berger 0422406c42 feat(13-03): add Format check CI step; remove stale no-op lint comment
- Insert 'Format check: pnpm format:check' after Lint in fast-checks job
- Remove the 3-line comment that said lint was a no-op (no longer true)
- Step order: Install → Lint → Format check → Typecheck → PWA unit tests
- Branch-protection contexts (name:CI, fast-checks, api, harness) unchanged
2026-06-11 20:35:44 -04:00
Lucas Berger 982438dc10 style(13-03): apply Prettier formatting across repo
Mechanical reformat — no logic changes. 398 files changed, 19125
insertions(+), 16457 deletions(-). Prettier 3.8.4 with .prettierrc
(singleQuote:true, semi:true, tabWidth:2, trailingComma:all,
printWidth:100). Isolated per D-13-08 for reviewability.
2026-06-11 20:35:18 -04:00
Lucas Berger 4bc0445173 docs(13-02): record post-verification correction — residual lint error and fix 2026-06-11 20:31:10 -04:00
Lucas Berger 3f2e3ea659 fix(13-02): resolve residual no-unnecessary-type-assertion in SyncStateToast.test
- Replace inline 'as string | null' assertion with an explicit typed const
  declaration inside the vi.hoisted() callback body
- 'value: string | null' typed const satisfies both ESLint (no assertion) and
  tsc (null assignment on line 82 is type-safe)
2026-06-11 20:30:51 -04:00
Lucas Berger 1453cbed76 docs(13-02): complete ESLint violation elimination plan 2026-06-11 20:25:47 -04:00
Lucas Berger 03e953158a fix(13-02): eliminate all ESLint violations — pnpm lint exits 0
- eslint.config.js: disable React Compiler rules (v7 flat.recommended enables
  them; codebase does not use the Compiler); add e2e/ to disableTypeChecked
  block; promote exhaustive-deps to error
- API broker: remove redundant as-casts (outboxWorker, poller, reminderScheduler,
  expand, sync, vevent, spike); add targeted ical.js no-unsafe-assignment/argument
  disables with justifying comments inside try blocks
- API routes/sse.ts: fix no-misused-promises on async writeSSE callback with
  void+IIFE+catch pattern
- API routes/lists.ts: let → const for updateValues
- API tests: remove unused imports (beforeEach, eq, vi); rename unused vars
  with _ prefix; remove unused lastActiveId assignment
- PWA components: void navigate() and void queryClient.invalidateQueries() on
  all fire-and-forget call sites; fix CalendarShell explicit-type-casts;
  Couldn't → HTML entity
- PWA test files: as unknown as Response for partial mock objects; string | null
  type annotation on mockLastSyncedUid; remove async from test callbacks without
  await; act(() => {}) not await act(async () => {}) for sync ops
- sw.ts: restructure Notification.data?.url access as let+if so disable
  comments land on the exact violation lines; void self.skipWaiting()
2026-06-11 20:23:38 -04:00
Lucas Berger 39e26561cf docs(13-01): complete lint gate foundation plan — SUMMARY + STATE + ROADMAP
Plan 13-01 complete: ESLint flat config + Prettier installed and wired,
SC-1 gate proven (exit 1 on deliberate violations), 119 real violations
inventoried for Plan 02 (api:42, pwa:77). STATE advanced to Plan 2 of 3.
2026-06-11 19:53:55 -04:00
Lucas Berger 7a255eacaa fix(13-01): disable react/react-in-jsx-scope for React 19 JSX transform
SC-1 smoke revealed flat.recommended enables react/react-in-jsx-scope (error),
while the legacy recommended disables it. This codebase uses jsx:"react-jsx"
(React 17+ automatic transform) so React does not need to be in scope. Disable
the rule explicitly alongside react/prop-types in the pwa-react config block.

Also proved both gate halves:
- pnpm lint exits 1 on no-floating-promises deliberate violation (SC-1 lint)
- pnpm format:check exits 1 listing _format-gate-test.ts (SC-1 format)
Both throwaway files deleted; neither staged nor committed.
2026-06-11 19:52:08 -04:00
Lucas Berger df62d333d0 chore(13-01): install ESLint+Prettier, author flat config, wire lint/format scripts
- Install eslint@9.39.4 @eslint/js@9.39.4 typescript-eslint@8.61.0
  eslint-plugin-react@7.37.5 eslint-plugin-react-hooks@7.1.1
  eslint-config-prettier@10.1.8 prettier@3.8.4 as root devDependencies
- Author eslint.config.js: ignores → base recommendedTypeChecked (projectService:true)
  → pwa-react block (apps/pwa/** only) → disableTypeChecked override (config files +
  apps/api/tests) → prettier-last (eslint-config-prettier/flat)
- Add .prettierrc (singleQuote:true, printWidth:100) and .prettierignore
- Add "type":"module" to root package.json; add format/format:check scripts
- Add lint script (--max-warnings 0) to apps/api and apps/pwa
2026-06-11 19:44:57 -04:00
Lucas Berger 5f065183b0 docs(08-fix): code review + auto-fix report (5 fixed, IN-02 deferred to Phase 13)
CI / fast-checks (pull_request) Successful in 49s
CI / api (pull_request) Successful in 1m3s
CI / harness (pull_request) Successful in 3m27s
2026-06-11 19:29:36 -04:00
Lucas Berger 66c54507ad docs(13): create phase plan 2026-06-11 19:27:50 -04:00
Lucas Berger bf091102f2 fix(08-fix): IN-01 document MariaDB-only long-unique HASH index dependency 2026-06-11 19:27:11 -04:00
Lucas Berger 4001cd5b90 fix(08-fix): WR-04 push immutable sha tag before :latest with strict shell 2026-06-11 19:27:07 -04:00
Lucas Berger 58861d99a8 fix(08-fix): WR-05 bind REGISTRY_PAT via env: and pipe with printf for docker login 2026-06-11 19:27:03 -04:00
Lucas Berger 6bcf867e6c fix(08-fix): WR-03 fail closed on empty GITHUB_SHA when computing image tags 2026-06-11 19:26:53 -04:00
Lucas Berger 44a9c307e2 fix(08-fix): WR-02 upload Playwright HTML report on harness failure 2026-06-11 19:26:28 -04:00
Lucas Berger 694253ecb0 docs(13): create phase plan — 3 plans (lint gate + Prettier format gate)
- 13-01: install ESLint v9/typescript-eslint/React/Prettier (pinned), flat config,
  package lint + root format scripts, root type:module; prove gate fails (SC-1)
- 13-02: fix all first-run violations across both apps, address-not-mask (D-13-05/06)
- 13-03: isolated Prettier reformat (D-13-08) + CI format:check step + green baseline (SC-2/SC-3)
- ROADMAP: add active Phase 13 entry + Progress row; mark backlog 999.16 promoted
2026-06-11 19:25:08 -04:00