Pharmaceutical Quality - Chemistry, Manufacturing and Controls (PQ-CMC) Submissions to FDA, published by HL7 International / Biomedical Research and Regulation. This guide is not an authorized publication; it is the continuous build for version 2.0.0-ballot built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/HL7/FHIR-us-pq-cmc-fda/ and changes regularly. See the Directory of published versions
Specification means the quality standard (i.e., tests, analytical procedures, and acceptance criteria) provided in an approved application to confirm the quality of drug substances, drug products, intermediates, raw materials, reagents, components, in-process materials, container closure systems, and other materials used in the production of a drug substance or drug product. For the purpose of this definition, the term “acceptance criteria” means numerical limits, ranges, or other criteria for the tests described [21 CFR 314.3].
The Quality Specification bundle profile provides a mechanism for the industry to submit Module 3 CTD 3.2.S.4.1, 3.2.P.4, and 3.2.P.5.1 folder content to the FDA. These sections provide evidence demonstrating that the material meets the standards appropriate for their intended use, where the material is an API (3.2.S.4.1), Excipient (3.2.P.4), or Drug Product (3.2.P.5.1).
The domain concepts of Quality Specification are represented in FHIR in this IG. Below is a high-level FHIR resource mapping to guide the understanding of how the domain concepts are represented using profiles on FHIR Resources. Detail study of the profiles and each of the resources will be needed for developing a deeper understanding of this Quality Specification FHIR Bundle Profile. Concepts that are key to this domain include the following:
Note: profile computable names (in parenthesis above) map to names in the Profile Map below.
Both the acceptable qualitative or text value and the acceptable quantitative or numeric value for the result of the tests are expressed with goal as a target. The numeric values have multiple structures to capture the detail of the acceptance criteria Original Text. A single specification may not use all the possible acceptance criteria types so a realistic example would fail in the objective of elucidating all the permutations. The following XML snippets illustrate how to implement the various acceptance criteria types.
A numeric EQ acceptance criteria may or may not use an = sign in the text. Often it is stated as a single value. An examples original text: 0.05 %
. The absence of a comparator in a Quantity datatype indicates equality.
<target>
<detailQuantity>
<value value="0.05"/>
<unit value="percent"/>
<system value="http://unitsofmeasure.org"/>
<code value="%"/>
</detailQuantity>
</target>
A numeric LT acceptance criteria may use LT in the text or the <
the escaped form of the character '<'. An example original text: < 0.05 %
.
<target>
<detailQuantity>
<value value="0.05"/>
<comparator value="<"/>
<unit value="percent"/>
<system value="http://unitsofmeasure.org"/>
<code value="%"/>
</detailQuantity>
</target>
A numeric MT acceptance criteria may use MT in the text or the >
the escaped form of the character '>'. An example original text: > 0.27 percent
.
<target>
<detailQuantity>
<value value="0.27"/>
<comparator value=">"/>
<unit value="percent"/>
<system value="http://unitsofmeasure.org"/>
<code value="%"/>
</detailQuantity>
</target>
The Not Less Than (NLT) is used when the maximum limit includes the limit value as acceptable. In this example, each unit is NLT Q + 5% the value must be calculated to be structured. According to the method, Q = 85. The structured acceptance criterion must be transformed into a single value (85 + 4.25 = 89.25). The maximum acceptable value is 89.25%. NLT is represented by the >=
(greater than or equal to) comparator, which is encoded as >=
.
<target>
<detailQuantity>
<value value="89.25"/>
<comparator value=">="/>
<unit value="percent"/>
<system value="http://unitsofmeasure.org"/>
<code value="%"/>
</detailQuantity>
</target>
The Not More Than (NMT) is used when the minimum limit includes the limit value as acceptable. In this example, NMT 450 ppm at time of release, the phrase , “at time of release” is not included in the target. That information is captured in the Acceptance Criteria Usage as the coded value “Release”. NMT is represented by the <=
(less than or equal to) comparator, which is encoded as <=
.
<target>
<detailQuantity>
<value value="450"/>
<comparator value="<="/>
<unit value="part per million"/>
<system value="http://unitsofmeasure.org"/>
<code value="[ppm]"/>
</detailQuantity>
</target>
The Numeric Range is used when the method specifies an upper and lower limit. Numeric Range is represented by a modifier extension that contains a 'low' and 'high' Quantity. The limits can be inclusive or exclusive limit values. To structure this Acceptance Criteria, carefully read the original text. Words such as “to” and “between” usually mean exclusive of the limit values. Original text with the interpretation codes is not ambiguous. Consult the method text when in doubt. Examples of original text: “85.0% to 115.0% Label Claim” - use >
and <
; “between 85.0% and 115.0% Label Claim” - use >
and <
and “NLT 85.0% and NMT 115.0% Label Claim” - use >=
and <=
.
<target>
<modifierExtension url="http://hl7.org/fhir/us/pq-cmc-fda/StructureDefinition/pq-target-range">
<extension url="low">
<valueQuantity>
<value value="85.0"/>
<comparator value=">="/>
<unit value="percent"/>
<system value="http://unitsofmeasure.org"/>
<code value="%"/>
</valueQuantity>
</extension>
<extension url="high">
<valueQuantity>
<value value="115.0"/>
<comparator value="<="/>
<unit value="percent"/>
<system value="http://unitsofmeasure.org"/>
<code value="%"/>
</valueQuantity>
</extension>
</modifierExtension>
</target>
Acceptance Criteria (Text) is strictly for qualitative constraints. These will typically have a descriptive phrase. An example original text is, “Clear, colorless solution free of visible particulates”. Because it is not numeric, the relative interpretation codes do not apply.
<target>
<detailString value="Clear, colorless solution free of visible particulates"/>
</target>
When the number of replicates is specified in the test, enter it as an integer. The integer has no unit and is simply a count.
An example original text: n=10
<target>
<detailInteger value="10"/>
</target>
If the analytic procedure only requires that the results be reported, use a text result
<goal id="b843d27a-3f07-4ea2-a670-05d16db3320a">
<description>
<text value="Record result"/>
</description>
<addresses>
<coding>
<system value="http://unitsofmeasure.org"/>
<code value="C134030"/>
<display value="Stability"/>
</coding>
</addresses>
<target>
<detailString value="As Reported"/>
</target>
</goal>
Acceptace Criteria are written in spoken languages and can be a combination of independent clauses with subordinate clauses. When this occurs, the modeling in the goal backbone element requries multiple targets. Break the Acceptance Criteria phrase into its parts. Each part becomes a target. In the example below, "Average of 24 units (S1 + S2 + S3) is equal to or greater than Q, not more than 2 units are less than Q – 15%, no unit is less than Q – 25%" becomes three targets: Average of 24 units, units less than Q – 15%, and units less than Q – 25%. Each has a detailQuantity to express the acceptable amount.
<goal id="1f5530b9-5d21-46ef-80f3-1ae6121c88f9">
<description>
<text value="Average of 24 units (S1 + S2 + S3) is equal to or greater than Q, not more than 2 units are less than Q – 15%, no unit is less than Q – 25%"/>
</description>
<addresses>
<coding>
<system value="http://hl7.org/fhir/us/pq-cmc-fda/CodeSystem/cmc-ncit-dummy"/>
<code value="C134029"/>
<display value="Release"/>
</coding>
</addresses>
<target>
<measure>
<text value="Average of 24 units">
</measure>
<detailQuantity>
<value value="80"/>
<comparator value=">="/>
<unit value="percent"/>
<system value="http://unitsofmeasure.org"/>
<code value="%"/>
</detailQuantity>
</target>
<target>
<measure>
<text value="NMT 2 units less than Q – 15%"/>
</measure>
<detailQuantity>
<value value="2"/>
<comparator value="<="/>
<unit value="Amb a 1 units"/>
<system value="http://unitsofmeasure.org"/>
<code value="[Amb'a'1'U]"/>
</detailQuantity>
</target>
<target>
<measure>
<text value="no units less than Q – 25%"/>
</measure>
<detailQuantity>
<value value="0"/>
<unit value="Amb a 1 units"/>
<system value="http://unitsofmeasure.org"/>
<code value="[Amb'a'1'U]"/>
</detailQuantity>
</target>
</goal>
Some specifications accept equivalent tests as in this example the Identity test can be performed with either Spectrophotometry or HPLC. The alternate relationship is expressed as a relatedAction. Alternate tests can be in groups of more than two. The alternate test must have a linkId. Other tests within the same Alternate test group will point to each other's linkIDs through the relatedAction element relatedAction.targetId. This will be helpful when modifying a specification to add an alternate test without having to renumber subsequent tests.
Note: "…" is used to compress the XML so that the relevant sections can be seen more clearly.
<action>
<linkId value="2047a6b6-e3fc-4071-8989-526297579091"/>
<prefix value="Single Stage"/>
<title value="Spectrophotometry Identification"/>
<code>
...
<text value="Spectrophotometry"/>
</code>
<reason>
...
</reason>
<documentation>
...
</documentation>
<goalId value="32649771-1290-4386-9cf7-7a72274f22b4"/>
<relatedAction>
<targetId value="84d64dd8-b799-418a-a713-a854c4d3c2b9"/>
<relationship value="concurrent"/>
</relatedAction>
</action>
<action>
<linkId value="84d64dd8-b799-418a-a713-a854c4d3c2b9"/>
<prefix value="Single Stage"/>
<title value="Identity - Ferric Chloride"/>
<code>
...
<text value="HPLC"/>
</code>
<reason>
...
</reason>
<documentation>
...
</documentation>
<goalId value="59a4ca76-858e-4d58-8e5f-88e75f51ec33"/>
<relatedAction>
<targetId value="2047a6b6-e3fc-4071-8989-526297579091"/>
<relationship value="concurrent"/>
</relatedAction>
</action>
Staged tests are a sequence of steps. Use the Action.Action element and identify the stages with the prefix element. Feedback on the necessity of adding the relatedAction backbone element at Action.Action is requested. If the conditional nature of the stages must be expressed, then it will be added.
Note: "…" is used to compress the XML so that the relevant sections can be seen more clearly.
<action>
<linkId value="1fc4361a-52d9-46f1-acff-7969b10e8dfd"/>
<title value="Dissolution - 30 minute"/>
...
<reason>
<extension url="http://hl7.org/fhir/us/pq-cmc-fda/StructureDefinition/pq-hierarchical-level-extension">
<valueInteger value="1"/>
</extension>
<coding>
<system value="http://hl7.org/fhir/us/pq-cmc-fda/CodeSystem/pqcmc-test-category-codes"/>
<code value="TC9"/>
<display value="Dissolution"/>
</coding>
</reason>
...
<action>
<linkId value="1fc4361a-52d9-46f1-acff-7969b10e8dfd"/>
<prefix value="Stage 1"/>
<goalId value="489bb798-477b-4d68-8189-ed58b388f25e"/>
<goalId value="0f191b79-ea6c-4480-9bb2-2c5501fa461e"/>
</action>
<action>
<linkId value="1fc4361a-52d9-46f1-acff-7969b10e8dfd"/>
<prefix value="Stage 2"/>
<goalId value="cbe267a3-bcbe-4ffc-bf2e-843760f50249"/>
<goalId value="3b385840-ad9c-478f-8d94-e6610f2458f9"/>
</action>
<action>
There are two scenarios for averages. The acceptance criteria of the average is the same as the individual test, in which case the same test can be encoded in the top level Action backbone element. Its title is “Single Stage” and there are one or many goalIDs. Or the acceptance criteria of the average is different than the individual test, in which case either use the Action for the average and Action.Action for the individual acceptance criteria or move down a level to Action.Action and Action.Action.Action. The profile was designed this way to provide flexibility to implementers. The acceptance criteria should indicate the number of replicates in the referenced analytic procedure.
The Action backbone is profiled to three levels. The first level represents the method (analytic procedure) concepts and a simple tests. The second level represents test groups and stages. In the simplest case is Single Stage and two tests. A Single Stage , one test is accomplished at the highest Action level. The third level represents sub-tests. The middle Action level can have Acceptance Criteria. These are typically calculations on the values obtained from the sub-tests. Methods using Cascade Impactors typically have Acceptance Criteria for the plates and group the plates and assign Acceptance Criteria to the groups. The example below shows three Groups and their associated plates. Both the Groups and their sub-test each have their own goalIDs that link to their respective Acceptance Criteria. The word "Stage" for the sub-tests has no association with Stage as mapped to the PlanDefinition resource. In this case it referring to the stage of the cascade impactor modelling inhalation.
Note: "…" is used to compress the XML so that the relevant sections can be seen more clearly.
<action>
<prefix value="Single Stage"/>
<title value="Cascade Impactor"/>
<code>
<coding> ...
</code>
<reason>
<extension url="http://hl7.org/fhir/us/pq-cmc-fda/StructureDefinition/pq-hierarchical-level-extension">
<valueInteger value="1"/>
</extension>
<coding>
<system value="http://hl7.org/fhir/us/pq-cmc-fda/CodeSystem/pqcmc-test-category-codes"/>
<code value="TC15"/>
<display value="Particle Size Distribution"/>
</coding>
</reason>
<documentation>
...
</documentation>
<action>
<title value="Group 1"/>
<goalId value="d7afe834-a9a7-45ae-9213-52c8fd8505bd"/>
<action>
<title value="Stem"/>
<goalId value="fc10d71c-86e9-4c52-a3df-9a5cde26f031"/>
</action>
<action>
<title value="Actuator"/>
<goalId value="ce759246-bbd4-4713-8836-6dbb10e5fefe"/>
</action>
<action>
<title value="Throat"/>
<goalId value="abf5db8b-8d7e-471e-8047-98afe93f07d4"/>
</action>
</action>
<action>
<title value="Group 2"/>
<goalId value="a515beb5-dc2b-4c36-bf0a-f6b70582c354"/>
<action>
<title value="Stage 0"/>
<goalId value="fbd96100-3881-493c-adaf-808fe08331a1"/>
</action>
...
<action>
<title value="Stage 3"/>
<goalId value="569399c3-e5af-4449-a636-6ebe34174056"/>
</action>
</action>
<action>
<title value="Group 3"/>
<goalId value="552eef1e-2918-4fa9-8603-3df2284454b9"/>
<action>
<title value="Stage 4"/>
<goalId value="4adb336d-21cd-4792-98dd-e265532c533f"/>
</action>
...
<action>
<title value="Filter"/>
<goalId value="6559f4e2-5134-4637-a587-421b4095a961"/>
</action>
</action>
</action>
The Action.Action.Action.prefix element is reserved for RRT specifications. Enter "RRT" in the value for Action.Action.Action.prefix. The Action.Action.Action.title stores the actual RRT value. The goalID references the acceptance criteria.
Note: "…" is used to compress the XML so that the relevant sections can be seen more clearly.
<action>
<prefix value="Single Stage"/>
<title value="Impurities"/>
...
<action>
<title value="Unidentified Impurities"/>
<action>
<prefix value="RRT"/>
<title value="2.2"/>
<goalId value="f832168b-d0a4-4637-91cd-183629494d59"/>
</action>
<action>
<prefix value="RRT"/>
<title value="2.4"/>
<goalId value="cc06912d-0aca-4083-a7ce-bb57b4dfc4a6"/>
</action>
<action>
<prefix value="RRT"/>
<title value="3.41"/>
<goalId value="5ff35fae-2843-4180-b509-b3c6254871f4"/>
</action>
</action>
</action>
This example demonstrates a quality specification for a Drug Product. The first image displays the XML for 3.2.P.5.1 as it appears in a browser with the narrative inserted in the composition text element. The XML can be found on the Artifacts page. The XML file with the publisher narrative is on the artifacts page and in the Bundle profile. 4a7e17c1-a611-4cc7-9a71-8005a8b427ab
Additionally, there is an example specification to show the reference to a Drug Substance 6004e36e-7df9-469d-9b29-8e9f9bd7e95f. Its narrative layout is show below the Drug Product specification.
For examples of specifications referencing excipients see:
This is an example showing a drug substance as the subject of the specification.