{
  "date": "2026-09-07",
  "os": "Windows",
  "python": "3.14.3",
  "passed": true,
  "checks": [
    {
      "command": "python parcel_lab.py generate",
      "kit": "parcel-detection",
      "exit_code": 0,
      "stdout": "Generated 24 synthetic images: train=16, val=4, test=4"
    },
    {
      "command": "python parcel_lab.py train",
      "kit": "parcel-detection",
      "exit_code": 0,
      "stdout": "Trained on train split only; exported output/model.json"
    },
    {
      "command": "python parcel_lab.py evaluate",
      "kit": "parcel-detection",
      "exit_code": 0,
      "stdout": "{\n  \"scope\": \"Synthetic held-out fixtures only; not real parcel accuracy or mAP\",\n  \"results\": [\n    {\n      \"image\": \"test-00\",\n      \"expected\": [\n        20,\n        25,\n        45,\n        52\n      ],\n      \"predicted\": [\n        20,\n        25,\n        45,\n        52\n      ],\n      \"exact_match\": true\n    },\n    {\n      \"image\": \"test-01\",\n      \"expected\": [\n        12,\n        27,\n        29,\n        52\n      ],\n      \"predicted\": [\n        12,\n        27,\n        29,\n        52\n      ],\n      \"exact_match\": true\n    },\n    {\n      \"image\": \"test-02\",\n      \"expected\": [\n        10,\n        9,\n        37,\n        36\n      ],\n      \"predicted\": [\n        10,\n        9,\n        37,\n        36\n      ],\n      \"exact_match\": true\n    },\n    {\n      \"image\": \"test-03\",\n      \"expected\": null,\n      \"predicted\": null,\n      \"exact_match\": true\n    }\n  ],\n  \"passed\": true\n}"
    },
    {
      "command": "python parcel_lab.py infer --image dataset/ppm/test/test-00.ppm",
      "kit": "parcel-detection",
      "exit_code": 0,
      "stdout": "{\"bbox_xyxy\": [20, 25, 45, 52]}"
    },
    {
      "command": "python simulate.py",
      "kit": "survey-simulation",
      "exit_code": 0,
      "stdout": "{\n  \"simulation\": \"kinematic interpolation; NOT ArduPilot SITL or measured flight\",\n  \"distance_m\": 260.0,\n  \"duration_s\": 52.0,\n  \"samples\": 53,\n  \"waypoints\": 11,\n  \"landed_at_origin\": true\n}"
    },
    {
      "command": "python build_mount.py",
      "kit": "camera-mount",
      "exit_code": 0,
      "stdout": "{\n  \"units\": \"mm\",\n  \"bounds\": [\n    60,\n    40,\n    3\n  ],\n  \"triangles\": 340,\n  \"all_edges_have_two_faces\": true,\n  \"volume_mm3\": 6792.0,\n  \"analytic_volume_mm3\": 6792,\n  \"physical_fit_and_strength_tested\": false,\n  \"openscad_render_tested\": false\n}"
    },
    {
      "check": "24 PNG headers, YOLO label bounds and box coordinates including 3 negative images",
      "passed": true
    },
    {
      "check": "Route distance, speed scaling, invalid speed/altitude rejection and 12-column WPL structure",
      "passed": true,
      "not_tested": "Loading WPL in MAVProxy/ArduPilot"
    },
    {
      "check": "SITL route export contract: reject six incompatible routes without output; reject airborne ending and two-point CLI input without changing outputs; accept three-point vertical takeoff/landing",
      "passed": true
    },
    {
      "check": "Independent binary STL decode: length, edge incidence, dimensions, volume; thickness change and invalid dimensions",
      "passed": true,
      "not_tested": "OpenSCAD, slicer, printing, fit, load or flight"
    }
  ],
  "unverified": [
    "YOLO/PyTorch training and ONNX export",
    "Raspberry Pi/Jetson inference",
    "ArduPilot SITL and MAVProxy import",
    "OpenSCAD application render",
    "CAD slicer/printing/fit/strength",
    "Human learner testing"
  ]
}
