Route Readiness โ One Answer per Route Option
How RoadScope turns the constraint verdicts of a route option into one status per declared load, how a human decision sits next to it, and why every channel quotes the same rows.
One Status per Route Option and Load
A map can hold several route options (a route or a chain of declared legs). For every option and every declared load, RoadScope aggregates the constraint verdicts of the POIs on that option into a single readiness status. No new rule is applied at this level โ the status is a roll-up of the same PASS / MARGINAL / FAIL / NOT EVALUATED verdicts described in *Constraint Verdicts in Reports*.
Each row also names the governing constraint per dimension (the worst evaluated height, width and weight margin with its POI), counts the work required, and lists the top reasons in plain language.
Computed Status vs Human Decision
The status is computed and never edited by hand. Separately, a person can record a decision on the option โ Recommended, Under review or Rejected โ with a note. The decision stores the computed status at the moment it was taken. Both are always shown side by side, and when they disagree (for example *Recommended* on a *Blocked* option, or a decision taken when the status was different) a mismatch warning is printed next to the row. The decision is provenance and accountability; it does not change the computed status.
The Same Answer Everywhere
The readiness rows are computed once on the server and quoted, never re-derived, by every channel:
GET /api/surveys/{surveyId}/route-readiness returns the rows with the same status values (clear, needs_work, blocked, incomplete) and margins; decisions are read and recorded under /route-readiness/decisionsFreshness
Rows are recomputed from the current measurements when a report is generated and are cached briefly for the map and Max; each surface shows when the readiness was computed. Changing a POI measurement, the declared load or a route changes the answer everywhere at once.
