Question types
Every entry in the questions map of POST /v1/systemone specifies one of three primitives via its type field: choice, noul, or score.
| Primitive | Question asks | Answer fields | Control-flow equivalent |
|---|---|---|---|
choice | Which of these 1–1,024 named options? | choice, probabilities, logits, confidence, mouse | switch (answer.choice) |
noul | Is this binary condition true? | noul (0.0 to 1.0), probabilities, logits, mouse | if (answer.noul >= threshold) |
score | Which of these 2–10 ordered rubric levels applies? | score, legend, probabilities, logits, confidence, mouse | if (answer.score >= level) / sort key |
Question IDs (the keys of your questions map) are for your code—they are echoed back in answers and are not sent to the model. Always write the full question in instructions and criteria.
choice
Section titled “choice”Use choice when the answer is one of a closed set of mutually exclusive options with no inherent numeric order: selecting a tool, routing a ticket to a department, or classifying a failure category.
Request shape
Section titled “Request shape”{ "next_tool": { "type": "choice", "instructions": "Which tool should handle `task` next?", "criteria": { "edit_file": "Modify source code in a file", "grep_search": "Search for symbols across the repository", "run_tests": "Execute the test suite", "ask_user": "Ask the user for clarification" } }}criteriais a JSON object mapping each option key (1to1,024options) to a description string, a structured JSON object, ornullwhen the option key is self-explanatory.- Include an explicit fallback option (such as
"other","unknown", or"none") whenever your option list might not cover every possible input. Without one, probabilities are still normalized to sum to1.0across the supplied options.
Answer shape
Section titled “Answer shape”{ "type": "choice", "choice": "edit_file", "confidence": 0.88, "probabilities": { "edit_file": 0.91, "grep_search": 0.06, "run_tests": 0.02, "ask_user": 0.01 }, "logits": { "edit_file": 2.41, "grep_search": -0.31, "run_tests": -1.41, "ask_user": -2.1 }, "mouse": { "calibrated": false, "p_top": 0.91, "abstain": null, "confidence_winning": 0.91, "confidence_normalized": 0.88 }}logitsare the raw per-option log-scores;softmax(logits) == probabilities. Log them withmodelif you fit thresholds offline.- Always threshold on
probabilities,mouse.p_top, or the margin between the top two options, not on a vendor'sconfidencescalar: the same distribution reads0.91under the winning convention and0.88under the normalized one. Both are returned by name inmouseso a threshold fitted elsewhere ports without arithmetic. - Pass
order_invariant: trueon the request to have Mouse score the question a second time with the options reversed and average the two distributions.
Use noul for a binary yes/no predicate: whether a command is safe to run without approval, whether a test log supports a completion claim, or whether a message requests a refund.
Request shape
Section titled “Request shape”{ "safe_to_run": { "type": "noul", "instructions": "Is `proposed_command` safe to execute without human approval?", "criteria": { "true": "Read-only command, local test run, or scoped cleanup inside ./tmp", "false": "Force push, production mutation, credential access, or destructive rm outside ./tmp" } }}- Phrase
instructionspositively so a value near1.0meanstrue(yes) and a value near0.0meansfalse(no). - Ask one atomic condition per
noul. Instead of asking"Is the command safe and did the user ask for it?", ask two separatenoulquestions (is_safe,user_requested) in the same request and combine them with&&in code. criteria({ "true": ..., "false": ... }) is optional; add it when you want to pin down subtle edge cases on each side of the boundary.
Answer shape
Section titled “Answer shape”{ "type": "noul", "noul": 0.03, "probabilities": { "false": 0.97, "true": 0.03 }, "logits": { "false": 1.74, "true": -1.74 }, "mouse": { "calibrated": false, "p_top": 0.97, "abstain": null, "confidence_winning": 0.97, "confidence_normalized": 0.94 }}noulis the probability oftrue(0.0to1.0).probabilitiescarries the same distribution in the shapechoiceuses, so one code path can read every answer type.mouse.p_topis (\max(\text{noul}, 1 - \text{noul})) (0.97above, because the model is 97% certain the answer isfalse).
Use score when the judgment falls along an ordered spectrum of 2 to 10 concrete levels: patch quality, bug severity, customer frustration, or action blast radius.
Request shape
Section titled “Request shape”{ "patch_quality": { "type": "score", "instructions": "How completely does the patch address `objective`?", "criteria": [ "Tests fail, build breaks, or objective is missed", "Partial fix or missing regression test", "Addresses objective cleanly and all checks pass" ] }}criteriais an ordered array of level descriptions from index0(lowest) toN - 1(highest).- Describe concrete situations, never bare numbers or vague degrees: Write
"Broken feature, but a workaround exists", not"Medium"or"1". Each level is scored againststateon its own wording.
Answer shape
Section titled “Answer shape”{ "type": "score", "score": 1.88, "confidence": 0.85, "legend": { "0": "Tests fail, build breaks, or objective is missed", "1": "Partial fix or missing regression test", "2": "Addresses objective cleanly and all checks pass" }, "probabilities": { "0": 0.02, "1": 0.08, "2": 0.90 }, "logits": { "0": -3.81, "1": -2.42, "2": 0.0 }, "mouse": { "calibrated": false, "p_top": 0.90, "abstain": null, "confidence_winning": 0.90, "confidence_normalized": 0.85 }}scoreis the expectation-weighted average level index: [ \text{score} = \sum_{i=0}^{k-1} i \cdot p_i = 0 \times 0.02 + 1 \times 0.08 + 2 \times 0.90 = 1.88 ]- To combine multiple
scorequestions of different lengths in code, normalize each score to0.0 .. 1.0by dividing bylen(criteria) - 1.
How confidence is calculated
Section titled “How confidence is calculated”choice and score answers include a confidence field in 0.0 .. 1.0 computed deterministically from probabilities. Mouse uses the exact System One confidence formulas so thresholds behave identically across compatible clients.
choice confidence
Section titled “choice confidence”For a choice question with (k) options and top probability (p_{\max} = \max_i p_i):
[ \text{confidence} = \frac{p_{\max} - \frac{1}{k}}{1 - \frac{1}{k}} ]
- When probability is split evenly across all (k) options ((p_{\max} = 1/k)),
confidenceis0.0. - When all probability is concentrated on a single option ((p_{\max} = 1.0)),
confidenceis1.0. - Note the difference between
confidenceandmouse.p_top: on a 3-optionchoicewith probabilities(0.60, 0.30, 0.10),mouse.p_topis0.60whileconfidenceis ((0.60 - 1/3) / (2/3) = 0.40).
score confidence
Section titled “score confidence”Because score levels are ordered ((0, 1, \dots, k-1)), probability mass on an adjacent level reduces confidence less than probability mass on the opposite end of the scale. Let (m = \arg\max_i p_i) be the mode level:
[ \text{confidence} = \max\left(0,\ 1 - \frac{\sum_{i=0}^{k-1} p_i , |i - m|}{\text{MAD}{\text{unif}}}\right), \qquad \text{MAD}{\text{unif}} = \frac{1}{k} \sum_{i=0}^{k-1} \left| i - \frac{k - 1}{2} \right| ]
- On a 3-level scale (
0, 1, 2), a split between adjacent levels(0.0, 0.5, 0.5)hasconfidence = 0.25. - A bimodal split between opposite ends
(0.5, 0.0, 0.5)hasconfidence = 0.0, even though both distributions have the same expectedscore(1.0vs1.5).
noul certainty
Section titled “noul certainty”A noul answer has only two outcomes (false and true), so noul itself carries both the direction and the certainty. If you need a 0.0 .. 1.0 certainty scalar on the same scale as choice confidence, use:
[ \text{confidence} = |2 \cdot \text{noul} - 1| = 2 \cdot \text{mouse.p_top} - 1 ]
Structured instructions and criteria
Section titled “Structured instructions and criteria”instructions and every entry in criteria accept structured JSON objects and arrays in addition to plain strings.
When two choice options are easily confused, pass a structured object with consistent keys (what, not_for, examples) on each option to sharpen the boundary:
{ "return_topic": { "type": "choice", "instructions": { "question": "What is the customer asking about in `ticket.message`?", "focus": "Distinguish policy questions before a return from status checks on an existing return." }, "criteria": { "return_policy": { "what": "Rules, eligibility window, or fees for returning an item", "not_for": "Checking on an item that was already shipped back", "examples": ["Can I return sale items?", "Do you charge a restocking fee?"] }, "return_status": { "what": "Where an in-progress return or refund stands right now", "not_for": "General policy questions before starting a return", "examples": ["I mailed my return last Tuesday, where is my refund?"] } } }}