Skip to content

Feature Log

Last updated: July 17 2026. For live access and current gates, see access-control.md. For StartupOS scope and routes, see startupOS.md.


Stage 1 — Discovery (Assessment + Report)

Landing Page (LandingPage.tsx)

  • [x] Optional Student Learning Strengths feature card, localized in English, Malay, Tamil, and Chinese; clarifies it is a separate post-Discovery reflection, not part of the Archetiq assessment score

Assessment (StartHerePage.tsx)

  • [x] 47-question psychometric questionnaire with reverse-scoring (items 1–40: 5 archetype sub-scales × 8 items; items 41–43: Extrovert axis; items 44–47: Introvert axis)
  • [x] Adaptive question ordering via smartOrderQuestions()
  • [x] Early-completion signal via isAssessmentStable()
  • [x] Primary and secondary archetype identification
  • [x] Force type derivation (Flow / Catalyst / Anchor)
  • [x] Confidence score + energy orientation (Introvert / Extrovert split)
  • [x] Animated step transitions, 5 questions per page
  • [x] 6-month retake cooldown — users are locked from retaking for 6 months after first submission
  • Lock date and next unlock date shown on a friendly locked screen
  • Manual admin override: edit responses/{uid}.createdAt in MongoDB to 6+ months ago

My Report (MyReportPage.tsx)

My Report shows personalized sector suggestions, their profile clues and work-style options only. The full sector catalogue is on Career Path, not My Report or Learning Strengths.

Free vs paid access: The main report (PART 1+2) — all three layer sections (Layer 1 · Your Archetype, Layer 2 · Your Force, Layer 3 · Secondary Voice) plus Blueprint Decoded, Know Before You Start, and Insight panels — is fully visible to all registered users. The Express Report (/report/express) — Learning Mode, Growth Gap, Career Enhancement, Leadership Profile, and Force Adaptation sections — is Explorer-only (requiresPayment gate). PDF export, print, and module summary downloads are Explorer-only. Free users see an upgrade banner at the bottom of the main report linking to /report/express.

  • [x] Phase 01 — Core Identity: Archetype radar chart, strength bars, and energy orientation split; removed the derived confidence percentage from the report
  • [x] Phase ◈ — Energy Pattern (Force Profile): Core energy, natural strengths, stress response, growth direction
  • [x] Phase ◈ — Natural Life Rhythm: Productivity style, best activities, burnout signals, balance strategy
  • [x] Phase 02 — Social Signature: Emotional style, communication, team role, team synergy, secondary dynamic
  • [x] Phase 03 — Performance Engine: Learning style, work habits, decision strategy, Power Moves
  • [x] Phase ◈ — Learning Mode Distribution: Learning profile, stacked bar chart, retention strategy, growth edge
  • [x] Archetype × Force identity visuals: Layer 1 uses element symbols with archetype names only; each of the 15 pairings adds its animal icon, short behavior cue, and existing identity name in the reveal, report, Dashboard, Money Plan, Career Fit, share-card export, and responsive landing-page matrix. The shared summary prefers the active locale’s framework label.
  • [x] Optional Student Learning Strengths: Separate 43-item reflection linked from My Report and shown in the Discovery sidebar after assessment completion; includes eight areas of interest, engagement, study strategies, and focus conditions, with visual results saved separately from the archetype assessment. A concise top-three summary includes career categories and engagement/study/focus clues, with an explicit tie note. All eight areas retain categorized career examples, possible pathways, learning actions and practical experiments alongside their score bars. Categories reuse the sector catalogue; Reflection & Goals is presented as a cross-sector supporting skill, not a standalone profession. These are interest-based prompts, not measured ability or career suitability; scoring and stored results are unchanged.
  • [x] Career & Team Match - Sector exploration: Four sector starting points from primary/secondary archetype themes plus separate education and non-student occupation field clues, with representative pathways and optional role examples. Layer 2 supplies a corporate/freelance/portfolio working-style prompt, not an industry restriction. A localized note links to the full catalogue on Career Path. Sector names, controls and work-style copy support English, Malay, Tamil and Chinese; catalogue details use English fallback. Keyword clues are not verified qualifications or suitability scores. Assessment, access, persistence and share contracts are unchanged; suggested sectors stay in the existing report PDF section.
  • [x] Phase 04 — Growth Roadmap: Blind spots, stress pattern, growth path
  • [x] Phase ◈ — Leadership Readiness Profile: Leadership radar, growth gap chart with baseline marker
  • [x] Phase ◈ — Leadership Signature & Evolution Path: Signature label, decision pattern, development focus, evolution by life stage
  • [x] Phase 05 — Strategic Direction: Future fields, skills to build, mentor guidance, ideal setting
  • [x] Phase 06 — Career Direction & Income Strategy: Financial profile, income style, wealth strategy, financial risk, personalised career context panels
  • [x] Phase 07 — Financial Growth Profile: Three smart money habits with archetype-specific rationale
  • [x] Phase 08 — Skill Development Path: Education direction, investment priority, key skills grid
  • [x] Phase 09 — Future Industry Alignment: High-growth industries, why-it-fits explanation, career alignment signal (0–100 score), emerging AI-era opportunity
  • [x] Phase 10 — Life Stage Financial Guidance: Stage insight, financial focus, key action, money rule (calibrated by age)
  • [x] Phase 11 — Archetype Economic Future Map: Economic role, automation risk badge, AI-era opportunities, future-proof skills
  • [x] Phase 12 — Insight Intelligence: Four personalised insight panels (self, direction, decision, evolution)
  • [x] Phase 13 — Committed Future Path: Static summary of the path chosen in Life Design (shown when set)
  • [x] PDF export — each section on its own page via html2canvas-pro v2.0.2 + jsPDF v4.2.0 (image-based JPEG, 14 pages)
  • All responsive Tailwind classes (md:text-*, lg:text-*) mapped to inline styles before capture
  • overflow: hidden removed from all cloned elements before capture to prevent content clipping
  • Encoding fix applied (April 2026): all U+FFFD replacement characters restored to correct Unicode (— – × ' …)
  • html2canvas-pro v2 fix (May 2026): skipValidation: true + dimension clamping (Math.min(Math.max(dim, 1), 16383)) prevents Validator throws on zero-width or oversized sections
  • Font fix (May 2026): Google Fonts URL changed from display=optional to display=swap so Inter always loads and renders correctly; Inter-fallback @font-face (size-adjust: 107%) prevents CLS
  • [x] Print support
  • [x] "How to Read This Report" modal — 13-phase guide with tips per section
  • [x] Architecture Breakdown section (technical score view)
  • [x] Life Design bridge card (context-aware: in-progress vs not-started)

Explore (01) — Health (MindBodyPage.tsx)

Navigation group: Explore. Gate: Discovery completed + paid plan.

  • [x] 2-step wellness module: Step 1 — Prakriti Quiz (21 questions), Step 2 — Dosha Profile
  • [x] (Wellness Goals step removed — goals now live in the Health pillar of Life Design/Life Blueprint)
  • [x] Prakriti Assessment — 21 questions rating lifelong tendencies on a 1–5 scale
  • [x] Dosha Profile — Vata/Pitta/Kapha percentage split, dominant dosha, constitution type
  • [x] deriveDoshaType() maps raw scores to { dominant, doshaType } ('Pure Vata', 'Vata-Pitta', etc.)
  • [x] Force–Dosha bridge card: explains connection between Energy Force and body type (Flow=Vata, Catalyst=Pitta, Anchor=Kapha)
  • [x] Expanded Dosha Result sections: practice, movement, rhythms, reflection, science, stress blueprint, insights
  • [x] Wellness profile saved to MongoDB via API (wellnessProfile object field on user doc)
  • [x] wellnessProfile object presence used by Journey Progress Strip and Dashboard NBA

Design (01) — Life Design (DesignMyLifePage.tsx) (REMOVED FROM NAVIGATION — June 24 2026)

Status: Route /life-design still exists in App.tsx as a legacy route but is not accessible from the sidebar navigation. Life Design data on existing user docs is read-only. Do not add new features here — use Growth Loop (/growth-loop) for goal tracking instead.

3-step wizard: Foundation → Guided Ikigai → Life Wheel & Blueprint

Navigation group: Removed (was Design). Gate: Discovery + Health + Financial Stability completed + paid plan.

Step 1 — Foundation

7 sub-sections (accordion UI, each with readiness state): 1. Self Snapshot — read-only archetype, force, wellness, financial profile recap 2. Life Path — committed path badge (Acceleration/Mastery/Contribution); selection happens in Life Simulator 3. Joy Audit — 3-part card (time disappears, people come to you, free energy) 4. Ideal Day — long-form (min 80 chars) 5. Origin Signal — inner child + productive anger 6. Ambition — career goal + hobbies array 7. Synthesized Identity — "I am…" statement + AI synthesis button (3 calls/day limit)

  • [x] What Drives You quiz — 6-option motivational driver (Stability/Variety/Recognition/Connection/Mastery/Impact). Stored at user.motivationalDriver. Gates the full Foundation step until answered. Drives tone of AI-drafted goals in the Plan Assembly Engine.
  • [x] Path-drift detection — compares goal + ideal day text against selected path; flags misalignment in amber banner
  • [x] Archetypal starters — 6 "I am…" prompts per archetype for the identity textarea
  • [x] AI Synthesis — SynthesizeFoundationCard drafts identity statement from all 4 filled cards (limited to 3 calls/day)

Step 2 — Guided Ikigai

  • [x] Four colour-coded quadrant cards: passion (indigo) / profession (rose) / mission (emerald) / vocation (amber)
  • [x] Each card has "Ask yourself…" starter questions and archetype suggestion with "↺ Use this as my starting point" button
  • [x] Live 6/6 counter (4 Ikigai + Vision + Mission)
  • [x] buildIkigaiStatement() — assembles statement from all four circles
  • [x] "Draft my Ikigai, Vision + Mission" merged AI button — single click makes two sequential AI calls (scope=ikigai then scope=vision-mission). Empty-only fill. Card auto-hides when all 6 are filled.
  • [x] Per-field tune menu — chevron on any filled field: Regenerate, More Specific, More Ambitious, More Realistic, Shorter
  • [x] SourceChip provenance — "Drawn from: …" pill below each AI-drafted field
  • [x] POST /api/ai/check-ikigai-alignment — verifies coherence of all 4 circles + Vision + Mission; returns { verdict: 'coherent'|'gaps'|'scattered', critique, suggestion? }. Shares the 10/hr draft bucket.
  • [x] Deterministic helpers (free, no AI): Build Vision from Ikigai, Derive Mission from Vision

Step 3 — Life Wheel & Blueprint

Phase 1 — Life Wheel: Score 6 life areas 1–10 + write 12-month area statements (min 30 chars) + optional "why this score" reality field (min 20 chars). All 6 statements required before Blueprint unlocks.

Phase 2 — Life Blueprint (inline per pillar):

  • [x] Vision + Mission carried from Step 2 (already filled by the time users reach Blueprint)
  • [x] 6 pillar SMART goal cards (Faith, Health, Family, Career, Finances, Growth)
  • Health goals sourced from user.wellnessProfile.goals (read-only bridge from Health)
  • Finances goals sourced from user.financialPlan.goals (read-only bridge from Financial Stability)
  • Faith, Family, Career, Growth — editable goal cards
  • [x] 6-dot alignment system per pillar — green/amber/red dots + hover hints: Life Wheel statement overlap, Reality fit, Identity alignment, Vision alignment, Ikigai connection, SMART quality
  • [x] "Check alignment with AI" button per pillar — Gemini returns aligned/drift/missing verdict
  • [x] "Draft goal" per pillar — uses scope=one-pillar (PR41, ~85% cheaper than scope=all)
  • [x] "Draft my Life Blueprint" bulk AI button — one call drafts Vision + Mission + all 6 pillars (goal/anchor/timeBound/whyMatters). Life Path Simulator grounding: server injects year1–5 milestones into prompt.
  • [x] SourceChip + FieldAIActions on every AI-drafted field
  • [x] Growth Loop linkage hint — green animate-in banner after any AI-drafted pillar goal; direct "Open Growth Loop →" link
  • [x] Max 3 goals per pillar enforced (PR45)
  • [x] Capability Gap field at bottom
  • [x] Blueprint PDF download (html2canvas → jsPDF landscape A4)

Design (01) — Career Path (LifeSimulatorPage.tsx)

  • [x] Browse all 22 sectors: Collapsible reference catalogue beside the existing Career Path exploration workflow, with pathways, entry/training requirements and expandable role examples. Selection is local browsing state only, not saved or sent to AI; a localized note directs users to complete the separate Career Path questions for personalized analysis. Uses the existing Career Path gate and shared sector-detail rendering.

Navigation group: Design (step 03). Route: /life-simulator. Gate: Discovery + Financial Stability (Money Plan) completed + paid plan (canAccessFutureStudio).

Career Context section (shown before CareerFitLab)

  • [x] Career Status dropdown (14 options: Secondary School Student → Senior Professional / Leadership). Saved to currentStatus
  • [x] Current Goal dropdown (12 options: Change career direction, Get promoted, Build side income, etc.). Saved to currentGoal
  • [x] Career Ambitions chips (17 options: Coaching/Mentoring, Teaching, Building Products, etc.). Saved to passionChips
  • [x] Hobbies & Interests chips (24 options: Technology, Music, Art, etc.). Saved to vocationChips
  • [x] Sectors of Interest chips (max 2). Saved to areaOfInterest
  • [x] Each chip/dropdown saves immediately via PUT /api/users/me
  • [x] isSeniorOrExpert / isStudentOrEarly classifiers derived from careerContextStatus for stage-specific UI content

CareerFitLab Wizard (2 steps)

Step 1 — Set Your Life Path - [x] Intention — 5 options: advance (Stay & Advance), shift-role (Shift to a New Role), entrepreneurship (Job → Entrepreneurship), side-income (Build Side Income), pivot (Full Industry Pivot) - [x] Path multi-select: mastery / acceleration / contribution - [x] Target Role section (unlocks when intention + path set): "Suggest Roles for Me" → AI call; role picker grid OR custom text; transition description textarea

Step 2 — Know Yourself - [x] Ikigai — interests, skills, mission, vocation (pre-populated from Career Context chips) - [x] Life Context — 6 questions: flow state, natural strengths, intrinsic drive, mission/purpose, ideal workday, current career pain - [x] Career blockers multi-select: finance, health, location, time, skills, confidence, family - [x] Hours/week, aspiration - [x] "Find My Career Plan" → full AI analysis via POST /api/ai/career-decision → CareerDecisionAIResult saved to profile.careerFitResult

AI Results (CareerDecisionAIResult)

  • [x] Role suitability: roleSuitability verdict (Strong Match / Good Match / Partial Match / Not Recommended) + score + suited traits + gaps + summary
  • [x] next90Days.weeklyPlan[] — weekly action plan cards
  • [x] suggestedRoles[] — AI-generated role options

Legacy Life Paths (still available)

  • [x] 3 paths (Acceleration / Mastery / Contribution) with 5-year milestone roadmap (Year 1–5 text cards), economic projection, archetype manifesto quote, force-based insights
  • [x] Path download (html2canvas → jsPDF landscape A4)
  • [x] Data source: CAREER_PATHS_DATA (mirrored from server/src/utils/careerPaths.json)

Master — Growth Loop (GrowthLoopPage.tsx, export: DailyGrowthPage)

Navigation group: Master (step 04). Gate: requiresDiscovery + requiresPayment at route level; canAccessGrowthLoop() = discoveryCompleted only.

Route: /growth-loop — 3 tabs: Today, Goals, My Plan (Habit Tracker and Reflect tabs removed May 2026)

Tab 1 — Today (dashboard)

  • [x] Daily Stack — per-pillar check-in (one card per pillar showing first goal; tap to check off). Saves to growthLoop.dailyCheckins[date][pillar]
  • [x] Streak badge (N-day) + checked count (X/4 pillars). Streak = consecutive days with 3+ pillars checked
  • [x] Daily Archetype Insight — archetype-specific tip rotating by day-of-year; loaded via useTranslatedData('dailyInsights') for EN/MS/TA/ZH
  • [x] Life Score stats panel (totalGoals, doneGoals, overdueTasks, dueSoonTasks, goalsWithFocusThisWeek)
  • [x] Weekly Pulse modal — auto-shown on Sundays if not yet submitted for the week; 4 sliders (health / career / finances / people, 0-10). Saved to growthLoop.weeklyPulse[weekKey]

Tab 2 — Goals (GoalStatusTab — inline component in GrowthLoopPage.tsx, no separate file)

  • [x] Overall progress bar (done/total %)
  • [x] Pillar filter tabs: All / Health / Career / Finance / People with count badges
  • [x] Goal cards: tap status badge to cycle (not-started to in-progress to done), pillar badge, target date, delete (new goals only)
  • [x] Add goal inline (title + pillar chip selector)
  • [x] Empty state quick-start links to Career Path / Financial Plan / Wellness Profile
  • [x] Data sources (priority): growthLoop.goals[] (new goals, primary) then legacy: careerCommitment, financialPlan, wellnessProfile, lifeDesign (all read-only)
  • [x] New goals write to growthLoop.goals[] (SimpleGoal); legacy goals update goalKanban[id].status (backward compat)
  • [x] Saves via PUT /api/users/me

Tab 3 — My Plan

  • [x] Shows AI-generated 90-day master plan from growthLoop.masterPlan (or legacy aiPlan)
  • [x] Per-pillar goal cards with original why + week1Action + live status badge
  • [x] Build My Plan / Rebuild plan button => POST /api/ai/generate-growth-plan
  • Generation steps: Reading Health => Reading Financial => Reading Career => Crafting Plan
  • Plan review modal: remove individual goals before accepting
  • On accept: goals pushed to growthLoop.goals[] + full plan saved to growthLoop.masterPlan
  • [x] Build My Plan banner shown above tab bar when hasAllSources (wellnessProfile OR financialPlan) AND no masterPlan yet

Note: Habit Tracker and Reflect tabs removed May 2026. growthLoop.habits[] and growthLoop.weeklyReflections[] preserved in MongoDB but not displayed. Legacy kanban data (growthLoop.goalKanban) preserved for backward compat.

Explore (02) — Financial Stability (MoneyPlanPage.tsx)

Navigation group: Explore. Gate: Discovery completed + paid plan. Must be completed before Career Path (/life-simulator) unlocks.

3-step financial intelligence wizard (simplified from 5-step in May 2026, further refined June 2026):

  1. My Money Style — Money personality auto-derived from archetype (budget rule, strengths, blind spots, personalised strategy). All 5 archetype strategy texts shortened to one punchy sentence (June 2026 audit)
  2. My Money Picture — Full Cashflow Framework 4-quadrant data entry: income, assets (investments), expenses, liabilities, plus Property & Financed Assets. Quick Mode toggle (June 2026): writes directly to data.snapshot.monthlyIncome/monthlyExpenses — lets users skip itemisation while still computing a score. Skip for now hints on Assets, Liabilities, and Financed Assets sections for users with nothing to enter
  3. Score & Path — Financial Health Score, pillar cards with ⓘ tooltip per pillar, cashflow breakdown, archetype-specific habits, life-stage guidance, Next Moves, Path-to-Next-Level card (personalised nudge + forecast months), TL;DR badge on Wealth Trajectory (data-driven from framework.json), protection toggles wired to score

Data Entry (Step 2 — My Money Picture)

  • [x] Income sources — type-tagged (salary, freelance, rental, dividends, business, side hustle, other). Gross salary note shown; amber warning if rental type entered (redirects to FA rental field to avoid double-count)
  • [x] Assets (Investments) — current value + optional monthly contribution. Property type excluded from dropdown (tracked in Property & Financed Assets instead)
  • [x] Expenses — type-tagged: housing, maintenance, utilities, transport, food, subscription, insurance, education, tax / PCB, other. Amber note directs FA bills to the FA section
  • [x] Liabilities — filtered to personal loan, study loan, other only. Violet banner redirects home/car/business loans to Property & Financed Assets
  • [x] Property & Financed Assets (FA) — tracks each financed or fully-paid asset: market value, loan balance, monthly instalment, rental income, plus itemised bills (internet, water, electricity, sewerage, quit rent, assessment, maintenance, renovation). FA rental income auto-included in total cashflow income. FA loan + bills auto-included in cashflow outflows
  • [x] Cashflow bar — real-time top/bottom annotation showing FA rental income contribution and FA payment contribution separately
  • [x] Net worth panel — assets minus liabilities, including FA market values and outstanding balances

Cashflow Summary (Step 2)

  • [x] 4-bucket stacked bar — Needs / Wants / Savings & Investing / Free Cash, each as % of income
  • [x] Expandable segment tiles — tap any tile to drill into the line items that make up that bucket:
  • Needs: essential expenses (housing, utilities, transport, food, insurance, tax, education, maintenance) + all loan installments + CC minimums + FA payments
  • Wants: non-essential expenses (subscriptions, lifestyle)
  • Savings & Investing: each investment with a monthly contribution
  • Free Cash: surplus (no sub-items)
  • [x] Tile shows ▼ details / ▲ hide toggle

Cashflow Calculation Rules

  • FA rentalIncome counts as income in cashflow (included in total income in computeSnapshotFromDetail, financialEngine.ts, moneyAdviceEngine.ts, and MoneySnapshotStep.tsx)
  • FA monthlyPayment + bills counts as outflow in cashflow
  • Monthly investment contributions are outflows (not passive income)
  • Liabilities section: home/car/business loans tracked via FA only — personal/study/other via Liabilities — prevents double-counting
  • Assets section: property tracked via FA only — investments dropdown excludes 'property' type — prevents double-counting

Health Score (Step 3 — Score & Path)

  • [x] Composite score (0–100) across 4 pillars:
  • Savings Rate (max 30 pts) — target ≥ 20% of income
  • Debt Load (max 25 pts) — keep total debt payments below 35% of income
  • Emergency Fund (max 25 pts) — target 6-month expenses cushion
  • Investing (max 20 pts) — any regular investing counts
  • [x] Protection bonus — calcHealthScoreFromPlan() adds +3 for life insurance, +3 for medical insurance, +4 for emergency fund if coverage < 50% (all capped inside emergencyFundScore pillar at max 25)
  • [x] Mastery levels — healthScoreLabel() maps score to 5 levels: Foundation (0–30), Builder (31–50), Protector (51–65), Grower (66–80), Legacy (81–100). Returns { masteryLevel, masteryNumber, color }
  • [x] Pillar cards show real % metric badge (e.g. "24% of income" for Debt Load, "67% covered" for Emergency Fund) — green if target met, red if not — plus score as secondary X/Ypt display
  • [x] Pillar ⓘ tooltip — PillarTip component shows on hover: explains what the pillar measures and how to improve it
  • [x] Consistent target text below each pillar bar — same units as the badge
  • [x] Path-to-Next-Level card — shows which pillar is weakest, personalised archetype nudge per mastery level, and forecasts how many months until the user can reach the next level based on their current trajectory
  • [x] Wealth Timeline mastery forecast — when the user's next loan payoff is computed, the timeline shows whether clearing it will trigger a mastery level transition
  • [x] TL;DR badge on Wealth Trajectory — short risk summary pulled from framework.json financialBehavior[archetype].keyRisk (not hardcoded — always matches the card below it)
  • [x] Mastery celebration toast (MoneyPlanPage.tsx) — AnimatePresence toast appears when masteryNumber increases (detected via useRef + useEffect). Auto-dismisses after 4.5 s, has manual close button

Terminology — standardised across all 3 pages

Concept Consistent label used everywhere
Savings + investing bucket Savings & Investing
Surplus after all outflows Free Cash
Essential spending bucket Needs
Discretionary spending Wants
Cashflow breakdown rows Needs & Wants / Savings & Investing / Free Cash

Passive Income Calculation (moneyAdviceEngine.ts)

  • [x] Correct formula — passive income = income sources typed rental or dividends + FA rental income only when net positive (rental > loan + all FA bills)
  • [x] Monthly investment contributions (EPF, ASB, unit trusts) are not counted as passive income
  • [x] "Passive income covers X% of expenses" advice card only appears when genuine net-positive passive income exists

Advice Cards

  • [x] 10 prioritised advice cards generated by moneyAdviceEngine.ts (urgent / important / smart / insight tiers)
  • [x] No proprietary brand names in card text

Other

  • [x] Tax / PCB expense type added — users enter gross salary and add PCB as an expense for accurate cashflow
  • [x] Life Design snapshot bug fixed — MoneyPlanPage now saves effectiveSnapshot (recomputed from detail arrays) to DB in all 4 save paths (auto-save, next, back, manual save). Previously saved stale data.snapshot, causing Life Design to show wrong net worth / savings rate
  • [x] Nav active-state fix — active step always shown in indigo (with ring) even when the step is also "done" (green). Previous: all steps showed green once all had data, with no way to see current position
  • [x] Collapsible sidebar — active step shows indigo icon + ring. Done-but-not-active shows green check. Not-yet-done shows grey icon
  • [x] Financial Health Score and snapshot persisted to user.financialPlan.snapshot and user.financialPlan.healthScore on every save
  • [x] Privacy notice — collapsed to single compact line (🛡 Your financial details are private + Details link + dismiss ×). Details expand/collapse with animation. Remembered in localStorage after dismiss.

Supplementary: Self Mastery (SelfMasteryPage.tsx) (REMOVED FROM NAVIGATION — June 24 2026)

Status: Route /self-mastery is listed as a dead route in App.tsx. The page file still exists but is not accessible from the sidebar. The badge inner_mirror is still awarded for historical sessions. Do not add new features here.

Menu name: Removed (was Self Mastery) — Explorer-only, gated by canAccessSelfInquiry (Discovery completed + paid plan).

A structured 5-phase self-coaching session that guides users from raw observation to committed action. AI-assisted at every phase. Past sessions stored for continuity context on subsequent runs.

Phases

  • [x] Phase 1 — Data: Observe your own results — what surprised you from your personality data, and which habit you most want to stop avoiding
  • [x] Phase 2 — Reactions: Identify a real situation that triggered a strong reaction, what drained your energy, and explore an alternative response
  • [x] Phase 3 — Patterns: Select one of six recurring patterns (SIX_PATTERNS), describe a specific situation where it shows up, and articulate who you want to be instead
  • [x] Phase 4 — Reality: Name the gap, trace it back to the pattern, and test what becomes possible if you act differently
  • [x] Phase 5 — Action: Commit to two concrete micro-actions and select a guiding principle from PERSONAL_PRINCIPLES

AI Guidance

  • [x] AiGuide component present at every phase — prompts informed by buildSelfInquirySystemPrompt() + phase-specific context builders
  • [x] Full user personality profile (archetype, force, scores, blind spots) passed as system context
  • [x] buildDataPhaseContext() and buildRealityPhaseContext() inject report data into AI prompts
  • [x] buildActionSystemPrompt() used for Phase 5 AI coach

Session Storage

  • [x] Completed sessions saved via saveSelfInquirySession() → PUT /api/users/me (selfInquirySessions[] field)
  • [x] Past sessions (most recent first) injected into subsequent session prompts for continuity
  • [x] Session history displayed in expandable list with date, pattern selected, and action commitments

Services

  • [x] src/services/selfInquiryService.ts — PHASES, PHASE_META, SIX_PATTERNS, PERSONAL_PRINCIPLES, all prompt builders

Supplementary: Chemistry (ChemistryPage.tsx)

Menu name: Chemistry — Explorer-only, at /chemistry. Two tabs in one page (merged June 2026):

  • Work tab (?tab=work) — People Blueprint: manager-grade workplace relationship guides + AI team coach. Gate: canAccessCorporate (Discovery + paid plan; organisation plan users admitted with discovery only).
  • Personal tab (?tab=personal) — Relationship Lens: compatibility engine for personal relationships. Gate: canAccessChemistry (Discovery + paid plan).

Legacy routes /people-blueprint and /relationship-lens redirect to the appropriate tab automatically.

Underlying pages (PeopleBlueprintPage.tsx, RelationshipLensPage.tsx) are still separate components — ChemistryPage.tsx renders them inside tab panels.

Users map their workplace relationships by archetype and relationship type, then receive personalised compatibility guides and access to an AI team coach that understands their entire org chart.

Relationship Management

  • [x] Add relationships by name, archetype (from CORPORATE_ARCHETYPES), and type (manager / peer / subordinate)
  • [x] Edit and delete existing relationships
  • [x] Direction indicator (⬆ Manager / ➡ Peer / ⬇ Report) with colour-coded pills

Per-Relationship Guide (computeCorporateGuide)

  • [x] Overall compatibility score (0–100) with colour-coded badge
  • [x] Dimension bars: expandable score + explanation per dimension
  • [x] Strengths, challenges, collaboration playbook, friction points, quick wins
  • [x] CorporateGuideResult shape: { overallScore, dimensions[], strengths[], challenges[], collaborationPlaybook, frictionPoints[], quickWins[] }

Group / Team Intelligence (computeTeamIntelligence)

  • [x] Team cohesion score across all relationships
  • [x] Archetype spread visualisation
  • [x] generateTeamNarrative() — prose summary of the full org chart for AI context
  • [x] GroupCompatibilityResult shape: { cohesionScore, archetypeSpread, narrative }

AI Team Coach

  • [x] AiGuide component with buildTeamCoachSystemPrompt() — aware of user's archetype + all relationships
  • [x] buildTeamSuggestedQuestions() — generates context-aware starter questions per relationship set
  • [x] buildSharedFromUserProfile() — constructs shared context object from UserProfile for AI system prompt

Data Persistence

  • [x] saveCorporateData() → PUT /api/users/me (corporateRelationships[] field)
  • [x] Share link: getShareLink() → GET /api/share-links/:token

Corporate Services

  • [x] src/services/corporateEngine.ts — computeCorporateGuide, computeTeamIntelligence, generateTeamNarrative, buildTeamCoachSystemPrompt, buildTeamSuggestedQuestions, buildSharedFromUserProfile, CORPORATE_ARCHETYPES, ARCHETYPE_DESCRIPTIONS

Cross-Module: Gamification System

An additive XP + levelling + badge layer built on top of the 5-stage journey. All data is stored on the user's MongoDB doc. Awards are fire-and-forget — if an XP write fails, the core save already succeeded.

Levels

Level Threshold Colour
✨ Stardust 0 XP slate
☄️ Comet 500 XP indigo
💫 Nova 1,200 XP violet
🌟 Supernova 2,100 XP amber

XP Rewards

Action XP Key in XP_REWARDS
Complete assessment +500 ASSESSMENT_COMPLETE
Complete Wellness Profile +200 WELLNESS_COMPLETE
Complete Financial Plan +300 FINANCIAL_PLAN_COMPLETE
Complete a Self Mastery session (page nav-removed) +250 SELF_MASTERY_SESSION
Save a weekly Growth Loop reflection (legacy) +100 WEEKLY_REFLECTION_SAVED
Complete a career sprint task +25 SPRINT_TASK_COMPLETE
Complete Life Design (page nav-removed, legacy backfill only) +400 LIFE_DESIGN_COMPLETE

Badges (13 total)

Badge id Earned when
🔓 Archetype Unlocked archetype_unlocked Assessment completed (discoveryCompleted = true)
🧘 Self-Aware self_aware Wellness Profile completed
🏗️ Life Designer life_designer Life Design completed (legacy — page nav-removed; still awarded on backfill)
⚔️ Week 1 Warrior week1_warrior First weekly Growth Loop reflection saved
🔥 Habit Builder habit_builder 7-day consecutive habit streak reached
🏆 30-Day Champion 30day_champion 30-day consecutive habit streak maintained
🌈 Full Spectrum full_spectrum All 5 journey stages completed
🪞 Inner Mirror inner_mirror First Self Mastery / Inner Mirror session (page nav-removed; badge still awarded on session save)
📤 Sharer sharer Report exported or Identity Card shared
🚀 Trailblazer trailblazer Early adopter (account before launch cutoff)
⚡ 90-Day Sprinter 90day_sprinter First full 90-day career sprint completed
💨 Career Velocity career_velocity 3+ career sprints completed
🗺️ Path Explorer path_explorer 2+ different career paths explored

Streak System

  • streakCount — current consecutive days with at least one habit completion
  • lastStreakDate — ISO date yyyy-MM-dd of last habit toggle
  • streakFreezes — 0 or 1 tokens; earned by saving a weekly reflection; consumed automatically if a day is missed

Weekly Challenges

  • Archetype-specific action sentence served each week from src/data/weeklyChallenges.json
  • Week is derived via getISOWeek() seeded by weekNumber % challenges[archetype].length — deterministic, no backend call
  • Completion stores growthLoop.weeklyChallenge: { weekKey, completed } on the user doc and awards +75 XP

Retroactive Backfill

  • On first load for existing users (xp === undefined), computeBackfill(profile) in UserProfileContext calculates XP, level, badges, and streak from completed stages, then writes them in a single API update — no re-login required

Admin Controls

  • Award XP modal — Zap button per user in AdminDashboard → Users tab; quick-select +100/250/500/1000 or custom amount; updates MongoDB and recomputes level
  • Award Badge modal — Gift button per user; admin picks from all 9 badges; skips duplicates
  • Overview stat cards — Total XP Awarded, Nova+Supernova count, Total Badges, Top Streak

Where Gamification Is Surfaced

Location What's shown
Landing page "Every Step Counts" section — levels, 9 badge grid, XP table
Dashboard XP progress bar + level + next-level target + badge strip + level legend
Profile Full "Achievements" badge grid (all 9, locked ones dimmed)
DailyGrowthPage › Overview Streak banner + weekly challenge card (marks complete, awards XP)
Report Share Identity button → PNG download (earns Sharer badge)
ArchetypeReveal Animated reveal screen post-assessment before redirecting to report

Cross-Module: Life Pillars

Active 4-pillar system (Growth Loop, Daily Stack, Weekly Pulse)

Key Label Used in
health Health Growth Loop goals, Daily Stack, Weekly Pulse slider
career Career Growth Loop goals, Daily Stack, Weekly Pulse slider
finances Finance Growth Loop goals, Daily Stack, Weekly Pulse slider
people People Growth Loop goals, Daily Stack, Weekly Pulse slider

Legacy 6-pillar system (Life Design — nav-removed)

Still present on existing user docs (lifeDesign.goals, lifeDesign.lifeWheel, growthLoop.goalKanban keys) for backward compat. Not surfaced in active UI.

Key Label
faith Faith & Purpose
health Health & Vitality
family Family & Relationships
career Career & Impact
finances Financial Freedom
growth Growth & Mindset

Cross-Module: Journey Progress Strip

6-stage horizontal strip shown on Dashboard and MyReportPage (Life Design stage removed June 24 2026):

Stage Label Sub-label Trigger
1 Assessment Personality discoveryCompleted
2 Report My Report discoveryCompleted
3 Health Mind & Body wellnessProfile object exists on user doc
4 Financial Stability Money Plan financialPlan object exists on user doc
5 Career Path Life Simulator simulatorCompleted = !!(profile as any)?.careerFitResult
6 Growth Loop Daily Growth growthLoopActive = growthLoop.goals?.length > 0

Messaging (Messages.tsx) (ROUTE REMOVED — not mounted in App.tsx)

Status: /messages route is not mounted in App.tsx as of June 2026. The server routes /api/conversations and /api/notifications still function. Coach–client communication is handled via Coach Portal only.

  • [x] Polling-based real-time messaging between coach and client (conversations every 5 s, messages every 3 s)
  • [x] Left-panel conversation list; clicking a conversation opens the thread
  • [x] Active conversation set from ?conv=<uuid> URL param; auto-selects the first conversation if no param is present
  • [x] Conversation _id values are string UUIDs (server uses randomUUID()) — not MongoDB ObjectIds
  • [x] toDbId() helper on server handles both string and ObjectId formats for backward compatibility
  • [x] Notifications for new messages embed ?conv=<uuid> in the link to deep-link to the correct thread
  • [x] getOrCreateConversation() awaited before creating any coaching-related notification (prevents dead notification links)

Notifications (Layout)

  • [x] Bell icon in sidebar and top bar with unread count badge
  • [x] Fixed-position dropdown panel (avoids overflow/clipping on inner pages)
  • [x] "Mark all read" — marks every notification read server-side, clears badge
  • [x] "Clear all" button — calls DELETE /api/notifications, removes all notifications for the user, empties local state and closes panel
  • [x] Notification links for coaching events include ?conv=<uuid> for direct deep-link to the conversation thread

Layout & Navigation

  • [x] Collapsible sidebar on inner pages — toggle button collapses the sidebar to gain horizontal reading space
  • [x] Desktop header hidden on authenticated inner pages — top header bar shown on mobile/tablet only (avoids double navigation chrome)
  • [x] Layout.tsx is the single source for both the fixed sidebar notification panel and the top-bar notification dropdown
  • [x] Navigation sidebar groups (June 2026 — actual group names from Layout.tsx):
  • Home: Dashboard (/dashboard)
  • Discover (emerald · step 01 — always visible): Start Here (/questionnaire), My Report (/report)
  • Explore (teal · step 02 — shown when hasPaidAccess): Book Guide (/book), Mind & Body (/wellness-profile), Money Plan (/financial-plan)
  • Design (indigo · step 03 — shown when hasPaidAccess): Career Path (/life-simulator — locks until Money Plan done)
  • Master (violet · step 04 — shown when hasPaidAccess): Growth Loop (/growth-loop), Chemistry Check (/chemistry?tab=personal)
  • Account: Profile (/profile)
  • Coaching: Coach Portal (shown when canAccessCoachPortal is true)
  • Organisation (shown when plan === 'organisation' OR orgRole set): Org Dashboard, Team Map, Team Intelligence, [Admin Panel if orgRole === 'admin']
  • Platform (admin role only): Admin (/admin)
  • Institution — removed from navGroups (styling definition only in GROUP_DISPLAY_KEYS)
  • Note: /messages, /coaching, /workshops, /coach-apply are not mounted in App.tsx
  • [x] All nav display labels use plain everyday language — no product/technical terminology
  • [x] GROUP_DISPLAY map in Layout.tsx translates internal group keys to human-readable headings

Registration & Auth

  • [x] Email + password registration (/register)
  • [x] Email verification (/verify-email) — token-based verification link sent after registration. emailVerified field on user doc. emailVerificationExpires TTL index auto-cleans expired tokens.
  • [x] Research consent checkbox (May 2026) — users opt in to anonymous use of their data for psychometric research. Stored as researchConsent: boolean on user doc. Admin Research tab surfaces consent rates and exclusion flags.
  • [x] Referral code field (agent affiliate tracking via ?ref=CODE URL param)
  • [x] Org invite code field (auto-assigns orgId on registration)
  • [x] JWT 30-day token stored in localStorage key personality_auth
  • [x] Reset password flow (/reset-password) — email-based, server-side token
  • [x] Complete Profile page (/complete-profile) — simplified form (June 2026): firstName, lastName, mobile, age, gender, occupation, education, skills. Career chips (ambitions, hobbies, sectors) moved to Career Path (/life-simulator). Draft auto-saved to localStorage key archetiq_profile_draft.

Admin Dashboard

  • [x] 11-tab AdminDashboard: Overview · Analytics · Engagement · Research · Users · Profiles · Coaches · Workshops · Promo Codes · Feedback · Organisations
  • [x] User list and search
  • [x] Archetype distribution analytics (doughnut + bar charts)
  • [x] Assessment completion tracking
  • [x] Research Stats tab — per-sub-scale Cronbach alpha, item-level means/SDs, archetype × force distribution breakdown, module engagement %; completion tracked via wellnessProfile object presence (not a wellnessCompleted boolean — fix applied May 2026)
  • [x] Admin-initiated cooldown reset (LockOpen button per user, shows days-remaining badge)
  • [x] Admin plan manager (inline dropdown to switch any user between Free / Explorer / Coach)
  • Promoting to coach: calls upsertCoachFromUser to create/reactivate coaches doc + refreshes Active Coaches list
  • Demoting from coach: calls deactivateCoach + removes from Active Coaches list
  • [x] Complimentary access grant — sets plan: 'explorer' with no planExpiresAt (permanent, no Stripe required)
  • [x] Admin report viewer — opens any assessed user's full paid-tier report in a new tab, with amber "Admin view" banner and ← Back to Admin link; PDF export works from admin view
  • [x] Coach applications management — full lifecycle: Pre-Approve / Reject / Delete Application; "Activate Coach" button appears only when status === 'payment_received'
  • [x] Active coaches roster with referral links, client counts, Grant/Revoke portal access per coach
  • [x] Workshop CRUD (create, edit, delete workshop events)
  • [x] Promo Codes tab — create free-access / percent-off / fixed-off codes; toggle active/inactive; delete
  • [x] Feedback tab — view all post-report feedback submissions with summary cards (% per rating), filter by rating, written note + UID + timestamp per entry
  • [x] Organisations tab — create orgs, assign invite codes, activate/deactivate org plans

Organisation Management

  • [x] Organisation data model — inviteCode, coachIds, plan, planExpiresAt, seatLimit
  • [x] createOrganisation(name) — generates unique 8-char invite code
  • [x] getOrganisationByInviteCode(code) — used at registration to auto-assign orgId + orgRole: 'member'
  • [x] updateOrgCoaches(orgId, coachIds[]) — whitelist which coaches serve this org
  • [x] activateOrgPlan(orgId, expiresAt?) — sets plan: 'explorer' on org doc + batch-updates all member user docs (Explorer access, covered by org subscription)
  • [x] deactivateOrgPlan(orgId) — clears org plan + batch-reverts all members to plan: 'free'
  • [x] assignMemberToCoach(memberUid, coachId) — Org Admin assigns a member to a specific coach
  • [ ] Org Admin dashboard UI (manage members, assign coaches, view reports)
  • [ ] Org invite link UI (show/copy link in AdminDashboard)
  • [ ] Auto-assign plan: 'explorer' to members who join an org that already has an active plan

Team Intelligence Hub (TeamIntelligencePage.tsx)

Route: /team-intelligence · Gate: canAccessOrganisation (Organisation plan + orgId)

The Team Intelligence Hub is the primary tool for org admins and org members to understand their team's archetype dynamics, run hiring decisions, and generate AI-powered reports.

Overview: 6-tab workflow

Tab Name Purpose
1 Team Context Set up the team's Evolution Stage, leadership style, pain points, hiring intent
2 Team Chemistry Within-team health analysis + inter-team cross-analysis
3 Hire Smarter Candidate archetype screener against team gaps
4 Interview Guide Auto-generated question bank per archetype
5 Team Report (AI) Gemini-generated narrative intelligence report
6 Work Chemistry Per-relationship chemistry guides (org-member version)

The Team Intelligence Hub operates on org teams — groups created and managed in the Team Map (/team), each stored as a teams doc with intelligenceContext, intelligenceRoster, and member archetypes from the responses collection.


Tab 1 · Team Context

Sets up the team's intelligence context, saved per-team to teams.intelligenceContext.

Field Options
Evolution Stage 9 stages from Stage 1 (Forming) through Stage 9 (Innovating), each with a name and description
Leadership Style Collaborative / Coaching / Delegative / Top-Down / Flat
Pain Points Multi-select: Unclear priorities, Misaligned expectations, Lack of execution, Communication gaps, Burnout risk, Silos, Lack of innovation
Hiring Intent Multi-select: No hire needed, Driver, Visionary, Integrator, Stabilizer, Specialist, Generalist
Team Maturity Forming / Growing / Established / Scaling / Mature
Team Goal Build / Scale / Stabilise / Innovate / Sustain

All fields saved via saveTeamIntelligenceForTeam(teamCode, context, roster).


Tab 2 · Team Chemistry

Two sub-modes toggled via header buttons: Within Team and Inter-Team.

Within-Team chemistry

  • Requires ≥2 members with completed assessments in intelligenceRoster
  • Rule-based analysis from teamIntelligenceEngine.ts (computeTeamHealthAnalysis): health score 0–100, health label, archetype spread, key risk, key strengths, recommended formation, communication tips, collaboration style, missing archetype warning
  • Lead Guide card — per-archetype lead insights (how to delegate, how to align, escalation signals)
  • Archetype Activation Guide — per-member cards with "How to get the best from [Name]"
  • AI Team Report button (Tab 5 equivalent inline): calls POST /api/ai/generate with TEAM_REPORT_SCHEMA and a Gemini prompt grounded in the full team context + archetype data; rate bucket gen (20/hr); 8-section narrative report

Inter-Team chemistry

  • Multi-team selector: pick 2+ org teams (chip toggle)
  • Combines all members across selected teams; runs the same computeTeamHealthAnalysis on the merged set
  • Shows combined health analysis (cross-team archetype coverage, collective strengths, gaps)
  • Inter-Team AI Report (new June 2026): "Generate Cross-Team Report" button; Gemini-powered report with 8 sections:
Section Content
crossTeamSummary 2–3 sentence overall assessment of how these teams work together
teamProfiles Per-team: operating style + best contribution
leadDynamics How team leads interact and what to watch (based on lead archetypes)
collaborationOpportunities Project types + teams + rationale
frictionZones Tension description + which teams + mitigation
divisionOfWork Work type + which team should own it + reason
meetingNorms How to run cross-team meetings given the archetype mix
thirtyDayPlaybook Concrete 30-day actions + teams involved + expected outcome

Report resets when team selection changes. Rate bucket: gen (20/hr, shared with within-team report).


Tab 3 · Hire Smarter

  • Analyse which archetypes are over/under-represented in the current roster
  • Gap analysis: critical gaps (archetypes absent or weak) vs. surplus (archetypes over-represented)
  • Score each archetype candidate against the team's current gap profile
  • Output: recommended hire priority + interview focus areas per gap archetype

Tab 4 · Interview Guide

  • Auto-generates structured interview question banks per archetype
  • Questions grouped by theme: Motivation, Working Style, Collaboration, Stress Response, Growth Orientation
  • Copy-to-clipboard per question; "Generate for [archetype]" button per hiring intent target

Tab 5 · Team Report (AI)

  • Standalone tab alternative to the inline "AI Team Report" button in Team Chemistry
  • Full Gemini-generated narrative with TEAM_REPORT_SCHEMA:
Field Content
executiveSummary 3-sentence leadership-ready summary
stageAlignment Whether team behaviour matches the declared Evolution Stage
teamDNA The team's natural operating style as a narrative
leadershipInsight What this team needs from its leader
topStrengths 3 concrete team strengths with evidence
criticalGaps 2–3 gaps with specific consequences
teamDynamics How the archetypes interact day-to-day
ninetyDayPlaybook 4 concrete 90-day actions
hiringPriority Which archetype to hire next and why

Rate bucket: gen (20/hr).


Tab 6 · Work Chemistry (redesigned June 2026)

Two different experiences based on plan:

User Experience
Org member (has orgId) WorkChemistryTab — team-based picker using org team data
Non-org member PeopleBlueprintPage — manual archetype entry (standalone People Blueprint)

WorkChemistryTab — Org member experience

Focal person (who you are): - Default: Self — your own archetype from profile.archetype - Alternative: Pick someone else — opens WcTeamPicker to select any org member with a completed assessment; you then see chemistry from their perspective (their archetype as focal) - If you haven't completed your assessment yet, an amber warning is shown

Three relationship sections (Managers / Peers / Direct Reports): - Each has a "+ Add [role]" button that opens WcTeamPicker - WcTeamPicker: row of org team chips → members of the selected team shown as buttons - Members without a completed assessment shown as disabled ("needs assessment") - Members already selected in any section shown with a ✓ and disabled (prevents duplicates) - Selected people shown as dismissible chips (name + archetype badge + team name + ×)

Chemistry computation (client-side, no server calls): - buildSharedFromUserProfile(focal) → focal's SharedPersonProfile - computeCorporateGuide(focalProfile, rel, rel.archetype) per person → CorporateGuideResult - computePeerGroupIntelligence(focalProfile, peers) when 3+ peers → GroupCompatibilityResult

WcGuideCard per selected person: - Score (0–100) + label with colour (emerald ≥80 / indigo ≥65 / amber ≥50 / red <50) - Directional rapport note (direction-aware: how focal works with this person given both archetypes) - Top 3 Dos (CheckCircle2 icons) - Top 2 Avoids (X icons) - Growth edge (growth challenge for focal when working with this person)

Peer Group Score (when 3+ peers): - Appears above individual peer guide cards - Average score + group label + collectiveStrength narrative

Empty state: if no org teams have been set up yet (orgTeams.length === 0), shows link to Team Map (/team).


Team Maturity — Quarterly Check-in

Routes: - /team-maturity/:quarter/:year — Team member check-in form - /team-maturity-dashboard/:quarter/:year — Lead dashboard for reviewing team submissions

Gate: requiresOrganisation (Organisation plan + orgId)

Team Member Check-in Form (5 sections)

Section Content
1. Business Impact (WHAT) Impact narrative + score (1–10)
2. Who I Helped (HOW — Behaviors) Count + examples of people helped; received help count + examples
3. Community/Values Community impact narrative + score (1–10)
4. Core Priorities Progress Progress on lead-set quarterly priorities
5. Learning & Growth Optional learning narrative

Features: - Autosave on field changes - Submit toggle (complete check-in) - Streak/badge display - Data persisted to MongoDB (teams collection via maturityStage field)

Lead Dashboard

Route: /team-maturity-dashboard/:quarter/:year

  • View all team members' check-ins for the quarter
  • Set quarterly priorities for the team
  • Review team maturity trends over time

Payments (Stripe)

  • [x] Stripe Checkout integration via VPS endpoint (POST /api/stripe/create-checkout-session)
  • [x] Explorer plan (RM 59, 1-year access) — yearly recurring Stripe subscription
  • [x] Coach plan (RM 599 year 1, RM 199/year renewal) — Stripe Subscription Schedule (two-phase: first year at RM 599, then RM 199 recurring)
  • [x] Post-payment plan activation via Stripe webhook (VPS /api/stripe/webhook)
  • [x] planExpiresAt field on UserProfile — payment gates check expiry
  • [x] Annual renewal extension via invoice.payment_succeeded webhook (subscription_cycle)
  • [x] Subscription cancellation handling via customer.subscription.deleted webhook — reverts to plan: 'free', clears coachAppStatus, deactivates coaches doc
  • [x] Promo code support: free-access bypass (skips Stripe), percent/fixed discount (Stripe coupon created on-the-fly)
  • [x] Coach referral code field on checkout — links new client to coach
  • [x] /payment/success confirmation page

Coaching & Community

  • [x] Verified coach network (historical /coaching surface; route currently not mounted in App.tsx) — browse coaches, filter by module, request to work together
  • Platform directory removed — page shows only "Our Coaches" network directly
  • Pricing badge on each coach card ($min–$max/session) when coach has set a price range
  • Personalised matching banner when coach's archetypes match the user's archetype
  • [x] Coach application form (historical /coach-apply route; currently not mounted in App.tsx) — requires auth + Discovery + Explorer/Coach plan (coaches must have personally completed the assessment and hold a paid plan before applying)
  • [x] Full coach onboarding payment gate — 5-step managed flow:
  • Coach applies via onboarding entry (historical route: /coach-apply) → coachApplications doc created (status: 'pending')
  • Admin pre-approves → coachAppStatus: 'approved_pending_payment' set on user doc; "Coach Portal" nav link appears
  • Coach pays RM 599 via Stripe Checkout (shown as gate screen in /coach-portal)
  • Stripe webhook sets coachAppStatus: 'payment_received'; CoachPortal shows "Payment Confirmed!" screen; admin sees "Activate Coach" button
  • Admin activates → coaches doc created, plan: 'coach' set, coachAppStatus cleared; full portal unlocked

    Note: /api/coach-requests and /api/coach-applications exist as route files but are NOT mounted in server.js. Coach plan is assigned admin-only via POST /api/admin/change-plan. The coachApplications collection is still written (step 1) and read by AdminDashboard; it just has no standalone public API endpoint.

  • [x] coachAppStatus field on UserProfile ('approved_pending_payment' | 'payment_received') — cleared when portal is activated or access revoked
  • [x] Coach portal (/coach-portal) — payment gate screens + full tabbed interface when active
  • Payment gate screen (when coachAppStatus === 'approved_pending_payment'): Stripe checkout + promo code redemption
  • Payment confirmed screen (when coachAppStatus === 'payment_received'): teal confirmation with "what happens next" steps
  • Activating screen (when plan === 'coach' but no coaches doc yet): loading fallback
  • Full portal (when coaches doc exists): Clients / Requests / Team / Cohorts / My Profile tabs
  • My Profile tab: editable bio, title, archetypes, modules, location, session type, price range (min/max)
  • Requests tab: incoming client requests; send proposals with price, format, payment details; confirm payment received
  • Annual renewal reminder banner above tab bar: amber if within 30 days of anniversary, red if overdue, hidden otherwise (based on coach.createdAt)
  • [x] Coach referral system — unique referral code per coach; /register?ref=CODE auto-links new user
  • [x] Admin Active Coaches "Grant Portal Access" — creates coaches doc via upsertCoachFromUser + sets plan: 'coach'; refreshes coaches state
  • [x] Admin Active Coaches "Revoke Portal Access" — deactivates coaches doc via deactivateCoach + sets plan: 'explorer'; filters coaches from UI state
  • [x] Team reports (/team) — compare archetype distributions (route currently gated by requiresOrganisation)
  • [x] Workshops page (/workshops) — feature exists but route is currently not mounted in App.tsx
  • [x] Read-only share link (/share/:token) — for mentors, parents, or employers
  • [x] "Find a Coach" and "Workshops" CTAs in Report — locked for free users with an "Upgrade" prompt

Post-Report Feedback

  • [x] Feedback widget at bottom of Report page (hidden in print/PDF, hidden for free users and admin view)
  • [x] Three rating options: 😄 Very helpful · 🙂 Somewhat helpful · 😕 Not helpful
  • [x] Optional free-text note field
  • [x] Saves to reportFeedback/{uid} — one doc per user, re-submitting overwrites
  • [x] Pre-loads existing feedback on mount (shows current rating if already submitted)
  • [x] Green confirmation shown after submit
  • [x] Viewable in AdminDashboard → Feedback tab with summary stats and filter

All user-facing text follows these rules:

  • Readable at age 15+
  • No psychology jargon, no corporate speak
  • Short sentences, everyday words
  • Strength/growth fields in framework.json are complete standalone sentences — not fragments for wrappers
  • No repetition between report phases
  • Professional but simple tone