Profile Infographic — Signal-to-UX Mapping¶
A designer-facing translation layer between the raw signal columns (see handoff-profile-schema.md) and the digital twin profile page.
Audience: someone designing the page from scratch. Not prescriptive about visuals — opinionated about what each signal is trying to say to the player, what shape of data to show, and when to hide it.
North star¶
The page should answer one question: "What has my twin learned about me?" — in a way that:
- Feels like a portrait, not a dashboard. Reference: Finch's daily check-in screen, Spotify Wrapped, Strava year-in-review. Not: Mixpanel.
- Rewards return visits. New facts surface as the model learns.
- Treats sparse data with grace. Empty states should feel like "still being painted," not "broken."
- Avoids judgment. Every signal is observation, not verdict. "You weight political dynamics" — not "you're political."
- Earns the player's trust in the model, which is the whole product thesis. If the page feels true, they delegate more.
Recommended page structure¶
┌────────────────────────────────────────────────┐
│ HERO │
│ Avatar / display name │
│ Sync score (big) + model confidence (small) │
│ Games played, current streak │
│ One-line headline insight ← DTA-generated │
├────────────────────────────────────────────────┤
│ HOW YOU REASON (Signal 1) │
│ WHAT YOU NOTICE (Signal 4) │
├────────────────────────────────────────────────┤
│ HOW YOU CHOOSE │
│ Driver mix per category (category_patterns) │
│ Context shifts (context_rules) │
├────────────────────────────────────────────────┤
│ IN A ROOM WITH OTHERS │
│ Persuadability (Signal 7) │
│ Dissent profile (Signal 9) │
│ Peer reading (Signal 8) │
├────────────────────────────────────────────────┤
│ KNOWING YOURSELF │
│ AI resonance (Signal 2) │
│ Confidence calibration (Signal 5) │
│ Authenticity (Signal 10) │
├────────────────────────────────────────────────┤
│ OVER TIME │
│ Learning rate (Signal 11) │
│ Occasion noise (Signal 12) │
│ Decision timing (Signal 6) │
├────────────────────────────────────────────────┤
│ IF NAME BIAS SIGNAL > 0: │
│ A NOTE ON BIAS (Signal 13) │
└────────────────────────────────────────────────┘
Sections after the hero should each collapse if all child signals are below their reveal threshold (see schema doc, sparsity decision tree).
Per-signal framing¶
For each signal: a section title, the headline value to extract, suggested visual, and how the framing changes between high and low values.
Hero — overall sync identity¶
Headline insight: a one-line generated sentence. Combine the dominant reasoning mode + top attention category + something distinctive (e.g. "A consequentialist who watches power dynamics — trusts outcomes over rules.").
This needs a small Claude call (or template + lookups) at page load, ideally cached for 24h.
How you reason — Signal 1¶
Source: reasoning_style_distribution.global
Shape: 6-slice radar / spider chart (since values sum to ~1) OR three-bar "top three" stack.
Headline metric: top mode + percentage. "Consequentialist (59%)"
Sub-copy: short prose for the dominant mode. "You weigh outcomes against each other rather than working from rules."
High variance: if top three modes are within 10 pts → "You shift modes depending on the call."
Sparsity: hide if null or fewer than 5 modes have non-zero values across all categories. (CoachJ qualifies — 3 modes detected.)
What you notice — Signal 4¶
Source: attention_distribution.global
Shape: same as reasoning — radar or top-three stack.
Headline: top attention category. "Political dynamics (45%)"
Sub-copy template: "When a scenario hits, your eye goes to {top}. {Sometimes} {bottom} too — but {bottom2} and {missing} usually don't make the cut."
Friction case: if dominant category is financial, soften copy ("you weight the numbers heavily" not "you're a money person").
How you choose, by category¶
Source: category_patterns
Shape: per-category card. Each card has the category name, a small driver-distribution bar (top 3 drivers), risk tolerance dial (0-1), decision-speed pill, games-in-category count, and recent_trend if present.
Headline metric per card: top driver in that category. "In governance scenarios → caution."
Empty state: "You haven't played any {category} scenarios yet. Try one to start building this profile."
Order cards by: games_in_category desc.
Context shifts¶
Source: context_rules
Shape: a list of "When X happens, you shift toward Y" sentences with a confidence dot (small/medium/large).
Sparsity: hide entirely if array is empty.
Format: "When the scenario mentions a crisis → you tilt toward caution (8 games)."
Reorder by: confidence desc.
AI resonance — Signal 2¶
Source: self_awareness.resonance_stats
Shape: three counters with a one-line ratio. The "gets me / off track / interesting" distribution.
Headline: gets_me / total as a percentage. "Your twin gets you 73% of the time."
Tone shift:
- ≥80%: "Your twin really gets you. High delegation potential."
- 50-80%: "Your twin is learning. Keep playing."
- <50%: "Your twin is still finding you. Try a different scenario type."
Milestones: if milestone_checks exists, show a small "Self-prediction streak" tile (last 5 milestones, aligned/missed).
Confidence calibration — Signal 5¶
Source: confidence_calibration.global
Shape: a single big number (calibration_score 0-1) plus a 2-bar mini-chart for over/underconfidence rates.
Headline copy variants:
- Score ≥0.7: "Your conviction matches reality. When you say you're sure, you usually are."
- Score 0.4-0.7: "Your conviction is roughly calibrated. Some surprises both ways."
- Score <0.4 with high overconfidence: "You feel certain more often than the data supports."
- Score <0.4 with high underconfidence: "You hedge more than you need to."
Sparsity: hide unless samples ≥ 10. (CoachJ at 7 samples → show "still learning" pill.)
Authenticity — Signal 10¶
Source: authenticity.alignment_rate
Shape: single number 0-1 + per-category bars if interesting.
Headline: "Your stated reasons match your choices {N}% of the time."
Tonal care: low alignment is not "you're inauthentic" — it's "your reasoning brain and choosing brain don't always agree." Phrase as observation, not accusation.
Persuadability — Signal 7¶
Source: persuadability.global_stand_rate
Shape: a single horizontal bar — left anchor "Persuadable", right anchor "Stands firm". Marker at global_stand_rate.
Headline: "After discussion, you stand by your original choice {stand_rate}% of the time."
Per-category secondary: small list of categories where stand rate diverges most from global.
Sparsity: hide unless total_discussions ≥ 5.
Dissent profile — Signal 9¶
Source: dissent_profile.consensus_deviation_rate.global
Shape: small "in-group / out-of-group" badge.
Headline copy variants:
- Deviation ≥ 0.7: "You vote against the room — {N} of {total} multiplayer games."
- 0.3-0.7: "You're flexible — sometimes with the group, sometimes apart."
- < 0.3: "You usually find consensus."
Sparsity: hide unless total_multiplayer_games ≥ 3. CoachJ qualifies barely (3 games, 100% deviation) — show with sample-size caveat.
Peer reading — Signal 8¶
Source: peer_reading
Shape: a small grid: confident-and-right, confident-and-wrong, hedged-and-right, hedged-and-wrong.
Headline: "When you're sure about someone else's call, you're right {accuracy_when_confident}% of the time."
Sparsity: hide if null (most solo-heavy players).
Learning rate — Signal 11¶
Source: learning_rate.global
Shape: a sparkline of prediction accuracy over time — needs join with recent_predictions.
Headline copy variants:
- Positive: "You're getting better at predicting yourself."
- Near zero: "Your accuracy is stable."
- Negative: "Your model has drifted — recent games surprised it."
Sparsity: hide unless meaningful longitudinal data (≥30 games + non-zero value).
Occasion noise — Signal 12¶
Source: occasion_noise.global
Shape: small dial 0-1.
Headline copy variants:
- < 0.2: "You're consistent across similar scenarios."
- 0.2-0.4: "Some variation — you bring different weights to similar calls."
- > 0.4: "You're context-sensitive — the same situation framed differently can land you somewhere else."
Sparsity: hide unless repeat_comparisons ≥ 3.
Decision timing — Signal 6¶
Source: timing_signature.global
Shape: avg time + a "fast / deliberate" pill based on mean_ms percentiles, plus a tiny note on speed_strength_correlation.
Headline: "Average call: {seconds}s. {Fast/Considered/Deliberate}."
Insight from correlation: if speed_strength_correlation > 0.4 → "When you're sure, you choose fast." If negative → "Your gut and your stated conviction disagree."
Sparsity: hide if global is empty {}. (CoachJ qualifies as hidden.)
Name bias — Signal 13¶
Source: name_bias_signal
Shape: only render this section if signal_strength > 0 AND total_scenarios_with_names ≥ 20.
Tone: this is the most sensitive signal. Frame as data the player can use, not a verdict. Suggested copy: "We watched {N} scenarios with named characters. We noticed your choices align more often with characters whose names sound {origin}."
Suppress if signal is near baseline noise (per ADR-028 thresholds).
Default: hidden — opt-in toggle in profile settings or surfaced only when signal is unambiguous.
Empty / sparse profile experience¶
A brand-new player should still see something. Suggested fallback hero:
Your twin doesn't know you yet. Play a few rounds and your portrait will start filling in.
[Stats so far: 2 games • 0% confidence] [Big "Play a quick round" CTA]
After ~5 games, partial sections start unlocking. Use a soft fade-in or "newly unlocked" badge to reward progress.
Cross-signal callouts¶
The page is more than the sum of its sections. Some interactions worth surfacing as standalone insight cards:
| Combination | Insight to surface |
|---|---|
High consensus_deviation_rate + low persuadability |
"You're a stable contrarian — you don't bend, even after discussion." |
High gets_me rate + high model_confidence |
"Your twin is ready for delegation experiments." |
High occasion_noise + low confidence_calibration |
"Your twin can't pin you down — you're overconfident in inconsistent calls." |
Strong political attention + consequentialist reasoning |
"You read the room and weigh the outcomes — strategic operator profile." |
These are derivable client-side from already-loaded data. Cap at 1-2 cards visible at a time.
What this page is NOT¶
- Not a leaderboard. No comparison to other players (until a separate "vs friends" page).
- Not a results screen. The post-game reveal already does that.
- Not a settings page. Configuration belongs elsewhere.
- Not a one-shot reveal. Players should want to come back to it.
Open design questions for Cici¶
- How much should this page lean visual (charts, illustrations) vs. textual (generated prose insights)?
- Should signals appear all-at-once or progressively unlock as thresholds are hit (with "newly unlocked!" affordance)?
- Should the player be able to show their profile to others (shareable card)? If yes, name bias signal needs careful gating.
- Is there a future "talk to your twin" entry point on this page — chat with the model that's looking at all this data?
- What happens if the player disagrees with what they see? Should there be a "this isn't me" feedback mechanism that adjusts weights?