Security and food safety

Software that can move a setpoint in a food plant needs more than a good model.

Doughex is designed around three facts: baked goods are food-safety-critical, recipes are intellectual property, and the plant's existing automation must keep running if Doughex stops. This page is the design posture; certifications are on the roadmap and not claimed.

CCPs read, never writtenTenant isolation by designSOC 2 on the roadmap

run_scn_01 · agent graph · scenario 10 nodes · 1 approval gate
01 · orchestrator order.receive ✓ SUCCEEDED 02 · orchestrator twin.simulate ✓ SUCCEEDED 03 · dose_mix mix.dose ✓ SUCCEEDED 04 · ferment_proof proof.hold ✓ SUCCEEDED 05 · makeup_deposit deposit.trim ✓ SUCCEEDED 06 · orchestrator approve.human ◆ APPROVAL 07 · bake_cool bake.zone ✓ SUCCEEDED 08 · defect_inspect inspect.line ✓ SUCCEEDED 09 · robot_handling handle.pack ✓ SUCCEEDED 10 · quality_conf release.genealogy ✓ SUCCEEDED

Illustrative scenario: Plant run · one bread line, flour-lot change at the silo · shared oven. Not a measured run.

Defence in depth

Six layers between a model and a setpoint

01

Allow-list

An agent can only write to tags declared for it.

02

Limits

Per-tag rate and magnitude limits, declared and versioned.

03

Level

Observe, recommend, approve to apply or bounded, set per loop; nothing writes in observe mode.

04

Policy engine

Interlock state, product, allergen status, shift and operator presence evaluated before every write.

05

Human gate

Anything above the threshold, every CCP-adjacent move and every release waits for a named person.

06

Fallback

If Doughex stops, the line runs on its existing PLC and SCADA control and interlocks.

Tool calls

Every call, on the record

Every tool invocation, argument and result is written to an immutable, human-readable log, and every reasoning step is expandable. Nothing about a run is hidden from the plant. The log below is the scenario run, not a measured one.

tool-call stream · run_scn_01
  1. 04:40:02mes.read_order({ line: "BR-2", product: "SANDWICH-800", flour_lot: "F-3312" })
  2. 04:40:02ok spec locked · HACCP plan v6 · CCPs: bake kill step, metal detection
  3. 04:40:03lab.read_results({ lot: "F-3312", test: "flour_certificate" })
  4. 04:40:03ok protein and absorption read · lot accepted at the silo
  5. 04:40:04twin.simulate({ candidates: 24, horizon: "shift" })
  6. 04:40:42ok best profile #7 · kill-step margin held · lowest energy per unit
  7. 04:40:43policy.evaluate({ profile: 7, level: "bounded" })
  8. 04:40:43ok 8 writes permitted · 1 write requires human approval
  9. 04:40:44plc.write_setpoint({ tag: "MIX1.ENERGY", basis: "lot absorption + dough temp" })
  10. 04:53:24ok dough temperature on target · development inside window
  11. 04:53:25plc.write_setpoint({ tag: "PRF1.DWELL", basis: "rise curve + humidity" })
  12. 05:51:30ok rise and volume on target · proof not running fast
  13. 05:51:31plc.write_setpoint({ tag: "DIV1.TRIM", mode: "min_safe_margin" })
  14. 05:51:31ok portion weight at minimum safe margin · underweight guardrail armed
  15. 05:51:33approval.request({ action: "oven.zone3", reason: "outside bounded envelope" })
  16. 05:53:09ok approved by the shift process engineer · tighter colour alarm set
  17. 05:53:10plc.write_setpoint({ tag: "OVN1.ZONE3_T", mode: "min_energy" })
  18. 05:53:10ok predicted colour and moisture inside spec · kill step verified
  19. 05:53:11vision.stream({ cameras: 12, models: ["colour_shape", "foreign_body", "seal"] })
  20. 06:21:48reject: pale top · unit 2231 · attributed to draught at zone one
  21. 06:21:49defect.attribute({ event: "pale_top", cause: "oven.zone1_draught" })
  22. 06:21:49ok oven agent notified · second reject at 06:23:12 · zone one corrected
  23. 06:21:50robot.execute({ cell: "DEPAN-1", mode: "guarded", pace: "line" })
  24. 06:21:50ok depanning and tray transfer paced · rejects diverted · safe zone clear
  25. 08:14:20mes.release_lot({ lot: "BR2-3312", genealogy: "full" })
  26. 08:15:25ok lot released · scenario complete

Reasoning trace

Goal, plan, thought, action, observation, exactly as the orchestrator would record it.

GoalStart flour lot F-3312 on bread line BR-2, hold development, r…

Start flour lot F-3312 on bread line BR-2, hold development, rise, weight, colour and moisture on target through the change, and release the lot with full genealogy.

PlanSimulate the whole profile on the twin first. Lead with the mi…

Simulate the whole profile on the twin first. Lead with the mixer so the proofer gets dough with a known rise curve and the divider gets dough with a known density. Verify the bake kill step continuously. Let the oven chase minimum energy only inside the bounded envelope; hold anything beyond it for a person.

ThoughtThe standing recipe overshoots portion weight and runs the ove…

The standing recipe overshoots portion weight and runs the oven hot to protect against lot variability. With continuous dough-state, weight and colour estimates the margins can sit at their minimum safe values. The saving is giveaway and energy, not safety margin: the kill step is never a candidate for optimisation.

Actiontwin.simulate(candidates=24) → profile #7: minimum safe weight…

twin.simulate(candidates=24) → profile #7: minimum safe weight margin, kill-step margin unchanged, lowest predicted energy per unit.

ObservationProfile #7's zone-three temperature sits outside the site's bo…

Profile #7's zone-three temperature sits outside the site's bounded envelope. The policy engine routes that single write to the shift process engineer and permits the other eight.

ActionExecute profile #7 at the bounded level: mixer, proofer and di…

Execute profile #7 at the bounded level: mixer, proofer and divider writes proceed; the zone-three write waits.

ObservationApproval granted at 05:53:09 with a tighter colour alarm. Two …

Approval granted at 05:53:09 with a tighter colour alarm. Two pale-top rejects at oven exit were attributed to a draught at zone one and corrected by the oven agent.

OutcomeScenario complete. The lot released with flour lot, setpoints,…

Scenario complete. The lot released with flour lot, setpoints, kill-step readings, inspection events and the human decision in the genealogy. No measured plant result is claimed; this is the run the platform is designed to execute.

Guardrails

An agent that can move a setpoint needs a leash

Doughex writes to production equipment in a food plant. Every capability is scoped, every write is policy-checked, every output is cited, and every action is written to an append-only audit log the plant owns.

  • Bounded action space. Each agent can only write to an explicit tag allow-list, inside per-tag rate and magnitude limits, at the autonomy level the plant has set.
  • Critical control points are read, never written. The bake kill step, metal detection and X-ray rejects, allergen changeover and release decisions stay with the HACCP plan and the people who own it.
  • Policy engine before every write. Autonomy level, interlock state, product, allergen status, shift and operator presence are evaluated before a setpoint moves.
  • Grounded and cited. Every recommendation carries a citation to the recipe, spec or procedure it relied on. Retrieval is tenant-isolated and permission-aware.
  • Immutable audit log. Append-only, exportable and retained on the plant's own storage, aligned to HACCP, FSMA, BRCGS and ISO 22000 record-keeping.
  • Hard fallback. If the edge node, the network or a model stops, the line keeps running on its existing PLC and SCADA control and interlocks.
  • Tenant and IP isolation. Recipes, customer specs and tolerance models never cross a customer boundary. On-prem deployment available.

Assurance posture

Assurance and certification status
ItemScopeStatus
SOC 2 Type ICloud control plane QUEUED Roadmap, first 6 months
SOC 2 Type IICloud control plane QUEUED Roadmap, 6 to 12 months
HACCP · FSMA · BRCGS · ISO 22000 · allergenGrounding and record-keeping RUNNING Design basis for retrieval and the audit log
Per-tenant isolationData, memory, models RUNNING Design rule
On-prem deploymentRecipe-sensitive bakeries RUNNING Design option

Doughex supports your food-safety records. It is not a certification and it does not replace your HACCP plan.

Read the security overview

Autonomy

Five levels, set per loop

A bakery does not go from manual to bounded control in one step. Doughex makes the level explicit per loop, auditable and reversible at any time, and some decisions never leave the person.

Autonomy levels and the human role at each
LevelWhat the agent doesWhat the person doesWhen
ObservePredicts rise, weight, colour, moisture and defects; writes nothingRuns the bakery as today; compares predictions to QA checksFirst phase with every design partner
RecommendProposes mix, proof, deposit and oven moves with the evidence behind eachA process engineer or baker approves or corrects each oneAfter accuracy is proven against the baseline
Approve to applyPrepares the write; applies it only on a named person's approvalApproves per move; reviews the shift recordOnce recommendations are trusted
BoundedWrites low-risk oven, depositing and inspection setpoints inside explicit limitsApproves anything above the limits; reviews exceptionsAfter the food-safety and ROI gates agreed up front
ExceptionsEscalates anything outside its envelope, CCP-adjacent moves and release decisionsAlways decides these; the agent never doesPermanent
Assurance

Certification status

Stated plainly. Items on the roadmap are roadmap items.

Assurance items and status
ItemScopeStatus
SOC 2 Type ICloud control plane QUEUED Roadmap, first 6 months
SOC 2 Type IICloud control plane QUEUED Roadmap, 6 to 12 months
Food-safety and sustainability assurance packagesDesign partners QUEUED Roadmap, 6 to 12 months
HACCP, FSMA, BRCGS, ISO 22000, allergenGrounding and records RUNNING Design basis; not a certification of Doughex
IP-safe deploymentRecipes, customer specs RUNNING Design rule; on-prem option
OT safety

Failing safe is a design requirement

  • Supervisory, not primary. Doughex sits above existing PLC and SCADA control; it never replaces an interlock or a safety system.
  • Critical control points are read-only. The bake kill step, metal detection and X-ray rejects and allergen changeover are verified and logged, never written.
  • Release is human. The conformance agent assembles the genealogy and checks it against spec; a person releases the lot.
  • Loss of Doughex is loss of advice. The line degrades to the way it runs today, not to a stop.

What leaves the plant, and when

Data flows
DataWhere it stays
Recipes, specs, tolerance modelsTenant-scoped; on-prem option
Customer and private-label specsTenant-scoped
Audit log and genealogyThe plant's own storage, exportable
Safe abstractions of rare defectsTransfer across similar lines, privacy-preserving (planned)
Multi-agent handoff

Agents negotiate, they do not collide

Two agents will want the same actuator. The orchestrator arbitrates on the run goal, with food safety above everything, and the handoff is logged like any other step.

Contested move: oven band speed

  1. 01yield_takt.request(band +4%) SUCCEEDED0.2 s

    Yield-and-Takt wants a faster band through the oven so the line clears the proofer backlog and the packing hall is not left waiting.

  2. 02bake_cool.request(band hold) SUCCEEDED0.2 s

    Bake-and-Cool requires the band speed that keeps core temperature above the kill-step threshold for the full dwell. That is the HACCP critical control point.

  3. 03orchestrator.arbitrate SUCCEEDED0.4 s

    Food safety outranks takt under every run goal. The critical control point wins the actuator; the request for more speed is logged with its score and the reason it lost.

  4. 04yield_takt.handoff(resequenced) SUCCEEDED90 s

    Yield-and-Takt recovers the schedule by trimming proofer dwell on the next batch within its window and resequencing the changeover. Takt is met without touching the kill step.

Arbitration rules

  • Run goal first. Every request is scored against the declared goal, not against the requesting agent's local objective.
  • Food safety outranks everything. A critical control point is never an optimisation variable. A kill-step or foreign-body escape is a recall; a takt miss is a schedule.
  • Time-boxed ownership. An agent holds a contested actuator for a bounded window, then must re-justify.
  • Everything is logged. The losing request, the score and the reason all appear in the run record.
  • Deadlocks escalate to a person rather than resolving by timeout.

See the agent roster

Enterprise

Standardise autonomy across the group

One policy model, one audit trail and one set of yield, waste, giveaway and energy benchmarks across every bakery in the group, with each site's recipes and tolerance models kept private to that site.

Talk to us Enterprise details

  • Multi-site plant-edge fleet with shared model governance
  • Custom recipe, product and tolerance models per site
  • SSO and role-based access, named approvers (roadmap, 6 to 12 months)
  • Model versioning, validation reports and rollback
  • On-prem or private-cloud deployment
  • SLAs and outcome-based components on the highest-value workflows
FAQ

Straight answers

The questions plant directors, process engineers and quality managers ask in the first meeting.

Only at the autonomy level your plant has set, and only to an explicit allow-list of low-risk loops inside explicit limits. Every design partner starts in observe mode, where Doughex predicts and writes nothing. Recommend mode follows, where a process engineer approves each move. Bounded autonomy on oven, depositing and inspection loops comes after the food-safety and ROI gates agreed up front.

Get started

Get the security pack

The design posture, the data flows and the roadmap dates, written for a quality manager and an IT/OT lead.