Fix intermittent run failures (drove the Store "under maintenance" flag): route the SAM.gov
fetch through the shared request_with_retries (429/5xx backoff, honors Retry-After) instead
of crashing on the first non-200. A transient rate-limit/gateway blip that survives all retries
now degrades to the rows gathered so far (a clean, charge-nothing run) rather than a failed run;
non-transient 4xx still raise.
0.1.0
Initial release: stateful new-since-last-run alert over the GSA Get Opportunities (SAM.gov) API.
Filters by NAICS, keyword, agency, set-aside; dedupes per filter-config in a named KV store;
baseline run is free, charges per new opportunity.
0.2 — 2026-07-21
Fixed
A throttled run no longer looks like a quiet day (#133). All public runs share one baked-in
data.gov API key with a daily quota. On exhaustion the actor degraded to a clean 0-row run —
so a customer monitoring for federal opportunities was told "no new opportunities" when the
truth was "we could not look". On an alert actor that is a false all-clear, not a graceful
degradation. The run now emits a free status marker row explaining what happened and when the
quota resets (00:00 UTC).
fetch_opportunities() returns (rows, degraded_reason) instead of silently swallowing why it
stopped early.
Charging keys off status is None, so a marker row can never be billed.