repos
1.6 KB raw
-- finance migration 0002: per-endpoint request-guard state (Phase 3).
--
-- One row per outbound data endpoint (today only 'stooq'). It is the persistent
-- backing store for `EndpointGuard` (src/guard.rs): a reactive circuit breaker
-- plus a hard per-hour request budget, so a third-party rate limit can never be
-- hit even across restarts or by a future job. All *_at columns are UTC
-- epoch-milliseconds, matching the rest of the schema.

CREATE TABLE endpoint_guard (
    endpoint        TEXT PRIMARY KEY,                       -- logical upstream id, e.g. 'stooq'

    -- ── circuit breaker ──
    state           TEXT    NOT NULL DEFAULT 'closed',      -- closed | open | half_open
    fail_streak     INTEGER NOT NULL DEFAULT 0,             -- consecutive ordinary failures while closed
    trip_count      INTEGER NOT NULL DEFAULT 0,             -- consecutive trips; drives the backoff length
    opened_at       INTEGER,                                -- when the breaker last opened
    retry_at        INTEGER,                                -- earliest time a half-open probe may run

    -- ── hard per-hour request budget ──
    hour_start      INTEGER,                                -- start of the current rolling budget hour
    hour_count      INTEGER NOT NULL DEFAULT 0,             -- requests let through in the current hour

    -- ── bookkeeping ──
    last_request_at INTEGER,                                -- last request let through (drives pacing)
    last_ok_at      INTEGER,
    last_error      TEXT,
    last_error_at   INTEGER,
    updated_at      INTEGER NOT NULL
);