Files
Kontia/prog.md
Marcelo Dares 65aaf9275e initial push
2026-03-15 15:03:56 +01:00

312 lines
9.3 KiB
Markdown

# PROG.md
## 1) Current Project Status
This project now implements **Phases 1 through 7** fully, and includes key **Phase 8 QA/polish updates**:
- Next.js App Router + TypeScript + Tailwind + npm
- Prisma + Postgres schema + seed
- Real email/password auth + verification token + session cookie + logout
- Onboarding wizard persisted to `Organization`
- Diagnostic engine with DB questions, autosave, and resume
- Scoring engine persisted to `AssessmentResult`
- Results and Dashboard fed from computed DB scores (not mock data)
- Recommendations generated from low-scoring modules
- Manual/FAQ loaded from `ContentPage` in DB
- Added global loading and error UI states
- Added baseline tests for scoring and session-token logic
Validation currently passes:
- `npm test`
- `npm run lint`
- `npx prisma validate`
- `npm run build`
---
## 2) What Was Implemented (Phase-by-Phase)
### Phase 1: Scaffold + UI shell
Implemented in:
- `src/components/ui/*`
- `src/components/app/page-shell.tsx`
- route pages under `src/app/*`
Delivered:
- Custom UI kit (`Button`, `Card`, `Input`, `Label`, `Badge`, `Progress`, `Tabs`, `Dialog`, `Accordion`, `Stepper`)
- Shell styling (light gray background, card layout, navy buttons, success greens)
- Static versions of all required routes
### Phase 2: Prisma + schema + seed
Implemented in:
- `prisma/schema.prisma`
- `prisma/seed.mjs`
- `src/lib/prisma.ts`
- `src/app/dev/db/page.tsx`
Delivered:
- Full data model (`User`, `Organization`, `DiagnosticModule`, `Question`, `AnswerOption`, `Response`, `AssessmentResult`, `Recommendation`, `ContentPage`, `EmailVerificationToken`)
- Seed script for modules/questions/options/recommendations/manual+faq
- Dev DB viewer route
### Phase 3: Auth + email verification + session gating
Implemented in:
- `src/lib/auth/*`
- `src/app/api/auth/*`
- `src/app/register/page.tsx`
- `src/app/login/page.tsx`
- `src/app/verify/page.tsx`
- `src/components/app/page-shell.tsx`
Delivered:
- Signup/login with password hashing
- Verification token issue/consume flow
- Dev verification link logging in server console
- Signed HttpOnly session cookie
- Route protection and logout
### Phase 4: Onboarding persistence
Implemented in:
- `src/components/app/onboarding-wizard.tsx`
- `src/app/onboarding/page.tsx`
- `src/app/api/onboarding/route.ts`
- `src/lib/auth/user.ts`
Delivered:
- Multi-step onboarding wizard
- Persist/upsert to `Organization` linked to authenticated user
- Redirect to `/diagnostic` after successful onboarding
- Gating so non-onboarded users are redirected to `/onboarding`
### Phase 5: Diagnostic engine
Implemented in:
- `src/lib/diagnostic.ts`
- `src/app/diagnostic/page.tsx`
- `src/app/diagnostic/[moduleId]/page.tsx`
- `src/components/app/module-questionnaire.tsx`
- `src/app/api/diagnostic/response/route.ts`
Delivered:
- DB-driven module list and progress metrics
- Resume links by module/question index
- Per-question autosave into `Response`
- Next/back navigation + save-and-exit + resume
### Phase 6: Scoring + Results + Dashboard
Implemented in:
- `src/lib/scoring.ts`
- `src/lib/scoring-core.ts`
- `src/app/results/page.tsx`
- `src/app/dashboard/page.tsx`
- `src/components/app/dashboard-view.tsx`
Delivered:
- Recompute module and overall scores from response weights
- Persist module and overall snapshots in `AssessmentResult`
- Results page with global score and strengths/weaknesses
- Dashboard page with progress/bars/radar + module status detail
### Phase 7: Recommendations + Manual/FAQ
Implemented in:
- `src/lib/recommendations.ts`
- `src/lib/content-pages.ts`
- `src/app/recommendations/page.tsx`
- `src/app/manual/page.tsx`
Delivered:
- Recommendations generated from low-scoring modules
- Manual and FAQ loaded from DB `ContentPage`
- Download report placeholder button on recommendations
### Phase 8 (partial but substantive): QA/polish
Implemented in:
- `src/app/loading.tsx`
- `src/app/error.tsx`
- tests under `src/lib/__tests__/*`
- `vitest.config.ts`
Delivered:
- Global loading state
- Global error boundary UI
- Unit tests for scoring core and session-token logic
---
## 3) Assumptions Made
1. **Email delivery in development**: verification is valid if token links are logged to server console (real SMTP not required yet).
2. **Scoring model**:
- Module score normalized by answered questions only (selected weight / max possible for answered questions).
- Overall score computed as equal-weight average across modules.
3. **Recommendation model**:
- Primary recommendations come from low-scoring modules (`score < 70`) with answered questions.
- Fallback to global (`moduleId = null`) recommendations if no module-targeted suggestions apply.
4. **Onboarding gating**:
- Users must be authenticated and onboarded to access diagnostic/results/dashboard/recommendations/manual.
5. **Data availability**:
- Seed data provides required baseline modules/questions/options/manual/recommendations.
---
## 4) How to Modify Logic / Implement New Specs
### A) Change scoring formula
Primary files:
- `src/lib/scoring-core.ts`
- `src/lib/scoring.ts`
What to change:
- Update `computeAssessmentSnapshot(...)` for new formulas (weighted modules, penalties, thresholds, etc.)
- Keep DB persistence in `recomputeAssessmentResults(...)` synchronized with new output fields
### B) Change low-score threshold or recommendation strategy
Primary file:
- `src/lib/recommendations.ts`
What to change:
- Modify filter condition (`moduleScore.score < 70`)
- Adjust ranking/prioritization and number of recommendations per module
- Add role/industry/context-aware filtering if needed
### C) Add onboarding fields
Primary files:
- `prisma/schema.prisma` (`Organization` model)
- `src/components/app/onboarding-wizard.tsx`
- `src/app/api/onboarding/route.ts`
What to change:
- Add DB columns + migrate
- Add step inputs/state
- Persist and validate in API route
### D) Add or modify diagnostic modules/questions/options
Primary file:
- `prisma/seed.mjs`
What to change:
- Add new module/question/option seed definitions (`key` values must be unique)
- Rerun migrate/seed
### E) Swap verification transport to real email provider
Primary files:
- `src/lib/auth/verification.ts`
- `src/app/api/auth/register/route.ts`
- `src/app/api/auth/login/route.ts`
- `src/app/api/auth/resend/route.ts`
What to change:
- Keep token generation/consumption as-is
- Replace console logging with provider API call (SES/SendGrid/Postmark)
### F) Customize dashboard charts and result blocks
Primary files:
- `src/components/app/dashboard-view.tsx`
- `src/components/app/module-bars-card.tsx`
- `src/components/app/radar-chart-card.tsx`
- `src/app/results/page.tsx`
What to change:
- Adjust chart labels, colors, ranges, and data mapping
- Add additional cards/insights from `AssessmentResult` or response-level analytics
### G) Session hardening
Primary files:
- `src/lib/auth/session-token.ts`
- `src/lib/auth/session.ts`
- `src/lib/auth/constants.ts`
What to change:
- Rotate `SESSION_SECRET`
- Add token versioning/invalidations
- Add shorter TTL + refresh logic
---
## 5) Full Diagnosis vs Original Plan (and Fixes Applied)
### Summary
The implementation now satisfies all required Phase 1-7 deliverables. The original gap found during this diagnosis was Phase 8 hardening depth (loading/error/test baseline), which has now been addressed.
### Detailed checklist
- Phase 1 scaffold + UI kit + static route shell: **Done**
- Phase 2 schema + seed + DB viewer: **Done**
- Phase 3 real auth + verify + session + logout: **Done**
- Phase 4 onboarding wizard + persistence + redirect: **Done**
- Phase 5 diagnostic autosave + resume + progress: **Done**
- Phase 6 scoring persistence + results + dashboard charts: **Done**
- Phase 7 recommendations from low scores + manual/faq from DB + report placeholder: **Done**
- Phase 8 required polish subset:
- consistency baseline: **Done**
- loading/empty/error states: **Done**
- validation/friendly errors baseline: **Done**
- optional tests: **Done (added baseline unit tests)**
### Differences discovered and fixed during this pass
1. **No baseline automated tests existed** -> Added Vitest + 5 unit tests:
- `src/lib/__tests__/scoring-core.test.ts`
- `src/lib/__tests__/session-token.test.ts`
2. **No global loading/error route states** -> Added:
- `src/app/loading.tsx`
- `src/app/error.tsx`
3. **Residual mock file not used** -> Removed:
- `src/lib/mock-data.ts`
---
## 6) Runbook
From ` /var/opt/assessment-app `:
1. Install deps:
- `npm install`
2. Generate Prisma client:
- `npm run prisma:generate`
3. Run migration(s):
- `npm run prisma:migrate -- --name init`
4. Seed data:
- `npm run prisma:seed`
5. Start app:
- `npm run dev`
6. Quality checks:
- `npm test`
- `npm run lint`
- `npm run build`
---
## 7) External Dependencies / Pending Inputs
- A working Postgres connection string is required in `.env`:
- `DATABASE_URL=...`
- Session secret should be set to a secure value in non-dev:
- `SESSION_SECRET=...`
- Email verification currently logs links in server console; production email delivery is not wired yet.
---
## 8) Suggested Next Implementation Targets
1. Add integration tests for register/login/verify and diagnostic autosave flow.
2. Add role-based access controls (admin/viewer) for organization scope.
3. Add report generation endpoint (PDF) behind the current placeholder button.
4. Add analytics/versioned scoring snapshots to compare improvements over time.