{
  "$schema":"http://json-schema.org/draft-07/schema#",
  "title":"RoomForge navigation 1.0",
  "type":"object","additionalProperties":false,
  "required":["schema","version","status","coordinate_system","agent","generated_at","scene_bounds_m","recommended_start","stage_center","walkable_points","movement_bounds_m","walkable_area","notes"],
  "properties":{
    "schema":{"const":"roomforge.navigation"},"version":{"const":"1.0"},"status":{"enum":["ready","unavailable"]},
    "generated_at":{"type":"string"},
    "coordinate_system":{"const":{"space":"scene_root_local","unit":"m","up_axis":"+Y","forward_axis":"-Z","handedness":"right","position_anchor":"feet"}},
    "agent":{"const":{"height_m":1.8,"radius_m":0.55,"max_slope_deg":35,"max_step_m":0.45}},
    "scene_bounds_m":{"$ref":"#/definitions/bounds"},
    "recommended_start":{"anyOf":[{"$ref":"#/definitions/point"},{"type":"null"}]},
    "stage_center":{"anyOf":[{"$ref":"#/definitions/point"},{"type":"null"}]},
    "walkable_points":{"type":"array","maxItems":8,"items":{"$ref":"#/definitions/point"}},
    "movement_bounds_m":{"anyOf":[{"$ref":"#/definitions/bounds"},{"type":"null"}]},
    "walkable_area":{"type":"object","additionalProperties":false,"required":["representation","cell_size_m","region_id","cells"],"properties":{
      "representation":{"const":"sampled_grid"},"cell_size_m":{"type":"number","minimum":1,"maximum":2.5},"region_id":{"type":["string","null"]},
      "cells":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["center_m","support_mesh","slope_deg"],"properties":{"center_m":{"$ref":"#/definitions/vector"},"support_mesh":{"type":"string"},"slope_deg":{"type":"number","minimum":0,"maximum":35}}}}
    }},
    "notes":{"type":"array","items":{"type":"string"}}
  },
  "allOf":[{"if":{"properties":{"status":{"const":"ready"}}},"then":{"properties":{"recommended_start":{"$ref":"#/definitions/point"},"stage_center":{"$ref":"#/definitions/point"},"movement_bounds_m":{"$ref":"#/definitions/bounds"},"walkable_area":{"properties":{"region_id":{"type":"string"},"cells":{"minItems":1}}}}},"else":{"properties":{"recommended_start":{"type":"null"},"stage_center":{"type":"null"},"movement_bounds_m":{"type":"null"},"walkable_points":{"maxItems":0},"walkable_area":{"properties":{"region_id":{"type":"null"},"cells":{"maxItems":0}}}}}}],
  "definitions":{
    "vector":{"type":"array","minItems":3,"maxItems":3,"items":{"type":"number"}},
    "bounds":{"type":"object","additionalProperties":false,"required":["min","max"],"properties":{"min":{"$ref":"#/definitions/vector"},"max":{"$ref":"#/definitions/vector"}}},
    "point":{"type":"object","additionalProperties":false,"required":["position_m","yaw_deg","support_mesh","region_id","slope_deg","clearance_radius_m","reason","confidence","geometry_validated"],"properties":{
      "position_m":{"$ref":"#/definitions/vector"},"yaw_deg":{"type":"number","minimum":-180,"maximum":180},"support_mesh":{"type":"string"},"region_id":{"type":"string"},"slope_deg":{"type":"number","minimum":0,"maximum":35},"clearance_radius_m":{"const":0.55},"reason":{"type":"string","minLength":1,"maxLength":600},"confidence":{"type":"number","minimum":0,"maximum":1},"geometry_validated":{"const":true}
    }}
  }
}
