{
 "case": "factory-from-photos",
 "date": "2026-10-06",
 "note": "All photos are generated (Codex image generation) from the answer key model so that the rebuild can be measured. Numbers are from the logs and files named in docs/verification/factory-from-photos/README.md.",
 "answerKey": {
  "name": "Kestrel Bend Precision Works (fictional)",
  "file": "answer-key.laydyne.json",
  "sha256": "308cb2c88d66315f7d7e416fef2b18bc4b6c3b5a0db403d5c0555380743118be",
  "hall": {
   "width": 48.0,
   "depth": 28.0,
   "area": 1344.0,
   "wallHeight": 8.6
  },
  "parts": {
   "hall": 113,
   "yard": 16
  },
  "spaceHash": "fnv1a-6ac4dd94"
 },
 "given": {
  "photos": 8,
  "photoFiles": [
   "images/photo-1",
   "images/photo-2",
   "images/photo-3",
   "images/photo-4",
   "images/photo-5",
   "images/photo-6",
   "images/photo-7",
   "images/photo-8"
  ],
  "facts": [
   "The hall is about 48 m long.",
   "The long façade with the two dock doors and the personnel door faces south."
  ],
  "answerKeyHidden": true
 },
 "agent": {
  "client": "Codex CLI 0.160.1 (codex exec, resumed session for prompts b–e)",
  "model": "gpt-6-astra",
  "reasoningEffort": "low",
  "connection": "local Laydyne Studio (dev, port 3660) over HTTP MCP with an agent key; other MCP servers disabled",
  "sandbox": "workspace-write, no network, folder with only the 8 photos",
  "blindCheck": "passed: no file outside the photo folder was read during the rebuild (prompts a–c); during the hand-over (e) Codex read its own PDF skill file and wrote a preview PNG to /tmp"
 },
 "prompts": [
  {
   "id": "a-building",
   "prompt": "I'm the production engineer at our machining plant. We have no drawings of the hall, only the 8 photos I attached (they are also in this folder as photo-*.webp): photos 1 and 2 are taken outside in the yard, photos 3 to 8 inside the hall. The hall is about 48 m long; the long façade with the two dock doors and the personnel door faces south.\n\nUsing the Laydyne tools, start a new project (create_space with fresh: true) and build the building only: the hall floor, the outer walls with their height, the steel columns, the personnel door, the dock doors, the windows and roof lights, and the glazed office / QC room. Estimate the other sizes from things of known size in the photos (doors, dock doors, pallets, workbenches, the forklift) and give every part source \"assumed\" and a short note on how you estimated it. Show me a 2D plan and a 3D view, and tell me how you estimated the width and the height of the hall.",
   "attachedPhotos": 8,
   "seconds": 138,
   "mcpCalls": 10,
   "failedCalls": 1,
   "tools": {
    "get_space": 2,
    "get_part_catalog": 1,
    "get_project_schema": 1,
    "create_space": 1,
    "edit_floors": 1,
    "get_view_image": 3,
    "export_project": 1
   },
   "shellCommands": 0,
   "tokens": {
    "input": 577836,
    "cachedInput": 510848,
    "output": 2336,
    "reasoningOutput": 100
   }
  },
  {
   "id": "b-equipment",
   "prompt": "Now place the equipment you can see in the photos: every machine by type (machining centres, lathes, grinders, saws, measuring machines and so on), the pallet racking, the workbenches and assembly cells, the roller conveyor and packing table, the pallets, the forklift, and the painted floor zones (aisles, walkways, hatched areas). Use get_part_catalog for suitable parts and sizes, turn each machine to face the side it is operated from, and count carefully across the photos so that nothing seen in two photos is placed twice. Give each part source \"assumed\" and a short note naming the photos it is seen in. Then run check_space and fix what it finds.",
   "attachedPhotos": 0,
   "seconds": 232,
   "mcpCalls": 16,
   "failedCalls": 0,
   "tools": {
    "get_part_catalog": 3,
    "get_space": 3,
    "edit_space": 3,
    "check_space": 3,
    "get_view_image": 2,
    "export_project": 2
   },
   "shellCommands": 0,
   "tokens": {
    "input": 833455,
    "cachedInput": 809728,
    "output": 4863,
    "reasoningOutput": 1106
   }
  },
  {
   "id": "c-compare",
   "prompt": "Check the model against each photo. For every photo, estimate where it was taken from (eye at about 1.6 m, a target point and the vertical field of view) and draw the model from there with get_view_image (camera eye, target and fov; caption: false; 1536 × 1024 like the photos). Compare each drawing with its photo and fix what differs: sizes, positions, counts, doors and windows. When the model matches the photos, run check_space on all floors, save the project in the browser with save_local_project, and export it with export_project to the file rebuild.laydyne.json in this folder (join the pieces and check the SHA-256). Finally list which sizes are still estimates and the one measurement that would improve the model most.",
   "attachedPhotos": 0,
   "seconds": 590,
   "mcpCalls": 46,
   "failedCalls": 3,
   "tools": {
    "get_space": 6,
    "get_view_image": 25,
    "edit_space": 5,
    "check_space": 3,
    "save_local_project": 1,
    "export_project": 5,
    "get_local_project": 1
   },
   "shellCommands": 4,
   "tokens": {
    "input": 2659830,
    "cachedInput": 2487424,
    "output": 13538,
    "reasoningOutput": 5265
   }
  },
  {
   "id": "d-simulate",
   "prompt": "Next I want to know whether one forklift is enough. Read get_process_catalog first. On this model, set up the material flow for one 8-hour shift: a pallet of raw material arrives at the dock doors about every 6 minutes and the forklift puts it away in the pallet racks; every 6 minutes on average a pallet is taken from the racks to the machines; machined parts go to the assembly cells, then along the roller conveyor to the packing table, and every 10 minutes on average a finished pallet is taken by forklift from the packing table to the dock staging area. One forklift does all the pallet moves. Run it, then tell me the forklift utilisation, how long pallets wait for the forklift, and how many pallets are moved. Save this as option A (save_process_option). Then change one thing, a second forklift, save it as option B, and compare A and B with compare_process_options under the same arrivals, seed and number of runs. Tell me which differences are beyond the noise and which inputs are assumptions I should measure.",
   "attachedPhotos": 0,
   "seconds": 418,
   "mcpCalls": 19,
   "failedCalls": 0,
   "tools": {
    "get_process_catalog": 2,
    "list_process_scenarios": 1,
    "get_space": 2,
    "edit_space": 1,
    "put_process_scenario": 3,
    "check_simulation_readiness": 1,
    "run_process_scenario": 3,
    "save_process_option": 2,
    "update_process_parameters": 1,
    "compare_process_options": 1,
    "save_local_project": 1,
    "export_project": 1
   },
   "shellCommands": 1,
   "tokens": {
    "input": 2548273,
    "cachedInput": 2366080,
    "output": 6248,
    "reasoningOutput": 1571
   }
  },
  {
   "id": "e-handover",
   "prompt": "Finally, prepare the hand-over for my colleagues: a dimensioned A3 PDF drawing of the hall (get_view_image with delivery: true, format \"pdf\", dimensions: true; join the pieces and check the SHA-256), the floor areas and part counts from get_space_quantities saved as quantities.json, and a fresh export of the whole project as handover.laydyne.json. Save the files in this folder, save the project in the browser again, and tell me where each file is.",
   "attachedPhotos": 0,
   "seconds": 111,
   "mcpCalls": 9,
   "failedCalls": 0,
   "tools": {
    "list_local_projects": 1,
    "get_space": 1,
    "get_space_quantities": 1,
    "get_view_image": 2,
    "save_local_project": 1,
    "export_project": 3
   },
   "shellCommands": 5,
   "tokens": {
    "input": 1020374,
    "cachedInput": 973696,
    "output": 1685,
    "reasoningOutput": 18
   }
  }
 ],
 "totals": {
  "seconds": 1489,
  "mcpCalls": 100,
  "failedCalls": 4,
  "tokens": {
   "input": 7639768,
   "cachedInput": 7147776,
   "output": 28670,
   "reasoningOutput": 8060
  }
 },
 "rebuildTotals": {
  "prompts": [
   "a-building",
   "b-equipment",
   "c-compare"
  ],
  "seconds": 960,
  "mcpCalls": 72,
  "tokens": {
   "input": 4071121,
   "output": 20737
  }
 },
 "scoring": {
  "script": "apps/studio/scripts/score-photo-rebuild.mjs",
  "method": {
   "alignment": "rebuild moved so its walls' bounding-box centre lies on the answer key's",
   "halfTurn": false,
   "maxMatchDistanceMetres": 4,
   "matching": "per class, nearest part centres first, each part once",
   "positionErrorOverall": "matched parts of every class except zones, windows and rooflights"
  },
  "fullResult": "score.json"
 },
 "accuracy": {
  "afterEquipment": {
   "hall": {
    "answer": {
     "width": 48,
     "depth": 28,
     "area": 1344,
     "wallHeight": 8.6
    },
    "rebuild": {
     "width": 48,
     "depth": 24,
     "area": 1152,
     "wallHeight": 9
    },
    "error": {
     "width": 0,
     "depth": -4,
     "widthPercent": 0,
     "depthPercent": -14.3,
     "areaPercent": -14.3,
     "wallHeight": 0.4
    }
   },
   "columns": {
    "answer": {
     "count": 15,
     "xLines": [
      8,
      16,
      24,
      32,
      40
     ],
     "zLines": [
      0.5,
      14,
      27.5
     ],
     "xSpacing": {
      "n": 4,
      "median": 8,
      "p95": 8,
      "max": 8
     },
     "zSpacing": {
      "n": 2,
      "median": 13.5,
      "p95": 13.5,
      "max": 13.5
     }
    },
    "rebuild": {
     "count": 21,
     "xLines": [
      0.47,
      8,
      16,
      24,
      32,
      40,
      47.52
     ],
     "zLines": [
      0.47,
      12,
      23.53
     ],
     "xSpacing": {
      "n": 6,
      "median": 8,
      "p95": 8,
      "max": 8
     },
     "zSpacing": {
      "n": 2,
      "median": 11.53,
      "p95": 11.53,
      "max": 11.53
     }
    }
   },
   "counts": [
    {
     "class": "bench",
     "answer": 12,
     "rebuild": 8
    },
    {
     "class": "cabinet",
     "answer": 3,
     "rebuild": 4
    },
    {
     "class": "chair",
     "answer": 2,
     "rebuild": 0
    },
    {
     "class": "column",
     "answer": 15,
     "rebuild": 21
    },
    {
     "class": "conveyor",
     "answer": 3,
     "rebuild": 1
    },
    {
     "class": "desk",
     "answer": 2,
     "rebuild": 0
    },
    {
     "class": "dock_door",
     "answer": 2,
     "rebuild": 2
    },
    {
     "class": "dock_leveler",
     "answer": 2,
     "rebuild": 0
    },
    {
     "class": "door",
     "answer": 2,
     "rebuild": 2
    },
    {
     "class": "forklift",
     "answer": 1,
     "rebuild": 1
    },
    {
     "class": "machine",
     "answer": 12,
     "rebuild": 12
    },
    {
     "class": "pallet",
     "answer": 4,
     "rebuild": 2
    },
    {
     "class": "partition",
     "answer": 2,
     "rebuild": 2
    },
    {
     "class": "rack",
     "answer": 10,
     "rebuild": 10
    },
    {
     "class": "rooflight",
     "answer": 6,
     "rebuild": 6
    },
    {
     "class": "structure",
     "answer": 13,
     "rebuild": 4
    },
    {
     "class": "wall",
     "answer": 4,
     "rebuild": 4
    },
    {
     "class": "window",
     "answer": 14,
     "rebuild": 14
    },
    {
     "class": "zone",
     "answer": 4,
     "rebuild": 11
    }
   ],
   "parts": {
    "answer": 113,
    "rebuild": 104
   },
   "overall": {
    "matched": 42,
    "positionError": {
     "n": 42,
     "median": 1.97,
     "p95": 3.35,
     "max": 3.66
    },
    "turnError": {
     "n": 42,
     "median": 0,
     "p95": 90,
     "max": 90
    },
    "machineFacingError": {
     "n": 9,
     "median": 0,
     "p95": 0,
     "max": 0
    }
   },
   "classes": {
    "column": {
     "answer": 15,
     "rebuild": 21,
     "matched": 15,
     "missing": 0,
     "extra": 6,
     "positionError": {
      "n": 15,
      "median": 1.97,
      "p95": 1.97,
      "max": 1.97
     },
     "turnError": {
      "n": 15,
      "median": 0,
      "p95": 0,
      "max": 0
     }
    },
    "door": {
     "answer": 2,
     "rebuild": 2,
     "matched": 2,
     "missing": 0,
     "extra": 0,
     "positionError": {
      "n": 2,
      "median": 1.53,
      "p95": 2.92,
      "max": 2.92
     },
     "turnError": {
      "n": 2,
      "median": 45,
      "p95": 90,
      "max": 90
     }
    },
    "dock_door": {
     "answer": 2,
     "rebuild": 2,
     "matched": 2,
     "missing": 0,
     "extra": 0,
     "positionError": {
      "n": 2,
      "median": 1.99,
      "p95": 2,
      "max": 2
     },
     "turnError": {
      "n": 2,
      "median": 0,
      "p95": 0,
      "max": 0
     }
    },
    "window": {
     "answer": 14,
     "rebuild": 14,
     "matched": 14,
     "missing": 0,
     "extra": 0,
     "positionError": {
      "n": 14,
      "median": 2.02,
      "p95": 2.42,
      "max": 2.42
     },
     "turnError": {
      "n": 14,
      "median": 0,
      "p95": 0,
      "max": 0
     }
    },
    "rooflight": {
     "answer": 6,
     "rebuild": 6,
     "matched": 6,
     "missing": 0,
     "extra": 0,
     "positionError": {
      "n": 6,
      "median": 0,
      "p95": 0,
      "max": 0
     },
     "turnError": {
      "n": 6,
      "median": 0,
      "p95": 0,
      "max": 0
     }
    },
    "partition": {
     "answer": 2,
     "rebuild": 2,
     "matched": 2,
     "missing": 0,
     "extra": 0,
     "positionError": {
      "n": 2,
      "median": 1.67,
      "p95": 1.72,
      "max": 1.72
     },
     "turnError": {
      "n": 2,
      "median": 0,
      "p95": 0,
      "max": 0
     }
    },
    "machine": {
     "answer": 12,
     "rebuild": 12,
     "matched": 9,
     "missing": 3,
     "extra": 3,
     "positionError": {
      "n": 9,
      "median": 3.2,
      "p95": 3.66,
      "max": 3.66
     },
     "turnError": {
      "n": 9,
      "median": 0,
      "p95": 0,
      "max": 0
     },
     "facingError": {
      "n": 9,
      "median": 0,
      "p95": 0,
      "max": 0
     }
    },
    "rack": {
     "answer": 10,
     "rebuild": 10,
     "matched": 4,
     "missing": 6,
     "extra": 6,
     "positionError": {
      "n": 4,
      "median": 2.17,
      "p95": 2.17,
      "max": 2.17
     },
     "turnError": {
      "n": 4,
      "median": 0,
      "p95": 0,
      "max": 0
     }
    },
    "bench": {
     "answer": 12,
     "rebuild": 8,
     "matched": 6,
     "missing": 6,
     "extra": 2,
     "positionError": {
      "n": 6,
      "median": 1.51,
      "p95": 3.16,
      "max": 3.16
     },
     "turnError": {
      "n": 6,
      "median": 45,
      "p95": 90,
      "max": 90
     }
    },
    "conveyor": {
     "answer": 3,
     "rebuild": 1,
     "matched": 0,
     "missing": 3,
     "extra": 1,
     "positionError": null,
     "turnError": null
    },
    "pallet": {
     "answer": 4,
     "rebuild": 2,
     "matched": 0,
     "missing": 4,
     "extra": 2,
     "positionError": null,
     "turnError": null
    },
    "forklift": {
     "answer": 1,
     "rebuild": 1,
     "matched": 0,
     "missing": 1,
     "extra": 1,
     "positionError": null,
     "turnError": null
    },
    "dock_leveler": {
     "answer": 2,
     "rebuild": 0,
     "matched": 0,
     "missing": 2,
     "extra": 0,
     "positionError": null,
     "turnError": null
    },
    "zone": {
     "answer": 4,
     "rebuild": 11,
     "matched": 2,
     "missing": 2,
     "extra": 9,
     "positionError": {
      "n": 2,
      "median": 2.8,
      "p95": 3.09,
      "max": 3.09
     },
     "turnError": {
      "n": 2,
      "median": 45,
      "p95": 90,
      "max": 90
     }
    },
    "cabinet": {
     "answer": 3,
     "rebuild": 4,
     "matched": 2,
     "missing": 1,
     "extra": 2,
     "positionError": {
      "n": 2,
      "median": 1.08,
      "p95": 1.67,
      "max": 1.67
     },
     "turnError": {
      "n": 2,
      "median": 45,
      "p95": 90,
      "max": 90
     }
    },
    "desk": {
     "answer": 2,
     "rebuild": 0,
     "matched": 0,
     "missing": 2,
     "extra": 0,
     "positionError": null,
     "turnError": null
    },
    "chair": {
     "answer": 2,
     "rebuild": 0,
     "matched": 0,
     "missing": 2,
     "extra": 0,
     "positionError": null,
     "turnError": null
    }
   },
   "relativeToWalls": {
    "scale": {
     "x": 1,
     "z": 1.167
    },
    "matched": 42,
    "positionError": {
     "n": 42,
     "median": 1.13,
     "p95": 2.66,
     "max": 2.68
    },
    "classes": {
     "column": {
      "matched": 15,
      "missing": 0,
      "extra": 6,
      "positionError": {
       "n": 15,
       "median": 0.05,
       "p95": 0.05,
       "max": 0.05
      }
     },
     "door": {
      "matched": 2,
      "missing": 0,
      "extra": 0,
      "positionError": {
       "n": 2,
       "median": 1.57,
       "p95": 2.15,
       "max": 2.15
      }
     },
     "dock_door": {
      "matched": 2,
      "missing": 0,
      "extra": 0,
      "positionError": {
       "n": 2,
       "median": 0.25,
       "p95": 0.3,
       "max": 0.3
      }
     },
     "window": {
      "matched": 14,
      "missing": 0,
      "extra": 0,
      "positionError": {
       "n": 14,
       "median": 0.4,
       "p95": 1.4,
       "max": 1.4
      }
     },
     "rooflight": {
      "matched": 6,
      "missing": 0,
      "extra": 0,
      "positionError": {
       "n": 6,
       "median": 0,
       "p95": 0,
       "max": 0
      }
     },
     "partition": {
      "matched": 2,
      "missing": 0,
      "extra": 0,
      "positionError": {
       "n": 2,
       "median": 2.4,
       "p95": 2.67,
       "max": 2.67
      }
     },
     "machine": {
      "matched": 9,
      "missing": 3,
      "extra": 3,
      "positionError": {
       "n": 9,
       "median": 2.22,
       "p95": 2.66,
       "max": 2.66
      }
     },
     "rack": {
      "matched": 4,
      "missing": 6,
      "extra": 6,
      "positionError": {
       "n": 4,
       "median": 2.15,
       "p95": 2.32,
       "max": 2.32
      }
     },
     "bench": {
      "matched": 6,
      "missing": 6,
      "extra": 2,
      "positionError": {
       "n": 6,
       "median": 1.7,
       "p95": 2.68,
       "max": 2.68
      }
     },
     "conveyor": {
      "matched": 0,
      "missing": 3,
      "extra": 1,
      "positionError": null
     },
     "pallet": {
      "matched": 0,
      "missing": 4,
      "extra": 2,
      "positionError": null
     },
     "forklift": {
      "matched": 0,
      "missing": 1,
      "extra": 1,
      "positionError": null
     },
     "dock_leveler": {
      "matched": 0,
      "missing": 2,
      "extra": 0,
      "positionError": null
     },
     "zone": {
      "matched": 3,
      "missing": 1,
      "extra": 8,
      "positionError": {
       "n": 3,
       "median": 3.48,
       "p95": 3.98,
       "max": 3.98
      }
     },
     "cabinet": {
      "matched": 2,
      "missing": 1,
      "extra": 2,
      "positionError": {
       "n": 2,
       "median": 0.59,
       "p95": 0.75,
       "max": 0.75
      }
     },
     "desk": {
      "matched": 0,
      "missing": 2,
      "extra": 0,
      "positionError": null
     },
     "chair": {
      "matched": 0,
      "missing": 2,
      "extra": 0,
      "positionError": null
     }
    }
   }
  },
  "afterPhotoComparison": {
   "hall": {
    "answer": {
     "width": 48,
     "depth": 28,
     "area": 1344,
     "wallHeight": 8.6
    },
    "rebuild": {
     "width": 48,
     "depth": 24,
     "area": 1152,
     "wallHeight": 9
    },
    "error": {
     "width": 0,
     "depth": -4,
     "widthPercent": 0,
     "depthPercent": -14.3,
     "areaPercent": -14.3,
     "wallHeight": 0.4
    }
   },
   "columns": {
    "answer": {
     "count": 15,
     "xLines": [
      8,
      16,
      24,
      32,
      40
     ],
     "zLines": [
      0.5,
      14,
      27.5
     ],
     "xSpacing": {
      "n": 4,
      "median": 8,
      "p95": 8,
      "max": 8
     },
     "zSpacing": {
      "n": 2,
      "median": 13.5,
      "p95": 13.5,
      "max": 13.5
     }
    },
    "rebuild": {
     "count": 21,
     "xLines": [
      0.47,
      8,
      16,
      24,
      32,
      40,
      47.52
     ],
     "zLines": [
      0.47,
      12,
      23.53
     ],
     "xSpacing": {
      "n": 6,
      "median": 8,
      "p95": 8,
      "max": 8
     },
     "zSpacing": {
      "n": 2,
      "median": 11.53,
      "p95": 11.53,
      "max": 11.53
     }
    }
   },
   "counts": [
    {
     "class": "bench",
     "answer": 12,
     "rebuild": 8
    },
    {
     "class": "cabinet",
     "answer": 3,
     "rebuild": 4
    },
    {
     "class": "chair",
     "answer": 2,
     "rebuild": 0
    },
    {
     "class": "column",
     "answer": 15,
     "rebuild": 21
    },
    {
     "class": "conveyor",
     "answer": 3,
     "rebuild": 1
    },
    {
     "class": "desk",
     "answer": 2,
     "rebuild": 0
    },
    {
     "class": "dock_door",
     "answer": 2,
     "rebuild": 2
    },
    {
     "class": "dock_leveler",
     "answer": 2,
     "rebuild": 0
    },
    {
     "class": "door",
     "answer": 2,
     "rebuild": 2
    },
    {
     "class": "forklift",
     "answer": 1,
     "rebuild": 1
    },
    {
     "class": "machine",
     "answer": 12,
     "rebuild": 12
    },
    {
     "class": "other",
     "answer": 0,
     "rebuild": 2
    },
    {
     "class": "pallet",
     "answer": 4,
     "rebuild": 2
    },
    {
     "class": "partition",
     "answer": 2,
     "rebuild": 2
    },
    {
     "class": "rack",
     "answer": 10,
     "rebuild": 10
    },
    {
     "class": "rooflight",
     "answer": 6,
     "rebuild": 6
    },
    {
     "class": "structure",
     "answer": 13,
     "rebuild": 35
    },
    {
     "class": "wall",
     "answer": 4,
     "rebuild": 4
    },
    {
     "class": "window",
     "answer": 14,
     "rebuild": 14
    },
    {
     "class": "zone",
     "answer": 4,
     "rebuild": 10
    }
   ],
   "parts": {
    "answer": 113,
    "rebuild": 136
   },
   "overall": {
    "matched": 47,
    "positionError": {
     "n": 47,
     "median": 1.97,
     "p95": 3.08,
     "max": 3.16
    },
    "turnError": {
     "n": 47,
     "median": 0,
     "p95": 90,
     "max": 90
    },
    "machineFacingError": {
     "n": 9,
     "median": 0,
     "p95": 0,
     "max": 0
    }
   },
   "classes": {
    "column": {
     "answer": 15,
     "rebuild": 21,
     "matched": 15,
     "missing": 0,
     "extra": 6,
     "positionError": {
      "n": 15,
      "median": 1.97,
      "p95": 1.97,
      "max": 1.97
     },
     "turnError": {
      "n": 15,
      "median": 0,
      "p95": 0,
      "max": 0
     }
    },
    "door": {
     "answer": 2,
     "rebuild": 2,
     "matched": 2,
     "missing": 0,
     "extra": 0,
     "positionError": {
      "n": 2,
      "median": 1.53,
      "p95": 2.92,
      "max": 2.92
     },
     "turnError": {
      "n": 2,
      "median": 45,
      "p95": 90,
      "max": 90
     }
    },
    "dock_door": {
     "answer": 2,
     "rebuild": 2,
     "matched": 2,
     "missing": 0,
     "extra": 0,
     "positionError": {
      "n": 2,
      "median": 1.99,
      "p95": 2,
      "max": 2
     },
     "turnError": {
      "n": 2,
      "median": 0,
      "p95": 0,
      "max": 0
     }
    },
    "window": {
     "answer": 14,
     "rebuild": 14,
     "matched": 14,
     "missing": 0,
     "extra": 0,
     "positionError": {
      "n": 14,
      "median": 2.02,
      "p95": 2.42,
      "max": 2.42
     },
     "turnError": {
      "n": 14,
      "median": 0,
      "p95": 0,
      "max": 0
     }
    },
    "rooflight": {
     "answer": 6,
     "rebuild": 6,
     "matched": 6,
     "missing": 0,
     "extra": 0,
     "positionError": {
      "n": 6,
      "median": 0,
      "p95": 0,
      "max": 0
     },
     "turnError": {
      "n": 6,
      "median": 0,
      "p95": 0,
      "max": 0
     }
    },
    "partition": {
     "answer": 2,
     "rebuild": 2,
     "matched": 2,
     "missing": 0,
     "extra": 0,
     "positionError": {
      "n": 2,
      "median": 1.67,
      "p95": 1.72,
      "max": 1.72
     },
     "turnError": {
      "n": 2,
      "median": 0,
      "p95": 0,
      "max": 0
     }
    },
    "machine": {
     "answer": 12,
     "rebuild": 12,
     "matched": 9,
     "missing": 3,
     "extra": 3,
     "positionError": {
      "n": 9,
      "median": 3,
      "p95": 3.13,
      "max": 3.13
     },
     "turnError": {
      "n": 9,
      "median": 0,
      "p95": 0,
      "max": 0
     },
     "facingError": {
      "n": 9,
      "median": 0,
      "p95": 0,
      "max": 0
     }
    },
    "rack": {
     "answer": 10,
     "rebuild": 10,
     "matched": 8,
     "missing": 2,
     "extra": 2,
     "positionError": {
      "n": 8,
      "median": 1.83,
      "p95": 1.91,
      "max": 1.91
     },
     "turnError": {
      "n": 8,
      "median": 0,
      "p95": 0,
      "max": 0
     }
    },
    "bench": {
     "answer": 12,
     "rebuild": 8,
     "matched": 6,
     "missing": 6,
     "extra": 2,
     "positionError": {
      "n": 6,
      "median": 1.51,
      "p95": 3.16,
      "max": 3.16
     },
     "turnError": {
      "n": 6,
      "median": 45,
      "p95": 90,
      "max": 90
     }
    },
    "conveyor": {
     "answer": 3,
     "rebuild": 1,
     "matched": 1,
     "missing": 2,
     "extra": 0,
     "positionError": {
      "n": 1,
      "median": 0.86,
      "p95": 0.86,
      "max": 0.86
     },
     "turnError": {
      "n": 1,
      "median": 0,
      "p95": 0,
      "max": 0
     }
    },
    "pallet": {
     "answer": 4,
     "rebuild": 2,
     "matched": 0,
     "missing": 4,
     "extra": 2,
     "positionError": null,
     "turnError": null
    },
    "forklift": {
     "answer": 1,
     "rebuild": 1,
     "matched": 0,
     "missing": 1,
     "extra": 1,
     "positionError": null,
     "turnError": null
    },
    "dock_leveler": {
     "answer": 2,
     "rebuild": 0,
     "matched": 0,
     "missing": 2,
     "extra": 0,
     "positionError": null,
     "turnError": null
    },
    "zone": {
     "answer": 4,
     "rebuild": 10,
     "matched": 0,
     "missing": 4,
     "extra": 10,
     "positionError": null,
     "turnError": null
    },
    "cabinet": {
     "answer": 3,
     "rebuild": 4,
     "matched": 2,
     "missing": 1,
     "extra": 2,
     "positionError": {
      "n": 2,
      "median": 1.08,
      "p95": 1.67,
      "max": 1.67
     },
     "turnError": {
      "n": 2,
      "median": 45,
      "p95": 90,
      "max": 90
     }
    },
    "desk": {
     "answer": 2,
     "rebuild": 0,
     "matched": 0,
     "missing": 2,
     "extra": 0,
     "positionError": null,
     "turnError": null
    },
    "chair": {
     "answer": 2,
     "rebuild": 0,
     "matched": 0,
     "missing": 2,
     "extra": 0,
     "positionError": null,
     "turnError": null
    }
   },
   "relativeToWalls": {
    "scale": {
     "x": 1,
     "z": 1.167
    },
    "matched": 47,
    "positionError": {
     "n": 47,
     "median": 1.63,
     "p95": 2.59,
     "max": 2.68
    },
    "classes": {
     "column": {
      "matched": 15,
      "missing": 0,
      "extra": 6,
      "positionError": {
       "n": 15,
       "median": 0.05,
       "p95": 0.05,
       "max": 0.05
      }
     },
     "door": {
      "matched": 2,
      "missing": 0,
      "extra": 0,
      "positionError": {
       "n": 2,
       "median": 1.57,
       "p95": 2.15,
       "max": 2.15
      }
     },
     "dock_door": {
      "matched": 2,
      "missing": 0,
      "extra": 0,
      "positionError": {
       "n": 2,
       "median": 0.25,
       "p95": 0.3,
       "max": 0.3
      }
     },
     "window": {
      "matched": 14,
      "missing": 0,
      "extra": 0,
      "positionError": {
       "n": 14,
       "median": 0.4,
       "p95": 1.4,
       "max": 1.4
      }
     },
     "rooflight": {
      "matched": 6,
      "missing": 0,
      "extra": 0,
      "positionError": {
       "n": 6,
       "median": 0,
       "p95": 0,
       "max": 0
      }
     },
     "partition": {
      "matched": 2,
      "missing": 0,
      "extra": 0,
      "positionError": {
       "n": 2,
       "median": 2.4,
       "p95": 2.67,
       "max": 2.67
      }
     },
     "machine": {
      "matched": 9,
      "missing": 3,
      "extra": 3,
      "positionError": {
       "n": 9,
       "median": 1.86,
       "p95": 2.59,
       "max": 2.59
      }
     },
     "rack": {
      "matched": 8,
      "missing": 2,
      "extra": 2,
      "positionError": {
       "n": 8,
       "median": 1.84,
       "p95": 2.07,
       "max": 2.07
      }
     },
     "bench": {
      "matched": 6,
      "missing": 6,
      "extra": 2,
      "positionError": {
       "n": 6,
       "median": 1.7,
       "p95": 2.68,
       "max": 2.68
      }
     },
     "conveyor": {
      "matched": 1,
      "missing": 2,
      "extra": 0,
      "positionError": {
       "n": 1,
       "median": 0.93,
       "p95": 0.93,
       "max": 0.93
      }
     },
     "pallet": {
      "matched": 0,
      "missing": 4,
      "extra": 2,
      "positionError": null
     },
     "forklift": {
      "matched": 0,
      "missing": 1,
      "extra": 1,
      "positionError": null
     },
     "dock_leveler": {
      "matched": 0,
      "missing": 2,
      "extra": 0,
      "positionError": null
     },
     "zone": {
      "matched": 1,
      "missing": 3,
      "extra": 9,
      "positionError": {
       "n": 1,
       "median": 3.98,
       "p95": 3.98,
       "max": 3.98
      }
     },
     "cabinet": {
      "matched": 2,
      "missing": 1,
      "extra": 2,
      "positionError": {
       "n": 2,
       "median": 0.59,
       "p95": 0.75,
       "max": 0.75
      }
     },
     "desk": {
      "matched": 0,
      "missing": 2,
      "extra": 0,
      "positionError": null
     },
     "chair": {
      "matched": 0,
      "missing": 2,
      "extra": 0,
      "positionError": null
     }
    }
   },
   "cameras": {
    "rows": [
     {
      "photo": 1,
      "eyeError": 0,
      "bearingError": 1.8,
      "fov": {
       "answer": 50,
       "rebuild": 48
      }
     },
     {
      "photo": 2,
      "eyeError": 4.12,
      "bearingError": 7.2,
      "fov": {
       "answer": 50,
       "rebuild": 54
      }
     },
     {
      "photo": 3,
      "eyeError": 2.61,
      "bearingError": 6.1,
      "fov": {
       "answer": 60,
       "rebuild": 68
      }
     },
     {
      "photo": 4,
      "eyeError": 1.87,
      "bearingError": 2,
      "fov": {
       "answer": 55,
       "rebuild": 65
      }
     },
     {
      "photo": 5,
      "eyeError": 5.68,
      "bearingError": 0.4,
      "fov": {
       "answer": 50,
       "rebuild": 64
      }
     },
     {
      "photo": 6,
      "eyeError": 6.73,
      "bearingError": 27.5,
      "fov": {
       "answer": 55,
       "rebuild": 60
      }
     },
     {
      "photo": 7,
      "eyeError": 3.83,
      "bearingError": 3.1,
      "fov": {
       "answer": 55,
       "rebuild": 68
      }
     },
     {
      "photo": 8,
      "eyeError": 4.45,
      "bearingError": 13,
      "fov": {
       "answer": 55,
       "rebuild": 60
      }
     }
    ],
    "eyeError": {
     "n": 8,
     "median": 3.98,
     "p95": 6.73,
     "max": 6.73
    },
    "bearingError": {
     "n": 8,
     "median": 4.6,
     "p95": 27.5,
     "max": 27.5
    }
   }
  }
 },
 "simulation": {
  "engine": "process-des-2.7.0",
  "horizonSeconds": 28800,
  "runs": 20,
  "seed": 20261006,
  "spaceHash": "fnv1a-8876291c",
  "assumptions": {
   "inboundPerHour": 10,
   "feedPerHour": 10,
   "outboundPerHour": 6,
   "initialRaw": 10,
   "initialFinished": 0,
   "loadedSpeed": 1.2,
   "manualSpeed": 0.8,
   "pickMin": 20,
   "pickMode": 40,
   "pickMax": 60,
   "dropMin": 30,
   "dropMode": 60,
   "dropMax": 90,
   "cncSeconds": 720,
   "assemblySeconds": 360,
   "packingSeconds": 180,
   "manualHandlingSeconds": 60,
   "conveyorSpeed": 0.15
  },
  "forkliftUtilisation": {
   "A": 0.903,
   "B": 0.464,
   "difference95": [
    -0.452,
    -0.426
   ],
   "withinNoise": false
  },
  "forkliftWaitMinutes": {
   "A": 9.895,
   "B": 0.506,
   "difference95": [
    -12.656,
    -6.123
   ],
   "withinNoise": false
  },
  "movesPerShift": {
   "inbound": {
    "A": 78.3,
    "B": 80.7,
    "difference95": [
     1.056,
     3.744
    ],
    "withinNoise": false
   },
   "racksToMachines": {
    "A": 76.3,
    "B": 79.05,
    "difference95": [
     1.527,
     3.973
    ],
    "withinNoise": false
   },
   "outbound": {
    "A": 46.2,
    "B": 47.4,
    "difference95": [
     0.563,
     1.837
    ],
    "withinNoise": false
   }
  },
  "jobsCompleted": {
   "A": 197.25,
   "B": 202.8,
   "difference95": [
    2.53,
    8.57
   ],
   "withinNoise": false
  },
  "forkliftDistanceMetres": {
   "A": 7748.597,
   "B": 7849.628,
   "difference95": [
    -43.734,
    245.797
   ],
   "withinNoise": true
  }
 },
 "handover": {
  "pdf": "hall-a3.pdf",
  "pdfSha256": "a22536d06ab6b2a02f3adca106489a10d8d0e0a70627d435d8743a58e8d7275b",
  "scale": "1:200 A3 landscape",
  "quantities": "quantities.json",
  "floorArea": 1152,
  "parts": 136,
  "project": "rebuild-handover.laydyne.json"
 }
}