MD Reader Open in MD Reader

Advanced Cognitive Metrics — Requirements v3.1

Date: June 2026
Status: Post-alignment, ready for engineering scoping
Platform: Flutter (iOS + Android) + Web
SKU: Platinum-exclusive (with limited free-tier exposure)


1. Feature Summary

Five cognitive metrics surface deeper brain performance insights for Platinum subscribers inside the existing My Brain tab. Users discover their "Cognitive Fingerprint" — a personalized radar shape showing how they respond, stay consistent, focus, filter distractions, and adapt across training.

Primary goal: Drive Platinum conversion and retention.
User value: Users learn what kind of thinker they are — fast or deliberate, steady or burst, adaptable or anchored — through a personalized Cognitive Fingerprint that evolves with training.
Unlock condition: Cognitive Profile is visible once all 5 metrics are unlocked (minimum 6 plays per applicable game). Until then, users see a building state with per-game unlock progress.


2. The Five Metrics

2.1 Responding

2.2 Consistency

2.3 Focus

2.4 Filtering

2.5 Agility


3. Game Coverage Matrix

Three metrics (Responding, Focus, Consistency) are common across all 6 games. Filtering and Agility apply to subsets.

Game Responding Focus Consistency Filtering Agility
Speed Match
Color Match
Lost in Migration
Ebb & Flow
Brain Shift
Disillusion

4. Scoring & Aggregation

4.1 How the Score Works

At the game level (per metric):

  1. Compute the raw metric value for the user's play of that game
  2. Determine the user's combined nth play of that game across all platforms (e.g., 30 web plays + 1 mobile play = play 31)
  3. Look up the percentile for that raw value against the platform-specific distribution for that game, metric, age bracket, and combined nth play. The nth play determines which cohort slice to compare against; the platform determines which distribution to use.
  4. That percentile becomes the user's 0–100 score for that game on that metric

At the Cognitive Profile level (per metric):

  1. Average the per-game scores across all applicable games for that metric (weighted by plays, capped at 20)
  2. Map the averaged score to a spectrum label (e.g., 78 → "Steady" for Filtering)
  3. Plot on the radar chart

4.2 Cross-Game Aggregation

Step 1: Per-play, play-count-matched percentile. User's nth play of Game X compared against everyone else's nth play within the same cohort.

Cohort definition:

Step 2: Smooth per-game percentiles via moving average (window size TBD by science, recommend 10+).

Step 3: Weighted average across games, weight capped at 20 plays per game.

Step 4: Map aggregate percentile to identity category (Spectrum label).

4.3 Percentile Lookup Keys

metric + nth_game_play + age (±5 years) + game + platform

Play count granularity:

Percentile comparison is play-count-matched — user's nth play is compared against everyone else's nth play. Exact match for early plays, bucketed at high play counts where the comparison pool thins out:

Plays Granularity Example keys
1–100 Exact nth play p1, p2, p3, ... p100
101–200 Groups of 10 p101-110, p111-120, ...
201–500 Groups of 50 p201-250, p251-300, ...
500+ Single bucket p500+

Science team to confirm where exact-match should stop and bucketing should start. If meaningful improvement still happens at play 100, the cutoff should be higher.

Data shape (mirrors existing LPI game percentile tables):

Each lookup entry is a pair of parallel arrays:

{ scores: number[], percentiles: number[] }

Consumer does binary search / interpolation over scores[] to find matching percentiles[] value — same pattern as existing getPercentileTable in game-score-data/lpi-percentiles.

Estimated table size: ~130 play buckets × 12 age buckets × 6 games × 5 metrics × 3 platforms ≈ 140,000 entries. Each entry is two small arrays. Fits comfortably in JSON files using the same game-score-data/ repo pattern.

Example entries:

Lookup: filtering × ebb_and_flow × ios × age_25-30 × p12 (12th play)

{
  scores:      [0.02, 0.05, 0.08, 0.11, 0.14, 0.17, 0.20, 0.25, 0.32],
  percentiles: [95,   85,   75,   60,   50,   40,   30,   15,   5   ]
}

A user whose congruency effect is 0.11 on their 12th play → binary search lands between 0.11 and 0.14 → interpolate → score ≈ 60.

Lookup: filtering × ebb_and_flow × ios × age_25-30 × p1 (1st play, same everything else)

{
  scores:      [0.08, 0.14, 0.20, 0.26, 0.32, 0.38, 0.44, 0.52, 0.60],
  percentiles: [95,   85,   75,   60,   50,   40,   30,   15,   5   ]
}

Same metric, same user profile, but play 1 instead of play 12. A congruency effect of 0.20 is 75th percentile on play 1 but only 30th percentile by play 12 — the cohort improved with practice, so the bar moved. This is the play-count-matching at work.

Note: For filtering and agility, lower raw scores = better (less interference), so scores runs low→high while percentiles runs high→low. The negation in the science formula (−congruency_effect) flips this before the user sees it — they see 0–100 where higher is better.

4.4 Known Constraints


5. Unlock & Building States

5.1 Minimum Data Requirements

5.2 Building State (pre-unlock)

Profile page: Show locked/blurred Cognitive Fingerprint with progress indicator:

Game level: After each game play, show which metrics that game contributes to:

5.3 Partial Unlock

If some metrics are unlocked but not all, the radar chart shows unlocked axes normally and locked axes as dashed lines at center. Users can still tap unlocked metrics to see detail.


6. Page Structure

6.1 Profile Overview Page

Location: My Brain → Profile tab

Header:

Radar chart ("Your Cognitive Fingerprint"):

Interaction: Tapping a radar dimension opens the metric detail in a sidebar (web) or drawer (mobile).

Metric detail panel (per metric):

6.2 Share Fingerprint


7. Tier Gating & Conversion

Element Free / Premium Platinum
Radar chart 🔒 Blurred, or show 1–2 metrics ✅ Full
Metric detail 🔒 Not accessible ✅ Full
Post-game metric teaser ✅ Show for first few plays, then gate ✅ Full
Share 🔒 Not accessible ✅ Full

Conversion strategy: Show 1–2 metrics (e.g., Responding + one trainable metric) to free users, blur the rest. When they tap the Cognitive Profile tab, show unlock CTA. Post-game teasers shown a few times before requiring Platinum.

Upgrade CTA: "You're putting in the work — see what it's doing."


8. Post-Game Flow

8.1 "Analyse My Play" (v1)

After a game play, users can tap "Analyse my play" to see:

  1. LPI graph — existing game LPI trajectory (already built)
  2. 3 advanced metrics for that game — each showing identity label, score (0–100), and spectrum bar:
    • 2 from the common metrics (Responding, Focus, Consistency — present in all 6 games)
    • 1 game-specific metric (Filtering or Agility, depending on the game)
  3. Training tip — game-specific advice

Which 3 metrics per game:

Game Common metrics shown (pick 2) Game-specific metric
Speed Match Responding, Consistency — (no game-specific metric; show Focus as 3rd)
Color Match Responding, Consistency Filtering
Lost in Migration Responding, Focus Filtering
Ebb & Flow Responding, Focus Agility
Brain Shift Responding, Consistency Filtering
Disillusion Responding, Focus Agility

⚠️ NEEDS ALIGNMENT: Games with both Filtering and Agility (E&F, BS, Disillusion) — which one is the "game-specific" metric shown? And which 2 of the 3 common metrics are picked? The table above is a starting proposal — needs validation with science/design on which metrics are most relevant per game.

8.2 Score-over-plays graph at game level

Open question: Do we show a score-over-plays graph (game play count on X-axis, 0–100 score on Y-axis) for each metric within the post-game "Analyse my play" view? This would be per-game, not aggregated across games.

8.3 P2 (after v1 ships)


9. Data Pipeline Requirements

9.1 Per-Play Computation

9.2 Percentile Pipeline (monthly batch)

9.3 Aggregation Pipeline (per user, on next game play)

9.4 Cross-Platform Play History


10. Smoothing Requirements

Surface Smoothing
Score (0–100) Moving average on percentile-derived score (window TBD, recommend 10+)
Identity label Hysteresis: label only changes after sustained shift
Radar chart axes Uses current smoothed aggregate

11. Identity Label Thresholds

Percentile Range Label Position
0–33rd Below Average (left spectrum label)
33rd–66th Average (middle spectrum label)
66th–100th Above Average (right spectrum label)

Default: Equal thirds. Science team (Bob/Sricharan) to validate whether equal thirds produce meaningful, stable categories or whether custom boundaries are needed per metric.

Hysteresis: Labels require sustained percentile shift before changing. Prevents daily oscillation on noisy data.


12. Open Questions

Question Owner Priority
Extreme play counts (1000th play) — how does percentile lookup work when very few users reach that level? Science High
Play count bucketing cutoff — at what nth play should we stop exact-match and start grouping? Currently proposed at play 100. Depends on whether meaningful improvement still happens beyond that point. Science (Bob/Sricharan) High
Game changes / score versioning — if a game's scoring changes, do we need a version construct? How to notify users? Engineering / Product Medium
Label boundaries — 1/3 splits or custom per metric? Science (Bob/Sricharan) High
Show metrics for games beyond the core 6? — Could show advanced stats inside any game, even if not part of the Cognitive Profile Product / Design Medium
Score-over-time graph? — No graph exists currently. Do we show a score-over-plays chart at game level (Section 8.2), profile level, or both? Product / Design Medium
Which 3 metrics per game in post-game? — Games with both Filtering and Agility need a rule for which to show. See Section 8.1. Product / Science High
Smoothing window size — Individual play-to-play percentiles swing 30–40 points between consecutive plays (observed in Sricharan's data report). A moving average stabilizes the per-game score before cross-game aggregation. Too small (3–5 plays) and the score still wobbles visibly between sessions. Too large (15–20) and the score barely moves, making the profile feel static. Recommend starting at 10 and validating against the data report's individual plots. Alternatively, if the 6-play minimum already provides enough stability, smoothing may not be needed — science to validate. Science High
Hysteresis band for label stability — Without hysteresis, a user hovering near a threshold (e.g., 66th percentile boundary between "Selective" and "Steady" for Filtering) would flip labels between sessions as their smoothed score wobbles across the line. Hysteresis means requiring a sustained shift past the threshold before changing the label (e.g., must stay above 70th for 3 consecutive updates to move from "Selective" to "Steady," and must drop below 62nd to move back). Science to define: how wide should the band be (±3 percentile points? ±5?), and how many consecutive readings must confirm the shift? Science Medium

13. Dependencies

Dependency Owner Status
Percentile pipeline (monthly batch) Data Eng Not started
Cross-platform play numbering API Backend Eng Confirm availability
Identity threshold validation (1/3 vs custom) Science Not started
Smoothing window size Science Not started
Game metadata spec (full stat availability per game) Science / Data Not received

14. Design Reference

Figma: Cognitron V3
Copy doc: Product Copy Spreadsheet


15. Revision History

Version Date Changes
1.0–1.5 Mar 2026 Initial spec through game list corrections
2.0 Jun 2026 Consolidated requirements doc
3.0 Jun 2026 Reconciled with Figma V3 + Kacey's copy doc
3.1 Jun 2026 Post-alignment call. Confirmed formulas, game list, min plays, percentile execution, gating.
3.1.1 Jun 2026 Removed Layer 2 per-game raw value charts — "Trends over time" now shows score (percentile-derived 0–100) over game plays. Removed snapshot comparison and change indicators. Removed Brain Grade references.