ADR-017: "None of the Above" as a First-Class Choice¶
Status: Accepted (amended by ADR-082 — the mandatory closest-match pick is now optional under an explicit genuine-indifference toggle) Date: 2026-03-31 Context: Players occasionally encounter scenarios where none of the four options reflect their actual position. CoachJ hit this with a remote work scenario — he's 100% pro-remote and none of the options captured that. He picked the least-bad option and explained in his rationale, but that forced choice pollutes the profile with a decision that isn't authentic. Separately, players sometimes feel genuinely uncertain ("I don't know what to do here") — a different problem from "my answer isn't represented" but with similar UX needs.
At a glance
What it decides: Players get a fifth "None of the above" option on every scenario, so a wrong option set never forces an inauthentic pick. (Later amended by ADR-082: the closest-match pick became optional when a player is genuinely indifferent.)
- Closest-pick + required free-text when None is chosen: a weak directional signal plus high-value rationale data
- Sync score freezes, XP is zero so the option is honest to use but not gameable, and the rationale still trains the digital twin
- Rejected a usage cooldown as arbitrary; required free-text is friction enough
- Watch the usage rate — if None exceeds ~15% across players, the scenario generator likely needs better option diversity
flowchart LR
A["Player faces 4 options"] --> B{"Position represented?"}
B -->|Yes| C["Pick an option<br/>(scored, XP earned)"]
B -->|No| D["None of the above"]
D --> E["Pick closest<br/>(0.3x weight)"]
D --> F["Explain what they'd do<br/>(required, full weight)"]
E --> G["Sync score frozen, XP zero"]
F --> G
The "None of the above" path: a closest pick plus required rationale, with the sync score frozen and no XP.
Decision¶
Add a fifth option — "None of the above" — to both solo and multiplayer choosing phases. When selected, the player must:
- Pick the closest option ("If I had to choose, which is closest?") — this provides a weak directional signal
- Explain what they'd actually do (required free-text) — this becomes high-value training data for the DTA
Scoring rules for "None" choices:¶
- Sync score: no change — the AI can't be right or wrong about a non-choice
- Profile update: closest pick at 0.3x weight — same as a low-conviction choice, prevents noise while capturing a weak signal
- Rationale text: full keyword extraction — the free-text explaining what they'd actually do feeds driver classification and keyword preferences at normal weight
- XP: zero — you opted out of the core mechanic
- Learning note: flags as "unresolved context" — the DTA learns "my operator has no pattern here, and their stated preference was [X]"
UI:¶
- Subtle inline hint when "None" is selected: "No sync points for this round — your rationale still trains your DTA"
- The "closest pick" sub-selector appears after selecting "None"
Rationale¶
Forced choices from wrong option sets are noise, not signal¶
When a player picks an option they disagree with, the profile learns a false pattern. This is worse than learning nothing. The "None" mechanic gives the player an honest escape valve while still capturing useful data through the rationale text and closest-pick ranking.
"None" captures two distinct situations, both valuable¶
- "My real answer isn't here" — The option set failed. The free-text captures the authentic preference. Over time, if specific scenario categories generate frequent "None" responses, that's a signal the scenario generator needs better option diversity.
- "I genuinely don't know" — The player lacks conviction or context. This is an explicit signal for the delegation map (ADR-011): contexts where the DTA should not auto-decide. Combined with ADR-015 (conviction as signal) and ADR-016 (delegation), this completes the chain: low conviction → "None" → delegation candidate.
The closest-pick sub-question preserves weak signal¶
Pure "None" with no ranking would be a data void. "None, but closest is B" gives the system a 0.3x-weighted directional signal — enough to notice trends (e.g., "even when this player says None, they lean toward cautious options") without overweighting a non-authentic choice.
Sync score freeze is the right incentive¶
No penalty prevents players from being honest. No reward prevents players from gaming the system by always picking "None" to avoid sync score drops. The XP zero adds a soft cost — you don't progress, but you're not punished.
Alternatives Considered¶
-
No "None" option — force a choice every time: The current behavior. Rejected because: forced choices from wrong option sets produce false signal. The game's diagnostic value depends on authentic responses.
-
"None" without closest pick: Just free text. Rejected because: a ranking, even a reluctant one, provides weak directional signal that's better than nothing. It also keeps the player engaged with the options rather than fully disengaging.
-
"None" with cooldown (1 per 5 games): Prevent overuse by limiting frequency. Rejected because: arbitrary. A player might legitimately hit two bad option sets in a row. The XP-zero cost and the required free-text are sufficient friction to prevent casual overuse.
-
"None" only in solo, not multiplayer: In multiplayer, ADR-016's delegation handles the "I don't know" case. Rejected because: the "my answer isn't here" case still applies in multiplayer, and having consistent mechanics across modes is simpler for the player and the codebase.
Discussion¶
The key tension debated was whether "None" undermines the game's forcing function. The whole diagnostic value of Sync comes from making people choose between imperfect options — that's how values are revealed. If "None" is too easy, players will use it to avoid hard decisions rather than for genuine edge cases.
The resolution was that the required free-text + closest-pick sub-question creates enough friction to prevent casual use while being accessible for genuine cases. A player who truly has no opinion won't write a paragraph explaining their alternative — but a player who's 100% pro-remote and can't find their position WILL write that, and that's exactly the data we want.
The XP-zero cost was debated: should it be half XP to acknowledge engagement? The decision was zero, because XP represents participation in the game's core mechanic (choosing), and "None" is explicitly opting out of that. The player still gets DTA training value from their rationale — that's the reward.
Consequences¶
- Players have an honest escape valve for scenarios where the option set doesn't fit
- The DTA learns about unresolved contexts where it should defer rather than auto-decide
- Scenario quality feedback loop: frequent "None" responses in a category signal the generator needs improvement
- Profile data quality improves — fewer false signals from forced inauthentic choices
- Small increase in choosing phase UI complexity (fifth option, sub-selector, required text)
- Need to monitor "None" usage rate — if it exceeds ~15% across all players, the scenario generator may need attention
Key files:
- src/app/play/[sessionId]/page.tsx — Choosing phase UI (multiplayer)
- src/app/solo/[scenarioId]/page.tsx — Choosing phase UI (solo)
- src/types/database.ts — Add none_of_above boolean + none_closest_option_id + none_rationale to Choice type
- src/app/api/sessions/complete/route.ts — Skip sync delta for none_of_above choices
- src/lib/ai/player-model.ts — Apply 0.3x weight for closest pick, full weight for rationale keywords
- src/lib/ai/learning-notes.ts — Flag unresolved context in learning note prompt
- Migration — Add columns to choices table