CHAT_OUTPUT_BEGIN
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
REFERENCE_REGISTER_CHECK=OK
REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66
ERROR_REGISTER_CHECK=OK
ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0
COMMAND_SHA256=1cadad9a6c87f4c1dde8d879a103f7f85e6d2cdaa3f513448c7045a73e90beb4
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=a5f6bceb256d00dacd3d15ee23e2f737b60089e6232680050e589a1f84edc3c2
SANITIZED_OUTPUT_SHA256=a5f6bceb256d00dacd3d15ee23e2f737b60089e6232680050e589a1f84edc3c2
OUTPUT_BEGIN
WORKERS2_DUE_POLICY_SOURCE_RCA_BEGIN=1
COMMAND_ID=SUPPORT-260921-HOMELAB-BACKUP-DUE-POLICY-SOURCE-RCA-READONLY-1105R1
MODE=read-only
COMPONENT=homelab-backup-due-policy-source-rca
MUTATION_BOUNDARY=READ_ONLY_NO_BACKUP_NO_SERVICE_START_NO_TIMER_CHANGE_NO_LOCK_BREAK_NO_FILE_WRITE_OUTSIDE_TMP_NO_GIT_WRITE
IDENTITIES={"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"}}
SELFTEST_REPLACEMENT486=PASS
LIVE_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}]
SELECTED_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}]
CURRENT_SCHEDULER_SELECTION_ERROR=AttributeError:module 'wrapper' has no attribute 'load_state_all'
LIVE_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'],"}]
DUE_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}]
RPO_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}]
DECISION=TARGET_CARDINALITY_OR_MODEL_DRIFT
NO_MUTATION=true
TASK_RESULT=PASS_HOMELAB_BACKUP_DUE_POLICY_SOURCE_RCA_READONLY
HOMELAB_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}
WORKERS2_DUE_POLICY_SOURCE_RCA_END=1

OUTPUT_END
CHAT_OUTPUT_END
