{
  "schema_version": 1,
  "channel": "homelab-runtime",
  "command_id": "GRAM1-SITE-CHARTS-V31-RUNTIME-PATH-DOM-DIAG-20260801T113000Z",
  "status": "OK",
  "rc": 0,
  "host": "pve01",
  "mode": "verify",
  "component": "gram1-charts-v31-runtime",
  "started_at_utc": "2026-08-01T11:36:20Z",
  "finished_at_utc": "2026-08-01T11:36:21Z",
  "reference_register_checked": true,
  "reference_sha256": "5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e",
  "error_register_checked": true,
  "error_register_sha256": "24934a2c7fa5c26f6e828583c4aefac7f143b40c0171736ed7571e617d55ab83",
  "command_sha256": "6e480d873dc73bd8e176d761c2bb37ea93d2d35fbcd679355268cd463e1191ec",
  "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": "be5458eba99a40c245fe53a5f8325325f122533542984304575a27d490899669",
  "sanitized_output_sha256": "4012e6e6d55d0bd70210d9710d3c3cb60575ec275341eb732b1b13d44528b024",
  "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\":false,\"command_id\":\"GRAM1-SITE-CHARTS-V31-RUNTIME-PATH-DOM-DIAG-20260801T113000Z\",\"mutation_outcome\":\"NO_MUTATION\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\n{\"changes_made\":false,\"command_id\":\"GRAM1-SITE-CHARTS-V31-RUNTIME-PATH-DOM-DIAG-20260801T113000Z\",\"control_plane_error\":null,\"gitea_changed\":false,\"mutation_outcome\":\"NO_MUTATION\",\"pinned_host_key_aliases\":[\"[PRIVATE_IP]\"],\"production_site_changed\":false,\"rc\":0,\"remote_result\":{\"changes_made\":false,\"command_id\":\"GRAM1-SITE-CHARTS-V31-RUNTIME-PATH-DOM-DIAG-20260801T113000Z\",\"compose_services\":[\"web\",\"worker\"],\"container_diagnostic\":{\"executables\":{},\"processes\":[{\"cmdline\":\"/usr/local/bin/python3.12 /usr/local/bin/uvicorn app:app --host 0.0.0.0 --port 8000\",\"cwd\":\"/app\",\"pid\":1},{\"cmdline\":\"python3 -B - e9e723c9b916383ce10dffe8f8bbdb4049b78d89c5b139e2de5ed82194a27be4\",\"cwd\":\"/app\",\"pid\":71}],\"runtime\":{\"attempts\":[{\"result\":\"NO_APP_OBJECT\",\"spec\":\"app:app\"},{\"error\":\"ModuleNotFoundError:No module named 'wsgi'\",\"spec\":\"wsgi\"},{\"error\":\"ModuleNotFoundError:No module named 'main'\",\"spec\":\"main\"}],\"available\":false,\"process_specs\":[\"app:app\"]},\"source_facts\":[{\"flask_constructor_lines\":[],\"path\":\"/app/app.py\",\"routes\":[{\"line\":52,\"path\":\"/login\"},{\"line\":58,\"path\":\"/login\"},{\"line\":73,\"path\":\"/logout\"},{\"line\":78,\"path\":\"/\"},{\"line\":84,\"path\":\"/health\"},{\"line\":92,\"path\":\"/coin-icon/{coin_id}\"},{\"line\":141,\"path\":\"/vendor/lightweight-charts.js\"},{\"line\":307,\"path\":\"/api/klines/{symbol}\"},{\"line\":312,\"path\":\"/api/chart-health\"},{\"line\":346,\"path\":\"/api/state\"},{\"line\":363,\"path\":\"/api/holding\"},{\"line\":376,\"path\":\"/api/alert\"},{\"line\":54,\"path\":\"auth\"},{\"line\":39,\"path\":\"auth\"},{\"line\":80,\"path\":\"auth\"},{\"line\":166,\"path\":\"entries\"},{\"line\":367,\"path\":\"coin_id\"},{\"line\":380,\"path\":\"coin_id\"},{\"line\":380,\"path\":\"kind\"},{\"line\":383,\"path\":\"threshold\"},{\"line\":383,\"path\":\"window_seconds\"},{\"line\":112,\"path\":\"https://api.coingecko.com/api/v3/coins/markets\"},{\"line\":156,\"path\":\"status\"},{\"line\":157,\"path\":\"candles\"},{\"line\":179,\"path\":\"result\"},{\"line\":330,\"path\":\"source\"},{\"line\":370,\"path\":\"quantity\"},{\"line\":371,\"path\":\"avg_buy\"},{\"line\":178,\"path\":\"saved_at\"},{\"line\":383,\"path\":\"email\"},{\"line\":56,\"path\":\"bad\"},{\"line\":115,\"path\":\"image\"},{\"line\":119,\"path\":\"content-type\"}],\"session_keys\":[],\"sha256\":\"ec226952cdb7fb58edbfc0173af47f4d901f3206e15169df12294983731fbc20\",\"top_assignments\":[{\"line\":8,\"name\":\"DATA\",\"value_type\":\"Call\"},{\"line\":9,\"name\":\"DB\",\"value_type\":\"BinOp\"},{\"line\":10,\"name\":\"MARKET\",\"value_type\":\"BinOp\"},{\"line\":11,\"name\":\"HASH_FILE\",\"value_type\":\"Call\"},{\"line\":12,\"name\":\"SECRET_FILE\",\"value_type\":\"Call\"},{\"line\":13,\"name\":\"COINS\",\"value_type\":\"Dict\"},{\"line\":14,\"name\":\"FAILED\",\"value_type\":\"Dict\"},{\"line\":49,\"name\":\"app\",\"value_type\":\"Call\"},{\"line\":138,\"name\":\"LIGHTWEIGHT_JS\",\"value_type\":\"BinOp\"},{\"line\":139,\"name\":\"KLINE_SYMBOLS\",\"value_type\":\"Dict\"},{\"line\":147,\"name\":\"KLINE_CACHE\",\"value_type\":\"Dict\"},{\"line\":148,\"name\":\"KLINE_CACHE_TTL\",\"value_type\":\"Constant\"},{\"line\":149,\"name\":\"KLINE_CACHE_MAX_STALE\",\"value_type\":\"Constant\"},{\"line\":150,\"name\":\"KLINE_CACHE_FILE\",\"value_type\":\"BinOp\"},{\"line\":151,\"name\":\"KLINE_CACHE_WRITE_LOCK\",\"value_type\":\"Call\"}],\"top_functions\":[{\"line\":16,\"name\":\"db\"},{\"line\":25,\"name\":\"b64d\"},{\"line\":28,\"name\":\"verify_password\"},{\"line\":38,\"name\":\"require_login\"},{\"line\":42,\"name\":\"market_data\"},{\"line\":53,\"name\":\"login_page\"},{\"line\":59,\"name\":\"login\"},{\"line\":74,\"name\":\"logout\"},{\"line\":79,\"name\":\"home\"},{\"line\":85,\"name\":\"health\"},{\"line\":93,\"name\":\"coin_icon\"},{\"line\":142,\"name\":\"lightweight_charts_js\"},{\"line\":153,\"name\":\"_valid_kline_result\"},{\"line\":161,\"name\":\"_load_kline_cache\"},{\"line\":185,\"name\":\"_save_kline_cache\"},{\"line\":205,\"name\":\"fetch_klines\"},{\"line\":308,\"name\":\"klines\"},{\"line\":313,\"name\":\"chart_health\"},{\"line\":347,\"name\":\"state\"},{\"line\":364,\"name\":\"save_holding\"},{\"line\":377,\"name\":\"add_alert\"},{\"line\":391,\"name\":\"delete_alert\"}]}],\"template_files\":[{\"bytes\":36137,\"chart_id\":1,\"no_data\":2,\"path\":\"/app/templates/index.html\",\"sha256\":\"e9e723c9b916383ce10dffe8f8bbdb4049b78d89c5b139e2de5ed82194a27be4\",\"tvCharts\":4,\"v29_script\":2,\"v29_style\":1}]},\"control_plane_error\":null,\"diagnosis\":[\"WEB_APPLICATION_OBJECT_NOT_RESOLVED\"],\"duration_seconds\":0.67,\"exact_state\":{\"compose_sha256\":\"6d344e46b3de94ad86131a914df2ff3ff25e9d82f7ce0557cbffa468b8cdc1b8\",\"current_hashes\":{\"app.py\":\"ec226952cdb7fb58edbfc0173af47f4d901f3206e15169df12294983731fbc20\",\"templates/index.html\":\"e9e723c9b916383ce10dffe8f8bbdb4049b78d89c5b139e2de5ed82194a27be4\",\"worker.py\":\"4a7b16ece826fe2d938f392db6b0b5ca028dcb6ff02fdff4ab431f114edf0e5c\"}},\"gitea_changed\":false,\"mutation_outcome\":\"NO_MUTATION\",\"previous_capsule_sha256\":\"a4c76cfb369220b240c21a1e810510975a1c4fcc18dbb568c1b9e26cb57daa14\",\"previous_command_id\":\"GRAM1-SITE-CHARTS-V30-EXACT-RUNTIME-CSP-DIAG-20260801T110100Z\",\"production_site_changed\":false,\"rc\":0,\"rollback_restored\":null,\"rollback_started\":false,\"schema\":1,\"status\":\"OK\",\"template_structure\":{\"bytes\":36137,\"chart_id_count\":1,\"html_end_offset\":34911,\"legacy_no_data_count\":2,\"scripts\":[{\"body_bytes\":7045,\"body_prefix\":\"let state=null;let selected=\\\"hedera-hashgraph\\\";let currency=localStorage.getItem(\\\"portfolio_currency\\\")===\\\"RUB\\\"?\\\"RUB\\\":\\\"USD\\\";const fx=()=>Numb\",\"body_sha256\":\"e6afa17d7b94d9da5036d55bf6b8c623ec036ca05e9dea9c789432631c1b6ca7\",\"id\":null,\"line\":9,\"order\":0,\"src\":null,\"type\":null},{\"body_bytes\":4775,\"body_prefix\":\"(()=>{\\n  const install=()=>{\\n    const button=document.getElementById(\\\"addAlert\\\");\\n    const coinEl=document.getElementById(\\\"aCoin\\\");\\n    co\",\"body_sha256\":\"f30846a0a26517bd6e8303d552aeba19887576c54b4a70678e234a5e1f6e7582\",\"id\":\"ALERT_CREATE_OVERRIDE_V3\",\"line\":9,\"order\":1,\"src\":null,\"type\":null},{\"body_bytes\":4605,\"body_prefix\":\"(()=>{\\n  let lastState=null;\\n  let loading=false;\\n  const kindNames={\\n    price_above:\\\"цена ≥\\\",\\n    price_below:\\\"цена ≤\\\",\\n    cap_above:\\\"кап\",\"body_sha256\":\"b6fedba59295891e784ab98cef7690efe81553715d35a9cf6a31c30d08efb5a9\",\"id\":\"ALERT_LIST_RENDERER_V5\",\"line\":109,\"order\":2,\"src\":null,\"type\":null},{\"body_bytes\":0,\"body_prefix\":\"\",\"body_sha256\":null,\"id\":null,\"line\":218,\"order\":3,\"src\":\"/vendor/lightweight-charts.js\",\"type\":null},{\"body_bytes\":9362,\"body_prefix\":\"(()=>{\\n  \\\"use strict\\\";\\n  const VERSION=\\\"LOCAL_TRADINGVIEW_CHARTS_V3_STATIC_COMPAT_ACCORDION\\\";\\n  const symbols=[\\\"HBAR\\\",\\\"POL\\\",\\\"AVAX\\\",\\\"LINK\\\"];\\n\",\"body_sha256\":\"bab92747e24c2fd897c276239780a3927a49bdfa08685eea0d57a9d72462f21b\",\"id\":\"LOCAL_TRADINGVIEW_CHARTS_V3_STATIC_COMPAT_ACCORDION\",\"line\":219,\"order\":4,\"src\":null,\"type\":null},{\"body_bytes\":642,\"body_prefix\":\"(()=>{const move=()=>{const chart=document.getElementById(\\\"chart\\\");const panel=chart&&chart.closest(\\\".panel\\\");const main=document.querySelec\",\"body_sha256\":\"90a765a83fb8a5a0542dee1abf8c32af0f248aa411aa203848f73758bc3f9b40\",\"id\":\"MOVE_CHARTS_TO_BOTTOM_ALLTIME_V1\",\"line\":381,\"order\":5,\"src\":null,\"type\":null}],\"sha256\":\"e9e723c9b916383ce10dffe8f8bbdb4049b78d89c5b139e2de5ed82194a27be4\",\"style_v29_count\":1,\"styles\":[{\"body_bytes\":3738,\"body_sha256\":\"7a6e704f81f83550acb9931167adeac1b6f7b62ca080c32772572e6fb9194ef7\",\"id\":null,\"line\":3,\"order\":0},{\"body_bytes\":806,\"body_sha256\":\"304c99f769e21483c3ea6cbacabf4e7fe865f2fa72912645722a124033a06efe\",\"id\":null,\"line\":9,\"order\":1},{\"body_bytes\":858,\"body_sha256\":\"9886b118489b174a0dcd7effae906573d28fa96903458808069fef3d8fdf757c\",\"id\":\"TRADINGVIEW_ACCORDION_STYLE_V3\",\"line\":217,\"order\":2},{\"body_bytes\":386,\"body_sha256\":\"c8197e1b9b14bf237ce83d09d56badb83e2b8a7281690524c0ad358042ffa63c\",\"id\":\"SHARP_MOVES_LAYOUT_V2\",\"line\":380,\"order\":3}],\"tvcharts_count\":4,\"v29\":{\"body_bytes\":9362,\"body_prefix\":\"(()=>{\\n  \\\"use strict\\\";\\n  const VERSION=\\\"LOCAL_TRADINGVIEW_CHARTS_V3_STATIC_COMPAT_ACCORDION\\\";\\n  const symbols=[\\\"HBAR\\\",\\\"POL\\\",\\\"AVAX\\\",\\\"LINK\\\"];\\n\",\"body_sha256\":\"bab92747e24c2fd897c276239780a3927a49bdfa08685eea0d57a9d72462f21b\",\"id\":\"LOCAL_TRADINGVIEW_CHARTS_V3_STATIC_COMPAT_ACCORDION\",\"line\":219,\"order\":4,\"src\":null,\"type\":null},\"v29_after_vendor\":true,\"v29_count\":1,\"v29_text_offset\":24705,\"vendor_scripts\":[{\"body_bytes\":0,\"body_prefix\":\"\",\"body_sha256\":null,\"id\":null,\"line\":218,\"order\":3,\"src\":\"/vendor/lightweight-charts.js\",\"type\":null}]},\"web_container_inspect\":{\"available\":true,\"cmd\":[\"uvicorn\",\"app:app\",\"--host\",\"0.0.0.0\",\"--port\",\"8000\"],\"entrypoint\":null,\"id\":\"a97ea0430cd0\",\"image\":\"crypto-portfolio-web\",\"mounts\":[{\"destination\":\"/data\",\"rw\":true,\"source\":\"/opt/stacks/crypto-portfolio/data\",\"type\":\"bind\"},{\"destination\":\"/run/secrets/password_hash\",\"rw\":false,\"source\":\"/opt/stacks/crypto-portfolio/secrets/password_hash\",\"type\":\"bind\"},{\"destination\":\"/run/secrets/session_secret\",\"rw\":false,\"source\":\"/opt/stacks/crypto-portfolio/secrets/session_secret\",\"type\":\"bind\"},{\"destination\":\"/run/secrets/email_config\",\"rw\":false,\"source\":\"/opt/stacks/crypto-portfolio/secrets/email_config\",\"type\":\"bind\"}],\"working_dir\":\"/app\"}},\"rollback_restored\":null,\"rollback_started\":false,\"schema\":1,\"selected_method\":\"ALIAS_PINNED_AS_DEBIAN\",\"ssh_method_probes\":[{\"duration_seconds\":0.107,\"identity_count\":null,\"identity_sudo_read_ok\":true,\"name\":\"ALIAS_PINNED_AS_DEBIAN\",\"rc\":0,\"stderr\":\"\"},{\"duration_seconds\":0.129,\"identity_count\":2,\"identity_sudo_read_ok\":true,\"name\":\"DIRECT_PINNED_AS_DEBIAN_NO_PROXY\",\"rc\":0,\"stderr\":\"\"}],\"status\":\"OK\"}\n"
}
