Skip to content
Ritesh FirodiyaGet in touch

Work / AskCal / Wiki / Surfaces

clarify

Surfacecanonicalverified 2026-09-27

SURFACE.MOBILE.SCAN.CLARIFY

Summary

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é