Skip to content

Release v0.2.0 — Phase 0 (toolchain and repo hygiene) - #8

Merged
Jeston10 merged 7 commits into
mainfrom
dev
Sep 15, 2026
Merged

Jeston10 merged 7 commits into
mainfrom
dev

Conversation

@Jeston10

Copy link
Copy Markdown
Owner

Summary

Promotion of dev into main for the Phase 0 release (v0.2.0). Contents: the engineering handbook, the five Phase 0 PRs (#1–#5), and the promotion-flow hotfix (#7). See CHANGELOG.md → Unreleased for the full list.

Release checklist (docs/QUALITY.md §5)

  • CI green on dev (all four jobs, including emulator integration and e2e)
  • pnpm audit clean (0 findings)
  • Lighthouse CI — not yet configured (P8.7)
  • Device matrix — public pages verified at 375/768/1280 by the e2e overflow assertion; no UI redesign in this phase
  • A11y scan — added to e2e in P3.7
  • Evals — no prompt changes
  • CHANGELOG.md updated; tag v0.2.0 applied after merge
  • Feature flags — none introduced
  • docs/RISKS.md: R6, R7, R19, R20, R25 closed; R26 open (Gemini key) and tagged for P2.3

Known open items carried into Phase 1

  • R1: refresh-token revocation after this deploy (P1.1)
  • R2: /api/vapi/generate and createFeedback still unauthenticated (P1.4)
  • R26: GEMINI_API_KEY invalid — LLM paths non-functional until replaced
  • Vercel project env vars need the new names for preview/production deploys to build

🤖 Generated with Claude Code

Jeston10 and others added 7 commits September 15, 2026 22:52
…(PR 0.1) (#1)

* chore: migrate to pnpm, strict ESLint/Prettier, lefthook, commitlint

PR 0.1 of docs/MILESTONES.md.

Toolchain
- pnpm 10 via corepack (packageManager, engines, pnpm-lock.yaml); npm
  lockfile removed. .npmrc hoists eslint/prettier plugins for
  eslint-config-next; onlyBuiltDependencies allow-list for postinstall
  scripts (SECURITY §2.12).
- ESLint flat config: next/core-web-vitals + typescript-eslint
  strict/stylistic type-checked, no-console, no-explicit-any,
  no-non-null-assertion, import/order, and the ARCHITECTURE §1 layer
  rules as no-restricted-imports overrides. Legacy allowances are
  scoped and annotated with the PR that deletes them.
- Prettier (+tailwind plugin), commitlint (conventional + "security"
  type), lefthook hooks calling local binaries; gitleaks/vitest guarded
  by scripts until installed. .gitattributes normalises LF (R19).
- package.json scripts per AGENTS.md §5; .nvmrc; .vscode settings.
- tailwind.config.js removed (Tailwind v4 uses @theme in CSS).

Legacy code brought to lint-clean (356 → 0)
- All console.* removed, including the session-cookie log in
  getCurrentUser (closes R1 early; P1.1 adds the structured logger).
- Fixed B1 (await cookies() in profile update), B4 (duplicate keys),
  B12 (stateful /g regex), B13 (signIn return), B16 (single AgentProps).
- Typed JSON boundaries instead of any; ?? instead of ||; void on
  fire-and-forget promises; onKeyDown instead of deprecated onKeyPress.
- /api/vapi/generate: minimal shape validation and no error leakage
  (interim until P1.4 adds zod + session auth; R2 still open).
- ci.yml: replaced invalid YAML flow mappings containing ${{ }}.

Verified: pnpm lint, pnpm typecheck, next build all clean; hooks reject
non-conventional messages.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* docs: update risk register, changelog, and contributing for PR 0.1

* ci: adopt milestone → dev → main promotion flow with pipeline gates

- CI runs on every PR and on pushes to main, dev, and milestone/**.
- New "Promotion guard" workflow: PRs into main must come from dev;
  PRs into dev must come from milestone/* or hotfix/*. Intended as a
  required status check alongside CI on both protected branches.
- PROCESS.md documents the branching model; CONTRIBUTING.md, AGENTS.md,
  and docs/MILESTONES.md updated so work branches are cut from the
  current milestone branch, never from main.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* chore: point issue template link at renamed repository

* chore: add branch protection script for main and dev

* ci: let pnpm/action-setup read the version from packageManager

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
… (PR 0.2) (#2)

PR 0.2 of docs/MILESTONES.md.

- tsconfig: target ES2022, noUncheckedIndexedAccess,
  exactOptionalPropertyTypes, noImplicitOverride,
  noFallthroughCasesInSwitch, verbatimModuleSyntax.
- next.config: removed ignoreBuildErrors and ignoreDuringBuilds
  (GUARDRAILS B10); reactStrictMode on; poweredByHeader off.
- Fixed the 14 errors the flags surfaced without casts: guarded
  Firestore docs[0], messages.at(-1), tooltip payload[0]; optional props
  declared as `T | undefined`; RouteParams made generic so [id] pages
  get a typed `id`; firebase/admin fails fast on missing env instead of
  passing undefined to cert() (interim until config/env.ts in P0.3);
  sonner theme resolved without a cast.

Verified: pnpm lint, pnpm typecheck, next build (now enforcing both).

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
….3) (#3)

PR 0.3 of docs/MILESTONES.md.

- config/env.ts (@t3-oss/env-nextjs + zod): server and client schemas
  for every variable in use; fails at boot with a readable message;
  SKIP_ENV_VALIDATION=1 for secret-less CI builds. Later-phase services
  are documented in .env.example but are added to the schema only by
  the PR that introduces them.
- ESLint no-restricted-syntax bans `process.env` outside config/env.ts
  (GUARDRAILS B4). All seven prior usages migrated.
- firebase/client.ts: config from NEXT_PUBLIC_FIREBASE_* env; fixed the
  `!getApps.length` bug (B3); Firestore client export removed (never
  used; data access is admin-only per SECURITY §2.7).
- Gemini provider created explicitly with GEMINI_API_KEY instead of the
  SDK's implicit GOOGLE_GENERATIVE_AI_API_KEY lookup.
- /api/news reduced to an empty stub (it only ever served fabricated
  example.com articles); widget shows an empty state until P3.5 deletes
  both.

Verified: pnpm lint, pnpm typecheck, next build with valid env; build
with FIREBASE_PROJECT_ID unset fails with the validation error.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…) (PR 0.4) (#4)

* chore: remove dead dependencies, files, and exports flagged by knip

- Removed pdfjs-dist, @types/pdfjs-dist, next-themes, lucide-react,
  @radix-ui/react-label (unused); tailwindcss-animate replaced by the
  Tailwind v4-native tw-animate-css import already in devDependencies.
- Deleted unused shadcn files (form, label, sonner) — re-imported and
  adapted in P3.2 — plus dummyInterviews, tech mappings, getTechLogos.
- knip.jsonc: eslint-config-next is referenced by string via FlatCompat;
  vitest/playwright binaries are ignored until P0.5 adds them.

knip now exits 0. Verified: pnpm lint, pnpm typecheck.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* chore: upgrade to Next 16.3, React 19.3, eslint-config-next 16

Read docs/app/guides/upgrading/version-16 before upgrading (RISKS R7).
Applied: Turbopack is the default (dropped --turbopack); tsconfig
jsx=react-jsx and .next/dev/types include as required by Next 16;
eslint-config-next now ships native flat config, so FlatCompat and
@eslint/eslintrc are removed; the Next-managed AGENTS.md block is
committed so `next dev` leaves the tree clean.

eslint-plugin-react-hooks v7 (React Compiler rules) surfaced five real
issues, fixed idiomatically: derived lastMessage instead of mirrored
state (Agent), pure fetch helper with state set only in promise
callbacks (DailyLoginStar), no Date.now() during render (InterviewCard,
AIChatbot), useSyncExternalStore clock (LiveDateTime).

Not applicable here but noted for later phases: middleware.ts is now
proxy.ts (P1.2), next lint is gone (CI/hook lint remains the gate).

Verified: pnpm lint, pnpm typecheck, next build (Turbopack).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* chore: upgrade AI SDK 4 -> 7 and @ai-sdk/google 1 -> 4

Read migration guides 5.0, 6.0, 7.0 before upgrading (RISKS R7).
Applied: generateObject -> generateText with Output.object (read
result.output); createGoogleGenerativeAI -> createGoogle; removed the
per-model settings argument (structuredOutputs), which no longer exists.
Model id unchanged pending the provider router in P2.3.

Verified: pnpm lint, pnpm typecheck. A live structured-generation call
reaches the Google API but is rejected with "API key not valid" — the
stored key predates this work and must be regenerated (free) before the
LLM path can be exercised end to end.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* chore: upgrade zod 3 -> 4, @hookform/resolvers, react-hook-form

Read the Zod 4 changelog before upgrading (RISKS R7). Applied the
deprecations it introduces: z.string().email() -> z.email(),
z.string().url() -> z.url(). Tuples, literals, transforms, and
z.infer used in feedbackSchema and config/env.ts are unchanged.

Verified: pnpm lint, pnpm typecheck, next build.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* chore: upgrade firebase 11 -> 12 and firebase-admin 13 -> 14

Read the Admin SDK release notes before upgrading (RISKS R7): v14
requires Node 22 (pinned in .nvmrc/engines) and ES module entry points
(already in use). No code changes were needed.

Verified: pnpm lint, pnpm typecheck, next build; read-only smoke test
against the real project with the service account (Firestore query and
Auth listUsers succeed).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* chore: clear audit findings; pin @types/node 22; defer ESLint 10, TS 7

- pnpm override uuid@<11.1.1 -> >=11.1.1 (transitive via
  firebase-admin > @google-cloud/storage, a subpackage we never load).
  pnpm audit: 0 known vulnerabilities (was 27: 5 critical, 7 high).
- @types/node pinned to 22.x to match the runtime.
- Deferred with reasons: ESLint 10 (eslint-plugin-jsx-a11y and
  eslint-plugin-import do not yet declare support), TypeScript 7
  (typescript-eslint caps at <6.1).
- knip: eslint-config-next no longer needs ignoring now that it is a
  native flat-config import.

Verified: pnpm lint, pnpm typecheck, knip, next build; firebase-admin
smoke test still passes with the override.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix: initialise firebase-admin lazily so secret-less builds succeed

CI's build job (SKIP_ENV_VALIDATION=1, no service account) failed
because firebase/admin.ts created the Admin app at module scope while
Next collected page data for route handlers. The app is now created on
first use via getAdminAuth()/getDb(); importers updated.

Verified: pnpm lint, pnpm typecheck; next build with .env.local moved
aside (no secrets) succeeds; with secrets, next start serves /sign-in
and /api/daily-login/streak performs a real Firestore read.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* docs: plan proxy.ts for Next 16; close R7; add R26 (Gemini key)

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…e (PR 0.5) (#5)

* ci: add vitest, Playwright, size-limit, first tests; complete pipeline

PR 0.5 of docs/MILESTONES.md.

- vitest.config.mts: unit + integration projects, v8 coverage with the
  docs/QUALITY.md thresholds on lib/, server/, config/ (legacy
  lib/actions and the Vapi wrapper excluded until their scheduled
  replacement).
- playwright.config.ts: 375 / 768 / 1280 projects against a production
  build; PLAYWRIGHT_CHANNEL lets local runs use an installed Chrome.
- tests/: skeleton (unit, integration, e2e, evals, fixtures);
  smoke e2e (public pages render, no horizontal overflow, anonymous
  redirect); unit tests for lib/utils and repository hygiene (R20:
  .env.example tracked, .env.local ignored, no build-error
  suppressions).
- .size-limit.json: gzip ratchet on client chunks (560 kB; current
  545 kB), to be lowered as legacy code is removed.
- firebase.json: emulator config (auth, firestore) so CI can run
  emulators:exec; rules and indexes follow in P1.3.
- ci.yml: local binaries instead of dlx; chromium only; e2e job builds
  with demo public env before running.
- Removed the P0.5 guards: lefthook vitest script, knip ignoreBinaries.
- tsconfig includes *.mts; tooling configs may read process.env.

Verified: pnpm lint, pnpm typecheck, knip, vitest (4 tests, coverage
gate), next build, size-limit, Playwright 9/9 on a production build.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* ci: install JDK 21 for the Firebase emulator jobs

* docs: close R6 and R20; changelog for Phase 0

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Phase 0 — toolchain and repo hygiene → dev
Copilot AI lite review requested due to automatic review settings September 15, 2026 19:15

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@vercel

vercel Bot commented Sep 15, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
just-prep-ai-interview-z3cv Error Error Sep 15, 2026 7:16pm UTC

@Jeston10
Jeston10 merged commit 9fc2551 into main Sep 15, 2026
10 of 11 checks passed

This branch had an error being deployed

1 failed deployment
Preview — d91bd89b Deployed Sep 15, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants