1
0

runtime: publish SUPPORT-261008-CT112-GUEST266-EXPORT-CONTRACT-99809R1

This commit is contained in:
homelab-runtime-publisher
2026-10-07 23:11:18 +00:00
parent a6636f7350
commit 77a8296d37
4 changed files with 373 additions and 49 deletions
File diff suppressed because one or more lines are too long
@@ -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('<STRING>') == '<STRING>', '<STRING>') || rows = plan.get('<STRING>') || t.need(type(rows) is list and 0 < len(rows) <= 0 and (plan.get('<STRING>') == len(rows)), '<STRING>') || t.need(all((type(j) is dict and type(j.get('<STRING>')) is int for j in rows)), '<STRING>') || t.need(len({j['<STRING>'] for j in rows}) == len(rows), '<STRING>') || t.need(plan.get('<STRING>') is 0, '<STRING>') || 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('<STRING>') == [], '<STRING>') || candidates = [] || for job in rows: || if not (job.get('<STRING>') == '<STRING>' and job.get('<STRING>') is 0 and (job.get('<STRING>') == []) and (job.get('<STRING>') is 0) and (job.get('<STRING>') is 0)): || continue || disks = job.get('<STRING>') || if not (type(disks) is list and len(disks) == 0 and (disks[0].get('<STRING>') == '<STRING>') and (disks[0].get('<STRING>') == '<STRING>') and (disks[0].get('<STRING>') in ('<STRING>', '<STRING>'))): || continue || n = job.get('<STRING>') || 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['<STRING>'], x['<STRING>'], x['<STRING>'], x['<STRING>'], x['<STRING>']) for x in rows)) || t.need(membership(old) == membership(new), '<STRING>') || t.need(before['<STRING>'] == after['<STRING>'], '<STRING>') || matches = [j for j in new if j['<STRING>'] == vmid] || original = [j for j in old if j['<STRING>'] == vmid] || t.need(len(matches) == len(original) == 0, '<STRING>') || a, b = (original[0], matches[0]) || t.need(b.get('<STRING>') is 0 and b.get('<STRING>') == [], '<STRING>') || for key in ('<STRING>', '<STRING>', '<STRING>', '<STRING>', '<STRING>', '<STRING>', '<STRING>'): || t.need(a.get(key) == b.get(key), '<STRING>')
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, '<STRING>') || for task in rows: || t.need(type(task) is dict and type(task.get('<STRING>')) is str, '<STRING>') || if type(task.get('<STRING>')) is int and task.get('<STRING>') not in (None, '<STRING>'): || continue || kind = task['<STRING>'] || target = str(task.get('<STRING>', '<STRING>')) || if kind in ('<STRING>', '<STRING>', '<STRING>', '<STRING>'): || continue || t.need(target != str(vmid) and (not any((x in kind.lower() for x in ('<STRING>', '<STRING>', '<STRING>', '<STRING>', '<STRING>', '<STRING>', '<STRING>')))), '<STRING>')
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, '<STRING>') || expected = Path(work) / ('<STRING>' % job['<STRING>']) || t.need(result.get('<STRING>') == str(expected), '<STRING>') || for k in ('<STRING>', '<STRING>', '<STRING>', '<STRING>'): || t.need(result.get(k) == job[k], '<STRING>') || t.need(result.get('<STRING>') == 0 and result.get('<STRING>') is 0, '<STRING>') || t.need(type(result.get('<STRING>')) is int and 0 < result['<STRING>'] <= job['<STRING>'], '<STRING>') || n, h, identity = stream.hash_file(expected, job['<STRING>']) || t.need(n == result['<STRING>'] and h == result.get('<STRING>') and (list(identity) == result.get('<STRING>')), '<STRING>') || temp = Path(work) / '<STRING>' || 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())): || """<STRING>""" || producer.validate_job(job, clock()) || core.validate_inventory(entries) || t.need(job['<STRING>'] == '<STRING>' and job.get('<STRING>') is 0, '<STRING>') || t.need(core.valid_name(generation), '<STRING>') || t.need(all((callable(f) for f in (produce, state_guard, guard, compression_check, say, clock))), '<STRING>') || work = Path(work) || state_guard() || guard() || for sub in ('<STRING>', '<STRING>', '<STRING>'): || t.make_dir(work / sub, exclusive=0) || say('<STRING>', '<STRING>') || produced = produce(job, work / '<STRING>') || source = check_result(produced, job, work / '<STRING>') || 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, '<STRING>', '<STRING>', _HISTORICAL_HELPER, '<STRING>'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, cwd='<STRING>', timeout=0) || if p.returncode != 0: || raise BackupError('<STRING>', f'<STRING>{p.returncode}<STRING>{hashlib.sha256(p.stderr).hexdigest()}') || try: || out = json.loads(p.stdout) || except Exception: || raise BackupError('<STRING>') || expected = {'<STRING>': str(GUEST266), '<STRING>': str(P265), '<STRING>': str(P270), '<STRING>': str(P282)} || for k, v in expected.items(): || if str(pathlib.Path(out.get(k, '<STRING>')).resolve()) != str(pathlib.Path(v).resolve()): || raise BackupError('<STRING>', 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('<STRING>') or '<STRING>' || try: || argv = _isolated_guest266_dump_argv(job, vzdump, pathlib.Path(scratch), int(time.time())) || except BackupError: || raise || except Exception as e: || raise BackupError('<STRING>', type(e).__name__) || if not isinstance(argv, (list, tuple)) or not argv or (not all((isinstance(x, str) for x in argv))): || raise BackupError('<STRING>') || argv = list(argv) || if pathlib.Path(argv[0]).name != '<STRING>' or str(int(t['<STRING>'])) not in argv: || raise BackupError('<STRING>') || if '<STRING>' in argv or any((x.startswith('<STRING>') for x in argv)): || raise BackupError('<STRING>') || if not any((x == '<STRING>' or x.startswith('<STRING>') for x in argv)): || raise BackupError('<STRING>') || if str(scratch) not in argv and (not any((x == '<STRING>' + str(scratch) for x in argv))): || raise BackupError('<STRING>') || if '<STRING>' in argv: || i = argv.index('<STRING>') || if i + 0 >= len(argv) or argv[i + 0] != str(scratch): || raise BackupError('<STRING>') || elif '<STRING>' + str(scratch) not in argv: || raise BackupError('<STRING>') || 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['<STRING>'] for t in default_targets() if t.get('<STRING>')} == {'<STRING>', '<STRING>', '<STRING>', '<STRING>', '<STRING>', '<STRING>', '<STRING>', '<STRING>', '<STRING>'} || assert _pve_dumpdir_spec('<STRING>') == (0, 0) || assert _pve_dumpdir_spec('<STRING>') == (0, 0) || assert GUEST266_SHA == '<STRING>' || assert P282_SHA == '<STRING>' || if GUEST266.is_file(): || assert _isolated_release_graph_selftest() is 0 || av, _ = proven_lxc_dump_argv({'<STRING>': 0}, {'<STRING>': 0, '<STRING>': 0, '<STRING>': '<STRING>', '<STRING>': '<STRING>'}, '<STRING>', '<STRING>') || assert '<STRING>' in av and '<STRING>' in av and ('<STRING>' in av) || print('<STRING>') || 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 == '<STRING>': || out = {} || for name in ('<STRING>', '<STRING>', '<STRING>', '<STRING>'): || m = importlib.import_module(name) || out[name] = str(pathlib.Path(m.__file__).resolve()) || print(json.dumps(out, sort_keys=0, separators=('<STRING>', '<STRING>'))) || elif mode == '<STRING>': || source = pathlib.Path(sys.argv[0]).resolve() || spec = importlib.util.spec_from_file_location('<STRING>', 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['<STRING>'], req['<STRING>'], pathlib.Path(req['<STRING>']), int(req['<STRING>'])) || print(json.dumps(argv, separators=('<STRING>', '<STRING>'))) || 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=<COMPLEX>,<COMPLEX>,<COMPLEX>,<COMPLEX>
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
+11 -11
View File
File diff suppressed because one or more lines are too long
+146 -38
View File
@@ -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('<STRING>') == '<STRING>', '<STRING>') || rows = plan.get('<STRING>') || t.need(type(rows) is list and 0 < len(rows) <= 0 and (plan.get('<STRING>') == len(rows)), '<STRING>') || t.need(all((type(j) is dict and type(j.get('<STRING>')) is int for j in rows)), '<STRING>') || t.need(len({j['<STRING>'] for j in rows}) == len(rows), '<STRING>') || t.need(plan.get('<STRING>') is 0, '<STRING>') || 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('<STRING>') == [], '<STRING>') || candidates = [] || for job in rows: || if not (job.get('<STRING>') == '<STRING>' and job.get('<STRING>') is 0 and (job.get('<STRING>') == []) and (job.get('<STRING>') is 0) and (job.get('<STRING>') is 0)): || continue || disks = job.get('<STRING>') || if not (type(disks) is list and len(disks) == 0 and (disks[0].get('<STRING>') == '<STRING>') and (disks[0].get('<STRING>') == '<STRING>') and (disks[0].get('<STRING>') in ('<STRING>', '<STRING>'))): || continue || n = job.get('<STRING>') || 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['<STRING>'], x['<STRING>'], x['<STRING>'], x['<STRING>'], x['<STRING>']) for x in rows)) || t.need(membership(old) == membership(new), '<STRING>') || t.need(before['<STRING>'] == after['<STRING>'], '<STRING>') || matches = [j for j in new if j['<STRING>'] == vmid] || original = [j for j in old if j['<STRING>'] == vmid] || t.need(len(matches) == len(original) == 0, '<STRING>') || a, b = (original[0], matches[0]) || t.need(b.get('<STRING>') is 0 and b.get('<STRING>') == [], '<STRING>') || for key in ('<STRING>', '<STRING>', '<STRING>', '<STRING>', '<STRING>', '<STRING>', '<STRING>'): || t.need(a.get(key) == b.get(key), '<STRING>')
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, '<STRING>') || for task in rows: || t.need(type(task) is dict and type(task.get('<STRING>')) is str, '<STRING>') || if type(task.get('<STRING>')) is int and task.get('<STRING>') not in (None, '<STRING>'): || continue || kind = task['<STRING>'] || target = str(task.get('<STRING>', '<STRING>')) || if kind in ('<STRING>', '<STRING>', '<STRING>', '<STRING>'): || continue || t.need(target != str(vmid) and (not any((x in kind.lower() for x in ('<STRING>', '<STRING>', '<STRING>', '<STRING>', '<STRING>', '<STRING>', '<STRING>')))), '<STRING>')
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, '<STRING>') || expected = Path(work) / ('<STRING>' % job['<STRING>']) || t.need(result.get('<STRING>') == str(expected), '<STRING>') || for k in ('<STRING>', '<STRING>', '<STRING>', '<STRING>'): || t.need(result.get(k) == job[k], '<STRING>') || t.need(result.get('<STRING>') == 0 and result.get('<STRING>') is 0, '<STRING>') || t.need(type(result.get('<STRING>')) is int and 0 < result['<STRING>'] <= job['<STRING>'], '<STRING>') || n, h, identity = stream.hash_file(expected, job['<STRING>']) || t.need(n == result['<STRING>'] and h == result.get('<STRING>') and (list(identity) == result.get('<STRING>')), '<STRING>') || temp = Path(work) / '<STRING>' || 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())): || """<STRING>""" || producer.validate_job(job, clock()) || core.validate_inventory(entries) || t.need(job['<STRING>'] == '<STRING>' and job.get('<STRING>') is 0, '<STRING>') || t.need(core.valid_name(generation), '<STRING>') || t.need(all((callable(f) for f in (produce, state_guard, guard, compression_check, say, clock))), '<STRING>') || work = Path(work) || state_guard() || guard() || for sub in ('<STRING>', '<STRING>', '<STRING>'): || t.make_dir(work / sub, exclusive=0) || say('<STRING>', '<STRING>') || produced = produce(job, work / '<STRING>') || source = check_result(produced, job, work / '<STRING>') || 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, '<STRING>', '<STRING>', _HISTORICAL_HELPER, '<STRING>'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, cwd='<STRING>', timeout=0) || if p.returncode != 0: || raise BackupError('<STRING>', f'<STRING>{p.returncode}<STRING>{hashlib.sha256(p.stderr).hexdigest()}') || try: || out = json.loads(p.stdout) || except Exception: || raise BackupError('<STRING>') || expected = {'<STRING>': str(GUEST266), '<STRING>': str(P265), '<STRING>': str(P270), '<STRING>': str(P282)} || for k, v in expected.items(): || if str(pathlib.Path(out.get(k, '<STRING>')).resolve()) != str(pathlib.Path(v).resolve()): || raise BackupError('<STRING>', 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('<STRING>') or '<STRING>' || try: || argv = _isolated_guest266_dump_argv(job, vzdump, pathlib.Path(scratch), int(time.time())) || except BackupError: || raise || except Exception as e: || raise BackupError('<STRING>', type(e).__name__) || if not isinstance(argv, (list, tuple)) or not argv or (not all((isinstance(x, str) for x in argv))): || raise BackupError('<STRING>') || argv = list(argv) || if pathlib.Path(argv[0]).name != '<STRING>' or str(int(t['<STRING>'])) not in argv: || raise BackupError('<STRING>') || if '<STRING>' in argv or any((x.startswith('<STRING>') for x in argv)): || raise BackupError('<STRING>') || if not any((x == '<STRING>' or x.startswith('<STRING>') for x in argv)): || raise BackupError('<STRING>') || if str(scratch) not in argv and (not any((x == '<STRING>' + str(scratch) for x in argv))): || raise BackupError('<STRING>') || if '<STRING>' in argv: || i = argv.index('<STRING>') || if i + 0 >= len(argv) or argv[i + 0] != str(scratch): || raise BackupError('<STRING>') || elif '<STRING>' + str(scratch) not in argv: || raise BackupError('<STRING>') || 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['<STRING>'] for t in default_targets() if t.get('<STRING>')} == {'<STRING>', '<STRING>', '<STRING>', '<STRING>', '<STRING>', '<STRING>', '<STRING>', '<STRING>', '<STRING>'} || assert _pve_dumpdir_spec('<STRING>') == (0, 0) || assert _pve_dumpdir_spec('<STRING>') == (0, 0) || assert GUEST266_SHA == '<STRING>' || assert P282_SHA == '<STRING>' || if GUEST266.is_file(): || assert _isolated_release_graph_selftest() is 0 || av, _ = proven_lxc_dump_argv({'<STRING>': 0}, {'<STRING>': 0, '<STRING>': 0, '<STRING>': '<STRING>', '<STRING>': '<STRING>'}, '<STRING>', '<STRING>') || assert '<STRING>' in av and '<STRING>' in av and ('<STRING>' in av) || print('<STRING>') || 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 == '<STRING>': || out = {} || for name in ('<STRING>', '<STRING>', '<STRING>', '<STRING>'): || m = importlib.import_module(name) || out[name] = str(pathlib.Path(m.__file__).resolve()) || print(json.dumps(out, sort_keys=0, separators=('<STRING>', '<STRING>'))) || elif mode == '<STRING>': || source = pathlib.Path(sys.argv[0]).resolve() || spec = importlib.util.spec_from_file_location('<STRING>', 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['<STRING>'], req['<STRING>'], pathlib.Path(req['<STRING>']), int(req['<STRING>'])) || print(json.dumps(argv, separators=('<STRING>', '<STRING>'))) || 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=<COMPLEX>,<COMPLEX>,<COMPLEX>,<COMPLEX>
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