{
  "scene_id": "articraft_articulation_demo",
  "source_method": "scenesmith",
  "task_instruction": "A laundry corner with a front-loading washing machine (door open) and a second appliance beside it.",
  "room_type": "laundry",
  "scene_summary": "scenesmith scene with 2 objects. Room type: laundry. Planned checks: 6. Room shell: 3.38m x 2.54m x 2.70m.",
  "overview_render_image": "render_bundle/views/view_00_rgb.png",
  "overview_render_images": [
    "render_bundle/views/view_00_rgb.png",
    "render_bundle/views/view_01_rgb.png",
    "render_bundle/views/view_02_rgb.png",
    "render_bundle/views/view_03_rgb.png"
  ],
  "render_bundle_dir": "render_bundle",
  "renderer_mode": "blender_rebuild",
  "checks": [
    {
      "check_id": "interaction_clearance__appliance_neighbor_0",
      "metric": "interaction_clearance",
      "subject_id": "appliance_neighbor_0",
      "target_ids": [],
      "affordance": "openable",
      "asset_facts": {
        "category_norm": "frontload washing machine",
        "affordances": [
          "openable",
          "containable",
          "drawable",
          "graspable",
          "turn"
        ],
        "benchmark_relevance": "functional",
        "front_face": "front",
        "interaction_surface_map": {
          "front": [
            "open",
            "access_contents",
            "open",
            "grasp"
          ],
          "back": [],
          "left": [],
          "right": [],
          "top": []
        },
        "access_type": {},
        "placement_class": "floor_furniture",
        "interaction_height_m": {},
        "confidence": 0.8,
        "source": "asset_annotation",
        "low_confidence_candidates": {},
        "articulation": {
          "is_articulated": true,
          "movable_parts": [
            {
              "name": "drum",
              "joint_type": "revolute",
              "joint_axis": [
                1.0,
                0.0,
                0.0
              ],
              "joint_limits": null
            },
            {
              "name": "door",
              "joint_type": "revolute",
              "joint_axis": [
                0.999718,
                0.023758,
                -0.0
              ],
              "joint_limits": null
            },
            {
              "name": "detergent_drawer",
              "joint_type": "prismatic",
              "joint_axis": [
                1.0,
                0.0,
                0.0
              ],
              "joint_limits": null
            },
            {
              "name": "knob",
              "joint_type": "revolute",
              "joint_axis": [
                1.0,
                0.0,
                0.0
              ],
              "joint_limits": null
            }
          ],
          "has_operation_space": false
        }
      },
      "question": "Task: A laundry corner with a front-loading washing machine (door open) and a second appliance beside it.\nEvaluate only the `interaction_clearance` metric for `appliance_neighbor_0` with affordance `openable`.\nRelevant context: the surrounding scene.\nFirst infer the most likely operating side from door panels, handles, hinges, or the side that faces into the room. Then check only that side for a normal standing zone and immediate hand/door operating clearance. Do not assume a large hinged swing arc unless the render clearly shows hinged doors needing that arc. Do not require the entire front face to be empty; a nearby bench or seat off to one side is acceptable when the floor directly before the door/handle area remains usable. A narrow diagonal side gap or a squeeze-by path does not count as clear operating space.\nIf you choose `degraded` or `fail`, name the blocker or the blocked standing/opening zone directly in front of the operating side. If at least one practical front-facing or slightly offset standing position remains and can still reach the operating side normally, prefer `pass`. Do not fail an openable object merely because a nearby seat or small furniture item is offset near one part of the front; require evidence that the usable operating side is actually occupied or pinched. If the operating side cannot be identified from the evidence, return `unknown` instead of guessing.",
      "prompt_text": "You are an affordance-aware functional critic for 3D indoor scenes.\n\nCore principle: judge whether the task CAN be done in the current scene, without assuming it has already been pre-solved.\n\nWorkflow:\n1. Read the task instruction and target metric.\n2. Inspect the local check renders first and treat them as the primary evidence for the requested interaction.\n3. Local render order and intended use: 1. `local_operating_zone` is the clean RGB view for the most likely door-facing standing and opening zone. 2. `local_operating_zone_context` is a slightly wider highlighted context view of the same operating side. 3. `local_depth_probe` is an oblique RGB view meant to clarify depth and whether a blocker sits in front of the operating zone. 4. `local_plan_context` is a high local layout view used to check whether a nearby object actually spans or occupies the operating/approach zone rather than merely overlapping in perspective.\n4. Then inspect the 4 attached overview renders for room-scale layout and approach context. These overviews are captured from a slightly elevated height and are not meant to mimic adult eye level.\n5. Evaluate ONLY the requested metric and return a JSON object matching the schema.\n\nScene summary: scenesmith scene with 2 objects. Room type: laundry. Planned checks: 6. Room shell: 3.38m x 2.54m x 2.70m.\nTask instruction: A laundry corner with a front-loading washing machine (door open) and a second appliance beside it.\nMetric: interaction_clearance\nSubject object: appliance_neighbor_0\nTarget objects: none\n\nVerified asset facts:\n- subject `appliance_neighbor_0`: category `frontload washing machine`, affordances [openable, containable, drawable, graspable, turn], usable face `front`, benchmark relevance `functional`, confidence `0.80`, source `asset_annotation`\n- interaction facts: placement class `floor_furniture`, access type `none`, interaction height `none`, surface map `front: [open, access_contents, open, grasp]`\n- low-confidence candidates: `none`\n- articulation facts: 4 movable part(s): drum (revolute, axis [1.0, 0.0, 0.0], limits None); door (revolute, axis [0.999718, 0.023758, -0.0], limits None); detergent_drawer (prismatic, axis [1.0, 0.0, 0.0], limits None); knob (revolute, axis [1.0, 0.0, 0.0], limits None); no precomputed swept volume\nUse these as converter-side asset facts. Do not reclassify the subject; judge only whether the listed affordance remains usable in the current scene. If the image clearly contradicts these facts, return unknown and explain the conflict.\n\nScene evidence object hints:\n- subject `appliance_neighbor_0`: category `frontload washing machine`, group `unknown`, keywords [frontload washing machine], affordances [openable, containable, drawable, graspable, turn], task targets [table, desk, nightstand, coffee_table, shelf, cabinet]\n- targets: none\n\nAuxiliary scene cues (coarse geometry only; use these cues just to identify rough scale and nearby context):\n- subject `appliance_neighbor_0`: category `frontload washing machine`, room `laundry`, placement `floor`, footprint `medium`, height `mid`, elevation `raised`\nTarget cues:\n- none\nNearby same-room context objects that may affect access or clearance:\n- `washer_open_0`: category `frontload washing machine`, placement `floor`, proximity `mid`, bbox_relation `overlapping_or_touching`, footprint `medium`\nDo not estimate exact centimeter clearance from these coarse cues. They are only for object identity, rough scale, and coarse proximity; the local renders remain the deciding evidence.\n\nMetric-specific rule:\nTask: A laundry corner with a front-loading washing machine (door open) and a second appliance beside it.\nEvaluate only the `interaction_clearance` metric for `appliance_neighbor_0` with affordance `openable`.\nRelevant context: the surrounding scene.\nFirst infer the most likely operating side from door panels, handles, hinges, or the side that faces into the room. Then check only that side for a normal standing zone and immediate hand/door operating clearance. Do not assume a large hinged swing arc unless the render clearly shows hinged doors needing that arc. Do not require the entire front face to be empty; a nearby bench or seat off to one side is acceptable when the floor directly before the door/handle area remains usable. A narrow diagonal side gap or a squeeze-by path does not count as clear operating space.\nIf you choose `degraded` or `fail`, name the blocker or the blocked standing/opening zone directly in front of the operating side. If at least one practical front-facing or slightly offset standing position remains and can still reach the operating side normally, prefer `pass`. Do not fail an openable object merely because a nearby seat or small furniture item is offset near one part of the front; require evidence that the usable operating side is actually occupied or pinched. If the operating side cannot be identified from the evidence, return `unknown` instead of guessing.\n\nImage order is fixed: local check renders always come first, followed by the overview renders. If a local render is highlighted, the subject is red and the targets are green.\nEvidence guardrails:\n- Treat the local renders as the deciding evidence for direct blockage, operating-side clearance, and immediate approach space.\n- Use overview renders only to understand room-scale layout or to break ties when the local evidence is incomplete.\n- To output `degraded` or `fail`, the local evidence should explicitly show a directly constrained operating/approach zone, not just a nearby object or a single perspective overlap.\n- When a `local_plan_context` view is present, use it to verify whether the suspected blocker really spans the usable operating/approach zone; if it shows a normal nearby standing/reach position remains, prefer `pass`.\n- If the overview render suggests a blockage but the local evidence does not clearly show that blockage, prefer `pass` or `unknown`, not `degraded` or `fail`.\nOutput JSON with keys: check_id, metric, label, asset_fact_used, asset_fact_confidence, evidence_conflict, reason, blocking_objects, confidence.\nAllowed labels: pass, degraded, fail, unknown.\n2D perspective overlap alone is not enough evidence of a blocker.\nNormal adjacency priors should not override direct evidence in the local renders. Nightstands beside beds, benches touching bed ends, corner wardrobes, and wall decor are acceptable only when they do not directly intrude into the required functional region.\nIf you choose degraded or fail, the reason must name a direct blocker or directly constrained functional region.\nIf evidence is insufficient, use unknown instead of guessing.",
      "evidence": {
        "render_image": "render_bundle/checks/interaction_clearance__appliance_neighbor_0_local_operating_zone.png",
        "render_images": [
          "render_bundle/checks/interaction_clearance__appliance_neighbor_0_local_operating_zone.png",
          "render_bundle/checks/interaction_clearance__appliance_neighbor_0_local_operating_zone_context.png",
          "render_bundle/checks/interaction_clearance__appliance_neighbor_0_local_depth_probe.png",
          "render_bundle/checks/interaction_clearance__appliance_neighbor_0_local_plan_context.png"
        ],
        "render_image_roles": [
          "local_operating_zone",
          "local_operating_zone_context",
          "local_depth_probe",
          "local_plan_context"
        ]
      },
      "response_schema": {
        "type": "object",
        "required": [
          "check_id",
          "metric",
          "label",
          "reason",
          "blocking_objects",
          "confidence"
        ],
        "properties": {
          "check_id": {
            "type": "string"
          },
          "metric": {
            "enum": [
              "affordance_exposure",
              "interaction_clearance",
              "spatial_accessibility",
              "functional_dependency"
            ]
          },
          "label": {
            "enum": [
              "pass",
              "degraded",
              "fail",
              "unknown"
            ]
          },
          "asset_fact_used": {
            "type": "boolean"
          },
          "asset_fact_confidence": {
            "type": "number"
          },
          "evidence_conflict": {
            "type": "boolean"
          },
          "reason": {
            "type": "string"
          },
          "blocking_objects": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "confidence": {
            "type": "number"
          }
        }
      }
    },
    {
      "check_id": "spatial_accessibility__appliance_neighbor_0",
      "metric": "spatial_accessibility",
      "subject_id": "appliance_neighbor_0",
      "target_ids": [],
      "affordance": "openable",
      "asset_facts": {
        "category_norm": "frontload washing machine",
        "affordances": [
          "openable",
          "containable",
          "drawable",
          "graspable",
          "turn"
        ],
        "benchmark_relevance": "functional",
        "front_face": "front",
        "interaction_surface_map": {
          "front": [
            "open",
            "access_contents",
            "open",
            "grasp"
          ],
          "back": [],
          "left": [],
          "right": [],
          "top": []
        },
        "access_type": {},
        "placement_class": "floor_furniture",
        "interaction_height_m": {},
        "confidence": 0.8,
        "source": "asset_annotation",
        "low_confidence_candidates": {},
        "articulation": {
          "is_articulated": true,
          "movable_parts": [
            {
              "name": "drum",
              "joint_type": "revolute",
              "joint_axis": [
                1.0,
                0.0,
                0.0
              ],
              "joint_limits": null
            },
            {
              "name": "door",
              "joint_type": "revolute",
              "joint_axis": [
                0.999718,
                0.023758,
                -0.0
              ],
              "joint_limits": null
            },
            {
              "name": "detergent_drawer",
              "joint_type": "prismatic",
              "joint_axis": [
                1.0,
                0.0,
                0.0
              ],
              "joint_limits": null
            },
            {
              "name": "knob",
              "joint_type": "revolute",
              "joint_axis": [
                1.0,
                0.0,
                0.0
              ],
              "joint_limits": null
            }
          ],
          "has_operation_space": false
        }
      },
      "question": "Task: A laundry corner with a front-loading washing machine (door open) and a second appliance beside it.\nEvaluate only the `spatial_accessibility` metric for `appliance_neighbor_0` with affordance `openable`.\nRelevant context: the surrounding scene.\nCheck whether at least one practical front-facing or slightly offset standing position can reach the operating side so the object can be opened. A nearby bed corner or bench should not cause degraded by itself if a normal reach from the front region is still possible. Use degraded only when that front-region approach is directly pinched, occupied, or effectively unusable across the usable operating side. Do not count a cramped diagonal squeeze, shoulder-turned sidestep, or tiny side sliver as a valid approach path.\nIf you choose `degraded` or `fail`, name the blocker or the blocked standing/opening zone directly in front of the operating side. If at least one practical front-facing or slightly offset standing position remains and can still reach the operating side normally, prefer `pass`. Do not fail an openable object merely because a nearby seat or small furniture item is offset near one part of the front; require evidence that the usable operating side is actually occupied or pinched. If the operating side cannot be identified from the evidence, return `unknown` instead of guessing.",
      "prompt_text": "You are an affordance-aware functional critic for 3D indoor scenes.\n\nCore principle: judge whether the task CAN be done in the current scene, without assuming it has already been pre-solved.\n\nWorkflow:\n1. Read the task instruction and target metric.\n2. Inspect the local check renders first and treat them as the primary evidence for the requested interaction.\n3. Local render order and intended use: 1. `local_operating_zone` is the clean RGB view for the most likely door-facing standing and opening zone. 2. `local_operating_zone_context` is a slightly wider highlighted context view of the same operating side. 3. `local_depth_probe` is an oblique RGB view meant to clarify depth and whether a blocker sits in front of the operating zone. 4. `local_plan_context` is a high local layout view used to check whether a nearby object actually spans or occupies the operating/approach zone rather than merely overlapping in perspective.\n4. Then inspect the 4 attached overview renders for room-scale layout and approach context. These overviews are captured from a slightly elevated height and are not meant to mimic adult eye level.\n5. Evaluate ONLY the requested metric and return a JSON object matching the schema.\n\nScene summary: scenesmith scene with 2 objects. Room type: laundry. Planned checks: 6. Room shell: 3.38m x 2.54m x 2.70m.\nTask instruction: A laundry corner with a front-loading washing machine (door open) and a second appliance beside it.\nMetric: spatial_accessibility\nSubject object: appliance_neighbor_0\nTarget objects: none\n\nVerified asset facts:\n- subject `appliance_neighbor_0`: category `frontload washing machine`, affordances [openable, containable, drawable, graspable, turn], usable face `front`, benchmark relevance `functional`, confidence `0.80`, source `asset_annotation`\n- interaction facts: placement class `floor_furniture`, access type `none`, interaction height `none`, surface map `front: [open, access_contents, open, grasp]`\n- low-confidence candidates: `none`\n- articulation facts: 4 movable part(s): drum (revolute, axis [1.0, 0.0, 0.0], limits None); door (revolute, axis [0.999718, 0.023758, -0.0], limits None); detergent_drawer (prismatic, axis [1.0, 0.0, 0.0], limits None); knob (revolute, axis [1.0, 0.0, 0.0], limits None); no precomputed swept volume\nUse these as converter-side asset facts. Do not reclassify the subject; judge only whether the listed affordance remains usable in the current scene. If the image clearly contradicts these facts, return unknown and explain the conflict.\n\nScene evidence object hints:\n- subject `appliance_neighbor_0`: category `frontload washing machine`, group `unknown`, keywords [frontload washing machine], affordances [openable, containable, drawable, graspable, turn], task targets [table, desk, nightstand, coffee_table, shelf, cabinet]\n- targets: none\n\nAuxiliary scene cues (coarse geometry only; use these cues just to identify rough scale and nearby context):\n- subject `appliance_neighbor_0`: category `frontload washing machine`, room `laundry`, placement `floor`, footprint `medium`, height `mid`, elevation `raised`\nTarget cues:\n- none\nNearby same-room context objects that may affect access or clearance:\n- `washer_open_0`: category `frontload washing machine`, placement `floor`, proximity `mid`, bbox_relation `overlapping_or_touching`, footprint `medium`\nDo not estimate exact centimeter clearance from these coarse cues. They are only for object identity, rough scale, and coarse proximity; the local renders remain the deciding evidence.\n\nMetric-specific rule:\nTask: A laundry corner with a front-loading washing machine (door open) and a second appliance beside it.\nEvaluate only the `spatial_accessibility` metric for `appliance_neighbor_0` with affordance `openable`.\nRelevant context: the surrounding scene.\nCheck whether at least one practical front-facing or slightly offset standing position can reach the operating side so the object can be opened. A nearby bed corner or bench should not cause degraded by itself if a normal reach from the front region is still possible. Use degraded only when that front-region approach is directly pinched, occupied, or effectively unusable across the usable operating side. Do not count a cramped diagonal squeeze, shoulder-turned sidestep, or tiny side sliver as a valid approach path.\nIf you choose `degraded` or `fail`, name the blocker or the blocked standing/opening zone directly in front of the operating side. If at least one practical front-facing or slightly offset standing position remains and can still reach the operating side normally, prefer `pass`. Do not fail an openable object merely because a nearby seat or small furniture item is offset near one part of the front; require evidence that the usable operating side is actually occupied or pinched. If the operating side cannot be identified from the evidence, return `unknown` instead of guessing.\n\nImage order is fixed: local check renders always come first, followed by the overview renders. If a local render is highlighted, the subject is red and the targets are green.\nEvidence guardrails:\n- Treat the local renders as the deciding evidence for direct blockage, operating-side clearance, and immediate approach space.\n- Use overview renders only to understand room-scale layout or to break ties when the local evidence is incomplete.\n- To output `degraded` or `fail`, the local evidence should explicitly show a directly constrained operating/approach zone, not just a nearby object or a single perspective overlap.\n- When a `local_plan_context` view is present, use it to verify whether the suspected blocker really spans the usable operating/approach zone; if it shows a normal nearby standing/reach position remains, prefer `pass`.\n- If the overview render suggests a blockage but the local evidence does not clearly show that blockage, prefer `pass` or `unknown`, not `degraded` or `fail`.\nOutput JSON with keys: check_id, metric, label, asset_fact_used, asset_fact_confidence, evidence_conflict, reason, blocking_objects, confidence.\nAllowed labels: pass, degraded, fail, unknown.\n2D perspective overlap alone is not enough evidence of a blocker.\nNormal adjacency priors should not override direct evidence in the local renders. Nightstands beside beds, benches touching bed ends, corner wardrobes, and wall decor are acceptable only when they do not directly intrude into the required functional region.\nIf you choose degraded or fail, the reason must name a direct blocker or directly constrained functional region.\nIf evidence is insufficient, use unknown instead of guessing.",
      "evidence": {
        "render_image": "render_bundle/checks/spatial_accessibility__appliance_neighbor_0_local_operating_zone.png",
        "render_images": [
          "render_bundle/checks/spatial_accessibility__appliance_neighbor_0_local_operating_zone.png",
          "render_bundle/checks/spatial_accessibility__appliance_neighbor_0_local_operating_zone_context.png",
          "render_bundle/checks/spatial_accessibility__appliance_neighbor_0_local_depth_probe.png",
          "render_bundle/checks/spatial_accessibility__appliance_neighbor_0_local_plan_context.png"
        ],
        "render_image_roles": [
          "local_operating_zone",
          "local_operating_zone_context",
          "local_depth_probe",
          "local_plan_context"
        ]
      },
      "response_schema": {
        "type": "object",
        "required": [
          "check_id",
          "metric",
          "label",
          "reason",
          "blocking_objects",
          "confidence"
        ],
        "properties": {
          "check_id": {
            "type": "string"
          },
          "metric": {
            "enum": [
              "affordance_exposure",
              "interaction_clearance",
              "spatial_accessibility",
              "functional_dependency"
            ]
          },
          "label": {
            "enum": [
              "pass",
              "degraded",
              "fail",
              "unknown"
            ]
          },
          "asset_fact_used": {
            "type": "boolean"
          },
          "asset_fact_confidence": {
            "type": "number"
          },
          "evidence_conflict": {
            "type": "boolean"
          },
          "reason": {
            "type": "string"
          },
          "blocking_objects": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "confidence": {
            "type": "number"
          }
        }
      }
    },
    {
      "check_id": "interaction_clearance__washer_open_0",
      "metric": "interaction_clearance",
      "subject_id": "washer_open_0",
      "target_ids": [],
      "affordance": "openable",
      "asset_facts": {
        "category_norm": "frontload washing machine",
        "affordances": [
          "openable",
          "containable",
          "drawable",
          "graspable",
          "turn"
        ],
        "benchmark_relevance": "functional",
        "front_face": "front",
        "interaction_surface_map": {
          "front": [
            "open",
            "access_contents",
            "open",
            "grasp"
          ],
          "back": [],
          "left": [],
          "right": [],
          "top": []
        },
        "access_type": {},
        "placement_class": "floor_furniture",
        "interaction_height_m": {},
        "confidence": 0.8,
        "source": "asset_annotation",
        "low_confidence_candidates": {},
        "articulation": {
          "is_articulated": true,
          "movable_parts": [
            {
              "name": "drum",
              "joint_type": "revolute",
              "joint_axis": [
                1.0,
                0.0,
                0.0
              ],
              "joint_limits": null
            },
            {
              "name": "door",
              "joint_type": "revolute",
              "joint_axis": [
                0.999718,
                0.023758,
                -0.0
              ],
              "joint_limits": null
            },
            {
              "name": "detergent_drawer",
              "joint_type": "prismatic",
              "joint_axis": [
                1.0,
                0.0,
                0.0
              ],
              "joint_limits": null
            },
            {
              "name": "knob",
              "joint_type": "revolute",
              "joint_axis": [
                1.0,
                0.0,
                0.0
              ],
              "joint_limits": null
            }
          ],
          "has_operation_space": false
        }
      },
      "question": "Task: A laundry corner with a front-loading washing machine (door open) and a second appliance beside it.\nEvaluate only the `interaction_clearance` metric for `washer_open_0` with affordance `openable`.\nRelevant context: the surrounding scene.\nFirst infer the most likely operating side from door panels, handles, hinges, or the side that faces into the room. Then check only that side for a normal standing zone and immediate hand/door operating clearance. Do not assume a large hinged swing arc unless the render clearly shows hinged doors needing that arc. Do not require the entire front face to be empty; a nearby bench or seat off to one side is acceptable when the floor directly before the door/handle area remains usable. A narrow diagonal side gap or a squeeze-by path does not count as clear operating space.\nIf you choose `degraded` or `fail`, name the blocker or the blocked standing/opening zone directly in front of the operating side. If at least one practical front-facing or slightly offset standing position remains and can still reach the operating side normally, prefer `pass`. Do not fail an openable object merely because a nearby seat or small furniture item is offset near one part of the front; require evidence that the usable operating side is actually occupied or pinched. If the operating side cannot be identified from the evidence, return `unknown` instead of guessing.",
      "prompt_text": "You are an affordance-aware functional critic for 3D indoor scenes.\n\nCore principle: judge whether the task CAN be done in the current scene, without assuming it has already been pre-solved.\n\nWorkflow:\n1. Read the task instruction and target metric.\n2. Inspect the local check renders first and treat them as the primary evidence for the requested interaction.\n3. Local render order and intended use: 1. `local_operating_zone` is the clean RGB view for the most likely door-facing standing and opening zone. 2. `local_operating_zone_context` is a slightly wider highlighted context view of the same operating side. 3. `local_depth_probe` is an oblique RGB view meant to clarify depth and whether a blocker sits in front of the operating zone. 4. `local_plan_context` is a high local layout view used to check whether a nearby object actually spans or occupies the operating/approach zone rather than merely overlapping in perspective.\n4. Then inspect the 4 attached overview renders for room-scale layout and approach context. These overviews are captured from a slightly elevated height and are not meant to mimic adult eye level.\n5. Evaluate ONLY the requested metric and return a JSON object matching the schema.\n\nScene summary: scenesmith scene with 2 objects. Room type: laundry. Planned checks: 6. Room shell: 3.38m x 2.54m x 2.70m.\nTask instruction: A laundry corner with a front-loading washing machine (door open) and a second appliance beside it.\nMetric: interaction_clearance\nSubject object: washer_open_0\nTarget objects: none\n\nVerified asset facts:\n- subject `washer_open_0`: category `frontload washing machine`, affordances [openable, containable, drawable, graspable, turn], usable face `front`, benchmark relevance `functional`, confidence `0.80`, source `asset_annotation`\n- interaction facts: placement class `floor_furniture`, access type `none`, interaction height `none`, surface map `front: [open, access_contents, open, grasp]`\n- low-confidence candidates: `none`\n- articulation facts: 4 movable part(s): drum (revolute, axis [1.0, 0.0, 0.0], limits None); door (revolute, axis [0.999718, 0.023758, -0.0], limits None); detergent_drawer (prismatic, axis [1.0, 0.0, 0.0], limits None); knob (revolute, axis [1.0, 0.0, 0.0], limits None); no precomputed swept volume\nUse these as converter-side asset facts. Do not reclassify the subject; judge only whether the listed affordance remains usable in the current scene. If the image clearly contradicts these facts, return unknown and explain the conflict.\n\nScene evidence object hints:\n- subject `washer_open_0`: category `frontload washing machine`, group `unknown`, keywords [frontload washing machine], affordances [openable, containable, drawable, graspable, turn], task targets [table, desk, nightstand, coffee_table, shelf, cabinet]\n- targets: none\n\nAuxiliary scene cues (coarse geometry only; use these cues just to identify rough scale and nearby context):\n- subject `washer_open_0`: category `frontload washing machine`, room `laundry`, placement `floor`, footprint `medium`, height `mid`, elevation `raised`\nTarget cues:\n- none\nNearby same-room context objects that may affect access or clearance:\n- `appliance_neighbor_0`: category `frontload washing machine`, placement `floor`, proximity `mid`, bbox_relation `overlapping_or_touching`, footprint `medium`\nDo not estimate exact centimeter clearance from these coarse cues. They are only for object identity, rough scale, and coarse proximity; the local renders remain the deciding evidence.\n\nMetric-specific rule:\nTask: A laundry corner with a front-loading washing machine (door open) and a second appliance beside it.\nEvaluate only the `interaction_clearance` metric for `washer_open_0` with affordance `openable`.\nRelevant context: the surrounding scene.\nFirst infer the most likely operating side from door panels, handles, hinges, or the side that faces into the room. Then check only that side for a normal standing zone and immediate hand/door operating clearance. Do not assume a large hinged swing arc unless the render clearly shows hinged doors needing that arc. Do not require the entire front face to be empty; a nearby bench or seat off to one side is acceptable when the floor directly before the door/handle area remains usable. A narrow diagonal side gap or a squeeze-by path does not count as clear operating space.\nIf you choose `degraded` or `fail`, name the blocker or the blocked standing/opening zone directly in front of the operating side. If at least one practical front-facing or slightly offset standing position remains and can still reach the operating side normally, prefer `pass`. Do not fail an openable object merely because a nearby seat or small furniture item is offset near one part of the front; require evidence that the usable operating side is actually occupied or pinched. If the operating side cannot be identified from the evidence, return `unknown` instead of guessing.\n\nImage order is fixed: local check renders always come first, followed by the overview renders. If a local render is highlighted, the subject is red and the targets are green.\nEvidence guardrails:\n- Treat the local renders as the deciding evidence for direct blockage, operating-side clearance, and immediate approach space.\n- Use overview renders only to understand room-scale layout or to break ties when the local evidence is incomplete.\n- To output `degraded` or `fail`, the local evidence should explicitly show a directly constrained operating/approach zone, not just a nearby object or a single perspective overlap.\n- When a `local_plan_context` view is present, use it to verify whether the suspected blocker really spans the usable operating/approach zone; if it shows a normal nearby standing/reach position remains, prefer `pass`.\n- If the overview render suggests a blockage but the local evidence does not clearly show that blockage, prefer `pass` or `unknown`, not `degraded` or `fail`.\nOutput JSON with keys: check_id, metric, label, asset_fact_used, asset_fact_confidence, evidence_conflict, reason, blocking_objects, confidence.\nAllowed labels: pass, degraded, fail, unknown.\n2D perspective overlap alone is not enough evidence of a blocker.\nNormal adjacency priors should not override direct evidence in the local renders. Nightstands beside beds, benches touching bed ends, corner wardrobes, and wall decor are acceptable only when they do not directly intrude into the required functional region.\nIf you choose degraded or fail, the reason must name a direct blocker or directly constrained functional region.\nIf evidence is insufficient, use unknown instead of guessing.",
      "evidence": {
        "render_image": "render_bundle/checks/interaction_clearance__washer_open_0_local_operating_zone.png",
        "render_images": [
          "render_bundle/checks/interaction_clearance__washer_open_0_local_operating_zone.png",
          "render_bundle/checks/interaction_clearance__washer_open_0_local_operating_zone_context.png",
          "render_bundle/checks/interaction_clearance__washer_open_0_local_depth_probe.png",
          "render_bundle/checks/interaction_clearance__washer_open_0_local_plan_context.png"
        ],
        "render_image_roles": [
          "local_operating_zone",
          "local_operating_zone_context",
          "local_depth_probe",
          "local_plan_context"
        ]
      },
      "response_schema": {
        "type": "object",
        "required": [
          "check_id",
          "metric",
          "label",
          "reason",
          "blocking_objects",
          "confidence"
        ],
        "properties": {
          "check_id": {
            "type": "string"
          },
          "metric": {
            "enum": [
              "affordance_exposure",
              "interaction_clearance",
              "spatial_accessibility",
              "functional_dependency"
            ]
          },
          "label": {
            "enum": [
              "pass",
              "degraded",
              "fail",
              "unknown"
            ]
          },
          "asset_fact_used": {
            "type": "boolean"
          },
          "asset_fact_confidence": {
            "type": "number"
          },
          "evidence_conflict": {
            "type": "boolean"
          },
          "reason": {
            "type": "string"
          },
          "blocking_objects": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "confidence": {
            "type": "number"
          }
        }
      }
    },
    {
      "check_id": "spatial_accessibility__washer_open_0",
      "metric": "spatial_accessibility",
      "subject_id": "washer_open_0",
      "target_ids": [],
      "affordance": "openable",
      "asset_facts": {
        "category_norm": "frontload washing machine",
        "affordances": [
          "openable",
          "containable",
          "drawable",
          "graspable",
          "turn"
        ],
        "benchmark_relevance": "functional",
        "front_face": "front",
        "interaction_surface_map": {
          "front": [
            "open",
            "access_contents",
            "open",
            "grasp"
          ],
          "back": [],
          "left": [],
          "right": [],
          "top": []
        },
        "access_type": {},
        "placement_class": "floor_furniture",
        "interaction_height_m": {},
        "confidence": 0.8,
        "source": "asset_annotation",
        "low_confidence_candidates": {},
        "articulation": {
          "is_articulated": true,
          "movable_parts": [
            {
              "name": "drum",
              "joint_type": "revolute",
              "joint_axis": [
                1.0,
                0.0,
                0.0
              ],
              "joint_limits": null
            },
            {
              "name": "door",
              "joint_type": "revolute",
              "joint_axis": [
                0.999718,
                0.023758,
                -0.0
              ],
              "joint_limits": null
            },
            {
              "name": "detergent_drawer",
              "joint_type": "prismatic",
              "joint_axis": [
                1.0,
                0.0,
                0.0
              ],
              "joint_limits": null
            },
            {
              "name": "knob",
              "joint_type": "revolute",
              "joint_axis": [
                1.0,
                0.0,
                0.0
              ],
              "joint_limits": null
            }
          ],
          "has_operation_space": false
        }
      },
      "question": "Task: A laundry corner with a front-loading washing machine (door open) and a second appliance beside it.\nEvaluate only the `spatial_accessibility` metric for `washer_open_0` with affordance `openable`.\nRelevant context: the surrounding scene.\nCheck whether at least one practical front-facing or slightly offset standing position can reach the operating side so the object can be opened. A nearby bed corner or bench should not cause degraded by itself if a normal reach from the front region is still possible. Use degraded only when that front-region approach is directly pinched, occupied, or effectively unusable across the usable operating side. Do not count a cramped diagonal squeeze, shoulder-turned sidestep, or tiny side sliver as a valid approach path.\nIf you choose `degraded` or `fail`, name the blocker or the blocked standing/opening zone directly in front of the operating side. If at least one practical front-facing or slightly offset standing position remains and can still reach the operating side normally, prefer `pass`. Do not fail an openable object merely because a nearby seat or small furniture item is offset near one part of the front; require evidence that the usable operating side is actually occupied or pinched. If the operating side cannot be identified from the evidence, return `unknown` instead of guessing.",
      "prompt_text": "You are an affordance-aware functional critic for 3D indoor scenes.\n\nCore principle: judge whether the task CAN be done in the current scene, without assuming it has already been pre-solved.\n\nWorkflow:\n1. Read the task instruction and target metric.\n2. Inspect the local check renders first and treat them as the primary evidence for the requested interaction.\n3. Local render order and intended use: 1. `local_operating_zone` is the clean RGB view for the most likely door-facing standing and opening zone. 2. `local_operating_zone_context` is a slightly wider highlighted context view of the same operating side. 3. `local_depth_probe` is an oblique RGB view meant to clarify depth and whether a blocker sits in front of the operating zone. 4. `local_plan_context` is a high local layout view used to check whether a nearby object actually spans or occupies the operating/approach zone rather than merely overlapping in perspective.\n4. Then inspect the 4 attached overview renders for room-scale layout and approach context. These overviews are captured from a slightly elevated height and are not meant to mimic adult eye level.\n5. Evaluate ONLY the requested metric and return a JSON object matching the schema.\n\nScene summary: scenesmith scene with 2 objects. Room type: laundry. Planned checks: 6. Room shell: 3.38m x 2.54m x 2.70m.\nTask instruction: A laundry corner with a front-loading washing machine (door open) and a second appliance beside it.\nMetric: spatial_accessibility\nSubject object: washer_open_0\nTarget objects: none\n\nVerified asset facts:\n- subject `washer_open_0`: category `frontload washing machine`, affordances [openable, containable, drawable, graspable, turn], usable face `front`, benchmark relevance `functional`, confidence `0.80`, source `asset_annotation`\n- interaction facts: placement class `floor_furniture`, access type `none`, interaction height `none`, surface map `front: [open, access_contents, open, grasp]`\n- low-confidence candidates: `none`\n- articulation facts: 4 movable part(s): drum (revolute, axis [1.0, 0.0, 0.0], limits None); door (revolute, axis [0.999718, 0.023758, -0.0], limits None); detergent_drawer (prismatic, axis [1.0, 0.0, 0.0], limits None); knob (revolute, axis [1.0, 0.0, 0.0], limits None); no precomputed swept volume\nUse these as converter-side asset facts. Do not reclassify the subject; judge only whether the listed affordance remains usable in the current scene. If the image clearly contradicts these facts, return unknown and explain the conflict.\n\nScene evidence object hints:\n- subject `washer_open_0`: category `frontload washing machine`, group `unknown`, keywords [frontload washing machine], affordances [openable, containable, drawable, graspable, turn], task targets [table, desk, nightstand, coffee_table, shelf, cabinet]\n- targets: none\n\nAuxiliary scene cues (coarse geometry only; use these cues just to identify rough scale and nearby context):\n- subject `washer_open_0`: category `frontload washing machine`, room `laundry`, placement `floor`, footprint `medium`, height `mid`, elevation `raised`\nTarget cues:\n- none\nNearby same-room context objects that may affect access or clearance:\n- `appliance_neighbor_0`: category `frontload washing machine`, placement `floor`, proximity `mid`, bbox_relation `overlapping_or_touching`, footprint `medium`\nDo not estimate exact centimeter clearance from these coarse cues. They are only for object identity, rough scale, and coarse proximity; the local renders remain the deciding evidence.\n\nMetric-specific rule:\nTask: A laundry corner with a front-loading washing machine (door open) and a second appliance beside it.\nEvaluate only the `spatial_accessibility` metric for `washer_open_0` with affordance `openable`.\nRelevant context: the surrounding scene.\nCheck whether at least one practical front-facing or slightly offset standing position can reach the operating side so the object can be opened. A nearby bed corner or bench should not cause degraded by itself if a normal reach from the front region is still possible. Use degraded only when that front-region approach is directly pinched, occupied, or effectively unusable across the usable operating side. Do not count a cramped diagonal squeeze, shoulder-turned sidestep, or tiny side sliver as a valid approach path.\nIf you choose `degraded` or `fail`, name the blocker or the blocked standing/opening zone directly in front of the operating side. If at least one practical front-facing or slightly offset standing position remains and can still reach the operating side normally, prefer `pass`. Do not fail an openable object merely because a nearby seat or small furniture item is offset near one part of the front; require evidence that the usable operating side is actually occupied or pinched. If the operating side cannot be identified from the evidence, return `unknown` instead of guessing.\n\nImage order is fixed: local check renders always come first, followed by the overview renders. If a local render is highlighted, the subject is red and the targets are green.\nEvidence guardrails:\n- Treat the local renders as the deciding evidence for direct blockage, operating-side clearance, and immediate approach space.\n- Use overview renders only to understand room-scale layout or to break ties when the local evidence is incomplete.\n- To output `degraded` or `fail`, the local evidence should explicitly show a directly constrained operating/approach zone, not just a nearby object or a single perspective overlap.\n- When a `local_plan_context` view is present, use it to verify whether the suspected blocker really spans the usable operating/approach zone; if it shows a normal nearby standing/reach position remains, prefer `pass`.\n- If the overview render suggests a blockage but the local evidence does not clearly show that blockage, prefer `pass` or `unknown`, not `degraded` or `fail`.\nOutput JSON with keys: check_id, metric, label, asset_fact_used, asset_fact_confidence, evidence_conflict, reason, blocking_objects, confidence.\nAllowed labels: pass, degraded, fail, unknown.\n2D perspective overlap alone is not enough evidence of a blocker.\nNormal adjacency priors should not override direct evidence in the local renders. Nightstands beside beds, benches touching bed ends, corner wardrobes, and wall decor are acceptable only when they do not directly intrude into the required functional region.\nIf you choose degraded or fail, the reason must name a direct blocker or directly constrained functional region.\nIf evidence is insufficient, use unknown instead of guessing.",
      "evidence": {
        "render_image": "render_bundle/checks/spatial_accessibility__washer_open_0_local_operating_zone.png",
        "render_images": [
          "render_bundle/checks/spatial_accessibility__washer_open_0_local_operating_zone.png",
          "render_bundle/checks/spatial_accessibility__washer_open_0_local_operating_zone_context.png",
          "render_bundle/checks/spatial_accessibility__washer_open_0_local_depth_probe.png",
          "render_bundle/checks/spatial_accessibility__washer_open_0_local_plan_context.png"
        ],
        "render_image_roles": [
          "local_operating_zone",
          "local_operating_zone_context",
          "local_depth_probe",
          "local_plan_context"
        ]
      },
      "response_schema": {
        "type": "object",
        "required": [
          "check_id",
          "metric",
          "label",
          "reason",
          "blocking_objects",
          "confidence"
        ],
        "properties": {
          "check_id": {
            "type": "string"
          },
          "metric": {
            "enum": [
              "affordance_exposure",
              "interaction_clearance",
              "spatial_accessibility",
              "functional_dependency"
            ]
          },
          "label": {
            "enum": [
              "pass",
              "degraded",
              "fail",
              "unknown"
            ]
          },
          "asset_fact_used": {
            "type": "boolean"
          },
          "asset_fact_confidence": {
            "type": "number"
          },
          "evidence_conflict": {
            "type": "boolean"
          },
          "reason": {
            "type": "string"
          },
          "blocking_objects": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "confidence": {
            "type": "number"
          }
        }
      }
    },
    {
      "check_id": "articulation_clearance__washer_open_0",
      "metric": "articulation_clearance",
      "subject_id": "washer_open_0",
      "target_ids": [],
      "affordance": "openable",
      "asset_facts": {
        "category_norm": "frontload washing machine",
        "affordances": [
          "openable",
          "containable",
          "drawable",
          "graspable",
          "turn"
        ],
        "benchmark_relevance": "functional",
        "front_face": "front",
        "interaction_surface_map": {
          "front": [
            "open",
            "access_contents",
            "open",
            "grasp"
          ],
          "back": [],
          "left": [],
          "right": [],
          "top": []
        },
        "access_type": {},
        "placement_class": "floor_furniture",
        "interaction_height_m": {},
        "confidence": 0.8,
        "source": "asset_annotation",
        "low_confidence_candidates": {},
        "articulation": {
          "is_articulated": true,
          "movable_parts": [
            {
              "name": "drum",
              "joint_type": "revolute",
              "joint_axis": [
                1.0,
                0.0,
                0.0
              ],
              "joint_limits": null
            },
            {
              "name": "door",
              "joint_type": "revolute",
              "joint_axis": [
                0.999718,
                0.023758,
                -0.0
              ],
              "joint_limits": null
            },
            {
              "name": "detergent_drawer",
              "joint_type": "prismatic",
              "joint_axis": [
                1.0,
                0.0,
                0.0
              ],
              "joint_limits": null
            },
            {
              "name": "knob",
              "joint_type": "revolute",
              "joint_axis": [
                1.0,
                0.0,
                0.0
              ],
              "joint_limits": null
            }
          ],
          "has_operation_space": false
        }
      },
      "question": "Task: A laundry corner with a front-loading washing machine (door open) and a second appliance beside it.\nEvaluate only the `articulation_clearance` metric for `washer_open_0` with affordance `openable`.\nRelevant context: the surrounding scene.\nThe object is rendered in its OPEN state. Judge whether its moving part (door/lid/drawer) can complete its full actuation — the swing arc of a revolute hinge or the pull-out travel of a prismatic drawer — without colliding with a neighboring object or wall. Use the supplied joint asset_fact (joint type, axis, range, swept operation_space) to reason about the motion envelope and cross-check it against the open-state geometry.\nIf you choose `degraded` or `fail`, name the blocker or the blocked standing/opening zone directly in front of the operating side. If at least one practical front-facing or slightly offset standing position remains and can still reach the operating side normally, prefer `pass`. Do not fail an openable object merely because a nearby seat or small furniture item is offset near one part of the front; require evidence that the usable operating side is actually occupied or pinched. If the operating side cannot be identified from the evidence, return `unknown` instead of guessing.",
      "prompt_text": "You are an affordance-aware functional critic for 3D indoor scenes.\n\nCore principle: judge whether the task CAN be done in the current scene, without assuming it has already been pre-solved.\n\nWorkflow:\n1. Read the task instruction and target metric.\n2. Inspect the local check renders first and treat them as the primary evidence for the requested interaction.\n3. Local render order and intended use: 1. `local_operating_zone` is the clean RGB view for the most likely door-facing standing and opening zone. 2. `local_operating_zone_context` is a slightly wider highlighted context view of the same operating side. 3. `local_depth_probe` is an oblique RGB view meant to clarify depth and whether a blocker sits in front of the operating zone. 4. `local_plan_context` is a high local layout view used to check whether a nearby object actually spans or occupies the operating/approach zone rather than merely overlapping in perspective.\n4. Then inspect the 4 attached overview renders for room-scale layout and approach context. These overviews are captured from a slightly elevated height and are not meant to mimic adult eye level.\n5. Evaluate ONLY the requested metric and return a JSON object matching the schema.\n\nScene summary: scenesmith scene with 2 objects. Room type: laundry. Planned checks: 6. Room shell: 3.38m x 2.54m x 2.70m.\nTask instruction: A laundry corner with a front-loading washing machine (door open) and a second appliance beside it.\nMetric: articulation_clearance\nSubject object: washer_open_0\nTarget objects: none\n\nVerified asset facts:\n- subject `washer_open_0`: category `frontload washing machine`, affordances [openable, containable, drawable, graspable, turn], usable face `front`, benchmark relevance `functional`, confidence `0.80`, source `asset_annotation`\n- interaction facts: placement class `floor_furniture`, access type `none`, interaction height `none`, surface map `front: [open, access_contents, open, grasp]`\n- low-confidence candidates: `none`\n- articulation facts: 4 movable part(s): drum (revolute, axis [1.0, 0.0, 0.0], limits None); door (revolute, axis [0.999718, 0.023758, -0.0], limits None); detergent_drawer (prismatic, axis [1.0, 0.0, 0.0], limits None); knob (revolute, axis [1.0, 0.0, 0.0], limits None); no precomputed swept volume\nUse these as converter-side asset facts. Do not reclassify the subject; judge only whether the listed affordance remains usable in the current scene. If the image clearly contradicts these facts, return unknown and explain the conflict.\n\nScene evidence object hints:\n- subject `washer_open_0`: category `frontload washing machine`, group `unknown`, keywords [frontload washing machine], affordances [openable, containable, drawable, graspable, turn], task targets [table, desk, nightstand, coffee_table, shelf, cabinet]\n- targets: none\n\nAuxiliary scene cues (coarse geometry only; use these cues just to identify rough scale and nearby context):\n- subject `washer_open_0`: category `frontload washing machine`, room `laundry`, placement `floor`, footprint `medium`, height `mid`, elevation `raised`\nTarget cues:\n- none\nNearby same-room context objects that may affect access or clearance:\n- `appliance_neighbor_0`: category `frontload washing machine`, placement `floor`, proximity `mid`, bbox_relation `overlapping_or_touching`, footprint `medium`\nDo not estimate exact centimeter clearance from these coarse cues. They are only for object identity, rough scale, and coarse proximity; the local renders remain the deciding evidence.\n\nMetric-specific rule:\nTask: A laundry corner with a front-loading washing machine (door open) and a second appliance beside it.\nEvaluate only the `articulation_clearance` metric for `washer_open_0` with affordance `openable`.\nRelevant context: the surrounding scene.\nThe object is rendered in its OPEN state. Judge whether its moving part (door/lid/drawer) can complete its full actuation — the swing arc of a revolute hinge or the pull-out travel of a prismatic drawer — without colliding with a neighboring object or wall. Use the supplied joint asset_fact (joint type, axis, range, swept operation_space) to reason about the motion envelope and cross-check it against the open-state geometry.\nIf you choose `degraded` or `fail`, name the blocker or the blocked standing/opening zone directly in front of the operating side. If at least one practical front-facing or slightly offset standing position remains and can still reach the operating side normally, prefer `pass`. Do not fail an openable object merely because a nearby seat or small furniture item is offset near one part of the front; require evidence that the usable operating side is actually occupied or pinched. If the operating side cannot be identified from the evidence, return `unknown` instead of guessing.\n\nImage order is fixed: local check renders always come first, followed by the overview renders. If a local render is highlighted, the subject is red and the targets are green.\nEvidence guardrails:\n- Treat the local renders as the deciding evidence for direct blockage, operating-side clearance, and immediate approach space.\n- Use overview renders only to understand room-scale layout or to break ties when the local evidence is incomplete.\n- To output `degraded` or `fail`, the local evidence should explicitly show a directly constrained operating/approach zone, not just a nearby object or a single perspective overlap.\n- When a `local_plan_context` view is present, use it to verify whether the suspected blocker really spans the usable operating/approach zone; if it shows a normal nearby standing/reach position remains, prefer `pass`.\n- If the overview render suggests a blockage but the local evidence does not clearly show that blockage, prefer `pass` or `unknown`, not `degraded` or `fail`.\nOutput JSON with keys: check_id, metric, label, asset_fact_used, asset_fact_confidence, evidence_conflict, reason, blocking_objects, confidence.\nAllowed labels: pass, degraded, fail, unknown.\n2D perspective overlap alone is not enough evidence of a blocker.\nNormal adjacency priors should not override direct evidence in the local renders. Nightstands beside beds, benches touching bed ends, corner wardrobes, and wall decor are acceptable only when they do not directly intrude into the required functional region.\nIf you choose degraded or fail, the reason must name a direct blocker or directly constrained functional region.\nIf evidence is insufficient, use unknown instead of guessing.",
      "evidence": {
        "render_image": "render_bundle/checks/articulation_clearance__washer_open_0_local_operating_zone.png",
        "render_images": [
          "render_bundle/checks/articulation_clearance__washer_open_0_local_operating_zone.png",
          "render_bundle/checks/articulation_clearance__washer_open_0_local_operating_zone_context.png",
          "render_bundle/checks/articulation_clearance__washer_open_0_local_depth_probe.png",
          "render_bundle/checks/articulation_clearance__washer_open_0_local_plan_context.png"
        ],
        "render_image_roles": [
          "local_operating_zone",
          "local_operating_zone_context",
          "local_depth_probe",
          "local_plan_context"
        ]
      },
      "response_schema": {
        "type": "object",
        "required": [
          "check_id",
          "metric",
          "label",
          "reason",
          "blocking_objects",
          "confidence"
        ],
        "properties": {
          "check_id": {
            "type": "string"
          },
          "metric": {
            "enum": [
              "affordance_exposure",
              "interaction_clearance",
              "spatial_accessibility",
              "functional_dependency"
            ]
          },
          "label": {
            "enum": [
              "pass",
              "degraded",
              "fail",
              "unknown"
            ]
          },
          "asset_fact_used": {
            "type": "boolean"
          },
          "asset_fact_confidence": {
            "type": "number"
          },
          "evidence_conflict": {
            "type": "boolean"
          },
          "reason": {
            "type": "string"
          },
          "blocking_objects": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "confidence": {
            "type": "number"
          }
        }
      }
    },
    {
      "check_id": "articulation_clearance__appliance_neighbor_0",
      "metric": "articulation_clearance",
      "subject_id": "appliance_neighbor_0",
      "target_ids": [],
      "affordance": "openable",
      "asset_facts": {
        "category_norm": "frontload washing machine",
        "affordances": [
          "openable",
          "containable",
          "drawable",
          "graspable",
          "turn"
        ],
        "benchmark_relevance": "functional",
        "front_face": "front",
        "interaction_surface_map": {
          "front": [
            "open",
            "access_contents",
            "open",
            "grasp"
          ],
          "back": [],
          "left": [],
          "right": [],
          "top": []
        },
        "access_type": {},
        "placement_class": "floor_furniture",
        "interaction_height_m": {},
        "confidence": 0.8,
        "source": "asset_annotation",
        "low_confidence_candidates": {},
        "articulation": {
          "is_articulated": true,
          "movable_parts": [
            {
              "name": "drum",
              "joint_type": "revolute",
              "joint_axis": [
                1.0,
                0.0,
                0.0
              ],
              "joint_limits": null
            },
            {
              "name": "door",
              "joint_type": "revolute",
              "joint_axis": [
                0.999718,
                0.023758,
                -0.0
              ],
              "joint_limits": null
            },
            {
              "name": "detergent_drawer",
              "joint_type": "prismatic",
              "joint_axis": [
                1.0,
                0.0,
                0.0
              ],
              "joint_limits": null
            },
            {
              "name": "knob",
              "joint_type": "revolute",
              "joint_axis": [
                1.0,
                0.0,
                0.0
              ],
              "joint_limits": null
            }
          ],
          "has_operation_space": false
        }
      },
      "question": "Task: A laundry corner with a front-loading washing machine (door open) and a second appliance beside it.\nEvaluate only the `articulation_clearance` metric for `appliance_neighbor_0` with affordance `openable`.\nRelevant context: the surrounding scene.\nThe object is rendered in its OPEN state. Judge whether its moving part (door/lid/drawer) can complete its full actuation — the swing arc of a revolute hinge or the pull-out travel of a prismatic drawer — without colliding with a neighboring object or wall. Use the supplied joint asset_fact (joint type, axis, range, swept operation_space) to reason about the motion envelope and cross-check it against the open-state geometry.\nIf you choose `degraded` or `fail`, name the blocker or the blocked standing/opening zone directly in front of the operating side. If at least one practical front-facing or slightly offset standing position remains and can still reach the operating side normally, prefer `pass`. Do not fail an openable object merely because a nearby seat or small furniture item is offset near one part of the front; require evidence that the usable operating side is actually occupied or pinched. If the operating side cannot be identified from the evidence, return `unknown` instead of guessing.",
      "prompt_text": "You are an affordance-aware functional critic for 3D indoor scenes.\n\nCore principle: judge whether the task CAN be done in the current scene, without assuming it has already been pre-solved.\n\nWorkflow:\n1. Read the task instruction and target metric.\n2. Inspect the local check renders first and treat them as the primary evidence for the requested interaction.\n3. Local render order and intended use: 1. `local_operating_zone` is the clean RGB view for the most likely door-facing standing and opening zone. 2. `local_operating_zone_context` is a slightly wider highlighted context view of the same operating side. 3. `local_depth_probe` is an oblique RGB view meant to clarify depth and whether a blocker sits in front of the operating zone. 4. `local_plan_context` is a high local layout view used to check whether a nearby object actually spans or occupies the operating/approach zone rather than merely overlapping in perspective.\n4. Then inspect the 4 attached overview renders for room-scale layout and approach context. These overviews are captured from a slightly elevated height and are not meant to mimic adult eye level.\n5. Evaluate ONLY the requested metric and return a JSON object matching the schema.\n\nScene summary: scenesmith scene with 2 objects. Room type: laundry. Planned checks: 6. Room shell: 3.38m x 2.54m x 2.70m.\nTask instruction: A laundry corner with a front-loading washing machine (door open) and a second appliance beside it.\nMetric: articulation_clearance\nSubject object: appliance_neighbor_0\nTarget objects: none\n\nVerified asset facts:\n- subject `appliance_neighbor_0`: category `frontload washing machine`, affordances [openable, containable, drawable, graspable, turn], usable face `front`, benchmark relevance `functional`, confidence `0.80`, source `asset_annotation`\n- interaction facts: placement class `floor_furniture`, access type `none`, interaction height `none`, surface map `front: [open, access_contents, open, grasp]`\n- low-confidence candidates: `none`\n- articulation facts: 4 movable part(s): drum (revolute, axis [1.0, 0.0, 0.0], limits None); door (revolute, axis [0.999718, 0.023758, -0.0], limits None); detergent_drawer (prismatic, axis [1.0, 0.0, 0.0], limits None); knob (revolute, axis [1.0, 0.0, 0.0], limits None); no precomputed swept volume\nUse these as converter-side asset facts. Do not reclassify the subject; judge only whether the listed affordance remains usable in the current scene. If the image clearly contradicts these facts, return unknown and explain the conflict.\n\nScene evidence object hints:\n- subject `appliance_neighbor_0`: category `frontload washing machine`, group `unknown`, keywords [frontload washing machine], affordances [openable, containable, drawable, graspable, turn], task targets [table, desk, nightstand, coffee_table, shelf, cabinet]\n- targets: none\n\nAuxiliary scene cues (coarse geometry only; use these cues just to identify rough scale and nearby context):\n- subject `appliance_neighbor_0`: category `frontload washing machine`, room `laundry`, placement `floor`, footprint `medium`, height `mid`, elevation `raised`\nTarget cues:\n- none\nNearby same-room context objects that may affect access or clearance:\n- `washer_open_0`: category `frontload washing machine`, placement `floor`, proximity `mid`, bbox_relation `overlapping_or_touching`, footprint `medium`\nDo not estimate exact centimeter clearance from these coarse cues. They are only for object identity, rough scale, and coarse proximity; the local renders remain the deciding evidence.\n\nMetric-specific rule:\nTask: A laundry corner with a front-loading washing machine (door open) and a second appliance beside it.\nEvaluate only the `articulation_clearance` metric for `appliance_neighbor_0` with affordance `openable`.\nRelevant context: the surrounding scene.\nThe object is rendered in its OPEN state. Judge whether its moving part (door/lid/drawer) can complete its full actuation — the swing arc of a revolute hinge or the pull-out travel of a prismatic drawer — without colliding with a neighboring object or wall. Use the supplied joint asset_fact (joint type, axis, range, swept operation_space) to reason about the motion envelope and cross-check it against the open-state geometry.\nIf you choose `degraded` or `fail`, name the blocker or the blocked standing/opening zone directly in front of the operating side. If at least one practical front-facing or slightly offset standing position remains and can still reach the operating side normally, prefer `pass`. Do not fail an openable object merely because a nearby seat or small furniture item is offset near one part of the front; require evidence that the usable operating side is actually occupied or pinched. If the operating side cannot be identified from the evidence, return `unknown` instead of guessing.\n\nImage order is fixed: local check renders always come first, followed by the overview renders. If a local render is highlighted, the subject is red and the targets are green.\nEvidence guardrails:\n- Treat the local renders as the deciding evidence for direct blockage, operating-side clearance, and immediate approach space.\n- Use overview renders only to understand room-scale layout or to break ties when the local evidence is incomplete.\n- To output `degraded` or `fail`, the local evidence should explicitly show a directly constrained operating/approach zone, not just a nearby object or a single perspective overlap.\n- When a `local_plan_context` view is present, use it to verify whether the suspected blocker really spans the usable operating/approach zone; if it shows a normal nearby standing/reach position remains, prefer `pass`.\n- If the overview render suggests a blockage but the local evidence does not clearly show that blockage, prefer `pass` or `unknown`, not `degraded` or `fail`.\nOutput JSON with keys: check_id, metric, label, asset_fact_used, asset_fact_confidence, evidence_conflict, reason, blocking_objects, confidence.\nAllowed labels: pass, degraded, fail, unknown.\n2D perspective overlap alone is not enough evidence of a blocker.\nNormal adjacency priors should not override direct evidence in the local renders. Nightstands beside beds, benches touching bed ends, corner wardrobes, and wall decor are acceptable only when they do not directly intrude into the required functional region.\nIf you choose degraded or fail, the reason must name a direct blocker or directly constrained functional region.\nIf evidence is insufficient, use unknown instead of guessing.",
      "evidence": {
        "render_image": "render_bundle/checks/articulation_clearance__appliance_neighbor_0_local_operating_zone.png",
        "render_images": [
          "render_bundle/checks/articulation_clearance__appliance_neighbor_0_local_operating_zone.png",
          "render_bundle/checks/articulation_clearance__appliance_neighbor_0_local_operating_zone_context.png",
          "render_bundle/checks/articulation_clearance__appliance_neighbor_0_local_depth_probe.png",
          "render_bundle/checks/articulation_clearance__appliance_neighbor_0_local_plan_context.png"
        ],
        "render_image_roles": [
          "local_operating_zone",
          "local_operating_zone_context",
          "local_depth_probe",
          "local_plan_context"
        ]
      },
      "response_schema": {
        "type": "object",
        "required": [
          "check_id",
          "metric",
          "label",
          "reason",
          "blocking_objects",
          "confidence"
        ],
        "properties": {
          "check_id": {
            "type": "string"
          },
          "metric": {
            "enum": [
              "affordance_exposure",
              "interaction_clearance",
              "spatial_accessibility",
              "functional_dependency"
            ]
          },
          "label": {
            "enum": [
              "pass",
              "degraded",
              "fail",
              "unknown"
            ]
          },
          "asset_fact_used": {
            "type": "boolean"
          },
          "asset_fact_confidence": {
            "type": "number"
          },
          "evidence_conflict": {
            "type": "boolean"
          },
          "reason": {
            "type": "string"
          },
          "blocking_objects": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "confidence": {
            "type": "number"
          }
        }
      }
    }
  ]
}