CHAT_OUTPUT_BEGIN
COMMAND_ID=SIGNALBOT-260908-CONNECT-POLICY-RCA-038
STATUS=OK
RC=0
HOST=pve01
MODE=read-only
COMPONENT=signalbot-cr0116-connect-policy-rca
REFERENCE_REGISTER_CHECK=OK
REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66
ERROR_REGISTER_CHECK=OK
ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0
COMMAND_SHA256=07ce1cf96c685ff689f8a9a2d34f1dc1b9876f40b2813255123ec0e1a286ab96
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=42af5cc0018db20c59cc42cad276379dc496b379592154fffc5afaa24a726969
SANITIZED_OUTPUT_SHA256=42af5cc0018db20c59cc42cad276379dc496b379592154fffc5afaa24a726969
OUTPUT_BEGIN
ERROR_REGISTER_CHECK=OK
REFERENCE_CHECK=OK
AUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED
SB038_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"}
SB038_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}
SB038_SOURCE_ID={"lines":1246,"path":"/app/demonov_forward_map/bitfinex_trade_collector.py","sha256":"d21cf0c3a0d4fcaf9210a57da04fd560dba4952ac1dd5a085abcc4e76ccf2eb0","websockets_version":"15.0.1"}
SB038_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}]
SB038_TRANSPORT_KNOBS=[{"line":1155,"text":"open_timeout=10,"},{"line":1156,"text":"close_timeout=5,"}]
SB038_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"}]}
SB038_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":""}]}
SB038_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\"))"}]}
SB038_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("}]}
SB038_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("}]}
SB038_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\""}]}
SB038_DECISION=CONNECT_POLICY_EVIDENCE_READY
SB038_MUTATION_SCOPE=NONE_READ_ONLY
SIGNALBOT038_DECISION=CONNECT_POLICY_EVIDENCE_READY
SIGNALBOT038_MUTATION_SCOPE=NO_RUNTIME_NO_GIT_NO_EXCHANGE_MUTATION

OUTPUT_END
CHAT_OUTPUT_END
