OOS Investigation Workflow
Out-of-Specification investigations are long-running quality processes. When lab results fall outside limits, the investigation must be replayable and attributable.
Investigation Phases
Phase I: Laboratory Investigation
- Immediate assessment of raw data and calculations
- Supervisor review
- Route on the recorded finding:
- obvious error → QA review
- non-obvious → durable parallel analyses
Phase II: Manufacturing Investigation
If Phase I does not identify a lab error:
- process, equipment, and material review
- root-cause analysis with CAPA
Implementation
dart
final oosDefinition = Workflow<OosInput, OosResult, OosFailure>(
code: 'quality.oos',
version: 1,
input: oosInputSchema,
output: oosResultSchema,
failure: oosFailureSchema,
);
final oosHandler = oosDefinition.implement(
fingerprint: 'quality.oos:v1',
execute: (workflow, input) async {
final assessment = await workflow.request(
initialAssessment,
input,
id: 'assess',
title: 'OOS initial assessment',
audience: Audience(roleIds: ['qc_supervisor']),
);
if (assessment.finding == Finding.nonObvious) {
await workflow.parallel(
id: 'phase-1-analyses',
branches: {
'repeat': (branch) => branch.request(
labAnalysis,
input,
id: 'repeat',
title: 'Repeat analysis',
audience: Audience(roleIds: ['qc_analyst']),
),
'fresh': (branch) => branch.request(
labAnalysis,
input,
id: 'fresh',
title: 'Fresh analysis',
audience: Audience(roleIds: ['qc_analyst']),
),
},
);
}
final qa = await workflow.request(
qaReview,
input,
id: 'qa',
title: 'QA review',
audience: Audience(roleIds: ['qa_reviewer']),
);
if (qa.confirmed && qa.requiresCapa) {
await workflow.perform(createCapa, input, id: 'capa');
}
return qa.confirmed ? OosResult.confirmed() : OosResult.invalidated();
},
);Parallel analyses are named durable branches, not token splits. QA review is assigned work. CAPA creation is a versioned operation.
Compliance
- Two-phase investigation with recorded decisions
- Mandatory assigned reviews
- Append-only history for every completion
- Idempotent operations for CAPA writes