Implementation Status
Audit of all product specs against the actual codebase as of April 2026. Each feature is marked as implemented, partially implemented, or not yet implemented.
Surveys (Core)
| Feature | Status | Notes |
|---|---|---|
| Create survey with questions | Done | POST /surveys with inline questions |
| Survey types: BOOLEAN, TEXT, RATING, MULTIPLE_CHOICE | Done | All 4 types work |
| Survey statuses: DRAFT, PUBLISHED, CLOSED | Done | Status transitions enforced |
| Public survey link (public_id) | Done | GET /surveys/public/{publicId} |
| Survey sharing page with copy link + QR code | Done | SurveySharePage |
| Survey preview (read-only) | Done | SurveyPreviewPage |
| Delete survey (cascades to questions + responses) | Done | DELETE /surveys/{id} |
| Question immutability when responses exist | Done | 409 on add/delete; DELETE /responses to unlock |
| Require email from respondents | Done | Backend enforced (422 if missing) |
| Survey builder v2 (two-panel layout) | Done | Question outline + editor, group management |
| Admin test mode (take without saving) | Done | AdminTestPage, client-side scoring |
Question Groups & Structured Assessments
| Feature | Status | Notes |
|---|---|---|
| QuestionGroup model (id, name, order, color, description) | Done | Embedded in survey document |
| Question group_id, weight, rating_labels | Done | Per-question fields |
| Result types: flat, pyramid, radar, breakdown | Done | result_type on survey |
| Group scoring aggregation | Done | aggregate_group_scores in scoring.py |
| Group-per-page survey taking | Done | SurveyTakePage switches on question_groups |
| Pyramid visualization | Done | PyramidVisualization component |
| Radar visualization | Done | RadarVisualization component |
| Grouped breakdown visualization | Done | GroupedBreakdown component |
| Survey templates (maslow-needs-v1) | Done | Template catalog + create-from-template endpoint |
| Team Health Check template | Not done | Template data not created yet |
| Program Impact Baseline template | Not done | Template data not created yet |
Scoring
| Feature | Status | Notes |
|---|---|---|
| direct_scale scoring | Done | (rating / max) * weight |
| binary scoring | Done | true_value / false_value |
| weighted_options scoring | Done | Per-option point values |
| multi_select_sum scoring | Not done | Model exists, no implementation |
| qualitative (no scoring) | Done | Text questions excluded from scoring |
| Question weight multiplier | Done | weight field on questions |
| Per-question scoring config | Done | scoring_config stored per question |
| Score on response submission | Done | Auto-calculated server-side |
| Score breakdown per question | Done | score_breakdown in response |
Impact Comparison
| Feature | Status | Notes |
|---|---|---|
| First attempt vs latest attempt comparison | Done | GET /surveys/{id}/impact |
| Per-respondent delta calculation | Done | Baseline vs latest scores |
| Per-question delta with direction (improved/declined/unchanged) | Done | Direction classification |
| Aggregate org-level stats | Done | Average baseline, latest, delta |
| Auto-generated summary text | Done | Human-readable narrative |
| Impact report page (frontend) | Done | ImpactReportPage with bar charts |
| Respondents with 1 attempt excluded | Done | Only multi-attempt respondents |
Organizations
| Feature | Status | Notes |
|---|---|---|
| Create/update/delete organization | Done | Full CRUD |
| Role hierarchy: OWNER, ADMIN, MEMBER | Done | Enforced at route level |
| Invite members via email | Done | Creates invitation with token |
| Accept invitation (with token) | Done | AcceptInvitationPage |
| Cancel/resend invitations | Done | Delete and resend endpoints |
| Member role management | Done | Owner can change roles |
| Remove members (cannot remove OWNER) | Done | Enforced |
| Organization detail page with tabs | Done | Members, Surveys, Invitations tabs |
| Org-scoped survey listing | Done | Surveys filtered by org |
| Bulk invite (multiple emails) | Partial | API supports it, no CSV upload UI |
| Organization settings (timezone, locale) | Model only | Settings model exists, no UI |
| Organization logo/branding | Not done | |
| Department/team tags | Not done | |
| Data export (CSV/PDF) | Not done |
Survey Assignments
| Feature | Status | Notes |
|---|---|---|
| Assign members to surveys (bulk) | Done | POST /assign with member_ids |
| Unassign member | Done | DELETE /assign/{member_id} |
| Assignment status tracking (PENDING/COMPLETED/OVERDUE/WAIVED) | Done | Status field on assignment |
| My assignments on dashboard | Done | GET /me/assignments |
| Overdue assignments view | Done | GET /organizations/{id}/overdue |
| Extend due date | Done | POST /extend with days |
| Waive assignment | Done | POST /waive |
| Send manual reminder | Done | POST /remind |
| Assignment auto-update on response submission | Done | Status set to COMPLETED |
| Recurrence auto-reset after completion | Done | next_due_date calculated |
Sessions & Multi-Attempt
| Feature | Status | Notes |
|---|---|---|
| Start session (creates attempt) | Done | POST /sessions/start |
| Auto-save progress | Done | PUT /sessions/{id}/save |
| Complete session (creates response) | Done | POST /sessions/{id}/complete |
| Abandon session | Done | POST /sessions/{id}/abandon |
| Session history per survey | Done | GET /surveys/{id}/sessions |
| Resume in-progress session | Done | can_resume check (24h window) |
| Attempt numbering (sequential) | Done | attempt_number field |
| Check if user can attempt | Done | GET /surveys/{id}/can-attempt |
| Session stats | Done | GET /surveys/{id}/sessions/stats |
| Time tracking (time_spent_seconds) | Done | Tracked per session |
| Progress percentage | Done | calculate_progress method |
| LocalStorage auto-save fallback (frontend) | Done | SurveyTakePage |
| Side-by-side attempt comparison | Not done | Model exists, no UI |
Reminders & Notifications
| Feature | Status | Notes |
|---|---|---|
| Reminder engine (background loop) | Done | Runs every 60s, checks due assignments |
| 3-level escalating reminders | Done | Based on survey reminder_intervals |
| OVERDUE flagging after all reminders sent | Done | Status set to OVERDUE |
| Notification preferences (email toggle, frequency) | Done | GET/PUT /notifications/preferences |
| Quiet hours with timezone | Done | Preferences model + engine respects them |
| Per-survey mute/unmute | Done | POST /mute-survey, /unmute-survey |
| One-click unsubscribe (no auth) | Done | GET /unsubscribe?token= |
| Email templates (verification, invitation, reset, reminder) | Done | 4 HTML templates |
| Manual reminder sending (admin) | Done | POST /remind on assignment |
| Incomplete survey reminders (drip for in-progress) | Not done | Only assignment-based reminders exist |
Authentication
| Feature | Status | Notes |
|---|---|---|
| Email/password registration | Done | With password validation |
| Email/password login (JWT) | Done | Returns access_token |
| Google OAuth | Done | Full flow with callback |
| Email verification | Done | Sends verification email, verifies token |
| Forgot/reset password | Done | Token-based flow |
| Session tokens (Redis) | Done | Dual auth (JWT + session) |
| Protected routes (frontend) | Done | ProtectedRoute wrapper |
Dashboard
| Feature | Status | Notes |
|---|---|---|
| Stats cards (surveys, responses, members, avg impact) | Done | GET /dashboard/stats |
| Recent surveys list | Done | Top 10 with status/count |
| My organizations list | Done | With member count and role |
| My assigned surveys | Done | From assignments API |
| Organization analytics (aggregate scores, trends) | Not done | |
| Export reports (CSV/PDF) | Not done |
Multi-Language (i18n)
| Feature | Status | Notes |
|---|---|---|
| Platform UI translation | Not done | Spec exists (multi-language.md) |
| Survey content translation | Not done | Translation fields spec'd |
| AI translation agent | Not done | |
| RTL support | Not done | |
| Language picker | Not done |
Features Not Yet Started
These are spec'd but have zero implementation:
- Campaign system (model exists, no routes)
- Contact management in orgs (model exists, no routes)
- Conditional question logic (show/hide based on answers)
- Advanced user profiles (avatar, bio, department, job_title)
- Account lockout/security (failed attempts tracking)
- Gamification (streaks, badges, leaderboards)
- Offline capability
- Push notifications
- Calendar integration
- SSO (Okta, Auth0)
- Subscription tiers / billing
- Global Happiness Index / country benchmarking
Summary
| Category | Done | Partial | Not Done |
|---|---|---|---|
| Surveys (core) | 11 | 0 | 0 |
| Groups & Assessments | 9 | 0 | 2 |
| Scoring | 7 | 0 | 1 |
| Impact Comparison | 7 | 0 | 0 |
| Organizations | 10 | 1 | 3 |
| Assignments | 10 | 0 | 0 |
| Sessions | 12 | 0 | 1 |
| Reminders | 9 | 0 | 1 |
| Auth | 7 | 0 | 0 |
| Dashboard | 4 | 0 | 2 |
| Multi-Language | 0 | 0 | 5 |
| Total | 86 | 1 | 15 |