1
0
Files
homelab-public-context/runtime/latest.json
T

39 lines
17 KiB
JSON

{
"schema_version": 1,
"channel": "homelab-runtime",
"command_id": "SUPPORT-260927-HOMELAB-BACKUP-CT110-HELPER-TRANSITIVE-STATIC-RCA-1225R1",
"status": "OK",
"rc": 0,
"host": "pve01",
"mode": "read-only",
"component": "homelab-backup-ct110-helper-transitive-static-rca",
"started_at_utc": "2026-09-27T19:10:50Z",
"finished_at_utc": "2026-09-27T19:10:50Z",
"reference_register_checked": true,
"reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66",
"error_register_checked": true,
"error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0",
"command_sha256": "6d64e36c947c6baf0c7e53d2c17497d65666c040e09535e4223e53e5c8dbfa19",
"duplicate_failed_command_blocked": false,
"block_reason": null,
"execution_started": true,
"change_declared": false,
"result_contract_valid": true,
"result_contract_status": null,
"result_contract_error": null,
"command_rc": 0,
"changes_made": false,
"rollback_started": false,
"rollback_restored": null,
"mutation_outcome": "NO_MUTATION",
"sanitized": true,
"secrets_included": false,
"private_addresses_included": false,
"raw_evidence_retained_locally": true,
"raw_evidence_sha256": "6d6b105d469ee853c1554e02708bf1d9d5be7c963d4a5f9e7ac8024b6ed2c41b",
"sanitized_output_sha256": "6d6b105d469ee853c1554e02708bf1d9d5be7c963d4a5f9e7ac8024b6ed2c41b",
"output_truncated_in_json": false,
"full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt",
"output": "BACKUP_CT110_HELPER_TRANSITIVE_STATIC_RCA_BEGIN=true\nCOMMAND_ID=SUPPORT-260927-HOMELAB-BACKUP-CT110-HELPER-TRANSITIVE-STATIC-RCA-1225R1\nMODE=read-only\nCOMPONENT=homelab-backup-ct110-helper-transitive-static-rca\nMUTATION_BOUNDARY=PURE_STATIC_AST_ONLY_NO_PROJECT_IMPORT_NO_HELPER_EXECUTION_NO_VZDUMP_NO_SYSTEMD_ACTION_NO_BACKUP_NO_AUDIT_NO_FILE_MUTATION_NO_LOCK_BREAK_NO_GIT_WRITE_NO_NETBIRD_SKLADCHIK_CHANGE\nHOST=pve01\nCLUSTER_QUORATE=Yes\nRUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\nSOURCE_1224_STATUS=OK\nSOURCE_1224_DECISION=PASS_CT110_HELPER_STATIC_RCA_COLLECTED\nSOURCE_1224_NEXT_GATE=READ_EXACT_1224_AND_DECIDE_SAFE_HELPER_REPLAY_OR_SOURCE_FIX\n=== TRANSITIVE_STATIC_AST ===\nC411_PY_COUNT=17\nC411_FILE=adapter|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/adapter.py|SHA256=18eb29cef165371b48bcb78e1a456e1939e6eff253787218133162cc89ab9fa3|BYTES=2989\nC411_FILE=guest266|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/guest266.py|SHA256=86433bc424d5fa5017c20f7a237c82874b02357a3283660d8a6b0039ef2bc868|BYTES=7385\nC411_FILE=large264|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/large264.py|SHA256=5cc4641fc35e4dd554495a36146da7dbbb7f142d1450e04cc5d3c89678b8497a|BYTES=16514\nC411_FILE=nodeplan263|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/nodeplan263.py|SHA256=db5c16ee24d25aa1694530332d3190ab7cc5d4f8eb69067d025e27ad5c995060|BYTES=4603\nC411_FILE=pve265|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/pve265.py|SHA256=cd2f634414a8e38a3789015aeca5a9b47821f77d7d1fa61dcdbdc866172963be|BYTES=12888\nC411_FILE=pve270|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/pve270.py|SHA256=97015277a4f3f8129c0fd11eb70c06293026366f1f8232a97feeed513a2dbcef|BYTES=19595\nC411_FILE=pve282|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/pve282.py|SHA256=73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012|BYTES=6195\nC411_FILE=restore262|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/restore262.py|SHA256=56d1b961c8d5654d5e2ee2755268db46bd2202bca11e69788febf991cfaa79f1|BYTES=14701\nC411_FILE=stream263|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/stream263.py|SHA256=a83d03a86b93a855716658652dd073fcb281cd387fc6200fe4bc2a922f39ea16|BYTES=8831\nC411_FILE=test_guest266|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_guest266.py|SHA256=460b950924a475ce0a28dc759512e7dbe2323ae2cc42f7ef4c6181710a2a13da|BYTES=10752\nC411_FILE=test_perl270|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_perl270.py|SHA256=50fc10865078a7b9b255dc627059824184441a47c4ede52e23f24c1186e3512f|BYTES=5441\nC411_FILE=test_producer282|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_producer282.py|SHA256=a67d927cc428935791f9eecc3acf571d089f80761162f4589b7d684fba6b8af7|BYTES=12215\nC411_FILE=test_pve265|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_pve265.py|SHA256=16a9407d01bf73db687ef38684c59205fc2e6a9223cd9cee6ec6e8dde9d38707|BYTES=11781\nC411_FILE=test_pve270|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_pve270.py|SHA256=9fccd20b490613fdd5b14b4105cf0d9fd744f204e1ed1d6893e54c9f69bf6fb4|BYTES=12077\nC411_FILE=test_pve282|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_pve282.py|SHA256=1056407aab76e17181b05e043cb42c086058545a8e0027689ab4e03eee6531c4|BYTES=5785\nC411_FILE=transport261|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/transport261.py|SHA256=b9b92f957bf441cb5d1702f4881897328e6c0338f8c3f6d41d27d9a349b37688|BYTES=15364\nC411_FILE=v2core|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/v2core.py|SHA256=e285bf9a5678d07dcbb90261f9f93e7826ff524e04cfec780bf5a3c4b0dc29f2|BYTES=11755\n=== ADAPTER_FULL_SOURCE_BEGIN ===\n0001:#!/usr/bin/python3\n0002:import hashlib,inspect,json,pathlib,sys\n0003:BASE=pathlib.Path(__file__).resolve().parent\n0004:EXPECTED={\n0005:'v2core.py':'e285bf9a5678d07dcbb90261f9f93e7826ff524e04cfec780bf5a3c4b0dc29f2',\n0006:'transport261.py':'b9b92f957bf441cb5d1702f4881897328e6c0338f8c3f6d41d27d9a349b37688',\n0007:'restore262.py':'56d1b961c8d5654d5e2ee2755268db46bd2202bca11e69788febf991cfaa79f1',\n0008:'stream263.py':'a83d03a86b93a855716658652dd073fcb281cd387fc6200fe4bc2a922f39ea16',\n0009:'nodeplan263.py':'db5c16ee24d25aa1694530332d3190ab7cc5d4f8eb69067d025e27ad5c995060',\n0010:'large264.py':'5cc4641fc35e4dd554495a36146da7dbbb7f142d1450e04cc5d3c89678b8497a',\n0011:'pve265.py':'cd2f634414a8e38a3789015aeca5a9b47821f77d7d1fa61dcdbdc866172963be',\n0012:'guest266.py':'86433bc424d5fa5017c20f7a237c82874b02357a3283660d8a6b0039ef2bc868',\n0013:'pve270.py':'97015277a4f3f8129c0fd11eb70c06293026366f1f8232a97feeed513a2dbcef',\n0014:'pve282.py':'73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012'}\n0015:def sha(p):\n0016: h=hashlib.sha256()\n0017: with open(p,'rb') as f:\n0018: for b in iter(lambda:f.read(1048576),b''):h.update(b)\n0019: return h.hexdigest()\n0020:def verify_sources():\n0021: for name,want in EXPECTED.items():\n0022: p=BASE/name\n0023: if not p.is_file() or p.is_symlink() or sha(p)!=want:raise RuntimeError('SOURCE_IDENTITY_'+name)\n0024:def load_graph():\n0025: import guest266,pve265,pve270,pve282\n0026: if hasattr(guest266,'dump_argv'):raise RuntimeError('GUEST266_UNEXPECTED_DUMP_ARGV')\n0027: if not hasattr(pve265,'dump_argv'):raise RuntimeError('PVE265_DUMP_ARGV_MISSING')\n0028: if getattr(pve270,'old',None) is not pve265:raise RuntimeError('PVE270_OLD_NOT_PVE265')\n0029: if getattr(pve282,'old',None) is not pve265:raise RuntimeError('PVE282_OLD_NOT_PVE265')\n0030: if getattr(pve282,'proven',None) is not pve270:raise RuntimeError('PVE282_PROVEN_NOT_PVE270')\n0031: for n in ('MappedScratch','capture_archive','validate_mapping'):\n0032: if not hasattr(pve270,n):raise RuntimeError('PVE270_'+n.upper()+'_MISSING')\n0033: if getattr(pve282,n,None) is not getattr(pve270,n):raise RuntimeError('PVE282_ALIAS_'+n.upper()+'_MISMATCH')\n0034: return guest266,pve265,pve270,pve282\n0035:def describe():\n0036: _,p265,p270,p282=load_graph()\n0037: funcs={'pve265.dump_argv':p265.dump_argv,'pve265.validate_job':p265.validate_job,'pve265.make_plan':p265.make_plan,'pve270.validate_mapping':p270.validate_mapping,'pve270.capture_archive':p270.capture_archive,'pve270.produce':p270.produce,'pve282.select112':p282.select112,'pve282.produce':p282.produce}\n0038: return {'schema':1,'bundle':'pve-lxc-adapter-411r1','source_sha256':EXPECTED,'signatures':{k:str(inspect.signature(v)) for k,v in funcs.items()},'owner':{'dump_argv':'pve265','MappedScratch':'pve270','capture_archive':'pve270','validate_mapping':'pve270','pve282.old':'pve265','pve282.proven':'pve270'}}\n0039:def main():\n0040: verify_sources(); mode=sys.argv[1] if len(sys.argv)>1 else 'selftest'; d=describe()\n0041: if mode not in ('selftest','describe'):raise SystemExit(2)\n0042: print(json.dumps(d,sort_keys=True,separators=(',',':')))\n0043: if mode=='selftest':print('ADAPTER_SELFTEST=PASS')\n0044:if __name__=='__main__':main()\n=== ADAPTER_FULL_SOURCE_END ===\n=== ADAPTER_FUNC_verify_sources_BEGIN ===\n0001:def verify_sources():\n0002: for name,want in EXPECTED.items():\n0003: p=BASE/name\n0004: if not p.is_file() or p.is_symlink() or sha(p)!=want:raise RuntimeError('SOURCE_IDENTITY_'+name)\n=== ADAPTER_FUNC_verify_sources_END ===\n=== ADAPTER_FUNC_load_graph_BEGIN ===\n0001:def load_graph():\n0002: import guest266,pve265,pve270,pve282\n0003: if hasattr(guest266,'dump_argv'):raise RuntimeError('GUEST266_UNEXPECTED_DUMP_ARGV')\n0004: if not hasattr(pve265,'dump_argv'):raise RuntimeError('PVE265_DUMP_ARGV_MISSING')\n0005: if getattr(pve270,'old',None) is not pve265:raise RuntimeError('PVE270_OLD_NOT_PVE265')\n0006: if getattr(pve282,'old',None) is not pve265:raise RuntimeError('PVE282_OLD_NOT_PVE265')\n0007: if getattr(pve282,'proven',None) is not pve270:raise RuntimeError('PVE282_PROVEN_NOT_PVE270')\n0008: for n in ('MappedScratch','capture_archive','validate_mapping'):\n0009: if not hasattr(pve270,n):raise RuntimeError('PVE270_'+n.upper()+'_MISSING')\n0010: if getattr(pve282,n,None) is not getattr(pve270,n):raise RuntimeError('PVE282_ALIAS_'+n.upper()+'_MISMATCH')\n0011: return guest266,pve265,pve270,pve282\n=== ADAPTER_FUNC_load_graph_END ===\nADAPTER_REACHABLE_FUNCTIONS=load_graph,sha,verify_sources\nADAPTER_REACHABLE_EDGES=[[\"verify_sources\",\"sha\"]]\nADAPTER_REACHABLE_CALLS=[{\"args\":[\"guest266\",\"'dump_argv'\"],\"func\":\"hasattr\",\"kw\":[],\"lineno\":26,\"owner\":\"load_graph\"},{\"args\":[\"'GUEST266_UNEXPECTED_DUMP_ARGV'\"],\"func\":\"RuntimeError\",\"kw\":[],\"lineno\":26,\"owner\":\"load_graph\"},{\"args\":[\"pve265\",\"'dump_argv'\"],\"func\":\"hasattr\",\"kw\":[],\"lineno\":27,\"owner\":\"load_graph\"},{\"args\":[\"'PVE265_DUMP_ARGV_MISSING'\"],\"func\":\"RuntimeError\",\"kw\":[],\"lineno\":27,\"owner\":\"load_graph\"},{\"args\":[\"pve270\",\"'old'\",\"None\"],\"func\":\"getattr\",\"kw\":[],\"lineno\":28,\"owner\":\"load_graph\"},{\"args\":[\"'PVE270_OLD_NOT_PVE265'\"],\"func\":\"RuntimeError\",\"kw\":[],\"lineno\":28,\"owner\":\"load_graph\"},{\"args\":[\"pve282\",\"'old'\",\"None\"],\"func\":\"getattr\",\"kw\":[],\"lineno\":29,\"owner\":\"load_graph\"},{\"args\":[\"'PVE282_OLD_NOT_PVE265'\"],\"func\":\"RuntimeError\",\"kw\":[],\"lineno\":29,\"owner\":\"load_graph\"},{\"args\":[\"pve282\",\"'proven'\",\"None\"],\"func\":\"getattr\",\"kw\":[],\"lineno\":30,\"owner\":\"load_graph\"},{\"args\":[\"'PVE282_PROVEN_NOT_PVE270'\"],\"func\":\"RuntimeError\",\"kw\":[],\"lineno\":30,\"owner\":\"load_graph\"},{\"args\":[\"pve270\",\"n\"],\"func\":\"hasattr\",\"kw\":[],\"lineno\":32,\"owner\":\"load_graph\"},{\"args\":[\"'PVE270_' + n.upper() + '_MISSING'\"],\"func\":\"RuntimeError\",\"kw\":[],\"lineno\":32,\"owner\":\"load_graph\"},{\"args\":[\"pve282\",\"n\",\"None\"],\"func\":\"getattr\",\"kw\":[],\"lineno\":33,\"owner\":\"load_graph\"},{\"args\":[\"pve270\",\"n\"],\"func\":\"getattr\",\"kw\":[],\"lineno\":33,\"owner\":\"load_graph\"},{\"args\":[\"'PVE282_ALIAS_' + n.upper() + '_MISMATCH'\"],\"func\":\"RuntimeError\",\"kw\":[],\"lineno\":33,\"owner\":\"load_graph\"},{\"args\":[],\"func\":\"n.upper\",\"kw\":[],\"lineno\":32,\"owner\":\"load_graph\"},{\"args\":[],\"func\":\"n.upper\",\"kw\":[],\"lineno\":33,\"owner\":\"load_graph\"},{\"args\":[],\"func\":\"hashlib.sha256\",\"kw\":[],\"lineno\":16,\"owner\":\"sha\"},{\"args\":[],\"func\":\"h.hexdigest\",\"kw\":[],\"lineno\":19,\"owner\":\"sha\"},{\"args\":[\"p\",\"'rb'\"],\"func\":\"open\",\"kw\":[],\"lineno\":17,\"owner\":\"sha\"},{\"args\":[\"lambda: f.read(1048576)\",\"b''\"],\"func\":\"iter\",\"kw\":[],\"lineno\":18,\"owner\":\"sha\"},{\"args\":[\"b\"],\"func\":\"h.update\",\"kw\":[],\"lineno\":18,\"owner\":\"sha\"},{\"args\":[\"1048576\"],\"func\":\"f.read\",\"kw\":[],\"lineno\":18,\"owner\":\"sha\"},{\"args\":[],\"func\":\"EXPECTED.items\",\"kw\":[],\"lineno\":21,\"owner\":\"verify_sources\"},{\"args\":[],\"func\":\"p.is_symlink\",\"kw\":[],\"lineno\":23,\"owner\":\"verify_sources\"},{\"args\":[\"'SOURCE_IDENTITY_' + name\"],\"func\":\"RuntimeError\",\"kw\":[],\"lineno\":23,\"owner\":\"verify_sources\"},{\"args\":[],\"func\":\"p.is_file\",\"kw\":[],\"lineno\":23,\"owner\":\"verify_sources\"},{\"args\":[\"p\"],\"func\":\"sha\",\"kw\":[],\"lineno\":23,\"owner\":\"verify_sources\"}]\nADAPTER_REACHABLE_SIDE_EFFECT_CALLS=[]\nADAPTER_REACHABLE_SIDE_EFFECT_CALL_COUNT=0\nLOCAL_IMPORT_GRAPH={\"adapter\":[]}\nLOCAL_IMPORT_GRAPH_MODULES=adapter\nMODULE_adapter_TOPLEVEL_CALLS=[{\"args\":[],\"func\":\"resolve\",\"kw\":[],\"lineno\":3},{\"args\":[\"__file__\"],\"func\":\"pathlib.Path\",\"kw\":[],\"lineno\":3},{\"args\":[],\"func\":\"main\",\"kw\":[],\"lineno\":44}]\nMODULE_adapter_TOPLEVEL_SIDE_EFFECT_CALLS=[]\nLOCAL_IMPORT_TOPLEVEL_SIDE_EFFECT_CALLS=[]\nLOCAL_IMPORT_TOPLEVEL_SIDE_EFFECT_COUNT=0\nGUEST266_FOUND=true\n=== GUEST266_NO_ACTIVE_TASKS_BEGIN ===\n0001:def no_active_tasks(rows,vmid):\n0002: t.need(type(rows) is list and len(rows)<1000,'ACTIVE_TASKS_TRUNCATED_OR_INVALID')\n0003: for task in rows:\n0004: t.need(type(task) is dict and type(task.get('type')) is str,'ACTIVE_TASK_SCHEMA')\n0005: # The active index includes completed, not-yet-archived tasks.\n0006: if type(task.get('endtime')) is int and task.get('status') not in (None,'RUNNING'):continue\n0007: kind=task['type'];target=str(task.get('id',''))\n0008: if kind in ('vncshell','vncterm','vncproxy','spiceproxy'):continue\n0009: t.need(target!=str(vmid) and not any(x in kind.lower() for x in ('dump','restore','migrat','snapshot','clone','move_disk','resize')),'COMPETING_PVE_TASK')\n=== GUEST266_NO_ACTIVE_TASKS_END ===\nGUEST266_REACHABLE_FUNCTIONS=no_active_tasks\nGUEST266_REACHABLE_EDGES=[]\nGUEST266_REACHABLE_CALLS=[{\"args\":[\"type(rows) is list and len(rows) < 1000\",\"'ACTIVE_TASKS_TRUNCATED_OR_INVALID'\"],\"func\":\"t.need\",\"kw\":[],\"lineno\":60,\"owner\":\"no_active_tasks\"},{\"args\":[\"type(task) is dict and type(task.get('type')) is str\",\"'ACTIVE_TASK_SCHEMA'\"],\"func\":\"t.need\",\"kw\":[],\"lineno\":62,\"owner\":\"no_active_tasks\"},{\"args\":[\"task.get('id', '')\"],\"func\":\"str\",\"kw\":[],\"lineno\":65,\"owner\":\"no_active_tasks\"},{\"args\":[\"target != str(vmid) and (not any((x in kind.lower() for x in ('dump', 'restore', 'migrat', 'snapshot', 'clone', 'move_disk', 'resize'))))\",\"'COMPETING_PVE_TASK'\"],\"func\":\"t.need\",\"kw\":[],\"lineno\":67,\"owner\":\"no_active_tasks\"},{\"args\":[\"'id'\",\"''\"],\"func\":\"task.get\",\"kw\":[],\"lineno\":65,\"owner\":\"no_active_tasks\"},{\"args\":[\"rows\"],\"func\":\"type\",\"kw\":[],\"lineno\":60,\"owner\":\"no_active_tasks\"},{\"args\":[\"rows\"],\"func\":\"len\",\"kw\":[],\"lineno\":60,\"owner\":\"no_active_tasks\"},{\"args\":[\"task.get('endtime')\"],\"func\":\"type\",\"kw\":[],\"lineno\":64,\"owner\":\"no_active_tasks\"},{\"args\":[\"'status'\"],\"func\":\"task.get\",\"kw\":[],\"lineno\":64,\"owner\":\"no_active_tasks\"},{\"args\":[\"task\"],\"func\":\"type\",\"kw\":[],\"lineno\":62,\"owner\":\"no_active_tasks\"},{\"args\":[\"task.get('type')\"],\"func\":\"type\",\"kw\":[],\"lineno\":62,\"owner\":\"no_active_tasks\"},{\"args\":[\"'endtime'\"],\"func\":\"task.get\",\"kw\":[],\"lineno\":64,\"owner\":\"no_active_tasks\"},{\"args\":[\"vmid\"],\"func\":\"str\",\"kw\":[],\"lineno\":67,\"owner\":\"no_active_tasks\"},{\"args\":[\"(x in kind.lower() for x in ('dump', 'restore', 'migrat', 'snapshot', 'clone', 'move_disk', 'resize'))\"],\"func\":\"any\",\"kw\":[],\"lineno\":67,\"owner\":\"no_active_tasks\"},{\"args\":[\"'type'\"],\"func\":\"task.get\",\"kw\":[],\"lineno\":62,\"owner\":\"no_active_tasks\"},{\"args\":[],\"func\":\"kind.lower\",\"kw\":[],\"lineno\":67,\"owner\":\"no_active_tasks\"}]\nGUEST266_REACHABLE_SIDE_EFFECT_CALLS=[]\nGUEST266_REACHABLE_SIDE_EFFECT_CALL_COUNT=0\nTRANSITIVE_STATIC_REPLAY_SAFE=true\nSTATIC_TRANSITIVE_ANALYSIS_COMPLETE=true\nSTATIC_TRANSITIVE_RC=0\nTRANSITIVE_STATIC_REPLAY_SAFE_SUMMARY=true\nTASK_RESULT=PASS_CT110_HELPER_TRANSITIVE_STATIC_SAFE\nDECISION=PASS_HELPER_REPLAY_STATIC_SAFETY_PROVEN\nNEXT_GATE=CONTROLLED_CT110_HELPER_REPLAY_ONLY\nHOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"SUPPORT-260927-HOMELAB-BACKUP-CT110-HELPER-TRANSITIVE-STATIC-RCA-1225R1\",\"status\":\"OK\",\"changes_made\":false,\"rollback_started\":false,\"rollback_restored\":null}\n"
}