Created
Jun 25, 21:45
Started
Jun 25, 21:46
Completed
Jun 25, 22:58
DevOps handoff
Type
Bug
Shape
backend
Worktree Slug
fix-geo-blocked-usdc-funding
Repositories
turf-monster
Release Train
—
Branch
feat/fix-geo-blocked-usdc-funding
Pull Request
https://github.com/amcritchie/turf-monster/pull/165Local URL
—
QA URL
—
Production URL
—
Acceptance Criteria
Expected Test Plan
Checks Run
Agent Context
Prod bug: turfmonster.media Buy USDC button disabled with 'isn't available in your state' (no state code shown => geo_state blank). Root cause in app/controllers/application_controller.rb#detect_geo_state: on a transient ipinfo failure/blank-region the rescue (and success path) stamp session[:geo_detected_at]=now while geo_state stays blank, so the 24h staleness check won't re-attempt for 24h on the same IP. geo_blocked? then fails closed (GeoSetting.enforcing? && country==US && state.blank?). Confirmed user IP 174.29.98.236 resolves server-side to Colorado (allowed, not in DEFAULT_BANNED_STATES WA ID MT LA AZ HI NV CA) -> only the cached blank blocks them. STRIPE_CHECKOUT_DISABLED is set so Coinbase is the ONLY funding rail; a geo hiccup hard-locks funding 24h. ipinfo is anonymous tier (readme: missingauth) -> rate-limited, returns region NAME only (state_code='' region_code=nil). Fixes: (1) config/initializers/geocoder.rb add ipinfo_io api_key from ENV[IPINFO_API_TOKEN] (nil-safe, no-op when unset); (2) detect_geo_state: use a short retry TTL (~minutes) when resolved state is blank instead of 24h, so a transient failure self-heals on next request; keep 24h TTL only when a state actually resolved. Name->code map (app/helpers/geo_helper.rb US_STATES) is complete, keep it. Operator follow-ups: provision ipinfo token into 1Password + set IPINFO_API_TOKEN on turf-monster-mainnet; deploy. Immediate user unblock today = clear site data for turfmonster.media (forces fresh detection -> CO).
Stage Timeline
Who handled each stage, the time it took (measured), and the model / tokens / cost reported (best-effort) — plus who's on it right now. — means the agent didn't report that metric.
Conversation
QA review feedback, agent handoffs, and follow-up notes for this task.
No task feedback has been recorded yet.
Sealed-bid sizing
Edit →Alex (PM)
—
Avi (PO)
—
Dev
—
Actual
LARGE
We emailed a one-tap sign-in link to . It expires shortly and can only be used once.
No email? Check spam, or close this and try again.