{
  "rules": [
    {
      "code": "json_syntax",
      "description": "Every JSON file must parse as valid JSON.",
      "severity": "error"
    },
    {
      "code": "project_manifest_missing",
      "description": "projects/<id>/project.json is required.",
      "severity": "error"
    },
    {
      "code": "project_manifest_id_missing",
      "description": "Project manifest requires id.",
      "severity": "error"
    },
    {
      "code": "project_manifest_name_missing",
      "description": "Project manifest requires name.",
      "severity": "error"
    },
    {
      "code": "runtime_app_config_missing",
      "description": "Runtime app config must exist as configs/app.config.json or opstudio.config.json.",
      "severity": "error"
    },
    {
      "code": "screen_schema",
      "description": "Screen JSON must be a JSON object.",
      "severity": "error"
    },
    {
      "code": "screen_id_missing",
      "description": "Screen declarations and screen JSON require ids.",
      "severity": "error"
    },
    {
      "code": "screen_layout_missing",
      "description": "Screen JSON requires layout or root.",
      "severity": "error"
    },
    {
      "code": "screen_file_missing",
      "description": "Configured screen path must exist.",
      "severity": "error"
    },
    {
      "code": "screens_not_declared",
      "description": "Screen files exist but app config declares no screens.",
      "severity": "warning"
    },
    {
      "code": "screen_not_declared",
      "description": "A screen file exists but is not declared.",
      "severity": "warning"
    },
    {
      "code": "route_screen_missing",
      "description": "Route must reference a screen.",
      "severity": "error"
    },
    {
      "code": "route_screen_unknown",
      "description": "Route references an unknown screen id.",
      "severity": "error"
    },
    {
      "code": "action_id_missing",
      "description": "App actions require id.",
      "severity": "error"
    },
    {
      "code": "action_id_duplicate",
      "description": "App action ids must be unique.",
      "severity": "error"
    },
    {
      "code": "action_kind_missing",
      "description": "App actions require kind.",
      "severity": "error"
    },
    {
      "code": "action_kind_unknown",
      "description": "Action kind must be registered.",
      "severity": "error"
    },
    {
      "code": "http_action_service_missing",
      "description": "HTTP actions require a service.",
      "severity": "error"
    },
    {
      "code": "http_action_service_unknown",
      "description": "HTTP action service must exist in app config services.",
      "severity": "error"
    },
    {
      "code": "service_contract_missing",
      "description": "HTTP service must reference an OpenAPI contract.",
      "severity": "error"
    },
    {
      "code": "service_contract_invalid",
      "description": "HTTP service OpenAPI contract path must be valid and present.",
      "severity": "error"
    },
    {
      "code": "http_action_operation_missing",
      "description": "HTTP actions require operationId.",
      "severity": "error"
    },
    {
      "code": "http_action_operation_unknown",
      "description": "HTTP action operationId must exist in the OpenAPI contract.",
      "severity": "error"
    },
    {
      "code": "screen_include_missing",
      "description": "Screen include nodes must reference a screen.",
      "severity": "error"
    },
    {
      "code": "screen_include_unknown",
      "description": "Screen include nodes must reference a known screen.",
      "severity": "error"
    },
    {
      "code": "screen_action_id_missing",
      "description": "run-action nodes require actionId.",
      "severity": "error"
    },
    {
      "code": "screen_action_unknown",
      "description": "run-action nodes must reference configured app actions.",
      "severity": "error"
    }
  ],
  "source": "src/validation.rs"
}
