SCENARIOS / MANUFACTURING LINE
Manufacturing

Manufacturing Line

A machine shop's order book — staggered releases, hour-by-hour production, spawned quality inspections, and rework/MRB loops.

Async Tick FSM
QUEUE LINE QC DONE REWORK · MRB 4+ 3 LINES · 40 ORDERS 1 TURN = 1 H BILL OF MATERIALS 1 PN-83-4471 2 2 PN-11-0308 1 3 PN-27-9902 4 4 PN-56-2201 1 REV D · SHEET 1/1 PASS MRB HOLD 4+ INSPECT
SCHEMATICManufacturing
Clock tick · 1 h/turn
Update Asynchronous
Orders 40 (seed file)
Catalog 8 products · 16 components
Verdicts Pass 0.58 / Rework 0.26 / Fail 0.16
MRB gate 4+ cumulative defects
OVERVIEW

A discrete-manufacturing order book from release to disposition. Forty seeded work orders carry five references wired straight from seed cells — the product plus four BOM-line components with per-line quantities. Each order waits in queued (release gated by priority: rush 0.04/h vs standard 0.01/h), runs an Age-keyed production cycle, and spawns a QualityCheck on reaching quality_check. The inspection inherits the order's line, samples its verdict, logs defects hour by hour, measures bore and surface finish from verdict-keyed normals against the drawing spec, then messages the order its disposition with the defect count as payload — pass completes, rework and fail loop through the rework state, where the order's own cumulative defect tally decides between a quick return to line and a slow MRB hold at four or more.

A quality ledger that reconciles by construction: an order's defects equal the sum over its inspections because the count only ever moves by message payload. First-pass yield, WIP census, verdict mix by line, and measurement drift all fall out of two tables — and the same data renders two flagship documents, a drawing-style Bill of Materials sheet whose component lines are cross-entity lookups resolved at generation time, and a stamped PASS/REWORK/FAIL inspection report whose measurements really sit in or out of tolerance.

TRAITS
Async
Independent, event-driven timelines
Tick
Discrete fixed-step time
FSM
Entities are finite-state machines
SCHEMA

Linked tables with guaranteed referential integrity.

TABLECOLUMNSDESCRIPTION
product ID, sku, name, revision, family, list_price, catalogued_at, current_state One row per catalogued assembly: the identity a BOM sheet's title block cites.
component ID, part_number, name, material, supplier, unit_cost, lead_time_days, stocked_at, current_state One row per purchased part: the BOM line identity resolved by reference id at document generation.
workorder ID, production_line, priority, quantity, qty_1..qty_4, defects, rework_cycles, product_id, comp1_id..comp4_id, created_at, released_at, inspected_at, closed_at, current_state One row per order: five seed-wired references, per-line quantities, the cumulative defect and rework tallies, and full cycle timestamps.
qualitycheck ID, result, production_line, defects_found, inspector, bore_diameter_mm, surface_finish_ra, opened_at, closed_at, work_order_id, current_state One row per inspection: the sampled verdict, defects logged, measured dimensions against spec, the faker inspector, and the work-order reference.
LIVE API

Generated REST endpoints. Also exposed as MCP tools.

POST /scenarios/manufacturing-line/experiments Seed a fresh order book
POST /scenarios/manufacturing-line/experiments/{eid}/run Advance N one-hour turns
GET /scenarios/manufacturing-line/experiments/{eid}/entities/workorder Query orders by state, line, or priority
POST /scenarios/manufacturing-line/experiments/{eid}/documents Generate BOM sheets and quality reports
GET /scenarios/manufacturing-line/experiments/{eid}/dataset Download the exported dataset
SEMANTIC LAYER

OSI-compatible definition, emitted with the dataset.

# manufacturing-line.osi.yaml — emitted automatically
semantic_model:
  name: "manufacturing-line"
  source: "duckdb://manufacturing-line.db"
  entities:
    - name: product
      primary_key: id
  dimensions:
    - name: state
      type: categorical
    - name: t
      type: time
  measures:
    - name: row_count
      agg: count
    - name: active
      agg: sum
      filter: "state = 'ACTIVE'"