Changelog.
Review polish pass 2026-04-20
- Python SDK live on PyPI:
pip install amanoki. Typed Client / AsyncClient covering every current endpoint, RFC 7807 error subclasses.
- Per-IP rate limit (60 rpm, token bucket) at the app layer. 429 body is
application/problem+json; Retry-After, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset all set.
- Errors go out as RFC 7807
application/problem+json with {type, title, status, detail, instance}. The type URI points at the methodology section for the relevant failure class.
- Every 2xx JSON response now carries an
_meta block (api version, methodology URL, not-advice notice).
- Weather cache refreshes every 60 minutes in a background task;
weather_staleness_warning on regime-forecast responses when the last fetch is older than 2 h.
- Regime-forecast responses gain
confidence_caveat (majority-class over-confidence) and untrained_classes (classes with zero training frequency).
/v1/admin/usage hides presence behind 404 when the token is missing or wrong. /v1/health/deep added. Root / returns service-discovery JSON.
- Static surface added:
/about, /security, /terms, /privacy, /refunds, /commerce (特定商取引法), /status, /stats, independent /pricing.
- Not-advice disclaimer on landing, methodology, and
_meta.notice.
- spatial-influence adds
hit_rate_ci_95; limit parameters unified via Pydantic Query(ge=1, le=N) — silent caps gone.
Regime forecast v1.5 2026-04-17
- Live
regime-forecast now serves a multinomial logistic regression trained with a 24-bar embargo.
- Features: v1 (area + UTC hour + is-weekend + current z-vol + five Open-Meteo vars) plus z-vol lags at
t-1/-2/-6/-24 and regime one-hot at t-1.
- Winner-per-horizon chosen by test Brier on an identical held-out; v1.5 wins all three horizons.
- Test Brier: 0.017 @ 60 min · 0.032 @ 120 min · 0.075 @ 240 min (baseline ≈ 0.43).
- An ESN reservoir-computing v2 was scaffolded and scrapped on service-fit grounds (state management, embargo, serve-time weather sequence alignment); the simpler lag-augmented v1.5 was shipped instead.
Analytics endpoints + usage counters 2026-04-14
/v1/power/{m}/{a}/matrix, /durations, /history — transition matrix, state-dwell distribution, per-bar feature snapshot.
/v1/power/{m}/{a}/spatial-influence — empirical lag-correlation ranking other areas by how often their regime entry precedes the target's.
/v1/power/{m}/{a}/regime-forecast — distribution over regimes at t + horizon.
/v1/admin/usage — in-memory route-template counters gated by AMANOKI_METRICS_TOKEN; behavioural analytics replaces customer interviews for product direction.
Weekday conditioning 2026-04-12
- Spike-probability tables now condition on (hour-of-day × is-weekend). 48 buckets instead of 24.
- Response carries
bucket_size so callers can discount thin cells.
/v1/power/{m}/{a}/transitions endpoint added — recent FSM transitions, newest first.
/v1/status transparency summary added.
Round A polish 2026-04-10
- Python SDK built (
amanoki), sync + async clients, typed responses.
/v1/health and /v1/status now include code_commit.
- Sentry wired (no-op when
SENTRY_DSN unset; 5xx-only + per-fingerprint throttle to stay inside the free tier).
- OpenAPI examples for every response model —
/v1/reference shows real payloads.
- Static pages: quickstart, methodology, changelog. Plus favicon, OG image, 404, sitemap, robots.
Multi-market + JEPX live 2026-04-06
- Catalog of 6 markets: JEPX, ERCOT, PJM, CAISO, AEMO, NYISO.
- URL shape:
/v1/power/{market}/{area}. /v1/markets lists the catalog.
- JEPX live: ~356k feature bars baked into the image, replayed at boot. Daily GHA refresh at 12:00 JST.
/v1/power/{m}/{a}/spike-probability — empirical P(max ≥ threshold | hour-of-day), three thresholds × two horizons.