Progression & Scoring
Neural Synergy v3
The psychometric scoring models, dual-currency XP system, and adaptive difficulty mechanisms powering BrainyPlayLab.
Progression System
Dual-Currency Architecture
âš¡ Cognitive Charge
Infinite lifetime XP currency earned per correct trial.
efficiency = clamp(baseRT / solveRT, 0.5, 2.0) gain = round(12 × eff × (1 + difficulty) × accMult × diffMult) gain = clamp(gain, 0, 50) // Hard cap
🌱 Neural Growth
Slow-accruing mastery points. Diminishing returns, max level 100.
speedIdx = clamp(baseRT / medianRT, 0.6, 1.6) stability = max(0, 1 − (cvRT × 0.8)) quality = accuracy × stability gain = round(quality × speedIdx × challenge) gain = min(gain, 10) // Max 10/session
Leveling Curves
// Charge Level (infinite) threshold(level) = 400 × level^1.28 level(charge) = floor((charge / 400)^(1/1.28)) + 1 // Growth Level (cap 100, diminishing returns) level = floor(100 × (1 − e^(−0.0003 × points)))
Anti-Exploit Safeguards
- If accuracy < 60% →
accMultiplier = 0.25 - If difficulty < playerAbility × 0.7 → progressive reduction
- Hard cap: 50 charge per trial
Milestones
- 🎠Chest: Every 250 Cognitive Charge
- 🆠Reward: Every 1000 Cognitive Charge
Hearts / Energy System
| Aspect | Detail |
|---|---|
| Default hearts | 3 (configurable per mode via heartsStart) |
| Global energy max | settings.energyMax (default 5) |
| Heart lost on | Wrong answer (selection error) or timeout |
| Heart refill | No auto-refill during session; full reset on new session |
| Death condition | Hearts reach 0 → game ends immediately |
| Shared across modes? | No, each session starts fresh |
| Persistence | Hearts are NOT persisted between sessions |
Scoring Engine
Located in ScoringEngine.js — implements psychometrically valid scoring models.
PSI
Processing Speed
if RT ≤ 450ms: 100 (Elite) if RT ≥ 3000ms: 10 (Baseline) else: 100 × (1 − ((RT−450)/2550)^0.8) if acc < 90%: × (acc/90)^3
ICI
Inhibitory Control
impulseRate = impulsiveErrors / total
score = 100 − (impulseRate × 400)
− (otherErrorRate × 100)
ASI
Attention Stability
CV = SD(RT) / mean(RT) CV ≤ 0.15 → 100, CV ≥ 0.60 → 20 lapsePenalty = timeoutRate × 300
WMI
Working Memory
PathMemory only: span×0.45 + acc×0.40 + speed×0.15 Span normalized: (stable−2)/(9−2)
FI
Flexibility
switchCost = mean(switchRTs)
− mean(repeatRTs)
score = 100 − (cost/500 × 80)
Fallback: 0.4×PSI + 0.6×ASI
NeuroScore
Composite 0–1000
avg = (PSI+ACI+ICI+ASI [+WMI] [+FI])
/ count
NeuroScore = round(avg × 10)
XP Calculation
XP = round((50 + min(50, streak×5) + round(neuroScore×0.1)) × modeMult) + bonusXP modeMult: easy=1.0, medium=1.5, hard=2.0
Metrics Service — 5 Pillars
Located in metricsService.js — transforms raw telemetry into normalized 0–100 cognitive pillar
scores.
| Pillar | Composition |
|---|---|
| Speed | inv01(medianRT, 450, 3000) — per-step for PathMemory |
| Inhibition | 70% fast-wrong rate + 30% mode-specific (bias/impulse) |
| Attention | 45% CV(RT) + 35% timeout rate + 20% fatigue (2nd-half slowdown) |
| Flexibility | Recovery rate + switch cost + interference accuracy |
| Memory | PathMemory: span+pattern+order · Others: accuracy proxy |
Profile Aggregation (Rolling Average)
weight = e^(−ageDays / 10) // Exponential decay, ~10-day half-life globalMetric = Σ(sessMetric × weight) / Σ(weight) Uses last 30 session summaries across all modes.