Can an agent run the factory workflow—not just describe the next screen?
FactoryBench-100 measures complete manufacturing work: validate the policy and source records, transact across an Oracle-shaped ERP, preserve lot and approval controls, and leave the factory in the exact verifiable state the task requires.
The rows below are executed qualification controls, not fabricated model scores: a 100/100 strict oracle, an incomplete workflow, a read-only controller, and a control-skipping ablation. Version-pinned model rows stay empty until those runs exist.
Inspect the scoring contract →Measured performance
Leaderboard
Every displayed row was replayed against all 100 released worlds. These are solvability and diagnostic controls; none is presented as a language-model submission.
100 × deterministic workflow checks passed / checks available, averaged over tasks.
100 distinct tasks
Task browser
Search all 100 executable tasks. Every catalog row publishes its prompt, governing policy, starting ERP records, exact checks, and oracle call count.
Release SO-0001 to manufacturing
Release sales order SO-0001 for 5 FG-PANEL units into production at SEA. Check the governing policy, credit status, effective BOM, and component availability; create and fully reserve the work order. Return the work-order ID, released quantity, and scheduled completion date.
- Company
- Northstar Controls Manufacturing
- As of
- 2026-01-12
- Seeded files
- 2
- Reference path
- 9 MCP calls
Complete task prompt
7 graded criteria summarizedRelease sales order SO-0001 for 5 FG-PANEL units into production at SEA. Check the governing policy, credit status, effective BOM, and component availability; create and fully reserve the work order. Return the work-order ID, released quantity, and scheduled completion date.Rubric summary
- A released discrete work order links to the sales order.
- All three BOM components are reserved.
- The two-per-assembly relay requirement is fully reserved.
- Read-before-write control
- Exact answer fields
- Write-scope containment
- Error-free execution
Seeded evidence
Asset room
Each task exposes the synthetic policy, exact starting-state records, and deterministic verifier contract used by its isolated world.
policy.mdassets/factorybench-001Governing PolicyMarkdown184 B
Release only when the customer is not on credit hold, an effective BOM exists, and every component has enough available stock. Reserve the exact BOM quantity.
Versioned synthetic operating policy retrieved through plant_docs.Open released filestarting-state.jsonassets/factorybench-001PrimaryJSON9.5 KB
37 seeded records across 12 populated ERP tables.
Exact synthetic records used to seed the isolated SQLite world.Open released fileexpected-checks.jsonassets/factorybench-001VerifierJSON1.1 KB
7 deterministic workflow checks plus exact answer fields.
Public check contract; no LLM judge participates in scoring.Open released fileRunnable world
Environment and tool contract
A 33-table SQLite world exposes 36 typed operations through oracle_erp, plant_docs, and factory_harness. Writes are transactional and scoped per task.
approve_invoice
oracle_erporacle_erp: execute approve invoice in the task world.
{
"additionalProperties": false,
"properties": {
"invoice_id": {
"type": "string"
}
},
"required": [
"invoice_id"
],
"type": "object"
}approve_purchase_order
oracle_erporacle_erp: execute approve purchase order in the task world.
{
"additionalProperties": false,
"properties": {
"approver_id": {
"type": "string"
},
"purchase_order_id": {
"type": "string"
}
},
"required": [
"purchase_order_id",
"approver_id"
],
"type": "object"
}approve_requisition
oracle_erporacle_erp: execute approve requisition in the task world.
{
"additionalProperties": false,
"properties": {
"approver_id": {
"type": "string"
},
"requisition_id": {
"type": "string"
}
},
"required": [
"requisition_id",
"approver_id"
],
"type": "object"
}complete_operation
oracle_erporacle_erp: execute complete operation in the task world.
{
"additionalProperties": false,
"properties": {
"actual_hours": {
"type": "number"
},
"sequence": {
"type": "integer"
},
"work_order_id": {
"type": "string"
}
},
"required": [
"work_order_id",
"sequence",
"actual_hours"
],
"type": "object"
}complete_transfer
oracle_erporacle_erp: execute complete transfer in the task world.
{
"additionalProperties": false,
"properties": {
"arrival_date": {
"type": "string"
},
"transfer_id": {
"type": "string"
}
},
"required": [
"transfer_id",
"arrival_date"
],
"type": "object"
}complete_work_order
oracle_erporacle_erp: execute complete work order in the task world.
{
"additionalProperties": false,
"properties": {
"completed_qty": {
"type": "number"
},
"scrap_qty": {
"type": "number"
},
"work_order_id": {
"type": "string"
}
},
"required": [
"work_order_id",
"completed_qty",
"scrap_qty"
],
"type": "object"
}create_maintenance_work_order
oracle_erporacle_erp: execute create maintenance work order in the task world.
{
"additionalProperties": false,
"properties": {
"expected_finish": {
"type": "string"
},
"failure_code": {
"type": "string"
},
"maintenance_id": {
"type": "string"
},
"priority": {
"type": "string"
},
"scheduled_start": {
"type": "string"
},
"workcenter_id": {
"type": "string"
}
},
"required": [
"maintenance_id",
"workcenter_id",
"priority",
"scheduled_start",
"expected_finish",
"failure_code"
],
"type": "object"
}create_nonconformance
oracle_erporacle_erp: execute create nonconformance in the task world.
{
"additionalProperties": false,
"properties": {
"disposition": {
"type": "string"
},
"inspection_id": {
"type": "string"
},
"nonconformance_id": {
"type": "string"
},
"owner_id": {
"type": "string"
}
},
"required": [
"nonconformance_id",
"inspection_id",
"disposition",
"owner_id"
],
"type": "object"
}create_purchase_order
oracle_erporacle_erp: execute create purchase order in the task world.
{
"additionalProperties": false,
"properties": {
"buyer_id": {
"type": "string"
},
"item_id": {
"type": "string"
},
"promised_date": {
"type": "string"
},
"purchase_order_id": {
"type": "string"
},
"quantity": {
"type": "number"
},
"requisition_id": {
"type": "string"
},
"supplier_id": {
"type": "string"
},
"unit_price": {
"type": "number"
}
},
"required": [
"purchase_order_id",
"requisition_id",
"supplier_id",
"buyer_id",
"item_id",
"quantity",
"unit_price",
"promised_date"
],
"type": "object"
}create_requisition
oracle_erporacle_erp: execute create requisition in the task world.
{
"additionalProperties": false,
"properties": {
"item_id": {
"type": "string"
},
"need_by": {
"type": "string"
},
"quantity": {
"type": "number"
},
"requester_id": {
"type": "string"
},
"requisition_id": {
"type": "string"
},
"supplier_id": {
"type": "string"
},
"unit_price": {
"type": "number"
},
"work_order_id": {
"type": "string"
}
},
"required": [
"requisition_id",
"requester_id",
"work_order_id",
"supplier_id",
"item_id",
"quantity",
"unit_price",
"need_by"
],
"type": "object"
}create_transfer
oracle_erporacle_erp: execute create transfer in the task world.
{
"additionalProperties": false,
"properties": {
"from_plant": {
"type": "string"
},
"from_subinventory": {
"type": "string"
},
"item_id": {
"type": "string"
},
"lot_number": {
"type": "string"
},
"quantity": {
"type": "number"
},
"to_plant": {
"type": "string"
},
"to_subinventory": {
"type": "string"
},
"transfer_id": {
"type": "string"
},
"transferred_at": {
"type": "string"
}
},
"required": [
"transfer_id",
"item_id",
"lot_number",
"from_plant",
"from_subinventory",
"to_plant",
"to_subinventory",
"quantity",
"transferred_at"
],
"type": "object"
}create_work_order
oracle_erporacle_erp: execute create work order in the task world.
{
"additionalProperties": false,
"properties": {
"item_id": {
"type": "string"
},
"quantity": {
"type": "number"
},
"sales_order_id": {
"type": "string"
},
"scheduled_completion": {
"type": "string"
},
"scheduled_start": {
"type": "string"
},
"work_order_id": {
"type": "string"
},
"workcenter_id": {
"type": "string"
}
},
"required": [
"work_order_id",
"sales_order_id",
"item_id",
"quantity",
"scheduled_start",
"scheduled_completion",
"workcenter_id"
],
"type": "object"
}get_bom
oracle_erporacle_erp: execute get bom in the task world.
{
"additionalProperties": false,
"properties": {
"as_of": {
"type": "string"
},
"item_id": {
"type": "string"
}
},
"required": [
"item_id",
"as_of"
],
"type": "object"
}get_inventory
oracle_erporacle_erp: execute get inventory in the task world.
{
"additionalProperties": false,
"properties": {
"item_ids": {
"items": {
"type": "string"
},
"type": "array"
},
"plant_id": {
"type": "string"
}
},
"required": [
"plant_id",
"item_ids"
],
"type": "object"
}get_invoice_match
oracle_erporacle_erp: execute get invoice match in the task world.
{
"additionalProperties": false,
"properties": {
"invoice_id": {
"type": "string"
}
},
"required": [
"invoice_id"
],
"type": "object"
}get_maintenance_context
oracle_erporacle_erp: execute get maintenance context in the task world.
{
"additionalProperties": false,
"properties": {
"workcenter_id": {
"type": "string"
}
},
"required": [
"workcenter_id"
],
"type": "object"
}get_purchase_order
oracle_erporacle_erp: execute get purchase order in the task world.
{
"additionalProperties": false,
"properties": {
"purchase_order_id": {
"type": "string"
}
},
"required": [
"purchase_order_id"
],
"type": "object"
}get_quality_context
oracle_erporacle_erp: execute get quality context in the task world.
{
"additionalProperties": false,
"properties": {
"inspection_id": {
"type": "string"
}
},
"required": [
"inspection_id"
],
"type": "object"
}get_receipt
oracle_erporacle_erp: execute get receipt in the task world.
{
"additionalProperties": false,
"properties": {
"receipt_id": {
"type": "string"
}
},
"required": [
"receipt_id"
],
"type": "object"
}get_requisition
oracle_erporacle_erp: execute get requisition in the task world.
{
"additionalProperties": false,
"properties": {
"requisition_id": {
"type": "string"
}
},
"required": [
"requisition_id"
],
"type": "object"
}get_sales_order
oracle_erporacle_erp: execute get sales order in the task world.
{
"additionalProperties": false,
"properties": {
"sales_order_id": {
"type": "string"
}
},
"required": [
"sales_order_id"
],
"type": "object"
}get_schedule
oracle_erporacle_erp: execute get schedule in the task world.
{
"additionalProperties": false,
"properties": {
"plant_id": {
"type": "string"
},
"work_order_id": {
"type": "string"
}
},
"required": [
"plant_id",
"work_order_id"
],
"type": "object"
}get_supplier_quotes
oracle_erporacle_erp: execute get supplier quotes in the task world.
{
"additionalProperties": false,
"properties": {
"item_id": {
"type": "string"
},
"need_by": {
"type": "string"
},
"task_id": {
"type": "string"
}
},
"required": [
"task_id",
"item_id",
"need_by"
],
"type": "object"
}get_work_order
oracle_erporacle_erp: execute get work order in the task world.
{
"additionalProperties": false,
"properties": {
"work_order_id": {
"type": "string"
}
},
"required": [
"work_order_id"
],
"type": "object"
}hold_invoice
oracle_erporacle_erp: execute hold invoice in the task world.
{
"additionalProperties": false,
"properties": {
"invoice_id": {
"type": "string"
},
"reason": {
"type": "string"
}
},
"required": [
"invoice_id",
"reason"
],
"type": "object"
}issue_material
oracle_erporacle_erp: execute issue material in the task world.
{
"additionalProperties": false,
"properties": {
"item_id": {
"type": "string"
},
"lot_number": {
"type": "string"
},
"occurred_at": {
"type": "string"
},
"plant_id": {
"type": "string"
},
"quantity": {
"type": "number"
},
"subinventory": {
"type": "string"
},
"transaction_id": {
"type": "string"
},
"work_order_id": {
"type": "string"
}
},
"required": [
"transaction_id",
"work_order_id",
"item_id",
"plant_id",
"subinventory",
"lot_number",
"quantity",
"occurred_at"
],
"type": "object"
}place_quality_hold
oracle_erporacle_erp: execute place quality hold in the task world.
{
"additionalProperties": false,
"properties": {
"hold_id": {
"type": "string"
},
"inspection_id": {
"type": "string"
},
"item_id": {
"type": "string"
},
"lot_number": {
"type": "string"
},
"reason_code": {
"type": "string"
}
},
"required": [
"hold_id",
"inspection_id",
"item_id",
"lot_number",
"reason_code"
],
"type": "object"
}receive_purchase_order
oracle_erporacle_erp: execute receive purchase order in the task world.
{
"additionalProperties": false,
"properties": {
"item_id": {
"type": "string"
},
"lot_number": {
"type": "string"
},
"purchase_order_id": {
"type": "string"
},
"quantity": {
"type": "number"
},
"receipt_id": {
"type": "string"
},
"received_at": {
"type": "string"
},
"receiver_id": {
"type": "string"
}
},
"required": [
"receipt_id",
"purchase_order_id",
"receiver_id",
"item_id",
"quantity",
"lot_number",
"received_at"
],
"type": "object"
}record_inspection
oracle_erporacle_erp: execute record inspection in the task world.
{
"additionalProperties": false,
"properties": {
"accepted_qty": {
"type": "number"
},
"inspected_qty": {
"type": "number"
},
"inspection_id": {
"type": "string"
},
"inspector_id": {
"type": "string"
},
"item_id": {
"type": "string"
},
"lot_number": {
"type": "string"
},
"rejected_qty": {
"type": "number"
},
"result": {
"type": "string"
},
"source_id": {
"type": "string"
},
"source_type": {
"type": "string"
}
},
"required": [
"inspection_id",
"source_type",
"source_id",
"item_id",
"lot_number",
"inspected_qty",
"accepted_qty",
"rejected_qty",
"result",
"inspector_id"
],
"type": "object"
}record_wip_variance
oracle_erporacle_erp: execute record wip variance in the task world.
{
"additionalProperties": false,
"properties": {
"labor_variance": {
"type": "number"
},
"material_variance": {
"type": "number"
},
"overhead_variance": {
"type": "number"
},
"variance_id": {
"type": "string"
},
"work_order_id": {
"type": "string"
}
},
"required": [
"variance_id",
"work_order_id",
"material_variance",
"labor_variance",
"overhead_variance"
],
"type": "object"
}reroute_operation
oracle_erporacle_erp: execute reroute operation in the task world.
{
"additionalProperties": false,
"properties": {
"sequence": {
"type": "integer"
},
"work_order_id": {
"type": "string"
},
"workcenter_id": {
"type": "string"
}
},
"required": [
"work_order_id",
"sequence",
"workcenter_id"
],
"type": "object"
}reschedule_work_order
oracle_erporacle_erp: execute reschedule work order in the task world.
{
"additionalProperties": false,
"properties": {
"scheduled_completion": {
"type": "string"
},
"scheduled_start": {
"type": "string"
},
"work_order_id": {
"type": "string"
},
"workcenter_id": {
"type": "string"
}
},
"required": [
"work_order_id",
"scheduled_start",
"scheduled_completion",
"workcenter_id"
],
"type": "object"
}reserve_material
oracle_erporacle_erp: execute reserve material in the task world.
{
"additionalProperties": false,
"properties": {
"item_id": {
"type": "string"
},
"lot_number": {
"type": "string"
},
"plant_id": {
"type": "string"
},
"quantity": {
"type": "number"
},
"reservation_id": {
"type": "string"
},
"subinventory": {
"type": "string"
},
"work_order_id": {
"type": "string"
}
},
"required": [
"reservation_id",
"work_order_id",
"item_id",
"plant_id",
"subinventory",
"lot_number",
"quantity"
],
"type": "object"
}search_documents
plant_docsplant_docs: execute search documents in the task world.
{
"additionalProperties": false,
"properties": {
"category": {
"type": "string"
}
},
"required": [
"category"
],
"type": "object"
}start_operation
oracle_erporacle_erp: execute start operation in the task world.
{
"additionalProperties": false,
"properties": {
"sequence": {
"type": "integer"
},
"work_order_id": {
"type": "string"
}
},
"required": [
"work_order_id",
"sequence"
],
"type": "object"
}submit_answer
factory_harnessfactory_harness: execute submit answer in the task world.
{
"additionalProperties": true,
"properties": {},
"required": [],
"type": "object"
}Architecture comparison
The same evaluation spine, assembled for manufacturing ERP
Archipelago and FactoryBench share the central idea that an agent should act through tools in an isolated world and be graded from observable outcomes. FactoryBench adds a released Oracle-shaped schema, task-level control checks, exact answer fields, and full public oracle replays.
Inspect ArchipelagoReplay the work
Trajectories
Replay one real oracle episode from each workflow family, including tool arguments, compact outcomes, and links to the full state diff and verifier report.
- 1Policy
search_documentsok{ "category": "order_release" }{"documents": [{"body": "Release only when the customer is not on credit hold, an effective BOM exists, and every component has enough available stock. Reserve the exact BOM quantity.", "category": "order_release", "doc_id": "POL-01", "sha256": "f02d22e29d62e78093fa85720ae5d9dcd6620f34621e0b615bdc04230e020876", "title": "Order release control"}]}
- 2Inspect
get_sales_orderok{ "sales_order_id": "SO-0001" }{"header": {"credit_hold": 0, "customer_name": "Atlas Systems 1", "priority": "Standard", "requested_date": "2026-01-16", "sales_order_id": "SO-0001", "status": "Booked", "task_id": "factorybench-001"}, "lines": [{"item_id": "FG-PANEL", "line_no": 1, "ordered_qty": 5.0, "sales_order_id": "SO-0001", "shipped_qty": 0.0}]}
- 3Inspect
get_bomok{ "as_of": "2026-01-12", "item_id": "FG-PANEL" }{"components": [{"bom_id": "BOM-PANEL-C", "component_item_id": "RM-HOUSING", "operation_sequence": 10, "quantity_per": 1.0, "yield_factor": 1.0}, {"bom_id": "BOM-PANEL-C", "component_item_id": "RM-COPPER", "operation_sequence": 20, "quantity_per": 1.0, "yield_factor": 1.0}, {"bom_id": "BOM-PANEL-C", "component_item_id": "RM-RELAY", "operation_sequence": 20, …
- 4Inspect
get_inventoryok{ "item_ids": [ "RM-HOUSING", "RM-RELAY", "RM-COPPER" ], "plant_id": "SEA" }{"lots": [{"available_qty": 7.0, "expiration_date": null, "item_id": "RM-COPPER", "lot_number": "C-001", "plant_id": "SEA", "quantity": 7.0, "reserved_qty": 0.0, "status": "Unrestricted", "subinventory": "STORES"}, {"available_qty": 8.0, "expiration_date": null, "item_id": "RM-HOUSING", "lot_number": "H-001", "plant_id": "SEA", "quantity": 8.0, "reserved_qty…
- 5Transact
create_work_orderok{ "item_id": "FG-PANEL", "quantity": 5, "sales_order_id": "SO-0001", "scheduled_completion": "2026-01-16", "scheduled_start": "2026-01-13", "work_order_id": "WO-0001", "workcenter_id": "WC-ASM-1" }{"requirements_created": 3, "status": "Released", "work_order_id": "WO-0001"}
- 6Transact
reserve_materialok{ "item_id": "RM-HOUSING", "lot_number": "H-001", "plant_id": "SEA", "quantity": 5, "reservation_id": "RES-H-001", "subinventory": "STORES", "work_order_id": "WO-0001" }{"reservation_id": "RES-H-001", "status": "Active"}
- 7Transact
reserve_materialok{ "item_id": "RM-RELAY", "lot_number": "R-001", "plant_id": "SEA", "quantity": 10, "reservation_id": "RES-R-001", "subinventory": "STORES", "work_order_id": "WO-0001" }{"reservation_id": "RES-R-001", "status": "Active"}
- 8Transact
reserve_materialok{ "item_id": "RM-COPPER", "lot_number": "C-001", "plant_id": "SEA", "quantity": 5, "reservation_id": "RES-C-001", "subinventory": "STORES", "work_order_id": "WO-0001" }{"reservation_id": "RES-C-001", "status": "Active"}
- 9Submit
submit_answerok{ "completion_date": "2026-01-16", "released_quantity": 5, "work_order_id": "WO-0001" }{"submitted": {"completion_date": "2026-01-16", "released_quantity": "5", "work_order_id": "WO-0001"}, "task_id": "factorybench-001"}
Methodology
How the numbers are made
The benchmark is grounded in production-style ERP controls while remaining synthetic, clean-room, and fully reproducible.
One metric, inspectable evidence
FactoryScore is the mean percentage of deterministic checks passed. Each task checks required reads before writes, exact ERP state transitions, exact answer fields, write-scope containment, and tool-call validity. Strict completion is shown as supporting evidence, not a second benchmark metric.
Real workflow shape, synthetic company data
The suite is a clean-room simulation shaped by real manufacturing operations: multi-record order intake, SKU and supplier preflight, approval limits, transactional rollback, lot-level inventory, tax-and-amount reconciliation, and production recovery. It contains no Oracle binaries, proprietary screens, customer records, or copied benchmark tasks.
Qualification before publication
The release replays every reference workflow, replays a deterministic sample twice, runs three negative controls, and removes every reference mutation one at a time. Qualification passed: 100/100 reference strict passes; 240/240 mutation omissions were detected; impaired controls remain below the oracle.
Public inspirations and design boundary
Enterprise-Bench informed noisy multi-system task framing; ERP-Bench informed long-horizon manufacturing coverage; Mercor APEX informed the public task, asset, environment, and trajectory presentation. FactoryBench tasks, records, tools, and verifiers are independently authored and executable under this repository's licenses.
Run it yourself
The tasks, world, trajectories, and verifiers are public.
Download the rows, run the Harbor tasks, inspect every synthetic record, and submit the first version-pinned model result.