From 0d6c0ec9569cca408d0c3cd98d5d94229339d93f Mon Sep 17 00:00:00 2001 From: homelab-runtime-publisher Date: Mon, 21 Sep 2026 21:11:09 +0000 Subject: [PATCH] runtime: publish SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-HASH-NORMALIZATION-READONLY-896R1 --- ...H-C-HASH-NORMALIZATION-READONLY-896R1.json | 38 ++++++++++++++ ...CH-C-HASH-NORMALIZATION-READONLY-896R1.txt | 50 +++++++++++++++++++ runtime/latest.json | 16 +++--- runtime/latest.txt | 44 ++++++++-------- 4 files changed, 119 insertions(+), 29 deletions(-) create mode 100644 runtime/history/SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-HASH-NORMALIZATION-READONLY-896R1.json create mode 100644 runtime/history/SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-HASH-NORMALIZATION-READONLY-896R1.txt diff --git a/runtime/history/SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-HASH-NORMALIZATION-READONLY-896R1.json b/runtime/history/SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-HASH-NORMALIZATION-READONLY-896R1.json new file mode 100644 index 00000000..53b4e6da --- /dev/null +++ b/runtime/history/SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-HASH-NORMALIZATION-READONLY-896R1.json @@ -0,0 +1,38 @@ +{ + "schema_version": 1, + "channel": "homelab-runtime", + "command_id": "SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-HASH-NORMALIZATION-READONLY-896R1", + "status": "OK", + "rc": 0, + "host": "pve01", + "mode": "read-only", + "component": "pvepro-editorial-batch-c-hash-normalization", + "started_at_utc": "2026-09-21T21:11:07Z", + "finished_at_utc": "2026-09-21T21:11:08Z", + "reference_register_checked": true, + "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", + "error_register_checked": true, + "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", + "command_sha256": "65b425495d49350f446ea7e2e86d1840cc62438777e4b2979c521634758aa83c", + "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": "3c6a592971e6b3b3ef6ec5e50292c1fc503986deab1efc292079764c9f695094", + "sanitized_output_sha256": "3c6a592971e6b3b3ef6ec5e50292c1fc503986deab1efc292079764c9f695094", + "output_truncated_in_json": false, + "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", + "output": "PVEPRO896_BEGIN=true\nCOMMAND_ID=SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-HASH-NORMALIZATION-READONLY-896R1\nSCOPE=READ_ONLY_BATCH_C_HISTORICAL_HASH_NORMALIZATION_RECONCILE\nAUTHORITY={\"ERROR_REGISTER\":{\"bytes\":302058,\"expected_sha256\":\"3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0\",\"match\":true,\"sha256\":\"3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0\"},\"REFERENCE\":{\"bytes\":201129,\"expected_sha256\":\"5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66\",\"match\":true,\"sha256\":\"5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66\"}}\nPRODUCTION_HOST={\"name\":\"pvepro-prod\",\"node\":\"pve01\",\"status\":\"running\",\"vmid\":100}\nQGA_TRANSPORT={\"rc\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"}\nQGA_CONTRACT={\"err_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"err_truncated\":null,\"exitcode\":0,\"exited\":1,\"out_truncated\":0}\nHASH_NORMALIZATION_RECONCILE={\"historical_chars_match_9of9\":false,\"historical_whitespace_words_match_9of9\":true,\"reason\":\"HISTORICAL_PROVENANCE_UNRESOLVED\",\"result\":\"HOLD\",\"target_ids\":[31,32,33,34,35,36,37,38,39],\"targets\":[{\"alpha_num_words\":103,\"candidate_hashes\":{\"cp1251\":\"5134669d3dab1dc310f385686922a72606d75998261ce5d38e50f79cd5062f1d\",\"html_escape_utf8\":\"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f\",\"json_ascii_no_quotes\":\"9c19120a513eee9742f043bb663fa43058621df4863a4ff6413fa715f12b1981\",\"json_ascii_with_quotes\":\"7bf0d2da56a30f5a025e35c04297a2a234e8da93acd99ed973675149e59871d3\",\"json_utf8_with_quotes\":\"31355ca8644aa5ba83d58e0f7f33d36028e0d88c6f13c513f5eba6f5a19d9c8d\",\"lf_strip_utf8\":\"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f\",\"lf_utf8\":\"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f\",\"nfc_utf8\":\"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f\",\"nfd_utf8\":\"0c3e5499fa0e2283580a6829f463f04be5a8949bffafc98def5e5378cafe9f4c\",\"nfkc_utf8\":\"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f\",\"nfkd_utf8\":\"0c3e5499fa0e2283580a6829f463f04be5a8949bffafc98def5e5378cafe9f4c\",\"raw_utf8\":\"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f\",\"rstrip_utf8\":\"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f\",\"strip_utf8\":\"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f\",\"utf16be\":\"cee879691dac35f38898e72ff2891d9785559a4ac212fc8bbda42ce7c5fa77d5\",\"utf16le\":\"17b289bcc72aff901fc98e8f4ec096579645f66d6afff2fa4712de7bb298b040\",\"utf8_as_latin1_then_utf8\":\"c22692f00a105b5a8926aae764251fc7bc140ac045a6f02bcf18ff414fe9f79b\"},\"first_post_id\":31,\"forum\":\"PVEPro AI Lab\",\"historical_719\":{\"chars\":731,\"sha256\":\"aba65fce05dad18fd302c9486d96c5845ede9e883b6c9138fcf4896ba7d59145\",\"words\":83},\"historical_chars_match\":false,\"historical_whitespace_words_match\":true,\"line_count\":19,\"matching_hash_transforms\":[],\"node_id\":15,\"raw_bytes\":1110,\"raw_sha256\":\"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f\",\"regex_w_words\":103,\"reply_count\":0,\"sticky\":0,\"thread_id\":31,\"title\":\"[Private AI] RAG \\u043f\\u043e \\u0432\\u043d\\u0443\\u0442\\u0440\\u0435\\u043d\\u043d\\u0438\\u043c \\u0440\\u0435\\u0433\\u043b\\u0430\\u043c\\u0435\\u043d\\u0442\\u0430\\u043c\",\"unicode_chars\":737,\"whitespace_words\":83},{\"alpha_num_words\":103,\"candidate_hashes\":{\"cp1251\":\"c24bf16ee0d86b316fc880c5d226f56cc3bfd9ae488bb694e2282e0a93ab16ce\",\"html_escape_utf8\":\"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a\",\"json_ascii_no_quotes\":\"6a0c95802d884f0c356c6d74d925fef2df7ead4f741e0327b2fe6fd8b237e63e\",\"json_ascii_with_quotes\":\"7b55d924074451eddc041a30309cf89147a873206d7dcdb15a9805dc932140a1\",\"json_utf8_with_quotes\":\"8b969beffb5b6976465ced85957532ca134c1084a563d8a3c5d5543e31477ddb\",\"lf_strip_utf8\":\"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a\",\"lf_utf8\":\"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a\",\"nfc_utf8\":\"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a\",\"nfd_utf8\":\"cdfd83f891d6869f1d6aa974b3c71f27c9c84ead3fe4f10ed526ab502d79c63a\",\"nfkc_utf8\":\"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a\",\"nfkd_utf8\":\"cdfd83f891d6869f1d6aa974b3c71f27c9c84ead3fe4f10ed526ab502d79c63a\",\"raw_utf8\":\"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a\",\"rstrip_utf8\":\"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a\",\"strip_utf8\":\"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a\",\"utf16be\":\"1d0970f69c718a9575d75723b148d0d3ee89cb6d6fa8372ffa628ff1aa4c0066\",\"utf16le\":\"23e482fec9c59494e7ee78cc803b0106c17955ce9b42aec547df35f8863d36a4\",\"utf8_as_cp1251_then_utf8\":\"ebf18c1278e9f1e54bde685ccd299b62db933ed7fbe2f6948536e87124ba766b\",\"utf8_as_latin1_then_utf8\":\"a37563ec0b60616c37fc7504edf7f5772cad00f6ec5bad4525e1d95a928cf9fd\"},\"first_post_id\":32,\"forum\":\"PVEPro AI Lab\",\"historical_719\":{\"chars\":717,\"sha256\":\"66329dfcce09a3f655f25f67045a5528b838614eb43ad29b88f3288602e21fcb\",\"words\":84},\"historical_chars_match\":false,\"historical_whitespace_words_match\":true,\"line_count\":19,\"matching_hash_transforms\":[],\"node_id\":15,\"raw_bytes\":1086,\"raw_sha256\":\"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a\",\"regex_w_words\":103,\"reply_count\":0,\"sticky\":0,\"thread_id\":32,\"title\":\"[Private AI] \\u041b\\u043e\\u043a\\u0430\\u043b\\u044c\\u043d\\u0430\\u044f \\u0442\\u0440\\u0430\\u043d\\u0441\\u043a\\u0440\\u0438\\u0431\\u0430\\u0446\\u0438\\u044f \\u0432\\u0441\\u0442\\u0440\\u0435\\u0447\",\"unicode_chars\":723,\"whitespace_words\":84},{\"alpha_num_words\":109,\"candidate_hashes\":{\"cp1251\":\"f35f37b0d32183d47f6e538f65f5cf6f84034ea752a4167b03bebf5a5e3b1f45\",\"html_escape_utf8\":\"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10\",\"json_ascii_no_quotes\":\"0da0d8bfb5ef49739cae4d91eca10551f170dd473a66752fbdc9fd93f796aa76\",\"json_ascii_with_quotes\":\"75c19bd25dbb8250d225e57dd2b7aeca462b4505373a1eeb832223b16474f798\",\"json_utf8_with_quotes\":\"7ecf4bc796af2597e36d7178bfe265b784ba608703629f44b0e51229be13fa45\",\"lf_strip_utf8\":\"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10\",\"lf_utf8\":\"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10\",\"nfc_utf8\":\"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10\",\"nfd_utf8\":\"aa77f3348fe4f7ecf75817fb15e087ecfe84aaf735dcd0da6260b1430664057a\",\"nfkc_utf8\":\"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10\",\"nfkd_utf8\":\"aa77f3348fe4f7ecf75817fb15e087ecfe84aaf735dcd0da6260b1430664057a\",\"raw_utf8\":\"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10\",\"rstrip_utf8\":\"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10\",\"strip_utf8\":\"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10\",\"utf16be\":\"79aff08627de4de35ad1b9866f77819c6ffe8780c088960aa093e88d29ba1b42\",\"utf16le\":\"fe291ad206f2b53b367ec5a2128244cb119efc4c627deeabdede2b05fc708f42\",\"utf8_as_cp1251_then_utf8\":\"8848dde4fe089434db6fd0c5b56002100487bf6ff69e624fae3fa7724b6d332e\",\"utf8_as_latin1_then_utf8\":\"410c4e8a5f967063aa973efdb4cd3fa74a4e20637d0eb06ed9e572fc88023559\"},\"first_post_id\":33,\"forum\":\"PVEPro AI Lab\",\"historical_719\":{\"chars\":750,\"sha256\":\"ade466868849f37253f6eb05e1c71f7466e6c26a3db05119ab56c73a580202a6\",\"words\":91},\"historical_chars_match\":false,\"historical_whitespace_words_match\":true,\"line_count\":19,\"matching_hash_transforms\":[],\"node_id\":15,\"raw_bytes\":1148,\"raw_sha256\":\"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10\",\"regex_w_words\":109,\"reply_count\":0,\"sticky\":0,\"thread_id\":33,\"title\":\"[Private AI] \\u0410\\u0433\\u0435\\u043d\\u0442 \\u0441 \\u0434\\u043e\\u0441\\u0442\\u0443\\u043f\\u043e\\u043c \\u043a CRM\",\"unicode_chars\":756,\"whitespace_words\":91},{\"alpha_num_words\":102,\"candidate_hashes\":{\"cp1251\":\"1035007641b2c5fd58d5a38f296f4a80aab4f86803d76a44b27cf364ca78691c\",\"html_escape_utf8\":\"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade\",\"json_ascii_no_quotes\":\"45e10faf31cd49a828c9c534279521e2a0bbc7dfbbe512696aa348d2381189d0\",\"json_ascii_with_quotes\":\"5f44ed4756d6cb52ac7150da971087568a723629b186f7c4a720c79748bba51c\",\"json_utf8_with_quotes\":\"faa0be19c161b80dab86800711febdb0ff196434c009abd4f022168bc9214aec\",\"lf_strip_utf8\":\"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade\",\"lf_utf8\":\"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade\",\"nfc_utf8\":\"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade\",\"nfd_utf8\":\"b59124306fbc0ae8cbff9ba2242775d3d7bba83271762820b3e88664fb3f5705\",\"nfkc_utf8\":\"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade\",\"nfkd_utf8\":\"b59124306fbc0ae8cbff9ba2242775d3d7bba83271762820b3e88664fb3f5705\",\"raw_utf8\":\"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade\",\"rstrip_utf8\":\"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade\",\"strip_utf8\":\"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade\",\"utf16be\":\"386544c3aa749fff8d4be3936114cd46aa6f3a87fae0314136a35900a118c6da\",\"utf16le\":\"baafe68dd6e74d1c849f5f576c0c49de2439f3ca198cf0b387b4ee2048e29a70\",\"utf8_as_cp1251_then_utf8\":\"23fb7d7fd2a7d19b2ed450f29a2719dc0d9a1d4cdb2f25c1becc741f529a2a16\",\"utf8_as_latin1_then_utf8\":\"fd20390f688aa44003137b719e8b54db1d8e0093707f771707fb342e48c0c2fb\"},\"first_post_id\":34,\"forum\":\"\\u0416\\u0435\\u043b\\u0435\\u0437\\u043e \\u0438 \\u043f\\u043b\\u043e\\u0449\\u0430\\u0434\\u043a\\u0438\",\"historical_719\":{\"chars\":701,\"sha256\":\"31accb654aa518f680f9dca2f043342094d2158ddf4704f4233cef35f43c5cda\",\"words\":81},\"historical_chars_match\":false,\"historical_whitespace_words_match\":true,\"line_count\":19,\"matching_hash_transforms\":[],\"node_id\":16,\"raw_bytes\":1098,\"raw_sha256\":\"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade\",\"regex_w_words\":102,\"reply_count\":0,\"sticky\":0,\"thread_id\":34,\"title\":\"[\\u041f\\u043b\\u043e\\u0449\\u0430\\u0434\\u043a\\u0430] Mini-PC cluster vs tower server\",\"unicode_chars\":707,\"whitespace_words\":81},{\"alpha_num_words\":96,\"candidate_hashes\":{\"cp1251\":\"078475078bc0d769b65df050d02d63f227e9ec710a55160e24707c03257c6a17\",\"html_escape_utf8\":\"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6\",\"json_ascii_no_quotes\":\"34f593080587784b4efe1d73f9badd5325c91b3b5075b15fefa40043dadf33be\",\"json_ascii_with_quotes\":\"93a61713045e092f9da99f5fbf6e66d3c066b15230c5db74b524b6412f88c1ca\",\"json_utf8_with_quotes\":\"0271e84c660ed5b34c8c34ddc65d98abacdc64b58a1007bf12d3ba9b4c86fb61\",\"lf_strip_utf8\":\"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6\",\"lf_utf8\":\"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6\",\"nfc_utf8\":\"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6\",\"nfd_utf8\":\"939f61bdb2796d868afa2f6c112bef1f0633f305d57b8f4343d53012ea44f91d\",\"nfkc_utf8\":\"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6\",\"nfkd_utf8\":\"939f61bdb2796d868afa2f6c112bef1f0633f305d57b8f4343d53012ea44f91d\",\"raw_utf8\":\"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6\",\"rstrip_utf8\":\"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6\",\"strip_utf8\":\"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6\",\"utf16be\":\"802de01f22a143d88631f71a9babbe04399dbe7c4d4d9dbddd24a41ea7c8bb2c\",\"utf16le\":\"6bd4edb76c9fc443ac7519c5032c9541b6cbc38150965efcc487959a9e2b0fe1\",\"utf8_as_cp1251_then_utf8\":\"0081bc78836cd9fee7f2f4f76065b9479fc7cfcbe52271509a5fffdb8aa4f91f\",\"utf8_as_latin1_then_utf8\":\"9e3cb9c0e0038d558d8c8d68e953e3c58ce0a2663bc0673af8c9ab9dbcccd8a4\"},\"first_post_id\":35,\"forum\":\"\\u0416\\u0435\\u043b\\u0435\\u0437\\u043e \\u0438 \\u043f\\u043b\\u043e\\u0449\\u0430\\u0434\\u043a\\u0438\",\"historical_719\":{\"chars\":673,\"sha256\":\"c8a1a0db8103ad40279d271c8006e3d1dadee6507730ba30155cc97dbe96383d\",\"words\":77},\"historical_chars_match\":false,\"historical_whitespace_words_match\":true,\"line_count\":19,\"matching_hash_transforms\":[],\"node_id\":16,\"raw_bytes\":991,\"raw_sha256\":\"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6\",\"regex_w_words\":96,\"reply_count\":0,\"sticky\":0,\"thread_id\":35,\"title\":\"[\\u041f\\u043b\\u043e\\u0449\\u0430\\u0434\\u043a\\u0430] NVMe mirror vs RAIDZ\",\"unicode_chars\":679,\"whitespace_words\":77},{\"alpha_num_words\":105,\"candidate_hashes\":{\"cp1251\":\"f96a9a6084ebd376f3d5b44eab4922a38acf29ef588704e5c75f8acff15e5148\",\"html_escape_utf8\":\"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26\",\"json_ascii_no_quotes\":\"0414e33d9ef94f8971d60329d0627fc86d84377a60256dcddc84173ff09020d3\",\"json_ascii_with_quotes\":\"3d78dba3115b08d1938ae58b4db5c7321012c7775d7c8e23b3457b8a73974811\",\"json_utf8_with_quotes\":\"06b7bf9c21fcad49f16b32e06670f249f90c137c5e2734748a5a68a11c054385\",\"lf_strip_utf8\":\"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26\",\"lf_utf8\":\"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26\",\"nfc_utf8\":\"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26\",\"nfd_utf8\":\"f0c6433c0b77b9883f82412d4f93a283568ca1a668484a55bb2c7565c63d9c28\",\"nfkc_utf8\":\"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26\",\"nfkd_utf8\":\"f0c6433c0b77b9883f82412d4f93a283568ca1a668484a55bb2c7565c63d9c28\",\"raw_utf8\":\"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26\",\"rstrip_utf8\":\"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26\",\"strip_utf8\":\"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26\",\"utf16be\":\"f124c8be21fe8009f6391e09450c9ccd2f99a60d570187e8688750a384758e6e\",\"utf16le\":\"7f1b9e73d05f3eaebac32643fee1bffc95e7919289c556b4b800f4e43df443f3\",\"utf8_as_cp1251_then_utf8\":\"f195fcb1adfa9b987f5bc3ff89ba45e31b1639231b6a7b11d2084396a5567dd2\",\"utf8_as_latin1_then_utf8\":\"fef2032e23fea3eb96bbf2c16704528167a5fb226597e9d9a6b8f375e2baee74\"},\"first_post_id\":36,\"forum\":\"\\u0416\\u0435\\u043b\\u0435\\u0437\\u043e \\u0438 \\u043f\\u043b\\u043e\\u0449\\u0430\\u0434\\u043a\\u0438\",\"historical_719\":{\"chars\":754,\"sha256\":\"e90d204f73c7ee5ad1ffb7f227f1cdd64bad69f5fa978f078b79ac89045ae287\",\"words\":84},\"historical_chars_match\":false,\"historical_whitespace_words_match\":true,\"line_count\":19,\"matching_hash_transforms\":[],\"node_id\":16,\"raw_bytes\":1166,\"raw_sha256\":\"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26\",\"regex_w_words\":105,\"reply_count\":0,\"sticky\":0,\"thread_id\":36,\"title\":\"[\\u041f\\u043b\\u043e\\u0449\\u0430\\u0434\\u043a\\u0430] \\u041f\\u0435\\u0440\\u0435\\u043d\\u043e\\u0441\\u0438\\u043c\\u043e\\u0441\\u0442\\u044c home-lab \\u2192 hosting/cloud\",\"unicode_chars\":760,\"whitespace_words\":84},{\"alpha_num_words\":104,\"candidate_hashes\":{\"cp1251\":\"3c0834afd170b5036587ed42f144f9c7fc0ac73f20551624fd6b17b366ca7617\",\"html_escape_utf8\":\"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d\",\"json_ascii_no_quotes\":\"f83b7f0525738433d91811da4d39dbebcb1785e74847e0517a334e4b126a3077\",\"json_ascii_with_quotes\":\"40530cf7e3fdb755cd732b3176ec1a8e5a35a613b943aad64fd34c7dcd3dafc5\",\"json_utf8_with_quotes\":\"5bc1902ce7eb6a6f1b58d4f3ba40f0be79c0e326ca47de972e006a3342c2cf11\",\"lf_strip_utf8\":\"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d\",\"lf_utf8\":\"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d\",\"nfc_utf8\":\"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d\",\"nfd_utf8\":\"3357f1f364d4c47e7cd6234defcd18a3271a30ecb2b8b48eb0d64bda980a54c9\",\"nfkc_utf8\":\"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d\",\"nfkd_utf8\":\"3357f1f364d4c47e7cd6234defcd18a3271a30ecb2b8b48eb0d64bda980a54c9\",\"raw_utf8\":\"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d\",\"rstrip_utf8\":\"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d\",\"strip_utf8\":\"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d\",\"utf16be\":\"2c9c6877a1c67edbe9987404174be06c073ef78c9acfdebc6577932cb03146c4\",\"utf16le\":\"8683e980d45c470ce4fbbbf98b799d8266af4e583d65e6ac4d5e2a05616d2735\",\"utf8_as_latin1_then_utf8\":\"cd96abe35a09b7b221cf21f6afac3278ba21bc89414c0812660120edf7da4c2a\"},\"first_post_id\":37,\"forum\":\"\\u0417\\u0430\\u043f\\u0440\\u043e\\u0441\\u044b \\u043d\\u0430 \\u0432\\u043d\\u0435\\u0434\\u0440\\u0435\\u043d\\u0438\\u0435\",\"historical_719\":{\"chars\":737,\"sha256\":\"17c2a8f3e11adff49fdd2c2184b0286796dca4dde755b06b9ee75f1ede52e3c1\",\"words\":85},\"historical_chars_match\":false,\"historical_whitespace_words_match\":true,\"line_count\":19,\"matching_hash_transforms\":[],\"node_id\":17,\"raw_bytes\":1167,\"raw_sha256\":\"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d\",\"regex_w_words\":104,\"reply_count\":0,\"sticky\":0,\"thread_id\":37,\"title\":\"[\\u041f\\u0440\\u0438\\u043c\\u0435\\u0440 \\u0437\\u0430\\u043f\\u0440\\u043e\\u0441\\u0430] \\u0410\\u0443\\u0434\\u0438\\u0442 backup \\u0437\\u0430 \\u043e\\u0434\\u0438\\u043d \\u0440\\u0430\\u0431\\u043e\\u0447\\u0438\\u0439 \\u0434\\u0435\\u043d\\u044c\",\"unicode_chars\":743,\"whitespace_words\":85},{\"alpha_num_words\":99,\"candidate_hashes\":{\"cp1251\":\"60a9aed8da02b6c567d958d80bfbabe9894b3345558a1a0f0ac8c8ad8c338cb2\",\"html_escape_utf8\":\"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55\",\"json_ascii_no_quotes\":\"4949d4b9bed3b145b0db8b13c197d15c719f0d9d7593dddd31822f8a92f50ef3\",\"json_ascii_with_quotes\":\"47d7186333f0e98422d85c2f5cd0e20cc6e06a1a59ddde70cad79fd80b7e8f5a\",\"json_utf8_with_quotes\":\"f0f402605737920bd4be0901f1000ad0f40245fbdbb9689983b6704c37bf9a21\",\"lf_strip_utf8\":\"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55\",\"lf_utf8\":\"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55\",\"nfc_utf8\":\"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55\",\"nfd_utf8\":\"ba7f72e513c3dcaf1fcea5438187ff06d3f1cc63981149f6607486e096da7309\",\"nfkc_utf8\":\"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55\",\"nfkd_utf8\":\"ba7f72e513c3dcaf1fcea5438187ff06d3f1cc63981149f6607486e096da7309\",\"raw_utf8\":\"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55\",\"rstrip_utf8\":\"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55\",\"strip_utf8\":\"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55\",\"utf16be\":\"f3621a73fb4c06b33cb74f0f1f574ede8aaf3870f51018c00c382b2b5ee45ea8\",\"utf16le\":\"43f9fde40d974604b8e6eed59270fc876ea178663a5f0dc22a287dfdc275ec98\",\"utf8_as_cp1251_then_utf8\":\"e80341e1d9bbb5441ba93bd5d6a5b4b31d54ecd58be0577deb0a76bcc4226e47\",\"utf8_as_latin1_then_utf8\":\"0a2d9b9a5eacf3073431c49ff1d157d4b1149ba8726c808a1a0a7e8f7400d2df\"},\"first_post_id\":38,\"forum\":\"\\u0417\\u0430\\u043f\\u0440\\u043e\\u0441\\u044b \\u043d\\u0430 \\u0432\\u043d\\u0435\\u0434\\u0440\\u0435\\u043d\\u0438\\u0435\",\"historical_719\":{\"chars\":714,\"sha256\":\"7b86c826cf409f59d38de25ad742d7c14bcfbdf567410e5087aacc3cd91b603a\",\"words\":82},\"historical_chars_match\":false,\"historical_whitespace_words_match\":true,\"line_count\":19,\"matching_hash_transforms\":[],\"node_id\":17,\"raw_bytes\":1090,\"raw_sha256\":\"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55\",\"regex_w_words\":99,\"reply_count\":0,\"sticky\":0,\"thread_id\":38,\"title\":\"[\\u041f\\u0440\\u0438\\u043c\\u0435\\u0440 \\u0437\\u0430\\u043f\\u0440\\u043e\\u0441\\u0430] Private AI \\u0434\\u043b\\u044f 20 \\u0441\\u043e\\u0442\\u0440\\u0443\\u0434\\u043d\\u0438\\u043a\\u043e\\u0432\",\"unicode_chars\":720,\"whitespace_words\":82},{\"alpha_num_words\":98,\"candidate_hashes\":{\"cp1251\":\"9b91d7a785b6a058d834199c609d904b2ad2e5b89c1dc3cd8e69359824208f62\",\"html_escape_utf8\":\"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82\",\"json_ascii_no_quotes\":\"63be89f8a369df917685c6c9d5ca09950998d64ab7e5cdd856c8837e95418b1e\",\"json_ascii_with_quotes\":\"7227207363ab89e29da7d98753756920a273fb58bb26fa6df9e875a21caacdb0\",\"json_utf8_with_quotes\":\"5efb2900be1ac8becab0ce0af0399f33b779e213d9a35c823e1a581ef4c6f136\",\"lf_strip_utf8\":\"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82\",\"lf_utf8\":\"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82\",\"nfc_utf8\":\"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82\",\"nfd_utf8\":\"c53137df64a98adb36bfaacedb43bc9f13516cc486d028e4abb6ae0e418fc595\",\"nfkc_utf8\":\"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82\",\"nfkd_utf8\":\"c53137df64a98adb36bfaacedb43bc9f13516cc486d028e4abb6ae0e418fc595\",\"raw_utf8\":\"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82\",\"rstrip_utf8\":\"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82\",\"strip_utf8\":\"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82\",\"utf16be\":\"becf36e549c4393c2c414f720d5b54114d8912a3458423ec54c1bb1b7c9f7685\",\"utf16le\":\"60e00b06b8c0422d2faee49091830a8aeb478a78c0a1df826fc194235e61065d\",\"utf8_as_cp1251_then_utf8\":\"5a14a388f3293c86e3c6814f006b9faee53cb3769e288f0bd12f503815ea1dc6\",\"utf8_as_latin1_then_utf8\":\"0564ad394b1e4cb227020e705e7d28802dafb5c240610fb3dbf5203f7f88e066\"},\"first_post_id\":39,\"forum\":\"\\u042d\\u043a\\u0441\\u043f\\u0435\\u0440\\u0442\\u044b PVEPro\",\"historical_719\":{\"chars\":690,\"sha256\":\"f9fe92236122229693a8fe5f10b7c0810079c4bb74ed7f82a44182e7faa64036\",\"words\":78},\"historical_chars_match\":false,\"historical_whitespace_words_match\":true,\"line_count\":19,\"matching_hash_transforms\":[],\"node_id\":18,\"raw_bytes\":1083,\"raw_sha256\":\"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82\",\"regex_w_words\":98,\"reply_count\":0,\"sticky\":0,\"thread_id\":39,\"title\":\"[\\u042d\\u043a\\u0441\\u043f\\u0435\\u0440\\u0442] \\u041a\\u0430\\u043a \\u043e\\u043f\\u0438\\u0441\\u044b\\u0432\\u0430\\u0442\\u044c \\u043a\\u043e\\u043c\\u043f\\u0435\\u0442\\u0435\\u043d\\u0446\\u0438\\u0438 \\u0431\\u0435\\u0437 \\u0441\\u043f\\u0438\\u0441\\u043a\\u0430 \\u043b\\u043e\\u0433\\u043e\\u0442\\u0438\\u043f\\u043e\\u0432\",\"unicode_chars\":696,\"whitespace_words\":78}],\"uniform_hash_transforms\":[]}\nPRODUCT_CHECKPOINTS_REMAINING=8\nCHECKPOINTS13_14_REMAIN_OPEN=true\nTASK_RESULT=HOLD_PVEPRO896_BATCH_C_PROVENANCE_UNRESOLVED\nDECISION=HOLD_PVEPRO896_BATCH_C_PROVENANCE_UNRESOLVED\nNEXT_GATE=RECONCILE_ONLY_PVEPRO_BATCH_C_PROVENANCE\nCHANGES_MADE_BY_896=false\nPRODUCT_MUTATION_BY_896=false\nVM_MUTATION_BY_896=false\nHOMELAB_RESULT_CONTRACT={\"changes_made\":false,\"command_id\":\"SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-HASH-NORMALIZATION-READONLY-896R1\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\nPVEPRO896_END=true\n" +} diff --git a/runtime/history/SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-HASH-NORMALIZATION-READONLY-896R1.txt b/runtime/history/SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-HASH-NORMALIZATION-READONLY-896R1.txt new file mode 100644 index 00000000..1c495812 --- /dev/null +++ b/runtime/history/SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-HASH-NORMALIZATION-READONLY-896R1.txt @@ -0,0 +1,50 @@ +CHAT_OUTPUT_BEGIN +COMMAND_ID=SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-HASH-NORMALIZATION-READONLY-896R1 +STATUS=OK +RC=0 +HOST=pve01 +MODE=read-only +COMPONENT=pvepro-editorial-batch-c-hash-normalization +REFERENCE_REGISTER_CHECK=OK +REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 +ERROR_REGISTER_CHECK=OK +ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 +COMMAND_SHA256=65b425495d49350f446ea7e2e86d1840cc62438777e4b2979c521634758aa83c +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=3c6a592971e6b3b3ef6ec5e50292c1fc503986deab1efc292079764c9f695094 +SANITIZED_OUTPUT_SHA256=3c6a592971e6b3b3ef6ec5e50292c1fc503986deab1efc292079764c9f695094 +OUTPUT_BEGIN +PVEPRO896_BEGIN=true +COMMAND_ID=SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-HASH-NORMALIZATION-READONLY-896R1 +SCOPE=READ_ONLY_BATCH_C_HISTORICAL_HASH_NORMALIZATION_RECONCILE +AUTHORITY={"ERROR_REGISTER":{"bytes":302058,"expected_sha256":"3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0","match":true,"sha256":"3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0"},"REFERENCE":{"bytes":201129,"expected_sha256":"5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66","match":true,"sha256":"5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66"}} +PRODUCTION_HOST={"name":"pvepro-prod","node":"pve01","status":"running","vmid":100} +QGA_TRANSPORT={"rc":0,"stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} +QGA_CONTRACT={"err_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","err_truncated":null,"exitcode":0,"exited":1,"out_truncated":0} +HASH_NORMALIZATION_RECONCILE={"historical_chars_match_9of9":false,"historical_whitespace_words_match_9of9":true,"reason":"HISTORICAL_PROVENANCE_UNRESOLVED","result":"HOLD","target_ids":[31,32,33,34,35,36,37,38,39],"targets":[{"alpha_num_words":103,"candidate_hashes":{"cp1251":"5134669d3dab1dc310f385686922a72606d75998261ce5d38e50f79cd5062f1d","html_escape_utf8":"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f","json_ascii_no_quotes":"9c19120a513eee9742f043bb663fa43058621df4863a4ff6413fa715f12b1981","json_ascii_with_quotes":"7bf0d2da56a30f5a025e35c04297a2a234e8da93acd99ed973675149e59871d3","json_utf8_with_quotes":"31355ca8644aa5ba83d58e0f7f33d36028e0d88c6f13c513f5eba6f5a19d9c8d","lf_strip_utf8":"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f","lf_utf8":"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f","nfc_utf8":"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f","nfd_utf8":"0c3e5499fa0e2283580a6829f463f04be5a8949bffafc98def5e5378cafe9f4c","nfkc_utf8":"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f","nfkd_utf8":"0c3e5499fa0e2283580a6829f463f04be5a8949bffafc98def5e5378cafe9f4c","raw_utf8":"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f","rstrip_utf8":"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f","strip_utf8":"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f","utf16be":"cee879691dac35f38898e72ff2891d9785559a4ac212fc8bbda42ce7c5fa77d5","utf16le":"17b289bcc72aff901fc98e8f4ec096579645f66d6afff2fa4712de7bb298b040","utf8_as_latin1_then_utf8":"c22692f00a105b5a8926aae764251fc7bc140ac045a6f02bcf18ff414fe9f79b"},"first_post_id":31,"forum":"PVEPro AI Lab","historical_719":{"chars":731,"sha256":"aba65fce05dad18fd302c9486d96c5845ede9e883b6c9138fcf4896ba7d59145","words":83},"historical_chars_match":false,"historical_whitespace_words_match":true,"line_count":19,"matching_hash_transforms":[],"node_id":15,"raw_bytes":1110,"raw_sha256":"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f","regex_w_words":103,"reply_count":0,"sticky":0,"thread_id":31,"title":"[Private AI] RAG \u043f\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c \u0440\u0435\u0433\u043b\u0430\u043c\u0435\u043d\u0442\u0430\u043c","unicode_chars":737,"whitespace_words":83},{"alpha_num_words":103,"candidate_hashes":{"cp1251":"c24bf16ee0d86b316fc880c5d226f56cc3bfd9ae488bb694e2282e0a93ab16ce","html_escape_utf8":"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a","json_ascii_no_quotes":"6a0c95802d884f0c356c6d74d925fef2df7ead4f741e0327b2fe6fd8b237e63e","json_ascii_with_quotes":"7b55d924074451eddc041a30309cf89147a873206d7dcdb15a9805dc932140a1","json_utf8_with_quotes":"8b969beffb5b6976465ced85957532ca134c1084a563d8a3c5d5543e31477ddb","lf_strip_utf8":"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a","lf_utf8":"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a","nfc_utf8":"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a","nfd_utf8":"cdfd83f891d6869f1d6aa974b3c71f27c9c84ead3fe4f10ed526ab502d79c63a","nfkc_utf8":"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a","nfkd_utf8":"cdfd83f891d6869f1d6aa974b3c71f27c9c84ead3fe4f10ed526ab502d79c63a","raw_utf8":"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a","rstrip_utf8":"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a","strip_utf8":"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a","utf16be":"1d0970f69c718a9575d75723b148d0d3ee89cb6d6fa8372ffa628ff1aa4c0066","utf16le":"23e482fec9c59494e7ee78cc803b0106c17955ce9b42aec547df35f8863d36a4","utf8_as_cp1251_then_utf8":"ebf18c1278e9f1e54bde685ccd299b62db933ed7fbe2f6948536e87124ba766b","utf8_as_latin1_then_utf8":"a37563ec0b60616c37fc7504edf7f5772cad00f6ec5bad4525e1d95a928cf9fd"},"first_post_id":32,"forum":"PVEPro AI Lab","historical_719":{"chars":717,"sha256":"66329dfcce09a3f655f25f67045a5528b838614eb43ad29b88f3288602e21fcb","words":84},"historical_chars_match":false,"historical_whitespace_words_match":true,"line_count":19,"matching_hash_transforms":[],"node_id":15,"raw_bytes":1086,"raw_sha256":"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a","regex_w_words":103,"reply_count":0,"sticky":0,"thread_id":32,"title":"[Private AI] \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0442\u0440\u0430\u043d\u0441\u043a\u0440\u0438\u0431\u0430\u0446\u0438\u044f \u0432\u0441\u0442\u0440\u0435\u0447","unicode_chars":723,"whitespace_words":84},{"alpha_num_words":109,"candidate_hashes":{"cp1251":"f35f37b0d32183d47f6e538f65f5cf6f84034ea752a4167b03bebf5a5e3b1f45","html_escape_utf8":"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10","json_ascii_no_quotes":"0da0d8bfb5ef49739cae4d91eca10551f170dd473a66752fbdc9fd93f796aa76","json_ascii_with_quotes":"75c19bd25dbb8250d225e57dd2b7aeca462b4505373a1eeb832223b16474f798","json_utf8_with_quotes":"7ecf4bc796af2597e36d7178bfe265b784ba608703629f44b0e51229be13fa45","lf_strip_utf8":"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10","lf_utf8":"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10","nfc_utf8":"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10","nfd_utf8":"aa77f3348fe4f7ecf75817fb15e087ecfe84aaf735dcd0da6260b1430664057a","nfkc_utf8":"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10","nfkd_utf8":"aa77f3348fe4f7ecf75817fb15e087ecfe84aaf735dcd0da6260b1430664057a","raw_utf8":"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10","rstrip_utf8":"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10","strip_utf8":"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10","utf16be":"79aff08627de4de35ad1b9866f77819c6ffe8780c088960aa093e88d29ba1b42","utf16le":"fe291ad206f2b53b367ec5a2128244cb119efc4c627deeabdede2b05fc708f42","utf8_as_cp1251_then_utf8":"8848dde4fe089434db6fd0c5b56002100487bf6ff69e624fae3fa7724b6d332e","utf8_as_latin1_then_utf8":"410c4e8a5f967063aa973efdb4cd3fa74a4e20637d0eb06ed9e572fc88023559"},"first_post_id":33,"forum":"PVEPro AI Lab","historical_719":{"chars":750,"sha256":"ade466868849f37253f6eb05e1c71f7466e6c26a3db05119ab56c73a580202a6","words":91},"historical_chars_match":false,"historical_whitespace_words_match":true,"line_count":19,"matching_hash_transforms":[],"node_id":15,"raw_bytes":1148,"raw_sha256":"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10","regex_w_words":109,"reply_count":0,"sticky":0,"thread_id":33,"title":"[Private AI] \u0410\u0433\u0435\u043d\u0442 \u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a CRM","unicode_chars":756,"whitespace_words":91},{"alpha_num_words":102,"candidate_hashes":{"cp1251":"1035007641b2c5fd58d5a38f296f4a80aab4f86803d76a44b27cf364ca78691c","html_escape_utf8":"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade","json_ascii_no_quotes":"45e10faf31cd49a828c9c534279521e2a0bbc7dfbbe512696aa348d2381189d0","json_ascii_with_quotes":"5f44ed4756d6cb52ac7150da971087568a723629b186f7c4a720c79748bba51c","json_utf8_with_quotes":"faa0be19c161b80dab86800711febdb0ff196434c009abd4f022168bc9214aec","lf_strip_utf8":"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade","lf_utf8":"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade","nfc_utf8":"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade","nfd_utf8":"b59124306fbc0ae8cbff9ba2242775d3d7bba83271762820b3e88664fb3f5705","nfkc_utf8":"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade","nfkd_utf8":"b59124306fbc0ae8cbff9ba2242775d3d7bba83271762820b3e88664fb3f5705","raw_utf8":"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade","rstrip_utf8":"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade","strip_utf8":"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade","utf16be":"386544c3aa749fff8d4be3936114cd46aa6f3a87fae0314136a35900a118c6da","utf16le":"baafe68dd6e74d1c849f5f576c0c49de2439f3ca198cf0b387b4ee2048e29a70","utf8_as_cp1251_then_utf8":"23fb7d7fd2a7d19b2ed450f29a2719dc0d9a1d4cdb2f25c1becc741f529a2a16","utf8_as_latin1_then_utf8":"fd20390f688aa44003137b719e8b54db1d8e0093707f771707fb342e48c0c2fb"},"first_post_id":34,"forum":"\u0416\u0435\u043b\u0435\u0437\u043e \u0438 \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0438","historical_719":{"chars":701,"sha256":"31accb654aa518f680f9dca2f043342094d2158ddf4704f4233cef35f43c5cda","words":81},"historical_chars_match":false,"historical_whitespace_words_match":true,"line_count":19,"matching_hash_transforms":[],"node_id":16,"raw_bytes":1098,"raw_sha256":"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade","regex_w_words":102,"reply_count":0,"sticky":0,"thread_id":34,"title":"[\u041f\u043b\u043e\u0449\u0430\u0434\u043a\u0430] Mini-PC cluster vs tower server","unicode_chars":707,"whitespace_words":81},{"alpha_num_words":96,"candidate_hashes":{"cp1251":"078475078bc0d769b65df050d02d63f227e9ec710a55160e24707c03257c6a17","html_escape_utf8":"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6","json_ascii_no_quotes":"34f593080587784b4efe1d73f9badd5325c91b3b5075b15fefa40043dadf33be","json_ascii_with_quotes":"93a61713045e092f9da99f5fbf6e66d3c066b15230c5db74b524b6412f88c1ca","json_utf8_with_quotes":"0271e84c660ed5b34c8c34ddc65d98abacdc64b58a1007bf12d3ba9b4c86fb61","lf_strip_utf8":"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6","lf_utf8":"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6","nfc_utf8":"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6","nfd_utf8":"939f61bdb2796d868afa2f6c112bef1f0633f305d57b8f4343d53012ea44f91d","nfkc_utf8":"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6","nfkd_utf8":"939f61bdb2796d868afa2f6c112bef1f0633f305d57b8f4343d53012ea44f91d","raw_utf8":"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6","rstrip_utf8":"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6","strip_utf8":"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6","utf16be":"802de01f22a143d88631f71a9babbe04399dbe7c4d4d9dbddd24a41ea7c8bb2c","utf16le":"6bd4edb76c9fc443ac7519c5032c9541b6cbc38150965efcc487959a9e2b0fe1","utf8_as_cp1251_then_utf8":"0081bc78836cd9fee7f2f4f76065b9479fc7cfcbe52271509a5fffdb8aa4f91f","utf8_as_latin1_then_utf8":"9e3cb9c0e0038d558d8c8d68e953e3c58ce0a2663bc0673af8c9ab9dbcccd8a4"},"first_post_id":35,"forum":"\u0416\u0435\u043b\u0435\u0437\u043e \u0438 \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0438","historical_719":{"chars":673,"sha256":"c8a1a0db8103ad40279d271c8006e3d1dadee6507730ba30155cc97dbe96383d","words":77},"historical_chars_match":false,"historical_whitespace_words_match":true,"line_count":19,"matching_hash_transforms":[],"node_id":16,"raw_bytes":991,"raw_sha256":"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6","regex_w_words":96,"reply_count":0,"sticky":0,"thread_id":35,"title":"[\u041f\u043b\u043e\u0449\u0430\u0434\u043a\u0430] NVMe mirror vs RAIDZ","unicode_chars":679,"whitespace_words":77},{"alpha_num_words":105,"candidate_hashes":{"cp1251":"f96a9a6084ebd376f3d5b44eab4922a38acf29ef588704e5c75f8acff15e5148","html_escape_utf8":"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26","json_ascii_no_quotes":"0414e33d9ef94f8971d60329d0627fc86d84377a60256dcddc84173ff09020d3","json_ascii_with_quotes":"3d78dba3115b08d1938ae58b4db5c7321012c7775d7c8e23b3457b8a73974811","json_utf8_with_quotes":"06b7bf9c21fcad49f16b32e06670f249f90c137c5e2734748a5a68a11c054385","lf_strip_utf8":"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26","lf_utf8":"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26","nfc_utf8":"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26","nfd_utf8":"f0c6433c0b77b9883f82412d4f93a283568ca1a668484a55bb2c7565c63d9c28","nfkc_utf8":"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26","nfkd_utf8":"f0c6433c0b77b9883f82412d4f93a283568ca1a668484a55bb2c7565c63d9c28","raw_utf8":"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26","rstrip_utf8":"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26","strip_utf8":"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26","utf16be":"f124c8be21fe8009f6391e09450c9ccd2f99a60d570187e8688750a384758e6e","utf16le":"7f1b9e73d05f3eaebac32643fee1bffc95e7919289c556b4b800f4e43df443f3","utf8_as_cp1251_then_utf8":"f195fcb1adfa9b987f5bc3ff89ba45e31b1639231b6a7b11d2084396a5567dd2","utf8_as_latin1_then_utf8":"fef2032e23fea3eb96bbf2c16704528167a5fb226597e9d9a6b8f375e2baee74"},"first_post_id":36,"forum":"\u0416\u0435\u043b\u0435\u0437\u043e \u0438 \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0438","historical_719":{"chars":754,"sha256":"e90d204f73c7ee5ad1ffb7f227f1cdd64bad69f5fa978f078b79ac89045ae287","words":84},"historical_chars_match":false,"historical_whitespace_words_match":true,"line_count":19,"matching_hash_transforms":[],"node_id":16,"raw_bytes":1166,"raw_sha256":"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26","regex_w_words":105,"reply_count":0,"sticky":0,"thread_id":36,"title":"[\u041f\u043b\u043e\u0449\u0430\u0434\u043a\u0430] \u041f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u043e\u0441\u0442\u044c home-lab \u2192 hosting/cloud","unicode_chars":760,"whitespace_words":84},{"alpha_num_words":104,"candidate_hashes":{"cp1251":"3c0834afd170b5036587ed42f144f9c7fc0ac73f20551624fd6b17b366ca7617","html_escape_utf8":"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d","json_ascii_no_quotes":"f83b7f0525738433d91811da4d39dbebcb1785e74847e0517a334e4b126a3077","json_ascii_with_quotes":"40530cf7e3fdb755cd732b3176ec1a8e5a35a613b943aad64fd34c7dcd3dafc5","json_utf8_with_quotes":"5bc1902ce7eb6a6f1b58d4f3ba40f0be79c0e326ca47de972e006a3342c2cf11","lf_strip_utf8":"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d","lf_utf8":"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d","nfc_utf8":"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d","nfd_utf8":"3357f1f364d4c47e7cd6234defcd18a3271a30ecb2b8b48eb0d64bda980a54c9","nfkc_utf8":"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d","nfkd_utf8":"3357f1f364d4c47e7cd6234defcd18a3271a30ecb2b8b48eb0d64bda980a54c9","raw_utf8":"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d","rstrip_utf8":"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d","strip_utf8":"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d","utf16be":"2c9c6877a1c67edbe9987404174be06c073ef78c9acfdebc6577932cb03146c4","utf16le":"8683e980d45c470ce4fbbbf98b799d8266af4e583d65e6ac4d5e2a05616d2735","utf8_as_latin1_then_utf8":"cd96abe35a09b7b221cf21f6afac3278ba21bc89414c0812660120edf7da4c2a"},"first_post_id":37,"forum":"\u0417\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435","historical_719":{"chars":737,"sha256":"17c2a8f3e11adff49fdd2c2184b0286796dca4dde755b06b9ee75f1ede52e3c1","words":85},"historical_chars_match":false,"historical_whitespace_words_match":true,"line_count":19,"matching_hash_transforms":[],"node_id":17,"raw_bytes":1167,"raw_sha256":"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d","regex_w_words":104,"reply_count":0,"sticky":0,"thread_id":37,"title":"[\u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u0440\u043e\u0441\u0430] \u0410\u0443\u0434\u0438\u0442 backup \u0437\u0430 \u043e\u0434\u0438\u043d \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0434\u0435\u043d\u044c","unicode_chars":743,"whitespace_words":85},{"alpha_num_words":99,"candidate_hashes":{"cp1251":"60a9aed8da02b6c567d958d80bfbabe9894b3345558a1a0f0ac8c8ad8c338cb2","html_escape_utf8":"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55","json_ascii_no_quotes":"4949d4b9bed3b145b0db8b13c197d15c719f0d9d7593dddd31822f8a92f50ef3","json_ascii_with_quotes":"47d7186333f0e98422d85c2f5cd0e20cc6e06a1a59ddde70cad79fd80b7e8f5a","json_utf8_with_quotes":"f0f402605737920bd4be0901f1000ad0f40245fbdbb9689983b6704c37bf9a21","lf_strip_utf8":"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55","lf_utf8":"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55","nfc_utf8":"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55","nfd_utf8":"ba7f72e513c3dcaf1fcea5438187ff06d3f1cc63981149f6607486e096da7309","nfkc_utf8":"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55","nfkd_utf8":"ba7f72e513c3dcaf1fcea5438187ff06d3f1cc63981149f6607486e096da7309","raw_utf8":"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55","rstrip_utf8":"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55","strip_utf8":"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55","utf16be":"f3621a73fb4c06b33cb74f0f1f574ede8aaf3870f51018c00c382b2b5ee45ea8","utf16le":"43f9fde40d974604b8e6eed59270fc876ea178663a5f0dc22a287dfdc275ec98","utf8_as_cp1251_then_utf8":"e80341e1d9bbb5441ba93bd5d6a5b4b31d54ecd58be0577deb0a76bcc4226e47","utf8_as_latin1_then_utf8":"0a2d9b9a5eacf3073431c49ff1d157d4b1149ba8726c808a1a0a7e8f7400d2df"},"first_post_id":38,"forum":"\u0417\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435","historical_719":{"chars":714,"sha256":"7b86c826cf409f59d38de25ad742d7c14bcfbdf567410e5087aacc3cd91b603a","words":82},"historical_chars_match":false,"historical_whitespace_words_match":true,"line_count":19,"matching_hash_transforms":[],"node_id":17,"raw_bytes":1090,"raw_sha256":"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55","regex_w_words":99,"reply_count":0,"sticky":0,"thread_id":38,"title":"[\u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u0440\u043e\u0441\u0430] Private AI \u0434\u043b\u044f 20 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432","unicode_chars":720,"whitespace_words":82},{"alpha_num_words":98,"candidate_hashes":{"cp1251":"9b91d7a785b6a058d834199c609d904b2ad2e5b89c1dc3cd8e69359824208f62","html_escape_utf8":"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82","json_ascii_no_quotes":"63be89f8a369df917685c6c9d5ca09950998d64ab7e5cdd856c8837e95418b1e","json_ascii_with_quotes":"7227207363ab89e29da7d98753756920a273fb58bb26fa6df9e875a21caacdb0","json_utf8_with_quotes":"5efb2900be1ac8becab0ce0af0399f33b779e213d9a35c823e1a581ef4c6f136","lf_strip_utf8":"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82","lf_utf8":"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82","nfc_utf8":"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82","nfd_utf8":"c53137df64a98adb36bfaacedb43bc9f13516cc486d028e4abb6ae0e418fc595","nfkc_utf8":"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82","nfkd_utf8":"c53137df64a98adb36bfaacedb43bc9f13516cc486d028e4abb6ae0e418fc595","raw_utf8":"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82","rstrip_utf8":"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82","strip_utf8":"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82","utf16be":"becf36e549c4393c2c414f720d5b54114d8912a3458423ec54c1bb1b7c9f7685","utf16le":"60e00b06b8c0422d2faee49091830a8aeb478a78c0a1df826fc194235e61065d","utf8_as_cp1251_then_utf8":"5a14a388f3293c86e3c6814f006b9faee53cb3769e288f0bd12f503815ea1dc6","utf8_as_latin1_then_utf8":"0564ad394b1e4cb227020e705e7d28802dafb5c240610fb3dbf5203f7f88e066"},"first_post_id":39,"forum":"\u042d\u043a\u0441\u043f\u0435\u0440\u0442\u044b PVEPro","historical_719":{"chars":690,"sha256":"f9fe92236122229693a8fe5f10b7c0810079c4bb74ed7f82a44182e7faa64036","words":78},"historical_chars_match":false,"historical_whitespace_words_match":true,"line_count":19,"matching_hash_transforms":[],"node_id":18,"raw_bytes":1083,"raw_sha256":"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82","regex_w_words":98,"reply_count":0,"sticky":0,"thread_id":39,"title":"[\u042d\u043a\u0441\u043f\u0435\u0440\u0442] \u041a\u0430\u043a \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u0435\u0442\u0435\u043d\u0446\u0438\u0438 \u0431\u0435\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043b\u043e\u0433\u043e\u0442\u0438\u043f\u043e\u0432","unicode_chars":696,"whitespace_words":78}],"uniform_hash_transforms":[]} +PRODUCT_CHECKPOINTS_REMAINING=8 +CHECKPOINTS13_14_REMAIN_OPEN=true +TASK_RESULT=HOLD_PVEPRO896_BATCH_C_PROVENANCE_UNRESOLVED +DECISION=HOLD_PVEPRO896_BATCH_C_PROVENANCE_UNRESOLVED +NEXT_GATE=RECONCILE_ONLY_PVEPRO_BATCH_C_PROVENANCE +CHANGES_MADE_BY_896=false +PRODUCT_MUTATION_BY_896=false +VM_MUTATION_BY_896=false +HOMELAB_RESULT_CONTRACT={"changes_made":false,"command_id":"SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-HASH-NORMALIZATION-READONLY-896R1","rollback_restored":null,"rollback_started":false,"status":"OK","version":1} +PVEPRO896_END=true + +OUTPUT_END +CHAT_OUTPUT_END diff --git a/runtime/latest.json b/runtime/latest.json index a3628369..53b4e6da 100644 --- a/runtime/latest.json +++ b/runtime/latest.json @@ -1,19 +1,19 @@ { "schema_version": 1, "channel": "homelab-runtime", - "command_id": "SUPPORT-260921-HOMELAB-BACKUP-NODEWORKER-CONTRACT-RCA-READONLY-1104R1", + "command_id": "SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-HASH-NORMALIZATION-READONLY-896R1", "status": "OK", "rc": 0, "host": "pve01", "mode": "read-only", - "component": "homelab-backup-nodeworker-contract-rca", - "started_at_utc": "2026-09-21T21:06:14Z", - "finished_at_utc": "2026-09-21T21:06:14Z", + "component": "pvepro-editorial-batch-c-hash-normalization", + "started_at_utc": "2026-09-21T21:11:07Z", + "finished_at_utc": "2026-09-21T21:11:08Z", "reference_register_checked": true, "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", "error_register_checked": true, "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", - "command_sha256": "476f69ce1ba9062cf703c5b1de5f81404fc50b1b31240c36e2e6ecdcd7aebecc", + "command_sha256": "65b425495d49350f446ea7e2e86d1840cc62438777e4b2979c521634758aa83c", "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": "6889fdc8e9ed9a2a2d17d6033311e611ad2a4fc46893776f10806c0b194ff052", - "sanitized_output_sha256": "6889fdc8e9ed9a2a2d17d6033311e611ad2a4fc46893776f10806c0b194ff052", + "raw_evidence_sha256": "3c6a592971e6b3b3ef6ec5e50292c1fc503986deab1efc292079764c9f695094", + "sanitized_output_sha256": "3c6a592971e6b3b3ef6ec5e50292c1fc503986deab1efc292079764c9f695094", "output_truncated_in_json": false, "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", - "output": "WORKERS2_NODEWORKER_CONTRACT_RCA_BEGIN=1\nCOMMAND_ID=SUPPORT-260921-HOMELAB-BACKUP-NODEWORKER-CONTRACT-RCA-READONLY-1104R1\nMODE=read-only\nCOMPONENT=homelab-backup-nodeworker-contract-rca\nMUTATION_BOUNDARY=READ_ONLY_NO_EXECUTION_OF_BACKUP_WORKERS_NO_SERVICE_START_NO_TIMER_CHANGE_NO_LOCK_BREAK_NO_GIT_WRITE\nWRAPPER_INFO={\"logic\":[{\"line\":4,\"text\":\"ACCEPTED=pathlib.Path('/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b')\"},{\"line\":5,\"text\":\"EXPECTED={'fresh_lxc_helper.py': 'dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011', 'producer_exec_helper.py': 'b3b97099bcd7126670f866e81faae6a42a96d869d9989e6a67f6ea6c871c90b3', 'lxc_adapter.py': '3fa7d194010d76f7c8bc95035ae8876262e9337903e310f45f45df88c266dc8d', 'qemu_adapter.py': '1906db42bd34bbe85eb46fd9797b3572d46e0a41c29d1c29be5f9df5e448f15b', 'scheduler_adapter.py': 'a6f67159a64067773323f028126e3109e15cf17a8142cea5e6129970f1d4da96', 'entry504.py': 'ca6876fa9c3b1465b045344a8ad46962de16972c7dadc4ac6257c7d225047793'}\"}],\"path\":\"/usr/local/sbin/homelab-backup-v2\",\"sha256\":\"5077444065c732451cb84898680f62361b21a24ef9eb4f191253e82ead524ea2\",\"size\":1656}\nHASH_MATCHED_HELPERS={\"entry504.py\":[{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"sha256\":\"ca6876fa9c3b1465b045344a8ad46962de16972c7dadc4ac6257c7d225047793\",\"size\":10566},{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"sha256\":\"ca6876fa9c3b1465b045344a8ad46962de16972c7dadc4ac6257c7d225047793\",\"size\":10566}],\"fresh_lxc_helper.py\":[{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-500r1-a3964599e60c/fresh_lxc_helper.py\",\"sha256\":\"dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011\",\"size\":2320},{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/fresh_lxc_helper.py\",\"sha256\":\"dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011\",\"size\":2320},{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/fresh_lxc_helper.py\",\"sha256\":\"dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011\",\"size\":2320},{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-501r1-e55e5c8c446a/fresh_lxc_helper.py\",\"sha256\":\"dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011\",\"size\":2320},{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/fresh_lxc_helper.py\",\"sha256\":\"dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011\",\"size\":2320},{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-500r1-a3964599e60c/fresh_lxc_helper.py\",\"sha256\":\"dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011\",\"size\":2320},{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/fresh_lxc_helper.py\",\"sha256\":\"dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011\",\"size\":2320},{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/fresh_lxc_helper.py\",\"sha256\":\"dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011\",\"size\":2320},{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-501r1-e55e5c8c446a/fresh_lxc_helper.py\",\"sha256\":\"dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011\",\"size\":2320},{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/fresh_lxc_helper.py\",\"sha256\":\"dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011\",\"size\":2320}],\"lxc_adapter.py\":[{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py\",\"sha256\":\"3fa7d194010d76f7c8bc95035ae8876262e9337903e310f45f45df88c266dc8d\",\"size\":13825},{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/lxc_adapter.py\",\"sha256\":\"3fa7d194010d76f7c8bc95035ae8876262e9337903e310f45f45df88c266dc8d\",\"size\":13825},{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/lxc_adapter.py\",\"sha256\":\"3fa7d194010d76f7c8bc95035ae8876262e9337903e310f45f45df88c266dc8d\",\"size\":13825},{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py\",\"sha256\":\"3fa7d194010d76f7c8bc95035ae8876262e9337903e310f45f45df88c266dc8d\",\"size\":13825},{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/lxc_adapter.py\",\"sha256\":\"3fa7d194010d76f7c8bc95035ae8876262e9337903e310f45f45df88c266dc8d\",\"size\":13825},{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/lxc_adapter.py\",\"sha256\":\"3fa7d194010d76f7c8bc95035ae8876262e9337903e310f45f45df88c266dc8d\",\"size\":13825}],\"producer_exec_helper.py\":[{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/producer_exec_helper.py\",\"sha256\":\"b3b97099bcd7126670f866e81faae6a42a96d869d9989e6a67f6ea6c871c90b3\",\"size\":3449},{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/producer_exec_helper.py\",\"sha256\":\"b3b97099bcd7126670f866e81faae6a42a96d869d9989e6a67f6ea6c871c90b3\",\"size\":3449},{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/producer_exec_helper.py\",\"sha256\":\"b3b97099bcd7126670f866e81faae6a42a96d869d9989e6a67f6ea6c871c90b3\",\"size\":3449},{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/producer_exec_helper.py\",\"sha256\":\"b3b97099bcd7126670f866e81faae6a42a96d869d9989e6a67f6ea6c871c90b3\",\"size\":3449},{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/producer_exec_helper.py\",\"sha256\":\"b3b97099bcd7126670f866e81faae6a42a96d869d9989e6a67f6ea6c871c90b3\",\"size\":3449},{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/producer_exec_helper.py\",\"sha256\":\"b3b97099bcd7126670f866e81faae6a42a96d869d9989e6a67f6ea6c871c90b3\",\"size\":3449}],\"qemu_adapter.py\":[{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"sha256\":\"1906db42bd34bbe85eb46fd9797b3572d46e0a41c29d1c29be5f9df5e448f15b\",\"size\":4627},{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"sha256\":\"1906db42bd34bbe85eb46fd9797b3572d46e0a41c29d1c29be5f9df5e448f15b\",\"size\":4627},{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"sha256\":\"1906db42bd34bbe85eb46fd9797b3572d46e0a41c29d1c29be5f9df5e448f15b\",\"size\":4627},{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"sha256\":\"1906db42bd34bbe85eb46fd9797b3572d46e0a41c29d1c29be5f9df5e448f15b\",\"size\":4627}],\"scheduler_adapter.py\":[{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"sha256\":\"a6f67159a64067773323f028126e3109e15cf17a8142cea5e6129970f1d4da96\",\"size\":4097},{\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"sha256\":\"a6f67159a64067773323f028126e3109e15cf17a8142cea5e6129970f1d4da96\",\"size\":4097}]}\nHELPER_LOGIC_HITS={\"entry504.py\":[{\"line\":4,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"BASE=pathlib.Path('/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1')\"},{\"line\":43,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"def _wire(wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,base=BASE):\"},{\"line\":62,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"required=('capture_pve_guest','backup_target','load_targets','cluster_inventory','ssh_remote',\"},{\"line\":64,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"'choose_due_target','write_state','epoch')\"},{\"line\":78,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"scheduler_wired=scheduler_adapter.bind(proxy,g['choose_due_target'],g['write_state'])\"},{\"line\":79,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if g.get('choose_due_target') is not scheduler_wired['choose_due_target'] or g.get('write_state') is not scheduler_wired['write_state']:\"},{\"line\":80,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"raise RuntimeError('SCHEDULER_ADAPTER_BIND_RESULT')\"},{\"line\":81,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"return {'legacy_globals':g,'legacy':proxy,'original_capture':original,'qemu_patched_capture':qemu_patched,'patched_capture':patched,'scheduler_wired':scheduler_wired}\"},{\"line\":88,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"# Baseline accepted wrapper selftest stays the compatibility gate; no full old legacy selftest is reintroduced.\"},{\"line\":89,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"wrapper.selftest()\"},{\"line\":93,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"scheduler_adapter=importlib.import_module('scheduler_adapter')\"},{\"line\":96,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"wired=_wire(wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,BASE)\"},{\"line\":97,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"return wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,wired\"},{\"line\":99,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"def _target(wrapper,lid):\"},{\"line\":100,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"rows=wrapper.load_targets(); hits=[x for x in rows if x.get('logical_id')==lid]\"},{\"line\":101,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if len(hits)!=1: raise RuntimeError('TARGET_CARDINALITY')\"},{\"line\":104,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"def selftest():\"},{\"line\":105,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,wired=_load()\"},{\"line\":108,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if wired['legacy_globals'].get('choose_due_target') is not wired['scheduler_wired']['choose_due_target']:\"},{\"line\":109,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"raise RuntimeError('SCHEDULER_CHOOSE_BINDING')\"},{\"line\":110,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if wired['legacy_globals'].get('write_state') is not wired['scheduler_wired']['write_state']:\"},{\"line\":111,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"raise RuntimeError('SCHEDULER_WRITE_BINDING')\"},{\"line\":112,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if [scheduler_adapter.backoff_seconds(n) for n in range(1,7)]!=[1800,3600,7200,14400,21600,21600]:\"},{\"line\":113,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"raise RuntimeError('SCHEDULER_BACKOFF_CONTRACT')\"},{\"line\":114,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if not callable(wrapper.backup_target) or not callable(wrapper.main) or not callable(wrapper.load_targets):\"},{\"line\":116,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"print('SELFTEST_OVERLAY504=PASS',flush=True)\"},{\"line\":120,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"argv=list(sys.argv[1:] if argv is None else argv)\"},{\"line\":121,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if argv==['selftest']:\"},{\"line\":122,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"return selftest()\"},{\"line\":123,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,wired=_load()\"},{\"line\":125,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if argv==['scheduler-proof']:\"},{\"line\":129,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if old_root is None or not callable(old_epoch): raise RuntimeError('SCHEDULER_PROOF_BASE')\"},{\"line\":132,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"with tempfile.TemporaryDirectory(prefix='homelab-scheduler-proof-',dir='/run') as td:\"},{\"line\":141,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"targets=[{'logical_id':'proof-a','enabled':True,'due_seconds':100},{'logical_id':'proof-b','enabled':True,'due_seconds':100}]\"},{\"line\":142,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"first=legacy.choose_due_target(targets,state,now[0])\"},{\"line\":143,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if not isinstance(first,dict) or first.get('logical_id')!='proof-b': raise RuntimeError('SCHEDULER_PROOF_PEER_NOT_SELECTED')\"},{\"line\":146,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"raise RuntimeError('SCHEDULER_PROOF_FAILURE_STATE')\"},{\"line\":148,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"second=legacy.choose_due_target(targets,legacy.load_state_all(),now[0])\"},{\"line\":149,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if not isinstance(second,dict) or second.get('logical_id')!='proof-a': raise RuntimeError('SCHEDULER_PROOF_RETRY_NOT_REELIGIBLE')\"},{\"line\":153,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"raise RuntimeError('SCHEDULER_PROOF_SUCCESS_RESET')\"},{\"line\":154,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"proof={'failed_target':'proof-a','peer_selected_during_backoff':first['logical_id'],'retry_after_epoch':retry,'last_success_preserved':preserved==1000,'retry_target_after_backoff':second['logical_id'],'success_resets_failures':True,'production_state_root_used':False}\"},{\"line\":155,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"print('SCHEDULER_FAILURE_ISOLATION_PROOF='+json.dumps(proof,separators=(',',':'),sort_keys=True),flush=True)\"},{\"line\":159,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if argv==['scheduler-select-live']:\"},{\"line\":160,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"state=legacy.load_state_all(); targets=wrapper.load_targets()\"},{\"line\":161,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"chosen=legacy.choose_due_target(targets,state)\"},{\"line\":163,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"print('SCHEDULER_LIVE_SELECTION=DEFER_NO_DUE_TARGET',flush=True)\"},{\"line\":165,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"print('SCHEDULER_LIVE_SELECTION='+json.dumps({'logical_id':chosen.get('logical_id'),'due_seconds':chosen.get('due_seconds'),'enabled':chosen.get('enabled') is True},separators=(',',':'),sort_keys=True),flush=True)\"},{\"line\":167,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if len(argv)==2 and argv[0]=='plan-lxc':\"},{\"line\":168,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"t=_target(wrapper,argv[1])\"},{\"line\":169,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if t.get('guest_type')!='lxc' or t.get('logical_id')=='guest-pve01-lxc-112':\"},{\"line\":170,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"raise RuntimeError('PLAN_TARGET_NOT_LEGACY_LXC')\"},{\"line\":172,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"print('PLAN_LXC_RESULT='+json.dumps({'logical_id':t['logical_id'],'vmid':int(t['vmid']),'node':out['job']['node'],'job':out['job']},separators=(',',':'),sort_keys=True),flush=True)\"},{\"line\":174,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if len(argv)==2 and argv[0]=='verify-target':\"},{\"line\":175,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"t=_target(wrapper,argv[1])\"},{\"line\":176,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if t.get('logical_id')=='guest-pve01-lxc-112':\"},{\"line\":179,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"out=wrapper.backup_target(t,True)\"},{\"line\":180,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"except legacy.BackupError as e:\"},{\"line\":181,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"print('VERIFY_TARGET_RESULT=FAIL',flush=True)\"},{\"line\":182,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"print('VERIFY_TARGET_REASON='+str(e.code),flush=True)\"},{\"line\":184,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"print('VERIFY_TARGET_RESULT='+json.dumps(out,separators=(',',':'),sort_keys=True),flush=True)\"},{\"line\":186,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"return wrapper.main([sys.argv[0],*argv])\"},{\"line\":4,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"BASE=pathlib.Path('/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1')\"},{\"line\":43,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"def _wire(wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,base=BASE):\"},{\"line\":62,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"required=('capture_pve_guest','backup_target','load_targets','cluster_inventory','ssh_remote',\"},{\"line\":64,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"'choose_due_target','write_state','epoch')\"},{\"line\":78,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"scheduler_wired=scheduler_adapter.bind(proxy,g['choose_due_target'],g['write_state'])\"},{\"line\":79,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if g.get('choose_due_target') is not scheduler_wired['choose_due_target'] or g.get('write_state') is not scheduler_wired['write_state']:\"},{\"line\":80,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"raise RuntimeError('SCHEDULER_ADAPTER_BIND_RESULT')\"},{\"line\":81,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"return {'legacy_globals':g,'legacy':proxy,'original_capture':original,'qemu_patched_capture':qemu_patched,'patched_capture':patched,'scheduler_wired':scheduler_wired}\"},{\"line\":88,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"# Baseline accepted wrapper selftest stays the compatibility gate; no full old legacy selftest is reintroduced.\"},{\"line\":89,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"wrapper.selftest()\"},{\"line\":93,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"scheduler_adapter=importlib.import_module('scheduler_adapter')\"},{\"line\":96,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"wired=_wire(wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,BASE)\"},{\"line\":97,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"return wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,wired\"},{\"line\":99,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"def _target(wrapper,lid):\"},{\"line\":100,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"rows=wrapper.load_targets(); hits=[x for x in rows if x.get('logical_id')==lid]\"},{\"line\":101,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if len(hits)!=1: raise RuntimeError('TARGET_CARDINALITY')\"},{\"line\":104,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"def selftest():\"},{\"line\":105,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,wired=_load()\"},{\"line\":108,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if wired['legacy_globals'].get('choose_due_target') is not wired['scheduler_wired']['choose_due_target']:\"},{\"line\":109,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"raise RuntimeError('SCHEDULER_CHOOSE_BINDING')\"},{\"line\":110,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if wired['legacy_globals'].get('write_state') is not wired['scheduler_wired']['write_state']:\"},{\"line\":111,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"raise RuntimeError('SCHEDULER_WRITE_BINDING')\"},{\"line\":112,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if [scheduler_adapter.backoff_seconds(n) for n in range(1,7)]!=[1800,3600,7200,14400,21600,21600]:\"},{\"line\":113,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"raise RuntimeError('SCHEDULER_BACKOFF_CONTRACT')\"},{\"line\":114,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if not callable(wrapper.backup_target) or not callable(wrapper.main) or not callable(wrapper.load_targets):\"},{\"line\":116,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"print('SELFTEST_OVERLAY504=PASS',flush=True)\"},{\"line\":120,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"argv=list(sys.argv[1:] if argv is None else argv)\"},{\"line\":121,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if argv==['selftest']:\"},{\"line\":122,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"return selftest()\"},{\"line\":123,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,wired=_load()\"},{\"line\":125,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if argv==['scheduler-proof']:\"},{\"line\":129,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if old_root is None or not callable(old_epoch): raise RuntimeError('SCHEDULER_PROOF_BASE')\"},{\"line\":132,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"with tempfile.TemporaryDirectory(prefix='homelab-scheduler-proof-',dir='/run') as td:\"},{\"line\":141,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"targets=[{'logical_id':'proof-a','enabled':True,'due_seconds':100},{'logical_id':'proof-b','enabled':True,'due_seconds':100}]\"},{\"line\":142,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"first=legacy.choose_due_target(targets,state,now[0])\"},{\"line\":143,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if not isinstance(first,dict) or first.get('logical_id')!='proof-b': raise RuntimeError('SCHEDULER_PROOF_PEER_NOT_SELECTED')\"},{\"line\":146,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"raise RuntimeError('SCHEDULER_PROOF_FAILURE_STATE')\"},{\"line\":148,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"second=legacy.choose_due_target(targets,legacy.load_state_all(),now[0])\"},{\"line\":149,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if not isinstance(second,dict) or second.get('logical_id')!='proof-a': raise RuntimeError('SCHEDULER_PROOF_RETRY_NOT_REELIGIBLE')\"},{\"line\":153,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"raise RuntimeError('SCHEDULER_PROOF_SUCCESS_RESET')\"},{\"line\":154,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"proof={'failed_target':'proof-a','peer_selected_during_backoff':first['logical_id'],'retry_after_epoch':retry,'last_success_preserved':preserved==1000,'retry_target_after_backoff':second['logical_id'],'success_resets_failures':True,'production_state_root_used':False}\"},{\"line\":155,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"print('SCHEDULER_FAILURE_ISOLATION_PROOF='+json.dumps(proof,separators=(',',':'),sort_keys=True),flush=True)\"},{\"line\":159,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if argv==['scheduler-select-live']:\"},{\"line\":160,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"state=legacy.load_state_all(); targets=wrapper.load_targets()\"},{\"line\":161,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"chosen=legacy.choose_due_target(targets,state)\"},{\"line\":163,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"print('SCHEDULER_LIVE_SELECTION=DEFER_NO_DUE_TARGET',flush=True)\"},{\"line\":165,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"print('SCHEDULER_LIVE_SELECTION='+json.dumps({'logical_id':chosen.get('logical_id'),'due_seconds':chosen.get('due_seconds'),'enabled':chosen.get('enabled') is True},separators=(',',':'),sort_keys=True),flush=True)\"},{\"line\":167,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if len(argv)==2 and argv[0]=='plan-lxc':\"},{\"line\":168,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"t=_target(wrapper,argv[1])\"},{\"line\":169,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if t.get('guest_type')!='lxc' or t.get('logical_id')=='guest-pve01-lxc-112':\"},{\"line\":170,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"raise RuntimeError('PLAN_TARGET_NOT_LEGACY_LXC')\"},{\"line\":172,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"print('PLAN_LXC_RESULT='+json.dumps({'logical_id':t['logical_id'],'vmid':int(t['vmid']),'node':out['job']['node'],'job':out['job']},separators=(',',':'),sort_keys=True),flush=True)\"},{\"line\":174,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if len(argv)==2 and argv[0]=='verify-target':\"},{\"line\":175,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"t=_target(wrapper,argv[1])\"},{\"line\":176,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"if t.get('logical_id')=='guest-pve01-lxc-112':\"},{\"line\":179,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"out=wrapper.backup_target(t,True)\"},{\"line\":180,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"except legacy.BackupError as e:\"},{\"line\":181,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"print('VERIFY_TARGET_RESULT=FAIL',flush=True)\"},{\"line\":182,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"print('VERIFY_TARGET_REASON='+str(e.code),flush=True)\"},{\"line\":184,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"print('VERIFY_TARGET_RESULT='+json.dumps(out,separators=(',',':'),sort_keys=True),flush=True)\"},{\"line\":186,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py\",\"text\":\"return wrapper.main([sys.argv[0],*argv])\"}],\"fresh_lxc_helper.py\":[{\"line\":4,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-500r1-a3964599e60c/fresh_lxc_helper.py\",\"text\":\"BASE_RELEASE=pathlib.Path('/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1')\"},{\"line\":15,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-500r1-a3964599e60c/fresh_lxc_helper.py\",\"text\":\"if len(sys.argv)!=1: fail('HELPER_ARGC')\"},{\"line\":26,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-500r1-a3964599e60c/fresh_lxc_helper.py\",\"text\":\"node=raw.get('node'); vmid=raw.get('vmid'); scratch=raw.get('scratch'); now=raw.get('now')\"},{\"line\":27,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-500r1-a3964599e60c/fresh_lxc_helper.py\",\"text\":\"if type(node) is not str or type(vmid) is not int or type(scratch) is not str or type(now) is not int: fail('INPUT_FIELDS')\"},{\"line\":30,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-500r1-a3964599e60c/fresh_lxc_helper.py\",\"text\":\"plan=pve265.make_plan(raw.get('rows'),configs,raw.get('storage_rows'),defaults,int(raw.get('staging_free')),now,node=node)\"},{\"line\":31,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-500r1-a3964599e60c/fresh_lxc_helper.py\",\"text\":\"jobs=[j for j in plan['jobs'] if j.get('vmid')==vmid]\"},{\"line\":35,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-500r1-a3964599e60c/fresh_lxc_helper.py\",\"text\":\"if job.get('type')!='lxc' or job.get('node')!=node: fail('JOB_IDENTITY')\"},{\"line\":37,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-500r1-a3964599e60c/fresh_lxc_helper.py\",\"text\":\"guest266.no_active_tasks(raw.get('tasks'),vmid)\"},{\"line\":39,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-500r1-a3964599e60c/fresh_lxc_helper.py\",\"text\":\"keep=('vmid','type','node','status','template','config_sha256','disks','configured_disk_bytes','configured_archive_bound_bytes','archive_cap_bytes','global_defaults_sha256','blockers','coverage_eligible')\"},{\"line\":4,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/fresh_lxc_helper.py\",\"text\":\"BASE_RELEASE=pathlib.Path('/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1')\"},{\"line\":15,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/fresh_lxc_helper.py\",\"text\":\"if len(sys.argv)!=1: fail('HELPER_ARGC')\"},{\"line\":26,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/fresh_lxc_helper.py\",\"text\":\"node=raw.get('node'); vmid=raw.get('vmid'); scratch=raw.get('scratch'); now=raw.get('now')\"},{\"line\":27,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/fresh_lxc_helper.py\",\"text\":\"if type(node) is not str or type(vmid) is not int or type(scratch) is not str or type(now) is not int: fail('INPUT_FIELDS')\"},{\"line\":30,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/fresh_lxc_helper.py\",\"text\":\"plan=pve265.make_plan(raw.get('rows'),configs,raw.get('storage_rows'),defaults,int(raw.get('staging_free')),now,node=node)\"},{\"line\":31,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/fresh_lxc_helper.py\",\"text\":\"jobs=[j for j in plan['jobs'] if j.get('vmid')==vmid]\"},{\"line\":35,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/fresh_lxc_helper.py\",\"text\":\"if job.get('type')!='lxc' or job.get('node')!=node: fail('JOB_IDENTITY')\"},{\"line\":37,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/fresh_lxc_helper.py\",\"text\":\"guest266.no_active_tasks(raw.get('tasks'),vmid)\"},{\"line\":39,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/fresh_lxc_helper.py\",\"text\":\"keep=('vmid','type','node','status','template','config_sha256','disks','configured_disk_bytes','configured_archive_bound_bytes','archive_cap_bytes','global_defaults_sha256','blockers','coverage_eligible')\"},{\"line\":4,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/fresh_lxc_helper.py\",\"text\":\"BASE_RELEASE=pathlib.Path('/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1')\"},{\"line\":15,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/fresh_lxc_helper.py\",\"text\":\"if len(sys.argv)!=1: fail('HELPER_ARGC')\"},{\"line\":26,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/fresh_lxc_helper.py\",\"text\":\"node=raw.get('node'); vmid=raw.get('vmid'); scratch=raw.get('scratch'); now=raw.get('now')\"},{\"line\":27,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/fresh_lxc_helper.py\",\"text\":\"if type(node) is not str or type(vmid) is not int or type(scratch) is not str or type(now) is not int: fail('INPUT_FIELDS')\"},{\"line\":30,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/fresh_lxc_helper.py\",\"text\":\"plan=pve265.make_plan(raw.get('rows'),configs,raw.get('storage_rows'),defaults,int(raw.get('staging_free')),now,node=node)\"},{\"line\":31,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/fresh_lxc_helper.py\",\"text\":\"jobs=[j for j in plan['jobs'] if j.get('vmid')==vmid]\"},{\"line\":35,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/fresh_lxc_helper.py\",\"text\":\"if job.get('type')!='lxc' or job.get('node')!=node: fail('JOB_IDENTITY')\"},{\"line\":37,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/fresh_lxc_helper.py\",\"text\":\"guest266.no_active_tasks(raw.get('tasks'),vmid)\"},{\"line\":39,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/fresh_lxc_helper.py\",\"text\":\"keep=('vmid','type','node','status','template','config_sha256','disks','configured_disk_bytes','configured_archive_bound_bytes','archive_cap_bytes','global_defaults_sha256','blockers','coverage_eligible')\"}],\"lxc_adapter.py\":[{\"line\":2,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py\",\"text\":\"import base64, hashlib, json, os, pathlib, re, selectors, shlex, signal, stat, subprocess, sys, time\"},{\"line\":6,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py\",\"text\":\"HELPER=pathlib.Path(__file__).resolve().parent/'fresh_lxc_helper.py'\"},{\"line\":35,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py\",\"text\":\"def _remote_sha(legacy,node,path):\"},{\"line\":36,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py\",\"text\":\"p=legacy.ssh_remote(node,['sha256sum','--',path],timeout=30)\"},{\"line\":41,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py\",\"text\":\"def _live_inputs(legacy,node,vmid,scratch):\"},{\"line\":42,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py\",\"text\":\"_need(_remote_sha(legacy,node,'/usr/bin/pvesh')==PVESH_SHA,'PVESH_IDENTITY')\"},{\"line\":43,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py\",\"text\":\"_need(_remote_sha(legacy,node,'/usr/bin/vzdump')==VZDUMP_SHA,'VZDUMP_IDENTITY')\"},{\"line\":44,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py\",\"text\":\"rows=_j(legacy.ssh_remote(node,['pvesh','get','/cluster/resources','--type','vm','--output-format','json'],timeout=60),'RESOURCES_JSON')\"},{\"line\":45,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py\",\"text\":\"stores=_j(legacy.ssh_remote(node,['pvesh','get',f'/nodes/{node}/storage','--output-format','json'],timeout=60),'STORAGE_JSON')\"},{\"line\":49,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py\",\"text\":\"if not isinstance(r,dict) or r.get('node')!=node or r.get('type') not in ('lxc','qemu'): continue\"},{\"line\":50,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py\",\"text\":\"try: rid=int(r.get('vmid'))\"},{\"line\":51,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py\",\"text\":\"except Exception: raise AdapterError('RESOURCE_VMID')\"},{\"line\":52,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py\",\"text\":\"cfg=_j(legacy.ssh_remote(node,['pvesh','get',f'/nodes/{node}/{r[\\\"type\\\"]}/{rid}/config','--output-format','json'],timeout=60),'CONFIG_JSON')\"},{\"line\":55,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py\",\"text\":\"tasks=_j(legacy.ssh_remote(node,['pvesh','get',f'/nodes/{node}/tasks','--limit','999','--output-format','json'],timeout=60),'TASKS_JSON')\"},{\"line\":57,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py\",\"text\":\"q=legacy.ssh_remote(node,['test','-f','/etc/vzdump.conf'],timeout=30,check=False)\"},{\"line\":59,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py\",\"text\":\"if q.returncode==0: defaults=legacy.ssh_remote(node,['cat','--','/etc/vzdump.conf'],timeout=30).stdout\"},{\"line\":62,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py\",\"text\":\"return {'node':node,'vmid':vmid,'scratch':scratch,'now':int(time.time()),'rows':rows,'storage_rows':stores,'configs':configs,\"},{\"line\":67,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py\",\"text\":\"_need(0int:\"},{\"line\":31,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/producer_exec_helper.py\",\"text\":\"print('PRODUCER_EXEC_HELPER_SELFTEST=PASS',flush=True)\"},{\"line\":35,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/producer_exec_helper.py\",\"text\":\"if sys.argv[1:]==['selftest']: return selftest()\"},{\"line\":36,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/producer_exec_helper.py\",\"text\":\"if sys.argv[1:]: fail('ARGC')\"},{\"line\":41,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/producer_exec_helper.py\",\"text\":\"if type(x) is not dict or set(x)!={'argv','dest','cap','seconds'}: fail('INPUT_SCHEMA')\"},{\"line\":43,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/producer_exec_helper.py\",\"text\":\"if not (type(argv) is list and argv and all(type(v) is str and '\\\\x00' not in v for v in argv)): fail('ARGV')\"},{\"line\":44,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/producer_exec_helper.py\",\"text\":\"if argv[0]!='/usr/bin/vzdump': fail('VZDUMP_PATH')\"},{\"line\":4,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/producer_exec_helper.py\",\"text\":\"BASE=pathlib.Path('/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411')\"},{\"line\":26,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/producer_exec_helper.py\",\"text\":\"def selftest()->int:\"},{\"line\":31,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/producer_exec_helper.py\",\"text\":\"print('PRODUCER_EXEC_HELPER_SELFTEST=PASS',flush=True)\"},{\"line\":35,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/producer_exec_helper.py\",\"text\":\"if sys.argv[1:]==['selftest']: return selftest()\"},{\"line\":36,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/producer_exec_helper.py\",\"text\":\"if sys.argv[1:]: fail('ARGC')\"},{\"line\":41,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/producer_exec_helper.py\",\"text\":\"if type(x) is not dict or set(x)!={'argv','dest','cap','seconds'}: fail('INPUT_SCHEMA')\"},{\"line\":43,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/producer_exec_helper.py\",\"text\":\"if not (type(argv) is list and argv and all(type(v) is str and '\\\\x00' not in v for v in argv)): fail('ARGV')\"},{\"line\":44,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/producer_exec_helper.py\",\"text\":\"if argv[0]!='/usr/bin/vzdump': fail('VZDUMP_PATH')\"},{\"line\":4,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/producer_exec_helper.py\",\"text\":\"BASE=pathlib.Path('/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411')\"},{\"line\":26,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/producer_exec_helper.py\",\"text\":\"def selftest()->int:\"},{\"line\":31,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/producer_exec_helper.py\",\"text\":\"print('PRODUCER_EXEC_HELPER_SELFTEST=PASS',flush=True)\"},{\"line\":35,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/producer_exec_helper.py\",\"text\":\"if sys.argv[1:]==['selftest']: return selftest()\"},{\"line\":36,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/producer_exec_helper.py\",\"text\":\"if sys.argv[1:]: fail('ARGC')\"},{\"line\":41,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/producer_exec_helper.py\",\"text\":\"if type(x) is not dict or set(x)!={'argv','dest','cap','seconds'}: fail('INPUT_SCHEMA')\"},{\"line\":43,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/producer_exec_helper.py\",\"text\":\"if not (type(argv) is list and argv and all(type(v) is str and '\\\\x00' not in v for v in argv)): fail('ARGV')\"},{\"line\":44,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/producer_exec_helper.py\",\"text\":\"if argv[0]!='/usr/bin/vzdump': fail('VZDUMP_PATH')\"}],\"qemu_adapter.py\":[{\"line\":11,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"def _remote_sha(legacy,node,path):\"},{\"line\":12,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"p=legacy.ssh_remote(node,['sha256sum','--',path],timeout=30)\"},{\"line\":17,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"def _select_qemu_outputs(vmid,files):\"},{\"line\":18,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"_need(type(vmid) is int and vmid>0,'QEMU_VMID')\"},{\"line\":21,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"pat=re.compile(r'^vzdump-qemu-'+re.escape(str(vmid))+r'-(\\\\d{4}_\\\\d{2}_\\\\d{2}-\\\\d{2}_\\\\d{2}_\\\\d{2})\\\\.vma\\\\.zst$')\"},{\"line\":29,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"expected_log=parent/f'vzdump-qemu-{vmid}-{stamp}.log'\"},{\"line\":43,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"vmid=int(t['vmid']); rows=[r for r in legacy.cluster_inventory() if int(r.get('vmid',-1))==vmid]\"},{\"line\":45,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"row=rows[0]; node=row.get('node'); typ=row.get('type')\"},{\"line\":47,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"_need(_remote_sha(legacy,node,'/usr/bin/vzdump')==VZDUMP_SHA,'QEMU_VZDUMP_IDENTITY_PRE')\"},{\"line\":49,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"legacy.ssh_remote(node,['install','-d','-m','700','-o','0','-g','0',srcdir],timeout=30)\"},{\"line\":51,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"vp=legacy.ssh_remote(node,['vzdump',str(vmid),'--mode','snapshot','--compress','zstd','--dumpdir',srcdir],timeout=7200,check=False)\"},{\"line\":53,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"_emit_diag(vmid=vmid,node=node,producer_rc=vp.returncode,stderr_bytes=len(vp.stderr),stderr_sha256=hashlib.sha256(vp.stderr).hexdigest(),archive_selected=False)\"},{\"line\":54,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"raise legacy.BackupError('QEMU_VZDUMP_FAILED')\"},{\"line\":55,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"_need(_remote_sha(legacy,node,'/usr/bin/vzdump')==VZDUMP_SHA,'QEMU_VZDUMP_IDENTITY_POST')\"},{\"line\":56,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"p=legacy.ssh_remote(node,['find',srcdir,'-maxdepth','1','-type','f','-printf','%p\\\\n'],timeout=30)\"},{\"line\":58,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"try: src,log=_select_qemu_outputs(vmid,files)\"},{\"line\":60,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"_emit_diag(vmid=vmid,node=node,producer_rc=0,regular_file_count=len(files),archive_selected=False,selector_error=str(e))\"},{\"line\":61,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"raise legacy.BackupError(str(e)) from None\"},{\"line\":62,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"q=legacy.ssh_remote(node,['stat','-c','%s','--',src],timeout=30)\"},{\"line\":67,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"if node=='pve01': local=pathlib.Path(src)\"},{\"line\":69,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"legacy.run([legacy.SCP,'-q','-o','BatchMode=yes','-o','StrictHostKeyChecking=yes','root@'+node+':'+src,str(local)],timeout=7200)\"},{\"line\":71,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"_emit_diag(vmid=vmid,node=node,producer_rc=0,regular_file_count=len(files),sidecar_count=1 if log else 0,archive_bytes=size,archive_selected=True)\"},{\"line\":73,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"legacy.ssh_remote(node,['rm','-rf','--',srcdir],timeout=60,check=False); raise\"},{\"line\":74,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"cleanup={'kind':'pve_source_dir','node':node,'path':srcdir}\"},{\"line\":75,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"meta={'generation':gen,'source_class':'pve_guest','vmid':vmid,'guest_type':'qemu','node':node,'status':row.get('status'),\"},{\"line\":11,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"text\":\"def _remote_sha(legacy,node,path):\"},{\"line\":12,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"text\":\"p=legacy.ssh_remote(node,['sha256sum','--',path],timeout=30)\"},{\"line\":17,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"text\":\"def _select_qemu_outputs(vmid,files):\"},{\"line\":18,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"text\":\"_need(type(vmid) is int and vmid>0,'QEMU_VMID')\"},{\"line\":21,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"text\":\"pat=re.compile(r'^vzdump-qemu-'+re.escape(str(vmid))+r'-(\\\\d{4}_\\\\d{2}_\\\\d{2}-\\\\d{2}_\\\\d{2}_\\\\d{2})\\\\.vma\\\\.zst$')\"},{\"line\":29,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"text\":\"expected_log=parent/f'vzdump-qemu-{vmid}-{stamp}.log'\"},{\"line\":43,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"text\":\"vmid=int(t['vmid']); rows=[r for r in legacy.cluster_inventory() if int(r.get('vmid',-1))==vmid]\"},{\"line\":45,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"text\":\"row=rows[0]; node=row.get('node'); typ=row.get('type')\"},{\"line\":47,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"text\":\"_need(_remote_sha(legacy,node,'/usr/bin/vzdump')==VZDUMP_SHA,'QEMU_VZDUMP_IDENTITY_PRE')\"},{\"line\":49,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"text\":\"legacy.ssh_remote(node,['install','-d','-m','700','-o','0','-g','0',srcdir],timeout=30)\"},{\"line\":51,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"text\":\"vp=legacy.ssh_remote(node,['vzdump',str(vmid),'--mode','snapshot','--compress','zstd','--dumpdir',srcdir],timeout=7200,check=False)\"},{\"line\":53,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"text\":\"_emit_diag(vmid=vmid,node=node,producer_rc=vp.returncode,stderr_bytes=len(vp.stderr),stderr_sha256=hashlib.sha256(vp.stderr).hexdigest(),archive_selected=False)\"},{\"line\":54,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"text\":\"raise legacy.BackupError('QEMU_VZDUMP_FAILED')\"},{\"line\":55,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"text\":\"_need(_remote_sha(legacy,node,'/usr/bin/vzdump')==VZDUMP_SHA,'QEMU_VZDUMP_IDENTITY_POST')\"},{\"line\":56,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"text\":\"p=legacy.ssh_remote(node,['find',srcdir,'-maxdepth','1','-type','f','-printf','%p\\\\n'],timeout=30)\"},{\"line\":58,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"text\":\"try: src,log=_select_qemu_outputs(vmid,files)\"},{\"line\":60,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"text\":\"_emit_diag(vmid=vmid,node=node,producer_rc=0,regular_file_count=len(files),archive_selected=False,selector_error=str(e))\"},{\"line\":61,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"text\":\"raise legacy.BackupError(str(e)) from None\"},{\"line\":62,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"text\":\"q=legacy.ssh_remote(node,['stat','-c','%s','--',src],timeout=30)\"},{\"line\":67,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"text\":\"if node=='pve01': local=pathlib.Path(src)\"},{\"line\":69,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"text\":\"legacy.run([legacy.SCP,'-q','-o','BatchMode=yes','-o','StrictHostKeyChecking=yes','root@'+node+':'+src,str(local)],timeout=7200)\"},{\"line\":71,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"text\":\"_emit_diag(vmid=vmid,node=node,producer_rc=0,regular_file_count=len(files),sidecar_count=1 if log else 0,archive_bytes=size,archive_selected=True)\"},{\"line\":73,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"text\":\"legacy.ssh_remote(node,['rm','-rf','--',srcdir],timeout=60,check=False); raise\"},{\"line\":74,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"text\":\"cleanup={'kind':'pve_source_dir','node':node,'path':srcdir}\"},{\"line\":75,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py\",\"text\":\"meta={'generation':gen,'source_class':'pve_guest','vmid':vmid,'guest_type':'qemu','node':node,'status':row.get('status'),\"},{\"line\":11,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"def _remote_sha(legacy,node,path):\"},{\"line\":12,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"p=legacy.ssh_remote(node,['sha256sum','--',path],timeout=30)\"},{\"line\":17,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"def _select_qemu_outputs(vmid,files):\"},{\"line\":18,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"_need(type(vmid) is int and vmid>0,'QEMU_VMID')\"},{\"line\":21,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"pat=re.compile(r'^vzdump-qemu-'+re.escape(str(vmid))+r'-(\\\\d{4}_\\\\d{2}_\\\\d{2}-\\\\d{2}_\\\\d{2}_\\\\d{2})\\\\.vma\\\\.zst$')\"},{\"line\":29,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"expected_log=parent/f'vzdump-qemu-{vmid}-{stamp}.log'\"},{\"line\":43,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"vmid=int(t['vmid']); rows=[r for r in legacy.cluster_inventory() if int(r.get('vmid',-1))==vmid]\"},{\"line\":45,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"row=rows[0]; node=row.get('node'); typ=row.get('type')\"},{\"line\":47,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"_need(_remote_sha(legacy,node,'/usr/bin/vzdump')==VZDUMP_SHA,'QEMU_VZDUMP_IDENTITY_PRE')\"},{\"line\":49,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"legacy.ssh_remote(node,['install','-d','-m','700','-o','0','-g','0',srcdir],timeout=30)\"},{\"line\":51,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"vp=legacy.ssh_remote(node,['vzdump',str(vmid),'--mode','snapshot','--compress','zstd','--dumpdir',srcdir],timeout=7200,check=False)\"},{\"line\":53,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"_emit_diag(vmid=vmid,node=node,producer_rc=vp.returncode,stderr_bytes=len(vp.stderr),stderr_sha256=hashlib.sha256(vp.stderr).hexdigest(),archive_selected=False)\"},{\"line\":54,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"raise legacy.BackupError('QEMU_VZDUMP_FAILED')\"},{\"line\":55,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"_need(_remote_sha(legacy,node,'/usr/bin/vzdump')==VZDUMP_SHA,'QEMU_VZDUMP_IDENTITY_POST')\"},{\"line\":56,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"p=legacy.ssh_remote(node,['find',srcdir,'-maxdepth','1','-type','f','-printf','%p\\\\n'],timeout=30)\"},{\"line\":58,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"try: src,log=_select_qemu_outputs(vmid,files)\"},{\"line\":60,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"_emit_diag(vmid=vmid,node=node,producer_rc=0,regular_file_count=len(files),archive_selected=False,selector_error=str(e))\"},{\"line\":61,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"raise legacy.BackupError(str(e)) from None\"},{\"line\":62,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"q=legacy.ssh_remote(node,['stat','-c','%s','--',src],timeout=30)\"},{\"line\":67,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"if node=='pve01': local=pathlib.Path(src)\"},{\"line\":69,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"legacy.run([legacy.SCP,'-q','-o','BatchMode=yes','-o','StrictHostKeyChecking=yes','root@'+node+':'+src,str(local)],timeout=7200)\"},{\"line\":71,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"_emit_diag(vmid=vmid,node=node,producer_rc=0,regular_file_count=len(files),sidecar_count=1 if log else 0,archive_bytes=size,archive_selected=True)\"},{\"line\":73,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"legacy.ssh_remote(node,['rm','-rf','--',srcdir],timeout=60,check=False); raise\"},{\"line\":74,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"cleanup={'kind':'pve_source_dir','node':node,'path':srcdir}\"},{\"line\":75,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py\",\"text\":\"meta={'generation':gen,'source_class':'pve_guest','vmid':vmid,'guest_type':'qemu','node':node,'status':row.get('status'),\"}],\"scheduler_adapter.py\":[{\"line\":7,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"class SchedulerAdapterError(RuntimeError): pass\"},{\"line\":10,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"if not ok: raise SchedulerAdapterError(code)\"},{\"line\":23,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"def _read_prior(legacy,logical_id):\"},{\"line\":25,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"p=root/(str(logical_id)+'.json')\"},{\"line\":55,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"def choose_due_target(targets,state,now=None):\"},{\"line\":57,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"_need(isinstance(targets,list) and isinstance(state,dict),'SCHEDULER_INPUT_SCHEMA')\"},{\"line\":58,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"due=[]\"},{\"line\":59,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"for order,t in enumerate(targets):\"},{\"line\":61,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"lid=t.get('logical_id'); seconds=_as_nonneg_int(t.get('due_seconds'),0)\"},{\"line\":62,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"_need(isinstance(lid,str) and lid and seconds>0,'SCHEDULER_TARGET_SCHEMA')\"},{\"line\":70,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"overdue=age-seconds\"},{\"line\":71,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"due.append((overdue,-order,t))\"},{\"line\":72,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"if not due: return None\"},{\"line\":73,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"return max(due,key=lambda x:(x[0],x[1]))[2]\"},{\"line\":75,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"def write_state(logical_id,result,**kw):\"},{\"line\":77,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"prior=_read_prior(legacy,logical_id)\"},{\"line\":81,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"return original_write(logical_id,result,**clean)\"},{\"line\":88,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"return original_write(logical_id,result,**clean)\"},{\"line\":90,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"legacy.choose_due_target=choose_due_target\"},{\"line\":92,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"return {'choose_due_target':choose_due_target,'write_state':write_state,\"},{\"line\":7,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"class SchedulerAdapterError(RuntimeError): pass\"},{\"line\":10,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"if not ok: raise SchedulerAdapterError(code)\"},{\"line\":23,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"def _read_prior(legacy,logical_id):\"},{\"line\":25,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"p=root/(str(logical_id)+'.json')\"},{\"line\":55,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"def choose_due_target(targets,state,now=None):\"},{\"line\":57,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"_need(isinstance(targets,list) and isinstance(state,dict),'SCHEDULER_INPUT_SCHEMA')\"},{\"line\":58,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"due=[]\"},{\"line\":59,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"for order,t in enumerate(targets):\"},{\"line\":61,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"lid=t.get('logical_id'); seconds=_as_nonneg_int(t.get('due_seconds'),0)\"},{\"line\":62,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"_need(isinstance(lid,str) and lid and seconds>0,'SCHEDULER_TARGET_SCHEMA')\"},{\"line\":70,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"overdue=age-seconds\"},{\"line\":71,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"due.append((overdue,-order,t))\"},{\"line\":72,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"if not due: return None\"},{\"line\":73,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"return max(due,key=lambda x:(x[0],x[1]))[2]\"},{\"line\":75,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"def write_state(logical_id,result,**kw):\"},{\"line\":77,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"prior=_read_prior(legacy,logical_id)\"},{\"line\":81,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"return original_write(logical_id,result,**clean)\"},{\"line\":88,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"return original_write(logical_id,result,**clean)\"},{\"line\":90,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"legacy.choose_due_target=choose_due_target\"},{\"line\":92,\"path\":\"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py\",\"text\":\"return {'choose_due_target':choose_due_target,'write_state':write_state,\"}]}\nNODEWORKER_INFO={\"path\":\"/usr/local/libexec/homelab-vm-cloud-quorum-node-worker\",\"sha256\":\"91bdd116be865560a38105dffbd1a66d687232035e2359e4a5be4d225e9c61d1\",\"size\":17702}\nNODEWORKER_LOGIC_HITS=[{\"line\":6,\"text\":\"STATE_ROOT=/var/lib/homelab-backup/cloud-quorum\"},{\"line\":8,\"text\":\"RESTORE_STATE_ROOT=/var/lib/homelab-backup/vm-restore-validation\"},{\"line\":9,\"text\":\"RESTORE_WORK_ROOT=/mnt/staging/homelab-vm-restore-validation\"},{\"line\":11,\"text\":\"REMOTE_A='pve01-mail-01-crypt:homelab-backups'\"},{\"line\":12,\"text\":\"REMOTE_B='pve01-mail-02-crypt:homelab-backups'\"},{\"line\":18,\"text\":\"ACTIVE_RESTORE_STAGE=\\\"\\\"\"},{\"line\":19,\"text\":\"cleanup_restore_stage(){ if [[ -n \\\"$ACTIVE_RESTORE_STAGE\\\" && \\\"$ACTIVE_RESTORE_STAGE\\\" == \\\"$RESTORE_WORK_ROOT\\\"/* && -d \\\"$ACTIVE_RESTORE_STAGE\\\" ]]; then rm -rf --one-file-system \\\"$ACTIVE_RESTORE_STAGE\\\"; fi; }\"},{\"line\":20,\"text\":\"trap cleanup_restore_stage EXIT\"},{\"line\":21,\"text\":\"active_backup_restore(){ local rc; if pgrep -af '(^|/)(vzdump|qmrestore|pctrestore|vma|zstd|rclone)([[:space:]]|$)'; then return 0; else rc=$?; [[ \\\"$rc\\\" == 1 ]] && return 0; die \\\"PGREP_FAILED_$rc\\\" 69; fi; }\"},{\"line\":24,\"text\":\"expected_owner(){\"},{\"line\":25,\"text\":\"case \\\"$1\\\" in\"},{\"line\":29,\"text\":\"*) die \\\"VMID_NOT_ALLOWED_$1\\\" 64 ;;\"},{\"line\":33,\"text\":\"case \\\"$1\\\" in\"},{\"line\":36,\"text\":\"*) die \\\"VMID_NOT_ALLOWED_$1\\\" 64 ;;\"},{\"line\":43,\"text\":\"local vmid=\\\"$1\\\" type=\\\"$2\\\"\"},{\"line\":44,\"text\":\"if [[ \\\"$type\\\" == \\\"qemu\\\" ]]; then qm status \\\"$vmid\\\" | awk '{print $2}'; else pct status \\\"$vmid\\\" | awk '{print $2}'; fi\"},{\"line\":47,\"text\":\"local vmid=\\\"$1\\\" owner type status expect_status\"},{\"line\":48,\"text\":\"owner=\\\"$(expected_owner \\\"$vmid\\\")\\\"\"},{\"line\":49,\"text\":\"type=\\\"$(expected_type \\\"$vmid\\\")\\\"\"},{\"line\":50,\"text\":\"[[ \\\"$HOST\\\" == \\\"$owner\\\" ]] || die \\\"OWNER_MISMATCH_${vmid}_${HOST}_EXPECTED_${owner}\\\" 65\"},{\"line\":52,\"text\":\"[[ -s \\\"/etc/pve/qemu-server/${vmid}.conf\\\" ]] || die \\\"QEMU_CONFIG_MISSING_$vmid\\\" 66\"},{\"line\":54,\"text\":\"[[ -s \\\"/etc/pve/lxc/${vmid}.conf\\\" ]] || die \\\"LXC_CONFIG_MISSING_$vmid\\\" 66\"},{\"line\":56,\"text\":\"status=\\\"$(current_status \\\"$vmid\\\" \\\"$type\\\")\\\"\"},{\"line\":57,\"text\":\"expect_status=\\\"$(expected_status \\\"$vmid\\\")\\\"\"},{\"line\":58,\"text\":\"[[ \\\"$status\\\" == \\\"$expect_status\\\" ]] || die \\\"STATUS_MISMATCH_${vmid}_${status}_EXPECTED_${expect_status}\\\" 66\"},{\"line\":59,\"text\":\"if [[ \\\"$vmid\\\" == \\\"160\\\" ]]; then [[ \\\"$(snapshot_count_160)\\\" == \\\"0\\\" ]] || die \\\"VM160_SNAPSHOT_COUNT_CHANGED\\\" 66; fi\"},{\"line\":60,\"text\":\"if [[ \\\"$vmid\\\" == \\\"9130\\\" ]]; then [[ \\\"$(vm_lock 9130)\\\" == \\\"none\\\" ]] || die \\\"VM9130_LOCK_PRESENT\\\" 66; fi\"},{\"line\":65,\"text\":\"local vmid=\\\"$1\\\" type=\\\"$2\\\" status expect_status\"},{\"line\":66,\"text\":\"status=\\\"$(current_status \\\"$vmid\\\" \\\"$type\\\")\\\"\"},{\"line\":67,\"text\":\"expect_status=\\\"$(expected_status \\\"$vmid\\\")\\\"\"},{\"line\":68,\"text\":\"[[ \\\"$status\\\" == \\\"$expect_status\\\" ]] || die \\\"POST_STATUS_MISMATCH_${vmid}_${status}_EXPECTED_${expect_status}\\\" 66\"},{\"line\":69,\"text\":\"if [[ \\\"$vmid\\\" == \\\"160\\\" ]]; then [[ \\\"$(snapshot_count_160)\\\" == \\\"0\\\" ]] || die \\\"VM160_SNAPSHOT_COUNT_CHANGED_POST\\\" 66; fi\"},{\"line\":70,\"text\":\"if [[ \\\"$vmid\\\" == \\\"9130\\\" ]]; then [[ \\\"$(vm_lock 9130)\\\" == \\\"none\\\" ]] || die \\\"VM9130_LOCK_PRESENT_POST\\\" 66; fi\"},{\"line\":73,\"text\":\"local vmid=\\\"$1\\\" dir=\\\"$STATE_ROOT/vm${vmid}\\\" f\"},{\"line\":79,\"text\":\"restore_dir(){ printf '%s\\\\n' \\\"$RESTORE_STATE_ROOT/vm$1\\\"; }\"},{\"line\":80,\"text\":\"restore_ok(){\"},{\"line\":81,\"text\":\"local vmid=\\\"$1\\\" gen=\\\"$2\\\" f state sha\"},{\"line\":82,\"text\":\"f=\\\"$(restore_dir \\\"$vmid\\\")/$gen.json\\\"; state=\\\"$STATE_ROOT/vm${vmid}/$gen.json\\\"\"},{\"line\":85,\"text\":\"jq -e --arg l \\\"vm${vmid}\\\" --arg g \\\"$gen\\\" --arg s \\\"$state\\\" --arg sha \\\"$sha\\\" '.schema==\\\"homelab-vm-restore-validation-v1\\\" and .logical_id==$l and .generation==$g and .transport_state==\\\"SEALED\\\" and .transport_state_file==$s and .restore_source==\\\"Cloud A\\\" and .parts_manifest_verified==true and .payload_sha256==$sha and .payload_sha256_verified==true and .payload_decompression_verified==true and .proxmox_config_extract_verified==true and .archive_recovery_readback_verified==true and .bounded_staging==true and .full_local_payload_written==false and .full_restore_proven==false and .result==\\\"OK\\\"' \\\"$f\\\" >/dev/null\"},{\"line\":88,\"text\":\"local vmid=\\\"$1\\\" gen=\\\"$2\\\" state=\\\"$3\\\" work=\\\"$4\\\" base manifest expected_msha got_msha expected_count expected_size idx name size psha count total\"},{\"line\":90,\"text\":\"[[ \\\"$base\\\" == \\\"${REMOTE_A%/}/vm${vmid}/$gen\\\" ]] || die \\\"RESTORE_A_BASE_MISMATCH_$vmid\\\" 70\"},{\"line\":92,\"text\":\"got_msha=\\\"$(sha256sum \\\"$manifest\\\"|awk '{print $1}')\\\"; [[ \\\"$got_msha\\\" == \\\"$expected_msha\\\" ]] || die \\\"RESTORE_A_MANIFEST_SHA_MISMATCH_$vmid\\\" 70\"},{\"line\":95,\"text\":\"[[ \\\"$idx\\\" =~ ^[0-9]{8}$ && \\\"$name\\\" == part-????????.bin && \\\"$size\\\" =~ ^[1-9][0-9]*$ && \\\"$psha\\\" =~ ^[0-9a-f]{64}$ ]] || die \\\"RESTORE_A_MANIFEST_ROW_INVALID_$vmid\\\" 70\"},{\"line\":96,\"text\":\"(( size <= 536870912 )) || die \\\"RESTORE_A_PART_EXCEEDS_BOUND_$vmid\\\" 70\"},{\"line\":97,\"text\":\"[[ \\\"$idx\\\" == \\\"$(printf '%08d' \\\"$count\\\")\\\" ]] || die \\\"RESTORE_A_MANIFEST_INDEX_INVALID_$vmid\\\" 70\"},{\"line\":100,\"text\":\"[[ \\\"$count\\\" == \\\"$expected_count\\\" ]] || die \\\"RESTORE_A_PART_COUNT_MISMATCH_$vmid\\\" 70\"},{\"line\":101,\"text\":\"[[ \\\"$total\\\" == \\\"$expected_size\\\" ]] || die \\\"RESTORE_A_MANIFEST_TOTAL_SIZE_MISMATCH_$vmid\\\" 70\"},{\"line\":105,\"text\":\"local vmid=\\\"$1\\\" base=\\\"$2\\\" manifest=\\\"$3\\\" work=\\\"$4\\\" idx name size psha part actual count\"},{\"line\":109,\"text\":\"[[ -s \\\"$part\\\" && ! -L \\\"$part\\\" && \\\"$(stat -c %s \\\"$part\\\")\\\" == \\\"$size\\\" ]] || die \\\"RESTORE_A_PART_SIZE_MISMATCH_$vmid\\\" 70\"},{\"line\":110,\"text\":\"actual=\\\"$(sha256sum \\\"$part\\\"|awk '{print $1}')\\\"; [[ \\\"$actual\\\" == \\\"$psha\\\" ]] || die \\\"RESTORE_A_PART_SHA_MISMATCH_$vmid\\\" 70\"},{\"line\":114,\"text\":\"restore_validate(){\"},{\"line\":115,\"text\":\"local vmid=\\\"$1\\\" gen=\\\"$2\\\" logical state work payload_name expected_sha expected_size base manifest fifo sha_out sha_pid pipe_rc sha_rc actual_sha config config_sha members member_count cfg_member level out tmp\"},{\"line\":116,\"text\":\"assert_local_identity \\\"$vmid\\\"; logical=\\\"vm${vmid}\\\"; state=\\\"$STATE_ROOT/$logical/$gen.json\\\"\"},{\"line\":117,\"text\":\"[[ -s \\\"$state\\\" && ! -L \\\"$state\\\" ]] || die \\\"RESTORE_STATE_MISSING_$vmid\\\" 65\"},{\"line\":118,\"text\":\"jq -e '.schema==\\\"homelab-cloud-quorum-payload-v1\\\" and .status==\\\"SEALED\\\" and .cloud_quorum==2 and .cloud_a_verified==true and .cloud_b_verified==true and .part_hashes_verified==true and .seal_written==true and .cloud_a_seal_verified==true and .cloud_b_seal_verified==true and .local_payload_present==false and .local_cleanup==\\\"OK\\\"' \\\"$state\\\" >/dev/null || die \\\"RESTORE_REQUIRES_STRICT_SEALED_$vmid\\\" 65\"},{\"line\":119,\"text\":\"if restore_ok \\\"$vmid\\\" \\\"$gen\\\"; then printf 'RESTORE_VALIDATION_STATUS=OK\\\\nVMID=%s\\\\nGENERATION=%s\\\\nRESULT=ALREADY_VALIDATED\\\\nRESTORE_EVIDENCE=%s\\\\n' \\\"$vmid\\\" \\\"$gen\\\" \\\"$(restore_dir \\\"$vmid\\\")/$gen.json\\\"; return 0; fi\"},{\"line\":120,\"text\":\"[[ -z \\\"$(active_backup_restore)\\\" ]] || die ACTIVE_BACKUP_RESTORE_PRESENT 75\"},{\"line\":122,\"text\":\"[[ \\\"$payload_name\\\" == \\\"vzdump-lxc-${vmid}-\\\"*.tar.zst || \\\"$payload_name\\\" == \\\"vzdump-qemu-${vmid}-\\\"*.vma.zst ]] || die \\\"RESTORE_PAYLOAD_NAME_INVALID_$vmid\\\" 70\"},{\"line\":123,\"text\":\"work=\\\"$RESTORE_WORK_ROOT/$logical/$gen\\\"; if [[ -e \\\"$work\\\" ]]; then [[ -d \\\"$work\\\" && ! -L \\\"$work\\\" ]] || die \\\"RESTORE_WORK_UNSAFE_$vmid\\\" 70; rm -rf --one-file-system \\\"$work\\\"; fi; mkdir -p \\\"$work\\\"; chmod 0700 \\\"$RESTORE_WORK_ROOT\\\" \\\"$RESTORE_WORK_ROOT/$logical\\\" \\\"$work\\\"; ACTIVE_RESTORE_STAGE=\\\"$work\\\"\"},{\"line\":124,\"text\":\"base=\\\"$(prepare_cloud_a_manifest \\\"$vmid\\\" \\\"$gen\\\" \\\"$state\\\" \\\"$work\\\")\\\"; manifest=\\\"$work/PARTS.tsv\\\"; fifo=\\\"$work/archive.sha.fifo\\\"; sha_out=\\\"$work/archive.sha256\\\"; mkfifo -m 0600 \\\"$fifo\\\"\"},{\"line\":127,\"text\":\"members=\\\"$work/members.txt\\\"; if stream_cloud_a \\\"$vmid\\\" \\\"$base\\\" \\\"$manifest\\\" \\\"$work\\\" | tee \\\"$fifo\\\" | zstd -dc | tar -tf - >\\\"$members\\\"; then pipe_rc=0; else pipe_rc=$?; fi\"},{\"line\":129,\"text\":\"if stream_cloud_a \\\"$vmid\\\" \\\"$base\\\" \\\"$manifest\\\" \\\"$work\\\" | tee \\\"$fifo\\\" | zstd -t - >/dev/null; then pipe_rc=0; else pipe_rc=$?; fi\"},{\"line\":132,\"text\":\"(( pipe_rc == 0 && sha_rc == 0 )) || die \\\"RESTORE_A_STREAM_VALIDATION_FAILED_${vmid}_${pipe_rc}_${sha_rc}\\\" 70\"},{\"line\":133,\"text\":\"actual_sha=\\\"$(awk 'NR==1{print $1}' \\\"$sha_out\\\")\\\"; [[ \\\"$actual_sha\\\" == \\\"$expected_sha\\\" ]] || die \\\"RESTORE_A_PAYLOAD_SHA_MISMATCH_$vmid\\\" 70\"},{\"line\":136,\"text\":\"[[ -s \\\"$members\\\" ]] || die \\\"RESTORE_LXC_ARCHIVE_EMPTY_$vmid\\\" 70\"},{\"line\":137,\"text\":\"awk '$0 ~ /^\\\\// || $0 ~ /(^|\\\\/)\\\\.\\\\.(\\\\/|$)/ {bad=1} END{exit bad}' \\\"$members\\\" || die \\\"RESTORE_LXC_MEMBER_UNSAFE_$vmid\\\" 70\"},{\"line\":138,\"text\":\"member_count=\\\"$(wc -l <\\\"$members\\\")\\\"; [[ \\\"$member_count\\\" =~ ^[1-9][0-9]*$ ]] || die \\\"RESTORE_LXC_MEMBER_COUNT_INVALID_$vmid\\\" 70\"},{\"line\":139,\"text\":\"cfg_member=\\\"$(awk '$0==\\\"./etc/vzdump/pct.conf\\\" || $0==\\\"etc/vzdump/pct.conf\\\" {print; exit}' \\\"$members\\\")\\\"; [[ -n \\\"$cfg_member\\\" ]] || die \\\"RESTORE_LXC_CONFIG_MEMBER_MISSING_$vmid\\\" 70\"},{\"line\":140,\"text\":\"if ( set +o pipefail; stream_cloud_a \\\"$vmid\\\" \\\"$base\\\" \\\"$manifest\\\" \\\"$work\\\" | zstd -dc | tar -xOf - \\\"$cfg_member\\\" >\\\"$config\\\" ); then :; else die \\\"RESTORE_LXC_CONFIG_EXTRACT_FAILED_$vmid\\\" 70; fi\"},{\"line\":143,\"text\":\"if ( set +o pipefail; stream_cloud_a \\\"$vmid\\\" \\\"$base\\\" \\\"$manifest\\\" \\\"$work\\\" | zstd -dc | vma config - >\\\"$config\\\" ); then :; else die \\\"RESTORE_QEMU_CONFIG_EXTRACT_FAILED_$vmid\\\" 70; fi\"},{\"line\":146,\"text\":\"[[ -s \\\"$config\\\" && ! -L \\\"$config\\\" ]] || die \\\"RESTORE_CONFIG_EMPTY_$vmid\\\" 70; config_sha=\\\"$(sha256sum \\\"$config\\\"|awk '{print $1}')\\\"\"},{\"line\":147,\"text\":\"out=\\\"$(restore_dir \\\"$vmid\\\")/$gen.json\\\"; mkdir -p \\\"$(dirname \\\"$out\\\")\\\"; chmod 0700 \\\"$RESTORE_STATE_ROOT\\\" \\\"$(dirname \\\"$out\\\")\\\"; tmp=\\\"${out}.new.$$\\\"\"},{\"line\":148,\"text\":\"jq -n --arg logical \\\"$logical\\\" --arg generation \\\"$gen\\\" --argjson vmid \\\"$vmid\\\" --arg vm_type \\\"$VM_TYPE\\\" --arg state \\\"$state\\\" --arg sha \\\"$expected_sha\\\" --arg config_sha \\\"$config_sha\\\" --arg level \\\"$level\\\" --argjson member_count \\\"$member_count\\\" --arg at \\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\\" '{schema:\\\"homelab-vm-restore-validation-v1\\\",logical_id:$logical,generation:$generation,vmid:$vmid,vm_type:$vm_type,transport_state:\\\"SEALED\\\",transport_state_file:$state,restore_source:\\\"Cloud A\\\",parts_manifest_verified:true,payload_sha256:$sha,payload_sha256_verified:true,payload_decompression_verified:true,proxmox_config_extract_verified:true,proxmox_config_sha256:$config_sha,lxc_member_count:$member_count,archive_recovery_readback_verified:true,bounded_staging:true,max_staged_part_bytes:536870912,full_local_payload_written:false,full_restore_proven:false,validation_level:$level,result:\\\"OK\\\",validated_at_utc:$at}' >\\\"$tmp\\\"\"},{\"line\":149,\"text\":\"chmod 0600 \\\"$tmp\\\"; mv -f -- \\\"$tmp\\\" \\\"$out\\\"; rm -rf --one-file-system \\\"$work\\\"; ACTIVE_RESTORE_STAGE=\\\"\\\"\"},{\"line\":150,\"text\":\"restore_ok \\\"$vmid\\\" \\\"$gen\\\" || die \\\"RESTORE_EVIDENCE_POSTWRITE_INVALID_$vmid\\\" 70\"},{\"line\":151,\"text\":\"printf 'RESTORE_VALIDATION_STATUS=OK\\\\nVMID=%s\\\\nGENERATION=%s\\\\nRESTORE_EVIDENCE=%s\\\\n' \\\"$vmid\\\" \\\"$gen\\\" \\\"$out\\\"\"},{\"line\":154,\"text\":\"local vmid=\\\"$1\\\" owner type status\"},{\"line\":155,\"text\":\"assert_local_identity \\\"$vmid\\\"\"},{\"line\":156,\"text\":\"owner=\\\"$(expected_owner \\\"$vmid\\\")\\\"\"},{\"line\":157,\"text\":\"type=\\\"$(expected_type \\\"$vmid\\\")\\\"\"},{\"line\":158,\"text\":\"status=\\\"$(expected_status \\\"$vmid\\\")\\\"\"},{\"line\":159,\"text\":\"printf 'PLAN_STATUS=OK\\\\nVMID=%s\\\\nOWNER=%s\\\\nTYPE=%s\\\\nEXPECTED_STATUS=%s\\\\n' \\\"$vmid\\\" \\\"$owner\\\" \\\"$type\\\" \\\"$status\\\"\"},{\"line\":162,\"text\":\"local vmid=\\\"$1\\\" generation=\\\"$2\\\"\"},{\"line\":163,\"text\":\"assert_local_identity \\\"$vmid\\\"\"},{\"line\":164,\"text\":\"restore_validate \\\"$vmid\\\" \\\"$generation\\\"\"},{\"line\":165,\"text\":\"assert_post_identity \\\"$vmid\\\" \\\"$VM_TYPE\\\"\"},{\"line\":166,\"text\":\"printf 'VERIFY_STATUS=OK\\\\nVMID=%s\\\\nGENERATION=%s\\\\nRESTORE_EVIDENCE=%s\\\\n' \\\"$vmid\\\" \\\"$generation\\\" \\\"$(restore_dir \\\"$vmid\\\")/$generation.json\\\"\"},{\"line\":168,\"text\":\"backup_one(){\"},{\"line\":169,\"text\":\"local vmid=\\\"$1\\\" pending_count pending state generation payload gen_dir archive_count archive log_file before_status\"},{\"line\":171,\"text\":\"assert_local_identity \\\"$vmid\\\"\"},{\"line\":176,\"text\":\"[[ -z \\\"$(active_backup_restore)\\\" ]] || die \\\"ACTIVE_BACKUP_RESTORE_PRESENT\\\" 75\"},{\"line\":179,\"text\":\"mapfile -t pending < <(latest_incomplete_state \\\"$vmid\\\")\"},{\"line\":181,\"text\":\"(( pending_count <= 1 )) || die \\\"MULTIPLE_INCOMPLETE_GENERATIONS_$vmid\\\" 65\"},{\"line\":186,\"text\":\"printf 'RESUME=YES\\\\nVMID=%s\\\\nGENERATION=%s\\\\nSTATE=%s\\\\n' \\\"$vmid\\\" \\\"$generation\\\" \\\"$state\\\"\"},{\"line\":187,\"text\":\"\\\"$TRANSPORT\\\" backup-delete \\\"vm${vmid}\\\" \\\"$generation\\\" \\\"$payload\\\" \\\"$REMOTE_A\\\" \\\"$REMOTE_B\\\" \\\"$STATE_ROOT\\\"\"},{\"line\":189,\"text\":\"generation=\\\"vm${vmid}-${HOST}-$(date -u +%Y%m%dT%H%M%SZ)\\\"\"},{\"line\":190,\"text\":\"gen_dir=\\\"$STAGE_ROOT/vm${vmid}/$generation\\\"\"},{\"line\":195,\"text\":\"printf 'RESUME=NO\\\\nVMID=%s\\\\nGENERATION=%s\\\\n' \\\"$vmid\\\" \\\"$generation\\\"\"},{\"line\":202,\"text\":\"if ! ( umask 0022; exec vzdump \\\"$vmid\\\" \\\"${vzdump_args[@]}\\\" ) >\\\"$log_file\\\" 2>&1; then\"},{\"line\":204,\"text\":\"die \\\"VZDUMP_FAILED_$vmid\\\" 70\"},{\"line\":206,\"text\":\"mapfile -t archives < <(find \\\"$gen_dir\\\" -maxdepth 1 -type f -name \\\"vzdump-*-${vmid}-*.zst\\\" -print)\"},{\"line\":208,\"text\":\"[[ \\\"$archive_count\\\" == \\\"1\\\" ]] || { rm -rf -- \\\"$gen_dir\\\"; die \\\"VZDUMP_ARCHIVE_COUNT_${vmid}_${archive_count}\\\" 70; }\"},{\"line\":210,\"text\":\"[[ -s \\\"$archive\\\" && ! -L \\\"$archive\\\" ]] || die \\\"VZDUMP_ARCHIVE_UNSAFE_$vmid\\\" 70\"},{\"line\":212,\"text\":\"\\\"$TRANSPORT\\\" backup-delete \\\"vm${vmid}\\\" \\\"$generation\\\" \\\"$archive\\\" \\\"$REMOTE_A\\\" \\\"$REMOTE_B\\\" \\\"$STATE_ROOT\\\"\"},{\"line\":215,\"text\":\"rmdir -- \\\"$STAGE_ROOT/vm${vmid}\\\" 2>/dev/null || true\"},{\"line\":217,\"text\":\"assert_post_identity \\\"$vmid\\\" \\\"$VM_TYPE\\\"\"},{\"line\":218,\"text\":\"state=\\\"$STATE_ROOT/vm${vmid}/$generation.json\\\"\"},{\"line\":220,\"text\":\"restore_validate \\\"$vmid\\\" \\\"$generation\\\"\"},{\"line\":221,\"text\":\"printf 'BACKUP_STATUS=SEALED\\\\nVMID=%s\\\\nGENERATION=%s\\\\nOWNER=%s\\\\nTYPE=%s\\\\nPOST_STATUS=%s\\\\nRESTORE_EVIDENCE=%s\\\\n' \\\"$vmid\\\" \\\"$generation\\\" \\\"$HOST\\\" \\\"$VM_TYPE\\\" \\\"$(expected_status \\\"$vmid\\\")\\\" \\\"$(restore_dir \\\"$vmid\\\")/$generation.json\\\"\"},{\"line\":226,\"text\":\"[[ -z \\\"$(active_backup_restore)\\\" ]] || die \\\"ACTIVE_BACKUP_RESTORE_PRESENT\\\" 75\"},{\"line\":231,\"text\":\"printf 'HOST_PREFLIGHT_STATUS=OK\\\\nHOST=%s\\\\nSTAGING_FREE_BYTES=%s\\\\nREMOTE_A_FREE_BYTES=%s\\\\nREMOTE_B_FREE_BYTES=%s\\\\nACTIVE_BACKUP_RESTORE=0\\\\n' \\\"$HOST\\\" \\\"$free\\\" \\\"$a_free\\\" \\\"$b_free\\\"\"},{\"line\":234,\"text\":\"local vmid=\\\"$1\\\" dir latest gen\"},{\"line\":235,\"text\":\"assert_local_identity \\\"$vmid\\\"; dir=\\\"$STATE_ROOT/vm${vmid}\\\"\"},{\"line\":236,\"text\":\"[[ -d \\\"$dir\\\" ]] || die \\\"STATE_DIR_MISSING_$vmid\\\" 65\"},{\"line\":238,\"text\":\"[[ -n \\\"$latest\\\" && -s \\\"$latest\\\" && ! -L \\\"$latest\\\" ]] || die \\\"LATEST_STATE_MISSING_$vmid\\\" 65\"},{\"line\":239,\"text\":\"jq -e '.status==\\\"SEALED\\\" and .cloud_quorum==2 and .local_payload_present==false and .local_cleanup==\\\"OK\\\" and .seal_written==true' \\\"$latest\\\" >/dev/null || die \\\"LATEST_STATE_NOT_SEALED_$vmid\\\" 65\"},{\"line\":240,\"text\":\"gen=\\\"$(jq -er '.generation' \\\"$latest\\\")\\\"; restore_ok \\\"$vmid\\\" \\\"$gen\\\" || die \\\"LATEST_RESTORE_NOT_OK_$vmid\\\" 65\"},{\"line\":241,\"text\":\"printf 'LATEST_SEALED_STATUS=OK\\\\nVMID=%s\\\\nGENERATION=%s\\\\nSTATE_FILE=%s\\\\nRESTORE_EVIDENCE=%s\\\\n' \\\"$vmid\\\" \\\"$gen\\\" \\\"$latest\\\" \\\"$(restore_dir \\\"$vmid\\\")/$gen.json\\\"\"},{\"line\":244,\"text\":\"case \\\"$ACTION\\\" in\"},{\"line\":246,\"text\":\"[[ \\\"$#\\\" == 1 ]] || die \\\"USAGE_HOST_PREFLIGHT\\\" 64\"},{\"line\":249,\"text\":\"latest-sealed)\"},{\"line\":250,\"text\":\"[[ \\\"$#\\\" == 2 ]] || die \\\"USAGE_LATEST_SEALED\\\" 64\"},{\"line\":254,\"text\":\"[[ \\\"$#\\\" == 2 ]] || die \\\"USAGE_PLAN\\\" 64\"},{\"line\":257,\"text\":\"backup)\"},{\"line\":258,\"text\":\"[[ \\\"$#\\\" == 2 ]] || die \\\"USAGE_BACKUP\\\" 64\"},{\"line\":259,\"text\":\"backup_one \\\"$2\\\"\"},{\"line\":261,\"text\":\"restore-validate)\"},{\"line\":262,\"text\":\"[[ \\\"$#\\\" == 3 ]] || die \\\"USAGE_RESTORE_VALIDATE\\\" 64\"},{\"line\":263,\"text\":\"restore_validate \\\"$2\\\" \\\"$3\\\"\"},{\"line\":266,\"text\":\"[[ \\\"$#\\\" == 3 ]] || die \\\"USAGE_VERIFY\\\" 64\"}]\nNODEWORKER_CLI_CANDIDATES=[{\"kind\":\"dispatch\",\"text\":\"case \\\"$1\\\" in\"},{\"kind\":\"subcommand-token\",\"text\":\"backup\"},{\"kind\":\"subcommand-token\",\"text\":\"restore\"},{\"kind\":\"subcommand-token\",\"text\":\"latest-sealed\"}]\nDECISION=DIRECT_NODEWORKER_TARGETED_BACKUP_CLI_DISCOVERED\nNO_MUTATION=true\nTASK_RESULT=PASS_HOMELAB_BACKUP_NODEWORKER_CONTRACT_RCA_READONLY\nHOMELAB_RESULT_CONTRACT={\"changes_made\":false,\"command_id\":\"SUPPORT-260921-HOMELAB-BACKUP-NODEWORKER-CONTRACT-RCA-READONLY-1104R1\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\nWORKERS2_NODEWORKER_CONTRACT_RCA_END=1\n" + "output": "PVEPRO896_BEGIN=true\nCOMMAND_ID=SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-HASH-NORMALIZATION-READONLY-896R1\nSCOPE=READ_ONLY_BATCH_C_HISTORICAL_HASH_NORMALIZATION_RECONCILE\nAUTHORITY={\"ERROR_REGISTER\":{\"bytes\":302058,\"expected_sha256\":\"3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0\",\"match\":true,\"sha256\":\"3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0\"},\"REFERENCE\":{\"bytes\":201129,\"expected_sha256\":\"5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66\",\"match\":true,\"sha256\":\"5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66\"}}\nPRODUCTION_HOST={\"name\":\"pvepro-prod\",\"node\":\"pve01\",\"status\":\"running\",\"vmid\":100}\nQGA_TRANSPORT={\"rc\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"}\nQGA_CONTRACT={\"err_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"err_truncated\":null,\"exitcode\":0,\"exited\":1,\"out_truncated\":0}\nHASH_NORMALIZATION_RECONCILE={\"historical_chars_match_9of9\":false,\"historical_whitespace_words_match_9of9\":true,\"reason\":\"HISTORICAL_PROVENANCE_UNRESOLVED\",\"result\":\"HOLD\",\"target_ids\":[31,32,33,34,35,36,37,38,39],\"targets\":[{\"alpha_num_words\":103,\"candidate_hashes\":{\"cp1251\":\"5134669d3dab1dc310f385686922a72606d75998261ce5d38e50f79cd5062f1d\",\"html_escape_utf8\":\"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f\",\"json_ascii_no_quotes\":\"9c19120a513eee9742f043bb663fa43058621df4863a4ff6413fa715f12b1981\",\"json_ascii_with_quotes\":\"7bf0d2da56a30f5a025e35c04297a2a234e8da93acd99ed973675149e59871d3\",\"json_utf8_with_quotes\":\"31355ca8644aa5ba83d58e0f7f33d36028e0d88c6f13c513f5eba6f5a19d9c8d\",\"lf_strip_utf8\":\"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f\",\"lf_utf8\":\"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f\",\"nfc_utf8\":\"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f\",\"nfd_utf8\":\"0c3e5499fa0e2283580a6829f463f04be5a8949bffafc98def5e5378cafe9f4c\",\"nfkc_utf8\":\"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f\",\"nfkd_utf8\":\"0c3e5499fa0e2283580a6829f463f04be5a8949bffafc98def5e5378cafe9f4c\",\"raw_utf8\":\"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f\",\"rstrip_utf8\":\"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f\",\"strip_utf8\":\"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f\",\"utf16be\":\"cee879691dac35f38898e72ff2891d9785559a4ac212fc8bbda42ce7c5fa77d5\",\"utf16le\":\"17b289bcc72aff901fc98e8f4ec096579645f66d6afff2fa4712de7bb298b040\",\"utf8_as_latin1_then_utf8\":\"c22692f00a105b5a8926aae764251fc7bc140ac045a6f02bcf18ff414fe9f79b\"},\"first_post_id\":31,\"forum\":\"PVEPro AI Lab\",\"historical_719\":{\"chars\":731,\"sha256\":\"aba65fce05dad18fd302c9486d96c5845ede9e883b6c9138fcf4896ba7d59145\",\"words\":83},\"historical_chars_match\":false,\"historical_whitespace_words_match\":true,\"line_count\":19,\"matching_hash_transforms\":[],\"node_id\":15,\"raw_bytes\":1110,\"raw_sha256\":\"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f\",\"regex_w_words\":103,\"reply_count\":0,\"sticky\":0,\"thread_id\":31,\"title\":\"[Private AI] RAG \\u043f\\u043e \\u0432\\u043d\\u0443\\u0442\\u0440\\u0435\\u043d\\u043d\\u0438\\u043c \\u0440\\u0435\\u0433\\u043b\\u0430\\u043c\\u0435\\u043d\\u0442\\u0430\\u043c\",\"unicode_chars\":737,\"whitespace_words\":83},{\"alpha_num_words\":103,\"candidate_hashes\":{\"cp1251\":\"c24bf16ee0d86b316fc880c5d226f56cc3bfd9ae488bb694e2282e0a93ab16ce\",\"html_escape_utf8\":\"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a\",\"json_ascii_no_quotes\":\"6a0c95802d884f0c356c6d74d925fef2df7ead4f741e0327b2fe6fd8b237e63e\",\"json_ascii_with_quotes\":\"7b55d924074451eddc041a30309cf89147a873206d7dcdb15a9805dc932140a1\",\"json_utf8_with_quotes\":\"8b969beffb5b6976465ced85957532ca134c1084a563d8a3c5d5543e31477ddb\",\"lf_strip_utf8\":\"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a\",\"lf_utf8\":\"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a\",\"nfc_utf8\":\"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a\",\"nfd_utf8\":\"cdfd83f891d6869f1d6aa974b3c71f27c9c84ead3fe4f10ed526ab502d79c63a\",\"nfkc_utf8\":\"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a\",\"nfkd_utf8\":\"cdfd83f891d6869f1d6aa974b3c71f27c9c84ead3fe4f10ed526ab502d79c63a\",\"raw_utf8\":\"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a\",\"rstrip_utf8\":\"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a\",\"strip_utf8\":\"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a\",\"utf16be\":\"1d0970f69c718a9575d75723b148d0d3ee89cb6d6fa8372ffa628ff1aa4c0066\",\"utf16le\":\"23e482fec9c59494e7ee78cc803b0106c17955ce9b42aec547df35f8863d36a4\",\"utf8_as_cp1251_then_utf8\":\"ebf18c1278e9f1e54bde685ccd299b62db933ed7fbe2f6948536e87124ba766b\",\"utf8_as_latin1_then_utf8\":\"a37563ec0b60616c37fc7504edf7f5772cad00f6ec5bad4525e1d95a928cf9fd\"},\"first_post_id\":32,\"forum\":\"PVEPro AI Lab\",\"historical_719\":{\"chars\":717,\"sha256\":\"66329dfcce09a3f655f25f67045a5528b838614eb43ad29b88f3288602e21fcb\",\"words\":84},\"historical_chars_match\":false,\"historical_whitespace_words_match\":true,\"line_count\":19,\"matching_hash_transforms\":[],\"node_id\":15,\"raw_bytes\":1086,\"raw_sha256\":\"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a\",\"regex_w_words\":103,\"reply_count\":0,\"sticky\":0,\"thread_id\":32,\"title\":\"[Private AI] \\u041b\\u043e\\u043a\\u0430\\u043b\\u044c\\u043d\\u0430\\u044f \\u0442\\u0440\\u0430\\u043d\\u0441\\u043a\\u0440\\u0438\\u0431\\u0430\\u0446\\u0438\\u044f \\u0432\\u0441\\u0442\\u0440\\u0435\\u0447\",\"unicode_chars\":723,\"whitespace_words\":84},{\"alpha_num_words\":109,\"candidate_hashes\":{\"cp1251\":\"f35f37b0d32183d47f6e538f65f5cf6f84034ea752a4167b03bebf5a5e3b1f45\",\"html_escape_utf8\":\"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10\",\"json_ascii_no_quotes\":\"0da0d8bfb5ef49739cae4d91eca10551f170dd473a66752fbdc9fd93f796aa76\",\"json_ascii_with_quotes\":\"75c19bd25dbb8250d225e57dd2b7aeca462b4505373a1eeb832223b16474f798\",\"json_utf8_with_quotes\":\"7ecf4bc796af2597e36d7178bfe265b784ba608703629f44b0e51229be13fa45\",\"lf_strip_utf8\":\"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10\",\"lf_utf8\":\"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10\",\"nfc_utf8\":\"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10\",\"nfd_utf8\":\"aa77f3348fe4f7ecf75817fb15e087ecfe84aaf735dcd0da6260b1430664057a\",\"nfkc_utf8\":\"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10\",\"nfkd_utf8\":\"aa77f3348fe4f7ecf75817fb15e087ecfe84aaf735dcd0da6260b1430664057a\",\"raw_utf8\":\"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10\",\"rstrip_utf8\":\"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10\",\"strip_utf8\":\"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10\",\"utf16be\":\"79aff08627de4de35ad1b9866f77819c6ffe8780c088960aa093e88d29ba1b42\",\"utf16le\":\"fe291ad206f2b53b367ec5a2128244cb119efc4c627deeabdede2b05fc708f42\",\"utf8_as_cp1251_then_utf8\":\"8848dde4fe089434db6fd0c5b56002100487bf6ff69e624fae3fa7724b6d332e\",\"utf8_as_latin1_then_utf8\":\"410c4e8a5f967063aa973efdb4cd3fa74a4e20637d0eb06ed9e572fc88023559\"},\"first_post_id\":33,\"forum\":\"PVEPro AI Lab\",\"historical_719\":{\"chars\":750,\"sha256\":\"ade466868849f37253f6eb05e1c71f7466e6c26a3db05119ab56c73a580202a6\",\"words\":91},\"historical_chars_match\":false,\"historical_whitespace_words_match\":true,\"line_count\":19,\"matching_hash_transforms\":[],\"node_id\":15,\"raw_bytes\":1148,\"raw_sha256\":\"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10\",\"regex_w_words\":109,\"reply_count\":0,\"sticky\":0,\"thread_id\":33,\"title\":\"[Private AI] \\u0410\\u0433\\u0435\\u043d\\u0442 \\u0441 \\u0434\\u043e\\u0441\\u0442\\u0443\\u043f\\u043e\\u043c \\u043a CRM\",\"unicode_chars\":756,\"whitespace_words\":91},{\"alpha_num_words\":102,\"candidate_hashes\":{\"cp1251\":\"1035007641b2c5fd58d5a38f296f4a80aab4f86803d76a44b27cf364ca78691c\",\"html_escape_utf8\":\"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade\",\"json_ascii_no_quotes\":\"45e10faf31cd49a828c9c534279521e2a0bbc7dfbbe512696aa348d2381189d0\",\"json_ascii_with_quotes\":\"5f44ed4756d6cb52ac7150da971087568a723629b186f7c4a720c79748bba51c\",\"json_utf8_with_quotes\":\"faa0be19c161b80dab86800711febdb0ff196434c009abd4f022168bc9214aec\",\"lf_strip_utf8\":\"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade\",\"lf_utf8\":\"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade\",\"nfc_utf8\":\"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade\",\"nfd_utf8\":\"b59124306fbc0ae8cbff9ba2242775d3d7bba83271762820b3e88664fb3f5705\",\"nfkc_utf8\":\"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade\",\"nfkd_utf8\":\"b59124306fbc0ae8cbff9ba2242775d3d7bba83271762820b3e88664fb3f5705\",\"raw_utf8\":\"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade\",\"rstrip_utf8\":\"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade\",\"strip_utf8\":\"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade\",\"utf16be\":\"386544c3aa749fff8d4be3936114cd46aa6f3a87fae0314136a35900a118c6da\",\"utf16le\":\"baafe68dd6e74d1c849f5f576c0c49de2439f3ca198cf0b387b4ee2048e29a70\",\"utf8_as_cp1251_then_utf8\":\"23fb7d7fd2a7d19b2ed450f29a2719dc0d9a1d4cdb2f25c1becc741f529a2a16\",\"utf8_as_latin1_then_utf8\":\"fd20390f688aa44003137b719e8b54db1d8e0093707f771707fb342e48c0c2fb\"},\"first_post_id\":34,\"forum\":\"\\u0416\\u0435\\u043b\\u0435\\u0437\\u043e \\u0438 \\u043f\\u043b\\u043e\\u0449\\u0430\\u0434\\u043a\\u0438\",\"historical_719\":{\"chars\":701,\"sha256\":\"31accb654aa518f680f9dca2f043342094d2158ddf4704f4233cef35f43c5cda\",\"words\":81},\"historical_chars_match\":false,\"historical_whitespace_words_match\":true,\"line_count\":19,\"matching_hash_transforms\":[],\"node_id\":16,\"raw_bytes\":1098,\"raw_sha256\":\"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade\",\"regex_w_words\":102,\"reply_count\":0,\"sticky\":0,\"thread_id\":34,\"title\":\"[\\u041f\\u043b\\u043e\\u0449\\u0430\\u0434\\u043a\\u0430] Mini-PC cluster vs tower server\",\"unicode_chars\":707,\"whitespace_words\":81},{\"alpha_num_words\":96,\"candidate_hashes\":{\"cp1251\":\"078475078bc0d769b65df050d02d63f227e9ec710a55160e24707c03257c6a17\",\"html_escape_utf8\":\"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6\",\"json_ascii_no_quotes\":\"34f593080587784b4efe1d73f9badd5325c91b3b5075b15fefa40043dadf33be\",\"json_ascii_with_quotes\":\"93a61713045e092f9da99f5fbf6e66d3c066b15230c5db74b524b6412f88c1ca\",\"json_utf8_with_quotes\":\"0271e84c660ed5b34c8c34ddc65d98abacdc64b58a1007bf12d3ba9b4c86fb61\",\"lf_strip_utf8\":\"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6\",\"lf_utf8\":\"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6\",\"nfc_utf8\":\"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6\",\"nfd_utf8\":\"939f61bdb2796d868afa2f6c112bef1f0633f305d57b8f4343d53012ea44f91d\",\"nfkc_utf8\":\"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6\",\"nfkd_utf8\":\"939f61bdb2796d868afa2f6c112bef1f0633f305d57b8f4343d53012ea44f91d\",\"raw_utf8\":\"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6\",\"rstrip_utf8\":\"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6\",\"strip_utf8\":\"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6\",\"utf16be\":\"802de01f22a143d88631f71a9babbe04399dbe7c4d4d9dbddd24a41ea7c8bb2c\",\"utf16le\":\"6bd4edb76c9fc443ac7519c5032c9541b6cbc38150965efcc487959a9e2b0fe1\",\"utf8_as_cp1251_then_utf8\":\"0081bc78836cd9fee7f2f4f76065b9479fc7cfcbe52271509a5fffdb8aa4f91f\",\"utf8_as_latin1_then_utf8\":\"9e3cb9c0e0038d558d8c8d68e953e3c58ce0a2663bc0673af8c9ab9dbcccd8a4\"},\"first_post_id\":35,\"forum\":\"\\u0416\\u0435\\u043b\\u0435\\u0437\\u043e \\u0438 \\u043f\\u043b\\u043e\\u0449\\u0430\\u0434\\u043a\\u0438\",\"historical_719\":{\"chars\":673,\"sha256\":\"c8a1a0db8103ad40279d271c8006e3d1dadee6507730ba30155cc97dbe96383d\",\"words\":77},\"historical_chars_match\":false,\"historical_whitespace_words_match\":true,\"line_count\":19,\"matching_hash_transforms\":[],\"node_id\":16,\"raw_bytes\":991,\"raw_sha256\":\"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6\",\"regex_w_words\":96,\"reply_count\":0,\"sticky\":0,\"thread_id\":35,\"title\":\"[\\u041f\\u043b\\u043e\\u0449\\u0430\\u0434\\u043a\\u0430] NVMe mirror vs RAIDZ\",\"unicode_chars\":679,\"whitespace_words\":77},{\"alpha_num_words\":105,\"candidate_hashes\":{\"cp1251\":\"f96a9a6084ebd376f3d5b44eab4922a38acf29ef588704e5c75f8acff15e5148\",\"html_escape_utf8\":\"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26\",\"json_ascii_no_quotes\":\"0414e33d9ef94f8971d60329d0627fc86d84377a60256dcddc84173ff09020d3\",\"json_ascii_with_quotes\":\"3d78dba3115b08d1938ae58b4db5c7321012c7775d7c8e23b3457b8a73974811\",\"json_utf8_with_quotes\":\"06b7bf9c21fcad49f16b32e06670f249f90c137c5e2734748a5a68a11c054385\",\"lf_strip_utf8\":\"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26\",\"lf_utf8\":\"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26\",\"nfc_utf8\":\"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26\",\"nfd_utf8\":\"f0c6433c0b77b9883f82412d4f93a283568ca1a668484a55bb2c7565c63d9c28\",\"nfkc_utf8\":\"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26\",\"nfkd_utf8\":\"f0c6433c0b77b9883f82412d4f93a283568ca1a668484a55bb2c7565c63d9c28\",\"raw_utf8\":\"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26\",\"rstrip_utf8\":\"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26\",\"strip_utf8\":\"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26\",\"utf16be\":\"f124c8be21fe8009f6391e09450c9ccd2f99a60d570187e8688750a384758e6e\",\"utf16le\":\"7f1b9e73d05f3eaebac32643fee1bffc95e7919289c556b4b800f4e43df443f3\",\"utf8_as_cp1251_then_utf8\":\"f195fcb1adfa9b987f5bc3ff89ba45e31b1639231b6a7b11d2084396a5567dd2\",\"utf8_as_latin1_then_utf8\":\"fef2032e23fea3eb96bbf2c16704528167a5fb226597e9d9a6b8f375e2baee74\"},\"first_post_id\":36,\"forum\":\"\\u0416\\u0435\\u043b\\u0435\\u0437\\u043e \\u0438 \\u043f\\u043b\\u043e\\u0449\\u0430\\u0434\\u043a\\u0438\",\"historical_719\":{\"chars\":754,\"sha256\":\"e90d204f73c7ee5ad1ffb7f227f1cdd64bad69f5fa978f078b79ac89045ae287\",\"words\":84},\"historical_chars_match\":false,\"historical_whitespace_words_match\":true,\"line_count\":19,\"matching_hash_transforms\":[],\"node_id\":16,\"raw_bytes\":1166,\"raw_sha256\":\"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26\",\"regex_w_words\":105,\"reply_count\":0,\"sticky\":0,\"thread_id\":36,\"title\":\"[\\u041f\\u043b\\u043e\\u0449\\u0430\\u0434\\u043a\\u0430] \\u041f\\u0435\\u0440\\u0435\\u043d\\u043e\\u0441\\u0438\\u043c\\u043e\\u0441\\u0442\\u044c home-lab \\u2192 hosting/cloud\",\"unicode_chars\":760,\"whitespace_words\":84},{\"alpha_num_words\":104,\"candidate_hashes\":{\"cp1251\":\"3c0834afd170b5036587ed42f144f9c7fc0ac73f20551624fd6b17b366ca7617\",\"html_escape_utf8\":\"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d\",\"json_ascii_no_quotes\":\"f83b7f0525738433d91811da4d39dbebcb1785e74847e0517a334e4b126a3077\",\"json_ascii_with_quotes\":\"40530cf7e3fdb755cd732b3176ec1a8e5a35a613b943aad64fd34c7dcd3dafc5\",\"json_utf8_with_quotes\":\"5bc1902ce7eb6a6f1b58d4f3ba40f0be79c0e326ca47de972e006a3342c2cf11\",\"lf_strip_utf8\":\"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d\",\"lf_utf8\":\"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d\",\"nfc_utf8\":\"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d\",\"nfd_utf8\":\"3357f1f364d4c47e7cd6234defcd18a3271a30ecb2b8b48eb0d64bda980a54c9\",\"nfkc_utf8\":\"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d\",\"nfkd_utf8\":\"3357f1f364d4c47e7cd6234defcd18a3271a30ecb2b8b48eb0d64bda980a54c9\",\"raw_utf8\":\"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d\",\"rstrip_utf8\":\"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d\",\"strip_utf8\":\"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d\",\"utf16be\":\"2c9c6877a1c67edbe9987404174be06c073ef78c9acfdebc6577932cb03146c4\",\"utf16le\":\"8683e980d45c470ce4fbbbf98b799d8266af4e583d65e6ac4d5e2a05616d2735\",\"utf8_as_latin1_then_utf8\":\"cd96abe35a09b7b221cf21f6afac3278ba21bc89414c0812660120edf7da4c2a\"},\"first_post_id\":37,\"forum\":\"\\u0417\\u0430\\u043f\\u0440\\u043e\\u0441\\u044b \\u043d\\u0430 \\u0432\\u043d\\u0435\\u0434\\u0440\\u0435\\u043d\\u0438\\u0435\",\"historical_719\":{\"chars\":737,\"sha256\":\"17c2a8f3e11adff49fdd2c2184b0286796dca4dde755b06b9ee75f1ede52e3c1\",\"words\":85},\"historical_chars_match\":false,\"historical_whitespace_words_match\":true,\"line_count\":19,\"matching_hash_transforms\":[],\"node_id\":17,\"raw_bytes\":1167,\"raw_sha256\":\"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d\",\"regex_w_words\":104,\"reply_count\":0,\"sticky\":0,\"thread_id\":37,\"title\":\"[\\u041f\\u0440\\u0438\\u043c\\u0435\\u0440 \\u0437\\u0430\\u043f\\u0440\\u043e\\u0441\\u0430] \\u0410\\u0443\\u0434\\u0438\\u0442 backup \\u0437\\u0430 \\u043e\\u0434\\u0438\\u043d \\u0440\\u0430\\u0431\\u043e\\u0447\\u0438\\u0439 \\u0434\\u0435\\u043d\\u044c\",\"unicode_chars\":743,\"whitespace_words\":85},{\"alpha_num_words\":99,\"candidate_hashes\":{\"cp1251\":\"60a9aed8da02b6c567d958d80bfbabe9894b3345558a1a0f0ac8c8ad8c338cb2\",\"html_escape_utf8\":\"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55\",\"json_ascii_no_quotes\":\"4949d4b9bed3b145b0db8b13c197d15c719f0d9d7593dddd31822f8a92f50ef3\",\"json_ascii_with_quotes\":\"47d7186333f0e98422d85c2f5cd0e20cc6e06a1a59ddde70cad79fd80b7e8f5a\",\"json_utf8_with_quotes\":\"f0f402605737920bd4be0901f1000ad0f40245fbdbb9689983b6704c37bf9a21\",\"lf_strip_utf8\":\"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55\",\"lf_utf8\":\"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55\",\"nfc_utf8\":\"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55\",\"nfd_utf8\":\"ba7f72e513c3dcaf1fcea5438187ff06d3f1cc63981149f6607486e096da7309\",\"nfkc_utf8\":\"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55\",\"nfkd_utf8\":\"ba7f72e513c3dcaf1fcea5438187ff06d3f1cc63981149f6607486e096da7309\",\"raw_utf8\":\"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55\",\"rstrip_utf8\":\"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55\",\"strip_utf8\":\"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55\",\"utf16be\":\"f3621a73fb4c06b33cb74f0f1f574ede8aaf3870f51018c00c382b2b5ee45ea8\",\"utf16le\":\"43f9fde40d974604b8e6eed59270fc876ea178663a5f0dc22a287dfdc275ec98\",\"utf8_as_cp1251_then_utf8\":\"e80341e1d9bbb5441ba93bd5d6a5b4b31d54ecd58be0577deb0a76bcc4226e47\",\"utf8_as_latin1_then_utf8\":\"0a2d9b9a5eacf3073431c49ff1d157d4b1149ba8726c808a1a0a7e8f7400d2df\"},\"first_post_id\":38,\"forum\":\"\\u0417\\u0430\\u043f\\u0440\\u043e\\u0441\\u044b \\u043d\\u0430 \\u0432\\u043d\\u0435\\u0434\\u0440\\u0435\\u043d\\u0438\\u0435\",\"historical_719\":{\"chars\":714,\"sha256\":\"7b86c826cf409f59d38de25ad742d7c14bcfbdf567410e5087aacc3cd91b603a\",\"words\":82},\"historical_chars_match\":false,\"historical_whitespace_words_match\":true,\"line_count\":19,\"matching_hash_transforms\":[],\"node_id\":17,\"raw_bytes\":1090,\"raw_sha256\":\"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55\",\"regex_w_words\":99,\"reply_count\":0,\"sticky\":0,\"thread_id\":38,\"title\":\"[\\u041f\\u0440\\u0438\\u043c\\u0435\\u0440 \\u0437\\u0430\\u043f\\u0440\\u043e\\u0441\\u0430] Private AI \\u0434\\u043b\\u044f 20 \\u0441\\u043e\\u0442\\u0440\\u0443\\u0434\\u043d\\u0438\\u043a\\u043e\\u0432\",\"unicode_chars\":720,\"whitespace_words\":82},{\"alpha_num_words\":98,\"candidate_hashes\":{\"cp1251\":\"9b91d7a785b6a058d834199c609d904b2ad2e5b89c1dc3cd8e69359824208f62\",\"html_escape_utf8\":\"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82\",\"json_ascii_no_quotes\":\"63be89f8a369df917685c6c9d5ca09950998d64ab7e5cdd856c8837e95418b1e\",\"json_ascii_with_quotes\":\"7227207363ab89e29da7d98753756920a273fb58bb26fa6df9e875a21caacdb0\",\"json_utf8_with_quotes\":\"5efb2900be1ac8becab0ce0af0399f33b779e213d9a35c823e1a581ef4c6f136\",\"lf_strip_utf8\":\"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82\",\"lf_utf8\":\"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82\",\"nfc_utf8\":\"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82\",\"nfd_utf8\":\"c53137df64a98adb36bfaacedb43bc9f13516cc486d028e4abb6ae0e418fc595\",\"nfkc_utf8\":\"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82\",\"nfkd_utf8\":\"c53137df64a98adb36bfaacedb43bc9f13516cc486d028e4abb6ae0e418fc595\",\"raw_utf8\":\"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82\",\"rstrip_utf8\":\"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82\",\"strip_utf8\":\"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82\",\"utf16be\":\"becf36e549c4393c2c414f720d5b54114d8912a3458423ec54c1bb1b7c9f7685\",\"utf16le\":\"60e00b06b8c0422d2faee49091830a8aeb478a78c0a1df826fc194235e61065d\",\"utf8_as_cp1251_then_utf8\":\"5a14a388f3293c86e3c6814f006b9faee53cb3769e288f0bd12f503815ea1dc6\",\"utf8_as_latin1_then_utf8\":\"0564ad394b1e4cb227020e705e7d28802dafb5c240610fb3dbf5203f7f88e066\"},\"first_post_id\":39,\"forum\":\"\\u042d\\u043a\\u0441\\u043f\\u0435\\u0440\\u0442\\u044b PVEPro\",\"historical_719\":{\"chars\":690,\"sha256\":\"f9fe92236122229693a8fe5f10b7c0810079c4bb74ed7f82a44182e7faa64036\",\"words\":78},\"historical_chars_match\":false,\"historical_whitespace_words_match\":true,\"line_count\":19,\"matching_hash_transforms\":[],\"node_id\":18,\"raw_bytes\":1083,\"raw_sha256\":\"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82\",\"regex_w_words\":98,\"reply_count\":0,\"sticky\":0,\"thread_id\":39,\"title\":\"[\\u042d\\u043a\\u0441\\u043f\\u0435\\u0440\\u0442] \\u041a\\u0430\\u043a \\u043e\\u043f\\u0438\\u0441\\u044b\\u0432\\u0430\\u0442\\u044c \\u043a\\u043e\\u043c\\u043f\\u0435\\u0442\\u0435\\u043d\\u0446\\u0438\\u0438 \\u0431\\u0435\\u0437 \\u0441\\u043f\\u0438\\u0441\\u043a\\u0430 \\u043b\\u043e\\u0433\\u043e\\u0442\\u0438\\u043f\\u043e\\u0432\",\"unicode_chars\":696,\"whitespace_words\":78}],\"uniform_hash_transforms\":[]}\nPRODUCT_CHECKPOINTS_REMAINING=8\nCHECKPOINTS13_14_REMAIN_OPEN=true\nTASK_RESULT=HOLD_PVEPRO896_BATCH_C_PROVENANCE_UNRESOLVED\nDECISION=HOLD_PVEPRO896_BATCH_C_PROVENANCE_UNRESOLVED\nNEXT_GATE=RECONCILE_ONLY_PVEPRO_BATCH_C_PROVENANCE\nCHANGES_MADE_BY_896=false\nPRODUCT_MUTATION_BY_896=false\nVM_MUTATION_BY_896=false\nHOMELAB_RESULT_CONTRACT={\"changes_made\":false,\"command_id\":\"SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-HASH-NORMALIZATION-READONLY-896R1\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\nPVEPRO896_END=true\n" } diff --git a/runtime/latest.txt b/runtime/latest.txt index 7f5a9a3d..1c495812 100644 --- a/runtime/latest.txt +++ b/runtime/latest.txt @@ -1,15 +1,15 @@ CHAT_OUTPUT_BEGIN -COMMAND_ID=SUPPORT-260921-HOMELAB-BACKUP-NODEWORKER-CONTRACT-RCA-READONLY-1104R1 +COMMAND_ID=SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-HASH-NORMALIZATION-READONLY-896R1 STATUS=OK RC=0 HOST=pve01 MODE=read-only -COMPONENT=homelab-backup-nodeworker-contract-rca +COMPONENT=pvepro-editorial-batch-c-hash-normalization REFERENCE_REGISTER_CHECK=OK REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 ERROR_REGISTER_CHECK=OK ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 -COMMAND_SHA256=476f69ce1ba9062cf703c5b1de5f81404fc50b1b31240c36e2e6ecdcd7aebecc +COMMAND_SHA256=65b425495d49350f446ea7e2e86d1840cc62438777e4b2979c521634758aa83c DUPLICATE_FAILED_COMMAND_BLOCKED=false EXECUTION_STARTED=true CHANGE_DECLARED=false @@ -24,25 +24,27 @@ MUTATION_OUTCOME=NO_MUTATION SANITIZED=yes SECRETS_INCLUDED=no PRIVATE_ADDRESSES_INCLUDED=no -RAW_EVIDENCE_SHA256=6889fdc8e9ed9a2a2d17d6033311e611ad2a4fc46893776f10806c0b194ff052 -SANITIZED_OUTPUT_SHA256=6889fdc8e9ed9a2a2d17d6033311e611ad2a4fc46893776f10806c0b194ff052 +RAW_EVIDENCE_SHA256=3c6a592971e6b3b3ef6ec5e50292c1fc503986deab1efc292079764c9f695094 +SANITIZED_OUTPUT_SHA256=3c6a592971e6b3b3ef6ec5e50292c1fc503986deab1efc292079764c9f695094 OUTPUT_BEGIN -WORKERS2_NODEWORKER_CONTRACT_RCA_BEGIN=1 -COMMAND_ID=SUPPORT-260921-HOMELAB-BACKUP-NODEWORKER-CONTRACT-RCA-READONLY-1104R1 -MODE=read-only -COMPONENT=homelab-backup-nodeworker-contract-rca -MUTATION_BOUNDARY=READ_ONLY_NO_EXECUTION_OF_BACKUP_WORKERS_NO_SERVICE_START_NO_TIMER_CHANGE_NO_LOCK_BREAK_NO_GIT_WRITE -WRAPPER_INFO={"logic":[{"line":4,"text":"ACCEPTED=pathlib.Path('/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b')"},{"line":5,"text":"EXPECTED={'fresh_lxc_helper.py': 'dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011', 'producer_exec_helper.py': 'b3b97099bcd7126670f866e81faae6a42a96d869d9989e6a67f6ea6c871c90b3', 'lxc_adapter.py': '3fa7d194010d76f7c8bc95035ae8876262e9337903e310f45f45df88c266dc8d', 'qemu_adapter.py': '1906db42bd34bbe85eb46fd9797b3572d46e0a41c29d1c29be5f9df5e448f15b', 'scheduler_adapter.py': 'a6f67159a64067773323f028126e3109e15cf17a8142cea5e6129970f1d4da96', 'entry504.py': 'ca6876fa9c3b1465b045344a8ad46962de16972c7dadc4ac6257c7d225047793'}"}],"path":"/usr/local/sbin/homelab-backup-v2","sha256":"5077444065c732451cb84898680f62361b21a24ef9eb4f191253e82ead524ea2","size":1656} -HASH_MATCHED_HELPERS={"entry504.py":[{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","sha256":"ca6876fa9c3b1465b045344a8ad46962de16972c7dadc4ac6257c7d225047793","size":10566},{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","sha256":"ca6876fa9c3b1465b045344a8ad46962de16972c7dadc4ac6257c7d225047793","size":10566}],"fresh_lxc_helper.py":[{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-500r1-a3964599e60c/fresh_lxc_helper.py","sha256":"dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011","size":2320},{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/fresh_lxc_helper.py","sha256":"dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011","size":2320},{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/fresh_lxc_helper.py","sha256":"dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011","size":2320},{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-501r1-e55e5c8c446a/fresh_lxc_helper.py","sha256":"dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011","size":2320},{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/fresh_lxc_helper.py","sha256":"dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011","size":2320},{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-500r1-a3964599e60c/fresh_lxc_helper.py","sha256":"dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011","size":2320},{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/fresh_lxc_helper.py","sha256":"dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011","size":2320},{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/fresh_lxc_helper.py","sha256":"dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011","size":2320},{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-501r1-e55e5c8c446a/fresh_lxc_helper.py","sha256":"dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011","size":2320},{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/fresh_lxc_helper.py","sha256":"dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011","size":2320}],"lxc_adapter.py":[{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py","sha256":"3fa7d194010d76f7c8bc95035ae8876262e9337903e310f45f45df88c266dc8d","size":13825},{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/lxc_adapter.py","sha256":"3fa7d194010d76f7c8bc95035ae8876262e9337903e310f45f45df88c266dc8d","size":13825},{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/lxc_adapter.py","sha256":"3fa7d194010d76f7c8bc95035ae8876262e9337903e310f45f45df88c266dc8d","size":13825},{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py","sha256":"3fa7d194010d76f7c8bc95035ae8876262e9337903e310f45f45df88c266dc8d","size":13825},{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/lxc_adapter.py","sha256":"3fa7d194010d76f7c8bc95035ae8876262e9337903e310f45f45df88c266dc8d","size":13825},{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/lxc_adapter.py","sha256":"3fa7d194010d76f7c8bc95035ae8876262e9337903e310f45f45df88c266dc8d","size":13825}],"producer_exec_helper.py":[{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/producer_exec_helper.py","sha256":"b3b97099bcd7126670f866e81faae6a42a96d869d9989e6a67f6ea6c871c90b3","size":3449},{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/producer_exec_helper.py","sha256":"b3b97099bcd7126670f866e81faae6a42a96d869d9989e6a67f6ea6c871c90b3","size":3449},{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/producer_exec_helper.py","sha256":"b3b97099bcd7126670f866e81faae6a42a96d869d9989e6a67f6ea6c871c90b3","size":3449},{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/producer_exec_helper.py","sha256":"b3b97099bcd7126670f866e81faae6a42a96d869d9989e6a67f6ea6c871c90b3","size":3449},{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/producer_exec_helper.py","sha256":"b3b97099bcd7126670f866e81faae6a42a96d869d9989e6a67f6ea6c871c90b3","size":3449},{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/producer_exec_helper.py","sha256":"b3b97099bcd7126670f866e81faae6a42a96d869d9989e6a67f6ea6c871c90b3","size":3449}],"qemu_adapter.py":[{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","sha256":"1906db42bd34bbe85eb46fd9797b3572d46e0a41c29d1c29be5f9df5e448f15b","size":4627},{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","sha256":"1906db42bd34bbe85eb46fd9797b3572d46e0a41c29d1c29be5f9df5e448f15b","size":4627},{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","sha256":"1906db42bd34bbe85eb46fd9797b3572d46e0a41c29d1c29be5f9df5e448f15b","size":4627},{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","sha256":"1906db42bd34bbe85eb46fd9797b3572d46e0a41c29d1c29be5f9df5e448f15b","size":4627}],"scheduler_adapter.py":[{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","sha256":"a6f67159a64067773323f028126e3109e15cf17a8142cea5e6129970f1d4da96","size":4097},{"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","sha256":"a6f67159a64067773323f028126e3109e15cf17a8142cea5e6129970f1d4da96","size":4097}]} -HELPER_LOGIC_HITS={"entry504.py":[{"line":4,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"BASE=pathlib.Path('/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1')"},{"line":43,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"def _wire(wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,base=BASE):"},{"line":62,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"required=('capture_pve_guest','backup_target','load_targets','cluster_inventory','ssh_remote',"},{"line":64,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"'choose_due_target','write_state','epoch')"},{"line":78,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"scheduler_wired=scheduler_adapter.bind(proxy,g['choose_due_target'],g['write_state'])"},{"line":79,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if g.get('choose_due_target') is not scheduler_wired['choose_due_target'] or g.get('write_state') is not scheduler_wired['write_state']:"},{"line":80,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"raise RuntimeError('SCHEDULER_ADAPTER_BIND_RESULT')"},{"line":81,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"return {'legacy_globals':g,'legacy':proxy,'original_capture':original,'qemu_patched_capture':qemu_patched,'patched_capture':patched,'scheduler_wired':scheduler_wired}"},{"line":88,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"# Baseline accepted wrapper selftest stays the compatibility gate; no full old legacy selftest is reintroduced."},{"line":89,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"wrapper.selftest()"},{"line":93,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"scheduler_adapter=importlib.import_module('scheduler_adapter')"},{"line":96,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"wired=_wire(wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,BASE)"},{"line":97,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"return wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,wired"},{"line":99,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"def _target(wrapper,lid):"},{"line":100,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"rows=wrapper.load_targets(); hits=[x for x in rows if x.get('logical_id')==lid]"},{"line":101,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if len(hits)!=1: raise RuntimeError('TARGET_CARDINALITY')"},{"line":104,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"def selftest():"},{"line":105,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,wired=_load()"},{"line":108,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if wired['legacy_globals'].get('choose_due_target') is not wired['scheduler_wired']['choose_due_target']:"},{"line":109,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"raise RuntimeError('SCHEDULER_CHOOSE_BINDING')"},{"line":110,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if wired['legacy_globals'].get('write_state') is not wired['scheduler_wired']['write_state']:"},{"line":111,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"raise RuntimeError('SCHEDULER_WRITE_BINDING')"},{"line":112,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if [scheduler_adapter.backoff_seconds(n) for n in range(1,7)]!=[1800,3600,7200,14400,21600,21600]:"},{"line":113,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"raise RuntimeError('SCHEDULER_BACKOFF_CONTRACT')"},{"line":114,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if not callable(wrapper.backup_target) or not callable(wrapper.main) or not callable(wrapper.load_targets):"},{"line":116,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"print('SELFTEST_OVERLAY504=PASS',flush=True)"},{"line":120,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"argv=list(sys.argv[1:] if argv is None else argv)"},{"line":121,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if argv==['selftest']:"},{"line":122,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"return selftest()"},{"line":123,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,wired=_load()"},{"line":125,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if argv==['scheduler-proof']:"},{"line":129,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if old_root is None or not callable(old_epoch): raise RuntimeError('SCHEDULER_PROOF_BASE')"},{"line":132,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"with tempfile.TemporaryDirectory(prefix='homelab-scheduler-proof-',dir='/run') as td:"},{"line":141,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"targets=[{'logical_id':'proof-a','enabled':True,'due_seconds':100},{'logical_id':'proof-b','enabled':True,'due_seconds':100}]"},{"line":142,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"first=legacy.choose_due_target(targets,state,now[0])"},{"line":143,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if not isinstance(first,dict) or first.get('logical_id')!='proof-b': raise RuntimeError('SCHEDULER_PROOF_PEER_NOT_SELECTED')"},{"line":146,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"raise RuntimeError('SCHEDULER_PROOF_FAILURE_STATE')"},{"line":148,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"second=legacy.choose_due_target(targets,legacy.load_state_all(),now[0])"},{"line":149,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if not isinstance(second,dict) or second.get('logical_id')!='proof-a': raise RuntimeError('SCHEDULER_PROOF_RETRY_NOT_REELIGIBLE')"},{"line":153,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"raise RuntimeError('SCHEDULER_PROOF_SUCCESS_RESET')"},{"line":154,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"proof={'failed_target':'proof-a','peer_selected_during_backoff':first['logical_id'],'retry_after_epoch':retry,'last_success_preserved':preserved==1000,'retry_target_after_backoff':second['logical_id'],'success_resets_failures':True,'production_state_root_used':False}"},{"line":155,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"print('SCHEDULER_FAILURE_ISOLATION_PROOF='+json.dumps(proof,separators=(',',':'),sort_keys=True),flush=True)"},{"line":159,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if argv==['scheduler-select-live']:"},{"line":160,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"state=legacy.load_state_all(); targets=wrapper.load_targets()"},{"line":161,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"chosen=legacy.choose_due_target(targets,state)"},{"line":163,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"print('SCHEDULER_LIVE_SELECTION=DEFER_NO_DUE_TARGET',flush=True)"},{"line":165,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"print('SCHEDULER_LIVE_SELECTION='+json.dumps({'logical_id':chosen.get('logical_id'),'due_seconds':chosen.get('due_seconds'),'enabled':chosen.get('enabled') is True},separators=(',',':'),sort_keys=True),flush=True)"},{"line":167,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if len(argv)==2 and argv[0]=='plan-lxc':"},{"line":168,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"t=_target(wrapper,argv[1])"},{"line":169,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if t.get('guest_type')!='lxc' or t.get('logical_id')=='guest-pve01-lxc-112':"},{"line":170,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"raise RuntimeError('PLAN_TARGET_NOT_LEGACY_LXC')"},{"line":172,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"print('PLAN_LXC_RESULT='+json.dumps({'logical_id':t['logical_id'],'vmid':int(t['vmid']),'node':out['job']['node'],'job':out['job']},separators=(',',':'),sort_keys=True),flush=True)"},{"line":174,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if len(argv)==2 and argv[0]=='verify-target':"},{"line":175,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"t=_target(wrapper,argv[1])"},{"line":176,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if t.get('logical_id')=='guest-pve01-lxc-112':"},{"line":179,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"out=wrapper.backup_target(t,True)"},{"line":180,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"except legacy.BackupError as e:"},{"line":181,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"print('VERIFY_TARGET_RESULT=FAIL',flush=True)"},{"line":182,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"print('VERIFY_TARGET_REASON='+str(e.code),flush=True)"},{"line":184,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"print('VERIFY_TARGET_RESULT='+json.dumps(out,separators=(',',':'),sort_keys=True),flush=True)"},{"line":186,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"return wrapper.main([sys.argv[0],*argv])"},{"line":4,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"BASE=pathlib.Path('/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1')"},{"line":43,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"def _wire(wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,base=BASE):"},{"line":62,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"required=('capture_pve_guest','backup_target','load_targets','cluster_inventory','ssh_remote',"},{"line":64,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"'choose_due_target','write_state','epoch')"},{"line":78,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"scheduler_wired=scheduler_adapter.bind(proxy,g['choose_due_target'],g['write_state'])"},{"line":79,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if g.get('choose_due_target') is not scheduler_wired['choose_due_target'] or g.get('write_state') is not scheduler_wired['write_state']:"},{"line":80,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"raise RuntimeError('SCHEDULER_ADAPTER_BIND_RESULT')"},{"line":81,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"return {'legacy_globals':g,'legacy':proxy,'original_capture':original,'qemu_patched_capture':qemu_patched,'patched_capture':patched,'scheduler_wired':scheduler_wired}"},{"line":88,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"# Baseline accepted wrapper selftest stays the compatibility gate; no full old legacy selftest is reintroduced."},{"line":89,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"wrapper.selftest()"},{"line":93,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"scheduler_adapter=importlib.import_module('scheduler_adapter')"},{"line":96,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"wired=_wire(wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,BASE)"},{"line":97,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"return wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,wired"},{"line":99,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"def _target(wrapper,lid):"},{"line":100,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"rows=wrapper.load_targets(); hits=[x for x in rows if x.get('logical_id')==lid]"},{"line":101,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if len(hits)!=1: raise RuntimeError('TARGET_CARDINALITY')"},{"line":104,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"def selftest():"},{"line":105,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,wired=_load()"},{"line":108,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if wired['legacy_globals'].get('choose_due_target') is not wired['scheduler_wired']['choose_due_target']:"},{"line":109,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"raise RuntimeError('SCHEDULER_CHOOSE_BINDING')"},{"line":110,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if wired['legacy_globals'].get('write_state') is not wired['scheduler_wired']['write_state']:"},{"line":111,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"raise RuntimeError('SCHEDULER_WRITE_BINDING')"},{"line":112,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if [scheduler_adapter.backoff_seconds(n) for n in range(1,7)]!=[1800,3600,7200,14400,21600,21600]:"},{"line":113,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"raise RuntimeError('SCHEDULER_BACKOFF_CONTRACT')"},{"line":114,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if not callable(wrapper.backup_target) or not callable(wrapper.main) or not callable(wrapper.load_targets):"},{"line":116,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"print('SELFTEST_OVERLAY504=PASS',flush=True)"},{"line":120,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"argv=list(sys.argv[1:] if argv is None else argv)"},{"line":121,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if argv==['selftest']:"},{"line":122,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"return selftest()"},{"line":123,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"wrapper,lxc_adapter,qemu_adapter,scheduler_adapter,wired=_load()"},{"line":125,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if argv==['scheduler-proof']:"},{"line":129,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if old_root is None or not callable(old_epoch): raise RuntimeError('SCHEDULER_PROOF_BASE')"},{"line":132,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"with tempfile.TemporaryDirectory(prefix='homelab-scheduler-proof-',dir='/run') as td:"},{"line":141,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"targets=[{'logical_id':'proof-a','enabled':True,'due_seconds':100},{'logical_id':'proof-b','enabled':True,'due_seconds':100}]"},{"line":142,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"first=legacy.choose_due_target(targets,state,now[0])"},{"line":143,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if not isinstance(first,dict) or first.get('logical_id')!='proof-b': raise RuntimeError('SCHEDULER_PROOF_PEER_NOT_SELECTED')"},{"line":146,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"raise RuntimeError('SCHEDULER_PROOF_FAILURE_STATE')"},{"line":148,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"second=legacy.choose_due_target(targets,legacy.load_state_all(),now[0])"},{"line":149,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if not isinstance(second,dict) or second.get('logical_id')!='proof-a': raise RuntimeError('SCHEDULER_PROOF_RETRY_NOT_REELIGIBLE')"},{"line":153,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"raise RuntimeError('SCHEDULER_PROOF_SUCCESS_RESET')"},{"line":154,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"proof={'failed_target':'proof-a','peer_selected_during_backoff':first['logical_id'],'retry_after_epoch':retry,'last_success_preserved':preserved==1000,'retry_target_after_backoff':second['logical_id'],'success_resets_failures':True,'production_state_root_used':False}"},{"line":155,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"print('SCHEDULER_FAILURE_ISOLATION_PROOF='+json.dumps(proof,separators=(',',':'),sort_keys=True),flush=True)"},{"line":159,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if argv==['scheduler-select-live']:"},{"line":160,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"state=legacy.load_state_all(); targets=wrapper.load_targets()"},{"line":161,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"chosen=legacy.choose_due_target(targets,state)"},{"line":163,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"print('SCHEDULER_LIVE_SELECTION=DEFER_NO_DUE_TARGET',flush=True)"},{"line":165,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"print('SCHEDULER_LIVE_SELECTION='+json.dumps({'logical_id':chosen.get('logical_id'),'due_seconds':chosen.get('due_seconds'),'enabled':chosen.get('enabled') is True},separators=(',',':'),sort_keys=True),flush=True)"},{"line":167,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if len(argv)==2 and argv[0]=='plan-lxc':"},{"line":168,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"t=_target(wrapper,argv[1])"},{"line":169,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if t.get('guest_type')!='lxc' or t.get('logical_id')=='guest-pve01-lxc-112':"},{"line":170,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"raise RuntimeError('PLAN_TARGET_NOT_LEGACY_LXC')"},{"line":172,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"print('PLAN_LXC_RESULT='+json.dumps({'logical_id':t['logical_id'],'vmid':int(t['vmid']),'node':out['job']['node'],'job':out['job']},separators=(',',':'),sort_keys=True),flush=True)"},{"line":174,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if len(argv)==2 and argv[0]=='verify-target':"},{"line":175,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"t=_target(wrapper,argv[1])"},{"line":176,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"if t.get('logical_id')=='guest-pve01-lxc-112':"},{"line":179,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"out=wrapper.backup_target(t,True)"},{"line":180,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"except legacy.BackupError as e:"},{"line":181,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"print('VERIFY_TARGET_RESULT=FAIL',flush=True)"},{"line":182,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"print('VERIFY_TARGET_REASON='+str(e.code),flush=True)"},{"line":184,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"print('VERIFY_TARGET_RESULT='+json.dumps(out,separators=(',',':'),sort_keys=True),flush=True)"},{"line":186,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/entry504.py","text":"return wrapper.main([sys.argv[0],*argv])"}],"fresh_lxc_helper.py":[{"line":4,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-500r1-a3964599e60c/fresh_lxc_helper.py","text":"BASE_RELEASE=pathlib.Path('/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1')"},{"line":15,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-500r1-a3964599e60c/fresh_lxc_helper.py","text":"if len(sys.argv)!=1: fail('HELPER_ARGC')"},{"line":26,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-500r1-a3964599e60c/fresh_lxc_helper.py","text":"node=raw.get('node'); vmid=raw.get('vmid'); scratch=raw.get('scratch'); now=raw.get('now')"},{"line":27,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-500r1-a3964599e60c/fresh_lxc_helper.py","text":"if type(node) is not str or type(vmid) is not int or type(scratch) is not str or type(now) is not int: fail('INPUT_FIELDS')"},{"line":30,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-500r1-a3964599e60c/fresh_lxc_helper.py","text":"plan=pve265.make_plan(raw.get('rows'),configs,raw.get('storage_rows'),defaults,int(raw.get('staging_free')),now,node=node)"},{"line":31,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-500r1-a3964599e60c/fresh_lxc_helper.py","text":"jobs=[j for j in plan['jobs'] if j.get('vmid')==vmid]"},{"line":35,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-500r1-a3964599e60c/fresh_lxc_helper.py","text":"if job.get('type')!='lxc' or job.get('node')!=node: fail('JOB_IDENTITY')"},{"line":37,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-500r1-a3964599e60c/fresh_lxc_helper.py","text":"guest266.no_active_tasks(raw.get('tasks'),vmid)"},{"line":39,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-500r1-a3964599e60c/fresh_lxc_helper.py","text":"keep=('vmid','type','node','status','template','config_sha256','disks','configured_disk_bytes','configured_archive_bound_bytes','archive_cap_bytes','global_defaults_sha256','blockers','coverage_eligible')"},{"line":4,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/fresh_lxc_helper.py","text":"BASE_RELEASE=pathlib.Path('/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1')"},{"line":15,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/fresh_lxc_helper.py","text":"if len(sys.argv)!=1: fail('HELPER_ARGC')"},{"line":26,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/fresh_lxc_helper.py","text":"node=raw.get('node'); vmid=raw.get('vmid'); scratch=raw.get('scratch'); now=raw.get('now')"},{"line":27,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/fresh_lxc_helper.py","text":"if type(node) is not str or type(vmid) is not int or type(scratch) is not str or type(now) is not int: fail('INPUT_FIELDS')"},{"line":30,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/fresh_lxc_helper.py","text":"plan=pve265.make_plan(raw.get('rows'),configs,raw.get('storage_rows'),defaults,int(raw.get('staging_free')),now,node=node)"},{"line":31,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/fresh_lxc_helper.py","text":"jobs=[j for j in plan['jobs'] if j.get('vmid')==vmid]"},{"line":35,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/fresh_lxc_helper.py","text":"if job.get('type')!='lxc' or job.get('node')!=node: fail('JOB_IDENTITY')"},{"line":37,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/fresh_lxc_helper.py","text":"guest266.no_active_tasks(raw.get('tasks'),vmid)"},{"line":39,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/fresh_lxc_helper.py","text":"keep=('vmid','type','node','status','template','config_sha256','disks','configured_disk_bytes','configured_archive_bound_bytes','archive_cap_bytes','global_defaults_sha256','blockers','coverage_eligible')"},{"line":4,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/fresh_lxc_helper.py","text":"BASE_RELEASE=pathlib.Path('/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1')"},{"line":15,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/fresh_lxc_helper.py","text":"if len(sys.argv)!=1: fail('HELPER_ARGC')"},{"line":26,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/fresh_lxc_helper.py","text":"node=raw.get('node'); vmid=raw.get('vmid'); scratch=raw.get('scratch'); now=raw.get('now')"},{"line":27,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/fresh_lxc_helper.py","text":"if type(node) is not str or type(vmid) is not int or type(scratch) is not str or type(now) is not int: fail('INPUT_FIELDS')"},{"line":30,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/fresh_lxc_helper.py","text":"plan=pve265.make_plan(raw.get('rows'),configs,raw.get('storage_rows'),defaults,int(raw.get('staging_free')),now,node=node)"},{"line":31,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/fresh_lxc_helper.py","text":"jobs=[j for j in plan['jobs'] if j.get('vmid')==vmid]"},{"line":35,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/fresh_lxc_helper.py","text":"if job.get('type')!='lxc' or job.get('node')!=node: fail('JOB_IDENTITY')"},{"line":37,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/fresh_lxc_helper.py","text":"guest266.no_active_tasks(raw.get('tasks'),vmid)"},{"line":39,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/fresh_lxc_helper.py","text":"keep=('vmid','type','node','status','template','config_sha256','disks','configured_disk_bytes','configured_archive_bound_bytes','archive_cap_bytes','global_defaults_sha256','blockers','coverage_eligible')"}],"lxc_adapter.py":[{"line":2,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py","text":"import base64, hashlib, json, os, pathlib, re, selectors, shlex, signal, stat, subprocess, sys, time"},{"line":6,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py","text":"HELPER=pathlib.Path(__file__).resolve().parent/'fresh_lxc_helper.py'"},{"line":35,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py","text":"def _remote_sha(legacy,node,path):"},{"line":36,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py","text":"p=legacy.ssh_remote(node,['sha256sum','--',path],timeout=30)"},{"line":41,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py","text":"def _live_inputs(legacy,node,vmid,scratch):"},{"line":42,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py","text":"_need(_remote_sha(legacy,node,'/usr/bin/pvesh')==PVESH_SHA,'PVESH_IDENTITY')"},{"line":43,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py","text":"_need(_remote_sha(legacy,node,'/usr/bin/vzdump')==VZDUMP_SHA,'VZDUMP_IDENTITY')"},{"line":44,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py","text":"rows=_j(legacy.ssh_remote(node,['pvesh','get','/cluster/resources','--type','vm','--output-format','json'],timeout=60),'RESOURCES_JSON')"},{"line":45,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py","text":"stores=_j(legacy.ssh_remote(node,['pvesh','get',f'/nodes/{node}/storage','--output-format','json'],timeout=60),'STORAGE_JSON')"},{"line":49,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py","text":"if not isinstance(r,dict) or r.get('node')!=node or r.get('type') not in ('lxc','qemu'): continue"},{"line":50,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py","text":"try: rid=int(r.get('vmid'))"},{"line":51,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py","text":"except Exception: raise AdapterError('RESOURCE_VMID')"},{"line":52,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py","text":"cfg=_j(legacy.ssh_remote(node,['pvesh','get',f'/nodes/{node}/{r[\"type\"]}/{rid}/config','--output-format','json'],timeout=60),'CONFIG_JSON')"},{"line":55,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py","text":"tasks=_j(legacy.ssh_remote(node,['pvesh','get',f'/nodes/{node}/tasks','--limit','999','--output-format','json'],timeout=60),'TASKS_JSON')"},{"line":57,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py","text":"q=legacy.ssh_remote(node,['test','-f','/etc/vzdump.conf'],timeout=30,check=False)"},{"line":59,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py","text":"if q.returncode==0: defaults=legacy.ssh_remote(node,['cat','--','/etc/vzdump.conf'],timeout=30).stdout"},{"line":62,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py","text":"return {'node':node,'vmid':vmid,'scratch':scratch,'now':int(time.time()),'rows':rows,'storage_rows':stores,'configs':configs,"},{"line":67,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/lxc_adapter.py","text":"_need(0int:"},{"line":31,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/producer_exec_helper.py","text":"print('PRODUCER_EXEC_HELPER_SELFTEST=PASS',flush=True)"},{"line":35,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/producer_exec_helper.py","text":"if sys.argv[1:]==['selftest']: return selftest()"},{"line":36,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/producer_exec_helper.py","text":"if sys.argv[1:]: fail('ARGC')"},{"line":41,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/producer_exec_helper.py","text":"if type(x) is not dict or set(x)!={'argv','dest','cap','seconds'}: fail('INPUT_SCHEMA')"},{"line":43,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/producer_exec_helper.py","text":"if not (type(argv) is list and argv and all(type(v) is str and '\\x00' not in v for v in argv)): fail('ARGV')"},{"line":44,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-502r1-9d13ea486935/producer_exec_helper.py","text":"if argv[0]!='/usr/bin/vzdump': fail('VZDUMP_PATH')"},{"line":4,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/producer_exec_helper.py","text":"BASE=pathlib.Path('/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411')"},{"line":26,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/producer_exec_helper.py","text":"def selftest()->int:"},{"line":31,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/producer_exec_helper.py","text":"print('PRODUCER_EXEC_HELPER_SELFTEST=PASS',flush=True)"},{"line":35,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/producer_exec_helper.py","text":"if sys.argv[1:]==['selftest']: return selftest()"},{"line":36,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/producer_exec_helper.py","text":"if sys.argv[1:]: fail('ARGC')"},{"line":41,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/producer_exec_helper.py","text":"if type(x) is not dict or set(x)!={'argv','dest','cap','seconds'}: fail('INPUT_SCHEMA')"},{"line":43,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/producer_exec_helper.py","text":"if not (type(argv) is list and argv and all(type(v) is str and '\\x00' not in v for v in argv)): fail('ARGV')"},{"line":44,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/producer_exec_helper.py","text":"if argv[0]!='/usr/bin/vzdump': fail('VZDUMP_PATH')"},{"line":4,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/producer_exec_helper.py","text":"BASE=pathlib.Path('/opt/homelab-backup-v2/releases/backup-v2-accepted-486r1/candidate411')"},{"line":26,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/producer_exec_helper.py","text":"def selftest()->int:"},{"line":31,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/producer_exec_helper.py","text":"print('PRODUCER_EXEC_HELPER_SELFTEST=PASS',flush=True)"},{"line":35,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/producer_exec_helper.py","text":"if sys.argv[1:]==['selftest']: return selftest()"},{"line":36,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/producer_exec_helper.py","text":"if sys.argv[1:]: fail('ARGC')"},{"line":41,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/producer_exec_helper.py","text":"if type(x) is not dict or set(x)!={'argv','dest','cap','seconds'}: fail('INPUT_SCHEMA')"},{"line":43,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/producer_exec_helper.py","text":"if not (type(argv) is list and argv and all(type(v) is str and '\\x00' not in v for v in argv)): fail('ARGV')"},{"line":44,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/producer_exec_helper.py","text":"if argv[0]!='/usr/bin/vzdump': fail('VZDUMP_PATH')"}],"qemu_adapter.py":[{"line":11,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"def _remote_sha(legacy,node,path):"},{"line":12,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"p=legacy.ssh_remote(node,['sha256sum','--',path],timeout=30)"},{"line":17,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"def _select_qemu_outputs(vmid,files):"},{"line":18,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"_need(type(vmid) is int and vmid>0,'QEMU_VMID')"},{"line":21,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"pat=re.compile(r'^vzdump-qemu-'+re.escape(str(vmid))+r'-(\\d{4}_\\d{2}_\\d{2}-\\d{2}_\\d{2}_\\d{2})\\.vma\\.zst$')"},{"line":29,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"expected_log=parent/f'vzdump-qemu-{vmid}-{stamp}.log'"},{"line":43,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"vmid=int(t['vmid']); rows=[r for r in legacy.cluster_inventory() if int(r.get('vmid',-1))==vmid]"},{"line":45,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"row=rows[0]; node=row.get('node'); typ=row.get('type')"},{"line":47,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"_need(_remote_sha(legacy,node,'/usr/bin/vzdump')==VZDUMP_SHA,'QEMU_VZDUMP_IDENTITY_PRE')"},{"line":49,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"legacy.ssh_remote(node,['install','-d','-m','700','-o','0','-g','0',srcdir],timeout=30)"},{"line":51,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"vp=legacy.ssh_remote(node,['vzdump',str(vmid),'--mode','snapshot','--compress','zstd','--dumpdir',srcdir],timeout=7200,check=False)"},{"line":53,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"_emit_diag(vmid=vmid,node=node,producer_rc=vp.returncode,stderr_bytes=len(vp.stderr),stderr_sha256=hashlib.sha256(vp.stderr).hexdigest(),archive_selected=False)"},{"line":54,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"raise legacy.BackupError('QEMU_VZDUMP_FAILED')"},{"line":55,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"_need(_remote_sha(legacy,node,'/usr/bin/vzdump')==VZDUMP_SHA,'QEMU_VZDUMP_IDENTITY_POST')"},{"line":56,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"p=legacy.ssh_remote(node,['find',srcdir,'-maxdepth','1','-type','f','-printf','%p\\n'],timeout=30)"},{"line":58,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"try: src,log=_select_qemu_outputs(vmid,files)"},{"line":60,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"_emit_diag(vmid=vmid,node=node,producer_rc=0,regular_file_count=len(files),archive_selected=False,selector_error=str(e))"},{"line":61,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"raise legacy.BackupError(str(e)) from None"},{"line":62,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"q=legacy.ssh_remote(node,['stat','-c','%s','--',src],timeout=30)"},{"line":67,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"if node=='pve01': local=pathlib.Path(src)"},{"line":69,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"legacy.run([legacy.SCP,'-q','-o','BatchMode=yes','-o','StrictHostKeyChecking=yes','root@'+node+':'+src,str(local)],timeout=7200)"},{"line":71,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"_emit_diag(vmid=vmid,node=node,producer_rc=0,regular_file_count=len(files),sidecar_count=1 if log else 0,archive_bytes=size,archive_selected=True)"},{"line":73,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"legacy.ssh_remote(node,['rm','-rf','--',srcdir],timeout=60,check=False); raise"},{"line":74,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"cleanup={'kind':'pve_source_dir','node':node,'path':srcdir}"},{"line":75,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"meta={'generation':gen,'source_class':'pve_guest','vmid':vmid,'guest_type':'qemu','node':node,'status':row.get('status'),"},{"line":11,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","text":"def _remote_sha(legacy,node,path):"},{"line":12,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","text":"p=legacy.ssh_remote(node,['sha256sum','--',path],timeout=30)"},{"line":17,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","text":"def _select_qemu_outputs(vmid,files):"},{"line":18,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","text":"_need(type(vmid) is int and vmid>0,'QEMU_VMID')"},{"line":21,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","text":"pat=re.compile(r'^vzdump-qemu-'+re.escape(str(vmid))+r'-(\\d{4}_\\d{2}_\\d{2}-\\d{2}_\\d{2}_\\d{2})\\.vma\\.zst$')"},{"line":29,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","text":"expected_log=parent/f'vzdump-qemu-{vmid}-{stamp}.log'"},{"line":43,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","text":"vmid=int(t['vmid']); rows=[r for r in legacy.cluster_inventory() if int(r.get('vmid',-1))==vmid]"},{"line":45,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","text":"row=rows[0]; node=row.get('node'); typ=row.get('type')"},{"line":47,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","text":"_need(_remote_sha(legacy,node,'/usr/bin/vzdump')==VZDUMP_SHA,'QEMU_VZDUMP_IDENTITY_PRE')"},{"line":49,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","text":"legacy.ssh_remote(node,['install','-d','-m','700','-o','0','-g','0',srcdir],timeout=30)"},{"line":51,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","text":"vp=legacy.ssh_remote(node,['vzdump',str(vmid),'--mode','snapshot','--compress','zstd','--dumpdir',srcdir],timeout=7200,check=False)"},{"line":53,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","text":"_emit_diag(vmid=vmid,node=node,producer_rc=vp.returncode,stderr_bytes=len(vp.stderr),stderr_sha256=hashlib.sha256(vp.stderr).hexdigest(),archive_selected=False)"},{"line":54,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","text":"raise legacy.BackupError('QEMU_VZDUMP_FAILED')"},{"line":55,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","text":"_need(_remote_sha(legacy,node,'/usr/bin/vzdump')==VZDUMP_SHA,'QEMU_VZDUMP_IDENTITY_POST')"},{"line":56,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","text":"p=legacy.ssh_remote(node,['find',srcdir,'-maxdepth','1','-type','f','-printf','%p\\n'],timeout=30)"},{"line":58,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","text":"try: src,log=_select_qemu_outputs(vmid,files)"},{"line":60,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","text":"_emit_diag(vmid=vmid,node=node,producer_rc=0,regular_file_count=len(files),archive_selected=False,selector_error=str(e))"},{"line":61,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","text":"raise legacy.BackupError(str(e)) from None"},{"line":62,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","text":"q=legacy.ssh_remote(node,['stat','-c','%s','--',src],timeout=30)"},{"line":67,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","text":"if node=='pve01': local=pathlib.Path(src)"},{"line":69,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","text":"legacy.run([legacy.SCP,'-q','-o','BatchMode=yes','-o','StrictHostKeyChecking=yes','root@'+node+':'+src,str(local)],timeout=7200)"},{"line":71,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","text":"_emit_diag(vmid=vmid,node=node,producer_rc=0,regular_file_count=len(files),sidecar_count=1 if log else 0,archive_bytes=size,archive_selected=True)"},{"line":73,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","text":"legacy.ssh_remote(node,['rm','-rf','--',srcdir],timeout=60,check=False); raise"},{"line":74,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","text":"cleanup={'kind':'pve_source_dir','node':node,'path':srcdir}"},{"line":75,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/qemu_adapter.py","text":"meta={'generation':gen,'source_class':'pve_guest','vmid':vmid,'guest_type':'qemu','node':node,'status':row.get('status'),"},{"line":11,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"def _remote_sha(legacy,node,path):"},{"line":12,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"p=legacy.ssh_remote(node,['sha256sum','--',path],timeout=30)"},{"line":17,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"def _select_qemu_outputs(vmid,files):"},{"line":18,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"_need(type(vmid) is int and vmid>0,'QEMU_VMID')"},{"line":21,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"pat=re.compile(r'^vzdump-qemu-'+re.escape(str(vmid))+r'-(\\d{4}_\\d{2}_\\d{2}-\\d{2}_\\d{2}_\\d{2})\\.vma\\.zst$')"},{"line":29,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"expected_log=parent/f'vzdump-qemu-{vmid}-{stamp}.log'"},{"line":43,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"vmid=int(t['vmid']); rows=[r for r in legacy.cluster_inventory() if int(r.get('vmid',-1))==vmid]"},{"line":45,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"row=rows[0]; node=row.get('node'); typ=row.get('type')"},{"line":47,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"_need(_remote_sha(legacy,node,'/usr/bin/vzdump')==VZDUMP_SHA,'QEMU_VZDUMP_IDENTITY_PRE')"},{"line":49,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"legacy.ssh_remote(node,['install','-d','-m','700','-o','0','-g','0',srcdir],timeout=30)"},{"line":51,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"vp=legacy.ssh_remote(node,['vzdump',str(vmid),'--mode','snapshot','--compress','zstd','--dumpdir',srcdir],timeout=7200,check=False)"},{"line":53,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"_emit_diag(vmid=vmid,node=node,producer_rc=vp.returncode,stderr_bytes=len(vp.stderr),stderr_sha256=hashlib.sha256(vp.stderr).hexdigest(),archive_selected=False)"},{"line":54,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"raise legacy.BackupError('QEMU_VZDUMP_FAILED')"},{"line":55,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"_need(_remote_sha(legacy,node,'/usr/bin/vzdump')==VZDUMP_SHA,'QEMU_VZDUMP_IDENTITY_POST')"},{"line":56,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"p=legacy.ssh_remote(node,['find',srcdir,'-maxdepth','1','-type','f','-printf','%p\\n'],timeout=30)"},{"line":58,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"try: src,log=_select_qemu_outputs(vmid,files)"},{"line":60,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"_emit_diag(vmid=vmid,node=node,producer_rc=0,regular_file_count=len(files),archive_selected=False,selector_error=str(e))"},{"line":61,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"raise legacy.BackupError(str(e)) from None"},{"line":62,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"q=legacy.ssh_remote(node,['stat','-c','%s','--',src],timeout=30)"},{"line":67,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"if node=='pve01': local=pathlib.Path(src)"},{"line":69,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"legacy.run([legacy.SCP,'-q','-o','BatchMode=yes','-o','StrictHostKeyChecking=yes','root@'+node+':'+src,str(local)],timeout=7200)"},{"line":71,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"_emit_diag(vmid=vmid,node=node,producer_rc=0,regular_file_count=len(files),sidecar_count=1 if log else 0,archive_bytes=size,archive_selected=True)"},{"line":73,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"legacy.ssh_remote(node,['rm','-rf','--',srcdir],timeout=60,check=False); raise"},{"line":74,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"cleanup={'kind':'pve_source_dir','node':node,'path':srcdir}"},{"line":75,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-503r1-ac51fd96ec13/qemu_adapter.py","text":"meta={'generation':gen,'source_class':'pve_guest','vmid':vmid,'guest_type':'qemu','node':node,'status':row.get('status'),"}],"scheduler_adapter.py":[{"line":7,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"class SchedulerAdapterError(RuntimeError): pass"},{"line":10,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"if not ok: raise SchedulerAdapterError(code)"},{"line":23,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"def _read_prior(legacy,logical_id):"},{"line":25,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"p=root/(str(logical_id)+'.json')"},{"line":55,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"def choose_due_target(targets,state,now=None):"},{"line":57,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"_need(isinstance(targets,list) and isinstance(state,dict),'SCHEDULER_INPUT_SCHEMA')"},{"line":58,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"due=[]"},{"line":59,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"for order,t in enumerate(targets):"},{"line":61,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"lid=t.get('logical_id'); seconds=_as_nonneg_int(t.get('due_seconds'),0)"},{"line":62,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"_need(isinstance(lid,str) and lid and seconds>0,'SCHEDULER_TARGET_SCHEMA')"},{"line":70,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"overdue=age-seconds"},{"line":71,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"due.append((overdue,-order,t))"},{"line":72,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"if not due: return None"},{"line":73,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"return max(due,key=lambda x:(x[0],x[1]))[2]"},{"line":75,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"def write_state(logical_id,result,**kw):"},{"line":77,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"prior=_read_prior(legacy,logical_id)"},{"line":81,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"return original_write(logical_id,result,**clean)"},{"line":88,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"return original_write(logical_id,result,**clean)"},{"line":90,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"legacy.choose_due_target=choose_due_target"},{"line":92,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"return {'choose_due_target':choose_due_target,'write_state':write_state,"},{"line":7,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"class SchedulerAdapterError(RuntimeError): pass"},{"line":10,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"if not ok: raise SchedulerAdapterError(code)"},{"line":23,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"def _read_prior(legacy,logical_id):"},{"line":25,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"p=root/(str(logical_id)+'.json')"},{"line":55,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"def choose_due_target(targets,state,now=None):"},{"line":57,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"_need(isinstance(targets,list) and isinstance(state,dict),'SCHEDULER_INPUT_SCHEMA')"},{"line":58,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"due=[]"},{"line":59,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"for order,t in enumerate(targets):"},{"line":61,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"lid=t.get('logical_id'); seconds=_as_nonneg_int(t.get('due_seconds'),0)"},{"line":62,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"_need(isinstance(lid,str) and lid and seconds>0,'SCHEDULER_TARGET_SCHEMA')"},{"line":70,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"overdue=age-seconds"},{"line":71,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"due.append((overdue,-order,t))"},{"line":72,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"if not due: return None"},{"line":73,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"return max(due,key=lambda x:(x[0],x[1]))[2]"},{"line":75,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"def write_state(logical_id,result,**kw):"},{"line":77,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"prior=_read_prior(legacy,logical_id)"},{"line":81,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"return original_write(logical_id,result,**clean)"},{"line":88,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"return original_write(logical_id,result,**clean)"},{"line":90,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"legacy.choose_due_target=choose_due_target"},{"line":92,"path":"/opt/homelab-backup-v2/releases/backup-v2-overlay-504r1-ca6876fa9c3b/scheduler_adapter.py","text":"return {'choose_due_target':choose_due_target,'write_state':write_state,"}]} -NODEWORKER_INFO={"path":"/usr/local/libexec/homelab-vm-cloud-quorum-node-worker","sha256":"91bdd116be865560a38105dffbd1a66d687232035e2359e4a5be4d225e9c61d1","size":17702} -NODEWORKER_LOGIC_HITS=[{"line":6,"text":"STATE_ROOT=/var/lib/homelab-backup/cloud-quorum"},{"line":8,"text":"RESTORE_STATE_ROOT=/var/lib/homelab-backup/vm-restore-validation"},{"line":9,"text":"RESTORE_WORK_ROOT=/mnt/staging/homelab-vm-restore-validation"},{"line":11,"text":"REMOTE_A='pve01-mail-01-crypt:homelab-backups'"},{"line":12,"text":"REMOTE_B='pve01-mail-02-crypt:homelab-backups'"},{"line":18,"text":"ACTIVE_RESTORE_STAGE=\"\""},{"line":19,"text":"cleanup_restore_stage(){ if [[ -n \"$ACTIVE_RESTORE_STAGE\" && \"$ACTIVE_RESTORE_STAGE\" == \"$RESTORE_WORK_ROOT\"/* && -d \"$ACTIVE_RESTORE_STAGE\" ]]; then rm -rf --one-file-system \"$ACTIVE_RESTORE_STAGE\"; fi; }"},{"line":20,"text":"trap cleanup_restore_stage EXIT"},{"line":21,"text":"active_backup_restore(){ local rc; if pgrep -af '(^|/)(vzdump|qmrestore|pctrestore|vma|zstd|rclone)([[:space:]]|$)'; then return 0; else rc=$?; [[ \"$rc\" == 1 ]] && return 0; die \"PGREP_FAILED_$rc\" 69; fi; }"},{"line":24,"text":"expected_owner(){"},{"line":25,"text":"case \"$1\" in"},{"line":29,"text":"*) die \"VMID_NOT_ALLOWED_$1\" 64 ;;"},{"line":33,"text":"case \"$1\" in"},{"line":36,"text":"*) die \"VMID_NOT_ALLOWED_$1\" 64 ;;"},{"line":43,"text":"local vmid=\"$1\" type=\"$2\""},{"line":44,"text":"if [[ \"$type\" == \"qemu\" ]]; then qm status \"$vmid\" | awk '{print $2}'; else pct status \"$vmid\" | awk '{print $2}'; fi"},{"line":47,"text":"local vmid=\"$1\" owner type status expect_status"},{"line":48,"text":"owner=\"$(expected_owner \"$vmid\")\""},{"line":49,"text":"type=\"$(expected_type \"$vmid\")\""},{"line":50,"text":"[[ \"$HOST\" == \"$owner\" ]] || die \"OWNER_MISMATCH_${vmid}_${HOST}_EXPECTED_${owner}\" 65"},{"line":52,"text":"[[ -s \"/etc/pve/qemu-server/${vmid}.conf\" ]] || die \"QEMU_CONFIG_MISSING_$vmid\" 66"},{"line":54,"text":"[[ -s \"/etc/pve/lxc/${vmid}.conf\" ]] || die \"LXC_CONFIG_MISSING_$vmid\" 66"},{"line":56,"text":"status=\"$(current_status \"$vmid\" \"$type\")\""},{"line":57,"text":"expect_status=\"$(expected_status \"$vmid\")\""},{"line":58,"text":"[[ \"$status\" == \"$expect_status\" ]] || die \"STATUS_MISMATCH_${vmid}_${status}_EXPECTED_${expect_status}\" 66"},{"line":59,"text":"if [[ \"$vmid\" == \"160\" ]]; then [[ \"$(snapshot_count_160)\" == \"0\" ]] || die \"VM160_SNAPSHOT_COUNT_CHANGED\" 66; fi"},{"line":60,"text":"if [[ \"$vmid\" == \"9130\" ]]; then [[ \"$(vm_lock 9130)\" == \"none\" ]] || die \"VM9130_LOCK_PRESENT\" 66; fi"},{"line":65,"text":"local vmid=\"$1\" type=\"$2\" status expect_status"},{"line":66,"text":"status=\"$(current_status \"$vmid\" \"$type\")\""},{"line":67,"text":"expect_status=\"$(expected_status \"$vmid\")\""},{"line":68,"text":"[[ \"$status\" == \"$expect_status\" ]] || die \"POST_STATUS_MISMATCH_${vmid}_${status}_EXPECTED_${expect_status}\" 66"},{"line":69,"text":"if [[ \"$vmid\" == \"160\" ]]; then [[ \"$(snapshot_count_160)\" == \"0\" ]] || die \"VM160_SNAPSHOT_COUNT_CHANGED_POST\" 66; fi"},{"line":70,"text":"if [[ \"$vmid\" == \"9130\" ]]; then [[ \"$(vm_lock 9130)\" == \"none\" ]] || die \"VM9130_LOCK_PRESENT_POST\" 66; fi"},{"line":73,"text":"local vmid=\"$1\" dir=\"$STATE_ROOT/vm${vmid}\" f"},{"line":79,"text":"restore_dir(){ printf '%s\\n' \"$RESTORE_STATE_ROOT/vm$1\"; }"},{"line":80,"text":"restore_ok(){"},{"line":81,"text":"local vmid=\"$1\" gen=\"$2\" f state sha"},{"line":82,"text":"f=\"$(restore_dir \"$vmid\")/$gen.json\"; state=\"$STATE_ROOT/vm${vmid}/$gen.json\""},{"line":85,"text":"jq -e --arg l \"vm${vmid}\" --arg g \"$gen\" --arg s \"$state\" --arg sha \"$sha\" '.schema==\"homelab-vm-restore-validation-v1\" and .logical_id==$l and .generation==$g and .transport_state==\"SEALED\" and .transport_state_file==$s and .restore_source==\"Cloud A\" and .parts_manifest_verified==true and .payload_sha256==$sha and .payload_sha256_verified==true and .payload_decompression_verified==true and .proxmox_config_extract_verified==true and .archive_recovery_readback_verified==true and .bounded_staging==true and .full_local_payload_written==false and .full_restore_proven==false and .result==\"OK\"' \"$f\" >/dev/null"},{"line":88,"text":"local vmid=\"$1\" gen=\"$2\" state=\"$3\" work=\"$4\" base manifest expected_msha got_msha expected_count expected_size idx name size psha count total"},{"line":90,"text":"[[ \"$base\" == \"${REMOTE_A%/}/vm${vmid}/$gen\" ]] || die \"RESTORE_A_BASE_MISMATCH_$vmid\" 70"},{"line":92,"text":"got_msha=\"$(sha256sum \"$manifest\"|awk '{print $1}')\"; [[ \"$got_msha\" == \"$expected_msha\" ]] || die \"RESTORE_A_MANIFEST_SHA_MISMATCH_$vmid\" 70"},{"line":95,"text":"[[ \"$idx\" =~ ^[0-9]{8}$ && \"$name\" == part-????????.bin && \"$size\" =~ ^[1-9][0-9]*$ && \"$psha\" =~ ^[0-9a-f]{64}$ ]] || die \"RESTORE_A_MANIFEST_ROW_INVALID_$vmid\" 70"},{"line":96,"text":"(( size <= 536870912 )) || die \"RESTORE_A_PART_EXCEEDS_BOUND_$vmid\" 70"},{"line":97,"text":"[[ \"$idx\" == \"$(printf '%08d' \"$count\")\" ]] || die \"RESTORE_A_MANIFEST_INDEX_INVALID_$vmid\" 70"},{"line":100,"text":"[[ \"$count\" == \"$expected_count\" ]] || die \"RESTORE_A_PART_COUNT_MISMATCH_$vmid\" 70"},{"line":101,"text":"[[ \"$total\" == \"$expected_size\" ]] || die \"RESTORE_A_MANIFEST_TOTAL_SIZE_MISMATCH_$vmid\" 70"},{"line":105,"text":"local vmid=\"$1\" base=\"$2\" manifest=\"$3\" work=\"$4\" idx name size psha part actual count"},{"line":109,"text":"[[ -s \"$part\" && ! -L \"$part\" && \"$(stat -c %s \"$part\")\" == \"$size\" ]] || die \"RESTORE_A_PART_SIZE_MISMATCH_$vmid\" 70"},{"line":110,"text":"actual=\"$(sha256sum \"$part\"|awk '{print $1}')\"; [[ \"$actual\" == \"$psha\" ]] || die \"RESTORE_A_PART_SHA_MISMATCH_$vmid\" 70"},{"line":114,"text":"restore_validate(){"},{"line":115,"text":"local vmid=\"$1\" gen=\"$2\" logical state work payload_name expected_sha expected_size base manifest fifo sha_out sha_pid pipe_rc sha_rc actual_sha config config_sha members member_count cfg_member level out tmp"},{"line":116,"text":"assert_local_identity \"$vmid\"; logical=\"vm${vmid}\"; state=\"$STATE_ROOT/$logical/$gen.json\""},{"line":117,"text":"[[ -s \"$state\" && ! -L \"$state\" ]] || die \"RESTORE_STATE_MISSING_$vmid\" 65"},{"line":118,"text":"jq -e '.schema==\"homelab-cloud-quorum-payload-v1\" and .status==\"SEALED\" and .cloud_quorum==2 and .cloud_a_verified==true and .cloud_b_verified==true and .part_hashes_verified==true and .seal_written==true and .cloud_a_seal_verified==true and .cloud_b_seal_verified==true and .local_payload_present==false and .local_cleanup==\"OK\"' \"$state\" >/dev/null || die \"RESTORE_REQUIRES_STRICT_SEALED_$vmid\" 65"},{"line":119,"text":"if restore_ok \"$vmid\" \"$gen\"; then printf 'RESTORE_VALIDATION_STATUS=OK\\nVMID=%s\\nGENERATION=%s\\nRESULT=ALREADY_VALIDATED\\nRESTORE_EVIDENCE=%s\\n' \"$vmid\" \"$gen\" \"$(restore_dir \"$vmid\")/$gen.json\"; return 0; fi"},{"line":120,"text":"[[ -z \"$(active_backup_restore)\" ]] || die ACTIVE_BACKUP_RESTORE_PRESENT 75"},{"line":122,"text":"[[ \"$payload_name\" == \"vzdump-lxc-${vmid}-\"*.tar.zst || \"$payload_name\" == \"vzdump-qemu-${vmid}-\"*.vma.zst ]] || die \"RESTORE_PAYLOAD_NAME_INVALID_$vmid\" 70"},{"line":123,"text":"work=\"$RESTORE_WORK_ROOT/$logical/$gen\"; if [[ -e \"$work\" ]]; then [[ -d \"$work\" && ! -L \"$work\" ]] || die \"RESTORE_WORK_UNSAFE_$vmid\" 70; rm -rf --one-file-system \"$work\"; fi; mkdir -p \"$work\"; chmod 0700 \"$RESTORE_WORK_ROOT\" \"$RESTORE_WORK_ROOT/$logical\" \"$work\"; ACTIVE_RESTORE_STAGE=\"$work\""},{"line":124,"text":"base=\"$(prepare_cloud_a_manifest \"$vmid\" \"$gen\" \"$state\" \"$work\")\"; manifest=\"$work/PARTS.tsv\"; fifo=\"$work/archive.sha.fifo\"; sha_out=\"$work/archive.sha256\"; mkfifo -m 0600 \"$fifo\""},{"line":127,"text":"members=\"$work/members.txt\"; if stream_cloud_a \"$vmid\" \"$base\" \"$manifest\" \"$work\" | tee \"$fifo\" | zstd -dc | tar -tf - >\"$members\"; then pipe_rc=0; else pipe_rc=$?; fi"},{"line":129,"text":"if stream_cloud_a \"$vmid\" \"$base\" \"$manifest\" \"$work\" | tee \"$fifo\" | zstd -t - >/dev/null; then pipe_rc=0; else pipe_rc=$?; fi"},{"line":132,"text":"(( pipe_rc == 0 && sha_rc == 0 )) || die \"RESTORE_A_STREAM_VALIDATION_FAILED_${vmid}_${pipe_rc}_${sha_rc}\" 70"},{"line":133,"text":"actual_sha=\"$(awk 'NR==1{print $1}' \"$sha_out\")\"; [[ \"$actual_sha\" == \"$expected_sha\" ]] || die \"RESTORE_A_PAYLOAD_SHA_MISMATCH_$vmid\" 70"},{"line":136,"text":"[[ -s \"$members\" ]] || die \"RESTORE_LXC_ARCHIVE_EMPTY_$vmid\" 70"},{"line":137,"text":"awk '$0 ~ /^\\// || $0 ~ /(^|\\/)\\.\\.(\\/|$)/ {bad=1} END{exit bad}' \"$members\" || die \"RESTORE_LXC_MEMBER_UNSAFE_$vmid\" 70"},{"line":138,"text":"member_count=\"$(wc -l <\"$members\")\"; [[ \"$member_count\" =~ ^[1-9][0-9]*$ ]] || die \"RESTORE_LXC_MEMBER_COUNT_INVALID_$vmid\" 70"},{"line":139,"text":"cfg_member=\"$(awk '$0==\"./etc/vzdump/pct.conf\" || $0==\"etc/vzdump/pct.conf\" {print; exit}' \"$members\")\"; [[ -n \"$cfg_member\" ]] || die \"RESTORE_LXC_CONFIG_MEMBER_MISSING_$vmid\" 70"},{"line":140,"text":"if ( set +o pipefail; stream_cloud_a \"$vmid\" \"$base\" \"$manifest\" \"$work\" | zstd -dc | tar -xOf - \"$cfg_member\" >\"$config\" ); then :; else die \"RESTORE_LXC_CONFIG_EXTRACT_FAILED_$vmid\" 70; fi"},{"line":143,"text":"if ( set +o pipefail; stream_cloud_a \"$vmid\" \"$base\" \"$manifest\" \"$work\" | zstd -dc | vma config - >\"$config\" ); then :; else die \"RESTORE_QEMU_CONFIG_EXTRACT_FAILED_$vmid\" 70; fi"},{"line":146,"text":"[[ -s \"$config\" && ! -L \"$config\" ]] || die \"RESTORE_CONFIG_EMPTY_$vmid\" 70; config_sha=\"$(sha256sum \"$config\"|awk '{print $1}')\""},{"line":147,"text":"out=\"$(restore_dir \"$vmid\")/$gen.json\"; mkdir -p \"$(dirname \"$out\")\"; chmod 0700 \"$RESTORE_STATE_ROOT\" \"$(dirname \"$out\")\"; tmp=\"${out}.new.$$\""},{"line":148,"text":"jq -n --arg logical \"$logical\" --arg generation \"$gen\" --argjson vmid \"$vmid\" --arg vm_type \"$VM_TYPE\" --arg state \"$state\" --arg sha \"$expected_sha\" --arg config_sha \"$config_sha\" --arg level \"$level\" --argjson member_count \"$member_count\" --arg at \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\" '{schema:\"homelab-vm-restore-validation-v1\",logical_id:$logical,generation:$generation,vmid:$vmid,vm_type:$vm_type,transport_state:\"SEALED\",transport_state_file:$state,restore_source:\"Cloud A\",parts_manifest_verified:true,payload_sha256:$sha,payload_sha256_verified:true,payload_decompression_verified:true,proxmox_config_extract_verified:true,proxmox_config_sha256:$config_sha,lxc_member_count:$member_count,archive_recovery_readback_verified:true,bounded_staging:true,max_staged_part_bytes:536870912,full_local_payload_written:false,full_restore_proven:false,validation_level:$level,result:\"OK\",validated_at_utc:$at}' >\"$tmp\""},{"line":149,"text":"chmod 0600 \"$tmp\"; mv -f -- \"$tmp\" \"$out\"; rm -rf --one-file-system \"$work\"; ACTIVE_RESTORE_STAGE=\"\""},{"line":150,"text":"restore_ok \"$vmid\" \"$gen\" || die \"RESTORE_EVIDENCE_POSTWRITE_INVALID_$vmid\" 70"},{"line":151,"text":"printf 'RESTORE_VALIDATION_STATUS=OK\\nVMID=%s\\nGENERATION=%s\\nRESTORE_EVIDENCE=%s\\n' \"$vmid\" \"$gen\" \"$out\""},{"line":154,"text":"local vmid=\"$1\" owner type status"},{"line":155,"text":"assert_local_identity \"$vmid\""},{"line":156,"text":"owner=\"$(expected_owner \"$vmid\")\""},{"line":157,"text":"type=\"$(expected_type \"$vmid\")\""},{"line":158,"text":"status=\"$(expected_status \"$vmid\")\""},{"line":159,"text":"printf 'PLAN_STATUS=OK\\nVMID=%s\\nOWNER=%s\\nTYPE=%s\\nEXPECTED_STATUS=%s\\n' \"$vmid\" \"$owner\" \"$type\" \"$status\""},{"line":162,"text":"local vmid=\"$1\" generation=\"$2\""},{"line":163,"text":"assert_local_identity \"$vmid\""},{"line":164,"text":"restore_validate \"$vmid\" \"$generation\""},{"line":165,"text":"assert_post_identity \"$vmid\" \"$VM_TYPE\""},{"line":166,"text":"printf 'VERIFY_STATUS=OK\\nVMID=%s\\nGENERATION=%s\\nRESTORE_EVIDENCE=%s\\n' \"$vmid\" \"$generation\" \"$(restore_dir \"$vmid\")/$generation.json\""},{"line":168,"text":"backup_one(){"},{"line":169,"text":"local vmid=\"$1\" pending_count pending state generation payload gen_dir archive_count archive log_file before_status"},{"line":171,"text":"assert_local_identity \"$vmid\""},{"line":176,"text":"[[ -z \"$(active_backup_restore)\" ]] || die \"ACTIVE_BACKUP_RESTORE_PRESENT\" 75"},{"line":179,"text":"mapfile -t pending < <(latest_incomplete_state \"$vmid\")"},{"line":181,"text":"(( pending_count <= 1 )) || die \"MULTIPLE_INCOMPLETE_GENERATIONS_$vmid\" 65"},{"line":186,"text":"printf 'RESUME=YES\\nVMID=%s\\nGENERATION=%s\\nSTATE=%s\\n' \"$vmid\" \"$generation\" \"$state\""},{"line":187,"text":"\"$TRANSPORT\" backup-delete \"vm${vmid}\" \"$generation\" \"$payload\" \"$REMOTE_A\" \"$REMOTE_B\" \"$STATE_ROOT\""},{"line":189,"text":"generation=\"vm${vmid}-${HOST}-$(date -u +%Y%m%dT%H%M%SZ)\""},{"line":190,"text":"gen_dir=\"$STAGE_ROOT/vm${vmid}/$generation\""},{"line":195,"text":"printf 'RESUME=NO\\nVMID=%s\\nGENERATION=%s\\n' \"$vmid\" \"$generation\""},{"line":202,"text":"if ! ( umask 0022; exec vzdump \"$vmid\" \"${vzdump_args[@]}\" ) >\"$log_file\" 2>&1; then"},{"line":204,"text":"die \"VZDUMP_FAILED_$vmid\" 70"},{"line":206,"text":"mapfile -t archives < <(find \"$gen_dir\" -maxdepth 1 -type f -name \"vzdump-*-${vmid}-*.zst\" -print)"},{"line":208,"text":"[[ \"$archive_count\" == \"1\" ]] || { rm -rf -- \"$gen_dir\"; die \"VZDUMP_ARCHIVE_COUNT_${vmid}_${archive_count}\" 70; }"},{"line":210,"text":"[[ -s \"$archive\" && ! -L \"$archive\" ]] || die \"VZDUMP_ARCHIVE_UNSAFE_$vmid\" 70"},{"line":212,"text":"\"$TRANSPORT\" backup-delete \"vm${vmid}\" \"$generation\" \"$archive\" \"$REMOTE_A\" \"$REMOTE_B\" \"$STATE_ROOT\""},{"line":215,"text":"rmdir -- \"$STAGE_ROOT/vm${vmid}\" 2>/dev/null || true"},{"line":217,"text":"assert_post_identity \"$vmid\" \"$VM_TYPE\""},{"line":218,"text":"state=\"$STATE_ROOT/vm${vmid}/$generation.json\""},{"line":220,"text":"restore_validate \"$vmid\" \"$generation\""},{"line":221,"text":"printf 'BACKUP_STATUS=SEALED\\nVMID=%s\\nGENERATION=%s\\nOWNER=%s\\nTYPE=%s\\nPOST_STATUS=%s\\nRESTORE_EVIDENCE=%s\\n' \"$vmid\" \"$generation\" \"$HOST\" \"$VM_TYPE\" \"$(expected_status \"$vmid\")\" \"$(restore_dir \"$vmid\")/$generation.json\""},{"line":226,"text":"[[ -z \"$(active_backup_restore)\" ]] || die \"ACTIVE_BACKUP_RESTORE_PRESENT\" 75"},{"line":231,"text":"printf 'HOST_PREFLIGHT_STATUS=OK\\nHOST=%s\\nSTAGING_FREE_BYTES=%s\\nREMOTE_A_FREE_BYTES=%s\\nREMOTE_B_FREE_BYTES=%s\\nACTIVE_BACKUP_RESTORE=0\\n' \"$HOST\" \"$free\" \"$a_free\" \"$b_free\""},{"line":234,"text":"local vmid=\"$1\" dir latest gen"},{"line":235,"text":"assert_local_identity \"$vmid\"; dir=\"$STATE_ROOT/vm${vmid}\""},{"line":236,"text":"[[ -d \"$dir\" ]] || die \"STATE_DIR_MISSING_$vmid\" 65"},{"line":238,"text":"[[ -n \"$latest\" && -s \"$latest\" && ! -L \"$latest\" ]] || die \"LATEST_STATE_MISSING_$vmid\" 65"},{"line":239,"text":"jq -e '.status==\"SEALED\" and .cloud_quorum==2 and .local_payload_present==false and .local_cleanup==\"OK\" and .seal_written==true' \"$latest\" >/dev/null || die \"LATEST_STATE_NOT_SEALED_$vmid\" 65"},{"line":240,"text":"gen=\"$(jq -er '.generation' \"$latest\")\"; restore_ok \"$vmid\" \"$gen\" || die \"LATEST_RESTORE_NOT_OK_$vmid\" 65"},{"line":241,"text":"printf 'LATEST_SEALED_STATUS=OK\\nVMID=%s\\nGENERATION=%s\\nSTATE_FILE=%s\\nRESTORE_EVIDENCE=%s\\n' \"$vmid\" \"$gen\" \"$latest\" \"$(restore_dir \"$vmid\")/$gen.json\""},{"line":244,"text":"case \"$ACTION\" in"},{"line":246,"text":"[[ \"$#\" == 1 ]] || die \"USAGE_HOST_PREFLIGHT\" 64"},{"line":249,"text":"latest-sealed)"},{"line":250,"text":"[[ \"$#\" == 2 ]] || die \"USAGE_LATEST_SEALED\" 64"},{"line":254,"text":"[[ \"$#\" == 2 ]] || die \"USAGE_PLAN\" 64"},{"line":257,"text":"backup)"},{"line":258,"text":"[[ \"$#\" == 2 ]] || die \"USAGE_BACKUP\" 64"},{"line":259,"text":"backup_one \"$2\""},{"line":261,"text":"restore-validate)"},{"line":262,"text":"[[ \"$#\" == 3 ]] || die \"USAGE_RESTORE_VALIDATE\" 64"},{"line":263,"text":"restore_validate \"$2\" \"$3\""},{"line":266,"text":"[[ \"$#\" == 3 ]] || die \"USAGE_VERIFY\" 64"}] -NODEWORKER_CLI_CANDIDATES=[{"kind":"dispatch","text":"case \"$1\" in"},{"kind":"subcommand-token","text":"backup"},{"kind":"subcommand-token","text":"restore"},{"kind":"subcommand-token","text":"latest-sealed"}] -DECISION=DIRECT_NODEWORKER_TARGETED_BACKUP_CLI_DISCOVERED -NO_MUTATION=true -TASK_RESULT=PASS_HOMELAB_BACKUP_NODEWORKER_CONTRACT_RCA_READONLY -HOMELAB_RESULT_CONTRACT={"changes_made":false,"command_id":"SUPPORT-260921-HOMELAB-BACKUP-NODEWORKER-CONTRACT-RCA-READONLY-1104R1","rollback_restored":null,"rollback_started":false,"status":"OK","version":1} -WORKERS2_NODEWORKER_CONTRACT_RCA_END=1 +PVEPRO896_BEGIN=true +COMMAND_ID=SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-HASH-NORMALIZATION-READONLY-896R1 +SCOPE=READ_ONLY_BATCH_C_HISTORICAL_HASH_NORMALIZATION_RECONCILE +AUTHORITY={"ERROR_REGISTER":{"bytes":302058,"expected_sha256":"3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0","match":true,"sha256":"3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0"},"REFERENCE":{"bytes":201129,"expected_sha256":"5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66","match":true,"sha256":"5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66"}} +PRODUCTION_HOST={"name":"pvepro-prod","node":"pve01","status":"running","vmid":100} +QGA_TRANSPORT={"rc":0,"stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} +QGA_CONTRACT={"err_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","err_truncated":null,"exitcode":0,"exited":1,"out_truncated":0} +HASH_NORMALIZATION_RECONCILE={"historical_chars_match_9of9":false,"historical_whitespace_words_match_9of9":true,"reason":"HISTORICAL_PROVENANCE_UNRESOLVED","result":"HOLD","target_ids":[31,32,33,34,35,36,37,38,39],"targets":[{"alpha_num_words":103,"candidate_hashes":{"cp1251":"5134669d3dab1dc310f385686922a72606d75998261ce5d38e50f79cd5062f1d","html_escape_utf8":"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f","json_ascii_no_quotes":"9c19120a513eee9742f043bb663fa43058621df4863a4ff6413fa715f12b1981","json_ascii_with_quotes":"7bf0d2da56a30f5a025e35c04297a2a234e8da93acd99ed973675149e59871d3","json_utf8_with_quotes":"31355ca8644aa5ba83d58e0f7f33d36028e0d88c6f13c513f5eba6f5a19d9c8d","lf_strip_utf8":"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f","lf_utf8":"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f","nfc_utf8":"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f","nfd_utf8":"0c3e5499fa0e2283580a6829f463f04be5a8949bffafc98def5e5378cafe9f4c","nfkc_utf8":"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f","nfkd_utf8":"0c3e5499fa0e2283580a6829f463f04be5a8949bffafc98def5e5378cafe9f4c","raw_utf8":"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f","rstrip_utf8":"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f","strip_utf8":"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f","utf16be":"cee879691dac35f38898e72ff2891d9785559a4ac212fc8bbda42ce7c5fa77d5","utf16le":"17b289bcc72aff901fc98e8f4ec096579645f66d6afff2fa4712de7bb298b040","utf8_as_latin1_then_utf8":"c22692f00a105b5a8926aae764251fc7bc140ac045a6f02bcf18ff414fe9f79b"},"first_post_id":31,"forum":"PVEPro AI Lab","historical_719":{"chars":731,"sha256":"aba65fce05dad18fd302c9486d96c5845ede9e883b6c9138fcf4896ba7d59145","words":83},"historical_chars_match":false,"historical_whitespace_words_match":true,"line_count":19,"matching_hash_transforms":[],"node_id":15,"raw_bytes":1110,"raw_sha256":"77eb0d8dddbb8572e8505482510e6b1687b16dca869ceb056e468dc193eab11f","regex_w_words":103,"reply_count":0,"sticky":0,"thread_id":31,"title":"[Private AI] RAG \u043f\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c \u0440\u0435\u0433\u043b\u0430\u043c\u0435\u043d\u0442\u0430\u043c","unicode_chars":737,"whitespace_words":83},{"alpha_num_words":103,"candidate_hashes":{"cp1251":"c24bf16ee0d86b316fc880c5d226f56cc3bfd9ae488bb694e2282e0a93ab16ce","html_escape_utf8":"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a","json_ascii_no_quotes":"6a0c95802d884f0c356c6d74d925fef2df7ead4f741e0327b2fe6fd8b237e63e","json_ascii_with_quotes":"7b55d924074451eddc041a30309cf89147a873206d7dcdb15a9805dc932140a1","json_utf8_with_quotes":"8b969beffb5b6976465ced85957532ca134c1084a563d8a3c5d5543e31477ddb","lf_strip_utf8":"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a","lf_utf8":"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a","nfc_utf8":"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a","nfd_utf8":"cdfd83f891d6869f1d6aa974b3c71f27c9c84ead3fe4f10ed526ab502d79c63a","nfkc_utf8":"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a","nfkd_utf8":"cdfd83f891d6869f1d6aa974b3c71f27c9c84ead3fe4f10ed526ab502d79c63a","raw_utf8":"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a","rstrip_utf8":"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a","strip_utf8":"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a","utf16be":"1d0970f69c718a9575d75723b148d0d3ee89cb6d6fa8372ffa628ff1aa4c0066","utf16le":"23e482fec9c59494e7ee78cc803b0106c17955ce9b42aec547df35f8863d36a4","utf8_as_cp1251_then_utf8":"ebf18c1278e9f1e54bde685ccd299b62db933ed7fbe2f6948536e87124ba766b","utf8_as_latin1_then_utf8":"a37563ec0b60616c37fc7504edf7f5772cad00f6ec5bad4525e1d95a928cf9fd"},"first_post_id":32,"forum":"PVEPro AI Lab","historical_719":{"chars":717,"sha256":"66329dfcce09a3f655f25f67045a5528b838614eb43ad29b88f3288602e21fcb","words":84},"historical_chars_match":false,"historical_whitespace_words_match":true,"line_count":19,"matching_hash_transforms":[],"node_id":15,"raw_bytes":1086,"raw_sha256":"885e34789f0d6687e868646e0cc876ccc0b3bbfa4644e616d5c9e8854bbf754a","regex_w_words":103,"reply_count":0,"sticky":0,"thread_id":32,"title":"[Private AI] \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0442\u0440\u0430\u043d\u0441\u043a\u0440\u0438\u0431\u0430\u0446\u0438\u044f \u0432\u0441\u0442\u0440\u0435\u0447","unicode_chars":723,"whitespace_words":84},{"alpha_num_words":109,"candidate_hashes":{"cp1251":"f35f37b0d32183d47f6e538f65f5cf6f84034ea752a4167b03bebf5a5e3b1f45","html_escape_utf8":"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10","json_ascii_no_quotes":"0da0d8bfb5ef49739cae4d91eca10551f170dd473a66752fbdc9fd93f796aa76","json_ascii_with_quotes":"75c19bd25dbb8250d225e57dd2b7aeca462b4505373a1eeb832223b16474f798","json_utf8_with_quotes":"7ecf4bc796af2597e36d7178bfe265b784ba608703629f44b0e51229be13fa45","lf_strip_utf8":"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10","lf_utf8":"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10","nfc_utf8":"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10","nfd_utf8":"aa77f3348fe4f7ecf75817fb15e087ecfe84aaf735dcd0da6260b1430664057a","nfkc_utf8":"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10","nfkd_utf8":"aa77f3348fe4f7ecf75817fb15e087ecfe84aaf735dcd0da6260b1430664057a","raw_utf8":"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10","rstrip_utf8":"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10","strip_utf8":"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10","utf16be":"79aff08627de4de35ad1b9866f77819c6ffe8780c088960aa093e88d29ba1b42","utf16le":"fe291ad206f2b53b367ec5a2128244cb119efc4c627deeabdede2b05fc708f42","utf8_as_cp1251_then_utf8":"8848dde4fe089434db6fd0c5b56002100487bf6ff69e624fae3fa7724b6d332e","utf8_as_latin1_then_utf8":"410c4e8a5f967063aa973efdb4cd3fa74a4e20637d0eb06ed9e572fc88023559"},"first_post_id":33,"forum":"PVEPro AI Lab","historical_719":{"chars":750,"sha256":"ade466868849f37253f6eb05e1c71f7466e6c26a3db05119ab56c73a580202a6","words":91},"historical_chars_match":false,"historical_whitespace_words_match":true,"line_count":19,"matching_hash_transforms":[],"node_id":15,"raw_bytes":1148,"raw_sha256":"a285b5002a8a44e065ea0112d9793dc8e76bb76cdb75ccdd247eafabb5ff3d10","regex_w_words":109,"reply_count":0,"sticky":0,"thread_id":33,"title":"[Private AI] \u0410\u0433\u0435\u043d\u0442 \u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043a CRM","unicode_chars":756,"whitespace_words":91},{"alpha_num_words":102,"candidate_hashes":{"cp1251":"1035007641b2c5fd58d5a38f296f4a80aab4f86803d76a44b27cf364ca78691c","html_escape_utf8":"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade","json_ascii_no_quotes":"45e10faf31cd49a828c9c534279521e2a0bbc7dfbbe512696aa348d2381189d0","json_ascii_with_quotes":"5f44ed4756d6cb52ac7150da971087568a723629b186f7c4a720c79748bba51c","json_utf8_with_quotes":"faa0be19c161b80dab86800711febdb0ff196434c009abd4f022168bc9214aec","lf_strip_utf8":"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade","lf_utf8":"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade","nfc_utf8":"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade","nfd_utf8":"b59124306fbc0ae8cbff9ba2242775d3d7bba83271762820b3e88664fb3f5705","nfkc_utf8":"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade","nfkd_utf8":"b59124306fbc0ae8cbff9ba2242775d3d7bba83271762820b3e88664fb3f5705","raw_utf8":"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade","rstrip_utf8":"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade","strip_utf8":"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade","utf16be":"386544c3aa749fff8d4be3936114cd46aa6f3a87fae0314136a35900a118c6da","utf16le":"baafe68dd6e74d1c849f5f576c0c49de2439f3ca198cf0b387b4ee2048e29a70","utf8_as_cp1251_then_utf8":"23fb7d7fd2a7d19b2ed450f29a2719dc0d9a1d4cdb2f25c1becc741f529a2a16","utf8_as_latin1_then_utf8":"fd20390f688aa44003137b719e8b54db1d8e0093707f771707fb342e48c0c2fb"},"first_post_id":34,"forum":"\u0416\u0435\u043b\u0435\u0437\u043e \u0438 \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0438","historical_719":{"chars":701,"sha256":"31accb654aa518f680f9dca2f043342094d2158ddf4704f4233cef35f43c5cda","words":81},"historical_chars_match":false,"historical_whitespace_words_match":true,"line_count":19,"matching_hash_transforms":[],"node_id":16,"raw_bytes":1098,"raw_sha256":"c581081307771904d3f85708cec0108301333a40d8cb9b4ce1e14948f830bade","regex_w_words":102,"reply_count":0,"sticky":0,"thread_id":34,"title":"[\u041f\u043b\u043e\u0449\u0430\u0434\u043a\u0430] Mini-PC cluster vs tower server","unicode_chars":707,"whitespace_words":81},{"alpha_num_words":96,"candidate_hashes":{"cp1251":"078475078bc0d769b65df050d02d63f227e9ec710a55160e24707c03257c6a17","html_escape_utf8":"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6","json_ascii_no_quotes":"34f593080587784b4efe1d73f9badd5325c91b3b5075b15fefa40043dadf33be","json_ascii_with_quotes":"93a61713045e092f9da99f5fbf6e66d3c066b15230c5db74b524b6412f88c1ca","json_utf8_with_quotes":"0271e84c660ed5b34c8c34ddc65d98abacdc64b58a1007bf12d3ba9b4c86fb61","lf_strip_utf8":"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6","lf_utf8":"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6","nfc_utf8":"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6","nfd_utf8":"939f61bdb2796d868afa2f6c112bef1f0633f305d57b8f4343d53012ea44f91d","nfkc_utf8":"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6","nfkd_utf8":"939f61bdb2796d868afa2f6c112bef1f0633f305d57b8f4343d53012ea44f91d","raw_utf8":"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6","rstrip_utf8":"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6","strip_utf8":"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6","utf16be":"802de01f22a143d88631f71a9babbe04399dbe7c4d4d9dbddd24a41ea7c8bb2c","utf16le":"6bd4edb76c9fc443ac7519c5032c9541b6cbc38150965efcc487959a9e2b0fe1","utf8_as_cp1251_then_utf8":"0081bc78836cd9fee7f2f4f76065b9479fc7cfcbe52271509a5fffdb8aa4f91f","utf8_as_latin1_then_utf8":"9e3cb9c0e0038d558d8c8d68e953e3c58ce0a2663bc0673af8c9ab9dbcccd8a4"},"first_post_id":35,"forum":"\u0416\u0435\u043b\u0435\u0437\u043e \u0438 \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0438","historical_719":{"chars":673,"sha256":"c8a1a0db8103ad40279d271c8006e3d1dadee6507730ba30155cc97dbe96383d","words":77},"historical_chars_match":false,"historical_whitespace_words_match":true,"line_count":19,"matching_hash_transforms":[],"node_id":16,"raw_bytes":991,"raw_sha256":"b8b03940eb362591b342bff82194771fd2af23b14b4a10c911e57754d12439a6","regex_w_words":96,"reply_count":0,"sticky":0,"thread_id":35,"title":"[\u041f\u043b\u043e\u0449\u0430\u0434\u043a\u0430] NVMe mirror vs RAIDZ","unicode_chars":679,"whitespace_words":77},{"alpha_num_words":105,"candidate_hashes":{"cp1251":"f96a9a6084ebd376f3d5b44eab4922a38acf29ef588704e5c75f8acff15e5148","html_escape_utf8":"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26","json_ascii_no_quotes":"0414e33d9ef94f8971d60329d0627fc86d84377a60256dcddc84173ff09020d3","json_ascii_with_quotes":"3d78dba3115b08d1938ae58b4db5c7321012c7775d7c8e23b3457b8a73974811","json_utf8_with_quotes":"06b7bf9c21fcad49f16b32e06670f249f90c137c5e2734748a5a68a11c054385","lf_strip_utf8":"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26","lf_utf8":"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26","nfc_utf8":"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26","nfd_utf8":"f0c6433c0b77b9883f82412d4f93a283568ca1a668484a55bb2c7565c63d9c28","nfkc_utf8":"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26","nfkd_utf8":"f0c6433c0b77b9883f82412d4f93a283568ca1a668484a55bb2c7565c63d9c28","raw_utf8":"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26","rstrip_utf8":"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26","strip_utf8":"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26","utf16be":"f124c8be21fe8009f6391e09450c9ccd2f99a60d570187e8688750a384758e6e","utf16le":"7f1b9e73d05f3eaebac32643fee1bffc95e7919289c556b4b800f4e43df443f3","utf8_as_cp1251_then_utf8":"f195fcb1adfa9b987f5bc3ff89ba45e31b1639231b6a7b11d2084396a5567dd2","utf8_as_latin1_then_utf8":"fef2032e23fea3eb96bbf2c16704528167a5fb226597e9d9a6b8f375e2baee74"},"first_post_id":36,"forum":"\u0416\u0435\u043b\u0435\u0437\u043e \u0438 \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0438","historical_719":{"chars":754,"sha256":"e90d204f73c7ee5ad1ffb7f227f1cdd64bad69f5fa978f078b79ac89045ae287","words":84},"historical_chars_match":false,"historical_whitespace_words_match":true,"line_count":19,"matching_hash_transforms":[],"node_id":16,"raw_bytes":1166,"raw_sha256":"f00642728aeeb7161278b33a29280cde6aea4ae444517fac203d9380ed1c1b26","regex_w_words":105,"reply_count":0,"sticky":0,"thread_id":36,"title":"[\u041f\u043b\u043e\u0449\u0430\u0434\u043a\u0430] \u041f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u043e\u0441\u0442\u044c home-lab \u2192 hosting/cloud","unicode_chars":760,"whitespace_words":84},{"alpha_num_words":104,"candidate_hashes":{"cp1251":"3c0834afd170b5036587ed42f144f9c7fc0ac73f20551624fd6b17b366ca7617","html_escape_utf8":"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d","json_ascii_no_quotes":"f83b7f0525738433d91811da4d39dbebcb1785e74847e0517a334e4b126a3077","json_ascii_with_quotes":"40530cf7e3fdb755cd732b3176ec1a8e5a35a613b943aad64fd34c7dcd3dafc5","json_utf8_with_quotes":"5bc1902ce7eb6a6f1b58d4f3ba40f0be79c0e326ca47de972e006a3342c2cf11","lf_strip_utf8":"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d","lf_utf8":"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d","nfc_utf8":"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d","nfd_utf8":"3357f1f364d4c47e7cd6234defcd18a3271a30ecb2b8b48eb0d64bda980a54c9","nfkc_utf8":"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d","nfkd_utf8":"3357f1f364d4c47e7cd6234defcd18a3271a30ecb2b8b48eb0d64bda980a54c9","raw_utf8":"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d","rstrip_utf8":"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d","strip_utf8":"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d","utf16be":"2c9c6877a1c67edbe9987404174be06c073ef78c9acfdebc6577932cb03146c4","utf16le":"8683e980d45c470ce4fbbbf98b799d8266af4e583d65e6ac4d5e2a05616d2735","utf8_as_latin1_then_utf8":"cd96abe35a09b7b221cf21f6afac3278ba21bc89414c0812660120edf7da4c2a"},"first_post_id":37,"forum":"\u0417\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435","historical_719":{"chars":737,"sha256":"17c2a8f3e11adff49fdd2c2184b0286796dca4dde755b06b9ee75f1ede52e3c1","words":85},"historical_chars_match":false,"historical_whitespace_words_match":true,"line_count":19,"matching_hash_transforms":[],"node_id":17,"raw_bytes":1167,"raw_sha256":"37506a062bae4eae7a46a9e8881718dfacae1469fca5576e9bcdc4cbcfe9fa2d","regex_w_words":104,"reply_count":0,"sticky":0,"thread_id":37,"title":"[\u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u0440\u043e\u0441\u0430] \u0410\u0443\u0434\u0438\u0442 backup \u0437\u0430 \u043e\u0434\u0438\u043d \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0434\u0435\u043d\u044c","unicode_chars":743,"whitespace_words":85},{"alpha_num_words":99,"candidate_hashes":{"cp1251":"60a9aed8da02b6c567d958d80bfbabe9894b3345558a1a0f0ac8c8ad8c338cb2","html_escape_utf8":"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55","json_ascii_no_quotes":"4949d4b9bed3b145b0db8b13c197d15c719f0d9d7593dddd31822f8a92f50ef3","json_ascii_with_quotes":"47d7186333f0e98422d85c2f5cd0e20cc6e06a1a59ddde70cad79fd80b7e8f5a","json_utf8_with_quotes":"f0f402605737920bd4be0901f1000ad0f40245fbdbb9689983b6704c37bf9a21","lf_strip_utf8":"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55","lf_utf8":"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55","nfc_utf8":"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55","nfd_utf8":"ba7f72e513c3dcaf1fcea5438187ff06d3f1cc63981149f6607486e096da7309","nfkc_utf8":"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55","nfkd_utf8":"ba7f72e513c3dcaf1fcea5438187ff06d3f1cc63981149f6607486e096da7309","raw_utf8":"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55","rstrip_utf8":"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55","strip_utf8":"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55","utf16be":"f3621a73fb4c06b33cb74f0f1f574ede8aaf3870f51018c00c382b2b5ee45ea8","utf16le":"43f9fde40d974604b8e6eed59270fc876ea178663a5f0dc22a287dfdc275ec98","utf8_as_cp1251_then_utf8":"e80341e1d9bbb5441ba93bd5d6a5b4b31d54ecd58be0577deb0a76bcc4226e47","utf8_as_latin1_then_utf8":"0a2d9b9a5eacf3073431c49ff1d157d4b1149ba8726c808a1a0a7e8f7400d2df"},"first_post_id":38,"forum":"\u0417\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435","historical_719":{"chars":714,"sha256":"7b86c826cf409f59d38de25ad742d7c14bcfbdf567410e5087aacc3cd91b603a","words":82},"historical_chars_match":false,"historical_whitespace_words_match":true,"line_count":19,"matching_hash_transforms":[],"node_id":17,"raw_bytes":1090,"raw_sha256":"5bd7a3f500588b6aebc761aadb990e743c9462c65839181cb37a9c905d091d55","regex_w_words":99,"reply_count":0,"sticky":0,"thread_id":38,"title":"[\u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u0440\u043e\u0441\u0430] Private AI \u0434\u043b\u044f 20 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432","unicode_chars":720,"whitespace_words":82},{"alpha_num_words":98,"candidate_hashes":{"cp1251":"9b91d7a785b6a058d834199c609d904b2ad2e5b89c1dc3cd8e69359824208f62","html_escape_utf8":"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82","json_ascii_no_quotes":"63be89f8a369df917685c6c9d5ca09950998d64ab7e5cdd856c8837e95418b1e","json_ascii_with_quotes":"7227207363ab89e29da7d98753756920a273fb58bb26fa6df9e875a21caacdb0","json_utf8_with_quotes":"5efb2900be1ac8becab0ce0af0399f33b779e213d9a35c823e1a581ef4c6f136","lf_strip_utf8":"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82","lf_utf8":"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82","nfc_utf8":"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82","nfd_utf8":"c53137df64a98adb36bfaacedb43bc9f13516cc486d028e4abb6ae0e418fc595","nfkc_utf8":"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82","nfkd_utf8":"c53137df64a98adb36bfaacedb43bc9f13516cc486d028e4abb6ae0e418fc595","raw_utf8":"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82","rstrip_utf8":"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82","strip_utf8":"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82","utf16be":"becf36e549c4393c2c414f720d5b54114d8912a3458423ec54c1bb1b7c9f7685","utf16le":"60e00b06b8c0422d2faee49091830a8aeb478a78c0a1df826fc194235e61065d","utf8_as_cp1251_then_utf8":"5a14a388f3293c86e3c6814f006b9faee53cb3769e288f0bd12f503815ea1dc6","utf8_as_latin1_then_utf8":"0564ad394b1e4cb227020e705e7d28802dafb5c240610fb3dbf5203f7f88e066"},"first_post_id":39,"forum":"\u042d\u043a\u0441\u043f\u0435\u0440\u0442\u044b PVEPro","historical_719":{"chars":690,"sha256":"f9fe92236122229693a8fe5f10b7c0810079c4bb74ed7f82a44182e7faa64036","words":78},"historical_chars_match":false,"historical_whitespace_words_match":true,"line_count":19,"matching_hash_transforms":[],"node_id":18,"raw_bytes":1083,"raw_sha256":"a82379a4e00fd32ed9b5682321d8c5102bea3fc02d2e2ac2447ac668364fdc82","regex_w_words":98,"reply_count":0,"sticky":0,"thread_id":39,"title":"[\u042d\u043a\u0441\u043f\u0435\u0440\u0442] \u041a\u0430\u043a \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u0435\u0442\u0435\u043d\u0446\u0438\u0438 \u0431\u0435\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043b\u043e\u0433\u043e\u0442\u0438\u043f\u043e\u0432","unicode_chars":696,"whitespace_words":78}],"uniform_hash_transforms":[]} +PRODUCT_CHECKPOINTS_REMAINING=8 +CHECKPOINTS13_14_REMAIN_OPEN=true +TASK_RESULT=HOLD_PVEPRO896_BATCH_C_PROVENANCE_UNRESOLVED +DECISION=HOLD_PVEPRO896_BATCH_C_PROVENANCE_UNRESOLVED +NEXT_GATE=RECONCILE_ONLY_PVEPRO_BATCH_C_PROVENANCE +CHANGES_MADE_BY_896=false +PRODUCT_MUTATION_BY_896=false +VM_MUTATION_BY_896=false +HOMELAB_RESULT_CONTRACT={"changes_made":false,"command_id":"SUPPORT-260921-PVEPRO-EDITORIAL-BATCH-C-HASH-NORMALIZATION-READONLY-896R1","rollback_restored":null,"rollback_started":false,"status":"OK","version":1} +PVEPRO896_END=true OUTPUT_END CHAT_OUTPUT_END