v1.9.0 — Arc 018: post-launch polish
Input forgiveness, honesty, config-separation, and a visual/UX pass — all live on sortmy.london.
Input forgiveness
- Outward postcodes (#233): "food hygiene near SE1" — the app's own placeholder — now resolves; a
bare SE1/E8/N1/SW1A works when there's no full postcode. Migration0006seeds outcode centroids;
durable across the daily cron (baked into the published gazetteer artifact too). - Scam natural-language (#232): "is <firm> a scam" now matches (the firm name-stem inside the
question) — still a flag routing to the FCA register, never a verdict.
Honesty
- Row-read (#230): the bbox widen starts at 0.5 km — a LIVE-measured 11.3× fewer rows read
(3,248 ≤ 4k), and the over-claimed "≥10×" docs corrected to the real numbers. - Record dates (#234): each corpus's date line matches its semantics — care "data as of", food
"inspected {date}", wander omits it (no more a heritage listing year shown as data freshness).
Config-separation
- One shared usecase catalog (#235): the UI and Worker read a single source
(shared/usecaseCatalog.ts) — no more driftingid/title/example;routableis derived.
Visual/UX
- P5 (#237): human distances (
<50 m/~N-min walk, no more "0 km"), per-workflow glyphs, the
result title is now the official-source link, de-duped authority, a one-line "Sources & licence:",
a progressive hero (dek collapses after a search), suggestion chips, and a rotating placeholder. - No-match card (#236): routable workflows say "Try typing …"; never-auto-routed ones (Founder's
Copilot, Sort My Route) get an accurate "Open →"?usecase=link, not a fake keyword.
Every phase: strict RED-first TDD, CI-gated, per-phase deploy + live tier3 sweep (axe 0/0 across 3
theme variants × light/dark, no model-host hits).