Skip to content

ADR-081: Commit conviction before rationale in the solo choosing flow

Status: Accepted Date: 2026-06-01 Context: On the solo choosing screen (src/app/solo/page.tsx), after a player picks an option the "Teach Your Digital Twin" block asked for three things in this order: (1) free-text rationale, (2) decision factors, (3) conviction strength ("How clear was this choice for you?"). This ordering has two problems. First, many players don't form an explicit sense of how confident they are until they reach the conviction slider — by which point the rationale is already written without that framing, so it rarely references the conviction. Second, when conviction is rated after the rationale, the rating is a post-articulation rationalization (the player has just talked themselves into a position) rather than a pre-articulation gut feeling. Both weaken the measurement signal the block exists to capture.

Decision

Reorder the three controls in the "Teach Your Digital Twin" block so conviction is committed before the rationale is written. New order:

  1. Player picks an option (unchanged, separate block above)
  2. Conviction strength ("How clear was this choice for you?")
  3. Decision factors (pick 1–3)
  4. Rationale (free text) — now the last articulation step before submit

The block's section header/intro ("Teach Your Digital Twin" + "What drove this decision?…") stays pinned at the top of the block as a block-level intro; only the conviction / factors / rationale sub-sections were reordered beneath it. The rationale sub-section gained its own h4 label ("In your words, why this choice?") since it no longer sits directly under the block header.

Submit-button status copy was reprioritized to match the new order: Select an option above → (NoTA: pick closest → describe) → Rate how clearly this stands out → Pick at least 1 factor → Rationale needed (X/20) → Reveal AI Prediction. The disabled-state boolean is unchanged (it is an order-independent conjunction; only the human-readable status string is order-sensitive).

The "None of the above" path keeps its own sub-UI (closest-option picker + "what you'd actually do" text) in the options block above, unchanged. For NoTA, conviction + factors are still required and rationale is still optional, exactly as before.

Rationale

  • Conviction-as-gut-feeling is better signal. Capturing conviction before the player writes prose means it reflects the felt clarity of the choice, not a number reverse-engineered to be consistent with a rationale they just wrote. This feeds E5 (calibration) more honestly.
  • E10 (rationale–choice expression match) is more honest when the rationale comes last. When conviction is already on screen and committed, players naturally fold "I'm at a 4 because…" reasoning into their words. The rationale becomes the final articulation step with the conviction sitting in view as a prompt, instead of an isolated first step.
  • Rationale-at-the-bottom is the right mobile shape. The free-text input is the only keyboard-summoning control in the block; placing it immediately above the submit button means the on-screen keyboard pushes the submit button into view rather than burying the tap-only factor/conviction chips.

Alternatives Considered

  • Leave the order as-is and add coaching copy ("think about your confidence before writing"): rejected — copy nudges are weaker than structural ordering, and the post-articulation rationalization problem remains because the slider is still last.
  • Move only conviction above rationale, keep factors last: rejected — factors are tap-only chips and rationale is the keyboard input; keeping rationale last is better for mobile, and grouping the two structured (tap-only) inputs (conviction, factors) before the free-text input is cleaner.
  • Make conviction a hard gate that hides the rationale until set: rejected as over-engineering — the reorder achieves the intent (conviction committed first) without adding a progressive-disclosure interaction the rest of the screen doesn't use.

Discussion

The core trade-off debated was whether reordering alone changes behavior or whether a harder commit (e.g. locking conviction before revealing the rationale field) is needed. Per the "ship and observe" principle, we took the lighter structural change first: reorder, observe whether rationales start referencing conviction and whether the conviction distribution shifts, and only escalate to a hard gate if the soft ordering proves insufficient. The change is purely presentational — no schema, no analytics-event, and no validation-logic changes — so it is cheap to ship and cheap to revert if the signal doesn't improve. Analytics were checked: the only ordering-sensitive instrumentation is the option-tap trace and decision-time timer, both keyed off option selection and submit (not the rationale/conviction/factor sub-steps), so no event names or assumptions needed updating.

Consequences

  • Players now commit conviction before articulating, which should produce rationales that more often reference and explain their confidence level — watch for this in playtest rationale text and in the E5/E10 signal quality.
  • The conviction-strength distribution may shift (pre-articulation gut feelings may skew differently from post-articulation ratings). This is the intended effect, but means historical conviction data is not strictly comparable to post-change data — note the 2026-06-01 cutover when analyzing conviction trends.
  • NoTA flow is unaffected; both paths were verified to render cleanly under the new top-level order.
  • Revisit trigger: if playtest shows rationales still rarely reference conviction, escalate to a progressive-disclosure gate (conviction must be set before the rationale field appears).

Key files: - src/app/solo/page.tsx — "Teach Your Digital Twin" block reordered (conviction → factors → rationale); submit-button status copy reprioritized - docs/research/foundations/measurement-schema-readers-guide.md — E5 (calibration), E10 (rationale–choice expression match) context - docs/decisions/024-judgment-layer-signals.md — judgment-layer signals this feeds