Chapter 4
From a turbid harvest to a concentrated, virus-safe drug substance: the unit operations of downstream processing, the equations WIA-BIO-015 uses to size them, and the quality attributes they exist to protect.
When the production bioreactor is switched off, the product is still a minority component of a complex liquid. A CHO fed-batch harvest contains the antibody, intact and broken cells, host cell proteins (HCP), host DNA, lipids, spent media components, antifoam and, potentially, adventitious or endogenous virus-like particles. Downstream processing (DSP) is the sequence of separations that removes these contaminants while losing as little product as possible and without damaging the molecule. Every step trades purity against recovery, and every step has to be justified by what it removes.
This chapter follows the order of a typical monoclonal antibody (mAb) platform process and ties each step to spec §5 of WIA-BIO-015 and to the ChromatographyStep and PurificationProtocol types of the reference SDK. Where the spec's formulas need correction or context, the text says so explicitly. All plant-scale numbers used in worked examples are illustrative; a real process must be sized from its own development data.
Clarification separates the liquid that contains the product from cells and cell debris. The difficulty is that the particle population is broad: intact CHO cells are on the order of 10–20 µm in diameter, while debris from lysed cells extends down to sub-micron fragments. Late in a fed-batch run, when viability has fallen, the proportion of fine debris rises sharply, and clarification becomes harder precisely when the batch is most valuable. For that reason harvest timing (Chapter 7) and clarification design are linked decisions.
Spec §5.1.1 describes sedimentation with Stokes' law for a small sphere moving slowly through a viscous fluid:
v = 2 · r² · (ρ_p − ρ_f) · g / (9 · η)
v settling velocity (m/s)
r particle radius (m)
ρ_p particle density, ρ_f fluid density (kg/m³)
g 9.81 m/s²
η dynamic viscosity of the fluid (Pa·s)
The most important feature of this expression is the r² term. Take, for example, a cell of radius 7.5 µm with a density excess of 50 kg/m³ over a medium of viscosity 1×10⁻³ Pa·s. The formula gives about 6×10⁻⁶ m/s, roughly 2 cm per hour under normal gravity. A debris particle of radius 0.5 µm with the same density excess settles 225 times more slowly — around 0.1 mm per hour. Gravity settling is therefore useless at production scale for fines, and even a centrifuge that multiplies g by several thousand leaves the smallest particles in the supernatant.
The centrifugal field is expressed as relative centrifugal force (RCF), a multiple of g. With radius r in centimetres and speed N in revolutions per minute, the spec gives the standard laboratory relationship:
RCF = 1.118 × 10⁻⁵ · r · N² (r in cm, N in rpm)
Example: r = 10 cm, N = 4 000 rpm
RCF = 1.118e-5 × 10 × 1.6e7 ≈ 1 790 × g
RCF grows with the square of speed, which is why doubling rpm quadruples the field. In continuous disc-stack centrifuges the relevant design quantity also includes the settling area of the disc stack, so equipment is usually compared and scaled with an equivalent settling area rather than with RCF alone. High RCF has a cost: shear at the feed zone can break fragile cells and generate new fines, releasing more HCP and DNA into the centrate. The practical target is therefore "enough force to remove cells without creating debris", not maximum force.
Depth filters — thick beds of cellulose fibres, filter aids and charged resins — capture the fine particles that a centrifuge leaves behind, and their charged components also adsorb some DNA and HCP. For small and medium harvests, depth filtration is often used as the primary clarification step without a centrifuge; at large scale it usually follows centrifugation as a secondary step, followed in turn by a membrane filter that protects the capture column.
Spec §5.1.2 sizes filters with a simple volumetric relation, V_capacity = A × Flux × t, and quotes a typical flux of 50–200 L/m²/h. Rearranged, it gives the required area for a batch. For example, filtering 2 000 L in 2 h at 100 L/m²/h needs 2 000 / (100 × 2) = 10 m² of filter area. This relation is correct as far as it goes, but it only checks hydraulic capacity. In practice, a depth filter is limited by how much solid it can hold before pressure rises or turbidity breaks through, so sizing is based on scale-down throughput tests (litres of harvest per square metre before a pressure or turbidity endpoint) with a safety factor. A robust implementation should treat the flux formula as a first estimate and store the measured throughput alongside it.
Protein A, a bacterial protein that binds the Fc region of many immunoglobulin G subclasses with high specificity, is the capture step of nearly every mAb platform. In a single bind-and-elute step it removes most HCP, DNA and media components and concentrates the product, typically delivering an eluate in which the antibody is the dominant species. This is why the spec and the SDK both treat Protein A as the default first step for productType: 'antibody'.
At equilibrium, the amount of antibody bound per volume of resin follows, to a good approximation, a Langmuir isotherm (spec §5.2.1):
Q = Q_max · C / (K_d + C)
Q bound protein (g per L resin, equivalently mg/mL)
Q_max maximum (saturation) capacity
C free protein concentration in the liquid (g/L)
K_d dissociation constant (g/L)
For a high-affinity ligand, K_d is small compared with typical feed concentrations, so the resin approaches saturation even at modest titers. With illustrative values Q_max = 50 g/L and K_d = 0.1 g/L, a feed at 2 g/L gives Q = 50 × 2 / 2.1 ≈ 47.6 g/L, already 95 % of saturation. The spec quotes Q_max of 30–50 g/L; this should be read as the spec's example range. Resin chemistry has moved on, and many current Protein A resins advertise higher capacities, so the number that matters is the one measured for the resin actually installed.
A packed column never reaches equilibrium everywhere at once. As feed flows through, a mass-transfer zone moves down the bed; once it reaches the outlet, product begins to appear in the flow-through. The usable capacity is therefore the dynamic binding capacity (DBC), conventionally defined at 10 % breakthrough — the point where the outlet concentration reaches 10 % of the feed concentration:
DBC₁₀ = C_load · V_10% / V_resin
Example: 1.0 L column, feed 3.0 g/L,
10 % breakthrough after 14 L of feed
DBC₁₀ = 3.0 × 14 / 1.0 = 42 g/L resin
Strictly, the volume held up in the column and system before the resin should be subtracted from V_10%; at production scale this correction is small but in a small scale-down column it is not. DBC depends strongly on residence time, the bed volume divided by the volumetric flow rate. Pore diffusion into the resin beads is slow for a 150 kDa antibody, so a shorter residence time lets more product pass the bed unbound and lowers DBC. The spec sets a target of DBC above 30 g/L at a 6-minute residence time, and the SDK's Protein A step uses residenceTime: 6 with bindingCapacity: 40. Both are defaults for calculation, not properties of any particular resin. Longer residence time buys capacity at the cost of throughput, which is why some processes use two residence times — slower during the end of the load, faster during the washes.
After loading, intermediate washes (often with elevated salt or mild additives) strip weakly associated HCP from the bound antibody. The antibody is then eluted at low pH, typically in glycine, acetate or citrate buffers; the SDK records 'Glycine pH 3.5' as the elution buffer for the capture step. The acidic eluate is useful twice: it concentrates the product in a small volume and it is the natural starting point for low-pH viral inactivation (section 4.4). Its drawbacks are also well known. Some antibodies aggregate or precipitate at low pH or on neutralisation, and a small amount of Protein A ligand leaches from the resin into the eluate. Both aggregates and leached ligand are removed downstream, which is one reason polishing steps exist even after a very selective capture.
Consider an illustrative harvest of 2 000 L at 5 g/L, which contains 10 kg of antibody. Suppose scale-down studies measured DBC₁₀ = 40 g/L at 6 minutes, and the process loads to 80 % of DBC as a margin against resin ageing and titer variation (the margin itself is a design choice, used here as an example).
| Quantity | Calculation | Result |
|---|---|---|
| Product mass in harvest | 2 000 L × 5 g/L | 10 000 g |
| Working capacity | 0.80 × 40 g/L | 32 g/L resin |
| Resin needed, 1 cycle | 10 000 / 32 | ≈ 313 L |
| Resin needed, 4 cycles | 10 000 / (32 × 4) | ≈ 78 L |
| Flow rate at 6 min residence (78 L bed) | 78 L / 6 min | ≈ 13 L/min |
| Load time per cycle (500 L of harvest) | 500 L / 13 L/min | ≈ 38 min |
Cycling reduces resin volume — and resin is one of the most expensive consumables of the process — at the cost of time, buffer and the number of resin uses consumed per batch. The trade-off depends on resin lifetime, which is validated in cycle studies. Compare this with the SDK: designPurification computes resinVolume: scale * startingConcentration / 40, i.e. 2 000 × 5 / 40 = 250 L, which assumes one cycle and 100 % use of DBC with no margin. The SDK number is a useful first check that the order of magnitude is right, but it is not a column design.
// Protein A sizing with margin and cycling (illustrative)
function proteinAResinLitres(
harvestL: number, titerGL: number,
dbcGL: number, loadFraction = 0.8, cycles = 1
): number {
if (harvestL <= 0 || titerGL <= 0 || dbcGL <= 0 || cycles < 1) {
throw new RangeError('inputs must be positive');
}
return (harvestL * titerGL) / (dbcGL * loadFraction * cycles);
}
proteinAResinLitres(2000, 5, 40, 0.8, 4); // ≈ 78.1 L
After capture, the remaining impurities are harder to remove because they resemble the product: aggregates and fragments of the antibody itself, charge variants, residual HCP that co-purified by associating with the antibody, leached Protein A, and traces of DNA and virus. Polishing steps attack these using physical properties other than Fc affinity — surface charge and surface hydrophobicity. Using a different separation mechanism at each step is the core design rule of DSP: two steps that separate on the same property add little to each other.
Many IgG1 antibodies are basic proteins with an isoelectric point above neutral. Below its pI, the antibody carries a net positive charge and binds to a cation-exchange (CEX) resin; it is then eluted by raising salt concentration (conductivity) or pH. Aggregates usually bind more strongly than monomer because they present more charged patches, so a well-placed elution cut separates them. CEX also removes leached Protein A and some HCP, and it can be tuned to shift the distribution of acidic and basic charge variants. The spec lists a CEX conductivity window of 3–8 mS/cm for loading. A binding window like this is product-specific: what matters is that loading conductivity is low enough for the antibody to bind, and that elution conditions are controlled tightly enough to reproduce the aggregate cut.
Anion exchange (AEX) is normally run the other way round. At a pH below the antibody's pI, the product is positively charged or neutral and passes through the column, while strongly negative impurities — DNA, endotoxin, many HCP and many viruses — bind. Because the product does not bind, the column can process a large mass of antibody per litre of resin, and the step is attractive as a dedicated clearance step for DNA and virus. The spec lists an AEX conductivity range of 5–15 mS/cm. Higher conductivity weakens impurity binding, so flow-through AEX is usually operated at the low end of what the product tolerates.
Here the SDK needs a careful reading. Its antibody template does run AEX in flow-through mode (elution: 'Flow-through collection'), yet it also assigns a bindingCapacity of 60 g/L and computes resin volume from product mass. In flow-through mode the product mass does not determine column size; the impurity load and the chosen loading ratio do. Implementers should treat that field as not applicable for flow-through steps, or redefine it as a mass-loading limit (grams of product processed per litre of resin), and document which meaning they use.
A note on theory: spec §5.2.2 offers a resin-capacity expression that is not a recognised adsorption model, and it is not used in this book. Ion-exchange binding is usually described with a Langmuir-type isotherm whose parameters depend on salt, or, more mechanistically, with the steric mass action (SMA) model, which accounts for the number of charged contacts a protein makes and the salt ions it displaces. Either framework captures the key qualitative behaviour: binding falls steeply as salt rises, and small changes in pH move the protein's charge and therefore its binding strength.
Hydrophobic interaction chromatography (HIC) separates on exposed hydrophobic surface. High concentrations of kosmotropic salts — the spec gives 1.0–1.5 M ammonium sulfate, or 0.5–1.0 M sodium chloride — strengthen hydrophobic interactions, so proteins bind at high salt and elute as salt is reduced. Aggregates and partially unfolded species expose more hydrophobic surface than native monomer and therefore bind more strongly, which makes HIC a strong aggregate-removal step. Its drawbacks are practical: large volumes of concentrated salt must be prepared and disposed of, and the product must be stable in that salt. The SDK appends an HIC step to every template, for antibodies after AEX and for other proteins after capture. That is one legitimate design, but many antibody processes use CEX alone, or a mixed-mode resin, for the same purpose.
| Step | Mode | What it mainly removes | Key parameters |
|---|---|---|---|
| Centrifugation / depth filtration | Solid–liquid separation | Cells, debris, some DNA/HCP (charged depth media) | RCF, throughput (L/m²), flux |
| Protein A | Bind and elute | Bulk HCP, DNA, media components | DBC, residence time, elution pH |
| Low-pH hold | Batch hold | Enveloped viruses | pH, time, temperature |
| Cation exchange | Bind and elute | Aggregates, leached Protein A, HCP, charge variants | Load pH and conductivity, elution gradient |
| Anion exchange | Flow-through | DNA, endotoxin, HCP, viruses | pH, low conductivity, mass loading |
| HIC (optional) | Bind and elute or flow-through | Aggregates, hydrophobic variants | Salt type and concentration |
| Virus filtration | Size exclusion by membrane | Viruses including small non-enveloped | Pore rating, pressure, throughput |
| UF/DF | Tangential-flow filtration | Buffer components; concentrates product | TMP, concentration factor, diavolumes |
In the SDK, each chromatography row becomes one ChromatographyStep object in PurificationProtocol.steps. The type union — 'protein-a' | 'cation-exchange' | 'anion-exchange' | 'hydrophobic' | 'size-exclusion' | 'multimodal' — covers the chromatographic rows. Viral inactivation is only a boolean flag, viralInactivation, on the protocol, and virus filtration and UF/DF have no type of their own. The Protein A step from section 4.2.4, written as the SDK would serialise it, looks like this:
{
"stepNumber": 1,
"name": "Protein A Affinity Chromatography",
"type": "protein-a",
"resinVolume": 78,
"bindingCapacity": 40,
"loadVolume": 2000,
"recovery": 95,
"purity": 95,
"residenceTime": 6,
"buffers": {
"equilibration": "PBS pH 7.4",
"load": "Harvest (clarified)",
"wash": "PBS pH 7.4",
"elution": "Glycine pH 3.5"
}
}
Note that the object has no field for the number of cycles. A 78 L column that runs four cycles is indistinguishable from a 78 L column that is simply undersized. Until the type gains a cycles field, record cycling in the step name or in the batch record, and do not reconstruct capacity from resinVolume alone.
Mammalian cell lines can carry endogenous retrovirus-like particles, and any process that uses animal-derived materials or open handling risks adventitious contamination. Testing alone cannot prove the absence of virus, so viral safety rests on three complementary elements, described in ICH Q5A(R2): selecting and testing source materials, testing product at appropriate stages, and demonstrating that the purification process removes or inactivates viruses. The third element is the one DSP owns.
Clearance is measured in spiking studies at small scale: a known amount of a model virus is added to the load of a step, and the infectious titer is measured in the product fraction. The log reduction value (LRV) is:
LRV = log₁₀( total virus in load / total virus in product )
Example: 10⁷·⁰ infectious units in, 10²·⁵ out
LRV = 7.0 − 2.5 = 4.5
Totals, not concentrations, are compared, because volumes change across a step. When the output falls below the assay's detection limit, the LRV is reported as "greater than or equal to" the calculated value. The overall clearance of a process is the sum of the LRVs of its steps, but only for steps whose mechanisms are genuinely independent. Two low-pH treatments do not provide two independent reductions, and a step's contribution is not counted if its mechanism is already exhausted by an earlier step.
The Protein A eluate is already acidic, so holding it at low pH for a defined time is almost free. Spec §5.3.1 gives pH 3.3–3.8 for 30–60 minutes at room temperature (20–25 °C). The mechanism disrupts the lipid envelope and envelope proteins, so it acts on enveloped viruses; small non-enveloped viruses are largely resistant. Effectiveness depends on pH, time, temperature and the matrix, and lower pH works faster but also increases the risk of aggregation. The pool is then neutralised for the next step. The spec's figure of more than 4 log₁₀ reduction is a typical outcome for enveloped model viruses, not a guaranteed value; each process must demonstrate its own LRV at its own worst-case conditions (for example the highest allowed pH and the shortest allowed time).
Solvent/detergent (S/D) treatment dissolves viral lipid envelopes chemically. The spec's formulation is 0.3 % tri-n-butyl phosphate (TNBP) with 1.0 % Triton X-100 or Tween 80, held for 1–4 hours at room temperature. Like low pH, S/D acts only on enveloped viruses, and the reagents must be removed afterwards — usually by a bind-and-elute chromatography step — and their residual levels demonstrated. S/D has a long history in plasma-derived products and is used in some recombinant processes where low pH is not tolerated. Triton X-100 has come under regulatory restriction in the European Union because of the environmental profile of its degradation products, which has pushed many manufacturers to evaluate alternative detergents.
Because both inactivation methods above target the envelope, a robust process adds steps that work differently. AEX in flow-through mode removes many viruses by charge. Virus filtration removes viruses by size with membranes rated to retain particles around 20 nm, and is the main barrier against small non-enveloped viruses such as parvoviruses. Combining inactivation (chemical), adsorption (charge) and filtration (size) is what "orthogonal" means in practice. v1.0 of the standard does not have a type for virus filtration and represents viral safety as viralInactivation: true. An implementation that needs to record LRVs will have to extend the model; Chapter 8 lists this as a proposed change.
The final step of most processes uses tangential-flow filtration (TFF) with a membrane whose molecular-weight cut-off is well below the product's size — the spec's example is 30 kDa for an antibody of about 150 kDa. In ultrafiltration (UF) the retained product is concentrated; in diafiltration (DF) new buffer is added while permeate is removed, replacing the buffer around the product with the formulation buffer.
Spec §5.4.1 writes the permeate flux as Darcy's law through a clean membrane:
J = ΔP / (μ · R_m)
J permeate flux (m³/m²/s = m/s)
ΔP transmembrane pressure (Pa)
μ permeate viscosity (Pa·s)
R_m membrane hydraulic resistance (1/m)
Example: ΔP = 1 bar = 1×10⁵ Pa, μ = 1×10⁻³ Pa·s, R_m = 1×10¹² m⁻¹
J = 1×10⁻⁴ m/s = 360 L/m²/h (clean-membrane water flux)
The spec labels J in L/m²/h and ΔP in bar; the equation holds only in consistent SI units, and the result is then converted (1 m/s = 3.6×10⁶ L/m²/h). More importantly, the spec's typical process flux of 30–100 L/m²/h is far below the clean-water value in this example. The difference is concentration polarisation: retained protein accumulates in a boundary layer on the membrane surface and adds resistance. A resistance-in-series form, J = ΔP / (μ(R_m + R_p)), is the minimum model for process work, and at high concentration the flux becomes nearly independent of pressure and is controlled by mass transfer. This is why operators run UF near the "knee" of the flux–TMP curve rather than at the highest pressure the membrane will take, and why cross-flow rate matters as much as pressure.
The concentration factor is CF = V_initial / V_final. Concentrating 500 L of polishing pool to 50 L gives CF = 10, within the spec's typical 5–10× range. If the membrane fully retains the product, its concentration rises by the same factor. At high antibody concentrations, viscosity rises steeply and limits how far the product can be concentrated and how much pressure drop the feed channel can tolerate; the upper limit on CF is often set by viscosity rather than by the membrane.
In constant-volume diafiltration, buffer is added at the same rate as permeate leaves. For a solute that passes the membrane freely (sieving coefficient 1), a mass balance on the well-mixed retentate gives an exponential wash-out:
C / C₀ = e^(−N), N = V_buffer added / V_retentate (diavolumes)
The spec's "DV = 5–10 × V_final" means 5–10 diavolumes. The table shows why that range is common.
| Diavolumes N | Remaining fraction e−N | Exchanged |
|---|---|---|
| 1 | 0.368 | 63.2 % |
| 2 | 0.135 | 86.5 % |
| 3 | 0.0498 | 95.0 % |
| 4 | 0.0183 | 98.2 % |
| 5 | 0.00674 | 99.33 % |
| 6 | 0.00248 | 99.75 % |
| 7 | 0.000912 | 99.91 % |
| 8 | 0.000335 | 99.97 % |
| 9 | 0.000123 | 99.99 % |
| 10 | 0.0000454 | 99.995 % |
Each extra diavolume removes the same fraction of what remains, so the returns diminish quickly. Five diavolumes remove about 99.3 % of a freely permeating buffer component; going from 8 to 10 buys very little extra exchange but costs 25 % more buffer and time. Real solutes do not always behave ideally: charged excipients can be held back by the protein through electrostatic (Donnan) effects, and a solute with sieving coefficient S washes out as e−S·N, so the number of diavolumes needed is set by the slowest-clearing component that has a specification.
The same equation estimates product loss. If the membrane rejects the product with rejection coefficient R, the product fraction retained after N diavolumes is e−N(1−R). With R = 0.999 and N = 8, that is e−0.008 ≈ 0.992, a loss of about 0.8 %. A membrane with an unsuitable cut-off therefore loses product slowly but steadily across a long diafiltration.
// Diavolumes needed to reach a residual fraction for a solute with sieving S
function diavolumesFor(residual: number, sieving = 1): number {
if (residual <= 0 || residual >= 1 || sieving <= 0) {
throw new RangeError('0 < residual < 1 and sieving > 0 required');
}
return -Math.log(residual) / sieving;
}
diavolumesFor(0.01); // ≈ 4.6 (99 % exchange, ideal solute)
diavolumesFor(0.01, 0.7); // ≈ 6.6 (partially retained excipient)
A critical quality attribute (CQA) is a physical, chemical, biological or microbiological property that should be within an appropriate limit, range or distribution to ensure the desired product quality (the ICH Q8(R2) definition). Downstream steps are designed, and later validated, around the CQAs they control. Two ideas should be kept apart. A CQA is the attribute — "aggregate content" — and its criticality comes from its link to safety and efficacy. A specification is the numeric acceptance criterion for release — "≤ 5 % by SEC" — and it is product-specific, negotiated with regulators, and justified by clinical and manufacturing experience.
Spec §7.1.1 lists limits for monoclonal antibodies. They are reproduced below as an example mAb specification, not as universal requirements. The residual DNA figure, 10 ng per dose, originates from the WHO recommendation for products derived from continuous cell lines.
| CQA | Typical method | Example limit (spec §7.1.1) | Main DSP control |
|---|---|---|---|
| Purity (monomer/main peak) | HPLC, CE-SDS | > 95 % | Whole train |
| Aggregates (high-molecular-weight species) | SEC-HPLC | < 5 % | CEX, HIC; low-pH and neutralisation conditions |
| Charge variants | IEX-HPLC, cIEF | Acidic + basic < 40 % | Largely set upstream; CEX can shift |
| Glycosylation | Released-glycan analysis | G0F 35–55 %, high mannose < 5 % | Set almost entirely upstream |
| Host cell protein | ELISA, LC-MS | < 100 ppm (ng/mg) | Protein A, AEX, CEX |
| Residual DNA | qPCR | < 10 ng/dose | AEX, depth filtration, Protein A |
| Endotoxin | LAL / recombinant factor C | < 5 EU/mg | AEX, bioburden control |
The last column reveals a structural fact of biologics: some CQAs cannot be fixed downstream. Glycan profile and most charge heterogeneity are created in the bioreactor by the cell line, the media and conditions such as temperature and pH (Chapter 3). Purification removes impurities; it cannot rebuild a missing galactose. A deviation in glycosylation is therefore investigated upstream, even though it is first measured at release.
HCP deserves a special mention. Total HCP by ELISA is only as good as the antibody reagent's coverage of the host proteome, and a small number of individual HCPs can co-purify with a given antibody and cause problems out of proportion to their mass — for example, lipases that degrade polysorbate in the formulation. For this reason mass-spectrometry profiling of individual HCPs has become a common complement to the total-HCP number.
In WIA-BIO-015, each measured attribute becomes a CriticalQualityAttribute with value, unit, optional lsl/usl/target, a boolean inSpec and a criticality of 'high' | 'medium' | 'low'. Two practical rules follow from the discussion above. First, carry the unit exactly as the method reports it (ppm and ng/mg are equal, but EU/mg and EU/mL are not). Second, compute inSpec from the limits rather than setting it by hand, so that the record cannot contradict itself.
{
"name": "HMW species (SEC)",
"value": 1.8,
"unit": "%",
"usl": 5.0,
"inSpec": true,
"criticality": "high"
}
Every step loses some product: some fails to bind or elute, some is cut away with an impurity, and some remains in hold-up volumes and filters. Because each step processes what the previous step delivered, step recoveries multiply. The SDK's three chromatography steps for an antibody use recoveries of 95 %, 92 % and 90 %:
overall = 0.95 × 0.92 × 0.90 = 0.7866 → 78.7 %
Three steps that each look good individually already lose more than a fifth of the product. Adding the non-chromatographic steps makes the effect clearer. With illustrative recoveries of 98 % for low-pH hold, 97 % for virus filtration and 97 % for UF/DF:
| Step | Step recovery (illustrative) | Cumulative | Product left from 10 kg |
|---|---|---|---|
| Protein A | 95 % | 95.0 % | 9.50 kg |
| Low-pH hold | 98 % | 93.1 % | 9.31 kg |
| AEX | 92 % | 85.7 % | 8.57 kg |
| HIC | 90 % | 77.1 % | 7.71 kg |
| Virus filtration | 97 % | 74.8 % | 7.48 kg |
| UF/DF | 97 % | 72.5 % | 7.25 kg |
Two consequences matter for design and cost. First, the value of a recovery gain is highest where the product is most concentrated in value — lost material late in the train has already absorbed the cost of every earlier step. Second, removing a step can raise overall yield more than optimising it; this is the argument behind two-column polishing platforms and flow-through steps. Conversely, each step is there because of a CQA or a clearance requirement, so a step can only be removed if the remaining steps demonstrably still meet every limit in section 4.6.
The reference SDK reports overallRecovery: 78.66 for any antibody input because its step recoveries are fixed constants. It ignores the losses of viral inactivation and UF/DF even though it adds their time to duration (8 h per chromatography step plus 2 h and 4 h, 30 h in total). Its costPerGram (50 + 20 per step, i.e. 110 $/g for three steps) is a placeholder formula, not a cost benchmark. The SDK also reads targetPurity and targetRecovery from PurificationDesign but does not use them: a request for 90 % recovery returns the same 78.66 % without a warning. A conforming implementation should at least compare the computed recovery and purity with the targets and flag the gap — for example with B009 (OUT_OF_SPEC) — rather than silently return a protocol that misses them. Chapter 6 treats the SDK's behaviour in detail.
// Compounded recovery across steps, with a target check (illustrative)
function overallRecovery(stepRecoveriesPct: number[]): number {
return stepRecoveriesPct.reduce((acc, r) => acc * (r / 100), 1) * 100;
}
const overall = overallRecovery([95, 98, 92, 90, 97, 97]); // ≈ 72.5
const target = 80;
if (overall < target) {
console.warn(`recovery ${overall.toFixed(1)} % below target ${target} %`);
}
resinVolume assumes one cycle with no margin.designPurification uses fixed recoveries, ignores targets and has no fields for cycles, LRVs, virus filtration or UF/DF — gaps that Chapters 5, 6 and 8 return to.