{"description":"Linear profile cutting optimizer \u2014 minimises unique layout patterns","endpoints":{"GET /health":"Health check \u2014 returns {ok: true}","GET /optimize":{"description":"Run optimizer via query parameters","example":"/optimize?stock=6000&kerf=3&pieces=A:1200:4,B:850:6,C:2100:2","params":{"kerf":"Blade kerf width in mm (optional, default: 3). Example: 3.2","pieces":"Comma-separated label:length:qty triples (required). Example: A:1200:4,B:850:6","stock":"Stock bar length in mm (required). Example: 6000"}},"POST /optimize":{"body":{"kerf":"Blade kerf width in mm (optional, default: 3)","pieces":[{"label":"A","length":1200,"qty":4}],"stock_length":"Stock bar length in mm (required)"},"description":"Run optimizer via JSON body","example_curl":"curl -X POST http://localhost:5000/optimize -H \"Content-Type: application/json\" -d '{\"stock_length\":6000,\"kerf\":3,\"pieces\":[{\"label\":\"A\",\"length\":1200,\"qty\":4},{\"label\":\"B\",\"length\":850,\"qty\":6}]}'"}},"name":"cut.opt API","response_shape":{"all_bars":"[{bar_index, layout_id, efficiency_pct, waste_mm, cuts:[...]}]","layouts":"[{layout_id, count, bar_indices, efficiency_pct, waste_mm, cuts:[...]}]","ok":"bool","summary":{"bars_used":"int","budget_achieved":"bool","layout_budget":"int  (6 for up to 7 types, 8 for up to 12 types)","material_yield_pct":"float","min_theoretical_bars":"int","total_waste_mm":"float","unique_layouts":"int"}},"version":"1.0.0"}
