diff --git a/runtime/history/SIGNALBOT-260908-DEPLOY-PREP-API-041API.json b/runtime/history/SIGNALBOT-260908-DEPLOY-PREP-API-041API.json new file mode 100644 index 00000000..f0e25636 --- /dev/null +++ b/runtime/history/SIGNALBOT-260908-DEPLOY-PREP-API-041API.json @@ -0,0 +1,38 @@ +{ + "schema_version": 1, + "channel": "homelab-runtime", + "command_id": "SIGNALBOT-260908-DEPLOY-PREP-API-041API", + "status": "OK", + "rc": 0, + "host": "pve01", + "mode": "read-only", + "component": "signalbot-cr0116-deploy-api-contract", + "started_at_utc": "2026-09-08T06:35:33Z", + "finished_at_utc": "2026-09-08T06:35:35Z", + "reference_register_checked": true, + "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", + "error_register_checked": true, + "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", + "command_sha256": "ce5ef6223547685761dcfca508de8d9390949208763bf7938e8d43d0c7641bab", + "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": "f271ff2f659b1a49c637ca9d67e7b6bc0314cc0dd8570fb252504418765369ce", + "sanitized_output_sha256": "f271ff2f659b1a49c637ca9d67e7b6bc0314cc0dd8570fb252504418765369ce", + "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\nSB041A_ACTIVE_ENV={\"exists\":true,\"sha256\":\"4bbc6bd31417f6265767c1fb971d118d36d27d7b57a90b49e6586461acf0609b\",\"values\":{\"APP_IMAGE\":\"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"CODE_IDENTITY\":\"e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"COLLECTION_START_AT\":\"2026-09-07T00:00:00+00:00\",\"EXPERIMENT_ID\":\"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338\",\"RUNTIME_MANIFEST_ID\":\"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a\"}}\nSB041A_DOCKERFILE={\"exists\":true,\"sha256\":\"901951def73961f76d2c2a93c5428a0fbdcc50113d42b39da92983a5ce157cb8\",\"text\":\"FROM 8020-demonov-shadow:ac7094a76ddc06f376d71a76432af7c2dd10ec7d\\nCOPY demonov_forward_map /app/demonov_forward_map\"}\nSB041A_DEPLOY_TOP=[{\"bytes\":336,\"kind\":\"file\",\"name\":\".env.new\",\"sha256\":\"4bbc6bd31417f6265767c1fb971d118d36d27d7b57a90b49e6586461acf0609b\"},{\"bytes\":116,\"kind\":\"file\",\"name\":\"Dockerfile\",\"sha256\":\"901951def73961f76d2c2a93c5428a0fbdcc50113d42b39da92983a5ce157cb8\"},{\"bytes\":886,\"kind\":\"file\",\"name\":\"build.log\",\"sha256\":\"601fe18bcce58d509431626b9c934e170fd572089dcfbfbf310c3aa9217293eb\"},{\"bytes\":808,\"kind\":\"file\",\"name\":\"compose-up.log\",\"sha256\":\"5758c75a39a1a7689f92513e3105708d1c71b7bcb14915e7013b1199b618f6d4\"},{\"kind\":\"dir\",\"name\":\"demonov_forward_map\"},{\"bytes\":841,\"kind\":\"file\",\"name\":\"experiment.json\",\"sha256\":\"827dc4fb5ace8a25a0bd80d05450eaa758bd39d1d09485d3d428dd20ad9325aa\"},{\"bytes\":208049,\"kind\":\"file\",\"name\":\"package.tar.gz\",\"sha256\":\"389e7aabca8887ee3b48b6ff0b4affe1163216005a4888013d9ccc82ea360e32\"},{\"bytes\":584,\"kind\":\"file\",\"name\":\"runtime_manifest.json\",\"sha256\":\"388a610997fad0071b9140a44e88edff60a3e7ee3486faeaca769c0026246c8e\"}]\nSB041A_EXPERIMENT_JSON={\"bytes\":841,\"exists\":true,\"object\":{\"code_identity\":\"e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"collection_start_at\":\"2026-09-07T00:00:00+00:00\",\"demonov_branch_policy_id\":\"ALL_FROZEN_PROFILES_ALL_NODES_RESEARCH_V1\",\"experiment_id\":\"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338\",\"experiment_version\":\"LIVE_PROSPECTIVE_V2\",\"finality_policy_id\":\"BITFINEX_SEQ_ALL_D1_V1\",\"geometry_policy_id\":\"RESEARCH_RECONSTRUCTION_8020_V1\",\"market_bundle_id\":\"78dbbebab22f49bfc4866b40e2362886b1441790d8a73a005a4eb09a5d2c64ae\",\"notification_policy_id\":\"SIGNIFICANT_STATE_CHANGE_EMAIL_V1\",\"outcome_policy_id\":\"DIRECTIONAL_CLOSE_AFTER_7_D1_BARS_V1\",\"policy_registry_id\":\"055d0b052d394f1e08176b035617fbdd96f04fff0cdfb195c2d736fd66e6ad37\",\"runtime_manifest_id\":\"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a\"},\"sha256\":\"827dc4fb5ace8a25a0bd80d05450eaa758bd39d1d09485d3d428dd20ad9325aa\"}\nSB041A_MANIFEST_JSON={\"bytes\":584,\"exists\":true,\"object\":{\"application_image_id\":\"sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736\",\"base_image_digest\":\"sha256:881d80734ee05dca6f7f42dcb080975652a53c7eda9ba1f03bb8da31aa6a6ec2\",\"code_identity\":\"e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"compose_hash\":\"6461532b0a04decc60fe1d1885990020e886d40de40c0523e34e2849600af061\",\"finality_policy_id\":\"BITFINEX_SEQ_ALL_D1_V1\",\"package_identity\":\"637acba19fb29c98408a8031dc9265a31dc36551c666fcf0b287e8af83d2b893\",\"runtime_manifest_id\":\"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a\"},\"sha256\":\"388a610997fad0071b9140a44e88edff60a3e7ee3486faeaca769c0026246c8e\"}\nSB041A_SERVICE_BOOT_JSON={\"bytes\":224,\"exists\":true,\"object\":{\"booted_at\":\"2026-09-06T18:48:21.063302+00:00\",\"code_identity\":\"e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"execution_authority\":false,\"production_launch_allowed\":false,\"risk_authority\":false,\"service\":\"8020-demonov-shadow\"},\"sha256\":\"798a145e6c142bea2cd41a74a3fa707452da9a606cc84ff6afd1d60b43abb1f8\"}\nSB041A_EXPERIMENT_HASH_CHECKS=[{\"matches\":true,\"method\":\"compact_sorted_utf8\",\"sha256\":\"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338\"},{\"matches\":true,\"method\":\"compact_sorted_ascii\",\"sha256\":\"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338\"},{\"matches\":false,\"method\":\"default_sorted_utf8\",\"sha256\":\"bcce3a27298e277b694ea2fb5848b912ad2816fd249c14a4617a0951b1d4dc4d\"},{\"matches\":false,\"method\":\"default_sorted_ascii\",\"sha256\":\"bcce3a27298e277b694ea2fb5848b912ad2816fd249c14a4617a0951b1d4dc4d\"},{\"matches\":false,\"method\":\"indent2_sorted_utf8\",\"sha256\":\"4ee2673c98107eb0bf81ebc4ef4e57b47670247bc90e0be2e4be5ed3d1348129\"}]\nSB041A_MANIFEST_HASH_CHECKS=[{\"matches\":false,\"method\":\"compact_sorted_utf8\",\"sha256\":\"7ac46712abbea24436b24af4fc962bdf5b8a348559a64c879c278fb17114c0a5\"},{\"matches\":false,\"method\":\"compact_sorted_ascii\",\"sha256\":\"7ac46712abbea24436b24af4fc962bdf5b8a348559a64c879c278fb17114c0a5\"},{\"matches\":false,\"method\":\"default_sorted_utf8\",\"sha256\":\"a68890d9717e29ac1db356e9e17f2fc10408327f8d8707caddbeb330e433d524\"},{\"matches\":false,\"method\":\"default_sorted_ascii\",\"sha256\":\"a68890d9717e29ac1db356e9e17f2fc10408327f8d8707caddbeb330e433d524\"},{\"matches\":false,\"method\":\"indent2_sorted_utf8\",\"sha256\":\"caaafb8613f463a4ed2915d1ccce0010e7945bb5058d67721a41fa3bb0d80188\"}]\nSB041A_COLLECTOR_CARDINALITY=1\nSB041A_RUNTIME_MANIFEST_SOURCE={\"classes\":[{\"name\":\"RuntimeDeploymentManifestV1\"}],\"functions\":[{\"args\":[\"value\",\"name\"],\"kwonly\":[],\"name\":\"_required\",\"source\":\"def _required(value: str, name: str) -> str:\\n if not isinstance(value, str) or not value:\\n raise DemonovError(f\\\"{name} is required\\\")\\n return value\"},{\"args\":[\"value\",\"name\"],\"kwonly\":[],\"name\":\"_sha256_hex\",\"source\":\"def _sha256_hex(value: str, name: str) -> str:\\n _required(value, name)\\n if _SHA256_RE.fullmatch(value) is None:\\n raise DemonovError(f\\\"{name} must be lowercase sha256 hex\\\")\\n return value\"},{\"args\":[\"value\",\"name\"],\"kwonly\":[],\"name\":\"_sha256_id\",\"source\":\"def _sha256_id(value: str, name: str) -> str:\\n _required(value, name)\\n if _SHA256_ID_RE.fullmatch(value) is None:\\n raise DemonovError(f\\\"{name} must be immutable sha256 identity\\\")\\n return value\"},{\"args\":[\"manifest\"],\"kwonly\":[\"expected_code_identity\",\"actual_image_id\",\"actual_package_identity\"],\"name\":\"verify_runtime_manifest\",\"source\":\"def verify_runtime_manifest(\\n manifest: RuntimeDeploymentManifestV1,\\n *,\\n expected_code_identity: str,\\n actual_image_id: str,\\n actual_package_identity: str,\\n) -> None:\\n if not isinstance(manifest, RuntimeDeploymentManifestV1):\\n raise DemonovError(\\\"runtime manifest required\\\")\\n manifest.__post_init__()\\n if manifest.code_identity != expected_code_identity:\\n raise DemonovError(\\\"runtime manifest code identity mismatch\\\")\\n if manifest.application_image_id != actual_image_id:\\n raise DemonovError(\\\"runtime manifest application image mismatch\\\")\\n if manifest.package_identity != actual_package_identity:\\n raise DemonovError(\\\"runtime manifest package identity mismatch\\\")\"}],\"lines\":123,\"rc\":0,\"sha256\":\"1064cfb74303fdc8e0bf50bae95b1e755556a5b1dfc28b2b062341becaba08f2\"}\nSB041A_LIVE_PROSPECTIVE_SOURCE={\"classes\":[{\"name\":\"ExperimentProvenance\"},{\"name\":\"LiveProspectiveStore\"}],\"functions\":[{\"args\":[\"value\"],\"kwonly\":[],\"name\":\"_hash\",\"source\":\"def _hash(value: object) -> str:\\n return hashlib.sha256(\\n json.dumps(value, sort_keys=True, separators=(\\\",\\\", \\\":\\\"), ensure_ascii=True).encode()\\n ).hexdigest()\"},{\"args\":[\"bar\"],\"kwonly\":[],\"name\":\"_bar_json\",\"source\":\"def _bar_json(bar) -> str:\\n return json.dumps({\\n \\\"bar_id\\\": bar.bar_id,\\n \\\"market_key\\\": bar.market_key,\\n \\\"open_at\\\": bar.open_at.isoformat(),\\n \\\"close_at\\\": bar.close_at.isoformat(),\\n \\\"known_at\\\": bar.known_at.isoformat(),\\n \\\"received_at\\\": bar.received_at.isoformat(),\\n \\\"open\\\": str(bar.open), \\\"high\\\": str(bar.high), \\\"low\\\": str(bar.low),\\n \\\"close\\\": str(bar.close), \\\"volume\\\": str(bar.volume),\\n \\\"boundary_policy_hash\\\": bar.boundary_policy_hash,\\n \\\"source_bar_ids\\\": list(bar.source_bar_ids),\\n }, sort_keys=True, separators=(\\\",\\\", \\\":\\\"))\"},{\"args\":[\"line\"],\"kwonly\":[],\"name\":\"_line_json\",\"source\":\"def _line_json(line: ResearchTrendLine | None) -> str:\\n if line is None:\\n return \\\"\\\"\\n return json.dumps({\\n \\\"line_id\\\": line.line_id, \\\"role\\\": line.role.value, \\\"version\\\": line.version,\\n \\\"first_at\\\": line.first_at.isoformat(), \\\"first_price\\\": str(line.first_price),\\n \\\"second_at\\\": line.second_at.isoformat(), \\\"second_price\\\": str(line.second_price),\\n \\\"frozen_at\\\": line.frozen_at.isoformat(), \\\"geometry_policy_id\\\": line.geometry_policy_id,\\n }, sort_keys=True, separators=(\\\",\\\", \\\":\\\"))\"},{\"args\":[\"raw\"],\"kwonly\":[],\"name\":\"_line_from_json\",\"source\":\"def _line_from_json(raw: str) -> ResearchTrendLine | None:\\n if not raw:\\n return None\\n x = json.loads(raw)\\n return ResearchTrendLine(\\n line_id=x[\\\"line_id\\\"], role=ResearchBarrierRole(x[\\\"role\\\"]), version=x[\\\"version\\\"],\\n first_at=datetime.fromisoformat(x[\\\"first_at\\\"]), first_price=Decimal(x[\\\"first_price\\\"]),\\n second_at=datetime.fromisoformat(x[\\\"second_at\\\"]), second_price=Decimal(x[\\\"second_price\\\"]),\\n frozen_at=datetime.fromisoformat(x[\\\"frozen_at\\\"]), geometry_policy_id=x[\\\"geometry_policy_id\\\"],\\n )\"},{\"args\":[\"states\"],\"kwonly\":[],\"name\":\"_states_json\",\"source\":\"def _states_json(states) -> str:\\n return json.dumps([{\\n \\\"state_id\\\": s.state_id, \\\"arm_id\\\": s.arm_id.value,\\n \\\"interaction_state\\\": s.interaction_state.value,\\n \\\"close_beyond_count\\\": s.close_beyond_count, \\\"last_sequence\\\": s.last_sequence,\\n } for s in states], sort_keys=True, separators=(\\\",\\\", \\\":\\\"))\"},{\"args\":[\"raw\"],\"kwonly\":[],\"name\":\"_states_from_json\",\"source\":\"def _states_from_json(raw: str):\\n from .prospective_policy import AcceptanceArmId\\n if not raw:\\n return ()\\n return tuple(ArmFSMState(\\n state_id=x[\\\"state_id\\\"], arm_id=AcceptanceArmId(x[\\\"arm_id\\\"]),\\n interaction_state=ProspectiveInteractionState(x[\\\"interaction_state\\\"]),\\n close_beyond_count=x[\\\"close_beyond_count\\\"], last_sequence=x[\\\"last_sequence\\\"],\\n ) for x in json.loads(raw))\"}],\"lines\":851,\"rc\":0,\"sha256\":\"f83f48dfeb4dc1382ebf3c77b7ec27deaeac6eec4a5dc097f90600963f0e4e98\"}\nSB041A_DECISION=DEPLOY_API_CONTRACT_READY\nSB041A_MUTATION_SCOPE=NONE_READ_ONLY\nSIGNALBOT041A_HOLDS=[]\nSIGNALBOT041A_DECISION=DEPLOY_API_CONTRACT_READY\nSIGNALBOT041A_MUTATION_SCOPE=NO_RUNTIME_NO_GIT_NO_EXCHANGE_MUTATION\n" +} diff --git a/runtime/history/SIGNALBOT-260908-DEPLOY-PREP-API-041API.txt b/runtime/history/SIGNALBOT-260908-DEPLOY-PREP-API-041API.txt new file mode 100644 index 00000000..6eea134b --- /dev/null +++ b/runtime/history/SIGNALBOT-260908-DEPLOY-PREP-API-041API.txt @@ -0,0 +1,51 @@ +CHAT_OUTPUT_BEGIN +COMMAND_ID=SIGNALBOT-260908-DEPLOY-PREP-API-041API +STATUS=OK +RC=0 +HOST=pve01 +MODE=read-only +COMPONENT=signalbot-cr0116-deploy-api-contract +REFERENCE_REGISTER_CHECK=OK +REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 +ERROR_REGISTER_CHECK=OK +ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 +COMMAND_SHA256=ce5ef6223547685761dcfca508de8d9390949208763bf7938e8d43d0c7641bab +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=f271ff2f659b1a49c637ca9d67e7b6bc0314cc0dd8570fb252504418765369ce +SANITIZED_OUTPUT_SHA256=f271ff2f659b1a49c637ca9d67e7b6bc0314cc0dd8570fb252504418765369ce +OUTPUT_BEGIN +ERROR_REGISTER_CHECK=OK +REFERENCE_CHECK=OK +AUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED +SB041A_ACTIVE_ENV={"exists":true,"sha256":"4bbc6bd31417f6265767c1fb971d118d36d27d7b57a90b49e6586461acf0609b","values":{"APP_IMAGE":"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70","CODE_IDENTITY":"e32760c69a4311728db9066ee8bf2bf66b1e5a70","COLLECTION_START_AT":"2026-09-07T00:00:00+00:00","EXPERIMENT_ID":"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338","RUNTIME_MANIFEST_ID":"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a"}} +SB041A_DOCKERFILE={"exists":true,"sha256":"901951def73961f76d2c2a93c5428a0fbdcc50113d42b39da92983a5ce157cb8","text":"FROM 8020-demonov-shadow:ac7094a76ddc06f376d71a76432af7c2dd10ec7d\nCOPY demonov_forward_map /app/demonov_forward_map"} +SB041A_DEPLOY_TOP=[{"bytes":336,"kind":"file","name":".env.new","sha256":"4bbc6bd31417f6265767c1fb971d118d36d27d7b57a90b49e6586461acf0609b"},{"bytes":116,"kind":"file","name":"Dockerfile","sha256":"901951def73961f76d2c2a93c5428a0fbdcc50113d42b39da92983a5ce157cb8"},{"bytes":886,"kind":"file","name":"build.log","sha256":"601fe18bcce58d509431626b9c934e170fd572089dcfbfbf310c3aa9217293eb"},{"bytes":808,"kind":"file","name":"compose-up.log","sha256":"5758c75a39a1a7689f92513e3105708d1c71b7bcb14915e7013b1199b618f6d4"},{"kind":"dir","name":"demonov_forward_map"},{"bytes":841,"kind":"file","name":"experiment.json","sha256":"827dc4fb5ace8a25a0bd80d05450eaa758bd39d1d09485d3d428dd20ad9325aa"},{"bytes":208049,"kind":"file","name":"package.tar.gz","sha256":"389e7aabca8887ee3b48b6ff0b4affe1163216005a4888013d9ccc82ea360e32"},{"bytes":584,"kind":"file","name":"runtime_manifest.json","sha256":"388a610997fad0071b9140a44e88edff60a3e7ee3486faeaca769c0026246c8e"}] +SB041A_EXPERIMENT_JSON={"bytes":841,"exists":true,"object":{"code_identity":"e32760c69a4311728db9066ee8bf2bf66b1e5a70","collection_start_at":"2026-09-07T00:00:00+00:00","demonov_branch_policy_id":"ALL_FROZEN_PROFILES_ALL_NODES_RESEARCH_V1","experiment_id":"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338","experiment_version":"LIVE_PROSPECTIVE_V2","finality_policy_id":"BITFINEX_SEQ_ALL_D1_V1","geometry_policy_id":"RESEARCH_RECONSTRUCTION_8020_V1","market_bundle_id":"78dbbebab22f49bfc4866b40e2362886b1441790d8a73a005a4eb09a5d2c64ae","notification_policy_id":"SIGNIFICANT_STATE_CHANGE_EMAIL_V1","outcome_policy_id":"DIRECTIONAL_CLOSE_AFTER_7_D1_BARS_V1","policy_registry_id":"055d0b052d394f1e08176b035617fbdd96f04fff0cdfb195c2d736fd66e6ad37","runtime_manifest_id":"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a"},"sha256":"827dc4fb5ace8a25a0bd80d05450eaa758bd39d1d09485d3d428dd20ad9325aa"} +SB041A_MANIFEST_JSON={"bytes":584,"exists":true,"object":{"application_image_id":"sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736","base_image_digest":"sha256:881d80734ee05dca6f7f42dcb080975652a53c7eda9ba1f03bb8da31aa6a6ec2","code_identity":"e32760c69a4311728db9066ee8bf2bf66b1e5a70","compose_hash":"6461532b0a04decc60fe1d1885990020e886d40de40c0523e34e2849600af061","finality_policy_id":"BITFINEX_SEQ_ALL_D1_V1","package_identity":"637acba19fb29c98408a8031dc9265a31dc36551c666fcf0b287e8af83d2b893","runtime_manifest_id":"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a"},"sha256":"388a610997fad0071b9140a44e88edff60a3e7ee3486faeaca769c0026246c8e"} +SB041A_SERVICE_BOOT_JSON={"bytes":224,"exists":true,"object":{"booted_at":"2026-09-06T18:48:21.063302+00:00","code_identity":"e32760c69a4311728db9066ee8bf2bf66b1e5a70","execution_authority":false,"production_launch_allowed":false,"risk_authority":false,"service":"8020-demonov-shadow"},"sha256":"798a145e6c142bea2cd41a74a3fa707452da9a606cc84ff6afd1d60b43abb1f8"} +SB041A_EXPERIMENT_HASH_CHECKS=[{"matches":true,"method":"compact_sorted_utf8","sha256":"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338"},{"matches":true,"method":"compact_sorted_ascii","sha256":"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338"},{"matches":false,"method":"default_sorted_utf8","sha256":"bcce3a27298e277b694ea2fb5848b912ad2816fd249c14a4617a0951b1d4dc4d"},{"matches":false,"method":"default_sorted_ascii","sha256":"bcce3a27298e277b694ea2fb5848b912ad2816fd249c14a4617a0951b1d4dc4d"},{"matches":false,"method":"indent2_sorted_utf8","sha256":"4ee2673c98107eb0bf81ebc4ef4e57b47670247bc90e0be2e4be5ed3d1348129"}] +SB041A_MANIFEST_HASH_CHECKS=[{"matches":false,"method":"compact_sorted_utf8","sha256":"7ac46712abbea24436b24af4fc962bdf5b8a348559a64c879c278fb17114c0a5"},{"matches":false,"method":"compact_sorted_ascii","sha256":"7ac46712abbea24436b24af4fc962bdf5b8a348559a64c879c278fb17114c0a5"},{"matches":false,"method":"default_sorted_utf8","sha256":"a68890d9717e29ac1db356e9e17f2fc10408327f8d8707caddbeb330e433d524"},{"matches":false,"method":"default_sorted_ascii","sha256":"a68890d9717e29ac1db356e9e17f2fc10408327f8d8707caddbeb330e433d524"},{"matches":false,"method":"indent2_sorted_utf8","sha256":"caaafb8613f463a4ed2915d1ccce0010e7945bb5058d67721a41fa3bb0d80188"}] +SB041A_COLLECTOR_CARDINALITY=1 +SB041A_RUNTIME_MANIFEST_SOURCE={"classes":[{"name":"RuntimeDeploymentManifestV1"}],"functions":[{"args":["value","name"],"kwonly":[],"name":"_required","source":"def _required(value: str, name: str) -> str:\n if not isinstance(value, str) or not value:\n raise DemonovError(f\"{name} is required\")\n return value"},{"args":["value","name"],"kwonly":[],"name":"_sha256_hex","source":"def _sha256_hex(value: str, name: str) -> str:\n _required(value, name)\n if _SHA256_RE.fullmatch(value) is None:\n raise DemonovError(f\"{name} must be lowercase sha256 hex\")\n return value"},{"args":["value","name"],"kwonly":[],"name":"_sha256_id","source":"def _sha256_id(value: str, name: str) -> str:\n _required(value, name)\n if _SHA256_ID_RE.fullmatch(value) is None:\n raise DemonovError(f\"{name} must be immutable sha256 identity\")\n return value"},{"args":["manifest"],"kwonly":["expected_code_identity","actual_image_id","actual_package_identity"],"name":"verify_runtime_manifest","source":"def verify_runtime_manifest(\n manifest: RuntimeDeploymentManifestV1,\n *,\n expected_code_identity: str,\n actual_image_id: str,\n actual_package_identity: str,\n) -> None:\n if not isinstance(manifest, RuntimeDeploymentManifestV1):\n raise DemonovError(\"runtime manifest required\")\n manifest.__post_init__()\n if manifest.code_identity != expected_code_identity:\n raise DemonovError(\"runtime manifest code identity mismatch\")\n if manifest.application_image_id != actual_image_id:\n raise DemonovError(\"runtime manifest application image mismatch\")\n if manifest.package_identity != actual_package_identity:\n raise DemonovError(\"runtime manifest package identity mismatch\")"}],"lines":123,"rc":0,"sha256":"1064cfb74303fdc8e0bf50bae95b1e755556a5b1dfc28b2b062341becaba08f2"} +SB041A_LIVE_PROSPECTIVE_SOURCE={"classes":[{"name":"ExperimentProvenance"},{"name":"LiveProspectiveStore"}],"functions":[{"args":["value"],"kwonly":[],"name":"_hash","source":"def _hash(value: object) -> str:\n return hashlib.sha256(\n json.dumps(value, sort_keys=True, separators=(\",\", \":\"), ensure_ascii=True).encode()\n ).hexdigest()"},{"args":["bar"],"kwonly":[],"name":"_bar_json","source":"def _bar_json(bar) -> str:\n return json.dumps({\n \"bar_id\": bar.bar_id,\n \"market_key\": bar.market_key,\n \"open_at\": bar.open_at.isoformat(),\n \"close_at\": bar.close_at.isoformat(),\n \"known_at\": bar.known_at.isoformat(),\n \"received_at\": bar.received_at.isoformat(),\n \"open\": str(bar.open), \"high\": str(bar.high), \"low\": str(bar.low),\n \"close\": str(bar.close), \"volume\": str(bar.volume),\n \"boundary_policy_hash\": bar.boundary_policy_hash,\n \"source_bar_ids\": list(bar.source_bar_ids),\n }, sort_keys=True, separators=(\",\", \":\"))"},{"args":["line"],"kwonly":[],"name":"_line_json","source":"def _line_json(line: ResearchTrendLine | None) -> str:\n if line is None:\n return \"\"\n return json.dumps({\n \"line_id\": line.line_id, \"role\": line.role.value, \"version\": line.version,\n \"first_at\": line.first_at.isoformat(), \"first_price\": str(line.first_price),\n \"second_at\": line.second_at.isoformat(), \"second_price\": str(line.second_price),\n \"frozen_at\": line.frozen_at.isoformat(), \"geometry_policy_id\": line.geometry_policy_id,\n }, sort_keys=True, separators=(\",\", \":\"))"},{"args":["raw"],"kwonly":[],"name":"_line_from_json","source":"def _line_from_json(raw: str) -> ResearchTrendLine | None:\n if not raw:\n return None\n x = json.loads(raw)\n return ResearchTrendLine(\n line_id=x[\"line_id\"], role=ResearchBarrierRole(x[\"role\"]), version=x[\"version\"],\n first_at=datetime.fromisoformat(x[\"first_at\"]), first_price=Decimal(x[\"first_price\"]),\n second_at=datetime.fromisoformat(x[\"second_at\"]), second_price=Decimal(x[\"second_price\"]),\n frozen_at=datetime.fromisoformat(x[\"frozen_at\"]), geometry_policy_id=x[\"geometry_policy_id\"],\n )"},{"args":["states"],"kwonly":[],"name":"_states_json","source":"def _states_json(states) -> str:\n return json.dumps([{\n \"state_id\": s.state_id, \"arm_id\": s.arm_id.value,\n \"interaction_state\": s.interaction_state.value,\n \"close_beyond_count\": s.close_beyond_count, \"last_sequence\": s.last_sequence,\n } for s in states], sort_keys=True, separators=(\",\", \":\"))"},{"args":["raw"],"kwonly":[],"name":"_states_from_json","source":"def _states_from_json(raw: str):\n from .prospective_policy import AcceptanceArmId\n if not raw:\n return ()\n return tuple(ArmFSMState(\n state_id=x[\"state_id\"], arm_id=AcceptanceArmId(x[\"arm_id\"]),\n interaction_state=ProspectiveInteractionState(x[\"interaction_state\"]),\n close_beyond_count=x[\"close_beyond_count\"], last_sequence=x[\"last_sequence\"],\n ) for x in json.loads(raw))"}],"lines":851,"rc":0,"sha256":"f83f48dfeb4dc1382ebf3c77b7ec27deaeac6eec4a5dc097f90600963f0e4e98"} +SB041A_DECISION=DEPLOY_API_CONTRACT_READY +SB041A_MUTATION_SCOPE=NONE_READ_ONLY +SIGNALBOT041A_HOLDS=[] +SIGNALBOT041A_DECISION=DEPLOY_API_CONTRACT_READY +SIGNALBOT041A_MUTATION_SCOPE=NO_RUNTIME_NO_GIT_NO_EXCHANGE_MUTATION + +OUTPUT_END +CHAT_OUTPUT_END diff --git a/runtime/latest.json b/runtime/latest.json index 6448d485..f0e25636 100644 --- a/runtime/latest.json +++ b/runtime/latest.json @@ -1,19 +1,19 @@ { "schema_version": 1, "channel": "homelab-runtime", - "command_id": "SIGNALBOT-260908-DEPLOY-PREP-DETAIL-041DETAIL", + "command_id": "SIGNALBOT-260908-DEPLOY-PREP-API-041API", "status": "OK", "rc": 0, "host": "pve01", "mode": "read-only", - "component": "signalbot-cr0116-deploy-prep-detail", - "started_at_utc": "2026-09-08T06:27:44Z", - "finished_at_utc": "2026-09-08T06:27:46Z", + "component": "signalbot-cr0116-deploy-api-contract", + "started_at_utc": "2026-09-08T06:35:33Z", + "finished_at_utc": "2026-09-08T06:35:35Z", "reference_register_checked": true, "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", "error_register_checked": true, "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", - "command_sha256": "897dd750d0459b4a65e5a8aae482b95a07d371ca5b5615eeede31d8045ace279", + "command_sha256": "ce5ef6223547685761dcfca508de8d9390949208763bf7938e8d43d0c7641bab", "duplicate_failed_command_blocked": false, "block_reason": null, "execution_started": true, @@ -30,9 +30,9 @@ "secrets_included": false, "private_addresses_included": false, "raw_evidence_retained_locally": true, - "raw_evidence_sha256": "be711e66f61d03ad61fc70599b9055757b74df411c64d872373207055147a62e", - "sanitized_output_sha256": "be711e66f61d03ad61fc70599b9055757b74df411c64d872373207055147a62e", + "raw_evidence_sha256": "f271ff2f659b1a49c637ca9d67e7b6bc0314cc0dd8570fb252504418765369ce", + "sanitized_output_sha256": "f271ff2f659b1a49c637ca9d67e7b6bc0314cc0dd8570fb252504418765369ce", "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\nSB041D_ACTIVE_ENV={\"exists\":true,\"sha256\":\"4bbc6bd31417f6265767c1fb971d118d36d27d7b57a90b49e6586461acf0609b\",\"values\":{\"APP_IMAGE\":\"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"CODE_IDENTITY\":\"e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"COLLECTION_START_AT\":\"2026-09-07T00:00:00+00:00\",\"EXPERIMENT_ID\":\"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338\",\"RUNTIME_MANIFEST_ID\":\"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a\"}}\nSB041D_OLD_ENV_NEW={\"exists\":true,\"sha256\":\"4bbc6bd31417f6265767c1fb971d118d36d27d7b57a90b49e6586461acf0609b\",\"values\":{\"APP_IMAGE\":\"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"CODE_IDENTITY\":\"e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"COLLECTION_START_AT\":\"2026-09-07T00:00:00+00:00\",\"EXPERIMENT_ID\":\"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338\",\"RUNTIME_MANIFEST_ID\":\"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a\"}}\nSB041D_DOCKERFILE={\"exists\":true,\"instructions\":[{\"arg\":\"8020-demonov-shadow:ac7094a76ddc06f376d71a76432af7c2dd10ec7d\",\"op\":\"FROM\"},{\"arg\":\"demonov_forward_map /app/demonov_forward_map\",\"op\":\"COPY\"}],\"sha256\":\"901951def73961f76d2c2a93c5428a0fbdcc50113d42b39da92983a5ce157cb8\"}\nSB041D_BUILD_LOG={\"exists\":true,\"selected_lines\":[\"#7 exporting to image\",\"#7 writing image sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736 done\",\"#7 naming to docker.io/library/8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70 done\"],\"sha256\":\"601fe18bcce58d509431626b9c934e170fd572089dcfbfbf310c3aa9217293eb\"}\nSB041D_DEPLOY_FILES={\"exists\":true,\"files\":[\".env.new\",\"Dockerfile\",\"build.log\",\"compose-up.log\",\"demonov_forward_map/__init__.py\",\"demonov_forward_map/bars.py\",\"demonov_forward_map/bitfinex_trade_collector.py\",\"demonov_forward_map/bot_orchestrator.py\",\"demonov_forward_map/canonical_hash.py\",\"demonov_forward_map/checkpoints.py\",\"demonov_forward_map/code_identity.py\",\"demonov_forward_map/consumer_scaling.py\",\"demonov_forward_map/demonov_multiarm.py\",\"demonov_forward_map/domain.py\",\"demonov_forward_map/engine.py\",\"demonov_forward_map/evaluation_freeze.py\",\"demonov_forward_map/event_stream.py\",\"demonov_forward_map/evidence_finality.py\",\"demonov_forward_map/execution_transcript.py\",\"demonov_forward_map/experimental_design.py\",\"demonov_forward_map/incremental_info.py\",\"demonov_forward_map/inference.py\",\"demonov_forward_map/ledger.py\",\"demonov_forward_map/live_d1_finality.py\",\"demonov_forward_map/live_health.py\",\"demonov_forward_map/live_market_adapters.py\",\"demonov_forward_map/live_prospective.py\",\"demonov_forward_map/live_schema.py\",\"demonov_forward_map/live_worker.py\",\"demonov_forward_map/notification_relay.py\",\"demonov_forward_map/numeric.py\",\"demonov_forward_map/opportunity_adapter.py\",\"demonov_forward_map/outbox_delivery.py\",\"demonov_forward_map/producer_core.py\",\"demonov_forward_map/producer_policy.py\",\"demonov_forward_map/producer_runtime.py\",\"demonov_forward_map/producer_state.py\",\"demonov_forward_map/profiles.py\",\"demonov_forward_map/projection_binding.py\",\"demonov_forward_map/proof_completeness.py\",\"demonov_forward_map/prospective_fsm.py\",\"demonov_forward_map/prospective_ledger.py\",\"demonov_forward_map/prospective_market.py\",\"demonov_forward_map/prospective_policy.py\",\"demonov_forward_map/registry.py\",\"demonov_forward_map/replay_integrity.py\",\"demonov_forward_map/research_geometry.py\",\"demonov_forward_map/router.py\",\"demonov_forward_map/runtime_integrity.py\",\"demonov_forward_map/runtime_manifest.py\",\"demonov_forward_map/selectors.py\",\"demonov_forward_map/shadow.py\",\"demonov_forward_map/shadow_delivery_runtime.py\",\"demonov_forward_map/shadow_mail.py\",\"demonov_forward_map/shadow_service.py\",\"demonov_forward_map/signal_consensus.py\",\"demonov_forward_map/signal_outbox.py\",\"demonov_forward_map/spatial_policy.py\",\"demonov_forward_map/target_resolver.py\",\"demonov_forward_map/weekly_report.py\",\"demonov_forward_map/zones.py\",\"experiment.json\",\"package.tar.gz\",\"runtime_manifest.json\"]}\nSB041D_EPOCH={\"exists\":true,\"path\":\"/opt/stacks/8020-demonov-shadow/data/epochs/ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338\"}\nSB041D_EPOCH_JSON={\"experiment.json\":{\"bytes\":841,\"exists\":true,\"keys\":[\"code_identity\",\"collection_start_at\",\"demonov_branch_policy_id\",\"experiment_id\",\"experiment_version\",\"finality_policy_id\",\"geometry_policy_id\",\"market_bundle_id\",\"notification_policy_id\",\"outcome_policy_id\",\"policy_registry_id\",\"runtime_manifest_id\"],\"safe_object\":{\"code_identity\":\"e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"collection_start_at\":\"2026-09-07T00:00:00+00:00\",\"demonov_branch_policy_id\":\"ALL_FROZEN_PROFILES_ALL_NODES_RESEARCH_V1\",\"experiment_id\":\"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338\",\"experiment_version\":\"LIVE_PROSPECTIVE_V2\",\"finality_policy_id\":\"BITFINEX_SEQ_ALL_D1_V1\",\"geometry_policy_id\":\"RESEARCH_RECONSTRUCTION_8020_V1\",\"market_bundle_id\":\"78dbbebab22f49bfc4866b40e2362886b1441790d8a73a005a4eb09a5d2c64ae\",\"notification_policy_id\":\"SIGNIFICANT_STATE_CHANGE_EMAIL_V1\",\"outcome_policy_id\":\"DIRECTIONAL_CLOSE_AFTER_7_D1_BARS_V1\",\"policy_registry_id\":\"055d0b052d394f1e08176b035617fbdd96f04fff0cdfb195c2d736fd66e6ad37\",\"runtime_manifest_id\":\"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a\"},\"sha256\":\"827dc4fb5ace8a25a0bd80d05450eaa758bd39d1d09485d3d428dd20ad9325aa\",\"type\":\"dict\"},\"runtime_manifest.json\":{\"bytes\":584,\"exists\":true,\"keys\":[\"application_image_id\",\"base_image_digest\",\"code_identity\",\"compose_hash\",\"finality_policy_id\",\"package_identity\",\"runtime_manifest_id\"],\"safe_object\":{\"application_image_id\":\"sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736\",\"base_image_digest\":\"sha256:881d80734ee05dca6f7f42dcb080975652a53c7eda9ba1f03bb8da31aa6a6ec2\",\"code_identity\":\"e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"compose_hash\":\"6461532b0a04decc60fe1d1885990020e886d40de40c0523e34e2849600af061\",\"finality_policy_id\":\"BITFINEX_SEQ_ALL_D1_V1\",\"package_identity\":\"637acba19fb29c98408a8031dc9265a31dc36551c666fcf0b287e8af83d2b893\",\"runtime_manifest_id\":\"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a\"},\"sha256\":\"388a610997fad0071b9140a44e88edff60a3e7ee3486faeaca769c0026246c8e\",\"type\":\"dict\"},\"service_boot.json\":{\"bytes\":224,\"exists\":true,\"keys\":[\"booted_at\",\"code_identity\",\"execution_authority\",\"production_launch_allowed\",\"risk_authority\",\"service\"],\"safe_object\":{\"booted_at\":\"2026-09-06T18:48:21.063302+00:00\",\"code_identity\":\"e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"execution_authority\":false,\"production_launch_allowed\":false,\"risk_authority\":false,\"service\":\"8020-demonov-shadow\"},\"sha256\":\"798a145e6c142bea2cd41a74a3fa707452da9a606cc84ff6afd1d60b43abb1f8\",\"type\":\"dict\"}}\nSB041D_MANIFEST_HASH_CONTRACT=[{\"matches_expected\":false,\"method\":\"compact_sorted\",\"sha256\":\"7ac46712abbea24436b24af4fc962bdf5b8a348559a64c879c278fb17114c0a5\"},{\"matches_expected\":false,\"method\":\"compact_sorted_ascii\",\"sha256\":\"7ac46712abbea24436b24af4fc962bdf5b8a348559a64c879c278fb17114c0a5\"},{\"matches_expected\":false,\"method\":\"default_sorted\",\"sha256\":\"a68890d9717e29ac1db356e9e17f2fc10408327f8d8707caddbeb330e433d524\"},{\"matches_expected\":false,\"method\":\"indent2_sorted\",\"sha256\":\"caaafb8613f463a4ed2915d1ccce0010e7945bb5058d67721a41fa3bb0d80188\"}]\nSB041D_EXPERIMENT_HASH_CONTRACT=[{\"matches_expected\":true,\"method\":\"compact_sorted\",\"sha256\":\"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338\"},{\"matches_expected\":true,\"method\":\"compact_sorted_ascii\",\"sha256\":\"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338\"},{\"matches_expected\":false,\"method\":\"default_sorted\",\"sha256\":\"bcce3a27298e277b694ea2fb5848b912ad2816fd249c14a4617a0951b1d4dc4d\"},{\"matches_expected\":false,\"method\":\"indent2_sorted\",\"sha256\":\"4ee2673c98107eb0bf81ebc4ef4e57b47670247bc90e0be2e4be5ed3d1348129\"}]\nSB041D_COLLECTOR={\"count\":1,\"name\":\"demonov-shadow-8020-collector-1\"}\nSB041D_RUNTIME_MANIFEST_API={\"classes\":[\"RuntimeDeploymentManifestV1\"],\"functions\":[{\"args\":[\"value\",\"name\"],\"defaults\":0,\"kwonly\":[],\"name\":\"_required\"},{\"args\":[\"value\",\"name\"],\"defaults\":0,\"kwonly\":[],\"name\":\"_sha256_hex\"},{\"args\":[\"value\",\"name\"],\"defaults\":0,\"kwonly\":[],\"name\":\"_sha256_id\"},{\"args\":[\"manifest\"],\"defaults\":0,\"kwonly\":[\"expected_code_identity\",\"actual_image_id\",\"actual_package_identity\"],\"name\":\"verify_runtime_manifest\"}],\"lines\":123,\"rc\":0,\"safe_constants\":{},\"sha256\":\"1064cfb74303fdc8e0bf50bae95b1e755556a5b1dfc28b2b062341becaba08f2\"}\nSB041D_LIVE_PROSPECTIVE_API={\"classes\":[\"ExperimentProvenance\",\"LiveProspectiveStore\"],\"functions\":[{\"args\":[\"value\"],\"defaults\":0,\"kwonly\":[],\"name\":\"_hash\"},{\"args\":[\"bar\"],\"defaults\":0,\"kwonly\":[],\"name\":\"_bar_json\"},{\"args\":[\"line\"],\"defaults\":0,\"kwonly\":[],\"name\":\"_line_json\"},{\"args\":[\"raw\"],\"defaults\":0,\"kwonly\":[],\"name\":\"_line_from_json\"},{\"args\":[\"states\"],\"defaults\":0,\"kwonly\":[],\"name\":\"_states_json\"},{\"args\":[\"raw\"],\"defaults\":0,\"kwonly\":[],\"name\":\"_states_from_json\"}],\"lines\":851,\"rc\":0,\"safe_constants\":{},\"sha256\":\"f83f48dfeb4dc1382ebf3c77b7ec27deaeac6eec4a5dc097f90600963f0e4e98\"}\nSB041D_DECISION=DEPLOY_PREP_DETAIL_EVIDENCE_READY\nSB041D_MUTATION_SCOPE=NONE_READ_ONLY\nSIGNALBOT041D_HOLDS=[]\nSIGNALBOT041D_DECISION=DEPLOY_PREP_DETAIL_EVIDENCE_READY\nSIGNALBOT041D_MUTATION_SCOPE=NO_RUNTIME_NO_GIT_NO_EXCHANGE_MUTATION\n" + "output": "ERROR_REGISTER_CHECK=OK\nREFERENCE_CHECK=OK\nAUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED\nSB041A_ACTIVE_ENV={\"exists\":true,\"sha256\":\"4bbc6bd31417f6265767c1fb971d118d36d27d7b57a90b49e6586461acf0609b\",\"values\":{\"APP_IMAGE\":\"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"CODE_IDENTITY\":\"e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"COLLECTION_START_AT\":\"2026-09-07T00:00:00+00:00\",\"EXPERIMENT_ID\":\"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338\",\"RUNTIME_MANIFEST_ID\":\"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a\"}}\nSB041A_DOCKERFILE={\"exists\":true,\"sha256\":\"901951def73961f76d2c2a93c5428a0fbdcc50113d42b39da92983a5ce157cb8\",\"text\":\"FROM 8020-demonov-shadow:ac7094a76ddc06f376d71a76432af7c2dd10ec7d\\nCOPY demonov_forward_map /app/demonov_forward_map\"}\nSB041A_DEPLOY_TOP=[{\"bytes\":336,\"kind\":\"file\",\"name\":\".env.new\",\"sha256\":\"4bbc6bd31417f6265767c1fb971d118d36d27d7b57a90b49e6586461acf0609b\"},{\"bytes\":116,\"kind\":\"file\",\"name\":\"Dockerfile\",\"sha256\":\"901951def73961f76d2c2a93c5428a0fbdcc50113d42b39da92983a5ce157cb8\"},{\"bytes\":886,\"kind\":\"file\",\"name\":\"build.log\",\"sha256\":\"601fe18bcce58d509431626b9c934e170fd572089dcfbfbf310c3aa9217293eb\"},{\"bytes\":808,\"kind\":\"file\",\"name\":\"compose-up.log\",\"sha256\":\"5758c75a39a1a7689f92513e3105708d1c71b7bcb14915e7013b1199b618f6d4\"},{\"kind\":\"dir\",\"name\":\"demonov_forward_map\"},{\"bytes\":841,\"kind\":\"file\",\"name\":\"experiment.json\",\"sha256\":\"827dc4fb5ace8a25a0bd80d05450eaa758bd39d1d09485d3d428dd20ad9325aa\"},{\"bytes\":208049,\"kind\":\"file\",\"name\":\"package.tar.gz\",\"sha256\":\"389e7aabca8887ee3b48b6ff0b4affe1163216005a4888013d9ccc82ea360e32\"},{\"bytes\":584,\"kind\":\"file\",\"name\":\"runtime_manifest.json\",\"sha256\":\"388a610997fad0071b9140a44e88edff60a3e7ee3486faeaca769c0026246c8e\"}]\nSB041A_EXPERIMENT_JSON={\"bytes\":841,\"exists\":true,\"object\":{\"code_identity\":\"e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"collection_start_at\":\"2026-09-07T00:00:00+00:00\",\"demonov_branch_policy_id\":\"ALL_FROZEN_PROFILES_ALL_NODES_RESEARCH_V1\",\"experiment_id\":\"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338\",\"experiment_version\":\"LIVE_PROSPECTIVE_V2\",\"finality_policy_id\":\"BITFINEX_SEQ_ALL_D1_V1\",\"geometry_policy_id\":\"RESEARCH_RECONSTRUCTION_8020_V1\",\"market_bundle_id\":\"78dbbebab22f49bfc4866b40e2362886b1441790d8a73a005a4eb09a5d2c64ae\",\"notification_policy_id\":\"SIGNIFICANT_STATE_CHANGE_EMAIL_V1\",\"outcome_policy_id\":\"DIRECTIONAL_CLOSE_AFTER_7_D1_BARS_V1\",\"policy_registry_id\":\"055d0b052d394f1e08176b035617fbdd96f04fff0cdfb195c2d736fd66e6ad37\",\"runtime_manifest_id\":\"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a\"},\"sha256\":\"827dc4fb5ace8a25a0bd80d05450eaa758bd39d1d09485d3d428dd20ad9325aa\"}\nSB041A_MANIFEST_JSON={\"bytes\":584,\"exists\":true,\"object\":{\"application_image_id\":\"sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736\",\"base_image_digest\":\"sha256:881d80734ee05dca6f7f42dcb080975652a53c7eda9ba1f03bb8da31aa6a6ec2\",\"code_identity\":\"e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"compose_hash\":\"6461532b0a04decc60fe1d1885990020e886d40de40c0523e34e2849600af061\",\"finality_policy_id\":\"BITFINEX_SEQ_ALL_D1_V1\",\"package_identity\":\"637acba19fb29c98408a8031dc9265a31dc36551c666fcf0b287e8af83d2b893\",\"runtime_manifest_id\":\"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a\"},\"sha256\":\"388a610997fad0071b9140a44e88edff60a3e7ee3486faeaca769c0026246c8e\"}\nSB041A_SERVICE_BOOT_JSON={\"bytes\":224,\"exists\":true,\"object\":{\"booted_at\":\"2026-09-06T18:48:21.063302+00:00\",\"code_identity\":\"e32760c69a4311728db9066ee8bf2bf66b1e5a70\",\"execution_authority\":false,\"production_launch_allowed\":false,\"risk_authority\":false,\"service\":\"8020-demonov-shadow\"},\"sha256\":\"798a145e6c142bea2cd41a74a3fa707452da9a606cc84ff6afd1d60b43abb1f8\"}\nSB041A_EXPERIMENT_HASH_CHECKS=[{\"matches\":true,\"method\":\"compact_sorted_utf8\",\"sha256\":\"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338\"},{\"matches\":true,\"method\":\"compact_sorted_ascii\",\"sha256\":\"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338\"},{\"matches\":false,\"method\":\"default_sorted_utf8\",\"sha256\":\"bcce3a27298e277b694ea2fb5848b912ad2816fd249c14a4617a0951b1d4dc4d\"},{\"matches\":false,\"method\":\"default_sorted_ascii\",\"sha256\":\"bcce3a27298e277b694ea2fb5848b912ad2816fd249c14a4617a0951b1d4dc4d\"},{\"matches\":false,\"method\":\"indent2_sorted_utf8\",\"sha256\":\"4ee2673c98107eb0bf81ebc4ef4e57b47670247bc90e0be2e4be5ed3d1348129\"}]\nSB041A_MANIFEST_HASH_CHECKS=[{\"matches\":false,\"method\":\"compact_sorted_utf8\",\"sha256\":\"7ac46712abbea24436b24af4fc962bdf5b8a348559a64c879c278fb17114c0a5\"},{\"matches\":false,\"method\":\"compact_sorted_ascii\",\"sha256\":\"7ac46712abbea24436b24af4fc962bdf5b8a348559a64c879c278fb17114c0a5\"},{\"matches\":false,\"method\":\"default_sorted_utf8\",\"sha256\":\"a68890d9717e29ac1db356e9e17f2fc10408327f8d8707caddbeb330e433d524\"},{\"matches\":false,\"method\":\"default_sorted_ascii\",\"sha256\":\"a68890d9717e29ac1db356e9e17f2fc10408327f8d8707caddbeb330e433d524\"},{\"matches\":false,\"method\":\"indent2_sorted_utf8\",\"sha256\":\"caaafb8613f463a4ed2915d1ccce0010e7945bb5058d67721a41fa3bb0d80188\"}]\nSB041A_COLLECTOR_CARDINALITY=1\nSB041A_RUNTIME_MANIFEST_SOURCE={\"classes\":[{\"name\":\"RuntimeDeploymentManifestV1\"}],\"functions\":[{\"args\":[\"value\",\"name\"],\"kwonly\":[],\"name\":\"_required\",\"source\":\"def _required(value: str, name: str) -> str:\\n if not isinstance(value, str) or not value:\\n raise DemonovError(f\\\"{name} is required\\\")\\n return value\"},{\"args\":[\"value\",\"name\"],\"kwonly\":[],\"name\":\"_sha256_hex\",\"source\":\"def _sha256_hex(value: str, name: str) -> str:\\n _required(value, name)\\n if _SHA256_RE.fullmatch(value) is None:\\n raise DemonovError(f\\\"{name} must be lowercase sha256 hex\\\")\\n return value\"},{\"args\":[\"value\",\"name\"],\"kwonly\":[],\"name\":\"_sha256_id\",\"source\":\"def _sha256_id(value: str, name: str) -> str:\\n _required(value, name)\\n if _SHA256_ID_RE.fullmatch(value) is None:\\n raise DemonovError(f\\\"{name} must be immutable sha256 identity\\\")\\n return value\"},{\"args\":[\"manifest\"],\"kwonly\":[\"expected_code_identity\",\"actual_image_id\",\"actual_package_identity\"],\"name\":\"verify_runtime_manifest\",\"source\":\"def verify_runtime_manifest(\\n manifest: RuntimeDeploymentManifestV1,\\n *,\\n expected_code_identity: str,\\n actual_image_id: str,\\n actual_package_identity: str,\\n) -> None:\\n if not isinstance(manifest, RuntimeDeploymentManifestV1):\\n raise DemonovError(\\\"runtime manifest required\\\")\\n manifest.__post_init__()\\n if manifest.code_identity != expected_code_identity:\\n raise DemonovError(\\\"runtime manifest code identity mismatch\\\")\\n if manifest.application_image_id != actual_image_id:\\n raise DemonovError(\\\"runtime manifest application image mismatch\\\")\\n if manifest.package_identity != actual_package_identity:\\n raise DemonovError(\\\"runtime manifest package identity mismatch\\\")\"}],\"lines\":123,\"rc\":0,\"sha256\":\"1064cfb74303fdc8e0bf50bae95b1e755556a5b1dfc28b2b062341becaba08f2\"}\nSB041A_LIVE_PROSPECTIVE_SOURCE={\"classes\":[{\"name\":\"ExperimentProvenance\"},{\"name\":\"LiveProspectiveStore\"}],\"functions\":[{\"args\":[\"value\"],\"kwonly\":[],\"name\":\"_hash\",\"source\":\"def _hash(value: object) -> str:\\n return hashlib.sha256(\\n json.dumps(value, sort_keys=True, separators=(\\\",\\\", \\\":\\\"), ensure_ascii=True).encode()\\n ).hexdigest()\"},{\"args\":[\"bar\"],\"kwonly\":[],\"name\":\"_bar_json\",\"source\":\"def _bar_json(bar) -> str:\\n return json.dumps({\\n \\\"bar_id\\\": bar.bar_id,\\n \\\"market_key\\\": bar.market_key,\\n \\\"open_at\\\": bar.open_at.isoformat(),\\n \\\"close_at\\\": bar.close_at.isoformat(),\\n \\\"known_at\\\": bar.known_at.isoformat(),\\n \\\"received_at\\\": bar.received_at.isoformat(),\\n \\\"open\\\": str(bar.open), \\\"high\\\": str(bar.high), \\\"low\\\": str(bar.low),\\n \\\"close\\\": str(bar.close), \\\"volume\\\": str(bar.volume),\\n \\\"boundary_policy_hash\\\": bar.boundary_policy_hash,\\n \\\"source_bar_ids\\\": list(bar.source_bar_ids),\\n }, sort_keys=True, separators=(\\\",\\\", \\\":\\\"))\"},{\"args\":[\"line\"],\"kwonly\":[],\"name\":\"_line_json\",\"source\":\"def _line_json(line: ResearchTrendLine | None) -> str:\\n if line is None:\\n return \\\"\\\"\\n return json.dumps({\\n \\\"line_id\\\": line.line_id, \\\"role\\\": line.role.value, \\\"version\\\": line.version,\\n \\\"first_at\\\": line.first_at.isoformat(), \\\"first_price\\\": str(line.first_price),\\n \\\"second_at\\\": line.second_at.isoformat(), \\\"second_price\\\": str(line.second_price),\\n \\\"frozen_at\\\": line.frozen_at.isoformat(), \\\"geometry_policy_id\\\": line.geometry_policy_id,\\n }, sort_keys=True, separators=(\\\",\\\", \\\":\\\"))\"},{\"args\":[\"raw\"],\"kwonly\":[],\"name\":\"_line_from_json\",\"source\":\"def _line_from_json(raw: str) -> ResearchTrendLine | None:\\n if not raw:\\n return None\\n x = json.loads(raw)\\n return ResearchTrendLine(\\n line_id=x[\\\"line_id\\\"], role=ResearchBarrierRole(x[\\\"role\\\"]), version=x[\\\"version\\\"],\\n first_at=datetime.fromisoformat(x[\\\"first_at\\\"]), first_price=Decimal(x[\\\"first_price\\\"]),\\n second_at=datetime.fromisoformat(x[\\\"second_at\\\"]), second_price=Decimal(x[\\\"second_price\\\"]),\\n frozen_at=datetime.fromisoformat(x[\\\"frozen_at\\\"]), geometry_policy_id=x[\\\"geometry_policy_id\\\"],\\n )\"},{\"args\":[\"states\"],\"kwonly\":[],\"name\":\"_states_json\",\"source\":\"def _states_json(states) -> str:\\n return json.dumps([{\\n \\\"state_id\\\": s.state_id, \\\"arm_id\\\": s.arm_id.value,\\n \\\"interaction_state\\\": s.interaction_state.value,\\n \\\"close_beyond_count\\\": s.close_beyond_count, \\\"last_sequence\\\": s.last_sequence,\\n } for s in states], sort_keys=True, separators=(\\\",\\\", \\\":\\\"))\"},{\"args\":[\"raw\"],\"kwonly\":[],\"name\":\"_states_from_json\",\"source\":\"def _states_from_json(raw: str):\\n from .prospective_policy import AcceptanceArmId\\n if not raw:\\n return ()\\n return tuple(ArmFSMState(\\n state_id=x[\\\"state_id\\\"], arm_id=AcceptanceArmId(x[\\\"arm_id\\\"]),\\n interaction_state=ProspectiveInteractionState(x[\\\"interaction_state\\\"]),\\n close_beyond_count=x[\\\"close_beyond_count\\\"], last_sequence=x[\\\"last_sequence\\\"],\\n ) for x in json.loads(raw))\"}],\"lines\":851,\"rc\":0,\"sha256\":\"f83f48dfeb4dc1382ebf3c77b7ec27deaeac6eec4a5dc097f90600963f0e4e98\"}\nSB041A_DECISION=DEPLOY_API_CONTRACT_READY\nSB041A_MUTATION_SCOPE=NONE_READ_ONLY\nSIGNALBOT041A_HOLDS=[]\nSIGNALBOT041A_DECISION=DEPLOY_API_CONTRACT_READY\nSIGNALBOT041A_MUTATION_SCOPE=NO_RUNTIME_NO_GIT_NO_EXCHANGE_MUTATION\n" } diff --git a/runtime/latest.txt b/runtime/latest.txt index 6f18ce61..6eea134b 100644 --- a/runtime/latest.txt +++ b/runtime/latest.txt @@ -1,15 +1,15 @@ CHAT_OUTPUT_BEGIN -COMMAND_ID=SIGNALBOT-260908-DEPLOY-PREP-DETAIL-041DETAIL +COMMAND_ID=SIGNALBOT-260908-DEPLOY-PREP-API-041API STATUS=OK RC=0 HOST=pve01 MODE=read-only -COMPONENT=signalbot-cr0116-deploy-prep-detail +COMPONENT=signalbot-cr0116-deploy-api-contract REFERENCE_REGISTER_CHECK=OK REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 ERROR_REGISTER_CHECK=OK ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 -COMMAND_SHA256=897dd750d0459b4a65e5a8aae482b95a07d371ca5b5615eeede31d8045ace279 +COMMAND_SHA256=ce5ef6223547685761dcfca508de8d9390949208763bf7938e8d43d0c7641bab DUPLICATE_FAILED_COMMAND_BLOCKED=false EXECUTION_STARTED=true CHANGE_DECLARED=false @@ -24,29 +24,28 @@ MUTATION_OUTCOME=NO_MUTATION SANITIZED=yes SECRETS_INCLUDED=no PRIVATE_ADDRESSES_INCLUDED=no -RAW_EVIDENCE_SHA256=be711e66f61d03ad61fc70599b9055757b74df411c64d872373207055147a62e -SANITIZED_OUTPUT_SHA256=be711e66f61d03ad61fc70599b9055757b74df411c64d872373207055147a62e +RAW_EVIDENCE_SHA256=f271ff2f659b1a49c637ca9d67e7b6bc0314cc0dd8570fb252504418765369ce +SANITIZED_OUTPUT_SHA256=f271ff2f659b1a49c637ca9d67e7b6bc0314cc0dd8570fb252504418765369ce OUTPUT_BEGIN ERROR_REGISTER_CHECK=OK REFERENCE_CHECK=OK AUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED -SB041D_ACTIVE_ENV={"exists":true,"sha256":"4bbc6bd31417f6265767c1fb971d118d36d27d7b57a90b49e6586461acf0609b","values":{"APP_IMAGE":"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70","CODE_IDENTITY":"e32760c69a4311728db9066ee8bf2bf66b1e5a70","COLLECTION_START_AT":"2026-09-07T00:00:00+00:00","EXPERIMENT_ID":"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338","RUNTIME_MANIFEST_ID":"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a"}} -SB041D_OLD_ENV_NEW={"exists":true,"sha256":"4bbc6bd31417f6265767c1fb971d118d36d27d7b57a90b49e6586461acf0609b","values":{"APP_IMAGE":"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70","CODE_IDENTITY":"e32760c69a4311728db9066ee8bf2bf66b1e5a70","COLLECTION_START_AT":"2026-09-07T00:00:00+00:00","EXPERIMENT_ID":"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338","RUNTIME_MANIFEST_ID":"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a"}} -SB041D_DOCKERFILE={"exists":true,"instructions":[{"arg":"8020-demonov-shadow:ac7094a76ddc06f376d71a76432af7c2dd10ec7d","op":"FROM"},{"arg":"demonov_forward_map /app/demonov_forward_map","op":"COPY"}],"sha256":"901951def73961f76d2c2a93c5428a0fbdcc50113d42b39da92983a5ce157cb8"} -SB041D_BUILD_LOG={"exists":true,"selected_lines":["#7 exporting to image","#7 writing image sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736 done","#7 naming to docker.io/library/8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70 done"],"sha256":"601fe18bcce58d509431626b9c934e170fd572089dcfbfbf310c3aa9217293eb"} -SB041D_DEPLOY_FILES={"exists":true,"files":[".env.new","Dockerfile","build.log","compose-up.log","demonov_forward_map/__init__.py","demonov_forward_map/bars.py","demonov_forward_map/bitfinex_trade_collector.py","demonov_forward_map/bot_orchestrator.py","demonov_forward_map/canonical_hash.py","demonov_forward_map/checkpoints.py","demonov_forward_map/code_identity.py","demonov_forward_map/consumer_scaling.py","demonov_forward_map/demonov_multiarm.py","demonov_forward_map/domain.py","demonov_forward_map/engine.py","demonov_forward_map/evaluation_freeze.py","demonov_forward_map/event_stream.py","demonov_forward_map/evidence_finality.py","demonov_forward_map/execution_transcript.py","demonov_forward_map/experimental_design.py","demonov_forward_map/incremental_info.py","demonov_forward_map/inference.py","demonov_forward_map/ledger.py","demonov_forward_map/live_d1_finality.py","demonov_forward_map/live_health.py","demonov_forward_map/live_market_adapters.py","demonov_forward_map/live_prospective.py","demonov_forward_map/live_schema.py","demonov_forward_map/live_worker.py","demonov_forward_map/notification_relay.py","demonov_forward_map/numeric.py","demonov_forward_map/opportunity_adapter.py","demonov_forward_map/outbox_delivery.py","demonov_forward_map/producer_core.py","demonov_forward_map/producer_policy.py","demonov_forward_map/producer_runtime.py","demonov_forward_map/producer_state.py","demonov_forward_map/profiles.py","demonov_forward_map/projection_binding.py","demonov_forward_map/proof_completeness.py","demonov_forward_map/prospective_fsm.py","demonov_forward_map/prospective_ledger.py","demonov_forward_map/prospective_market.py","demonov_forward_map/prospective_policy.py","demonov_forward_map/registry.py","demonov_forward_map/replay_integrity.py","demonov_forward_map/research_geometry.py","demonov_forward_map/router.py","demonov_forward_map/runtime_integrity.py","demonov_forward_map/runtime_manifest.py","demonov_forward_map/selectors.py","demonov_forward_map/shadow.py","demonov_forward_map/shadow_delivery_runtime.py","demonov_forward_map/shadow_mail.py","demonov_forward_map/shadow_service.py","demonov_forward_map/signal_consensus.py","demonov_forward_map/signal_outbox.py","demonov_forward_map/spatial_policy.py","demonov_forward_map/target_resolver.py","demonov_forward_map/weekly_report.py","demonov_forward_map/zones.py","experiment.json","package.tar.gz","runtime_manifest.json"]} -SB041D_EPOCH={"exists":true,"path":"/opt/stacks/8020-demonov-shadow/data/epochs/ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338"} -SB041D_EPOCH_JSON={"experiment.json":{"bytes":841,"exists":true,"keys":["code_identity","collection_start_at","demonov_branch_policy_id","experiment_id","experiment_version","finality_policy_id","geometry_policy_id","market_bundle_id","notification_policy_id","outcome_policy_id","policy_registry_id","runtime_manifest_id"],"safe_object":{"code_identity":"e32760c69a4311728db9066ee8bf2bf66b1e5a70","collection_start_at":"2026-09-07T00:00:00+00:00","demonov_branch_policy_id":"ALL_FROZEN_PROFILES_ALL_NODES_RESEARCH_V1","experiment_id":"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338","experiment_version":"LIVE_PROSPECTIVE_V2","finality_policy_id":"BITFINEX_SEQ_ALL_D1_V1","geometry_policy_id":"RESEARCH_RECONSTRUCTION_8020_V1","market_bundle_id":"78dbbebab22f49bfc4866b40e2362886b1441790d8a73a005a4eb09a5d2c64ae","notification_policy_id":"SIGNIFICANT_STATE_CHANGE_EMAIL_V1","outcome_policy_id":"DIRECTIONAL_CLOSE_AFTER_7_D1_BARS_V1","policy_registry_id":"055d0b052d394f1e08176b035617fbdd96f04fff0cdfb195c2d736fd66e6ad37","runtime_manifest_id":"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a"},"sha256":"827dc4fb5ace8a25a0bd80d05450eaa758bd39d1d09485d3d428dd20ad9325aa","type":"dict"},"runtime_manifest.json":{"bytes":584,"exists":true,"keys":["application_image_id","base_image_digest","code_identity","compose_hash","finality_policy_id","package_identity","runtime_manifest_id"],"safe_object":{"application_image_id":"sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736","base_image_digest":"sha256:881d80734ee05dca6f7f42dcb080975652a53c7eda9ba1f03bb8da31aa6a6ec2","code_identity":"e32760c69a4311728db9066ee8bf2bf66b1e5a70","compose_hash":"6461532b0a04decc60fe1d1885990020e886d40de40c0523e34e2849600af061","finality_policy_id":"BITFINEX_SEQ_ALL_D1_V1","package_identity":"637acba19fb29c98408a8031dc9265a31dc36551c666fcf0b287e8af83d2b893","runtime_manifest_id":"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a"},"sha256":"388a610997fad0071b9140a44e88edff60a3e7ee3486faeaca769c0026246c8e","type":"dict"},"service_boot.json":{"bytes":224,"exists":true,"keys":["booted_at","code_identity","execution_authority","production_launch_allowed","risk_authority","service"],"safe_object":{"booted_at":"2026-09-06T18:48:21.063302+00:00","code_identity":"e32760c69a4311728db9066ee8bf2bf66b1e5a70","execution_authority":false,"production_launch_allowed":false,"risk_authority":false,"service":"8020-demonov-shadow"},"sha256":"798a145e6c142bea2cd41a74a3fa707452da9a606cc84ff6afd1d60b43abb1f8","type":"dict"}} -SB041D_MANIFEST_HASH_CONTRACT=[{"matches_expected":false,"method":"compact_sorted","sha256":"7ac46712abbea24436b24af4fc962bdf5b8a348559a64c879c278fb17114c0a5"},{"matches_expected":false,"method":"compact_sorted_ascii","sha256":"7ac46712abbea24436b24af4fc962bdf5b8a348559a64c879c278fb17114c0a5"},{"matches_expected":false,"method":"default_sorted","sha256":"a68890d9717e29ac1db356e9e17f2fc10408327f8d8707caddbeb330e433d524"},{"matches_expected":false,"method":"indent2_sorted","sha256":"caaafb8613f463a4ed2915d1ccce0010e7945bb5058d67721a41fa3bb0d80188"}] -SB041D_EXPERIMENT_HASH_CONTRACT=[{"matches_expected":true,"method":"compact_sorted","sha256":"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338"},{"matches_expected":true,"method":"compact_sorted_ascii","sha256":"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338"},{"matches_expected":false,"method":"default_sorted","sha256":"bcce3a27298e277b694ea2fb5848b912ad2816fd249c14a4617a0951b1d4dc4d"},{"matches_expected":false,"method":"indent2_sorted","sha256":"4ee2673c98107eb0bf81ebc4ef4e57b47670247bc90e0be2e4be5ed3d1348129"}] -SB041D_COLLECTOR={"count":1,"name":"demonov-shadow-8020-collector-1"} -SB041D_RUNTIME_MANIFEST_API={"classes":["RuntimeDeploymentManifestV1"],"functions":[{"args":["value","name"],"defaults":0,"kwonly":[],"name":"_required"},{"args":["value","name"],"defaults":0,"kwonly":[],"name":"_sha256_hex"},{"args":["value","name"],"defaults":0,"kwonly":[],"name":"_sha256_id"},{"args":["manifest"],"defaults":0,"kwonly":["expected_code_identity","actual_image_id","actual_package_identity"],"name":"verify_runtime_manifest"}],"lines":123,"rc":0,"safe_constants":{},"sha256":"1064cfb74303fdc8e0bf50bae95b1e755556a5b1dfc28b2b062341becaba08f2"} -SB041D_LIVE_PROSPECTIVE_API={"classes":["ExperimentProvenance","LiveProspectiveStore"],"functions":[{"args":["value"],"defaults":0,"kwonly":[],"name":"_hash"},{"args":["bar"],"defaults":0,"kwonly":[],"name":"_bar_json"},{"args":["line"],"defaults":0,"kwonly":[],"name":"_line_json"},{"args":["raw"],"defaults":0,"kwonly":[],"name":"_line_from_json"},{"args":["states"],"defaults":0,"kwonly":[],"name":"_states_json"},{"args":["raw"],"defaults":0,"kwonly":[],"name":"_states_from_json"}],"lines":851,"rc":0,"safe_constants":{},"sha256":"f83f48dfeb4dc1382ebf3c77b7ec27deaeac6eec4a5dc097f90600963f0e4e98"} -SB041D_DECISION=DEPLOY_PREP_DETAIL_EVIDENCE_READY -SB041D_MUTATION_SCOPE=NONE_READ_ONLY -SIGNALBOT041D_HOLDS=[] -SIGNALBOT041D_DECISION=DEPLOY_PREP_DETAIL_EVIDENCE_READY -SIGNALBOT041D_MUTATION_SCOPE=NO_RUNTIME_NO_GIT_NO_EXCHANGE_MUTATION +SB041A_ACTIVE_ENV={"exists":true,"sha256":"4bbc6bd31417f6265767c1fb971d118d36d27d7b57a90b49e6586461acf0609b","values":{"APP_IMAGE":"8020-demonov-shadow:e32760c69a4311728db9066ee8bf2bf66b1e5a70","CODE_IDENTITY":"e32760c69a4311728db9066ee8bf2bf66b1e5a70","COLLECTION_START_AT":"2026-09-07T00:00:00+00:00","EXPERIMENT_ID":"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338","RUNTIME_MANIFEST_ID":"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a"}} +SB041A_DOCKERFILE={"exists":true,"sha256":"901951def73961f76d2c2a93c5428a0fbdcc50113d42b39da92983a5ce157cb8","text":"FROM 8020-demonov-shadow:ac7094a76ddc06f376d71a76432af7c2dd10ec7d\nCOPY demonov_forward_map /app/demonov_forward_map"} +SB041A_DEPLOY_TOP=[{"bytes":336,"kind":"file","name":".env.new","sha256":"4bbc6bd31417f6265767c1fb971d118d36d27d7b57a90b49e6586461acf0609b"},{"bytes":116,"kind":"file","name":"Dockerfile","sha256":"901951def73961f76d2c2a93c5428a0fbdcc50113d42b39da92983a5ce157cb8"},{"bytes":886,"kind":"file","name":"build.log","sha256":"601fe18bcce58d509431626b9c934e170fd572089dcfbfbf310c3aa9217293eb"},{"bytes":808,"kind":"file","name":"compose-up.log","sha256":"5758c75a39a1a7689f92513e3105708d1c71b7bcb14915e7013b1199b618f6d4"},{"kind":"dir","name":"demonov_forward_map"},{"bytes":841,"kind":"file","name":"experiment.json","sha256":"827dc4fb5ace8a25a0bd80d05450eaa758bd39d1d09485d3d428dd20ad9325aa"},{"bytes":208049,"kind":"file","name":"package.tar.gz","sha256":"389e7aabca8887ee3b48b6ff0b4affe1163216005a4888013d9ccc82ea360e32"},{"bytes":584,"kind":"file","name":"runtime_manifest.json","sha256":"388a610997fad0071b9140a44e88edff60a3e7ee3486faeaca769c0026246c8e"}] +SB041A_EXPERIMENT_JSON={"bytes":841,"exists":true,"object":{"code_identity":"e32760c69a4311728db9066ee8bf2bf66b1e5a70","collection_start_at":"2026-09-07T00:00:00+00:00","demonov_branch_policy_id":"ALL_FROZEN_PROFILES_ALL_NODES_RESEARCH_V1","experiment_id":"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338","experiment_version":"LIVE_PROSPECTIVE_V2","finality_policy_id":"BITFINEX_SEQ_ALL_D1_V1","geometry_policy_id":"RESEARCH_RECONSTRUCTION_8020_V1","market_bundle_id":"78dbbebab22f49bfc4866b40e2362886b1441790d8a73a005a4eb09a5d2c64ae","notification_policy_id":"SIGNIFICANT_STATE_CHANGE_EMAIL_V1","outcome_policy_id":"DIRECTIONAL_CLOSE_AFTER_7_D1_BARS_V1","policy_registry_id":"055d0b052d394f1e08176b035617fbdd96f04fff0cdfb195c2d736fd66e6ad37","runtime_manifest_id":"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a"},"sha256":"827dc4fb5ace8a25a0bd80d05450eaa758bd39d1d09485d3d428dd20ad9325aa"} +SB041A_MANIFEST_JSON={"bytes":584,"exists":true,"object":{"application_image_id":"sha256:403c4266282a56cb210bed95cd58295692296502913e7440e2133d7b5664c736","base_image_digest":"sha256:881d80734ee05dca6f7f42dcb080975652a53c7eda9ba1f03bb8da31aa6a6ec2","code_identity":"e32760c69a4311728db9066ee8bf2bf66b1e5a70","compose_hash":"6461532b0a04decc60fe1d1885990020e886d40de40c0523e34e2849600af061","finality_policy_id":"BITFINEX_SEQ_ALL_D1_V1","package_identity":"637acba19fb29c98408a8031dc9265a31dc36551c666fcf0b287e8af83d2b893","runtime_manifest_id":"58d3b59200bdc0eb8d448612679d667b194263586cb3198dfc08597935053a1a"},"sha256":"388a610997fad0071b9140a44e88edff60a3e7ee3486faeaca769c0026246c8e"} +SB041A_SERVICE_BOOT_JSON={"bytes":224,"exists":true,"object":{"booted_at":"2026-09-06T18:48:21.063302+00:00","code_identity":"e32760c69a4311728db9066ee8bf2bf66b1e5a70","execution_authority":false,"production_launch_allowed":false,"risk_authority":false,"service":"8020-demonov-shadow"},"sha256":"798a145e6c142bea2cd41a74a3fa707452da9a606cc84ff6afd1d60b43abb1f8"} +SB041A_EXPERIMENT_HASH_CHECKS=[{"matches":true,"method":"compact_sorted_utf8","sha256":"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338"},{"matches":true,"method":"compact_sorted_ascii","sha256":"ec477ea41ecbd5cfdef5afc259595aab20674a7d933f41a389329ff05098b338"},{"matches":false,"method":"default_sorted_utf8","sha256":"bcce3a27298e277b694ea2fb5848b912ad2816fd249c14a4617a0951b1d4dc4d"},{"matches":false,"method":"default_sorted_ascii","sha256":"bcce3a27298e277b694ea2fb5848b912ad2816fd249c14a4617a0951b1d4dc4d"},{"matches":false,"method":"indent2_sorted_utf8","sha256":"4ee2673c98107eb0bf81ebc4ef4e57b47670247bc90e0be2e4be5ed3d1348129"}] +SB041A_MANIFEST_HASH_CHECKS=[{"matches":false,"method":"compact_sorted_utf8","sha256":"7ac46712abbea24436b24af4fc962bdf5b8a348559a64c879c278fb17114c0a5"},{"matches":false,"method":"compact_sorted_ascii","sha256":"7ac46712abbea24436b24af4fc962bdf5b8a348559a64c879c278fb17114c0a5"},{"matches":false,"method":"default_sorted_utf8","sha256":"a68890d9717e29ac1db356e9e17f2fc10408327f8d8707caddbeb330e433d524"},{"matches":false,"method":"default_sorted_ascii","sha256":"a68890d9717e29ac1db356e9e17f2fc10408327f8d8707caddbeb330e433d524"},{"matches":false,"method":"indent2_sorted_utf8","sha256":"caaafb8613f463a4ed2915d1ccce0010e7945bb5058d67721a41fa3bb0d80188"}] +SB041A_COLLECTOR_CARDINALITY=1 +SB041A_RUNTIME_MANIFEST_SOURCE={"classes":[{"name":"RuntimeDeploymentManifestV1"}],"functions":[{"args":["value","name"],"kwonly":[],"name":"_required","source":"def _required(value: str, name: str) -> str:\n if not isinstance(value, str) or not value:\n raise DemonovError(f\"{name} is required\")\n return value"},{"args":["value","name"],"kwonly":[],"name":"_sha256_hex","source":"def _sha256_hex(value: str, name: str) -> str:\n _required(value, name)\n if _SHA256_RE.fullmatch(value) is None:\n raise DemonovError(f\"{name} must be lowercase sha256 hex\")\n return value"},{"args":["value","name"],"kwonly":[],"name":"_sha256_id","source":"def _sha256_id(value: str, name: str) -> str:\n _required(value, name)\n if _SHA256_ID_RE.fullmatch(value) is None:\n raise DemonovError(f\"{name} must be immutable sha256 identity\")\n return value"},{"args":["manifest"],"kwonly":["expected_code_identity","actual_image_id","actual_package_identity"],"name":"verify_runtime_manifest","source":"def verify_runtime_manifest(\n manifest: RuntimeDeploymentManifestV1,\n *,\n expected_code_identity: str,\n actual_image_id: str,\n actual_package_identity: str,\n) -> None:\n if not isinstance(manifest, RuntimeDeploymentManifestV1):\n raise DemonovError(\"runtime manifest required\")\n manifest.__post_init__()\n if manifest.code_identity != expected_code_identity:\n raise DemonovError(\"runtime manifest code identity mismatch\")\n if manifest.application_image_id != actual_image_id:\n raise DemonovError(\"runtime manifest application image mismatch\")\n if manifest.package_identity != actual_package_identity:\n raise DemonovError(\"runtime manifest package identity mismatch\")"}],"lines":123,"rc":0,"sha256":"1064cfb74303fdc8e0bf50bae95b1e755556a5b1dfc28b2b062341becaba08f2"} +SB041A_LIVE_PROSPECTIVE_SOURCE={"classes":[{"name":"ExperimentProvenance"},{"name":"LiveProspectiveStore"}],"functions":[{"args":["value"],"kwonly":[],"name":"_hash","source":"def _hash(value: object) -> str:\n return hashlib.sha256(\n json.dumps(value, sort_keys=True, separators=(\",\", \":\"), ensure_ascii=True).encode()\n ).hexdigest()"},{"args":["bar"],"kwonly":[],"name":"_bar_json","source":"def _bar_json(bar) -> str:\n return json.dumps({\n \"bar_id\": bar.bar_id,\n \"market_key\": bar.market_key,\n \"open_at\": bar.open_at.isoformat(),\n \"close_at\": bar.close_at.isoformat(),\n \"known_at\": bar.known_at.isoformat(),\n \"received_at\": bar.received_at.isoformat(),\n \"open\": str(bar.open), \"high\": str(bar.high), \"low\": str(bar.low),\n \"close\": str(bar.close), \"volume\": str(bar.volume),\n \"boundary_policy_hash\": bar.boundary_policy_hash,\n \"source_bar_ids\": list(bar.source_bar_ids),\n }, sort_keys=True, separators=(\",\", \":\"))"},{"args":["line"],"kwonly":[],"name":"_line_json","source":"def _line_json(line: ResearchTrendLine | None) -> str:\n if line is None:\n return \"\"\n return json.dumps({\n \"line_id\": line.line_id, \"role\": line.role.value, \"version\": line.version,\n \"first_at\": line.first_at.isoformat(), \"first_price\": str(line.first_price),\n \"second_at\": line.second_at.isoformat(), \"second_price\": str(line.second_price),\n \"frozen_at\": line.frozen_at.isoformat(), \"geometry_policy_id\": line.geometry_policy_id,\n }, sort_keys=True, separators=(\",\", \":\"))"},{"args":["raw"],"kwonly":[],"name":"_line_from_json","source":"def _line_from_json(raw: str) -> ResearchTrendLine | None:\n if not raw:\n return None\n x = json.loads(raw)\n return ResearchTrendLine(\n line_id=x[\"line_id\"], role=ResearchBarrierRole(x[\"role\"]), version=x[\"version\"],\n first_at=datetime.fromisoformat(x[\"first_at\"]), first_price=Decimal(x[\"first_price\"]),\n second_at=datetime.fromisoformat(x[\"second_at\"]), second_price=Decimal(x[\"second_price\"]),\n frozen_at=datetime.fromisoformat(x[\"frozen_at\"]), geometry_policy_id=x[\"geometry_policy_id\"],\n )"},{"args":["states"],"kwonly":[],"name":"_states_json","source":"def _states_json(states) -> str:\n return json.dumps([{\n \"state_id\": s.state_id, \"arm_id\": s.arm_id.value,\n \"interaction_state\": s.interaction_state.value,\n \"close_beyond_count\": s.close_beyond_count, \"last_sequence\": s.last_sequence,\n } for s in states], sort_keys=True, separators=(\",\", \":\"))"},{"args":["raw"],"kwonly":[],"name":"_states_from_json","source":"def _states_from_json(raw: str):\n from .prospective_policy import AcceptanceArmId\n if not raw:\n return ()\n return tuple(ArmFSMState(\n state_id=x[\"state_id\"], arm_id=AcceptanceArmId(x[\"arm_id\"]),\n interaction_state=ProspectiveInteractionState(x[\"interaction_state\"]),\n close_beyond_count=x[\"close_beyond_count\"], last_sequence=x[\"last_sequence\"],\n ) for x in json.loads(raw))"}],"lines":851,"rc":0,"sha256":"f83f48dfeb4dc1382ebf3c77b7ec27deaeac6eec4a5dc097f90600963f0e4e98"} +SB041A_DECISION=DEPLOY_API_CONTRACT_READY +SB041A_MUTATION_SCOPE=NONE_READ_ONLY +SIGNALBOT041A_HOLDS=[] +SIGNALBOT041A_DECISION=DEPLOY_API_CONTRACT_READY +SIGNALBOT041A_MUTATION_SCOPE=NO_RUNTIME_NO_GIT_NO_EXCHANGE_MUTATION OUTPUT_END CHAT_OUTPUT_END