Infection Control & Sterilization

v0.1.0

Autoclave cassette batch barcode validation, biological/chemical indicator verification, and chairside safety invariants.

Infection Control & Sterilization Governance

The Infection Control & Sterilization bounded context tracks autoclave processing cycles, monitors biological and chemical spore indicators, and enforces chairside sterility verification before any instruments can contact patient mucosal tissues.


Sterilization Cycle Tracking & Cassette Barcodes

Every dental surgical cassette and instrument pouch is labeled with a unique, machine-scannable barcode (AutoclaveBarcode):

use Obelaw\Ium\Dental\ValueObjects\AutoclaveBarcode;

$barcode = AutoclaveBarcode::from('CAS-2026-0941');
+--------------------------------------------------------------+
|                        AutoclaveCycle                        |
+--------------------------------------------------------------+
| id: int                                                      |
| barcode: string (unique index)                               |
| autoclave_unit_id: string (e.g. 'AUTOCLAVE-01-STATIM')      |
| cycle_number: string                                         |
| sterilized_at: datetime                                      |
| expires_at: datetime (default: +30 days)                     |
| passed: boolean                                              |
| indicator_verified: boolean (Class 5/6 chemical strip)       |
| notes: text                                                  |
+--------------------------------------------------------------+

The Chairside Sterility Safety Gate

To eliminate patient cross-contamination and instrument processing errors, Obelawium Dental enforces a strict chairside safety invariant via validateCassette():

flowchart TD
    SCAN["Chairside Barcode Scan (AutoclaveBarcode)"] --> LOOKUP["Lookup Cycle in Database"]
    LOOKUP --> CHECK_EXISTS{"Cycle Exists?"}
    
    CHECK_EXISTS -->|No| FAIL_MISSING["THROW AutoclaveSterilizationFailedException<br/>(Expired or Missing Barcode)"]
    CHECK_EXISTS -->|Yes| CHECK_PASS{"passed and indicator verified?"}
    
    CHECK_PASS -->|No| FAIL_FAILED["THROW AutoclaveSterilizationFailedException<br/>(Cycle Failed or Spore Indicator Unverified)"]
    CHECK_PASS -->|Yes| CHECK_EXPIRY{"expires_at is in the past?"}
    
    CHECK_EXPIRY -->|Yes| FAIL_EXP["THROW AutoclaveSterilizationFailedException<br/>(Sterility Window Expired)"]
    CHECK_EXPIRY -->|No| SUCCESS["Record Audit Log and<br/>Dispatch AutoclaveValidated"]
use Obelaw\Ium\Dental\Exceptions\AutoclaveSterilizationFailedException;

// If a clinician attempts to deploy an unsterilized or expired cassette:
// throws AutoclaveSterilizationFailedException:
// "Autoclave cassette CAS-2026-0941 failed sterilization cycle or indicator was unverified."

Sterility Expiration Rules

Even when packaged in medical-grade sterilization pouches or sealed metal cassettes with bacterial filters, sterility is time-limited.

  • By default, cycles expire 30 days after sterilization (expires_at).
  • If a package is torn, wet, or stored past its expiration date, it must be repackaged and re-sterilized before chairside deployment.

Fluent Service Operations

All infection control workflows are handled via ium()->dental()->infectionControl():

1. Logging an Autoclave Sterilization Cycle

When an autoclave batch finishes, central sterilization staff record the cycle and inspect the chemical and biological indicators:

use Obelaw\Ium\Dental\ValueObjects\AutoclaveBarcode;
use DateTimeImmutable;

$cycle = ium()->dental()->infectionControl()->logCycle(
    barcode: AutoclaveBarcode::from('CAS-2026-0941'),
    completedAt: new DateTimeImmutable('2026-10-14 16:30:00'),
    passed: true,
    unitId: 'AUTOCLAVE-ROOM-UNIT-2',
    indicatorVerified: true, // Class 5 integrator turned dark black
    expiresAt: new DateTimeImmutable('2026-11-13 16:30:00'),
    notes: 'Standard 134°C wrapped cycle. Geobacillus stearothermophilus negative.'
);

2. Validating Cassette at Chairside

Chairside dental assistants scan the cassette before opening it onto the sterile surgical bracket table:

use Obelaw\Ium\Dental\Data\ValidateAutoclaveCassetteDto;
use Obelaw\Ium\Dental\ValueObjects\AutoclaveBarcode;

$validatedCycle = ium()->dental()->infectionControl()->validateCassette(
    ValidateAutoclaveCassetteDto::from([
        'barcode' => AutoclaveBarcode::from('CAS-2026-0941'),
        'operatory_id' => '1',
        'chairside_verified_by' => 'ASST-JONES',
    ])
);

// Returns verified AutoclaveCycle instance

3. Raising Immediate Infection Control Alerts

If an autoclave unit aborts mid-cycle or a weekly biological spore test returns positive:

use Obelaw\Ium\Dental\Enums\AlertSeverity;
use Obelaw\Ium\Dental\ValueObjects\AutoclaveBarcode;

ium()->dental()->infectionControl()->raiseAlert(
    severity: AlertSeverity::CRITICAL,
    message: 'Biological spore test positive on Autoclave Unit 2. Quarantine all batches.',
    barcode: AutoclaveBarcode::from('CAS-2026-0941')
);

4. Regulatory Sterility Compliance Auditing

Generate regulatory compliance reports (e.g. for Joint Commission, OSHA, or State Dental Board inspections):

use DateTimeImmutable;

$report = ium()->dental()->infectionControl()->compliantSince(
    since: new DateTimeImmutable('2026-10-01 00:00:00')
);

// Returns array of total cycles, pass percentage, and quarantine logs

Emitted Domain Events

Event ClassTriggerPayload
AutoclaveValidatedDispatched when a cassette barcode passes chairside validation.AutoclaveCycle $cycle