{
  "id": "exp-005",
  "slug": "exp-005-same-area-different-route",
  "algorithm": "2.0.0",
  "legacyAlgorithm": "1.0.0",
  "geometrySha256": "313c4fd15b13941f5b189a75e732cbb03aef2a9c75d65f1a1b7d581d925b7976",
  "generated": "2026-11-07",
  "generator": "tools/run_experiments.mjs",
  "verifier": "tools/verify_experiments.py",
  "kind": "simulation",
  "cases": [
    {
      "id": "A",
      "label": {
        "ko": "윗벽에 침대와 책상을 나란히",
        "en": "Bed and desk side by side on the top wall"
      },
      "preset": "x5A",
      "input": {
        "room": {
          "w": 300,
          "h": 350
        },
        "items": [
          {
            "type": "bedQueen",
            "x": 18,
            "y": 20,
            "w": 150,
            "h": 200
          },
          {
            "type": "desk",
            "x": 185,
            "y": 20,
            "w": 105,
            "h": 50
          },
          {
            "type": "wardrobe",
            "x": 185,
            "y": 244,
            "w": 100,
            "h": 60
          }
        ]
      },
      "actual": {
        "itemSum": 41250,
        "itemUnion": 41250,
        "free": 63750,
        "minItemGap": 17,
        "narrowGaps": [
          {
            "a": {
              "kind": "item",
              "index": 1
            },
            "b": {
              "kind": "wall",
              "wall": "right"
            },
            "d": 10
          },
          {
            "a": {
              "kind": "item",
              "index": 2
            },
            "b": {
              "kind": "wall",
              "wall": "right"
            },
            "d": 15
          },
          {
            "a": {
              "kind": "item",
              "index": 0
            },
            "b": {
              "kind": "item",
              "index": 1
            },
            "d": 17
          },
          {
            "a": {
              "kind": "item",
              "index": 0
            },
            "b": {
              "kind": "wall",
              "wall": "left"
            },
            "d": 18
          },
          {
            "a": {
              "kind": "item",
              "index": 0
            },
            "b": {
              "kind": "wall",
              "wall": "top"
            },
            "d": 20
          },
          {
            "a": {
              "kind": "item",
              "index": 1
            },
            "b": {
              "kind": "wall",
              "wall": "top"
            },
            "d": 20
          },
          {
            "a": {
              "kind": "item",
              "index": 0
            },
            "b": {
              "kind": "item",
              "index": 2
            },
            "d": 29.411
          },
          {
            "a": {
              "kind": "item",
              "index": 2
            },
            "b": {
              "kind": "wall",
              "wall": "bottom"
            },
            "d": 46
          }
        ],
        "route": {
          "status": "blocked",
          "reason": "no-path",
          "bottleneck": null,
          "step": 5,
          "tight": 0,
          "items": [
            "connected",
            "blocked",
            "connected"
          ],
          "pathPoints": 0,
          "path": []
        },
        "routeToDesk": {
          "status": "blocked",
          "reason": "no-path",
          "bottleneck": null,
          "step": 5,
          "tight": 0,
          "items": [
            "connected",
            "blocked",
            "connected"
          ],
          "pathPoints": 0,
          "path": []
        }
      },
      "legacy": {
        "status": "none",
        "pass": false
      },
      "expected": {
        "itemSum": 41250,
        "itemUnion": 41250,
        "route": "blocked",
        "reach": [
          "connected",
          "blocked",
          "connected"
        ],
        "minItemGap": 17.0,
        "v1": "none",
        "method": "1 cm cell count + 1 cm raster flood + rectangle distance + Python v1"
      },
      "checks": [
        {
          "name": "furniture sum",
          "expected": 41250,
          "actual": 41250,
          "pass": true
        },
        {
          "name": "floor covered",
          "expected": 41250,
          "actual": 41250,
          "pass": true
        },
        {
          "name": "route = raster",
          "expected": "blocked",
          "actual": "blocked",
          "pass": true
        },
        {
          "name": "pieces reachable = raster",
          "expected": [
            "connected",
            "blocked",
            "connected"
          ],
          "actual": [
            "connected",
            "blocked",
            "connected"
          ],
          "pass": true
        },
        {
          "name": "route to desk = raster",
          "expected": "blocked",
          "actual": "blocked",
          "pass": true
        },
        {
          "name": "narrowest gap",
          "expected": 17.0,
          "actual": 17,
          "pass": true
        },
        {
          "name": "v1 JS = v1 Python",
          "expected": "none",
          "actual": "none",
          "pass": true
        }
      ],
      "pass": true
    },
    {
      "id": "B",
      "label": {
        "ko": "침대는 구석, 책상은 오른쪽 벽에 세로로",
        "en": "Bed in the corner, desk turned on the right wall"
      },
      "preset": "x5B",
      "input": {
        "room": {
          "w": 300,
          "h": 350
        },
        "items": [
          {
            "type": "bedQueen",
            "x": 0,
            "y": 0,
            "w": 150,
            "h": 200
          },
          {
            "type": "desk",
            "x": 250,
            "y": 0,
            "w": 50,
            "h": 105
          },
          {
            "type": "wardrobe",
            "x": 200,
            "y": 290,
            "w": 100,
            "h": 60
          }
        ]
      },
      "actual": {
        "itemSum": 41250,
        "itemUnion": 41250,
        "free": 63750,
        "minItemGap": 100,
        "narrowGaps": [],
        "route": {
          "status": "connected",
          "reason": "ok",
          "bottleneck": 80,
          "step": 5,
          "tight": 0,
          "items": [
            "connected",
            "connected",
            "connected"
          ],
          "pathPoints": 10,
          "path": [
            [
              150,
              320
            ],
            [
              150,
              265
            ],
            [
              165,
              250
            ],
            [
              170,
              250
            ],
            [
              180,
              240
            ],
            [
              185,
              240
            ],
            [
              190,
              235
            ],
            [
              190,
              230
            ],
            [
              200,
              220
            ],
            [
              200,
              95
            ]
          ]
        },
        "routeToDesk": {
          "status": "connected",
          "reason": "ok",
          "bottleneck": 80,
          "step": 5,
          "tight": 0,
          "items": [
            "connected",
            "connected",
            "connected"
          ],
          "pathPoints": 7,
          "path": [
            [
              160,
              320
            ],
            [
              160,
              250
            ],
            [
              185,
              225
            ],
            [
              185,
              220
            ],
            [
              190,
              215
            ],
            [
              190,
              205
            ],
            [
              250,
              145
            ]
          ]
        }
      },
      "legacy": {
        "status": "connected",
        "pass": true
      },
      "expected": {
        "itemSum": 41250,
        "itemUnion": 41250,
        "route": "connected",
        "reach": [
          "connected",
          "connected",
          "connected"
        ],
        "minItemGap": 100.0,
        "v1": "connected",
        "method": "1 cm cell count + 1 cm raster flood + rectangle distance + Python v1"
      },
      "checks": [
        {
          "name": "furniture sum",
          "expected": 41250,
          "actual": 41250,
          "pass": true
        },
        {
          "name": "floor covered",
          "expected": 41250,
          "actual": 41250,
          "pass": true
        },
        {
          "name": "route = raster",
          "expected": "connected",
          "actual": "connected",
          "pass": true
        },
        {
          "name": "pieces reachable = raster",
          "expected": [
            "connected",
            "connected",
            "connected"
          ],
          "actual": [
            "connected",
            "connected",
            "connected"
          ],
          "pass": true
        },
        {
          "name": "route to desk = raster",
          "expected": "connected",
          "actual": "connected",
          "pass": true
        },
        {
          "name": "narrowest gap",
          "expected": 100.0,
          "actual": 100,
          "pass": true
        },
        {
          "name": "v1 JS = v1 Python",
          "expected": "connected",
          "actual": "connected",
          "pass": true
        }
      ],
      "pass": true
    },
    {
      "id": "C",
      "label": {
        "ko": "침대를 방 가운데 윗벽에",
        "en": "Bed centred on the top wall"
      },
      "preset": "x5C",
      "input": {
        "room": {
          "w": 300,
          "h": 350
        },
        "items": [
          {
            "type": "bedQueen",
            "x": 75,
            "y": 0,
            "w": 150,
            "h": 200
          },
          {
            "type": "desk",
            "x": 0,
            "y": 0,
            "w": 50,
            "h": 105
          },
          {
            "type": "wardrobe",
            "x": 200,
            "y": 290,
            "w": 100,
            "h": 60
          }
        ]
      },
      "actual": {
        "itemSum": 41250,
        "itemUnion": 41250,
        "free": 63750,
        "minItemGap": 25,
        "narrowGaps": [
          {
            "a": {
              "kind": "item",
              "index": 0
            },
            "b": {
              "kind": "item",
              "index": 1
            },
            "d": 25
          }
        ],
        "route": {
          "status": "connected",
          "reason": "ok",
          "bottleneck": 70,
          "step": 5,
          "tight": 42,
          "items": [
            "connected",
            "connected",
            "connected"
          ],
          "pathPoints": 6,
          "path": [
            [
              160,
              320
            ],
            [
              160,
              280
            ],
            [
              185,
              255
            ],
            [
              220,
              255
            ],
            [
              260,
              215
            ],
            [
              260,
              95
            ]
          ]
        },
        "routeToDesk": {
          "status": "connected",
          "reason": "ok",
          "bottleneck": 70,
          "step": 5,
          "tight": 19,
          "items": [
            "connected",
            "connected",
            "connected"
          ],
          "pathPoints": 5,
          "path": [
            [
              140,
              320
            ],
            [
              65,
              245
            ],
            [
              60,
              235
            ],
            [
              40,
              215
            ],
            [
              40,
              145
            ]
          ]
        }
      },
      "legacy": {
        "status": "connected",
        "pass": true
      },
      "expected": {
        "itemSum": 41250,
        "itemUnion": 41250,
        "route": "connected",
        "reach": [
          "connected",
          "connected",
          "connected"
        ],
        "minItemGap": 25.0,
        "v1": "connected",
        "method": "1 cm cell count + 1 cm raster flood + rectangle distance + Python v1"
      },
      "checks": [
        {
          "name": "furniture sum",
          "expected": 41250,
          "actual": 41250,
          "pass": true
        },
        {
          "name": "floor covered",
          "expected": 41250,
          "actual": 41250,
          "pass": true
        },
        {
          "name": "route = raster",
          "expected": "connected",
          "actual": "connected",
          "pass": true
        },
        {
          "name": "pieces reachable = raster",
          "expected": [
            "connected",
            "connected",
            "connected"
          ],
          "actual": [
            "connected",
            "connected",
            "connected"
          ],
          "pass": true
        },
        {
          "name": "route to desk = raster",
          "expected": "connected",
          "actual": "connected",
          "pass": true
        },
        {
          "name": "narrowest gap",
          "expected": 25.0,
          "actual": 25,
          "pass": true
        },
        {
          "name": "v1 JS = v1 Python",
          "expected": "connected",
          "actual": "connected",
          "pass": true
        }
      ],
      "pass": true
    },
    {
      "id": "D",
      "label": {
        "ko": "침대를 왼쪽 벽 가운데로 내림",
        "en": "Bed lowered to the middle of the left wall"
      },
      "preset": "x5D",
      "input": {
        "room": {
          "w": 300,
          "h": 350
        },
        "items": [
          {
            "type": "bedQueen",
            "x": 0,
            "y": 75,
            "w": 150,
            "h": 200
          },
          {
            "type": "desk",
            "x": 250,
            "y": 0,
            "w": 50,
            "h": 105
          },
          {
            "type": "wardrobe",
            "x": 0,
            "y": 0,
            "w": 100,
            "h": 60
          }
        ]
      },
      "actual": {
        "itemSum": 41250,
        "itemUnion": 41250,
        "free": 63750,
        "minItemGap": 15,
        "narrowGaps": [
          {
            "a": {
              "kind": "item",
              "index": 0
            },
            "b": {
              "kind": "item",
              "index": 2
            },
            "d": 15
          }
        ],
        "route": {
          "status": "connected",
          "reason": "ok",
          "bottleneck": 80,
          "step": 5,
          "tight": 0,
          "items": [
            "connected",
            "connected",
            "connected"
          ],
          "pathPoints": 6,
          "path": [
            [
              160,
              320
            ],
            [
              170,
              320
            ],
            [
              195,
              295
            ],
            [
              195,
              285
            ],
            [
              200,
              280
            ],
            [
              200,
              95
            ]
          ]
        },
        "routeToDesk": {
          "status": "connected",
          "reason": "ok",
          "bottleneck": 80,
          "step": 5,
          "tight": 0,
          "items": [
            "connected",
            "connected",
            "connected"
          ],
          "pathPoints": 7,
          "path": [
            [
              160,
              320
            ],
            [
              165,
              320
            ],
            [
              185,
              300
            ],
            [
              185,
              295
            ],
            [
              190,
              290
            ],
            [
              190,
              205
            ],
            [
              250,
              145
            ]
          ]
        }
      },
      "legacy": {
        "status": "connected",
        "pass": true
      },
      "expected": {
        "itemSum": 41250,
        "itemUnion": 41250,
        "route": "connected",
        "reach": [
          "connected",
          "connected",
          "connected"
        ],
        "minItemGap": 15.0,
        "v1": "connected",
        "method": "1 cm cell count + 1 cm raster flood + rectangle distance + Python v1"
      },
      "checks": [
        {
          "name": "furniture sum",
          "expected": 41250,
          "actual": 41250,
          "pass": true
        },
        {
          "name": "floor covered",
          "expected": 41250,
          "actual": 41250,
          "pass": true
        },
        {
          "name": "route = raster",
          "expected": "connected",
          "actual": "connected",
          "pass": true
        },
        {
          "name": "pieces reachable = raster",
          "expected": [
            "connected",
            "connected",
            "connected"
          ],
          "actual": [
            "connected",
            "connected",
            "connected"
          ],
          "pass": true
        },
        {
          "name": "route to desk = raster",
          "expected": "connected",
          "actual": "connected",
          "pass": true
        },
        {
          "name": "narrowest gap",
          "expected": 15.0,
          "actual": 15,
          "pass": true
        },
        {
          "name": "v1 JS = v1 Python",
          "expected": "connected",
          "actual": "connected",
          "pass": true
        }
      ],
      "pass": true
    }
  ],
  "verification": {
    "cases": 4,
    "passed": 4,
    "failed": 0,
    "checks": 28
  }
}
