Security and food safety

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

Milkeon is designed around three facts: dairy is safety-critical, recipes are intellectual property, and the plant's existing automation must keep running if Milkeon 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 intake.receive ✓ SUCCEEDED 02 · orchestrator twin.simulate ✓ SUCCEEDED 03 · intake_separate separate.standardize ✓ SUCCEEDED 04 · pasteurize_homog pasteurize.verify ✓ SUCCEEDED 05 · ferment_culture culture.vat ✓ SUCCEEDED 06 · evaporate_dry dry.spray ✓ SUCCEEDED 07 · defect_inspect inspect.pack ✓ SUCCEEDED 08 · hygiene_cip cip.schedule ✓ SUCCEEDED 09 · orchestrator approve.human ◆ APPROVAL 10 · quality_conf release.genealogy ✓ SUCCEEDED

Illustrative scenario: Plant run · skim-milk-powder line + set-yogurt line · shared intake. Not a measured run.

Defense 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

Stage

Shadow, assist or bounded, set per loop; nothing writes in shadow.

04

Policy engine

Interlock state, product, 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 Milkeon stops, the plant 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. 05:10:02mes.read_order({ lot: "T-0417", products: ["SMP", "SET-YOG"] })
  2. 05:10:02ok specs locked · HACCP plan v7 · CCP: pasteurization 72 °C / 15 s
  3. 05:10:03lab.read_results({ lot: "T-0417", test: "antibiotic_screen" })
  4. 05:10:03ok negative · lot accepted for intake
  5. 05:10:04twin.simulate({ candidates: 24, horizon: "shift" })
  6. 05:10:45ok best recipe #9 · pasteurization margin held · lowest energy per kg
  7. 05:10:46policy.evaluate({ recipe: 9, stage: "bounded" })
  8. 05:10:46ok 7 writes permitted · 1 write requires human approval
  9. 05:10:47plc.write_setpoint({ tag: "SEP1.BLEND_VALVE", basis: "nir+midir+lab" })
  10. 05:13:52ok skim solids on target · yogurt-stream fat at minimum safe margin
  11. 05:13:53plc.verify_ccp({ tag: "PAST1.HOLD_TUBE", min: "72 °C / 15 s" })
  12. 05:13:53ok CCP verified · divert valve armed · readings → audit log
  13. 05:14:10dose.culture({ vat: "Y2", lot: "C-2291", profile: "set-yogurt" })
  14. 05:14:10ok acidification curve predicted · hold timed to target pH
  15. 05:14:12approval.request({ action: "dryer.inlet", reason: "above bounded envelope" })
  16. 05:16:00ok approved by the shift dairy technologist · tighter moisture alarm set
  17. 05:16:01plc.write_setpoint({ tag: "DRY1.INLET_T", mode: "min_energy" })
  18. 05:16:01ok predicted outlet moisture inside spec · fouling risk low
  19. 05:16:02vision.stream({ cameras: 16, models: ["fill_seal", "foreign_body"] })
  20. 05:41:18reject: seal fault · unit 1184 · attributed to seal-jaw temperature drift
  21. 05:41:19defect.attribute({ event: "seal_fault", cause: "pack_line.jaw_temp" })
  22. 05:41:19ok packing line notified · second reject at 05:43:02 · drift corrected
  23. 05:41:20cuopt.schedule({ assets: ["PAST1", "DRY1"], window: "energy_low" })
  24. 05:41:20ok CIP sequenced · release checks armed
  25. 09:36:40mes.release_batch({ batches: ["SMP-0417", "YOG-0417"], genealogy: "full" })
  26. 09:37:52ok both batches released · scenario complete

Reasoning trace

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

GoalReceive tanker lot T-0417, standardize it once, pasteurize onc…

Receive tanker lot T-0417, standardize it once, pasteurize once, and run a skim-milk-powder stream and a set-yogurt stream to spec with full genealogy.

PlanSimulate the whole recipe on the twin first. Lead with composi…

Simulate the whole recipe on the twin first. Lead with composition so the dryer gets the right solids and the vat gets the right fat. Verify the pasteurization critical control point continuously. Let the dryer chase minimum energy only inside the bounded envelope; hold anything beyond it for a human.

ThoughtThe standing recipe over-standardizes both streams to protect …

The standing recipe over-standardizes both streams to protect against lab-sample lag. With continuous NIR and mid-IR estimates the blend can sit at the minimum safe margin. The saving is composition give-away, not safety margin: the pasteurization CCP is never a candidate for optimization.

Actiontwin.simulate(candidates=24) → recipe #9: minimum safe composi…

twin.simulate(candidates=24) → recipe #9: minimum safe composition margin, pasteurization margin unchanged, lowest predicted energy per kilogram of powder.

ObservationRecipe #9's dryer inlet temperature sits above the site's boun…

Recipe #9's dryer inlet temperature sits above the site's bounded envelope. The policy engine routes that single write to the shift dairy technologist and permits the other seven.

ActionExecute recipe #9 at the bounded stage: separation and standar…

Execute recipe #9 at the bounded stage: separation and standardization writes, CCP verification, culture dosing and the vat profile proceed; the dryer inlet write waits.

ObservationApproval granted at 05:16:00 with a tighter outlet-moisture al…

Approval granted at 05:16:00 with a tighter outlet-moisture alarm. Two seal rejects on the yogurt packing line were attributed to seal-jaw temperature drift and corrected by the packing line.

OutcomeScenario complete. Both batches released with composition, CCP…

Scenario complete. Both batches released with composition, CCP records, culture lot, drying setpoints, 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

Milkeon 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 stage the plant has set.
  • Critical control points are read, never written. Pasteurization time-temperature, flow diversion and release decisions stay with the HACCP plan and the people who own it.
  • Policy engine before every write. Autonomy stage, interlock state, product, 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, ISO 22000 and FSSC record-keeping.
  • Hard fallback. If the edge node, the network or a model stops, the plant keeps running on its existing PLC and SCADA control and interlocks.
  • Tenant and IP isolation. Recipes, supplier data 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 · ISO 22000 · FSSC · CodexGrounding and record-keeping RUNNING Design basis for retrieval and the audit log
Per-tenant isolationData, memory, models RUNNING Design rule
On-prem deploymentRecipe-sensitive producers RUNNING Design option

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

Read the security overview

Autonomy

Four stages, set per loop

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

Autonomy stages and the human role at each
StageWhat the agent doesWhat the person doesWhen
ShadowPredicts composition, contamination, moisture and takt; writes nothingRuns the plant as today; compares predictions to lab resultsFirst phase with every design partner
AssistRecommends separation, pasteurization, culture and drying moves with the evidenceA dairy technologist or process engineer approves or corrects each oneAfter accuracy is proven against the baseline
BoundedWrites low-risk separation, drying and inspection setpoints inside explicit limitsApproves anything above the limits; reviews the shift recordAfter 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, ISO 22000, FSSC, CodexGrounding and records RUNNING Design basis; not a certification of Milkeon
IP-safe deploymentRecipes, supplier data RUNNING Design rule; on-prem option
OT safety

Failing safe is a design requirement

  • Supervisory, not primary. Milkeon sits above existing PLC and SCADA control; it never replaces an interlock or a safety system.
  • Critical control points are read-only. Pasteurization time-temperature and flow diversion are verified and logged, never written.
  • Release is human. The conformance agent assembles the genealogy and checks it against spec; a person releases the batch.
  • Loss of Milkeon is loss of advice. The plant 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
Supplier and milk-supply dataTenant-scoped
Audit log and genealogyThe plant's own storage, exportable
Safe abstractions of rare faultsTransfer 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: pasteurizer flow rate

  1. 01yield_takt.request(flow +6%) SUCCEEDED0.2 s

    Yield-and-Takt wants more flow through the pasteurizer so the powder stream starts earlier and the dryer is not left waiting.

  2. 02pasteurize_homog.request(flow hold) SUCCEEDED0.2 s

    Pasteurize-and-Homogenize requires the flow that keeps holding time at or above 15 s at 72 °C. 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 flow is logged with its score and the reason it lost.

  4. 04yield_takt.handoff(resequenced) SUCCEEDED90 s

    Yield-and-Takt recovers the schedule by starting the evaporator on the first standardized skim instead of waiting for the full tank. Takt is met without touching the CCP.

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 optimization variable. A pasteurization or seal 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 human rather than resolving by timeout.

See the agent roster

Enterprise

Standardize autonomy across the group

One policy model, one audit trail and one set of yield, loss, energy and water benchmarks across every plant 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 product, composition 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, technologists and quality managers ask in the first meeting.

Only at the autonomy stage your plant has set, and only to an explicit allow-list of low-risk loops inside explicit limits. Every design partner starts in shadow mode, where Milkeon predicts and writes nothing. Assist mode follows, where a technologist approves each recommendation. Bounded autonomy on separation, drying 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.