In production · 2 factories
Defabric
A multi-tenant ERP for flexible-packaging plants, with a Claude agent layer where every write waits for a person.

A whole plant in one ERP, and agents that never write on their own.
An ERP for flexible packaging has to cover the whole plant: sales, production planning and lots, quality, warehouse, purchasing, HR, payroll and administration. The goal was to let people ask for work in plain language and let agents do the looking-up and the proposing, without a model ever writing to production data on its own.
That constraint shapes the architecture: agents read and propose; people confirm; the server re-checks.
A hierarchy of agents with a single way out: you.
A person asks
From the ERP chat or a shop-floor kiosk, in plain language. The request goes to the Director agent.
The Director delegates
It doesn't do everything itself: it hands off to the right department lead (Production, Quality, Purchasing, HR…).
Leads delegate to coordinators
Each work center (Extrusion, Printing…) has a coordinator with its own context and tools.
Scoped tools
An agent only sees its team's tools intersected with the user's permissions. Read tools run;
propose_*tools don't write: they create a draft with an audit log.The person confirms
Pressing Confirm runs the action with that person's own token, against the same endpoints and permissions as the screen. Single-use draft, expires in 15 min, re-verified on confirm.
Everything is metered and visible
Agent progress streams live over SSE, and token usage is recorded per user and per agent.
One task, from question to Confirm.
you › "What's pending on Extrusion 1? Re-plan it if needed."director → production.lead delegateproduction→ extrusion.coord delegateextrusion · pending_to_make(center: "Extrusion 1") ✓ read · demo dataextrusion · propose_schedule(order: DEMO-1042, …) → draft · no write · single-use · 15:00⏸ awaiting human approvalyou ✓ Confirm · runs with your tokenapi re-verify → unchanged → write ok · audit
// Shape of a gated tool (simplified sketch, not production code) export const proposeSchedule = defineTool({ name: "propose_schedule", team: ["production"], // ∩ user permissions requires: "production.schedule.write", async run(input, ctx) { // never writes: creates a draft the user must confirm return ctx.drafts.create({ action: "schedule.update", input, singleUse: true, expiresIn: "15m", snapshot: await ctx.read.order(input.order), }); }, });
The trace is an illustrative replay with demo data; the sketch shows the shape, not the real code (a sanitized excerpt from the repo is pending).
Try it: confirm a draft.
- Action
- schedule.update
- Order
- DEMO-1042
- Line
- Extrusion 1
- Proposed by
- extrusion.coord
What the agent cannot do without a person: any write. Schedules, time-clock fixes, loans and production orders all wait for explicit confirmation, with an audit log.
And how the code enforces it: the agent has no write endpoints at all; only the Confirm button calls them, with the token of whoever presses it.
Drafts, not writes
The propose_* tools only create a draft and an audit entry.
Your token, your permissions
Confirm executes with the person's session, against the same endpoints as the screen.
Single use, 15 minutes
Each draft can be used once and expires after 15 minutes.
Re-verified on confirm
If the order changed since the draft, it is rejected.
Scoped tools
Agent's team ∩ user's permissions.
Metered
Token usage per user and per agent.
Walk a stylized plant and watch the agents delegate.
A low-poly recreation inspired by the real Plant view, with demo data. Loads only if you open it.
Explore in 3D
Only what has a source.
| What | Value | Source |
|---|---|---|
| Factories in production | 2 | Self-reported · 2026 |
| ERP modules | 8 | Self-reported: sales, planning & lots, quality, warehouse, purchasing, HR, payroll, admin |
| Agent writes without human confirmation | 0 | By design: agents have no write endpoints |
| Time saved per request | Not measured yet | — |
| Draft acceptance rate | Not measured yet | — |