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}.createdAtin 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 (requiresPaymentgate). 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-prov2.0.2 +jsPDFv4.2.0 (image-based JPEG, 14 pages) - All responsive Tailwind classes (
md:text-*,lg:text-*) mapped to inline styles before capture overflow: hiddenremoved 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=optionaltodisplay=swapso 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 (
wellnessProfileobject field on user doc) - [x]
wellnessProfileobject presence used by Journey Progress Strip and Dashboard NBA
Design (01) — Life Design (DesignMyLifePage.tsx) (REMOVED FROM NAVIGATION — June 24 2026)¶
DesignMyLifePage.tsx)Status: Route
/life-designstill 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 —
SynthesizeFoundationCarddrafts 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=ikigaithenscope=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-inbanner 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/isStudentOrEarlyclassifiers derived fromcareerContextStatusfor 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:
roleSuitabilityverdict (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 fromserver/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 updategoalKanban[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 legacyaiPlan) - [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 togrowthLoop.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[]andgrowthLoop.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):
- My Money Style — Money personality auto-derived from archetype (budget rule, strengths, blind spots, personalised strategy). All 5 archetype
strategytexts shortened to one punchy sentence (June 2026 audit) - 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 - 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
rentalIncomecounts as income in cashflow (included in total income incomputeSnapshotFromDetail,financialEngine.ts,moneyAdviceEngine.ts, andMoneySnapshotStep.tsx) - FA
monthlyPayment + billscounts 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/Yptdisplay - [x] Pillar ⓘ tooltip —
PillarTipcomponent 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 whenmasteryNumberincreases (detected viauseRef+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
rentalordividends+ 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 —
MoneyPlanPagenow saveseffectiveSnapshot(recomputed from detail arrays) to DB in all 4 save paths (auto-save, next, back, manual save). Previously saved staledata.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.snapshotanduser.financialPlan.healthScoreon every save - [x] Privacy notice — collapsed to single compact line (
🛡 Your financial details are private+ Details link + dismiss ×). Details expand/collapse with animation. Remembered inlocalStorageafter dismiss.
Supplementary: Self Mastery (SelfMasteryPage.tsx) (REMOVED FROM NAVIGATION — June 24 2026)¶
SelfMasteryPage.tsx)Status: Route
/self-masteryis listed as a dead route in App.tsx. The page file still exists but is not accessible from the sidebar. The badgeinner_mirroris 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]
AiGuidecomponent present at every phase — prompts informed bybuildSelfInquirySystemPrompt()+ phase-specific context builders - [x] Full user personality profile (archetype, force, scores, blind spots) passed as system context
- [x]
buildDataPhaseContext()andbuildRealityPhaseContext()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]
CorporateGuideResultshape:{ 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]
GroupCompatibilityResultshape:{ cohesionScore, archetypeSpread, narrative }
AI Team Coach¶
- [x]
AiGuidecomponent withbuildTeamCoachSystemPrompt()— aware of user's archetype + all relationships - [x]
buildTeamSuggestedQuestions()— generates context-aware starter questions per relationship set - [x]
buildSharedFromUserProfile()— constructs shared context object fromUserProfilefor 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 completionlastStreakDate— ISO dateyyyy-MM-ddof last habit togglestreakFreezes— 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 byweekNumber % 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)inUserProfileContextcalculates 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)¶
Messages.tsx)Status:
/messagesroute is not mounted in App.tsx as of June 2026. The server routes/api/conversationsand/api/notificationsstill 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
_idvalues are string UUIDs (server usesrandomUUID()) — 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.tsxis 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
canAccessCoachPortalis true) - Organisation (shown when
plan === 'organisation'ORorgRoleset): Org Dashboard, Team Map, Team Intelligence, [Admin Panel iforgRole === 'admin'] - Platform (admin role only): Admin (
/admin) Institution— removed from navGroups (styling definition only inGROUP_DISPLAY_KEYS)- Note:
/messages,/coaching,/workshops,/coach-applyare not mounted in App.tsx - [x] All nav display labels use plain everyday language — no product/technical terminology
- [x]
GROUP_DISPLAYmap inLayout.tsxtranslates 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.emailVerifiedfield on user doc.emailVerificationExpiresTTL 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: booleanon user doc. Admin Research tab surfaces consent rates and exclusion flags. - [x] Referral code field (agent affiliate tracking via
?ref=CODEURL param) - [x] Org invite code field (auto-assigns
orgIdon registration) - [x] JWT 30-day token stored in
localStoragekeypersonality_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 tolocalStoragekeyarchetiq_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
wellnessProfileobject presence (not awellnessCompletedboolean — 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: callsupsertCoachFromUserto create/reactivate coaches doc + refreshes Active Coaches list - Demoting from
coach: callsdeactivateCoach+ removes from Active Coaches list - [x] Complimentary access grant — sets
plan: 'explorer'with noplanExpiresAt(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]
Organisationdata model —inviteCode,coachIds,plan,planExpiresAt,seatLimit - [x]
createOrganisation(name)— generates unique 8-char invite code - [x]
getOrganisationByInviteCode(code)— used at registration to auto-assignorgId+orgRole: 'member' - [x]
updateOrgCoaches(orgId, coachIds[])— whitelist which coaches serve this org - [x]
activateOrgPlan(orgId, expiresAt?)— setsplan: '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 toplan: '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/generatewithTEAM_REPORT_SCHEMAand a Gemini prompt grounded in the full team context + archetype data; rate bucketgen(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
computeTeamHealthAnalysison 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]
planExpiresAtfield on UserProfile — payment gates check expiry - [x] Annual renewal extension via
invoice.payment_succeededwebhook (subscription_cycle) - [x] Subscription cancellation handling via
customer.subscription.deletedwebhook — reverts toplan: 'free', clearscoachAppStatus, 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/successconfirmation page
Coaching & Community¶
- [x] Verified coach network (historical
/coachingsurface; route currently not mounted inApp.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-applyroute; currently not mounted inApp.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) →coachApplicationsdoc 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 →
coachesdoc created,plan: 'coach'set,coachAppStatuscleared; full portal unlockedNote:
/api/coach-requestsand/api/coach-applicationsexist as route files but are NOT mounted inserver.js. Coach plan is assigned admin-only viaPOST /api/admin/change-plan. ThecoachApplicationscollection is still written (step 1) and read by AdminDashboard; it just has no standalone public API endpoint. - [x]
coachAppStatusfield 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=CODEauto-links new user - [x] Admin Active Coaches "Grant Portal Access" — creates coaches doc via
upsertCoachFromUser+ setsplan: 'coach'; refreshes coaches state - [x] Admin Active Coaches "Revoke Portal Access" — deactivates coaches doc via
deactivateCoach+ setsplan: 'explorer'; filters coaches from UI state - [x] Team reports (
/team) — compare archetype distributions (route currently gated byrequiresOrganisation) - [x] Workshops page (
/workshops) — feature exists but route is currently not mounted inApp.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.jsonare complete standalone sentences — not fragments for wrappers - No repetition between report phases
- Professional but simple tone