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
