Method·August 25, 2026 · 4 min read

A constraint can't be skipped. A script can.

FDA Radar's database refuses to approve an item without a human-written urgency and recommendation — a rule the classifier cannot touch, because the schema it returns has no field for either one. The same bright line applied to the model's own prose has no such guarantee. It has a script, and a script only runs when someone remembers to.

By Connor Griggs — Regulatory & Quality Strategist

Every item this product ever sends carries a human-written urgency and a human-written recommendation, or it does not get approved. That is not a policy anyone has to remember — the database will not accept the update. The table’s own check constraint reads, in essence: an item cannot move to approved unless urgency, actions_md, and reviewed_by are all filled in by a person. No code path in the product can approve an item around that rule, because Postgres itself is the thing refusing.

One layer up, the same guarantee holds for a different reason. The classifier’s output is a JSON schema with additionalProperties: false and no key named urgency or recommended_actions anywhere in it. The model is not merely instructed to leave urgency alone. It has nowhere to put it — the schema itself makes the omission structural, not a matter of the prompt being obeyed.

What that guarantee doesn’t reach

Both of those are hard constraints: one enforced by the database, one by the shape of the API call. Neither one, though, looks inside the two free-text fields the model does fill in — summary_md and impact_md. The schema’s description for each field asks the model directly: “No recommendations, no urgency, no imperatives aimed at the reader.” That is a request written into a prompt, not a rule a parser enforces. Nothing stops the model from writing a summary sentence that reads exactly like advice — “manufacturers should update their labeling immediately” is a sentence the schema has no way to reject, because the schema only checks that summary_md is a string.

That gap is where scripts/verify-classify.ts lives. It is not part of the production pipeline — classify.ts, the job that actually drafts items in the database, never runs it. It is a script a developer runs by hand, usually after touching the prompt: it fetches one real, live FDA document — preferring a guidance document, because guidance prose is “the highest-value document type and the one whose prose is richest, so it exercises the prompt hardest” — classifies it for real, and then runs the drafted text through two short lists of regular expressions. One catches advice-shaped phrasing: you should, we recommend, manufacturers must. The other catches urgency-shaped phrasing: urgent, critical, immediate action, time-sensitive. A hit on either list fails the run and prints exactly which phrase tripped it.

A rule enforced by a database constraint cannot be forgotten. A rule enforced by a script can be forgotten by simply not running the script.

A spot-check, honestly described

It would overstate what this script does to call it a test suite. It exercises one document, chosen for being a hard case, read by whoever is watching the terminal. It costs one live API call, which is exactly why it is not something a CI pipeline runs on every commit against the full corpus — that would mean a paid model call on every push, against documents that don’t change between them. So it is a deliberate human action: run it after a prompt edit, read the summary and impact it prints, and let the two pattern lists do the part of the reading that is easy to miss under a deadline. FDA’s own guidance on software validation makes a point relevant here even though this product is not itself a regulated device: a test plan is only as good as whether it was built to exercise the failure conditions that matter, not just the ordinary path. A regex list aimed at the two sentences this product is built to never write is exactly that kind of case — a boundary condition, checked on purpose, not caught by accident.

The honest inventory, then, has three tiers, not one. The database constraint on urgency and actions cannot be bypassed by any code this product ships. The schema’s missing fields cannot be populated by any response the model returns. And whether the model’s prose merely sounds like it crossed the line into advice or urgency is checked by a script that has to be invoked, read, and acted on by a person — the same three-tier distinction worth asking of any vendor who tells you their AI tool “never gives advice.” The question worth asking back is which of those three shapes the promise actually takes.

None of this changes the bright line itself: this product is regulatory intelligence and method, never regulatory advice, and the classifier is never the thing deciding what a document means for your device. See our editorial standards for the rest of what a model is and isn’t allowed to decide here.

Regulatory intelligence, not regulatory advice. This post describes method and published FDA records as of its date; decisions about a specific device belong with your regulatory professional.

Method
The lab is accredited. Not the device.
Practice
Breakthrough is law. STeP is a guidance.
Practice
MDSAP replaces routine. Not for-cause.
Method
No field on a 510(k) says what it treats
Method
Discretion is a policy. Exclusion is a statute.
Practice
Designated by one office. Approved by another.
Method
MedSun sits beside MAUDE, not inside it
Practice
The five-unit device never gets a K-number
Practice
Meeting the criteria isn't a tracking order
Method
The PMA clock doesn't stop at approval
Practice
The K-number doesn't track today's device
Method
A MAUDE report proves it was filed
Practice
Not every MDR starts with the manufacturer
Method
Completed. Not terminated.
Practice
The device-ban list has three entries
Method
The UDI exception has its own deadline
Method
MDUFA VI is being negotiated in public
Practice
The inspection manual changed, not the rule
Method
The count Congress had to legislate
Practice
The small-business rate isn't retroactive
Method
A detention order has no docket to read
Practice
PMA approvals moved off the Federal Register
Method
A citizen petition names names
Practice
A market withdrawal isn't a recall
Method
Not every device letter comes from CDRH
Practice
Closed on one device. Open on the rest.
Method
No IDE is confirmed until the PMA is
Practice
The remedial-action call sets the clock
Method
Jurisdiction is a letter, not a field
Practice
An address is not a footprint
Method
The final rule that isn't final yet
Practice
The special controls aren't in the record
Method
Exempt from GMP. Not from complaints.
Practice
The notify list isn't the shortage list
Practice
No cron sends this. A person does.
Method
Corrected, not rewritten
Practice
Quiet is a finding, not a default
Method
The summary is public. The statement isn't.
Practice
A competitor's 513(g) leaves no trace
Practice
An empty response field proves nothing
Method
A petition is public. Its outcome isn't.
Practice
The panel is a category, not a meeting
Method
An accessory carries its own classification
Method
A TPLC report is a category, not a device
Practice
A 522 order is a question, not a verdict
Method
A PCCP change leaves no new record
Practice
Not every signal becomes a recall
Method
eSTAR did not remove the acceptance check
Practice
An early alert has no recall number yet
Practice
A consent decree isn't a database row
Method
The record has no cybersecurity field
Practice
Classification Change is not one event
Method
Publication date is not effective date
Method
One event. Many recall numbers.
Practice
Quantity is a sentence, not a number
Practice
How a firm told you is a field too
Method
A RIN outlives the document number
Method
The docket ID is not the comments
Practice
The 510(k) record doesn't name the predicate
Practice
The 510(k) FDA didn't review first
Method
The letter FDA doesn't have to post
Practice
Cleared doesn't say which track it took
Method
The clock stops. The calendar doesn't.
Method
Why a guessed match never reaches you
Practice
The standards list never names a device
Method
The guidance isn't in the Federal Register.
Practice
Filtered. Not discarded.
Method
There are two recall databases, not one
Practice
Breakthrough status is confidential by law
Practice
One MAUDE report is not one malfunction
Method
A supplement number is not a track
Method
Cleared is not approved
Practice
Nationwide doesn't mean your building
Practice
Not every correction reaches FDA
Method
Registered. Not reviewed.
Method
Contact ODE is not a pathway
Practice
Almost no recall is FDA-mandated
Method
FDA's device names read like a card catalog
Practice
openFDA is free. It is not unlimited.
Method
GUDID stores the model. Not the box.
Practice
Detention doesn't need a warning letter
Method
A Class I device, a Class I recall
Practice
21 CFR 820 didn't move. Its contents did.
Method
The product code that doesn't exist yet
Practice
The classification posts. The 483 behind it doesn't.
Method
A recall has three dates, and the pipeline had to pick one
Practice
The count is real. The rate is not.
Method
The firm on the record is not the firm on the box
Practice
Low confidence is an instruction, not a hedge
Method
The same company, spelled three ways
Practice
A device that was never a medical device
Method
FDA's warning letters, addressed by column number
Practice
Your regulation has a decimal. FDA's watch doesn't.
Method
Three letters is too short to search for
Practice
Most warning letters never close
Method
The guidance that skipped the draft
Practice
Ongoing, as of when?
Method
The least interesting fact in a 510(k)
Practice
No recall arrives with a product code attached
Practice
The deadline that doesn't email you
Method
The warning letter has two dates
Method
How to monitor FDA without drowning
Practice
Your predicate was recalled. Now what?
Method
Why no item reaches you without a human