{
  "schema": "router-step-facts-v1",
  "result": "STOP_R20QUB1_R04_PUBLICATION_CONTINUATION",
  "step_id": "STEP_050M07R20QUB1_R04_VM101_BOOT_HANDOFF_PUBLICATION_CONTINUATION",
  "stop_phase": "independent_extract",
  "stop_line": "216",
  "stop_rc": 1,
  "stop_command": "python3 - \"$BUNDLE_ZIP\" \"$FINAL_EXTRACT\" \"$STEP_ID\" <<'PY'\nfrom pathlib import Path,PurePosixPath\nimport zipfile,sys,stat,os\nzpath=Path(sys.argv[1])\ndst=Path(sys.argv[2]).resolve()\nexpected=sys.argv[3]\nwith zipfile.ZipFile(zpath) as z:\n    roots=set()\n    safe=[]\n    for member in z.infolist():\n        name=PurePosixPath(member.filename)\n        parts=name.parts\n        if not parts or name.is_absolute() or '..' in parts or ':' in parts[0]:\n            raise SystemExit('unsafe member')\n        roots.add(parts[0])\n        target=(dst/Path(*parts)).resolve()\n        if target!=dst and dst not in target.parents:\n            raise SystemExit('escape')\n        mode=(member.external_attr>>16)&0xffff\n        if mode and stat.S_ISLNK(mode):\n            raise SystemExit('symlink')\n        if mode and stat.S_IMODE(mode)&0o7000:\n            raise SystemExit('special bits')\n        safe.append((member,target,mode))\n    if roots!={expected}:\n        raise SystemExit(f'roots {roots}')\n    z.extractall(dst)\n    for member,target,mode in safe:\n        if mode:\n            os.chmod(target,stat.S_IMODE(mode))\nPY\n",
  "core_change_complete": true,
  "core_change_repeated": false,
  "rollback_status": "not_applicable_read_only_continuation",
  "snapshot_name": "r20qub1-pre-0731-214833",
  "snapshot_created_in_continuation": false,
  "run_dir": "/opt/router-ops/state/detached-step-runs/STEP_050M07R20QUB1_R04_VM101_BOOT_HANDOFF_PUBLICATION_CONTINUATION/runs/20260731-220318-648815-4314",
  "reboot": false,
  "zero_healthy_repeated": false
}
