Skip to content

Add Coverage Atlas — 50-state Medicaid coverage scanner - #265

Open
MMeteorL wants to merge 1 commit into
tinyfish-io:mainfrom
MMeteorL:meteor/coverage-atlas
Open

Add Coverage Atlas — 50-state Medicaid coverage scanner#265
MMeteorL wants to merge 1 commit into
tinyfish-io:mainfrom
MMeteorL:meteor/coverage-atlas

Conversation

@MMeteorL

@MMeteorL MMeteorL commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

What it is

Name a condition in plain English — "GLP-1s for weight loss", "CGMs", "ABA therapy for autism" — and Coverage Atlas scans Medicaid coverage policy across all 50 states and DC.

The angle: a coverage label alone is close to meaningless. Two states can both say covered and be forty points apart in what a patient actually faces — one wants prior authorization, a documented failed trial, six months of a supervised program, a specialist prescriber and quarterly reauthorization; the other puts it on the pharmacy shelf. So the scanner extracts the administrative gates each state actually publishes and scores them into an Access Friction Index. On GLP-1s, 24 states carry the identical coverage status and sit 54 friction points apart. The map colours by status or by friction, and the two maps do not look alike.

Medicaid publishes no cross-state database and no change feed anywhere in the country, so the delta has to be computed rather than read. Every change event says how it was established: observed (our own snapshot diff between two scans), historical (two dated versions of the state's own policy, compared within a single scan — a bulletin announcing a change states the rule it replaces), or reported (a dated public announcement).

TinyFish usage

The escalation ladder, cheapest rung first — coverage-atlas/agent/lib/tinyfish.ts:

  • search — discovers multi-state trackers, each state's own policy documents, and dated announcements
  • fetch — reads them as markdown, with links: true so outbound links become leads for a later gap-filling pass
  • agent (stealth + US proxy) — only when a plain fetch comes back empty, which for state Medicaid portals usually means a 403. Live-tested; several states need it.

Search and fetch carry the overwhelming majority of the work; the metered rung is capped by a per-scan budget and fired twice in the run below.

Architecture

An orchestrator owns the plan, the budget and the merge and does no extraction; per-state subagents own nothing else. A subagent sees one state and roughly two thousand tokens — never its siblings' results, the tracker document, or the orchestrator's reasoning.

resolve → discover → baseline → fan-out → backfill → [infer] → changes → diff → snapshot
  smart     search      fetch     ladder    leads +    on cap    search    pure    disk
   ×1        ×4        ×1+smart   cheap×n   batched              smart×1   code

Bounded by two hard ceilings — 200 TinyFish calls and 80 orchestrator steps — and it stops early, budget unspent, once every jurisdiction carries a timestamped, cited answer. Anything unresolved when a ceiling binds is filled from model knowledge and marked unverified everywhere it renders, never passed off as sourced.

Representative live run: 51/51 jurisdictions sourced, 46 dated, 34 with policy history, 0 inferred — stopped because every jurisdiction was answered, at 89/200 calls and 41/80 steps, 12.0× cheaper than sending every source document to a model once per state. Every run ledgers that ratio rather than asserting it.

Notes for reviewers

  • A seeded 51-jurisdiction scan is committed under coverage-atlas/data/, so the app opens with a full map and no API keys. Keys are only needed to run a new scan or re-verify a state.
  • Scope is Medicaid fee-for-service only — roughly three quarters of enrollees are in managed care, which layers its own criteria. FFS is the published floor, and the README says so rather than implying otherwise.
  • Deeper docs in coverage-atlas/docs/: architecture, the agent, data model, HTTP API, operations, and a decisions log covering the calls made and what each cost.
  • Complements #264, which added cms-coverage-policy as a shared skeleton and noted the healthcare case was owned by me. This is that delivery, in its own folder — the two do not overlap.

One thing I could not add: the recipe-index row

This branch adds only files under coverage-atlas/, so it merges cleanly. README.md is deliberately untouched: upstream reorganised the index into categories after the point my fork is cut from, so any edit to that file conflicts, and resolving it means merging upstream in — which carries .github/workflows changes my token has no workflow scope to push.

The row belongs under Lifestyle & Health, beside pharmacy-panic:

| [coverage-atlas](./coverage-atlas) | Name a condition and see how all 50 states' Medicaid programs cover it — status, computed access friction, and what changed |

Happy to add it in a follow-up once my fork is synced, or feel free to drop it in on merge.

Still to add before merge

  • Live demo link — deployment URL, currently a TODO in the recipe README
  • Demo video — a capture of a live scan (map repainting state by state, then the Friction toggle redrawing the country). A rendered still stands in at coverage-atlas/docs/media/hero.png for now.

🤖 Generated with Claude Code

@coderabbitai

coderabbitai Bot commented Aug 26, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: ced77490-c96d-4578-b0ea-9e10f67da05e

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Name a condition in plain English and Coverage Atlas scans Medicaid coverage
policy across all 50 states and DC. Because a coverage label alone is close to
meaningless, it extracts the administrative gates each state publishes and scores
them into an Access Friction Index: on GLP-1s, 24 states carry the identical
coverage status and sit 54 friction points apart. The map colours by status or by
friction, and the two maps do not look alike.

TinyFish does all the collection, cheapest rung first. search discovers
multi-state trackers, state policy documents and dated announcements; fetch reads
them, with links on so outbound links become leads; the stealth agent takes over
when a state portal 403s a plain fetcher, which several do. An orchestrator owns
the plan and the budget while per-state subagents see one state and about two
thousand tokens each, never their siblings' results.

Medicaid publishes no cross-state database and no change feed anywhere in the
country, so the delta is computed rather than read. Every change event states how
it was established: observed from our own snapshot diff, historical from two dated
versions of the state's own policy compared within one scan, or reported from a
dated announcement.

Bounded at 200 TinyFish calls and 80 orchestrator steps, stopping early once every
jurisdiction carries a timestamped, cited answer. A representative run: 51/51
sourced, 46 dated, 0 inferred, stopped at 89/200 calls, 12x cheaper than sending
every document to a model once per state.

A seeded 51-jurisdiction scan is committed under data/, so the app opens with a
full map and no API keys.

Adds only files under coverage-atlas/. The recipe-index row is left out on
purpose: upstream reorganised README.md after the point this branch is cut from,
so touching that file conflicts, and resolving it means merging upstream in and
pushing .github/workflows changes this token has no scope for. The row is in the
PR description ready to paste.
@MMeteorL
MMeteorL force-pushed the meteor/coverage-atlas branch from 9c352f0 to 526634a Compare August 26, 2026 08:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant