Releases: qte77/ldnmxx-hack
Release list
v1.9.0
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).
v1.7.0 — Sort My Food Hygiene
Arc 016 P4: a NEW civic usecase (postcode -> nearest food-hygiene ratings with inspection dates + official FSA links), built register-only - a corpus registry entry, a usecase JSON, one UI entry, and an e2e flow; zero engine edits. Serves FHRS (62.9k London establishments) from D1 via the keyless pipeline, real-rows bundled sample as fallback, FHRS OGL attribution swap-gated. See CHANGELOG.
v1.6.0 — Care real data (CQC directory)
Arc 016 P3: Sort My Care (the flagship) now serves 9,345 real London care locations from D1, ingested keylessly from the CQC directory (the Syndication API is 403-gated). Signpost-honest: no ratings shown (link out to the official CQC page), community-pharmacy coverage gap stated, CQC OGL attribution rendered and enforced by the swap gate. See CHANGELOG.
v1.5.0 — Wander real data + keyless ingest pipeline
Arc 016 P1+P2: the keyless ingest pipeline (weekly Action -> corpus-data release -> daily D1 cron with min-rows + licence-attribution swap gates) and Sort My Wander serving REAL data - 23.7k NHLE listed buildings + 12.2k OS Open Greenspace sites (London) from D1, with live Historic England / OS Crown-copyright attribution and a freshness-recency e2e assert. Bundled samples remain the outage fallback. See CHANGELOG for detail.
v1.4.0 — Sort My Route, footer version, cache-poisoning fix
Renames the step-free flow to Sort My Route (old ?usecase=on-it links fall back to the flagship) · the footer now shows the shipped version (build-time inject) · fix: the Pages SPA fallback can no longer be cached as an immutable asset response (ui/public/404.html disables it) after the deploy-window cache-poisoning incident — full detail in CHANGELOG + AGENT_LEARNINGS.
corpus-data (rolling)
Rolling normalised corpus artifacts published by ingest.yml. Consumed by the Worker ingest cron.
v1.3.0 — real-data operations: D1 live + self-monitoring
v1.3.0 — real-data operations: D1 live + self-monitoring
- D1 provisioned + live (
sortmy_london_corpus, #13 closed): schema applied,DBbinding on the
deployed Worker; Pages config stays D1-free (the Worker is the sole data access, ADR 0002). - Empty-store fail-safe (#171): an unseeded gazetteer degrades to the bundled sample — verified
LIVE against the empty store (sweep PASS, flagship 5/5 viewports). An outage, misconfig, or
not-yet-seeded store can never break Care. - Tier-3 uptime monitor (#173): a 6-hourly (+ on-demand) credential-free Action sweeps the live
site; FAIL ⇒ red run + artifacts + a deduped alert issue. First run green. - Plan/handoff 015 synced: ≈85% complete; the single remaining gate is #161 (NHS ODS TRUD,
deferred) → then W5·B2/B3 (ingester + cron re-seed) → W4 real corpus.
Full detail: CHANGELOG.md.
v1.2.0 — real-data foundation: D1 corpus store + licence gate
v1.2.0 — real-data foundation: D1 corpus store + licence gate
- Engine (W6, #162): read-through CF D1 corpus store behind a
CorpusSourceseam — one SQL
view per corpus over the frozenCorpusRecord, bundled sample as offline/outage fallback, D1
binding shipped commented-out until provisioning. Interpreter untouched (open/closed). - Licensing (ADR 0002): serving from our own store is redistribution → licence-gated per
source vialicense/redistribute_okindata/sources.json(8-source audit). Care pivots to
NHS ODS bulk via TRUD (the live NHS API forbids caching, #161); FCA stays link-only,
confirming the shipped Scam design; OSM is ODbL-share-alike-conditional. - Security:
fast-uri3.1.4 (high) ·dompurify3.4.12 (low) · transitivesharp→ 0.35.3
via npm override (high, GHSA-f88m-g3jw-g9cj; boot-smoked) · dependabot ignore rules encode the
deliberate TS-6 + zod-3 pins (#163–#166). - Docs: ADR 0002 + ADR 0001 amendment · engineering-practices (two-channel licence gate) ·
docs/glossary.md(all abbreviations, cross-referenced) · README/architecture synced to the
shipped state (GitHub Models tier dropped from the free chain).
Full detail: CHANGELOG.md.
Not yet deployed — make deploy publishes; the real NHS ODS ingest is tracked in #161.
v1.0.0 — Groundwork (Londonmaxxing 003 final build)
Groundwork — the final Londonmaxxing 003 hackathon build, frozen at the end of the hack day (4 Jul 2026, commit 01d2c95). Development continued afterwards on main.
One AG-UI/A2UI workflow engine on a single Cloudflare Worker: POST /run?usecase=<id> drives a runStages loop (plan → tool → render) and the agent streams A2UI cards — it paints the interface, not just text. Two interchangeable London workflows behind one ?usecase= switch.
▶ Live demo: https://qte77.github.io/ldnmxx-hack/ · Worker API: https://ldnmxx-hack-worker.cloudflare-driveway392.workers.dev
Shipped in v1.0.0
- Phase-1 E2E: SPA →
POST /run?usecase=<id>(SSE) → built-in A2UI cards;useAgentSSEtransport;runStagesper usecase (founders-copilot+ thinon-it); console Arize span per stage; optional in-dashboard BYOK;ui/workerCI + GitHub Pages deploy (#16, #17). - Track B
search_opportunitiesrender via a real OpenRouter model, with a deterministic stub fallback (#19); raisedmax_tokenssorender_uiisn't truncated (#22). - Theme toggle +
?demo=1keyless auto-run (#20); live A2UI component catalog + Track-A default + 100% worker observability (#24); usecase toggle swaps the example query (#25).
Switches
?usecase=founders-copilot|on-it · ?demo=1 (keyless stub) · ?theme=light|dark · BYOK (Authorization: Bearer <key>).
Deferred (post-v1.0.0 / roadmap)
AG Grid (#6), full Track A voice loop (#4 / #7 / #8), Track B depth (#9), live Companies House filing (#12), D1 (#13), A2A endpoint (#11), real Arize OTLP export (#21), AI Gateway wiring (#29), Phase-2 model pipeline (#18).
Full history in CHANGELOG.md.