Brief: How to handle "None of the above" picks¶
Status: Decision brief — for product call
Date: 2026-05-31
Companion to: measurement-schema.md (the technical schema) and measurement-schema-readers-guide.md (the plain-language explainer)
What this brief is for¶
Two specific questions came out of the measurement schema work. Both are about how Pulse handles "None of the above" (NoTA) picks. They're coupled and worth deciding together.
If you don't pick A/B/C/D, Pulse does two things today:
- You get zero sync-score points for that round (because there's no AI prediction to match)
- Pulse asks: "which option is closest to what you'd do?" and uses your forced answer for the per-category profile pattern
Both choices are defensible. But each one has a problem in specific player shapes — particularly for players who restructure binary framings often (CoachJ does this; many designers/founders do this).
This brief lays out the problem, the options, and a recommended path.
OQ-1: The sync-score collapse problem¶
What's happening: A player who picks NoTA often (because the framing is wrong for them) accumulates many rounds where they earn zero sync points. Even though their underlying profile is rich (we capture their rationale text, their pattern of restructuring, the cube vectors they decline to choose within), their headline sync score collapses.
Example: CoachJ has played 83 games. If 40 of those were NoTA picks, his sync_score is built from only ~43 prediction-match rounds. The percentage looks comparable to someone who played 43 within-options rounds total — but the player profiles are very different.
Why this matters: - The sync_score headline is what users see on Twin/share/rankings - For paste-based agents (ChatGPT users via custom instructions), the headline gets baked into static text - A player who restructures often looks like a "low sync" player at the headline even when their profile is high-quality
What the schema already does: The schema has a workaround — the agent prose can describe pragmatic-routers via "frame-restructuring tendency" (M7) instead of the raw score. The Swing 1 repeat finding showed this works without changes to OQ-1 itself. But it requires that downstream agents (Hermes, ChatGPT custom instructions, etc.) actually reference M7-derived language. The headline collapse remains.
Three options for OQ-1¶
Option A — Add a "Profile Quality" measure separate from sync_score. - Sync_score stays as-is (prediction-match accuracy) - Add a new aggregation: profile-quality = signal richness measure based on rationale density × signal-firing rate × capture-completeness - Display both on the Twin page: "Sync: 50% · Profile: rich" - Pragmatic-routers get a high profile-quality even with low sync_score, telling the story honestly
Option B — Add a 4th dimension to the Three Sync Dimensions. - ADR-045 has three actionable dimensions (Accuracy, Coverage, Readability) on the Play screen - Add a fourth: "Depth" or "Richness" - Same display surface, no new headline competition - Slightly more work because ADR-045 explicitly chose "actionable" as the test — Depth would need an action attached ("play more deeply" isn't really actionable)
Option C — Exposure-only fix: always show sync_score with denominator + dimensions. - Never display "sync_score: 50%" alone - Always show "sync_score: 50% (based on 43 of 83 games)" + the three dimensions - For paste-based users, static text includes the denominator - Cheapest — no new primitives or architecture, just exposure discipline - Matches what Convention 6 already requires for aggregations
Recommendation for OQ-1¶
Option C. Cheapest, aligns with Convention 6 already promoted, doesn't add architecture, and works for paste-based users without requiring downstream agent updates. The honest "based on N rounds" suffix tells the story without needing new primitives.
Option A is interesting but adds a new aggregation primitive and competes for headline attention. Option B is harder than it looks because the "actionable" test is hard for a Depth dimension.
OQ-2: The forced closest-match contamination problem¶
What's happening: When you pick NoTA, Pulse asks "which option is closest to what you'd do?" Today the system forces you to pick one. For some players this is wrong:
- Player A picks NoTA because none feels right but B is closest. Forced pick = B. Pulse correctly captures a mild lean toward B.
- Player B picks NoTA because their actual move is something completely different (delegate, restructure, refuse the frame). Forced pick = arbitrary. Pulse fabricates a B-lean that doesn't exist.
The schema treats both forced picks as if they were real choices, contaminating the per-category patterns for pragmatic-routers.
Your intuition (recommended path)¶
You proposed: make the closest-match question optional, with "no closest" as an explicit choice.
This is exactly right and the cleanest closure. Specifically:
- After NoTA, ask "Which option is closest to what you'd do? Or none of them?"
- Player picks A/B/C/D → great, we have a directional signal
- Player picks "none of them" → we record this as a distinct state ("genuine no-closest"), don't fabricate a driver
This avoids the contamination by capturing the signal that's actually there.
Compatibility with the existing runner-up feature¶
You mentioned the runner-up pick (clear-choice vs genuinely-torn). The runner-up answers a different question — for non-NoTA rounds, what was your second choice? That stays as-is. The OQ-2 fix is specifically about the NoTA follow-up.
The two features are independent and don't conflict.
What needs to ship¶
Capture layer: add a column or modify the existing closest-match capture to allow a "no-closest" value.
Extraction layer: when "no-closest" is recorded, the chosen-driver extraction (E_chosen_driver) returns null instead of using the forced pick's substrate driver tag.
Aggregation layer: A4 (category_patterns) gets no contribution from no-closest rounds, instead of fabricated contribution from forced-closest.
Exposure layer: the Pulse agent's prose can describe pragmatic-routers via M7 (frame-restructuring tendency) firing high and the no-closest rate, telling a richer story.
Recommendation for OQ-2¶
Your proposal as stated. Make closest-match optional with "no closest" as explicit choice.
Sequencing: OQ-1 and OQ-2 together¶
Both are independent of each other — can ship in any order. But they're cleaner together:
- OQ-1 Option C (always show denominator) tells the honest sync_score story
- OQ-2 fix removes the underlying contamination that makes the sync_score story honest in the first place
After both ship, pragmatic-routers are correctly characterized: - Their sync_score is shown with denominator (honest count) - Their NoTA + no-closest rate is captured as its own signal - Their A4 patterns are clean (not contaminated by forced-closest) - Their M7 surfaces in agent prose - For paste-based users, the static text accurately describes them
What about Swing 3 Closure A (verbal-style normalization)?¶
This was flagged as a coupled prerequisite for OQ-2's heaviest closure (Closure C in the schema work — letting the rationale text classifier override the forced closest pick). With your proposed path (Option for OQ-2 = explicit no-closest choice in UI), Swing 3 Closure A is no longer required for OQ-2. It's still useful for other reasons (the HG hedger profile-class discrimination from Decomposition 11) but it's decoupled from OQ-2.
This is a meaningful sequencing benefit. Your OQ-2 path is simpler than the schema-internal closure analysis assumed.
What I'd want to confirm before shipping¶
- UX design for "no closest" choice — copy, button placement, dismissibility
- Does the no-closest rate become its own surfaced signal (insights page, agent prose), or just a clean null state? My recommendation: surface it. High no-closest rate is meaningful information.
- Migration: existing forced-closest historical data stays as-is or gets re-classified as suspect? Recommendation: stays as-is (don't rewrite history); going forward uses the new path.
Summary¶
| Question | Recommended path | Why |
|---|---|---|
| OQ-1 (sync_score collapse) | Option C: always show denominator | Cheapest, aligns with Convention 6 already promoted, no new primitives |
| OQ-2 (forced closest contamination) | Your proposal: explicit "no closest" choice | Captures the signal that's actually there; decouples from Swing 3 closure |
Both can ship independently. Together they make pragmatic-routers honestly representable at every layer of the schema.