Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 11 additions & 8 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,25 +17,28 @@
|-------|-----------|-------|
| **Framework** | Next.js 16.1.1 (App Router) | Standalone output |
| **Runtime** | Bun | Package management + scripts |
| **Database** | Prisma v6 + SQLite (dev) / PostgreSQL (prod) | Local dev uses SQLite |
| **Database** | Prisma v6 + PostgreSQL | PostgreSQL only (no SQLite) |
| **Auth** | JWT (jose v6) + HttpOnly cookies + localStorage client cache | Custom |
| **UI** | Tailwind CSS v4 | Custom glass design system |
| **UI** | Tailwind CSS v4 | "Field Manual" light design system |
| **Icons** | Phosphor Icons (light weight) | No thick-stroked icons |
| **Animation** | Framer Motion v12 | Scroll reveals, stagger, hover physics |
| **Fonts** | Space Grotesk (headings) + Plus Jakarta Sans (body) | No Inter/Roboto |
| **AI** | Z AI Web Dev SDK | Coaching, scoring, content generation |
| **Export** | docx, PDF (pdfkit), Excel (exceljs) | Resource downloads |
| **Testing** | Vitest | unit + API + component tests |

## Design System — Ethereal Glass
## Design System — "Field Manual" (light theme)

> NOTE: The "Ethereal Glass" dark design previously described here was reverted. The live app uses the light "Field Manual" system below.

| Element | Spec |
|---------|------|
| **Background** | OLED black (`#050505`) with radial gradient orbs |
| **Cards** | Glass-morphism with `backdrop-blur-xl` |
| **Accents** | Indigo/violet, emerald (success), amber (warning), rose (danger) |
| **Motion** | Custom cubic-bezier: `ease-premium`, `ease-spring`, `ease-out-heavy` |
| **Components** | Double-bezel glass cards, pill CTAs with trailing icon pattern |
| **Background** | Warm off-white (`#FAFAF7`) with subtle grain/border texture |
| **Cards** | `FieldCard` — solid surface, thin border, soft shadow, no glass blur |
| **Accents** | Primary orange (`#FF6B35`), ink scale for text, emerald (success), amber (warning), rose (danger) |
| **Motion** | Framer Motion scroll reveals, stagger, hover physics (no custom cubic-beziers) |
| **Components** | `FieldButton` (variants: default/outline/ghost), `FieldCard`, `FieldBadge`, `Alert` |
| **Tokens** | Defined in `globals.css` + Tailwind config (CSS variables, not arbitrary values) |

## Code Organization

Expand Down
133 changes: 133 additions & 0 deletions FIX-PLAN.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
# Interview Lab — Thorough Fix Plan

> Audited 2026-07-19. A sequenced, merge-ready plan. Each phase: **goal → files → changes → verification**.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Use a non-future audit date.

Line [3] says Audited 2026-07-19, but the current date is July 18, 2026. Use the actual audit date to avoid claiming verification occurred tomorrow.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@FIX-PLAN.md` at line 3, Update the audit date in FIX-PLAN.md from the future
date to the actual current audit date, July 18, 2026, while preserving the
surrounding plan text.

> Phases are independently shippable; **Phase 0 must land first**.

---

## Phase 0 — Reconcile Reality & Delete Dead Code
*Why first: docs/architecture are wrong. Fix the map before the journey.*

### 0.1 Documentation truth-up
**Files:** `AGENTS.md`, `README.md`, `REDESIGN-PLAN.md`, `REMEDIATION_PLAN.md`, `docs/architecture.md`
- Rewrite AGENTS.md "Design System" section: replace *"Ethereal Glass / OLED black / sky `#007EFF`"* with the live **"Field Manual" light theme** (`#FAFAF7` bg, `#FF6B35` accent, `FieldCard`/`FieldButton`).
- README Tech Stack: change `UI` row to "Tailwind v4 + Field Manual design system"; fix `Export` row ("pdfkit" → "pdfkit + manual PDF builder" or remove pdfkit after Phase 3).

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Resolve the PDF implementation contradiction.

Line [14] permits documenting “pdfkit + manual PDF builder,” while Lines [66-68] plan to replace the hand-rolled builder with pdfkit. State one final implementation in the README plan—preferably pdfkit if Phase 2 removes the manual builder.

Also applies to: 66-68

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@FIX-PLAN.md` at line 14, Resolve the PDF implementation contradiction across
the README Tech Stack “Export” row and the Phase 2 plan at lines 66-68 by
selecting one final approach. If Phase 2 removes the manual PDF builder,
document only pdfkit consistently; otherwise update both sections to
consistently retain the manual builder alongside pdfkit.

- `REMEDIATION_PLAN.md`: delete false claim that `downloads/[id]/route.ts` is 879 lines (it's 53).
- Mark `REDESIGN-PLAN.md` as **superseded** (glass redesign was reverted) — or delete it.

### 0.2 Delete dead code
| File | Reason |
|------|--------|
| `src/lib/browser-llm-integration.ts` (338 lines) | Not imported anywhere; fake rule-based AI |
| `src/components/interview-lab/UpgradeModal.tsx` | Stub, no-op |
| `src/components/interview-lab/SubscriptionBanner.tsx` | Stub, no-op |
| `src/lib/pricing.ts` (tier config) — *optional* | Only powers stubs; keep if PricingPage ever real |
Comment on lines +19 to +24

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Add the required blank line before the table.

markdownlint-cli2 reports MD058 at Line 19. Insert a blank line between the explanatory paragraph and the Phase 0 table.

🧰 Tools
🪛 markdownlint-cli2 (0.23.0)

[warning] 19-19: Tables should be surrounded by blank lines

(MD058, blanks-around-tables)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@FIX-PLAN.md` around lines 19 - 24, Insert a blank line between the
explanatory paragraph and the Phase 0 table in FIX-PLAN.md, immediately before
the table header, so the Markdown table satisfies MD058.

Source: Linters/SAST tools


**Verify:** `grep -r "browser-llm-integration\|UpgradeModal\|SubscriptionBanner" src` → no results; `bun run build` passes.
Comment on lines +21 to +26

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Align the pricing cleanup with the stated Phase 0 objective.

The PR objective says four files are removed, including pricing.ts, but Line [24] makes that deletion optional and Line [26] does not verify it. Decide whether pricing.ts is deleted, then update the file list, rationale, and grep command consistently.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@FIX-PLAN.md` around lines 21 - 26, Resolve the Phase 0 cleanup scope for
src/lib/pricing.ts instead of marking it optional. If it is part of the
deletion, update the file list and rationale to state that clearly and include
pricing.ts in the grep verification; otherwise revise the stated objective and
all related cleanup documentation to exclude it consistently.


---

## Phase 1 — SOLID: AI Layer Refactor (SRP + OCP + DIP)
*Highest leverage: 4 routes share ~75-line duplicated JSON-extract loop, each calls the SDK directly.*

### 1.1 `src/lib/ai/client.ts` — AIProvider abstraction (DIP)
```ts
export interface AIProvider {
complete(system: string, user: string, opts?: { schema?: ZodSchema; signal?: AbortSignal }): Promise<unknown>;
}
export class ZAIProvider implements AIProvider { /* timeout 30s, abort, retry-once */ }
export const ai: AIProvider = new ZAIProvider();
```
- Add `AbortSignal.timeout(30000)` + `try/catch` around `ZAI.create().chat.completions.create`.

### 1.2 `src/lib/ai/handlers.ts` — `createAIHandler` factory (OCP)
```ts
export function createAIHandler<T>(buildPrompt, schema: ZodSchema<T>) {
return async (req) => { /* auth → call ai.complete with schema → validate → return */ };
}
```
- Centralize `extractJsonArray`/`extractJsonObject` parsing into tested util `src/lib/ai/json.ts`.

### 1.3 Split routes
- `src/lib/ai/coach.ts`, `resume.ts`, `cover-letter.ts`, `assessment.ts` — each exports `buildPrompt()` + a zod `schema`.
- Refactor `src/app/api/ai/{coach,resume-review,cover-letter,assessment-score}/route.ts` to ~15 lines each calling `createAIHandler`.

### 1.4 Add zod schemas
- `src/lib/ai/schemas.ts`: `CoachFeedbackSchema`, `ResumeReviewSchema`, `CoverLetterSchema`, `AssessmentScoreSchema` (replaces runtime `as` casts).

**Verify:** `__tests__/ai/client.test.ts` (mock `z-ai-web-dev-sdk`), `handlers.test.ts` (valid + malformed JSON → 500), `bun run test`.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n== Relevant files ==\n'
git ls-files 'FIX-PLAN.md' 'src/app/api/ai/coach/route.ts' '__tests__/ai/client.test.ts' 'handlers.test.ts'

printf '\n== FIX-PLAN.md excerpt ==\n'
nl -ba FIX-PLAN.md | sed -n '45,70p'

printf '\n== route.ts excerpt ==\n'
nl -ba src/app/api/ai/coach/route.ts | sed -n '1,220p'

printf '\n== Search for JSON parsing / fallback / HTTP 500 ==\n'
rg -n "JSON.parse|fallback feedback|return NextResponse\.json|status:\s*500|malformed|coach" src __tests__ FIX-PLAN.md

Repository: projectamazonph/Interview-lab

Length of output: 298


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n== FIX-PLAN.md excerpt ==\n'
sed -n '45,70p' FIX-PLAN.md | cat -n

printf '\n== route.ts excerpt ==\n'
sed -n '1,220p' src/app/api/ai/coach/route.ts | cat -n

printf '\n== Search for related tests and behavior ==\n'
rg -n "JSON.parse|fallback feedback|return NextResponse\.json|status:\s*500|malformed|coach" src __tests__ FIX-PLAN.md || true

printf '\n== Find test files ==\n'
fd -a 'client.test.ts|handlers.test.ts' . || true

Repository: projectamazonph/Interview-lab

Length of output: 42809


Preserve the AI coach malformed-response contract.
src/app/api/ai/coach/route.ts still falls back to synthetic feedback and returns 200 on invalid model JSON. If this plan is meant to switch that endpoint to 500, update the callers and API docs together; otherwise keep the test aligned with the current behavior.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@FIX-PLAN.md` at line 58, Clarify the plan’s intended malformed-response
contract for the AI coach endpoint: either update src/app/api/ai/coach/route.ts,
its callers, and API documentation so invalid model JSON returns 500 instead of
synthetic feedback, or revise the planned handlers.test.ts expectation to
preserve the current 200 response behavior.


---

## Phase 2 — SOLID: Export Layer (SRP)
### 2.1 `src/lib/export/docx.ts`
- Move `generateDocx` out of `export/route.ts` into its own module.

### 2.2 `src/lib/export/pdf.ts` — replace hand-rolled byte builder
- Use already-installed `pdfkit` (currently unused). Fixes **silent truncation** (`if (y < 50) break`) by paginating.
- Add `content` size guard (reject > 50k chars) to prevent abuse.

### 2.3 `src/app/api/export/route.ts`
- Becomes ~12 lines: auth → dispatch to `docx.ts` / `pdf.ts`.

**Verify:** `export.test.ts` generates real .docx/.pdf, asserts multi-page content isn't truncated.

---

## Phase 3 — SOLID: Entitlement Honesty (LSP)
### 3.1 `src/lib/subscription/entitlement.ts`
```ts
export interface EntitlementService { canAccess(feature): boolean; tier: string; }
export class FreeEntitlement implements EntitlementService { canAccess() { return true; } }
```
- `subscription-guard.ts` returns real interface; `use-subscription.ts` returns `FreeEntitlement` honestly (remove fake `-1`/no-op that *implies* gating).

**Verify:** `subscription.test.ts`.

---

## Phase 4 — Component Decomposition (SRP)
### 4.1 `MockInterview.tsx` (618 →)
`src/components/interview-lab/mock-interview/{Setup,ActiveSession,Complete,useInterview}.tsx`

### 4.2 Standardize error/empty states
- `ResumeLab` raw red `<div>` → `Alert` component (already built in `ui/`).
- Add skeletons to `MockInterview`/`ResumeLab` to match `DashboardView`.

### 4.3 A11y fix
- `QuestionBank`: remove nested interactive (inner "Practice" button inside `role="button"` div) → make card a real `<article>` with a separate button.

**Verify:** `bun run lint`, component render tests.

---

## Phase 5 — Infra & Correctness
### 5.1 Rate limiter (`middleware.ts`)
- Replace in-memory `Map` with **Upstash Redis** (`@upstash/ratelimit`) so it works across Vercel serverless.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

sed -n '90,120p' FIX-PLAN.md

Repository: projectamazonph/Interview-lab

Length of output: 1324


🏁 Script executed:

rg -n "Upstash|ratelimit|dependency decision|50-line|custom solution|existing dependency|Vercel serverless|rate limiter" FIX-PLAN.md README.md docs .github . 2>/dev/null

Repository: projectamazonph/Interview-lab

Length of output: 781


Document the rate-limiter dependency choice. Add a short rationale for choosing @upstash/ratelimit over a small custom limiter or an existing dependency.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@FIX-PLAN.md` at line 106, Update the rate-limiter replacement entry in
FIX-PLAN.md to add a concise rationale for choosing `@upstash/ratelimit`,
explicitly contrasting its shared Vercel-compatible Redis state with a custom
limiter or existing dependency. Keep the change limited to documenting this
dependency choice.

Source: Coding guidelines

- Trust `x-forwarded-for` only behind Vercel proxy; add `x-vercel-ip` fallback.

### 5.2 Font drift (`globals.css`)
- `JetBrains Mono`/`Inter` declared but unused → align to Space Grotesk + Plus Jakarta Sans (per spec) or update spec.

### 5.3 `db.ts`
- Gate `log: ['query']` behind explicit `LOG_QUERIES=1` env (confirm off in prod).

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Document LOG_QUERIES as a new environment variable.

Specify the documentation location, expected default, and production-safe value for LOG_QUERIES=1; every new environment variable must be documented.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@FIX-PLAN.md` at line 113, Update FIX-PLAN.md to document LOG_QUERIES as a new
environment variable, including where its configuration should be documented,
its default behavior, and the production-safe value for LOG_QUERIES=1. Ensure
the plan explicitly states that query logging is disabled by default and remains
off in production.

Source: Coding guidelines


---

## Effort & Sequencing

| Phase | Work | Est. | Risk |
|-------|------|------|------|
| 0 | Doc truth-up + dead-code deletion | 1 day | 🟢 none |
| 1 | AI layer SOLID refactor + zod | 4 days | 🟡 medium (test coverage needed) |
| 2 | Export layer split + pdfkit | 1 day | 🟡 medium |
| 3 | Entitlement honesty | 1 day | 🟢 low |
| 4 | Component decomposition + UI polish | 4 days | 🟡 medium |
| 5 | Rate limiter + fonts + db | 2 days | 🟡 medium |

**Total: ~13 dev-days.** Phases are independently shippable; Phase 0 must land first.

---

## Suggested first PR
**"Phase 0: Reconcile docs & remove dead code"** — smallest diff, zero behavioral risk, unblocks everything.
41 changes: 20 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,14 @@ for aspiring Amazon Virtual Assistants.
| Layer | Technology |
|-------|-----------|
| **Framework** | Next.js 16.1.1 (App Router, standalone) |
| **Runtime** | Bun |
| **Database** | Prisma v6 + SQLite (dev) / PostgreSQL (prod) |
| **Runtime** | Bun (CI uses npm) |
| **Database** | Prisma v6 + PostgreSQL (PostgreSQL only) |
| **Auth** | Custom JWT sessions (jose) + HttpOnly cookies |
| **UI** | Tailwind CSS v4 + custom glass design system |
| **UI** | Tailwind CSS v4 + "Field Manual" light design system |
| **Icons** | Phosphor Icons (light weight) |
| **Fonts** | Space Grotesk (headings) + Plus Jakarta Sans (body) |
| **AI** | Z AI Web Dev SDK for coaching, scoring, content generation |
| **Export** | docx, PDF (pdfkit), Excel (exceljs) |
| **Export** | docx, PDF (manual builder / pdfkit), Excel (exceljs) |

## 🚀 Getting Started

Expand Down Expand Up @@ -90,7 +90,7 @@ src/
│ │ ├── assessments/ # Practice test assessments
│ │ ├── profile/ # User profile (GET/PUT)
│ │ ├── dashboard/ # Dashboard aggregation
│ │ ├── subscription/ # Checkout, status, usage, webhook
│ │ ├── subscription/ # Removed (product is free)
│ │ ├── resume/ # Resume upload + AI review
│ │ ├── cover-letter/ # Cover letter generation
│ │ ├── ai/ # AI endpoints (coach, scoring, resume, cover)
Expand All @@ -100,17 +100,17 @@ src/
│ │ └── export/ # DOCX/PDF/Excel export
│ └── [pages]/ # Page routes
├── components/
│ ├── interview-lab/ # Page components (glass design system)
│ └── ui/ # Shared primitives (glass-card, glass-button, etc.)
│ ├── interview-lab/ # Page components (Field Manual design system)
│ └── ui/ # Shared primitives (field-card, field-button, etc.)
├── lib/
│ ├── auth-helpers.ts # Server-side JWT + header auth
│ ├── pricing.ts # Tier configs (Free/Starter/Pro) and limits
│ ├── subscription-guard.ts # Feature access checks per tier
│ ├── pricing.ts # Tier configs (currently unused — product is free)
│ ├── subscription-guard.ts # Feature access checks (returns allowed: true)
Comment on lines 105 to +108

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Keep all cleanup documentation consistent with the deleted pricing module.

The PR removes src/lib/pricing.ts, but both documentation surfaces still describe it as present or optionally retained.

  • README.md#L105-L108: remove the deleted pricing.ts entry from the project structure.
  • FIX-PLAN.md#L18-L26: mark pricing.ts as deleted and include it in the Phase 0 verification command.
📍 Affects 2 files
  • README.md#L105-L108 (this comment)
  • FIX-PLAN.md#L18-L26
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README.md` around lines 105 - 108, Remove the deleted pricing.ts entry from
the project structure in README.md. In FIX-PLAN.md, mark pricing.ts as deleted
and add it to the Phase 0 verification command; update both documented locations
consistently.

│ ├── types.ts # TypeScript interfaces
│ └── utils.ts # cn() utility
└── hooks/ # Custom React hooks

prisma/ # Prisma schema (SQLite/PostgreSQL)
prisma/ # Prisma schema (PostgreSQL)
__tests__/ # Test suites
├── api/ # API route unit tests (218 tests)
│ ├── interview-session.test.ts
Expand All @@ -133,7 +133,7 @@ docs/ # PRD, architecture, feature specs
bun test

# Run specific test file
bun test __tests__/api/subscription.test.ts
bun test __tests__/api/resume-coverletter.test.ts

# Run API tests only
bun test __tests__/api/
Expand All @@ -149,9 +149,8 @@ bun test __tests__/api/
| `auth-login.test.ts` | 26 | Login flow, rate limiting, session, email sanitization |
| `assessments.test.ts` | 20 | Assessment list/get/submit, answer key stripping |
| `profile-dashboard.test.ts` | 23 | Profile whitelisting, sanitization, dashboard stats |
| `subscription.test.ts` | 31 | Pricing logic, checkout, tier validation, payments |
| `resume-coverletter.test.ts` | 25 | Resume CRUD, cover-letter tones, truth flags |
| **Total** | **218** | **All API routes, all green** |
| **Total** | **187** | **All API routes, all green** |
Comment thread
coderabbitai[bot] marked this conversation as resolved.

Tests use in-memory stubs — no database or server required.

Expand All @@ -161,27 +160,27 @@ Tests use in-memory stubs — no database or server required.
|---------|-------------|
| `bun run dev` | Dev server with logging |
| `bun run build` | Production build (standalone) |
| `bun run db:push` | Push Prisma schema to SQLite |
| `bun run db:push` | Push Prisma schema to PostgreSQL |
| `bun run db:generate` | Generate Prisma client |
| `bun run test` | Run test suite |
| `bun run lint` | ESLint check |

## 🎨 Design System — Ethereal Glass
## 🎨 Design System — "Field Manual" (light theme)

The app uses a premium dark-mode glass aesthetic:
> The earlier "Ethereal Glass" dark design was reverted. The live app uses a clean light "Field Manual" system.

- **Palette:** OLED black (`#050505`) with radial gradient orbs, glass-morphism cards, `backdrop-blur-xl`
- **Colors:** Indigo/violet accents, emerald success, amber warnings, rose danger
- **Motion:** Custom cubic-bezier curves, Framer Motion scroll reveals, staggered animations
- **Components:** Double-bezel glass cards, pill CTAs, glass inputs/badges
- **Palette:** Warm off-white (`#FAFAF7`) with subtle grain/border texture, primary orange (`#FF6B35`) accents
- **Colors:** Ink scale for text, emerald success, amber warnings, rose danger
- **Motion:** Framer Motion scroll reveals, stagger, hover physics (no custom cubic-beziers)
- **Components:** `FieldCard` (solid surface, thin border, soft shadow), `FieldButton` (default/outline/ghost), `FieldBadge`, `Alert`
Comment thread
coderabbitai[bot] marked this conversation as resolved.
- **Icons:** Phosphor Icons in `weight="light"` — no thick-stroked icons
- **Typography:** Space Grotesk for headings, Plus Jakarta Sans for body

## 🔐 Environment Variables

| Variable | Description |
|----------|-------------|
| `DATABASE_URL` | SQLite connection string (`file:./dev.db`) or PostgreSQL URL |
| `DATABASE_URL` | PostgreSQL connection URL |
| `JWT_SECRET` | Secret for signing JWT session tokens |
| `NEXT_PUBLIC_APP_URL` | App base URL |

Expand Down
2 changes: 1 addition & 1 deletion REDESIGN-PLAN.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Redesign Plan — Interview Lab

> **Status:** All phases implemented. See git history for details.
> **Status:** SUPERSEDED. The "Ethereal Glass" dark design described here was reverted in favor of the live light "Field Manual" design system (see `AGENTS.md` Design System section). Kept for historical reference only.

## Design System — Ethereal Glass

Expand Down
6 changes: 3 additions & 3 deletions REMEDIATION_PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,8 @@ Interview Lab is a **free companion** to [Project Amazon PH Academy](https://pro
- Model assessment attempts properly (user, timestamps, answers, score, rubrics, status, AI version)

### P2.3 — Download route decomposition
**Files:** `src/app/api/downloads/[id]/route.ts` (879 lines)
**Problem:** Monolithic route handles auth, tier checks, 4 document formats, database access, and analytics.
**Files:** `src/app/api/downloads/[id]/route.ts` (53 lines — earlier "879-line" estimate was inaccurate)
**Problem:** Route handles auth, tier checks, multiple document formats, database access, and analytics.
**Fix:**
- Extract document builders: `src/lib/documents/pdf.ts`, `docx.ts`, `xlsx.ts`, `text.ts`
- Extract template renderers: `src/lib/templates/amazon-training.ts`
Expand All @@ -112,7 +112,7 @@ Interview Lab is a **free companion** to [Project Amazon PH Academy](https://pro
- Add browser tests for critical user journeys

### P2.6 — Operational documentation
**Problem:** README documents Bun runtime but CI uses npm; describes SQLite but schema is PostgreSQL; no standalone output config.
**Problem:** README previously documented Bun runtime but CI uses npm; described SQLite but schema is PostgreSQL. (README corrected 2026-07-19; standalone output already in `next.config.ts`.)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Fix the future-dated README correction.

This document says the README was corrected on July 19, 2026, but the current date is July 18, 2026. Use the actual update date or omit the date to keep the audit chronology accurate.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@REMEDIATION_PLAN.md` at line 115, Update the README correction note in the
remediation plan to remove the future-dated July 19, 2026 reference or replace
it with the actual update date, preserving the existing description of the
Bun/npm, SQLite/PostgreSQL, and next.config.ts corrections.

**Fix:**
- Standardize on one package manager (npm, given CI/Vercel use it)
- Update README to reflect PostgreSQL-only schema
Expand Down
Loading
Loading