{
  "generated_utc": "2026-05-27T09:14:56.072660+00:00",
  "title": "PAct Official · GT vs PAct",
  "source_page": "experiments/pact-official-failure-modes-20260525/index.html",
  "data_contract": {
    "source_gt": "benchmark_100_manifest.json geometry_stats, parsed from raw/source SDF",
    "raw_gt": "assets/<sample>/3d/gt/object.json rebuilt from source-faithful SDF plus raw mobility_v2 axes when available",
    "pact_output": "assets/<sample>/3d/pact/object.json copied from exported PAct articulated object"
  },
  "failure_classes": [
    {
      "id": "joint_binding",
      "title": "A. Part count correct, joint semantics wrong",
      "short": "part 对了，运动学绑定错",
      "samples": [
        "p1_complex",
        "p5_jointparams",
        "p8_simpleregr",
        "p9_texture"
      ],
      "criterion": "part MAE≈0，但 joint F1 低、axis=90 或 joint type 被替换。",
      "takeaway": "PAct 能重建外形/part 数，但从 part 到 joint type、axis、range 的绑定不稳定。"
    },
    {
      "id": "recall_cardinality",
      "title": "B. Hidden or dense movable recall failure",
      "short": "遮挡/密集小件被漏或合并",
      "samples": [
        "p3_occlusion",
        "p7_topology"
      ],
      "criterion": "movable 数减少，joint MAE 上升；视觉上内部件或按钮簇缺失。",
      "takeaway": "单视角下看不见的内部 movable 和拥挤小 part 是主要 recall 风险。"
    },
    {
      "id": "thin_cross_source",
      "title": "C. Thin structure / cross-source articulation failure",
      "short": "薄结构跨域失败",
      "samples": [
        "p4_smallparts"
      ],
      "criterion": "薄片结构，scale consistency 很低，axis=90，F1=0。",
      "takeaway": "剪刀类薄结构既考验 part mask，也考验对非 PM 数据的 articulation 先验。"
    },
    {
      "id": "ood_scale",
      "title": "D. OOD scale-correspondence issue",
      "short": "轴向基本对，但尺度/对应不稳",
      "samples": [
        "p2_ood"
      ],
      "criterion": "count/type/axis 基本可用，但 joint F1 和 scale consistency 偏低。",
      "takeaway": "跨源窗户不是纯失败，更像几何尺度与 part correspondence 没对齐。"
    },
    {
      "id": "positive_control",
      "title": "E. Positive control",
      "short": "清晰单轴正例",
      "samples": [
        "p6_mask"
      ],
      "criterion": "F1=1，type acc=1，axis=0。",
      "takeaway": "清晰单一 revolute、mask/part 简单时，PAct 可以给出可信运动学。"
    }
  ],
  "samples": [
    {
      "order": 1,
      "phen": "p1_complex",
      "diagnosis": {
        "primary_class": "joint_binding",
        "secondary": "many-part prismatic collapse",
        "visual": "PAct 右侧保留了大量零件，但开合后出现许多门/旋钮式转动；Raw GT 是一组密集 prismatic 滑动件。",
        "metric": "part MAE=0，joint MAE=8，joint F1=0.077，type acc=0.233；30 个 GT prismatic 只保住 7 个 prismatic。",
        "implication": "需要把 joint decoding 从独立 part 属性改成 part graph 上的结构化约束。"
      },
      "benchmark_index": 73,
      "label": "复杂物体 / high part count",
      "sample_id": "PartNetMobility/electronics/3811",
      "source_dataset": "PartNetMobility",
      "category": "electronics",
      "problem_tags": [
        "hard_motion",
        "known_quality_or_conversion_issue",
        "many_parts",
        "part_decomposition",
        "prismatic_motion",
        "single_view_conditioning"
      ],
      "source_gt": {
        "links": 33,
        "joints_all": 32,
        "movable_joints": 30,
        "fixed_joints": 2,
        "joint_types": {
          "fixed": 2,
          "prismatic": 30,
          "revolute": 0
        },
        "gt_sdf": "/data/share/ud4scenesmith/scenesmith_unified_articulated_v0.4_sourcefaithful_scenesmith_format_20260507/artvip_sdf/electronics/3811/3811.sdf",
        "quality_status": "included_with_known_issues",
        "quality_flags": [
          "pm_not_visual_qc_approved",
          "pm_qc:long_prismatic_limit:0.890m",
          "pm_qc:many_movable_joints:30",
          "pm_qc:broken_texture_ref:27"
        ]
      },
      "pact_ref_gt": {
        "path": "/data/250010098/visual_portal_local/runs/visual_portal/experiments/pact-official-gt-vs-pact-20260526/assets/p1_complex/3d/gt/object.json",
        "parts": 31,
        "joints_all": 30,
        "movable_joints": 30,
        "fixed_joints": 1,
        "roots": [
          30
        ],
        "joint_types": {
          "fixed": 1,
          "prismatic": 30
        },
        "top_movable_joints": [
          {
            "id": 24,
            "name": "link_24",
            "source_link_name": "link_24",
            "parent": 30,
            "type": "prismatic",
            "range": [
              0.0,
              0.89
            ],
            "open_value": 0.89,
            "axis_direction": [
              -1.0,
              3.205103454691839e-09,
              -3.205103454691839e-09
            ],
            "axis_origin": [
              0.0,
              0.0,
              0.0
            ]
          },
          {
            "id": 25,
            "name": "drawer",
            "source_link_name": "link_25",
            "parent": 30,
            "type": "prismatic",
            "range": [
              0.0,
              0.89
            ],
            "open_value": 0.89,
            "axis_direction": [
              -1.0,
              3.205103454691839e-09,
              -3.205103454691839e-09
            ],
            "axis_origin": [
              -0.48358599770941907,
              -0.001371623505434538,
              -0.716038481569477
            ]
          },
          {
            "id": 26,
            "name": "drawer",
            "source_link_name": "link_26",
            "parent": 30,
            "type": "prismatic",
            "range": [
              0.0,
              0.89
            ],
            "open_value": 0.89,
            "axis_direction": [
              -1.0,
              3.205103454691839e-09,
              -3.205103454691839e-09
            ],
            "axis_origin": [
              -0.48358599770941907,
              -0.001371623505434538,
              -0.716038481569477
            ]
          },
          {
            "id": 27,
            "name": "drawer",
            "source_link_name": "link_27",
            "parent": 30,
            "type": "prismatic",
            "range": [
              0.0,
              0.89
            ],
            "open_value": 0.89,
            "axis_direction": [
              -1.0,
              3.205103454691839e-09,
              -3.205103454691839e-09
            ],
            "axis_origin": [
              -0.48358599770941907,
              -0.001371623505434538,
              -0.716038481569477
            ]
          },
          {
            "id": 28,
            "name": "drawer",
            "source_link_name": "link_28",
            "parent": 30,
            "type": "prismatic",
            "range": [
              0.0,
              0.89
            ],
            "open_value": 0.89,
            "axis_direction": [
              -1.0,
              3.205103454691839e-09,
              -3.205103454691839e-09
            ],
            "axis_origin": [
              -0.48358599770941907,
              -0.001371623505434538,
              -0.716038481569477
            ]
          },
          {
            "id": 29,
            "name": "drawer",
            "source_link_name": "link_29",
            "parent": 30,
            "type": "prismatic",
            "range": [
              0.0,
              0.6
            ],
            "open_value": 0.6,
            "axis_direction": [
              -1.0,
              3.205103454691839e-09,
              -3.205103454691839e-09
            ],
            "axis_origin": [
              -0.48358599770941907,
              -0.001371623505434538,
              -0.716038481569477
            ]
          }
        ]
      },
      "pact_output": {
        "path": "/data/250010098/visual_portal_local/runs/visual_portal/experiments/pact-official-gt-vs-pact-20260526/assets/p1_complex/3d/pact/object.json",
        "parts": 31,
        "joints_all": 30,
        "movable_joints": 25,
        "fixed_joints": 6,
        "roots": [
          0
        ],
        "joint_types": {
          "continuous": 3,
          "fixed": 6,
          "prismatic": 7,
          "revolute": 12,
          "screw": 3
        },
        "top_movable_joints": [
          {
            "id": 6,
            "name": "knob",
            "source_link_name": null,
            "parent": 0,
            "type": "continuous",
            "range": [
              0.0,
              360.0
            ],
            "open_value": 6.283185307179586,
            "axis_direction": [
              0.009393944405019283,
              -0.032350070774555206,
              -0.9994325041770935
            ],
            "axis_origin": [
              0.1666106879711151,
              -0.018936609849333763,
              0.0021789632737636566
            ]
          },
          {
            "id": 8,
            "name": "knob",
            "source_link_name": null,
            "parent": 0,
            "type": "continuous",
            "range": [
              0.0,
              360.0
            ],
            "open_value": 6.283185307179586,
            "axis_direction": [
              -0.009773274883627892,
              -0.039687834680080414,
              -0.999164342880249
            ],
            "axis_origin": [
              0.1445709466934204,
              0.07343707978725433,
              -0.004331111907958984
            ]
          },
          {
            "id": 30,
            "name": "knob",
            "source_link_name": null,
            "parent": 0,
            "type": "continuous",
            "range": [
              0.0,
              360.0
            ],
            "open_value": 6.283185307179586,
            "axis_direction": [
              0.009899872355163097,
              -0.007609944324940443,
              -0.9999220967292786
            ],
            "axis_origin": [
              0.04718233644962311,
              0.362501859664917,
              -0.0022917166352272034
            ]
          },
          {
            "id": 17,
            "name": "door",
            "source_link_name": null,
            "parent": 0,
            "type": "revolute",
            "range": [
              0.0,
              106.49517059326172
            ],
            "open_value": 1.85869136432546,
            "axis_direction": [
              0.0,
              1.0,
              0.0
            ],
            "axis_origin": [
              0.4898851811885834,
              0.30485671758651733,
              0.27560997009277344
            ]
          },
          {
            "id": 13,
            "name": "door",
            "source_link_name": null,
            "parent": 0,
            "type": "revolute",
            "range": [
              0.0,
              -87.6358413696289
            ],
            "open_value": -1.5295339746554812,
            "axis_direction": [
              0.0,
              1.0,
              0.0
            ],
            "axis_origin": [
              -0.4880361557006836,
              0.15685440599918365,
              0.34949201345443726
            ]
          },
          {
            "id": 12,
            "name": "door",
            "source_link_name": null,
            "parent": 0,
            "type": "revolute",
            "range": [
              0.0,
              -85.61234283447266
            ],
            "open_value": -1.4942172628077224,
            "axis_direction": [
              0.0,
              1.0,
              0.0
            ],
            "axis_origin": [
              -0.4886437654495239,
              0.21098102629184723,
              0.3445463180541992
            ]
          }
        ]
      },
      "metrics": {
        "weighted_score": 44.3,
        "part_count_mae": 0,
        "joint_count_mae": 8,
        "joint_f1": 0.07692307692307691,
        "joint_type_accuracy": 0.23333333333333334,
        "axis_angular_error_deg": 24.167267844400783,
        "origin_distance_error": 0.0,
        "kinematic_tree_validity": 1,
        "scale_consistency": 0.6006018107154049
      },
      "extra": {},
      "state_images": {
        "input": "assets/p1_complex/input_rgb.png",
        "gt": {
          "closed": "assets/p1_complex/gt_closed.png",
          "mid": "assets/p1_complex/gt_mid.png",
          "open": "assets/p1_complex/gt_open.png"
        },
        "pact": {
          "closed": "assets/p1_complex/pact_closed.png",
          "mid": "assets/p1_complex/pact_mid.png",
          "open": "assets/p1_complex/pact_open.png"
        }
      },
      "state_meta": {
        "gt": {
          "label": "gt",
          "open_value": 0.89,
          "joint_type": "prismatic",
          "frames": {
            "closed": {
              "t": 0.0,
              "caption": "d=+0.00m"
            },
            "mid": {
              "t": 0.5,
              "caption": "d=+0.45m"
            },
            "open": {
              "t": 1.0,
              "caption": "d=+0.89m"
            }
          }
        },
        "pact": {
          "label": "pact",
          "open_value": 6.283185307179586,
          "joint_type": "continuous",
          "frames": {
            "closed": {
              "t": 0.0,
              "caption": "θ=0°"
            },
            "mid": {
              "t": 0.5,
              "caption": "θ=180°"
            },
            "open": {
              "t": 1.0,
              "caption": "θ=360°"
            }
          }
        }
      },
      "state_render": {
        "gt_frame_md5": {
          "closed": "e2b49d39ad76fd9cdab67e868ca5cbe8",
          "mid": "7519e468845e36625fa95c92f2c4f5ea",
          "open": "2838160e3aa0b4f9579f5daa11b6af3a"
        },
        "gt_frames_identical": false,
        "pact_frame_md5": {
          "closed": "988a1717cae9440a97f1063582873b8d",
          "mid": "1ae66ec7e4458fa7c1a128d036923d5c",
          "open": "ccc8c076115afa9a7166a1fb3291143c"
        },
        "pact_frames_identical": false
      },
      "warnings": [
        "Source GT links=33 与 Raw GT viewer parts=31 不同；viewer 使用有可视 mesh 的 source-faithful part 口径。",
        "movable joint 数不同：Raw GT=30，PAct=25。",
        "joint type 分布不同：Raw GT=fixed:1, prismatic:30；PAct=continuous:3, fixed:6, prismatic:7, revolute:12, screw:3。"
      ]
    },
    {
      "order": 2,
      "phen": "p2_ood",
      "diagnosis": {
        "primary_class": "ood_scale",
        "secondary": "partial success",
        "visual": "窗户的关节方向基本合理，但 PAct 的尺寸、面板对应和打开幅度仍与 Raw GT 不一致。",
        "metric": "part/joint count 都对，type acc=1，axis=2.3°；但 joint F1=0.333，scale=0.437。",
        "implication": "OOD 源数据需要尺度归一、part correspondence 或渲染一致性约束，而不是只看轴角。"
      },
      "benchmark_index": 19,
      "label": "OOD / GRScenes window",
      "sample_id": "GRScenes/architectural_fixtures/grscenes_window_836a30a6ddbf_ef632e",
      "source_dataset": "GRScenes",
      "category": "architectural_fixtures",
      "problem_tags": [
        "cross_source_domain_gap",
        "hard_motion",
        "many_parts",
        "non_pm_generalization",
        "part_decomposition",
        "revolute_motion",
        "single_view_conditioning"
      ],
      "source_gt": {
        "links": 5,
        "joints_all": 4,
        "movable_joints": 3,
        "fixed_joints": 1,
        "joint_types": {
          "fixed": 1,
          "prismatic": 0,
          "revolute": 3
        },
        "gt_sdf": "/data/share/ud4scenesmith/scenesmith_unified_articulated_v0.4_sourcefaithful_scenesmith_format_20260507/artvip_sdf/architectural_fixtures/grscenes_window_836a30a6ddbf_ef632e/grscenes_window_836a30a6ddbf_ef632e.sdf",
        "quality_status": null,
        "quality_flags": []
      },
      "pact_ref_gt": {
        "path": "/data/250010098/visual_portal_local/runs/visual_portal/experiments/pact-official-gt-vs-pact-20260526/assets/p2_ood/3d/gt/object.json",
        "parts": 4,
        "joints_all": 3,
        "movable_joints": 3,
        "fixed_joints": 1,
        "roots": [
          1
        ],
        "joint_types": {
          "fixed": 1,
          "revolute": 3
        },
        "top_movable_joints": [
          {
            "id": 0,
            "name": "group_4115236e_dc8c_4cba",
            "source_link_name": "Group_4115236e_dc8c_4cba_a6f3_6004b33e833e",
            "parent": 1,
            "type": "revolute",
            "range": [
              0.0,
              1.5707964599529511
            ],
            "open_value": 1.5707964599529511,
            "axis_direction": [
              0.0,
              -1.0469183919022027e-16,
              1.0
            ],
            "axis_origin": [
              -0.347638311,
              -0.020000000259636504,
              -0.802500012264102
            ]
          },
          {
            "id": 2,
            "name": "group_b351fc1a_6aaf_463c",
            "source_link_name": "Group_b351fc1a_6aaf_463c_bb31_37fc5441fc8e",
            "parent": 1,
            "type": "revolute",
            "range": [
              0.0,
              1.5707964599529511
            ],
            "open_value": 1.5707964599529511,
            "axis_direction": [
              0.0,
              -1.0469183919022027e-16,
              1.0
            ],
            "axis_origin": [
              -1.08791518,
              -0.020000000259636504,
              -0.802500012264102
            ]
          },
          {
            "id": 3,
            "name": "group_bacc9198_80c9_4c2e",
            "source_link_name": "Group_bacc9198_80c9_4c2e_a52e_f2297b305315",
            "parent": 1,
            "type": "revolute",
            "range": [
              0.0,
              1.5707964599529511
            ],
            "open_value": 1.5707964599529511,
            "axis_direction": [
              0.0,
              1.0469183919022027e-16,
              -1.0
            ],
            "axis_origin": [
              1.04291542,
              -0.020000000340363495,
              0.907500013735898
            ]
          }
        ]
      },
      "pact_output": {
        "path": "/data/250010098/visual_portal_local/runs/visual_portal/experiments/pact-official-gt-vs-pact-20260526/assets/p2_ood/3d/pact/object.json",
        "parts": 4,
        "joints_all": 3,
        "movable_joints": 3,
        "fixed_joints": 1,
        "roots": [
          0
        ],
        "joint_types": {
          "continuous": 1,
          "fixed": 1,
          "revolute": 2
        },
        "top_movable_joints": [
          {
            "id": 3,
            "name": "knob",
            "source_link_name": null,
            "parent": 0,
            "type": "continuous",
            "range": [
              0.0,
              360.0
            ],
            "open_value": 6.283185307179586,
            "axis_direction": [
              -0.012904850766062737,
              0.03773631900548935,
              -0.9992043375968933
            ],
            "axis_origin": [
              0.053937267512083054,
              0.248053178191185,
              0.008671466261148453
            ]
          },
          {
            "id": 2,
            "name": "door",
            "source_link_name": null,
            "parent": 0,
            "type": "revolute",
            "range": [
              0.0,
              84.69139862060547
            ],
            "open_value": 1.4781437540485494,
            "axis_direction": [
              0.0,
              1.0,
              0.0
            ],
            "axis_origin": [
              0.5003888607025146,
              0.1528828740119934,
              0.3179260194301605
            ]
          },
          {
            "id": 1,
            "name": "door",
            "source_link_name": null,
            "parent": 0,
            "type": "revolute",
            "range": [
              0.0,
              -71.38900756835938
            ],
            "open_value": -1.245973231799022,
            "axis_direction": [
              0.0,
              1.0,
              0.0
            ],
            "axis_origin": [
              -0.5005441308021545,
              0.15414613485336304,
              0.31843507289886475
            ]
          }
        ]
      },
      "metrics": {
        "weighted_score": 52.52,
        "part_count_mae": 0,
        "joint_count_mae": 0,
        "joint_f1": 0.3333333333333333,
        "joint_type_accuracy": 1.0,
        "axis_angular_error_deg": 2.285670165064537,
        "origin_distance_error": 0.9894664601924016,
        "kinematic_tree_validity": 1,
        "scale_consistency": 0.43743401254559894
      },
      "extra": {},
      "state_images": {
        "input": "assets/p2_ood/input_rgb.png",
        "gt": {
          "closed": "assets/p2_ood/gt_closed.png",
          "mid": "assets/p2_ood/gt_mid.png",
          "open": "assets/p2_ood/gt_open.png"
        },
        "pact": {
          "closed": "assets/p2_ood/pact_closed.png",
          "mid": "assets/p2_ood/pact_mid.png",
          "open": "assets/p2_ood/pact_open.png"
        }
      },
      "state_meta": {
        "gt": {
          "label": "gt",
          "open_value": 1.5707964599529511,
          "joint_type": "revolute",
          "frames": {
            "closed": {
              "t": 0.0,
              "caption": "θ=0°"
            },
            "mid": {
              "t": 0.5,
              "caption": "θ=45°"
            },
            "open": {
              "t": 1.0,
              "caption": "θ=90°"
            }
          }
        },
        "pact": {
          "label": "pact",
          "open_value": 6.283185307179586,
          "joint_type": "continuous",
          "frames": {
            "closed": {
              "t": 0.0,
              "caption": "θ=0°"
            },
            "mid": {
              "t": 0.5,
              "caption": "θ=180°"
            },
            "open": {
              "t": 1.0,
              "caption": "θ=360°"
            }
          }
        }
      },
      "state_render": {
        "gt_frame_md5": {
          "closed": "4c5328148765529ba3c06c8039d9e28f",
          "mid": "76163344063162ec7c26b8545424b4e0",
          "open": "f19c10f1759e45d3b7b3120c82ad16c0"
        },
        "gt_frames_identical": false,
        "pact_frame_md5": {
          "closed": "31d66e1acf1fc5b6215a82afc0260281",
          "mid": "92501b52ef04c03751afd9d76dcf8c52",
          "open": "426287878ffd51c327d61b4f29c1d8ea"
        },
        "pact_frames_identical": false
      },
      "warnings": [
        "Source GT links=5 与 Raw GT viewer parts=4 不同；viewer 使用有可视 mesh 的 source-faithful part 口径。",
        "joint type 分布不同：Raw GT=fixed:1, revolute:3；PAct=continuous:1, fixed:1, revolute:2。"
      ]
    },
    {
      "order": 3,
      "phen": "p3_occlusion",
      "diagnosis": {
        "primary_class": "recall_cardinality",
        "secondary": "internal movable recall",
        "visual": "外壳和大圆门/面板保住了，但内部微小 prismatic/被遮挡 movable 基本不可见，PAct 少了运动件。",
        "metric": "movable 11→8，joint MAE=4，F1=0.222；axis=2.2° 说明匹配到的轴不差，主要是 recall。",
        "implication": "需要显式建模不可见 movable 的先验，或引入多视角/仿真可达性信号。"
      },
      "benchmark_index": 72,
      "label": "自遮挡 / 多 movable",
      "sample_id": "PartNetMobility/major_appliances/283",
      "source_dataset": "PartNetMobility",
      "category": "major_appliances",
      "problem_tags": [
        "hard_motion",
        "internal_or_occluded_part_risk",
        "known_quality_or_conversion_issue",
        "many_parts",
        "mixed_joint_types",
        "part_decomposition",
        "prismatic_motion",
        "revolute_motion",
        "single_view_conditioning"
      ],
      "source_gt": {
        "links": 14,
        "joints_all": 13,
        "movable_joints": 11,
        "fixed_joints": 2,
        "joint_types": {
          "fixed": 2,
          "prismatic": 9,
          "revolute": 2
        },
        "gt_sdf": "/data/share/ud4scenesmith/scenesmith_unified_articulated_v0.4_sourcefaithful_scenesmith_format_20260507/artvip_sdf/major_appliances/283/283.sdf",
        "quality_status": "included_with_known_issues",
        "quality_flags": [
          "pm_not_visual_qc_approved",
          "pm_qc:extreme_revolute_limit:180.0deg",
          "pm_qc:many_movable_joints:11"
        ]
      },
      "pact_ref_gt": {
        "path": "/data/250010098/visual_portal_local/runs/visual_portal/experiments/pact-official-gt-vs-pact-20260526/assets/p3_occlusion/3d/gt/object.json",
        "parts": 12,
        "joints_all": 11,
        "movable_joints": 11,
        "fixed_joints": 1,
        "roots": [
          11
        ],
        "joint_types": {
          "fixed": 1,
          "prismatic": 9,
          "revolute": 2
        },
        "top_movable_joints": [
          {
            "id": 0,
            "name": "door",
            "source_link_name": "link_0",
            "parent": 11,
            "type": "revolute",
            "range": [
              -0.0,
              1.5707963267948966
            ],
            "open_value": 1.5707963267948966,
            "axis_direction": [
              -3.205103454691839e-09,
              1.0272688155277561e-17,
              1.0
            ],
            "axis_origin": [
              -0.37313049081845195,
              0.359900509867921,
              -1.1959218288702274e-09
            ]
          },
          {
            "id": 6,
            "name": "knob",
            "source_link_name": "link_6",
            "parent": 11,
            "type": "revolute",
            "range": [
              -1.57079632679,
              1.57079632679
            ],
            "open_value": 1.57079632679,
            "axis_direction": [
              -0.9970658071455845,
              -4.9569795656725244e-05,
              0.07654915913293664
            ],
            "axis_origin": [
              0.03209614257534746,
              0.008761399165148063,
              0.4180633596685365
            ]
          },
          {
            "id": 1,
            "name": "button",
            "source_link_name": "link_1",
            "parent": 11,
            "type": "prismatic",
            "range": [
              0.0,
              0.0020000000000000035
            ],
            "open_value": 0.0020000000000000035,
            "axis_direction": [
              0.9897027287195186,
              0.0003704832678861847,
              -0.14313759641438434
            ],
            "axis_origin": [
              0.057532933629446656,
              -0.3542036782577274,
              0.39688577851223583
            ]
          },
          {
            "id": 5,
            "name": "button",
            "source_link_name": "link_5",
            "parent": 11,
            "type": "prismatic",
            "range": [
              0.0,
              0.0020000000000000035
            ],
            "open_value": 0.0020000000000000035,
            "axis_direction": [
              0.9709383001896864,
              0.0005326442603859394,
              -0.23932934110730034
            ],
            "axis_origin": [
              0.09033426952676121,
              -0.1833545932141115,
              0.36607019755098336
            ]
          },
          {
            "id": 7,
            "name": "button",
            "source_link_name": "link_7",
            "parent": 11,
            "type": "prismatic",
            "range": [
              0.0,
              0.0020000000000000035
            ],
            "open_value": 0.0020000000000000035,
            "axis_direction": [
              -0.9594858862761202,
              -0.0006150194787523213,
              0.28175602174216063
            ],
            "axis_origin": [
              0.07943172350608244,
              -0.35854121126158583,
              0.2697124612360415
            ]
          },
          {
            "id": 8,
            "name": "button",
            "source_link_name": "link_8",
            "parent": 11,
            "type": "prismatic",
            "range": [
              0.0,
              0.0020000000000000035
            ],
            "open_value": 0.0020000000000000035,
            "axis_direction": [
              -0.9594858866184295,
              -0.0006197399901038841,
              0.2817560102329512
            ],
            "axis_origin": [
              0.07943286837900898,
              -0.29817779670113687,
              0.2698431243329898
            ]
          }
        ]
      },
      "pact_output": {
        "path": "/data/250010098/visual_portal_local/runs/visual_portal/experiments/pact-official-gt-vs-pact-20260526/assets/p3_occlusion/3d/pact/object.json",
        "parts": 12,
        "joints_all": 11,
        "movable_joints": 8,
        "fixed_joints": 4,
        "roots": [
          2
        ],
        "joint_types": {
          "continuous": 4,
          "fixed": 4,
          "prismatic": 1,
          "revolute": 2,
          "screw": 1
        },
        "top_movable_joints": [
          {
            "id": 8,
            "name": "knob",
            "source_link_name": null,
            "parent": 2,
            "type": "continuous",
            "range": [
              0.0,
              360.0
            ],
            "open_value": 6.283185307179586,
            "axis_direction": [
              0.02842993661761284,
              -0.022849127650260925,
              -0.9993345737457275
            ],
            "axis_origin": [
              -0.08103934675455093,
              0.3214682638645172,
              -0.009655637666583061
            ]
          },
          {
            "id": 9,
            "name": "knob",
            "source_link_name": null,
            "parent": 2,
            "type": "continuous",
            "range": [
              0.0,
              360.0
            ],
            "open_value": 6.283185307179586,
            "axis_direction": [
              0.04758710041642189,
              0.046761251986026764,
              -0.9977719783782959
            ],
            "axis_origin": [
              -0.07534745335578918,
              0.27969151735305786,
              0.009514357894659042
            ]
          },
          {
            "id": 10,
            "name": "knob",
            "source_link_name": null,
            "parent": 2,
            "type": "continuous",
            "range": [
              0.0,
              360.0
            ],
            "open_value": 6.283185307179586,
            "axis_direction": [
              0.0324496254324913,
              -0.010633253492414951,
              -0.9994167685508728
            ],
            "axis_origin": [
              -0.044480860233306885,
              0.32571691274642944,
              -0.004909682087600231
            ]
          },
          {
            "id": 11,
            "name": "knob",
            "source_link_name": null,
            "parent": 2,
            "type": "continuous",
            "range": [
              0.0,
              360.0
            ],
            "open_value": 6.283185307179586,
            "axis_direction": [
              -0.004432728514075279,
              -0.1192522719502449,
              -0.992854118347168
            ],
            "axis_origin": [
              -0.11348991841077805,
              0.20713429152965546,
              -0.024372326210141182
            ]
          },
          {
            "id": 6,
            "name": "drawer",
            "source_link_name": null,
            "parent": 2,
            "type": "revolute",
            "range": [
              0.0,
              -28.968198776245117
            ],
            "open_value": -0.5055904470176694,
            "axis_direction": [
              0.0,
              0.0,
              -1.0
            ],
            "axis_origin": [
              -0.30898794531822205,
              0.25189658999443054,
              0.12412311136722565
            ]
          },
          {
            "id": 0,
            "name": "door",
            "source_link_name": null,
            "parent": 2,
            "type": "revolute",
            "range": [
              0.0,
              20.640308380126953
            ],
            "open_value": 0.3602413398601927,
            "axis_direction": [
              0.0,
              1.0,
              0.0
            ],
            "axis_origin": [
              0.3708071708679199,
              -0.22000622749328613,
              0.49532419443130493
            ]
          }
        ]
      },
      "metrics": {
        "weighted_score": 52.6,
        "part_count_mae": 0,
        "joint_count_mae": 4,
        "joint_f1": 0.2222222222222222,
        "joint_type_accuracy": 0.2727272727272727,
        "axis_angular_error_deg": 2.195119811928351,
        "origin_distance_error": 0.537112315437454,
        "kinematic_tree_validity": 1,
        "scale_consistency": 0.7384876707605745
      },
      "extra": {},
      "state_images": {
        "input": "assets/p3_occlusion/input_rgb.png",
        "gt": {
          "closed": "assets/p3_occlusion/gt_closed.png",
          "mid": "assets/p3_occlusion/gt_mid.png",
          "open": "assets/p3_occlusion/gt_open.png"
        },
        "pact": {
          "closed": "assets/p3_occlusion/pact_closed.png",
          "mid": "assets/p3_occlusion/pact_mid.png",
          "open": "assets/p3_occlusion/pact_open.png"
        }
      },
      "state_meta": {
        "gt": {
          "label": "gt",
          "open_value": 1.5707963267948966,
          "joint_type": "revolute",
          "frames": {
            "closed": {
              "t": 0.0,
              "caption": "θ=0°"
            },
            "mid": {
              "t": 0.5,
              "caption": "rep. revolute θ=45°"
            },
            "open": {
              "t": 1.0,
              "caption": "rep. revolute θ=90°"
            }
          }
        },
        "pact": {
          "label": "pact",
          "open_value": 6.283185307179586,
          "joint_type": "continuous",
          "frames": {
            "closed": {
              "t": 0.0,
              "caption": "θ=0°"
            },
            "mid": {
              "t": 0.5,
              "caption": "θ=180°"
            },
            "open": {
              "t": 1.0,
              "caption": "θ=360°"
            }
          }
        }
      },
      "state_render": {
        "gt_frame_md5": {
          "closed": "02148b808fb8b294911bef31fac4e415",
          "mid": "740916375e630ed4ea0b68037adf901f",
          "open": "a3069f6cb95a8b3fbacac4645ad5bcaf"
        },
        "gt_frames_identical": false,
        "pact_frame_md5": {
          "closed": "5233aa3813d8403b0531301099254edc",
          "mid": "22f73051964e643800b6226784eb98e9",
          "open": "7b0ac9a7bd28848d7a0803862211aea6"
        },
        "pact_frames_identical": false
      },
      "warnings": [
        "Source GT links=14 与 Raw GT viewer parts=12 不同；viewer 使用有可视 mesh 的 source-faithful part 口径。",
        "movable joint 数不同：Raw GT=11，PAct=8。",
        "joint type 分布不同：Raw GT=fixed:1, prismatic:9, revolute:2；PAct=continuous:4, fixed:4, prismatic:1, revolute:2, screw:1。",
        "Raw GT 中 9 个 prismatic range 很小，2D 状态图主要由代表 revolute caption 主导。"
      ]
    },
    {
      "order": 4,
      "phen": "p4_smallparts",
      "diagnosis": {
        "primary_class": "thin_cross_source",
        "secondary": "thin part articulation",
        "visual": "剪刀薄片几何很小，PAct 能看到一些片状结构，但两个 blade 的运动关系和轴心基本没对上。",
        "metric": "part MAE=0，但 movable 2→1，joint F1=0，axis=90，scale=0.249。",
        "implication": "薄结构需要更高分辨率的 part evidence，以及对成对 revolute linkage 的先验。"
      },
      "benchmark_index": 35,
      "label": "薄小 part / scissors",
      "sample_id": "ArtVIP/household_items/model_scissors_23",
      "source_dataset": "ArtVIP",
      "category": "household_items",
      "problem_tags": [
        "cross_source_domain_gap",
        "non_pm_generalization",
        "part_decomposition",
        "revolute_motion",
        "single_view_conditioning",
        "thin_structure"
      ],
      "source_gt": {
        "links": 4,
        "joints_all": 3,
        "movable_joints": 2,
        "fixed_joints": 1,
        "joint_types": {
          "fixed": 1,
          "prismatic": 0,
          "revolute": 2
        },
        "gt_sdf": "/data/share/ud4scenesmith/scenesmith_unified_articulated_v0.4_sourcefaithful_scenesmith_format_20260507/artvip_sdf/household_items/model_scissors_23/model_scissors_23.sdf",
        "quality_status": "scene_ready_passed_known_gates",
        "quality_flags": []
      },
      "pact_ref_gt": {
        "path": "/data/250010098/visual_portal_local/runs/visual_portal/experiments/pact-official-gt-vs-pact-20260526/assets/p4_smallparts/3d/gt/object.json",
        "parts": 3,
        "joints_all": 2,
        "movable_joints": 2,
        "fixed_joints": 1,
        "roots": [
          2
        ],
        "joint_types": {
          "fixed": 1,
          "revolute": 2
        },
        "top_movable_joints": [
          {
            "id": 0,
            "name": "e_scissors_2_1",
            "source_link_name": "E_scissors_2_1",
            "parent": 2,
            "type": "revolute",
            "range": [
              0.0,
              0.3490658503988659
            ],
            "open_value": 0.3490658503988659,
            "axis_direction": [
              0.0,
              0.0,
              1.0
            ],
            "axis_origin": [
              0.13887837,
              -0.01654962,
              2.0005006e-07
            ]
          },
          {
            "id": 1,
            "name": "e_scissors_1_4",
            "source_link_name": "E_scissors_1_4",
            "parent": 2,
            "type": "revolute",
            "range": [
              0.0,
              0.3490658503988659
            ],
            "open_value": 0.3490658503988659,
            "axis_direction": [
              1.200000312500909e-13,
              -3.464102066193727e-07,
              -0.99999999999994
            ],
            "axis_origin": [
              0.019324371,
              0.0035763796,
              0.0081332001
            ]
          }
        ]
      },
      "pact_output": {
        "path": "/data/250010098/visual_portal_local/runs/visual_portal/experiments/pact-official-gt-vs-pact-20260526/assets/p4_smallparts/3d/pact/object.json",
        "parts": 3,
        "joints_all": 2,
        "movable_joints": 1,
        "fixed_joints": 2,
        "roots": [
          1
        ],
        "joint_types": {
          "fixed": 2,
          "revolute": 1
        },
        "top_movable_joints": [
          {
            "id": 0,
            "name": "door",
            "source_link_name": null,
            "parent": 1,
            "type": "revolute",
            "range": [
              0.0,
              -55.449546813964844
            ],
            "open_value": -0.9677771606424183,
            "axis_direction": [
              0.0,
              1.0,
              0.0
            ],
            "axis_origin": [
              -0.49567145109176636,
              -0.10405376553535461,
              0.06465871632099152
            ]
          }
        ]
      },
      "metrics": {
        "weighted_score": 35.5,
        "part_count_mae": 0,
        "joint_count_mae": 1,
        "joint_f1": 0.0,
        "joint_type_accuracy": 0.5,
        "axis_angular_error_deg": 90.0,
        "origin_distance_error": 0.0,
        "kinematic_tree_validity": 1,
        "scale_consistency": 0.24863563105788852
      },
      "extra": {},
      "state_images": {
        "input": "assets/p4_smallparts/input_rgb.png",
        "gt": {
          "closed": "assets/p4_smallparts/gt_closed.png",
          "mid": "assets/p4_smallparts/gt_mid.png",
          "open": "assets/p4_smallparts/gt_open.png"
        },
        "pact": {
          "closed": "assets/p4_smallparts/pact_closed.png",
          "mid": "assets/p4_smallparts/pact_mid.png",
          "open": "assets/p4_smallparts/pact_open.png"
        }
      },
      "state_meta": {
        "gt": {
          "label": "gt",
          "open_value": 0.3490658503988659,
          "joint_type": "revolute",
          "frames": {
            "closed": {
              "t": 0.0,
              "caption": "θ=0°"
            },
            "mid": {
              "t": 0.5,
              "caption": "θ=10°"
            },
            "open": {
              "t": 1.0,
              "caption": "θ=20°"
            }
          }
        },
        "pact": {
          "label": "pact",
          "open_value": -0.9677771606424181,
          "joint_type": "revolute",
          "frames": {
            "closed": {
              "t": 0.0,
              "caption": "θ=0°"
            },
            "mid": {
              "t": 0.5,
              "caption": "θ=-28°"
            },
            "open": {
              "t": 1.0,
              "caption": "θ=-55°"
            }
          }
        }
      },
      "state_render": {
        "gt_frame_md5": {
          "closed": "109236039142a129b91cb4b41da76356",
          "mid": "48202871001c7bc47462eecc2c320dc5",
          "open": "91115aa3d58f750434219b8da29d7c96"
        },
        "gt_frames_identical": false,
        "pact_frame_md5": {
          "closed": "1e27a5cf8983da05ae320eb4fe3fcb2d",
          "mid": "c41c324ce4508ca1f78ef15a52bb1f8b",
          "open": "c41c324ce4508ca1f78ef15a52bb1f8b"
        },
        "pact_frames_identical": false
      },
      "warnings": [
        "Source GT links=4 与 Raw GT viewer parts=3 不同；viewer 使用有可视 mesh 的 source-faithful part 口径。",
        "movable joint 数不同：Raw GT=2，PAct=1。",
        "joint type 分布不同：Raw GT=fixed:1, revolute:2；PAct=fixed:2, revolute:1。"
      ]
    },
    {
      "order": 5,
      "phen": "p5_jointparams",
      "diagnosis": {
        "primary_class": "joint_binding",
        "secondary": "prismatic→revolute substitution",
        "visual": "Raw GT 是小型滑动/抽拉件，PAct 视觉上变成大幅旋转开盖。",
        "metric": "part/joint count 都对，但 type acc=0，F1=0，axis=90；GT prismatic 被预测成 revolute。",
        "implication": "count 正确不能代表 articulation 正确；需要把 prismatic/revolute 类型判别单独约束。"
      },
      "benchmark_index": 58,
      "label": "关节参数错配",
      "sample_id": "PartNetMobility/small_appliances/3483",
      "source_dataset": "PartNetMobility",
      "category": "small_appliances",
      "problem_tags": [
        "hard_motion",
        "internal_or_occluded_part_risk",
        "known_quality_or_conversion_issue",
        "part_decomposition",
        "prismatic_motion",
        "single_view_conditioning"
      ],
      "source_gt": {
        "links": 4,
        "joints_all": 3,
        "movable_joints": 1,
        "fixed_joints": 2,
        "joint_types": {
          "fixed": 2,
          "prismatic": 1,
          "revolute": 0
        },
        "gt_sdf": "/data/share/ud4scenesmith/scenesmith_unified_articulated_v0.4_sourcefaithful_scenesmith_format_20260507/artvip_sdf/small_appliances/3483/3483.sdf",
        "quality_status": "included_with_known_issues",
        "quality_flags": [
          "pm_not_visual_qc_approved",
          "pm_qc:visual_qc_required:not_approved"
        ]
      },
      "pact_ref_gt": {
        "path": "/data/250010098/visual_portal_local/runs/visual_portal/experiments/pact-official-gt-vs-pact-20260526/assets/p5_jointparams/3d/gt/object.json",
        "parts": 2,
        "joints_all": 1,
        "movable_joints": 1,
        "fixed_joints": 1,
        "roots": [
          1
        ],
        "joint_types": {
          "fixed": 1,
          "prismatic": 1
        },
        "top_movable_joints": [
          {
            "id": 0,
            "name": "door",
            "source_link_name": "link_0",
            "parent": 1,
            "type": "prismatic",
            "range": [
              0.0,
              0.3
            ],
            "open_value": 0.3,
            "axis_direction": [
              -3.205103454691839e-09,
              1.0272688155277561e-17,
              1.0
            ],
            "axis_origin": [
              0.0,
              0.0,
              0.0
            ]
          }
        ]
      },
      "pact_output": {
        "path": "/data/250010098/visual_portal_local/runs/visual_portal/experiments/pact-official-gt-vs-pact-20260526/assets/p5_jointparams/3d/pact/object.json",
        "parts": 2,
        "joints_all": 1,
        "movable_joints": 1,
        "fixed_joints": 1,
        "roots": [
          1
        ],
        "joint_types": {
          "fixed": 1,
          "revolute": 1
        },
        "top_movable_joints": [
          {
            "id": 0,
            "name": "door",
            "source_link_name": null,
            "parent": 1,
            "type": "revolute",
            "range": [
              0.0,
              72.1715087890625
            ],
            "open_value": 1.2596304545011663,
            "axis_direction": [
              1.0,
              0.0,
              0.0
            ],
            "axis_origin": [
              0.23004865646362305,
              -0.49953216314315796,
              0.25646182894706726
            ]
          }
        ]
      },
      "metrics": {
        "weighted_score": 41.26,
        "part_count_mae": 0,
        "joint_count_mae": 0,
        "joint_f1": 0.0,
        "joint_type_accuracy": 0.0,
        "axis_angular_error_deg": 90.0,
        "origin_distance_error": 0.0,
        "kinematic_tree_validity": 1,
        "scale_consistency": 0.6132554244474869
      },
      "extra": {},
      "state_images": {
        "input": "assets/p5_jointparams/input_rgb.png",
        "gt": {
          "closed": "assets/p5_jointparams/gt_closed.png",
          "mid": "assets/p5_jointparams/gt_mid.png",
          "open": "assets/p5_jointparams/gt_open.png"
        },
        "pact": {
          "closed": "assets/p5_jointparams/pact_closed.png",
          "mid": "assets/p5_jointparams/pact_mid.png",
          "open": "assets/p5_jointparams/pact_open.png"
        }
      },
      "state_meta": {
        "gt": {
          "label": "gt",
          "open_value": 0.3,
          "joint_type": "prismatic",
          "frames": {
            "closed": {
              "t": 0.0,
              "caption": "same GT render"
            },
            "mid": {
              "t": 0.5,
              "caption": "same GT render"
            },
            "open": {
              "t": 1.0,
              "caption": "same GT render"
            }
          }
        },
        "pact": {
          "label": "pact",
          "open_value": 1.2596304545011663,
          "joint_type": "revolute",
          "frames": {
            "closed": {
              "t": 0.0,
              "caption": "θ=0°"
            },
            "mid": {
              "t": 0.5,
              "caption": "θ=36°"
            },
            "open": {
              "t": 1.0,
              "caption": "θ=72°"
            }
          }
        }
      },
      "state_render": {
        "gt_frame_md5": {
          "closed": "ccf26d6065f0fca35a0c3bb7ed5554ab",
          "mid": "ccf26d6065f0fca35a0c3bb7ed5554ab",
          "open": "ccf26d6065f0fca35a0c3bb7ed5554ab"
        },
        "gt_frames_identical": true,
        "pact_frame_md5": {
          "closed": "636419f4ebb3329d299a3a3e0c50bb13",
          "mid": "a8b08afa530d3f1790d1ff1d03869a4e",
          "open": "0ac422ee6003b8695ce9ca04ee923b3f"
        },
        "pact_frames_identical": false
      },
      "warnings": [
        "Source GT links=4 与 Raw GT viewer parts=2 不同；viewer 使用有可视 mesh 的 source-faithful part 口径。",
        "joint type 分布不同：Raw GT=fixed:1, prismatic:1；PAct=fixed:1, revolute:1。",
        "GT closed/mid/open 三帧完全相同；这组静态状态图不可作为开合证据。"
      ]
    },
    {
      "order": 6,
      "phen": "p6_mask",
      "diagnosis": {
        "primary_class": "positive_control",
        "secondary": "clean single revolute",
        "visual": "风扇/叶片类单轴运动，Raw GT 与 PAct 的结构和轴向最接近。",
        "metric": "score=82.05，joint F1=1，type acc=1，axis=0。",
        "implication": "这是 sanity check：简单清晰 revolute 条件下，现有 pipeline 可以工作。"
      },
      "benchmark_index": 62,
      "label": "mask ablation 原始 mask",
      "sample_id": "PartNetMobility/small_appliances/1436",
      "source_dataset": "PartNetMobility",
      "category": "small_appliances",
      "problem_tags": [
        "hard_motion",
        "internal_or_occluded_part_risk",
        "known_quality_or_conversion_issue",
        "part_decomposition",
        "revolute_motion",
        "single_view_conditioning"
      ],
      "source_gt": {
        "links": 4,
        "joints_all": 3,
        "movable_joints": 1,
        "fixed_joints": 2,
        "joint_types": {
          "fixed": 2,
          "prismatic": 0,
          "revolute": 1
        },
        "gt_sdf": "/data/share/ud4scenesmith/scenesmith_unified_articulated_v0.4_sourcefaithful_scenesmith_format_20260507/artvip_sdf/small_appliances/1436/1436.sdf",
        "quality_status": "included_with_known_issues",
        "quality_flags": [
          "pm_not_visual_qc_approved",
          "pm_qc:extreme_revolute_limit:180.0deg",
          "pm_qc:broken_texture_ref:4"
        ]
      },
      "pact_ref_gt": {
        "path": "/data/250010098/visual_portal_local/runs/visual_portal/experiments/pact-official-gt-vs-pact-20260526/assets/p6_mask/3d/gt/object.json",
        "parts": 2,
        "joints_all": 1,
        "movable_joints": 1,
        "fixed_joints": 1,
        "roots": [
          1
        ],
        "joint_types": {
          "fixed": 1,
          "revolute": 1
        },
        "top_movable_joints": [
          {
            "id": 0,
            "name": "fan",
            "source_link_name": "link_0",
            "parent": 1,
            "type": "revolute",
            "range": [
              -1.57079632679,
              1.57079632679
            ],
            "open_value": 1.57079632679,
            "axis_direction": [
              -3.205103454691839e-09,
              1.0272688155277561e-17,
              1.0
            ],
            "axis_origin": [
              -0.014506500018588003,
              -0.005799499953505166,
              -4.649483326548718e-11
            ]
          }
        ]
      },
      "pact_output": {
        "path": "/data/250010098/visual_portal_local/runs/visual_portal/experiments/pact-official-gt-vs-pact-20260526/assets/p6_mask/3d/pact/object.json",
        "parts": 2,
        "joints_all": 1,
        "movable_joints": 1,
        "fixed_joints": 1,
        "roots": [
          0
        ],
        "joint_types": {
          "fixed": 1,
          "revolute": 1
        },
        "top_movable_joints": [
          {
            "id": 1,
            "name": "door",
            "source_link_name": null,
            "parent": 0,
            "type": "revolute",
            "range": [
              0.0,
              -49.90978240966797
            ],
            "open_value": -0.8710900320026553,
            "axis_direction": [
              0.0,
              1.0,
              0.0
            ],
            "axis_origin": [
              -0.13892078399658203,
              -0.05989375710487366,
              0.3083215653896332
            ]
          }
        ]
      },
      "metrics": {
        "weighted_score": 82.05,
        "part_count_mae": 0,
        "joint_count_mae": 0,
        "joint_f1": 1.0,
        "joint_type_accuracy": 1.0,
        "axis_angular_error_deg": 0.0,
        "origin_distance_error": 0.34343621540349595,
        "kinematic_tree_validity": 1,
        "scale_consistency": 0.5295876905601873
      },
      "extra": {
        "mask_ablation_metrics": {
          "mask_orig_62": {
            "weighted_score": 82.05,
            "part_count_mae": 0,
            "joint_count_mae": 0,
            "joint_f1": 1.0,
            "joint_type_accuracy": 1.0,
            "axis_angular_error_deg": 0.0,
            "origin_distance_error": 0.34343621540349595,
            "kinematic_tree_validity": 1,
            "scale_consistency": 0.5295876905601873
          },
          "mask_maskzero_62": {
            "weighted_score": 0.0,
            "part_count_mae": 2,
            "joint_count_mae": 1,
            "joint_f1": 0.0,
            "joint_type_accuracy": 0.0,
            "axis_angular_error_deg": 90.0,
            "origin_distance_error": 0.0,
            "kinematic_tree_validity": 0,
            "scale_consistency": 0.0
          },
          "mask_masknoise_62": {
            "weighted_score": 82.04,
            "part_count_mae": 0,
            "joint_count_mae": 0,
            "joint_f1": 1.0,
            "joint_type_accuracy": 1.0,
            "axis_angular_error_deg": 0.0,
            "origin_distance_error": 0.3502838758627109,
            "kinematic_tree_validity": 1,
            "scale_consistency": 0.5294648696146318
          }
        }
      },
      "state_images": {
        "input": "assets/p6_mask/input_rgb.png",
        "gt": {
          "closed": "assets/p6_mask/gt_closed.png",
          "mid": "assets/p6_mask/gt_mid.png",
          "open": "assets/p6_mask/gt_open.png"
        },
        "pact": {
          "closed": "assets/p6_mask/pact_orig_closed.png",
          "mid": "assets/p6_mask/pact_orig_mid.png",
          "open": "assets/p6_mask/pact_orig_open.png"
        }
      },
      "state_meta": {
        "gt": {
          "label": "gt",
          "open_value": 1.57079632679,
          "joint_type": "revolute",
          "frames": {
            "closed": {
              "t": 0.0,
              "caption": "θ=0°"
            },
            "mid": {
              "t": 0.5,
              "caption": "θ=45°"
            },
            "open": {
              "t": 1.0,
              "caption": "θ=90°"
            }
          }
        },
        "pact_orig": {
          "label": "pact_orig",
          "open_value": -0.8710900320026554,
          "joint_type": "revolute",
          "frames": {
            "closed": {
              "t": 0.0,
              "caption": "θ=0°"
            },
            "mid": {
              "t": 0.5,
              "caption": "θ=-25°"
            },
            "open": {
              "t": 1.0,
              "caption": "θ=-50°"
            }
          }
        },
        "pact_masknoise": {
          "label": "pact_masknoise",
          "open_value": -0.868405965098019,
          "joint_type": "revolute",
          "frames": {
            "closed": {
              "t": 0.0,
              "caption": "θ=0°"
            },
            "mid": {
              "t": 0.5,
              "caption": "θ=-25°"
            },
            "open": {
              "t": 1.0,
              "caption": "θ=-50°"
            }
          }
        },
        "pact": {
          "label": "pact_orig",
          "open_value": -0.8710900320026554,
          "joint_type": "revolute",
          "frames": {
            "closed": {
              "t": 0.0,
              "caption": "θ=0°"
            },
            "mid": {
              "t": 0.5,
              "caption": "θ=-25°"
            },
            "open": {
              "t": 1.0,
              "caption": "θ=-50°"
            }
          }
        }
      },
      "state_render": {
        "gt_frame_md5": {
          "closed": "8371566a7d3bc1c871aa4ea60d920209",
          "mid": "cab49cd15ed08dd68cd07ffe03476726",
          "open": "33024d6d5fcda0561d3e4a30e06b7fc8"
        },
        "gt_frames_identical": false,
        "pact_frame_md5": {
          "closed": "7ee12b2a617cffd950eda2f7c9a3debf",
          "mid": "3b3bcd43e6b9d1e541cac1f24c6ae696",
          "open": "b5eb008a4988d971d530a1413f5c3761"
        },
        "pact_frames_identical": false
      },
      "warnings": [
        "Source GT links=4 与 Raw GT viewer parts=2 不同；viewer 使用有可视 mesh 的 source-faithful part 口径。"
      ]
    },
    {
      "order": 7,
      "phen": "p7_topology",
      "diagnosis": {
        "primary_class": "recall_cardinality",
        "secondary": "small dense part merge",
        "visual": "Raw GT 内部有多按钮/多旋钮；PAct 把按钮簇合并成更少的大块，右侧小 part 明显少。",
        "metric": "parts 12→9，movable 11→8，part MAE=3，joint MAE=4，F1=0.333。",
        "implication": "需要 cardinality loss、part query 排斥或后处理拆分，专门解决密集小 part 合并。"
      },
      "benchmark_index": 4,
      "label": "拓扑 / part 合并",
      "sample_id": "GAPartNet/small_appliances/103101",
      "source_dataset": "GAPartNet",
      "category": "small_appliances",
      "problem_tags": [
        "cross_source_domain_gap",
        "hard_motion",
        "internal_or_occluded_part_risk",
        "many_parts",
        "mixed_joint_types",
        "non_pm_generalization",
        "part_decomposition",
        "prismatic_motion",
        "revolute_motion",
        "single_view_conditioning"
      ],
      "source_gt": {
        "links": 14,
        "joints_all": 13,
        "movable_joints": 11,
        "fixed_joints": 2,
        "joint_types": {
          "fixed": 2,
          "prismatic": 8,
          "revolute": 3
        },
        "gt_sdf": "/data/share/ud4scenesmith/scenesmith_unified_articulated_v0.4_sourcefaithful_scenesmith_format_20260507/artvip_sdf/small_appliances/103101/103101.sdf",
        "quality_status": "scene_ready_passed_known_gates",
        "quality_flags": []
      },
      "pact_ref_gt": {
        "path": "/data/250010098/visual_portal_local/runs/visual_portal/experiments/pact-official-gt-vs-pact-20260526/assets/p7_topology/3d/gt/object.json",
        "parts": 12,
        "joints_all": 11,
        "movable_joints": 11,
        "fixed_joints": 1,
        "roots": [
          11
        ],
        "joint_types": {
          "fixed": 1,
          "prismatic": 8,
          "revolute": 3
        },
        "top_movable_joints": [
          {
            "id": 8,
            "name": "knob",
            "source_link_name": "link_8",
            "parent": 11,
            "type": "revolute",
            "range": [
              -2.7960174616949156,
              2.89654842660979
            ],
            "open_value": 2.89654842660979,
            "axis_direction": [
              1.0,
              -3.205103454691839e-09,
              3.205103454691839e-09
            ],
            "axis_origin": [
              -9.849491247992577e-10,
              0.05951650000000001,
              0.366823
            ]
          },
          {
            "id": 9,
            "name": "knob",
            "source_link_name": "link_9",
            "parent": 11,
            "type": "revolute",
            "range": [
              -2.293362637120549,
              2.494424566950296
            ],
            "open_value": 2.494424566950296,
            "axis_direction": [
              1.0,
              -3.205103454691839e-09,
              3.205103454691839e-09
            ],
            "axis_origin": [
              -1.2614982712838883e-09,
              -0.026767499999999996,
              0.366823
            ]
          },
          {
            "id": 10,
            "name": "knob",
            "source_link_name": "link_10",
            "parent": 11,
            "type": "revolute",
            "range": [
              -0.8726646259971648,
              0.8726646259971648
            ],
            "open_value": 0.8726646259971648,
            "axis_direction": [
              1.0,
              -3.205103454691839e-09,
              3.205103454691839e-09
            ],
            "axis_origin": [
              -1.3062238874423855e-09,
              -0.216135,
              0.19141
            ]
          },
          {
            "id": 0,
            "name": "button",
            "source_link_name": "link_0",
            "parent": 11,
            "type": "prismatic",
            "range": [
              0.0,
              0.0040000000000000036
            ],
            "open_value": 0.0040000000000000036,
            "axis_direction": [
              1.0,
              -3.205103454691839e-09,
              3.205103454691839e-09
            ],
            "axis_origin": [
              -6.543843697927054e-10,
              0.1644525,
              0.368622
            ]
          },
          {
            "id": 1,
            "name": "button",
            "source_link_name": "link_1",
            "parent": 11,
            "type": "prismatic",
            "range": [
              0.0,
              0.0040000000000000036
            ],
            "open_value": 0.0040000000000000036,
            "axis_direction": [
              1.0,
              -3.205103454691839e-09,
              3.205103454691839e-09
            ],
            "axis_origin": [
              -6.543843697927054e-10,
              0.1644525,
              0.368622
            ]
          },
          {
            "id": 2,
            "name": "button",
            "source_link_name": "link_2",
            "parent": 11,
            "type": "prismatic",
            "range": [
              0.0,
              0.0040000000000000036
            ],
            "open_value": 0.0040000000000000036,
            "axis_direction": [
              1.0,
              -3.205103454691839e-09,
              3.205103454691839e-09
            ],
            "axis_origin": [
              -6.543843697927054e-10,
              0.1644525,
              0.368622
            ]
          }
        ]
      },
      "pact_output": {
        "path": "/data/250010098/visual_portal_local/runs/visual_portal/experiments/pact-official-gt-vs-pact-20260526/assets/p7_topology/3d/pact/object.json",
        "parts": 9,
        "joints_all": 8,
        "movable_joints": 8,
        "fixed_joints": 1,
        "roots": [
          0
        ],
        "joint_types": {
          "continuous": 1,
          "fixed": 1,
          "prismatic": 1,
          "revolute": 5,
          "screw": 1
        },
        "top_movable_joints": [
          {
            "id": 4,
            "name": "knob",
            "source_link_name": null,
            "parent": 0,
            "type": "continuous",
            "range": [
              0.0,
              360.0
            ],
            "open_value": 6.283185307179586,
            "axis_direction": [
              0.0420587882399559,
              0.027591262012720108,
              -0.9987341165542603
            ],
            "axis_origin": [
              0.010413500480353832,
              0.2798919081687927,
              0.008170895278453827
            ]
          },
          {
            "id": 2,
            "name": "door",
            "source_link_name": null,
            "parent": 0,
            "type": "revolute",
            "range": [
              0.0,
              -80.14181518554688
            ],
            "open_value": -1.3987385435125832,
            "axis_direction": [
              0.0,
              0.0,
              -1.0
            ],
            "axis_origin": [
              -0.34134641289711,
              0.3754633963108063,
              0.03294290602207184
            ]
          },
          {
            "id": 3,
            "name": "drawer",
            "source_link_name": null,
            "parent": 0,
            "type": "revolute",
            "range": [
              0.0,
              -71.35677337646484
            ],
            "open_value": -1.2454106390187427,
            "axis_direction": [
              1.0,
              0.0,
              0.0
            ],
            "axis_origin": [
              0.02016502618789673,
              0.377194344997406,
              -0.2480710744857788
            ]
          },
          {
            "id": 6,
            "name": "door",
            "source_link_name": null,
            "parent": 0,
            "type": "revolute",
            "range": [
              0.0,
              -40.280601501464844
            ],
            "open_value": -0.703029120884333,
            "axis_direction": [
              1.0,
              0.0,
              0.0
            ],
            "axis_origin": [
              0.15035292506217957,
              0.3761831223964691,
              -0.2458667904138565
            ]
          },
          {
            "id": 5,
            "name": "door",
            "source_link_name": null,
            "parent": 0,
            "type": "revolute",
            "range": [
              0.0,
              -37.66307067871094
            ],
            "open_value": -0.6573445897548412,
            "axis_direction": [
              0.0,
              0.0,
              -1.0
            ],
            "axis_origin": [
              -0.006198004353791475,
              0.3768300414085388,
              -0.0012194514274597168
            ]
          },
          {
            "id": 7,
            "name": "door",
            "source_link_name": null,
            "parent": 0,
            "type": "revolute",
            "range": [
              0.0,
              -36.98062515258789
            ],
            "open_value": -0.6454336683584891,
            "axis_direction": [
              0.0,
              0.0,
              -1.0
            ],
            "axis_origin": [
              0.0017887770663946867,
              0.3763382136821747,
              -0.001627415418624878
            ]
          }
        ]
      },
      "metrics": {
        "weighted_score": 51.77,
        "part_count_mae": 3,
        "joint_count_mae": 4,
        "joint_f1": 0.33333333333333326,
        "joint_type_accuracy": 0.36363636363636365,
        "axis_angular_error_deg": 8.762760619749113,
        "origin_distance_error": 0.2951286836192311,
        "kinematic_tree_validity": 1,
        "scale_consistency": 0.7231612674307326
      },
      "extra": {},
      "state_images": {
        "input": "assets/p7_topology/input_rgb.png",
        "gt": {
          "closed": "assets/p7_topology/gt_closed.png",
          "mid": "assets/p7_topology/gt_mid.png",
          "open": "assets/p7_topology/gt_open.png"
        },
        "pact": {
          "closed": "assets/p7_topology/pact_closed.png",
          "mid": "assets/p7_topology/pact_mid.png",
          "open": "assets/p7_topology/pact_open.png"
        }
      },
      "state_meta": {
        "gt": {
          "label": "gt",
          "open_value": 2.89654842660979,
          "joint_type": "revolute",
          "frames": {
            "closed": {
              "t": 0.0,
              "caption": "same GT render"
            },
            "mid": {
              "t": 0.5,
              "caption": "same GT render"
            },
            "open": {
              "t": 1.0,
              "caption": "same GT render"
            }
          }
        },
        "pact": {
          "label": "pact",
          "open_value": 6.283185307179586,
          "joint_type": "continuous",
          "frames": {
            "closed": {
              "t": 0.0,
              "caption": "θ=0°"
            },
            "mid": {
              "t": 0.5,
              "caption": "θ=180°"
            },
            "open": {
              "t": 1.0,
              "caption": "θ=360°"
            }
          }
        }
      },
      "state_render": {
        "gt_frame_md5": {
          "closed": "a5e9f457b629b1234ea3e0d5bca7b05a",
          "mid": "a5e9f457b629b1234ea3e0d5bca7b05a",
          "open": "a5e9f457b629b1234ea3e0d5bca7b05a"
        },
        "gt_frames_identical": true,
        "pact_frame_md5": {
          "closed": "fd6daf1d7a7e6a99569baf5aeaa0a1a9",
          "mid": "c79a42da98c424d0136dce62f9ca33a3",
          "open": "b173680086c6ad27b602f0fe1371ca8b"
        },
        "pact_frames_identical": false
      },
      "warnings": [
        "Source GT links=14 与 Raw GT viewer parts=12 不同；viewer 使用有可视 mesh 的 source-faithful part 口径。",
        "movable joint 数不同：Raw GT=11，PAct=8。",
        "joint type 分布不同：Raw GT=fixed:1, prismatic:8, revolute:3；PAct=continuous:1, fixed:1, prismatic:1, revolute:5, screw:1。",
        "GT closed/mid/open 三帧完全相同；这组静态状态图不可作为开合证据。"
      ]
    },
    {
      "order": 8,
      "phen": "p8_simpleregr",
      "diagnosis": {
        "primary_class": "joint_binding",
        "secondary": "continuous substitution",
        "visual": "简单一门样本中 PAct 外形数目对，但运动语义像无约束 continuous，而不是目标 revolute。",
        "metric": "part/joint count 都对，type acc=1 但 F1=0，axis=90，PAct type=continuous。",
        "implication": "简单样本仍会在 axis/correspondence 上失败，不能只靠复杂度解释错误。"
      },
      "benchmark_index": 67,
      "label": "简单样本回归",
      "sample_id": "PartNetMobility/household_fixtures/915",
      "source_dataset": "PartNetMobility",
      "category": "household_fixtures",
      "problem_tags": [
        "hard_motion",
        "known_quality_or_conversion_issue",
        "part_decomposition",
        "revolute_motion",
        "single_view_conditioning"
      ],
      "source_gt": {
        "links": 4,
        "joints_all": 3,
        "movable_joints": 1,
        "fixed_joints": 2,
        "joint_types": {
          "fixed": 2,
          "prismatic": 0,
          "revolute": 1
        },
        "gt_sdf": "/data/share/ud4scenesmith/scenesmith_unified_articulated_v0.4_sourcefaithful_scenesmith_format_20260507/artvip_sdf/household_fixtures/915/915.sdf",
        "quality_status": "included_with_known_issues",
        "quality_flags": [
          "pm_not_visual_qc_approved",
          "pm_qc:broken_texture_ref:11"
        ]
      },
      "pact_ref_gt": {
        "path": "/data/250010098/visual_portal_local/runs/visual_portal/experiments/pact-official-gt-vs-pact-20260526/assets/p8_simpleregr/3d/gt/object.json",
        "parts": 2,
        "joints_all": 1,
        "movable_joints": 1,
        "fixed_joints": 1,
        "roots": [
          1
        ],
        "joint_types": {
          "fixed": 1,
          "revolute": 1
        },
        "top_movable_joints": [
          {
            "id": 0,
            "name": "button",
            "source_link_name": "link_0",
            "parent": 1,
            "type": "revolute",
            "range": [
              0.0,
              0.36442474781641604
            ],
            "open_value": 0.36442474781641604,
            "axis_direction": [
              -3.205103454691839e-09,
              -1.0,
              0.0
            ],
            "axis_origin": [
              -0.06187963414545791,
              -0.3832017722340258,
              0.007734443604801859
            ]
          }
        ]
      },
      "pact_output": {
        "path": "/data/250010098/visual_portal_local/runs/visual_portal/experiments/pact-official-gt-vs-pact-20260526/assets/p8_simpleregr/3d/pact/object.json",
        "parts": 2,
        "joints_all": 1,
        "movable_joints": 1,
        "fixed_joints": 1,
        "roots": [
          0
        ],
        "joint_types": {
          "continuous": 1,
          "fixed": 1
        },
        "top_movable_joints": [
          {
            "id": 1,
            "name": "knob",
            "source_link_name": null,
            "parent": 0,
            "type": "continuous",
            "range": [
              0.0,
              360.0
            ],
            "open_value": 6.283185307179586,
            "axis_direction": [
              0.025831541046500206,
              0.01958126202225685,
              -0.9994745254516602
            ],
            "axis_origin": [
              0.08242353051900864,
              0.2902442514896393,
              0.007816582918167114
            ]
          }
        ]
      },
      "metrics": {
        "weighted_score": 41.13,
        "part_count_mae": 0,
        "joint_count_mae": 0,
        "joint_f1": 0.0,
        "joint_type_accuracy": 1.0,
        "axis_angular_error_deg": 90.0,
        "origin_distance_error": 0.0,
        "kinematic_tree_validity": 1,
        "scale_consistency": 0.604920551819454
      },
      "extra": {},
      "state_images": {
        "input": "assets/p8_simpleregr/input_rgb.png",
        "gt": {
          "closed": "assets/p8_simpleregr/gt_closed.png",
          "mid": "assets/p8_simpleregr/gt_mid.png",
          "open": "assets/p8_simpleregr/gt_open.png"
        },
        "pact": {
          "closed": "assets/p8_simpleregr/pact_closed.png",
          "mid": "assets/p8_simpleregr/pact_mid.png",
          "open": "assets/p8_simpleregr/pact_open.png"
        }
      },
      "state_meta": {
        "gt": {
          "label": "gt",
          "open_value": 0.36442474781641604,
          "joint_type": "revolute",
          "frames": {
            "closed": {
              "t": 0.0,
              "caption": "same GT render"
            },
            "mid": {
              "t": 0.5,
              "caption": "same GT render"
            },
            "open": {
              "t": 1.0,
              "caption": "same GT render"
            }
          }
        },
        "pact": {
          "label": "pact",
          "open_value": 6.283185307179586,
          "joint_type": "continuous",
          "frames": {
            "closed": {
              "t": 0.0,
              "caption": "θ=0°"
            },
            "mid": {
              "t": 0.5,
              "caption": "θ=180°"
            },
            "open": {
              "t": 1.0,
              "caption": "θ=360°"
            }
          }
        }
      },
      "state_render": {
        "gt_frame_md5": {
          "closed": "1882185a58f1944d06fa6446789d09ba",
          "mid": "1882185a58f1944d06fa6446789d09ba",
          "open": "1882185a58f1944d06fa6446789d09ba"
        },
        "gt_frames_identical": true,
        "pact_frame_md5": {
          "closed": "aadea099e0ae9f0d2dabaa5488fd95da",
          "mid": "d3d3d7e488421ff799deee9a3d76e9fb",
          "open": "aadea099e0ae9f0d2dabaa5488fd95da"
        },
        "pact_frames_identical": false
      },
      "warnings": [
        "Source GT links=4 与 Raw GT viewer parts=2 不同；viewer 使用有可视 mesh 的 source-faithful part 口径。",
        "joint type 分布不同：Raw GT=fixed:1, revolute:1；PAct=continuous:1, fixed:1。",
        "GT closed/mid/open 三帧完全相同；这组静态状态图不可作为开合证据。"
      ]
    },
    {
      "order": 9,
      "phen": "p9_texture",
      "diagnosis": {
        "primary_class": "joint_binding",
        "secondary": "texture/thin panel ambiguity",
        "visual": "文件夹薄面板被预测成大开盖/盒体式结构，视觉上打开方向和尺度都偏。",
        "metric": "part/joint count 都对，type acc=1，但 F1=0，axis=90，scale=0.286。",
        "implication": "纹理/薄板让 part correspondence 错位；需要约束活动面板与 hinge edge 的几何关系。"
      },
      "benchmark_index": 22,
      "label": "纹理 / 外观歧义",
      "sample_id": "ArtVIP/household_items/model_folder_25",
      "source_dataset": "ArtVIP",
      "category": "household_items",
      "problem_tags": [
        "cross_source_domain_gap",
        "known_quality_or_conversion_issue",
        "non_pm_generalization",
        "part_decomposition",
        "revolute_motion",
        "single_view_conditioning",
        "thin_structure"
      ],
      "source_gt": {
        "links": 3,
        "joints_all": 2,
        "movable_joints": 1,
        "fixed_joints": 1,
        "joint_types": {
          "fixed": 1,
          "prismatic": 0,
          "revolute": 1
        },
        "gt_sdf": "/data/share/ud4scenesmith/scenesmith_unified_articulated_v0.4_sourcefaithful_scenesmith_format_20260507/artvip_sdf/household_items/model_folder_25/model_folder_25.sdf",
        "quality_status": "included_with_known_issues",
        "quality_flags": [
          "broken_gltf_texture_ref"
        ]
      },
      "pact_ref_gt": {
        "path": "/data/250010098/visual_portal_local/runs/visual_portal/experiments/pact-official-gt-vs-pact-20260526/assets/p9_texture/3d/gt/object.json",
        "parts": 2,
        "joints_all": 1,
        "movable_joints": 1,
        "fixed_joints": 1,
        "roots": [
          0
        ],
        "joint_types": {
          "fixed": 1,
          "revolute": 1
        },
        "top_movable_joints": [
          {
            "id": 1,
            "name": "knob",
            "source_link_name": "E_knob_1",
            "parent": 0,
            "type": "revolute",
            "range": [
              -1.3962634015954636,
              0.0
            ],
            "open_value": -1.3962634015954636,
            "axis_direction": [
              3.2679489653813835e-07,
              0.0,
              0.9999999999999466
            ],
            "axis_origin": [
              0.033333827,
              0.124034,
              0.15999951
            ]
          }
        ]
      },
      "pact_output": {
        "path": "/data/250010098/visual_portal_local/runs/visual_portal/experiments/pact-official-gt-vs-pact-20260526/assets/p9_texture/3d/pact/object.json",
        "parts": 2,
        "joints_all": 1,
        "movable_joints": 1,
        "fixed_joints": 1,
        "roots": [
          1
        ],
        "joint_types": {
          "fixed": 1,
          "revolute": 1
        },
        "top_movable_joints": [
          {
            "id": 0,
            "name": "door",
            "source_link_name": null,
            "parent": 1,
            "type": "revolute",
            "range": [
              0.0,
              -69.12379455566406
            ],
            "open_value": -1.2064378064684687,
            "axis_direction": [
              0.0,
              1.0,
              0.0
            ],
            "axis_origin": [
              -0.4995381236076355,
              -0.10223358869552612,
              0.33224278688430786
            ]
          }
        ]
      },
      "metrics": {
        "weighted_score": 36.09,
        "part_count_mae": 0,
        "joint_count_mae": 0,
        "joint_f1": 0.0,
        "joint_type_accuracy": 1.0,
        "axis_angular_error_deg": 90.0,
        "origin_distance_error": 0.0,
        "kinematic_tree_validity": 1,
        "scale_consistency": 0.2859157295569501
      },
      "extra": {},
      "state_images": {
        "input": "assets/p9_texture/input_rgb.png",
        "gt": {
          "closed": "assets/p9_texture/gt_closed.png",
          "mid": "assets/p9_texture/gt_mid.png",
          "open": "assets/p9_texture/gt_open.png"
        },
        "pact": {
          "closed": "assets/p9_texture/pact_closed.png",
          "mid": "assets/p9_texture/pact_mid.png",
          "open": "assets/p9_texture/pact_open.png"
        }
      },
      "state_meta": {
        "gt": {
          "label": "gt",
          "open_value": -1.3962634015954636,
          "joint_type": "revolute",
          "frames": {
            "closed": {
              "t": 0.0,
              "caption": "θ=0° rest/folded"
            },
            "mid": {
              "t": 0.5,
              "caption": "θ=-40°"
            },
            "open": {
              "t": 1.0,
              "caption": "θ=-80°"
            }
          }
        },
        "pact": {
          "label": "pact",
          "open_value": -1.2064378064684687,
          "joint_type": "revolute",
          "frames": {
            "closed": {
              "t": 0.0,
              "caption": "θ=0°"
            },
            "mid": {
              "t": 0.5,
              "caption": "θ=-35°"
            },
            "open": {
              "t": 1.0,
              "caption": "θ=-69°"
            }
          }
        }
      },
      "state_render": {
        "gt_frame_md5": {
          "closed": "3dbf236a5afb754affe04218619fc0bb",
          "mid": "b480080ebe3f8e4e7137c4a48396e47e",
          "open": "e78e92ffe8423c56be9989b09dda17fe"
        },
        "gt_frames_identical": false,
        "pact_frame_md5": {
          "closed": "c6189c766aa00ffaf72f89021d26a3c7",
          "mid": "c6189c766aa00ffaf72f89021d26a3c7",
          "open": "c6189c766aa00ffaf72f89021d26a3c7"
        },
        "pact_frames_identical": true
      },
      "warnings": [
        "Source GT links=3 与 Raw GT viewer parts=2 不同；viewer 使用有可视 mesh 的 source-faithful part 口径。",
        "Raw GT revolute range=[-1.396, 0] rad；theta=0 是 rest/folded，负方向打开。"
      ]
    }
  ]
}
