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

39 lines
62 KiB
JSON

{
"schema_version": 1,
"channel": "homelab-runtime",
"command_id": "SUPPORT-260921-HOMELAB-BACKUP-DUE-POLICY-SOURCE-RCA-READONLY-1105R1",
"status": "OK",
"rc": 0,
"host": "pve01",
"mode": "read-only",
"component": "homelab-backup-due-policy-source-rca",
"started_at_utc": "2026-09-21T21:21:23Z",
"finished_at_utc": "2026-09-21T21:21:23Z",
"reference_register_checked": true,
"reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66",
"error_register_checked": true,
"error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0",
"command_sha256": "1cadad9a6c87f4c1dde8d879a103f7f85e6d2cdaa3f513448c7045a73e90beb4",
"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": "a5f6bceb256d00dacd3d15ee23e2f737b60089e6232680050e589a1f84edc3c2",
"sanitized_output_sha256": "a5f6bceb256d00dacd3d15ee23e2f737b60089e6232680050e589a1f84edc3c2",
"output_truncated_in_json": false,
"full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt",
"output": "WORKERS2_DUE_POLICY_SOURCE_RCA_BEGIN=1\nCOMMAND_ID=SUPPORT-260921-HOMELAB-BACKUP-DUE-POLICY-SOURCE-RCA-READONLY-1105R1\nMODE=read-only\nCOMPONENT=homelab-backup-due-policy-source-rca\nMUTATION_BOUNDARY=READ_ONLY_NO_BACKUP_NO_SERVICE_START_NO_TIMER_CHANGE_NO_LOCK_BREAK_NO_FILE_WRITE_OUTSIDE_TMP_NO_GIT_WRITE\nIDENTITIES={\"base\":{\"exists\":true,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1\"},\"entry504\":{\"exists\":true,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"sha256\":\"ca6876fa9c3b1465b045344a8ad46962de16972c7dadc4ac6257c7d225047793\"},\"wrapper\":{\"exists\":true,\"path\":\"/usr/local/sbin/homelab-backup-v2\",\"sha256\":\"5077444065c732451cb84898680f62361b21a24ef9eb4f191253e82ead524ea2\"}}\nSELFTEST_REPLACEMENT486=PASS\nLIVE_WRAPPER_TARGETS=[{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"lxc\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"ct110\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":110},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"lxc\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"ct111\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":111},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"lxc\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"ct112\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":112},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"lxc\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"ct113\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":113},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm130\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":130},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm150\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":150},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm160\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm170\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":170},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm171\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":171},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm190\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":190},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm210\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":210},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm211\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":211},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm9130\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":9130},{\"due_seconds\":604800,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"node-pve01\",\"node\":\"pve01\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":null},{\"due_seconds\":604800,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"node-pve02\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":null},{\"due_seconds\":604800,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"node-pve03\",\"node\":\"pve03\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":null},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-codevipe\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-dsmods\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-kingofwolk\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-newfi\",\"node\":\"pve01\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":210},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-gamevipe\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-hkmods\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-zakrutim\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"lxc\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"guest-pve01-lxc-112\",\"node\":\"pve01\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":112}]\nSELECTED_VM_TARGETS=[{\"count\":2,\"rows\":[{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"lxc\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"ct112\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":112},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"lxc\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"guest-pve01-lxc-112\",\"node\":\"pve01\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":112}],\"vmid\":112},{\"count\":1,\"rows\":[{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"lxc\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"ct113\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":113}],\"vmid\":113},{\"count\":1,\"rows\":[{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm130\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":130}],\"vmid\":130},{\"count\":1,\"rows\":[{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm150\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":150}],\"vmid\":150},{\"count\":7,\"rows\":[{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":\"qemu\",\"kind\":null,\"lifecycle\":null,\"logical_id\":\"vm160\",\"node\":null,\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-codevipe\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-dsmods\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-kingofwolk\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-gamevipe\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-hkmods\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"guest_type\":null,\"kind\":null,\"lifecycle\":null,\"logical_id\":\"xf-zakrutim\",\"node\":\"pve02\",\"owner\":null,\"source_class\":null,\"status\":null,\"vmid\":160}],\"vmid\":160}]\nCURRENT_SCHEDULER_SELECTION_ERROR=AttributeError:module 'wrapper' has no attribute 'load_state_all'\nLIVE_WRAPPER_FUNCTION_HITS=[{\"function\":\"load_targets\",\"line\":1,\"text\":\"def load_targets():\"},{\"function\":\"load_targets\",\"line\":2,\"text\":\"base=canonical_targets();return base+[_ct_descriptor(base)]\"},{\"function\":\"backup_target\",\"line\":1,\"text\":\"def backup_target(t,green_verify=False):\"},{\"function\":\"backup_target\",\"line\":2,\"text\":\"if not isinstance(t,dict) or t.get('logical_id')!=CT_ID:\"},{\"function\":\"backup_target\",\"line\":3,\"text\":\"return _legacy_backup_target(t,green_verify)\"},{\"function\":\"backup_target\",\"line\":5,\"text\":\"r=ct112.run_target(t,state_writer=legacy.write_state)\"},{\"function\":\"backup_target\",\"line\":6,\"text\":\"return {'logical_id':CT_ID,'generation':r['generation'],'result':'SUCCESS','payload_bytes':r['payload_bytes'],\"}]\nDUE_POLICY_SOURCE_HITS=[{\"hits\":[{\"line\":18,\"text\":\"_legacy_load_targets=legacy.load_targets\"},{\"line\":19,\"text\":\"_legacy_backup_target=legacy.backup_target\"},{\"line\":21,\"text\":\"def canonical_targets():\"},{\"line\":22,\"text\":\"rows=_legacy_load_targets()\"},{\"line\":23,\"text\":\"if not isinstance(rows,list) or len(rows)!=28: raise legacy.BackupError('TARGET_REGISTRY_COUNT')\"},{\"line\":25,\"text\":\"ids=[x.get('logical_id') for x in out]\"},{\"line\":26,\"text\":\"if len(set(ids))!=28 or CT_ID in ids: raise legacy.BackupError('TARGET_REGISTRY_IDENTITY')\"},{\"line\":30,\"text\":\"xf=[x for x in rows if x.get('logical_id')=='xf-zakrutim']\"},{\"line\":32,\"text\":\"due=xf[0].get('due_seconds')\"},{\"line\":34,\"text\":\"return {'logical_id':CT_ID,'scope':'pve01 LXC 112 full-guest archive DR','type':'pve_guest','node':'pve01','vmid':112,\"},{\"line\":35,\"text\":\"'guest_type':'lxc','due_seconds':due,'enabled':True,'green1':True}\"},{\"line\":37,\"text\":\"def load_targets():\"},{\"line\":38,\"text\":\"base=canonical_targets();return base+[_ct_descriptor(base)]\"},{\"line\":40,\"text\":\"def backup_target(t,green_verify=False):\"},{\"line\":41,\"text\":\"if not isinstance(t,dict) or t.get('logical_id')!=CT_ID:\"},{\"line\":42,\"text\":\"return _legacy_backup_target(t,green_verify)\"},{\"line\":44,\"text\":\"r=ct112.run_target(t,state_writer=legacy.write_state)\"},{\"line\":45,\"text\":\"return {'logical_id':CT_ID,'generation':r['generation'],'result':'SUCCESS','payload_bytes':r['payload_bytes'],\"},{\"line\":52,\"text\":\"legacy.load_targets=load_targets\"},{\"line\":53,\"text\":\"legacy.backup_target=backup_target\"},{\"line\":58,\"text\":\"d=legacy.default_targets()\"},{\"line\":59,\"text\":\"if not isinstance(d,list) or len(d)<28: raise RuntimeError('LEGACY_DEFAULT_TARGET_COUNT')\"},{\"line\":61,\"text\":\"if {t.get('logical_id') for t in d if isinstance(t,dict) and t.get('green1')}!=want: raise RuntimeError('LEGACY_DEFAULT_GREEN_SET')\"},{\"line\":70,\"text\":\"base=canonical_targets(); eff=load_targets()\"},{\"line\":71,\"text\":\"if len(eff)!=29 or sum(1 for x in eff if x.get('logical_id')==CT_ID)!=1: raise RuntimeError('EFFECTIVE_TARGETS')\"},{\"line\":72,\"text\":\"legacy_rows,ct=driver.partition_targets(eff)\"},{\"line\":73,\"text\":\"if [x['logical_id'] for x in legacy_rows]!=list(LEGACY_IDS) or ct.get('vmid')!=112: raise RuntimeError('REPRESENTATIVE_PARTITION')\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/wrapper.py\",\"sha256\":\"2b5eb4fc0f6f466a0d3e5a007af987092b6c17baa3ff9241a6afc2c2e97df1d5\",\"size\":5055},{\"hits\":[{\"line\":4,\"text\":\"This module does not discover credentials, modify scheduler state, or implement the\"},{\"line\":33,\"text\":\"def _logical_id(target: Mapping[str, Any]) -> str:\"},{\"line\":34,\"text\":\"value=target.get('logical_id') if isinstance(target, Mapping) else None\"},{\"line\":36,\"text\":\"raise ContractError('TARGET_LOGICAL_ID')\"},{\"line\":39,\"text\":\"def partition_targets(targets: Iterable[Mapping[str, Any]]):\"},{\"line\":42,\"text\":\"for target in targets:\"},{\"line\":43,\"text\":\"logical_id=_logical_id(target)\"},{\"line\":44,\"text\":\"if logical_id not in wanted:\"},{\"line\":46,\"text\":\"if logical_id in selected:\"},{\"line\":47,\"text\":\"raise ContractError('REPRESENTATIVE_TARGET_DUPLICATE')\"},{\"line\":48,\"text\":\"selected[logical_id]=target\"},{\"line\":51,\"text\":\"raise ContractError('REPRESENTATIVE_TARGET_MISSING')\"},{\"line\":72,\"text\":\"def write_state(logical_id,result,**kw):\"},{\"line\":73,\"text\":\"if logical_id not in LEGACY_IDS:\"},{\"line\":74,\"text\":\"raise ContractError('STATE_TARGET_FORBIDDEN')\"},{\"line\":75,\"text\":\"payload={'logical_id':logical_id,'result':result,'meta':kw,'schema_version':1}\"},{\"line\":76,\"text\":\"_atomic_json(root/(logical_id+'.json'),payload)\"},{\"line\":79,\"text\":\"def run_legacy_lane(engine, target: Mapping[str, Any]):\"},{\"line\":80,\"text\":\"logical_id=_logical_id(target)\"},{\"line\":81,\"text\":\"if logical_id not in LEGACY_IDS:\"},{\"line\":82,\"text\":\"raise ContractError('LEGACY_TARGET_FORBIDDEN')\"},{\"line\":83,\"text\":\"backup=getattr(engine,'backup_target',None)\"},{\"line\":85,\"text\":\"raise ContractError('ENGINE_BACKUP_TARGET_MISSING')\"},{\"line\":91,\"text\":\"return backup(target,True)\"},{\"line\":98,\"text\":\"if result.get('logical_id')!=CT112_ID or result.get('status')!='OK':\"},{\"line\":106,\"text\":\"def run_representative(engine, targets, ct112_callback: Callable[[Mapping[str, Any]], Any]):\"},{\"line\":109,\"text\":\"legacy,ct112=partition_targets(targets)\"},{\"line\":111,\"text\":\"for target in legacy:\"},{\"line\":112,\"text\":\"results.append(run_legacy_lane(engine,target))\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/representative_driver.py\",\"sha256\":\"b3050a8f95e6d9826a4f0786cd3ca32012b6ab10486d10e4981b50b8a0affff2\",\"size\":4214},{\"hits\":[{\"line\":49,\"text\":\"vmid=r.get('vmid')\"},{\"line\":50,\"text\":\"if type(vmid) is not int:raise RuntimeError('PVE_VMID_SCHEMA')\"},{\"line\":51,\"text\":\"configs[vmid]=_json_cmd(f\\\"/nodes/pve01/{r['type']}/{vmid}/config\\\")\"},{\"line\":61,\"text\":\"vmids=[j.get('vmid') for j in jobs if isinstance(j,dict)]\"},{\"line\":62,\"text\":\"if len(vmids)!=len(jobs) or len(vmids)!=len(set(vmids)):raise RuntimeError('CT112_PLAN_MEMBERSHIP')\"},{\"line\":63,\"text\":\"matches=[j for j in jobs if j.get('vmid')==112]\"},{\"line\":74,\"text\":\"def _assert_live_state_unchanged(before,after,vmid):\"},{\"line\":79,\"text\":\"if any(type(x) is not dict or type(x.get('vmid')) is not int for x in rows):raise RuntimeError('CT112_STATE_SCHEMA')\"},{\"line\":80,\"text\":\"return sorted((x['vmid'],x.get('type'),x.get('node'),x.get('status'),x.get('template')) for x in rows)\"},{\"line\":83,\"text\":\"a=[j for j in old if j.get('vmid')==vmid];b=[j for j in new if j.get('vmid')==vmid]\"},{\"line\":119,\"text\":\"def __init__(self,work,entries,binding,guard,deadline,logical_id):\"},{\"line\":120,\"text\":\"self.work=Path(work);self.entries=entries;self.binding=binding;self.guard=guard;self.deadline=deadline;self.logical_id=logical_id\"},{\"line\":127,\"text\":\"self.inner=large.ReadOnlyLarge(str(RCLONE),self.snapshot,e,bind,self.guard,self.work,self.deadline,self.logical_id)\"},{\"line\":142,\"text\":\"def run_target(target,state_writer=None):\"},{\"line\":143,\"text\":\"if not isinstance(target,dict) or target.get('logical_id')!=CT_ID or target.get('vmid')!=112:return (_ for _ in ()).throw(RuntimeError('CT112_DESCRIPTOR'))\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/ct112_handler.py\",\"sha256\":\"8cac6e627d5e7abe5d3163cdd24911995a1e3f45c776f9373c2aa68784f5ec6c\",\"size\":10955},{\"hits\":[{\"line\":8,\"text\":\"TARGETS_PATH=CONFIG_ROOT/'targets.json'\"},{\"line\":21,\"text\":\"ROUTER_TARGET_SHA='4f9da1283166a1e9f4e6bc7dd240c76aef85772177f717f92abb6e8e2bb8de90'\"},{\"line\":132,\"text\":\"def remote_generation_path(scope,logical_id,generation):\"},{\"line\":134,\"text\":\"for x in (scope,logical_id,generation):\"},{\"line\":136,\"text\":\"return f'homelab-backups/v2/{scope}/{logical_id}/generations/{generation}'\"},{\"line\":138,\"text\":\"def make_manifest(scope,logical_id,generation,payload_bytes,payload_sha256,parts,replicas,source_meta):\"},{\"line\":142,\"text\":\"return {'schema':2,'scope':scope,'logical_id':logical_id,'generation':generation,'created_at_utc':utcnow(),\"},{\"line\":149,\"text\":\"def default_targets():\"},{\"line\":150,\"text\":\"d=86400\"},{\"line\":153,\"text\":\"for vmid,typ in [(110,'lxc'),(111,'lxc'),(112,'lxc'),(113,'lxc'),(130,'qemu'),(150,'qemu'),(160,'qemu'),(170,'qemu'),(171,'qemu'),(190,'qemu'),(210,'qemu'),(211,'qemu'),(9130,'qemu')]:\"},{\"line\":154,\"text\":\"out.append({'logical_id':('ct' if typ=='lxc' else 'vm')+str(vmid),'scope':'pve','type':'pve_guest','vmid':vmid,'guest_type':typ,'due_seconds':d,'enabled':True,'green1':vmid==112})\"},{\"line\":156,\"text\":\"out.append({'logical_id':'node-'+node,'scope':'node','type':'pve_node_bundle','node':node,'due_seconds':7*d,'enabled':True,'green1':node=='pve01'})\"},{\"line\":158,\"text\":\"{'logical_id':'md-relay','scope':'vps','type':'vps_md','host':'85.121.4.192','port':22,'user':'ops','hostkey_fingerprint':'SHA256:DXJGwunC5tEVvnC3nRxyayTN8FXmyJcVgf+Oa6udQsY','due_seconds':d,'enabled':True,'green1':True},\"},{\"line\":159,\"text\":\"{'logical_id':'spb-ingress','scope':'vps','type':'vps_spb','host':'185.225.35.6','port':22,'user':'edgeadmin','hostkey_fingerprint':'SHA256:Ef+HsZb8lIXoadvYBXuGKIL3H7NyJMmf9EYCoJRoSv8','due_seconds':d,'enabled':True,'green1':True},\"},{\"line\":160,\"text\":\"{'logical_id':'us-netbird','scope':'vps','type':'vps_us','host':'46.16.34.129','port':22,'user':'root','hostkey_fingerprint':'SHA256:805Q9eh/fePUci42dfY58I6q0lFiiPHn0/M+mckypmE','due_seconds':d,'enabled':True,'green1':True},\"},{\"line\":161,\"text\":\"{'logical_id':'router-netcraze','scope':'router','type':'router','due_seconds':d,'enabled':True,'green1':True},\"},{\"line\":171,\"text\":\"for slug,vmid,node,root,db,strategy in sites:\"},{\"line\":172,\"text\":\"out.append({'logical_id':'xf-'+slug,'scope':'xenforo','type':'xenforo','slug':slug,'vmid':vmid,'node':node,'app_root':root,'db_name':db,'dump_strategy':strategy,'due_seconds':d,'enabled':True,'green1':slug in ('codevipe','zakrutim')})\"},{\"line\":173,\"text\":\"out.append({'logical_id':'control-bootstrap-v2','scope':'control','type':'control','due_seconds':43200,'enabled':True,'green1':True})\"},{\"line\":176,\"text\":\"def choose_due_target(targets,state,now=None):\"},{\"line\":179,\"text\":\"for t in targets:\"},{\"line\":180,\"text\":\"if not t.get('enabled',True): continue\"},{\"line\":181,\"text\":\"due=max(1,int(t.get('due_seconds',86400)))\"},{\"line\":182,\"text\":\"last=int(state.get(t['logical_id'],{}).get('last_success_epoch',0))\"},{\"line\":184,\"text\":\"if last==0 or age>=due: c.append((-(age/due),last,t['logical_id'],t))\"},{\"line\":236,\"text\":\"def load_targets():\"},{\"line\":237,\"text\":\"j=json.loads(TARGETS_PATH.read_text())\"},{\"line\":238,\"text\":\"if j.get('schema')!=1 or not isinstance(j.get('targets'),list): raise BackupError('TARGET_MANIFEST_SCHEMA')\"},{\"line\":239,\"text\":\"ids=[x.get('logical_id') for x in j['targets']]\"},{\"line\":240,\"text\":\"if len(ids)!=len(set(ids)): raise BackupError('TARGET_MANIFEST_DUPLICATE')\"},{\"line\":241,\"text\":\"return j['targets']\"},{\"line\":249,\"text\":\"j=json.loads(p.read_text()); d[j['logical_id']]=j\"},{\"line\":253,\"text\":\"def write_state(logical_id,result,**kw):\"},{\"line\":255,\"text\":\"j={'schema':1,'logical_id':logical_id,'result':result,'updated_at_utc':utcnow(),**kw}\"},{\"line\":257,\"text\":\"atomic_write(STATE_ROOT/'state'/(logical_id+'.json'),canonical_json(j)+b'\\\\n',0o600)\"},{\"line\":280,\"text\":\"def remote_exists_any(scope,logical_id,generation):\"},{\"line\":281,\"text\":\"rel=remote_generation_path(scope,logical_id,generation)\"},{\"line\":328,\"text\":\"def generation_id(logical_id):\"},{\"line\":330,\"text\":\"return f'v2-{logical_id}-{ts}-{os.urandom(6).hex()}'\"},{\"line\":335,\"text\":\"gen=source_meta['generation']; rel=remote_generation_path(t['scope'],t['logical_id'],gen)\"},{\"line\":336,\"text\":\"if remote_exists_any(t['scope'],t['logical_id'],gen): raise BackupError('GENERATION_COLLISION')\"},{\"line\":339,\"text\":\"manifest=make_manifest(t['scope'],t['logical_id'],gen,n,psha,parts,reps,source_meta)\"},{\"line\":350,\"text\":\"seal={'schema':1,'generation':gen,'logical_id':t['logical_id'],'manifest_sha256':msha,'payload_sha256':psha,'status':'SEALED','sealed_at_utc':utcnow()}\"},{\"line\":359,\"text\":\"rel=remote_generation_path(manifest['scope'],manifest['logical_id'],manifest['generation'])\"},{\"line\":392,\"text\":\"if t['guest_type']=='lxc': validate_tar_zst(path)\"},{\"line\":415,\"text\":\"def _pve_dumpdir_spec(guest_type):\"},{\"line\":416,\"text\":\"if guest_type=='lxc': return (0o710,100000)\"},{\"line\":417,\"text\":\"if guest_type=='qemu': return (0o700,0)\"},{\"line\":418,\"text\":\"raise BackupError('PVE_GUEST_TYPE_DRIFT')\"},{\"line\":449,\"text\":\"return {'vmid':int(t['vmid']),'id':int(t['vmid']),'type':'lxc','kind':'lxc','guest_type':'lxc','node':node,'status':row.get('status'),'name':row.get('name',''),\"},{\"line\":464,\"text\":\"if pathlib.Path(argv[0]).name!='vzdump' or str(int(t['vmid'])) not in argv: raise BackupError('PROVEN_DUMP_ARGV_TARGET')\"},{\"line\":475,\"text\":\"def _default_unprivileged_lxc(node,vmid):\"},{\"line\":476,\"text\":\"q=ssh_remote(node,['pct','config',str(vmid)],timeout=30)\"},{\"line\":506,\"text\":\"vmid=int(t['vmid']); rows=[r for r in cluster_inventory() if int(r.get('vmid',-1))==vmid]\"},{\"line\":509,\"text\":\"if typ!=t['guest_type']: raise BackupError('PVE_GUEST_TYPE_DRIFT')\"},{\"line\":512,\"text\":\"_default_unprivileged_lxc(node,vmid)\"},{\"line\":526,\"text\":\"return local,{'generation':gen,'source_class':'pve_guest','vmid':vmid,'guest_type':typ,'node':node,'status':row.get('status'),'producer_contract':'proven-270-282-stream'},cleanup\"},{\"line\":531,\"text\":\"ssh_remote(node,['vzdump',str(vmid),'--mode','snapshot','--compress','zstd','--dumpdir',srcdir],timeout=7200)\"},{\"line\":541,\"text\":\"return pathlib.Path(local),{'generation':gen,'source_class':'pve_guest','vmid':vmid,'guest_type':typ,'node':node,'status':row.get('status')},{'kind':'pve_source_dir','node':node,'path':srcdir}\"},{\"line\":565,\"text\":\"def ensure_vps_known_hosts(targets):\"},{\"line\":567,\"text\":\"for t in targets:\"},{\"line\":585,\"text\":\"def bootstrap_vps_keys(targets):\"},{\"line\":587,\"text\":\"ensure_vps_known_hosts(targets)\"},{\"line\":590,\"text\":\"for t in targets:\"},{\"line\":594,\"text\":\"results[t['logical_id']]='ALREADY_OPERATOR_KEY'; continue\"},{\"line\":601,\"text\":\"results[t['logical_id']]=tag\"},{\"line\":603,\"text\":\"us=[x for x in targets if x['type']=='vps_us'][0]\"},{\"line\":605,\"text\":\"results[us['logical_id']]='ALREADY_US_OPERATOR_KEY'\"},{\"line\":621,\"text\":\"return payload,{'generation':gen,'source_class':'vps_md','consistency':'FILESET_PRE_POST_HASH_STABILITY','hashset_sha256':pre},None\"},{\"line\":631,\"text\":\"return payload,{'generation':gen,'source_class':'vps_spb','consistency':'STATIC_CONFIG_FILESET_PRE_POST_HASH_STABILITY','tls_recovery':'REISSUE_TLS_ON_RESTORE','hashset_sha256':pre},None\"},{\"line\":666,\"text\":\"return payload,{'generation':gen,'source_class':'vps_us','consistency':'SQLITE_ONLINE_BACKUP_PLUS_NONDB_FILES','sqlite_count':4},None\"},{\"line\":742,\"text\":\"hits=[ip for ip in ips if sha256_bytes(ip.encode())==ROUTER_TARGET_SHA]\"},{\"line\":743,\"text\":\"if len(hits)!=1: raise BackupError('ROUTER_TARGET_PARSE')\"},{\"line\":744,\"text\":\"target=hits[0]\"},{\"line\":753,\"text\":\"return target,safe[0]\"},{\"line\":783,\"text\":\"target,pf=parse_router_legacy()\"},{\"line\":800,\"text\":\"return payload,{'generation':gen,'source_class':'router','config_sha256':sha256_bytes(a),'read_count':2,'recovery_policy':'IMPORT_PACKAGE_OR_SAFE_CLI_NOT_BLIND_CONFIG_REPLACE'},None\"},{\"line\":802,\"text\":\"def qga_exec(node,vmid,guest_argv,input_bytes=None,timeout=600):\"},{\"line\":803,\"text\":\"args=['qm','guest','exec',str(vmid),'--synchronous','1','--timeout',str(int(timeout))]\"},{\"line\":821,\"text\":\"out=qga_exec(t['node'],t['vmid'],['/usr/bin/python3','-I','-B','-'],xf_guest_builder(t,gen).encode(),timeout=900)\"},{\"line\":833,\"text\":\"b64=qga_exec(t['node'],t['vmid'],['/usr/bin/python3','-I','-B','-c',code,path,str(off),str(take)],None,timeout=60).strip()\"},{\"line\":841,\"text\":\"qga_exec(t['node'],t['vmid'],['/usr/bin/rm','-f',path],None,timeout=30)\"},{\"line\":846,\"text\":\"return local,{'generation':gen,'source_class':'xenforo','site':t['slug'],'vmid':t['vmid'],'node':t['node'],'dump_strategy':t['dump_strategy'],'db_dump_bytes':j.get('db_bytes')},None\"},{\"line\":869,\"text\":\"return payload,{'generation':gen,'source_class':'pve_node_bundle','node':node,'recovery_policy':'CLEAN_INSTALL_JOIN_RECONCILE_NOT_BLIND_PMXCFS_OVERWRITE','member_roots':len(paths)},None\"},{\"line\":871,\"text\":\"def capture_target(t,gen,work):\"},{\"line\":900,\"text\":\"write_state(t['logical_id'],'SUCCESS',generation=gen,verification='existing_control_engine_verify',last_success_epoch=epoch())\"},{\"line\":901,\"text\":\"return {'logical_id':t['logical_id'],'generation':gen,'result':'SUCCESS','payload_bytes':0,'replicas':2}\"},{\"line\":903,\"text\":\"def backup_target(t,green_verify=False):\"},{\"line\":905,\"text\":\"gen=generation_id(t['logical_id']); work=ensure_dir(WORK_ROOT/gen,0o700)\"},{\"line\":908,\"text\":\"payload,meta,cleanup=capture_target(t,gen,work); meta['generation']=gen\"},{\"line\":921,\"text\":\"write_state(t['logical_id'],'SUCCESS',generation=gen,payload_sha256=manifest['payload_sha256'],manifest_sha256=msha,replicas=manifest['replicas'],green_verified=bool(green_verify),last_success_epoch=epoch())\"},{\"line\":922,\"text\":\"return {'logical_id':t['logical_id'],'generation':gen,'result':'SUCCESS','payload_bytes':manifest['payload_bytes'],'replicas':2,'allocator_healthy':alloc['healthy']}\"},{\"line\":925,\"text\":\"write_state(t['logical_id'],result,generation=gen,reason=e.code,sealed=sealed)\"},{\"line\":929,\"text\":\"targets=load_targets(); chosen=[t for t in targets if t.get('green1')]\"},{\"line\":931,\"text\":\"boots=bootstrap_vps_keys(targets)\"},{\"line\":936,\"text\":\"key=re.sub(r'[^A-Za-z0-9]+','_',t['logical_id']).upper()\"},{\"line\":938,\"text\":\"r=backup_target(t,green_verify=(t['type']!='control'))\"},{\"line\":945,\"text\":\"failures.append((t['logical_id'],e.code)); print(f'{label}_{key}=FAIL'); print(f'{label}_{key}_REASON={e.code}')\"},{\"line\":946,\"text\":\"print(f'{label}_TARGET_COUNT={len(chosen)}')\"},{\"line\":949,\"text\":\"print(f'{label}_CLOUD_BACKUP_TARGET_COUNT={sum(1 for t in chosen if t[\\\"type\\\"]!=\\\"control\\\")}')\"},{\"line\":950,\"text\":\"print(f'{label}_CONTROL_VERIFY_TARGET_COUNT={sum(1 for t in chosen if t[\\\"type\\\"]==\\\"control\\\")}')\"},{\"line\":951,\"text\":\"if failures: raise BackupError(label+'_TARGET_FAILURES',','.join(x[0] for x in failures))\"},{\"line\":956,\"text\":\"targets=load_targets(); state=load_state_all(); t=choose_due_target(targets,state)\"},{\"line\":958,\"text\":\"print('SCHEDULE_DECISION=DEFER_NO_DUE_TARGET'); return 0\"},{\"line\":959,\"text\":\"print('SCHEDULE_TARGET='+t['logical_id'])\"},{\"line\":960,\"text\":\"try: backup_target(t,green_verify=False)\"},{\"line\":965,\"text\":\"def discover(logical_id):\"},{\"line\":966,\"text\":\"targets=load_targets(); m={t['logical_id']:t for t in targets}\"},{\"line\":967,\"text\":\"if logical_id not in m: raise BackupError('DISCOVER_UNKNOWN_TARGET')\"},{\"line\":968,\"text\":\"t=m[logical_id]; prefix=f'homelab-backups/v2/{t[\\\"scope\\\"]}/{logical_id}/generations'\"},{\"line\":983,\"text\":\"print('DISCOVER_LOGICAL_ID='+logical_id); print('DISCOVER_TWO_PHYSICAL_SEALED_COUNT='+str(len(good)))\"},{\"line\":990,\"text\":\"assert len(default_targets())>=28\"},{\"line\":991,\"text\":\"assert {t['logical_id'] for t in default_targets() if t.get('green1')}=={'ct112','node-pve01','md-relay','spb-ingress','us-netbird','router-netcraze','xf-codevipe','xf-zakrutim','control-bootstrap-v2'}\"},{\"line\":998,\"text\":\"av,_=proven_lxc_dump_argv({'vmid':112},{'maxdisk':8350298112,'maxmem':536870912,'status':'running','name':'unbound1'},'pve01','/var/tmp/homelab-vzdump-selftest')\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/legacy_engine.py\",\"sha256\":\"b6e79f087b9f1d21dac4f77a7b46b743299bbb85bc716e80d2ea67c2e038bcd7\",\"size\":59719},{\"hits\":[{\"line\":76,\"text\":\"need(g['vmid'] in configs,'GUEST_CONFIG_MISSING')\"},{\"line\":77,\"text\":\"original=configs[g['vmid']];cfg=normalized_config(original);summary=np.config_summary(cfg,g['type'])\"},{\"line\":96,\"text\":\"if st is None or st['active'] is not True or st['enabled'] is not True:block.add('STORAGE_NOT_AVAILABLE')\"},{\"line\":124,\"text\":\"need(type(job.get('vmid')) is int and 100<=job['vmid']<=999999999,'VMID')\"},{\"line\":135,\"text\":\"return [str(executable),str(job['vmid']),'--node',job['node'],'--mode','snapshot','--stdout','1',\"},{\"line\":153,\"text\":\"need(type(seconds) in (int,float) and 0<seconds<=86400,'DEADLINE')\"},{\"line\":210,\"text\":\"dest=work/('guest-%d.%s.zst'%(job['vmid'],'tar' if job['type']=='lxc' else 'vma'))\"},{\"line\":221,\"text\":\"return {**result,'path':str(dest),'vmid':job['vmid'],'type':job['type'],'node':job['node'],\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/pve265.py\",\"sha256\":\"cd2f634414a8e38a3789015aeca5a9b47821f77d7d1fa61dcdbdc866172963be\",\"size\":12888},{\"hits\":[{\"line\":22,\"text\":\"SEAL_KEYS={'schema_version','state','generation','logical_id','manifest_sha256','replicas','receipts','acceptance'}\"},{\"line\":38,\"text\":\"def __init__(self,executable,snapshot,entries,expected_binding,guard,work,deadline,logical_id):\"},{\"line\":39,\"text\":\"core.validate_inventory(entries);t.need(core.valid_name(logical_id),'LOGICAL_ID_INVALID')\"},{\"line\":42,\"text\":\"self.deadline=deadline;self.logical_id=logical_id;self.calls=0\"},{\"line\":53,\"text\":\"p=remote+':backup-v2/targets/'+self.logical_id+'/generations'\"},{\"line\":86,\"text\":\"def validate_seal(blob,entries,generation,logical_id):\"},{\"line\":90,\"text\":\"t.need(s['generation']==generation and s['logical_id']==logical_id,'SEAL_IDENTITY')\"},{\"line\":103,\"text\":\"def discover(cloud,entries,logical_id,expected_manifest_sha):\"},{\"line\":106,\"text\":\"t.need(core.valid_name(logical_id) and core.valid_hash(expected_manifest_sha),'DISCOVERY_INPUT')\"},{\"line\":122,\"text\":\"s=validate_seal(b,entries,gen,logical_id)\"},{\"line\":135,\"text\":\"t.need(m['logical_id']==logical_id and m['generation']==gen and m['replicas']==first_s['replicas'],'MANIFEST_PLACEMENT')\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/restore262.py\",\"sha256\":\"56d1b961c8d5654d5e2ee2755268db46bd2202bca11e69788febf991cfaa79f1\",\"size\":14701},{\"hits\":[{\"line\":43,\"text\":\"link=self.root/'dirlink';link.symlink_to(self.root,target_is_directory=True)\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_perl270.py\",\"sha256\":\"50fc10865078a7b9b255dc627059824184441a47c4ede52e23f24c1186e3512f\",\"size\":5441},{\"hits\":[{\"line\":85,\"text\":\"p=self.private/'bad';p.symlink_to('/var/tmp',target_is_directory=True)\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_pve270.py\",\"sha256\":\"9fccd20b490613fdd5b14b4105cf0d9fd744f204e1ed1d6893e54c9f69bf6fb4\",\"size\":12077},{\"hits\":[{\"line\":20,\"text\":\"LOGICAL_ID='stream-canary-pve01'\"},{\"line\":125,\"text\":\"def upload(source,work,entries,cloud,generation,logical_id,reserve,guard,clock=lambda:int(time.time())):\"},{\"line\":128,\"text\":\"t.need(core.valid_name(generation) and core.valid_name(logical_id),'GENERATION_ID')\"},{\"line\":134,\"text\":\"m=core.make_manifest(generation,logical_id,record['payload_bytes'],record['payload_sha256'],record['parts'],allocation)\"},{\"line\":153,\"text\":\"seal={'schema_version':2,'state':'SEALED','generation':generation,'logical_id':logical_id,\"},{\"line\":157,\"text\":\"r.validate_seal(sb,entries,generation,logical_id);t.create(work/'SEALED.json',sb)\"},{\"line\":167,\"text\":\"def discover(cloud,entries,logical_id,expected_hash):\"},{\"line\":170,\"text\":\"t.need(core.valid_name(logical_id) and core.valid_hash(expected_hash),'DISCOVERY_INPUT')\"},{\"line\":185,\"text\":\"seal=r.validate_seal(b,entries,gen,logical_id)\"},{\"line\":197,\"text\":\"t.need(m['generation']==gen and m['logical_id']==logical_id and m['replicas']==seal['replicas'],'MANIFEST_PLACEMENT')\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/large264.py\",\"sha256\":\"5cc4641fc35e4dd554495a36146da7dbbb7f142d1450e04cc5d3c89678b8497a\",\"size\":16514},{\"hits\":[{\"line\":85,\"text\":\"p=self.private/'bad';p.symlink_to('/var/tmp',target_is_directory=True)\"},{\"line\":169,\"text\":\"job=plan(now=int(time.time()))['jobs'][0];job['vmid']=112;job['config_sha256']=f.t.sha(f.core.canonical_bytes(CFG))\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_producer282.py\",\"sha256\":\"a67d927cc428935791f9eecc3acf571d089f80761162f4589b7d684fba6b8af7\",\"size\":12215},{\"hits\":[{\"line\":31,\"text\":\"vmid=x.get('vmid');typ=x.get('type');status=x.get('status')\"},{\"line\":32,\"text\":\"need(type(vmid) is int and 100<=vmid<=999999999 and vmid not in seen,'GUEST_ID_INVALID_OR_DUPLICATE')\"},{\"line\":34,\"text\":\"seen.add(vmid)\"},{\"line\":35,\"text\":\"out.append({'vmid':vmid,'type':typ,'node':node,'status':status,'template':x.get('template') in (1,True),\"},{\"line\":38,\"text\":\"return sorted(out,key=lambda x:x['vmid'])\"},{\"line\":78,\"text\":\"'enabled':(x['enabled'] in (1,True) if x.get('enabled') in (0,1,False,True) else None),'free_bytes':maybe_number(x.get('avail')),\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/nodeplan263.py\",\"sha256\":\"db5c16ee24d25aa1694530332d3190ab7cc5d4f8eb69067d025e27ad5c995060\",\"size\":4603},{\"hits\":[{\"line\":23,\"text\":\"MANIFEST_KEYS = {'schema_version','state','generation','logical_id','namespace',\"},{\"line\":71,\"text\":\"target,sep,path=s.get('remote','').strip().partition(':')\"},{\"line\":72,\"text\":\"require(sep==':' and target in mail and valid_name(target),'CRYPT_NOT_DIRECT_MAILRU')\"},{\"line\":80,\"text\":\"user=p[target].get('user','').strip().casefold()\"},{\"line\":83,\"text\":\"entries.append({'account_id':account_id,'crypt_remote':name,'mail_remote':target,'wrapped_path':path})\"},{\"line\":164,\"text\":\"require(valid_name(m['generation']) and valid_name(m['logical_id']),'MANIFEST_ID')\"},{\"line\":165,\"text\":\"namespace='backup-v2/targets/'+m['logical_id']+'/generations/'+m['generation']\"},{\"line\":185,\"text\":\"def make_manifest(generation,logical_id,payload_bytes,payload_sha256,parts,allocation):\"},{\"line\":198,\"text\":\"namespace='backup-v2/targets/'+logical_id+'/generations/'+generation\"},{\"line\":201,\"text\":\"m={'schema_version':2,'state':'PREPARED','generation':generation,'logical_id':logical_id,'namespace':namespace,\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/v2core.py\",\"sha256\":\"e285bf9a5678d07dcbb90261f9f93e7826ff524e04cfec780bf5a3c4b0dc29f2\",\"size\":11755},{\"hits\":[{\"line\":1,\"text\":\"{\\\"candidate\\\":\\\"pve-lxc-adapter-411r1\\\",\\\"next_gate\\\":\\\"PVE_LXC_REAL_ENVIRONMENT_DRY_RUN\\\",\\\"owner\\\":{\\\"MappedScratch\\\":\\\"pve270\\\",\\\"capture_archive\\\":\\\"pve270\\\",\\\"dump_argv\\\":\\\"pve265\\\",\\\"pve282.old\\\":\\\"pve265\\\",\\\"pve282.proven\\\":\\\"pve270\\\",\\\"validate_mapping\\\":\\\"pve270\\\"},\\\"schema\\\":1,\\\"signatures\\\":{\\\"pve265\\\":{\\\"dump_argv\\\":{\\\"args\\\":[\\\"job\\\",\\\"executable\\\",\\\"tmpdir\\\",\\\"now\\\"],\\\"defaults\\\":0,\\\"kw_defaults\\\":[],\\\"kwarg\\\":null,\\\"kwonly\\\":[],\\\"posonly\\\":[],\\\"vararg\\\":null},\\\"make_plan\\\":{\\\"args\\\":[\\\"rows\\\",\\\"configs\\\",\\\"storage_rows\\\",\\\"defaults\\\",\\\"staging_free\\\",\\\"now\\\",\\\"node\\\"],\\\"defaults\\\":1,\\\"kw_defaults\\\":[],\\\"kwarg\\\":null,\\\"kwonly\\\":[],\\\"posonly\\\":[],\\\"vararg\\\":null},\\\"produce\\\":{\\\"args\\\":[\\\"job\\\",\\\"work\\\",\\\"tools\\\",\\\"guard\\\",\\\"seconds\\\"],\\\"defaults\\\":1,\\\"kw_defaults\\\":[],\\\"kwarg\\\":null,\\\"kwonly\\\":[],\\\"posonly\\\":[],\\\"vararg\\\":null},\\\"validate_job\\\":{\\\"args\\\":[\\\"job\\\",\\\"now\\\"],\\\"defaults\\\":0,\\\"kw_defaults\\\":[],\\\"kwarg\\\":null,\\\"kwonly\\\":[],\\\"posonly\\\":[],\\\"vararg\\\":null}},\\\"pve270\\\":{\\\"capture_archive\\\":{\\\"args\\\":[\\\"argv\\\",\\\"destination\\\",\\\"cap\\\",\\\"seconds\\\",\\\"check\\\"],\\\"defaults\\\":0,\\\"kw_defaults\\\":[],\\\"kwarg\\\":null,\\\"kwonly\\\":[],\\\"posonly\\\":[],\\\"vararg\\\":null},\\\"live_gate\\\":{\\\"args\\\":[\\\"job\\\",\\\"pvesh_path\\\",\\\"pvesh_sha\\\"],\\\"defaults\\\":0,\\\"kw_defaults\\\":[],\\\"kwarg\\\":null,\\\"kwonly\\\":[],\\\"posonly\\\":[],\\\"vararg\\\":null},\\\"produce\\\":{\\\"args\\\":[\\\"job\\\",\\\"work\\\",\\\"tools\\\",\\\"gu\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/CONTRACT.json\",\"sha256\":\"a414715f1b91b3701c52073709a80c38218f76e3961618e8af61489211e50c01\",\"size\":2077},{\"hits\":[{\"line\":12,\"text\":\"return {'vmid':i,'type':kind,'node':'pve01','status':'running','template':False}\"},{\"line\":16,\"text\":\"return [{'storage':'local-lvm','type':'lvmthin','active':1,'enabled':1,'avail':100*1024**3}]\"},{\"line\":53,\"text\":\"def test_duplicate_vmid_fails(self):\"},{\"line\":91,\"text\":\"def test_bool_vmid_rejected(self):\"},{\"line\":92,\"text\":\"j=self.job();j['vmid']=True\"},{\"line\":124,\"text\":\"target=self.root/'target';target.write_bytes(b'original');self.dest.symlink_to(target)\"},{\"line\":126,\"text\":\"self.assertEqual(target.read_bytes(),b'original')\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_pve265.py\",\"sha256\":\"16a9407d01bf73db687ef38684c59205fc2e6a9223cd9cee6ec6e8dde9d38707\",\"size\":11781},{\"hits\":[{\"line\":1,\"text\":\"{\\\"all_guest_coverage_eligible\\\":true,\\\"backup_executed\\\":false,\\\"capacity_policy\\\":\\\"four archive copies plus 4GiB; capped producer; actual compressed size still unknown\\\",\\\"collected_at_utc\\\":\\\"2026-09-12T06:57:40.611329+00:00\\\",\\\"full_host_coverage\\\":false,\\\"global_blockers\\\":[],\\\"global_defaults\\\":{\\\"blockers\\\":[],\\\"keys\\\":[],\\\"present\\\":true,\\\"sha256\\\":\\\"cf34c8e3812547954bb1d08b50212b6e148ee9cf2b629e895a843ed49d623b38\\\"},\\\"guest_membership_and_configs_stable\\\":true,\\\"jobs\\\":[{\\\"application_consistency_verified\\\":false,\\\"archive_cap_bytes\\\":9516036916,\\\"blockers\\\":[],\\\"cdrom_count\\\":0,\\\"cdrom_media_included\\\":false,\\\"compression_dependent\\\":false,\\\"config_sha256\\\":\\\"09957aacd41ba9eeaf5fd4eda13936d580c9082a46895433379aa9dd0bad5969\\\",\\\"configured_archive_bound_bytes\\\":9516036916,\\\"configured_disk_bytes\\\":8589934592,\\\"configured_full_cycle_fits\\\":true,\\\"coverage_eligible\\\":true,\\\"disks\\\":[{\\\"backup_setting\\\":\\\"included_default_rootfs\\\",\\\"class\\\":\\\"managed-volume\\\",\\\"configured_size_bytes\\\":8589934592,\\\"slot\\\":\\\"rootfs\\\",\\\"storage\\\":\\\"local-lvm\\\"}],\\\"global_defaults_sha256\\\":\\\"cf34c8e3812547954bb1d08b50212b6e148ee9cf2b629e895a843ed49d623b38\\\",\\\"guest_restore_verified\\\":false,\\\"hookscript_present\\\":false,\\\"local_reserve_bytes\\\":4294967296,\\\"lock_present\\\":false,\\\"node\\\":\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/PLAN265_REFERENCE.json\",\"sha256\":\"8d36e82080be93a8c929a9211191fa868166b9e7b6152c4c7689fa52b6720757\",\"size\":7210},{\"hits\":[{\"line\":14,\"text\":\"rows=[{'vmid':110,'type':'lxc','node':'pve01','status':'running','maxdisk':8*G},\"},{\"line\":15,\"text\":\"{'vmid':171,'type':'qemu','node':'pve01','status':'running','maxdisk':120*G}]\"},{\"line\":17,\"text\":\"z=p.make_plan(rows,cfg,[{'storage':'local-lvm','type':'lvmthin','active':1,'enabled':1,'avail':200*G,'total':1000*G,'used':800*G}],b'# empty\\\\n',280*G,NOW)\"},{\"line\":62,\"text\":\"def test_minimal_lxc_selected(self):self.assertEqual(g.choose(plan(),NOW)['vmid'],110)\"},{\"line\":87,\"text\":\"def test_duplicate_vmid_rejected(self):\"},{\"line\":112,\"text\":\"def test_unknown_task_on_target_blocks(self):\"},{\"line\":127,\"text\":\"'vmid':110,'node':'pve01','type':'lxc','producer_rc':0,'config_sha256':job['config_sha256'],'compression_test_ok':True}\"},{\"line\":134,\"text\":\"self.assertEqual(len(self.ro.listed),13);self.assertEqual(z['vmid'],110)\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_guest266.py\",\"sha256\":\"460b950924a475ce0a28dc759512e7dbe2323ae2cc42f7ef4c6181710a2a13da\",\"size\":10752},{\"hits\":[{\"line\":21,\"text\":\"TARGET_VMID=112\"},{\"line\":23,\"text\":\"def require_target(job,expected_config):\"},{\"line\":24,\"text\":\"need(type(job) is dict and type(job.get('vmid')) is int and job['vmid']==TARGET_VMID and\"},{\"line\":31,\"text\":\"by_id={j['vmid']:j for j in previous}\"},{\"line\":32,\"text\":\"need(TARGET_VMID in by_id,'CT112_MISSING_FROM_ACCEPTED265')\"},{\"line\":33,\"text\":\"g.same_state(baseline,current,TARGET_VMID)\"},{\"line\":34,\"text\":\"need({j['vmid'] for j in rows}==set(by_id),'ACCEPTED265_MEMBERSHIP_CHANGED')\"},{\"line\":36,\"text\":\"need(row['config_sha256']==by_id[row['vmid']]['config_sha256'],'ACCEPTED265_GUEST_CONFIG_CHANGED')\"},{\"line\":37,\"text\":\"selected=[j for j in rows if j['vmid']==TARGET_VMID]\"},{\"line\":48,\"text\":\"need(st.get('active') is True and st.get('enabled') is True and st.get('type') in ('lvmthin','zfspool'),'SNAPSHOT_STORAGE_UNAVAILABLE')\"},{\"line\":50,\"text\":\"require_target(job,by_id[TARGET_VMID]['config_sha256'])\"},{\"line\":54,\"text\":\"require_target(job,expected_config)\"},{\"line\":67,\"text\":\"require_target(job,expected_config)\"},{\"line\":92,\"text\":\"return {**result,'path':str(dest),'vmid':112,'type':'lxc','node':job['node'],'config_sha256':job['config_sha256'],\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/pve282.py\",\"sha256\":\"73c6cb7773eb8e82d1e7ed5ab4733b4afb88f74ae69c09125d0378d6e480e012\",\"size\":6195},{\"hits\":[{\"line\":17,\"text\":\"rows=[{'vmid':v,'type':'lxc' if v in (110,112) else 'qemu','node':'pve01','status':'running','maxdisk':8*G} for v in (110,112,150)]\"},{\"line\":19,\"text\":\"z=p.make_plan(rows,configs,[{'storage':'local-lvm','type':'lvmthin','active':1,'enabled':1,'avail':200*G,'total':1000*G,'used':800*G}],b'# empty\\\\n',280*G,now)\"},{\"line\":28,\"text\":\"def test_selects_only112(self):self.assertEqual(f.select112(plan(),plan(),NOW)['vmid'],112)\"},{\"line\":33,\"text\":\"b=copy.deepcopy(a);self.assertEqual(f.select112(a,b,NOW)['vmid'],112)\"},{\"line\":55,\"text\":\"def test_target_guard_rejects110(self):\"},{\"line\":57,\"text\":\"with self.assertRaises(ValueError):f.require_target(j,j['config_sha256'])\"},{\"line\":58,\"text\":\"def test_target_guard_rejects_unpinned(self):\"},{\"line\":60,\"text\":\"with self.assertRaises(ValueError):f.require_target(j,'f'*64)\"},{\"line\":61,\"text\":\"def test_target_guard_rejects_missing_pin(self):\"},{\"line\":62,\"text\":\"with self.assertRaises(ValueError):f.require_target(plan()['jobs'][1],None)\"},{\"line\":63,\"text\":\"def test_target_guard_accepts112(self):\"},{\"line\":64,\"text\":\"j=plan()['jobs'][1];self.assertTrue(f.require_target(j,j['config_sha256']))\"},{\"line\":65,\"text\":\"def test_marker_scope_ct112_only(self):self.assertEqual(f.TARGET_VMID,112)\"},{\"line\":75,\"text\":\"return {'path':str(out),'size':len(self.data),'sha256':t.sha(self.data),'identity':list(identity),'vmid':112,'node':'pve01','type':'lxc','producer_rc':0,'config_sha256':j['config_sha256'],'compression_test_ok':True}\"},{\"line\":78,\"text\":\"z=self.go();self.assertEqual(z['vmid'],112);self.assertEqual(len({a['account_id'] for a in z['replicas']}),2);self.assertEqual(z['local_payload_files_remaining'],0);self.assertEqual(len(self.reader.listed),13);self.assertFalse(z['guest_restore_verified']);self.assertTrue(z['archive_cloud_restore_verified'])\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/test_pve282.py\",\"sha256\":\"1056407aab76e17181b05e043cb42c086058545a8e0027689ab4e03eee6531c4\",\"size\":5785},{\"hits\":[{\"line\":21,\"text\":\"t.need(all(type(j) is dict and type(j.get('vmid')) is int for j in rows),'PLAN_ROW_SCHEMA')\"},{\"line\":22,\"text\":\"t.need(len({j['vmid'] for j in rows})==len(rows),'PLAN_DUPLICATE_GUEST')\"},{\"line\":40,\"text\":\"chosen=min(candidates,key=lambda j:(j['configured_disk_bytes'],j['vmid']))\"},{\"line\":43,\"text\":\"t.need(st.get('active') is True and st.get('enabled') is True and st.get('type') in ('lvmthin','zfspool'),'SNAPSHOT_STORAGE_UNAVAILABLE')\"},{\"line\":47,\"text\":\"def same_state(before,after,vmid):\"},{\"line\":49,\"text\":\"membership=lambda rows:sorted((x['vmid'],x['type'],x['node'],x['status'],x['template']) for x in rows)\"},{\"line\":52,\"text\":\"matches=[j for j in new if j['vmid']==vmid];original=[j for j in old if j['vmid']==vmid]\"},{\"line\":59,\"text\":\"def no_active_tasks(rows,vmid):\"},{\"line\":65,\"text\":\"kind=task['type'];target=str(task.get('id',''))\"},{\"line\":67,\"text\":\"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')\"},{\"line\":71,\"text\":\"expected=Path(work)/('guest-%d.tar.zst'%job['vmid'])\"},{\"line\":73,\"text\":\"for k in ('vmid','node','type','config_sha256'):t.need(result.get(k)==job[k],'PRODUCER_IDENTITY_MISMATCH')\"},{\"line\":96,\"text\":\"logical='guest-%s-%s-%d'%(job['node'],job['type'],job['vmid'])\"},{\"line\":107,\"text\":\"return {'state':'SINGLE_GUEST_ARCHIVE_SEALED_AND_CLOUD_RECONSTRUCTED','vmid':job['vmid'],'type':job['type'],'node':job['node'],\"},{\"line\":108,\"text\":\"'generation':generation,'logical_id':logical,'manifest_sha256':mh,'payload_bytes':produced['size'],'payload_sha256':produced['sha256'],\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/guest266.py\",\"sha256\":\"86433bc424d5fa5017c20f7a237c82874b02357a3283660d8a6b0039ef2bc868\",\"size\":7385},{\"hits\":[{\"line\":40,\"text\":\"need(job.get('vmid')==110 and job.get('type')=='lxc' and job.get('node')=='pve01' and job.get('config_sha256')==EXPECTED_CFG,'ONLY_ACCEPTED_CT110')\"},{\"line\":238,\"text\":\"need(type(seconds) in (int,float) and 0<seconds<=86400,'DEADLINE')\"},{\"line\":294,\"text\":\"need(job.get('vmid')==110 and job.get('type')=='lxc' and job.get('config_sha256')==EXPECTED_CFG,'ONLY_ACCEPTED_CT110')\"},{\"line\":319,\"text\":\"return {**result,'path':str(dest),'vmid':110,'type':'lxc','node':job['node'],'config_sha256':job['config_sha256'],\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/pve270.py\",\"sha256\":\"97015277a4f3f8129c0fd11eb70c06293026366f1f8232a97feeed513a2dbcef\",\"size\":19595},{\"hits\":[{\"line\":236,\"text\":\"def pipeline(work,files,entries,cloud,generation,logical_id,reserve,guard,clock=lambda:int(time.time())):\"},{\"line\":239,\"text\":\"need(core.valid_name(generation) and core.valid_name(logical_id),'GENERATION_ID')\"},{\"line\":250,\"text\":\"m=core.make_manifest(generation,logical_id,payload_len,payload_sha,parts,alloc)\"},{\"line\":276,\"text\":\"seal={'schema_version':2,'state':'SEALED','generation':generation,'logical_id':logical_id,\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411/transport261.py\",\"sha256\":\"b9b92f957bf441cb5d1702f4881897328e6c0338f8c3f6d41d27d9a349b37688\",\"size\":15364},{\"hits\":[{\"line\":26,\"text\":\"node=raw.get('node'); vmid=raw.get('vmid'); scratch=raw.get('scratch'); now=raw.get('now')\"},{\"line\":27,\"text\":\"if type(node) is not str or type(vmid) is not int or type(scratch) is not str or type(now) is not int: fail('INPUT_FIELDS')\"},{\"line\":31,\"text\":\"jobs=[j for j in plan['jobs'] if j.get('vmid')==vmid]\"},{\"line\":37,\"text\":\"guest266.no_active_tasks(raw.get('tasks'),vmid)\"},{\"line\":39,\"text\":\"keep=('vmid','type','node','status','template','config_sha256','disks','configured_disk_bytes','configured_archive_bound_bytes','archive_cap_bytes','global_defaults_sha256','blockers','coverage_eligible')\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/fresh_lxc_helper.py\",\"sha256\":\"dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011\",\"size\":2320},{\"hits\":[{\"line\":17,\"text\":\"def _select_qemu_outputs(vmid,files):\"},{\"line\":18,\"text\":\"_need(type(vmid) is int and vmid>0,'QEMU_VMID')\"},{\"line\":21,\"text\":\"pat=re.compile(r'^vzdump-qemu-'+re.escape(str(vmid))+r'-(\\\\d{4}_\\\\d{2}_\\\\d{2}-\\\\d{2}_\\\\d{2}_\\\\d{2})\\\\.vma\\\\.zst$')\"},{\"line\":29,\"text\":\"expected_log=parent/f'vzdump-qemu-{vmid}-{stamp}.log'\"},{\"line\":42,\"text\":\"if t.get('guest_type')!='qemu': return original(t,gen,work)\"},{\"line\":43,\"text\":\"vmid=int(t['vmid']); rows=[r for r in legacy.cluster_inventory() if int(r.get('vmid',-1))==vmid]\"},{\"line\":46,\"text\":\"_need(typ==t.get('guest_type')=='qemu','PVE_GUEST_TYPE_DRIFT')\"},{\"line\":51,\"text\":\"vp=legacy.ssh_remote(node,['vzdump',str(vmid),'--mode','snapshot','--compress','zstd','--dumpdir',srcdir],timeout=7200,check=False)\"},{\"line\":53,\"text\":\"_emit_diag(vmid=vmid,node=node,producer_rc=vp.returncode,stderr_bytes=len(vp.stderr),stderr_sha256=hashlib.sha256(vp.stderr).hexdigest(),archive_selected=False)\"},{\"line\":58,\"text\":\"try: src,log=_select_qemu_outputs(vmid,files)\"},{\"line\":60,\"text\":\"_emit_diag(vmid=vmid,node=node,producer_rc=0,regular_file_count=len(files),archive_selected=False,selector_error=str(e))\"},{\"line\":71,\"text\":\"_emit_diag(vmid=vmid,node=node,producer_rc=0,regular_file_count=len(files),sidecar_count=1 if log else 0,archive_bytes=size,archive_selected=True)\"},{\"line\":75,\"text\":\"meta={'generation':gen,'source_class':'pve_guest','vmid':vmid,'guest_type':'qemu','node':node,'status':row.get('status'),\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"sha256\":\"1906db42bd34bbe85eb46fd9797b3572d46e0a41c29d1c29be5f9df5e448f15b\",\"size\":4627},{\"hits\":[{\"line\":47,\"text\":\"if not (type(seconds) is int and 0<seconds<=86400): fail('SECONDS')\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/producer_exec_helper.py\",\"sha256\":\"b3b97099bcd7126670f866e81faae6a42a96d869d9989e6a67f6ea6c871c90b3\",\"size\":3449},{\"hits\":[{\"line\":43,\"text\":\"def _wire(wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,base=BASE):\"},{\"line\":62,\"text\":\"required=('capture_pve_guest','backup_target','load_targets','cluster_inventory','ssh_remote',\"},{\"line\":64,\"text\":\"'choose_due_target','write_state','epoch')\"},{\"line\":78,\"text\":\"scheduler_wired=scheduler_adapter.bind(proxy,g['choose_due_target'],g['write_state'])\"},{\"line\":79,\"text\":\"if g.get('choose_due_target') is not scheduler_wired['choose_due_target'] or g.get('write_state') is not scheduler_wired['write_state']:\"},{\"line\":80,\"text\":\"raise RuntimeError('SCHEDULER_ADAPTER_BIND_RESULT')\"},{\"line\":81,\"text\":\"return {'legacy_globals':g,'legacy':proxy,'original_capture':original,'qemu_patched_capture':qemu_patched,'patched_capture':patched,'scheduler_wired':scheduler_wired}\"},{\"line\":93,\"text\":\"scheduler_adapter=importlib.import_module('scheduler_adapter')\"},{\"line\":96,\"text\":\"wired=_wire(wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,BASE)\"},{\"line\":97,\"text\":\"return wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,wired\"},{\"line\":99,\"text\":\"def _target(wrapper,lid):\"},{\"line\":100,\"text\":\"rows=wrapper.load_targets(); hits=[x for x in rows if x.get('logical_id')==lid]\"},{\"line\":101,\"text\":\"if len(hits)!=1: raise RuntimeError('TARGET_CARDINALITY')\"},{\"line\":105,\"text\":\"wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,wired=_load()\"},{\"line\":108,\"text\":\"if wired['legacy_globals'].get('choose_due_target') is not wired['scheduler_wired']['choose_due_target']:\"},{\"line\":109,\"text\":\"raise RuntimeError('SCHEDULER_CHOOSE_BINDING')\"},{\"line\":110,\"text\":\"if wired['legacy_globals'].get('write_state') is not wired['scheduler_wired']['write_state']:\"},{\"line\":111,\"text\":\"raise RuntimeError('SCHEDULER_WRITE_BINDING')\"},{\"line\":112,\"text\":\"if [scheduler_adapter.backoff_seconds(n) for n in range(1,7)]!=[1800,3600,7200,14400,21600,21600]:\"},{\"line\":113,\"text\":\"raise RuntimeError('SCHEDULER_BACKOFF_CONTRACT')\"},{\"line\":114,\"text\":\"if not callable(wrapper.backup_target) or not callable(wrapper.main) or not callable(wrapper.load_targets):\"},{\"line\":123,\"text\":\"wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,wired=_load()\"},{\"line\":125,\"text\":\"if argv==['scheduler-proof']:\"},{\"line\":129,\"text\":\"if old_root is None or not callable(old_epoch): raise RuntimeError('SCHEDULER_PROOF_BASE')\"},{\"line\":132,\"text\":\"with tempfile.TemporaryDirectory(prefix='homelab-scheduler-proof-',dir='/run') as td:\"},{\"line\":141,\"text\":\"targets=[{'logical_id':'proof-a','enabled':True,'due_seconds':100},{'logical_id':'proof-b','enabled':True,'due_seconds':100}]\"},{\"line\":142,\"text\":\"first=legacy.choose_due_target(targets,state,now[0])\"},{\"line\":143,\"text\":\"if not isinstance(first,dict) or first.get('logical_id')!='proof-b': raise RuntimeError('SCHEDULER_PROOF_PEER_NOT_SELECTED')\"},{\"line\":146,\"text\":\"raise RuntimeError('SCHEDULER_PROOF_FAILURE_STATE')\"},{\"line\":148,\"text\":\"second=legacy.choose_due_target(targets,legacy.load_state_all(),now[0])\"},{\"line\":149,\"text\":\"if not isinstance(second,dict) or second.get('logical_id')!='proof-a': raise RuntimeError('SCHEDULER_PROOF_RETRY_NOT_REELIGIBLE')\"},{\"line\":153,\"text\":\"raise RuntimeError('SCHEDULER_PROOF_SUCCESS_RESET')\"},{\"line\":154,\"text\":\"proof={'failed_target':'proof-a','peer_selected_during_backoff':first['logical_id'],'retry_after_epoch':retry,'last_success_preserved':preserved==1000,'retry_target_after_backoff':second['logical_id'],'success_resets_failures':True,'production_state_root_used':False}\"},{\"line\":155,\"text\":\"print('SCHEDULER_FAILURE_ISOLATION_PROOF='+json.dumps(proof,separators=(',',':'),sort_keys=True),flush=True)\"},{\"line\":159,\"text\":\"if argv==['scheduler-select-live']:\"},{\"line\":160,\"text\":\"state=legacy.load_state_all(); targets=wrapper.load_targets()\"},{\"line\":161,\"text\":\"chosen=legacy.choose_due_target(targets,state)\"},{\"line\":163,\"text\":\"print('SCHEDULER_LIVE_SELECTION=DEFER_NO_DUE_TARGET',flush=True)\"},{\"line\":165,\"text\":\"print('SCHEDULER_LIVE_SELECTION='+json.dumps({'logical_id':chosen.get('logical_id'),'due_seconds':chosen.get('due_seconds'),'enabled':chosen.get('enabled') is True},separators=(',',':'),sort_keys=True),flush=True)\"},{\"line\":168,\"text\":\"t=_target(wrapper,argv[1])\"},{\"line\":169,\"text\":\"if t.get('guest_type')!='lxc' or t.get('logical_id')=='guest-pve01-lxc-112':\"},{\"line\":170,\"text\":\"raise RuntimeError('PLAN_TARGET_NOT_LEGACY_LXC')\"},{\"line\":172,\"text\":\"print('PLAN_LXC_RESULT='+json.dumps({'logical_id':t['logical_id'],'vmid':int(t['vmid']),'node':out['job']['node'],'job':out['job']},separators=(',',':'),sort_keys=True),flush=True)\"},{\"line\":174,\"text\":\"if len(argv)==2 and argv[0]=='verify-target':\"},{\"line\":175,\"text\":\"t=_target(wrapper,argv[1])\"},{\"line\":176,\"text\":\"if t.get('logical_id')=='guest-pve01-lxc-112':\"},{\"line\":179,\"text\":\"out=wrapper.backup_target(t,True)\"},{\"line\":181,\"text\":\"print('VERIFY_TARGET_RESULT=FAIL',flush=True)\"},{\"line\":182,\"text\":\"print('VERIFY_TARGET_REASON='+str(e.code),flush=True)\"},{\"line\":184,\"text\":\"print('VERIFY_TARGET_RESULT='+json.dumps(out,separators=(',',':'),sort_keys=True),flush=True)\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"sha256\":\"ca6876fa9c3b1465b045344a8ad46962de16972c7dadc4ac6257c7d225047793\",\"size\":10566},{\"hits\":[{\"line\":41,\"text\":\"def _live_inputs(legacy,node,vmid,scratch):\"},{\"line\":50,\"text\":\"try: rid=int(r.get('vmid'))\"},{\"line\":51,\"text\":\"except Exception: raise AdapterError('RESOURCE_VMID')\"},{\"line\":62,\"text\":\"return {'node':node,'vmid':vmid,'scratch':scratch,'now':int(time.time()),'rows':rows,'storage_rows':stores,'configs':configs,\"},{\"line\":80,\"text\":\"vmid=int(t['vmid']); rows=[r for r in legacy.cluster_inventory() if int(r.get('vmid',-1))==vmid]\"},{\"line\":83,\"text\":\"_need(typ==t.get('guest_type')=='lxc','PVE_GUEST_TYPE_DRIFT')\"},{\"line\":84,\"text\":\"legacy._default_unprivileged_lxc(node,vmid)\"},{\"line\":85,\"text\":\"a=_helper(_live_inputs(legacy,node,vmid,scratch)); b=_helper(_live_inputs(legacy,node,vmid,scratch))\"},{\"line\":192,\"text\":\"if t.get('guest_type')!='lxc': return original(t,gen,work)\"},{\"line\":193,\"text\":\"vmid=int(t['vmid']); rows=[r for r in legacy.cluster_inventory() if int(r.get('vmid',-1))==vmid]\"},{\"line\":196,\"text\":\"_need(typ==t.get('guest_type')=='lxc','PVE_GUEST_TYPE_DRIFT')\"},{\"line\":197,\"text\":\"legacy._default_unprivileged_lxc(node,vmid)\"},{\"line\":215,\"text\":\"meta={'generation':gen,'source_class':'pve_guest','vmid':vmid,'guest_type':'lxc','node':node,'status':row.get('status'),\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/lxc_adapter.py\",\"sha256\":\"3fa7d194010d76f7c8bc95035ae8876262e9337903e310f45f45df88c266dc8d\",\"size\":13825},{\"hits\":[{\"line\":7,\"text\":\"class SchedulerAdapterError(RuntimeError): pass\"},{\"line\":10,\"text\":\"if not ok: raise SchedulerAdapterError(code)\"},{\"line\":23,\"text\":\"def _read_prior(legacy,logical_id):\"},{\"line\":25,\"text\":\"p=root/(str(logical_id)+'.json')\"},{\"line\":55,\"text\":\"def choose_due_target(targets,state,now=None):\"},{\"line\":57,\"text\":\"_need(isinstance(targets,list) and isinstance(state,dict),'SCHEDULER_INPUT_SCHEMA')\"},{\"line\":59,\"text\":\"for order,t in enumerate(targets):\"},{\"line\":60,\"text\":\"if not isinstance(t,dict) or t.get('enabled') is not True: continue\"},{\"line\":61,\"text\":\"lid=t.get('logical_id'); seconds=_as_nonneg_int(t.get('due_seconds'),0)\"},{\"line\":62,\"text\":\"_need(isinstance(lid,str) and lid and seconds>0,'SCHEDULER_TARGET_SCHEMA')\"},{\"line\":75,\"text\":\"def write_state(logical_id,result,**kw):\"},{\"line\":77,\"text\":\"prior=_read_prior(legacy,logical_id)\"},{\"line\":81,\"text\":\"return original_write(logical_id,result,**clean)\"},{\"line\":88,\"text\":\"return original_write(logical_id,result,**clean)\"},{\"line\":90,\"text\":\"legacy.choose_due_target=choose_due_target\"},{\"line\":92,\"text\":\"return {'choose_due_target':choose_due_target,'write_state':write_state,\"}],\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"sha256\":\"a6f67159a64067773323f028126e3109e15cf17a8142cea5e6129970f1d4da96\",\"size\":4097}]\nRPO_SCHEDULER_POLICY_MISMATCH=[{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"ct112\",\"vmid\":112},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"guest-pve01-lxc-112\",\"vmid\":112},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"ct113\",\"vmid\":113},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"vm130\",\"vmid\":130},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"vm150\",\"vmid\":150},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"vm160\",\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"xf-codevipe\",\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"xf-dsmods\",\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"xf-kingofwolk\",\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"xf-gamevipe\",\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"xf-hkmods\",\"vmid\":160},{\"due_seconds\":86400,\"enabled\":true,\"logical_id\":\"xf-zakrutim\",\"vmid\":160}]\nDECISION=TARGET_CARDINALITY_OR_MODEL_DRIFT\nNO_MUTATION=true\nTASK_RESULT=PASS_HOMELAB_BACKUP_DUE_POLICY_SOURCE_RCA_READONLY\nHOMELAB_RESULT_CONTRACT={\"changes_made\":false,\"command_id\":\"SUPPORT-260921-HOMELAB-BACKUP-DUE-POLICY-SOURCE-RCA-READONLY-1105R1\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\nWORKERS2_DUE_POLICY_SOURCE_RCA_END=1\n"
}