39 lines
6.4 KiB
JSON
39 lines
6.4 KiB
JSON
{
|
|
"schema_version": 1,
|
|
"channel": "homelab-runtime",
|
|
"command_id": "SIGNALBOT-260908-CONNECT-POLICY-RCA-038",
|
|
"status": "OK",
|
|
"rc": 0,
|
|
"host": "pve01",
|
|
"mode": "read-only",
|
|
"component": "signalbot-cr0116-connect-policy-rca",
|
|
"started_at_utc": "2026-09-08T05:42:15Z",
|
|
"finished_at_utc": "2026-09-08T05:42:16Z",
|
|
"reference_register_checked": true,
|
|
"reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66",
|
|
"error_register_checked": true,
|
|
"error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0",
|
|
"command_sha256": "07ce1cf96c685ff689f8a9a2d34f1dc1b9876f40b2813255123ec0e1a286ab96",
|
|
"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": "42af5cc0018db20c59cc42cad276379dc496b379592154fffc5afaa24a726969",
|
|
"sanitized_output_sha256": "42af5cc0018db20c59cc42cad276379dc496b379592154fffc5afaa24a726969",
|
|
"output_truncated_in_json": false,
|
|
"full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt",
|
|
"output": "ERROR_REGISTER_CHECK=OK\nREFERENCE_CHECK=OK\nAUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED\nSB038_COLLECTOR={\"id\":\"a546a70c3e8c\",\"image\":\"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"name\":\"demonov-shadow-8020-collector-1\",\"ok\":true,\"pid\":210213,\"restart_count\":13,\"running\":true,\"started_at\":\"2026-09-08T05:01:08.70385245Z\",\"status\":\"running\"}\nSB038_RECONNECT_STATE={\"activity_count\":181306,\"fail_closed_reason\":\"source reconnect detected\",\"gap_detected\":false,\"last_reconnect_at\":\"2026-09-08T05:01:09.298101+00:00\",\"max_event_seq\":181306,\"max_received_at\":\"2026-09-08T05:42:13.860438+00:00\",\"post_finality_revision\":false,\"prospective_fail_closed_reason\":\"\",\"prospective_gap_detected\":false,\"prospective_reconnect_detected\":false,\"quick_check\":\"ok\",\"reconnect_count\":10,\"reconnect_detected\":true}\nSB038_SOURCE_ID={\"lines\":1246,\"path\":\"/app/demonov_forward_map/bitfinex_trade_collector.py\",\"sha256\":\"d21cf0c3a0d4fcaf9210a57da04fd560dba4952ac1dd5a085abcc4e76ccf2eb0\",\"websockets_version\":\"15.0.1\"}\nSB038_CONNECT_CALLS=[{\"args\":[\"str(self.path)\"],\"end_lineno\":128,\"keywords\":{\"isolation_level\":\"None\",\"timeout\":\"5\"},\"lineno\":124},{\"args\":[\"BITFINEX_WS_URL\"],\"end_lineno\":1157,\"keywords\":{\"close_timeout\":\"5\",\"open_timeout\":\"10\"},\"lineno\":1153}]\nSB038_TRANSPORT_KNOBS=[{\"line\":1155,\"text\":\"open_timeout=10,\"},{\"line\":1156,\"text\":\"close_timeout=5,\"}]\nSB038_WINDOW_00={\"around\":124,\"lines\":[{\"line\":120,\"text\":\"collection_start_at,\"},{\"line\":121,\"text\":\"\\\"collection_start_at\\\",\"},{\"line\":122,\"text\":\")\"},{\"line\":123,\"text\":\"self.path.parent.mkdir(parents=True, exist_ok=True)\"},{\"line\":124,\"text\":\"self._db = sqlite3.connect(\"},{\"line\":125,\"text\":\"str(self.path),\"},{\"line\":126,\"text\":\"timeout=5,\"},{\"line\":127,\"text\":\"isolation_level=None,\"},{\"line\":128,\"text\":\")\"},{\"line\":129,\"text\":\"self._db.row_factory = sqlite3.Row\"}]}\nSB038_WINDOW_01={\"around\":1135,\"lines\":[{\"line\":1131,\"text\":\"\"},{\"line\":1132,\"text\":\"\"},{\"line\":1133,\"text\":\"def main() -> int:\"},{\"line\":1134,\"text\":\"try:\"},{\"line\":1135,\"text\":\"from websockets.sync.client import connect\"},{\"line\":1136,\"text\":\"except ImportError as exc:\"},{\"line\":1137,\"text\":\"raise DemonovError(\"},{\"line\":1138,\"text\":\"\\\"websockets runtime dependency is required\\\"\"},{\"line\":1139,\"text\":\") from exc\"},{\"line\":1140,\"text\":\"\"}]}\nSB038_WINDOW_02={\"around\":1136,\"lines\":[{\"line\":1132,\"text\":\"\"},{\"line\":1133,\"text\":\"def main() -> int:\"},{\"line\":1134,\"text\":\"try:\"},{\"line\":1135,\"text\":\"from websockets.sync.client import connect\"},{\"line\":1136,\"text\":\"except ImportError as exc:\"},{\"line\":1137,\"text\":\"raise DemonovError(\"},{\"line\":1138,\"text\":\"\\\"websockets runtime dependency is required\\\"\"},{\"line\":1139,\"text\":\") from exc\"},{\"line\":1140,\"text\":\"\"},{\"line\":1141,\"text\":\"data_dir = Path(os.environ.get(\\\"DATA_DIR\\\", \\\"/data\\\"))\"}]}\nSB038_WINDOW_03={\"around\":1138,\"lines\":[{\"line\":1134,\"text\":\"try:\"},{\"line\":1135,\"text\":\"from websockets.sync.client import connect\"},{\"line\":1136,\"text\":\"except ImportError as exc:\"},{\"line\":1137,\"text\":\"raise DemonovError(\"},{\"line\":1138,\"text\":\"\\\"websockets runtime dependency is required\\\"\"},{\"line\":1139,\"text\":\") from exc\"},{\"line\":1140,\"text\":\"\"},{\"line\":1141,\"text\":\"data_dir = Path(os.environ.get(\\\"DATA_DIR\\\", \\\"/data\\\"))\"},{\"line\":1142,\"text\":\"path = data_dir / \\\"bitfinex_source.db\\\"\"},{\"line\":1143,\"text\":\"collection_start_at = _dt(\"}]}\nSB038_WINDOW_04={\"around\":1153,\"lines\":[{\"line\":1149,\"text\":\"with SQLiteBitfinexSourceJournal(\"},{\"line\":1150,\"text\":\"path,\"},{\"line\":1151,\"text\":\"collection_start_at=collection_start_at,\"},{\"line\":1152,\"text\":\") as journal:\"},{\"line\":1153,\"text\":\"with connect(\"},{\"line\":1154,\"text\":\"BITFINEX_WS_URL,\"},{\"line\":1155,\"text\":\"open_timeout=10,\"},{\"line\":1156,\"text\":\"close_timeout=5,\"},{\"line\":1157,\"text\":\") as ws:\"},{\"line\":1158,\"text\":\"ws.send(\"}]}\nSB038_WINDOW_05={\"around\":1175,\"lines\":[{\"line\":1171,\"text\":\"\\\"symbol\\\": BITFINEX_TRADE_SYMBOL,\"},{\"line\":1172,\"text\":\"}\"},{\"line\":1173,\"text\":\")\"},{\"line\":1174,\"text\":\")\"},{\"line\":1175,\"text\":\"for raw in ws:\"},{\"line\":1176,\"text\":\"message = json.loads(raw)\"},{\"line\":1177,\"text\":\"if isinstance(message, dict):\"},{\"line\":1178,\"text\":\"if (\"},{\"line\":1179,\"text\":\"message.get(\\\"event\\\") == \\\"subscribed\\\"\"},{\"line\":1180,\"text\":\"and message.get(\\\"channel\\\") == \\\"trades\\\"\"}]}\nSB038_DECISION=CONNECT_POLICY_EVIDENCE_READY\nSB038_MUTATION_SCOPE=NONE_READ_ONLY\nSIGNALBOT038_DECISION=CONNECT_POLICY_EVIDENCE_READY\nSIGNALBOT038_MUTATION_SCOPE=NO_RUNTIME_NO_GIT_NO_EXCHANGE_MUTATION\n"
|
|
}
|