Can an agent run the ERP transaction end to end—not just read the record?
ERPBench-100 measures transactional ERP execution across ten synthetic tenants running an Oracle-Fusion-shaped system of record. The agent must find the operative batch, note, roster or policy, reconcile it against live ERP records, recompute the quantities and amounts, decide what policy actually permits, commit the sales order, receipt, requisition, receipt request, invoice, document, absence, hire or price change, log the register, and leave a review-only handoff.
The tasks are solvable; the qualification controls are not model rows. All 100 oracle episodes reached 100 ERPScore, all 100/100 deterministic replays matched, 600 adversarial episodes across 6 control families produced 0 strict false accepts, and no untouched tenant seed satisfied any ERP-state criterion. A ranked model appears only after a complete version-pinned run on this exact release.
- Assets per task
- 28
- Evidence reads
- 15
- Exact criteria
- 34
- Native formats
- 8
The ten workflow families mirror the ERP archetypes that real customers run through Nario's dataflywheel—order import, shipment verification, unpaid-invoice reconciliation, reorder monitoring, procure-to-pay, document expiry, work-report rollups, channel-order sync, recruitment quotas, and effective-dated record supersession. Only the shape of that work is reused: every tenant, person, item, quantity, amount, document and message is synthetic. Public Enterprise-Bench, ERP-Bench, APEX and Archipelago materials informed what a reproducible ERP benchmark should expose; nothing gated was downloaded or scraped.
Measured performance
Leaderboard
ERPScore is the mean deterministic outcome score across all 100 tasks. Qualification controls stay below the ranked table so an oracle can never masquerade as a model result.
Model leaderboard
Only complete, version-pinned model runs on this exact release receive a rank.
Measured controls
Oracle and adversarial replays prove solvability and verifier discrimination. They are measured, but never ranked as model submissions.
100 distinct tasks
Task browser
Every task is an independently authored, high-level employee request over one frozen ERP tenant. Open any row to inspect the prompt, 28-file evidence room, policy alternatives, and all 34 checks.
Import the customer's consolidated order
**Northbridge Fastener Works · Toledo plant · Customer order import** Cascade Assembly Inc. sent their consolidated CA-PO-77310 order as a spreadsheet this morning and wants it confirmed today. Get it into the system properly: check every line against what we already imported for that purchase order and against the items we still sell, price it from the current list rather than whatever the spreadsheet says, and respect the customer's credit standing before you submit anything. Log the import in the ops register and get a reply to Dana Whitfield ready for review. Use the evidence available in the connected systems. Leave unrelated records and other tenants unchanged, keep outbound communication in review status, and do not claim completion until the durable state and readbacks agree.
- Company
- NORTHBRIDGE
- As of
- 2026-02-09T09:00:00Z
- Seeded files
- 28
- Reference solution
- 27 MCP calls
Complete task prompt
34 graded criteria summarized**Northbridge Fastener Works · Toledo plant · Customer order import**
Cascade Assembly Inc. sent their consolidated CA-PO-77310 order as a spreadsheet this morning and wants it confirmed today. Get it into the system properly: check every line against what we already imported for that purchase order and against the items we still sell, price it from the current list rather than whatever the spreadsheet says, and respect the customer's credit standing before you submit anything. Log the import in the ops register and get a reply to Dana Whitfield ready for review.
Use the evidence available in the connected systems. Leave unrelated records and other tenants unchanged, keep outbound communication in review status, and do not claim completion until the durable state and readbacks agree.Reasoning, persisted state, and the answer must agree.
An operative-source and ERP-calculation chain ending in committed Oracle-shaped transaction state, a register row, a decision record, and review-only communication.
- Strict success
- The exact current sources, recomputed quantities and amounts, decision, committed ERP records, register and handoff, readbacks, and containment all agree.
- Ordering policy
- Exact call order is not graded; required investigations must precede the first controlled ERP write and each write must be read back.
Inspect the task-specific causal milestones
- discoverydiscovery
Discovery contributes 15 ERPScore points.
- calculationcalculation
ERP calculation contributes 25 ERPScore points.
- decisiondecision
Decision contributes 15 ERPScore points.
- erp_stateerp_state
Committed ERP state contributes 20 ERPScore points.
- handoffhandoff
Register and handoff contributes 10 ERPScore points.
- readbackreadback
Readback contributes 10 ERPScore points.
- containmentcontainment
Containment contributes 5 ERPScore points.
Decision space (4 grounded options)
- Import the accepted lines at current list prices and submit the order — selected: Matches the operative source, the recomputed quantities and the tenant's policy.
- Import the accepted lines but hold submission for credit release: Policy-shaped alternative whose conditions the current evidence does not support.
- Import every spreadsheet line at the spreadsheet prices: Ignores duplicates, tolerance, expiry, quota, band or supersession rules and writes unsupported state.
- Stop and escalate the whole batch without importing: Fails to distinguish the controlled work the analyst is authorized to complete from the items that need approval.
Inspect all 34 deterministic criteria
- discovery: Before any controlled write, read the task contract (any listed route counts). (1 pts)
- discovery: Before any controlled write, read the operating request in the mailbox (any listed route counts). (1 pts)
- discovery: Before any controlled write, establish which sources are current authority (any listed route counts). (1 pts)
- discovery: Before any controlled write, read the ops channel thread for the task (any listed route counts). (1 pts)
- discovery: Before any controlled write, read the ops register before writing to it (any listed route counts). (1 pts)
- discovery: Before any controlled write, read the item master or current price list (any listed route counts). (1 pts)
- discovery: Before any controlled write, index the shared drive for current and superseded versions (any listed route counts). (1 pts)
- discovery: Before any controlled write, locate the consolidated order batch (any listed route counts). (1 pts)
- discovery: Before any controlled write, read the consolidated order batch (any listed route counts). (1 pts)
- discovery: Before any controlled write, read the earlier partial import (any listed route counts). (1 pts)
- discovery: Before any controlled write, check the sales orders already on the purchase order (any listed route counts). (1 pts)
- discovery: Before any controlled write, check the customer's credit standing (any listed route counts). (1 pts)
- discovery: Before any controlled write, recognise the superseded price list (any listed route counts). (1 pts)
- discovery: Before any controlled write, read the audit trail for the purchase order (any listed route counts). (1 pts)
- discovery: Before any controlled write, confirm the customer master record (any listed route counts). (1 pts)
- calculation: Submit the exact evidence-grounded accepted lines (5). (5 pts)
- calculation: Submit the exact evidence-grounded rejected lines (3). (5 pts)
- calculation: Submit the exact evidence-grounded imported units (3160). (5 pts)
- calculation: Submit the exact evidence-grounded order total (2757.6). (5 pts)
- calculation: Submit the exact evidence-grounded duplicate lines (2). (5 pts)
- decision: Select the policy-supported option import_accepted_lines_and_submit. (10 pts)
- decision: Ground the decision in the operative source FILE-NBR-ORDER-BATCH-0209 rather than a superseded version. (5 pts)
- erp_state: Persist the primary ERP transaction with the exact provider-critical values. (10 pts)
- erp_state: Persist the workflow-specific secondary ERP state (submission, hold, validation, alerts, or absence records) and nothing that policy forbids. (4 pts)
- erp_state: Write the exact task row to the controlled ops register range. (3 pts)
- erp_state: Record the decision with status, primary record, rationale and source references. (3 pts)
- handoff: Save a review-only email draft that states the option, the key figures and the primary record. (5 pts)
- handoff: Post the review handoff to the ops channel with the decision status. (5 pts)
- readback: Read the ERP record back after the primary write. (3 pts)
- readback: Read back the register row and the decision record after committing them. (3 pts)
- readback: Read back the email draft and channel history before submission. (2 pts)
- readback: Read back the durable task submission. (2 pts)
- containment: Leave every unrelated tenant record unchanged and make no rejected calls. (3 pts)
- containment: Keep outbound communication in review status and never apply an unauthorized credit, hire or price change. (2 pts)
Seeded evidence
Asset room
Order batches, prior partial imports, current and superseded price lists, pick confirmations, remittance advices, aging, policies, delivery notes, supplier invoices, compliance checklists, rosters, work reports, channel exports, headcount approvals, candidate registers, price batches, memos and audit logs are all visible.
01-consolidated-order-batch.xlsxassets/northbridgeOperativeXLSX4.5 KB
02-prior-partial-import.xlsxassets/northbridgeXLSX2.9 KB
03-current-price-list.csvassets/northbridgeOperativeCSV404 B
04-superseded-price-list.csvassets/northbridgeCSV443 B
05-pick-confirmation.csvassets/northbridgeOperativeCSV421 B
06-remittance-advice.pdfassets/northbridgeOperativePDF950 B
07-ar-aging.xlsxassets/northbridgeXLSX3.4 KB
08-credit-policy.mdassets/northbridgeMD447 B
09-reorder-policy.xlsxassets/northbridgeOperativeXLSX3.6 KB
10-demand-forecast.csvassets/northbridgeCSV221 B
11-supplier-invoice.pdfassets/northbridgePDF982 B
12-delivery-note.pdfassets/northbridgeOperativePDF1.0 KB
13-ap-match-policy.mdassets/northbridgeMD378 B
14-compliance-checklist.xlsxassets/northbridgeOperativeXLSX5.2 KB
15-document-alert-log.csvassets/northbridgeCSV138 B
16-shift-roster.xlsxassets/northbridgeOperativeXLSX4.8 KB
17-shift-work-reports.csvassets/northbridgeCSV296 B
18-channel-export.jsonassets/northbridgeOperativeJSON1.2 KB
19-customer-capture-chat.jsonassets/northbridgeJSON417 B
20-headcount-approval.pdfassets/northbridgeOperativePDF963 B
21-candidate-register.xlsxassets/northbridgeXLSX4.0 KB
22-wage-table.csvassets/northbridgeCSV91 B
23-price-batch.csvassets/northbridgeOperativeCSV463 B
24-authority-memo.emlassets/northbridgeEML532 B
25-source-map.yamlassets/northbridgeYAML470 B
26-ops-audit.logassets/northbridgeLOG290 B
task-brief.mdassets/tasks/erpbench-001OperativeMD938 B
starting-snapshot.jsonassets/tasks/erpbench-001JSON400 B
Runnable world
Environment and tool contract
Six MCP servers expose one isolated SQLite tenant: Oracle-Fusion-shaped order management, shipping, receivables, inventory, procurement, payables and HCM resources next to Gmail, Drive, Sheets and Slack. Every controlled write is durable, task-scoped, and checked against the complete before/after state.
erpbench.get_task
Read the task-scoped outcome contract without revealing the gold answer.
{
"additionalProperties": false,
"properties": {
"task_id": {
"description": "Task identifier",
"type": "string"
}
},
"required": [
"task_id"
],
"type": "object"
}erpbench.get_decision
Read back the durable decision record for a task.
{
"additionalProperties": false,
"properties": {
"task_id": {
"description": "Task identifier",
"type": "string"
}
},
"required": [
"task_id"
],
"type": "object"
}erpbench.get_submission
Read back the durable submitted answer.
{
"additionalProperties": false,
"properties": {
"task_id": {
"description": "Task identifier",
"type": "string"
}
},
"required": [
"task_id"
],
"type": "object"
}erpbench.record_decision
Record the selected option, status, primary ERP record, rationale and source references.
{
"additionalProperties": false,
"properties": {
"decision": {
"description": "Selected option",
"type": "string"
},
"primary_record": {
"description": "Primary ERP record number",
"type": "string"
},
"rationale": {
"description": "Rationale",
"type": "string"
},
"source_refs": {
"description": "Source references",
"items": {
"type": "string"
},
"type": "array"
},
"status": {
"description": "Decision status",
"type": "string"
},
"task_id": {
"description": "Active task identifier; every write must carry it",
"type": "string"
}
},
"required": [
"task_id",
"decision",
"status",
"primary_record",
"rationale",
"source_refs"
],
"type": "object"
}erpbench.submit_answer
Persist the structured final answer for deterministic grading.
{
"additionalProperties": false,
"properties": {
"answers": {
"additionalProperties": true,
"description": "Task-specific answer",
"type": "object"
},
"task_id": {
"description": "Active task identifier; every write must carry it",
"type": "string"
}
},
"required": [
"task_id",
"answers"
],
"type": "object"
}oracle_fusion.items.list
Get items for an inventory organization.
GET /fscmRestApi/resources/11.13.18.05/itemsV2Open provider documentation {
"additionalProperties": false,
"properties": {
"q": {
"description": "Provider query expression, e.g. Field='value' and Other='value'",
"type": "string"
}
},
"required": [],
"type": "object"
}oracle_fusion.items.update
Update the list price of one item as of an effective date.
PATCH /fscmRestApi/resources/11.13.18.05/itemsV2/{itemsV2UniqID}Open provider documentation {
"additionalProperties": false,
"properties": {
"EffectiveDate": {
"description": "ISO effective date",
"type": "string"
},
"ItemId": {
"description": "Item identifier",
"type": "integer"
},
"ListPrice": {
"description": "New list price",
"type": "number"
},
"task_id": {
"description": "Active task identifier; every write must carry it",
"type": "string"
}
},
"required": [
"task_id",
"ItemId",
"ListPrice",
"EffectiveDate"
],
"type": "object"
}oracle_fusion.customer_account_activities.get
Get one customer account with open receivables and credit status.
GET /fscmRestApi/resources/11.13.18.05/receivablesCustomerAccountActivities/{AccountId}Open provider documentation {
"additionalProperties": false,
"properties": {
"AccountId": {
"description": "Customer account number",
"type": "string"
}
},
"required": [
"AccountId"
],
"type": "object"
}oracle_fusion.sales_orders.list
Get sales orders from Order Management.
GET /fscmRestApi/resources/11.13.18.05/salesOrdersForOrderHubOpen provider documentation {
"additionalProperties": false,
"properties": {
"q": {
"description": "Provider query expression, e.g. Field='value' and Other='value'",
"type": "string"
}
},
"required": [],
"type": "object"
}oracle_fusion.sales_orders.get
Get one sales order with its lines.
GET /fscmRestApi/resources/11.13.18.05/salesOrdersForOrderHub/{OrderKey}Open provider documentation {
"additionalProperties": false,
"properties": {
"OrderKey": {
"description": "Order number",
"type": "string"
}
},
"required": [
"OrderKey"
],
"type": "object"
}oracle_fusion.sales_orders.create
Create one sales order; SubmittedFlag false leaves it as a draft awaiting release.
POST /fscmRestApi/resources/11.13.18.05/salesOrdersForOrderHubOpen provider documentation {
"additionalProperties": false,
"properties": {
"BuyingPartyName": {
"description": "Customer name when no account exists",
"type": "string"
},
"BuyingPartyNumber": {
"description": "Customer account number",
"type": "string"
},
"CustomerPONumber": {
"description": "Customer purchase order",
"type": "string"
},
"OrderTotal": {
"description": "Header total when lines are not itemized",
"type": "number"
},
"RequestedFulfillmentOrganizationCode": {
"description": "Fulfillment organization",
"type": "string"
},
"SourceTransactionNumber": {
"description": "Source document reference",
"type": "string"
},
"SourceTransactionSystem": {
"description": "Source system",
"type": "string"
},
"SubmittedFlag": {
"description": "Submit the order",
"type": "boolean"
},
"TransactionType": {
"description": "Order type",
"type": "string"
},
"lines": {
"description": "Order lines: ProductNumber, OrderedQuantity, OrderedUOM, UnitListPrice",
"items": {},
"type": "array"
},
"task_id": {
"description": "Active task identifier; every write must carry it",
"type": "string"
}
},
"required": [
"task_id",
"SourceTransactionNumber",
"SourceTransactionSystem",
"CustomerPONumber",
"TransactionType",
"RequestedFulfillmentOrganizationCode",
"SubmittedFlag"
],
"type": "object"
}oracle_fusion.shipments.list
Get shipments.
GET /fscmRestApi/resources/11.13.18.05/shipmentsOpen provider documentation {
"additionalProperties": false,
"properties": {
"q": {
"description": "Provider query expression, e.g. Field='value' and Other='value'",
"type": "string"
}
},
"required": [],
"type": "object"
}oracle_fusion.shipment_lines.list
Get shipment lines with requested and shipped quantities.
GET /fscmRestApi/resources/11.13.18.05/shipmentLinesOpen provider documentation {
"additionalProperties": false,
"properties": {
"q": {
"description": "Provider query expression, e.g. Field='value' and Other='value'",
"type": "string"
}
},
"required": [],
"type": "object"
}oracle_fusion.shipment_lines.update
Update the shipped quantity of one unconfirmed shipment line.
PATCH /fscmRestApi/resources/11.13.18.05/shipmentLines/{ShipmentLine}Open provider documentation {
"additionalProperties": false,
"properties": {
"Comments": {
"description": "Reason",
"type": "string"
},
"ShipmentLine": {
"description": "Shipment line identifier",
"type": "integer"
},
"ShippedQuantity": {
"description": "Corrected shipped quantity",
"type": "integer"
},
"task_id": {
"description": "Active task identifier; every write must carry it",
"type": "string"
}
},
"required": [
"task_id",
"ShipmentLine",
"ShippedQuantity"
],
"type": "object"
}oracle_fusion.receivables_invoices.list
Get receivables invoices.
GET /fscmRestApi/resources/11.13.18.05/receivablesInvoicesOpen provider documentation {
"additionalProperties": false,
"properties": {
"q": {
"description": "Provider query expression, e.g. Field='value' and Other='value'",
"type": "string"
}
},
"required": [],
"type": "object"
}oracle_fusion.receivables_invoices.get
Get one receivables invoice.
GET /fscmRestApi/resources/11.13.18.05/receivablesInvoices/{CustomerTransactionId}Open provider documentation {
"additionalProperties": false,
"properties": {
"CustomerTransactionId": {
"description": "Transaction identifier",
"type": "integer"
}
},
"required": [
"CustomerTransactionId"
],
"type": "object"
}oracle_fusion.standard_receipts.list
Get standard receipts for a customer account.
GET /fscmRestApi/resources/11.13.18.05/standardReceiptsOpen provider documentation {
"additionalProperties": false,
"properties": {
"q": {
"description": "Provider query expression, e.g. Field='value' and Other='value'",
"type": "string"
}
},
"required": [],
"type": "object"
}oracle_fusion.standard_receipts.create
Create a standard receipt and apply it through remittance references.
POST /fscmRestApi/resources/11.13.18.05/standardReceiptsOpen provider documentation {
"additionalProperties": false,
"properties": {
"BusinessUnit": {
"description": "Business unit",
"type": "string"
},
"Currency": {
"description": "Currency",
"type": "string"
},
"CustomerAccountNumber": {
"description": "Customer account number",
"type": "string"
},
"ReceiptAmount": {
"description": "Receipt amount",
"type": "number"
},
"ReceiptDate": {
"description": "ISO receipt date",
"type": "string"
},
"ReceiptMethod": {
"description": "Receipt method",
"type": "string"
},
"ReceiptNumber": {
"description": "Receipt number",
"type": "string"
},
"remittanceReferences": {
"description": "Rows of ReferenceType, ReferenceNumber, ApplyAmount",
"items": {},
"type": "array"
},
"task_id": {
"description": "Active task identifier; every write must carry it",
"type": "string"
}
},
"required": [
"task_id",
"ReceiptNumber",
"ReceiptAmount",
"ReceiptDate",
"CustomerAccountNumber",
"ReceiptMethod",
"BusinessUnit",
"Currency",
"remittanceReferences"
],
"type": "object"
}oracle_fusion.onhand_balances.list
Get on-hand and reserved quantities.
GET /fscmRestApi/resources/11.13.18.05/inventoryOnhandBalancesOpen provider documentation {
"additionalProperties": false,
"properties": {
"q": {
"description": "Provider query expression, e.g. Field='value' and Other='value'",
"type": "string"
}
},
"required": [],
"type": "object"
}oracle_fusion.purchase_orders.list
Get purchase orders.
GET /fscmRestApi/resources/11.13.18.05/purchaseOrdersOpen provider documentation {
"additionalProperties": false,
"properties": {
"q": {
"description": "Provider query expression, e.g. Field='value' and Other='value'",
"type": "string"
}
},
"required": [],
"type": "object"
}oracle_fusion.purchase_orders.get
Get one purchase order.
GET /fscmRestApi/resources/11.13.18.05/purchaseOrders/{purchaseOrdersUniqID}Open provider documentation {
"additionalProperties": false,
"properties": {
"purchaseOrdersUniqID": {
"description": "Purchase order number",
"type": "string"
}
},
"required": [
"purchaseOrdersUniqID"
],
"type": "object"
}oracle_fusion.purchase_order_lines.list
Get the lines of one purchase order.
GET /fscmRestApi/resources/11.13.18.05/purchaseOrders/{purchaseOrdersUniqID}/child/linesOpen provider documentation {
"additionalProperties": false,
"properties": {
"purchaseOrdersUniqID": {
"description": "Purchase order number",
"type": "string"
}
},
"required": [
"purchaseOrdersUniqID"
],
"type": "object"
}oracle_fusion.suppliers.list
Get suppliers with lead times.
GET /fscmRestApi/resources/11.13.18.05/suppliersOpen provider documentation {
"additionalProperties": false,
"properties": {
"q": {
"description": "Provider query expression, e.g. Field='value' and Other='value'",
"type": "string"
}
},
"required": [],
"type": "object"
}oracle_fusion.purchase_requisitions.create
Create a purchase requisition with lines.
POST /fscmRestApi/resources/11.13.18.05/purchaseRequisitionsOpen provider documentation {
"additionalProperties": false,
"properties": {
"Description": {
"description": "Description",
"type": "string"
},
"Justification": {
"description": "Justification",
"type": "string"
},
"Preparer": {
"description": "Preparer",
"type": "string"
},
"RequisitioningBU": {
"description": "Requisitioning business unit",
"type": "string"
},
"lines": {
"description": "Lines: ItemNumber, Quantity, UOM, UnitPrice, Supplier, RequestedDeliveryDate",
"items": {},
"type": "array"
},
"task_id": {
"description": "Active task identifier; every write must carry it",
"type": "string"
}
},
"required": [
"task_id",
"RequisitioningBU",
"Preparer",
"Description",
"Justification",
"lines"
],
"type": "object"
}oracle_fusion.purchase_requisitions.submit
Submit a requisition for approval.
POST /fscmRestApi/resources/11.13.18.05/purchaseRequisitions/{purchaseRequisitionsUniqID}/action/submitRequisitionOpen provider documentation {
"additionalProperties": false,
"properties": {
"purchaseRequisitionsUniqID": {
"description": "Requisition number",
"type": "string"
},
"task_id": {
"description": "Active task identifier; every write must carry it",
"type": "string"
}
},
"required": [
"task_id",
"purchaseRequisitionsUniqID"
],
"type": "object"
}oracle_fusion.purchase_requisitions.get
Get one purchase requisition.
GET /fscmRestApi/resources/11.13.18.05/purchaseRequisitions/{purchaseRequisitionsUniqID}Open provider documentation {
"additionalProperties": false,
"properties": {
"purchaseRequisitionsUniqID": {
"description": "Requisition number",
"type": "string"
}
},
"required": [
"purchaseRequisitionsUniqID"
],
"type": "object"
}oracle_fusion.receiving_receipt_requests.list
Get receiving receipt requests.
GET /fscmRestApi/resources/11.13.18.05/receivingReceiptRequestsOpen provider documentation {
"additionalProperties": false,
"properties": {
"q": {
"description": "Provider query expression, e.g. Field='value' and Other='value'",
"type": "string"
}
},
"required": [],
"type": "object"
}oracle_fusion.receiving_receipt_requests.create
Create a receiving receipt request for delivered purchase-order lines.
POST /fscmRestApi/resources/11.13.18.05/receivingReceiptRequestsOpen provider documentation {
"additionalProperties": false,
"properties": {
"OrganizationCode": {
"description": "Organization",
"type": "string"
},
"ReceiptSourceCode": {
"description": "Receipt source",
"type": "string"
},
"VendorName": {
"description": "Supplier",
"type": "string"
},
"lines": {
"description": "Lines: DocumentNumber, DocumentLineNumber, ItemNumber, Quantity, TransactionType",
"items": {},
"type": "array"
},
"task_id": {
"description": "Active task identifier; every write must carry it",
"type": "string"
}
},
"required": [
"task_id",
"ReceiptSourceCode",
"OrganizationCode",
"lines"
],
"type": "object"
}oracle_fusion.invoices.list
Get Payables invoices.
GET /fscmRestApi/resources/11.13.18.05/invoicesOpen provider documentation {
"additionalProperties": false,
"properties": {
"q": {
"description": "Provider query expression, e.g. Field='value' and Other='value'",
"type": "string"
}
},
"required": [],
"type": "object"
}oracle_fusion.invoices.get
Get one Payables invoice with holds.
GET /fscmRestApi/resources/11.13.18.05/invoices/{invoicesUniqID}Open provider documentation {
"additionalProperties": false,
"properties": {
"invoicesUniqID": {
"description": "Invoice number",
"type": "string"
}
},
"required": [
"invoicesUniqID"
],
"type": "object"
}oracle_fusion.invoices.create
Create one Payables invoice matched to purchase-order lines.
POST /fscmRestApi/resources/11.13.18.05/invoicesOpen provider documentation {
"additionalProperties": false,
"properties": {
"BusinessUnit": {
"description": "Business unit",
"type": "string"
},
"InvoiceAmount": {
"description": "Invoice amount",
"type": "number"
},
"InvoiceCurrency": {
"description": "Currency",
"type": "string"
},
"InvoiceDate": {
"description": "ISO invoice date",
"type": "string"
},
"InvoiceNumber": {
"description": "Invoice number",
"type": "string"
},
"Supplier": {
"description": "Supplier",
"type": "string"
},
"invoiceLines": {
"description": "Lines: LineNumber, PurchaseOrderNumber, PurchaseOrderLineNumber, ItemNumber, Quantity, UnitPrice",
"items": {},
"type": "array"
},
"task_id": {
"description": "Active task identifier; every write must carry it",
"type": "string"
}
},
"required": [
"task_id",
"BusinessUnit",
"Supplier",
"InvoiceNumber",
"InvoiceAmount",
"InvoiceCurrency",
"InvoiceDate",
"invoiceLines"
],
"type": "object"
}oracle_fusion.invoices.validate
Validate an invoice for payment.
POST /fscmRestApi/resources/11.13.18.05/invoices/action/validateInvoiceOpen provider documentation {
"additionalProperties": false,
"properties": {
"BusinessUnit": {
"description": "Business unit",
"type": "string"
},
"InvoiceNumber": {
"description": "Invoice number",
"type": "string"
},
"ProcessAction": {
"description": "Must be Validate",
"type": "string"
},
"Supplier": {
"description": "Supplier",
"type": "string"
},
"task_id": {
"description": "Active task identifier; every write must carry it",
"type": "string"
}
},
"required": [
"task_id",
"ProcessAction",
"BusinessUnit",
"Supplier",
"InvoiceNumber"
],
"type": "object"
}oracle_fusion.invoice_holds.create
Place one Payables invoice on hold with a reason.
POST /fscmRestApi/resources/11.13.18.05/invoiceHoldsOpen provider documentation {
"additionalProperties": false,
"properties": {
"HoldName": {
"description": "Hold name",
"type": "string"
},
"HoldReason": {
"description": "Hold reason",
"type": "string"
},
"InvoiceId": {
"description": "Invoice identifier",
"type": "integer"
},
"task_id": {
"description": "Active task identifier; every write must carry it",
"type": "string"
}
},
"required": [
"task_id",
"InvoiceId",
"HoldName",
"HoldReason"
],
"type": "object"
}oracle_fusion.workers.list
Get workers for a legal employer.
GET /hcmRestApi/resources/11.13.18.05/workersOpen provider documentation {
"additionalProperties": false,
"properties": {
"q": {
"description": "Provider query expression, e.g. Field='value' and Other='value'",
"type": "string"
}
},
"required": [],
"type": "object"
}oracle_fusion.workers.create
Hire one worker under a standard contract.
POST /hcmRestApi/resources/11.13.18.05/workersOpen provider documentation {
"additionalProperties": false,
"properties": {
"CandidateId": {
"description": "Candidate identifier",
"type": "string"
},
"ContractEndDate": {
"description": "ISO contract end",
"type": "string"
},
"DisplayName": {
"description": "Display name",
"type": "string"
},
"HireDate": {
"description": "ISO hire date",
"type": "string"
},
"JobCode": {
"description": "Job",
"type": "string"
},
"LegalEmployerName": {
"description": "Legal employer",
"type": "string"
},
"MonthlySalary": {
"description": "Monthly salary",
"type": "number"
},
"PersonNumber": {
"description": "Person number",
"type": "string"
},
"task_id": {
"description": "Active task identifier; every write must carry it",
"type": "string"
}
},
"required": [
"task_id",
"PersonNumber",
"DisplayName",
"LegalEmployerName",
"JobCode",
"HireDate",
"ContractEndDate",
"MonthlySalary",
"CandidateId"
],
"type": "object"
}oracle_fusion.document_records.list
Get worker documents of record with expiry and check status.
GET /hcmRestApi/resources/11.13.18.05/documentRecordsOpen provider documentation {
"additionalProperties": false,
"properties": {
"q": {
"description": "Provider query expression, e.g. Field='value' and Other='value'",
"type": "string"
}
},
"required": [],
"type": "object"
}oracle_fusion.document_records.update
Update the status or verification flag of one document record.
PATCH /hcmRestApi/resources/11.13.18.05/documentRecords/{DocumentRecordId}Open provider documentation {
"additionalProperties": false,
"properties": {
"DocumentRecordId": {
"description": "Document record identifier",
"type": "integer"
},
"Status": {
"description": "New status, e.g. ALERTED",
"type": "string"
},
"VerifiedFlag": {
"description": "Mark the mandatory check verified",
"type": "boolean"
},
"task_id": {
"description": "Active task identifier; every write must carry it",
"type": "string"
}
},
"required": [
"task_id",
"DocumentRecordId"
],
"type": "object"
}oracle_fusion.absences.list
Get absence records.
GET /hcmRestApi/resources/11.13.18.05/absencesOpen provider documentation {
"additionalProperties": false,
"properties": {
"q": {
"description": "Provider query expression, e.g. Field='value' and Other='value'",
"type": "string"
}
},
"required": [],
"type": "object"
}oracle_fusion.absences.create
Record one absence for a worker.
POST /hcmRestApi/resources/11.13.18.05/absencesOpen provider documentation {
"additionalProperties": false,
"properties": {
"absenceStatusCd": {
"description": "Status code",
"type": "string"
},
"absenceType": {
"description": "Absence type",
"type": "string"
},
"employer": {
"description": "Legal employer",
"type": "string"
},
"endDate": {
"description": "ISO end",
"type": "string"
},
"personNumber": {
"description": "Person number",
"type": "string"
},
"startDate": {
"description": "ISO start",
"type": "string"
},
"task_id": {
"description": "Active task identifier; every write must carry it",
"type": "string"
}
},
"required": [
"task_id",
"personNumber",
"absenceType",
"startDate",
"endDate",
"employer",
"absenceStatusCd"
],
"type": "object"
}gmail.messages.list
Search mailbox messages.
{
"additionalProperties": false,
"properties": {
"q": {
"description": "Gmail search query",
"type": "string"
}
},
"required": [
"q"
],
"type": "object"
}gmail.messages.get
Read one mailbox message.
{
"additionalProperties": false,
"properties": {
"id": {
"description": "Message identifier",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
}gmail.drafts.create
Save a review-only email draft; drafts are never sent by the sandbox.
{
"additionalProperties": false,
"properties": {
"body": {
"description": "Body",
"type": "string"
},
"subject": {
"description": "Subject",
"type": "string"
},
"task_id": {
"description": "Active task identifier; every write must carry it",
"type": "string"
},
"to": {
"description": "Recipient",
"type": "string"
}
},
"required": [
"task_id",
"to",
"subject",
"body"
],
"type": "object"
}gmail.drafts.get
Read back one draft.
{
"additionalProperties": false,
"properties": {
"id": {
"description": "Draft identifier",
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
}google_drive.files.list
List files; supports name contains 'text'.
{
"additionalProperties": false,
"properties": {
"q": {
"description": "Drive query",
"type": "string"
}
},
"required": [
"q"
],
"type": "object"
}google_drive.files.get
Read file metadata, version and current-authority flag.
{
"additionalProperties": false,
"properties": {
"fileId": {
"description": "File identifier",
"type": "string"
}
},
"required": [
"fileId"
],
"type": "object"
}google_drive.files.download
Download the content of one file.
{
"additionalProperties": false,
"properties": {
"fileId": {
"description": "File identifier",
"type": "string"
}
},
"required": [
"fileId"
],
"type": "object"
}google_sheets.spreadsheets.values.get
Read a range from the ops workbook.
GET /v4/spreadsheets/{spreadsheetId}/values/{range}Open provider documentation {
"additionalProperties": false,
"properties": {
"range": {
"description": "A1 range",
"type": "string"
},
"spreadsheetId": {
"description": "Spreadsheet identifier",
"type": "string"
}
},
"required": [
"spreadsheetId",
"range"
],
"type": "object"
}google_sheets.spreadsheets.values.update
Write one controlled range; other cells are preserved.
PUT /v4/spreadsheets/{spreadsheetId}/values/{range}Open provider documentation {
"additionalProperties": false,
"properties": {
"range": {
"description": "A1 range",
"type": "string"
},
"spreadsheetId": {
"description": "Spreadsheet identifier",
"type": "string"
},
"task_id": {
"description": "Active task identifier; every write must carry it",
"type": "string"
},
"valueInputOption": {
"description": "RAW or USER_ENTERED",
"type": "string"
},
"values": {
"description": "Two-dimensional values",
"items": {},
"type": "array"
}
},
"required": [
"task_id",
"spreadsheetId",
"range",
"valueInputOption",
"values"
],
"type": "object"
}google_sheets.spreadsheets.values.append
Append rows to a tab.
POST /v4/spreadsheets/{spreadsheetId}/values/{range}:appendOpen provider documentation {
"additionalProperties": false,
"properties": {
"range": {
"description": "Tab range",
"type": "string"
},
"spreadsheetId": {
"description": "Spreadsheet identifier",
"type": "string"
},
"task_id": {
"description": "Active task identifier; every write must carry it",
"type": "string"
},
"valueInputOption": {
"description": "RAW or USER_ENTERED",
"type": "string"
},
"values": {
"description": "Rows to append",
"items": {},
"type": "array"
}
},
"required": [
"task_id",
"spreadsheetId",
"range",
"valueInputOption",
"values"
],
"type": "object"
}slack.conversations_history
Read a channel's messages, including task posts.
{
"additionalProperties": false,
"properties": {
"channel": {
"description": "Channel",
"type": "string"
},
"task_id": {
"description": "Filter to one task's posts",
"type": "string"
}
},
"required": [
"channel"
],
"type": "object"
}slack.search_messages
Search messages across channels.
{
"additionalProperties": false,
"properties": {
"query": {
"description": "Search query",
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
}slack.chat_postMessage
Post the review handoff to a channel.
{
"additionalProperties": false,
"properties": {
"channel": {
"description": "Channel",
"type": "string"
},
"review_status": {
"description": "Must remain draft_for_review",
"type": "string"
},
"task_id": {
"description": "Active task identifier; every write must carry it",
"type": "string"
},
"text": {
"description": "Message",
"type": "string"
}
},
"required": [
"task_id",
"channel",
"text",
"review_status"
],
"type": "object"
}Architecture comparison
Public ERP benchmark anchors, deterministic ERPBench implementation
The public architecture is preserved where it improves reproducibility; the tenant corpus, tool surface and grading implementation are independent.
Inspect ArchipelagoReplay the work
Trajectories
Ten full reference trajectories show the request, provider-shaped calls, results, ERP writes, register and handoff, readbacks, and the deterministic verdict. They prove execution, not model capability.
- 1Scope
erpbench.get_taskok{ "task_id": "erpbench-001" }{"allowed_write_tools": ["oracle_fusion.sales_orders.create", "oracle_fusion.shipment_lines.update", "oracle_fusion.standard_receipts.create", "oracle_fusion.purchase_requisitions.create", "oracle_fusion.purchase_requisitions.submit", "oracle_fusion.receiving_receipt_requests.create", "oracle_fusion.invoices.create", "oracle_fusion.invoices.validate", "oracle_fusion.invoice_holds.create", "oracle_fusion.document_records.update", "oracle_fusion.absences.create", "oracle_fusion.workers.create", "o…
- 2Investigate
gmail.messages.getok{ "id": "MSG-erpbench-001-REQUEST" }{"body": "**Northbridge Fastener Works · Toledo plant · Customer order import**\n\nCascade Assembly Inc. sent their consolidated CA-PO-77310 order as a spreadsheet this morning and wants it confirmed today. Get it into the system properly: check every line against what we already imported for that purchase order and against the items we still sell, price it from the current list rather than whatever the spreadsheet says, and respect the customer's credit standing before you submit anything. Log …
- 3Investigate
gmail.messages.getok{ "id": "MSG-NBR-AUTHORITY-0209" }{"body": "From: marcus.lee@northbridge-sim.example\nTo: analyst@northbridge-sim.example\nSubject: Northbridge Fastener Works operating authority for February\n\nCurrent sources of truth: the 2026-02-09 order batch, the 2026-02-08 pick confirmation, the 2026-02-06 remittance advice, reorder policy R4, the 2026-02-06 delivery note, the 2026-02-09 compliance checklist, the 2026-02-08 roster, the 2026-02-09 channel export, the 2026 headcount approval and the Q2 price batch. Earlier versions are supe…
- 4Investigate
slack.conversations_historyok{ "channel": "#ops-nbr" }{"channel": "#ops-nbr", "messages": [{"text": "Partial import for CA-PO-77310 went in on 2026-02-03 as SO-NBR-40039; the rest of the lines are still pending.", "thread_ts": "THREAD-NBR-IMPORT", "ts": "2026-02-03T10:20:00Z", "user": "Marcus Lee"}, {"text": "Please resolve erpbench-001 against the current February authority; keep the handoff in review.", "thread_ts": "THREAD-erpbench-001", "ts": "2026-02-09T09:00:00Z", "user": "Marcus Lee"}, {"text": "Operative sources are listed in the source map…
- 5Investigate
google_sheets.spreadsheets.values.getok{ "range": "Register!A1:H40", "spreadsheetId": "SHEET-NBR-OPS" }{"range": "Register!A1:H40", "spreadsheetId": "SHEET-NBR-OPS", "values": [["Record", "Option", "Values", "", "", "", "", "Source"], ["SO-NBR-DECOY", "closed_manual_order", 1, 0, 1280.0, 0, 0, "MANUAL-2026-01"]]}
- 6Investigate
oracle_fusion.items.listok{ "q": "OrganizationCode='NBR1'" }{"count": 6, "items": [{"ItemDescription": "12 x 100 wedge anchor", "ItemId": 300031, "ItemNumber": "ANC-12-100", "ItemStatusValue": "Active", "ListPrice": 2.45, "OrganizationCode": "NBR1", "PriceEffectiveDate": "2026-01-01", "PrimaryUOMValue": "EA"}, {"ItemDescription": "M10 x 60 hex bolt, zinc", "ItemId": 300010, "ItemNumber": "FST-M10-60", "ItemStatusValue": "Active", "ListPrice": 1.32, "OrganizationCode": "NBR1", "PriceEffectiveDate": "2026-01-01", "PrimaryUOMValue": "EA"}, {"ItemDescription…
- 7Investigate
google_drive.files.listok{ "q": "name contains 'policy'" }{"files": [{"id": "FILE-NBR-CREDIT-POLICY-R6", "isCurrentAuthority": true, "mimeType": "text/markdown", "modifiedTime": "2026-02-09T06:00:00Z", "name": "08-credit-policy.md", "version": 2}, {"id": "FILE-NBR-REORDER-POLICY-R4", "isCurrentAuthority": true, "mimeType": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "modifiedTime": "2026-02-09T06:00:00Z", "name": "09-reorder-policy.xlsx", "version": 2}, {"id": "FILE-NBR-AP-MATCH-POLICY", "isCurrentAuthority": true, "mimeType": …
- 8Investigate
google_drive.files.listok{ "q": "name contains 'CA-PO-77310'" }{"files": [{"id": "FILE-NBR-ORDER-BATCH-0209", "isCurrentAuthority": true, "mimeType": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "modifiedTime": "2026-02-09T06:00:00Z", "name": "01-consolidated-order-batch.xlsx", "version": 2}, {"id": "FILE-NBR-ORDER-BATCH-0203", "isCurrentAuthority": false, "mimeType": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "modifiedTime": "2026-02-03T10:00:00Z", "name": "02-prior-partial-import.xlsx", "version": 2}, {"id…
- 9Investigate
google_drive.files.downloadok{ "fileId": "FILE-NBR-ORDER-BATCH-0209" }{"content": "Line,Customer PO,Item,Description,Quantity,Unit price (customer sheet)\r\n1,CA-PO-77310,FST-M8-40,\"M8 x 40 hex bolt, zinc\",1200,0.89\r\n2,CA-PO-77310,FST-M10-60,\"M10 x 60 hex bolt, zinc\",800,1.4\r\n3,CA-PO-77310,NUT-M8-NYL,M8 nylon lock nut,640,0.2\r\n4,CA-PO-77310,WSH-M10-SS,\"M10 flat washer, stainless\",300,0.12\r\n5,CA-PO-77310,FST-M8-40,\"M8 x 40 hex bolt, zinc\",450,0.89\r\n6,CA-PO-77310,ANC-12-100,12 x 100 wedge anchor,220,2.6\r\n7,CA-PO-77310,FST-M6-20-OLD,M6 x 20 hex bo…
- 10Investigate
google_drive.files.downloadok{ "fileId": "FILE-NBR-ORDER-BATCH-0203" }{"content": "Line,Customer PO,Item,Quantity,Imported order,Imported on\r\n5,CA-PO-77310,FST-M8-40,450,SO-NBR-40039,2026-02-03\r\n8,CA-PO-77310,NUT-M8-NYL,500,SO-NBR-40039,2026-02-03\r\n", "id": "FILE-NBR-ORDER-BATCH-0203", "isCurrentAuthority": false, "mimeType": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "name": "02-prior-partial-import.xlsx"}
- 11Investigate
oracle_fusion.sales_orders.listok{ "q": "CustomerPONumber='CA-PO-77310'" }{"count": 1, "items": [{"BuyingPartyName": "Cascade Assembly Inc.", "BuyingPartyNumber": "CUST-10412", "CreatedBy": "ops_lead", "CreationDate": "2026-02-03T10:12:00Z", "CustomerPONumber": "CA-PO-77310", "LastUpdateDate": "2026-02-03T10:12:00Z", "OrderKey": "SO-NBR-40039", "OrderNumber": "SO-NBR-40039", "OrderTotal": 473.0, "RequestedFulfillmentOrganizationCode": "NBR1", "SourceTransactionNumber": "FILE-NBR-ORDER-BATCH-0203", "SourceTransactionSystem": "OPS", "StatusCode": "Awaiting Shipping", "S…
- 12Investigate
oracle_fusion.customer_account_activities.getok{ "AccountId": "CUST-10412" }{"AccountId": "CUST-10412", "AsOfDate": "2026-02-09", "CreditHoldFlag": false, "CreditLimit": 180000.0, "CustomerName": "Cascade Assembly Inc.", "OpenReceivablesAmount": 73050.0, "OpenTransactions": 5, "PastDueAmount": 50830.0, "PaymentTerms": "Net 30"}
- 13Investigate
google_drive.files.downloadok{ "fileId": "FILE-NBR-PRICE-LIST-2025H2" }{"content": "item,description,list_price,status,effective_from,superseded\nFST-M8-40,M8 x 40 hex bolt, zinc,0.80,Active,2025-07-01,true\nFST-M10-60,M10 x 60 hex bolt, zinc,1.25,Active,2025-07-01,true\nNUT-M8-NYL,M8 nylon lock nut,0.18,Active,2025-07-01,true\nWSH-M10-SS,M10 flat washer, stainless,0.10,Active,2025-07-01,true\nANC-12-100,12 x 100 wedge anchor,2.33,Active,2025-07-01,true\nFST-M6-20-OLD,M6 x 20 hex bolt (discontinued),0.49,Active,2025-07-01,true\n", "id": "FILE-NBR-PRICE-LIST-2025H2"…
- 14Investigate
google_drive.files.downloadok{ "fileId": "FILE-NBR-OPS-AUDIT-LOG" }{"content": "2026-02-03T10:12:00Z NBR partial import created SO-NBR-40039 from an earlier copy of CA-PO-77310\n2026-02-06T15:40:00Z NBR delivery note DN-NBR-0206 received at Toledo plant\n2026-02-08T22:05:00Z NBR pick confirmation posted for SHP-NBR-4471\n2026-02-09T06:00:00Z NBR Shopify export generated\n", "id": "FILE-NBR-OPS-AUDIT-LOG", "isCurrentAuthority": true, "mimeType": "text/plain", "name": "26-ops-audit.log"}
- 15Investigate
google_sheets.spreadsheets.values.getok{ "range": "Customers!A1:E12", "spreadsheetId": "SHEET-NBR-OPS" }{"range": "Customers!A1:E12", "spreadsheetId": "SHEET-NBR-OPS", "values": [["Customer", "Number", "Email", "Tax id", "Channel"], ["Cascade Assembly Inc.", "CUST-10412", "ap@cascade-sim.example", "TX-NBR-0001", "direct"], ["Industrial Outlet Co.", "CUST-NBR-DECOY1", "buyer@outlet-sim.example", "TX-NBR-0002", "direct"]]}
- 16Execute
oracle_fusion.sales_orders.createok{ "BuyingPartyNumber": "CUST-10412", "CustomerPONumber": "CA-PO-77310", "RequestedFulfillmentOrganizationCode": "NBR1", "SourceTransactionNumber": "FILE-NBR-ORDER-BATCH-0209", "SourceTransactionSystem": "OPS", "SubmittedFlag": true, "TransactionType": "Standard Orders", "lines": [ { "OrderedQuantity": 1200, "OrderedUOM": "EA", "ProductNumber": "FST-M8-40", "UnitListPrice": 0.84 }, { "OrderedQuantity": 800, "OrderedUOM": "EA", "ProductNumber": "FST-M10-60", "UnitListPrice": 1.32 }, { "OrderedQuantity": 640, "OrderedUOM": "EA", "ProductNumber": "NUT-M8-NYL", "UnitListPrice": 0.19 }, { "OrderedQuantity": 300, "OrderedUOM": "EA", "ProductNumber": "WSH-M10-SS", "UnitListPrice": 0.11 }, { "OrderedQuantity": 220, "OrderedUOM": "EA", "ProductNumber": "ANC-12-100", "UnitListPrice": 2.45 } ], "task_id": "erpbench-001" }{"BuyingPartyName": "Cascade Assembly Inc.", "BuyingPartyNumber": "CUST-10412", "CreatedBy": "analyst", "CreationDate": "2026-02-09T09:00:00Z", "CustomerPONumber": "CA-PO-77310", "LastUpdateDate": "2026-02-09T09:00:00Z", "OrderKey": "SO-NBR-50011", "OrderNumber": "SO-NBR-50011", "OrderTotal": 2757.6, "RequestedFulfillmentOrganizationCode": "NBR1", "SourceTransactionNumber": "FILE-NBR-ORDER-BATCH-0209", "SourceTransactionSystem": "OPS", "StatusCode": "Booked", "SubmittedFlag": true, "TransactionT…
- 17Investigate
oracle_fusion.sales_orders.getok{ "OrderKey": "SO-NBR-50011" }{"BuyingPartyName": "Cascade Assembly Inc.", "BuyingPartyNumber": "CUST-10412", "CreatedBy": "analyst", "CreationDate": "2026-02-09T09:00:00Z", "CustomerPONumber": "CA-PO-77310", "LastUpdateDate": "2026-02-09T09:00:00Z", "OrderKey": "SO-NBR-50011", "OrderNumber": "SO-NBR-50011", "OrderTotal": 2757.6, "RequestedFulfillmentOrganizationCode": "NBR1", "SourceTransactionNumber": "FILE-NBR-ORDER-BATCH-0209", "SourceTransactionSystem": "OPS", "StatusCode": "Booked", "SubmittedFlag": true, "TransactionT…
- 18Handoff
google_sheets.spreadsheets.values.updateok{ "range": "Register!A21:H21", "spreadsheetId": "SHEET-NBR-OPS", "task_id": "erpbench-001", "valueInputOption": "RAW", "values": [ [ "SO-NBR-50011", "import_accepted_lines_and_submit", 5, 3, 3160, 2757.6, 2, "FILE-NBR-ORDER-BATCH-0209" ] ] }{"changeId": "CHANGE-erpbench-001-1", "spreadsheetId": "SHEET-NBR-OPS", "updatedRange": "Register!A21:H21", "updatedRows": 1}
- 19Decide
erpbench.record_decisionok{ "decision": "import_accepted_lines_and_submit", "primary_record": "SO-NBR-50011", "rationale": "Current evidence supports import_accepted_lines_and_submit; operative source FILE-NBR-ORDER-BATCH-0209.", "source_refs": [ "FILE-NBR-ORDER-BATCH-0209", "MSG-erpbench-001-REQUEST", "MSG-NBR-AUTHORITY-0209" ], "status": "submitted", "task_id": "erpbench-001" }{"decision": "import_accepted_lines_and_submit", "decision_id": "DECISION-erpbench-001", "primary_record": "SO-NBR-50011", "rationale": "Current evidence supports import_accepted_lines_and_submit; operative source FILE-NBR-ORDER-BATCH-0209.", "source_refs": ["FILE-NBR-ORDER-BATCH-0209", "MSG-erpbench-001-REQUEST", "MSG-NBR-AUTHORITY-0209"], "status": "submitted", "task_id": "erpbench-001"}
- 20Handoff
gmail.drafts.createok{ "body": "Northbridge Fastener Works: recommend import_accepted_lines_and_submit (submitted). accepted lines 5; rejected lines 3; imported units 3160; order total 2757.6; duplicate lines 2. Primary record SO-NBR-50011; operative source FILE-NBR-ORDER-BATCH-0209. Draft for review, not sent.", "subject": "erpbench-001 — Import the customer's consolidated order — for review", "task_id": "erpbench-001", "to": "marcus.lee@northbridge-sim.example" }{"id": "DRAFT-erpbench-001", "message": {"labelIds": ["DRAFT"], "subject": "erpbench-001 — Import the customer's consolidated order — for review", "to": "marcus.lee@northbridge-sim.example"}, "review_status": "draft_for_review"}
- 21Handoff
slack.chat_postMessageok{ "channel": "#ops-nbr", "review_status": "draft_for_review", "task_id": "erpbench-001", "text": "erpbench-001: submitted / import_accepted_lines_and_submit / SO-NBR-50011 — review draft ready." }{"channel": "#ops-nbr", "message": {"review_status": "draft_for_review", "text": "erpbench-001: submitted / import_accepted_lines_and_submit / SO-NBR-50011 — review draft ready."}, "ok": true, "ts": "2026-02-09T09:00:00Z"}
- 22Investigate
google_sheets.spreadsheets.values.getok{ "range": "Register!A21:H21", "spreadsheetId": "SHEET-NBR-OPS" }{"range": "Register!A21:H21", "spreadsheetId": "SHEET-NBR-OPS", "values": [["SO-NBR-50011", "import_accepted_lines_and_submit", 5, 3, 3160, 2757.6, 2, "FILE-NBR-ORDER-BATCH-0209"]]}
- 23Verify
erpbench.get_decisionok{ "task_id": "erpbench-001" }{"decision": "import_accepted_lines_and_submit", "decision_id": "DECISION-erpbench-001", "primary_record": "SO-NBR-50011", "rationale": "Current evidence supports import_accepted_lines_and_submit; operative source FILE-NBR-ORDER-BATCH-0209.", "source_refs": ["FILE-NBR-ORDER-BATCH-0209", "MSG-erpbench-001-REQUEST", "MSG-NBR-AUTHORITY-0209"], "status": "submitted", "task_id": "erpbench-001"}
Methodology
How the numbers are made
Ten deep ERP tenants
Each synthetic tenant carries an Oracle-Fusion-shaped item master, customers and suppliers, sales orders, a staged shipment, open receivables, on-hand balances and open purchase orders, a supplier invoice, worker documents, a shift roster, a channel export, a candidate register and a price batch, plus current and superseded Drive files, a mailbox, an ops register workbook and chat channels. Ten workflows reuse each frozen tenant as an operations team would.
High-level employee requests
Prompts ask for a business outcome and a review-ready handoff. They do not prescribe tool order or leak record identifiers. The agent must find the operative source among superseded versions, recompute quantities and amounts from current evidence, and decide what policy allows it to commit.
Stateful cross-application execution
Six logical MCP servers expose Oracle-Fusion-shaped order management, shipping, receivables, inventory, procurement, payables and HCM resources plus Gmail, Google Drive, Google Sheets, Slack and benchmark controls over isolated SQLite state. Order, shipment, receipt, requisition, receiving, invoice, hold, document, absence, worker, price, register, decision and communication writes are durable and task-scoped.
One deterministic ERPScore
ERPScore allocates 100 executable points to discovery, ERP calculation, decision quality, committed ERP state, register and handoff, readback and containment. No LLM judge or exact reference call sequence is used.
Two-sided qualification
The release executed 800 episodes: 100/100 oracle runs, 100/100 exact deterministic replays, and 600 adversarial controls across six families (no-op, answer-only, state-only, wrong-source, wrong-target, process-as-received) with 0 false accepts. A pre-satisfied-seed gate confirms that no untouched tenant already satisfies a calculation, decision or ERP-state criterion.
Nario dataflywheel grounding and clean-room boundary
Workflow archetypes, tool shapes and data shapes were observed through Nario's production dataflywheel traces; no customer content, name, identifier, message or value was reused. Public Enterprise-Bench, ERP-Bench, APEX and Archipelago pages informed the release contract; Mercor's gated dataset was not downloaded or scraped. Every tenant, prompt, file, value, tool, answer and trajectory in ERPBench-100 is newly synthetic at production shape.
Leaderboard honesty
Qualification controls prove solvability and discrimination but are never ranked as models. A model row appears only after a complete version-pinned 100-task run has an inspectable receipt.
Model runs on this release
Disclosed pilot (not ranked): GPT-5.6 Luna (Codex 0.151.0, max reasoning) on 10 of 100 tasks scored a mean 85.00 ERPScore (3 strict passes); the full 100-task run is required before a leaderboard row appears.
Qualification controls — excluded from the leaderboard
- Reference oracle: 100.0% across 100 tasks — Solvability ceiling; not a model submission.
- No-op control: 4.0% across 100 tasks — Executed adversarial control; never ranked with models.
- Answer-only shortcut: 46.0% across 100 tasks — Executed adversarial control; never ranked with models.
- State-only shortcut: 85.0% across 100 tasks — Executed adversarial control; never ranked with models.
- Wrong-source control: 88.0% across 100 tasks — Executed adversarial control; never ranked with models.
- Wrong-target control: 82.8% across 100 tasks — Executed adversarial control; never ranked with models.
- Process-as-received control: 89.5% across 100 tasks — Executed adversarial control; never ranked with models.
Executable ERP benchmark
Production-shaped ERP workflows. Independently authored tenants. One deterministic score.
The workflow archetypes, tool shapes and data shapes come from real ERP operations observed through Nario's dataflywheel; every value in the benchmark is synthetic at production shape. Public Enterprise-Bench, ERP-Bench, APEX and Archipelago materials informed the inspection contract; the corpus, world, verifier and trajectories are new.