Releases: jcrussell/solvent-streets
Releases · jcrussell/solvent-streets
Release list
v0.4.1
Changelog
Features
- 1ed55f7: feat(cache): add
pvmt cache pruneto bound the HTTP cache on disk (@jcrussell) - fdcf813: feat(checksite): report per-file size totals against per-city budgets (@jcrussell)
- 3e547aa: feat(config): add export.boundary_simplify_m (@jcrussell)
- 15b6f3a: feat(config): included cities keep their source config's identity (@jcrussell)
- f603c49: feat(export): add a Materials dashboard tab (asphalt/binder/oil demand) (@jcrussell)
- 03eddc2: feat(export): consolidate site into one tagged dashboard (@jcrussell)
- 3c7ea74: feat(export): extract template JS to app.js/game.js and add an ESLint gate (@jcrussell)
- d41e0ec: feat(export): make display units a client-side preference (frlu) (@jcrussell)
- 0f81ab2: feat(export): make template-JS tsc --checkJs a hard gate (@jcrussell)
- f443db2: feat(forecast): cost_overhead — loaded program cost, defaulting to 1.5x (@jcrussell)
- 3c6e306: feat(validate): add
pvmt validatecalibration gate (@jcrussell)
Bug Fixes
- 535dc4a: fix(all): exit non-zero when the combined compute pass fails (@jcrussell)
- f06d382: fix(cache): account for temps an interrupted sweep never reached (@jcrussell)
- e31a596: fix(cache): honor cancellation during a prune sweep (@jcrussell)
- 0c8f9c4: fix(cache/server/tui/geo): robustness + interface seams (@jcrussell)
- 90f2b55: fix(checksite): report recorded failures when the run is interrupted (@jcrussell)
- 88d7e79: fix(ci): build the WASM embed in the test-js and validate jobs (@jcrussell)
- 8c3d57d: fix(cli): consistent exit codes for arg-count errors and all-empty multi-city (@jcrussell)
- 9f6b49a: fix(cli): exit non-zero when a command is interrupted (@jcrussell)
- 4ae5668: fix(cmd):
allmust not exit 0 when nothing was ingested or computed (@jcrussell) - 593901d: fix(cmd): io routing, lifecycle, city resolution, request-ctx wiring (@jcrussell)
- bf9643d: fix(cmd): run
all ingestin-process, likeall compute(@jcrussell) - 9df1ff4: fix(cmdutil,db,ingest,checksite): four small correctness cleanups (@jcrussell)
- 8caae3f: fix(config): apply forecast presence before validating the include gate (@jcrussell)
- d5a2e04: fix(config): close the two non-finite holes 8735b58 missed (@jcrussell)
- d88f720: fix(config): emit forecast.cost_overhead from Resolve (@jcrussell)
- 0f31e7c: fix(config): enforce and harden [[include]] resolution; close audit gaps (@jcrussell)
- 888a69b: fix(config): flatten per-city min_hex_area through [[include]] (@jcrussell)
- 7081ecc: fix(config): hard-error validation, include dedup, honored overpass flag (@jcrussell)
- 65c02d6: fix(config): honor an explicit per-city growth_rate = 0 (@jcrussell)
- 26efa82: fix(config): keep a nested include's city identity on the file that declared it (@jcrussell)
- a655327: fix(config): merge include calibration per field instead of erroring (@jcrussell)
- c5cb849: fix(config): reject non-finite floats at load, and +Inf hex edges at the grid (@jcrussell)
- b7e7e27: fix(config): union the include grid as a pair, and move identity with it (@jcrussell)
- b994aae: fix(config,cli): floor hex_edge_m so a decimal typo fails loudly, not by OOM (@jcrussell)
- e3e3428: fix(db): deterministic reads, config-hash isolation, safe DSN (@jcrussell)
- 4cc1696: fix(db): unbrick databases with a duplicated schema_version row (@jcrussell)
- 5ed28ac: fix(export): a skipped city no longer leaves a ghost data directory (@jcrussell)
- b7f7725: fix(export): break optgroup ties on the raw tag so regens stay byte-identical (@jcrussell)
- 0a3ae63: fix(export): drop duplicate unitSystem param; per-city resolved Config tab (@jcrussell)
- 55895d0: fix(export): finish the tagged-dashboard consolidation (@jcrussell)
- 3927b0a: fix(export): materialize resolved [export] defaults in the Config tab (@jcrussell)
- d2b751c: fix(export): peer-review follow-ups to the slider and fixture slice (@jcrussell)
- 999108d: fix(export): re-render Financials from cache on a units toggle (@jcrussell)
- 9827b0f: fix(export): read both city-scope hexgrid shapes (@jcrussell)
- 7c1da54: fix(export): ship the resolved cost overhead in the multi-city seed (@jcrussell)
- 7d88ef8: fix(export): stop billing concrete sidewalk area as hot-mix asphalt (@jcrussell)
- 0292e3c: fix(export): stop funding-gap bars collapsing to full width when all over-funded (@jcrussell)
- 8c47c82: fix(export): stop the Materials note contradicting itself at both ends (@jcrussell)
- e796c96: fix(export): the overhead slider must admit any config-legal seed (@jcrussell)
- ef0b8c2: fix(export): widen, un-step and restore the seeded slider tracks (@jcrussell)
- 0752561: fix(export,docs): address peer-review findings on the pre-release sweep (@jcrussell)
- fa43b16: fix(export/cmd): forecast controls, sim dedupe, cohort label, ctx checks, shared grid (@jcrussell)
- 4d1fdd3: fix(filter): accept abbreviated and territorial state DOTs (@jcrussell)
- 4919db5: fix(filter): anchor " Department of Transportation" on a state name (@jcrussell)
- 66e29d7: fix(filter): classify IH interstates and federal DOT operators correctly (@jcrussell)
- 8c20ad6: fix(filter): close the spelled-out route-ref class (@jcrussell)
- 2f4b485: fix(filter): match county-route refs on the prefix alone (@jcrussell)
- f7a26f5: fix(filter): require a state abbreviation to be the whole DOT qualifier (@jcrussell)
- 2b8edcb: fix(filter): route abbreviated CO RD county refs off the state and city (@jcrussell)
- 8dbaa6e: fix(filter): route forest-service and county-highway refs off the state bucket (@jcrussell)
- 09bc06e: fix(filter): route single-letter and lettered state routes off the city (@jcrussell)
- 2ec2eea: fix(filter): stop billing lettered and spelled route refs to cities (@jcrussell)
- 96f2299: fix(forecast): clamp negative years in Simulate, not just its callees (@jcrussell)
- 50bef71: fix(forecast): default cost_overhead to 1.0 — the calibration already absorbs it (@jcrussell)
- 874e6fc: fix(forecast): full funding now funds each cohort exactly (@jcrussell)
- 5d4b3ce: fix(forecast): input guards, deterministic tiers, alloc-free decay (@jcrussell)
- b4a74a5: fix(forecast): report the final-year grown area in FinalCohorts (@jcrussell)
- 62fc92c: fix(game): bound treatment_cycle_years in both New and the forecast core (@jcrussell)
- 0531764: fix(gc): a cosmetic rescan failure must not abort the run (@jcrussell)
- 2b88adc: fix(gc): stop sweeping valid overpass rows on upgrade (@jcrussell)
- 543d810: fix(geo): complete the degenerate-input guards for Inf and NaN (@jcrussell)
- a7c522f: fix(geo): guard degenerate inputs across buffer/hexgrid/utm (@jcrussell)
- 49dfd0b: fix(ingest): compare a repeated page against our own request cap too (@jcrussell)
- 6361734: fix(ingest): dedup/precision/single-parse, SSRF ranges, drained bodies (@jcrussell)
- c022bbb: fix(ingest): error on oversized bodies and don't truncate ArcGIS pagination (@jcrussell)
- 239a4a3: fix(ingest): prove an ArcGIS repeated page is complete before storing it (@jcrussell)
- e4d3104: fix(ingest): split the bbox again when an Overpass response is oversized (@jcrussell)
- e9eb04e: fix(ingest): stop discarding every ArcGIS feature on an offset-ignoring server (@jcrussell)
- df6eb3b: fix(ingest): stop refusing ArcGIS layers we have already read in full (@jcrussell)
- c71ce85: fix...
v0.3.0
Changelog
Features
- b8bd7b5: feat(export): make solvency the headline Compare-tab score (@jcrussell)
- f39169a: feat(export): render a static-host play.html; fix cross-env links (@jcrussell)
- 096169e: feat(export): write data/play-hexes.json for the /play board (@jcrussell)
- 2cb1d0c: feat(forecast): condition-spread cost correction + pin the cost×cycle calibration (@jcrussell)
- 17b7188: feat(forecast): gate annual need to a treatment cycle for realistic solvency $ (@jcrussell)
- b2e5318: feat(game): add Pavement Manager RTS prototype at /play (@jcrussell)
- 3c55654: feat(game): address play-test feedback (brush, reset, end stats, horizon, nav) (@jcrussell)
- 39942a5: feat(game): move budget + horizon to a pregame start screen; always-on brush (@jcrussell)
- 6a81942: feat(game): segmented Pause/1×/2×/4× speed control (@jcrussell)
- c269f46: feat(game): serve /play in multi-city mode with a city selector (@jcrussell)
- f9b9694: feat(prompt): back the live Prompter with charm.land/huh/v2 (@jcrussell)
Bug Fixes
- 1ef6715: fix(cache): cache Overpass POSTs by body, make TTL=0 a true bypass (@jcrussell)
- 1186208: fix(checksite): complete hygiene reads to the cap, warn on zero-area resources (@jcrussell)
- c5fdb19: fix(compute): snapshot lifecycle, fatal persistence, boundary warn, city-only gate (@jcrussell)
- 2a59870: fix(config): deterministic Hash fallback, surface per-city treatment_cycle_years (@jcrussell)
- 0840f87: fix(db): stable snapshot ordering, numeric migration sort, city-store Close no-op (@jcrussell)
- eedd4b7: fix(export): align coverage legend bar with hex-fill paint and theme it (@jcrussell)
- f422648: fix(export): align index DATA_PREFIX with the shown city on boot (@jcrussell)
- 89a7611: fix(export): decay override in play hexes, seed cycle years, recoverable partial export (@jcrussell)
- a83da2e: fix(export): guard overlapping city/snapshot loads and apply snapshot URL state (@jcrussell)
- 105f6bd: fix(export): play.html uses the per-city forecast seed and frames the board (@jcrussell)
- 83c0444: fix(export): repair Financials TDZ, dynamic Compare labels, scope toggle, tier NaN, endless copy (@jcrussell)
- bba6818: fix(forecast): propagate real DB errors instead of swallowing as skip (@jcrussell)
- fe7afe9: fix(game): unique tier cost rank via stable tiebreak (@jcrussell)
- 63f2a28: fix(geo): antimeridian bbox guard, equator easting sampling, drop dead helper (@jcrussell)
- b345e0d: fix(ingest): correct ArcGIS geometry-null skip, pagination, formatting, and URL merge (@jcrussell)
Other
- 45ac6fe: build(deps): bump go directive to 1.26.4 for stdlib security fixes (@jcrussell)
- a34b70c: build(deps): bump modernc.org/sqlite (@dependabot[bot])
- b82408c: build(deps): bump the actions group across 1 directory with 2 updates (@dependabot[bot])
- 794385d: build(deps): bump the actions group across 1 directory with 3 updates (@dependabot[bot])
- d1d871e: build(deps): bump the actions group with 2 updates (@dependabot[bot])
- bb9f378: build(deps): bump the gomod group across 1 directory with 4 updates (@dependabot[bot])
- cb9abf4: build(deps): bump the gomod group with 2 updates (@dependabot[bot])
- b93944f: docs(examples): add four California metro configs; expand LA to county-wide (@jcrussell)
- 11b5dd2: docs(validation): add forecast validation report vs. real city data (@jcrussell)
- 727b1e4: fix(cmdutil,iostreams): early --jq/--template parse, rune-width table padding (@jcrussell)
- c2deb8f: fix(compute,tui): cancel threads through, no partial-save/empty-snapshot on SIGINT (@jcrussell)
- ca61bda: fix(game,export): address code-review findings; simplify (@jcrussell)
- a12a6f7: fix(game,forecast,resource): spread math, MultiPolygon parking, WASM input bounds (@jcrussell)
- 4899a74: fix(server,export): evict cache on real DB errors, correct snapshot date & city skips (@jcrussell)
- 2e1b43b: fix(status,cities,gc): de-duplicated paved area, always-keep overpass in gc (@jcrussell)
- c0e5651: perf(compute): share one clipped hex grid across all-compute passes (@jcrussell)
- e54af99: refactor(export): share cityHexGrid between board and hexgrid geojson (@jcrussell)
- 0e9871f: refactor(geo): adopt simplefeatures carto.UTM; fix stale overlay comments (@jcrussell)
- af8216a: refactor(wasm): rename forecast.wasm -> pvmt.wasm, cmd/wasm/forecast -> cmd/wasm/pvmt (@jcrussell)
v0.2.0
Changelog
Features
- f4e2f4b: feat(examples): cited PCI/budget calibration with per-source URLs (@jcrussell)
- 9f26e5a: feat(export): add roads solvency metrics (insolvency year, break-even, funding gap) (@jcrussell)
- 3ea2e73: feat(export): group city selector by region (optgroup) (@jcrussell)
- 3703643: feat(export): rectangle region-select with aggregate totals (@jcrussell)
- 6b1c7a9: feat(gc): add top-level pvmt gc to sweep stale features and orphan results (@jcrussell)
- ed3cbc9: feat(ingest): split-and-retry OSM water fetch on truncation; relation tests (@jcrussell)
Bug Fixes
- ebd8bf2: fix(all): make 'pvmt all' interruptible by threading signal context (@jcrussell)
- 444bb7a: fix(cmdutil): trim spaced --json field names; correct cities example (@jcrussell)
- ceeb659: fix(config): honor env>city precedence for hex edge and negative growth_rate (@jcrussell)
- 2f68c9d: fix(config): validate forecast.cost_tiers entries (@jcrussell)
- 3f5ffa6: fix(db): propagate real DB errors from Stats compute lookup (@jcrussell)
- eb8da90: fix(export): correct Financials horizon, scope-matched metrics, deep-link state, paved share, and hex handler leak (@jcrussell)
- a1317c8: fix(export): escape config-sourced strings at client-side innerHTML sinks (@jcrussell)
- ee90120: fix(export): guard 'export --clean' with site sentinel (shared SafeCleanDir) (@jcrussell)
- c84fc72: fix(export): propagate hex/meta DB errors so the cache evicts instead of locking in empties (@jcrussell)
- 131a273: fix(forecast): apply sidewalk discount to custom cost tiers (@jcrussell)
- 26d1edb: fix(forecast): correct sidewalk decay rate and model growth linearly (@jcrussell)
- e6f11bd: fix(forecast): fan out across cities and stop NULL-snapshot row accumulation (@jcrussell)
- 3bf6aa0: fix(forecast): label per-year cost tier from active tiers, not defaults (@jcrussell)
- 379e6e8: fix(forecast): multi-cohort scenarios.json and WASM strategy error surfacing (@jcrussell)
- 60c52d4: fix(forecast): scale per-class decay for decay_rate overrides (@jcrussell)
- 39f0144: fix(geo): derive hex-grid extent from all bbox corners (@jcrussell)
- 60ca6c5: fix(geo): use the defined WGS84 flattening constant (@jcrussell)
- 2b50644: fix(ingest): constrain Nominatim geocoding to the US (@jcrussell)
- f8a07e4: fix(ingest): guard against null ArcGIS FULLNAME (@jcrussell)
- 8c18a0c: fix(ingest): order ArcGIS pages by OBJECTID for stable offset paging (@jcrussell)
- cb27513: fix(ingest): parse parking relations and detect Overpass truncation (@jcrussell)
- 72f7dfc: fix(ingest): re-validate redirects, honor --force in HTTP cache, body-first cache writes (@jcrussell)
- 8c3c845: fix(ingest): scope feature replace to fetched sources on partial failure (@jcrussell)
- 7fd401e: fix(server): tolerate broken cities; correct cities API null, error log, gensite warnings (@jcrussell)
Other
- 6f585b1: build: decouple deploy from site rebuild (@jcrussell)
- fc387aa: build: stamp version/commit into generated site footer (@jcrussell)
- fa2cd3f: feat(check-site): add pvmt check-site to validate a built site tree (@jcrussell)
- 31c85c3: fix(check-site): stop /home/ hygiene check matching URL paths (@jcrussell)
- 499dddb: fix(db,cmd): cohort_stats FK, city-name refresh, config-hash pin, snapshot store DRY (@jcrussell)
- 31f106a: fix(geo,filter): generalize jurisdiction refs, parse unit-suffixed widths, report dropped boundary parts (@jcrussell)
- d07d0b0: fix(geo,resource): include MultiLineString and MultiPolygon in coverage (@jcrussell)
- d55302f: fix(server,cmd): localhost-default bind, drop wildcard CORS, coherent CLI output (@jcrussell)
- d7892d7: fix(server,config): guard config-mismatched pinned snapshots; remove dead [[layers]] (@jcrussell)
- a286931: perf(db): index hex_stats/features for the real read predicates (@jcrussell)
- ae3e626: perf(export): reuse computed meta/seed, batch queries, sort cities (@jcrussell)
- 1f04cd9: perf(geo): clip-first union in hexCoverageArea (@jcrussell)
- 9a930b5: perf(geo): prune interior hexes in ClipHexesToBoundary; guard clip panic (@jcrussell)
- d19f61a: perf(resource): compute road cohort areas in one hex pass (@jcrussell)
- 5c3bb5f: perf(resource): parallelize feature buffering via ParallelMap (@jcrussell)
- bb61a04: perf(resource): skip redundant Buffer(0) on already-valid geometry (@jcrussell)
- c7b5db5: perf(server): cache index render, cities list, and static assets (@jcrussell)
- 3523a59: refactor(export): move layer toggles into the gear menu (@jcrussell)
- b7f05f9: refactor(wasm): extract forecast bridge to a host-testable package (@jcrussell)
- 445143f: refactor: remove dead interface methods, helpers, and comment rot (@jcrussell)
- 7633390: test(export): regenerate goldens for cost-tier label fix (@jcrussell)
- 8cc0868: test(geo): pin hex compute area math before geo refactors (@jcrussell)
- 3ffd4d2: test,docs: fix mock/store fidelity, drop dead SubPhase API, doc rot (@jcrussell)
v0.1.0
Changelog
Features
- b7aa612: feat(export): add Aggregate tab for whole-config region rollup (Jon Crussell joncrussell@gmail.com)
Bug Fixes
- e2a21c4: fix(export): use scope-keyed scenario selection on Compare tab; drop legacy shims (Jon Crussell joncrussell@gmail.com)
- 1b15d49: fix(ingest): recover OSM admin boundaries with bidirectional tolerant ring stitching (Jon Crussell joncrussell@gmail.com)
Other
- c913b7f: Add ArcGIS pagination, server response caching, and serve --city support (Jon Crussell joncrussell@gmail.com)
- 9007ad1: Add BSD-3-Clause LICENSE (Jon Crussell joncrussell@gmail.com)
- 5e1a64d: Add CI/CD pipelines, version command, and release infrastructure (Jon Crussell joncrussell@gmail.com)
- a5d92d1: Add Config tab to exported site and dev server (Jon Crussell joncrussell@gmail.com)
- 7cc86bd: Add ForEachCity multi-city iteration and improved retry transport (Jon Crussell joncrussell@gmail.com)
- 7cfc6e2: Add README and docs (architecture, configuration) (Jon Crussell joncrussell@gmail.com)
- 26be68f: Add cities command to list cities with per-resource stats (Jon Crussell joncrussell@gmail.com)
- bb3efae: Add city area and % paved stats to status, export, and web UI (Jon Crussell joncrussell@gmail.com)
- 992b1c5: Add config show with source provenance and --sources/--json modes (Jon Crussell joncrussell@gmail.com)
- 6cbe6f0: Add config system, hex grid, UTM projection, forecasting, and export (Jon Crussell joncrussell@gmail.com)
- e17202c: Add configurable initial PCI, scope decay overrides to roads, update cost tiers (Jon Crussell joncrussell@gmail.com)
- 5589526: Add dark mode theme system and refresh landing page layout (Jon Crussell joncrussell@gmail.com)
- 12da491: Add example pvmt.toml configs for 10 US cities (Jon Crussell joncrussell@gmail.com)
- 053e22c: Add gensite command and Makefile targets for GitHub Pages (Jon Crussell joncrussell@gmail.com)
- 1470498: Add interactive WASM-based forecast simulation to exported site and dev server (Jon Crussell joncrussell@gmail.com)
- a4f7859: Add jurisdiction filtering and city-scoped financial analysis (Jon Crussell joncrussell@gmail.com)
- 40490a2: Add multi-city Compare tab to exported site (Jon Crussell joncrussell@gmail.com)
- 931612a: Add multi-city support with city-scoped DB, config, and boundary fetching (Jon Crussell joncrussell@gmail.com)
- 4afea9a: Add parallel compute with R-tree spatial index and TUI progress (Jon Crussell joncrussell@gmail.com)
- d89991f: Add per-classification cohort-based forecasting for road networks (Jon Crussell joncrussell@gmail.com)
- 459400e: Add scenario simulation engine and financials dashboard tab (Jon Crussell joncrussell@gmail.com)
- 7e1143a: Add shared methodology doc rendered on landing and dashboard (Jon Crussell joncrussell@gmail.com)
- 08f3a8d: Add sidewalk resource type and rename pavements to roads (Jon Crussell joncrussell@gmail.com)
- d062a91: Add site/ to .gitignore (Jon Crussell joncrussell@gmail.com)
- c683a5c: Add typed pflag.Value enums for --source and --units (Jon Crussell joncrussell@gmail.com)
- cd34e41: Add vertical crosshair plugin and index tooltips to forecast charts (Jon Crussell joncrussell@gmail.com)
- d079b8a: Align CLI with design beads: IOStreams discipline, middleware, error hints (Jon Crussell joncrussell@gmail.com)
- b9f86c0: Collapse RetryTransport / RetryTransportWithConfig into a single constructor (Jon Crussell joncrussell@gmail.com)
- cf68e88: Combined cross-resource paved-area pass (Jon Crussell joncrussell@gmail.com)
- 17b87b3: Consolidate DB migrations into single init schema (Jon Crussell joncrussell@gmail.com)
- 326f606: Consolidate frontend and add hex grid interactivity (Jon Crussell joncrussell@gmail.com)
- 655b54c: Consolidate migrations 002/003 into 001 init schema (Jon Crussell joncrussell@gmail.com)
- a39e2aa: DRY: collapse server cache wrapper, extract FormatTimestamp, reuse forecasts (Jon Crussell joncrussell@gmail.com)
- dd582bf: Decouple DI, add shared mock store, JSON export flags, and iostreams toolkit (Jon Crussell joncrussell@gmail.com)
- a6de6d7: Deduplicate export/server shared logic and apply Go idiom cleanups (Jon Crussell joncrussell@gmail.com)
- d0edb78: Delete Projector interface; use *UTMProjector directly (Jon Crussell joncrussell@gmail.com)
- 7e76198: Disable beads auto-push and consolidate agent docs (Jon Crussell joncrussell@gmail.com)
- 3eb1e62: Document env vars and config show; fix resolution hierarchy; DRY pass (Jon Crussell joncrussell@gmail.com)
- 1721a64: Drop city-wide union pass; compute coverage per-hex (Jon Crussell joncrussell@gmail.com)
- 6bf6f17: Enable SQLite foreign key enforcement and harden connection setup (Jon Crussell joncrussell@gmail.com)
- c74c8db: Expand golangci-lint config and fix all new warnings (Jon Crussell joncrussell@gmail.com)
- 4023338: Fix CI: pin Go version to 1.26 with check-latest (Jon Crussell joncrussell@gmail.com)
- c620311: Fix Overpass closed-way geometry and conditional ArcGIS source (Jon Crussell joncrussell@gmail.com)
- 3e8631c: Fix User-Agent URLs; sync PCI slider from forecast seed (Jon Crussell joncrussell@gmail.com)
- a684a15: Fix all golangci-lint issues for clean lint pass (Jon Crussell joncrussell@gmail.com)
- 0d4dfcf: Fix calculation correctness: div-by-zero, width double-count, UTM zone clamp, cohort unions, CSV robustness (Jon Crussell joncrussell@gmail.com)
- 8f0933b: Fix default cost tiers: convert FHWA
$/sq yd values to $ /sq ft (Jon Crussell joncrussell@gmail.com) - 419a934: Fix execSub leaking os.Args into subcommands (Jon Crussell joncrussell@gmail.com)
- d680cd4: Fix export invocation in README quickstart (Jon Crussell joncrussell@gmail.com)
- fa40d3c: Fix golangci-lint issues in gensite and export (Jon Crussell joncrussell@gmail.com)
- e187770: Fix heading hierarchy across landing page and methodology (Jon Crussell joncrussell@gmail.com)
- e3f3ed8: Fix lint: gofmt alignment and gosec G705 false positive (Jon Crussell joncrussell@gmail.com)
- 14bf32a: Fix polygon precision errors with Buffer(0) validation (Jon Crussell joncrussell@gmail.com)
- bfb3206: Fix server template data; extract CityEntry.Info (Jon Crussell joncrussell@gmail.com)
- be34fc1: Flatten Comparison wrapper to []ScenarioResult (Jon Crussell joncrussell@gmail.com)
- 52fce30: Flesh out CLAUDE.md with build, architecture, and conventions (Jon Crussell joncrussell@gmail.com)
- f8fd65c: Improve Overpass ingest: out geom, bbox splitting, Nominatim city filtering (Jon Crussell joncrussell@gmail.com)
- bab5612: Initial commit: pvmt PoC (Jon Crussell joncrussell@gmail.com)
- 455f9f3: Interpolate cost model to eliminate step-function jumps in annual treatment need (Jon Crussell joncrussell@gmail.com)
- 2d85214: Layered config resolution, explicit JSON exports, fs.FS boundaries (Jon Crussell joncrussell@gmail.com)
- 8cf9ca1: Polish docs and drop stray snapshots.city_id default (Jon Crussell joncrussell@gmail.com)
- 8d8c138: Promote spf13/pflag to direct dependency (Jon Crussell joncrussell@gmail.com)
- c825266: Propagate forecast build errors; evict server cache on failure (Jon Crussell joncrussell@gmail.com)
- c426ea9: Refactor cities row building and root command registration (Jon Crussell joncrussell@gmail.com)
- bf1fe7f: Remove dead code: stub forecasters, unused error sentinels, file ingest sources (Jon Crussell joncrussell@gmail.com)
- 63d3a91: Run go fix ./... across the codebase (Jon Crussell joncrussell@gmail.com)
- 942301a: Run go fmt across the codebase (Jon Crussell <joncrussell@gmail...