Security and food safety

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

Brewira is designed around three facts: beverages are food-safety-critical, recipes are intellectual property, and the plant's existing automation must keep running if Brewira 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 · brew_blend brew.blend ✓ SUCCEEDED 04 · ferment_yeast ferment.control ✓ SUCCEEDED 05 · filter_carbonate carbonate.dose ✓ SUCCEEDED 06 · fill_seal fill.seal ✓ SUCCEEDED 07 · defect_inspect inspect.line ✓ SUCCEEDED 08 · pasteurize_cip pasteurize.verify ✓ SUCCEEDED 09 · orchestrator approve.human ◆ APPROVAL 10 · quality_conf release.genealogy ✓ SUCCEEDED

Illustrative scenario: Plant run · one lager batch from brewhouse to can · brewhouse, cellar, filler, tunnel pasteurizer. 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, inside documented recipe, quality, food-safety, equipment and rollback bounds.

03

Stage

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

04

Policy engine

Interlock state, brand, package, shift and operator presence evaluated before every write; changes that violate HACCP, FSMA, FSSC 22000 or BRCGS controls are blocked.

05

Human gate

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

06

Fallback

If Brewira 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. 04:50:02mes.read_order({ batch: "L-0931", brand: "LAGER-33", package: "CAN-330" })
  2. 04:50:02ok recipe locked · HACCP plan v6 · CCP: tunnel PU 15–20
  3. 04:50:03lab.read_results({ yeast_lot: "Y-2207", test: "viability" })
  4. 04:50:03ok viability inside window · lot accepted for pitching
  5. 04:50:04twin.simulate({ candidates: 24, horizon: "batch" })
  6. 04:50:42ok best plan #7 · PU margin held · lowest CO2 and energy per hl
  7. 04:50:43policy.evaluate({ plan: 7, stage: "bounded" })
  8. 04:50:43ok 7 writes permitted · 1 write requires human approval
  9. 04:50:44plc.write_setpoint({ tag: "BH1.BLEND_RATIO", basis: "gravity+recipe" })
  10. 04:53:24ok wort gravity on recipe · utilization held
  11. 05:10:00ferment.predict_curve({ tank: "FV-12", lot: "Y-2207" })
  12. 05:10:00ok attenuation curve predicted · finish day 5 · crash timed
  13. 05:10:01plc.write_setpoint({ tag: "FV12.TEMP_RAMP", window: "brewmaster_approved" })
  14. 05:10:01ok ramp applied · no stuck or runaway ferment flagged
  15. 06:02:10plc.write_setpoint({ tag: "CARB1.CO2_DOSE", basis: "co2+do+turbidity" })
  16. 06:05:25ok CO2 on package target · clarity inside spec · backwash timed
  17. 06:05:26vision.stream({ cameras: 16, models: ["fill_level", "seam_cap", "label_ocr", "foreign_body"] })
  18. 06:31:48reject: low fill · can 20417 · attributed to filler valve 14 drift
  19. 06:31:49defect.attribute({ event: "low_fill", cause: "filler.valve_14" })
  20. 06:31:49ok fill_seal notified · valve 14 trimmed inside window · two more rejects, then clean
  21. 06:31:50plc.verify_pu({ tag: "TUN1.ZONES", profile: "validated" })
  22. 06:31:50ok PU inside profile · readings → audit log
  23. 06:31:52approval.request({ action: "cip.window", reason: "overlaps next brand start" })
  24. 06:33:44ok approved by the shift quality manager · PU profile untouched · tighter release check
  25. 09:12:30mes.release_batch({ batch: "L-0931", genealogy: "full" })
  26. 09:13:35ok batch released · scenario complete

Reasoning trace

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

GoalBrew batch L-0931 to recipe gravity, ferment it to target atte…

Brew batch L-0931 to recipe gravity, ferment it to target attenuation, carbonate and fill it to spec at line speed, pasteurize it on the validated PU profile and release it with full genealogy.

PlanSimulate the whole batch on the twin first. Lead with gravity …

Simulate the whole batch on the twin first. Lead with gravity so the cellar gets the right wort and the filler gets the right CO2. Verify the pasteurization critical control point continuously. Let the filler chase target level only inside the approved window; hold anything beyond the envelope for a human.

ThoughtThe standing practice over-fills to avoid low fills and over-g…

The standing practice over-fills to avoid low fills and over-gasses to avoid flat product. With continuous fill-level estimation and inline CO2 the filler and the carbonator can sit at target. The saving is giveaway, not safety margin: the pasteurization CCP is never a candidate for optimization.

Actiontwin.simulate(candidates=24) → plan #7: gravity on recipe, fin…

twin.simulate(candidates=24) → plan #7: gravity on recipe, finish day 5, CO2 at package target, PU margin unchanged, lowest predicted CO2 and energy per hectoliter.

ObservationPlan #7 wants the pasteurizer CIP in a window that overlaps th…

Plan #7 wants the pasteurizer CIP in a window that overlaps the next brand's start. The policy engine routes that single move to the shift quality manager and permits the other seven writes.

ActionExecute plan #7 at the bounded stage: brewhouse blend, tank ra…

Execute plan #7 at the bounded stage: brewhouse blend, tank ramp, CO2 dosing and fill-valve writes proceed; PU is verified continuously; the CIP move waits.

ObservationApproval granted at 06:33:44 with the PU profile untouched and…

Approval granted at 06:33:44 with the PU profile untouched and a tighter CIP release check. Three low-fill rejects were attributed to filler valve 14 and corrected by Fill-and-Seal inside the approved window.

OutcomeScenario complete. The batch is released with gravity and atte…

Scenario complete. The batch is released with gravity and attenuation curves, yeast lot, CO2 and clarity, fill and seal outcomes, PU readings, CIP release 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

Brewira 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 units, CIP release checks and batch 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, FSSC 22000 and BRCGS 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 · FSSC 22000 · BRCGSGrounding 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

Brewira 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. Brewira 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 gravity, attenuation, carbonation, fill and seal faults, contamination and takt; writes nothingRuns the plant as today; compares predictions to lab, QA and PLC outcomesFirst phase with every design partner
AssistRecommends bounded brew, fermentation, carbonation, fill and seal, pasteurization and CIP moves with the evidenceA brewmaster, process engineer or quality manager approves or rejects each oneAfter accuracy is proven against the baseline
BoundedWrites low-risk filling, carbonation and inspection setpoints inside documented recipe, quality, food-safety, equipment and rollback 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, FSSC 22000, BRCGSGrounding and records RUNNING Design basis; not a certification of Brewira
IP-safe deploymentRecipes, supplier data RUNNING Design rule; on-prem option
OT safety

Failing safe is a design requirement

  • Supervisory, not primary. Brewira sits above existing PLC and SCADA control; it never replaces an interlock or a safety system.
  • Critical control points are read-only. Pasteurization units and CIP release checks 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 Brewira 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, yeast and raw-material dataTenant-scoped
Audit log and genealogyThe plant's own storage, exportable
Rare-defect and drift patternsFederated, IP-isolated transfer across similar lines (planned, opt-in)
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: tunnel pasteurizer belt speed

  1. 01yield_takt.request(belt +5%) SUCCEEDED0.2 s

    Yield-and-Takt wants more belt speed through the tunnel pasteurizer so the filler is not held back and the shift meets takt.

  2. 02pasteurize_cip.request(belt hold) SUCCEEDED0.2 s

    Pasteurize-and-CIP requires the belt speed that keeps every container inside the validated PU profile. 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 pulling the next changeover earlier and shifting the CIP window instead. 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. An under-pasteurized or contaminated batch 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, giveaway, water and energy 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 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, brewmasters 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 documented limits. Every design partner starts in shadow mode, where Brewira predicts and writes nothing. Assist mode follows, where a brewmaster or process engineer approves each recommendation. Bounded autonomy on filling, carbonation 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.