{
  "$defs": {
    "ValidationGroundTruthAdjudication": {
      "additionalProperties": true,
      "description": "What the simulator's own probe says about a kernel stop.\n\nDerived from the ``sim.estop_ground_truth_snapshot`` line the sim HAL emits\nper stop. The probe measures against solid world geometry only and carries\nits own caveat that a zero contact count is *not* an emptiness test, so the\nadjudication is driven by the distance probes rather than the contact list.\n\nAttributes:\n    verdict: The adjudication.\n    stop_class: The probe's own class for the stop (``\"robot_world\"``, ``\"attached_payload\"``).\n    sim_time_s: Simulator time at the stop.\n    grid_resolution_m: Occupancy-grid edge length; sets the quantization budget.\n    quantization_budget_m: Half the grid cell's body diagonal \u2014 the voxel-only\n        term, not the whole admissible gap.\n    admissible_gap_m: Budget applied to ``discrepancy_m``; prefers the HAL's\n        own ``adjudication_budget.admissible_gap_m`` (88.2 mm vs. a 25 mm\n        grid's 21.7 mm voxel-only term on the 2026-08-23 rounds), else\n        ``quantization_budget_m`` for a pre-budget snapshot.\n    budget_source: Where ``admissible_gap_m`` came from \u2014\n        ``\"hal-adjudication-budget\"``, ``\"grid-quantization\"`` (a lower\n        bound only: can prove ``within-quantization``, never\n        ``false-positive``), or ``\"\"`` (no budget; rounds before #144\n        published none and two verdicts were over-convicted on that alone).\n    probe_collidability_filtered: Whether both probe sides were\n        solid-geom-restricted; ``False`` on pre-filter snapshots (a 0 m\n        pair may be a visual mesh, so cannot support ``real-contact``).\n    probe_distance_certified: Whether every probe distance is\n        proof-certified (``openral_hal.convex_distance``); ``False`` on\n        ``mujoco.mj_geomDistance`` snapshots, which read confidently wrong\n        ``0.000 m`` for pairs whose certified value is ``+14.8``/``+82.2``/\n        ``+107.9 mm`` \u2014 such a probe withdraws the verdict to\n        ``unadjudicated`` rather than reversing it.\n    unadjudicated_reason: Why the verdict is ``unadjudicated`` (empty\n        otherwise) \u2014 distinguishes a harness fault from a run fact.\n    nearest_any_m: Distance of the closest probed pair of any kind;\n        ``None`` when nothing was within ``distmax_m``.\n    nearest_tripping_party_m: Distance of the closest pair naming the\n        kernel's tripping party; ``None`` when out of range.\n    nearest_pair: Bodies/geoms of the closest probed pair, verbatim.\n    discrepancy_m: ``nearest_tripping_party_m`` minus the kernel's\n        ``min_distance_m`` \u2014 clearance the kernel did not see.\n    probed_pairs: Pairs the probe actually measured.\n    probe_truncated: Whether the probe hit its call budget (a truncated\n        probe can never support ``false-positive``).\n    distmax_m: The probe's cutoff distance.\n    payload_contacts: MuJoCo contact count involving the payload.\n\nExample:\n    >>> adj = ValidationGroundTruthAdjudication(\n    ...     verdict=\"real-contact\", stop_class=\"attached_payload\", sim_time_s=17.5\n    ... )\n    >>> adj.verdict\n    'real-contact'",
      "properties": {
        "verdict": {
          "enum": [
            "real-contact",
            "false-positive",
            "within-quantization",
            "unadjudicated"
          ],
          "title": "Verdict",
          "type": "string"
        },
        "stop_class": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Stop Class"
        },
        "sim_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Sim Time S"
        },
        "grid_resolution_m": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Grid Resolution M"
        },
        "quantization_budget_m": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Quantization Budget M"
        },
        "admissible_gap_m": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Admissible Gap M"
        },
        "budget_source": {
          "default": "",
          "title": "Budget Source",
          "type": "string"
        },
        "probe_collidability_filtered": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Probe Collidability Filtered"
        },
        "probe_distance_certified": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Probe Distance Certified"
        },
        "unadjudicated_reason": {
          "default": "",
          "title": "Unadjudicated Reason",
          "type": "string"
        },
        "nearest_any_m": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Nearest Any M"
        },
        "nearest_tripping_party_m": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Nearest Tripping Party M"
        },
        "nearest_pair": {
          "additionalProperties": true,
          "title": "Nearest Pair",
          "type": "object"
        },
        "discrepancy_m": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Discrepancy M"
        },
        "probed_pairs": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Probed Pairs"
        },
        "probe_truncated": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Probe Truncated"
        },
        "distmax_m": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Distmax M"
        },
        "payload_contacts": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Payload Contacts"
        }
      },
      "required": [
        "verdict"
      ],
      "title": "ValidationGroundTruthAdjudication",
      "type": "object"
    },
    "ValidationRoundMetadata": {
      "additionalProperties": true,
      "description": "What was executed, on what, from what \u2014 the reproducibility half.\n\nEvery field answers a \"why couldn't we reproduce a past round\" question:\nwhich code ran, whether the overlay was built from it, which dependency\nset, which entry point.\n\nAttributes:\n    round_id: Directory name of the round, e.g. ``\"2026-08-22-master-1\"``.\n    started_at: ISO-8601 UTC timestamp the round began.\n    host: Hostname of the validation runner.\n    executed_sha: Full git SHA of the checkout that ran.\n    worktree_clean: Whether ``git status --porcelain`` was empty; ``None``\n        only for pre-harness imports (``run`` refuses a dirty worktree).\n    overlay_built_at_ns: Modification time of the built ROS overlay, to\n        prove it isn't older than the sources.\n    launcher_path: Absolute path of the ``openral`` entry point invoked.\n    repo_root: Absolute path exported as ``OPENRAL_REPO_ROOT``.\n    robot_manifest_path: Repo-relative path of the resolved robot manifest.\n    robot_id: The robot id the scenes resolved to.\n    sync_groups: Dependency groups the environment was synced with.\n    stack_argv: The launch argv shared by every scene, verbatim.\n    safety_overrides_absent: ``True`` only when the composed argv was\n        checked and carries no safety-knob override; a round is refused\n        rather than recorded ``False``.\n    collision_scale: The #188 graded-velocity band the kernel ran with,\n        when armed; empty = shipped default (disabled). Arrives via\n        ``OPENRAL_COLLISION_SCALE_*`` env vars, invisible to argv inspection.\n    gpu_name: GPU the round ran on, when ``nvidia-smi`` was available.\n    notes_path: Round-relative path of the human-readable notes.\n    scene_dirs: Scene key \u2192 round-relative artifact directory; empty =\n        same name as the scene key.\n    seed: The scene seed the round pinned; read with ``executed_sha`` for\n        a true reproducibility pair (a seed mismatch is a before/after).\n    artifact_stem: Filename stem of every per-scene artifact; pre-harness\n        rounds used ``\"seed1\"``.\n    imported_from: Absolute path of the pre-harness round this was\n        imported from, if any.\n    scene_pins: Scene ``runtime:`` keys the round pinned (no CLI flag\n        exists for them); read with ``stack_argv`` for the whole executed stack.\n\nExample:\n    >>> m = ValidationRoundMetadata(\n    ...     round_id=\"2026-08-22-master-1\",\n    ...     started_at=\"2026-08-22T10:02:00Z\",\n    ...     executed_sha=\"2edcf67\" + \"0\" * 33,\n    ...     worktree_clean=True,\n    ... )\n    >>> m.safety_overrides_absent\n    True",
      "properties": {
        "round_id": {
          "title": "Round Id",
          "type": "string"
        },
        "started_at": {
          "title": "Started At",
          "type": "string"
        },
        "host": {
          "default": "",
          "title": "Host",
          "type": "string"
        },
        "executed_sha": {
          "title": "Executed Sha",
          "type": "string"
        },
        "worktree_clean": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "title": "Worktree Clean"
        },
        "overlay_built_at_ns": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Overlay Built At Ns"
        },
        "launcher_path": {
          "default": "",
          "title": "Launcher Path",
          "type": "string"
        },
        "repo_root": {
          "default": "",
          "title": "Repo Root",
          "type": "string"
        },
        "robot_manifest_path": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Robot Manifest Path"
        },
        "robot_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Robot Id"
        },
        "sync_groups": {
          "items": {
            "type": "string"
          },
          "title": "Sync Groups",
          "type": "array"
        },
        "stack_argv": {
          "items": {
            "type": "string"
          },
          "title": "Stack Argv",
          "type": "array"
        },
        "safety_overrides_absent": {
          "default": true,
          "title": "Safety Overrides Absent",
          "type": "boolean"
        },
        "collision_scale": {
          "additionalProperties": {
            "type": "number"
          },
          "title": "Collision Scale",
          "type": "object"
        },
        "gpu_name": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Gpu Name"
        },
        "ros_domain_id": {
          "default": "",
          "title": "Ros Domain Id",
          "type": "string"
        },
        "ros_automatic_discovery_range": {
          "default": "",
          "title": "Ros Automatic Discovery Range",
          "type": "string"
        },
        "notes_path": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Notes Path"
        },
        "scene_dirs": {
          "additionalProperties": {
            "type": "string"
          },
          "title": "Scene Dirs",
          "type": "object"
        },
        "seed": {
          "default": 1,
          "title": "Seed",
          "type": "integer"
        },
        "artifact_stem": {
          "default": "run",
          "title": "Artifact Stem",
          "type": "string"
        },
        "imported_from": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Imported From"
        },
        "scene_pins": {
          "additionalProperties": {
            "type": "boolean"
          },
          "title": "Scene Pins",
          "type": "object"
        }
      },
      "required": [
        "round_id",
        "started_at",
        "executed_sha",
        "worktree_clean"
      ],
      "title": "ValidationRoundMetadata",
      "type": "object"
    },
    "ValidationSceneVerdict": {
      "additionalProperties": true,
      "description": "One scene of one validation round, as a queryable record.\n\nAttributes:\n    scene: Short scene key (``\"baguette\"``, ``\"sink_cup\"``, ``\"fridge\"``,\n        ``\"utensil\"``).\n    config_path: Repo-relative path of the DeployScene YAML that ran.\n    config_sha256: Digest of that YAML's bytes as executed, so a round can\n        be reproduced even if the scene later changes.\n    seed: The scene seed in force.\n    prompt: The instruction dispatched to the policy.\n    rskill_id: The rSkill the run dispatched.\n    outcome: The scene's outcome.\n    task_success_final: ``success`` from the terminal\n        ``sim.task_success_final`` line. ``None`` when the run never\n        emitted one.\n    task_success_ever: ``ever_succeeded`` from the same line.\n    task_success_steps: Simulator steps the episode ran.\n    task_success_transitions: Success-predicate transitions observed.\n    stop: The kernel's verdict, when the run was stopped.\n    ground_truth: Adjudication of that stop against the simulator.\n    witness: The attach / witness / declaration lifecycle.\n    monitor_records: How many records the run's monitor wrote from a ROS\n        subscription \u2014 every line except its own ``monitor_started`` /\n        ``monitor_stopped`` pair. ``None`` when no monitor JSONL exists.\n        **Zero means the monitor received nothing**, which is a harness\n        fault (its DDS participant never saw the graph) and must not be\n        read as \"the run stopped before there was anything to see\".\n    dispatch_failure_reason: ``failure_reason`` reported by the action\n        client, verbatim \u2014 or, when the dispatcher died before writing a\n        status line at all, why it did.\n    wall_s: Wall-clock seconds the dispatch took.\n    artifacts: Round-relative paths of the files this verdict was derived\n        from, so every field is traceable to a file.\n    harness_error_reason: Why the run produced no usable artifact set \u2014\n        the graph never came up, or the deploy CLI rejected its own argv.\n        Non-empty exactly when ``outcome`` is ``harness-error``, so a\n        failed launch can never be read as a clean deadline.\n\nExample:\n    >>> v = ValidationSceneVerdict(\n    ...     scene=\"fridge\",\n    ...     config_path=\"scenes/deploy/robocasa_fridge_drawer.yaml\",\n    ...     seed=1,\n    ...     outcome=\"estop-initial-configuration\",\n    ... )\n    >>> v.outcome\n    'estop-initial-configuration'",
      "properties": {
        "scene": {
          "title": "Scene",
          "type": "string"
        },
        "config_path": {
          "title": "Config Path",
          "type": "string"
        },
        "config_sha256": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Config Sha256"
        },
        "seed": {
          "title": "Seed",
          "type": "integer"
        },
        "prompt": {
          "default": "",
          "title": "Prompt",
          "type": "string"
        },
        "rskill_id": {
          "default": "",
          "title": "Rskill Id",
          "type": "string"
        },
        "outcome": {
          "enum": [
            "completed",
            "estop-collision-real",
            "estop-collision-false-positive",
            "estop-collision-within-quantization",
            "estop-collision-unadjudicated",
            "estop-initial-configuration",
            "deadline-after-grasp",
            "deadline-no-grasp",
            "harness-error"
          ],
          "title": "Outcome",
          "type": "string"
        },
        "task_success_final": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Task Success Final"
        },
        "task_success_ever": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Task Success Ever"
        },
        "task_success_steps": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Task Success Steps"
        },
        "task_success_transitions": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Task Success Transitions"
        },
        "stop": {
          "anyOf": [
            {
              "$ref": "#/$defs/ValidationStopEvidence"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "ground_truth": {
          "anyOf": [
            {
              "$ref": "#/$defs/ValidationGroundTruthAdjudication"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "witness": {
          "$ref": "#/$defs/ValidationWitnessTimeline"
        },
        "monitor_records": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Monitor Records"
        },
        "dispatch_failure_reason": {
          "default": "",
          "title": "Dispatch Failure Reason",
          "type": "string"
        },
        "wall_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Wall S"
        },
        "artifacts": {
          "additionalProperties": {
            "type": "string"
          },
          "title": "Artifacts",
          "type": "object"
        },
        "harness_error_reason": {
          "default": "",
          "title": "Harness Error Reason",
          "type": "string"
        }
      },
      "required": [
        "scene",
        "config_path",
        "seed",
        "outcome"
      ],
      "title": "ValidationSceneVerdict",
      "type": "object"
    },
    "ValidationStopEvidence": {
      "additionalProperties": true,
      "description": "The kernel's ``safety.collision`` verdict for one scene, transcribed.\n\nEvery field is read verbatim out of the ``safety.collision`` log line the\nC++ kernel emits; nothing is recomputed. ``min_distance_m`` is the depth of\nthe cell the kernel *reported*, ``sweep_min_distance_m`` the depth of the\ndeepest cell its sweep found \u2014 they differ only when a support-contact\nwitness exempted a deeper cell, which makes their inequality the\nauthoritative \"was an exemption live at the trip\" evidence.\n\nAttributes:\n    kind: The kernel's collision kind (``\"world\"``, ``\"self\"``).\n    party_a: First party \u2014 a robot link, or ``attached:<object_id>`` when\n        the declared payload is the subject.\n    party_b: Second party \u2014 usually ``voxel_<index>`` for a world stop.\n    horizon_step: Predicted-horizon index the verdict was evaluated at.\n        ``-1`` is the reactive (measured-state) check.\n    min_distance_m: Reported penetration depth, negative when inside.\n    sweep_min_distance_m: Deepest cell the sweep found, negative when\n        inside. ``None`` when the kernel build did not report it.\n    place_allowance_active: Whether the ADR-0097 place-approach allowance\n        was applied on the trip itself.\n    place_target: Declared place target at the trip, empty when none.\n    depth_is_box_bound: Whether the reported ``min_distance_m`` is the\n        OBB's **bound** rather than a measurement of the geometry the\n        evidence names (#213). Set by the kernel only for a self-collision\n        pair whose two links both ship a stage-2 hull and whose hulls the\n        GJK found overlapping \u2014 GJK proves an overlap but does not size\n        one. Sound (the hull is inside its box, so the box can only report\n        more penetration) but loose: -31.97 mm for a ~1.5 mm hull\n        interpenetration on ``panda_link5``/``panda_link7``. An adjudicator\n        must charge the box budget for such a stop, never treat the number\n        as a hull measurement. ``False`` on a snapshot recorded before\n        #213.\n    exemption_active: ``True`` when ``sweep_min_distance_m`` is strictly\n        deeper than ``min_distance_m`` \u2014 a deeper cell was exempted.\n        ``None`` when the sweep depth was not reported.\n\nExample:\n    >>> ev = ValidationStopEvidence(\n    ...     kind=\"world\",\n    ...     party_a=\"panda_link5\",\n    ...     party_b=\"voxel_170781\",\n    ...     horizon_step=0,\n    ...     min_distance_m=-0.0209178,\n    ...     sweep_min_distance_m=-0.0209178,\n    ... )\n    >>> ev.exemption_active\n    False",
      "properties": {
        "kind": {
          "title": "Kind",
          "type": "string"
        },
        "party_a": {
          "title": "Party A",
          "type": "string"
        },
        "party_b": {
          "title": "Party B",
          "type": "string"
        },
        "horizon_step": {
          "title": "Horizon Step",
          "type": "integer"
        },
        "min_distance_m": {
          "title": "Min Distance M",
          "type": "number"
        },
        "sweep_min_distance_m": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Sweep Min Distance M"
        },
        "place_allowance_active": {
          "default": false,
          "title": "Place Allowance Active",
          "type": "boolean"
        },
        "place_target": {
          "default": "",
          "title": "Place Target",
          "type": "string"
        },
        "depth_is_box_bound": {
          "default": false,
          "title": "Depth Is Box Bound",
          "type": "boolean"
        }
      },
      "required": [
        "kind",
        "party_a",
        "party_b",
        "horizon_step",
        "min_distance_m"
      ],
      "title": "ValidationStopEvidence",
      "type": "object"
    },
    "ValidationWitnessTimeline": {
      "additionalProperties": true,
      "description": "The attach / witness / place-declaration lifecycle of one scene.\n\nReconstructed from the run's monitor JSONL (producer side) and the kernel's\nown ``safety.support_witness_*`` / ``safety.place_region_*`` log lines\n(consumer side). Both are recorded because a disagreement between them is\nitself a finding.\n\nAttributes:\n    attach_t_s: Monitor time of the first payload attach, ``None`` if the\n        run never grasped.\n    detach_t_s: Monitor time of the payload detach, if any.\n    support_id: The support body the witness last attested against.\n    kernel_witness_armed: ``safety.support_witness_armed`` line count.\n    kernel_witness_separated: ``safety.support_witness_separated`` count.\n    place_declaration_seen: Whether a place declaration with a\n        producer-measured region reached the monitor.\n    place_region_armed: Whether the kernel armed the declared place region.\n    place_allowance_active_lines: How many lines disclosed\n        ``place_allowance_active=1``. ``0`` means the approach allowance\n        never applied anywhere in the run.\n\nExample:\n    >>> ValidationWitnessTimeline(attach_t_s=176.32).place_allowance_active_lines\n    0",
      "properties": {
        "attach_t_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Attach T S"
        },
        "detach_t_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Detach T S"
        },
        "support_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Support Id"
        },
        "kernel_witness_armed": {
          "default": 0,
          "title": "Kernel Witness Armed",
          "type": "integer"
        },
        "kernel_witness_separated": {
          "default": 0,
          "title": "Kernel Witness Separated",
          "type": "integer"
        },
        "place_declaration_seen": {
          "default": false,
          "title": "Place Declaration Seen",
          "type": "boolean"
        },
        "place_region_armed": {
          "default": false,
          "title": "Place Region Armed",
          "type": "boolean"
        },
        "place_allowance_active_lines": {
          "default": 0,
          "title": "Place Allowance Active Lines",
          "type": "integer"
        }
      },
      "title": "ValidationWitnessTimeline",
      "type": "object"
    }
  },
  "additionalProperties": true,
  "description": "One validation round's machine-readable result \u2014 ``verdicts.json``.\n\nThis is the on-disk contract ``tools/validation_matrix.py`` writes and\n``docs/reference/collision-validation-evidence.md`` is fed from.\n\nAttributes:\n    schema_version: On-disk format version.\n    metadata: Reproducibility metadata for the round.\n    scenes: One verdict per scene, in execution order.\n\nExample:\n    >>> r = ValidationRoundVerdicts(\n    ...     metadata=ValidationRoundMetadata(\n    ...         round_id=\"r1\",\n    ...         started_at=\"2026-08-22T10:02:00Z\",\n    ...         executed_sha=\"0\" * 40,\n    ...         worktree_clean=True,\n    ...     ),\n    ...     scenes=[],\n    ... )\n    >>> r.schema_version\n    '0.1'",
  "properties": {
    "schema_version": {
      "default": "0.1",
      "title": "Schema Version",
      "type": "string"
    },
    "metadata": {
      "$ref": "#/$defs/ValidationRoundMetadata"
    },
    "scenes": {
      "items": {
        "$ref": "#/$defs/ValidationSceneVerdict"
      },
      "title": "Scenes",
      "type": "array"
    }
  },
  "required": [
    "metadata"
  ],
  "title": "ValidationRoundVerdicts",
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
