Versioning policy. The URL prefix
/v1/ is locked for the entire v1.x line — no
breaking changes will land under /v1/. Additive fields on
response envelopes are always optional and default-safe for existing
clients. Whenever a field is deprecated we advertise it under
provenance.deprecations for at least one full minor release
before removal. Async-job endpoints, idempotency keys, and the
X-Request-Id header all carry stability guarantees identical
to the routes themselves.
Added
- Add
GET /v1/admin/rlm/telemetry/daily — daily rollup of RLM (recursive language-model) invocations: budget consumption, slice counts, adapter mix, per-tenant concurrency saturation. Materialised nightly at 02:00 UTC.
- Add
GET /v1/admin/dashboard/{overview,map/markers,sites/{id},jobs/timeline,reviews/queue,usage/rollup} — six dashboard endpoints powering the operator console.
- Add
POST /v1/admin/calibration/cycles/run and GET /v1/admin/calibration/cycles with per-cycle POST /v1/admin/calibration/cycles/{id}/review — Phase 2 calibration scheduler with human-in-the-loop approval. decision values are approved/rejected.
- Add
POST /v1/midmen/{route_optimization_audit,compliance_window_check,regime_shift_explainer} — three RLM-backed audit blueprints, each returning a cited envelope identical to incident_postmortem.
- Add
regime_correlation derivation worker — surfaces cross-engine correlation snapshots in provenance.derivations.
- AddOperator Objective Vector (5-dimensional) on
/v1/predict/* envelopes for tenants who opt in.
Updated
- UpdLM adapter retry & circuit-breaker — transient
429/503 now triggers exponential backoff (3 retries: 0.5 s / 2 s / 8 s); per-tenant breaker opens after 5 consecutive failures and resets after 60 s. Surfaced as degraded:lm_provider_unavailable instead of HTTP 500.
- UpdTelemetry rollup primary key normalised to
(tenant, day, adapter, vertical_id); the synthetic 'all' partition has been retired.
- UpdCustom-tool admin scope expanded —
tenant:admin Bearer keys may now register tools whose owner_tenant_id matches the caller; the platform-admin token retains global scope.
- UpdIndoor positioning gained
wifi_rtt, ble, and uwb source adapters on POST /v1/indoor/*.
Fixed
- FixJob startup recovery —
pending and running rows older than 10× the watchdog timeout are now re-claimed at boot, eliminating stuck async jobs after a server restart.
Added
- Add
POST /v1/route/shortest and POST /v1/route/influence_spread — graph routing with safe quoting against adversarial network_id / tenant_id / vertical_id inputs.
- Add
POST /v1/graph/related with full per-table coverage of NODE_TABLES and tenant-predicate enforcement on every entry.
- Add
POST /v1/reason/recursive — recursive language-model reasoning with citation envelopes.
- Add
where_was trajectory interpolation — Hermite (or geodesic-aware) interpolation; response provenance.interpolation records the method.
- Add
python -m qhp.scripts.import_osm <pbf> — bulk OSM road-network import CLI (county-sized PBF in < 10 minutes).
Updated
- UpdBearer multi-tenant isolation tightened — tenant-A keys cannot direct-fetch tenant-B entities; traversal silently filters at the SQL layer.
- Upd
geo_rlm_invocations.vertical_id made NOT NULL; routes that omit scope.vertical_id now receive a 422 instead of a silent fallback.
Added
- AddAsync-job control plane — every long-running
simulate route returns 202 Accepted with job_id; poll via GET /v1/jobs/{id} or subscribe with a webhook signed by HMAC-SHA-256.
- AddPer-tenant concurrency caps — tier-1 = 4, pro = 8, scale = 16 in-flight requests;
concurrency_saturated_seconds now appears in telemetry.
- AddIdle-wallclock guard — long LM stalls terminate inside the slice with
degraded:budget_terminated:wallclock.
- AddNightly scheduler —
materialize_daily_rollup fires at 02:00 UTC; manual POST /v1/admin/rlm/telemetry/refresh remains available.
Updated
- Upd
GEOG_API_KEYS production enforcement — server now refuses to start in production if no keys are configured. Dev mode unchanged.
- Upd
/api/docs (Swagger UI), /api/redoc (ReDoc), and /api/openapi.json render every Phase-4 and Phase-5 router cleanly with named example payloads.
Added
- Add
POST /v1/simulate/{plume,flood,rf_coverage,noise,thermal,fire} — six Tier-1 engines with shared response envelope and per-engine UQ bounds.
- AddUQ suite — bootstrap
N=200, ensemble K=20; sync requests return provenance.uq_async_job_id; uq_async=false falls back to N=20.
- AddBayesian-posterior UQ for engines that declare
method=bayesian_posterior — real {lower, upper, method} intervals replace the v1.0 stub.
- AddEngine analytic gradients — calibration v2 passes them as
jac= to scipy.optimize.minimize; objective converges in ≤ 32 iterations (down from 64).
- Add
POST /v1/optimize/* — engine-aware optimisation (sensor placement, exposure minimisation) reusing the simulation envelope.
Added
- Add
GET /v1/context, GET /v1/context/batch?device_ids= (≤ 100 ids per call), GET /v1/nearby, GET /v1/within, GET /v1/jurisdiction — five spatial primitives backed by PostGIS + H3 indexing.
- AddPhase 1 schema — five core spatial tables (
geo_devices, geo_position_events, geo_jurisdictions, geo_road_networks, geo_indoor_floors) with H3 r-9 cell indexing.
- AddBearer-token authentication keyed on
geog_test_sk_… / geog_live_sk_… prefixes, with per-tenant rate limiting and standardised error envelope.
- AddStandard response envelope:
{ ok, data, provenance, degraded } across every route.
- Add
X-Request-Id reflection header on every response for client-side correlation.
Subscribing to a release feed? Watch
/api/openapi.json
— its info.version field always matches the most recent
entry on this page. For breaking-change advance notice, email
hello@geog.ai.