diff --git a/runtime/history/CLUSTER-REFERENCE-STATE-AUDIT-149.json b/runtime/history/CLUSTER-REFERENCE-STATE-AUDIT-149.json new file mode 100644 index 0000000..a855d35 --- /dev/null +++ b/runtime/history/CLUSTER-REFERENCE-STATE-AUDIT-149.json @@ -0,0 +1,30 @@ +{ + "schema_version": 1, + "channel": "homelab-runtime", + "command_id": "CLUSTER-REFERENCE-STATE-AUDIT-149", + "status": "OK", + "rc": 0, + "host": "pve01", + "mode": "read-only", + "component": "cluster-audit", + "started_at_utc": "2026-07-22T07:25:10Z", + "finished_at_utc": "2026-07-22T07:25:13Z", + "reference_register_checked": true, + "reference_sha256": "5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e", + "error_register_checked": true, + "error_register_sha256": "08b3a769b8e38eaa1acec915352fb328180d70caa7ff6cd9d1ec0da426262752", + "command_sha256": "2af6ffbc1ab71f8fd13302a48794faa713dfcde5a4c90652ace8ab2355e3c2e4", + "duplicate_failed_command_blocked": false, + "block_reason": null, + "execution_started": true, + "changes_made": false, + "sanitized": true, + "secrets_included": false, + "private_addresses_included": false, + "raw_evidence_retained_locally": true, + "raw_evidence_sha256": "8fda57d15c1339215b841cef0152a9d2ff5e74b8ecb22d0a7b22050900061148", + "sanitized_output_sha256": "c5ff5c4350fa2306f6847ecfe42105b46c49aa92a065610327cb1a9f0e9498bc", + "output_truncated_in_json": false, + "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", + "output": "=== IMMUTABLE_COMMAND_RESULTS ===\n--- COMMAND_ID=CLUSTER-REFERENCE-MODE-CONFIRM-145 ---\nJSON_COMMIT=072668fbc56c580756f0ad7a6a30e4a6af953794\nSTATUS=OK\nRC=0\nREASON=None\nEXECUTION_STARTED=True\nDUPLICATE_BLOCKED=False\nTXT_COMMIT=072668fbc56c580756f0ad7a6a30e4a6af953794\nVALID_MODES=change,read-only,transport-test,verify\nSAFE_WRITE_MODE=UNRESOLVED\nCLUSTER_REFERENCE_MODE_CONFIRM=COMPLETE\nERROR_REGISTERED=no\n--- COMMAND_ID=CLUSTER-REFERENCE-FRAMEWORK-146 ---\nJSON_HISTORY=MISSING\nTXT_HISTORY=MISSING\nERROR_REGISTERED=no\n--- COMMAND_ID=CLUSTER-REFERENCE-SOURCE-AUDIT-147 ---\nJSON_COMMIT=4ef5989856165ac24b02ba54455d3782e16a7cae\nSTATUS=FAIL\nRC=22\nREASON=None\nEXECUTION_STARTED=True\nDUPLICATE_BLOCKED=False\nTXT_COMMIT=4ef5989856165ac24b02ba54455d3782e16a7cae\nERROR_REGISTERED=no\n--- COMMAND_ID=CLUSTER-REFERENCE-FOUNDATION-148 ---\nJSON_HISTORY=MISSING\nTXT_HISTORY=MISSING\nERROR_REGISTERED=no\n=== RUNNER_MODE_RULES ===\n3-umask 077\n4-\n5-usage() {\n6- cat >&2 <<'USAGE'\n7-Usage:\n8- homelab-chat-run COMMAND_ID MODE COMPONENT -- command [arguments...]\n9-\n10-MODE:\n11: read-only\n12- verify\n13: change\n14- transport-test\n15-\n16-Environment:\n17- HOMELAB_ALLOW_REPEAT=1 Allow exact repeat of a previously failed command.\n18- HOMELAB_TIMEOUT=SECONDS Optional command timeout.\n19-USAGE\n20- exit 64\n21-}\n22-\n23-[ \"$#\" -ge 5 ] || usage\n24-\n25-COMMAND_ID=\"$1\"\n26-MODE=\"$2\"\n27-COMPONENT=\"$3\"\n28-shift 3\n29-\n30-[ \"${1:-}\" = '--' ] || usage\n31-shift\n32-[ \"$#\" -ge 1 ] || usage\n33-\n--\n43- ''|*[!A-Za-z0-9._-]*)\n44- echo 'RESULT=FAIL'\n45- echo 'REASON=INVALID_COMPONENT'\n46- exit 66\n47- ;;\n48-esac\n49-\n50-case \"$MODE\" in\n51: read-only|verify|change|transport-test)\n52- ;;\n53- *)\n54- echo 'RESULT=FAIL'\n55: echo 'REASON=INVALID_MODE'\n56- exit 67\n57- ;;\n58-esac\n59-\n60-for TOOL in \\\n61- awk \\\n62- curl \\\n63- flock \\\n64- python3 \\\n65- scp \\\n66- sha256sum \\\n67- ssh\n68-do\n69- command -v \"$TOOL\" >/dev/null 2>&1 || {\n70- echo 'RESULT=FAIL'\n71- echo \"REASON=REQUIRED_TOOL_MISSING:$TOOL\"\n72- exit 68\n73- }\n74-done\n75-\n--\n139- print value\n140- }\n141- ' \"$LEDGER\"\n142-)\"\n143-\n144-RUN_STARTED=true\n145-REPEAT_BLOCKED=false\n146-BLOCK_REASON=''\n147:CHANGES_MADE=false\n148-\n149-case \"$MODE\" in\n150: change)\n151: CHANGES_MADE=true\n152- ;;\n153-esac\n154-\n155-if [ -n \"$PREVIOUS_FAILED_RC\" ] &&\n156- [ \"${HOMELAB_ALLOW_REPEAT:-0}\" != 1 ]; then\n157-\n158- RUN_STARTED=false\n159- REPEAT_BLOCKED=true\n160- BLOCK_REASON='EXACT_FAILED_COMMAND_REPEAT'\n161- RC=73\n162- STATUS='BLOCKED'\n163-\n164- {\n165- echo 'COMMAND_EXECUTION_BLOCKED=yes'\n166- echo 'REASON=EXACT_FAILED_COMMAND_REPEAT'\n167- echo \"PREVIOUS_RC=$PREVIOUS_FAILED_RC\"\n168- echo \"COMMAND_SHA256=$COMMAND_SHA256\"\n169- echo\n170- echo 'Set HOMELAB_ALLOW_REPEAT=1 only after reviewing the previous failure.'\n171- } >\"$RAW_FILE\"\n--\n298- text = (\n299- first\n300- + \"\\n\\n\"\n301- + \"===== PUBLIC OUTPUT TRUNCATED; FULL RAW LOG RETAINED LOCALLY =====\"\n302- + \"\\n\\n\"\n303- + last\n304- )\n305-\n306:target.write_text(text, encoding=\"utf-8\")\n307-PY\n308-\n309-SANITIZED_SHA256=\"$(\n310- sha256sum \"$SANITIZED_FILE\" |\n311- awk '{print $1}'\n312-)\"\n313-\n314-python3 - \\\n315- \"$JSON_FILE\" \\\n316- \"$SANITIZED_FILE\" \\\n317- \"$COMMAND_ID\" \\\n318- \"$STATUS\" \\\n319- \"$RC\" \\\n320- \"$HOST_SHORT\" \\\n321- \"$MODE\" \\\n322- \"$COMPONENT\" \\\n323- \"$STARTED_AT\" \\\n324- \"$FINISHED_AT\" \\\n325- \"$REFERENCE_SHA256\" \\\n326- \"$ERROR_REGISTER_SHA256\" \\\n327- \"$COMMAND_SHA256\" \\\n328- \"$RAW_SHA256\" \\\n329- \"$SANITIZED_SHA256\" \\\n330- \"$RUN_STARTED\" \\\n331- \"$REPEAT_BLOCKED\" \\\n332- \"$BLOCK_REASON\" \\\n333: \"$CHANGES_MADE\" <<'PY'\n334-import json\n335-import sys\n336-from pathlib import Path\n337-\n338-(\n339- json_path,\n340- output_path,\n341- command_id,\n342- status,\n343- rc,\n344- host,\n345- mode,\n346- component,\n347- started,\n348- finished,\n349- reference_sha,\n350- error_sha,\n351- command_sha,\n352- raw_sha,\n353- sanitized_sha,\n354- run_started,\n355- repeat_blocked,\n356- block_reason,\n357: changes_made,\n358-) = sys.argv[1:]\n359-\n360-output = Path(output_path).read_text(\n361- encoding=\"utf-8\",\n362- errors=\"replace\",\n363-)\n364-\n365-encoded = output.encode(\"utf-8\")\n366-json_limit = 300_000\n367-output_truncated = len(encoded) > json_limit\n368-\n369-if output_truncated:\n370- output_preview = encoded[:json_limit].decode(\n371- \"utf-8\",\n372- errors=\"ignore\",\n373- )\n374-else:\n375- output_preview = output\n376-\n377-document = {\n--\n388- \"reference_register_checked\": True,\n389- \"reference_sha256\": reference_sha,\n390- \"error_register_checked\": True,\n391- \"error_register_sha256\": error_sha,\n392- \"command_sha256\": command_sha,\n393- \"duplicate_failed_command_blocked\": repeat_blocked == \"true\",\n394- \"block_reason\": block_reason or None,\n395- \"execution_started\": run_started == \"true\",\n396: \"changes_made\": changes_made == \"true\",\n397- \"sanitized\": True,\n398- \"secrets_included\": False,\n399- \"private_addresses_included\": False,\n400- \"raw_evidence_retained_locally\": True,\n401- \"raw_evidence_sha256\": raw_sha,\n402- \"sanitized_output_sha256\": sanitized_sha,\n403- \"output_truncated_in_json\": output_truncated,\n404- \"full_sanitized_output_url\": (\n405- \"https://git.gram1.ru/.well-known/\"\n406- \"homelab-runtime/latest.txt\"\n407- ),\n408- \"output\": output_preview,\n409-}\n410-\n411:Path(json_path).write_text(\n412- json.dumps(\n413- document,\n414- ensure_ascii=False,\n415- indent=2,\n416- )\n417- + \"\\n\",\n418- encoding=\"utf-8\",\n419-)\n420-PY\n421-\n422-{\n423- echo 'CHAT_OUTPUT_BEGIN'\n424- echo \"COMMAND_ID=$COMMAND_ID\"\n425- echo \"STATUS=$STATUS\"\n426- echo \"RC=$RC\"\n427- echo \"HOST=$HOST_SHORT\"\n428- echo \"MODE=$MODE\"\n429- echo \"COMPONENT=$COMPONENT\"\n430- echo 'REFERENCE_REGISTER_CHECK=OK'\n431- echo \"REFERENCE_SHA256=$REFERENCE_SHA256\"\n432- echo 'ERROR_REGISTER_CHECK=OK'\n433- echo \"ERROR_REGISTER_SHA256=$ERROR_REGISTER_SHA256\"\n434- echo \"COMMAND_SHA256=$COMMAND_SHA256\"\n435- echo \"DUPLICATE_FAILED_COMMAND_BLOCKED=$REPEAT_BLOCKED\"\n436- echo \"EXECUTION_STARTED=$RUN_STARTED\"\n437: echo \"CHANGES_MADE=$CHANGES_MADE\"\n438- echo 'SANITIZED=yes'\n439- echo 'SECRETS_INCLUDED=no'\n440- echo 'PRIVATE_ADDRESSES_INCLUDED=no'\n441- echo \"RAW_EVIDENCE_SHA256=$RAW_SHA256\"\n442- echo \"SANITIZED_OUTPUT_SHA256=$SANITIZED_SHA256\"\n443- echo 'OUTPUT_BEGIN'\n444- cat \"$SANITIZED_FILE\"\n445- echo\n446- echo 'OUTPUT_END'\n447- echo 'CHAT_OUTPUT_END'\n448-} >\"$TXT_FILE\"\n449-\n450-chmod 0600 \\\n451- \"$RAW_FILE\" \\\n452- \"$SANITIZED_FILE\" \\\n453- \"$JSON_FILE\" \\\n454- \"$TXT_FILE\"\n455-\n456-TARGET=debian@[PRIVATE_IP]\n457-REMOTE_PREFIX=\"/tmp/homelab-runtime-${COMMAND_ID}-$$\"\n=== PARTIAL_REFERENCE_STATE ===\nREFERENCE_ROOT=ABSENT\nREFERENCE_CLI=ABSENT\nCLUSTER_REFERENCE_STATE_AUDIT=COMPLETE\n" +} diff --git a/runtime/history/CLUSTER-REFERENCE-STATE-AUDIT-149.txt b/runtime/history/CLUSTER-REFERENCE-STATE-AUDIT-149.txt new file mode 100644 index 0000000..47f0eda --- /dev/null +++ b/runtime/history/CLUSTER-REFERENCE-STATE-AUDIT-149.txt @@ -0,0 +1,310 @@ +CHAT_OUTPUT_BEGIN +COMMAND_ID=CLUSTER-REFERENCE-STATE-AUDIT-149 +STATUS=OK +RC=0 +HOST=pve01 +MODE=read-only +COMPONENT=cluster-audit +REFERENCE_REGISTER_CHECK=OK +REFERENCE_SHA256=5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e +ERROR_REGISTER_CHECK=OK +ERROR_REGISTER_SHA256=08b3a769b8e38eaa1acec915352fb328180d70caa7ff6cd9d1ec0da426262752 +COMMAND_SHA256=2af6ffbc1ab71f8fd13302a48794faa713dfcde5a4c90652ace8ab2355e3c2e4 +DUPLICATE_FAILED_COMMAND_BLOCKED=false +EXECUTION_STARTED=true +CHANGES_MADE=false +SANITIZED=yes +SECRETS_INCLUDED=no +PRIVATE_ADDRESSES_INCLUDED=no +RAW_EVIDENCE_SHA256=8fda57d15c1339215b841cef0152a9d2ff5e74b8ecb22d0a7b22050900061148 +SANITIZED_OUTPUT_SHA256=c5ff5c4350fa2306f6847ecfe42105b46c49aa92a065610327cb1a9f0e9498bc +OUTPUT_BEGIN +=== IMMUTABLE_COMMAND_RESULTS === +--- COMMAND_ID=CLUSTER-REFERENCE-MODE-CONFIRM-145 --- +JSON_COMMIT=072668fbc56c580756f0ad7a6a30e4a6af953794 +STATUS=OK +RC=0 +REASON=None +EXECUTION_STARTED=True +DUPLICATE_BLOCKED=False +TXT_COMMIT=072668fbc56c580756f0ad7a6a30e4a6af953794 +VALID_MODES=change,read-only,transport-test,verify +SAFE_WRITE_MODE=UNRESOLVED +CLUSTER_REFERENCE_MODE_CONFIRM=COMPLETE +ERROR_REGISTERED=no +--- COMMAND_ID=CLUSTER-REFERENCE-FRAMEWORK-146 --- +JSON_HISTORY=MISSING +TXT_HISTORY=MISSING +ERROR_REGISTERED=no +--- COMMAND_ID=CLUSTER-REFERENCE-SOURCE-AUDIT-147 --- +JSON_COMMIT=4ef5989856165ac24b02ba54455d3782e16a7cae +STATUS=FAIL +RC=22 +REASON=None +EXECUTION_STARTED=True +DUPLICATE_BLOCKED=False +TXT_COMMIT=4ef5989856165ac24b02ba54455d3782e16a7cae +ERROR_REGISTERED=no +--- COMMAND_ID=CLUSTER-REFERENCE-FOUNDATION-148 --- +JSON_HISTORY=MISSING +TXT_HISTORY=MISSING +ERROR_REGISTERED=no +=== RUNNER_MODE_RULES === +3-umask 077 +4- +5-usage() { +6- cat >&2 <<'USAGE' +7-Usage: +8- homelab-chat-run COMMAND_ID MODE COMPONENT -- command [arguments...] +9- +10-MODE: +11: read-only +12- verify +13: change +14- transport-test +15- +16-Environment: +17- HOMELAB_ALLOW_REPEAT=1 Allow exact repeat of a previously failed command. +18- HOMELAB_TIMEOUT=SECONDS Optional command timeout. +19-USAGE +20- exit 64 +21-} +22- +23-[ "$#" -ge 5 ] || usage +24- +25-COMMAND_ID="$1" +26-MODE="$2" +27-COMPONENT="$3" +28-shift 3 +29- +30-[ "${1:-}" = '--' ] || usage +31-shift +32-[ "$#" -ge 1 ] || usage +33- +-- +43- ''|*[!A-Za-z0-9._-]*) +44- echo 'RESULT=FAIL' +45- echo 'REASON=INVALID_COMPONENT' +46- exit 66 +47- ;; +48-esac +49- +50-case "$MODE" in +51: read-only|verify|change|transport-test) +52- ;; +53- *) +54- echo 'RESULT=FAIL' +55: echo 'REASON=INVALID_MODE' +56- exit 67 +57- ;; +58-esac +59- +60-for TOOL in \ +61- awk \ +62- curl \ +63- flock \ +64- python3 \ +65- scp \ +66- sha256sum \ +67- ssh +68-do +69- command -v "$TOOL" >/dev/null 2>&1 || { +70- echo 'RESULT=FAIL' +71- echo "REASON=REQUIRED_TOOL_MISSING:$TOOL" +72- exit 68 +73- } +74-done +75- +-- +139- print value +140- } +141- ' "$LEDGER" +142-)" +143- +144-RUN_STARTED=true +145-REPEAT_BLOCKED=false +146-BLOCK_REASON='' +147:CHANGES_MADE=false +148- +149-case "$MODE" in +150: change) +151: CHANGES_MADE=true +152- ;; +153-esac +154- +155-if [ -n "$PREVIOUS_FAILED_RC" ] && +156- [ "${HOMELAB_ALLOW_REPEAT:-0}" != 1 ]; then +157- +158- RUN_STARTED=false +159- REPEAT_BLOCKED=true +160- BLOCK_REASON='EXACT_FAILED_COMMAND_REPEAT' +161- RC=73 +162- STATUS='BLOCKED' +163- +164- { +165- echo 'COMMAND_EXECUTION_BLOCKED=yes' +166- echo 'REASON=EXACT_FAILED_COMMAND_REPEAT' +167- echo "PREVIOUS_RC=$PREVIOUS_FAILED_RC" +168- echo "COMMAND_SHA256=$COMMAND_SHA256" +169- echo +170- echo 'Set HOMELAB_ALLOW_REPEAT=1 only after reviewing the previous failure.' +171- } >"$RAW_FILE" +-- +298- text = ( +299- first +300- + "\n\n" +301- + "===== PUBLIC OUTPUT TRUNCATED; FULL RAW LOG RETAINED LOCALLY =====" +302- + "\n\n" +303- + last +304- ) +305- +306:target.write_text(text, encoding="utf-8") +307-PY +308- +309-SANITIZED_SHA256="$( +310- sha256sum "$SANITIZED_FILE" | +311- awk '{print $1}' +312-)" +313- +314-python3 - \ +315- "$JSON_FILE" \ +316- "$SANITIZED_FILE" \ +317- "$COMMAND_ID" \ +318- "$STATUS" \ +319- "$RC" \ +320- "$HOST_SHORT" \ +321- "$MODE" \ +322- "$COMPONENT" \ +323- "$STARTED_AT" \ +324- "$FINISHED_AT" \ +325- "$REFERENCE_SHA256" \ +326- "$ERROR_REGISTER_SHA256" \ +327- "$COMMAND_SHA256" \ +328- "$RAW_SHA256" \ +329- "$SANITIZED_SHA256" \ +330- "$RUN_STARTED" \ +331- "$REPEAT_BLOCKED" \ +332- "$BLOCK_REASON" \ +333: "$CHANGES_MADE" <<'PY' +334-import json +335-import sys +336-from pathlib import Path +337- +338-( +339- json_path, +340- output_path, +341- command_id, +342- status, +343- rc, +344- host, +345- mode, +346- component, +347- started, +348- finished, +349- reference_sha, +350- error_sha, +351- command_sha, +352- raw_sha, +353- sanitized_sha, +354- run_started, +355- repeat_blocked, +356- block_reason, +357: changes_made, +358-) = sys.argv[1:] +359- +360-output = Path(output_path).read_text( +361- encoding="utf-8", +362- errors="replace", +363-) +364- +365-encoded = output.encode("utf-8") +366-json_limit = 300_000 +367-output_truncated = len(encoded) > json_limit +368- +369-if output_truncated: +370- output_preview = encoded[:json_limit].decode( +371- "utf-8", +372- errors="ignore", +373- ) +374-else: +375- output_preview = output +376- +377-document = { +-- +388- "reference_register_checked": True, +389- "reference_sha256": reference_sha, +390- "error_register_checked": True, +391- "error_register_sha256": error_sha, +392- "command_sha256": command_sha, +393- "duplicate_failed_command_blocked": repeat_blocked == "true", +394- "block_reason": block_reason or None, +395- "execution_started": run_started == "true", +396: "changes_made": changes_made == "true", +397- "sanitized": True, +398- "secrets_included": False, +399- "private_addresses_included": False, +400- "raw_evidence_retained_locally": True, +401- "raw_evidence_sha256": raw_sha, +402- "sanitized_output_sha256": sanitized_sha, +403- "output_truncated_in_json": output_truncated, +404- "full_sanitized_output_url": ( +405- "https://git.gram1.ru/.well-known/" +406- "homelab-runtime/latest.txt" +407- ), +408- "output": output_preview, +409-} +410- +411:Path(json_path).write_text( +412- json.dumps( +413- document, +414- ensure_ascii=False, +415- indent=2, +416- ) +417- + "\n", +418- encoding="utf-8", +419-) +420-PY +421- +422-{ +423- echo 'CHAT_OUTPUT_BEGIN' +424- echo "COMMAND_ID=$COMMAND_ID" +425- echo "STATUS=$STATUS" +426- echo "RC=$RC" +427- echo "HOST=$HOST_SHORT" +428- echo "MODE=$MODE" +429- echo "COMPONENT=$COMPONENT" +430- echo 'REFERENCE_REGISTER_CHECK=OK' +431- echo "REFERENCE_SHA256=$REFERENCE_SHA256" +432- echo 'ERROR_REGISTER_CHECK=OK' +433- echo "ERROR_REGISTER_SHA256=$ERROR_REGISTER_SHA256" +434- echo "COMMAND_SHA256=$COMMAND_SHA256" +435- echo "DUPLICATE_FAILED_COMMAND_BLOCKED=$REPEAT_BLOCKED" +436- echo "EXECUTION_STARTED=$RUN_STARTED" +437: echo "CHANGES_MADE=$CHANGES_MADE" +438- echo 'SANITIZED=yes' +439- echo 'SECRETS_INCLUDED=no' +440- echo 'PRIVATE_ADDRESSES_INCLUDED=no' +441- echo "RAW_EVIDENCE_SHA256=$RAW_SHA256" +442- echo "SANITIZED_OUTPUT_SHA256=$SANITIZED_SHA256" +443- echo 'OUTPUT_BEGIN' +444- cat "$SANITIZED_FILE" +445- echo +446- echo 'OUTPUT_END' +447- echo 'CHAT_OUTPUT_END' +448-} >"$TXT_FILE" +449- +450-chmod 0600 \ +451- "$RAW_FILE" \ +452- "$SANITIZED_FILE" \ +453- "$JSON_FILE" \ +454- "$TXT_FILE" +455- +456-TARGET=debian@[PRIVATE_IP] +457-REMOTE_PREFIX="/tmp/homelab-runtime-${COMMAND_ID}-$$" +=== PARTIAL_REFERENCE_STATE === +REFERENCE_ROOT=ABSENT +REFERENCE_CLI=ABSENT +CLUSTER_REFERENCE_STATE_AUDIT=COMPLETE + +OUTPUT_END +CHAT_OUTPUT_END diff --git a/runtime/latest.json b/runtime/latest.json index 3cd62e9..a855d35 100644 --- a/runtime/latest.json +++ b/runtime/latest.json @@ -1 +1,30 @@ -{"schema_version":1,"channel":"homelab-runtime","command_id":"CONTEXT-AUTO-20260722T071701Z","status":"OK","rc":0,"host":"pve01","mode":"read-only","component":"cluster-context","started_at_utc":"2026-07-22T07:17:01Z","finished_at_utc":"2026-07-22T07:17:03Z","reference_register_checked":true,"reference_sha256":"5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e","error_register_checked":true,"error_register_sha256":"08b3a769b8e38eaa1acec915352fb328180d70caa7ff6cd9d1ec0da426262752","changes_made":false,"sanitized":true,"secrets_included":false,"private_addresses_included":false,"output":"AUTOMATIC_CLUSTER_CONTEXT_REFRESH=OK"} +{ + "schema_version": 1, + "channel": "homelab-runtime", + "command_id": "CLUSTER-REFERENCE-STATE-AUDIT-149", + "status": "OK", + "rc": 0, + "host": "pve01", + "mode": "read-only", + "component": "cluster-audit", + "started_at_utc": "2026-07-22T07:25:10Z", + "finished_at_utc": "2026-07-22T07:25:13Z", + "reference_register_checked": true, + "reference_sha256": "5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e", + "error_register_checked": true, + "error_register_sha256": "08b3a769b8e38eaa1acec915352fb328180d70caa7ff6cd9d1ec0da426262752", + "command_sha256": "2af6ffbc1ab71f8fd13302a48794faa713dfcde5a4c90652ace8ab2355e3c2e4", + "duplicate_failed_command_blocked": false, + "block_reason": null, + "execution_started": true, + "changes_made": false, + "sanitized": true, + "secrets_included": false, + "private_addresses_included": false, + "raw_evidence_retained_locally": true, + "raw_evidence_sha256": "8fda57d15c1339215b841cef0152a9d2ff5e74b8ecb22d0a7b22050900061148", + "sanitized_output_sha256": "c5ff5c4350fa2306f6847ecfe42105b46c49aa92a065610327cb1a9f0e9498bc", + "output_truncated_in_json": false, + "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", + "output": "=== IMMUTABLE_COMMAND_RESULTS ===\n--- COMMAND_ID=CLUSTER-REFERENCE-MODE-CONFIRM-145 ---\nJSON_COMMIT=072668fbc56c580756f0ad7a6a30e4a6af953794\nSTATUS=OK\nRC=0\nREASON=None\nEXECUTION_STARTED=True\nDUPLICATE_BLOCKED=False\nTXT_COMMIT=072668fbc56c580756f0ad7a6a30e4a6af953794\nVALID_MODES=change,read-only,transport-test,verify\nSAFE_WRITE_MODE=UNRESOLVED\nCLUSTER_REFERENCE_MODE_CONFIRM=COMPLETE\nERROR_REGISTERED=no\n--- COMMAND_ID=CLUSTER-REFERENCE-FRAMEWORK-146 ---\nJSON_HISTORY=MISSING\nTXT_HISTORY=MISSING\nERROR_REGISTERED=no\n--- COMMAND_ID=CLUSTER-REFERENCE-SOURCE-AUDIT-147 ---\nJSON_COMMIT=4ef5989856165ac24b02ba54455d3782e16a7cae\nSTATUS=FAIL\nRC=22\nREASON=None\nEXECUTION_STARTED=True\nDUPLICATE_BLOCKED=False\nTXT_COMMIT=4ef5989856165ac24b02ba54455d3782e16a7cae\nERROR_REGISTERED=no\n--- COMMAND_ID=CLUSTER-REFERENCE-FOUNDATION-148 ---\nJSON_HISTORY=MISSING\nTXT_HISTORY=MISSING\nERROR_REGISTERED=no\n=== RUNNER_MODE_RULES ===\n3-umask 077\n4-\n5-usage() {\n6- cat >&2 <<'USAGE'\n7-Usage:\n8- homelab-chat-run COMMAND_ID MODE COMPONENT -- command [arguments...]\n9-\n10-MODE:\n11: read-only\n12- verify\n13: change\n14- transport-test\n15-\n16-Environment:\n17- HOMELAB_ALLOW_REPEAT=1 Allow exact repeat of a previously failed command.\n18- HOMELAB_TIMEOUT=SECONDS Optional command timeout.\n19-USAGE\n20- exit 64\n21-}\n22-\n23-[ \"$#\" -ge 5 ] || usage\n24-\n25-COMMAND_ID=\"$1\"\n26-MODE=\"$2\"\n27-COMPONENT=\"$3\"\n28-shift 3\n29-\n30-[ \"${1:-}\" = '--' ] || usage\n31-shift\n32-[ \"$#\" -ge 1 ] || usage\n33-\n--\n43- ''|*[!A-Za-z0-9._-]*)\n44- echo 'RESULT=FAIL'\n45- echo 'REASON=INVALID_COMPONENT'\n46- exit 66\n47- ;;\n48-esac\n49-\n50-case \"$MODE\" in\n51: read-only|verify|change|transport-test)\n52- ;;\n53- *)\n54- echo 'RESULT=FAIL'\n55: echo 'REASON=INVALID_MODE'\n56- exit 67\n57- ;;\n58-esac\n59-\n60-for TOOL in \\\n61- awk \\\n62- curl \\\n63- flock \\\n64- python3 \\\n65- scp \\\n66- sha256sum \\\n67- ssh\n68-do\n69- command -v \"$TOOL\" >/dev/null 2>&1 || {\n70- echo 'RESULT=FAIL'\n71- echo \"REASON=REQUIRED_TOOL_MISSING:$TOOL\"\n72- exit 68\n73- }\n74-done\n75-\n--\n139- print value\n140- }\n141- ' \"$LEDGER\"\n142-)\"\n143-\n144-RUN_STARTED=true\n145-REPEAT_BLOCKED=false\n146-BLOCK_REASON=''\n147:CHANGES_MADE=false\n148-\n149-case \"$MODE\" in\n150: change)\n151: CHANGES_MADE=true\n152- ;;\n153-esac\n154-\n155-if [ -n \"$PREVIOUS_FAILED_RC\" ] &&\n156- [ \"${HOMELAB_ALLOW_REPEAT:-0}\" != 1 ]; then\n157-\n158- RUN_STARTED=false\n159- REPEAT_BLOCKED=true\n160- BLOCK_REASON='EXACT_FAILED_COMMAND_REPEAT'\n161- RC=73\n162- STATUS='BLOCKED'\n163-\n164- {\n165- echo 'COMMAND_EXECUTION_BLOCKED=yes'\n166- echo 'REASON=EXACT_FAILED_COMMAND_REPEAT'\n167- echo \"PREVIOUS_RC=$PREVIOUS_FAILED_RC\"\n168- echo \"COMMAND_SHA256=$COMMAND_SHA256\"\n169- echo\n170- echo 'Set HOMELAB_ALLOW_REPEAT=1 only after reviewing the previous failure.'\n171- } >\"$RAW_FILE\"\n--\n298- text = (\n299- first\n300- + \"\\n\\n\"\n301- + \"===== PUBLIC OUTPUT TRUNCATED; FULL RAW LOG RETAINED LOCALLY =====\"\n302- + \"\\n\\n\"\n303- + last\n304- )\n305-\n306:target.write_text(text, encoding=\"utf-8\")\n307-PY\n308-\n309-SANITIZED_SHA256=\"$(\n310- sha256sum \"$SANITIZED_FILE\" |\n311- awk '{print $1}'\n312-)\"\n313-\n314-python3 - \\\n315- \"$JSON_FILE\" \\\n316- \"$SANITIZED_FILE\" \\\n317- \"$COMMAND_ID\" \\\n318- \"$STATUS\" \\\n319- \"$RC\" \\\n320- \"$HOST_SHORT\" \\\n321- \"$MODE\" \\\n322- \"$COMPONENT\" \\\n323- \"$STARTED_AT\" \\\n324- \"$FINISHED_AT\" \\\n325- \"$REFERENCE_SHA256\" \\\n326- \"$ERROR_REGISTER_SHA256\" \\\n327- \"$COMMAND_SHA256\" \\\n328- \"$RAW_SHA256\" \\\n329- \"$SANITIZED_SHA256\" \\\n330- \"$RUN_STARTED\" \\\n331- \"$REPEAT_BLOCKED\" \\\n332- \"$BLOCK_REASON\" \\\n333: \"$CHANGES_MADE\" <<'PY'\n334-import json\n335-import sys\n336-from pathlib import Path\n337-\n338-(\n339- json_path,\n340- output_path,\n341- command_id,\n342- status,\n343- rc,\n344- host,\n345- mode,\n346- component,\n347- started,\n348- finished,\n349- reference_sha,\n350- error_sha,\n351- command_sha,\n352- raw_sha,\n353- sanitized_sha,\n354- run_started,\n355- repeat_blocked,\n356- block_reason,\n357: changes_made,\n358-) = sys.argv[1:]\n359-\n360-output = Path(output_path).read_text(\n361- encoding=\"utf-8\",\n362- errors=\"replace\",\n363-)\n364-\n365-encoded = output.encode(\"utf-8\")\n366-json_limit = 300_000\n367-output_truncated = len(encoded) > json_limit\n368-\n369-if output_truncated:\n370- output_preview = encoded[:json_limit].decode(\n371- \"utf-8\",\n372- errors=\"ignore\",\n373- )\n374-else:\n375- output_preview = output\n376-\n377-document = {\n--\n388- \"reference_register_checked\": True,\n389- \"reference_sha256\": reference_sha,\n390- \"error_register_checked\": True,\n391- \"error_register_sha256\": error_sha,\n392- \"command_sha256\": command_sha,\n393- \"duplicate_failed_command_blocked\": repeat_blocked == \"true\",\n394- \"block_reason\": block_reason or None,\n395- \"execution_started\": run_started == \"true\",\n396: \"changes_made\": changes_made == \"true\",\n397- \"sanitized\": True,\n398- \"secrets_included\": False,\n399- \"private_addresses_included\": False,\n400- \"raw_evidence_retained_locally\": True,\n401- \"raw_evidence_sha256\": raw_sha,\n402- \"sanitized_output_sha256\": sanitized_sha,\n403- \"output_truncated_in_json\": output_truncated,\n404- \"full_sanitized_output_url\": (\n405- \"https://git.gram1.ru/.well-known/\"\n406- \"homelab-runtime/latest.txt\"\n407- ),\n408- \"output\": output_preview,\n409-}\n410-\n411:Path(json_path).write_text(\n412- json.dumps(\n413- document,\n414- ensure_ascii=False,\n415- indent=2,\n416- )\n417- + \"\\n\",\n418- encoding=\"utf-8\",\n419-)\n420-PY\n421-\n422-{\n423- echo 'CHAT_OUTPUT_BEGIN'\n424- echo \"COMMAND_ID=$COMMAND_ID\"\n425- echo \"STATUS=$STATUS\"\n426- echo \"RC=$RC\"\n427- echo \"HOST=$HOST_SHORT\"\n428- echo \"MODE=$MODE\"\n429- echo \"COMPONENT=$COMPONENT\"\n430- echo 'REFERENCE_REGISTER_CHECK=OK'\n431- echo \"REFERENCE_SHA256=$REFERENCE_SHA256\"\n432- echo 'ERROR_REGISTER_CHECK=OK'\n433- echo \"ERROR_REGISTER_SHA256=$ERROR_REGISTER_SHA256\"\n434- echo \"COMMAND_SHA256=$COMMAND_SHA256\"\n435- echo \"DUPLICATE_FAILED_COMMAND_BLOCKED=$REPEAT_BLOCKED\"\n436- echo \"EXECUTION_STARTED=$RUN_STARTED\"\n437: echo \"CHANGES_MADE=$CHANGES_MADE\"\n438- echo 'SANITIZED=yes'\n439- echo 'SECRETS_INCLUDED=no'\n440- echo 'PRIVATE_ADDRESSES_INCLUDED=no'\n441- echo \"RAW_EVIDENCE_SHA256=$RAW_SHA256\"\n442- echo \"SANITIZED_OUTPUT_SHA256=$SANITIZED_SHA256\"\n443- echo 'OUTPUT_BEGIN'\n444- cat \"$SANITIZED_FILE\"\n445- echo\n446- echo 'OUTPUT_END'\n447- echo 'CHAT_OUTPUT_END'\n448-} >\"$TXT_FILE\"\n449-\n450-chmod 0600 \\\n451- \"$RAW_FILE\" \\\n452- \"$SANITIZED_FILE\" \\\n453- \"$JSON_FILE\" \\\n454- \"$TXT_FILE\"\n455-\n456-TARGET=debian@[PRIVATE_IP]\n457-REMOTE_PREFIX=\"/tmp/homelab-runtime-${COMMAND_ID}-$$\"\n=== PARTIAL_REFERENCE_STATE ===\nREFERENCE_ROOT=ABSENT\nREFERENCE_CLI=ABSENT\nCLUSTER_REFERENCE_STATE_AUDIT=COMPLETE\n" +} diff --git a/runtime/latest.txt b/runtime/latest.txt index 2de3be0..47f0eda 100644 --- a/runtime/latest.txt +++ b/runtime/latest.txt @@ -1,201 +1,310 @@ CHAT_OUTPUT_BEGIN -COMMAND_ID=CONTEXT-AUTO-[PRIVATE_IP]701Z +COMMAND_ID=CLUSTER-REFERENCE-STATE-AUDIT-149 STATUS=OK RC=0 HOST=pve01 -COMPONENT=cluster-context -REFERENCE_SHA[PRIVATE_IP]f8edc75fcf[PRIVATE_IP]c[PRIVATE_IP]cc112ceccb6cf[PRIVATE_IP]a4deb8e -ERROR_REGISTER_SHA[PRIVATE_IP]b8e38eaa1acec915352fb[PRIVATE_IP]caa7ff6cd9d1ec0da[PRIVATE_IP] +MODE=read-only +COMPONENT=cluster-audit +REFERENCE_REGISTER_CHECK=OK +REFERENCE_SHA256=5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e +ERROR_REGISTER_CHECK=OK +ERROR_REGISTER_SHA256=08b3a769b8e38eaa1acec915352fb328180d70caa7ff6cd9d1ec0da426262752 +COMMAND_SHA256=2af6ffbc1ab71f8fd13302a48794faa713dfcde5a4c90652ace8ab2355e3c2e4 +DUPLICATE_FAILED_COMMAND_BLOCKED=false +EXECUTION_STARTED=true +CHANGES_MADE=false +SANITIZED=yes +SECRETS_INCLUDED=no +PRIVATE_ADDRESSES_INCLUDED=no +RAW_EVIDENCE_SHA256=8fda57d15c1339215b841cef0152a9d2ff5e74b8ecb22d0a7b22050900061148 +SANITIZED_OUTPUT_SHA256=c5ff5c4350fa2306f6847ecfe42105b46c49aa92a065610327cb1a9f0e9498bc OUTPUT_BEGIN -GENERATED_AT_UTC=[PRIVATE_IP]T07:17:01Z -Cluster information -------------------- -Name: homelab -Config Version: 3 -Transport: knet -Secure auth: on +=== IMMUTABLE_COMMAND_RESULTS === +--- COMMAND_ID=CLUSTER-REFERENCE-MODE-CONFIRM-145 --- +JSON_COMMIT=072668fbc56c580756f0ad7a6a30e4a6af953794 +STATUS=OK +RC=0 +REASON=None +EXECUTION_STARTED=True +DUPLICATE_BLOCKED=False +TXT_COMMIT=072668fbc56c580756f0ad7a6a30e4a6af953794 +VALID_MODES=change,read-only,transport-test,verify +SAFE_WRITE_MODE=UNRESOLVED +CLUSTER_REFERENCE_MODE_CONFIRM=COMPLETE +ERROR_REGISTERED=no +--- COMMAND_ID=CLUSTER-REFERENCE-FRAMEWORK-146 --- +JSON_HISTORY=MISSING +TXT_HISTORY=MISSING +ERROR_REGISTERED=no +--- COMMAND_ID=CLUSTER-REFERENCE-SOURCE-AUDIT-147 --- +JSON_COMMIT=4ef5989856165ac24b02ba54455d3782e16a7cae +STATUS=FAIL +RC=22 +REASON=None +EXECUTION_STARTED=True +DUPLICATE_BLOCKED=False +TXT_COMMIT=4ef5989856165ac24b02ba54455d3782e16a7cae +ERROR_REGISTERED=no +--- COMMAND_ID=CLUSTER-REFERENCE-FOUNDATION-148 --- +JSON_HISTORY=MISSING +TXT_HISTORY=MISSING +ERROR_REGISTERED=no +=== RUNNER_MODE_RULES === +3-umask 077 +4- +5-usage() { +6- cat >&2 <<'USAGE' +7-Usage: +8- homelab-chat-run COMMAND_ID MODE COMPONENT -- command [arguments...] +9- +10-MODE: +11: read-only +12- verify +13: change +14- transport-test +15- +16-Environment: +17- HOMELAB_ALLOW_REPEAT=1 Allow exact repeat of a previously failed command. +18- HOMELAB_TIMEOUT=SECONDS Optional command timeout. +19-USAGE +20- exit 64 +21-} +22- +23-[ "$#" -ge 5 ] || usage +24- +25-COMMAND_ID="$1" +26-MODE="$2" +27-COMPONENT="$3" +28-shift 3 +29- +30-[ "${1:-}" = '--' ] || usage +31-shift +32-[ "$#" -ge 1 ] || usage +33- +-- +43- ''|*[!A-Za-z0-9._-]*) +44- echo 'RESULT=FAIL' +45- echo 'REASON=INVALID_COMPONENT' +46- exit 66 +47- ;; +48-esac +49- +50-case "$MODE" in +51: read-only|verify|change|transport-test) +52- ;; +53- *) +54- echo 'RESULT=FAIL' +55: echo 'REASON=INVALID_MODE' +56- exit 67 +57- ;; +58-esac +59- +60-for TOOL in \ +61- awk \ +62- curl \ +63- flock \ +64- python3 \ +65- scp \ +66- sha256sum \ +67- ssh +68-do +69- command -v "$TOOL" >/dev/null 2>&1 || { +70- echo 'RESULT=FAIL' +71- echo "REASON=REQUIRED_TOOL_MISSING:$TOOL" +72- exit 68 +73- } +74-done +75- +-- +139- print value +140- } +141- ' "$LEDGER" +142-)" +143- +144-RUN_STARTED=true +145-REPEAT_BLOCKED=false +146-BLOCK_REASON='' +147:CHANGES_MADE=false +148- +149-case "$MODE" in +150: change) +151: CHANGES_MADE=true +152- ;; +153-esac +154- +155-if [ -n "$PREVIOUS_FAILED_RC" ] && +156- [ "${HOMELAB_ALLOW_REPEAT:-0}" != 1 ]; then +157- +158- RUN_STARTED=false +159- REPEAT_BLOCKED=true +160- BLOCK_REASON='EXACT_FAILED_COMMAND_REPEAT' +161- RC=73 +162- STATUS='BLOCKED' +163- +164- { +165- echo 'COMMAND_EXECUTION_BLOCKED=yes' +166- echo 'REASON=EXACT_FAILED_COMMAND_REPEAT' +167- echo "PREVIOUS_RC=$PREVIOUS_FAILED_RC" +168- echo "COMMAND_SHA256=$COMMAND_SHA256" +169- echo +170- echo 'Set HOMELAB_ALLOW_REPEAT=1 only after reviewing the previous failure.' +171- } >"$RAW_FILE" +-- +298- text = ( +299- first +300- + "\n\n" +301- + "===== PUBLIC OUTPUT TRUNCATED; FULL RAW LOG RETAINED LOCALLY =====" +302- + "\n\n" +303- + last +304- ) +305- +306:target.write_text(text, encoding="utf-8") +307-PY +308- +309-SANITIZED_SHA256="$( +310- sha256sum "$SANITIZED_FILE" | +311- awk '{print $1}' +312-)" +313- +314-python3 - \ +315- "$JSON_FILE" \ +316- "$SANITIZED_FILE" \ +317- "$COMMAND_ID" \ +318- "$STATUS" \ +319- "$RC" \ +320- "$HOST_SHORT" \ +321- "$MODE" \ +322- "$COMPONENT" \ +323- "$STARTED_AT" \ +324- "$FINISHED_AT" \ +325- "$REFERENCE_SHA256" \ +326- "$ERROR_REGISTER_SHA256" \ +327- "$COMMAND_SHA256" \ +328- "$RAW_SHA256" \ +329- "$SANITIZED_SHA256" \ +330- "$RUN_STARTED" \ +331- "$REPEAT_BLOCKED" \ +332- "$BLOCK_REASON" \ +333: "$CHANGES_MADE" <<'PY' +334-import json +335-import sys +336-from pathlib import Path +337- +338-( +339- json_path, +340- output_path, +341- command_id, +342- status, +343- rc, +344- host, +345- mode, +346- component, +347- started, +348- finished, +349- reference_sha, +350- error_sha, +351- command_sha, +352- raw_sha, +353- sanitized_sha, +354- run_started, +355- repeat_blocked, +356- block_reason, +357: changes_made, +358-) = sys.argv[1:] +359- +360-output = Path(output_path).read_text( +361- encoding="utf-8", +362- errors="replace", +363-) +364- +365-encoded = output.encode("utf-8") +366-json_limit = 300_000 +367-output_truncated = len(encoded) > json_limit +368- +369-if output_truncated: +370- output_preview = encoded[:json_limit].decode( +371- "utf-8", +372- errors="ignore", +373- ) +374-else: +375- output_preview = output +376- +377-document = { +-- +388- "reference_register_checked": True, +389- "reference_sha256": reference_sha, +390- "error_register_checked": True, +391- "error_register_sha256": error_sha, +392- "command_sha256": command_sha, +393- "duplicate_failed_command_blocked": repeat_blocked == "true", +394- "block_reason": block_reason or None, +395- "execution_started": run_started == "true", +396: "changes_made": changes_made == "true", +397- "sanitized": True, +398- "secrets_included": False, +399- "private_addresses_included": False, +400- "raw_evidence_retained_locally": True, +401- "raw_evidence_sha256": raw_sha, +402- "sanitized_output_sha256": sanitized_sha, +403- "output_truncated_in_json": output_truncated, +404- "full_sanitized_output_url": ( +405- "https://git.gram1.ru/.well-known/" +406- "homelab-runtime/latest.txt" +407- ), +408- "output": output_preview, +409-} +410- +411:Path(json_path).write_text( +412- json.dumps( +413- document, +414- ensure_ascii=False, +415- indent=2, +416- ) +417- + "\n", +418- encoding="utf-8", +419-) +420-PY +421- +422-{ +423- echo 'CHAT_OUTPUT_BEGIN' +424- echo "COMMAND_ID=$COMMAND_ID" +425- echo "STATUS=$STATUS" +426- echo "RC=$RC" +427- echo "HOST=$HOST_SHORT" +428- echo "MODE=$MODE" +429- echo "COMPONENT=$COMPONENT" +430- echo 'REFERENCE_REGISTER_CHECK=OK' +431- echo "REFERENCE_SHA256=$REFERENCE_SHA256" +432- echo 'ERROR_REGISTER_CHECK=OK' +433- echo "ERROR_REGISTER_SHA256=$ERROR_REGISTER_SHA256" +434- echo "COMMAND_SHA256=$COMMAND_SHA256" +435- echo "DUPLICATE_FAILED_COMMAND_BLOCKED=$REPEAT_BLOCKED" +436- echo "EXECUTION_STARTED=$RUN_STARTED" +437: echo "CHANGES_MADE=$CHANGES_MADE" +438- echo 'SANITIZED=yes' +439- echo 'SECRETS_INCLUDED=no' +440- echo 'PRIVATE_ADDRESSES_INCLUDED=no' +441- echo "RAW_EVIDENCE_SHA256=$RAW_SHA256" +442- echo "SANITIZED_OUTPUT_SHA256=$SANITIZED_SHA256" +443- echo 'OUTPUT_BEGIN' +444- cat "$SANITIZED_FILE" +445- echo +446- echo 'OUTPUT_END' +447- echo 'CHAT_OUTPUT_END' +448-} >"$TXT_FILE" +449- +450-chmod 0600 \ +451- "$RAW_FILE" \ +452- "$SANITIZED_FILE" \ +453- "$JSON_FILE" \ +454- "$TXT_FILE" +455- +456-TARGET=debian@[PRIVATE_IP] +457-REMOTE_PREFIX="/tmp/homelab-runtime-${COMMAND_ID}-$$" +=== PARTIAL_REFERENCE_STATE === +REFERENCE_ROOT=ABSENT +REFERENCE_CLI=ABSENT +CLUSTER_REFERENCE_STATE_AUDIT=COMPLETE -Quorum information ------------------- -Date: Wed Jul [PRIVATE_IP] 2026 -Quorum provider: corosync_votequorum -Nodes: 3 -Node ID: [PRIVATE_IP] -Ring ID: 1.9d -Quorate: Yes - -Votequorum information ----------------------- -Expected votes: 3 -Highest expected: 3 -Total votes: 3 -Quorum: 2 -Flags: Quorate - -Membership information ----------------------- - Nodeid Votes Name -[PRIVATE_IP] [PRIVATE_IP].11 (local) -[PRIVATE_IP] [PRIVATE_IP].13 -[PRIVATE_IP] [PRIVATE_IP].12 - -Membership information ----------------------- - Nodeid Votes Name - 1 1 pve01 (local) - 2 1 pve03 - 3 1 pve02 -[{"cpu":[PRIVATE_IP][PRIVATE_IP],"disk":[PRIVATE_IP],"diskread":[PRIVATE_IP],"diskwrite":[PRIVATE_IP],"id":"lxc/110","maxcpu":1,"maxdisk":[PRIVATE_IP],"maxmem":[PRIVATE_IP],"mem":[PRIVATE_IP],"memhost":0,"name":"dns1","netin":[PRIVATE_IP],"netout":[PRIVATE_IP],"node":"pve01","status":"running","template":0,"type":"lxc","uptime":513476,"vmid":110},{"cpu":[PRIVATE_IP][PRIVATE_IP],"disk":[PRIVATE_IP],"diskread":[PRIVATE_IP],"diskwrite":[PRIVATE_IP],"id":"lxc/111","maxcpu":1,"maxdisk":[PRIVATE_IP],"maxmem":[PRIVATE_IP],"mem":[PRIVATE_IP],"memhost":0,"name":"dns2","netin":[PRIVATE_IP],"netout":[PRIVATE_IP],"node":"pve02","status":"running","template":0,"type":"lxc","uptime":513474,"vmid":111},{"cpu":[PRIVATE_IP]797e-05,"disk":[PRIVATE_IP],"diskread":[PRIVATE_IP],"diskwrite":[PRIVATE_IP],"id":"lxc/112","maxcpu":1,"maxdisk":[PRIVATE_IP],"maxmem":[PRIVATE_IP],"mem":[PRIVATE_IP],"memhost":0,"name":"unbound1","netin":[PRIVATE_IP],"netout":[PRIVATE_IP],"node":"pve01","status":"running","template":0,"type":"lxc","uptime":513479,"vmid":112},{"cpu":0,"disk":[PRIVATE_IP],"diskread":[PRIVATE_IP],"diskwrite":[PRIVATE_IP],"id":"lxc/113","maxcpu":1,"maxdisk":[PRIVATE_IP],"maxmem":[PRIVATE_IP],"mem":[PRIVATE_IP],"memhost":0,"name":"unbound2","netin":[PRIVATE_IP],"netout":[PRIVATE_IP],"node":"pve02","status":"running","template":0,"type":"lxc","uptime":513477,"vmid":113},{"cpu":[PRIVATE_IP]95447,"disk":0,"diskread":[PRIVATE_IP],"diskwrite":[PRIVATE_IP],"id":"qemu/130","maxcpu":4,"maxdisk":[PRIVATE_IP],"maxmem":[PRIVATE_IP],"mem":[PRIVATE_IP],"memhost":[PRIVATE_IP],"name":"edge-vm","netin":[PRIVATE_IP],"netout":[PRIVATE_IP],"node":"pve03","status":"running","template":0,"type":"qemu","uptime":513347,"vmid":130},{"cpu":[PRIVATE_IP]89991,"disk":0,"diskread":[PRIVATE_IP],"diskwrite":[PRIVATE_IP],"id":"qemu/150","maxcpu":4,"maxdisk":[PRIVATE_IP],"maxmem":[PRIVATE_IP],"mem":[PRIVATE_IP],"memhost":[PRIVATE_IP],"name":"nextcloud","netin":[PRIVATE_IP],"netout":[PRIVATE_IP],"node":"pve01","status":"running","template":0,"type":"qemu","uptime":513473,"vmid":150},{"cpu":[PRIVATE_IP]914929,"disk":0,"diskread":[PRIVATE_IP],"diskwrite":[PRIVATE_IP],"id":"qemu/160","maxcpu":4,"maxdisk":[PRIVATE_IP],"maxmem":[PRIVATE_IP],"mem":[PRIVATE_IP],"memhost":[PRIVATE_IP],"name":"forum-prod","netin":[PRIVATE_IP],"netout":[PRIVATE_IP],"node":"pve02","status":"running","template":0,"type":"qemu","uptime":513471,"vmid":160},{"cpu":[PRIVATE_IP]97472,"disk":0,"diskread":[PRIVATE_IP],"diskwrite":[PRIVATE_IP],"id":"qemu/170","maxcpu":4,"maxdisk":[PRIVATE_IP],"maxmem":[PRIVATE_IP],"mem":[PRIVATE_IP],"memhost":[PRIVATE_IP],"name":"core-apps","netin":[PRIVATE_IP],"netout":[PRIVATE_IP],"node":"pve01","status":"running","template":0,"type":"qemu","uptime":513469,"vmid":170},{"cpu":[PRIVATE_IP]79992,"disk":0,"diskread":[PRIVATE_IP],"diskwrite":[PRIVATE_IP],"id":"qemu/171","maxcpu":4,"maxdisk":[PRIVATE_IP],"maxmem":[PRIVATE_IP],"mem":[PRIVATE_IP],"memhost":[PRIVATE_IP],"name":"monitoring","netin":[PRIVATE_IP],"netout":[PRIVATE_IP],"node":"pve01","status":"running","template":0,"type":"qemu","uptime":513466,"vmid":171},{"cpu":[PRIVATE_IP]982346,"disk":0,"diskread":[PRIVATE_IP],"diskwrite":[PRIVATE_IP],"id":"qemu/180","maxcpu":2,"maxdisk":[PRIVATE_IP],"maxmem":[PRIVATE_IP],"mem":[PRIVATE_IP],"memhost":[PRIVATE_IP],"name":"cluster-admin","netin":[PRIVATE_IP],"netout":[PRIVATE_IP],"node":"pve02","status":"running","template":0,"type":"qemu","uptime":513468,"vmid":180},{"cpu":[PRIVATE_IP]835772,"disk":0,"diskread":[PRIVATE_IP],"diskwrite":[PRIVATE_IP],"id":"qemu/190","maxcpu":4,"maxdisk":[PRIVATE_IP],"maxmem":[PRIVATE_IP],"mem":[PRIVATE_IP],"memhost":[PRIVATE_IP],"name":"homelab-ops-worker","netin":[PRIVATE_IP],"netout":[PRIVATE_IP],"node":"pve03","status":"running","template":0,"type":"qemu","uptime":508710,"vmid":190},{"cpu":0,"disk":0,"diskread":0,"diskwrite":0,"id":"qemu/9130","maxcpu":4,"maxdisk":[PRIVATE_IP],"maxmem":[PRIVATE_IP],"mem":0,"memhost":0,"name":"edge-cold-standby","netin":0,"netout":0,"node":"pve02","status":"stopped","template":0,"type":"qemu","uptime":0,"vmid":9130},{"cgroup-mode":2,"cpu":[PRIVATE_IP]58278,"disk":[PRIVATE_IP],"id":"node/pve02","level":"","maxcpu":4,"maxdisk":[PRIVATE_IP],"maxmem":[PRIVATE_IP],"mem":[PRIVATE_IP],"node":"pve02","status":"online","type":"node","uptime":513509},{"cgroup-mode":2,"cpu":[PRIVATE_IP]72032,"disk":[PRIVATE_IP],"id":"node/pve01","level":"","maxcpu":24,"maxdisk":[PRIVATE_IP],"maxmem":[PRIVATE_IP],"mem":[PRIVATE_IP],"node":"pve01","status":"online","type":"node","uptime":513492},{"cgroup-mode":2,"cpu":[PRIVATE_IP]55215,"disk":[PRIVATE_IP],"id":"node/pve03","level":"","maxcpu":8,"maxdisk":[PRIVATE_IP],"maxmem":[PRIVATE_IP],"mem":[PRIVATE_IP],"node":"pve03","status":"online","type":"node","uptime":513364},{"content":"backup,iso,import,vztmpl","disk":[PRIVATE_IP],"id":"storage/pve02/local","maxdisk":[PRIVATE_IP],"node":"pve02","plugintype":"dir","shared":0,"status":"available","storage":"local","type":"storage"},{"content":"backup,iso,import,vztmpl","disk":[PRIVATE_IP],"id":"storage/pve01/local","maxdisk":[PRIVATE_IP],"node":"pve01","plugintype":"dir","shared":0,"status":"available","storage":"local","type":"storage"},{"content":"backup,iso,import,vztmpl","disk":[PRIVATE_IP],"id":"storage/pve03/local","maxdisk":[PRIVATE_IP],"node":"pve03","plugintype":"dir","shared":0,"status":"available","storage":"local","type":"storage"},{"content":"images,rootdir","disk":[PRIVATE_IP],"id":"storage/pve02/local-lvm","maxdisk":[PRIVATE_IP],"node":"pve02","plugintype":"lvmthin","shared":0,"status":"available","storage":"local-lvm","type":"storage"},{"content":"images,rootdir","disk":[PRIVATE_IP],"id":"storage/pve01/local-lvm","maxdisk":[PRIVATE_IP],"node":"pve01","plugintype":"lvmthin","shared":0,"status":"available","storage":"local-lvm","type":"storage"},{"content":"images,rootdir","disk":[PRIVATE_IP],"id":"storage/pve03/local-lvm","maxdisk":[PRIVATE_IP],"node":"pve03","plugintype":"lvmthin","shared":0,"status":"available","storage":"local-lvm","type":"storage"},{"id":"network/pve02/zone/localnetwork","network":"localnetwork","network-type":"zone","node":"pve02","status":"ok","type":"network"},{"id":"network/pve01/zone/localnetwork","network":"localnetwork","network-type":"zone","node":"pve01","status":"ok","type":"network"},{"id":"network/pve03/zone/localnetwork","network":"localnetwork","network-type":"zone","node":"pve03","status":"ok","type":"network"}] -Name Type Status Total (KiB) Used (KiB) Available (KiB) % -local dir active [PRIVATE_IP] [PRIVATE_IP] [PRIVATE_IP] 40.96% -local-lvm lvmthin active [PRIVATE_IP] [PRIVATE_IP] [PRIVATE_IP] 36.03% - UNIT LOAD ACTIVE SUB DESCRIPTION -● homelab-backup-matrix-refresh.service loaded failed failed Generate unified homelab backup matrix state -● homelab-cluster-admin-pull.service loaded failed failed Pull cluster-admin observer health into pve01 -● homelab-vm160-remote-backup.service loaded failed failed VM160 full-image backup streamed from pve02 to pve03 - -Legend: LOAD → Reflects whether the unit definition was properly loaded. - ACTIVE → The high-level unit activation state, i.e. generalization of SUB. - SUB → The low-level unit activation state, values depend on unit type. - -3 loaded units listed. -NEXT LEFT LAST PASSED UNIT ACTIVATES -Wed [PRIVATE_IP] 10:17:30 MSK 27s Wed [PRIVATE_IP] 10:02:30 MSK 14min ago homelab-disk-space-health.timer homelab-disk-space-health.service -Wed [PRIVATE_IP] 10:17:30 MSK 27s Wed [PRIVATE_IP] 10:16:30 MSK 32s ago homelab-cluster-admin-webpanel-sync.timer homelab-cluster-admin-webpanel-sync.service -Wed [PRIVATE_IP] 10:17:30 MSK 27s Wed [PRIVATE_IP] 10:02:30 MSK 14min ago prometheus-node-exporter-nvme.timer prometheus-node-exporter-nvme.service -Wed [PRIVATE_IP] 10:17:31 MSK 27s Wed [PRIVATE_IP] 10:16:31 MSK 32s ago homelab-private-vpn-hosts-health.timer homelab-private-vpn-hosts-health.service -Wed [PRIVATE_IP] 10:18:14 MSK 1min 11s Wed [PRIVATE_IP] 10:13:14 MSK 3min 48s ago homelab-smartctl-textfile.timer homelab-smartctl-textfile.service -Wed [PRIVATE_IP] 10:18:14 MSK 1min 11s Wed [PRIVATE_IP] 10:13:14 MSK 3min 48s ago netbird-peers-health.timer netbird-peers-health.service -Wed [PRIVATE_IP] 10:18:54 MSK 1min 51s Wed [PRIVATE_IP] 10:13:25 MSK 3min 37s ago homelab-health-metrics.timer homelab-health-metrics.service -Wed [PRIVATE_IP] 10:19:20 MSK 2min 17s Wed [PRIVATE_IP] 10:13:59 MSK 3min 3s ago homelab-crypto-portfolio-chart-health.timer homelab-crypto-portfolio-chart-health.service -Wed [PRIVATE_IP] 10:21:14 MSK 4min 11s Wed [PRIVATE_IP] 10:06:14 MSK 10min ago homelab-pve03-staging-capacity-health.timer homelab-pve03-staging-capacity-health.service -Wed [PRIVATE_IP] 10:26:14 MSK 9min Wed [PRIVATE_IP] 10:16:14 MSK 48s ago skladchik-reports-monitor-supervisor.timer skladchik-reports-monitor-supervisor.service -Wed [PRIVATE_IP] 10:30:00 MSK 12min Wed [PRIVATE_IP] 10:15:07 MSK 1min 55s ago homelab-incident-journal.timer homelab-incident-journal.service -Wed [PRIVATE_IP] 10:30:00 MSK 12min Wed [PRIVATE_IP] 10:15:07 MSK 1min 55s ago homelab-safe-autoheal.timer homelab-safe-autoheal.service -Wed [PRIVATE_IP] 10:30:30 MSK 13min Wed [PRIVATE_IP] 10:15:07 MSK 1min 55s ago homelab-external-probe-vps-health.timer homelab-external-probe-vps-health.service -Wed [PRIVATE_IP] 10:30:48 MSK 13min Wed [PRIVATE_IP] 10:16:14 MSK 48s ago homelab-forum-snuffleupagus-health.timer homelab-forum-snuffleupagus-health.service -Wed [PRIVATE_IP] 10:30:56 MSK 13min Wed [PRIVATE_IP] 10:16:14 MSK 48s ago homelab-duty-admin-v2.timer homelab-duty-admin-v2.service -Wed [PRIVATE_IP] 10:31:14 MSK 14min Wed [PRIVATE_IP] 10:16:14 MSK 48s ago prometheus-node-exporter-apt.timer prometheus-node-exporter-apt.service -Wed [PRIVATE_IP] 10:32:25 MSK 15min Wed [PRIVATE_IP] 10:04:07 MSK 12min ago homelab-mkdocs-auto-refresh.timer homelab-mkdocs-auto-refresh.service -Wed [PRIVATE_IP] 11:42:30 MSK 1h 25min Wed [PRIVATE_IP] 05:42:30 MSK 4h 34min ago homelab-vps-identity-audit.timer homelab-vps-identity-audit.service -Wed [PRIVATE_IP] 11:54:14 MSK 1h 37min Tue [PRIVATE_IP] 11:54:14 MSK 22h ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service -Wed [PRIVATE_IP] 12:51:38 MSK 2h 34min Tue [PRIVATE_IP] 19:22:05 MSK 14h ago apt-daily.timer apt-daily.service -Thu [PRIVATE_IP] 00:00:00 MSK 13h Wed [PRIVATE_IP] 00:00:14 MSK 10h ago dpkg-db-backup.timer dpkg-db-backup.service -Thu [PRIVATE_IP] 00:07:09 MSK 13h Wed [PRIVATE_IP] 00:10:14 MSK 10h ago homelab-docker-health.timer homelab-docker-health.service -Thu [PRIVATE_IP] 00:09:37 MSK 13h Wed [PRIVATE_IP] 00:29:37 MSK 9h ago logrotate.timer logrotate.service -Thu [PRIVATE_IP] 00:10:47 MSK 13h Wed [PRIVATE_IP] 00:06:05 MSK 10h ago homelab-quality-gate.timer homelab-quality-gate.service -Thu [PRIVATE_IP] 00:17:54 MSK 14h Wed [PRIVATE_IP] 00:01:30 MSK 10h ago homelab-storage-capacity.timer homelab-storage-capacity.service -Thu [PRIVATE_IP] 00:18:32 MSK 14h Wed [PRIVATE_IP] 00:10:07 MSK 10h ago homelab-backup-freshness.timer homelab-backup-freshness.service -Thu [PRIVATE_IP] 00:19:02 MSK 14h Wed [PRIVATE_IP] 00:08:14 MSK 10h ago homelab-evidence-catalog.timer homelab-evidence-catalog.service -Thu [PRIVATE_IP] 01:23:22 MSK 15h Wed [PRIVATE_IP] 01:22:25 MSK 8h ago pve-daily-update.timer pve-daily-update.service -Thu [PRIVATE_IP] 02:15:00 MSK 15h Wed [PRIVATE_IP] 02:15:14 MSK 8h ago homelab-vm-full-backup.timer homelab-vm-full-backup.service -Thu [PRIVATE_IP] 03:22:28 MSK 17h Wed [PRIVATE_IP] 03:10:05 MSK 7h ago homelab-emergency-backup.timer homelab-emergency-backup.service -Thu [PRIVATE_IP] 03:35:00 MSK 17h Wed [PRIVATE_IP] 03:35:00 MSK 6h ago filebrowser-backup.timer filebrowser-backup.service -Thu [PRIVATE_IP] 03:44:14 MSK 17h Wed [PRIVATE_IP] 03:55:05 MSK 6h ago homelab-appbackup-dockge-stacks.timer homelab-appbackup-dockge-stacks.service -Thu [PRIVATE_IP] 03:50:00 MSK 17h Wed [PRIVATE_IP] 03:50:00 MSK 6h ago filebrowser-offhost-sync.timer filebrowser-offhost-sync.service -Thu [PRIVATE_IP] 04:10:00 MSK 17h Wed [PRIVATE_IP] 04:10:14 MSK 6h ago filebrowser-restore-validate.timer filebrowser-restore-validate.service -Thu [PRIVATE_IP] 04:24:28 MSK 18h Wed [PRIVATE_IP] 04:17:30 MSK 5h 59min ago homelab-appbackup-npmplus-edge.timer homelab-appbackup-npmplus-edge.service -Thu [PRIVATE_IP] 04:24:57 MSK 18h Wed [PRIVATE_IP] 04:26:58 MSK 5h 50min ago homelab-gitea-secondary-backup.timer homelab-gitea-secondary-backup.service -Thu [PRIVATE_IP] 04:27:26 MSK 18h Wed [PRIVATE_IP] 04:38:05 MSK 5h 38min ago skladchik-reports-monitor-backup.timer skladchik-reports-monitor-backup.service -Thu [PRIVATE_IP] 04:38:34 MSK 18h Wed [PRIVATE_IP] 04:39:30 MSK 5h 37min ago homelab-edge-vm-offhost-freshness.timer homelab-edge-vm-offhost-freshness.service -Thu [PRIVATE_IP] 05:00:15 MSK 18h Wed [PRIVATE_IP] 05:02:14 MSK 5h 14min ago homelab-appbackup-sqlite-batch.timer homelab-appbackup-sqlite-batch.service -Thu [PRIVATE_IP] 05:12:33 MSK 18h Wed [PRIVATE_IP] 05:13:41 MSK 5h 3min ago homelab-sops-edge-secret-coverage.timer homelab-sops-edge-secret-coverage.service -Thu [PRIVATE_IP] 05:24:55 MSK 19h Wed [PRIVATE_IP] 05:24:08 MSK 4h 52min ago homelab-router-running-config-mail-cloud.timer homelab-router-running-config-mail-cloud.service -Thu [PRIVATE_IP] 05:25:45 MSK 19h Wed [PRIVATE_IP] 05:27:14 MSK 4h 49min ago homelab-appbackup-postgres-batch.timer homelab-appbackup-postgres-batch.service -Thu [PRIVATE_IP] 05:48:18 MSK 19h Wed [PRIVATE_IP] 05:47:30 MSK 4h 29min ago homelab-appbackup-mariadb-batch.timer homelab-appbackup-mariadb-batch.service -Thu [PRIVATE_IP] 05:56:17 MSK 19h Wed [PRIVATE_IP] 06:01:30 MSK 4h 15min ago homelab-extended-appbackup.timer homelab-extended-appbackup.service -Thu [PRIVATE_IP] 06:00:16 MSK 19h Wed [PRIVATE_IP] 06:47:14 MSK 3h 29min ago apt-daily-upgrade.timer apt-daily-upgrade.service -Thu [PRIVATE_IP] 06:32:28 MSK 20h Wed [PRIVATE_IP] 06:27:55 MSK 3h 49min ago homelab-crypto-portfolio-backup.timer homelab-crypto-portfolio-backup.service -Thu [PRIVATE_IP] 06:35:29 MSK 20h Wed [PRIVATE_IP] 06:39:05 MSK 3h 37min ago homelab-verified-backup-health.timer homelab-verified-backup-health.service -Thu [PRIVATE_IP] 06:41:38 MSK 20h Wed [PRIVATE_IP] 06:39:30 MSK 3h 37min ago homelab-alertmanager-backup.timer homelab-alertmanager-backup.service -Thu [PRIVATE_IP] 06:50:56 MSK 20h Wed [PRIVATE_IP] 06:44:25 MSK 3h 32min ago homelab-mail-cloud-critical-upload.timer homelab-mail-cloud-critical-upload.service -Thu [PRIVATE_IP] 06:52:54 MSK 20h Wed [PRIVATE_IP] 06:52:07 MSK 3h 24min ago homelab-beszel-backup.timer homelab-beszel-backup.service -Thu [PRIVATE_IP] 07:02:47 MSK 20h Wed [PRIVATE_IP] 06:59:07 MSK 3h 17min ago homelab-blackbox-exporter-backup.timer homelab-blackbox-exporter-backup.service -Thu [PRIVATE_IP] 07:04:55 MSK 20h Wed [PRIVATE_IP] 07:16:21 MSK 3h 0min ago homelab-drift-check.timer homelab-drift-check.service -Thu [PRIVATE_IP] 07:05:06 MSK 20h Wed [PRIVATE_IP] 07:07:14 MSK 3h 9min ago homelab-legacy-monitoring-backups.timer homelab-legacy-monitoring-backups.service -Thu [PRIVATE_IP] 07:07:52 MSK 20h Wed [PRIVATE_IP] 07:02:27 MSK 3h 14min ago homelab-backup-healthcheck.timer homelab-backup-healthcheck.service -Thu [PRIVATE_IP] 07:32:28 MSK 21h Wed [PRIVATE_IP] 07:38:25 MSK 2h 38min ago homelab-cluster-admin-incident-engine-backup.timer homelab-cluster-admin-incident-engine-backup.service -Thu [PRIVATE_IP] 07:37:27 MSK 21h Wed [PRIVATE_IP] 07:35:14 MSK 2h 41min ago homelab-vm-backup-health.timer homelab-vm-backup-health.service -Thu [PRIVATE_IP] 07:38:55 MSK 21h Wed [PRIVATE_IP] 07:36:14 MSK 2h 40min ago homelab-service-registry-check.timer homelab-service-registry-check.service -Thu [PRIVATE_IP] 07:45:48 MSK 21h Wed [PRIVATE_IP] 07:42:14 MSK 2h 34min ago homelab-mail-cloud-nextcloud-vm-upload.timer homelab-mail-cloud-nextcloud-vm-upload.service -Thu [PRIVATE_IP] 07:51:25 MSK 21h Wed [PRIVATE_IP] 08:03:14 MSK 2h 13min ago homelab-desired-state-sync.timer homelab-desired-state-sync.service -Thu [PRIVATE_IP] 07:54:06 MSK 21h Wed [PRIVATE_IP] 07:53:14 MSK 2h 23min ago homelab-alerting-health.timer homelab-alerting-health.service -Thu [PRIVATE_IP] 07:55:12 MSK 21h Wed [PRIVATE_IP] 07:47:14 MSK 2h 29min ago homelab-dependency-map-check.timer homelab-dependency-map-check.service -Thu [PRIVATE_IP] 07:57:48 MSK 21h Wed [PRIVATE_IP] 07:58:14 MSK 2h 18min ago homelab-duty-admin-report.timer homelab-duty-admin-report.service -Thu [PRIVATE_IP] 08:00:20 MSK 21h Wed [PRIVATE_IP] 08:10:41 MSK 2h 6min ago homelab-backup-sla-health.timer homelab-backup-sla-health.service -Thu [PRIVATE_IP] 08:01:04 MSK 21h Wed [PRIVATE_IP] 07:49:30 MSK 2h 27min ago homelab-runbook-generate.timer homelab-runbook-generate.service -Thu [PRIVATE_IP] 08:09:01 MSK 21h Wed [PRIVATE_IP] 08:19:05 MSK 1h 57min ago homelab-overall-health.timer homelab-overall-health.service -Thu [PRIVATE_IP] 08:17:53 MSK 22h Wed [PRIVATE_IP] 08:25:14 MSK 1h 51min ago homelab-kuma-monitor-policy.timer homelab-kuma-monitor-policy.service -Thu [PRIVATE_IP] 08:20:55 MSK 22h Wed [PRIVATE_IP] 08:37:06 MSK 1h 39min ago homelab-vm-backup-policy.timer homelab-vm-backup-policy.service -Thu [PRIVATE_IP] 08:29:32 MSK 22h Wed [PRIVATE_IP] 08:28:30 MSK 1h 48min ago homelab-final-readiness-gate.timer homelab-final-readiness-gate.service -Thu [PRIVATE_IP] 08:35:14 MSK 22h Wed [PRIVATE_IP] 08:45:05 MSK 1h 31min ago homelab-secret-exposure-guard.timer homelab-secret-exposure-guard.service -Thu [PRIVATE_IP] 08:39:53 MSK 22h Wed [PRIVATE_IP] 08:25:14 MSK 1h 51min ago homelab-capacity-risk.timer homelab-capacity-risk.service -Thu [PRIVATE_IP] 08:42:24 MSK 22h Wed [PRIVATE_IP] 08:53:14 MSK 1h 23min ago homelab-cluster-passport.timer homelab-cluster-passport.service -Thu [PRIVATE_IP] 08:45:03 MSK 22h Wed [PRIVATE_IP] 08:53:36 MSK 1h 23min ago memos-backup.timer memos-backup.service -Thu [PRIVATE_IP] 08:45:36 MSK 22h Wed [PRIVATE_IP] 08:40:14 MSK 1h 36min ago homelab-backup-coverage-matrix.timer homelab-backup-coverage-matrix.service -Thu [PRIVATE_IP] 08:48:06 MSK 22h Wed [PRIVATE_IP] 08:47:14 MSK 1h 29min ago immich-media-offhost-sync.timer immich-media-offhost-sync.service -Thu [PRIVATE_IP] 08:59:54 MSK 22h Wed [PRIVATE_IP] 08:43:29 MSK 1h 33min ago homelab-golden-state-index.timer homelab-golden-state-index.service -Thu [PRIVATE_IP] 09:14:42 MSK 22h Wed [PRIVATE_IP] 05:12:14 MSK 5h 4min ago man-db.timer man-db.service -Thu [PRIVATE_IP] 09:16:17 MSK 22h Wed [PRIVATE_IP] 09:11:45 MSK 1h 5min ago memos-offhost-sync.timer memos-offhost-sync.service -Thu [PRIVATE_IP] 09:55:25 MSK 23h Wed [PRIVATE_IP] 10:11:14 MSK 5min ago paperless-restore-dry-run.timer paperless-restore-dry-run.service -Thu [PRIVATE_IP] 10:15:00 MSK 23h Wed [PRIVATE_IP] 10:15:07 MSK 1min 55s ago skladchik-reports-monitor-monthly-selftest-watch.timer skladchik-reports-monitor-monthly-selftest-watch.service -Sun [PRIVATE_IP] 03:10:21 MSK 3 days Sun [PRIVATE_IP] 03:10:29 MSK 3 days ago e2scrub_all.timer e2scrub_all.service -Sun [PRIVATE_IP] 03:10:52 MSK 3 days Sun [PRIVATE_IP] 03:10:14 MSK 3 days ago xfs_scrub_all.timer xfs_scrub_all.service -Sun [PRIVATE_IP] 03:34:47 MSK 3 days Sun [PRIVATE_IP] 03:45:37 MSK 3 days ago homelab-auto-backup.timer homelab-auto-backup.service -Sun [PRIVATE_IP] 05:17:43 MSK 3 days Sun [PRIVATE_IP] 05:11:25 MSK 3 days ago skladchik-reports-monitor-backup-restore-check.timer skladchik-reports-monitor-backup-restore-check.service -Sun [PRIVATE_IP] 09:32:36 MSK 3 days Sun [PRIVATE_IP] 09:32:29 MSK 3 days ago homelab-mail-cloud-edge-vm-upload.timer homelab-mail-cloud-edge-vm-upload.service -Sun [PRIVATE_IP] 10:29:15 MSK 4 days Sun [PRIVATE_IP] 10:06:07 MSK 3 days ago homelab-vm-local-dumps-2cloud.timer homelab-vm-local-dumps-2cloud.service -Sun [PRIVATE_IP] 11:13:32 MSK 4 days Sun [PRIVATE_IP] 11:08:41 MSK 2 days ago homelab-vm-local-dumps-retention.timer homelab-vm-local-dumps-retention.service -Mon [PRIVATE_IP] 00:09:19 MSK 4 days Mon [PRIVATE_IP] 00:00:29 MSK 2 days ago homelab-secret-sanity.timer homelab-secret-sanity.service -Mon [PRIVATE_IP] 01:39:15 MSK 4 days Mon [PRIVATE_IP] 00:51:14 MSK 2 days ago fstrim.timer fstrim.service -Mon [PRIVATE_IP] 07:34:51 MSK 4 days Mon [PRIVATE_IP] 07:25:14 MSK 2 days ago homelab-mail-cloud-restore-drill.timer homelab-mail-cloud-restore-drill.service -Thu [PRIVATE_IP] 06:00:00 MSK 2 months 23 days Wed [PRIVATE_IP] 06:00:00 MSK - homelab-vm-full-restore-drill.timer homelab-vm-full-restore-drill.service -- - Wed [PRIVATE_IP] 10:17:03 MSK 12ms ago homelab-cluster-admin-inventory-sync.timer homelab-cluster-admin-inventory-sync.service -- - Wed [PRIVATE_IP] 10:17:03 MSK 13ms ago homelab-router-watchdog.timer homelab-router-watchdog.service -- - - - prometheus-node-exporter-ipmitool-sensor.timer prometheus-node-exporter-ipmitool-sensor.service -- - - - prometheus-node-exporter-mellanox-hca-temp.timer prometheus-node-exporter-mellanox-hca-temp.service -- - - - prometheus-node-exporter-smartmon.timer prometheus-node-exporter-smartmon.service - -95 timers listed. -- Обрезанная, повреждённая или частично вставленная команда считается невыполненной; сначала проводится side-effect audit. -- Хвост parse-ошибки закрывается только после доказательства отсутствия изменений и временных артефактов. -- Proof: /var/lib/homelab-change-sets/operator-command-size-guard-v[PRIVATE_IP]T182653Z/report.txt - -## HOMELAB_ADMIN_CLI_CONTRACT_[PRIVATE_IP] -- Поддерживаемые команды: version, status, lint TASK_DIR, validate TASK_DIR, run TASK_DIR PHASE. -- Отдельная команда --help отсутствует. Неизвестный аргумент печатает usage и штатно возвращает RC=64. -- Нельзя трактовать RC=64 от --help как неисправность runner. -- Для проверки доступности runner использовать homelab-admin version; для структуры CLI использовать зафиксированную usage-строку. -- Proof: /var/lib/homelab-change-sets/homelab-admin-cli-contract-fix-v[PRIVATE_IP]T183338Z/report.txt - -AUTOMATIC_CLUSTER_CONTEXT_REFRESH_[PRIVATE_IP] -Collector: /usr/local/sbin/homelab-context-collect -Scheduler: hourly at minute 17 via /etc/cron.d/homelab-context-refresh -Destination: immutable Gitea runtime history with CONTEXT-AUTO UTC command IDs. - -AUTOMATIC_CLUSTER_CONTEXT_REFRESH_DIRECT_[PRIVATE_IP] -Publisher: /usr/local/sbin/homelab-context-refresh-direct -Schedule: hourly at minute 17. -Destination: immutable assistant-runtime history with CONTEXT-AUTO UTC IDs. -- Registered at: [PRIVATE_IP]T06:27:06Z - -AUTOREFRESH_INLINE_FAILURE_[PRIVATE_IP] -Attempts 048 and 049 did not appear in immutable history. -Rule: use validated local helper scripts and a simple scheduler entry; never embed the full collector in cron or nested SSH quoting. - -AUTOREFRESH_WRAPPER_PUBLICATION_FAILURE_[PRIVATE_IP] -Commands [PRIVATE_IP] did not reach immutable history through homelab-chat-run. -Resolution: hourly snapshots use direct scp plus homelab-runtime-receive publication. - -AUTOREFRESH_052_NOT_PUBLISHED_[PRIVATE_IP] -CONTEXT-AUTOREFRESH-ACTIVATE-052 did not appear in immutable history; direct publisher retry requires sanitization before transmission. - -IMMUTABLE_HISTORY_FALSE_NEGATIVE_[PRIVATE_IP] -BACKUP-AUDIT-CONTROLPLANE-054 was successfully published at commit 2b966acfe[PRIVATE_IP]d4a62bf[PRIVATE_IP]bdd1a073, but was incorrectly reported missing because a stale directory listing was treated as authoritative. -Rule: verify the exact COMMAND_ID result, wrapper publication status and commit SHA; never infer absence from a cached directory listing. - -BACKUP_UNSAFE_SOURCE_CAPTURE_071_PARSE_ERROR_[PRIVATE_IP] -BACKUP-UNSAFE-SOURCE-CAPTURE-071 failed before execution: shell syntax error near unexpected token (. -Resolution: avoid nested quote layers; parse targets first and pass file paths as simple SSH arguments. OUTPUT_END CHAT_OUTPUT_END