CHAT_OUTPUT_BEGIN
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
REFERENCE_REGISTER_CHECK=OK
REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66
ERROR_REGISTER_CHECK=OK
ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0
COMMAND_SHA256=6d64e36c947c6baf0c7e53d2c17497d65666c040e09535e4223e53e5c8dbfa19
DUPLICATE_FAILED_COMMAND_BLOCKED=false
EXECUTION_STARTED=true
CHANGE_DECLARED=false
RESULT_CONTRACT_VALID=true
RESULT_CONTRACT_STATUS=NOT_APPLICABLE
RESULT_CONTRACT_ERROR=NONE
COMMAND_RC=0
CHANGES_MADE=false
ROLLBACK_STARTED=false
ROLLBACK_RESTORED=null
MUTATION_OUTCOME=NO_MUTATION
SANITIZED=yes
SECRETS_INCLUDED=no
PRIVATE_ADDRESSES_INCLUDED=no
RAW_EVIDENCE_SHA256=6d6b105d469ee853c1554e02708bf1d9d5be7c963d4a5f9e7ac8024b6ed2c41b
SANITIZED_OUTPUT_SHA256=6d6b105d469ee853c1554e02708bf1d9d5be7c963d4a5f9e7ac8024b6ed2c41b
OUTPUT_BEGIN
BACKUP_CT110_HELPER_TRANSITIVE_STATIC_RCA_BEGIN=true
COMMAND_ID=SUPPORT-260927-HOMELAB-BACKUP-CT110-HELPER-TRANSITIVE-STATIC-RCA-1225R1
MODE=read-only
COMPONENT=homelab-backup-ct110-helper-transitive-static-rca
MUTATION_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
HOST=pve01
CLUSTER_QUORATE=Yes
RUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d
SOURCE_1224_STATUS=OK
SOURCE_1224_DECISION=PASS_CT110_HELPER_STATIC_RCA_COLLECTED
SOURCE_1224_NEXT_GATE=READ_EXACT_1224_AND_DECIDE_SAFE_HELPER_REPLAY_OR_SOURCE_FIX
=== TRANSITIVE_STATIC_AST ===
C411_PY_COUNT=17
C411_FILE=adapter|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/adapter.py|SHA256=18eb29cef165371b48bcb78e1a456e1939e6eff253787218133162cc89ab9fa3|BYTES=2989
C411_FILE=guest266|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/guest266.py|SHA256=86433bc424d5fa5017c20f7a237c82874b02357a3283660d8a6b0039ef2bc868|BYTES=7385
C411_FILE=large264|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/large264.py|SHA256=5cc4641fc35e4dd554495a36146da7dbbb7f142d1450e04cc5d3c89678b8497a|BYTES=16514
C411_FILE=nodeplan263|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/nodeplan263.py|SHA256=db5c16ee24d25aa1694530332d3190ab7cc5d4f8eb69067d025e27ad5c995060|BYTES=4603
C411_FILE=pve265|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/pve265.py|SHA256=cd2f634414a8e38a3789015aeca5a9b47821f77d7d1fa61dcdbdc866172963be|BYTES=12888
C411_FILE=pve270|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/pve270.py|SHA256=97015277a4f3f8129c0fd11eb70c06293026366f1f8232a97feeed513a2dbcef|BYTES=19595
C411_FILE=pve282|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/pve282.py|SHA256=73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012|BYTES=6195
C411_FILE=restore262|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/restore262.py|SHA256=56d1b961c8d5654d5e2ee2755268db46bd2202bca11e69788febf991cfaa79f1|BYTES=14701
C411_FILE=stream263|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/stream263.py|SHA256=a83d03a86b93a855716658652dd073fcb281cd387fc6200fe4bc2a922f39ea16|BYTES=8831
C411_FILE=test_guest266|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_guest266.py|SHA256=460b950924a475ce0a28dc759512e7dbe2323ae2cc42f7ef4c6181710a2a13da|BYTES=10752
C411_FILE=test_perl270|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_perl270.py|SHA256=50fc10865078a7b9b255dc627059824184441a47c4ede52e23f24c1186e3512f|BYTES=5441
C411_FILE=test_producer282|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_producer282.py|SHA256=a67d927cc428935791f9eecc3acf571d089f80761162f4589b7d684fba6b8af7|BYTES=12215
C411_FILE=test_pve265|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_pve265.py|SHA256=16a9407d01bf73db687ef38684c59205fc2e6a9223cd9cee6ec6e8dde9d38707|BYTES=11781
C411_FILE=test_pve270|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_pve270.py|SHA256=9fccd20b490613fdd5b14b4105cf0d9fd744f204e1ed1d6893e54c9f69bf6fb4|BYTES=12077
C411_FILE=test_pve282|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_pve282.py|SHA256=1056407aab76e17181b05e043cb42c086058545a8e0027689ab4e03eee6531c4|BYTES=5785
C411_FILE=transport261|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/transport261.py|SHA256=b9b92f957bf441cb5d1702f4881897328e6c0338f8c3f6d41d27d9a349b37688|BYTES=15364
C411_FILE=v2core|PATH=/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/v2core.py|SHA256=e285bf9a5678d07dcbb90261f9f93e7826ff524e04cfec780bf5a3c4b0dc29f2|BYTES=11755
=== ADAPTER_FULL_SOURCE_BEGIN ===
0001:#!/usr/bin/python3
0002:import hashlib,inspect,json,pathlib,sys
0003:BASE=pathlib.Path(__file__).resolve().parent
0004:EXPECTED={
0005:'v2core.py':'e285bf9a5678d07dcbb90261f9f93e7826ff524e04cfec780bf5a3c4b0dc29f2',
0006:'transport261.py':'b9b92f957bf441cb5d1702f4881897328e6c0338f8c3f6d41d27d9a349b37688',
0007:'restore262.py':'56d1b961c8d5654d5e2ee2755268db46bd2202bca11e69788febf991cfaa79f1',
0008:'stream263.py':'a83d03a86b93a855716658652dd073fcb281cd387fc6200fe4bc2a922f39ea16',
0009:'nodeplan263.py':'db5c16ee24d25aa1694530332d3190ab7cc5d4f8eb69067d025e27ad5c995060',
0010:'large264.py':'5cc4641fc35e4dd554495a36146da7dbbb7f142d1450e04cc5d3c89678b8497a',
0011:'pve265.py':'cd2f634414a8e38a3789015aeca5a9b47821f77d7d1fa61dcdbdc866172963be',
0012:'guest266.py':'86433bc424d5fa5017c20f7a237c82874b02357a3283660d8a6b0039ef2bc868',
0013:'pve270.py':'97015277a4f3f8129c0fd11eb70c06293026366f1f8232a97feeed513a2dbcef',
0014:'pve282.py':'73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012'}
0015:def sha(p):
0016: h=hashlib.sha256()
0017: with open(p,'rb') as f:
0018:  for b in iter(lambda:f.read(1048576),b''):h.update(b)
0019: return h.hexdigest()
0020:def verify_sources():
0021: for name,want in EXPECTED.items():
0022:  p=BASE/name
0023:  if not p.is_file() or p.is_symlink() or sha(p)!=want:raise RuntimeError('SOURCE_IDENTITY_'+name)
0024:def load_graph():
0025: import guest266,pve265,pve270,pve282
0026: if hasattr(guest266,'dump_argv'):raise RuntimeError('GUEST266_UNEXPECTED_DUMP_ARGV')
0027: if not hasattr(pve265,'dump_argv'):raise RuntimeError('PVE265_DUMP_ARGV_MISSING')
0028: if getattr(pve270,'old',None) is not pve265:raise RuntimeError('PVE270_OLD_NOT_PVE265')
0029: if getattr(pve282,'old',None) is not pve265:raise RuntimeError('PVE282_OLD_NOT_PVE265')
0030: if getattr(pve282,'proven',None) is not pve270:raise RuntimeError('PVE282_PROVEN_NOT_PVE270')
0031: for n in ('MappedScratch','capture_archive','validate_mapping'):
0032:  if not hasattr(pve270,n):raise RuntimeError('PVE270_'+n.upper()+'_MISSING')
0033:  if getattr(pve282,n,None) is not getattr(pve270,n):raise RuntimeError('PVE282_ALIAS_'+n.upper()+'_MISMATCH')
0034: return guest266,pve265,pve270,pve282
0035:def describe():
0036: _,p265,p270,p282=load_graph()
0037: 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}
0038: 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'}}
0039:def main():
0040: verify_sources(); mode=sys.argv[1] if len(sys.argv)>1 else 'selftest'; d=describe()
0041: if mode not in ('selftest','describe'):raise SystemExit(2)
0042: print(json.dumps(d,sort_keys=True,separators=(',',':')))
0043: if mode=='selftest':print('ADAPTER_SELFTEST=PASS')
0044:if __name__=='__main__':main()
=== ADAPTER_FULL_SOURCE_END ===
=== ADAPTER_FUNC_verify_sources_BEGIN ===
0001:def verify_sources():
0002: for name,want in EXPECTED.items():
0003:  p=BASE/name
0004:  if not p.is_file() or p.is_symlink() or sha(p)!=want:raise RuntimeError('SOURCE_IDENTITY_'+name)
=== ADAPTER_FUNC_verify_sources_END ===
=== ADAPTER_FUNC_load_graph_BEGIN ===
0001:def load_graph():
0002: import guest266,pve265,pve270,pve282
0003: if hasattr(guest266,'dump_argv'):raise RuntimeError('GUEST266_UNEXPECTED_DUMP_ARGV')
0004: if not hasattr(pve265,'dump_argv'):raise RuntimeError('PVE265_DUMP_ARGV_MISSING')
0005: if getattr(pve270,'old',None) is not pve265:raise RuntimeError('PVE270_OLD_NOT_PVE265')
0006: if getattr(pve282,'old',None) is not pve265:raise RuntimeError('PVE282_OLD_NOT_PVE265')
0007: if getattr(pve282,'proven',None) is not pve270:raise RuntimeError('PVE282_PROVEN_NOT_PVE270')
0008: for n in ('MappedScratch','capture_archive','validate_mapping'):
0009:  if not hasattr(pve270,n):raise RuntimeError('PVE270_'+n.upper()+'_MISSING')
0010:  if getattr(pve282,n,None) is not getattr(pve270,n):raise RuntimeError('PVE282_ALIAS_'+n.upper()+'_MISMATCH')
0011: return guest266,pve265,pve270,pve282
=== ADAPTER_FUNC_load_graph_END ===
ADAPTER_REACHABLE_FUNCTIONS=load_graph,sha,verify_sources
ADAPTER_REACHABLE_EDGES=[["verify_sources","sha"]]
ADAPTER_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"}]
ADAPTER_REACHABLE_SIDE_EFFECT_CALLS=[]
ADAPTER_REACHABLE_SIDE_EFFECT_CALL_COUNT=0
LOCAL_IMPORT_GRAPH={"adapter":[]}
LOCAL_IMPORT_GRAPH_MODULES=adapter
MODULE_adapter_TOPLEVEL_CALLS=[{"args":[],"func":"resolve","kw":[],"lineno":3},{"args":["__file__"],"func":"pathlib.Path","kw":[],"lineno":3},{"args":[],"func":"main","kw":[],"lineno":44}]
MODULE_adapter_TOPLEVEL_SIDE_EFFECT_CALLS=[]
LOCAL_IMPORT_TOPLEVEL_SIDE_EFFECT_CALLS=[]
LOCAL_IMPORT_TOPLEVEL_SIDE_EFFECT_COUNT=0
GUEST266_FOUND=true
=== GUEST266_NO_ACTIVE_TASKS_BEGIN ===
0001:def no_active_tasks(rows,vmid):
0002:    t.need(type(rows) is list and len(rows)<1000,'ACTIVE_TASKS_TRUNCATED_OR_INVALID')
0003:    for task in rows:
0004:        t.need(type(task) is dict and type(task.get('type')) is str,'ACTIVE_TASK_SCHEMA')
0005:        # The active index includes completed, not-yet-archived tasks.
0006:        if type(task.get('endtime')) is int and task.get('status') not in (None,'RUNNING'):continue
0007:        kind=task['type'];target=str(task.get('id',''))
0008:        if kind in ('vncshell','vncterm','vncproxy','spiceproxy'):continue
0009:        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')
=== GUEST266_NO_ACTIVE_TASKS_END ===
GUEST266_REACHABLE_FUNCTIONS=no_active_tasks
GUEST266_REACHABLE_EDGES=[]
GUEST266_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"}]
GUEST266_REACHABLE_SIDE_EFFECT_CALLS=[]
GUEST266_REACHABLE_SIDE_EFFECT_CALL_COUNT=0
TRANSITIVE_STATIC_REPLAY_SAFE=true
STATIC_TRANSITIVE_ANALYSIS_COMPLETE=true
STATIC_TRANSITIVE_RC=0
TRANSITIVE_STATIC_REPLAY_SAFE_SUMMARY=true
TASK_RESULT=PASS_CT110_HELPER_TRANSITIVE_STATIC_SAFE
DECISION=PASS_HELPER_REPLAY_STATIC_SAFETY_PROVEN
NEXT_GATE=CONTROLLED_CT110_HELPER_REPLAY_ONLY
HOMELAB_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}

OUTPUT_END
CHAT_OUTPUT_END
