What QC Means in a Regulated Draft
Quality control in regulatory writing is a different problem from quality control in code or in copy. The thing being checked is not "does the prose flow" — it is "does every claim resolve to a source, does every cross-reference resolve to a target, is every defined term introduced before it is used, is every statistical value bound to the underlying table." A reviewer reading a CSR is asking a specific set of structural questions about the document. The quality pass should ask the same questions, before the reviewer does.
That is what Asthra's end-of-run QC does. After the agent finishes drafting, Asthra runs a structured pass over the finished document and emits a quality_report.json that names every check, names every flag, and locates every issue down to the section and the sentence.
The Categories of Check
Six structural questions get asked of every regulated draft.
Cross-reference integrity. Every "see Table 14.3.1.2" and every "as discussed in §11.4.1" has to point at a real target. The check walks the cross-reference graph and confirms that every link resolves to a real anchor. Any unresolved reference is flagged with the section it lives in and the target it intended.
Statistical-claim source binding. Every number in the draft — every "284 patients (88.5%)", every "median age at randomization was 63 years", every "Grade 3 or higher events occurred in 13.4%" — has to be bound to the source row, cell, or passage that produced it. The check walks the claim graph and confirms that every quantitative claim has a citation that resolves to a source value. Numbers without source bindings are flagged.
Defined-term ordering. Every abbreviation introduced in the draft has to be expanded the first time it appears. The check looks for abbreviation-style tokens, finds the first occurrence, and confirms there is an expansion within the same section or earlier. Out-of-order or unexpanded terms are flagged.
Citation density. Some sections require dense citations (results, safety narratives); others tolerate fewer (discussion, introduction). The check applies per-section thresholds and flags sections that fall below the citation density expected for their type.
Gap detection. The agent's own gap flags — places where the source data was missing and the agent surfaced a gap rather than fabricating prose — are collected into the QC report. The reviewer sees them as a single list, not buried in the draft.
Hyperlink resolution. Asthra wires hyperlinks at draft time, but the QC pass still verifies that every wired hyperlink resolves to a real Word bookmark in the finished .docx. Anything that fails to resolve is flagged.
What the Report Looks Like
The quality_report.json is structured. The header summarises the run: how many sections were checked, how many checks ran, how many passed, how many flagged. The body lists each check by category, with the section, the sentence, the rubric anchor (where applicable), and a suggested action.
A small excerpt looks like this:
{
"run_id": "9f2a-04",
"summary": {
"sections_checked": 38,
"checks_run": 7,
"passes": 31,
"flags": 5,
"gaps": 2
},
"findings": [
{
"category": "citation_density",
"section": "9.4",
"severity": "flag",
"detail": "Citation density 0.4 below threshold 0.7 for adverse-events section",
"suggested_action": "Add sentence-level citations for paragraphs 2 and 3"
},
{
"category": "defined_term_ordering",
"section": "5.2",
"severity": "flag",
"term": "ECOG",
"detail": "Used before definition. First introduction in §9.2",
"suggested_action": "Add expansion on first use or move definition earlier"
},
{
"category": "gap",
"section": "9.4",
"severity": "gap",
"detail": "Subgroup analysis ≥75y — TLF-AE-03 absent from source set",
"suggested_action": "Supply TLF-AE-03 and re-run §9.4"
}
]
}
The structure makes it easy for a writer to triage. Three things are clear on first glance: how many flags came up, where they are, and what action is recommended. The triage is fast because the report is structured, not narrative.
Why It Matters
Three reasons.
The first is regulatory. Reviewers ask these questions. Pre-empting them at the QC stage means the draft arrives at internal review already cleaner than it would otherwise be — and the internal-review cycle is shorter.
The second is auditability. The quality_report.json ships as part of the run bundle. It is part of the audit trail. A regulator or an auditor asking "what quality checks were performed on this draft" has an answer that is structured, dated, and reproducible from the source set.
The third is consistency. Different writers run different mental QC checks. Different reviewers catch different issues. The structured QC is the same every time. The variance in what gets flagged shifts from the inspector to the work.
What the QC Is Not
The QC pass is not a copy edit. It does not check whether the prose is graceful or whether the tone is correct. It does not catch every kind of error a human reviewer would catch. It is structural — it answers structural questions about the draft.
For prose-quality review, Asthra has reviewer personas — FDA Clinical Reviewer, CMC Reviewer, CER Device Reviewer, CSR Writer QC — that can be summoned over any section. The personas use language models with structured rubrics; the QC uses deterministic checks against the document state. They sit alongside each other in the same audit trail.
What Is Next
The QC categories will expand as we encounter more regulator-side patterns. Submission-history-aware checks — comparing the current draft against the sponsor's prior CSRs for narrative drift — are the next workstream. Whitepaper #3, launching at DIA 2026, walks through the QC results against a benchmark of 100+ public FDA records.
The principle holds: every claim, every cross-reference, every term, every citation is structured state. The QC is a deterministic pass over the state. The output is a report. The report is part of the bundle. The bundle is the deliverable.
See it on the product page: End-of-run QC + run bundles shows a sample QC report card and the four-artifact bundle. For the broader studio surface, see /product.