diff --git a/runtime/history/SUPPORT-261008-CT112-GUEST266-EXPORT-CONTRACT-99809R1.json b/runtime/history/SUPPORT-261008-CT112-GUEST266-EXPORT-CONTRACT-99809R1.json new file mode 100644 index 00000000..f4d9395c --- /dev/null +++ b/runtime/history/SUPPORT-261008-CT112-GUEST266-EXPORT-CONTRACT-99809R1.json @@ -0,0 +1,38 @@ +{ + "schema_version": 1, + "channel": "homelab-runtime", + "command_id": "SUPPORT-261008-CT112-GUEST266-EXPORT-CONTRACT-99809R1", + "status": "OK", + "rc": 0, + "host": "pve01", + "mode": "read-only", + "component": "ct112-guest266-export-contract", + "started_at_utc": "2026-10-07T23:11:17Z", + "finished_at_utc": "2026-10-07T23:11:17Z", + "reference_register_checked": true, + "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", + "error_register_checked": true, + "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", + "command_sha256": "a46085eebf3b7c5742b5140bab6f8c366fbcfe6223bdbc80334bc207f20093be", + "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": "ebe1d110b44088c3b07192ed81a9f3ea97ea0bf15a47456fd73bc4f7a4c1d6ad", + "sanitized_output_sha256": "ebe1d110b44088c3b07192ed81a9f3ea97ea0bf15a47456fd73bc4f7a4c1d6ad", + "output_truncated_in_json": false, + "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", + "output": "CT112_GUEST266_EXPORT_CONTRACT=V1\nMODE=read-only\nNO_MUTATION=true\nBACKUP_V2_ACTIVE=inactive\nBACKUP_V2_RESULT=success\nBACKUP_V2_TIMER_ACTIVE=active\nBACKUP_AUDIT=SUMMARY|AUDIT_STATUS=OK|BACKUP_STATUS=GREEN|ACTIVE_COUNT=15|ISSUE_COUNT=0|CLOUD_A=OK|CLOUD_B=OK|CLOUD_B_DRILL=OK|DR_PROVEN=YES|SOURCE_OFFHOST=OK\nWRAPPER_EXACT_COUNT=1\nWRAPPER_LEGACY_HASH_MATCH=true\nWRAPPER_HANDLER_HASH_MATCH=true\nGUEST266_PRESENT=true\nGUEST266_HASH_MATCH=true\nGUEST266_TOPLEVEL_FUNCTION_COUNT=6\nGUEST266_TOPLEVEL_FUNCTION_NAMES=plan_rows,choose,same_state,no_active_tasks,check_result,run_flow\nGUEST266_HAS_DUMP_ARGV=false\nREC|GUEST266_EXPORT_1_NAME=plan_rows\nREC|GUEST266_EXPORT_1_ARGS=plan\nREC|GUEST266_EXPORT_1_KWONLY_ARGS=\nREC|GUEST266_EXPORT_1_STAR=NONE\nREC|GUEST266_EXPORT_1_DOUBLESTAR=NONE\nREC|GUEST266_EXPORT_1_POSITIONAL_COUNT=1\nREC|GUEST266_EXPORT_1_REQUIRED_POSITIONALS=1\nREC|GUEST266_EXPORT_1_BODY_NODE_COUNT=7\nREC|GUEST266_EXPORT_1_CALL_NAMES=all,get,len,need,type\nREC|GUEST266_EXPORT_1_RETURN_FORMS=Name\nREC|GUEST266_EXPORT_1_SAFE_AST_SHA256=b7c8f2b5848d56e29ca7041ae051160bfb07903b4215ad81f61c73bec8bb2ff7\nREC|GUEST266_EXPORT_1_SAFE_AST_OUTLINE=def plan_rows(plan): || t.need(type(plan) is dict and plan.get('') == '', '') || rows = plan.get('') || t.need(type(rows) is list and 0 < len(rows) <= 0 and (plan.get('') == len(rows)), '') || t.need(all((type(j) is dict and type(j.get('')) is int for j in rows)), '') || t.need(len({j[''] for j in rows}) == len(rows), '') || t.need(plan.get('') is 0, '') || return rows\nREC|GUEST266_EXPORT_2_NAME=choose\nREC|GUEST266_EXPORT_2_ARGS=plan,now\nREC|GUEST266_EXPORT_2_KWONLY_ARGS=\nREC|GUEST266_EXPORT_2_STAR=NONE\nREC|GUEST266_EXPORT_2_DOUBLESTAR=NONE\nREC|GUEST266_EXPORT_2_POSITIONAL_COUNT=2\nREC|GUEST266_EXPORT_2_REQUIRED_POSITIONALS=2\nREC|GUEST266_EXPORT_2_BODY_NODE_COUNT=12\nREC|GUEST266_EXPORT_2_CALL_NAMES=append,bool,deepcopy,get,len,max,min,need,plan_rows,type,validate_job\nREC|GUEST266_EXPORT_2_RETURN_FORMS=Call\nREC|GUEST266_EXPORT_2_SAFE_AST_SHA256=d32af9764f3f95d11e56cd5edcc20460424a0e8642527c9ab88e9dc187541ba1\nREC|GUEST266_EXPORT_2_SAFE_AST_OUTLINE=def choose(plan, now): || rows = plan_rows(plan) || t.need(plan.get('') == [], '') || candidates = [] || for job in rows: || if not (job.get('') == '' and job.get('') is 0 and (job.get('') == []) and (job.get('') is 0) and (job.get('') is 0)): || continue || disks = job.get('') || if not (type(disks) is list and len(disks) == 0 and (disks[0].get('') == '') and (disks[0].get('') == '') and (disks[0].get('') in ('', ''))): || continue || n = job.get('') || if type(n) is not int or not 0 < n <= MAX_CONFIGURED_BYTES: || continue || producer.validate_job(job, now) || candidates.append(job) || t.\nREC|GUEST266_EXPORT_3_NAME=same_state\nREC|GUEST266_EXPORT_3_ARGS=before,after,vmid\nREC|GUEST266_EXPORT_3_KWONLY_ARGS=\nREC|GUEST266_EXPORT_3_STAR=NONE\nREC|GUEST266_EXPORT_3_DOUBLESTAR=NONE\nREC|GUEST266_EXPORT_3_POSITIONAL_COUNT=3\nREC|GUEST266_EXPORT_3_REQUIRED_POSITIONALS=3\nREC|GUEST266_EXPORT_3_BODY_NODE_COUNT=11\nREC|GUEST266_EXPORT_3_CALL_NAMES=get,len,membership,need,plan_rows,sorted\nREC|GUEST266_EXPORT_3_RETURN_FORMS=\nREC|GUEST266_EXPORT_3_SAFE_AST_SHA256=110c3ba42ad1540052bdff8e242d2feb26b25c39784fe1a9094c24e2b2bf4dc2\nREC|GUEST266_EXPORT_3_SAFE_AST_OUTLINE=def same_state(before, after, vmid): || old = plan_rows(before) || new = plan_rows(after) || membership = lambda rows: sorted(((x[''], x[''], x[''], x[''], x['']) for x in rows)) || t.need(membership(old) == membership(new), '') || t.need(before[''] == after[''], '') || matches = [j for j in new if j[''] == vmid] || original = [j for j in old if j[''] == vmid] || t.need(len(matches) == len(original) == 0, '') || a, b = (original[0], matches[0]) || t.need(b.get('') is 0 and b.get('') == [], '') || for key in ('', '', '', '', '', '', ''): || t.need(a.get(key) == b.get(key), '')\nREC|GUEST266_EXPORT_4_NAME=no_active_tasks\nREC|GUEST266_EXPORT_4_ARGS=rows,vmid\nREC|GUEST266_EXPORT_4_KWONLY_ARGS=\nREC|GUEST266_EXPORT_4_STAR=NONE\nREC|GUEST266_EXPORT_4_DOUBLESTAR=NONE\nREC|GUEST266_EXPORT_4_POSITIONAL_COUNT=2\nREC|GUEST266_EXPORT_4_REQUIRED_POSITIONALS=2\nREC|GUEST266_EXPORT_4_BODY_NODE_COUNT=2\nREC|GUEST266_EXPORT_4_CALL_NAMES=any,get,len,lower,need,str,type\nREC|GUEST266_EXPORT_4_RETURN_FORMS=\nREC|GUEST266_EXPORT_4_SAFE_AST_SHA256=81205d76854dcb627897e5d8bd82b5a49468a07f8921861e87f712f1994b804e\nREC|GUEST266_EXPORT_4_SAFE_AST_OUTLINE=def no_active_tasks(rows, vmid): || t.need(type(rows) is list and len(rows) < 0, '') || for task in rows: || t.need(type(task) is dict and type(task.get('')) is str, '') || if type(task.get('')) is int and task.get('') not in (None, ''): || continue || kind = task[''] || target = str(task.get('', '')) || if kind in ('', '', '', ''): || continue || t.need(target != str(vmid) and (not any((x in kind.lower() for x in ('', '', '', '', '', '', '')))), '')\nREC|GUEST266_EXPORT_5_NAME=check_result\nREC|GUEST266_EXPORT_5_ARGS=result,job,work\nREC|GUEST266_EXPORT_5_KWONLY_ARGS=\nREC|GUEST266_EXPORT_5_STAR=NONE\nREC|GUEST266_EXPORT_5_DOUBLESTAR=NONE\nREC|GUEST266_EXPORT_5_POSITIONAL_COUNT=3\nREC|GUEST266_EXPORT_5_REQUIRED_POSITIONALS=3\nREC|GUEST266_EXPORT_5_BODY_NODE_COUNT=12\nREC|GUEST266_EXPORT_5_CALL_NAMES=Path,close,get,hash_file,list,listdir,need,open_dir,str,type\nREC|GUEST266_EXPORT_5_RETURN_FORMS=Name\nREC|GUEST266_EXPORT_5_SAFE_AST_SHA256=201602f107a661fdbd41a96feda13666bf269e0d4ee11dde9c62aedb78ee0d9e\nREC|GUEST266_EXPORT_5_SAFE_AST_OUTLINE=def check_result(result, job, work): || t.need(type(result) is dict, '') || expected = Path(work) / ('' % job['']) || t.need(result.get('') == str(expected), '') || for k in ('', '', '', ''): || t.need(result.get(k) == job[k], '') || t.need(result.get('') == 0 and result.get('') is 0, '') || t.need(type(result.get('')) is int and 0 < result[''] <= job[''], '') || n, h, identity = stream.hash_file(expected, job['']) || t.need(n == result[''] and h == result.get('') and (list(identity) == result.get('')), '') || temp = Path(work) / '' || fd = t.open_dir(temp) || try: || t.need(os.listdir(fd\nREC|GUEST266_EXPORT_6_NAME=run_flow\nREC|GUEST266_EXPORT_6_ARGS=job,work,entries,cloud,reader,produce,state_guard,guard,compression_check,generation,say,clock\nREC|GUEST266_EXPORT_6_KWONLY_ARGS=\nREC|GUEST266_EXPORT_6_STAR=NONE\nREC|GUEST266_EXPORT_6_DOUBLESTAR=NONE\nREC|GUEST266_EXPORT_6_POSITIONAL_COUNT=12\nREC|GUEST266_EXPORT_6_REQUIRED_POSITIONALS=11\nREC|GUEST266_EXPORT_6_BODY_NODE_COUNT=35\nREC|GUEST266_EXPORT_6_CALL_NAMES=Path,all,callable,canonical_bytes,check_result,cleanup,clock,compression_check,create,discover,get,guard,int,len,make_dir,manifest_hash,need,produce,restore,say,state_guard,time,upload,valid_name,validate_inventory,validate_job\nREC|GUEST266_EXPORT_6_RETURN_FORMS=Dict\nREC|GUEST266_EXPORT_6_SAFE_AST_SHA256=bfd6b773e40f9e89f6777eb01922534012c4c264d67ebc9ed4889091c051893e\nREC|GUEST266_EXPORT_6_SAFE_AST_OUTLINE=def run_flow(job, work, entries, cloud, reader, produce, state_guard, guard, compression_check, generation, say, clock=lambda: int(time.time())): || \"\"\"\"\"\" || producer.validate_job(job, clock()) || core.validate_inventory(entries) || t.need(job[''] == '' and job.get('') is 0, '') || t.need(core.valid_name(generation), '') || t.need(all((callable(f) for f in (produce, state_guard, guard, compression_check, say, clock))), '') || work = Path(work) || state_guard() || guard() || for sub in ('', '', ''): || t.make_dir(work / sub, exclusive=0) || say('', '') || produced = produce(job, work / '') || source = check_result(produced, job, work / '') || state_guard() || \nGUEST266_MODULE_EXPORT_ALIAS_DUMP_ARGV=false\nGUEST266_ALL_CALL_NAMES=Path,all,any,append,bool,callable,canonical_bytes,check_result,cleanup,clock,close,compression_check,create,deepcopy,discover,get,guard,hash_file,int,len,list,listdir,lower,make_dir,manifest_hash,max,membership,min,need,open_dir,plan_rows,produce,restore,say,sorted,state_guard,str,time,type,upload,valid_name,validate_inventory,validate_job\nLEGACY_RELEVANT_FUNCTIONS=_isolated_release_graph_selftest,proven_lxc_dump_argv,selftest\nREC|LEGACY_FUNCTION_1_NAME=_isolated_release_graph_selftest\nREC|LEGACY_FUNCTION_1_ARGS=\nREC|LEGACY_FUNCTION_1_KWONLY_ARGS=\nREC|LEGACY_FUNCTION_1_STAR=NONE\nREC|LEGACY_FUNCTION_1_DOUBLESTAR=NONE\nREC|LEGACY_FUNCTION_1_POSITIONAL_COUNT=0\nREC|LEGACY_FUNCTION_1_REQUIRED_POSITIONALS=0\nREC|LEGACY_FUNCTION_1_BODY_NODE_COUNT=7\nREC|LEGACY_FUNCTION_1_CALL_NAMES=BackupError,Path,_historical_graph_env,get,hexdigest,items,loads,resolve,run,sha256,str\nREC|LEGACY_FUNCTION_1_RETURN_FORMS=Constant\nREC|LEGACY_FUNCTION_1_SAFE_AST_SHA256=d2c89b325fefa61a496a88bdfc83d0c539bcafe0dcc2703c874dc81f54757ead\nREC|LEGACY_FUNCTION_1_SAFE_AST_OUTLINE=def _isolated_release_graph_selftest(): || env = _historical_graph_env() || p = subprocess.run([sys.executable, '', '', _HISTORICAL_HELPER, ''], stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, cwd='', timeout=0) || if p.returncode != 0: || raise BackupError('', f'{p.returncode}{hashlib.sha256(p.stderr).hexdigest()}') || try: || out = json.loads(p.stdout) || except Exception: || raise BackupError('') || expected = {'': str(GUEST266), '': str(P265), '': str(P270), '': str(P282)} || for k, v in expected.items(): || if str(pathlib.Path(out.get(k, '')).resolve()) != str(pathlib.Path(v).resolve()): || raise BackupError('', k) || return 0\nREC|LEGACY_FUNCTION_2_NAME=proven_lxc_dump_argv\nREC|LEGACY_FUNCTION_2_ARGS=t,row,node,scratch\nREC|LEGACY_FUNCTION_2_KWONLY_ARGS=\nREC|LEGACY_FUNCTION_2_STAR=NONE\nREC|LEGACY_FUNCTION_2_DOUBLESTAR=NONE\nREC|LEGACY_FUNCTION_2_POSITIONAL_COUNT=4\nREC|LEGACY_FUNCTION_2_REQUIRED_POSITIONALS=4\nREC|LEGACY_FUNCTION_2_BODY_NODE_COUNT=11\nREC|LEGACY_FUNCTION_2_CALL_NAMES=BackupError,Path,_isolated_guest266_dump_argv,_lxc_job,all,any,index,int,isinstance,len,list,startswith,str,time,type,which\nREC|LEGACY_FUNCTION_2_RETURN_FORMS=Tuple\nREC|LEGACY_FUNCTION_2_SAFE_AST_SHA256=b49d47e03d87aeaeb920aa1759ab55f03bfab1c328294b76b92a739d0562e308\nREC|LEGACY_FUNCTION_2_SAFE_AST_OUTLINE=def proven_lxc_dump_argv(t, row, node, scratch): || job = _lxc_job(t, row, node) || vzdump = shutil.which('') or '' || try: || argv = _isolated_guest266_dump_argv(job, vzdump, pathlib.Path(scratch), int(time.time())) || except BackupError: || raise || except Exception as e: || raise BackupError('', type(e).__name__) || if not isinstance(argv, (list, tuple)) or not argv or (not all((isinstance(x, str) for x in argv))): || raise BackupError('') || argv = list(argv) || if pathlib.Path(argv[0]).name != '' or str(int(t[''])) not in argv: || raise BackupError('') || if '' in argv or any((x.startswith('') for x in argv)): || raise BackupError('') || if not any((x == '' or x.startswith('') for x in argv)): || raise BackupError('') || if str(scratch) not in argv and (not any((x == '' + str(scratch) for x in argv))): || raise BackupError('') || if '' in argv: || i = argv.index('') || if i + 0 >= len(argv) or argv[i + 0] != str(scratch): || raise BackupError('') || elif '' + str(scratch) not in argv: || raise BackupError('') || return (argv, job)\nREC|LEGACY_FUNCTION_3_NAME=selftest\nREC|LEGACY_FUNCTION_3_ARGS=\nREC|LEGACY_FUNCTION_3_KWONLY_ARGS=\nREC|LEGACY_FUNCTION_3_STAR=NONE\nREC|LEGACY_FUNCTION_3_DOUBLESTAR=NONE\nREC|LEGACY_FUNCTION_3_POSITIONAL_COUNT=0\nREC|LEGACY_FUNCTION_3_REQUIRED_POSITIONALS=0\nREC|LEGACY_FUNCTION_3_BODY_NODE_COUNT=11\nREC|LEGACY_FUNCTION_3_CALL_NAMES=_isolated_release_graph_selftest,_pve_dumpdir_spec,default_targets,get,is_file,len,print,proven_lxc_dump_argv\nREC|LEGACY_FUNCTION_3_RETURN_FORMS=Constant\nREC|LEGACY_FUNCTION_3_SAFE_AST_SHA256=e19006ae7f92183d407a7722c74fb733dc0e993b7cc6a361ad891aa33ceb7771\nREC|LEGACY_FUNCTION_3_SAFE_AST_OUTLINE=def selftest(): || assert PART_SIZE == 0 || assert len(REMOTES) == 0 and len({p for _, p in REMOTES}) == 0 || assert len(default_targets()) >= 0 || assert {t[''] for t in default_targets() if t.get('')} == {'', '', '', '', '', '', '', '', ''} || assert _pve_dumpdir_spec('') == (0, 0) || assert _pve_dumpdir_spec('') == (0, 0) || assert GUEST266_SHA == '' || assert P282_SHA == '' || if GUEST266.is_file(): || assert _isolated_release_graph_selftest() is 0 || av, _ = proven_lxc_dump_argv({'': 0}, {'': 0, '': 0, '': '', '': ''}, '', '') || assert '' in av and '' in av and ('' in av) || print('') || return 0\nWRAPPER_SELFTEST_TOKEN=GUEST266_SUBPROCESS_FAILED\nCAPTURED_KNOWN_INLINE_COUNT=2\nMATCHED_FAILING_INLINE_COUNT=1\nINLINE_SOURCE_SHA256=933857fc97556284ece79adfdc9333f8f37852f636f5882efa8382d92a3d24c5\nINLINE_SOURCE_BYTE_LENGTH=774\nINLINE_SAFE_AST_OUTLINE=import importlib, importlib.util, json, pathlib, sys || mode = sys.argv[0] || if mode == '': || out = {} || for name in ('', '', '', ''): || m = importlib.import_module(name) || out[name] = str(pathlib.Path(m.__file__).resolve()) || print(json.dumps(out, sort_keys=0, separators=('', ''))) || elif mode == '': || source = pathlib.Path(sys.argv[0]).resolve() || spec = importlib.util.spec_from_file_location('', str(source)) || if spec is None or spec.loader is None: || raise SystemExit(0) || mod = importlib.util.module_from_spec(spec) || spec.loader.exec_module(mod) || req = json.load(sys.stdin) || argv = mod.dump_argv(req[''], req[''], pathlib.Path(req['']), int(req[''])) || print(json.dumps(argv, separators=('', ''))) || else: || raise SystemExit(0)\nINLINE_DUMP_ARGV_CALL_COUNT=1\nREC|INLINE_CALL|IDX=1|POSITIONALS=4\nREC|INLINE_CALL|IDX=1|KWARGS=\nREC|INLINE_CALL|IDX=1|ARG_FORMS=Subscript,Subscript,Call,Call\nREC|INLINE_CALL|IDX=1|ARG_NAME_HINTS=,,,\nDECISION=PASS_GUEST266_EXPORT_CONTRACT_CAPTURED\nNEXT_GATE=REPAIR_ONLY_VERIFIED_INCOMPATIBLE_GUEST266_INTERFACE\nPROBE_RC=0\nTASK_RESULT=CT112_GUEST266_EXPORT_CONTRACT\nCHANGES_MADE=false\nROLLBACK_STARTED=false\nROLLBACK_RESTORED=null\nMUTATION_OUTCOME=NO_MUTATION\nHOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"SUPPORT-261008-CT112-GUEST266-EXPORT-CONTRACT-99809R1\",\"status\":\"OK\",\"changes_made\":false,\"rollback_started\":false,\"rollback_restored\":null}\n" +} diff --git a/runtime/history/SUPPORT-261008-CT112-GUEST266-EXPORT-CONTRACT-99809R1.txt b/runtime/history/SUPPORT-261008-CT112-GUEST266-EXPORT-CONTRACT-99809R1.txt new file mode 100644 index 00000000..24f58542 --- /dev/null +++ b/runtime/history/SUPPORT-261008-CT112-GUEST266-EXPORT-CONTRACT-99809R1.txt @@ -0,0 +1,178 @@ +CHAT_OUTPUT_BEGIN +COMMAND_ID=SUPPORT-261008-CT112-GUEST266-EXPORT-CONTRACT-99809R1 +STATUS=OK +RC=0 +HOST=pve01 +MODE=read-only +COMPONENT=ct112-guest266-export-contract +REFERENCE_REGISTER_CHECK=OK +REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 +ERROR_REGISTER_CHECK=OK +ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 +COMMAND_SHA256=a46085eebf3b7c5742b5140bab6f8c366fbcfe6223bdbc80334bc207f20093be +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=ebe1d110b44088c3b07192ed81a9f3ea97ea0bf15a47456fd73bc4f7a4c1d6ad +SANITIZED_OUTPUT_SHA256=ebe1d110b44088c3b07192ed81a9f3ea97ea0bf15a47456fd73bc4f7a4c1d6ad +OUTPUT_BEGIN +CT112_GUEST266_EXPORT_CONTRACT=V1 +MODE=read-only +NO_MUTATION=true +BACKUP_V2_ACTIVE=inactive +BACKUP_V2_RESULT=success +BACKUP_V2_TIMER_ACTIVE=active +BACKUP_AUDIT=SUMMARY|AUDIT_STATUS=OK|BACKUP_STATUS=GREEN|ACTIVE_COUNT=15|ISSUE_COUNT=0|CLOUD_A=OK|CLOUD_B=OK|CLOUD_B_DRILL=OK|DR_PROVEN=YES|SOURCE_OFFHOST=OK +WRAPPER_EXACT_COUNT=1 +WRAPPER_LEGACY_HASH_MATCH=true +WRAPPER_HANDLER_HASH_MATCH=true +GUEST266_PRESENT=true +GUEST266_HASH_MATCH=true +GUEST266_TOPLEVEL_FUNCTION_COUNT=6 +GUEST266_TOPLEVEL_FUNCTION_NAMES=plan_rows,choose,same_state,no_active_tasks,check_result,run_flow +GUEST266_HAS_DUMP_ARGV=false +REC|GUEST266_EXPORT_1_NAME=plan_rows +REC|GUEST266_EXPORT_1_ARGS=plan +REC|GUEST266_EXPORT_1_KWONLY_ARGS= +REC|GUEST266_EXPORT_1_STAR=NONE +REC|GUEST266_EXPORT_1_DOUBLESTAR=NONE +REC|GUEST266_EXPORT_1_POSITIONAL_COUNT=1 +REC|GUEST266_EXPORT_1_REQUIRED_POSITIONALS=1 +REC|GUEST266_EXPORT_1_BODY_NODE_COUNT=7 +REC|GUEST266_EXPORT_1_CALL_NAMES=all,get,len,need,type +REC|GUEST266_EXPORT_1_RETURN_FORMS=Name +REC|GUEST266_EXPORT_1_SAFE_AST_SHA256=b7c8f2b5848d56e29ca7041ae051160bfb07903b4215ad81f61c73bec8bb2ff7 +REC|GUEST266_EXPORT_1_SAFE_AST_OUTLINE=def plan_rows(plan): || t.need(type(plan) is dict and plan.get('') == '', '') || rows = plan.get('') || t.need(type(rows) is list and 0 < len(rows) <= 0 and (plan.get('') == len(rows)), '') || t.need(all((type(j) is dict and type(j.get('')) is int for j in rows)), '') || t.need(len({j[''] for j in rows}) == len(rows), '') || t.need(plan.get('') is 0, '') || return rows +REC|GUEST266_EXPORT_2_NAME=choose +REC|GUEST266_EXPORT_2_ARGS=plan,now +REC|GUEST266_EXPORT_2_KWONLY_ARGS= +REC|GUEST266_EXPORT_2_STAR=NONE +REC|GUEST266_EXPORT_2_DOUBLESTAR=NONE +REC|GUEST266_EXPORT_2_POSITIONAL_COUNT=2 +REC|GUEST266_EXPORT_2_REQUIRED_POSITIONALS=2 +REC|GUEST266_EXPORT_2_BODY_NODE_COUNT=12 +REC|GUEST266_EXPORT_2_CALL_NAMES=append,bool,deepcopy,get,len,max,min,need,plan_rows,type,validate_job +REC|GUEST266_EXPORT_2_RETURN_FORMS=Call +REC|GUEST266_EXPORT_2_SAFE_AST_SHA256=d32af9764f3f95d11e56cd5edcc20460424a0e8642527c9ab88e9dc187541ba1 +REC|GUEST266_EXPORT_2_SAFE_AST_OUTLINE=def choose(plan, now): || rows = plan_rows(plan) || t.need(plan.get('') == [], '') || candidates = [] || for job in rows: || if not (job.get('') == '' and job.get('') is 0 and (job.get('') == []) and (job.get('') is 0) and (job.get('') is 0)): || continue || disks = job.get('') || if not (type(disks) is list and len(disks) == 0 and (disks[0].get('') == '') and (disks[0].get('') == '') and (disks[0].get('') in ('', ''))): || continue || n = job.get('') || if type(n) is not int or not 0 < n <= MAX_CONFIGURED_BYTES: || continue || producer.validate_job(job, now) || candidates.append(job) || t. +REC|GUEST266_EXPORT_3_NAME=same_state +REC|GUEST266_EXPORT_3_ARGS=before,after,vmid +REC|GUEST266_EXPORT_3_KWONLY_ARGS= +REC|GUEST266_EXPORT_3_STAR=NONE +REC|GUEST266_EXPORT_3_DOUBLESTAR=NONE +REC|GUEST266_EXPORT_3_POSITIONAL_COUNT=3 +REC|GUEST266_EXPORT_3_REQUIRED_POSITIONALS=3 +REC|GUEST266_EXPORT_3_BODY_NODE_COUNT=11 +REC|GUEST266_EXPORT_3_CALL_NAMES=get,len,membership,need,plan_rows,sorted +REC|GUEST266_EXPORT_3_RETURN_FORMS= +REC|GUEST266_EXPORT_3_SAFE_AST_SHA256=110c3ba42ad1540052bdff8e242d2feb26b25c39784fe1a9094c24e2b2bf4dc2 +REC|GUEST266_EXPORT_3_SAFE_AST_OUTLINE=def same_state(before, after, vmid): || old = plan_rows(before) || new = plan_rows(after) || membership = lambda rows: sorted(((x[''], x[''], x[''], x[''], x['']) for x in rows)) || t.need(membership(old) == membership(new), '') || t.need(before[''] == after[''], '') || matches = [j for j in new if j[''] == vmid] || original = [j for j in old if j[''] == vmid] || t.need(len(matches) == len(original) == 0, '') || a, b = (original[0], matches[0]) || t.need(b.get('') is 0 and b.get('') == [], '') || for key in ('', '', '', '', '', '', ''): || t.need(a.get(key) == b.get(key), '') +REC|GUEST266_EXPORT_4_NAME=no_active_tasks +REC|GUEST266_EXPORT_4_ARGS=rows,vmid +REC|GUEST266_EXPORT_4_KWONLY_ARGS= +REC|GUEST266_EXPORT_4_STAR=NONE +REC|GUEST266_EXPORT_4_DOUBLESTAR=NONE +REC|GUEST266_EXPORT_4_POSITIONAL_COUNT=2 +REC|GUEST266_EXPORT_4_REQUIRED_POSITIONALS=2 +REC|GUEST266_EXPORT_4_BODY_NODE_COUNT=2 +REC|GUEST266_EXPORT_4_CALL_NAMES=any,get,len,lower,need,str,type +REC|GUEST266_EXPORT_4_RETURN_FORMS= +REC|GUEST266_EXPORT_4_SAFE_AST_SHA256=81205d76854dcb627897e5d8bd82b5a49468a07f8921861e87f712f1994b804e +REC|GUEST266_EXPORT_4_SAFE_AST_OUTLINE=def no_active_tasks(rows, vmid): || t.need(type(rows) is list and len(rows) < 0, '') || for task in rows: || t.need(type(task) is dict and type(task.get('')) is str, '') || if type(task.get('')) is int and task.get('') not in (None, ''): || continue || kind = task[''] || target = str(task.get('', '')) || if kind in ('', '', '', ''): || continue || t.need(target != str(vmid) and (not any((x in kind.lower() for x in ('', '', '', '', '', '', '')))), '') +REC|GUEST266_EXPORT_5_NAME=check_result +REC|GUEST266_EXPORT_5_ARGS=result,job,work +REC|GUEST266_EXPORT_5_KWONLY_ARGS= +REC|GUEST266_EXPORT_5_STAR=NONE +REC|GUEST266_EXPORT_5_DOUBLESTAR=NONE +REC|GUEST266_EXPORT_5_POSITIONAL_COUNT=3 +REC|GUEST266_EXPORT_5_REQUIRED_POSITIONALS=3 +REC|GUEST266_EXPORT_5_BODY_NODE_COUNT=12 +REC|GUEST266_EXPORT_5_CALL_NAMES=Path,close,get,hash_file,list,listdir,need,open_dir,str,type +REC|GUEST266_EXPORT_5_RETURN_FORMS=Name +REC|GUEST266_EXPORT_5_SAFE_AST_SHA256=201602f107a661fdbd41a96feda13666bf269e0d4ee11dde9c62aedb78ee0d9e +REC|GUEST266_EXPORT_5_SAFE_AST_OUTLINE=def check_result(result, job, work): || t.need(type(result) is dict, '') || expected = Path(work) / ('' % job['']) || t.need(result.get('') == str(expected), '') || for k in ('', '', '', ''): || t.need(result.get(k) == job[k], '') || t.need(result.get('') == 0 and result.get('') is 0, '') || t.need(type(result.get('')) is int and 0 < result[''] <= job[''], '') || n, h, identity = stream.hash_file(expected, job['']) || t.need(n == result[''] and h == result.get('') and (list(identity) == result.get('')), '') || temp = Path(work) / '' || fd = t.open_dir(temp) || try: || t.need(os.listdir(fd +REC|GUEST266_EXPORT_6_NAME=run_flow +REC|GUEST266_EXPORT_6_ARGS=job,work,entries,cloud,reader,produce,state_guard,guard,compression_check,generation,say,clock +REC|GUEST266_EXPORT_6_KWONLY_ARGS= +REC|GUEST266_EXPORT_6_STAR=NONE +REC|GUEST266_EXPORT_6_DOUBLESTAR=NONE +REC|GUEST266_EXPORT_6_POSITIONAL_COUNT=12 +REC|GUEST266_EXPORT_6_REQUIRED_POSITIONALS=11 +REC|GUEST266_EXPORT_6_BODY_NODE_COUNT=35 +REC|GUEST266_EXPORT_6_CALL_NAMES=Path,all,callable,canonical_bytes,check_result,cleanup,clock,compression_check,create,discover,get,guard,int,len,make_dir,manifest_hash,need,produce,restore,say,state_guard,time,upload,valid_name,validate_inventory,validate_job +REC|GUEST266_EXPORT_6_RETURN_FORMS=Dict +REC|GUEST266_EXPORT_6_SAFE_AST_SHA256=bfd6b773e40f9e89f6777eb01922534012c4c264d67ebc9ed4889091c051893e +REC|GUEST266_EXPORT_6_SAFE_AST_OUTLINE=def run_flow(job, work, entries, cloud, reader, produce, state_guard, guard, compression_check, generation, say, clock=lambda: int(time.time())): || """""" || producer.validate_job(job, clock()) || core.validate_inventory(entries) || t.need(job[''] == '' and job.get('') is 0, '') || t.need(core.valid_name(generation), '') || t.need(all((callable(f) for f in (produce, state_guard, guard, compression_check, say, clock))), '') || work = Path(work) || state_guard() || guard() || for sub in ('', '', ''): || t.make_dir(work / sub, exclusive=0) || say('', '') || produced = produce(job, work / '') || source = check_result(produced, job, work / '') || state_guard() || +GUEST266_MODULE_EXPORT_ALIAS_DUMP_ARGV=false +GUEST266_ALL_CALL_NAMES=Path,all,any,append,bool,callable,canonical_bytes,check_result,cleanup,clock,close,compression_check,create,deepcopy,discover,get,guard,hash_file,int,len,list,listdir,lower,make_dir,manifest_hash,max,membership,min,need,open_dir,plan_rows,produce,restore,say,sorted,state_guard,str,time,type,upload,valid_name,validate_inventory,validate_job +LEGACY_RELEVANT_FUNCTIONS=_isolated_release_graph_selftest,proven_lxc_dump_argv,selftest +REC|LEGACY_FUNCTION_1_NAME=_isolated_release_graph_selftest +REC|LEGACY_FUNCTION_1_ARGS= +REC|LEGACY_FUNCTION_1_KWONLY_ARGS= +REC|LEGACY_FUNCTION_1_STAR=NONE +REC|LEGACY_FUNCTION_1_DOUBLESTAR=NONE +REC|LEGACY_FUNCTION_1_POSITIONAL_COUNT=0 +REC|LEGACY_FUNCTION_1_REQUIRED_POSITIONALS=0 +REC|LEGACY_FUNCTION_1_BODY_NODE_COUNT=7 +REC|LEGACY_FUNCTION_1_CALL_NAMES=BackupError,Path,_historical_graph_env,get,hexdigest,items,loads,resolve,run,sha256,str +REC|LEGACY_FUNCTION_1_RETURN_FORMS=Constant +REC|LEGACY_FUNCTION_1_SAFE_AST_SHA256=d2c89b325fefa61a496a88bdfc83d0c539bcafe0dcc2703c874dc81f54757ead +REC|LEGACY_FUNCTION_1_SAFE_AST_OUTLINE=def _isolated_release_graph_selftest(): || env = _historical_graph_env() || p = subprocess.run([sys.executable, '', '', _HISTORICAL_HELPER, ''], stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, cwd='', timeout=0) || if p.returncode != 0: || raise BackupError('', f'{p.returncode}{hashlib.sha256(p.stderr).hexdigest()}') || try: || out = json.loads(p.stdout) || except Exception: || raise BackupError('') || expected = {'': str(GUEST266), '': str(P265), '': str(P270), '': str(P282)} || for k, v in expected.items(): || if str(pathlib.Path(out.get(k, '')).resolve()) != str(pathlib.Path(v).resolve()): || raise BackupError('', k) || return 0 +REC|LEGACY_FUNCTION_2_NAME=proven_lxc_dump_argv +REC|LEGACY_FUNCTION_2_ARGS=t,row,node,scratch +REC|LEGACY_FUNCTION_2_KWONLY_ARGS= +REC|LEGACY_FUNCTION_2_STAR=NONE +REC|LEGACY_FUNCTION_2_DOUBLESTAR=NONE +REC|LEGACY_FUNCTION_2_POSITIONAL_COUNT=4 +REC|LEGACY_FUNCTION_2_REQUIRED_POSITIONALS=4 +REC|LEGACY_FUNCTION_2_BODY_NODE_COUNT=11 +REC|LEGACY_FUNCTION_2_CALL_NAMES=BackupError,Path,_isolated_guest266_dump_argv,_lxc_job,all,any,index,int,isinstance,len,list,startswith,str,time,type,which +REC|LEGACY_FUNCTION_2_RETURN_FORMS=Tuple +REC|LEGACY_FUNCTION_2_SAFE_AST_SHA256=b49d47e03d87aeaeb920aa1759ab55f03bfab1c328294b76b92a739d0562e308 +REC|LEGACY_FUNCTION_2_SAFE_AST_OUTLINE=def proven_lxc_dump_argv(t, row, node, scratch): || job = _lxc_job(t, row, node) || vzdump = shutil.which('') or '' || try: || argv = _isolated_guest266_dump_argv(job, vzdump, pathlib.Path(scratch), int(time.time())) || except BackupError: || raise || except Exception as e: || raise BackupError('', type(e).__name__) || if not isinstance(argv, (list, tuple)) or not argv or (not all((isinstance(x, str) for x in argv))): || raise BackupError('') || argv = list(argv) || if pathlib.Path(argv[0]).name != '' or str(int(t[''])) not in argv: || raise BackupError('') || if '' in argv or any((x.startswith('') for x in argv)): || raise BackupError('') || if not any((x == '' or x.startswith('') for x in argv)): || raise BackupError('') || if str(scratch) not in argv and (not any((x == '' + str(scratch) for x in argv))): || raise BackupError('') || if '' in argv: || i = argv.index('') || if i + 0 >= len(argv) or argv[i + 0] != str(scratch): || raise BackupError('') || elif '' + str(scratch) not in argv: || raise BackupError('') || return (argv, job) +REC|LEGACY_FUNCTION_3_NAME=selftest +REC|LEGACY_FUNCTION_3_ARGS= +REC|LEGACY_FUNCTION_3_KWONLY_ARGS= +REC|LEGACY_FUNCTION_3_STAR=NONE +REC|LEGACY_FUNCTION_3_DOUBLESTAR=NONE +REC|LEGACY_FUNCTION_3_POSITIONAL_COUNT=0 +REC|LEGACY_FUNCTION_3_REQUIRED_POSITIONALS=0 +REC|LEGACY_FUNCTION_3_BODY_NODE_COUNT=11 +REC|LEGACY_FUNCTION_3_CALL_NAMES=_isolated_release_graph_selftest,_pve_dumpdir_spec,default_targets,get,is_file,len,print,proven_lxc_dump_argv +REC|LEGACY_FUNCTION_3_RETURN_FORMS=Constant +REC|LEGACY_FUNCTION_3_SAFE_AST_SHA256=e19006ae7f92183d407a7722c74fb733dc0e993b7cc6a361ad891aa33ceb7771 +REC|LEGACY_FUNCTION_3_SAFE_AST_OUTLINE=def selftest(): || assert PART_SIZE == 0 || assert len(REMOTES) == 0 and len({p for _, p in REMOTES}) == 0 || assert len(default_targets()) >= 0 || assert {t[''] for t in default_targets() if t.get('')} == {'', '', '', '', '', '', '', '', ''} || assert _pve_dumpdir_spec('') == (0, 0) || assert _pve_dumpdir_spec('') == (0, 0) || assert GUEST266_SHA == '' || assert P282_SHA == '' || if GUEST266.is_file(): || assert _isolated_release_graph_selftest() is 0 || av, _ = proven_lxc_dump_argv({'': 0}, {'': 0, '': 0, '': '', '': ''}, '', '') || assert '' in av and '' in av and ('' in av) || print('') || return 0 +WRAPPER_SELFTEST_TOKEN=GUEST266_SUBPROCESS_FAILED +CAPTURED_KNOWN_INLINE_COUNT=2 +MATCHED_FAILING_INLINE_COUNT=1 +INLINE_SOURCE_SHA256=933857fc97556284ece79adfdc9333f8f37852f636f5882efa8382d92a3d24c5 +INLINE_SOURCE_BYTE_LENGTH=774 +INLINE_SAFE_AST_OUTLINE=import importlib, importlib.util, json, pathlib, sys || mode = sys.argv[0] || if mode == '': || out = {} || for name in ('', '', '', ''): || m = importlib.import_module(name) || out[name] = str(pathlib.Path(m.__file__).resolve()) || print(json.dumps(out, sort_keys=0, separators=('', ''))) || elif mode == '': || source = pathlib.Path(sys.argv[0]).resolve() || spec = importlib.util.spec_from_file_location('', str(source)) || if spec is None or spec.loader is None: || raise SystemExit(0) || mod = importlib.util.module_from_spec(spec) || spec.loader.exec_module(mod) || req = json.load(sys.stdin) || argv = mod.dump_argv(req[''], req[''], pathlib.Path(req['']), int(req[''])) || print(json.dumps(argv, separators=('', ''))) || else: || raise SystemExit(0) +INLINE_DUMP_ARGV_CALL_COUNT=1 +REC|INLINE_CALL|IDX=1|POSITIONALS=4 +REC|INLINE_CALL|IDX=1|KWARGS= +REC|INLINE_CALL|IDX=1|ARG_FORMS=Subscript,Subscript,Call,Call +REC|INLINE_CALL|IDX=1|ARG_NAME_HINTS=,,, +DECISION=PASS_GUEST266_EXPORT_CONTRACT_CAPTURED +NEXT_GATE=REPAIR_ONLY_VERIFIED_INCOMPATIBLE_GUEST266_INTERFACE +PROBE_RC=0 +TASK_RESULT=CT112_GUEST266_EXPORT_CONTRACT +CHANGES_MADE=false +ROLLBACK_STARTED=false +ROLLBACK_RESTORED=null +MUTATION_OUTCOME=NO_MUTATION +HOMELAB_RESULT_CONTRACT={"version":1,"command_id":"SUPPORT-261008-CT112-GUEST266-EXPORT-CONTRACT-99809R1","status":"OK","changes_made":false,"rollback_started":false,"rollback_restored":null} + +OUTPUT_END +CHAT_OUTPUT_END diff --git a/runtime/latest.json b/runtime/latest.json index 57088758..f4d9395c 100644 --- a/runtime/latest.json +++ b/runtime/latest.json @@ -1,25 +1,25 @@ { "schema_version": 1, "channel": "homelab-runtime", - "command_id": "SUPPORT-261008-CT112-GUEST266-ABI-GUARDED-REPAIR-99808R1", + "command_id": "SUPPORT-261008-CT112-GUEST266-EXPORT-CONTRACT-99809R1", "status": "OK", "rc": 0, "host": "pve01", - "mode": "change", - "component": "ct112-guest266-abi-guarded-repair", - "started_at_utc": "2026-10-07T23:06:30Z", - "finished_at_utc": "2026-10-07T23:06:30Z", + "mode": "read-only", + "component": "ct112-guest266-export-contract", + "started_at_utc": "2026-10-07T23:11:17Z", + "finished_at_utc": "2026-10-07T23:11:17Z", "reference_register_checked": true, "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", "error_register_checked": true, "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", - "command_sha256": "98fdd5593c2e2bb13bbf53cf687d6c666f7518c7d30bb9f9a23d1b444e1057c1", + "command_sha256": "a46085eebf3b7c5742b5140bab6f8c366fbcfe6223bdbc80334bc207f20093be", "duplicate_failed_command_blocked": false, "block_reason": null, "execution_started": true, - "change_declared": true, + "change_declared": false, "result_contract_valid": true, - "result_contract_status": "OK", + "result_contract_status": null, "result_contract_error": null, "command_rc": 0, "changes_made": false, @@ -30,9 +30,9 @@ "secrets_included": false, "private_addresses_included": false, "raw_evidence_retained_locally": true, - "raw_evidence_sha256": "8b5a093d36dd036a35386c53c01f3eb8b8d965b78c5643dcb8e6ba54238a2837", - "sanitized_output_sha256": "8b5a093d36dd036a35386c53c01f3eb8b8d965b78c5643dcb8e6ba54238a2837", + "raw_evidence_sha256": "ebe1d110b44088c3b07192ed81a9f3ea97ea0bf15a47456fd73bc4f7a4c1d6ad", + "sanitized_output_sha256": "ebe1d110b44088c3b07192ed81a9f3ea97ea0bf15a47456fd73bc4f7a4c1d6ad", "output_truncated_in_json": false, "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", - "output": "CT112_GUEST266_ABI_GUARDED_REPAIR=V1\nMODE=change\nSCOPE=ONE_EXACT_LEGACY_GUEST266_TEST_REFERENCE_IF_PROVEN\nNO_BACKUP_EXECUTION=true\nNO_GUEST_NETBIRD_DNS_NETWORK_MUTATION=true\nNO_BACKUP_STATE_OR_REGISTRY_EDIT=true\nBACKUP_TIMER_PRE=active\nBACKUP_SERVICE_PRE=inactive\nWRAPPER_EXACT_COUNT=1\nLEGACY_SHA_MATCH=true\nACTIVE_HANDLER_SHA_MATCH=true\nGUEST266_PRESENT=true\nGUEST266_SHA_MATCH=true\nGUEST266_TOPLEVEL_FUNCTION_COUNT=6\nGUEST266_COMPAT_CANDIDATE_COUNT=0\nGUEST266_DUMP_ARGV_DEFINED=false\nBASELINE_SELFTEST_OK=false\nBASELINE_SELFTEST_TOKEN=GUEST266_SUBPROCESS_FAILED\nINLINE_CODE_CAPTURE_COUNT=2\nISOLATED_PYFILE_CASE_COUNT=1\nINLINE_MISSING_ATTRIBUTE_REF_COUNT=1\nLEGACY_SOURCE_EXACT_REF_COUNT=1\nWRAPPER_PINS_LEGACY_SHA=false\nDECISION=HOLD_NO_UNIQUE_GUEST266_COMPAT_INTERFACE\nNEXT_GATE=REVIEW_REPORTED_GUEST266_EXPORTS\nCHANGES_MADE=false\nROLLBACK_STARTED=false\nROLLBACK_RESTORED=null\nMUTATION_OUTCOME=NO_MUTATION\nPROBE_RC=0\nRESULT_DECISION=HOLD_NO_UNIQUE_GUEST266_COMPAT_INTERFACE\nRESULT_MUTATION_OUTCOME=NO_MUTATION\nTASK_RESULT=CT112_GUEST266_ABI_GUARDED_REPAIR\nCHANGES_MADE=false\nROLLBACK_STARTED=false\nROLLBACK_RESTORED=null\nMUTATION_OUTCOME=NO_MUTATION\nHOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"SUPPORT-261008-CT112-GUEST266-ABI-GUARDED-REPAIR-99808R1\",\"status\":\"OK\",\"changes_made\":false,\"rollback_started\":false,\"rollback_restored\":null}\n" + "output": "CT112_GUEST266_EXPORT_CONTRACT=V1\nMODE=read-only\nNO_MUTATION=true\nBACKUP_V2_ACTIVE=inactive\nBACKUP_V2_RESULT=success\nBACKUP_V2_TIMER_ACTIVE=active\nBACKUP_AUDIT=SUMMARY|AUDIT_STATUS=OK|BACKUP_STATUS=GREEN|ACTIVE_COUNT=15|ISSUE_COUNT=0|CLOUD_A=OK|CLOUD_B=OK|CLOUD_B_DRILL=OK|DR_PROVEN=YES|SOURCE_OFFHOST=OK\nWRAPPER_EXACT_COUNT=1\nWRAPPER_LEGACY_HASH_MATCH=true\nWRAPPER_HANDLER_HASH_MATCH=true\nGUEST266_PRESENT=true\nGUEST266_HASH_MATCH=true\nGUEST266_TOPLEVEL_FUNCTION_COUNT=6\nGUEST266_TOPLEVEL_FUNCTION_NAMES=plan_rows,choose,same_state,no_active_tasks,check_result,run_flow\nGUEST266_HAS_DUMP_ARGV=false\nREC|GUEST266_EXPORT_1_NAME=plan_rows\nREC|GUEST266_EXPORT_1_ARGS=plan\nREC|GUEST266_EXPORT_1_KWONLY_ARGS=\nREC|GUEST266_EXPORT_1_STAR=NONE\nREC|GUEST266_EXPORT_1_DOUBLESTAR=NONE\nREC|GUEST266_EXPORT_1_POSITIONAL_COUNT=1\nREC|GUEST266_EXPORT_1_REQUIRED_POSITIONALS=1\nREC|GUEST266_EXPORT_1_BODY_NODE_COUNT=7\nREC|GUEST266_EXPORT_1_CALL_NAMES=all,get,len,need,type\nREC|GUEST266_EXPORT_1_RETURN_FORMS=Name\nREC|GUEST266_EXPORT_1_SAFE_AST_SHA256=b7c8f2b5848d56e29ca7041ae051160bfb07903b4215ad81f61c73bec8bb2ff7\nREC|GUEST266_EXPORT_1_SAFE_AST_OUTLINE=def plan_rows(plan): || t.need(type(plan) is dict and plan.get('') == '', '') || rows = plan.get('') || t.need(type(rows) is list and 0 < len(rows) <= 0 and (plan.get('') == len(rows)), '') || t.need(all((type(j) is dict and type(j.get('')) is int for j in rows)), '') || t.need(len({j[''] for j in rows}) == len(rows), '') || t.need(plan.get('') is 0, '') || return rows\nREC|GUEST266_EXPORT_2_NAME=choose\nREC|GUEST266_EXPORT_2_ARGS=plan,now\nREC|GUEST266_EXPORT_2_KWONLY_ARGS=\nREC|GUEST266_EXPORT_2_STAR=NONE\nREC|GUEST266_EXPORT_2_DOUBLESTAR=NONE\nREC|GUEST266_EXPORT_2_POSITIONAL_COUNT=2\nREC|GUEST266_EXPORT_2_REQUIRED_POSITIONALS=2\nREC|GUEST266_EXPORT_2_BODY_NODE_COUNT=12\nREC|GUEST266_EXPORT_2_CALL_NAMES=append,bool,deepcopy,get,len,max,min,need,plan_rows,type,validate_job\nREC|GUEST266_EXPORT_2_RETURN_FORMS=Call\nREC|GUEST266_EXPORT_2_SAFE_AST_SHA256=d32af9764f3f95d11e56cd5edcc20460424a0e8642527c9ab88e9dc187541ba1\nREC|GUEST266_EXPORT_2_SAFE_AST_OUTLINE=def choose(plan, now): || rows = plan_rows(plan) || t.need(plan.get('') == [], '') || candidates = [] || for job in rows: || if not (job.get('') == '' and job.get('') is 0 and (job.get('') == []) and (job.get('') is 0) and (job.get('') is 0)): || continue || disks = job.get('') || if not (type(disks) is list and len(disks) == 0 and (disks[0].get('') == '') and (disks[0].get('') == '') and (disks[0].get('') in ('', ''))): || continue || n = job.get('') || if type(n) is not int or not 0 < n <= MAX_CONFIGURED_BYTES: || continue || producer.validate_job(job, now) || candidates.append(job) || t.\nREC|GUEST266_EXPORT_3_NAME=same_state\nREC|GUEST266_EXPORT_3_ARGS=before,after,vmid\nREC|GUEST266_EXPORT_3_KWONLY_ARGS=\nREC|GUEST266_EXPORT_3_STAR=NONE\nREC|GUEST266_EXPORT_3_DOUBLESTAR=NONE\nREC|GUEST266_EXPORT_3_POSITIONAL_COUNT=3\nREC|GUEST266_EXPORT_3_REQUIRED_POSITIONALS=3\nREC|GUEST266_EXPORT_3_BODY_NODE_COUNT=11\nREC|GUEST266_EXPORT_3_CALL_NAMES=get,len,membership,need,plan_rows,sorted\nREC|GUEST266_EXPORT_3_RETURN_FORMS=\nREC|GUEST266_EXPORT_3_SAFE_AST_SHA256=110c3ba42ad1540052bdff8e242d2feb26b25c39784fe1a9094c24e2b2bf4dc2\nREC|GUEST266_EXPORT_3_SAFE_AST_OUTLINE=def same_state(before, after, vmid): || old = plan_rows(before) || new = plan_rows(after) || membership = lambda rows: sorted(((x[''], x[''], x[''], x[''], x['']) for x in rows)) || t.need(membership(old) == membership(new), '') || t.need(before[''] == after[''], '') || matches = [j for j in new if j[''] == vmid] || original = [j for j in old if j[''] == vmid] || t.need(len(matches) == len(original) == 0, '') || a, b = (original[0], matches[0]) || t.need(b.get('') is 0 and b.get('') == [], '') || for key in ('', '', '', '', '', '', ''): || t.need(a.get(key) == b.get(key), '')\nREC|GUEST266_EXPORT_4_NAME=no_active_tasks\nREC|GUEST266_EXPORT_4_ARGS=rows,vmid\nREC|GUEST266_EXPORT_4_KWONLY_ARGS=\nREC|GUEST266_EXPORT_4_STAR=NONE\nREC|GUEST266_EXPORT_4_DOUBLESTAR=NONE\nREC|GUEST266_EXPORT_4_POSITIONAL_COUNT=2\nREC|GUEST266_EXPORT_4_REQUIRED_POSITIONALS=2\nREC|GUEST266_EXPORT_4_BODY_NODE_COUNT=2\nREC|GUEST266_EXPORT_4_CALL_NAMES=any,get,len,lower,need,str,type\nREC|GUEST266_EXPORT_4_RETURN_FORMS=\nREC|GUEST266_EXPORT_4_SAFE_AST_SHA256=81205d76854dcb627897e5d8bd82b5a49468a07f8921861e87f712f1994b804e\nREC|GUEST266_EXPORT_4_SAFE_AST_OUTLINE=def no_active_tasks(rows, vmid): || t.need(type(rows) is list and len(rows) < 0, '') || for task in rows: || t.need(type(task) is dict and type(task.get('')) is str, '') || if type(task.get('')) is int and task.get('') not in (None, ''): || continue || kind = task[''] || target = str(task.get('', '')) || if kind in ('', '', '', ''): || continue || t.need(target != str(vmid) and (not any((x in kind.lower() for x in ('', '', '', '', '', '', '')))), '')\nREC|GUEST266_EXPORT_5_NAME=check_result\nREC|GUEST266_EXPORT_5_ARGS=result,job,work\nREC|GUEST266_EXPORT_5_KWONLY_ARGS=\nREC|GUEST266_EXPORT_5_STAR=NONE\nREC|GUEST266_EXPORT_5_DOUBLESTAR=NONE\nREC|GUEST266_EXPORT_5_POSITIONAL_COUNT=3\nREC|GUEST266_EXPORT_5_REQUIRED_POSITIONALS=3\nREC|GUEST266_EXPORT_5_BODY_NODE_COUNT=12\nREC|GUEST266_EXPORT_5_CALL_NAMES=Path,close,get,hash_file,list,listdir,need,open_dir,str,type\nREC|GUEST266_EXPORT_5_RETURN_FORMS=Name\nREC|GUEST266_EXPORT_5_SAFE_AST_SHA256=201602f107a661fdbd41a96feda13666bf269e0d4ee11dde9c62aedb78ee0d9e\nREC|GUEST266_EXPORT_5_SAFE_AST_OUTLINE=def check_result(result, job, work): || t.need(type(result) is dict, '') || expected = Path(work) / ('' % job['']) || t.need(result.get('') == str(expected), '') || for k in ('', '', '', ''): || t.need(result.get(k) == job[k], '') || t.need(result.get('') == 0 and result.get('') is 0, '') || t.need(type(result.get('')) is int and 0 < result[''] <= job[''], '') || n, h, identity = stream.hash_file(expected, job['']) || t.need(n == result[''] and h == result.get('') and (list(identity) == result.get('')), '') || temp = Path(work) / '' || fd = t.open_dir(temp) || try: || t.need(os.listdir(fd\nREC|GUEST266_EXPORT_6_NAME=run_flow\nREC|GUEST266_EXPORT_6_ARGS=job,work,entries,cloud,reader,produce,state_guard,guard,compression_check,generation,say,clock\nREC|GUEST266_EXPORT_6_KWONLY_ARGS=\nREC|GUEST266_EXPORT_6_STAR=NONE\nREC|GUEST266_EXPORT_6_DOUBLESTAR=NONE\nREC|GUEST266_EXPORT_6_POSITIONAL_COUNT=12\nREC|GUEST266_EXPORT_6_REQUIRED_POSITIONALS=11\nREC|GUEST266_EXPORT_6_BODY_NODE_COUNT=35\nREC|GUEST266_EXPORT_6_CALL_NAMES=Path,all,callable,canonical_bytes,check_result,cleanup,clock,compression_check,create,discover,get,guard,int,len,make_dir,manifest_hash,need,produce,restore,say,state_guard,time,upload,valid_name,validate_inventory,validate_job\nREC|GUEST266_EXPORT_6_RETURN_FORMS=Dict\nREC|GUEST266_EXPORT_6_SAFE_AST_SHA256=bfd6b773e40f9e89f6777eb01922534012c4c264d67ebc9ed4889091c051893e\nREC|GUEST266_EXPORT_6_SAFE_AST_OUTLINE=def run_flow(job, work, entries, cloud, reader, produce, state_guard, guard, compression_check, generation, say, clock=lambda: int(time.time())): || \"\"\"\"\"\" || producer.validate_job(job, clock()) || core.validate_inventory(entries) || t.need(job[''] == '' and job.get('') is 0, '') || t.need(core.valid_name(generation), '') || t.need(all((callable(f) for f in (produce, state_guard, guard, compression_check, say, clock))), '') || work = Path(work) || state_guard() || guard() || for sub in ('', '', ''): || t.make_dir(work / sub, exclusive=0) || say('', '') || produced = produce(job, work / '') || source = check_result(produced, job, work / '') || state_guard() || \nGUEST266_MODULE_EXPORT_ALIAS_DUMP_ARGV=false\nGUEST266_ALL_CALL_NAMES=Path,all,any,append,bool,callable,canonical_bytes,check_result,cleanup,clock,close,compression_check,create,deepcopy,discover,get,guard,hash_file,int,len,list,listdir,lower,make_dir,manifest_hash,max,membership,min,need,open_dir,plan_rows,produce,restore,say,sorted,state_guard,str,time,type,upload,valid_name,validate_inventory,validate_job\nLEGACY_RELEVANT_FUNCTIONS=_isolated_release_graph_selftest,proven_lxc_dump_argv,selftest\nREC|LEGACY_FUNCTION_1_NAME=_isolated_release_graph_selftest\nREC|LEGACY_FUNCTION_1_ARGS=\nREC|LEGACY_FUNCTION_1_KWONLY_ARGS=\nREC|LEGACY_FUNCTION_1_STAR=NONE\nREC|LEGACY_FUNCTION_1_DOUBLESTAR=NONE\nREC|LEGACY_FUNCTION_1_POSITIONAL_COUNT=0\nREC|LEGACY_FUNCTION_1_REQUIRED_POSITIONALS=0\nREC|LEGACY_FUNCTION_1_BODY_NODE_COUNT=7\nREC|LEGACY_FUNCTION_1_CALL_NAMES=BackupError,Path,_historical_graph_env,get,hexdigest,items,loads,resolve,run,sha256,str\nREC|LEGACY_FUNCTION_1_RETURN_FORMS=Constant\nREC|LEGACY_FUNCTION_1_SAFE_AST_SHA256=d2c89b325fefa61a496a88bdfc83d0c539bcafe0dcc2703c874dc81f54757ead\nREC|LEGACY_FUNCTION_1_SAFE_AST_OUTLINE=def _isolated_release_graph_selftest(): || env = _historical_graph_env() || p = subprocess.run([sys.executable, '', '', _HISTORICAL_HELPER, ''], stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, cwd='', timeout=0) || if p.returncode != 0: || raise BackupError('', f'{p.returncode}{hashlib.sha256(p.stderr).hexdigest()}') || try: || out = json.loads(p.stdout) || except Exception: || raise BackupError('') || expected = {'': str(GUEST266), '': str(P265), '': str(P270), '': str(P282)} || for k, v in expected.items(): || if str(pathlib.Path(out.get(k, '')).resolve()) != str(pathlib.Path(v).resolve()): || raise BackupError('', k) || return 0\nREC|LEGACY_FUNCTION_2_NAME=proven_lxc_dump_argv\nREC|LEGACY_FUNCTION_2_ARGS=t,row,node,scratch\nREC|LEGACY_FUNCTION_2_KWONLY_ARGS=\nREC|LEGACY_FUNCTION_2_STAR=NONE\nREC|LEGACY_FUNCTION_2_DOUBLESTAR=NONE\nREC|LEGACY_FUNCTION_2_POSITIONAL_COUNT=4\nREC|LEGACY_FUNCTION_2_REQUIRED_POSITIONALS=4\nREC|LEGACY_FUNCTION_2_BODY_NODE_COUNT=11\nREC|LEGACY_FUNCTION_2_CALL_NAMES=BackupError,Path,_isolated_guest266_dump_argv,_lxc_job,all,any,index,int,isinstance,len,list,startswith,str,time,type,which\nREC|LEGACY_FUNCTION_2_RETURN_FORMS=Tuple\nREC|LEGACY_FUNCTION_2_SAFE_AST_SHA256=b49d47e03d87aeaeb920aa1759ab55f03bfab1c328294b76b92a739d0562e308\nREC|LEGACY_FUNCTION_2_SAFE_AST_OUTLINE=def proven_lxc_dump_argv(t, row, node, scratch): || job = _lxc_job(t, row, node) || vzdump = shutil.which('') or '' || try: || argv = _isolated_guest266_dump_argv(job, vzdump, pathlib.Path(scratch), int(time.time())) || except BackupError: || raise || except Exception as e: || raise BackupError('', type(e).__name__) || if not isinstance(argv, (list, tuple)) or not argv or (not all((isinstance(x, str) for x in argv))): || raise BackupError('') || argv = list(argv) || if pathlib.Path(argv[0]).name != '' or str(int(t[''])) not in argv: || raise BackupError('') || if '' in argv or any((x.startswith('') for x in argv)): || raise BackupError('') || if not any((x == '' or x.startswith('') for x in argv)): || raise BackupError('') || if str(scratch) not in argv and (not any((x == '' + str(scratch) for x in argv))): || raise BackupError('') || if '' in argv: || i = argv.index('') || if i + 0 >= len(argv) or argv[i + 0] != str(scratch): || raise BackupError('') || elif '' + str(scratch) not in argv: || raise BackupError('') || return (argv, job)\nREC|LEGACY_FUNCTION_3_NAME=selftest\nREC|LEGACY_FUNCTION_3_ARGS=\nREC|LEGACY_FUNCTION_3_KWONLY_ARGS=\nREC|LEGACY_FUNCTION_3_STAR=NONE\nREC|LEGACY_FUNCTION_3_DOUBLESTAR=NONE\nREC|LEGACY_FUNCTION_3_POSITIONAL_COUNT=0\nREC|LEGACY_FUNCTION_3_REQUIRED_POSITIONALS=0\nREC|LEGACY_FUNCTION_3_BODY_NODE_COUNT=11\nREC|LEGACY_FUNCTION_3_CALL_NAMES=_isolated_release_graph_selftest,_pve_dumpdir_spec,default_targets,get,is_file,len,print,proven_lxc_dump_argv\nREC|LEGACY_FUNCTION_3_RETURN_FORMS=Constant\nREC|LEGACY_FUNCTION_3_SAFE_AST_SHA256=e19006ae7f92183d407a7722c74fb733dc0e993b7cc6a361ad891aa33ceb7771\nREC|LEGACY_FUNCTION_3_SAFE_AST_OUTLINE=def selftest(): || assert PART_SIZE == 0 || assert len(REMOTES) == 0 and len({p for _, p in REMOTES}) == 0 || assert len(default_targets()) >= 0 || assert {t[''] for t in default_targets() if t.get('')} == {'', '', '', '', '', '', '', '', ''} || assert _pve_dumpdir_spec('') == (0, 0) || assert _pve_dumpdir_spec('') == (0, 0) || assert GUEST266_SHA == '' || assert P282_SHA == '' || if GUEST266.is_file(): || assert _isolated_release_graph_selftest() is 0 || av, _ = proven_lxc_dump_argv({'': 0}, {'': 0, '': 0, '': '', '': ''}, '', '') || assert '' in av and '' in av and ('' in av) || print('') || return 0\nWRAPPER_SELFTEST_TOKEN=GUEST266_SUBPROCESS_FAILED\nCAPTURED_KNOWN_INLINE_COUNT=2\nMATCHED_FAILING_INLINE_COUNT=1\nINLINE_SOURCE_SHA256=933857fc97556284ece79adfdc9333f8f37852f636f5882efa8382d92a3d24c5\nINLINE_SOURCE_BYTE_LENGTH=774\nINLINE_SAFE_AST_OUTLINE=import importlib, importlib.util, json, pathlib, sys || mode = sys.argv[0] || if mode == '': || out = {} || for name in ('', '', '', ''): || m = importlib.import_module(name) || out[name] = str(pathlib.Path(m.__file__).resolve()) || print(json.dumps(out, sort_keys=0, separators=('', ''))) || elif mode == '': || source = pathlib.Path(sys.argv[0]).resolve() || spec = importlib.util.spec_from_file_location('', str(source)) || if spec is None or spec.loader is None: || raise SystemExit(0) || mod = importlib.util.module_from_spec(spec) || spec.loader.exec_module(mod) || req = json.load(sys.stdin) || argv = mod.dump_argv(req[''], req[''], pathlib.Path(req['']), int(req[''])) || print(json.dumps(argv, separators=('', ''))) || else: || raise SystemExit(0)\nINLINE_DUMP_ARGV_CALL_COUNT=1\nREC|INLINE_CALL|IDX=1|POSITIONALS=4\nREC|INLINE_CALL|IDX=1|KWARGS=\nREC|INLINE_CALL|IDX=1|ARG_FORMS=Subscript,Subscript,Call,Call\nREC|INLINE_CALL|IDX=1|ARG_NAME_HINTS=,,,\nDECISION=PASS_GUEST266_EXPORT_CONTRACT_CAPTURED\nNEXT_GATE=REPAIR_ONLY_VERIFIED_INCOMPATIBLE_GUEST266_INTERFACE\nPROBE_RC=0\nTASK_RESULT=CT112_GUEST266_EXPORT_CONTRACT\nCHANGES_MADE=false\nROLLBACK_STARTED=false\nROLLBACK_RESTORED=null\nMUTATION_OUTCOME=NO_MUTATION\nHOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"SUPPORT-261008-CT112-GUEST266-EXPORT-CONTRACT-99809R1\",\"status\":\"OK\",\"changes_made\":false,\"rollback_started\":false,\"rollback_restored\":null}\n" } diff --git a/runtime/latest.txt b/runtime/latest.txt index 0521b33c..24f58542 100644 --- a/runtime/latest.txt +++ b/runtime/latest.txt @@ -1,20 +1,20 @@ CHAT_OUTPUT_BEGIN -COMMAND_ID=SUPPORT-261008-CT112-GUEST266-ABI-GUARDED-REPAIR-99808R1 +COMMAND_ID=SUPPORT-261008-CT112-GUEST266-EXPORT-CONTRACT-99809R1 STATUS=OK RC=0 HOST=pve01 -MODE=change -COMPONENT=ct112-guest266-abi-guarded-repair +MODE=read-only +COMPONENT=ct112-guest266-export-contract REFERENCE_REGISTER_CHECK=OK REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 ERROR_REGISTER_CHECK=OK ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 -COMMAND_SHA256=98fdd5593c2e2bb13bbf53cf687d6c666f7518c7d30bb9f9a23d1b444e1057c1 +COMMAND_SHA256=a46085eebf3b7c5742b5140bab6f8c366fbcfe6223bdbc80334bc207f20093be DUPLICATE_FAILED_COMMAND_BLOCKED=false EXECUTION_STARTED=true -CHANGE_DECLARED=true +CHANGE_DECLARED=false RESULT_CONTRACT_VALID=true -RESULT_CONTRACT_STATUS=OK +RESULT_CONTRACT_STATUS=NOT_APPLICABLE RESULT_CONTRACT_ERROR=NONE COMMAND_RC=0 CHANGES_MADE=false @@ -24,47 +24,155 @@ MUTATION_OUTCOME=NO_MUTATION SANITIZED=yes SECRETS_INCLUDED=no PRIVATE_ADDRESSES_INCLUDED=no -RAW_EVIDENCE_SHA256=8b5a093d36dd036a35386c53c01f3eb8b8d965b78c5643dcb8e6ba54238a2837 -SANITIZED_OUTPUT_SHA256=8b5a093d36dd036a35386c53c01f3eb8b8d965b78c5643dcb8e6ba54238a2837 +RAW_EVIDENCE_SHA256=ebe1d110b44088c3b07192ed81a9f3ea97ea0bf15a47456fd73bc4f7a4c1d6ad +SANITIZED_OUTPUT_SHA256=ebe1d110b44088c3b07192ed81a9f3ea97ea0bf15a47456fd73bc4f7a4c1d6ad OUTPUT_BEGIN -CT112_GUEST266_ABI_GUARDED_REPAIR=V1 -MODE=change -SCOPE=ONE_EXACT_LEGACY_GUEST266_TEST_REFERENCE_IF_PROVEN -NO_BACKUP_EXECUTION=true -NO_GUEST_NETBIRD_DNS_NETWORK_MUTATION=true -NO_BACKUP_STATE_OR_REGISTRY_EDIT=true -BACKUP_TIMER_PRE=active -BACKUP_SERVICE_PRE=inactive +CT112_GUEST266_EXPORT_CONTRACT=V1 +MODE=read-only +NO_MUTATION=true +BACKUP_V2_ACTIVE=inactive +BACKUP_V2_RESULT=success +BACKUP_V2_TIMER_ACTIVE=active +BACKUP_AUDIT=SUMMARY|AUDIT_STATUS=OK|BACKUP_STATUS=GREEN|ACTIVE_COUNT=15|ISSUE_COUNT=0|CLOUD_A=OK|CLOUD_B=OK|CLOUD_B_DRILL=OK|DR_PROVEN=YES|SOURCE_OFFHOST=OK WRAPPER_EXACT_COUNT=1 -LEGACY_SHA_MATCH=true -ACTIVE_HANDLER_SHA_MATCH=true +WRAPPER_LEGACY_HASH_MATCH=true +WRAPPER_HANDLER_HASH_MATCH=true GUEST266_PRESENT=true -GUEST266_SHA_MATCH=true +GUEST266_HASH_MATCH=true GUEST266_TOPLEVEL_FUNCTION_COUNT=6 -GUEST266_COMPAT_CANDIDATE_COUNT=0 -GUEST266_DUMP_ARGV_DEFINED=false -BASELINE_SELFTEST_OK=false -BASELINE_SELFTEST_TOKEN=GUEST266_SUBPROCESS_FAILED -INLINE_CODE_CAPTURE_COUNT=2 -ISOLATED_PYFILE_CASE_COUNT=1 -INLINE_MISSING_ATTRIBUTE_REF_COUNT=1 -LEGACY_SOURCE_EXACT_REF_COUNT=1 -WRAPPER_PINS_LEGACY_SHA=false -DECISION=HOLD_NO_UNIQUE_GUEST266_COMPAT_INTERFACE -NEXT_GATE=REVIEW_REPORTED_GUEST266_EXPORTS -CHANGES_MADE=false -ROLLBACK_STARTED=false -ROLLBACK_RESTORED=null -MUTATION_OUTCOME=NO_MUTATION +GUEST266_TOPLEVEL_FUNCTION_NAMES=plan_rows,choose,same_state,no_active_tasks,check_result,run_flow +GUEST266_HAS_DUMP_ARGV=false +REC|GUEST266_EXPORT_1_NAME=plan_rows +REC|GUEST266_EXPORT_1_ARGS=plan +REC|GUEST266_EXPORT_1_KWONLY_ARGS= +REC|GUEST266_EXPORT_1_STAR=NONE +REC|GUEST266_EXPORT_1_DOUBLESTAR=NONE +REC|GUEST266_EXPORT_1_POSITIONAL_COUNT=1 +REC|GUEST266_EXPORT_1_REQUIRED_POSITIONALS=1 +REC|GUEST266_EXPORT_1_BODY_NODE_COUNT=7 +REC|GUEST266_EXPORT_1_CALL_NAMES=all,get,len,need,type +REC|GUEST266_EXPORT_1_RETURN_FORMS=Name +REC|GUEST266_EXPORT_1_SAFE_AST_SHA256=b7c8f2b5848d56e29ca7041ae051160bfb07903b4215ad81f61c73bec8bb2ff7 +REC|GUEST266_EXPORT_1_SAFE_AST_OUTLINE=def plan_rows(plan): || t.need(type(plan) is dict and plan.get('') == '', '') || rows = plan.get('') || t.need(type(rows) is list and 0 < len(rows) <= 0 and (plan.get('') == len(rows)), '') || t.need(all((type(j) is dict and type(j.get('')) is int for j in rows)), '') || t.need(len({j[''] for j in rows}) == len(rows), '') || t.need(plan.get('') is 0, '') || return rows +REC|GUEST266_EXPORT_2_NAME=choose +REC|GUEST266_EXPORT_2_ARGS=plan,now +REC|GUEST266_EXPORT_2_KWONLY_ARGS= +REC|GUEST266_EXPORT_2_STAR=NONE +REC|GUEST266_EXPORT_2_DOUBLESTAR=NONE +REC|GUEST266_EXPORT_2_POSITIONAL_COUNT=2 +REC|GUEST266_EXPORT_2_REQUIRED_POSITIONALS=2 +REC|GUEST266_EXPORT_2_BODY_NODE_COUNT=12 +REC|GUEST266_EXPORT_2_CALL_NAMES=append,bool,deepcopy,get,len,max,min,need,plan_rows,type,validate_job +REC|GUEST266_EXPORT_2_RETURN_FORMS=Call +REC|GUEST266_EXPORT_2_SAFE_AST_SHA256=d32af9764f3f95d11e56cd5edcc20460424a0e8642527c9ab88e9dc187541ba1 +REC|GUEST266_EXPORT_2_SAFE_AST_OUTLINE=def choose(plan, now): || rows = plan_rows(plan) || t.need(plan.get('') == [], '') || candidates = [] || for job in rows: || if not (job.get('') == '' and job.get('') is 0 and (job.get('') == []) and (job.get('') is 0) and (job.get('') is 0)): || continue || disks = job.get('') || if not (type(disks) is list and len(disks) == 0 and (disks[0].get('') == '') and (disks[0].get('') == '') and (disks[0].get('') in ('', ''))): || continue || n = job.get('') || if type(n) is not int or not 0 < n <= MAX_CONFIGURED_BYTES: || continue || producer.validate_job(job, now) || candidates.append(job) || t. +REC|GUEST266_EXPORT_3_NAME=same_state +REC|GUEST266_EXPORT_3_ARGS=before,after,vmid +REC|GUEST266_EXPORT_3_KWONLY_ARGS= +REC|GUEST266_EXPORT_3_STAR=NONE +REC|GUEST266_EXPORT_3_DOUBLESTAR=NONE +REC|GUEST266_EXPORT_3_POSITIONAL_COUNT=3 +REC|GUEST266_EXPORT_3_REQUIRED_POSITIONALS=3 +REC|GUEST266_EXPORT_3_BODY_NODE_COUNT=11 +REC|GUEST266_EXPORT_3_CALL_NAMES=get,len,membership,need,plan_rows,sorted +REC|GUEST266_EXPORT_3_RETURN_FORMS= +REC|GUEST266_EXPORT_3_SAFE_AST_SHA256=110c3ba42ad1540052bdff8e242d2feb26b25c39784fe1a9094c24e2b2bf4dc2 +REC|GUEST266_EXPORT_3_SAFE_AST_OUTLINE=def same_state(before, after, vmid): || old = plan_rows(before) || new = plan_rows(after) || membership = lambda rows: sorted(((x[''], x[''], x[''], x[''], x['']) for x in rows)) || t.need(membership(old) == membership(new), '') || t.need(before[''] == after[''], '') || matches = [j for j in new if j[''] == vmid] || original = [j for j in old if j[''] == vmid] || t.need(len(matches) == len(original) == 0, '') || a, b = (original[0], matches[0]) || t.need(b.get('') is 0 and b.get('') == [], '') || for key in ('', '', '', '', '', '', ''): || t.need(a.get(key) == b.get(key), '') +REC|GUEST266_EXPORT_4_NAME=no_active_tasks +REC|GUEST266_EXPORT_4_ARGS=rows,vmid +REC|GUEST266_EXPORT_4_KWONLY_ARGS= +REC|GUEST266_EXPORT_4_STAR=NONE +REC|GUEST266_EXPORT_4_DOUBLESTAR=NONE +REC|GUEST266_EXPORT_4_POSITIONAL_COUNT=2 +REC|GUEST266_EXPORT_4_REQUIRED_POSITIONALS=2 +REC|GUEST266_EXPORT_4_BODY_NODE_COUNT=2 +REC|GUEST266_EXPORT_4_CALL_NAMES=any,get,len,lower,need,str,type +REC|GUEST266_EXPORT_4_RETURN_FORMS= +REC|GUEST266_EXPORT_4_SAFE_AST_SHA256=81205d76854dcb627897e5d8bd82b5a49468a07f8921861e87f712f1994b804e +REC|GUEST266_EXPORT_4_SAFE_AST_OUTLINE=def no_active_tasks(rows, vmid): || t.need(type(rows) is list and len(rows) < 0, '') || for task in rows: || t.need(type(task) is dict and type(task.get('')) is str, '') || if type(task.get('')) is int and task.get('') not in (None, ''): || continue || kind = task[''] || target = str(task.get('', '')) || if kind in ('', '', '', ''): || continue || t.need(target != str(vmid) and (not any((x in kind.lower() for x in ('', '', '', '', '', '', '')))), '') +REC|GUEST266_EXPORT_5_NAME=check_result +REC|GUEST266_EXPORT_5_ARGS=result,job,work +REC|GUEST266_EXPORT_5_KWONLY_ARGS= +REC|GUEST266_EXPORT_5_STAR=NONE +REC|GUEST266_EXPORT_5_DOUBLESTAR=NONE +REC|GUEST266_EXPORT_5_POSITIONAL_COUNT=3 +REC|GUEST266_EXPORT_5_REQUIRED_POSITIONALS=3 +REC|GUEST266_EXPORT_5_BODY_NODE_COUNT=12 +REC|GUEST266_EXPORT_5_CALL_NAMES=Path,close,get,hash_file,list,listdir,need,open_dir,str,type +REC|GUEST266_EXPORT_5_RETURN_FORMS=Name +REC|GUEST266_EXPORT_5_SAFE_AST_SHA256=201602f107a661fdbd41a96feda13666bf269e0d4ee11dde9c62aedb78ee0d9e +REC|GUEST266_EXPORT_5_SAFE_AST_OUTLINE=def check_result(result, job, work): || t.need(type(result) is dict, '') || expected = Path(work) / ('' % job['']) || t.need(result.get('') == str(expected), '') || for k in ('', '', '', ''): || t.need(result.get(k) == job[k], '') || t.need(result.get('') == 0 and result.get('') is 0, '') || t.need(type(result.get('')) is int and 0 < result[''] <= job[''], '') || n, h, identity = stream.hash_file(expected, job['']) || t.need(n == result[''] and h == result.get('') and (list(identity) == result.get('')), '') || temp = Path(work) / '' || fd = t.open_dir(temp) || try: || t.need(os.listdir(fd +REC|GUEST266_EXPORT_6_NAME=run_flow +REC|GUEST266_EXPORT_6_ARGS=job,work,entries,cloud,reader,produce,state_guard,guard,compression_check,generation,say,clock +REC|GUEST266_EXPORT_6_KWONLY_ARGS= +REC|GUEST266_EXPORT_6_STAR=NONE +REC|GUEST266_EXPORT_6_DOUBLESTAR=NONE +REC|GUEST266_EXPORT_6_POSITIONAL_COUNT=12 +REC|GUEST266_EXPORT_6_REQUIRED_POSITIONALS=11 +REC|GUEST266_EXPORT_6_BODY_NODE_COUNT=35 +REC|GUEST266_EXPORT_6_CALL_NAMES=Path,all,callable,canonical_bytes,check_result,cleanup,clock,compression_check,create,discover,get,guard,int,len,make_dir,manifest_hash,need,produce,restore,say,state_guard,time,upload,valid_name,validate_inventory,validate_job +REC|GUEST266_EXPORT_6_RETURN_FORMS=Dict +REC|GUEST266_EXPORT_6_SAFE_AST_SHA256=bfd6b773e40f9e89f6777eb01922534012c4c264d67ebc9ed4889091c051893e +REC|GUEST266_EXPORT_6_SAFE_AST_OUTLINE=def run_flow(job, work, entries, cloud, reader, produce, state_guard, guard, compression_check, generation, say, clock=lambda: int(time.time())): || """""" || producer.validate_job(job, clock()) || core.validate_inventory(entries) || t.need(job[''] == '' and job.get('') is 0, '') || t.need(core.valid_name(generation), '') || t.need(all((callable(f) for f in (produce, state_guard, guard, compression_check, say, clock))), '') || work = Path(work) || state_guard() || guard() || for sub in ('', '', ''): || t.make_dir(work / sub, exclusive=0) || say('', '') || produced = produce(job, work / '') || source = check_result(produced, job, work / '') || state_guard() || +GUEST266_MODULE_EXPORT_ALIAS_DUMP_ARGV=false +GUEST266_ALL_CALL_NAMES=Path,all,any,append,bool,callable,canonical_bytes,check_result,cleanup,clock,close,compression_check,create,deepcopy,discover,get,guard,hash_file,int,len,list,listdir,lower,make_dir,manifest_hash,max,membership,min,need,open_dir,plan_rows,produce,restore,say,sorted,state_guard,str,time,type,upload,valid_name,validate_inventory,validate_job +LEGACY_RELEVANT_FUNCTIONS=_isolated_release_graph_selftest,proven_lxc_dump_argv,selftest +REC|LEGACY_FUNCTION_1_NAME=_isolated_release_graph_selftest +REC|LEGACY_FUNCTION_1_ARGS= +REC|LEGACY_FUNCTION_1_KWONLY_ARGS= +REC|LEGACY_FUNCTION_1_STAR=NONE +REC|LEGACY_FUNCTION_1_DOUBLESTAR=NONE +REC|LEGACY_FUNCTION_1_POSITIONAL_COUNT=0 +REC|LEGACY_FUNCTION_1_REQUIRED_POSITIONALS=0 +REC|LEGACY_FUNCTION_1_BODY_NODE_COUNT=7 +REC|LEGACY_FUNCTION_1_CALL_NAMES=BackupError,Path,_historical_graph_env,get,hexdigest,items,loads,resolve,run,sha256,str +REC|LEGACY_FUNCTION_1_RETURN_FORMS=Constant +REC|LEGACY_FUNCTION_1_SAFE_AST_SHA256=d2c89b325fefa61a496a88bdfc83d0c539bcafe0dcc2703c874dc81f54757ead +REC|LEGACY_FUNCTION_1_SAFE_AST_OUTLINE=def _isolated_release_graph_selftest(): || env = _historical_graph_env() || p = subprocess.run([sys.executable, '', '', _HISTORICAL_HELPER, ''], stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, cwd='', timeout=0) || if p.returncode != 0: || raise BackupError('', f'{p.returncode}{hashlib.sha256(p.stderr).hexdigest()}') || try: || out = json.loads(p.stdout) || except Exception: || raise BackupError('') || expected = {'': str(GUEST266), '': str(P265), '': str(P270), '': str(P282)} || for k, v in expected.items(): || if str(pathlib.Path(out.get(k, '')).resolve()) != str(pathlib.Path(v).resolve()): || raise BackupError('', k) || return 0 +REC|LEGACY_FUNCTION_2_NAME=proven_lxc_dump_argv +REC|LEGACY_FUNCTION_2_ARGS=t,row,node,scratch +REC|LEGACY_FUNCTION_2_KWONLY_ARGS= +REC|LEGACY_FUNCTION_2_STAR=NONE +REC|LEGACY_FUNCTION_2_DOUBLESTAR=NONE +REC|LEGACY_FUNCTION_2_POSITIONAL_COUNT=4 +REC|LEGACY_FUNCTION_2_REQUIRED_POSITIONALS=4 +REC|LEGACY_FUNCTION_2_BODY_NODE_COUNT=11 +REC|LEGACY_FUNCTION_2_CALL_NAMES=BackupError,Path,_isolated_guest266_dump_argv,_lxc_job,all,any,index,int,isinstance,len,list,startswith,str,time,type,which +REC|LEGACY_FUNCTION_2_RETURN_FORMS=Tuple +REC|LEGACY_FUNCTION_2_SAFE_AST_SHA256=b49d47e03d87aeaeb920aa1759ab55f03bfab1c328294b76b92a739d0562e308 +REC|LEGACY_FUNCTION_2_SAFE_AST_OUTLINE=def proven_lxc_dump_argv(t, row, node, scratch): || job = _lxc_job(t, row, node) || vzdump = shutil.which('') or '' || try: || argv = _isolated_guest266_dump_argv(job, vzdump, pathlib.Path(scratch), int(time.time())) || except BackupError: || raise || except Exception as e: || raise BackupError('', type(e).__name__) || if not isinstance(argv, (list, tuple)) or not argv or (not all((isinstance(x, str) for x in argv))): || raise BackupError('') || argv = list(argv) || if pathlib.Path(argv[0]).name != '' or str(int(t[''])) not in argv: || raise BackupError('') || if '' in argv or any((x.startswith('') for x in argv)): || raise BackupError('') || if not any((x == '' or x.startswith('') for x in argv)): || raise BackupError('') || if str(scratch) not in argv and (not any((x == '' + str(scratch) for x in argv))): || raise BackupError('') || if '' in argv: || i = argv.index('') || if i + 0 >= len(argv) or argv[i + 0] != str(scratch): || raise BackupError('') || elif '' + str(scratch) not in argv: || raise BackupError('') || return (argv, job) +REC|LEGACY_FUNCTION_3_NAME=selftest +REC|LEGACY_FUNCTION_3_ARGS= +REC|LEGACY_FUNCTION_3_KWONLY_ARGS= +REC|LEGACY_FUNCTION_3_STAR=NONE +REC|LEGACY_FUNCTION_3_DOUBLESTAR=NONE +REC|LEGACY_FUNCTION_3_POSITIONAL_COUNT=0 +REC|LEGACY_FUNCTION_3_REQUIRED_POSITIONALS=0 +REC|LEGACY_FUNCTION_3_BODY_NODE_COUNT=11 +REC|LEGACY_FUNCTION_3_CALL_NAMES=_isolated_release_graph_selftest,_pve_dumpdir_spec,default_targets,get,is_file,len,print,proven_lxc_dump_argv +REC|LEGACY_FUNCTION_3_RETURN_FORMS=Constant +REC|LEGACY_FUNCTION_3_SAFE_AST_SHA256=e19006ae7f92183d407a7722c74fb733dc0e993b7cc6a361ad891aa33ceb7771 +REC|LEGACY_FUNCTION_3_SAFE_AST_OUTLINE=def selftest(): || assert PART_SIZE == 0 || assert len(REMOTES) == 0 and len({p for _, p in REMOTES}) == 0 || assert len(default_targets()) >= 0 || assert {t[''] for t in default_targets() if t.get('')} == {'', '', '', '', '', '', '', '', ''} || assert _pve_dumpdir_spec('') == (0, 0) || assert _pve_dumpdir_spec('') == (0, 0) || assert GUEST266_SHA == '' || assert P282_SHA == '' || if GUEST266.is_file(): || assert _isolated_release_graph_selftest() is 0 || av, _ = proven_lxc_dump_argv({'': 0}, {'': 0, '': 0, '': '', '': ''}, '', '') || assert '' in av and '' in av and ('' in av) || print('') || return 0 +WRAPPER_SELFTEST_TOKEN=GUEST266_SUBPROCESS_FAILED +CAPTURED_KNOWN_INLINE_COUNT=2 +MATCHED_FAILING_INLINE_COUNT=1 +INLINE_SOURCE_SHA256=933857fc97556284ece79adfdc9333f8f37852f636f5882efa8382d92a3d24c5 +INLINE_SOURCE_BYTE_LENGTH=774 +INLINE_SAFE_AST_OUTLINE=import importlib, importlib.util, json, pathlib, sys || mode = sys.argv[0] || if mode == '': || out = {} || for name in ('', '', '', ''): || m = importlib.import_module(name) || out[name] = str(pathlib.Path(m.__file__).resolve()) || print(json.dumps(out, sort_keys=0, separators=('', ''))) || elif mode == '': || source = pathlib.Path(sys.argv[0]).resolve() || spec = importlib.util.spec_from_file_location('', str(source)) || if spec is None or spec.loader is None: || raise SystemExit(0) || mod = importlib.util.module_from_spec(spec) || spec.loader.exec_module(mod) || req = json.load(sys.stdin) || argv = mod.dump_argv(req[''], req[''], pathlib.Path(req['']), int(req[''])) || print(json.dumps(argv, separators=('', ''))) || else: || raise SystemExit(0) +INLINE_DUMP_ARGV_CALL_COUNT=1 +REC|INLINE_CALL|IDX=1|POSITIONALS=4 +REC|INLINE_CALL|IDX=1|KWARGS= +REC|INLINE_CALL|IDX=1|ARG_FORMS=Subscript,Subscript,Call,Call +REC|INLINE_CALL|IDX=1|ARG_NAME_HINTS=,,, +DECISION=PASS_GUEST266_EXPORT_CONTRACT_CAPTURED +NEXT_GATE=REPAIR_ONLY_VERIFIED_INCOMPATIBLE_GUEST266_INTERFACE PROBE_RC=0 -RESULT_DECISION=HOLD_NO_UNIQUE_GUEST266_COMPAT_INTERFACE -RESULT_MUTATION_OUTCOME=NO_MUTATION -TASK_RESULT=CT112_GUEST266_ABI_GUARDED_REPAIR +TASK_RESULT=CT112_GUEST266_EXPORT_CONTRACT CHANGES_MADE=false ROLLBACK_STARTED=false ROLLBACK_RESTORED=null MUTATION_OUTCOME=NO_MUTATION -HOMELAB_RESULT_CONTRACT={"version":1,"command_id":"SUPPORT-261008-CT112-GUEST266-ABI-GUARDED-REPAIR-99808R1","status":"OK","changes_made":false,"rollback_started":false,"rollback_restored":null} +HOMELAB_RESULT_CONTRACT={"version":1,"command_id":"SUPPORT-261008-CT112-GUEST266-EXPORT-CONTRACT-99809R1","status":"OK","changes_made":false,"rollback_started":false,"rollback_restored":null} OUTPUT_END CHAT_OUTPUT_END