diff --git a/runtime/history/SUPPORT-261008-CT112-PLAN-DATAFLOW-ROOT-99824R1.json b/runtime/history/SUPPORT-261008-CT112-PLAN-DATAFLOW-ROOT-99824R1.json new file mode 100644 index 00000000..c0a39e40 --- /dev/null +++ b/runtime/history/SUPPORT-261008-CT112-PLAN-DATAFLOW-ROOT-99824R1.json @@ -0,0 +1,38 @@ +{ + "schema_version": 1, + "channel": "homelab-runtime", + "command_id": "SUPPORT-261008-CT112-PLAN-DATAFLOW-ROOT-99824R1", + "status": "OK", + "rc": 0, + "host": "pve01", + "mode": "read-only", + "component": "ct112-plan-dataflow-root", + "started_at_utc": "2026-10-08T00:35:34Z", + "finished_at_utc": "2026-10-08T00:35:40Z", + "reference_register_checked": true, + "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", + "error_register_checked": true, + "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", + "command_sha256": "e556870d31392c4f44f6bf6b71f9a92b401d209eb60db4d0148f3eb69139f49a", + "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": "7a58f71f363c8e390fd3b6af5b01d7f21d758c734e92ae73164c0e5358fa59b7", + "sanitized_output_sha256": "7a58f71f363c8e390fd3b6af5b01d7f21d758c734e92ae73164c0e5358fa59b7", + "output_truncated_in_json": false, + "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", + "output": "CT112_PLAN_DATAFLOW_ROOT=V1\nMODE=read-only\nNO_BACKUP_EXECUTION=true\nNO_MUTATION=true\nPINNED_WRAPPER_COUNT=1\nSOURCE_IDENTITIES_VALID=true\nP282_SELECT112_FUNCTION_COUNT=1\nP282_SELECT112_ARGS=current,baseline,now\nP282_SELECT112_FIRST_LINE=29\nP282_SELECT112_TOP_LEVEL_STATEMENTS=25\nREC|P282_SELECT112|IDX=1|LINE=30\nREC|P282_SELECT112|IDX=1|KIND=Assign\nREC|P282_SELECT112|IDX=1|AST=rows = g.plan_rows(current)\nREC|P282_SELECT112|IDX=2|LINE=30\nREC|P282_SELECT112|IDX=2|KIND=Assign\nREC|P282_SELECT112|IDX=2|AST=previous = g.plan_rows(baseline)\nREC|P282_SELECT112|IDX=3|LINE=31\nREC|P282_SELECT112|IDX=3|KIND=Assign\nREC|P282_SELECT112|IDX=3|AST=by_id = _j_vmid_: j for j in previous_\nREC|P282_SELECT112|IDX=4|LINE=32\nREC|P282_SELECT112|IDX=4|KIND=Expr\nREC|P282_SELECT112|IDX=4|AST=need(TARGET_VMID in by_id, __)\nREC|P282_SELECT112|IDX=5|LINE=33\nREC|P282_SELECT112|IDX=5|KIND=Expr\nREC|P282_SELECT112|IDX=5|AST=g.same_state(baseline, current, TARGET_VMID)\nREC|P282_SELECT112|IDX=6|LINE=34\nREC|P282_SELECT112|IDX=6|KIND=Expr\nREC|P282_SELECT112|IDX=6|AST=need(_j_vmid_ for j in rows_ == set(by_id), __)\nREC|P282_SELECT112|IDX=7|LINE=35\nREC|P282_SELECT112|IDX=7|KIND=For\nREC|P282_SELECT112|IDX=7|AST=for row in rows: need(row_config_sha256_ == by_id_row_vmid_config_sha256_, __)\nREC|P282_SELECT112|IDX=8|LINE=37\nREC|P282_SELECT112|IDX=8|KIND=Assign\nREC|P282_SELECT112|IDX=8|AST=selected = _j for j in rows if j_vmid_ == TARGET_VMID_\nREC|P282_SELECT112|IDX=9|LINE=38\nREC|P282_SELECT112|IDX=9|KIND=Expr\nREC|P282_SELECT112|IDX=9|AST=need(len(selected) == 1, _CT112_NOT_UNIQUE_)\nREC|P282_SELECT112|IDX=10|LINE=39\nREC|P282_SELECT112|IDX=10|KIND=Assign\nREC|P282_SELECT112|IDX=10|AST=job = copy.deepcopy(selected_0_)\nREC|P282_SELECT112|IDX=11|LINE=39\nREC|P282_SELECT112|IDX=11|KIND=Expr\nREC|P282_SELECT112|IDX=11|AST=old.validate_job(job, now)\nREC|P282_SELECT112|IDX=12|LINE=40\nREC|P282_SELECT112|IDX=12|KIND=Expr\nREC|P282_SELECT112|IDX=12|AST=need(current.get(__) == _, __)\nREC|P282_SELECT112|IDX=13|LINE=41\nREC|P282_SELECT112|IDX=13|KIND=Expr\nREC|P282_SELECT112|IDX=13|AST=need(job.get(_compression_dependent_) is False and job.get(_configured_full_cycle_fits_) is True, __)\nREC|P282_SELECT112|IDX=14|LINE=42\nREC|P282_SELECT112|IDX=14|KIND=Assign\nREC|P282_SELECT112|IDX=14|AST=disks = job.get(_disks_)\nREC|P282_SELECT112|IDX=15|LINE=42\nREC|P282_SELECT112|IDX=15|KIND=Expr\nREC|P282_SELECT112|IDX=15|AST=need(type(disks) is list and len(disks) == 1, __)\nREC|P282_SELECT112|IDX=16|LINE=43\nREC|P282_SELECT112|IDX=16|KIND=Assign\nREC|P282_SELECT112|IDX=16|AST=disk = disks_0_\nREC|P282_SELECT112|IDX=17|LINE=44\nREC|P282_SELECT112|IDX=17|KIND=Expr\nREC|P282_SELECT112|IDX=17|AST=need(disk.get(__) == _rootfs_ and disk.get(__) == __ and (disk.get(__) in (__, __)), __)\nREC|P282_SELECT112|IDX=18|LINE=45\nREC|P282_SELECT112|IDX=18|KIND=Assign\nREC|P282_SELECT112|IDX=18|AST=size = job.get(__)\nREC|P282_SELECT112|IDX=19|LINE=46\nREC|P282_SELECT112|IDX=19|KIND=Expr\nREC|P282_SELECT112|IDX=19|AST=need(type(size) is int and 0 < size <= stream.MAX_BYTES and (size == disk.get(__)), __)\nREC|P282_SELECT112|IDX=20|LINE=47\nREC|P282_SELECT112|IDX=20|KIND=Assign\nREC|P282_SELECT112|IDX=20|AST=stores = _x__: x for x in current.get(__, _)_\nREC|P282_SELECT112|IDX=21|LINE=47\nREC|P282_SELECT112|IDX=21|KIND=Assign\nREC|P282_SELECT112|IDX=21|AST=st = stores.get(disk.get(__), _)\nREC|P282_SELECT112|IDX=22|LINE=48\nREC|P282_SELECT112|IDX=22|KIND=Expr\nREC|P282_SELECT112|IDX=22|AST=need(st.get(__) is True and st.get(__) is True and (st.get(_type_) in (__, __)), __)\nREC|P282_SELECT112|IDX=23|LINE=49\nREC|P282_SELECT112|IDX=23|KIND=Expr\nREC|P282_SELECT112|IDX=23|AST=need(type(st.get(__)) is int and st__ >= max(1024 _ 3, size), __)\nREC|P282_SELECT112|IDX=24|LINE=50\nREC|P282_SELECT112|IDX=24|KIND=Expr\nREC|P282_SELECT112|IDX=24|AST=require_target(job, by_id_TARGET_VMID_config_sha256_)\nP282_SELECT112_LINE30_AST=rows = g.plan_rows(current),previous = g.plan_rows(baseline)\nREC|SELECT_CALL|LINE=30|NAME=plan_rows\nREC|SELECT_CALL|LINE=30|AST=g.plan_rows(current)\nREC|SELECT_CALL|LINE=30|NAME=plan_rows\nREC|SELECT_CALL|LINE=30|AST=g.plan_rows(baseline)\nREC|SELECT_CALL|LINE=32|NAME=need\nREC|SELECT_CALL|LINE=32|AST=need(TARGET_VMID in by_id, __)\nREC|SELECT_CALL|LINE=33|NAME=same_state\nREC|SELECT_CALL|LINE=33|AST=g.same_state(baseline, current, TARGET_VMID)\nREC|SELECT_CALL|LINE=34|NAME=need\nREC|SELECT_CALL|LINE=34|AST=need(_j_vmid_ for j in rows_ == set(by_id), __)\nREC|SELECT_CALL|LINE=36|NAME=need\nREC|SELECT_CALL|LINE=36|AST=need(row_config_sha256_ == by_id_row_vmid_config_sha256_, __)\nREC|SELECT_CALL|LINE=38|NAME=need\nREC|SELECT_CALL|LINE=38|AST=need(len(selected) == 1, _CT112_NOT_UNIQUE_)\nREC|SELECT_CALL|LINE=39|NAME=validate_job\nREC|SELECT_CALL|LINE=39|AST=old.validate_job(job, now)\nREC|SELECT_CALL|LINE=40|NAME=need\nREC|SELECT_CALL|LINE=40|AST=need(current.get(__) == _, __)\nREC|SELECT_CALL|LINE=41|NAME=need\nREC|SELECT_CALL|LINE=41|AST=need(job.get(_compression_dependent_) is False and job.get(_configured_full_cycle_fits_) is True, __)\nREC|SELECT_CALL|LINE=42|NAME=need\nREC|SELECT_CALL|LINE=42|AST=need(type(disks) is list and len(disks) == 1, __)\nREC|SELECT_CALL|LINE=44|NAME=need\nREC|SELECT_CALL|LINE=44|AST=need(disk.get(__) == _rootfs_ and disk.get(__) == __ and (disk.get(__) in (__, __)), __)\nREC|SELECT_CALL|LINE=46|NAME=need\nREC|SELECT_CALL|LINE=46|AST=need(type(size) is int and 0 < size <= stream.MAX_BYTES and (size == disk.get(__)), __)\nREC|SELECT_CALL|LINE=48|NAME=need\nREC|SELECT_CALL|LINE=48|AST=need(st.get(__) is True and st.get(__) is True and (st.get(_type_) in (__, __)), __)\nREC|SELECT_CALL|LINE=49|NAME=need\nREC|SELECT_CALL|LINE=49|AST=need(type(st.get(__)) is int and st__ >= max(1024 _ 3, size), __)\nREC|SELECT_CALL|LINE=50|NAME=require_target\nREC|SELECT_CALL|LINE=50|AST=require_target(job, by_id_TARGET_VMID_config_sha256_)\nHANDLER_BASELINE_FUNCTION_COUNT=1\nHANDLER_BASELINE_ARGS=NONE\nHANDLER_BASELINE_FIRST_LINE=31\nHANDLER_BASELINE_TOP_LEVEL_STATEMENTS=3\nREC|HANDLER_BASELINE|IDX=1|LINE=32\nREC|HANDLER_BASELINE|IDX=1|KIND=Assign\nREC|HANDLER_BASELINE|IDX=1|AST=b = t.read_secure(PLAN, 1024 _ 1024, private=True)_0_\nREC|HANDLER_BASELINE|IDX=2|LINE=33\nREC|HANDLER_BASELINE|IDX=2|KIND=If\nREC|HANDLER_BASELINE|IDX=2|AST=if t.sha(b) _= PLAN_SHA: raise RuntimeError(_PLAN_REFERENCE_IDENTITY_)\nREC|HANDLER_BASELINE|IDX=3|LINE=34\nREC|HANDLER_BASELINE|IDX=3|KIND=Try\nREC|HANDLER_BASELINE|IDX=3|AST=try: return json.loads(b.decode(__, __)) except (ValueError, UnicodeError): raise RuntimeError(__) from None\nHANDLER_FRESH_FUNCTION_COUNT=1\nHANDLER_FRESH_ARGS=now\nHANDLER_FRESH_FIRST_LINE=42\nHANDLER_FRESH_TOP_LEVEL_STATEMENTS=8\nREC|HANDLER_FRESH|IDX=1|LINE=43\nREC|HANDLER_FRESH|IDX=1|KIND=Assign\nREC|HANDLER_FRESH|IDX=1|AST=rows = _json_cmd(__, __, __)\nREC|HANDLER_FRESH|IDX=2|LINE=44\nREC|HANDLER_FRESH|IDX=2|KIND=Assign\nREC|HANDLER_FRESH|IDX=2|AST=stores = _json_cmd(__)\nREC|HANDLER_FRESH|IDX=3|LINE=45\nREC|HANDLER_FRESH|IDX=3|KIND=If\nREC|HANDLER_FRESH|IDX=3|AST=if not isinstance(rows, list) or not isinstance(stores, list): raise RuntimeError(__)\nREC|HANDLER_FRESH|IDX=4|LINE=46\nREC|HANDLER_FRESH|IDX=4|KIND=Assign\nREC|HANDLER_FRESH|IDX=4|AST=configs = _\nREC|HANDLER_FRESH|IDX=5|LINE=47\nREC|HANDLER_FRESH|IDX=5|KIND=For\nREC|HANDLER_FRESH|IDX=5|AST=for r in rows: if not isinstance(r, dict) or r.get(_node_) _= _pve01_ or r.get(_type_) not in (_lxc_, __): continue vmid = r.get(_vmid_) if type(vmid) is not int: raise RuntimeError(__) configs_vmid_ = _json_cmd(f__r_type__vmid__)\nREC|HANDLER_FRESH|IDX=6|LINE=52\nREC|HANDLER_FRESH|IDX=6|KIND=Assign\nREC|HANDLER_FRESH|IDX=6|AST=v = os.statvfs(STAGING)\nREC|HANDLER_FRESH|IDX=7|LINE=52\nREC|HANDLER_FRESH|IDX=7|KIND=Assign\nREC|HANDLER_FRESH|IDX=7|AST=free = v.f_frsize _ v.f_bavail\nREC|HANDLER_FRESH|IDX=8|LINE=53\nREC|HANDLER_FRESH|IDX=8|KIND=Return\nREC|HANDLER_FRESH|IDX=8|AST=return pve265.make_plan(rows, configs, stores, _defaults(), free, now, node=_pve01_)\nHANDLER_RUN_FUNCTION_COUNT=1\nHANDLER_RUN_ARGS=target,state_writer\nHANDLER_RUN_FIRST_LINE=100\nHANDLER_RUN_TOP_LEVEL_STATEMENTS=24\nREC|HANDLER_RUN|IDX=1|LINE=101\nREC|HANDLER_RUN|IDX=1|KIND=If\nREC|HANDLER_RUN|IDX=1|AST=if not isinstance(target, dict) or target.get(__) _= CT_ID or target.get(_vmid_) _= 112: return (_ for _ in ()).throw(RuntimeError(__))\nREC|HANDLER_RUN|IDX=2|LINE=102\nREC|HANDLER_RUN|IDX=2|KIND=If\nREC|HANDLER_RUN|IDX=2|AST=if _sha(PLAN, 1024 _ 1024) _= PLAN_SHA: raise RuntimeError(_PLAN_REFERENCE_IDENTITY_)\nREC|HANDLER_RUN|IDX=3|LINE=103\nREC|HANDLER_RUN|IDX=3|KIND=Assign\nREC|HANDLER_RUN|IDX=3|AST=tools = __: _tool(VZDUMP, VZDUMP_SHA), __: _tool(ZSTD, ZSTD_SHA)_\nREC|HANDLER_RUN|IDX=4|LINE=103\nREC|HANDLER_RUN|IDX=4|KIND=Expr\nREC|HANDLER_RUN|IDX=4|AST=_tool(RCLONE, RCLONE_SHA)\nREC|HANDLER_RUN|IDX=5|LINE=104\nREC|HANDLER_RUN|IDX=5|KIND=Assign\nREC|HANDLER_RUN|IDX=5|AST=pvesh_sha = _sha(PVESH)\nREC|HANDLER_RUN|IDX=6|LINE=104\nREC|HANDLER_RUN|IDX=6|KIND=Assign\nREC|HANDLER_RUN|IDX=6|AST=baseline = _baseline()\nREC|HANDLER_RUN|IDX=7|LINE=104\nREC|HANDLER_RUN|IDX=7|KIND=Assign\nREC|HANDLER_RUN|IDX=7|AST=now = int(time.time())\nREC|HANDLER_RUN|IDX=8|LINE=104\nREC|HANDLER_RUN|IDX=8|KIND=Assign\nREC|HANDLER_RUN|IDX=8|AST=current = _fresh_plan(now)\nREC|HANDLER_RUN|IDX=9|LINE=104\nREC|HANDLER_RUN|IDX=9|KIND=Assign\nREC|HANDLER_RUN|IDX=9|AST=job = pve282.select112(current, baseline, now)\nREC|HANDLER_RUN|IDX=10|LINE=105\nREC|HANDLER_RUN|IDX=10|KIND=Assign\nREC|HANDLER_RUN|IDX=10|AST=expected = job_config_sha256_\nREC|HANDLER_RUN|IDX=11|LINE=105\nREC|HANDLER_RUN|IDX=11|KIND=Assign\nREC|HANDLER_RUN|IDX=11|AST=mapping = pve282.host_mapping()\nREC|HANDLER_RUN|IDX=12|LINE=105\nREC|HANDLER_RUN|IDX=12|KIND=Expr\nREC|HANDLER_RUN|IDX=12|AST=pve282.validate_mapping(mapping)\nREC|HANDLER_RUN|IDX=13|LINE=106\nREC|HANDLER_RUN|IDX=13|KIND=FunctionDef\nREC|HANDLER_RUN|IDX=13|AST=def producer_guard(): now2 = int(time.time()) cur = _fresh_plan(now2) fresh = pve282.select112(cur, baseline, now2) tasks = _json_cmd(__, __, __) guest266.no_active_tasks(tasks, 112) if _sha(PVESH) _= pvesh_sha: raise RuntimeError(__) pve282.live_gate(fresh, str(PVESH), pvesh_sha, expected)\nVZDUMP_CONFIG_BYTES=566\nVZDUMP_CONFIG_TYPED_INPUT=str\nDRY_RUN_STARTED=true\nBASELINE_LOAD_OK=true\nFRESH_PLAN_MAKE_OK=true\nBASELINE_LIVE_PLAN_CHANGED_KEYS=all_guest_coverage_eligible,collected_at_utc,global_blockers,global_defaults,guest_membership_and_configs_stable,jobs,local_guest_count,node_execution_approved,observed_at,pvesh_get_calls,pvesh_sha256,refresh_required_before_backup,staging_free_bytes,storages,tools\nBASELINE_PLAN_TYPE=dict\nBASELINE_PLAN_KEYS=all_guest_coverage_eligible,backup_executed,capacity_policy,collected_at_utc,full_host_coverage,global_blockers,global_defaults,guest_membership_and_configs_stable,jobs,local_guest_count,node,node_execution_approved,nodeset_backup_approved,observed_at,pvesh_get_calls,pvesh_sha256,refresh_required_before_backup,schema_version,staging_free_bytes,storages,tools\nBASELINE_PLAN_JOBS_TYPE=list\nBASELINE_PLAN_JOB_COUNT=6\nBASELINE_PLAN_VMID_LIST_HASH=b6b595ac377f78e071aca2ab359a7c7ae1bcb0485e68728a7c48f076f36cde40\nBASELINE_PLAN_VM112_COUNT=1\nBASELINE_PLAN_VM112_FIELDS=application_consistency_verified,archive_cap_bytes,blockers,cdrom_count,cdrom_media_included,compression_dependent,config_sha256,configured_archive_bound_bytes,configured_disk_bytes,configured_full_cycle_fits,coverage_eligible,disks,global_defaults_sha256,guest_restore_verified,hookscript_present,local_reserve_bytes,lock_present,node,observed_at,reported_maxdisk_bytes,reported_maxmem_bytes,snapshot_history_included,status,template,type,unused_volume_count,vmid\nBASELINE_PLAN_VM112_AGE_SECONDS=2223483\nFRESH_PLAN_TYPE=dict\nFRESH_PLAN_KEYS=all_guest_coverage_eligible,backup_executed,capacity_policy,full_host_coverage,global_blockers,global_defaults,jobs,local_guest_count,node,nodeset_backup_approved,observed_at,schema_version,staging_free_bytes,storages\nFRESH_PLAN_JOBS_TYPE=list\nFRESH_PLAN_JOB_COUNT=8\nFRESH_PLAN_VMID_LIST_HASH=a6268963746816277a805ff5113847e826ba0ce06c0ae1cf316594a474670de6\nFRESH_PLAN_VM112_COUNT=1\nFRESH_PLAN_VM112_FIELDS=application_consistency_verified,archive_cap_bytes,blockers,cdrom_count,cdrom_media_included,compression_dependent,config_sha256,configured_archive_bound_bytes,configured_disk_bytes,configured_full_cycle_fits,coverage_eligible,disks,global_defaults_sha256,guest_restore_verified,hookscript_present,local_reserve_bytes,lock_present,node,observed_at,reported_maxdisk_bytes,reported_maxmem_bytes,snapshot_history_included,status,template,type,unused_volume_count,vmid\nFRESH_PLAN_VM112_AGE_SECONDS=6\nBASELINE_LIVE_VM112_CHANGED_KEYS=blockers,coverage_eligible,global_defaults_sha256,observed_at\nVM112_FIELD_CONFIG_SHA256_EQUAL=true\nVM112_FIELD_GLOBAL_DEFAULTS_SHA256_EQUAL=false\nVM112_FIELD_NODE_EQUAL=true\nVM112_FIELD_VMID_EQUAL=true\nVM112_FIELD_TYPE_EQUAL=true\nVM112_FIELD_TEMPLATE_EQUAL=true\nVM112_FIELD_BLOCKERS_EQUAL=false\nVM112_FIELD_COVERAGE_ELIGIBLE_EQUAL=false\nVM112_FIELD_COMPRESSION_DEPENDENT_EQUAL=true\nVM112_FIELD_CONFIGURED_FULL_CYCLE_FITS_EQUAL=true\nREAL_SELECT112_DRYRUN_SKIPPED=true\nDECISION=PASS_SOURCE_AND_LIVE_PLAN_COMPARISON_RECORDED\nNEXT_GATE=FIX_EXACT_PLAN_NOT_STABLE_MISMATCH_NOT_GUARD_BYPASS\nCHANGES_MADE=false\nROLLBACK_STARTED=false\nROLLBACK_RESTORED=null\nMUTATION_OUTCOME=NO_MUTATION\nEND_MARKER=true\nHOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"SUPPORT-261008-CT112-PLAN-DATAFLOW-ROOT-99824R1\",\"status\":\"OK\",\"changes_made\":false,\"rollback_started\":false,\"rollback_restored\":null}\nPLAN_DATAFLOW_PYTHON_RC=0\n" +} diff --git a/runtime/history/SUPPORT-261008-CT112-PLAN-DATAFLOW-ROOT-99824R1.txt b/runtime/history/SUPPORT-261008-CT112-PLAN-DATAFLOW-ROOT-99824R1.txt new file mode 100644 index 00000000..7608c4aa --- /dev/null +++ b/runtime/history/SUPPORT-261008-CT112-PLAN-DATAFLOW-ROOT-99824R1.txt @@ -0,0 +1,274 @@ +CHAT_OUTPUT_BEGIN +COMMAND_ID=SUPPORT-261008-CT112-PLAN-DATAFLOW-ROOT-99824R1 +STATUS=OK +RC=0 +HOST=pve01 +MODE=read-only +COMPONENT=ct112-plan-dataflow-root +REFERENCE_REGISTER_CHECK=OK +REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 +ERROR_REGISTER_CHECK=OK +ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 +COMMAND_SHA256=e556870d31392c4f44f6bf6b71f9a92b401d209eb60db4d0148f3eb69139f49a +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=7a58f71f363c8e390fd3b6af5b01d7f21d758c734e92ae73164c0e5358fa59b7 +SANITIZED_OUTPUT_SHA256=7a58f71f363c8e390fd3b6af5b01d7f21d758c734e92ae73164c0e5358fa59b7 +OUTPUT_BEGIN +CT112_PLAN_DATAFLOW_ROOT=V1 +MODE=read-only +NO_BACKUP_EXECUTION=true +NO_MUTATION=true +PINNED_WRAPPER_COUNT=1 +SOURCE_IDENTITIES_VALID=true +P282_SELECT112_FUNCTION_COUNT=1 +P282_SELECT112_ARGS=current,baseline,now +P282_SELECT112_FIRST_LINE=29 +P282_SELECT112_TOP_LEVEL_STATEMENTS=25 +REC|P282_SELECT112|IDX=1|LINE=30 +REC|P282_SELECT112|IDX=1|KIND=Assign +REC|P282_SELECT112|IDX=1|AST=rows = g.plan_rows(current) +REC|P282_SELECT112|IDX=2|LINE=30 +REC|P282_SELECT112|IDX=2|KIND=Assign +REC|P282_SELECT112|IDX=2|AST=previous = g.plan_rows(baseline) +REC|P282_SELECT112|IDX=3|LINE=31 +REC|P282_SELECT112|IDX=3|KIND=Assign +REC|P282_SELECT112|IDX=3|AST=by_id = _j_vmid_: j for j in previous_ +REC|P282_SELECT112|IDX=4|LINE=32 +REC|P282_SELECT112|IDX=4|KIND=Expr +REC|P282_SELECT112|IDX=4|AST=need(TARGET_VMID in by_id, __) +REC|P282_SELECT112|IDX=5|LINE=33 +REC|P282_SELECT112|IDX=5|KIND=Expr +REC|P282_SELECT112|IDX=5|AST=g.same_state(baseline, current, TARGET_VMID) +REC|P282_SELECT112|IDX=6|LINE=34 +REC|P282_SELECT112|IDX=6|KIND=Expr +REC|P282_SELECT112|IDX=6|AST=need(_j_vmid_ for j in rows_ == set(by_id), __) +REC|P282_SELECT112|IDX=7|LINE=35 +REC|P282_SELECT112|IDX=7|KIND=For +REC|P282_SELECT112|IDX=7|AST=for row in rows: need(row_config_sha256_ == by_id_row_vmid_config_sha256_, __) +REC|P282_SELECT112|IDX=8|LINE=37 +REC|P282_SELECT112|IDX=8|KIND=Assign +REC|P282_SELECT112|IDX=8|AST=selected = _j for j in rows if j_vmid_ == TARGET_VMID_ +REC|P282_SELECT112|IDX=9|LINE=38 +REC|P282_SELECT112|IDX=9|KIND=Expr +REC|P282_SELECT112|IDX=9|AST=need(len(selected) == 1, _CT112_NOT_UNIQUE_) +REC|P282_SELECT112|IDX=10|LINE=39 +REC|P282_SELECT112|IDX=10|KIND=Assign +REC|P282_SELECT112|IDX=10|AST=job = copy.deepcopy(selected_0_) +REC|P282_SELECT112|IDX=11|LINE=39 +REC|P282_SELECT112|IDX=11|KIND=Expr +REC|P282_SELECT112|IDX=11|AST=old.validate_job(job, now) +REC|P282_SELECT112|IDX=12|LINE=40 +REC|P282_SELECT112|IDX=12|KIND=Expr +REC|P282_SELECT112|IDX=12|AST=need(current.get(__) == _, __) +REC|P282_SELECT112|IDX=13|LINE=41 +REC|P282_SELECT112|IDX=13|KIND=Expr +REC|P282_SELECT112|IDX=13|AST=need(job.get(_compression_dependent_) is False and job.get(_configured_full_cycle_fits_) is True, __) +REC|P282_SELECT112|IDX=14|LINE=42 +REC|P282_SELECT112|IDX=14|KIND=Assign +REC|P282_SELECT112|IDX=14|AST=disks = job.get(_disks_) +REC|P282_SELECT112|IDX=15|LINE=42 +REC|P282_SELECT112|IDX=15|KIND=Expr +REC|P282_SELECT112|IDX=15|AST=need(type(disks) is list and len(disks) == 1, __) +REC|P282_SELECT112|IDX=16|LINE=43 +REC|P282_SELECT112|IDX=16|KIND=Assign +REC|P282_SELECT112|IDX=16|AST=disk = disks_0_ +REC|P282_SELECT112|IDX=17|LINE=44 +REC|P282_SELECT112|IDX=17|KIND=Expr +REC|P282_SELECT112|IDX=17|AST=need(disk.get(__) == _rootfs_ and disk.get(__) == __ and (disk.get(__) in (__, __)), __) +REC|P282_SELECT112|IDX=18|LINE=45 +REC|P282_SELECT112|IDX=18|KIND=Assign +REC|P282_SELECT112|IDX=18|AST=size = job.get(__) +REC|P282_SELECT112|IDX=19|LINE=46 +REC|P282_SELECT112|IDX=19|KIND=Expr +REC|P282_SELECT112|IDX=19|AST=need(type(size) is int and 0 < size <= stream.MAX_BYTES and (size == disk.get(__)), __) +REC|P282_SELECT112|IDX=20|LINE=47 +REC|P282_SELECT112|IDX=20|KIND=Assign +REC|P282_SELECT112|IDX=20|AST=stores = _x__: x for x in current.get(__, _)_ +REC|P282_SELECT112|IDX=21|LINE=47 +REC|P282_SELECT112|IDX=21|KIND=Assign +REC|P282_SELECT112|IDX=21|AST=st = stores.get(disk.get(__), _) +REC|P282_SELECT112|IDX=22|LINE=48 +REC|P282_SELECT112|IDX=22|KIND=Expr +REC|P282_SELECT112|IDX=22|AST=need(st.get(__) is True and st.get(__) is True and (st.get(_type_) in (__, __)), __) +REC|P282_SELECT112|IDX=23|LINE=49 +REC|P282_SELECT112|IDX=23|KIND=Expr +REC|P282_SELECT112|IDX=23|AST=need(type(st.get(__)) is int and st__ >= max(1024 _ 3, size), __) +REC|P282_SELECT112|IDX=24|LINE=50 +REC|P282_SELECT112|IDX=24|KIND=Expr +REC|P282_SELECT112|IDX=24|AST=require_target(job, by_id_TARGET_VMID_config_sha256_) +P282_SELECT112_LINE30_AST=rows = g.plan_rows(current),previous = g.plan_rows(baseline) +REC|SELECT_CALL|LINE=30|NAME=plan_rows +REC|SELECT_CALL|LINE=30|AST=g.plan_rows(current) +REC|SELECT_CALL|LINE=30|NAME=plan_rows +REC|SELECT_CALL|LINE=30|AST=g.plan_rows(baseline) +REC|SELECT_CALL|LINE=32|NAME=need +REC|SELECT_CALL|LINE=32|AST=need(TARGET_VMID in by_id, __) +REC|SELECT_CALL|LINE=33|NAME=same_state +REC|SELECT_CALL|LINE=33|AST=g.same_state(baseline, current, TARGET_VMID) +REC|SELECT_CALL|LINE=34|NAME=need +REC|SELECT_CALL|LINE=34|AST=need(_j_vmid_ for j in rows_ == set(by_id), __) +REC|SELECT_CALL|LINE=36|NAME=need +REC|SELECT_CALL|LINE=36|AST=need(row_config_sha256_ == by_id_row_vmid_config_sha256_, __) +REC|SELECT_CALL|LINE=38|NAME=need +REC|SELECT_CALL|LINE=38|AST=need(len(selected) == 1, _CT112_NOT_UNIQUE_) +REC|SELECT_CALL|LINE=39|NAME=validate_job +REC|SELECT_CALL|LINE=39|AST=old.validate_job(job, now) +REC|SELECT_CALL|LINE=40|NAME=need +REC|SELECT_CALL|LINE=40|AST=need(current.get(__) == _, __) +REC|SELECT_CALL|LINE=41|NAME=need +REC|SELECT_CALL|LINE=41|AST=need(job.get(_compression_dependent_) is False and job.get(_configured_full_cycle_fits_) is True, __) +REC|SELECT_CALL|LINE=42|NAME=need +REC|SELECT_CALL|LINE=42|AST=need(type(disks) is list and len(disks) == 1, __) +REC|SELECT_CALL|LINE=44|NAME=need +REC|SELECT_CALL|LINE=44|AST=need(disk.get(__) == _rootfs_ and disk.get(__) == __ and (disk.get(__) in (__, __)), __) +REC|SELECT_CALL|LINE=46|NAME=need +REC|SELECT_CALL|LINE=46|AST=need(type(size) is int and 0 < size <= stream.MAX_BYTES and (size == disk.get(__)), __) +REC|SELECT_CALL|LINE=48|NAME=need +REC|SELECT_CALL|LINE=48|AST=need(st.get(__) is True and st.get(__) is True and (st.get(_type_) in (__, __)), __) +REC|SELECT_CALL|LINE=49|NAME=need +REC|SELECT_CALL|LINE=49|AST=need(type(st.get(__)) is int and st__ >= max(1024 _ 3, size), __) +REC|SELECT_CALL|LINE=50|NAME=require_target +REC|SELECT_CALL|LINE=50|AST=require_target(job, by_id_TARGET_VMID_config_sha256_) +HANDLER_BASELINE_FUNCTION_COUNT=1 +HANDLER_BASELINE_ARGS=NONE +HANDLER_BASELINE_FIRST_LINE=31 +HANDLER_BASELINE_TOP_LEVEL_STATEMENTS=3 +REC|HANDLER_BASELINE|IDX=1|LINE=32 +REC|HANDLER_BASELINE|IDX=1|KIND=Assign +REC|HANDLER_BASELINE|IDX=1|AST=b = t.read_secure(PLAN, 1024 _ 1024, private=True)_0_ +REC|HANDLER_BASELINE|IDX=2|LINE=33 +REC|HANDLER_BASELINE|IDX=2|KIND=If +REC|HANDLER_BASELINE|IDX=2|AST=if t.sha(b) _= PLAN_SHA: raise RuntimeError(_PLAN_REFERENCE_IDENTITY_) +REC|HANDLER_BASELINE|IDX=3|LINE=34 +REC|HANDLER_BASELINE|IDX=3|KIND=Try +REC|HANDLER_BASELINE|IDX=3|AST=try: return json.loads(b.decode(__, __)) except (ValueError, UnicodeError): raise RuntimeError(__) from None +HANDLER_FRESH_FUNCTION_COUNT=1 +HANDLER_FRESH_ARGS=now +HANDLER_FRESH_FIRST_LINE=42 +HANDLER_FRESH_TOP_LEVEL_STATEMENTS=8 +REC|HANDLER_FRESH|IDX=1|LINE=43 +REC|HANDLER_FRESH|IDX=1|KIND=Assign +REC|HANDLER_FRESH|IDX=1|AST=rows = _json_cmd(__, __, __) +REC|HANDLER_FRESH|IDX=2|LINE=44 +REC|HANDLER_FRESH|IDX=2|KIND=Assign +REC|HANDLER_FRESH|IDX=2|AST=stores = _json_cmd(__) +REC|HANDLER_FRESH|IDX=3|LINE=45 +REC|HANDLER_FRESH|IDX=3|KIND=If +REC|HANDLER_FRESH|IDX=3|AST=if not isinstance(rows, list) or not isinstance(stores, list): raise RuntimeError(__) +REC|HANDLER_FRESH|IDX=4|LINE=46 +REC|HANDLER_FRESH|IDX=4|KIND=Assign +REC|HANDLER_FRESH|IDX=4|AST=configs = _ +REC|HANDLER_FRESH|IDX=5|LINE=47 +REC|HANDLER_FRESH|IDX=5|KIND=For +REC|HANDLER_FRESH|IDX=5|AST=for r in rows: if not isinstance(r, dict) or r.get(_node_) _= _pve01_ or r.get(_type_) not in (_lxc_, __): continue vmid = r.get(_vmid_) if type(vmid) is not int: raise RuntimeError(__) configs_vmid_ = _json_cmd(f__r_type__vmid__) +REC|HANDLER_FRESH|IDX=6|LINE=52 +REC|HANDLER_FRESH|IDX=6|KIND=Assign +REC|HANDLER_FRESH|IDX=6|AST=v = os.statvfs(STAGING) +REC|HANDLER_FRESH|IDX=7|LINE=52 +REC|HANDLER_FRESH|IDX=7|KIND=Assign +REC|HANDLER_FRESH|IDX=7|AST=free = v.f_frsize _ v.f_bavail +REC|HANDLER_FRESH|IDX=8|LINE=53 +REC|HANDLER_FRESH|IDX=8|KIND=Return +REC|HANDLER_FRESH|IDX=8|AST=return pve265.make_plan(rows, configs, stores, _defaults(), free, now, node=_pve01_) +HANDLER_RUN_FUNCTION_COUNT=1 +HANDLER_RUN_ARGS=target,state_writer +HANDLER_RUN_FIRST_LINE=100 +HANDLER_RUN_TOP_LEVEL_STATEMENTS=24 +REC|HANDLER_RUN|IDX=1|LINE=101 +REC|HANDLER_RUN|IDX=1|KIND=If +REC|HANDLER_RUN|IDX=1|AST=if not isinstance(target, dict) or target.get(__) _= CT_ID or target.get(_vmid_) _= 112: return (_ for _ in ()).throw(RuntimeError(__)) +REC|HANDLER_RUN|IDX=2|LINE=102 +REC|HANDLER_RUN|IDX=2|KIND=If +REC|HANDLER_RUN|IDX=2|AST=if _sha(PLAN, 1024 _ 1024) _= PLAN_SHA: raise RuntimeError(_PLAN_REFERENCE_IDENTITY_) +REC|HANDLER_RUN|IDX=3|LINE=103 +REC|HANDLER_RUN|IDX=3|KIND=Assign +REC|HANDLER_RUN|IDX=3|AST=tools = __: _tool(VZDUMP, VZDUMP_SHA), __: _tool(ZSTD, ZSTD_SHA)_ +REC|HANDLER_RUN|IDX=4|LINE=103 +REC|HANDLER_RUN|IDX=4|KIND=Expr +REC|HANDLER_RUN|IDX=4|AST=_tool(RCLONE, RCLONE_SHA) +REC|HANDLER_RUN|IDX=5|LINE=104 +REC|HANDLER_RUN|IDX=5|KIND=Assign +REC|HANDLER_RUN|IDX=5|AST=pvesh_sha = _sha(PVESH) +REC|HANDLER_RUN|IDX=6|LINE=104 +REC|HANDLER_RUN|IDX=6|KIND=Assign +REC|HANDLER_RUN|IDX=6|AST=baseline = _baseline() +REC|HANDLER_RUN|IDX=7|LINE=104 +REC|HANDLER_RUN|IDX=7|KIND=Assign +REC|HANDLER_RUN|IDX=7|AST=now = int(time.time()) +REC|HANDLER_RUN|IDX=8|LINE=104 +REC|HANDLER_RUN|IDX=8|KIND=Assign +REC|HANDLER_RUN|IDX=8|AST=current = _fresh_plan(now) +REC|HANDLER_RUN|IDX=9|LINE=104 +REC|HANDLER_RUN|IDX=9|KIND=Assign +REC|HANDLER_RUN|IDX=9|AST=job = pve282.select112(current, baseline, now) +REC|HANDLER_RUN|IDX=10|LINE=105 +REC|HANDLER_RUN|IDX=10|KIND=Assign +REC|HANDLER_RUN|IDX=10|AST=expected = job_config_sha256_ +REC|HANDLER_RUN|IDX=11|LINE=105 +REC|HANDLER_RUN|IDX=11|KIND=Assign +REC|HANDLER_RUN|IDX=11|AST=mapping = pve282.host_mapping() +REC|HANDLER_RUN|IDX=12|LINE=105 +REC|HANDLER_RUN|IDX=12|KIND=Expr +REC|HANDLER_RUN|IDX=12|AST=pve282.validate_mapping(mapping) +REC|HANDLER_RUN|IDX=13|LINE=106 +REC|HANDLER_RUN|IDX=13|KIND=FunctionDef +REC|HANDLER_RUN|IDX=13|AST=def producer_guard(): now2 = int(time.time()) cur = _fresh_plan(now2) fresh = pve282.select112(cur, baseline, now2) tasks = _json_cmd(__, __, __) guest266.no_active_tasks(tasks, 112) if _sha(PVESH) _= pvesh_sha: raise RuntimeError(__) pve282.live_gate(fresh, str(PVESH), pvesh_sha, expected) +VZDUMP_CONFIG_BYTES=566 +VZDUMP_CONFIG_TYPED_INPUT=str +DRY_RUN_STARTED=true +BASELINE_LOAD_OK=true +FRESH_PLAN_MAKE_OK=true +BASELINE_LIVE_PLAN_CHANGED_KEYS=all_guest_coverage_eligible,collected_at_utc,global_blockers,global_defaults,guest_membership_and_configs_stable,jobs,local_guest_count,node_execution_approved,observed_at,pvesh_get_calls,pvesh_sha256,refresh_required_before_backup,staging_free_bytes,storages,tools +BASELINE_PLAN_TYPE=dict +BASELINE_PLAN_KEYS=all_guest_coverage_eligible,backup_executed,capacity_policy,collected_at_utc,full_host_coverage,global_blockers,global_defaults,guest_membership_and_configs_stable,jobs,local_guest_count,node,node_execution_approved,nodeset_backup_approved,observed_at,pvesh_get_calls,pvesh_sha256,refresh_required_before_backup,schema_version,staging_free_bytes,storages,tools +BASELINE_PLAN_JOBS_TYPE=list +BASELINE_PLAN_JOB_COUNT=6 +BASELINE_PLAN_VMID_LIST_HASH=b6b595ac377f78e071aca2ab359a7c7ae1bcb0485e68728a7c48f076f36cde40 +BASELINE_PLAN_VM112_COUNT=1 +BASELINE_PLAN_VM112_FIELDS=application_consistency_verified,archive_cap_bytes,blockers,cdrom_count,cdrom_media_included,compression_dependent,config_sha256,configured_archive_bound_bytes,configured_disk_bytes,configured_full_cycle_fits,coverage_eligible,disks,global_defaults_sha256,guest_restore_verified,hookscript_present,local_reserve_bytes,lock_present,node,observed_at,reported_maxdisk_bytes,reported_maxmem_bytes,snapshot_history_included,status,template,type,unused_volume_count,vmid +BASELINE_PLAN_VM112_AGE_SECONDS=2223483 +FRESH_PLAN_TYPE=dict +FRESH_PLAN_KEYS=all_guest_coverage_eligible,backup_executed,capacity_policy,full_host_coverage,global_blockers,global_defaults,jobs,local_guest_count,node,nodeset_backup_approved,observed_at,schema_version,staging_free_bytes,storages +FRESH_PLAN_JOBS_TYPE=list +FRESH_PLAN_JOB_COUNT=8 +FRESH_PLAN_VMID_LIST_HASH=a6268963746816277a805ff5113847e826ba0ce06c0ae1cf316594a474670de6 +FRESH_PLAN_VM112_COUNT=1 +FRESH_PLAN_VM112_FIELDS=application_consistency_verified,archive_cap_bytes,blockers,cdrom_count,cdrom_media_included,compression_dependent,config_sha256,configured_archive_bound_bytes,configured_disk_bytes,configured_full_cycle_fits,coverage_eligible,disks,global_defaults_sha256,guest_restore_verified,hookscript_present,local_reserve_bytes,lock_present,node,observed_at,reported_maxdisk_bytes,reported_maxmem_bytes,snapshot_history_included,status,template,type,unused_volume_count,vmid +FRESH_PLAN_VM112_AGE_SECONDS=6 +BASELINE_LIVE_VM112_CHANGED_KEYS=blockers,coverage_eligible,global_defaults_sha256,observed_at +VM112_FIELD_CONFIG_SHA256_EQUAL=true +VM112_FIELD_GLOBAL_DEFAULTS_SHA256_EQUAL=false +VM112_FIELD_NODE_EQUAL=true +VM112_FIELD_VMID_EQUAL=true +VM112_FIELD_TYPE_EQUAL=true +VM112_FIELD_TEMPLATE_EQUAL=true +VM112_FIELD_BLOCKERS_EQUAL=false +VM112_FIELD_COVERAGE_ELIGIBLE_EQUAL=false +VM112_FIELD_COMPRESSION_DEPENDENT_EQUAL=true +VM112_FIELD_CONFIGURED_FULL_CYCLE_FITS_EQUAL=true +REAL_SELECT112_DRYRUN_SKIPPED=true +DECISION=PASS_SOURCE_AND_LIVE_PLAN_COMPARISON_RECORDED +NEXT_GATE=FIX_EXACT_PLAN_NOT_STABLE_MISMATCH_NOT_GUARD_BYPASS +CHANGES_MADE=false +ROLLBACK_STARTED=false +ROLLBACK_RESTORED=null +MUTATION_OUTCOME=NO_MUTATION +END_MARKER=true +HOMELAB_RESULT_CONTRACT={"version":1,"command_id":"SUPPORT-261008-CT112-PLAN-DATAFLOW-ROOT-99824R1","status":"OK","changes_made":false,"rollback_started":false,"rollback_restored":null} +PLAN_DATAFLOW_PYTHON_RC=0 + +OUTPUT_END +CHAT_OUTPUT_END diff --git a/runtime/latest.json b/runtime/latest.json index caf36953..c0a39e40 100644 --- a/runtime/latest.json +++ b/runtime/latest.json @@ -1,19 +1,19 @@ { "schema_version": 1, "channel": "homelab-runtime", - "command_id": "SUPPORT-261008-CT112-PLAN-STABILITY-GATE-99823R1", + "command_id": "SUPPORT-261008-CT112-PLAN-DATAFLOW-ROOT-99824R1", "status": "OK", "rc": 0, "host": "pve01", "mode": "read-only", - "component": "ct112-plan-stability-gate", - "started_at_utc": "2026-10-08T00:29:47Z", - "finished_at_utc": "2026-10-08T00:29:47Z", + "component": "ct112-plan-dataflow-root", + "started_at_utc": "2026-10-08T00:35:34Z", + "finished_at_utc": "2026-10-08T00:35:40Z", "reference_register_checked": true, "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", "error_register_checked": true, "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", - "command_sha256": "1a5770ba51dfc553a4d6c1f4cce407a4b474db5dc6651e273d3fc1d0967f85c0", + "command_sha256": "e556870d31392c4f44f6bf6b71f9a92b401d209eb60db4d0148f3eb69139f49a", "duplicate_failed_command_blocked": false, "block_reason": null, "execution_started": true, @@ -30,9 +30,9 @@ "secrets_included": false, "private_addresses_included": false, "raw_evidence_retained_locally": true, - "raw_evidence_sha256": "2ba70d63d00effa7a30dfbff949a83b8e564af99bec2d3daffe08e322992ab19", - "sanitized_output_sha256": "2ba70d63d00effa7a30dfbff949a83b8e564af99bec2d3daffe08e322992ab19", + "raw_evidence_sha256": "7a58f71f363c8e390fd3b6af5b01d7f21d758c734e92ae73164c0e5358fa59b7", + "sanitized_output_sha256": "7a58f71f363c8e390fd3b6af5b01d7f21d758c734e92ae73164c0e5358fa59b7", "output_truncated_in_json": false, "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", - "output": "CT112_PLAN_STABILITY_GATE=V1\nMODE=read-only\nNO_MUTATION=true\nNO_BACKUP_EXECUTION=true\nNO_NETBIRD_DNS_SERVICE_MUTATION=true\nWRAPPER_PIN_COUNT=1\nACTIVE_HANDLER_PIN_MATCH=true\nP282_PIN_MATCH=true\nACCEPTED_PLAN_VM112_COUNT=1\nACCEPTED_PLAN_HAS_CONFIG_SHA=true\nACCEPTED_PLAN_OBSERVED_AT_TYPE=int\nACCEPTED_PLAN_AGE_SECONDS=2223130\nACCEPTED_PLAN_VM112_FIELD_NAMES=application_consistency_verified,archive_cap_bytes,blockers,cdrom_count,cdrom_media_included,compression_dependent,config_sha256,configured_archive_bound_bytes,configured_disk_bytes,configured_full_cycle_fits,coverage_eligible,disks,global_defaults_sha256,guest_restore_verified,hookscript_present,local_reserve_bytes,lock_present,node,observed_at,reported_maxdisk_bytes,reported_maxmem_bytes,snapshot_history_included,status,template,type,unused_volume_count,vmid\nSCHEDULED_BACKUP_RESULT=success\nSCHEDULED_BACKUP_ACTIVESTATE=inactive\nSCHEDULED_BACKUP_SUBSTATE=dead\nSELECT112_FUNCTION_COUNT=1\nSELECT112_ARGS=current,baseline,now\nSELECT112_FIRST_LINE=29\nSELECT112_CALL_NAMES=deepcopy,get,len,max,need,plan_rows,require_target,same_state,set,type,validate_job\nHANDLER_RUN_TARGET_FUNCTION_COUNT=1\nHANDLER_RUN_TARGET_ARGS=target,state_writer\nHANDLER_RUN_TARGET_FIRST_LINE=100\nHANDLER_RUN_TARGET_CALL_NAMES=CloudLarge,LazyReader,RuntimeError,_baseline,_fresh_plan,_json_cmd,_private_config,_sha,_tool,close,exists,get,gmtime,host_mapping,int,isinstance,len,live_gate,mkdir,monotonic,no_active_tasks,produce,rmtree,run,run_flow,select112,state_writer,str,strftime,throw,time,token_hex,validate_mapping\nHANDLER_FRESH_PLAN_FUNCTION_COUNT=1\nHANDLER_FRESH_PLAN_ARGS=now\nHANDLER_FRESH_PLAN_FIRST_LINE=42\nHANDLER_FRESH_PLAN_CALL_NAMES=RuntimeError,_defaults,_json_cmd,get,isinstance,make_plan,statvfs,type\nPLAN_NOT_STABLE_GUARD_COUNT=0\nPROBE_EXCEPTION_TYPE=Gate\nPROBE_HOLD_CODE=PLAN_NOT_STABLE_GUARD_NOT_UNIQUE\nDECISION=HOLD_DIAGNOSTIC_NEEDS_CORRECTION\nNEXT_GATE=READ_VERIFIED_PROBE_FAILURE\nCHANGES_MADE=false\nROLLBACK_STARTED=false\nROLLBACK_RESTORED=null\nMUTATION_OUTCOME=NO_MUTATION\nEND_MARKER=true\nHOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"SUPPORT-261008-CT112-PLAN-STABILITY-GATE-99823R1\",\"status\":\"OK\",\"changes_made\":false,\"rollback_started\":false,\"rollback_restored\":null}\nPROBE_PYTHON_RC=0\n" + "output": "CT112_PLAN_DATAFLOW_ROOT=V1\nMODE=read-only\nNO_BACKUP_EXECUTION=true\nNO_MUTATION=true\nPINNED_WRAPPER_COUNT=1\nSOURCE_IDENTITIES_VALID=true\nP282_SELECT112_FUNCTION_COUNT=1\nP282_SELECT112_ARGS=current,baseline,now\nP282_SELECT112_FIRST_LINE=29\nP282_SELECT112_TOP_LEVEL_STATEMENTS=25\nREC|P282_SELECT112|IDX=1|LINE=30\nREC|P282_SELECT112|IDX=1|KIND=Assign\nREC|P282_SELECT112|IDX=1|AST=rows = g.plan_rows(current)\nREC|P282_SELECT112|IDX=2|LINE=30\nREC|P282_SELECT112|IDX=2|KIND=Assign\nREC|P282_SELECT112|IDX=2|AST=previous = g.plan_rows(baseline)\nREC|P282_SELECT112|IDX=3|LINE=31\nREC|P282_SELECT112|IDX=3|KIND=Assign\nREC|P282_SELECT112|IDX=3|AST=by_id = _j_vmid_: j for j in previous_\nREC|P282_SELECT112|IDX=4|LINE=32\nREC|P282_SELECT112|IDX=4|KIND=Expr\nREC|P282_SELECT112|IDX=4|AST=need(TARGET_VMID in by_id, __)\nREC|P282_SELECT112|IDX=5|LINE=33\nREC|P282_SELECT112|IDX=5|KIND=Expr\nREC|P282_SELECT112|IDX=5|AST=g.same_state(baseline, current, TARGET_VMID)\nREC|P282_SELECT112|IDX=6|LINE=34\nREC|P282_SELECT112|IDX=6|KIND=Expr\nREC|P282_SELECT112|IDX=6|AST=need(_j_vmid_ for j in rows_ == set(by_id), __)\nREC|P282_SELECT112|IDX=7|LINE=35\nREC|P282_SELECT112|IDX=7|KIND=For\nREC|P282_SELECT112|IDX=7|AST=for row in rows: need(row_config_sha256_ == by_id_row_vmid_config_sha256_, __)\nREC|P282_SELECT112|IDX=8|LINE=37\nREC|P282_SELECT112|IDX=8|KIND=Assign\nREC|P282_SELECT112|IDX=8|AST=selected = _j for j in rows if j_vmid_ == TARGET_VMID_\nREC|P282_SELECT112|IDX=9|LINE=38\nREC|P282_SELECT112|IDX=9|KIND=Expr\nREC|P282_SELECT112|IDX=9|AST=need(len(selected) == 1, _CT112_NOT_UNIQUE_)\nREC|P282_SELECT112|IDX=10|LINE=39\nREC|P282_SELECT112|IDX=10|KIND=Assign\nREC|P282_SELECT112|IDX=10|AST=job = copy.deepcopy(selected_0_)\nREC|P282_SELECT112|IDX=11|LINE=39\nREC|P282_SELECT112|IDX=11|KIND=Expr\nREC|P282_SELECT112|IDX=11|AST=old.validate_job(job, now)\nREC|P282_SELECT112|IDX=12|LINE=40\nREC|P282_SELECT112|IDX=12|KIND=Expr\nREC|P282_SELECT112|IDX=12|AST=need(current.get(__) == _, __)\nREC|P282_SELECT112|IDX=13|LINE=41\nREC|P282_SELECT112|IDX=13|KIND=Expr\nREC|P282_SELECT112|IDX=13|AST=need(job.get(_compression_dependent_) is False and job.get(_configured_full_cycle_fits_) is True, __)\nREC|P282_SELECT112|IDX=14|LINE=42\nREC|P282_SELECT112|IDX=14|KIND=Assign\nREC|P282_SELECT112|IDX=14|AST=disks = job.get(_disks_)\nREC|P282_SELECT112|IDX=15|LINE=42\nREC|P282_SELECT112|IDX=15|KIND=Expr\nREC|P282_SELECT112|IDX=15|AST=need(type(disks) is list and len(disks) == 1, __)\nREC|P282_SELECT112|IDX=16|LINE=43\nREC|P282_SELECT112|IDX=16|KIND=Assign\nREC|P282_SELECT112|IDX=16|AST=disk = disks_0_\nREC|P282_SELECT112|IDX=17|LINE=44\nREC|P282_SELECT112|IDX=17|KIND=Expr\nREC|P282_SELECT112|IDX=17|AST=need(disk.get(__) == _rootfs_ and disk.get(__) == __ and (disk.get(__) in (__, __)), __)\nREC|P282_SELECT112|IDX=18|LINE=45\nREC|P282_SELECT112|IDX=18|KIND=Assign\nREC|P282_SELECT112|IDX=18|AST=size = job.get(__)\nREC|P282_SELECT112|IDX=19|LINE=46\nREC|P282_SELECT112|IDX=19|KIND=Expr\nREC|P282_SELECT112|IDX=19|AST=need(type(size) is int and 0 < size <= stream.MAX_BYTES and (size == disk.get(__)), __)\nREC|P282_SELECT112|IDX=20|LINE=47\nREC|P282_SELECT112|IDX=20|KIND=Assign\nREC|P282_SELECT112|IDX=20|AST=stores = _x__: x for x in current.get(__, _)_\nREC|P282_SELECT112|IDX=21|LINE=47\nREC|P282_SELECT112|IDX=21|KIND=Assign\nREC|P282_SELECT112|IDX=21|AST=st = stores.get(disk.get(__), _)\nREC|P282_SELECT112|IDX=22|LINE=48\nREC|P282_SELECT112|IDX=22|KIND=Expr\nREC|P282_SELECT112|IDX=22|AST=need(st.get(__) is True and st.get(__) is True and (st.get(_type_) in (__, __)), __)\nREC|P282_SELECT112|IDX=23|LINE=49\nREC|P282_SELECT112|IDX=23|KIND=Expr\nREC|P282_SELECT112|IDX=23|AST=need(type(st.get(__)) is int and st__ >= max(1024 _ 3, size), __)\nREC|P282_SELECT112|IDX=24|LINE=50\nREC|P282_SELECT112|IDX=24|KIND=Expr\nREC|P282_SELECT112|IDX=24|AST=require_target(job, by_id_TARGET_VMID_config_sha256_)\nP282_SELECT112_LINE30_AST=rows = g.plan_rows(current),previous = g.plan_rows(baseline)\nREC|SELECT_CALL|LINE=30|NAME=plan_rows\nREC|SELECT_CALL|LINE=30|AST=g.plan_rows(current)\nREC|SELECT_CALL|LINE=30|NAME=plan_rows\nREC|SELECT_CALL|LINE=30|AST=g.plan_rows(baseline)\nREC|SELECT_CALL|LINE=32|NAME=need\nREC|SELECT_CALL|LINE=32|AST=need(TARGET_VMID in by_id, __)\nREC|SELECT_CALL|LINE=33|NAME=same_state\nREC|SELECT_CALL|LINE=33|AST=g.same_state(baseline, current, TARGET_VMID)\nREC|SELECT_CALL|LINE=34|NAME=need\nREC|SELECT_CALL|LINE=34|AST=need(_j_vmid_ for j in rows_ == set(by_id), __)\nREC|SELECT_CALL|LINE=36|NAME=need\nREC|SELECT_CALL|LINE=36|AST=need(row_config_sha256_ == by_id_row_vmid_config_sha256_, __)\nREC|SELECT_CALL|LINE=38|NAME=need\nREC|SELECT_CALL|LINE=38|AST=need(len(selected) == 1, _CT112_NOT_UNIQUE_)\nREC|SELECT_CALL|LINE=39|NAME=validate_job\nREC|SELECT_CALL|LINE=39|AST=old.validate_job(job, now)\nREC|SELECT_CALL|LINE=40|NAME=need\nREC|SELECT_CALL|LINE=40|AST=need(current.get(__) == _, __)\nREC|SELECT_CALL|LINE=41|NAME=need\nREC|SELECT_CALL|LINE=41|AST=need(job.get(_compression_dependent_) is False and job.get(_configured_full_cycle_fits_) is True, __)\nREC|SELECT_CALL|LINE=42|NAME=need\nREC|SELECT_CALL|LINE=42|AST=need(type(disks) is list and len(disks) == 1, __)\nREC|SELECT_CALL|LINE=44|NAME=need\nREC|SELECT_CALL|LINE=44|AST=need(disk.get(__) == _rootfs_ and disk.get(__) == __ and (disk.get(__) in (__, __)), __)\nREC|SELECT_CALL|LINE=46|NAME=need\nREC|SELECT_CALL|LINE=46|AST=need(type(size) is int and 0 < size <= stream.MAX_BYTES and (size == disk.get(__)), __)\nREC|SELECT_CALL|LINE=48|NAME=need\nREC|SELECT_CALL|LINE=48|AST=need(st.get(__) is True and st.get(__) is True and (st.get(_type_) in (__, __)), __)\nREC|SELECT_CALL|LINE=49|NAME=need\nREC|SELECT_CALL|LINE=49|AST=need(type(st.get(__)) is int and st__ >= max(1024 _ 3, size), __)\nREC|SELECT_CALL|LINE=50|NAME=require_target\nREC|SELECT_CALL|LINE=50|AST=require_target(job, by_id_TARGET_VMID_config_sha256_)\nHANDLER_BASELINE_FUNCTION_COUNT=1\nHANDLER_BASELINE_ARGS=NONE\nHANDLER_BASELINE_FIRST_LINE=31\nHANDLER_BASELINE_TOP_LEVEL_STATEMENTS=3\nREC|HANDLER_BASELINE|IDX=1|LINE=32\nREC|HANDLER_BASELINE|IDX=1|KIND=Assign\nREC|HANDLER_BASELINE|IDX=1|AST=b = t.read_secure(PLAN, 1024 _ 1024, private=True)_0_\nREC|HANDLER_BASELINE|IDX=2|LINE=33\nREC|HANDLER_BASELINE|IDX=2|KIND=If\nREC|HANDLER_BASELINE|IDX=2|AST=if t.sha(b) _= PLAN_SHA: raise RuntimeError(_PLAN_REFERENCE_IDENTITY_)\nREC|HANDLER_BASELINE|IDX=3|LINE=34\nREC|HANDLER_BASELINE|IDX=3|KIND=Try\nREC|HANDLER_BASELINE|IDX=3|AST=try: return json.loads(b.decode(__, __)) except (ValueError, UnicodeError): raise RuntimeError(__) from None\nHANDLER_FRESH_FUNCTION_COUNT=1\nHANDLER_FRESH_ARGS=now\nHANDLER_FRESH_FIRST_LINE=42\nHANDLER_FRESH_TOP_LEVEL_STATEMENTS=8\nREC|HANDLER_FRESH|IDX=1|LINE=43\nREC|HANDLER_FRESH|IDX=1|KIND=Assign\nREC|HANDLER_FRESH|IDX=1|AST=rows = _json_cmd(__, __, __)\nREC|HANDLER_FRESH|IDX=2|LINE=44\nREC|HANDLER_FRESH|IDX=2|KIND=Assign\nREC|HANDLER_FRESH|IDX=2|AST=stores = _json_cmd(__)\nREC|HANDLER_FRESH|IDX=3|LINE=45\nREC|HANDLER_FRESH|IDX=3|KIND=If\nREC|HANDLER_FRESH|IDX=3|AST=if not isinstance(rows, list) or not isinstance(stores, list): raise RuntimeError(__)\nREC|HANDLER_FRESH|IDX=4|LINE=46\nREC|HANDLER_FRESH|IDX=4|KIND=Assign\nREC|HANDLER_FRESH|IDX=4|AST=configs = _\nREC|HANDLER_FRESH|IDX=5|LINE=47\nREC|HANDLER_FRESH|IDX=5|KIND=For\nREC|HANDLER_FRESH|IDX=5|AST=for r in rows: if not isinstance(r, dict) or r.get(_node_) _= _pve01_ or r.get(_type_) not in (_lxc_, __): continue vmid = r.get(_vmid_) if type(vmid) is not int: raise RuntimeError(__) configs_vmid_ = _json_cmd(f__r_type__vmid__)\nREC|HANDLER_FRESH|IDX=6|LINE=52\nREC|HANDLER_FRESH|IDX=6|KIND=Assign\nREC|HANDLER_FRESH|IDX=6|AST=v = os.statvfs(STAGING)\nREC|HANDLER_FRESH|IDX=7|LINE=52\nREC|HANDLER_FRESH|IDX=7|KIND=Assign\nREC|HANDLER_FRESH|IDX=7|AST=free = v.f_frsize _ v.f_bavail\nREC|HANDLER_FRESH|IDX=8|LINE=53\nREC|HANDLER_FRESH|IDX=8|KIND=Return\nREC|HANDLER_FRESH|IDX=8|AST=return pve265.make_plan(rows, configs, stores, _defaults(), free, now, node=_pve01_)\nHANDLER_RUN_FUNCTION_COUNT=1\nHANDLER_RUN_ARGS=target,state_writer\nHANDLER_RUN_FIRST_LINE=100\nHANDLER_RUN_TOP_LEVEL_STATEMENTS=24\nREC|HANDLER_RUN|IDX=1|LINE=101\nREC|HANDLER_RUN|IDX=1|KIND=If\nREC|HANDLER_RUN|IDX=1|AST=if not isinstance(target, dict) or target.get(__) _= CT_ID or target.get(_vmid_) _= 112: return (_ for _ in ()).throw(RuntimeError(__))\nREC|HANDLER_RUN|IDX=2|LINE=102\nREC|HANDLER_RUN|IDX=2|KIND=If\nREC|HANDLER_RUN|IDX=2|AST=if _sha(PLAN, 1024 _ 1024) _= PLAN_SHA: raise RuntimeError(_PLAN_REFERENCE_IDENTITY_)\nREC|HANDLER_RUN|IDX=3|LINE=103\nREC|HANDLER_RUN|IDX=3|KIND=Assign\nREC|HANDLER_RUN|IDX=3|AST=tools = __: _tool(VZDUMP, VZDUMP_SHA), __: _tool(ZSTD, ZSTD_SHA)_\nREC|HANDLER_RUN|IDX=4|LINE=103\nREC|HANDLER_RUN|IDX=4|KIND=Expr\nREC|HANDLER_RUN|IDX=4|AST=_tool(RCLONE, RCLONE_SHA)\nREC|HANDLER_RUN|IDX=5|LINE=104\nREC|HANDLER_RUN|IDX=5|KIND=Assign\nREC|HANDLER_RUN|IDX=5|AST=pvesh_sha = _sha(PVESH)\nREC|HANDLER_RUN|IDX=6|LINE=104\nREC|HANDLER_RUN|IDX=6|KIND=Assign\nREC|HANDLER_RUN|IDX=6|AST=baseline = _baseline()\nREC|HANDLER_RUN|IDX=7|LINE=104\nREC|HANDLER_RUN|IDX=7|KIND=Assign\nREC|HANDLER_RUN|IDX=7|AST=now = int(time.time())\nREC|HANDLER_RUN|IDX=8|LINE=104\nREC|HANDLER_RUN|IDX=8|KIND=Assign\nREC|HANDLER_RUN|IDX=8|AST=current = _fresh_plan(now)\nREC|HANDLER_RUN|IDX=9|LINE=104\nREC|HANDLER_RUN|IDX=9|KIND=Assign\nREC|HANDLER_RUN|IDX=9|AST=job = pve282.select112(current, baseline, now)\nREC|HANDLER_RUN|IDX=10|LINE=105\nREC|HANDLER_RUN|IDX=10|KIND=Assign\nREC|HANDLER_RUN|IDX=10|AST=expected = job_config_sha256_\nREC|HANDLER_RUN|IDX=11|LINE=105\nREC|HANDLER_RUN|IDX=11|KIND=Assign\nREC|HANDLER_RUN|IDX=11|AST=mapping = pve282.host_mapping()\nREC|HANDLER_RUN|IDX=12|LINE=105\nREC|HANDLER_RUN|IDX=12|KIND=Expr\nREC|HANDLER_RUN|IDX=12|AST=pve282.validate_mapping(mapping)\nREC|HANDLER_RUN|IDX=13|LINE=106\nREC|HANDLER_RUN|IDX=13|KIND=FunctionDef\nREC|HANDLER_RUN|IDX=13|AST=def producer_guard(): now2 = int(time.time()) cur = _fresh_plan(now2) fresh = pve282.select112(cur, baseline, now2) tasks = _json_cmd(__, __, __) guest266.no_active_tasks(tasks, 112) if _sha(PVESH) _= pvesh_sha: raise RuntimeError(__) pve282.live_gate(fresh, str(PVESH), pvesh_sha, expected)\nVZDUMP_CONFIG_BYTES=566\nVZDUMP_CONFIG_TYPED_INPUT=str\nDRY_RUN_STARTED=true\nBASELINE_LOAD_OK=true\nFRESH_PLAN_MAKE_OK=true\nBASELINE_LIVE_PLAN_CHANGED_KEYS=all_guest_coverage_eligible,collected_at_utc,global_blockers,global_defaults,guest_membership_and_configs_stable,jobs,local_guest_count,node_execution_approved,observed_at,pvesh_get_calls,pvesh_sha256,refresh_required_before_backup,staging_free_bytes,storages,tools\nBASELINE_PLAN_TYPE=dict\nBASELINE_PLAN_KEYS=all_guest_coverage_eligible,backup_executed,capacity_policy,collected_at_utc,full_host_coverage,global_blockers,global_defaults,guest_membership_and_configs_stable,jobs,local_guest_count,node,node_execution_approved,nodeset_backup_approved,observed_at,pvesh_get_calls,pvesh_sha256,refresh_required_before_backup,schema_version,staging_free_bytes,storages,tools\nBASELINE_PLAN_JOBS_TYPE=list\nBASELINE_PLAN_JOB_COUNT=6\nBASELINE_PLAN_VMID_LIST_HASH=b6b595ac377f78e071aca2ab359a7c7ae1bcb0485e68728a7c48f076f36cde40\nBASELINE_PLAN_VM112_COUNT=1\nBASELINE_PLAN_VM112_FIELDS=application_consistency_verified,archive_cap_bytes,blockers,cdrom_count,cdrom_media_included,compression_dependent,config_sha256,configured_archive_bound_bytes,configured_disk_bytes,configured_full_cycle_fits,coverage_eligible,disks,global_defaults_sha256,guest_restore_verified,hookscript_present,local_reserve_bytes,lock_present,node,observed_at,reported_maxdisk_bytes,reported_maxmem_bytes,snapshot_history_included,status,template,type,unused_volume_count,vmid\nBASELINE_PLAN_VM112_AGE_SECONDS=2223483\nFRESH_PLAN_TYPE=dict\nFRESH_PLAN_KEYS=all_guest_coverage_eligible,backup_executed,capacity_policy,full_host_coverage,global_blockers,global_defaults,jobs,local_guest_count,node,nodeset_backup_approved,observed_at,schema_version,staging_free_bytes,storages\nFRESH_PLAN_JOBS_TYPE=list\nFRESH_PLAN_JOB_COUNT=8\nFRESH_PLAN_VMID_LIST_HASH=a6268963746816277a805ff5113847e826ba0ce06c0ae1cf316594a474670de6\nFRESH_PLAN_VM112_COUNT=1\nFRESH_PLAN_VM112_FIELDS=application_consistency_verified,archive_cap_bytes,blockers,cdrom_count,cdrom_media_included,compression_dependent,config_sha256,configured_archive_bound_bytes,configured_disk_bytes,configured_full_cycle_fits,coverage_eligible,disks,global_defaults_sha256,guest_restore_verified,hookscript_present,local_reserve_bytes,lock_present,node,observed_at,reported_maxdisk_bytes,reported_maxmem_bytes,snapshot_history_included,status,template,type,unused_volume_count,vmid\nFRESH_PLAN_VM112_AGE_SECONDS=6\nBASELINE_LIVE_VM112_CHANGED_KEYS=blockers,coverage_eligible,global_defaults_sha256,observed_at\nVM112_FIELD_CONFIG_SHA256_EQUAL=true\nVM112_FIELD_GLOBAL_DEFAULTS_SHA256_EQUAL=false\nVM112_FIELD_NODE_EQUAL=true\nVM112_FIELD_VMID_EQUAL=true\nVM112_FIELD_TYPE_EQUAL=true\nVM112_FIELD_TEMPLATE_EQUAL=true\nVM112_FIELD_BLOCKERS_EQUAL=false\nVM112_FIELD_COVERAGE_ELIGIBLE_EQUAL=false\nVM112_FIELD_COMPRESSION_DEPENDENT_EQUAL=true\nVM112_FIELD_CONFIGURED_FULL_CYCLE_FITS_EQUAL=true\nREAL_SELECT112_DRYRUN_SKIPPED=true\nDECISION=PASS_SOURCE_AND_LIVE_PLAN_COMPARISON_RECORDED\nNEXT_GATE=FIX_EXACT_PLAN_NOT_STABLE_MISMATCH_NOT_GUARD_BYPASS\nCHANGES_MADE=false\nROLLBACK_STARTED=false\nROLLBACK_RESTORED=null\nMUTATION_OUTCOME=NO_MUTATION\nEND_MARKER=true\nHOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"SUPPORT-261008-CT112-PLAN-DATAFLOW-ROOT-99824R1\",\"status\":\"OK\",\"changes_made\":false,\"rollback_started\":false,\"rollback_restored\":null}\nPLAN_DATAFLOW_PYTHON_RC=0\n" } diff --git a/runtime/latest.txt b/runtime/latest.txt index 0f31b579..7608c4aa 100644 --- a/runtime/latest.txt +++ b/runtime/latest.txt @@ -1,15 +1,15 @@ CHAT_OUTPUT_BEGIN -COMMAND_ID=SUPPORT-261008-CT112-PLAN-STABILITY-GATE-99823R1 +COMMAND_ID=SUPPORT-261008-CT112-PLAN-DATAFLOW-ROOT-99824R1 STATUS=OK RC=0 HOST=pve01 MODE=read-only -COMPONENT=ct112-plan-stability-gate +COMPONENT=ct112-plan-dataflow-root REFERENCE_REGISTER_CHECK=OK REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 ERROR_REGISTER_CHECK=OK ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 -COMMAND_SHA256=1a5770ba51dfc553a4d6c1f4cce407a4b474db5dc6651e273d3fc1d0967f85c0 +COMMAND_SHA256=e556870d31392c4f44f6bf6b71f9a92b401d209eb60db4d0148f3eb69139f49a DUPLICATE_FAILED_COMMAND_BLOCKED=false EXECUTION_STARTED=true CHANGE_DECLARED=false @@ -24,49 +24,251 @@ MUTATION_OUTCOME=NO_MUTATION SANITIZED=yes SECRETS_INCLUDED=no PRIVATE_ADDRESSES_INCLUDED=no -RAW_EVIDENCE_SHA256=2ba70d63d00effa7a30dfbff949a83b8e564af99bec2d3daffe08e322992ab19 -SANITIZED_OUTPUT_SHA256=2ba70d63d00effa7a30dfbff949a83b8e564af99bec2d3daffe08e322992ab19 +RAW_EVIDENCE_SHA256=7a58f71f363c8e390fd3b6af5b01d7f21d758c734e92ae73164c0e5358fa59b7 +SANITIZED_OUTPUT_SHA256=7a58f71f363c8e390fd3b6af5b01d7f21d758c734e92ae73164c0e5358fa59b7 OUTPUT_BEGIN -CT112_PLAN_STABILITY_GATE=V1 +CT112_PLAN_DATAFLOW_ROOT=V1 MODE=read-only -NO_MUTATION=true NO_BACKUP_EXECUTION=true -NO_NETBIRD_DNS_SERVICE_MUTATION=true -WRAPPER_PIN_COUNT=1 -ACTIVE_HANDLER_PIN_MATCH=true -P282_PIN_MATCH=true -ACCEPTED_PLAN_VM112_COUNT=1 -ACCEPTED_PLAN_HAS_CONFIG_SHA=true -ACCEPTED_PLAN_OBSERVED_AT_TYPE=int -ACCEPTED_PLAN_AGE_SECONDS=2223130 -ACCEPTED_PLAN_VM112_FIELD_NAMES=application_consistency_verified,archive_cap_bytes,blockers,cdrom_count,cdrom_media_included,compression_dependent,config_sha256,configured_archive_bound_bytes,configured_disk_bytes,configured_full_cycle_fits,coverage_eligible,disks,global_defaults_sha256,guest_restore_verified,hookscript_present,local_reserve_bytes,lock_present,node,observed_at,reported_maxdisk_bytes,reported_maxmem_bytes,snapshot_history_included,status,template,type,unused_volume_count,vmid -SCHEDULED_BACKUP_RESULT=success -SCHEDULED_BACKUP_ACTIVESTATE=inactive -SCHEDULED_BACKUP_SUBSTATE=dead -SELECT112_FUNCTION_COUNT=1 -SELECT112_ARGS=current,baseline,now -SELECT112_FIRST_LINE=29 -SELECT112_CALL_NAMES=deepcopy,get,len,max,need,plan_rows,require_target,same_state,set,type,validate_job -HANDLER_RUN_TARGET_FUNCTION_COUNT=1 -HANDLER_RUN_TARGET_ARGS=target,state_writer -HANDLER_RUN_TARGET_FIRST_LINE=100 -HANDLER_RUN_TARGET_CALL_NAMES=CloudLarge,LazyReader,RuntimeError,_baseline,_fresh_plan,_json_cmd,_private_config,_sha,_tool,close,exists,get,gmtime,host_mapping,int,isinstance,len,live_gate,mkdir,monotonic,no_active_tasks,produce,rmtree,run,run_flow,select112,state_writer,str,strftime,throw,time,token_hex,validate_mapping -HANDLER_FRESH_PLAN_FUNCTION_COUNT=1 -HANDLER_FRESH_PLAN_ARGS=now -HANDLER_FRESH_PLAN_FIRST_LINE=42 -HANDLER_FRESH_PLAN_CALL_NAMES=RuntimeError,_defaults,_json_cmd,get,isinstance,make_plan,statvfs,type -PLAN_NOT_STABLE_GUARD_COUNT=0 -PROBE_EXCEPTION_TYPE=Gate -PROBE_HOLD_CODE=PLAN_NOT_STABLE_GUARD_NOT_UNIQUE -DECISION=HOLD_DIAGNOSTIC_NEEDS_CORRECTION -NEXT_GATE=READ_VERIFIED_PROBE_FAILURE +NO_MUTATION=true +PINNED_WRAPPER_COUNT=1 +SOURCE_IDENTITIES_VALID=true +P282_SELECT112_FUNCTION_COUNT=1 +P282_SELECT112_ARGS=current,baseline,now +P282_SELECT112_FIRST_LINE=29 +P282_SELECT112_TOP_LEVEL_STATEMENTS=25 +REC|P282_SELECT112|IDX=1|LINE=30 +REC|P282_SELECT112|IDX=1|KIND=Assign +REC|P282_SELECT112|IDX=1|AST=rows = g.plan_rows(current) +REC|P282_SELECT112|IDX=2|LINE=30 +REC|P282_SELECT112|IDX=2|KIND=Assign +REC|P282_SELECT112|IDX=2|AST=previous = g.plan_rows(baseline) +REC|P282_SELECT112|IDX=3|LINE=31 +REC|P282_SELECT112|IDX=3|KIND=Assign +REC|P282_SELECT112|IDX=3|AST=by_id = _j_vmid_: j for j in previous_ +REC|P282_SELECT112|IDX=4|LINE=32 +REC|P282_SELECT112|IDX=4|KIND=Expr +REC|P282_SELECT112|IDX=4|AST=need(TARGET_VMID in by_id, __) +REC|P282_SELECT112|IDX=5|LINE=33 +REC|P282_SELECT112|IDX=5|KIND=Expr +REC|P282_SELECT112|IDX=5|AST=g.same_state(baseline, current, TARGET_VMID) +REC|P282_SELECT112|IDX=6|LINE=34 +REC|P282_SELECT112|IDX=6|KIND=Expr +REC|P282_SELECT112|IDX=6|AST=need(_j_vmid_ for j in rows_ == set(by_id), __) +REC|P282_SELECT112|IDX=7|LINE=35 +REC|P282_SELECT112|IDX=7|KIND=For +REC|P282_SELECT112|IDX=7|AST=for row in rows: need(row_config_sha256_ == by_id_row_vmid_config_sha256_, __) +REC|P282_SELECT112|IDX=8|LINE=37 +REC|P282_SELECT112|IDX=8|KIND=Assign +REC|P282_SELECT112|IDX=8|AST=selected = _j for j in rows if j_vmid_ == TARGET_VMID_ +REC|P282_SELECT112|IDX=9|LINE=38 +REC|P282_SELECT112|IDX=9|KIND=Expr +REC|P282_SELECT112|IDX=9|AST=need(len(selected) == 1, _CT112_NOT_UNIQUE_) +REC|P282_SELECT112|IDX=10|LINE=39 +REC|P282_SELECT112|IDX=10|KIND=Assign +REC|P282_SELECT112|IDX=10|AST=job = copy.deepcopy(selected_0_) +REC|P282_SELECT112|IDX=11|LINE=39 +REC|P282_SELECT112|IDX=11|KIND=Expr +REC|P282_SELECT112|IDX=11|AST=old.validate_job(job, now) +REC|P282_SELECT112|IDX=12|LINE=40 +REC|P282_SELECT112|IDX=12|KIND=Expr +REC|P282_SELECT112|IDX=12|AST=need(current.get(__) == _, __) +REC|P282_SELECT112|IDX=13|LINE=41 +REC|P282_SELECT112|IDX=13|KIND=Expr +REC|P282_SELECT112|IDX=13|AST=need(job.get(_compression_dependent_) is False and job.get(_configured_full_cycle_fits_) is True, __) +REC|P282_SELECT112|IDX=14|LINE=42 +REC|P282_SELECT112|IDX=14|KIND=Assign +REC|P282_SELECT112|IDX=14|AST=disks = job.get(_disks_) +REC|P282_SELECT112|IDX=15|LINE=42 +REC|P282_SELECT112|IDX=15|KIND=Expr +REC|P282_SELECT112|IDX=15|AST=need(type(disks) is list and len(disks) == 1, __) +REC|P282_SELECT112|IDX=16|LINE=43 +REC|P282_SELECT112|IDX=16|KIND=Assign +REC|P282_SELECT112|IDX=16|AST=disk = disks_0_ +REC|P282_SELECT112|IDX=17|LINE=44 +REC|P282_SELECT112|IDX=17|KIND=Expr +REC|P282_SELECT112|IDX=17|AST=need(disk.get(__) == _rootfs_ and disk.get(__) == __ and (disk.get(__) in (__, __)), __) +REC|P282_SELECT112|IDX=18|LINE=45 +REC|P282_SELECT112|IDX=18|KIND=Assign +REC|P282_SELECT112|IDX=18|AST=size = job.get(__) +REC|P282_SELECT112|IDX=19|LINE=46 +REC|P282_SELECT112|IDX=19|KIND=Expr +REC|P282_SELECT112|IDX=19|AST=need(type(size) is int and 0 < size <= stream.MAX_BYTES and (size == disk.get(__)), __) +REC|P282_SELECT112|IDX=20|LINE=47 +REC|P282_SELECT112|IDX=20|KIND=Assign +REC|P282_SELECT112|IDX=20|AST=stores = _x__: x for x in current.get(__, _)_ +REC|P282_SELECT112|IDX=21|LINE=47 +REC|P282_SELECT112|IDX=21|KIND=Assign +REC|P282_SELECT112|IDX=21|AST=st = stores.get(disk.get(__), _) +REC|P282_SELECT112|IDX=22|LINE=48 +REC|P282_SELECT112|IDX=22|KIND=Expr +REC|P282_SELECT112|IDX=22|AST=need(st.get(__) is True and st.get(__) is True and (st.get(_type_) in (__, __)), __) +REC|P282_SELECT112|IDX=23|LINE=49 +REC|P282_SELECT112|IDX=23|KIND=Expr +REC|P282_SELECT112|IDX=23|AST=need(type(st.get(__)) is int and st__ >= max(1024 _ 3, size), __) +REC|P282_SELECT112|IDX=24|LINE=50 +REC|P282_SELECT112|IDX=24|KIND=Expr +REC|P282_SELECT112|IDX=24|AST=require_target(job, by_id_TARGET_VMID_config_sha256_) +P282_SELECT112_LINE30_AST=rows = g.plan_rows(current),previous = g.plan_rows(baseline) +REC|SELECT_CALL|LINE=30|NAME=plan_rows +REC|SELECT_CALL|LINE=30|AST=g.plan_rows(current) +REC|SELECT_CALL|LINE=30|NAME=plan_rows +REC|SELECT_CALL|LINE=30|AST=g.plan_rows(baseline) +REC|SELECT_CALL|LINE=32|NAME=need +REC|SELECT_CALL|LINE=32|AST=need(TARGET_VMID in by_id, __) +REC|SELECT_CALL|LINE=33|NAME=same_state +REC|SELECT_CALL|LINE=33|AST=g.same_state(baseline, current, TARGET_VMID) +REC|SELECT_CALL|LINE=34|NAME=need +REC|SELECT_CALL|LINE=34|AST=need(_j_vmid_ for j in rows_ == set(by_id), __) +REC|SELECT_CALL|LINE=36|NAME=need +REC|SELECT_CALL|LINE=36|AST=need(row_config_sha256_ == by_id_row_vmid_config_sha256_, __) +REC|SELECT_CALL|LINE=38|NAME=need +REC|SELECT_CALL|LINE=38|AST=need(len(selected) == 1, _CT112_NOT_UNIQUE_) +REC|SELECT_CALL|LINE=39|NAME=validate_job +REC|SELECT_CALL|LINE=39|AST=old.validate_job(job, now) +REC|SELECT_CALL|LINE=40|NAME=need +REC|SELECT_CALL|LINE=40|AST=need(current.get(__) == _, __) +REC|SELECT_CALL|LINE=41|NAME=need +REC|SELECT_CALL|LINE=41|AST=need(job.get(_compression_dependent_) is False and job.get(_configured_full_cycle_fits_) is True, __) +REC|SELECT_CALL|LINE=42|NAME=need +REC|SELECT_CALL|LINE=42|AST=need(type(disks) is list and len(disks) == 1, __) +REC|SELECT_CALL|LINE=44|NAME=need +REC|SELECT_CALL|LINE=44|AST=need(disk.get(__) == _rootfs_ and disk.get(__) == __ and (disk.get(__) in (__, __)), __) +REC|SELECT_CALL|LINE=46|NAME=need +REC|SELECT_CALL|LINE=46|AST=need(type(size) is int and 0 < size <= stream.MAX_BYTES and (size == disk.get(__)), __) +REC|SELECT_CALL|LINE=48|NAME=need +REC|SELECT_CALL|LINE=48|AST=need(st.get(__) is True and st.get(__) is True and (st.get(_type_) in (__, __)), __) +REC|SELECT_CALL|LINE=49|NAME=need +REC|SELECT_CALL|LINE=49|AST=need(type(st.get(__)) is int and st__ >= max(1024 _ 3, size), __) +REC|SELECT_CALL|LINE=50|NAME=require_target +REC|SELECT_CALL|LINE=50|AST=require_target(job, by_id_TARGET_VMID_config_sha256_) +HANDLER_BASELINE_FUNCTION_COUNT=1 +HANDLER_BASELINE_ARGS=NONE +HANDLER_BASELINE_FIRST_LINE=31 +HANDLER_BASELINE_TOP_LEVEL_STATEMENTS=3 +REC|HANDLER_BASELINE|IDX=1|LINE=32 +REC|HANDLER_BASELINE|IDX=1|KIND=Assign +REC|HANDLER_BASELINE|IDX=1|AST=b = t.read_secure(PLAN, 1024 _ 1024, private=True)_0_ +REC|HANDLER_BASELINE|IDX=2|LINE=33 +REC|HANDLER_BASELINE|IDX=2|KIND=If +REC|HANDLER_BASELINE|IDX=2|AST=if t.sha(b) _= PLAN_SHA: raise RuntimeError(_PLAN_REFERENCE_IDENTITY_) +REC|HANDLER_BASELINE|IDX=3|LINE=34 +REC|HANDLER_BASELINE|IDX=3|KIND=Try +REC|HANDLER_BASELINE|IDX=3|AST=try: return json.loads(b.decode(__, __)) except (ValueError, UnicodeError): raise RuntimeError(__) from None +HANDLER_FRESH_FUNCTION_COUNT=1 +HANDLER_FRESH_ARGS=now +HANDLER_FRESH_FIRST_LINE=42 +HANDLER_FRESH_TOP_LEVEL_STATEMENTS=8 +REC|HANDLER_FRESH|IDX=1|LINE=43 +REC|HANDLER_FRESH|IDX=1|KIND=Assign +REC|HANDLER_FRESH|IDX=1|AST=rows = _json_cmd(__, __, __) +REC|HANDLER_FRESH|IDX=2|LINE=44 +REC|HANDLER_FRESH|IDX=2|KIND=Assign +REC|HANDLER_FRESH|IDX=2|AST=stores = _json_cmd(__) +REC|HANDLER_FRESH|IDX=3|LINE=45 +REC|HANDLER_FRESH|IDX=3|KIND=If +REC|HANDLER_FRESH|IDX=3|AST=if not isinstance(rows, list) or not isinstance(stores, list): raise RuntimeError(__) +REC|HANDLER_FRESH|IDX=4|LINE=46 +REC|HANDLER_FRESH|IDX=4|KIND=Assign +REC|HANDLER_FRESH|IDX=4|AST=configs = _ +REC|HANDLER_FRESH|IDX=5|LINE=47 +REC|HANDLER_FRESH|IDX=5|KIND=For +REC|HANDLER_FRESH|IDX=5|AST=for r in rows: if not isinstance(r, dict) or r.get(_node_) _= _pve01_ or r.get(_type_) not in (_lxc_, __): continue vmid = r.get(_vmid_) if type(vmid) is not int: raise RuntimeError(__) configs_vmid_ = _json_cmd(f__r_type__vmid__) +REC|HANDLER_FRESH|IDX=6|LINE=52 +REC|HANDLER_FRESH|IDX=6|KIND=Assign +REC|HANDLER_FRESH|IDX=6|AST=v = os.statvfs(STAGING) +REC|HANDLER_FRESH|IDX=7|LINE=52 +REC|HANDLER_FRESH|IDX=7|KIND=Assign +REC|HANDLER_FRESH|IDX=7|AST=free = v.f_frsize _ v.f_bavail +REC|HANDLER_FRESH|IDX=8|LINE=53 +REC|HANDLER_FRESH|IDX=8|KIND=Return +REC|HANDLER_FRESH|IDX=8|AST=return pve265.make_plan(rows, configs, stores, _defaults(), free, now, node=_pve01_) +HANDLER_RUN_FUNCTION_COUNT=1 +HANDLER_RUN_ARGS=target,state_writer +HANDLER_RUN_FIRST_LINE=100 +HANDLER_RUN_TOP_LEVEL_STATEMENTS=24 +REC|HANDLER_RUN|IDX=1|LINE=101 +REC|HANDLER_RUN|IDX=1|KIND=If +REC|HANDLER_RUN|IDX=1|AST=if not isinstance(target, dict) or target.get(__) _= CT_ID or target.get(_vmid_) _= 112: return (_ for _ in ()).throw(RuntimeError(__)) +REC|HANDLER_RUN|IDX=2|LINE=102 +REC|HANDLER_RUN|IDX=2|KIND=If +REC|HANDLER_RUN|IDX=2|AST=if _sha(PLAN, 1024 _ 1024) _= PLAN_SHA: raise RuntimeError(_PLAN_REFERENCE_IDENTITY_) +REC|HANDLER_RUN|IDX=3|LINE=103 +REC|HANDLER_RUN|IDX=3|KIND=Assign +REC|HANDLER_RUN|IDX=3|AST=tools = __: _tool(VZDUMP, VZDUMP_SHA), __: _tool(ZSTD, ZSTD_SHA)_ +REC|HANDLER_RUN|IDX=4|LINE=103 +REC|HANDLER_RUN|IDX=4|KIND=Expr +REC|HANDLER_RUN|IDX=4|AST=_tool(RCLONE, RCLONE_SHA) +REC|HANDLER_RUN|IDX=5|LINE=104 +REC|HANDLER_RUN|IDX=5|KIND=Assign +REC|HANDLER_RUN|IDX=5|AST=pvesh_sha = _sha(PVESH) +REC|HANDLER_RUN|IDX=6|LINE=104 +REC|HANDLER_RUN|IDX=6|KIND=Assign +REC|HANDLER_RUN|IDX=6|AST=baseline = _baseline() +REC|HANDLER_RUN|IDX=7|LINE=104 +REC|HANDLER_RUN|IDX=7|KIND=Assign +REC|HANDLER_RUN|IDX=7|AST=now = int(time.time()) +REC|HANDLER_RUN|IDX=8|LINE=104 +REC|HANDLER_RUN|IDX=8|KIND=Assign +REC|HANDLER_RUN|IDX=8|AST=current = _fresh_plan(now) +REC|HANDLER_RUN|IDX=9|LINE=104 +REC|HANDLER_RUN|IDX=9|KIND=Assign +REC|HANDLER_RUN|IDX=9|AST=job = pve282.select112(current, baseline, now) +REC|HANDLER_RUN|IDX=10|LINE=105 +REC|HANDLER_RUN|IDX=10|KIND=Assign +REC|HANDLER_RUN|IDX=10|AST=expected = job_config_sha256_ +REC|HANDLER_RUN|IDX=11|LINE=105 +REC|HANDLER_RUN|IDX=11|KIND=Assign +REC|HANDLER_RUN|IDX=11|AST=mapping = pve282.host_mapping() +REC|HANDLER_RUN|IDX=12|LINE=105 +REC|HANDLER_RUN|IDX=12|KIND=Expr +REC|HANDLER_RUN|IDX=12|AST=pve282.validate_mapping(mapping) +REC|HANDLER_RUN|IDX=13|LINE=106 +REC|HANDLER_RUN|IDX=13|KIND=FunctionDef +REC|HANDLER_RUN|IDX=13|AST=def producer_guard(): now2 = int(time.time()) cur = _fresh_plan(now2) fresh = pve282.select112(cur, baseline, now2) tasks = _json_cmd(__, __, __) guest266.no_active_tasks(tasks, 112) if _sha(PVESH) _= pvesh_sha: raise RuntimeError(__) pve282.live_gate(fresh, str(PVESH), pvesh_sha, expected) +VZDUMP_CONFIG_BYTES=566 +VZDUMP_CONFIG_TYPED_INPUT=str +DRY_RUN_STARTED=true +BASELINE_LOAD_OK=true +FRESH_PLAN_MAKE_OK=true +BASELINE_LIVE_PLAN_CHANGED_KEYS=all_guest_coverage_eligible,collected_at_utc,global_blockers,global_defaults,guest_membership_and_configs_stable,jobs,local_guest_count,node_execution_approved,observed_at,pvesh_get_calls,pvesh_sha256,refresh_required_before_backup,staging_free_bytes,storages,tools +BASELINE_PLAN_TYPE=dict +BASELINE_PLAN_KEYS=all_guest_coverage_eligible,backup_executed,capacity_policy,collected_at_utc,full_host_coverage,global_blockers,global_defaults,guest_membership_and_configs_stable,jobs,local_guest_count,node,node_execution_approved,nodeset_backup_approved,observed_at,pvesh_get_calls,pvesh_sha256,refresh_required_before_backup,schema_version,staging_free_bytes,storages,tools +BASELINE_PLAN_JOBS_TYPE=list +BASELINE_PLAN_JOB_COUNT=6 +BASELINE_PLAN_VMID_LIST_HASH=b6b595ac377f78e071aca2ab359a7c7ae1bcb0485e68728a7c48f076f36cde40 +BASELINE_PLAN_VM112_COUNT=1 +BASELINE_PLAN_VM112_FIELDS=application_consistency_verified,archive_cap_bytes,blockers,cdrom_count,cdrom_media_included,compression_dependent,config_sha256,configured_archive_bound_bytes,configured_disk_bytes,configured_full_cycle_fits,coverage_eligible,disks,global_defaults_sha256,guest_restore_verified,hookscript_present,local_reserve_bytes,lock_present,node,observed_at,reported_maxdisk_bytes,reported_maxmem_bytes,snapshot_history_included,status,template,type,unused_volume_count,vmid +BASELINE_PLAN_VM112_AGE_SECONDS=2223483 +FRESH_PLAN_TYPE=dict +FRESH_PLAN_KEYS=all_guest_coverage_eligible,backup_executed,capacity_policy,full_host_coverage,global_blockers,global_defaults,jobs,local_guest_count,node,nodeset_backup_approved,observed_at,schema_version,staging_free_bytes,storages +FRESH_PLAN_JOBS_TYPE=list +FRESH_PLAN_JOB_COUNT=8 +FRESH_PLAN_VMID_LIST_HASH=a6268963746816277a805ff5113847e826ba0ce06c0ae1cf316594a474670de6 +FRESH_PLAN_VM112_COUNT=1 +FRESH_PLAN_VM112_FIELDS=application_consistency_verified,archive_cap_bytes,blockers,cdrom_count,cdrom_media_included,compression_dependent,config_sha256,configured_archive_bound_bytes,configured_disk_bytes,configured_full_cycle_fits,coverage_eligible,disks,global_defaults_sha256,guest_restore_verified,hookscript_present,local_reserve_bytes,lock_present,node,observed_at,reported_maxdisk_bytes,reported_maxmem_bytes,snapshot_history_included,status,template,type,unused_volume_count,vmid +FRESH_PLAN_VM112_AGE_SECONDS=6 +BASELINE_LIVE_VM112_CHANGED_KEYS=blockers,coverage_eligible,global_defaults_sha256,observed_at +VM112_FIELD_CONFIG_SHA256_EQUAL=true +VM112_FIELD_GLOBAL_DEFAULTS_SHA256_EQUAL=false +VM112_FIELD_NODE_EQUAL=true +VM112_FIELD_VMID_EQUAL=true +VM112_FIELD_TYPE_EQUAL=true +VM112_FIELD_TEMPLATE_EQUAL=true +VM112_FIELD_BLOCKERS_EQUAL=false +VM112_FIELD_COVERAGE_ELIGIBLE_EQUAL=false +VM112_FIELD_COMPRESSION_DEPENDENT_EQUAL=true +VM112_FIELD_CONFIGURED_FULL_CYCLE_FITS_EQUAL=true +REAL_SELECT112_DRYRUN_SKIPPED=true +DECISION=PASS_SOURCE_AND_LIVE_PLAN_COMPARISON_RECORDED +NEXT_GATE=FIX_EXACT_PLAN_NOT_STABLE_MISMATCH_NOT_GUARD_BYPASS CHANGES_MADE=false ROLLBACK_STARTED=false ROLLBACK_RESTORED=null MUTATION_OUTCOME=NO_MUTATION END_MARKER=true -HOMELAB_RESULT_CONTRACT={"version":1,"command_id":"SUPPORT-261008-CT112-PLAN-STABILITY-GATE-99823R1","status":"OK","changes_made":false,"rollback_started":false,"rollback_restored":null} -PROBE_PYTHON_RC=0 +HOMELAB_RESULT_CONTRACT={"version":1,"command_id":"SUPPORT-261008-CT112-PLAN-DATAFLOW-ROOT-99824R1","status":"OK","changes_made":false,"rollback_started":false,"rollback_restored":null} +PLAN_DATAFLOW_PYTHON_RC=0 OUTPUT_END CHAT_OUTPUT_END