Add Coverage Atlas — 50-state Medicaid coverage scanner - #265
Open
MMeteorL wants to merge 1 commit into
Open
Conversation
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
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. Comment |
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
force-pushed
the
meteor/coverage-atlas
branch
from
August 26, 2026 08:15
9c352f0 to
526634a
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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), orreported(a dated public announcement).TinyFish usage
The escalation ladder, cheapest rung first —
coverage-atlas/agent/lib/tinyfish.ts:links: trueso outbound links become leads for a later gap-filling passSearch 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.
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
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.coverage-atlas/docs/: architecture, the agent, data model, HTTP API, operations, and a decisions log covering the calls made and what each cost.cms-coverage-policyas 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.mdis 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/workflowschanges my token has noworkflowscope to push.The row belongs under Lifestyle & Health, beside
pharmacy-panic: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
TODOin the recipe READMEcoverage-atlas/docs/media/hero.pngfor now.🤖 Generated with Claude Code