{
  "schema_version": 1,
  "channel": "homelab-runtime",
  "command_id": "GRAM1-SITE-USDC-V51-ATOMIC-DIRECT-QGA-PORTFOLIO-20260802T224432Z",
  "status": "OK",
  "rc": 0,
  "host": "pve01",
  "mode": "change",
  "component": "gram1-site-usdc-atomic-direct-qga-portfolio",
  "started_at_utc": "2026-08-02T22:52:05Z",
  "finished_at_utc": "2026-08-02T22:52:12Z",
  "reference_register_checked": true,
  "reference_sha256": "5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e",
  "error_register_checked": true,
  "error_register_sha256": "24934a2c7fa5c26f6e828583c4aefac7f143b40c0171736ed7571e617d55ab83",
  "command_sha256": "057b4b66e92c1a595f3a37722e83311db20836a037db4233596e94e5f1282bc4",
  "duplicate_failed_command_blocked": false,
  "block_reason": null,
  "execution_started": true,
  "change_declared": true,
  "result_contract_valid": true,
  "result_contract_status": "OK",
  "result_contract_error": null,
  "command_rc": 0,
  "changes_made": true,
  "rollback_started": false,
  "rollback_restored": null,
  "mutation_outcome": "MUTATED",
  "sanitized": true,
  "secrets_included": false,
  "private_addresses_included": false,
  "raw_evidence_retained_locally": true,
  "raw_evidence_sha256": "2ca7dc07264823da8a6eaa7156183d1fbbaa973bfe0f79ebecdd9ffe73c71b55",
  "sanitized_output_sha256": "2ca7dc07264823da8a6eaa7156183d1fbbaa973bfe0f79ebecdd9ffe73c71b55",
  "output_truncated_in_json": false,
  "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt",
  "output": "HOMELAB_RESULT_CONTRACT={\"changes_made\":true,\"command_id\":\"GRAM1-SITE-USDC-V51-ATOMIC-DIRECT-QGA-PORTFOLIO-20260802T224432Z\",\"mutation_outcome\":\"MUTATED\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\n{\"already_target\":false,\"backup_created\":true,\"backup_dir\":\"/var/lib/homelab-change-rollback/GRAM1-SITE-USDC-V51-ATOMIC-DIRECT-QGA-PORTFOLIO-20260802T224432Z\",\"baseline_sha256\":{\"app.py\":\"3b55b78c015173eea66b67afb8fb9371f0d7d2e38a7679d4c433749f4c07301d\",\"compose.yaml\":\"6d344e46b3de94ad86131a914df2ff3ff25e9d82f7ce0557cbffa468b8cdc1b8\",\"templates/index.html\":\"3752846b9a2d47a2c82377d222e5f8603f78101eda11422bc8634567e26209d2\",\"worker.py\":\"4a7b16ece826fe2d938f392db6b0b5ca028dcb6ff02fdff4ab431f114edf0e5c\"},\"before_source\":{\"app.py\":\"3b55b78c015173eea66b67afb8fb9371f0d7d2e38a7679d4c433749f4c07301d\",\"compose.yaml\":\"6d344e46b3de94ad86131a914df2ff3ff25e9d82f7ce0557cbffa468b8cdc1b8\",\"templates/index.html\":\"3752846b9a2d47a2c82377d222e5f8603f78101eda11422bc8634567e26209d2\",\"worker.py\":\"4a7b16ece826fe2d938f392db6b0b5ca028dcb6ff02fdff4ab431f114edf0e5c\"},\"candidate_checks\":{\"alerts_keep_shared_ids\":true,\"alerts_keep_shared_set\":true,\"fixed_usdc_price\":true,\"holding_uses_portfolio_set\":true,\"portfolio_coins_exactly_once\":true,\"portfolio_market_exactly_once\":true,\"positions_do_not_use_shared_ids\":true,\"positions_use_portfolio_ids\":true,\"shared_coins_exactly_four\":true,\"state_has_separate_sets\":true,\"top_cards_keep_shared_ids\":true,\"usdc_cap_is_not_faked\":true,\"usdc_cap_renders_dash\":true},\"changes_made\":true,\"command_id\":\"GRAM1-SITE-USDC-V51-ATOMIC-DIRECT-QGA-PORTFOLIO-20260802T224432Z\",\"commands\":[{\"duration_ms\":33,\"rc\":0,\"stage\":\"compose-config-services\",\"stderr_bytes\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"stdout_bytes\":11,\"stdout_sha256\":\"eef9f2ae690badd252b6332992b53a6658f483425b294de9826500063f55de9f\"},{\"duration_ms\":7,\"rc\":0,\"stage\":\"inspect-crypto-portfolio\",\"stderr_bytes\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"stdout_bytes\":12670,\"stdout_sha256\":\"7f19b523d625932c8cd34e520913087333f14bf2c10de32312130f75017a2407\"},{\"duration_ms\":7,\"rc\":0,\"stage\":\"inspect-crypto-portfolio-worker\",\"stderr_bytes\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"stdout_bytes\":10792,\"stdout_sha256\":\"ff1345dd2cf83f368e02dff11123f1e10dc6212d8caf30cb8ecdf3979694d428\"},{\"duration_ms\":90,\"rc\":0,\"stage\":\"source-hashes-crypto-portfolio\",\"stderr_bytes\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"stdout_bytes\":262,\"stdout_sha256\":\"ada0aa78b4a0c5b6b44e7d076e7307359471e2c06065f5fa85e8e9fe549f5bf3\"},{\"duration_ms\":109,\"rc\":0,\"stage\":\"source-hashes-crypto-portfolio-worker\",\"stderr_bytes\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"stdout_bytes\":86,\"stdout_sha256\":\"572f389d914e2ebb95fb6d85531efd753e4e9de54d1ac2e866c4e26605624de5\"},{\"duration_ms\":25,\"rc\":0,\"stage\":\"candidate-python-compile\",\"stderr_bytes\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"stdout_bytes\":0,\"stdout_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"},{\"duration_ms\":18,\"rc\":0,\"stage\":\"tag-rollback-web-image\",\"stderr_bytes\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"stdout_bytes\":0,\"stdout_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"},{\"duration_ms\":2103,\"rc\":0,\"stage\":\"build-web-image\",\"stderr_bytes\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"stdout_bytes\":1303,\"stdout_sha256\":\"3f74e0c070a149f14101978fea9eda4b106daa4fea78526871517266affab06b\"},{\"duration_ms\":7,\"rc\":0,\"stage\":\"inspect-built-web-image\",\"stderr_bytes\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"stdout_bytes\":4132,\"stdout_sha256\":\"d7ad0201b8aa0b9945bdb668166a4c8352a30e91b9f2820e1de6a48c83132735\"},{\"duration_ms\":310,\"rc\":0,\"stage\":\"validate-built-image\",\"stderr_bytes\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"stdout_bytes\":178,\"stdout_sha256\":\"6842d3abb40d60576895a8f2374cb1a9eb0925da3489fc6bf7c250c3c0861af2\"},{\"duration_ms\":724,\"rc\":0,\"stage\":\"deploy-web\",\"stderr_bytes\":152,\"stderr_sha256\":\"1dcb2a16346ec12f0cfcb8401261b5802af16448378d340c38c10a23b03ca98e\",\"stdout_bytes\":0,\"stdout_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"},{\"duration_ms\":7,\"rc\":0,\"stage\":\"inspect-crypto-portfolio\",\"stderr_bytes\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"stdout_bytes\":12671,\"stdout_sha256\":\"d69c30f4d140a26cc276125b872be107f1dba89fa4b3b546422df16e2261223f\"},{\"duration_ms\":7,\"rc\":0,\"stage\":\"inspect-crypto-portfolio-worker\",\"stderr_bytes\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"stdout_bytes\":10792,\"stdout_sha256\":\"ff1345dd2cf83f368e02dff11123f1e10dc6212d8caf30cb8ecdf3979694d428\"},{\"duration_ms\":100,\"rc\":0,\"stage\":\"source-hashes-crypto-portfolio\",\"stderr_bytes\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"stdout_bytes\":262,\"stdout_sha256\":\"1b3cb6b7f006708869afd28f262505a7d78090bc6134b97797196350f7deddf5\"},{\"duration_ms\":81,\"rc\":0,\"stage\":\"source-hashes-crypto-portfolio-worker\",\"stderr_bytes\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"stdout_bytes\":86,\"stdout_sha256\":\"572f389d914e2ebb95fb6d85531efd753e4e9de54d1ac2e866c4e26605624de5\"},{\"rc\":0,\"stage\":\"web-health-probe\",\"stderr_bytes\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"stdout_bytes\":42,\"stdout_sha256\":\"c0a09902aba0bcc30a0ac9a3a2558bd73dd04158923e3d1a0c620de33bd27e67\"},{\"duration_ms\":512,\"rc\":0,\"stage\":\"validate-runtime-state\",\"stderr_bytes\":0,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"stdout_bytes\":120,\"stdout_sha256\":\"0d555272a0c94ee97dc70fca13b40c8bfcd8a275b78fecf767dc6a1b53eb8c53\"}],\"control_plane_error\":null,\"database_before\":{\"alerts_count\":4,\"alerts_sha256\":\"5ddd511a4ec70ecfb27cae7f09ee251d69e0a7929396c4c94d67d995791b363d\",\"holdings_count\":4,\"holdings_sha256\":\"19b32c5ab2a5766d4d5c7eef2b391fbcba5b000b4e3bcbe27a04aabd0d934edc\",\"quick_check\":\"ok\",\"usdc_holding_rows\":0},\"deployment\":{\"health\":{\"status\":\"OK\",\"type\":\"crypto-portfolio\"},\"portfolio_state\":{\"portfolio_coin_count\":5,\"shared_coin_count\":4,\"usdc_in_history\":false,\"usdc_in_shared_market\":false,\"usdc_price\":1.0},\"web\":{\"image_id\":\"sha256:168d8c204bea3f166e47dbcd11d5983687db6d3e16c8b3c46a317e8172c2a800\",\"restart_count\":0,\"running\":true},\"web_source_hashes\":{\"/app/app.py\":\"8a81d075297856c2dd843da34e6dd1cb6baa1d9c36d24dbee6865e02aa625e25\",\"/app/templates/index.html\":\"6ce3a065ba677a74e4b73db15613a1114a1167dc9af40bc76a29ced556aabe36\",\"/app/worker.py\":\"4a7b16ece826fe2d938f392db6b0b5ca028dcb6ff02fdff4ab431f114edf0e5c\"},\"worker\":{\"restart_count\":0,\"running\":true,\"unchanged\":true},\"worker_source_hashes\":{\"/app/worker.py\":\"4a7b16ece826fe2d938f392db6b0b5ca028dcb6ff02fdff4ab431f114edf0e5c\"}},\"duration_ms\":6618,\"error\":null,\"error_type\":null,\"gitea_changed\":false,\"mutation_outcome\":\"MUTATED\",\"private_addresses_included\":false,\"production_site_changed\":true,\"rc\":0,\"rollback_details\":null,\"rollback_restored\":null,\"rollback_started\":false,\"sanitized\":true,\"schema\":1,\"scope\":{\"alerts\":false,\"charts\":false,\"database_migration\":false,\"positions\":true,\"sharp_moves\":false,\"top_coin_cards\":false,\"totals\":true,\"usdc_price_usd\":1.0,\"worker\":false},\"secrets_included\":false,\"status\":\"OK\",\"target_sha256\":{\"app.py\":\"8a81d075297856c2dd843da34e6dd1cb6baa1d9c36d24dbee6865e02aa625e25\",\"compose.yaml\":\"6d344e46b3de94ad86131a914df2ff3ff25e9d82f7ce0557cbffa468b8cdc1b8\",\"templates/index.html\":\"6ce3a065ba677a74e4b73db15613a1114a1167dc9af40bc76a29ced556aabe36\",\"worker.py\":\"4a7b16ece826fe2d938f392db6b0b5ca028dcb6ff02fdff4ab431f114edf0e5c\"},\"worker_changed\":false}\n"
}
