How we do this
Every claim on this site is produced the same way, and you should be able to check it. This page explains exactly how a bill becomes an analysis — and, just as importantly, what our method cannot tell you.
1. The problem we’re solving
A bill about farm subsidies can contain a section about surveillance. A defense authorization can carry a tax break for one company. These are called riders, and they are legal, common, and almost impossible for a normal person to catch — not because they are hidden in any technical sense, but because bills routinely run to thousands of pages and nobody reads them.
Our approach starts from a simple observation: a provision that doesn’t belong in a bill tends not to read like the rest of the bill. That difference is measurable.
2. Where our data comes from
We use official government sources only. We do not scrape secondary commentary, and we do not accept data from advocacy organizations, campaigns, or lobbying firms.
- Bill metadata — Congress.gov, the official legislative record.
- Full bill text — GovInfo bulk data, published by the Government Publishing Office.
- Voting records — the Office of the Clerk of the U.S. House of Representatives.
- Campaign finance — the Federal Election Commission.
- Subject classification — policy areas and subject terms assigned by the Congressional Research Service.
3. How we find anomalies — math, not AI
This is the part people usually get wrong about us, so we want to be precise: we never ask an AI model to find suspicious provisions. Detection is a deterministic mathematical process. The same bill run twice produces the same flags.
- Clean. We strip headers, boilerplate, and formatting artifacts from the raw text. This step is deliberately conservative — it never alters substantive language.
- Split. The bill is divided at its own section boundaries (SEC., SECTION, §, TITLE, DIVISION), so we compare real legislative units rather than arbitrary blocks of text.
- Measure. Each section is converted into a numerical representation of its meaning — a 384-dimension vector produced by an open-source sentence-embedding model. Sections about similar things end up near each other; a section about something else ends up far away.
- Compare. We compute the bill’s own center of gravity — the average of all its sections — and measure how far each section sits from it. A section that is far from the bill’s own center is a candidate.
Two supporting signals refine the result: how well a section matches the bill’s stated title and summary, and how well it matches the policy area the Congressional Research Service assigned. These adjust how serious a flag is. They cannot create a flag on their own.
Short bills are handled differently. When a bill has only one or two sections, an “average section” is meaningless — there is nothing to be an outlier from. For those we require a section to diverge from both the stated title and the assigned subject, at a stricter threshold, before flagging anything.
4. What a flag actually means
Every flagged provision carries a similarity score between 0 and 1. Lower means further from the rest of the bill. We group flags into three severity bands, and roll a whole bill up into one of three risk levels:
| Risk level | What it means |
|---|---|
| Clean | Nothing in this bill diverged from what it says it’s about. |
| Caution | One or two provisions are worth a second look. |
| Flagged | Three or more provisions don’t match the bill’s stated purpose. |
A flag is an observation about language, not a finding of wrongdoing. It says a provision doesn’t look like the bill it’s in. It does not say anyone acted in bad faith, and we are careful never to write as though it does.
5. What the AI does — and doesn’t
Once the math has identified a provision, we ask a large language model to do one narrow job: explain, in plain English, what that provision says. It translates legislative language. It does not decide what gets flagged, it does not rank severity, and it does not judge intent.
We keep this boundary strict because language models are persuasive whether or not they are correct. Letting one decide what looks suspicious would mean publishing confident accusations with nothing underneath them.
No AI runs while you browse. Every analysis is generated in advance, reviewed, and stored. Everyone looking at a given bill sees the exact same analysis — there is no personalization and no regeneration.
6. A human reads it before you do
Nothing reaches this site automatically. Every analysis enters a review queue where a person examines each flagged provision individually and approves or rejects it. Only approved analyses are published.
Rejected analyses are not deleted. They are archived, along with what was flagged and why it was rejected, and used to tune the detection thresholds. Our mistakes are part of our training data.
Every status change is written to an append-only audit log. This gate is the slowest part of our pipeline and we have no intention of removing it: a false positive here is a public accusation against a named person.
7. The permanent record
When an analysis is approved, we take a SHA-256 hash of the bill text, the analysis, and the timestamp, and write that hash to the Ethereum mainnet. The analysis page shows the transaction, and you can verify it independently on Etherscan.
The point is narrow and worth stating plainly. It proves we published a specific analysis at a specific time and have not quietly edited it since. If we ever changed our conclusion about a bill after the fact, the hash would no longer match and anyone could see it — including us. That is the entire purpose.
It does not prove our analysis is correct. A blockchain records that something was said, not that it was true.
8. What this method cannot do
Any method that only reports its strengths is marketing. Here are the real limits of ours.
- We do not catch everything. A rider written in the same register as its host bill will not stand out mathematically. Skilled drafting defeats this technique, and we should be judged accordingly.
- Unusual is not the same as improper. Plenty of legitimate provisions are unusual — technical corrections, severability clauses, appropriations language. Our review step exists precisely because the math cannot tell these apart from real riders.
- Coverage is federal, and partial. We currently analyze federal legislation only. State coverage is planned, beginning with a single pilot state. A bill we have not analyzed is not a bill we have cleared.
- Human review is our bottleneck. Because a person reads every analysis, our throughput is limited by people, not computers. We consider this the correct trade and we would rather be slow than wrong.
- Thresholds are judgment calls. The cutoffs that separate a flag from a non-flag were chosen and tuned by us. Reasonable people could set them differently and get somewhat different results.
- Correlation is not causation. Where we show a donation, a vote, and a bill near each other in time, we are showing you a sequence of public facts. We are not asserting that one caused another, and you should not read it that way.
9. How to check our work
Every analysis page links to the full official bill text, so you can read the flagged section in context rather than taking our summary for it. Published analyses carry a verification badge linking to the blockchain record. Every underlying data source is listed above and is public.
If you believe we have gotten something wrong, tell us at corrections@wearecandor.org. We would rather be corrected than be trusted by default.
For who we are and why we built this, see our mission.