Work / AskCal / Wiki / Surfaces
clarify
Surfacecanonicalverified 2026-09-27
SURFACE.MOBILE.SCAN.CLARIFYSummary
At most two questions the camera could not answer, asked before the number is shown.
Raw wireframe
- .context/designs/mobile/scan/clarify.html
Why it is drawn this way
This screen is the product. Everything else here is a calorie tracker. The harness number is the argument: roughly 39.4% median error guessing, and the questions exist to close it. See the-ask.
Before the result, never after it. Improving a number you have already accepted is a thing almost nobody does, so the ask sits between the estimate and the reveal. A "want to make this more accurate?" prompt on the result screen is the same feature with none of the uptake.
Two, and a hard ceiling of two. The cost of asking is measured in attention,
and the third question is where a person starts tapping anything to get to the
number. scanResultSchema caps the list, not the UI.
Only where the answer would move the number. A question about something the camera can already see spends the user's goodwill to tell the app what it knew.
One exit, whichever the user chooses. "Use my answers" and "Skip — leave them
as guesses" both land on the same result. A skipped question is not a failure
state: it comes back marked guessed, which is honest and is what the
confidence marks are for. See confidence.
It does not cost a scan, and the screen says so. No image is re-sent.
apps/functions/src/routes/clarify.ts charges no quota — it only checks that the
user has ever spent one (quota.used === 0 is a 400) and caps the route at 120
calls a day, which exists to stop the endpoint being used as a free estimator
rather than to limit anybody real.
That check is deliberately "has this user ever spent a scan", not "has
headroom left". Headroom would refuse to answer the questions on someone's very
last scan, because /scan reserves before the model call and the counter is
already at the limit by the time step two runs. Refusing there would take the
scan and withhold half of what it bought.
A failed clarify keeps the estimate. clarify.tsx catches and shows a toast;
the number the user is looking at stands and the flow continues to the result.
Losing the answers is better than replacing a real number with nothing, and the
scan is paid for either way. The toast is drawn in toasts.
Related
Sources
- .context/designs/mobile/scan/clarify.html
- apps/functions/src/routes/clarify.ts
Every project of mine is written down like this.
Read the résumé