feat: generate theory-aligned pathing artifacts

This commit is contained in:
BruceChen 2026-04-14 11:06:19 +00:00
parent 7fbb32d8b9
commit ef3cd64475
10 changed files with 2716 additions and 1 deletions

View file

@ -0,0 +1,327 @@
[
{
"case_id": "ceiling-headhitter-sprint-mm12-gap1-ceil4p0",
"bucket_id": "ceiling:headhitter:sprint:easy",
"family": "ceiling",
"subfamily": "headhitter",
"movement_mode": "sprint",
"momentum_ticks": 12,
"difficulty_band": "easy",
"expected_result": "pass",
"world_recipe_id": "ceiling-headhitter",
"gap_blocks": 1,
"delta_y": 0.0,
"ceiling_height": 4.0,
"wall_width": null,
"start": {
"x": 100.5,
"y": 80.0,
"z": 100.5
},
"goal": {
"x": 102.0,
"y": 80.0,
"z": 100.0
}
},
{
"case_id": "ceiling-headhitter-sprint-mm12-gap3-ceil1p8125",
"bucket_id": "ceiling:headhitter:sprint:boundary",
"family": "ceiling",
"subfamily": "headhitter",
"movement_mode": "sprint",
"momentum_ticks": 12,
"difficulty_band": "boundary",
"expected_result": "pass",
"world_recipe_id": "ceiling-headhitter",
"gap_blocks": 3,
"delta_y": 0.0,
"ceiling_height": 1.8125,
"wall_width": null,
"start": {
"x": 100.5,
"y": 80.0,
"z": 100.5
},
"goal": {
"x": 104.0,
"y": 80.0,
"z": 100.0
}
},
{
"case_id": "ceiling-headhitter-sprint-mm12-gap4-ceil2p0",
"bucket_id": "ceiling:headhitter:sprint:reject",
"family": "ceiling",
"subfamily": "headhitter",
"movement_mode": "sprint",
"momentum_ticks": 12,
"difficulty_band": "reject",
"expected_result": "reject",
"world_recipe_id": "ceiling-headhitter",
"gap_blocks": 4,
"delta_y": 0.0,
"ceiling_height": 2.0,
"wall_width": null,
"start": {
"x": 100.5,
"y": 80.0,
"z": 100.5
},
"goal": {
"x": 105.0,
"y": 80.0,
"z": 100.0
}
},
{
"case_id": "linear-ascend-sprint-mm12-gap0-dy1p0",
"bucket_id": "linear:ascend:sprint:easy",
"family": "linear",
"subfamily": "ascend",
"movement_mode": "sprint",
"momentum_ticks": 12,
"difficulty_band": "easy",
"expected_result": "pass",
"world_recipe_id": "linear-ascend",
"gap_blocks": 0,
"delta_y": 1.0,
"ceiling_height": null,
"wall_width": null,
"start": {
"x": 100.5,
"y": 80.0,
"z": 100.5
},
"goal": {
"x": 101.0,
"y": 81.0,
"z": 100.0
}
},
{
"case_id": "linear-ascend-sprint-mm12-gap5-dy1p0",
"bucket_id": "linear:ascend:sprint:boundary",
"family": "linear",
"subfamily": "ascend",
"movement_mode": "sprint",
"momentum_ticks": 12,
"difficulty_band": "boundary",
"expected_result": "pass",
"world_recipe_id": "linear-ascend",
"gap_blocks": 5,
"delta_y": 1.0,
"ceiling_height": null,
"wall_width": null,
"start": {
"x": 100.5,
"y": 80.0,
"z": 100.5
},
"goal": {
"x": 106.0,
"y": 81.0,
"z": 100.0
}
},
{
"case_id": "linear-ascend-sprint-mm12-gap6-dy1p0",
"bucket_id": "linear:ascend:sprint:reject",
"family": "linear",
"subfamily": "ascend",
"movement_mode": "sprint",
"momentum_ticks": 12,
"difficulty_band": "reject",
"expected_result": "reject",
"world_recipe_id": "linear-ascend",
"gap_blocks": 6,
"delta_y": 1.0,
"ceiling_height": null,
"wall_width": null,
"start": {
"x": 100.5,
"y": 80.0,
"z": 100.5
},
"goal": {
"x": 107.0,
"y": 81.0,
"z": 100.0
}
},
{
"case_id": "linear-descend-sprint-mm12-gap0-dym2p0",
"bucket_id": "linear:descend:sprint:easy",
"family": "linear",
"subfamily": "descend",
"movement_mode": "sprint",
"momentum_ticks": 12,
"difficulty_band": "easy",
"expected_result": "pass",
"world_recipe_id": "linear-descend",
"gap_blocks": 0,
"delta_y": -2.0,
"ceiling_height": null,
"wall_width": null,
"start": {
"x": 100.5,
"y": 80.0,
"z": 100.5
},
"goal": {
"x": 101.0,
"y": 78.0,
"z": 100.0
}
},
{
"case_id": "linear-descend-sprint-mm12-gap7-dym1p0",
"bucket_id": "linear:descend:sprint:boundary",
"family": "linear",
"subfamily": "descend",
"movement_mode": "sprint",
"momentum_ticks": 12,
"difficulty_band": "boundary",
"expected_result": "pass",
"world_recipe_id": "linear-descend",
"gap_blocks": 7,
"delta_y": -1.0,
"ceiling_height": null,
"wall_width": null,
"start": {
"x": 100.5,
"y": 80.0,
"z": 100.5
},
"goal": {
"x": 108.0,
"y": 79.0,
"z": 100.0
}
},
{
"case_id": "linear-flat-sprint-mm12-gap0-dy0p0",
"bucket_id": "linear:flat:sprint:easy",
"family": "linear",
"subfamily": "flat",
"movement_mode": "sprint",
"momentum_ticks": 12,
"difficulty_band": "easy",
"expected_result": "pass",
"world_recipe_id": "linear-flat",
"gap_blocks": 0,
"delta_y": 0.0,
"ceiling_height": null,
"wall_width": null,
"start": {
"x": 100.5,
"y": 80.0,
"z": 100.5
},
"goal": {
"x": 101.0,
"y": 80.0,
"z": 100.0
}
},
{
"case_id": "linear-flat-sprint-mm12-gap6-dy0p0",
"bucket_id": "linear:flat:sprint:boundary",
"family": "linear",
"subfamily": "flat",
"movement_mode": "sprint",
"momentum_ticks": 12,
"difficulty_band": "boundary",
"expected_result": "pass",
"world_recipe_id": "linear-flat",
"gap_blocks": 6,
"delta_y": 0.0,
"ceiling_height": null,
"wall_width": null,
"start": {
"x": 100.5,
"y": 80.0,
"z": 100.5
},
"goal": {
"x": 107.0,
"y": 80.0,
"z": 100.0
}
},
{
"case_id": "linear-flat-sprint-mm12-gap7-dy0p0",
"bucket_id": "linear:flat:sprint:reject",
"family": "linear",
"subfamily": "flat",
"movement_mode": "sprint",
"momentum_ticks": 12,
"difficulty_band": "reject",
"expected_result": "reject",
"world_recipe_id": "linear-flat",
"gap_blocks": 7,
"delta_y": 0.0,
"ceiling_height": null,
"wall_width": null,
"start": {
"x": 100.5,
"y": 80.0,
"z": 100.5
},
"goal": {
"x": 108.0,
"y": 80.0,
"z": 100.0
}
},
{
"case_id": "neo-neo-sprint-mm12-wall1",
"bucket_id": "neo:neo:sprint:easy",
"family": "neo",
"subfamily": "neo",
"movement_mode": "sprint",
"momentum_ticks": 12,
"difficulty_band": "easy",
"expected_result": "pass",
"world_recipe_id": "neo-wall",
"gap_blocks": null,
"delta_y": 0.0,
"ceiling_height": null,
"wall_width": 1,
"start": {
"x": 100.5,
"y": 80.0,
"z": 100.5
},
"goal": {
"x": 102.0,
"y": 80.0,
"z": 101.0
}
},
{
"case_id": "neo-neo-sprint-mm12-wall4",
"bucket_id": "neo:neo:sprint:boundary",
"family": "neo",
"subfamily": "neo",
"movement_mode": "sprint",
"momentum_ticks": 12,
"difficulty_band": "boundary",
"expected_result": "pass",
"world_recipe_id": "neo-wall",
"gap_blocks": null,
"delta_y": 0.0,
"ceiling_height": null,
"wall_width": 4,
"start": {
"x": 100.5,
"y": 80.0,
"z": 100.5
},
"goal": {
"x": 102.0,
"y": 80.0,
"z": 104.0
}
}
]

View file

@ -0,0 +1,121 @@
case_id,family,subfamily,movement_mode,momentum_ticks,gap_blocks,delta_y,ceiling_height,wall_width,expected_reachable,landing_x,apex_y,margin,notes
linear-flat-walk-mm12-gap0-dy0p0,linear,flat,walk,12,0,0.0,,,True,6.222586344756974,1.2522033525119995,5.422586344756974,
linear-ascend-walk-mm12-gap0-dy1p0,linear,ascend,walk,12,0,1.0,,,True,5.4889195238454125,1.2522033525119995,4.688919523845413,
linear-descend-walk-mm12-gap0-dym1p0,linear,descend,walk,12,0,-1.0,,,True,6.700370323067186,1.2522033525119995,5.900370323067186,
linear-descend-walk-mm12-gap0-dym2p0,linear,descend,walk,12,0,-2.0,,,True,6.936456664658121,1.2522033525119995,6.136456664658121,
linear-flat-walk-mm12-gap1-dy0p0,linear,flat,walk,12,1,0.0,,,True,6.222586344756974,1.2522033525119995,4.422586344756974,
linear-ascend-walk-mm12-gap1-dy1p0,linear,ascend,walk,12,1,1.0,,,True,5.4889195238454125,1.2522033525119995,3.6889195238454127,
linear-descend-walk-mm12-gap1-dym1p0,linear,descend,walk,12,1,-1.0,,,True,6.700370323067186,1.2522033525119995,4.900370323067186,
linear-descend-walk-mm12-gap1-dym2p0,linear,descend,walk,12,1,-2.0,,,True,6.936456664658121,1.2522033525119995,5.136456664658121,
linear-flat-walk-mm12-gap2-dy0p0,linear,flat,walk,12,2,0.0,,,True,6.222586344756974,1.2522033525119995,3.422586344756974,
linear-ascend-walk-mm12-gap2-dy1p0,linear,ascend,walk,12,2,1.0,,,True,5.4889195238454125,1.2522033525119995,2.6889195238454127,
linear-descend-walk-mm12-gap2-dym1p0,linear,descend,walk,12,2,-1.0,,,True,6.700370323067186,1.2522033525119995,3.900370323067186,
linear-descend-walk-mm12-gap2-dym2p0,linear,descend,walk,12,2,-2.0,,,True,6.936456664658121,1.2522033525119995,4.136456664658121,
linear-flat-walk-mm12-gap3-dy0p0,linear,flat,walk,12,3,0.0,,,True,6.222586344756974,1.2522033525119995,2.422586344756974,
linear-ascend-walk-mm12-gap3-dy1p0,linear,ascend,walk,12,3,1.0,,,True,5.4889195238454125,1.2522033525119995,1.6889195238454127,
linear-descend-walk-mm12-gap3-dym1p0,linear,descend,walk,12,3,-1.0,,,True,6.700370323067186,1.2522033525119995,2.900370323067186,
linear-descend-walk-mm12-gap3-dym2p0,linear,descend,walk,12,3,-2.0,,,True,6.936456664658121,1.2522033525119995,3.1364566646581213,
linear-flat-walk-mm12-gap4-dy0p0,linear,flat,walk,12,4,0.0,,,True,6.222586344756974,1.2522033525119995,1.422586344756974,
linear-ascend-walk-mm12-gap4-dy1p0,linear,ascend,walk,12,4,1.0,,,True,5.4889195238454125,1.2522033525119995,0.6889195238454127,
linear-descend-walk-mm12-gap4-dym1p0,linear,descend,walk,12,4,-1.0,,,True,6.700370323067186,1.2522033525119995,1.900370323067186,
linear-descend-walk-mm12-gap4-dym2p0,linear,descend,walk,12,4,-2.0,,,True,6.936456664658121,1.2522033525119995,2.1364566646581213,
linear-flat-walk-mm12-gap5-dy0p0,linear,flat,walk,12,5,0.0,,,True,6.222586344756974,1.2522033525119995,0.422586344756974,
linear-ascend-walk-mm12-gap5-dy1p0,linear,ascend,walk,12,5,1.0,,,False,5.736036437366307,1.2522033525119995,-0.06396356263369274,
linear-descend-walk-mm12-gap5-dym1p0,linear,descend,walk,12,5,-1.0,,,True,6.700370323067186,1.2522033525119995,0.900370323067186,
linear-descend-walk-mm12-gap5-dym2p0,linear,descend,walk,12,5,-2.0,,,True,6.936456664658121,1.2522033525119995,1.1364566646581213,
linear-flat-walk-mm12-gap6-dy0p0,linear,flat,walk,12,6,0.0,,,False,6.222586344756974,1.2522033525119995,-0.577413655243026,
linear-ascend-walk-mm12-gap6-dy1p0,linear,ascend,walk,12,6,1.0,,,False,6.222586344756974,1.2522033525119995,-0.577413655243026,
linear-descend-walk-mm12-gap6-dym1p0,linear,descend,walk,12,6,-1.0,,,False,6.222586344756974,1.2522033525119995,-0.577413655243026,
linear-descend-walk-mm12-gap6-dym2p0,linear,descend,walk,12,6,-2.0,,,False,6.222586344756974,1.2522033525119995,-0.577413655243026,
linear-flat-walk-mm12-gap7-dy0p0,linear,flat,walk,12,7,0.0,,,False,6.222586344756974,1.2522033525119995,-1.577413655243026,
linear-ascend-walk-mm12-gap7-dy1p0,linear,ascend,walk,12,7,1.0,,,False,6.222586344756974,1.2522033525119995,-1.577413655243026,
linear-descend-walk-mm12-gap7-dym1p0,linear,descend,walk,12,7,-1.0,,,False,6.222586344756974,1.2522033525119995,-1.577413655243026,
linear-descend-walk-mm12-gap7-dym2p0,linear,descend,walk,12,7,-2.0,,,False,6.222586344756974,1.2522033525119995,-1.577413655243026,
linear-flat-sprint-mm0-gap0-dy0p0,linear,flat,sprint,0,0,0.0,,,True,3.45850527608291,1.2522033525119995,2.65850527608291,
linear-ascend-sprint-mm0-gap0-dy1p0,linear,ascend,sprint,0,0,1.0,,,True,2.67362389586132,1.2522033525119995,1.8736238958613198,
linear-descend-sprint-mm0-gap0-dym1p0,linear,descend,sprint,0,0,-1.0,,,True,3.9632109047152393,1.2522033525119995,3.163210904715239,
linear-descend-sprint-mm0-gap0-dym2p0,linear,descend,sprint,0,0,-2.0,,,True,4.210969402657874,1.2522033525119995,3.410969402657874,
linear-flat-sprint-mm0-gap1-dy0p0,linear,flat,sprint,0,1,0.0,,,True,3.45850527608291,1.2522033525119995,1.65850527608291,
linear-ascend-sprint-mm0-gap1-dy1p0,linear,ascend,sprint,0,1,1.0,,,True,2.67362389586132,1.2522033525119995,0.8736238958613198,
linear-descend-sprint-mm0-gap1-dym1p0,linear,descend,sprint,0,1,-1.0,,,True,3.9632109047152393,1.2522033525119995,2.163210904715239,
linear-descend-sprint-mm0-gap1-dym2p0,linear,descend,sprint,0,1,-2.0,,,True,4.210969402657874,1.2522033525119995,2.410969402657874,
linear-flat-sprint-mm0-gap2-dy0p0,linear,flat,sprint,0,2,0.0,,,True,3.45850527608291,1.2522033525119995,0.6585052760829102,
linear-ascend-sprint-mm0-gap2-dy1p0,linear,ascend,sprint,0,2,1.0,,,False,2.67362389586132,1.2522033525119995,-0.12637610413867995,
linear-descend-sprint-mm0-gap2-dym1p0,linear,descend,sprint,0,2,-1.0,,,True,3.9632109047152393,1.2522033525119995,1.1632109047152395,
linear-descend-sprint-mm0-gap2-dym2p0,linear,descend,sprint,0,2,-2.0,,,True,4.210969402657874,1.2522033525119995,1.4109694026578739,
linear-flat-sprint-mm0-gap3-dy0p0,linear,flat,sprint,0,3,0.0,,,False,3.45850527608291,1.2522033525119995,-0.3414947239170898,
linear-ascend-sprint-mm0-gap3-dy1p0,linear,ascend,sprint,0,3,1.0,,,False,3.45850527608291,1.2522033525119995,-0.3414947239170898,
linear-descend-sprint-mm0-gap3-dym1p0,linear,descend,sprint,0,3,-1.0,,,False,3.45850527608291,1.2522033525119995,-0.3414947239170898,
linear-descend-sprint-mm0-gap3-dym2p0,linear,descend,sprint,0,3,-2.0,,,False,3.45850527608291,1.2522033525119995,-0.3414947239170898,
linear-flat-sprint-mm0-gap4-dy0p0,linear,flat,sprint,0,4,0.0,,,False,3.45850527608291,1.2522033525119995,-1.3414947239170898,
linear-ascend-sprint-mm0-gap4-dy1p0,linear,ascend,sprint,0,4,1.0,,,False,3.45850527608291,1.2522033525119995,-1.3414947239170898,
linear-descend-sprint-mm0-gap4-dym1p0,linear,descend,sprint,0,4,-1.0,,,False,3.45850527608291,1.2522033525119995,-1.3414947239170898,
linear-descend-sprint-mm0-gap4-dym2p0,linear,descend,sprint,0,4,-2.0,,,False,3.45850527608291,1.2522033525119995,-1.3414947239170898,
linear-flat-sprint-mm0-gap5-dy0p0,linear,flat,sprint,0,5,0.0,,,False,3.45850527608291,1.2522033525119995,-2.34149472391709,
linear-ascend-sprint-mm0-gap5-dy1p0,linear,ascend,sprint,0,5,1.0,,,False,3.45850527608291,1.2522033525119995,-2.34149472391709,
linear-descend-sprint-mm0-gap5-dym1p0,linear,descend,sprint,0,5,-1.0,,,False,3.45850527608291,1.2522033525119995,-2.34149472391709,
linear-descend-sprint-mm0-gap5-dym2p0,linear,descend,sprint,0,5,-2.0,,,False,3.45850527608291,1.2522033525119995,-2.34149472391709,
linear-flat-sprint-mm0-gap6-dy0p0,linear,flat,sprint,0,6,0.0,,,False,3.45850527608291,1.2522033525119995,-3.34149472391709,
linear-ascend-sprint-mm0-gap6-dy1p0,linear,ascend,sprint,0,6,1.0,,,False,3.45850527608291,1.2522033525119995,-3.34149472391709,
linear-descend-sprint-mm0-gap6-dym1p0,linear,descend,sprint,0,6,-1.0,,,False,3.45850527608291,1.2522033525119995,-3.34149472391709,
linear-descend-sprint-mm0-gap6-dym2p0,linear,descend,sprint,0,6,-2.0,,,False,3.45850527608291,1.2522033525119995,-3.34149472391709,
linear-flat-sprint-mm0-gap7-dy0p0,linear,flat,sprint,0,7,0.0,,,False,3.45850527608291,1.2522033525119995,-4.34149472391709,
linear-ascend-sprint-mm0-gap7-dy1p0,linear,ascend,sprint,0,7,1.0,,,False,3.45850527608291,1.2522033525119995,-4.34149472391709,
linear-descend-sprint-mm0-gap7-dym1p0,linear,descend,sprint,0,7,-1.0,,,False,3.45850527608291,1.2522033525119995,-4.34149472391709,
linear-descend-sprint-mm0-gap7-dym2p0,linear,descend,sprint,0,7,-2.0,,,False,3.45850527608291,1.2522033525119995,-4.34149472391709,
linear-flat-sprint-mm12-gap0-dy0p0,linear,flat,sprint,12,0,0.0,,,True,7.728196372726743,1.2522033525119995,6.9281963727267435,
linear-ascend-sprint-mm12-gap0-dy1p0,linear,ascend,sprint,12,0,1.0,,,True,6.7601866346681065,1.2522033525119995,5.960186634668107,
linear-descend-sprint-mm12-gap0-dym1p0,linear,descend,sprint,12,0,-1.0,,,True,8.329165987228953,1.2522033525119995,7.529165987228953,
linear-descend-sprint-mm12-gap0-dym2p0,linear,descend,sprint,12,0,-2.0,,,True,8.618660719045328,1.2522033525119995,7.8186607190453286,
linear-flat-sprint-mm12-gap1-dy0p0,linear,flat,sprint,12,1,0.0,,,True,7.728196372726743,1.2522033525119995,5.9281963727267435,
linear-ascend-sprint-mm12-gap1-dy1p0,linear,ascend,sprint,12,1,1.0,,,True,6.7601866346681065,1.2522033525119995,4.960186634668107,
linear-descend-sprint-mm12-gap1-dym1p0,linear,descend,sprint,12,1,-1.0,,,True,8.329165987228953,1.2522033525119995,6.529165987228953,
linear-descend-sprint-mm12-gap1-dym2p0,linear,descend,sprint,12,1,-2.0,,,True,8.618660719045328,1.2522033525119995,6.8186607190453286,
linear-flat-sprint-mm12-gap2-dy0p0,linear,flat,sprint,12,2,0.0,,,True,7.728196372726743,1.2522033525119995,4.9281963727267435,
linear-ascend-sprint-mm12-gap2-dy1p0,linear,ascend,sprint,12,2,1.0,,,True,6.7601866346681065,1.2522033525119995,3.9601866346681067,
linear-descend-sprint-mm12-gap2-dym1p0,linear,descend,sprint,12,2,-1.0,,,True,8.329165987228953,1.2522033525119995,5.529165987228953,
linear-descend-sprint-mm12-gap2-dym2p0,linear,descend,sprint,12,2,-2.0,,,True,8.618660719045328,1.2522033525119995,5.8186607190453286,
linear-flat-sprint-mm12-gap3-dy0p0,linear,flat,sprint,12,3,0.0,,,True,7.728196372726743,1.2522033525119995,3.9281963727267435,
linear-ascend-sprint-mm12-gap3-dy1p0,linear,ascend,sprint,12,3,1.0,,,True,6.7601866346681065,1.2522033525119995,2.9601866346681067,
linear-descend-sprint-mm12-gap3-dym1p0,linear,descend,sprint,12,3,-1.0,,,True,8.329165987228953,1.2522033525119995,4.529165987228953,
linear-descend-sprint-mm12-gap3-dym2p0,linear,descend,sprint,12,3,-2.0,,,True,8.618660719045328,1.2522033525119995,4.8186607190453286,
linear-flat-sprint-mm12-gap4-dy0p0,linear,flat,sprint,12,4,0.0,,,True,7.728196372726743,1.2522033525119995,2.9281963727267435,
linear-ascend-sprint-mm12-gap4-dy1p0,linear,ascend,sprint,12,4,1.0,,,True,6.7601866346681065,1.2522033525119995,1.9601866346681067,
linear-descend-sprint-mm12-gap4-dym1p0,linear,descend,sprint,12,4,-1.0,,,True,8.329165987228953,1.2522033525119995,3.5291659872289527,
linear-descend-sprint-mm12-gap4-dym2p0,linear,descend,sprint,12,4,-2.0,,,True,8.618660719045328,1.2522033525119995,3.8186607190453286,
linear-flat-sprint-mm12-gap5-dy0p0,linear,flat,sprint,12,5,0.0,,,True,7.728196372726743,1.2522033525119995,1.9281963727267435,
linear-ascend-sprint-mm12-gap5-dy1p0,linear,ascend,sprint,12,5,1.0,,,True,6.7601866346681065,1.2522033525119995,0.9601866346681067,
linear-descend-sprint-mm12-gap5-dym1p0,linear,descend,sprint,12,5,-1.0,,,True,8.329165987228953,1.2522033525119995,2.5291659872289527,
linear-descend-sprint-mm12-gap5-dym2p0,linear,descend,sprint,12,5,-2.0,,,True,8.618660719045328,1.2522033525119995,2.8186607190453286,
linear-flat-sprint-mm12-gap6-dy0p0,linear,flat,sprint,12,6,0.0,,,True,7.728196372726743,1.2522033525119995,0.9281963727267435,
linear-ascend-sprint-mm12-gap6-dy1p0,linear,ascend,sprint,12,6,1.0,,,False,6.7601866346681065,1.2522033525119995,-0.03981336533189328,
linear-descend-sprint-mm12-gap6-dym1p0,linear,descend,sprint,12,6,-1.0,,,True,8.329165987228953,1.2522033525119995,1.5291659872289527,
linear-descend-sprint-mm12-gap6-dym2p0,linear,descend,sprint,12,6,-2.0,,,True,8.618660719045328,1.2522033525119995,1.8186607190453286,
linear-flat-sprint-mm12-gap7-dy0p0,linear,flat,sprint,12,7,0.0,,,False,7.728196372726743,1.2522033525119995,-0.07180362727325651,
linear-ascend-sprint-mm12-gap7-dy1p0,linear,ascend,sprint,12,7,1.0,,,False,7.728196372726743,1.2522033525119995,-0.07180362727325651,
linear-descend-sprint-mm12-gap7-dym1p0,linear,descend,sprint,12,7,-1.0,,,True,8.329165987228953,1.2522033525119995,0.5291659872289527,
linear-descend-sprint-mm12-gap7-dym2p0,linear,descend,sprint,12,7,-2.0,,,True,8.618660719045328,1.2522033525119995,0.8186607190453286,
neo-neo-sprint-mm12-wall1,neo,neo,sprint,12,,0.0,,1,True,7.728196372726743,1.2522033525119995,6.128196372726743,
neo-neo-sprint-mm12-wall2,neo,neo,sprint,12,,0.0,,2,True,7.728196372726743,1.2522033525119995,5.128196372726743,
neo-neo-sprint-mm12-wall3,neo,neo,sprint,12,,0.0,,3,True,7.728196372726743,1.2522033525119995,4.128196372726743,
neo-neo-sprint-mm12-wall4,neo,neo,sprint,12,,0.0,,4,True,7.728196372726743,1.2522033525119995,3.1281963727267437,
ceiling-headhitter-sprint-mm12-gap1-ceil4p0,ceiling,headhitter,sprint,12,1,0.0,4.0,,True,7.728196372726743,1.2522033525119995,5.9281963727267435,
ceiling-headhitter-sprint-mm12-gap2-ceil4p0,ceiling,headhitter,sprint,12,2,0.0,4.0,,True,7.728196372726743,1.2522033525119995,4.9281963727267435,
ceiling-headhitter-sprint-mm12-gap3-ceil4p0,ceiling,headhitter,sprint,12,3,0.0,4.0,,True,7.728196372726743,1.2522033525119995,3.9281963727267435,
ceiling-headhitter-sprint-mm12-gap4-ceil4p0,ceiling,headhitter,sprint,12,4,0.0,4.0,,True,7.728196372726743,1.2522033525119995,2.9281963727267435,
ceiling-headhitter-sprint-mm12-gap1-ceil3p0,ceiling,headhitter,sprint,12,1,0.0,3.0,,True,7.415249123142595,1.2,5.615249123142595,
ceiling-headhitter-sprint-mm12-gap2-ceil3p0,ceiling,headhitter,sprint,12,2,0.0,3.0,,True,7.415249123142595,1.2,4.615249123142595,
ceiling-headhitter-sprint-mm12-gap3-ceil3p0,ceiling,headhitter,sprint,12,3,0.0,3.0,,True,7.415249123142595,1.2,3.615249123142595,
ceiling-headhitter-sprint-mm12-gap4-ceil3p0,ceiling,headhitter,sprint,12,4,0.0,3.0,,True,7.415249123142595,1.2,2.615249123142595,
ceiling-headhitter-sprint-mm12-gap1-ceil2p5,ceiling,headhitter,sprint,12,1,0.0,2.5,,True,5.6892730007057635,0.7,3.8892730007057636,
ceiling-headhitter-sprint-mm12-gap2-ceil2p5,ceiling,headhitter,sprint,12,2,0.0,2.5,,True,5.6892730007057635,0.7,2.8892730007057636,
ceiling-headhitter-sprint-mm12-gap3-ceil2p5,ceiling,headhitter,sprint,12,3,0.0,2.5,,True,5.6892730007057635,0.7,1.8892730007057636,
ceiling-headhitter-sprint-mm12-gap4-ceil2p5,ceiling,headhitter,sprint,12,4,0.0,2.5,,True,5.6892730007057635,0.7,0.8892730007057636,
ceiling-headhitter-sprint-mm12-gap1-ceil2p0,ceiling,headhitter,sprint,12,1,0.0,2.0,,True,4.481804356129017,0.19999999999999996,2.6818043561290175,
ceiling-headhitter-sprint-mm12-gap2-ceil2p0,ceiling,headhitter,sprint,12,2,0.0,2.0,,True,4.481804356129017,0.19999999999999996,1.6818043561290175,
ceiling-headhitter-sprint-mm12-gap3-ceil2p0,ceiling,headhitter,sprint,12,3,0.0,2.0,,True,4.481804356129017,0.19999999999999996,0.6818043561290175,
ceiling-headhitter-sprint-mm12-gap4-ceil2p0,ceiling,headhitter,sprint,12,4,0.0,2.0,,False,4.481804356129017,0.19999999999999996,-0.31819564387098254,
ceiling-headhitter-sprint-mm12-gap1-ceil1p8125,ceiling,headhitter,sprint,12,1,0.0,1.8125,,True,4.041631522485753,0.012499999999999956,2.2416315224857533,
ceiling-headhitter-sprint-mm12-gap2-ceil1p8125,ceiling,headhitter,sprint,12,2,0.0,1.8125,,True,4.041631522485753,0.012499999999999956,1.2416315224857533,
ceiling-headhitter-sprint-mm12-gap3-ceil1p8125,ceiling,headhitter,sprint,12,3,0.0,1.8125,,True,4.041631522485753,0.012499999999999956,0.24163152248575326,
ceiling-headhitter-sprint-mm12-gap4-ceil1p8125,ceiling,headhitter,sprint,12,4,0.0,1.8125,,False,4.041631522485753,0.012499999999999956,-0.7583684775142467,
1 case_id family subfamily movement_mode momentum_ticks gap_blocks delta_y ceiling_height wall_width expected_reachable landing_x apex_y margin notes
2 linear-flat-walk-mm12-gap0-dy0p0 linear flat walk 12 0 0.0 True 6.222586344756974 1.2522033525119995 5.422586344756974
3 linear-ascend-walk-mm12-gap0-dy1p0 linear ascend walk 12 0 1.0 True 5.4889195238454125 1.2522033525119995 4.688919523845413
4 linear-descend-walk-mm12-gap0-dym1p0 linear descend walk 12 0 -1.0 True 6.700370323067186 1.2522033525119995 5.900370323067186
5 linear-descend-walk-mm12-gap0-dym2p0 linear descend walk 12 0 -2.0 True 6.936456664658121 1.2522033525119995 6.136456664658121
6 linear-flat-walk-mm12-gap1-dy0p0 linear flat walk 12 1 0.0 True 6.222586344756974 1.2522033525119995 4.422586344756974
7 linear-ascend-walk-mm12-gap1-dy1p0 linear ascend walk 12 1 1.0 True 5.4889195238454125 1.2522033525119995 3.6889195238454127
8 linear-descend-walk-mm12-gap1-dym1p0 linear descend walk 12 1 -1.0 True 6.700370323067186 1.2522033525119995 4.900370323067186
9 linear-descend-walk-mm12-gap1-dym2p0 linear descend walk 12 1 -2.0 True 6.936456664658121 1.2522033525119995 5.136456664658121
10 linear-flat-walk-mm12-gap2-dy0p0 linear flat walk 12 2 0.0 True 6.222586344756974 1.2522033525119995 3.422586344756974
11 linear-ascend-walk-mm12-gap2-dy1p0 linear ascend walk 12 2 1.0 True 5.4889195238454125 1.2522033525119995 2.6889195238454127
12 linear-descend-walk-mm12-gap2-dym1p0 linear descend walk 12 2 -1.0 True 6.700370323067186 1.2522033525119995 3.900370323067186
13 linear-descend-walk-mm12-gap2-dym2p0 linear descend walk 12 2 -2.0 True 6.936456664658121 1.2522033525119995 4.136456664658121
14 linear-flat-walk-mm12-gap3-dy0p0 linear flat walk 12 3 0.0 True 6.222586344756974 1.2522033525119995 2.422586344756974
15 linear-ascend-walk-mm12-gap3-dy1p0 linear ascend walk 12 3 1.0 True 5.4889195238454125 1.2522033525119995 1.6889195238454127
16 linear-descend-walk-mm12-gap3-dym1p0 linear descend walk 12 3 -1.0 True 6.700370323067186 1.2522033525119995 2.900370323067186
17 linear-descend-walk-mm12-gap3-dym2p0 linear descend walk 12 3 -2.0 True 6.936456664658121 1.2522033525119995 3.1364566646581213
18 linear-flat-walk-mm12-gap4-dy0p0 linear flat walk 12 4 0.0 True 6.222586344756974 1.2522033525119995 1.422586344756974
19 linear-ascend-walk-mm12-gap4-dy1p0 linear ascend walk 12 4 1.0 True 5.4889195238454125 1.2522033525119995 0.6889195238454127
20 linear-descend-walk-mm12-gap4-dym1p0 linear descend walk 12 4 -1.0 True 6.700370323067186 1.2522033525119995 1.900370323067186
21 linear-descend-walk-mm12-gap4-dym2p0 linear descend walk 12 4 -2.0 True 6.936456664658121 1.2522033525119995 2.1364566646581213
22 linear-flat-walk-mm12-gap5-dy0p0 linear flat walk 12 5 0.0 True 6.222586344756974 1.2522033525119995 0.422586344756974
23 linear-ascend-walk-mm12-gap5-dy1p0 linear ascend walk 12 5 1.0 False 5.736036437366307 1.2522033525119995 -0.06396356263369274
24 linear-descend-walk-mm12-gap5-dym1p0 linear descend walk 12 5 -1.0 True 6.700370323067186 1.2522033525119995 0.900370323067186
25 linear-descend-walk-mm12-gap5-dym2p0 linear descend walk 12 5 -2.0 True 6.936456664658121 1.2522033525119995 1.1364566646581213
26 linear-flat-walk-mm12-gap6-dy0p0 linear flat walk 12 6 0.0 False 6.222586344756974 1.2522033525119995 -0.577413655243026
27 linear-ascend-walk-mm12-gap6-dy1p0 linear ascend walk 12 6 1.0 False 6.222586344756974 1.2522033525119995 -0.577413655243026
28 linear-descend-walk-mm12-gap6-dym1p0 linear descend walk 12 6 -1.0 False 6.222586344756974 1.2522033525119995 -0.577413655243026
29 linear-descend-walk-mm12-gap6-dym2p0 linear descend walk 12 6 -2.0 False 6.222586344756974 1.2522033525119995 -0.577413655243026
30 linear-flat-walk-mm12-gap7-dy0p0 linear flat walk 12 7 0.0 False 6.222586344756974 1.2522033525119995 -1.577413655243026
31 linear-ascend-walk-mm12-gap7-dy1p0 linear ascend walk 12 7 1.0 False 6.222586344756974 1.2522033525119995 -1.577413655243026
32 linear-descend-walk-mm12-gap7-dym1p0 linear descend walk 12 7 -1.0 False 6.222586344756974 1.2522033525119995 -1.577413655243026
33 linear-descend-walk-mm12-gap7-dym2p0 linear descend walk 12 7 -2.0 False 6.222586344756974 1.2522033525119995 -1.577413655243026
34 linear-flat-sprint-mm0-gap0-dy0p0 linear flat sprint 0 0 0.0 True 3.45850527608291 1.2522033525119995 2.65850527608291
35 linear-ascend-sprint-mm0-gap0-dy1p0 linear ascend sprint 0 0 1.0 True 2.67362389586132 1.2522033525119995 1.8736238958613198
36 linear-descend-sprint-mm0-gap0-dym1p0 linear descend sprint 0 0 -1.0 True 3.9632109047152393 1.2522033525119995 3.163210904715239
37 linear-descend-sprint-mm0-gap0-dym2p0 linear descend sprint 0 0 -2.0 True 4.210969402657874 1.2522033525119995 3.410969402657874
38 linear-flat-sprint-mm0-gap1-dy0p0 linear flat sprint 0 1 0.0 True 3.45850527608291 1.2522033525119995 1.65850527608291
39 linear-ascend-sprint-mm0-gap1-dy1p0 linear ascend sprint 0 1 1.0 True 2.67362389586132 1.2522033525119995 0.8736238958613198
40 linear-descend-sprint-mm0-gap1-dym1p0 linear descend sprint 0 1 -1.0 True 3.9632109047152393 1.2522033525119995 2.163210904715239
41 linear-descend-sprint-mm0-gap1-dym2p0 linear descend sprint 0 1 -2.0 True 4.210969402657874 1.2522033525119995 2.410969402657874
42 linear-flat-sprint-mm0-gap2-dy0p0 linear flat sprint 0 2 0.0 True 3.45850527608291 1.2522033525119995 0.6585052760829102
43 linear-ascend-sprint-mm0-gap2-dy1p0 linear ascend sprint 0 2 1.0 False 2.67362389586132 1.2522033525119995 -0.12637610413867995
44 linear-descend-sprint-mm0-gap2-dym1p0 linear descend sprint 0 2 -1.0 True 3.9632109047152393 1.2522033525119995 1.1632109047152395
45 linear-descend-sprint-mm0-gap2-dym2p0 linear descend sprint 0 2 -2.0 True 4.210969402657874 1.2522033525119995 1.4109694026578739
46 linear-flat-sprint-mm0-gap3-dy0p0 linear flat sprint 0 3 0.0 False 3.45850527608291 1.2522033525119995 -0.3414947239170898
47 linear-ascend-sprint-mm0-gap3-dy1p0 linear ascend sprint 0 3 1.0 False 3.45850527608291 1.2522033525119995 -0.3414947239170898
48 linear-descend-sprint-mm0-gap3-dym1p0 linear descend sprint 0 3 -1.0 False 3.45850527608291 1.2522033525119995 -0.3414947239170898
49 linear-descend-sprint-mm0-gap3-dym2p0 linear descend sprint 0 3 -2.0 False 3.45850527608291 1.2522033525119995 -0.3414947239170898
50 linear-flat-sprint-mm0-gap4-dy0p0 linear flat sprint 0 4 0.0 False 3.45850527608291 1.2522033525119995 -1.3414947239170898
51 linear-ascend-sprint-mm0-gap4-dy1p0 linear ascend sprint 0 4 1.0 False 3.45850527608291 1.2522033525119995 -1.3414947239170898
52 linear-descend-sprint-mm0-gap4-dym1p0 linear descend sprint 0 4 -1.0 False 3.45850527608291 1.2522033525119995 -1.3414947239170898
53 linear-descend-sprint-mm0-gap4-dym2p0 linear descend sprint 0 4 -2.0 False 3.45850527608291 1.2522033525119995 -1.3414947239170898
54 linear-flat-sprint-mm0-gap5-dy0p0 linear flat sprint 0 5 0.0 False 3.45850527608291 1.2522033525119995 -2.34149472391709
55 linear-ascend-sprint-mm0-gap5-dy1p0 linear ascend sprint 0 5 1.0 False 3.45850527608291 1.2522033525119995 -2.34149472391709
56 linear-descend-sprint-mm0-gap5-dym1p0 linear descend sprint 0 5 -1.0 False 3.45850527608291 1.2522033525119995 -2.34149472391709
57 linear-descend-sprint-mm0-gap5-dym2p0 linear descend sprint 0 5 -2.0 False 3.45850527608291 1.2522033525119995 -2.34149472391709
58 linear-flat-sprint-mm0-gap6-dy0p0 linear flat sprint 0 6 0.0 False 3.45850527608291 1.2522033525119995 -3.34149472391709
59 linear-ascend-sprint-mm0-gap6-dy1p0 linear ascend sprint 0 6 1.0 False 3.45850527608291 1.2522033525119995 -3.34149472391709
60 linear-descend-sprint-mm0-gap6-dym1p0 linear descend sprint 0 6 -1.0 False 3.45850527608291 1.2522033525119995 -3.34149472391709
61 linear-descend-sprint-mm0-gap6-dym2p0 linear descend sprint 0 6 -2.0 False 3.45850527608291 1.2522033525119995 -3.34149472391709
62 linear-flat-sprint-mm0-gap7-dy0p0 linear flat sprint 0 7 0.0 False 3.45850527608291 1.2522033525119995 -4.34149472391709
63 linear-ascend-sprint-mm0-gap7-dy1p0 linear ascend sprint 0 7 1.0 False 3.45850527608291 1.2522033525119995 -4.34149472391709
64 linear-descend-sprint-mm0-gap7-dym1p0 linear descend sprint 0 7 -1.0 False 3.45850527608291 1.2522033525119995 -4.34149472391709
65 linear-descend-sprint-mm0-gap7-dym2p0 linear descend sprint 0 7 -2.0 False 3.45850527608291 1.2522033525119995 -4.34149472391709
66 linear-flat-sprint-mm12-gap0-dy0p0 linear flat sprint 12 0 0.0 True 7.728196372726743 1.2522033525119995 6.9281963727267435
67 linear-ascend-sprint-mm12-gap0-dy1p0 linear ascend sprint 12 0 1.0 True 6.7601866346681065 1.2522033525119995 5.960186634668107
68 linear-descend-sprint-mm12-gap0-dym1p0 linear descend sprint 12 0 -1.0 True 8.329165987228953 1.2522033525119995 7.529165987228953
69 linear-descend-sprint-mm12-gap0-dym2p0 linear descend sprint 12 0 -2.0 True 8.618660719045328 1.2522033525119995 7.8186607190453286
70 linear-flat-sprint-mm12-gap1-dy0p0 linear flat sprint 12 1 0.0 True 7.728196372726743 1.2522033525119995 5.9281963727267435
71 linear-ascend-sprint-mm12-gap1-dy1p0 linear ascend sprint 12 1 1.0 True 6.7601866346681065 1.2522033525119995 4.960186634668107
72 linear-descend-sprint-mm12-gap1-dym1p0 linear descend sprint 12 1 -1.0 True 8.329165987228953 1.2522033525119995 6.529165987228953
73 linear-descend-sprint-mm12-gap1-dym2p0 linear descend sprint 12 1 -2.0 True 8.618660719045328 1.2522033525119995 6.8186607190453286
74 linear-flat-sprint-mm12-gap2-dy0p0 linear flat sprint 12 2 0.0 True 7.728196372726743 1.2522033525119995 4.9281963727267435
75 linear-ascend-sprint-mm12-gap2-dy1p0 linear ascend sprint 12 2 1.0 True 6.7601866346681065 1.2522033525119995 3.9601866346681067
76 linear-descend-sprint-mm12-gap2-dym1p0 linear descend sprint 12 2 -1.0 True 8.329165987228953 1.2522033525119995 5.529165987228953
77 linear-descend-sprint-mm12-gap2-dym2p0 linear descend sprint 12 2 -2.0 True 8.618660719045328 1.2522033525119995 5.8186607190453286
78 linear-flat-sprint-mm12-gap3-dy0p0 linear flat sprint 12 3 0.0 True 7.728196372726743 1.2522033525119995 3.9281963727267435
79 linear-ascend-sprint-mm12-gap3-dy1p0 linear ascend sprint 12 3 1.0 True 6.7601866346681065 1.2522033525119995 2.9601866346681067
80 linear-descend-sprint-mm12-gap3-dym1p0 linear descend sprint 12 3 -1.0 True 8.329165987228953 1.2522033525119995 4.529165987228953
81 linear-descend-sprint-mm12-gap3-dym2p0 linear descend sprint 12 3 -2.0 True 8.618660719045328 1.2522033525119995 4.8186607190453286
82 linear-flat-sprint-mm12-gap4-dy0p0 linear flat sprint 12 4 0.0 True 7.728196372726743 1.2522033525119995 2.9281963727267435
83 linear-ascend-sprint-mm12-gap4-dy1p0 linear ascend sprint 12 4 1.0 True 6.7601866346681065 1.2522033525119995 1.9601866346681067
84 linear-descend-sprint-mm12-gap4-dym1p0 linear descend sprint 12 4 -1.0 True 8.329165987228953 1.2522033525119995 3.5291659872289527
85 linear-descend-sprint-mm12-gap4-dym2p0 linear descend sprint 12 4 -2.0 True 8.618660719045328 1.2522033525119995 3.8186607190453286
86 linear-flat-sprint-mm12-gap5-dy0p0 linear flat sprint 12 5 0.0 True 7.728196372726743 1.2522033525119995 1.9281963727267435
87 linear-ascend-sprint-mm12-gap5-dy1p0 linear ascend sprint 12 5 1.0 True 6.7601866346681065 1.2522033525119995 0.9601866346681067
88 linear-descend-sprint-mm12-gap5-dym1p0 linear descend sprint 12 5 -1.0 True 8.329165987228953 1.2522033525119995 2.5291659872289527
89 linear-descend-sprint-mm12-gap5-dym2p0 linear descend sprint 12 5 -2.0 True 8.618660719045328 1.2522033525119995 2.8186607190453286
90 linear-flat-sprint-mm12-gap6-dy0p0 linear flat sprint 12 6 0.0 True 7.728196372726743 1.2522033525119995 0.9281963727267435
91 linear-ascend-sprint-mm12-gap6-dy1p0 linear ascend sprint 12 6 1.0 False 6.7601866346681065 1.2522033525119995 -0.03981336533189328
92 linear-descend-sprint-mm12-gap6-dym1p0 linear descend sprint 12 6 -1.0 True 8.329165987228953 1.2522033525119995 1.5291659872289527
93 linear-descend-sprint-mm12-gap6-dym2p0 linear descend sprint 12 6 -2.0 True 8.618660719045328 1.2522033525119995 1.8186607190453286
94 linear-flat-sprint-mm12-gap7-dy0p0 linear flat sprint 12 7 0.0 False 7.728196372726743 1.2522033525119995 -0.07180362727325651
95 linear-ascend-sprint-mm12-gap7-dy1p0 linear ascend sprint 12 7 1.0 False 7.728196372726743 1.2522033525119995 -0.07180362727325651
96 linear-descend-sprint-mm12-gap7-dym1p0 linear descend sprint 12 7 -1.0 True 8.329165987228953 1.2522033525119995 0.5291659872289527
97 linear-descend-sprint-mm12-gap7-dym2p0 linear descend sprint 12 7 -2.0 True 8.618660719045328 1.2522033525119995 0.8186607190453286
98 neo-neo-sprint-mm12-wall1 neo neo sprint 12 0.0 1 True 7.728196372726743 1.2522033525119995 6.128196372726743
99 neo-neo-sprint-mm12-wall2 neo neo sprint 12 0.0 2 True 7.728196372726743 1.2522033525119995 5.128196372726743
100 neo-neo-sprint-mm12-wall3 neo neo sprint 12 0.0 3 True 7.728196372726743 1.2522033525119995 4.128196372726743
101 neo-neo-sprint-mm12-wall4 neo neo sprint 12 0.0 4 True 7.728196372726743 1.2522033525119995 3.1281963727267437
102 ceiling-headhitter-sprint-mm12-gap1-ceil4p0 ceiling headhitter sprint 12 1 0.0 4.0 True 7.728196372726743 1.2522033525119995 5.9281963727267435
103 ceiling-headhitter-sprint-mm12-gap2-ceil4p0 ceiling headhitter sprint 12 2 0.0 4.0 True 7.728196372726743 1.2522033525119995 4.9281963727267435
104 ceiling-headhitter-sprint-mm12-gap3-ceil4p0 ceiling headhitter sprint 12 3 0.0 4.0 True 7.728196372726743 1.2522033525119995 3.9281963727267435
105 ceiling-headhitter-sprint-mm12-gap4-ceil4p0 ceiling headhitter sprint 12 4 0.0 4.0 True 7.728196372726743 1.2522033525119995 2.9281963727267435
106 ceiling-headhitter-sprint-mm12-gap1-ceil3p0 ceiling headhitter sprint 12 1 0.0 3.0 True 7.415249123142595 1.2 5.615249123142595
107 ceiling-headhitter-sprint-mm12-gap2-ceil3p0 ceiling headhitter sprint 12 2 0.0 3.0 True 7.415249123142595 1.2 4.615249123142595
108 ceiling-headhitter-sprint-mm12-gap3-ceil3p0 ceiling headhitter sprint 12 3 0.0 3.0 True 7.415249123142595 1.2 3.615249123142595
109 ceiling-headhitter-sprint-mm12-gap4-ceil3p0 ceiling headhitter sprint 12 4 0.0 3.0 True 7.415249123142595 1.2 2.615249123142595
110 ceiling-headhitter-sprint-mm12-gap1-ceil2p5 ceiling headhitter sprint 12 1 0.0 2.5 True 5.6892730007057635 0.7 3.8892730007057636
111 ceiling-headhitter-sprint-mm12-gap2-ceil2p5 ceiling headhitter sprint 12 2 0.0 2.5 True 5.6892730007057635 0.7 2.8892730007057636
112 ceiling-headhitter-sprint-mm12-gap3-ceil2p5 ceiling headhitter sprint 12 3 0.0 2.5 True 5.6892730007057635 0.7 1.8892730007057636
113 ceiling-headhitter-sprint-mm12-gap4-ceil2p5 ceiling headhitter sprint 12 4 0.0 2.5 True 5.6892730007057635 0.7 0.8892730007057636
114 ceiling-headhitter-sprint-mm12-gap1-ceil2p0 ceiling headhitter sprint 12 1 0.0 2.0 True 4.481804356129017 0.19999999999999996 2.6818043561290175
115 ceiling-headhitter-sprint-mm12-gap2-ceil2p0 ceiling headhitter sprint 12 2 0.0 2.0 True 4.481804356129017 0.19999999999999996 1.6818043561290175
116 ceiling-headhitter-sprint-mm12-gap3-ceil2p0 ceiling headhitter sprint 12 3 0.0 2.0 True 4.481804356129017 0.19999999999999996 0.6818043561290175
117 ceiling-headhitter-sprint-mm12-gap4-ceil2p0 ceiling headhitter sprint 12 4 0.0 2.0 False 4.481804356129017 0.19999999999999996 -0.31819564387098254
118 ceiling-headhitter-sprint-mm12-gap1-ceil1p8125 ceiling headhitter sprint 12 1 0.0 1.8125 True 4.041631522485753 0.012499999999999956 2.2416315224857533
119 ceiling-headhitter-sprint-mm12-gap2-ceil1p8125 ceiling headhitter sprint 12 2 0.0 1.8125 True 4.041631522485753 0.012499999999999956 1.2416315224857533
120 ceiling-headhitter-sprint-mm12-gap3-ceil1p8125 ceiling headhitter sprint 12 3 0.0 1.8125 True 4.041631522485753 0.012499999999999956 0.24163152248575326
121 ceiling-headhitter-sprint-mm12-gap4-ceil1p8125 ceiling headhitter sprint 12 4 0.0 1.8125 False 4.041631522485753 0.012499999999999956 -0.7583684775142467

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,124 @@
# Theory Matrix
| family | subfamily | movement_mode | case_id | expected_reachable | margin |
| --- | --- | --- | --- | --- | --- |
| linear | flat | walk | linear-flat-walk-mm12-gap0-dy0p0 | True | 5.422586344756974 |
| linear | ascend | walk | linear-ascend-walk-mm12-gap0-dy1p0 | True | 4.688919523845413 |
| linear | descend | walk | linear-descend-walk-mm12-gap0-dym1p0 | True | 5.900370323067186 |
| linear | descend | walk | linear-descend-walk-mm12-gap0-dym2p0 | True | 6.136456664658121 |
| linear | flat | walk | linear-flat-walk-mm12-gap1-dy0p0 | True | 4.422586344756974 |
| linear | ascend | walk | linear-ascend-walk-mm12-gap1-dy1p0 | True | 3.6889195238454127 |
| linear | descend | walk | linear-descend-walk-mm12-gap1-dym1p0 | True | 4.900370323067186 |
| linear | descend | walk | linear-descend-walk-mm12-gap1-dym2p0 | True | 5.136456664658121 |
| linear | flat | walk | linear-flat-walk-mm12-gap2-dy0p0 | True | 3.422586344756974 |
| linear | ascend | walk | linear-ascend-walk-mm12-gap2-dy1p0 | True | 2.6889195238454127 |
| linear | descend | walk | linear-descend-walk-mm12-gap2-dym1p0 | True | 3.900370323067186 |
| linear | descend | walk | linear-descend-walk-mm12-gap2-dym2p0 | True | 4.136456664658121 |
| linear | flat | walk | linear-flat-walk-mm12-gap3-dy0p0 | True | 2.422586344756974 |
| linear | ascend | walk | linear-ascend-walk-mm12-gap3-dy1p0 | True | 1.6889195238454127 |
| linear | descend | walk | linear-descend-walk-mm12-gap3-dym1p0 | True | 2.900370323067186 |
| linear | descend | walk | linear-descend-walk-mm12-gap3-dym2p0 | True | 3.1364566646581213 |
| linear | flat | walk | linear-flat-walk-mm12-gap4-dy0p0 | True | 1.422586344756974 |
| linear | ascend | walk | linear-ascend-walk-mm12-gap4-dy1p0 | True | 0.6889195238454127 |
| linear | descend | walk | linear-descend-walk-mm12-gap4-dym1p0 | True | 1.900370323067186 |
| linear | descend | walk | linear-descend-walk-mm12-gap4-dym2p0 | True | 2.1364566646581213 |
| linear | flat | walk | linear-flat-walk-mm12-gap5-dy0p0 | True | 0.422586344756974 |
| linear | ascend | walk | linear-ascend-walk-mm12-gap5-dy1p0 | False | -0.06396356263369274 |
| linear | descend | walk | linear-descend-walk-mm12-gap5-dym1p0 | True | 0.900370323067186 |
| linear | descend | walk | linear-descend-walk-mm12-gap5-dym2p0 | True | 1.1364566646581213 |
| linear | flat | walk | linear-flat-walk-mm12-gap6-dy0p0 | False | -0.577413655243026 |
| linear | ascend | walk | linear-ascend-walk-mm12-gap6-dy1p0 | False | -0.577413655243026 |
| linear | descend | walk | linear-descend-walk-mm12-gap6-dym1p0 | False | -0.577413655243026 |
| linear | descend | walk | linear-descend-walk-mm12-gap6-dym2p0 | False | -0.577413655243026 |
| linear | flat | walk | linear-flat-walk-mm12-gap7-dy0p0 | False | -1.577413655243026 |
| linear | ascend | walk | linear-ascend-walk-mm12-gap7-dy1p0 | False | -1.577413655243026 |
| linear | descend | walk | linear-descend-walk-mm12-gap7-dym1p0 | False | -1.577413655243026 |
| linear | descend | walk | linear-descend-walk-mm12-gap7-dym2p0 | False | -1.577413655243026 |
| linear | flat | sprint | linear-flat-sprint-mm0-gap0-dy0p0 | True | 2.65850527608291 |
| linear | ascend | sprint | linear-ascend-sprint-mm0-gap0-dy1p0 | True | 1.8736238958613198 |
| linear | descend | sprint | linear-descend-sprint-mm0-gap0-dym1p0 | True | 3.163210904715239 |
| linear | descend | sprint | linear-descend-sprint-mm0-gap0-dym2p0 | True | 3.410969402657874 |
| linear | flat | sprint | linear-flat-sprint-mm0-gap1-dy0p0 | True | 1.65850527608291 |
| linear | ascend | sprint | linear-ascend-sprint-mm0-gap1-dy1p0 | True | 0.8736238958613198 |
| linear | descend | sprint | linear-descend-sprint-mm0-gap1-dym1p0 | True | 2.163210904715239 |
| linear | descend | sprint | linear-descend-sprint-mm0-gap1-dym2p0 | True | 2.410969402657874 |
| linear | flat | sprint | linear-flat-sprint-mm0-gap2-dy0p0 | True | 0.6585052760829102 |
| linear | ascend | sprint | linear-ascend-sprint-mm0-gap2-dy1p0 | False | -0.12637610413867995 |
| linear | descend | sprint | linear-descend-sprint-mm0-gap2-dym1p0 | True | 1.1632109047152395 |
| linear | descend | sprint | linear-descend-sprint-mm0-gap2-dym2p0 | True | 1.4109694026578739 |
| linear | flat | sprint | linear-flat-sprint-mm0-gap3-dy0p0 | False | -0.3414947239170898 |
| linear | ascend | sprint | linear-ascend-sprint-mm0-gap3-dy1p0 | False | -0.3414947239170898 |
| linear | descend | sprint | linear-descend-sprint-mm0-gap3-dym1p0 | False | -0.3414947239170898 |
| linear | descend | sprint | linear-descend-sprint-mm0-gap3-dym2p0 | False | -0.3414947239170898 |
| linear | flat | sprint | linear-flat-sprint-mm0-gap4-dy0p0 | False | -1.3414947239170898 |
| linear | ascend | sprint | linear-ascend-sprint-mm0-gap4-dy1p0 | False | -1.3414947239170898 |
| linear | descend | sprint | linear-descend-sprint-mm0-gap4-dym1p0 | False | -1.3414947239170898 |
| linear | descend | sprint | linear-descend-sprint-mm0-gap4-dym2p0 | False | -1.3414947239170898 |
| linear | flat | sprint | linear-flat-sprint-mm0-gap5-dy0p0 | False | -2.34149472391709 |
| linear | ascend | sprint | linear-ascend-sprint-mm0-gap5-dy1p0 | False | -2.34149472391709 |
| linear | descend | sprint | linear-descend-sprint-mm0-gap5-dym1p0 | False | -2.34149472391709 |
| linear | descend | sprint | linear-descend-sprint-mm0-gap5-dym2p0 | False | -2.34149472391709 |
| linear | flat | sprint | linear-flat-sprint-mm0-gap6-dy0p0 | False | -3.34149472391709 |
| linear | ascend | sprint | linear-ascend-sprint-mm0-gap6-dy1p0 | False | -3.34149472391709 |
| linear | descend | sprint | linear-descend-sprint-mm0-gap6-dym1p0 | False | -3.34149472391709 |
| linear | descend | sprint | linear-descend-sprint-mm0-gap6-dym2p0 | False | -3.34149472391709 |
| linear | flat | sprint | linear-flat-sprint-mm0-gap7-dy0p0 | False | -4.34149472391709 |
| linear | ascend | sprint | linear-ascend-sprint-mm0-gap7-dy1p0 | False | -4.34149472391709 |
| linear | descend | sprint | linear-descend-sprint-mm0-gap7-dym1p0 | False | -4.34149472391709 |
| linear | descend | sprint | linear-descend-sprint-mm0-gap7-dym2p0 | False | -4.34149472391709 |
| linear | flat | sprint | linear-flat-sprint-mm12-gap0-dy0p0 | True | 6.9281963727267435 |
| linear | ascend | sprint | linear-ascend-sprint-mm12-gap0-dy1p0 | True | 5.960186634668107 |
| linear | descend | sprint | linear-descend-sprint-mm12-gap0-dym1p0 | True | 7.529165987228953 |
| linear | descend | sprint | linear-descend-sprint-mm12-gap0-dym2p0 | True | 7.8186607190453286 |
| linear | flat | sprint | linear-flat-sprint-mm12-gap1-dy0p0 | True | 5.9281963727267435 |
| linear | ascend | sprint | linear-ascend-sprint-mm12-gap1-dy1p0 | True | 4.960186634668107 |
| linear | descend | sprint | linear-descend-sprint-mm12-gap1-dym1p0 | True | 6.529165987228953 |
| linear | descend | sprint | linear-descend-sprint-mm12-gap1-dym2p0 | True | 6.8186607190453286 |
| linear | flat | sprint | linear-flat-sprint-mm12-gap2-dy0p0 | True | 4.9281963727267435 |
| linear | ascend | sprint | linear-ascend-sprint-mm12-gap2-dy1p0 | True | 3.9601866346681067 |
| linear | descend | sprint | linear-descend-sprint-mm12-gap2-dym1p0 | True | 5.529165987228953 |
| linear | descend | sprint | linear-descend-sprint-mm12-gap2-dym2p0 | True | 5.8186607190453286 |
| linear | flat | sprint | linear-flat-sprint-mm12-gap3-dy0p0 | True | 3.9281963727267435 |
| linear | ascend | sprint | linear-ascend-sprint-mm12-gap3-dy1p0 | True | 2.9601866346681067 |
| linear | descend | sprint | linear-descend-sprint-mm12-gap3-dym1p0 | True | 4.529165987228953 |
| linear | descend | sprint | linear-descend-sprint-mm12-gap3-dym2p0 | True | 4.8186607190453286 |
| linear | flat | sprint | linear-flat-sprint-mm12-gap4-dy0p0 | True | 2.9281963727267435 |
| linear | ascend | sprint | linear-ascend-sprint-mm12-gap4-dy1p0 | True | 1.9601866346681067 |
| linear | descend | sprint | linear-descend-sprint-mm12-gap4-dym1p0 | True | 3.5291659872289527 |
| linear | descend | sprint | linear-descend-sprint-mm12-gap4-dym2p0 | True | 3.8186607190453286 |
| linear | flat | sprint | linear-flat-sprint-mm12-gap5-dy0p0 | True | 1.9281963727267435 |
| linear | ascend | sprint | linear-ascend-sprint-mm12-gap5-dy1p0 | True | 0.9601866346681067 |
| linear | descend | sprint | linear-descend-sprint-mm12-gap5-dym1p0 | True | 2.5291659872289527 |
| linear | descend | sprint | linear-descend-sprint-mm12-gap5-dym2p0 | True | 2.8186607190453286 |
| linear | flat | sprint | linear-flat-sprint-mm12-gap6-dy0p0 | True | 0.9281963727267435 |
| linear | ascend | sprint | linear-ascend-sprint-mm12-gap6-dy1p0 | False | -0.03981336533189328 |
| linear | descend | sprint | linear-descend-sprint-mm12-gap6-dym1p0 | True | 1.5291659872289527 |
| linear | descend | sprint | linear-descend-sprint-mm12-gap6-dym2p0 | True | 1.8186607190453286 |
| linear | flat | sprint | linear-flat-sprint-mm12-gap7-dy0p0 | False | -0.07180362727325651 |
| linear | ascend | sprint | linear-ascend-sprint-mm12-gap7-dy1p0 | False | -0.07180362727325651 |
| linear | descend | sprint | linear-descend-sprint-mm12-gap7-dym1p0 | True | 0.5291659872289527 |
| linear | descend | sprint | linear-descend-sprint-mm12-gap7-dym2p0 | True | 0.8186607190453286 |
| neo | neo | sprint | neo-neo-sprint-mm12-wall1 | True | 6.128196372726743 |
| neo | neo | sprint | neo-neo-sprint-mm12-wall2 | True | 5.128196372726743 |
| neo | neo | sprint | neo-neo-sprint-mm12-wall3 | True | 4.128196372726743 |
| neo | neo | sprint | neo-neo-sprint-mm12-wall4 | True | 3.1281963727267437 |
| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap1-ceil4p0 | True | 5.9281963727267435 |
| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap2-ceil4p0 | True | 4.9281963727267435 |
| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap3-ceil4p0 | True | 3.9281963727267435 |
| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap4-ceil4p0 | True | 2.9281963727267435 |
| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap1-ceil3p0 | True | 5.615249123142595 |
| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap2-ceil3p0 | True | 4.615249123142595 |
| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap3-ceil3p0 | True | 3.615249123142595 |
| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap4-ceil3p0 | True | 2.615249123142595 |
| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap1-ceil2p5 | True | 3.8892730007057636 |
| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap2-ceil2p5 | True | 2.8892730007057636 |
| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap3-ceil2p5 | True | 1.8892730007057636 |
| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap4-ceil2p5 | True | 0.8892730007057636 |
| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap1-ceil2p0 | True | 2.6818043561290175 |
| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap2-ceil2p0 | True | 1.6818043561290175 |
| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap3-ceil2p0 | True | 0.6818043561290175 |
| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap4-ceil2p0 | False | -0.31819564387098254 |
| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap1-ceil1p8125 | True | 2.2416315224857533 |
| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap2-ceil1p8125 | True | 1.2416315224857533 |
| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap3-ceil1p8125 | True | 0.24163152248575326 |
| ceiling | headhitter | sprint | ceiling-headhitter-sprint-mm12-gap4-ceil1p8125 | False | -0.7583684775142467 |

View file

@ -0,0 +1,90 @@
from tools.pathing_theory.models import CanonicalLiveCase, TheoryCase
def _world_recipe_id(case: TheoryCase) -> str:
if case.family == "linear":
return f"linear-{case.subfamily}"
if case.family == "neo":
return "neo-wall"
return "ceiling-headhitter"
def _canonical_goal(case: TheoryCase) -> tuple[dict[str, float], dict[str, float]]:
start = {"x": 100.5, "y": 80.0, "z": 100.5}
if case.family == "linear":
goal_y = 80.0 + (case.delta_y or 0.0)
goal_x = 100 + (case.gap_blocks or 0) + 1
return start, {"x": float(goal_x), "y": goal_y, "z": 100.0}
if case.family == "neo":
goal_z = 100 + (case.wall_width or 1)
return start, {"x": 102.0, "y": 80.0, "z": float(goal_z)}
goal_x = 100 + (case.gap_blocks or 0) + 1
return start, {"x": float(goal_x), "y": 80.0, "z": 100.0}
def build_canonical_live_cases(cases: list[TheoryCase]) -> list[CanonicalLiveCase]:
live_candidate_cases = [
case
for case in cases
if case.movement_mode == "sprint" and case.momentum_ticks == 12
]
by_bucket: dict[tuple[str, str, str], list[TheoryCase]] = {}
for case in live_candidate_cases:
by_bucket.setdefault(
(case.family, case.subfamily, case.movement_mode),
[],
).append(case)
canonical_cases: list[CanonicalLiveCase] = []
for family, subfamily, movement_mode in sorted(by_bucket):
bucket_cases = by_bucket[(family, subfamily, movement_mode)]
reachable = sorted(
[
case
for case in bucket_cases
if case.expected_reachable and case.margin is not None
],
key=lambda case: case.margin,
)
unreachable = sorted(
[case for case in bucket_cases if not case.expected_reachable],
key=lambda case: float("-inf") if case.margin is None else abs(case.margin),
)
selected: list[tuple[str, TheoryCase]] = []
if reachable:
easy = next(
(case for case in reversed(reachable) if (case.margin or 0.0) >= 0.50),
reachable[-1],
)
boundary = reachable[0]
selected.append(("easy", easy))
if boundary.case_id != easy.case_id:
selected.append(("boundary", boundary))
if unreachable:
selected.append(("reject", unreachable[0]))
for difficulty_band, case in selected:
start, goal = _canonical_goal(case)
canonical_cases.append(
CanonicalLiveCase(
case_id=case.case_id,
bucket_id=f"{family}:{subfamily}:{movement_mode}:{difficulty_band}",
family=family,
subfamily=subfamily,
movement_mode=movement_mode,
momentum_ticks=case.momentum_ticks,
difficulty_band=difficulty_band,
expected_result="pass" if case.expected_reachable else "reject",
world_recipe_id=_world_recipe_id(case),
gap_blocks=case.gap_blocks,
delta_y=case.delta_y,
ceiling_height=case.ceiling_height,
wall_width=case.wall_width,
start=start,
goal=goal,
)
)
return canonical_cases

View file

@ -17,3 +17,22 @@ class TheoryCase:
apex_y: float | None
margin: float | None
notes: str = ""
@dataclass(frozen=True)
class CanonicalLiveCase:
case_id: str
bucket_id: str
family: str
subfamily: str
movement_mode: str
momentum_ticks: int
difficulty_band: str
expected_result: str
world_recipe_id: str
gap_blocks: int | None
delta_y: float | None
ceiling_height: float | None
wall_width: int | None
start: dict[str, float]
goal: dict[str, float]

View file

@ -0,0 +1,48 @@
import csv
import json
from dataclasses import asdict
from pathlib import Path
from tools.pathing_theory.models import CanonicalLiveCase, TheoryCase
def write_theory_artifacts(
cases: list[TheoryCase],
canonical_cases: list[CanonicalLiveCase],
output_dir: Path,
) -> None:
output_dir.mkdir(parents=True, exist_ok=True)
json_path = output_dir / "theory-matrix.json"
csv_path = output_dir / "theory-matrix.csv"
md_path = output_dir / "theory-matrix.md"
canonical_path = output_dir / "canonical-live-cases.json"
json_path.write_text(
json.dumps([asdict(case) for case in cases], indent=2) + "\n",
encoding="utf-8",
)
canonical_path.write_text(
json.dumps([asdict(case) for case in canonical_cases], indent=2) + "\n",
encoding="utf-8",
)
with csv_path.open("w", encoding="utf-8", newline="") as handle:
writer = csv.DictWriter(handle, fieldnames=list(asdict(cases[0]).keys()))
writer.writeheader()
for case in cases:
writer.writerow(asdict(case))
lines = [
"# Theory Matrix",
"",
"| family | subfamily | movement_mode | case_id | expected_reachable | margin |",
"| --- | --- | --- | --- | --- | --- |",
]
for case in cases:
lines.append(
f"| {case.family} | {case.subfamily} | {case.movement_mode} | "
f"{case.case_id} | {case.expected_reachable} | {case.margin} |"
)
md_path.write_text("\n".join(lines) + "\n", encoding="utf-8")

View file

@ -14,7 +14,7 @@ def build_theory_cases() -> list[TheoryCase]:
(True, "sprint", 0),
(True, "sprint", 12),
]:
for gap in range(0, 7):
for gap in range(0, 8):
for delta_y in [0.0, 1.0, -1.0, -2.0]:
ok, landing_x, needed_x = can_reach_gap(
gap_blocks=gap,

View file

@ -17,6 +17,13 @@ Usage:
import argparse
import csv
from pathlib import Path
import sys
REPO_ROOT = Path(__file__).resolve().parent.parent
if str(REPO_ROOT) not in sys.path:
sys.path.insert(0, str(REPO_ROOT))
from tools.pathing_theory.canonical import build_canonical_live_cases
from tools.pathing_theory.primitives import (
PLAYER_WIDTH,
can_reach_gap,
@ -24,6 +31,7 @@ from tools.pathing_theory.primitives import (
get_landing,
simulate_jump,
)
from tools.pathing_theory.renderers import write_theory_artifacts
from tools.pathing_theory.simulator import build_theory_cases
@ -202,8 +210,17 @@ def main():
help="Print per-tick trajectory data")
parser.add_argument("--csv", type=str, default=None,
help="Export results to CSV file")
parser.add_argument("--write-artifacts", type=str, default=None,
help="Write tracked theory artifacts to a directory")
args = parser.parse_args()
if args.write_artifacts:
cases = build_theory_cases()
canonical_cases = build_canonical_live_cases(cases)
write_theory_artifacts(cases, canonical_cases, Path(args.write_artifacts))
print(f"Wrote theory artifacts to {args.write_artifacts}")
return
results = analyze_all(verbose=args.verbose)
if args.csv and results:

View file

@ -0,0 +1,47 @@
import json
import tempfile
import unittest
from pathlib import Path
from tools.pathing_theory.canonical import build_canonical_live_cases
from tools.pathing_theory.renderers import write_theory_artifacts
from tools.pathing_theory.simulator import build_theory_cases
class CanonicalPathingCaseTests(unittest.TestCase):
def test_build_canonical_live_cases_picks_easy_boundary_and_reject(self) -> None:
canonical_cases = build_canonical_live_cases(build_theory_cases())
bucket_ids = {case.bucket_id for case in canonical_cases}
self.assertTrue(all(case.movement_mode == "sprint" for case in canonical_cases))
self.assertTrue(all(case.momentum_ticks == 12 for case in canonical_cases))
self.assertIn("linear:flat:sprint:easy", bucket_ids)
self.assertIn("linear:flat:sprint:boundary", bucket_ids)
self.assertIn("linear:flat:sprint:reject", bucket_ids)
self.assertIn("neo:neo:sprint:boundary", bucket_ids)
self.assertIn("ceiling:headhitter:sprint:boundary", bucket_ids)
def test_write_theory_artifacts_writes_json_csv_and_markdown_from_same_cases(self) -> None:
cases = build_theory_cases()
with tempfile.TemporaryDirectory() as temp_dir:
output_dir = Path(temp_dir)
write_theory_artifacts(cases, build_canonical_live_cases(cases), output_dir)
json_path = output_dir / "theory-matrix.json"
csv_path = output_dir / "theory-matrix.csv"
md_path = output_dir / "theory-matrix.md"
canonical_path = output_dir / "canonical-live-cases.json"
self.assertTrue(json_path.exists())
self.assertTrue(csv_path.exists())
self.assertTrue(md_path.exists())
self.assertTrue(canonical_path.exists())
exported_cases = json.loads(json_path.read_text())
self.assertEqual(len(cases), len(exported_cases))
self.assertIn("| family | subfamily | movement_mode |", md_path.read_text())
if __name__ == "__main__":
unittest.main()