Changelog

All notable changes to GeoPilot AI will be documented in this file.

Format follows Keep a Changelog. Versioning follows Semantic Versioning.

2.2.0 (2026-06-26)

Features

  • admin,embeddings: grouped admin nav dropdowns + complete overview; Vertex embedding backend + CI Vertex lane (83cd330)
  • admin: AI Calls diagnostics + flow trace persistence; judge-evals CI fix (a07c248)
  • admin: AI Calls diagnostics tab + flow trace persistence; fix judge-evals CI self-skip (6f9f4a7)
  • admin: flow execution-accuracy dashboard + scheduled benchmark (GEOP-145) (#84) (6a89fd8)
  • admin: full admin suite + accurate flow cost capture + billing/status (2093440)
  • admin: full admin suite, accurate flow cost capture, billing + status (0e991fc)
  • admin: redesign financials page, fix navbar overlap (fc9d7b4)
  • admin: surface per-turn chat/flow latency in the Ops tab (GEOP-250) (#149) (5770f35)
  • api: public POST /api/v1/geopilot/run endpoint (GEOP-234 / W7) (#131) (28f9dcc)
  • api: self-serve API-key management + developer docs behind launch gate (GEOP-234) (#160) (6abbebd)
  • auth+billing: tighten signin error paths, switch subscribe to Razorpay Invoices (b8e5006)
  • billing: credit-based billing system (additive, flag-gated behind GEOPILOT_BILLING_CREDITS) (0a46ced)
  • billing: post-trial UX - expired-trial paywall + countdown, trial-model-correct (GEOP-9) (#262) (656b715)
  • boundary: resolve geoBoundaries CGAZ + add district (admin-2) level (GEOP-316) (#216) (b200bb0)
  • cache: global plan cache live via marketplace Redis; resolver caching; hit-rate metric (GEOP-95) (28387a6)
  • cache: guarded semantic retrieval-cache tier, shipped dark (GEOP-270, GEOP-261) (9e1277f)
  • cache: guarded semantic retrieval-cache tier, shipped dark (GEOP-270, GEOP-261) (342687c)
  • catalog: add geometryCreateExtra tools (2c5512f)
  • catalog: tool capability enhancements from the audit + optional-param support (8262909)
  • chat: allow editing and resubmitting previous user prompts (GEOP-56) (#189) (435d874)
  • chat: auto-hide input layers on result with Show-all, plus chat theming/scrollbar polish (GEOP-330, GEOP-198) (#242) (8ad9afa)
  • chat: brand assistant avatar and show user profile photo with initials fallback (GEOP-55) (#188) (0d90fa6)
  • chat: Chat Workflow Console wave 1-2 (GEOP-185) (5c5c012)
  • chat: context-aware prompt suggestions from active layer (GEOP-296) (#201) (b6a046f)
  • chat: flow progress narration - phases, 1-step preamble, count deltas, themed tool names (GEOP-78) (71bc589)
  • chat: flow run-card parity + rich step timeline (GEOP-199, GEOP-189) (6b88554)
  • chat: flow run-card parity + rich step timeline (GEOP-199, GEOP-189) (9e40758)
  • chat: honest UX wins - artifact affordance, flow-state chips, clarify chips, data-driven next-steps (GEOP-192/194/195/197) (#243) (f1cb3df)
  • chat: library-backed empty-state starter prompts (1522158)
  • chat: make empty-state starter prompts run on real sample-library data (866d5f4)
  • chat: reassurance line on a slow-running flow step (#223) (5a016cd)
  • chat: schema-aware upload suggestions from the layer's own columns (GEOP-201) (bd67a3b)
  • chat: surface single-execution sub-steps as a run-card checklist (GEOP-251) (#150) (1ffe5c6)
  • chat: unify the live stepper into one run-card (phase header) (152ef4f)
  • chat: unify the live stepper into one run-card with a phase header (d68f466)
  • chat: wave 1-2 of the Chat Workflow Console (GEOP-185) (298fbb1)
  • cockpit: expose Toolbox UI on main (geo categories + modal) (85068ce)
  • cockpit: expose Toolbox UI on main (geo tool categories + modal) (d8a304d)
  • cockpit: Leaflet-native draw tool, remove dead Mapbox DrawControls (GEOP-93) (#192) (c33c3aa)
  • cockpit: toolbox/flow pivot WIP - tool catalog, selection router, dispatch (179526c)
  • connections: PostGIS/Postgres read-only connector via Supabase Vault (ea8d629)
  • credits/ux: credit-aware usage surfaces, per-project credits, pricing dark-mode, chrome cleanup (#266) (34b0982)
  • dashboard: AI-decided block sizes + dense auto-flow grid packing (abb26b2)
  • dashboard: light theme + 12-col grid layout (da896e2)
  • dashboard: teach LLM the 12-col grid + push for paired charts (e639ede)
  • embed: use animated GeoPilot logo for loading + branding footer (b6099cc)
  • empty-states: empty-state guidance for layers + projects (GEOP-328) (#227) (7e66d48)
  • eval: execution accuracy - split plan-ready from result-correct (GEOP-144) (#82) (259dd4d)
  • eval: Node execution harness for flow-ready plans (GEOP-140) (#79) (c13ff39)
  • eval: prod-exec measurement harness on the server-side executor (GEOP-227 / W4) (#132) (080eca9)
  • evals: complexity ladder, held-out paraphrase growth, adversarial routing set, synthetic case pipeline (GEOP-96) (2abb59b)
  • evals: persist judge accuracy (critic/verify/planner) to judge_eval_runs (91add42)
  • flow: aggregate-collapse + constraint-drop silent-wrong oracles (GEOP-150, GEOP-151) (#245) (7376032)
  • flow: beacon flow->codegen/honest-fail fallbacks to admin ops (GEOP-215) (e9ef84d)
  • flow: bring-your-own-AI-provider seam (GEOP-232 / W8) (#133) (b8061dc)
  • flow: cache invalidation guard + hit/miss observability (GEOP-239 / W12) (#136) (69b7544)
  • flow: close flow-engine gaps, add multi-provider AI resilience + ops triage (f161e1d)
  • flow: column values digest (GEOP-117) + architecture review (6f81905)
  • flow: column values digest so the planner grounds categorical params first-pass (GEOP-117) (e8712fd)
  • flow: conversational intent gate - keep meta turns out of the planner (Fix #1) (affcaa5)
  • flow: durable plan cache - fingerprint -> resolved Flow, skip plan/validate/critic on hit (GEOP-237 / W10) (#122) (53d5b6b)
  • flow: flow-engine gaps, multi-provider AI resilience, ops triage (c34471b)
  • flow: GEOP-218 self-healing per-step repair (REPAIR_STEP node) (f7afc3f)
  • flow: GEOP-218 self-healing per-step repair (REPAIR_STEP node) (694d23c)
  • flow: GEOP-98 derived-column tools, heavy-op coverage, availability schema + GEOP-100 convergence/handoff/grounding (6b9b710)
  • flow: GEOP-98 derived-column tools, heavy-op coverage, availability schema; GEOP-100 replan/fallback/grounding (676ef67)
  • flow: GEOP-99 OSM pilot - generic server-tool dispatch, osmFeatures on the BigQuery mirror, metering, eval coverage (d78e6a7)
  • flow: GEOP-99 OSM pilot - server-tool dispatch + osmFeatures + metering (b75b65c)
  • flow: request normalization layer (GEOP-119) (2c5d0b1)
  • flow: request normalization layer (GEOP-119) (46f9004)
  • flow: retrieval + normalize cache (GEOP-238 / W11) (#134) (d79d508)
  • flow: role-aware model fallbacks, richer output, cost metering, retrieval + eval upgrades (b4d6f36)
  • flow: role-aware model fallbacks, richer output, cost metering, retrieval + eval upgrades (fb05705)
  • flow: server-side end-to-end flow executor (GEOP-233 / W6) (#123) (d30844b)
  • flow: text-to-GeoSQL on PostGIS, dormant behind GEOPILOT_GEOSQL (GEOP-156/158/159/160/161) (#88) (024232e)
  • flow: tool-selection safety net - oracle, typing, typed retrieval, perception, param grounding (3f26510)
  • flow: tool-selection safety net — result-oracle, typing, typed retrieval, perception, param-grounding + id21 guard (90a7806)
  • flow: unify chat tool dispatch on the flow engine; live semantic retrieval; catalog 217 (a5ddf18)
  • flow: unify chat tool dispatch on the flow engine; live semantic retrieval; catalog 217 (b719731)
  • geocode: wire forward geocoding into runGeocodeResolver (GEOP-318) (#215) (2b0da03)
  • geosql: compound spatial+attribute routing + categorical substring grounding (7b055b1)
  • geosql: compound spatial+attribute routing + categorical substring grounding (93ea4ef)
  • geosql: output correctness - aggregate/scalar results as TableSpec + ST_AsGeoJSON geometry serialization (WF1) (7e0152a)
  • geosql: output-correctness (WF1) + VERIFY input-context & TableSpec answers (WF2) (afc61b2)
  • geosql: route rank+place compounds (top-N in <place>) to geosql (1a488d9)
  • geosql: route rank+place compounds (top-N in <place>) to geosql (463048c)
  • gis: unit switching in the Measure tool with a centralized units module (GEOP-57) (#190) (0960344)
  • import: Excel multi-sheet picker in CSVImportModal (6438b49)
  • import: GeoParquet + DXF, fix world-view on refresh, polish modal scrollbar (15cb0cf)
  • legal: refund + cancellation + terms + privacy + contact pages (64f3dc7)
  • llm: route Gemini through Vertex AI to bypass AI Studio cap (b286c20)
  • mcp: geopilot MCP server wrapping the public API core (GEOP-235 / W9) (#135) (a7a2ee9)
  • model: finalize planner chain v4-flash -> v4-pro -> haiku (GEOP-226) (816410f)
  • model: register deepseek-v4-flash + set as planner experiment (15c070d)
  • model: register deepseek-v4-pro for planner-model experiment (bf9f7ae)
  • models: 2026-06-05 chain policy - DeepSeek rung 2 where servable, claude-sonnet only for codegen-author; chat fallback stops at haiku (e271295)
  • model: wire DeepSeek V4 Flash as planner/replan/critic primary (GEOP-226) (9b21477)
  • monitor: #1.6a Share Latest Run + extend embed read for pipeline tokens (38ceb41)
  • observability: PostHog error tracking, identify on signin, global error boundary (fd9856f)
  • observability: PostHog LLM analytics, session replay, group analytics, sourcemap upload (499f000)
  • planner: GEOP-215 deterministic numeric grounder + GEOP-127 categorical FP + sumByField connective grounding (69858fb)
  • planner: GEOP-215 multi-step composition - numeric grounding + computed-column handoff (e0fb216)
  • planner: GEOP-215 PR-1 foundation - outputColumns metadata + numeric-grounding gate (4ce092a)
  • planner: GEOP-215 PR-1b - extend outputColumns to all templatable column-adders (0715806)
  • planner: GEOP-215 PR-2 - numeric honest-fail backstop + RULES 7/8 + computed-col example (433deaa)
  • planner: GEOP-215 PR-3 - cross-step computed-column grounding in fillToolParams (9c636a4)
  • plotting: Python plotting/mapping tools wired to flow engine + chat results (764ac23)
  • plotting: wire Python plotting/mapping tools to flow engine + chat results (c9c67e0)
  • pricing: 4-tier model Free/Pro/Business/Enterprise + DB migration (9f3d247)
  • pricing: always-premium + 7-day trial paywall, drop the Cheaper/Premium tier (GEOP pricing pivot) (#83) (85bc9dc)
  • pricing: credits-not-prompts display + remove remaining Cheaper/Premium surfaces (#85) (915004e)
  • pricing: Notion-style info tooltips - "what is a credit?" + feature explainers (#263) (adc1d57)
  • projects: archive/unarchive, multi-select, and member avatars in list/grid (fbd8507)
  • projects: threaded project comments panel (GEOP-11) (#191) (c8d6097)
  • retrieval: RRF fusion rerank, word-list freeze, k-sweep (GEOP-90) (b1ef87f)
  • retrieval: value-aware tool retrieval - schema/value linking + BRIDGE anchor-text expansion (GEOP-138) (d129886)
  • retrieval: value-aware tool retrieval - schema/value linking + BRIDGE anchor-text expansion (GEOP-138) (df68c28)
  • security: add anti-extraction confidentiality clause to base prompt (#278) (b272448)
  • settings: API access as its own settings tab + key table (GEOP-234) (#161) (2d386d9)
  • settings: show API usage and billing on the API access tab (GEOP-234) (#162) (9e207a7)
  • share: regenerate dashboard button + per-view analytics table (3f66884)
  • solutions: drop back-arrow, add rotating loader to CTAs (06e3907)
  • status: admin "Billing mode" probe - is credit billing flipped on? (#264) (d25fa70)
  • tools: add countWithinPolygons feature-in-polygon count tool (GEOP-133) (48c7732)
  • tools: add unionByField - true group-by/union-by-attribute (GEOP-147) (#80) (c473398)
  • tools: backfill exampleUtterances on all 227 tools + utterance contamination screen (GEOP-89) (ea9bb87)
  • tools: data on-ramp catalog tools - searchCatalog, fieldCalculator, attributeJoin, profileLayer (#255) (41e86e5)
  • tools: geometry-type guard plus geocode, repair, and compactness tools (GEOP-66, GEOP-69, GEOP-221, GEOP-242, GEOP-309) (#203) (e6aaeec)
  • tools: reprojectToEpsg warnings + renameField bulk + attributeJoinByKey field-select (GEOP-224 W15-TS) (#121) (8685449)
  • tools: value/answer tools (count/sum/avg/extent) + table-result rendering; fix zoom-to-data (aea6180)
  • tools: value/answer tools + table rendering; auto-escalate empty answers; fix zoom-to-data (409c439)
  • uploads: recycle bin with restore/permanent delete + 30-day auto-purge; actionable storage-cap message (d8ce706)
  • ux: confirmation toasts for layer/connection/export actions (GEOP-327) (#226) (88bcf2d)
  • ux: long-operation reassurance across 4 slow paths (GEOP-325) (#228) (1e4a6da)
  • workspace: add Log out button below Settings/Help in sidebar (#265) (04f141f)
  • workspace: pipeline rename, monitors split, theming, help guide, illustrated empty states (6ddeaac)

Bug Fixes

  • admin: apply 7d/30d/90d range to AI Calls metrics + reconcile plan-cache cards (GEOP-263) (fa6acca)
  • admin: apply 7d/30d/90d range to AI Calls metrics + reconcile plan-cache cards (GEOP-263) (6fc6cec)
  • api: charge the public API on the credits model (GEOP-234) (#163) (83bc71f)
  • api: matplotlib/codegen over the public API + chargeTurn test alignment (GEOP) (#164) (045b241)
  • billing: close two real-money correctness bugs - verify-payment double-grant + killed-turn no-refund (#260) (c2b6267)
  • billing: self-heal signup_trial grant for pre-existing active-trial users (#268) (5491834)
  • boundary: add continent level so scoped queries can filter by continent (GEOP-312) (#205) (de63c26)
  • boundary: data-driven country/state grounding, no hardcoded alias lists (#209) (0abed2e)
  • brand: center the compass mark on the favicon white background (ea749b2)
  • build: co-locate flow-skeleton airports fixture (db0ca0e)
  • build: drop 'server-only' marker on llmProviders to unblock client trace (be837d3)
  • build: extract FEATURE_TYPE_TAGS to a pure-data leaf module (1349d42)
  • build: gate productionBrowserSourceMaps behind UPLOAD_SOURCEMAPS; drop webpackMemoryOptimizations (3d19f4b)
  • build: reduce webpack build memory (OOM exit 137); repoint /canvas redirect to /workspace/pipeline (7e4452b)
  • build: skip in-build eslint/type-check on Vercel (separate tsc gate covers it) (b0fc694)
  • build: unblock chore branch - complete toolbox WIP + break server-only chain (f81abae)
  • bundle: move LLM geocoding helpers behind server routes (closes GEOP-45 root cause) (5d3d273)
  • cache: do not cache two-layer plans (key can't disambiguate the second layer) (GEOP-293) (3f5939d)
  • cache: do not cache two-layer plans (key cannot disambiguate the second layer) (GEOP-293) (7f63054)
  • cache: key plans on structural layer signature, not volatile name (GEOP-285) (3864332)
  • cache: key plans on structural layer signature, not volatile name, so version-stamped/derived layers hit (GEOP-285) (7fdae1c)
  • cache: plan-cache read-through + durable hit-rate metrics (GEOP-270, GEOP-263) (20fe8f1)
  • cache: retrieval read-through + cross-user plan sharing + punctuation-normalize (GEOP-270) (d968c14)
  • cache: retrieval-cache read-through + cross-user plan sharing + punctuation-normalize (GEOP-270) (0068430)
  • cache: set search_path so migration 00056 resolves the vector type under exec_sql (GEOP-270) (e5e5055)
  • cache: set search_path so migration 00056 resolves the vector type under exec_sql (GEOP-270) (61a664e)
  • cache: synchronous plan-cache read-through + durable hit-rate metrics (GEOP-270, GEOP-263) (480b01f)
  • catalog: close tool param/capability gaps from the full-catalog audit (GEOP-218) (e909395)
  • chat: a11y contrast + light/dark hover pairs (25553a4)
  • chat: a11y contrast + light/dark hover pairs in chat UI (1b6f2ac)
  • chat: actionable upload error messages (GEOP-326) (#224) (98c993f)
  • chat: bound conversational stream against hung provider (GEOP-305) (5251a21)
  • chat: clear the live step timeline on send so a new turn does not show the previous run's steps (2a98bb0)
  • chat: clear the live step timeline on send so a new turn does not show the previous run's steps (1efa4b8)
  • chat: cut conversational latency tail - 15s watchdog + no-thinking on Q&A (GEOP-305) (#253) (ec2708b)
  • chat: data-driven Try: chips on cloud/sample layer load (GEOP-201 follow-up) (#229) (d7e672b)
  • chat: explain why send is disabled instead of a silent greyed-out button (GEOP-329) (#225) (257a98e)
  • chat: force tool call on operation turns + fold no-result nudge into leading system prompt (#210) (1a8d3eb)
  • chat: honest no-active-layer notice and autonomous fallback rerun (GEOP-309, GEOP-310) (#202) (3ea51cf)
  • chat: let the model read attached PDFs and keep them pinned across turns (GEOP-278, GEOP-54) (3c48df3)
  • chat: make long prompts viewable and editable in the composer (GEOP-202) (da6aa46)
  • chat: multi-layer ops wiring + CRS/describe tool (GEOP-274/280/281) (4f83644)
  • chat: persist chat history on hard refresh; guard hydration clobber (#267) (7bcf00a)
  • chat: rank top-N by the layer's existing area column so chat matches the attribute table (GEOP-283) (9157f71)
  • chat: rank top-N by the layer's existing area column so chat matches the attribute table (GEOP-283) (d6101a3)
  • chat: read attached PDFs + keep them pinned across turns (GEOP-278, GEOP-54) (24a175d)
  • chat: render each message's original author avatar, not the viewer's (GEOP-298) (#196) (bf0e88d)
  • chat: resume the suspended flow from the next message instead of leaking to chat-adaptive (GEOP-118) (a9e4ad6)
  • chat: resume the suspended flow from the next message instead of leaking to chat-adaptive (GEOP-118) (031a29f)
  • chat: route descriptive questions to the fast chat path, not the planner (GEOP-305) (#254) (e43f6fd)
  • chat: route tool requests to the flow engine while the active layer rehydrates (0414362)
  • chat: scope chat history to the active project on hydration (GEOP-214) (4480660)
  • chat: stop inlining the active layer geojson when it is resolvable from GCS (GEOP-305) (#230) (afc2d24)
  • chat: surface active-layer-change note on the geosql/adaptive path (GEOP-246) (#151) (6b07345)
  • chat: wire loaded layers into multi-layer ops + add CRS/describe tool (0d8b185)
  • ci: judge-evals timeout 15 -> 25 min; adversarial report-only set pinned K=1 (8cde6b9)
  • ci: restore Supabase env vars dropped from judge-evals job env in 83cd330 (d9416c5)
  • cockpit: add per-layer zoom-to-layer button in the layer panel (GEOP-13) (#185) (371106e)
  • cockpit: remove stale Premium badge from assistant chat (GEOP-295) (#200) (e78a315)
  • cockpit: wire the exportMapImage action to the real export pipeline (GEOP-205) (56cdea4)
  • codegen: stop fetch-then-join from clobbering the active gdf layer (GEOP-320) (#217) (cbcd539)
  • credits/ux: pricing header counts trial pool + drops false renewal promise (#271) (c9f559a)
  • credits/ux: show held credit balance in sidebar chip when monthly allowance is 0 (#269) (9e4b6df)
  • credits/ux: show held credit balance in UserProfile dropdown when allowance is 0 (#270) (e6fe68d)
  • critic: deterministic subjective-qualifier ambiguity guard; judge-evals timeout 25 -> 35 for the Vertex lane (a4edc32)
  • critic: treat geometry-computable measures (area/length) as resolvable, not a missing attribute (GEOP-221) (#239) (3e9286e)
  • deps: add vega-embed explicit dependency (4c4fc44)
  • embed: use GeoPilotLoader (new star mark) instead of old logo-animated.gif (2330b38)
  • evals: de-contaminate planner worked examples from golden eval cases (GEOP-86) (e62f287)
  • evals: judge calibration split + missing eval classes (GEOP-88) (4481c6a)
  • evals: K-run Wilson gating, served model ids, derived baselines (GEOP-87) (aa195ad)
  • evals: review fixes for wave 2 (GEOP-79) (6740676)
  • evals: token-aware clarify grounding; live-replan gates the safety net, tracks convergence (GEOP-88) (7eb443c)
  • exec: classify GCS access-denied as a storage fault, not bad code (GEOP-288) (647e458)
  • exec: GCS access-denied misclassified as bad code causing 401 on gdf fetch (GEOP-288) (3635b9e)
  • flow,cockpit: chart worker stall, active-layer resolution, symbology column infer-or-clarify (GEOP-209/210/212) (6ba0181)
  • flow: add gemini-pro cross-provider fallback to deepseek-primary chains (GEOP-264) (#166) (c4d7bb1)
  • flow: attach GP catalog code to non-JSON/500 python responses (GEOP-65) (#139) (7b90912)
  • flow: Batch A - replan convergence + spatial-count tool + clarify-answer normalization (GEOP-128/133/135) (83e8d64)
  • flow: bound clarify column list + fix chart "X by X" title + humanize column leaks (GEOP-247/248) (#153) (b04cca3)
  • flow: bound flow LLM calls with a per-rung wall-clock timeout (GEOP-222) (#127) (2ca1b96)
  • flow: codegen fallback when an auto-run flow fails + center favicon mark (73fb001)
  • flow: converge continent-scoped counts instead of grinding to the planner timeout (GEOP-312) (#240) (4844ce0)
  • flow: convergence + resilience + observability wave (GEOP-107..115) (721ab7f)
  • flow: convergence + resilience + observability wave (GEOP-107..115) (02d8047)
  • flow: critic prompt requires verbatim column names in clarify + hard ambiguous on subjective qualifiers (GEOP-88) (10dada8)
  • flow: critic refuses adversarial intents + crisp reject/cannot-plan/ambiguous guidance (GEOP-338) (#252) (ea07b94)
  • flow: cross-provider structured fallback + harden the executePython path (4e1fcaa)
  • flow: cut failover latency - shorter rung timeout, faster breaker trip, durable plan cache on by default (GEOP-222) (#130) (b585bd1)
  • flow: direction-contradiction gate fires on opposite-lexicon mention (GEOP-94) (2dd137d)
  • flow: drop ivfflat for exact cosine scan on tool_embeddings; under-recalls at 217 rows (GEOP-83) (8d257d5)
  • flow: enforce filter grounding at VALIDATE - missing value + numeric-op-on-categorical (GEOP-127) (c2c557c)
  • flow: enforce filter grounding at VALIDATE (GEOP-127) (eff7fd8)
  • flow: exclude enrichment intent from GeoSQL routing (closes over-route silent-wrong) (#89) (af828b0)
  • flow: executable PIP via positional layer-input binding + gate low-confidence cannot-plan (GEOP-84) (b4b8621)
  • flow: execute geosql step in-process server-side (service role); remove temp debug endpoint (#95) (8cd31ae)
  • flow: fall back to codegen when an auto-run flow fails (client FALLBACK_CODEGEN) (527fe19)
  • flow: fold proposed column on affirmative clarify confirm (GEOP-230) (#126) (cc99838)
  • flow: Gemini reachable by default (cap reset); judges run all harnesses past failures (ac924aa)
  • flow: GEOP-219 - geosql failures fall back to turf instead of codegen (cbd2fa9)
  • flow: GEOP-219 GeoSQL robustness - abstain no-PostGIS ops + FC-shape gate (81fbb53)
  • flow: geosql step takes no active input (self-sources from geo.features); fixes silent fall-through to turf on server-execute (#94) (a4cb9a4)
  • flow: ground filter values from the digest for compound + substring filters (GEOP-137) (e1be456)
  • flow: ground filter values from the digest for compound + substring filters (GEOP-137) (4014787)
  • flow: ground the symbology ramp param from the request colors (GEOP-207/208) (beffee8)
  • flow: guard the plan-only no-result dead end in chat-adaptive (GEOP-252) (#154) (e66818a)
  • flow: humanize chat replies - strip tool/SQL/model jargon, fix aggregate narration (GEOP-243) (#143) (0d25f9d)
  • flow: inject server-side geosql runner via exec context (in-process exec; fixes main build) (#97) (e6dc111)
  • flow: key the circuit breaker per provider+model so a flash trip doesn't blackout the healthy sibling (GEOP-290) (#238) (46ebf72)
  • flow: make VERIFY geometry check input-aware so tabular records pass (GEOP-267) (6df02e2)
  • flow: narrate a single-winner ranking result as a superlative answer (GEOP-245) (#146) (5c0dee0)
  • flow: narrate tool results, render tables, Done-tick; feat(projects): archive/multi-select; persist judge accuracy (#42) (e5a8e38)
  • flow: narrate value/table finals, render real tables, hold Done-tick until reply (9f89bc7)
  • flow: neighbourCount tool + strip nodata sentinels from answers (GEOP-253) (#157) (0fe972d)
  • flow: normalize the clarify answer on the resume path so typo'd answers ground (GEOP-135) (d2c0a05)
  • flow: per-call token caps + planner prompt prune + narrate caching + header fixes (GEOP-91) (26b6ea6)
  • flow: PLAN-node fallback handoff + open the breaker on a dead account (e414e48)
  • flow: planner codegen overuse + golden set expansion + architecture review (GEOP-72) (f0bf1e4)
  • flow: planner codegen overuse fixed via retrieval boosters + plan-time guard + critic grounding (GEOP-72) (4f72ebd)
  • flow: price DeepSeek-V4 planner stack + bound interpolation cell size (GEOP-101, GEOP-223) (#118) (ef0b05b)
  • flow: qualify columns in geosql prompt (kills intermittent ambiguous-column failures) (#98) (4905625)
  • flow: reject FC input consuming a data-producing step at VALIDATE (GEOP-217) (175151b)
  • flow: relax over-aggressive timeout-breaker that took out the planner provider (GEOP-242) (#141) (8bb5d3a)
  • flow: replan converges on missing-value + numeric-on-categorical rejections instead of looping (GEOP-128) (6d19dbe)
  • flow: replan folds rejection into a corrected request; converges instead of resubmitting (GEOP-94) (af41583)
  • flow: replan prompt converges on rejection reasons; live-critic measures the prod critic model (GEOP-88) (caa24ad)
  • flow: REPLAN routes to VALIDATE, not back through PLAN (GEOP-116 root cause), plus categorical filter pins and replan corrections (e9974c1)
  • flow: replanned flows were discarded by the REPLAN->PLAN edge (GEOP-116) (e83b430)
  • flow: required column params visible at validate + one covered-by-catalog definition (GEOP-91) (b758800)
  • flow: restore VERIFY on client-execute chat path via shared heuristics (GEOP-80) (f3c82f3)
  • flow: review fixes for finishing wave (GEOP-79) (2cdfa31)
  • flow: scale replan budget to multi-op compositions (GEOP-218) (6e1c888)
  • flow: scope inline heuristic VERIFY to the client path only (GEOP-80 addendum) (a715ad7)
  • flow: scrub "use the <X> tool" rationale phrasing from the chat preamble (GEOP-243 follow-up) (#144) (2179341)
  • flow: server-side PostGIS boundary select to remove the large-boundary timeout (GEOP-311) (#220) (0b61ef0)
  • flow: sort/rank column inference prefers the post-by column + numeric (GEOP-146) (#81) (1b08642)
  • flow: stop cross-step active-layer poisoning on fresh questions (GEOP-255) (#156) (a00ad01)
  • flow: stop silently running codegen when the active layer FC is missing (4537900)
  • flow: stop the VERIFY geometry-type guard from false-flagging geometry tools (94efd7f)
  • flow: stop VERIFY false-rejecting mixed-geometry filters; unmask the real failure code (GEOP-311) (#212) (8b9a8d8)
  • flow: supersede a pending clarify when the next message is a new request (GEOP-249) (#152) (6a23e93)
  • flow: surface TableSpec final as finalSpec so value/answer tools fire (not codegen) (7b56e59)
  • flow: surface TableSpec/ChartSpec final output as finalSpec (value tools answer, not GP-DATA-006) (2a785f2)
  • flow: surface VERIFY-implausible fallback note + scope provider-degrade probe codes (GEOP-79) (e8d42e8)
  • flow: telemetry on provider-cap and critic/verify fail-open so /status degrades (GEOP-82) (c83a788)
  • flow: thread projectId through executor/rehydrate download-file so shared layers don't 404 (GEOP-307) (#199) (a01fd6e)
  • flow: tool-agnostic empty-value reject at VALIDATE for multi-clause filters (GEOP-136) (2f166be)
  • flow: tool-agnostic empty-value reject at VALIDATE for multi-clause filters (GEOP-136) (156b625)
  • flow: tool-first routing behind default-OFF GEOPILOT_TOOL_FIRST flag (GEOP-254a) (#155) (6d0d209)
  • flow: treat data-inspection as an operation + clarify no-param geometry tools (GEOP-217 follow-ups / W3) (#120) (8331a1e)
  • flow: type-based join-lookalike guard closes non-reductive spatialJoin silent-wrong (held-out id21) (3ec0640)
  • flow: VERIFY accepts chart/image result specs, not just table (GEOP) (#165) (334a0a6)
  • flow: verify fallback codegen before commit + thread span reasons + dead-confidence cleanup (GEOP-85) (a67386d)
  • gcp: point project fallback at live geopilot-prod-2606 (GEOP-275) (8628f89)
  • gcp: point project fallback at live geopilot-prod-2606, not suspended proposalai-461909 (GEOP-275) (47cee05)
  • geocode: widen Mapbox forward types to include poi+address so landmarks resolve (GEOP-318) (#222) (01d46a8)
  • geop-4: close out reporter feedback on GEOP-7/8/28/40 (abb9ea9)
  • geopilot: resolve 24 open GEOP bugs (projects, chat, flow, map, upload) (649c5f7)
  • geopilot: resolve 24 open GEOP bugs (projects, chat, flow, map, upload) (3639a7e)
  • geosql: abstain over-routed sector-buffer / styling / interior-point ops (GEOP-219) (541ceeb)
  • geosql: arm kept-everything oracle on client-execute path + skip TableSpec materialize in commit (WF2 follow-up) (f048eb0)
  • geosql: client-execute VERIFY oracle + server-loop TableSpec commit (WF2 follow-up) (fbcbd4b)
  • geosql: declare aggregate/count geosql steps as data so the count answer isn't dropped to codegen (GP-GEOSQL-003, GEOP-313) (#231) (26f5934)
  • geosql: GEOP-219 replace no-PostGIS regex with a cheap LLM capability gate (e8766d2)
  • geosql: make the in-plan geosql step first-pass-only too (GEOP-219) (4afbcdd)
  • geosql: VERIFY input-context + TableSpec answers - kills spatial over-rejection flakiness (WF2) (d6e43c4)
  • geosql: WF2 review fixes - gate GP-FLOW-023 geosql arming on geosqlLooksLikeFilter; scope where:data accept to table kind (31eced3)
  • landing: play real demo video in a modal instead of scrolling, correct duration copy (GEOP-19) (#187) (1dc187d)
  • layers: cockpit eye toggle hides/shows layer on the map (GEOP-287) (47d6738)
  • layers: make cockpit Layers-panel eye toggle hide/show on the map (GEOP-287) (c7c2471)
  • legal: drop 'Back to GeoPilot' arrow from policy pages (b5be3a3)
  • legal: tighten refund policy against abuse vectors (c6c31fa)
  • library,workspace: sample library moved to dedicated public bucket; light/dark pairs on library, uploads, and table-skeleton windows (ef439ba)
  • library,workspace: sample library rehosted + light/dark window theming (9c5f38f)
  • library: scope hub-loaded sample datasets to the active project (7c6136a)
  • library: scope hub-loaded samples to the active project (63745ed)
  • map: repaint Leaflet canvas on geometry-type change (GEOP-294) (17f9fae)
  • map: visible default polygon style for uploaded layers (GEOP-229) (#119) (e74dfd5)
  • model: lock unimplemented-provider models out of getActiveModels (GEOP-101 item 4) (#128) (a76886f)
  • ops: executor concurrency races, frontend hook crashes, admin Ops tab (f59e257)
  • ops: executor concurrency races, frontend hook crashes, admin Ops tab (554253e)
  • osm: conditional Overture+OSM-mirror POI union to close the dev-region undercount (GEOP-319) (#233) (4133d1e)
  • osm: flag-gated Overture Maps backend for queryOSM with hard OSM-mirror fallback (GEOP-317) (#219) (bd7051e)
  • osm: make the POI union production-safe - uniform category + bbox bound (GEOP-319 follow-up) (#234) (7645178)
  • overlay: make select* tools scale to huge boundary geometry (GEOP-311) (#211) (83c147f)
  • planner: GEOP-215 deterministic numeric grounder (red-teamed + hardened) (53bf876)
  • planner: GEOP-215 numeric-filter field grounding (the field domino) (34f08c0)
  • planner: GEOP-218 schema-driven numeric-column + wrong-value grounding (39cd874)
  • planner: GEOP-218 schema-driven numeric-column grounding + groundedNumeric overwrite (303f371)
  • planner: ground other-layer geometry+columns so two-layer joins pick the spatialJoin tool (GEOP-274, GEOP-280) (fcf85d2)
  • planner: ground other-layer geometry+columns so two-layer joins pick the spatialJoin tool (GEOP-274, GEOP-280) (0d09139)
  • planner: ground scoped spatial queries on boundary->select->count instead of codegen (GEOP-313) (#208) (d1cf748)
  • planner: harden numeric grounder per red-team (R1/R2/R3) (68eed8f)
  • planner: numeric-filter field grounding prefers a numeric column (GEOP-146-for-filters) (6df47d0)
  • planner: route computed-column example through PLANNER_EXAMPLE_REQUESTS (9270872)
  • planner: symmetric categorical column corrector (GEOP-218) (#125) (f04d18f)
  • planner: tighten R2 to comparator-ADJACENT-to-number (e876040)
  • plot: frame maps on the data, not a hardcoded region (bc3f67a)
  • pricing: label INR as live-converted from USD and align USD hint formatting (GEOP-32) (#186) (19fd15f)
  • prod-qa: load the selected sample's own row, not the first Load button (GEOP-244) (#145) (90cb159)
  • prod-qa: read chat bubbles + assert content, robust sample-load (fixes live crash from #145) (#147) (11defa3)
  • profile: add Settings entry to sidebar UserProfile dropdown and align Sign out label (GEOP-308) (#198) (8799765)
  • profile: consolidate duplicate profile surfaces into Settings > Profile and surface Logout (#197) (b68e23a)
  • projects,cockpit: legacy-project Delete, project-scoped cockpit results, avatar placement (9cf8757)
  • projects,cockpit: owners regain Delete on legacy projects; cockpit results project-scoped at display; avatar to far right (137ea47)
  • projects: results cross-project leak + legacy uploads section UX (5161a9b)
  • projects: results no longer leak across projects; legacy uploads section collapsed (3f3266d)
  • projects: scope uploaded layer and dataset access to project membership (GEOP-297) (#195) (ddc3f50)
  • prompts: unblock chat-adaptive - split prompts DB/code per migration 00037 (21ad477)
  • providers: coalesce system messages to a leading block for DeepSeek so codegen-fallback works (GEOP-311, GEOP-110) (#207) (cb47098)
  • providers: cross-provider fallback on non-flow LLM paths via callFlowModel (GEOP-289) (#244) (b89d0ce)
  • providers: take Anthropic out of codegen/chat hot path behind a flag, fall back on Gemini+DeepSeek (GEOP-110, GEOP-311) (#206) (87d428d)
  • python: COPY mcp_tools into Cloud Run image so /plot mounts (548e2bc)
  • python: COPY mcp_tools into the Cloud Run image so /plot mounts (56e0bf5)
  • ratelimit: make @upstash import traceable so it ships in the lambda (#275) (8b08724)
  • ratelimit: ship @upstash packages in the lambda via serverExternalPackages (#273) (d73fc6c)
  • rbac: enforce owner-only project delete + role mutations server-side (GEOP-60) (#140) (dbd909f)
  • results: return v4 signed read URLs instead of bare GCS paths (GEOP-241) (#124) (75dd87d)
  • retrieval: review fixes for wave 3 (GEOP-79) (464ee44)
  • review fixes for clearing wave (GEOP-95/78/96) (75077af)
  • routing: keep conversational turns off the flow engine + restore trivia scope guard (#193) (34f96b1)
  • routing: route layerless geocode-a-point requests to the flow engine, not the no-active-layer notice (GEOP-69, GEOP-318) (#241) (2933338)
  • routing: route layerless source-tool requests into the flow engine (GEOP-104) (#232) (e802227)
  • security: born-gate execute-mermaid + followup compute routes (GEOP-124) (7080815)
  • security: born-gate the 4 residual unauthenticated codegen routes (GEOP-122) (#246) (0248e7e)
  • security: born-gate unauthenticated compute routes + scope canvas GCS to caller (GEOP-120/121) (c3c8c07)
  • security: born-gate unauthenticated compute routes + scope canvas GCS to caller (GEOP-120/121) (88c1c7d)
  • share-modal: drop dark:text-zinc-100 on always-light surfaces - share modal stays light by design, but inner text was flipping near-white in dark mode causing white-on-white (05bc42f)
  • status+credits: wire GP-STREAM-007 into /status probe; align credit tests to always-premium (GEOP-103/148) (b65a5d5)
  • storage: admin accounts bypass the storage cap at the enforcement seams (0c5346b)
  • team-reported bug sweep (GEOP-201/202/204/205/207/208) (ff3e2f7)
  • tools: add labelFeatures catalog tool so "find and label the N longest rivers" stays tool-only (no codegen->GCS 401) (#250) (e71accc)
  • tools: reword countWithinPolygons utterances to clear the cross-tool contamination guard (GEOP-133) (a1e5109)
  • ui: remove corrupted emoji from CSV/chart chat replies + replace HelpModal emoji icons with lucide (ebe1f20)
  • ui: remove corrupted emoji from CSV/chart chat replies + replace HelpModal emoji icons with lucide (6c32907)
  • upload: complete PostGIS ingest via after() so geo.features actually populates (serverless was killing the fire-and-forget) (#91) (0dead93)
  • uploads: project-scope the Uploads tab (GEOP-68) (007bd39)
  • uploads: project-scope the Uploads tab (GEOP-68) (28bd7f3)
  • validate: catch under-wired two-layer tools at VALIDATE (silent-empty class) (d3e96ad)
  • verify: catch kept-everything codegen filters deterministically + judge hard rule (GEOP-70) (ae52042)
  • verify: gate the non-reducing oracle on tool cardinality (GEOP-220) (9c7e8b1)
  • verify: geosql filter that matched ALL rows is plausible, not a no-op (GEOP-220) (#129) (75d384a)
  • verify: scope the non-reducing oracle to PREDICATE filters, not all REDUCING (GEOP-220) (4e02afb)
  • workspace: persist deletions - emptied workspace saves + unmount flush (GEOP-204) (75b9c69)

[2.1.0] - 2026-05-18

Milestone tag: v0.refactor-complete.

Changed

  • W1-W19 god-file refactor wave merged. ChatBox.tsx 4820 -> ~1000, page.tsx 2532 -> ~805, SettingsScreen.tsx split into 7 tab files, FileManager + chat handlers + workspace hooks + projects screen extracted across 63 modules. Net: 7352 -> 1805 lines (-75%) in the big files; behaviour unchanged. tsc --noEmit 0 throughout the wave.
  • W20: LLM system prompts moved to Supabase. 21 prompts migrated from lib/geopilot/prompts.ts to the system_prompts table (migration 00036). Code uses lib/geopilot/promptsServer.ts:getPrompt(). Modular GIS-task prompts (lib/geopilot/prompts/*.ts) stay in code.
  • Landing redesign: hero trimmed, features redesigned, all model brand names scrubbed (Cheaper / Premium only), in-section CTAs, Linear-style flat / mono / single violet accent visual language.

Added

  • team-docs/ -- team-facing documentation tree (29 files): product overview / pricing / glossary / roadmap / per-product specs, architecture (system-overview, stack, environments, database, llm-prompts, error-catalog, tier-enforcement, mcp, sharing-and-embeds), engineering (getting-started, conventions, git-workflow, testing, deployment, observability, troubleshooting), 4 ADRs, security 1-pager.
  • TEAM_READINESS.md -- sharing + security playbook for onboarding the next teammate.

Notes

  • docs/ at repo root remains intentionally gitignored (founder's local scratch space + competitive research + product specs that the team-docs/ tree summarises).
  • Branch protection on main + .github/workflows/ci.yml still pending (TEAM_READINESS.md Week 2 backlog).

[2.0.0] - 2026-04-03

Changed

  • Product lineup restructured from 6 products to 3: Platform, Monitor, Engine
  • Platform = workspace (n8n-style canvas, chat, maps, reports)
  • Monitor = runtime (dashboards, alerts, pipeline execution, 24/7)
  • Engine = compute (API, SDK, raster processing, tile serving)
  • All three independently purchasable, Engine compute included in Platform/Monitor
  • Navbar updated: 3-product mega dropdown (Platform, Monitor, Engine)
  • Footer updated: 3-product links
  • Homepage pricing section updated for new lineup
  • Product flowcharts updated for 3-product architecture
  • Sitemap updated with new product URLs
  • package.json renamed to geopilot-platform

Added

  • Product page: /products/platform (merged from Web + 3D + Reports)
  • Product page: /products/engine (merged from LargeImage + API)
  • Product docs: ENGINE.md, PLATFORM.md, MONITOR.md, PRODUCT_EVOLUTION.md
  • 3-year roadmap to digital twins (PRODUCT_EVOLUTION.md)
  • Development progress tracker (PROGRESS.md)

Removed

  • Product page: /products/web (merged into Platform)
  • Product page: /products/api (merged into Engine)
  • Product page: /products/reports (merged into Platform + Monitor)
  • Product page: /products/largeimage (merged into Engine)
  • Product page: /products/3d (merged into Platform)

[1.5.0] - 2026-03-28

Added

  • 6 product pages: Web, Desktop, Reports, LargeImage, Automate, 3D
  • 8 solution pages: Water, Urban, Agriculture, Mining, Insurance, Defense, Climate, Real Estate
  • Blog system with 6 SEO articles (ArcGIS comparison, tutorials, regional guides)
  • Shared Navbar with mega menu dropdowns (Products, Solutions, Resources)
  • Shared Footer with Products, Solutions, Resources, Company, Contact columns
  • Breadcrumb navigation on all sub-pages
  • AI-generated satellite imagery for domains and products
  • Product intro video (Remotion)
  • PostHog analytics
  • Google Search Console verification
  • Phosphor Icons for navbar dropdowns
  • Hero background image across all pages
  • Gradient favicon (blue-to-violet on white)

Changed

  • Homepage redesigned: hero with "tools → insights", orbit animation, product cards
  • Navbar: Products/Solutions/Resources mega dropdowns replace Features/Demo
  • All pages use consistent max-w-[1200px] margins
  • Font: Poppins throughout
  • Color: blue-to-violet gradient accent
  • "No GIS expertise" messaging replaced with "AI-assisted GIS"
  • Desktop product renamed from "Offline" to "Desktop" (badge: PC)

Fixed

  • Duplicate navbars/footers on sub-pages
  • Breadcrumb alignment with hero content
  • Font size consistency across all pages
  • TypeScript errors in solutions page

[1.0.0] - 2026-03-27

Added

  • Initial standalone extraction from smartbhujal.com
  • 25 API routes (chat, adaptive chat, code execution, raster processing, etc.)
  • 40+ React components (ChatBox, MapViewer, ToolsPanel, etc.)
  • 186+ GIS commands via AI chat
  • 31 domain verticals with welcome onboarding
  • Supabase integration (7 tables)
  • Google OAuth login
  • Subscription system (free/pro/business)
  • Usage quota tracking
  • Chat history
  • User feedback (thumbs up/down)
  • Shared map viewer
  • Report generator (PDF/HTML)
  • SEO-optimized root layout for geopilotai.com
  • Environment configs (local/staging/production)
  • Python GIS execution service (Docker)