chore(ci): rework CI gate, clear lint debt, unify server test mocks master
CI previously ran lint only, was red (18 ESLint errors), and installed with npm in a pnpm repo — validating a dependency tree that wasn't the one Docker builds from. The test suite never ran in CI, and nothing gated merges. Changes: - Replace .github/workflows/lint.yml with ci.yml: pnpm via SHA-pinned action-setup (version from packageManager), Node 22 to match the Dockerfile, frozen-lockfile install, then lint → svelte-check → vitest → ADAPTER=node build on PRs, pushes to main, and manual dispatch; permissions: contents: read; main runs never auto-cancel so every main SHA keeps a completed run for deploy gating - Clear all 18 ESLint errors: ignore ^_-prefixed bindings in no-unused-vars, drop nine now-stale eslint-disable directives, remove an unused Navbar import, unwrap an unnecessary children snippet, delete the dead ondelete prop from PictrsImage and its caller, justify the one-shot new Date() in comments.svelte.ts; lint now runs with --max-warnings 0 - Extract shared server-test mocks to src/lib/test-utils/ request-event.ts (createMockCookies, createMockEvent, kit's re-exported isRedirect), replacing duplicated mocks in the auth, hooks.server, and callback suites; the event literal is compiler-checked against RequestEvent (includes tracing/ isRemoteRequest), preserves falsy JSON bodies, defaults to POST when a body is set, only sends Content-Type alongside a body, and fails loudly when event.fetch is used unmocked; new 18-test spec pins these contracts - Test hygiene: remove unused @playwright/test and jsdom devDeps, drop redundant vitest globals:true, add test:ci and test:coverage scripts, gitignore coverage/ - /merge-to-main now runs the full local gate (lint, check, test:ci, ADAPTER=node build) as a mandatory step before any merge 759 pre-existing tests unchanged and green; suite is now 777. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>