Roadmap & Todos

Structured backlog from stakeholder meetings (Mar 19-27, 2026) plus ongoing agent work through Apr 2, 2026. Each item includes implementation status verified against the codebase, with an agent verdict explaining what was found.

Summary

StatusCount
DONE99
PARTIAL9
TODO38
CANCELLED6
SUPERSEDED2
Total154

0. Other Changes Made

Work completed outside the original meeting notes. These items emerged from agent development sessions between Mar 27 – Apr 2, 2026.

StatusItemRouteSourceAgent Verdict
DONETelegram bot built (@NIVAAMainBot) — 21 commands, check-in/out, session changes, remindersTelegram docsAgent work Mar 27-29Full bot at workers_nivaa/src/telegram/bot.ts. Tutor commands: /sessions, /upcoming, /checkin, /checkout, /todos, /mystudents, /postings, /notes, /mypay. Coordinator: /dashboard, /alerts, /pending, /postingsqueue, /newapps, /lowpackages, /student, /tutor, /impersonate. See Telegram docs.
DONEAdmin impersonation via TelegramTelegram docsAgent work Mar 27Coordinators can /impersonate any tutor to view their session data. Stored in telegram_links.impersonating_tutor_id (migration 0022). See Telegram docs.
DONEMonthly billing cron removedBillingAgent work Mar 27Removed 10 0 1 * * from wrangler.toml. Billing is now manual via POST /billing/run-monthly. See Billing.
DONENicole Telegram linked (chat_id 6916064747)Telegram docsAgent work Mar 27Linked to user 19 ([email protected]) as Admin. All 3 coordinators now linked: Nicole, Sid, Bel. See Telegram docs.
DONEDocumentation site built (25 pages, JSON engine)/docsAgent work Mar 28-29JSON-driven docs at /docs. DocRenderer.svelte, 17 block types, 6 diagram types. DocLang spec at /docs/doclang.
DONEGantt chart removed from WIP page/docs/roadmapAgent work Mar 29Replaced with simple checklist + link to /docs/roadmap.
DONEInvoiceView component/admin/billing/invoicesAgent work Mar 30Professional invoice layout at /admin/billing/invoices. Pure CSS, INV-0687 design. Preview button per record.
DONEClickable route links in coordinator docstextAgent work Mar 30All 10 coordinator doc pages updated with text links to admin frontend routes. See Coordinator docs.
DONEMulti-step educator onboarding wizard/apply/onboardAgent work Mar 305-step guided flow: account creation, subjects, location, profile, review. Public page. Subject picker matches parent posting form.
DONEParent invoice preview (InvoiceView)/parent/billingAgent work Mar 30Same InvoiceView component as admin. Preview button per invoice on parent billing page.
DONEParent impersonation picker (family tree)/parentAgent work Mar 30Admin visiting /parent sees family tree dropdown with children metadata. View as Parent/Tutor links in admin sidebar.
DONETutor View My Public Profile link/tutor/profileAgent work Mar 30Button on tutor profile page links to /educator/{id} in new tab.
DONEDaily reminder pending notes bug fixTelegram docsAgent work Mar 28Fixed inverted ternary in reminders.ts — pending notes count was always 0. See Telegram docs.
DONE/lowpackages table fixTelegram docsAgent work Mar 28Fixed query: was using nonexistent packages table. Now uses package_ledgers with correct columns. See Telegram docs.
DONEDocs link in workspace sidebar/docsAgent work Mar 28All workspace sidebars (admin, tutor, parent) show "Docs" link at bottom via WorkspaceShell component. See /docs.
DONESSR auth — HttpOnly cookies + server hookshooks.server.tsAgent work Mar 30Backend sets HttpOnly cookies on login/register/refresh. Frontend hooks.server.ts validates on every request. Follows Ontologer pattern. Backward compatible with existing client-side auth.
DONEEducator public profile (SSR-gated)/educator/IDAgent work Mar 30Access-controlled profile at /educator/ID. SSR via +page.server.ts. Not indexable. NIVAA-branded layout with stats, experience, testimonials.
DONEInvoice preview component/admin/billing/invoicesAgent work Mar 30InvoiceView.svelte matching INV-0687 design. Inline preview at /admin/billing/invoices.
DONEClickable route links in all coordinator docstextAgent work Mar 30All 10 coordinator doc pages + roadmap updated with text links to admin pages.
DONEDemo account login with named role picker/loginAgent work Mar 30Login page has Demo Accounts section with 3 named buttons (Parent: Rachel Ng, Educator: Alex Tan, Coordinator: Bundle Coordinator). Uses POST /auth/demo-login. Sets HttpOnly cookies.
DONEParent insights scoped to own children only/parent/insightsAgent work Mar 30Backend already filtered by parent_user_id. Fix was in the login flow — admin impersonation was showing all data. Demo parent login now uses actual Parent role, sees only own children.
DONEAdmin sidebar restructure (Students→Sessions→Educators→Postings→Billing→Analytics)/adminBundle 10 Mar 30Flat nav. Removed People, Family Tree, standalone Insights. Postings top-level. Tickets under Billing.
DONEBreadcrumbs replaced with uppercase text path/adminBundle 10 Mar 30ADMIN \ STUDENTS \ NAME format. No clickable links. Platform logic pill removed.
DONEEducator Public Profile tab on tutor detail/admin/tutorsBundle 10 Mar 30EducatorProfile embedded as tab in admin tutor detail view.
DONEPlatform logic migrated to docs (6 pages)/docs/logic-sessionsBundle 10 Mar 30Sessions, billing, postings, students, educators, insights logic pages now in JSON docs engine.
DONEStudent detail direct child_id lookup fix/admin/studentsBundle 10 Mar 30Was scanning full list causing not-found for some children. Now uses ?child_id=N.
DONETutor detail cleanup (removed Flow column, fixed match display)/admin/tutorsBundle 10 Mar 30Match shows student name prominently. Match ID as small muted label.
DONEPosting detail status icons + profile links/admin/postingsBundle 10 Mar 30Colored icons per application status. Student/Parent/Educator linked to profiles.
DONEParent educator display pizzazz (first name, intro, pills)/parent/postingsBundle 10 Mar 30First name only, initials avatar, intro snippet, experience+special needs pills. Removed introductory call.
DONEAdd Parent/Educator buttons on respective admin pages/admin/studentsBundle 10 Mar 30Moved from deleted People page. Modal with form + Telegram link generation.
DONESessions calendar view toggle on admin/admin/appointmentsBundle 10 Mar 30Month grid with status-colored dots. Click day to see sessions.
DONECustom error pages — 404, 403, 401, 500/404Agent work Apr 2Root-level +error.svelte. Grey background, white card, large status code, icon (FileQuestion/ShieldAlert/LockKeyhole/AlertCircle), friendly message, Go Back + Home buttons. No more SvelteKit default error screen.
DONETutor visiting /parent now redirects to /tutor/parentAgent work Apr 2Parent layout onMount checks session role. Non-parent, non-admin users are redirected to their workspace before any API calls are made. Eliminates the 'you do not have permission' flash on wrong workspace.
DONESign out button fixed — clears session and redirects/loginAgent work Apr 2signOutFirebaseSession() was incorrectly setting useDevAuth: true after logout. Fixed to clear all session fields. TopNav now calls goto('/login') after sign out.
DONETutor profile personal fields made read-only/tutor/profileAgent work Apr 2Name, Gender, DOB, Contact Number, Address, Race are now static display labels (not form inputs). 'Contact your coordinator to update personal details' note added. Employment Type remains editable.
DONECoordinator approval gate on tutor postings/tutor/postingsAgent work Apr 2Backend: tutor postings access is now driven by the shared tutor-onboarding projection and only opens for approved tutors. Frontend shows normalized onboarding states instead of branching on legacy raw values.
DONEPending coordinator review page for unapproved tutors/tutorAgent work Apr 2All /tutor/* routes now consume the normalized tutor-onboarding projection. Non-approved tutors see invite/intake/review/rejected states instead of a single generic pending shell. Admins impersonating still bypass the gate.
DONEFont changed to Poppins sitewide/Agent work Apr 2Replaced Montserrat with Poppins (@fontsource/poppins) across all weights (300/400/500/600/700). Updated body font-family in app.css.
DONEBrand color palette updated — #552c7d purple + #f09092 peach/Agent work Apr 2CSS variables updated: --primary: #552c7d, --primary-hover: #3d1f5e, --primary-soft: #f3eef8, --accent: #f09092, --accent-hover: #e07a7c, --accent-soft: #fff5f5. Hardcoded hex values updated across component files. Purple is primary (80% usage), peach is accent (20%).
DONEOperator tooling split — deploy, verify, release-check, commit helperdeploy.sh / nivaa-*.shAgent work Apr 2Root deploy.sh now remains as a compatibility wrapper while the operator split lives in ilx-nivaa-deploy.sh, ilx-nivaa-verify.sh, ilx-nivaa-release-check.sh, ilx-nivaa-commit.sh, and ilx-nivaa-git-auth.sh. Deploy paths stay lean: frontend builds then deploys, worker runs tests then deploys, commit/push logic stays outside the deploy scripts, and GitHub PAT auth is stored repo-locally in .git/config.
PARTIALTrial session invoice — backend built, no frontend UI/admin/billingAgent work Apr 2Backend complete: trial_invoices table, POST /matches/:id/trial/propose creates appointments + invoices, POST /matches/:id/trial/invoice/:invoiceId/confirm-payment marks paid, auto-converts match when all paid. No admin or parent frontend screen exists yet for viewing/confirming trial invoices.

1. Respond.io & WhatsApp Integration

Integration with Respond.io for contact management, WhatsApp messaging, and lead lifecycle tracking. Contact cache and message cache are implemented in D1 with a proxy layer for admin-only API access.

StatusItemRouteSourceAgent Verdict
DONERespond.io contact cache (D1 + auto-refresh if >24h stale)Respond.io contactsMar 24 NicoleImplemented in respondio.ts. Full paginated sync with respondio_contacts_cache table, 24h TTL, force-refresh endpoint. See Respond.io contacts.
DONERespond.io message cache per contactRespond.io contactsMar 24 NicoleImplemented in respondio.ts. Messages fetched from v2/contact/id:{id}/message/list, cached in respondio_messages_cache, with WhatsApp template body extraction. See Respond.io contacts.
DONEAdmin proxy to respond.io API (/admin/respondio/*)Respond.io API explorerMar 24 NicoleImplemented in index.ts. Server-side auth forwarding with RESPOND_IO_KEY, admin-only. See Respond.io API explorer.
DONEWhatsApp message view (parsed, not raw JSON)Respond.io contactsMar 24 NicoleFrontend page at /admin/marketing-and-comms/respondio/contacts/id]/+page.svelte renders parsed messages. Messages are extracted from respond.io format with sender labels (NIVAA/Workflow/Bot/Contact) and text extraction from templates. See [Respond.io contacts.
DONETutor comms through Telegram botTelegram docsMar 24 NicoleFull Telegram bot built in bot.ts with /sessions, /upcoming, /checkin, /checkout, /mystudents, /postings, /notes, /mypay commands plus session change/cancel/reschedule flows. See Telegram docs.
CANCELLEDKeep vs move intake process to Respond.ioMar 24 NicoleCancelled. Intake stays in-app. No outbound Respond.io messaging from within the platform.
CANCELLEDWhatsApp template messages (utility + marketing)Mar 24 NicoleCancelled. No outbound messaging from within the app. Respond.io is read-only (contact cache + message history).
CANCELLEDEnable live messaging for Sid (+65 91153059)Mar 24 NicoleCancelled. Outbound messaging will be done directly in Respond.io, not through the NIVAA platform.
CANCELLEDTemplate selector for WhatsApp conversationsMar 24 NicoleCancelled. Templates managed directly in Respond.io workspace.
CANCELLEDSnippets (quick reply) from Respond.ioMar 24 NicoleCancelled. Quick replies stay in Respond.io native interface.
CANCELLEDSales number vs marketing number coordinationMar 24 NicoleCancelled. Multi-number setup is a Respond.io workspace concern, not in-app.

2. Heatmap / Distribution

Location intelligence for understanding where leads, students, and tutors are distributed across Singapore. Uses postal codes, areas, and address data.

StatusItemRouteSourceAgent Verdict
DONE3-layer location distribution (area, postal prefix, full postal)Distribution mapMar 24 NicoleImplemented as GET /admin/respondio-cache/distribution in respondio.ts. Returns DistributionPoint] with type (lead/educator/student), subtype (active/inactive/converted), area, postal_code, postal_prefix. Includes area-to-prefix mapping for ~50 Singapore areas. See [Distribution map.
DONECollect address on parent signupPeopleMar 24 NicoleParent signup in people.ts accepts address_data field. Child addresses stored in child_profiles.address_data. Profile endpoints support get/update for both parent and child addresses. See People.
DONEArea from Respond.io custom fieldsDistribution mapMar 24 NicoleDistribution endpoint extracts area, address, and subject from respond.io custom_fields_json. FB Lead form fields are captured as custom fields. See Distribution map.
PARTIALAddress from AI bot vs Nicole manual updatePeopleMar 24 NicoleAddress data can be updated via admin ETL (etl.ts bulk postal code update) or parent self-service (profile.ts). No AI bot address extraction yet. Would appear at People.
DONEHeatmap visualization (interactive map)Distribution mapMar 24 NicoleImplemented. Two Leaflet map pages: Distribution map (D3 SVG overlay, toggleable lead/educator/student layers, area + prefix tables) and Geography analytics (postal sector heatmap with histogram). Both use sg-geo.ts for coordinate resolution.

3. Lead Lifecycle & Analytics

Tracking leads through their journey from initial Facebook ad click to paying customer. Lifecycle data comes from Respond.io custom fields.

StatusItemRouteSourceAgent Verdict
DONELifecycle field on contact cacheRespond.io contactsMar 24 NicoleThe respondio_contacts_cache table has a lifecycle column. Values observed: Customer, Pending Payment, Pending Client, and others from respond.io. See Respond.io contacts.
DONELifecycle stages stored and queryableRespond.io contactsMar 24 NicoleDistribution endpoint uses CONVERTED_LIFECYCLES set (Customer, Pending Payment, Pending Client) to classify leads. Full lifecycle value available per contact. See Respond.io contacts.
PARTIALShow lifecycle on contact list front pageRespond.io contactsMar 24 NicoleContact list at Respond.io contacts fetches cached contacts with lifecycle field. Rendering depends on frontend implementation.
DONEFB Lead Form fields (Ad Name, FB Form ID, Area) capturedRespond.io contactsMar 24 NicoleRespond.io custom_fields_json captures all fields from FB Lead Forms. Distribution endpoint reads area, address, subject, listing_number from custom fields. See Respond.io contacts.
DONEList by lead type on left sidebar of contact listRespond.io contactsMar 24 NicoleImplemented. Lifecycle sidebar on contact list page with color-coded stage buttons, counts per stage, and click-to-filter. Stages derived dynamically from cached contacts. See Respond.io contacts.
DONETags distribution analysisRespond.io contactsMar 24 NicoleImplemented. GET /admin/respondio-cache/analytics returns tags_distribution with count per tag, sorted by frequency. See Respond.io contacts.
DONELifecycle change history by dateRespond.io contactsMar 24 NicoleImplemented. respondio_lifecycle_history table (migration 0024) tracks old/new lifecycle per contact on each sync. Analytics endpoint returns last 100 changes with names and timestamps. See Respond.io contacts.
DONEConversion analytics by Facebook campaignRespond.io contactsMar 24 NicoleImplemented. GET /admin/respondio-cache/analytics returns fb_campaigns with per-campaign totals and lifecycle stage breakdown (ad_name + fb_lead_form_name extracted from custom_fields). See Respond.io contacts.

4. Tutor Onboarding & Profile

Tutor registration, profile completion, and identity verification. Profile data feeds into the matching algorithm.

StatusItemRouteSourceAgent Verdict
PARTIALSubject > Curriculum > Age/Level multi-select picker/tutor/profileMar 24 Nicole / Mar 23 BelSubject picker exists in subject-picker.ts with subject/curriculum config. Tutor hard_constraints stores subjects array. Full multi-stage picker (subject then curriculum then level) not yet a guided wizard. Would appear at /tutor/profile.
DONERace field (Chinese/Malay/Indian/Other)TutorsMar 24 NicoleImplemented. tutor_profiles has race column. Captured during intake (intake.ts line 33, 82) and people registration (people.ts line 46, 71). See Tutors.
DONEPostal code and area on tutor profileTutorsMar 24 NicoleTutor profiles store postal_code, area, and address. ETL endpoint (etl.ts) supports bulk postal code updates. See Tutors.
DONELanguages on tutor profileTutorsMar 24 NicoleTutor profiles store languages as JSON array. Used in match scoring (language dimension, 0-20 points). See Tutors.
TODOCertificate upload (not mandatory to proceed)/tutor/profileMar 23 BelNot implemented. File upload exists for session notes (R2 nivaa-pdfs) but no certificate upload flow. Would appear at /tutor/profile.
TODORegions served: MRT stations as proxy/tutor/profileMar 24 NicoleNot implemented. Current location uses area/postal code, not MRT-based regions. Would appear at /tutor/profile.
TODOAutofill tutor profile address/tutor/profileMar 24 NicoleNot implemented. No address autocomplete/geocoding integration. Would appear at /tutor/profile.
TODOMultiple location selector for tutors/tutor/profileMar 24 NicoleNot implemented. Tutor profile stores single area/postal_code, not multiple regions. Would appear at /tutor/profile.
DONELock name/gender/race/DOB after signup/tutor/profileMar 24 NicoleImplemented. NRIC name, DOB, gender, and race are all locked after first save. Backend uses COALESCE(null, existing) pattern to prevent overwrites. Frontend shows disabled inputs with 'Locked after first save' note. See /tutor/profile.
DONENotify coordinator on profile changesTelegram docsMar 24 NicoleImplemented. Profile changes are logged to profile_change_log table and now trigger Telegram notifications to all coordinators showing tutor name, field changed, old > new values. See Telegram docs.
TODOMOH certification verification (DISE etc.)TutorsMar 24 NicoleNot implemented. Singpass scaffold exists (migration 0012) for identity verification but no MOH/DISE integration. Would appear at Tutors.

5. Session Management (Telegram + Web)

Core session lifecycle: scheduling, check-in/out, change/cancel/reschedule, reminders, and approval. Heavily integrated with the Telegram bot for tutor-facing operations.

StatusItemRouteSourceAgent Verdict
DONESession change/cancel on web sessions + TelegramSession LifecycleApr 20 Codex / Mar 24 Nicole / Mar 23 BelParents and tutors now get direct per-session Reschedule and Cancel controls on their web session surfaces. Tutor Telegram change flows remain available, and backend policy is now shared: reasons required, responder-side counter-proposals, one open proposal version at a time, 4-hour freeze for new self-service changes, check-in blocked while unresolved, and unresolved requests expire to Not_Completed at the original session start.
DONEShared self-service bounds for cancel/rescheduleSession LifecycleMar 24 NicoleImplemented worker-side and surfaced in parent/tutor session UIs. Reschedule and cancel now share the same new-change lockouts for both roles: Scheduled only, future only, outside the 4-hour freeze, required reasons, and overlap checks against both tutor and child calendars. Reschedule also keeps the original duration fixed, allows counter-proposals, and expires unresolved threads at the original start time.
DONECall parent button in TelegramTelegram docsMar 24 NicoleImplemented. tel: URL button shown when parent hasn't acknowledged. Falls back to 'No phone on file -- contact coordinator' if no phone number. See Telegram docs.
DONEClock in/out with time windowsTelegram docsMar 24 Nicole / Mar 23 BelImplemented in bot.ts. Check-in: opens 30 min before session start. Check-out: 30 min before end to 24 hours after end. Records checked_in_at and checked_out_at on appointments. Check-out auto-transitions status to Awaiting_Approval_Parent. See Telegram docs.
DONEDaily 7am reminders with session detailsTelegram docsMar 24 NicoleImplemented in reminders.ts. sendDailyReminders() runs for all linked tutors. Shows today's sessions with child name, time, Google Maps link for address, and pending upload count. Dedup via telegram_reminder_log. See Telegram docs.
DONEPre-session 1hr remindersTelegram docsMar 24 NicoleImplemented in reminders.ts. sendPreSessionReminders() finds sessions starting in 45-75 min window (15-min cron interval). Shows check-in button if not yet checked in. See Telegram docs.
DONECoordinator notifications on changesTelegram docsMar 24 NicoleImplemented via notifyCoordinators() in bot.ts. All admin-linked Telegram accounts receive notifications for cancellations and reschedule requests. See Telegram docs.
DONESession notes submission via TelegramTelegram docsMar 24 NicoleImplemented. Tutors can send files/voice notes with #ID in caption to attach to sessions. Files stored in R2 (nivaa-pdfs). /notes command available. See Telegram docs.
DONEVerify session after it happened (post-session confirmation)AppointmentsMar 23 BelImplemented. Confirmation endpoint (POST /appointments/:id/confirm) now has explicit guard: cannot confirm before session date (appt.date > today check). 2-day post-session window also enforced. See Appointments.
PARTIALAd-hoc session approval vs regular distinctionAppointmentsMar 23 BelSessions can be logged with billed_as_addon=1 flag. Tracked separately in analytics. But no distinct approval workflow for ad-hoc vs regular -- both follow the same confirmation path. Would appear at Appointments.

6. Posting & Matching

The postings workflow replaced the old algorithmic matching. Parents post needs, tutors browse and apply, coordinators review and push, parents accept. Match scoring is precomputed across 5 dimensions.

StatusItemRouteSourceAgent Verdict
DONEFull postings workflow (post > apply > push > accept)PostingsMar 19 Nicole/Bel/BipinFully implemented in postings.ts. Parent creates posting, tutors browse/apply, coordinators push selected tutors, parent accepts. Silent rejection of other applicants on acceptance. Routes registered in index.ts. See Postings.
DONEMatch scoring across 5 dimensionsPostingsMar 19 Nicole/Bel/BipinImplemented in postings.ts. Subject (0-25), Language (0-20), Gender (0-15), Timing (0-20), Special Needs (0-20) = max 100. Location is a separate filter toggle. Shown on admin detail view. See Postings.
DONE25% discount off first 2 sessions per childBillingMar 19 Nicole/Bel/BipinImplemented in postings.ts line 403-415. On match acceptance, creates FirstSession discount with 25% off, 2 sessions remaining. Checks for existing active discount first. See Billing.
DONECoordinator ad-hoc discountsBillingMar 19 Nicole/Bel/BipinImplemented as POST /admin/discounts in postings.ts line 709+. Supports custom percent_off, flat_amount_off, sessions_remaining, and reason. See Billing.
DONELocation area and postal code on postingsPostingsMar 19 Nicole/Bel/BipinPostings store location_area and postal_code. Location match scoring uses area string matching and postal district comparison (first 2 digits). See Postings.
DONEGender and language preference on postingsPostingsMar 19 Nicole/Bel/BipinPostings store gender_preference and language_preference. Used in match scoring (gender 0-15, language 0-20). See Postings.
TODOMulti-stage posting wizard (1. child, 2. time, 3. subject, 4. prefs, 5. special needs, 6. coordinator notes)PostingsMar 19 Nicole/Bel/BipinNot implemented as a guided wizard. Current posting creation is a single-form submission. API supports all fields but frontend doesn't have step-by-step flow. Would appear at Postings.
TODOPrefill subject with child proficiencyPostingsMar 19 Nicole/Bel/BipinNot implemented. Posting form doesn't auto-populate from child's student_profile hard_requirements. Would appear at Postings.
PARTIALPrefill location from parent/child addressPostingsMar 19 Nicole/Bel/BipinAddress data exists on both parent users and child profiles. Posting accepts location_area and postal_code but no auto-prefill from child address in the frontend. Would appear at Postings.
TODODecision aging for matches (how long a parent has been waiting)StudentsMar 24 NicoleNot implemented. No aging/SLA tracking on match decisions. Would appear at Students.
TODOShow 'X other kids need this tutor' indicatorPostingsMar 24 NicoleNot implemented. No cross-posting demand indicator on tutor application views. Would appear at Postings.

7. Parent Experience

Parent-facing features: child management, tutor visibility, session approval, disputes, and dashboard guidance.

StatusItemRouteSourceAgent Verdict
DONEChild soft delete (deactivated_at)StudentsMar 20 NicoleImplemented in migration 0013. DELETE /children/:id sets deactivated_at timestamp. Parent list/get filters out deactivated. Admin sees all. See Students.
DONEParent issues linked to sessionsTicketsMar 20 NicoleImplemented. POST /issues requires appointment_ids array. parent_issues table (migration 0013). Routes: /issues, /issues/mine, /admin/issues. See Tickets.
DONEParent alerts system/parentMar 20 NicoleImplemented. GET /alerts/parent computes: package low (<20%), pending session approvals, tutor recommendations, children without intake, readiness reports due. See /parent.
PARTIALParent view: child > tutors (color coded current vs past)/parent/childrenMar 20 Nicole / Mar 24Parent child detail page exists at /parent/children/childId]/+page.svelte with sub-routes for appointments, sessions, feedback, insights, proposals, readiness. Tutor visibility is controlled by match status (hidden until Parent_Accepted). Color coding of current vs past tutors not verified in frontend. See [/parent/children.
TODOFix guide boxes on parent dashboard/parentMar 24 NicoleNot verified as fixed. Parent dashboard at /parent/+page.svelte exists but guide box state unclear. Would appear at /parent.
DONECan't approve session before it happenedAppointmentsMar 24 NicoleImplemented. POST /appointments/:id/confirm now rejects if appt.date > today (future session guard). Combined with existing 2-day post-session window. See Appointments.

8. Admin Operations

Coordinator-facing pages for managing students, tutors, appointments, and operational oversight.

StatusItemRouteSourceAgent Verdict
DONEStudents page with enrichment (active status, days since last lesson, total sessions, funnel split, search)StudentsMar 24 Nicole / Mar 19Fully implemented in admin.ts handleAdminListStudents. Returns total_sessions, last_session_date, sessions_last_30d, future_sessions, days_since_last_lesson, is_active, match_status, posting status. Funnel filter with active/awaiting/has_options/needs_attention. Separate handleAdminStudentCounts for KPI badges. See Students.
DONEStudents page: respond.io lead linkageStudentsMar 24 NicoleImplemented. Admin student list cross-references legacy_listing_id with respond.io listing_number custom field. Returns has_lead and respondio_contact_id per student. See Students.
DONEFamily tree view/admin/family-treeMar 19 Nicole/Bel/BipinImplemented. GET /admin/family-tree returns hierarchical JSON (parents > children > tutors with session counts). Frontend at /admin/family-tree.
DONETutor performance list with statsTutorsMar 24 Nicole / Mar 19Implemented as handleAdminTutorPerformance in admin.ts. Returns total_sessions, total_hours, last_session_date, active_match_count, completion_rate, avg_nps, subjects, languages, area, onboarding_status per tutor. See Tutors.
DONETutor detail endpointTutorsMar 24 NicoleImplemented as handleAdminTutorDetail in admin.ts (line 1106+). See Tutors.
DONEAppointments page: full session metadataAppointmentsMar 24 NicoleImplemented. Backend now returns confirmed_by_parent, confirmed_by_tutor (integer flags), legacy_listing_id, posting_subject, parent_user_id, child_id, tutor_id. Frontend has approval checklist, quick links, subject chip, tutor notes display. See Appointments.
DONEInsights: macro trends and pillsStudentsMar 24 NicoleImplemented. Backend returns aggregates: trend_distribution (improving/steady/declining), attention_profile_distribution, avg_confidence_score, total_observations. Frontend shows KPI pills. Also added source_origin for demo data badges. See Students.
DONEAdmin appointments page: quick links to parent info and listing IDsAppointmentsMar 24 NicoleImplemented. Backend returns parent_user_id, child_id, tutor_id, legacy_listing_id. Frontend groups by child and shows parent name. Quick links available via ID fields. See Appointments.

9. Billing & Packages

Session packages, invoicing, payouts, and financial operations. Currently basic with significant planned enhancements.

StatusItemRouteSourceAgent Verdict
DONEPackage summary endpointBillingMar 19 Nicole/Bel/BipinImplemented as GET /billing/package-summary in billing.ts. See Billing.
DONEPricing plan resolution with ad-hoc vs package billingBillingMar 19 Nicole/Bel/BipinImplemented in pricing.ts. resolvePricingPlanForSession with billedAsAddon option. Discount resolution via resolveDiscountForSession and consumeDiscountSession. See Billing.
TODOPackage renewal workflow (threshold at 80% used, trigger at 8th session)BillingMar 19 Nicole/Bel/BipinNot implemented. No renewal trigger or threshold detection. Would appear at Billing.
TODOFIFO deduction from packagesBillingMar 19 Nicole/Bel/BipinNot implemented. No FIFO package consumption logic. Would appear at Billing.
TODOPayout through OCBC (CSV format for bulk payments)Billing payoutsMar 19 Nicole/Bel/BipinNot implemented. Payout route exists (payout.ts) but no OCBC CSV export. Would appear at Billing payouts.
TODOAging A/R: block parents with 30+ day overdueRiskMar 19 Nicole/Bel/BipinNot implemented. No accounts receivable tracking or blocking mechanism. Would appear at Risk.
TODOInvoice generation + send link through WhatsAppBillingMar 19 Nicole/Bel/BipinNot implemented. PDF generation exists (pdf-lib in Worker) but no invoice template or WhatsApp delivery. Would appear at Billing.
TODOCardUp integration for paymentsBillingMar 19 Nicole/Bel/BipinNot implemented. No payment gateway integration. Would appear at Billing.

10. Analytics & Reviews

Parent feedback, NPS scoring, and conversion analytics.

StatusItemRouteSourceAgent Verdict
PARTIALNPS reviews with scoringTutorsMar 19 Nicole/Bel/BipinFeedback system exists in feedback.ts. Captures nps_score and session_rating per appointment/match. Average NPS calculated per tutor. However, no automated timing trigger (after trial + every 8 sessions) -- reviews are submitted manually. See Tutors.
PARTIALReview questions (educator quality, operations, NPS, curated content)TutorsMar 19 Nicole/Bel/BipinCurrent feedback captures nps_score, session_rating, and comment. Does not have the full 4-question structure (educator quality, operations, NPS, curated content) -- only NPS and session rating. Would appear at Tutors.
TODOIf good NPS, prompt Google reviewTutorsMar 19 Nicole/Bel/BipinNot implemented. flagged_for_review triggers on low NPS (<6) but no positive NPS flow to Google review. Would appear at Tutors.
TODOConversion by Facebook campaign analyticsRespond.io contactsMar 19 Nicole/Bel/BipinNot implemented. Campaign data exists in respond.io custom fields but no aggregation by campaign. Would appear at Respond.io contacts.
TODOParent NPS review timing automation (after trial + every 8 sessions)AppointmentsMar 19 Nicole/Bel/BipinNot implemented. No session-count trigger for review prompts. Would appear at Appointments.

11. Educator Insights & Gamification

Tools for educators to build knowledge about their students' conditions, earn recognition, and access research.

StatusItemRouteSourceAgent Verdict
DONEEducator submit insights per childStudentsMar 19 Nicole/Bel/BipinImplemented in insights.ts. Tutors submit per-child insights with learning_style, pacing_recommendation, motivators, friction_points, confidence_score, and source_origin. Admin and parent views available. See Students.
DONETelegram reminders to clock in (challenge: remembering)Telegram docsMar 19 Nicole/Bel/BipinSolved via pre-session 1hr reminders in reminders.ts and daily 7am summary. Check-in button included in reminder messages. See Telegram docs.
TODOPoints and ranking system for educatorsTutorsMar 19 Nicole/Bel/BipinNot implemented. No gamification, points, or leaderboard system. Would appear at Tutors.
TODOResearch page per student (PubMed journals)StudentsMar 19 Nicole/Bel/BipinNot implemented. No PubMed or academic research integration. Would appear at Students.
TODOConditions knowledge base (Autism, ADHD, Dyslexia, GDD, Dyscalculia)/docsMar 19 Nicole/Bel/BipinNot implemented. Special needs are tracked as a flag (has_sped_needs) but no condition-specific content library. Would appear at /docs.
TODOColor contrast / sensory strategies from AIStudentsMar 19 Nicole/Bel/BipinNot implemented. No AI-driven strategy recommendations. Would appear at Students.

13. Phase 1 Launch (April 2026)

Priority features for the limited educator + coordinator launch. Parents mimicked by coordinators.

StatusItemRouteSourceAgent Verdict
DONERename Matches → Assignments throughout tutor workspace/tutor/matchesMar 30 NicoleDONE. Sidebar, page titles, labels across 6 tutor-facing files renamed. API endpoint /matches/mine unchanged.
DONEFit Score: grade + subject + special needs only (not location)/admin/postingsMar 30 NicoleDONE. Location removed from score. Special needs (0-20) added. 'Show in my area' toggle filter on tutor browse page.
DONECoordinator flag on tutors (hidden from educators)/admin/postingsMar 30 NicoleDONE. coordinator_flag text column on tutor_profiles. Inline editor on posting review. Hidden from tutors.
DONEDemo profiles: Bel + Nicole as Parent and Tutor/loginMar 30 NicoleDONE. Migration 0028: 4 accounts created with PBKDF2 password hashes. Password: Demo1234.
DONEDispute invoice line items (select sessions → dispute → ticket)/parent/billingMar 30 NicoleDONE. Migration 0030. POST /invoices/:id/dispute. Parent selects sessions, enters reason, creates Dispute ticket.
DONED3 swimlane flowcharts for 5 key workflows (in docs)/docsMar 30 NicoleDONE. Swimlane block type added to DocRenderer. 5 workflow pages at /docs/workflows/*.
DONEWithdrawn status update immediately on tutor browse page/tutor/postingsMar 30 NicoleDONE. Backend subquery excludes withdrawn apps. Frontend does optimistic UI update.
DONEPayout notification via Telegram/docs/telegramMar 30 NicoleDONE. notifyTutorsPayoutProcessed() fires on cycle Finalized. Shows amount, period, hours, breakdown.
DONESave as Draft on key forms (posting, readiness, intake)/docs/forms-validationMar 30 NicoleDONE. Posting: Draft status + ?draft=id editing. Readiness: Draft + resume. Onboarding: Save & Continue Later.
DONEBigger tutor proposal cards with full profile for parents/parent/postingsMar 30 NicoleDONE. Enlarged cards with stats bar, experience bars, subject pills, SN support. Trial session slot picker.
DONEProficiency test at time of posting (or reuse from last 30 days)/parent/postings/newMar 30 NicoleDONE. Migration 0029. GET/POST /children/:id/proficiency. Inline assessment in posting form. 30-day reuse.
TODOProficiency visible over time in student page for coordinators/admin/studentsMar 30 NicoleHistorical proficiency snapshots on student detail page.
DONEThree sections in tutor postings: Good Match / Other / My Area/tutor/postingsMar 30 NicoleDONE. 3 collapsible sections: Good Match (≥60), Other, My Area. Fit pills and breakdown rows.
TODOGamification: points, leaderboard, session-based rewards/tutor/insightsMar 30 NicolePoints for sessions, new students, uploads. Leaderboard concept.
TODOTutor timing dispute mockup + workflow/tutor/sessionsMar 30 NicoleTutor proposes alternative timing, parent responds.

12. Readiness Report Enhancements

The readiness report is currently a 7-domain questionnaire (A-G) scored 0-3. Bel's feedback calls for significant restructuring to focus on tutoring-specific assessment rather than classroom readiness.

StatusItemRouteSourceAgent Verdict
SUPERSEDEDCurrent 7-domain structure (A: Classroom Compliance through G: Literacy & Numeracy)/parent/children/ID/readinessMar 23 BelCurrent implementation in readiness.ts uses domains A-G with 4 items each (G has 9). Bel's feedback proposes restructuring -- current implementation works but structure needs revision. See /parent/children/ID/readiness.
DONERename: 'Classroom Readiness' to 'Tutoring Readiness: Sensory, Developmental, and Learning Profile'/parent/children/ID/readinessMar 23 BelImplemented. Backend readiness.ts restructured. Alerts reference 'Tutoring Readiness Profile'. Route stays /readiness/. See /parent/children/ID/readiness.
DONERemove: Classroom Compliance (A), Group Readiness (F) domains/parent/children/ID/readinessMar 23 BelImplemented. Domains A and F removed from DOMAIN_KEYS. Legacy keys kept for backward-compat scoring of old reports. New overall = B+C+D+E+H. See /parent/children/ID/readiness.
DONEAdd: Sensory Processing domain/parent/children/ID/readinessMar 23 BelImplemented. Domain H with 4 items (H1-H4): sensory sensitivity, sensory seeking, sensory avoidance, self-regulation strategies. Stored in total_h column (migration 0025). See /parent/children/ID/readiness.
DONEEmotional regulation: what does child need? (teddy, hug, cartoon)/parent/children/ID/readinessMar 23 BelImplemented. coping_mechanisms text field on readiness_reports (migration 0025). Captures specific regulation needs alongside 0-3 scoring. See /parent/children/ID/readiness.
DONEAdd textboxes for all domains (qualitative notes)/parent/children/ID/readinessMar 23 BelImplemented. notes_b through notes_h columns (migration 0025). Each domain gets a free-text field for qualitative observations. See /parent/children/ID/readiness.
DONECustom questions per subject/level/parent/children/ID/readinessMar 23 BelImplemented. 459 proficiency topics across 3 subjects (English, Maths, Science), 61 level/stream combos parsed from .docx files into proficiency-topics.json. Stored in proficiency_scores_json column. See /parent/children/ID/readiness.
SUPERSEDEDOnly show readiness after tutor allocated/parent/children/ID/readinessMar 23 BelCurrent implementation allows parents to fill out readiness reports for any child at any time. Per CLAUDE.md: 'Recommended after first 2 sessions.' Gating by tutor allocation would conflict with the current flow where reports help inform matching. See /parent/children/ID/readiness.
DONEPre-first-session: soft requirement for readiness report/parentMar 23 BelImplemented. Alerts now trigger when child has a match (even 0 sessions). Message: 'Complete their Tutoring Readiness Profile before the first session.' Check endpoint also returns has_match flag. See /parent.