Industrial safety intelligence

The signals were always there.Nothing was reading them together.

Gas detection clears it. The permit is valid. Both workers are certified. Every system says yes — and the combination kills people. SOP Opera reads them as one picture, and turns what it finds into a decision somebody owns.

Compound risk enginePlant 1 · Zone coke-oven-batteryNominal
SCADA · GAS DETECTION27.4 ppmBelow its own alarm linePERMIT TO WORKPTW-4471 · Hot workValid, correctly issuedWORKFORCE TRACKING2 workers · Zone ABoth certified, in dateVESSEL A0/3signalsASSESSMENTDo not proceedHot work beside rising gaswith two people in the zone
Correlating live plant signals…

Every system says everything is fine. Together they are not.

Industrial plants are already instrumented. The failure is not missing data — it is that each system judges its own slice in isolation, so a combination that is obviously dangerous to a human never registers anywhere as an alarm.

Gas detectionThis sensor is within limits.No alarm
Permit to workThis permit is valid.No alarm
MaintenanceThis isolation is logged.No alarm
WorkforceThis worker is certified.No alarm

Read together, the same four readings describe hot work authorised beside rising gas with people in the blast path.

0+Fatal workplace accidents recorded in FY2023DGFASLI — and that figure excludes most mining and construction.
0%Of large facilities coordinate safety tooling by handFICCI 2024 — manual handoffs between systems that already hold the data.

Measured against the alarm philosophy it replaces.

A labeled case set runs through three detectors on every build. The metric that matters is the false-negative rate — the dangerous situations a detector fails to flag at all.

Single-sensor baseline
False negatives missed
Recall
Precision

One reading, one threshold — today's alarm philosophy.

Predictive trend
False negatives missed
Recall
Precision

Extrapolates where a reading is heading.

Compound engineOurs
False negatives missed
Recall
Precision

Correlates readings, permits, isolation and people.

Lead time before the single-sensor threshold is crossed
Cases caught by correlation that no single sensor flagged
Labeled cases in the set

Live from the evaluation harness · GET /api/eval/summary

Deterministic where it must be. Generative only where it helps.

Rules detect. Agents correlate. Retrieval grounds. A human decides. Each stage is separately inspectable, which is what makes the output defensible after an incident.

  1. 01

    Context arrives

    POST /context

    Sensor readings, permits, isolation state, worker location and shift logs land through one provider interface — the same seam a live SCADA or permit system plugs into.

  2. 02

    Rules derive facts

    derived_facts.py

    Deterministic Python turns raw context into named facts — elevated gas, permit conflict, incomplete isolation, zone occupied. No model decides what is true.

  3. 03

    Agents correlate

    LangGraph

    A multi-agent graph fans out only where the facts warrant: source agents per domain, then spatial, predictive-trend, and shift-handover carry-forward, then incident-pattern on elevated verdicts.

  4. 04

    Retrieval grounds it

    pgvector + SQL

    Hybrid retrieval pulls regulations, prior incidents and SOPs — vector search first, deterministic SQL as a guaranteed fallback so citations are never empty.

  5. 05

    A human decides

    POST /decisions

    The assessment explains what the combination means and recommends. The supervisor approves, conditions or blocks — and that call is the binding act.

  6. 06

    Evidence freezes

    Audit trail

    The context and assessment cited at decision time are snapshotted, follow-up tasks are dispatched to the area supervisor, and a report closes the loop.

Two roles, two surfaces, one thread between them.

The control room runs the assessment and owns the decision. The area supervisor receives what that decision requires and closes it out. Nothing crosses roles that shouldn't.

Operator dashboard

A live floor map across three levels. Assets carry their current risk, telemetry drifts in real time, and anything that turns blocking announces itself.

Reasoning trace

Click an asset and read the chain backwards: which context arrived, which rules fired, which agents ran, which regulations were retrieved.

Supervisor queue

Area supervisors see only their zones — the tasks a decision generated, waiting to be acknowledged and cleared before work resumes.

Audit record

Every transition is appended, every decision freezes its evidence, and closure generates a report an investigator can actually follow.

Operator dashboard — Plant 1
Operator DashboardReportsEvalAI OpsShift Handover
Vessel Ablocking
Compressor Belevated
Tank Farm Cnominal

Selective fan-out, not a model loop.

Agents run only where the facts justify them — a nominal review costs one orchestrator pass. Retrieval is driven by the orchestrator, never chosen by the model, so a citation is always available for the record.

SCADAPermitMaintenanceWorkforceSpatialPredictive trendRisk

Gated fan-out — agents without matching facts never run.

Durable job queue

Assessments are claimed with FOR UPDATE SKIP LOCKED, so jobs survive restarts and parallel workers never double-run the same review.

Hybrid retrieval

Vector search over a seeded corpus of regulations, prior incidents and SOPs, with a quality gate and a deterministic SQL fallback beneath it.

Knowledge graph

Equipment, zones, permits and people are related spatially, so proximity risk is computed rather than guessed.

Structured output

Every model response is schema-validated with a retry; a failure surfaces to the supervisor instead of degrading quietly into prose.

The decision already happens. Make it visible.

Run the full loop — a plant going critical, an assessment that explains why, a decision on the record and the report that follows it.

SOP Opera

Operational safety intelligence for high-risk industrial work.

Next.jsFastAPIPostgreSQL + pgvectorLangGraphWebSocketsHybrid RAG
Demo build — seeded plant, simulated context providers.Launch demo →