From c6ea0689259fd2c6356ef2eae320faa262a143da Mon Sep 17 00:00:00 2001 From: homelab-runtime-publisher Date: Mon, 21 Sep 2026 03:17:14 +0000 Subject: [PATCH] runtime: publish SIGNALBOT-260921-RECONCILIATION-FETCH-CALLSITE-READONLY-052SRC2 --- ...ATION-FETCH-CALLSITE-READONLY-052SRC2.json | 38 ++++ ...IATION-FETCH-CALLSITE-READONLY-052SRC2.txt | 35 ++++ runtime/latest.json | 39 +++- runtime/latest.txt | 179 +++--------------- 4 files changed, 138 insertions(+), 153 deletions(-) create mode 100644 runtime/history/SIGNALBOT-260921-RECONCILIATION-FETCH-CALLSITE-READONLY-052SRC2.json create mode 100644 runtime/history/SIGNALBOT-260921-RECONCILIATION-FETCH-CALLSITE-READONLY-052SRC2.txt diff --git a/runtime/history/SIGNALBOT-260921-RECONCILIATION-FETCH-CALLSITE-READONLY-052SRC2.json b/runtime/history/SIGNALBOT-260921-RECONCILIATION-FETCH-CALLSITE-READONLY-052SRC2.json new file mode 100644 index 00000000..49f1cac4 --- /dev/null +++ b/runtime/history/SIGNALBOT-260921-RECONCILIATION-FETCH-CALLSITE-READONLY-052SRC2.json @@ -0,0 +1,38 @@ +{ + "schema_version": 1, + "channel": "homelab-runtime", + "command_id": "SIGNALBOT-260921-RECONCILIATION-FETCH-CALLSITE-READONLY-052SRC2", + "status": "OK", + "rc": 0, + "host": "pve01", + "mode": "read-only", + "component": "signalbot-reconciliation-fetch-callsite-readonly", + "started_at_utc": "2026-09-21T03:17:13Z", + "finished_at_utc": "2026-09-21T03:17:14Z", + "reference_register_checked": true, + "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", + "error_register_checked": true, + "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", + "command_sha256": "a2394e2215fc751b3d1ff578290cdb8a4ff61a0f8db3d9fe99fe41d928009871", + "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": "bf196e2a68fb862baf3f45a031942ecc28847aa8c27da807cc17d4a3d36f7894", + "sanitized_output_sha256": "bf196e2a68fb862baf3f45a031942ecc28847aa8c27da807cc17d4a3d36f7894", + "output_truncated_in_json": false, + "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", + "output": "SIGNALBOT052SRC2_RESULT={\"evidence\":\"023ce0a041b50b866a48d9f752bd80479a34789d82f73c81d18246ed8871ef8e /app/demonov_forward_map/bitfinex_reconciliation.py\\nclass BitfinexPublicTradeHistoryClient:\\n def __init__(\\n self,\\n *,\\n fetch_json: Callable[..., object] | None = None,\\n timeout: float = 20.0,\\n max_bytes: int = 4 * 1024 * 1024,\\n ) -> None:\\n self._fetch_json = fetch_json or _stdlib_fetch_json\\n self.timeout = float(timeout)\\n self.max_bytes = int(max_bytes)\\n\\n def fetch_trade_window(\\n self,\\n symbol: str,\\n *,\\n start_mts: datetime,\\n end_mts: datetime,\\n ) -> BitfinexTradeHistoryBatch:\\n if not isinstance(symbol, str) or not symbol.startswith(\\\"t\\\") or len(symbol) < 2:\\n raise DemonovError(\\\"Bitfinex trade history symbol invalid\\\")\\n start_mts = _utc(start_mts, \\\"start_mts\\\")\\n end_mts = _utc(end_mts, \\\"end_mts\\\")\\n if end_mts < start_mts:\\n raise DemonovError(\\\"Bitfinex trade history interval invalid\\\")\\n start_ms = int(start_mts.timestamp() * 1000)\\n end_ms = int(end_mts.timestamp() * 1000)\\n query = urlencode({\\\"start\\\": start_ms, \\\"end\\\": end_ms, \\\"sort\\\": 1, \\\"limit\\\": BITFINEX_PUBLIC_HISTORY_LIMIT})\\n url = f\\\"{BITFINEX_PUBLIC_TRADES_BASE}/{quote(symbol, safe='')}/hist?{query}\\\"\\n try:\\n payload = self._fetch_json(\\n url,\\n timeout=self.timeout,\\n max_bytes=self.max_bytes,\\n )\\n except DemonovError:\\n raise\\n except Exception as exc:\\n raise DemonovError(\\n \\\"Bitfinex public trade history request failed\\\"\\n ) from exc\\n if not isinstance(payload, list):\\n raise DemonovError(\\\"Bitfinex public trade history payload invalid\\\")\\n\\n normalized: list[BitfinexCanonicalTradeV1] = []\\n raw_rows: list[list[object]] = []\\n seen: dict[str, str] = {}\\n order_keys: list[tuple[datetime, int]] = []\\n for raw in payload:\\n if not isinstance(raw, list):\\n raise DemonovError(\\\"Bitfinex REST trade row malformed\\\")\\n trade = normalize_bitfinex_rest_trade(raw)\\n raw_rows.append(list(raw[:4]))\\n prior = seen.get(trade.trade_identity)\\n if prior is not None:\\n if prior != trade.semantic_hash:\\n raise DemonovError(\\\"Bitfinex REST trade semantic conflict\\\")\\n continue\\n seen[trade.trade_identity] = trade.semantic_hash\\n normalized.append(trade)\\n order_keys.append((trade.mts, trade.trade_id))\\n if order_keys != sorted(order_keys):\\n raise DemonovError(\\\"Bitfinex public trade history not ascending\\\")\\n\\n evidence_sha256 = canonical_hash(\\n {\\n \\\"schema\\\": \\\"CR0116_BITFINEX_RECONCILIATION_REST_EVIDENCE_V1\\\",\\n \\\"symbol\\\": symbol,\\n \\\"start_mts\\\": start_mts,\\n \\\"end_mts\\\": end_mts,\\n \\\"raw_row_count\\\": len(payload),\\n \\\"rows\\\": raw_rows,\\n }\\n )\\n return BitfinexTradeHistoryBatch(\\n symbol=symbol,\\n start_mts=start_mts,\\n end_mts=end_mts,\\n raw_row_count=len(payload),\\n trades=tuple(normalized),\\n evidence_sha256=evidence_sha256,\\n )\\n\",\"guest_exitcode\":0,\"outer_rc\":0,\"stderr_present\":false}\nTASK_RESULT=PASS_SIGNALBOT_052SRC2_CALLSITE_CAPTURED\nHOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"SIGNALBOT-260921-RECONCILIATION-FETCH-CALLSITE-READONLY-052SRC2\",\"status\":\"OK\",\"changes_made\":false,\"rollback_started\":false,\"rollback_restored\":null}\n" +} diff --git a/runtime/history/SIGNALBOT-260921-RECONCILIATION-FETCH-CALLSITE-READONLY-052SRC2.txt b/runtime/history/SIGNALBOT-260921-RECONCILIATION-FETCH-CALLSITE-READONLY-052SRC2.txt new file mode 100644 index 00000000..9d280456 --- /dev/null +++ b/runtime/history/SIGNALBOT-260921-RECONCILIATION-FETCH-CALLSITE-READONLY-052SRC2.txt @@ -0,0 +1,35 @@ +CHAT_OUTPUT_BEGIN +COMMAND_ID=SIGNALBOT-260921-RECONCILIATION-FETCH-CALLSITE-READONLY-052SRC2 +STATUS=OK +RC=0 +HOST=pve01 +MODE=read-only +COMPONENT=signalbot-reconciliation-fetch-callsite-readonly +REFERENCE_REGISTER_CHECK=OK +REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 +ERROR_REGISTER_CHECK=OK +ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 +COMMAND_SHA256=a2394e2215fc751b3d1ff578290cdb8a4ff61a0f8db3d9fe99fe41d928009871 +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=bf196e2a68fb862baf3f45a031942ecc28847aa8c27da807cc17d4a3d36f7894 +SANITIZED_OUTPUT_SHA256=bf196e2a68fb862baf3f45a031942ecc28847aa8c27da807cc17d4a3d36f7894 +OUTPUT_BEGIN +SIGNALBOT052SRC2_RESULT={"evidence":"023ce0a041b50b866a48d9f752bd80479a34789d82f73c81d18246ed8871ef8e /app/demonov_forward_map/bitfinex_reconciliation.py\nclass BitfinexPublicTradeHistoryClient:\n def __init__(\n self,\n *,\n fetch_json: Callable[..., object] | None = None,\n timeout: float = 20.0,\n max_bytes: int = 4 * 1024 * 1024,\n ) -> None:\n self._fetch_json = fetch_json or _stdlib_fetch_json\n self.timeout = float(timeout)\n self.max_bytes = int(max_bytes)\n\n def fetch_trade_window(\n self,\n symbol: str,\n *,\n start_mts: datetime,\n end_mts: datetime,\n ) -> BitfinexTradeHistoryBatch:\n if not isinstance(symbol, str) or not symbol.startswith(\"t\") or len(symbol) < 2:\n raise DemonovError(\"Bitfinex trade history symbol invalid\")\n start_mts = _utc(start_mts, \"start_mts\")\n end_mts = _utc(end_mts, \"end_mts\")\n if end_mts < start_mts:\n raise DemonovError(\"Bitfinex trade history interval invalid\")\n start_ms = int(start_mts.timestamp() * 1000)\n end_ms = int(end_mts.timestamp() * 1000)\n query = urlencode({\"start\": start_ms, \"end\": end_ms, \"sort\": 1, \"limit\": BITFINEX_PUBLIC_HISTORY_LIMIT})\n url = f\"{BITFINEX_PUBLIC_TRADES_BASE}/{quote(symbol, safe='')}/hist?{query}\"\n try:\n payload = self._fetch_json(\n url,\n timeout=self.timeout,\n max_bytes=self.max_bytes,\n )\n except DemonovError:\n raise\n except Exception as exc:\n raise DemonovError(\n \"Bitfinex public trade history request failed\"\n ) from exc\n if not isinstance(payload, list):\n raise DemonovError(\"Bitfinex public trade history payload invalid\")\n\n normalized: list[BitfinexCanonicalTradeV1] = []\n raw_rows: list[list[object]] = []\n seen: dict[str, str] = {}\n order_keys: list[tuple[datetime, int]] = []\n for raw in payload:\n if not isinstance(raw, list):\n raise DemonovError(\"Bitfinex REST trade row malformed\")\n trade = normalize_bitfinex_rest_trade(raw)\n raw_rows.append(list(raw[:4]))\n prior = seen.get(trade.trade_identity)\n if prior is not None:\n if prior != trade.semantic_hash:\n raise DemonovError(\"Bitfinex REST trade semantic conflict\")\n continue\n seen[trade.trade_identity] = trade.semantic_hash\n normalized.append(trade)\n order_keys.append((trade.mts, trade.trade_id))\n if order_keys != sorted(order_keys):\n raise DemonovError(\"Bitfinex public trade history not ascending\")\n\n evidence_sha256 = canonical_hash(\n {\n \"schema\": \"CR0116_BITFINEX_RECONCILIATION_REST_EVIDENCE_V1\",\n \"symbol\": symbol,\n \"start_mts\": start_mts,\n \"end_mts\": end_mts,\n \"raw_row_count\": len(payload),\n \"rows\": raw_rows,\n }\n )\n return BitfinexTradeHistoryBatch(\n symbol=symbol,\n start_mts=start_mts,\n end_mts=end_mts,\n raw_row_count=len(payload),\n trades=tuple(normalized),\n evidence_sha256=evidence_sha256,\n )\n","guest_exitcode":0,"outer_rc":0,"stderr_present":false} +TASK_RESULT=PASS_SIGNALBOT_052SRC2_CALLSITE_CAPTURED +HOMELAB_RESULT_CONTRACT={"version":1,"command_id":"SIGNALBOT-260921-RECONCILIATION-FETCH-CALLSITE-READONLY-052SRC2","status":"OK","changes_made":false,"rollback_started":false,"rollback_restored":null} + +OUTPUT_END +CHAT_OUTPUT_END diff --git a/runtime/latest.json b/runtime/latest.json index fe9c6881..49f1cac4 100644 --- a/runtime/latest.json +++ b/runtime/latest.json @@ -1 +1,38 @@ -{"schema_version":1,"channel":"homelab-runtime","command_id":"CONTEXT-AUTO-20260921T031701Z","status":"OK","rc":0,"host":"pve01","mode":"read-only","component":"cluster-context","started_at_utc":"2026-09-21T03:17:01Z","finished_at_utc":"2026-09-21T03:17:02Z","reference_register_checked":true,"reference_sha256":"5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66","error_register_checked":true,"error_register_sha256":"3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0","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": "SIGNALBOT-260921-RECONCILIATION-FETCH-CALLSITE-READONLY-052SRC2", + "status": "OK", + "rc": 0, + "host": "pve01", + "mode": "read-only", + "component": "signalbot-reconciliation-fetch-callsite-readonly", + "started_at_utc": "2026-09-21T03:17:13Z", + "finished_at_utc": "2026-09-21T03:17:14Z", + "reference_register_checked": true, + "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", + "error_register_checked": true, + "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", + "command_sha256": "a2394e2215fc751b3d1ff578290cdb8a4ff61a0f8db3d9fe99fe41d928009871", + "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": "bf196e2a68fb862baf3f45a031942ecc28847aa8c27da807cc17d4a3d36f7894", + "sanitized_output_sha256": "bf196e2a68fb862baf3f45a031942ecc28847aa8c27da807cc17d4a3d36f7894", + "output_truncated_in_json": false, + "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", + "output": "SIGNALBOT052SRC2_RESULT={\"evidence\":\"023ce0a041b50b866a48d9f752bd80479a34789d82f73c81d18246ed8871ef8e /app/demonov_forward_map/bitfinex_reconciliation.py\\nclass BitfinexPublicTradeHistoryClient:\\n def __init__(\\n self,\\n *,\\n fetch_json: Callable[..., object] | None = None,\\n timeout: float = 20.0,\\n max_bytes: int = 4 * 1024 * 1024,\\n ) -> None:\\n self._fetch_json = fetch_json or _stdlib_fetch_json\\n self.timeout = float(timeout)\\n self.max_bytes = int(max_bytes)\\n\\n def fetch_trade_window(\\n self,\\n symbol: str,\\n *,\\n start_mts: datetime,\\n end_mts: datetime,\\n ) -> BitfinexTradeHistoryBatch:\\n if not isinstance(symbol, str) or not symbol.startswith(\\\"t\\\") or len(symbol) < 2:\\n raise DemonovError(\\\"Bitfinex trade history symbol invalid\\\")\\n start_mts = _utc(start_mts, \\\"start_mts\\\")\\n end_mts = _utc(end_mts, \\\"end_mts\\\")\\n if end_mts < start_mts:\\n raise DemonovError(\\\"Bitfinex trade history interval invalid\\\")\\n start_ms = int(start_mts.timestamp() * 1000)\\n end_ms = int(end_mts.timestamp() * 1000)\\n query = urlencode({\\\"start\\\": start_ms, \\\"end\\\": end_ms, \\\"sort\\\": 1, \\\"limit\\\": BITFINEX_PUBLIC_HISTORY_LIMIT})\\n url = f\\\"{BITFINEX_PUBLIC_TRADES_BASE}/{quote(symbol, safe='')}/hist?{query}\\\"\\n try:\\n payload = self._fetch_json(\\n url,\\n timeout=self.timeout,\\n max_bytes=self.max_bytes,\\n )\\n except DemonovError:\\n raise\\n except Exception as exc:\\n raise DemonovError(\\n \\\"Bitfinex public trade history request failed\\\"\\n ) from exc\\n if not isinstance(payload, list):\\n raise DemonovError(\\\"Bitfinex public trade history payload invalid\\\")\\n\\n normalized: list[BitfinexCanonicalTradeV1] = []\\n raw_rows: list[list[object]] = []\\n seen: dict[str, str] = {}\\n order_keys: list[tuple[datetime, int]] = []\\n for raw in payload:\\n if not isinstance(raw, list):\\n raise DemonovError(\\\"Bitfinex REST trade row malformed\\\")\\n trade = normalize_bitfinex_rest_trade(raw)\\n raw_rows.append(list(raw[:4]))\\n prior = seen.get(trade.trade_identity)\\n if prior is not None:\\n if prior != trade.semantic_hash:\\n raise DemonovError(\\\"Bitfinex REST trade semantic conflict\\\")\\n continue\\n seen[trade.trade_identity] = trade.semantic_hash\\n normalized.append(trade)\\n order_keys.append((trade.mts, trade.trade_id))\\n if order_keys != sorted(order_keys):\\n raise DemonovError(\\\"Bitfinex public trade history not ascending\\\")\\n\\n evidence_sha256 = canonical_hash(\\n {\\n \\\"schema\\\": \\\"CR0116_BITFINEX_RECONCILIATION_REST_EVIDENCE_V1\\\",\\n \\\"symbol\\\": symbol,\\n \\\"start_mts\\\": start_mts,\\n \\\"end_mts\\\": end_mts,\\n \\\"raw_row_count\\\": len(payload),\\n \\\"rows\\\": raw_rows,\\n }\\n )\\n return BitfinexTradeHistoryBatch(\\n symbol=symbol,\\n start_mts=start_mts,\\n end_mts=end_mts,\\n raw_row_count=len(payload),\\n trades=tuple(normalized),\\n evidence_sha256=evidence_sha256,\\n )\\n\",\"guest_exitcode\":0,\"outer_rc\":0,\"stderr_present\":false}\nTASK_RESULT=PASS_SIGNALBOT_052SRC2_CALLSITE_CAPTURED\nHOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"SIGNALBOT-260921-RECONCILIATION-FETCH-CALLSITE-READONLY-052SRC2\",\"status\":\"OK\",\"changes_made\":false,\"rollback_started\":false,\"rollback_restored\":null}\n" +} diff --git a/runtime/latest.txt b/runtime/latest.txt index f7690a08..9d280456 100644 --- a/runtime/latest.txt +++ b/runtime/latest.txt @@ -1,160 +1,35 @@ CHAT_OUTPUT_BEGIN -COMMAND_ID=CONTEXT-AUTO-[PRIVATE_IP]701Z +COMMAND_ID=SIGNALBOT-260921-RECONCILIATION-FETCH-CALLSITE-READONLY-052SRC2 STATUS=OK RC=0 HOST=pve01 -COMPONENT=cluster-context -REFERENCE_SHA[PRIVATE_IP]e5154c41cb[PRIVATE_IP]aca68090be[PRIVATE_IP]bf[PRIVATE_IP]df[PRIVATE_IP] -ERROR_REGISTER_SHA[PRIVATE_IP]ec0f527ed3afeed[PRIVATE_IP]ee[PRIVATE_IP]bbfb[PRIVATE_IP]af4ba7ba0 +MODE=read-only +COMPONENT=signalbot-reconciliation-fetch-callsite-readonly +REFERENCE_REGISTER_CHECK=OK +REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 +ERROR_REGISTER_CHECK=OK +ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 +COMMAND_SHA256=a2394e2215fc751b3d1ff578290cdb8a4ff61a0f8db3d9fe99fe41d928009871 +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=bf196e2a68fb862baf3f45a031942ecc28847aa8c27da807cc17d4a3d36f7894 +SANITIZED_OUTPUT_SHA256=bf196e2a68fb862baf3f45a031942ecc28847aa8c27da807cc17d4a3d36f7894 OUTPUT_BEGIN -GENERATED_AT_UTC=[PRIVATE_IP]T03:17:01Z -Cluster information -------------------- -Name: homelab -Config Version: 3 -Transport: knet -Secure auth: on +SIGNALBOT052SRC2_RESULT={"evidence":"023ce0a041b50b866a48d9f752bd80479a34789d82f73c81d18246ed8871ef8e /app/demonov_forward_map/bitfinex_reconciliation.py\nclass BitfinexPublicTradeHistoryClient:\n def __init__(\n self,\n *,\n fetch_json: Callable[..., object] | None = None,\n timeout: float = 20.0,\n max_bytes: int = 4 * 1024 * 1024,\n ) -> None:\n self._fetch_json = fetch_json or _stdlib_fetch_json\n self.timeout = float(timeout)\n self.max_bytes = int(max_bytes)\n\n def fetch_trade_window(\n self,\n symbol: str,\n *,\n start_mts: datetime,\n end_mts: datetime,\n ) -> BitfinexTradeHistoryBatch:\n if not isinstance(symbol, str) or not symbol.startswith(\"t\") or len(symbol) < 2:\n raise DemonovError(\"Bitfinex trade history symbol invalid\")\n start_mts = _utc(start_mts, \"start_mts\")\n end_mts = _utc(end_mts, \"end_mts\")\n if end_mts < start_mts:\n raise DemonovError(\"Bitfinex trade history interval invalid\")\n start_ms = int(start_mts.timestamp() * 1000)\n end_ms = int(end_mts.timestamp() * 1000)\n query = urlencode({\"start\": start_ms, \"end\": end_ms, \"sort\": 1, \"limit\": BITFINEX_PUBLIC_HISTORY_LIMIT})\n url = f\"{BITFINEX_PUBLIC_TRADES_BASE}/{quote(symbol, safe='')}/hist?{query}\"\n try:\n payload = self._fetch_json(\n url,\n timeout=self.timeout,\n max_bytes=self.max_bytes,\n )\n except DemonovError:\n raise\n except Exception as exc:\n raise DemonovError(\n \"Bitfinex public trade history request failed\"\n ) from exc\n if not isinstance(payload, list):\n raise DemonovError(\"Bitfinex public trade history payload invalid\")\n\n normalized: list[BitfinexCanonicalTradeV1] = []\n raw_rows: list[list[object]] = []\n seen: dict[str, str] = {}\n order_keys: list[tuple[datetime, int]] = []\n for raw in payload:\n if not isinstance(raw, list):\n raise DemonovError(\"Bitfinex REST trade row malformed\")\n trade = normalize_bitfinex_rest_trade(raw)\n raw_rows.append(list(raw[:4]))\n prior = seen.get(trade.trade_identity)\n if prior is not None:\n if prior != trade.semantic_hash:\n raise DemonovError(\"Bitfinex REST trade semantic conflict\")\n continue\n seen[trade.trade_identity] = trade.semantic_hash\n normalized.append(trade)\n order_keys.append((trade.mts, trade.trade_id))\n if order_keys != sorted(order_keys):\n raise DemonovError(\"Bitfinex public trade history not ascending\")\n\n evidence_sha256 = canonical_hash(\n {\n \"schema\": \"CR0116_BITFINEX_RECONCILIATION_REST_EVIDENCE_V1\",\n \"symbol\": symbol,\n \"start_mts\": start_mts,\n \"end_mts\": end_mts,\n \"raw_row_count\": len(payload),\n \"rows\": raw_rows,\n }\n )\n return BitfinexTradeHistoryBatch(\n symbol=symbol,\n start_mts=start_mts,\n end_mts=end_mts,\n raw_row_count=len(payload),\n trades=tuple(normalized),\n evidence_sha256=evidence_sha256,\n )\n","guest_exitcode":0,"outer_rc":0,"stderr_present":false} +TASK_RESULT=PASS_SIGNALBOT_052SRC2_CALLSITE_CAPTURED +HOMELAB_RESULT_CONTRACT={"version":1,"command_id":"SIGNALBOT-260921-RECONCILIATION-FETCH-CALLSITE-READONLY-052SRC2","status":"OK","changes_made":false,"rollback_started":false,"rollback_restored":null} -Quorum information ------------------- -Date: Mon Sep [PRIVATE_IP] 2026 -Quorum provider: corosync_votequorum -Nodes: 3 -Node ID: [PRIVATE_IP] -Ring ID: 1.130 -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]599072,"disk":0,"diskread":[PRIVATE_IP],"diskwrite":[PRIVATE_IP],"id":"qemu/100","maxcpu":4,"maxdisk":[PRIVATE_IP],"maxmem":[PRIVATE_IP],"mem":[PRIVATE_IP],"memhost":[PRIVATE_IP],"name":"pvepro-prod","netin":[PRIVATE_IP],"netout":[PRIVATE_IP],"node":"pve01","status":"running","template":0,"type":"qemu","uptime":94597,"vmid":100},{"cpu":0,"disk":0,"diskread":0,"diskwrite":0,"id":"qemu/101","maxcpu":4,"maxdisk":[PRIVATE_IP],"maxmem":[PRIVATE_IP],"mem":0,"memhost":0,"name":"pvepro-staging-v1","netin":0,"netout":0,"node":"pve01","status":"stopped","template":0,"type":"qemu","uptime":0,"vmid":101},{"cpu":[PRIVATE_IP]012401,"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":[PRIVATE_IP],"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":[PRIVATE_IP],"vmid":111},{"cpu":[PRIVATE_IP][PRIVATE_IP],"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":[PRIVATE_IP],"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":[PRIVATE_IP],"vmid":113},{"cpu":[PRIVATE_IP]20832,"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":[PRIVATE_IP],"vmid":130},{"cpu":[PRIVATE_IP]8387,"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":"snikket","netin":[PRIVATE_IP],"netout":[PRIVATE_IP],"node":"pve01","status":"running","template":0,"type":"qemu","uptime":[PRIVATE_IP],"vmid":150},{"cpu":[PRIVATE_IP]173883,"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":[PRIVATE_IP],"vmid":160},{"cpu":[PRIVATE_IP]6353,"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":[PRIVATE_IP],"vmid":170},{"cpu":[PRIVATE_IP]26719,"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":[PRIVATE_IP],"vmid":171},{"cpu":[PRIVATE_IP]53679,"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":[PRIVATE_IP],"vmid":190},{"cpu":[PRIVATE_IP]437772,"disk":0,"diskread":[PRIVATE_IP],"diskwrite":[PRIVATE_IP],"id":"qemu/210","maxcpu":2,"maxdisk":[PRIVATE_IP],"maxmem":[PRIVATE_IP],"mem":[PRIVATE_IP],"memhost":[PRIVATE_IP],"name":"newfi-prod","netin":[PRIVATE_IP],"netout":[PRIVATE_IP],"node":"pve01","status":"running","template":0,"type":"qemu","uptime":[PRIVATE_IP],"vmid":210},{"cpu":[PRIVATE_IP]073579,"disk":0,"diskread":[PRIVATE_IP],"diskwrite":[PRIVATE_IP],"id":"qemu/211","maxcpu":2,"maxdisk":[PRIVATE_IP],"maxmem":[PRIVATE_IP],"mem":[PRIVATE_IP],"memhost":[PRIVATE_IP],"name":"newfi-staging","netin":[PRIVATE_IP],"netout":[PRIVATE_IP],"node":"pve03","status":"running","template":0,"type":"qemu","uptime":[PRIVATE_IP],"vmid":211},{"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]57787,"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":[PRIVATE_IP]},{"cgroup-mode":2,"cpu":[PRIVATE_IP]78633,"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":[PRIVATE_IP]},{"cgroup-mode":2,"cpu":[PRIVATE_IP]9786,"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":[PRIVATE_IP]},{"content":"iso,vztmpl,backup,import","disk":[PRIVATE_IP],"id":"storage/pve01/local","maxdisk":[PRIVATE_IP],"node":"pve01","plugintype":"dir","shared":0,"status":"available","storage":"local","type":"storage"},{"content":"iso,vztmpl,backup,import","disk":[PRIVATE_IP],"id":"storage/pve02/local","maxdisk":[PRIVATE_IP],"node":"pve02","plugintype":"dir","shared":0,"status":"available","storage":"local","type":"storage"},{"content":"iso,vztmpl,backup,import","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/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/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/pve03/local-lvm","maxdisk":[PRIVATE_IP],"node":"pve03","plugintype":"lvmthin","shared":0,"status":"available","storage":"local-lvm","type":"storage"},{"id":"network/pve01/zone/localnetwork","network":"localnetwork","network-type":"zone","node":"pve01","status":"ok","type":"network"},{"id":"network/pve02/zone/localnetwork","network":"localnetwork","network-type":"zone","node":"pve02","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] 37.27% -local-lvm lvmthin active [PRIVATE_IP] [PRIVATE_IP] [PRIVATE_IP] 10.63% - UNIT LOAD ACTIVE SUB DESCRIPTION -● homelab-app-cloud-quorum-queue.service loaded failed failed Homelab canonical application cloud quorum backup queue -● homelab-vm-cloud-quorum-queue.service loaded failed failed Homelab canonical VM/CT cloud quorum backup queue - -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. - -2 loaded units listed. -NEXT LEFT LAST PASSED UNIT ACTIVATES -Mon [PRIVATE_IP] 06:17:46 MSK 43s Mon [PRIVATE_IP] 06:16:42 MSK 20s ago homelab-router-watchdog.timer homelab-router-watchdog.service -Mon [PRIVATE_IP] 06:17:58 MSK 56s Mon [PRIVATE_IP] 06:07:58 MSK 9min ago skladchik-reports-monitor-supervisor.timer skladchik-reports-monitor-supervisor.service -Mon [PRIVATE_IP] 06:19:58 MSK 2min 56s Mon [PRIVATE_IP] 06:04:58 MSK 12min ago prometheus-node-exporter-apt.timer prometheus-node-exporter-apt.service -Mon [PRIVATE_IP] 06:20:45 MSK 3min 42s Mon [PRIVATE_IP] 06:15:40 MSK 1min 22s ago homelab-health-metrics.timer homelab-health-metrics.service -Mon [PRIVATE_IP] 06:21:58 MSK 4min 56s Mon [PRIVATE_IP] 06:16:58 MSK 3s ago homelab-smartctl-textfile.timer homelab-smartctl-textfile.service -Mon [PRIVATE_IP] 06:24:58 MSK 7min Mon [PRIVATE_IP] 06:09:58 MSK 7min ago homelab-disk-space-health.timer homelab-disk-space-health.service -Mon [PRIVATE_IP] 06:24:58 MSK 7min Mon [PRIVATE_IP] 06:09:58 MSK 7min ago prometheus-node-exporter-nvme.timer prometheus-node-exporter-nvme.service -Mon [PRIVATE_IP] 06:26:58 MSK 9min Mon [PRIVATE_IP] 06:11:58 MSK 5min ago homelab-pve03-staging-capacity-health.timer homelab-pve03-staging-capacity-health.service -Mon [PRIVATE_IP] 06:30:00 MSK 12min Mon [PRIVATE_IP] 06:15:01 MSK 2min 0s ago homelab-incident-journal.timer homelab-incident-journal.service -Mon [PRIVATE_IP] 06:30:55 MSK 13min Mon [PRIVATE_IP] 06:15:58 MSK 1min 4s ago homelab-duty-admin-v2.timer homelab-duty-admin-v2.service -Mon [PRIVATE_IP] 06:31:03 MSK 14min Mon [PRIVATE_IP] 06:15:14 MSK 1min 47s ago homelab-forum-snuffleupagus-health.timer homelab-forum-snuffleupagus-health.service -Mon [PRIVATE_IP] 06:31:11 MSK 14min Mon [PRIVATE_IP] 06:16:42 MSK 20s ago homelab-external-probe-vps-health.timer homelab-external-probe-vps-health.service -Mon [PRIVATE_IP] 06:32:02 MSK 14min Mon [PRIVATE_IP] 05:57:14 MSK 19min ago homelab-reference-refresh.timer homelab-reference-refresh.service -Mon [PRIVATE_IP] 06:33:36 MSK 16min Mon [PRIVATE_IP] 06:03:22 MSK 13min ago homelab-mkdocs-auto-refresh.timer homelab-mkdocs-auto-refresh.service -Mon [PRIVATE_IP] 06:36:30 MSK 19min Mon [PRIVATE_IP] 06:05:58 MSK 11min ago homelab-backup-audit.timer homelab-backup-audit.service -Mon [PRIVATE_IP] 06:39:16 MSK 22min Mon [PRIVATE_IP] 06:08:16 MSK 8min ago homelab-backup-v2.timer homelab-backup-v2.service -Mon [PRIVATE_IP] 07:04:07 MSK 47min Sun [PRIVATE_IP] 08:06:30 MSK 22h ago man-db.timer man-db.service -Mon [PRIVATE_IP] 07:16:05 MSK 59min Sun [PRIVATE_IP] 07:11:16 MSK 23h ago homelab-drift-check.timer homelab-drift-check.service -Mon [PRIVATE_IP] 07:30:29 MSK 1h 13min Mon [PRIVATE_IP] 01:23:58 MSK 4h 53min ago homelab-mailru-trash-gc.timer homelab-mailru-trash-gc.service -Mon [PRIVATE_IP] 07:31:32 MSK 1h 14min Sun [PRIVATE_IP] 07:34:44 MSK 22h ago homelab-service-registry-check.timer homelab-service-registry-check.service -Mon [PRIVATE_IP] 07:49:35 MSK 1h 32min Sun [PRIVATE_IP] 07:58:07 MSK 22h ago homelab-runbook-generate.timer homelab-runbook-generate.service -Mon [PRIVATE_IP] 07:50:05 MSK 1h 33min Sun [PRIVATE_IP] 07:46:58 MSK 22h ago homelab-alerting-health.timer homelab-alerting-health.service -Mon [PRIVATE_IP] 07:50:36 MSK 1h 33min Sun [PRIVATE_IP] 07:46:42 MSK 22h ago homelab-dependency-map-check.timer homelab-dependency-map-check.service -Mon [PRIVATE_IP] 07:51:00 MSK 1h 33min Sun [PRIVATE_IP] 07:57:32 MSK 22h ago homelab-desired-state-sync.timer homelab-desired-state-sync.service -Mon [PRIVATE_IP] 08:09:15 MSK 1h 52min Sun [PRIVATE_IP] 07:58:32 MSK 22h ago homelab-duty-admin-report.timer homelab-duty-admin-report.service -Mon [PRIVATE_IP] 08:14:08 MSK 1h 57min Sun [PRIVATE_IP] 08:07:58 MSK 22h ago homelab-kuma-monitor-policy.timer homelab-kuma-monitor-policy.service -Mon [PRIVATE_IP] 08:18:19 MSK 2h 1min Sun [PRIVATE_IP] 08:24:02 MSK 21h ago homelab-final-readiness-gate.timer homelab-final-readiness-gate.service -Mon [PRIVATE_IP] 08:18:48 MSK 2h 1min Sun [PRIVATE_IP] 08:01:44 MSK 22h ago homelab-overall-health.timer homelab-overall-health.service -Mon [PRIVATE_IP] 08:34:01 MSK 2h 16min Sun [PRIVATE_IP] 08:46:44 MSK 21h ago homelab-secret-exposure-guard.timer homelab-secret-exposure-guard.service -Mon [PRIVATE_IP] 08:34:27 MSK 2h 17min Sun [PRIVATE_IP] 08:42:14 MSK 21h ago homelab-capacity-risk.timer homelab-capacity-risk.service -Mon [PRIVATE_IP] 08:49:04 MSK 2h 32min Sun [PRIVATE_IP] 08:54:58 MSK 21h ago homelab-cluster-passport.timer homelab-cluster-passport.service -Mon [PRIVATE_IP] 08:52:49 MSK 2h 35min Sun [PRIVATE_IP] 09:01:16 MSK 21h ago homelab-golden-state-index.timer homelab-golden-state-index.service -Mon [PRIVATE_IP] 10:15:00 MSK 3h 57min Sun [PRIVATE_IP] 10:15:12 MSK 20h ago skladchik-reports-monitor-monthly-selftest-watch.timer skladchik-reports-monitor-monthly-selftest-watch.service -Mon [PRIVATE_IP] 10:27:22 MSK 4h 10min Mon [PRIVATE_IP] 03:44:32 MSK 2h 32min ago apt-daily.timer apt-daily.service -Mon [PRIVATE_IP] 10:35:58 MSK 4h 18min Mon [PRIVATE_IP] 04:35:58 MSK 1h 41min ago homelab-vps-identity-audit.timer homelab-vps-identity-audit.service -Mon [PRIVATE_IP] 12:06:58 MSK 5h 49min Mon [PRIVATE_IP] 06:05:58 MSK 11min ago homelab-evidence-root.timer homelab-evidence-root.service -Mon [PRIVATE_IP] 16:47:58 MSK 10h Sun [PRIVATE_IP] 16:47:58 MSK 13h ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service -Tue [PRIVATE_IP] 00:00:00 MSK 17h Mon [PRIVATE_IP] 00:00:14 MSK 6h ago dpkg-db-backup.timer dpkg-db-backup.service -Tue [PRIVATE_IP] 00:12:07 MSK 17h Mon [PRIVATE_IP] 00:07:58 MSK 6h ago homelab-docker-health.timer homelab-docker-health.service -Tue [PRIVATE_IP] 00:17:22 MSK 18h Mon [PRIVATE_IP] 00:16:22 MSK 6h ago homelab-storage-capacity.timer homelab-storage-capacity.service -Tue [PRIVATE_IP] 00:17:33 MSK 18h Mon [PRIVATE_IP] 00:07:44 MSK 6h ago homelab-evidence-catalog.timer homelab-evidence-catalog.service -Tue [PRIVATE_IP] 00:18:28 MSK 18h Mon [PRIVATE_IP] 00:17:23 MSK 5h 59min ago homelab-quality-gate.timer homelab-quality-gate.service -Tue [PRIVATE_IP] 00:29:48 MSK 18h Mon [PRIVATE_IP] 00:23:58 MSK 5h 53min ago logrotate.timer logrotate.service -Tue [PRIVATE_IP] 03:40:22 MSK 21h Mon [PRIVATE_IP] 02:49:58 MSK 3h 27min ago pve-daily-update.timer pve-daily-update.service -Tue [PRIVATE_IP] 06:22:44 MSK 24h Mon [PRIVATE_IP] 06:16:58 MSK 4s ago apt-daily-upgrade.timer apt-daily-upgrade.service -Sun [PRIVATE_IP] 03:10:16 MSK 5 days Sun [PRIVATE_IP] 03:10:58 MSK 1 day 3h ago xfs_scrub_all.timer xfs_scrub_all.service -Sun [PRIVATE_IP] 03:10:53 MSK 5 days Sun [PRIVATE_IP] 03:10:12 MSK 1 day 3h ago e2scrub_all.timer e2scrub_all.service -Sun [PRIVATE_IP] 07:34:03 MSK 6 days Sun [PRIVATE_IP] 07:40:22 MSK 22h ago homelab-rotating-boot-drill.timer homelab-rotating-boot-drill.service -Mon [PRIVATE_IP] 00:06:34 MSK 6 days Mon [PRIVATE_IP] 00:04:44 MSK 6h ago homelab-secret-sanity.timer homelab-secret-sanity.service -Mon [PRIVATE_IP] 01:30:36 MSK 6 days Mon [PRIVATE_IP] 00:09:14 MSK 6h ago fstrim.timer fstrim.service -- - Mon [PRIVATE_IP] 06:17:02 MSK 13ms ago homelab-private-vpn-hosts-health.timer homelab-private-vpn-hosts-health.service -- - Mon [PRIVATE_IP] 06:16:58 MSK 3s ago netbird-peers-health.timer netbird-peers-health.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 - -55 timers listed. -RUNTIME_MANIFEST_ID=df[PRIVATE_IP]ac9b5abd[PRIVATE_IP]b[PRIVATE_IP]d89496fb2bde[PRIVATE_IP] -EXPERIMENT_ID=5462ee[PRIVATE_IP]ebe[PRIVATE_IP]feb2ad[PRIVATE_IP]1ad87bbac0b8108 -COLLECTION_START_AT=[PRIVATE_IP]T[PRIVATE_IP]:00 -FIRST_COMPLETE_D1_CLOSE=[PRIVATE_IP]T[PRIVATE_IP]:00 -PRODUCTION_LAUNCH_ALLOWED=False -EXECUTION_AUTHORITY=False -RISK_AUTHORITY=False -STAGE_A_HEALTH=AWAITING_PRIMARY_FINALITY -FORENSIC_PREVIOUS_EPOCH_PRESERVED=YES - -## NEWFI_TASK6_AUTH_CHECKPOINT_V[PRIVATE_IP] -- Scope: historical accepted AUTH test, not a current SMTP connection test. -- Newfi approved SMTP account/sender: aleisaev@yandex.ru. -- Endpoint used by accepted test: smtp.yandex.ru:465 with certificate verification; single PLAIN initial response accepted with code 235. -- Evidence: incident ledger ### NEWFI_TASK6_YANDEX_AUTH_V2_OBSERVATION and ### NEWFI_TASK6_AUTH_PROOF_CLOSE_V1. -- No password file written, no application configuration changed, no mail sent by the accepted AUTH test. -- Persistent transport installation and application delivery are not proven by this checkpoint. Task6 is not complete. -- AUTH challenge and missing-file incidents closed; launch/session incident remains OPEN with original cause unproven. -- This update does not change VM211, VM160, routing, board state or Git. -- Other incidents and infrastructure health were not assessed. - - -## NEWFI_PRIVATE_STRUCTURE92_WRONG_MARKER_SCOPE_[PRIVATE_IP] CLOSURE -- Status: CLOSED -- RCA: NEWFI92 inspected the pve01 NEWFI90 attempt marker, which had not been finalized because the outer shell exited immediately after the guest returned RC3 following its successful rollback. The guest marker contained the true final rollback state. -- Correction: NEWFI93 required both the guest FINISHED/ROLLED_BACK record and a fresh exact demo-state readback before reconciling the outer NEWFI90 marker. NEWFI92 itself never reserved an attempt or mutated state. - - -## NEWFI_PRIVATE_NEWFI95_NESTED_TRIPLE_QUOTE_PARSE_[PRIVATE_IP] -- Status: OPEN -- Command: NEWFI95 -- Symptom: after the content-structure precheck passed, the pve03 Python wrapper failed to parse at the PHP line beginning with $root. No Portal discovery or application mutation was reached. -- RCA: an outer raw triple-single-quoted guest Python payload contained an inner raw triple-single-quoted PHP payload. The inner delimiter terminated the outer Python string, causing PHP source to be parsed as Python. -- Safety: NEWFI95 was read-only, created no attempt marker, and did not reach the intended nested guest execution. Do not replay NEWFI95. - - -## NEWFI_PRIVATE_NEWFI95_NESTED_TRIPLE_QUOTE_PARSE_[PRIVATE_IP] CLOSURE -- Status: CLOSED -- RCA: an inner triple-single-quoted PHP literal terminated the outer triple-single-quoted Python guest payload in NEWFI95. The wrapper therefore failed parsing before the intended Portal discovery executed. -- Correction: NEWFI96 removed the nested Python payload layer entirely and passed one Python program directly to VM211 through qm guest exec stdin. The read-only Portal contract completed with QGA exit 0 and the implementation worktree remained unchanged. OUTPUT_END CHAT_OUTPUT_END