{
  "schema_version": 1,
  "channel": "homelab-runtime",
  "command_id": "GRAM1-SITE-AVAX-LINK-V19-COMPACT-EXACT-MUTATION-PLAN-20260731T214500Z",
  "status": "OK",
  "rc": 0,
  "host": "pve01",
  "mode": "verify",
  "component": "gram1-site-avax-link-v19-compact-exact-mutation-plan",
  "started_at_utc": "2026-07-31T21:55:39Z",
  "finished_at_utc": "2026-07-31T21:55:42Z",
  "reference_register_checked": true,
  "reference_sha256": "5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e",
  "error_register_checked": true,
  "error_register_sha256": "24934a2c7fa5c26f6e828583c4aefac7f143b40c0171736ed7571e617d55ab83",
  "command_sha256": "1ed1362093ed14fe34af9efeda65578674716b88c7e52e396995974f093fb0aa",
  "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": "7fc7bae7e40690157caeec045fa657f44d1c5cedd22f4060067ea3cce02703bf",
  "sanitized_output_sha256": "7fc7bae7e40690157caeec045fa657f44d1c5cedd22f4060067ea3cce02703bf",
  "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-AVAX-LINK-V19-COMPACT-EXACT-MUTATION-PLAN-20260731T214500Z\",\"mutation_outcome\":\"NO_MUTATION\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\n{\"changes_made\":false,\"command_id\":\"GRAM1-SITE-AVAX-LINK-V19-COMPACT-EXACT-MUTATION-PLAN-20260731T214500Z\",\"compact_plan\":{\"anchors_exact\":true,\"app\":{\"assignments\":[{\"end_line\":13,\"line\":13,\"literal\":{\"hedera-hashgraph\":\"HBAR\",\"polygon-ecosystem-token\":\"POL\"},\"names\":[\"COINS\"],\"source\":\"COINS = {\\\"hedera-hashgraph\\\": \\\"HBAR\\\", \\\"polygon-ecosystem-token\\\": \\\"POL\\\"}\"},{\"end_line\":139,\"line\":139,\"literal\":{\"HBAR\":\"HBARUSDT\",\"POL\":\"POLUSDT\"},\"names\":[\"KLINE_SYMBOLS\"],\"source\":\"KLINE_SYMBOLS = {\\\"HBAR\\\": \\\"HBARUSDT\\\", \\\"POL\\\": \\\"POLUSDT\\\"}\"},{\"end_line\":128,\"line\":128,\"literal\":{\"binancecoin\":\"BNB\",\"bitcoin\":\"₿\",\"cardano\":\"ADA\",\"chainlink\":\"LINK\",\"dogecoin\":\"Ð\",\"ethereum\":\"Ξ\",\"hedera\":\"HBAR\",\"hedera-hashgraph\":\"HBAR\",\"ripple\":\"XRP\",\"solana\":\"S\",\"toncoin\":\"TON\"},\"names\":[\"symbols\"],\"source\":\"symbols = {\\\"bitcoin\\\":\\\"₿\\\",\\\"ethereum\\\":\\\"Ξ\\\",\\\"solana\\\":\\\"S\\\",\\\"binancecoin\\\":\\\"BNB\\\",\\\"ripple\\\":\\\"XRP\\\",\\\"cardano\\\":\\\"ADA\\\",\\\"hedera-hashgraph\\\":\\\"HBAR\\\",\\\"hedera\\\":\\\"HBAR\\\",\\\"chainlink\\\":\\\"LINK\\\",\\\"toncoin\\\":\\\"TON\\\",\\\"dogecoin\\\":\\\"Ð\\\"}\"}],\"chart_health_loops\":[{\"iter_literal\":[\"HBAR\",\"POL\"],\"line\":317,\"source\":\"(\\\"HBAR\\\", \\\"POL\\\")\"}]},\"compose\":{\"compose_file\":\"compose.yaml\",\"config_rc\":0,\"services\":[\"web\",\"worker\"],\"stderr\":\"\"},\"duration_seconds\":0.011,\"files\":[{\"bytes\":17955,\"exists\":true,\"gid\":0,\"mode\":\"0o640\",\"path\":\"app.py\",\"sha256\":\"44df2b25183b7c5d87ff1516ec2d9cd1d169acde3031f7c2aa1fc4e0c7813cd2\",\"uid\":0},{\"bytes\":10256,\"exists\":true,\"gid\":0,\"mode\":\"0o640\",\"path\":\"worker.py\",\"sha256\":\"174a14b86014535980d200a76d0057110c7af102c66f16c2e21fc3e74bb2e49e\",\"uid\":0},{\"bytes\":29469,\"exists\":true,\"gid\":0,\"mode\":\"0o644\",\"path\":\"templates/index.html\",\"sha256\":\"e497a36d8549654c6d451360a11a2ad714e19c23e6d384330a5436f7d32267cb\",\"uid\":0},{\"bytes\":1233,\"exists\":true,\"gid\":0,\"mode\":\"0o644\",\"path\":\"compose.yaml\",\"sha256\":\"6d344e46b3de94ad86131a914df2ff3ff25e9d82f7ce0557cbffa468b8cdc1b8\",\"uid\":0},{\"bytes\":465,\"exists\":true,\"gid\":0,\"mode\":\"0o644\",\"path\":\"Dockerfile\",\"sha256\":\"a5d546ddb9b4fac44cc00a43c18a18a8cdb246afea4dfc945089759d0dec0fcb\",\"uid\":0},{\"bytes\":123,\"exists\":true,\"gid\":0,\"mode\":\"0o644\",\"path\":\"requirements.txt\",\"sha256\":\"5dec3868a6a71a7dc8810b57acae9de25b99cae6978cd1750f4b0c01b27055a2\",\"uid\":0}],\"hashes_match_v18\":true,\"hostname\":\"core-apps\",\"next_decision\":\"ONE_ATOMIC_TRANSACTION_WITH_BACKUP_CANDIDATE_TEST_APPLY_VERIFY_ROLLBACK\",\"planned_files\":[\"app.py\",\"worker.py\"],\"provider_probe\":{\"binance\":{\"AVAXUSDT\":true,\"LINKUSDT\":true},\"coingecko\":{\"found\":{\"avalanche-2\":\"AVAX\",\"chainlink\":\"LINK\"},\"ok\":true}},\"rc\":0,\"root\":\"/opt/stacks/crypto-portfolio\",\"root_exists\":true,\"schema\":1,\"status\":\"OK\",\"target\":{\"binance_symbols\":{\"AVAX\":\"AVAXUSDT\",\"HBAR\":\"HBARUSDT\",\"LINK\":\"LINKUSDT\",\"POL\":\"POLUSDT\"},\"chart_health_symbols\":[\"HBAR\",\"POL\",\"AVAX\",\"LINK\"],\"coingecko_coins\":{\"avalanche-2\":\"AVAX\",\"chainlink\":\"LINK\",\"hedera-hashgraph\":\"HBAR\",\"polygon-ecosystem-token\":\"POL\"},\"fallback_icon_addition\":{\"avalanche-2\":\"AVAX\"}},\"template\":{\"anchors\":[{\"line\":3,\"text\":\"<style>:root{--bg:#071018;--p:#0f1d29;--p2:#0a1620;--l:#213644;--t:#f3f7fb;--m:#8fa5b6;--g:#63e6be;--r:#ff6b81;--b:#69a7ff}*{box-sizing:border-box}body{margin:0;background:radial-gradient(circle at 85% 0,#17395a55,transparent 32%),var(--bg);color:var(--t);font:14px system-ui}.app{max-width:1500px;margin:auto;padding:24px}.top{display:flex;justify-content:space-between;align-items:center;margin-bottom:18px}.top-actions{display:flex;align-items:center;gap:10px}.currency-switch{display:flex;gap:4px;padding:4px;border:1px solid var(--l);border-radius:12px;background:#091722}.currency-btn{border:0;border-radius:8px;padding:7px 10px;background:transparent;color:var(--m);font-weight:800;cursor:poin\"},{\"line\":6,\"text\":\"<section id=\\\"coins\\\" class=\\\"coins\\\"></section><section class=\\\"layout\\\"><div class=\\\"panel\\\"><div class=\\\"title\\\"><div><h2 id=\\\"chartTitle\\\">График цены</h2><span class=\\\"muted\\\">7 дней</span></div><span id=\\\"marketStatus\\\" class=\\\"status\\\">Загрузка</span></div><svg id=\\\"chart\\\" class=\\\"chart\\\" viewBox=\\\"0 0 900 270\\\" preserveAspectRatio=\\\"none\\\"></svg></div><div class=\\\"panel sharp-moves-panel\\\"><div class=\\\"title\\\"><h2>Резкие движения</h2></div><div id=\\\"moves\\\" class=\\\"moves\\\"></div></div></section>\"},{\"line\":9,\"text\":\"<script>let state=null;let selected=\\\"hedera-hashgraph\\\";let currency=localStorage.getItem(\\\"portfolio_currency\\\")===\\\"RUB\\\"?\\\"RUB\\\":\\\"USD\\\";const fx=()=>Number(state&&state.market&&state.market.usd_rub||0);const cv=n=>Number(n||0)*(currency===\\\"RUB\\\"?fx():1);const money=(n,d=2)=>new Intl.NumberFormat(currency===\\\"RUB\\\"?\\\"ru-RU\\\":\\\"en-US\\\",{style:\\\"currency\\\",currency:currency,minimumFractionDigits:d,maximumFractionDigits:d}).format(cv(n));const compactMoney=n=>(currency===\\\"RUB\\\"?\\\"₽\\\":\\\"$\\\")+new Intl.NumberFormat(currency===\\\"RUB\\\"?\\\"ru-RU\\\":\\\"en-US\\\",{notation:\\\"compact\\\",maximumFractionDigits:2}).format(cv(n));const inputPrice=n=>Number((Number(n||0)*(currency===\\\"RUB\\\"?fx():1)).toFixed(currency===\\\"RUB\\\"?2:8));const coin=()\"},{\"line\":25,\"text\":\"statusEl.setAttribute(\\\"aria-live\\\",\\\"polite\\\");\"},{\"line\":31,\"text\":\"const ids=Object.keys(state.coins);\"},{\"line\":46,\"text\":\"coin_id:String(coinEl.value||\\\"\\\"),\"},{\"line\":54,\"text\":\"if(!payload.coin_id){statusEl.className=\\\"bad full\\\";statusEl.textContent=\\\"Не выбрана монета\\\";return;}\"},{\"line\":84,\"text\":\"return idIsNew&&a.coin_id===payload.coin_id&&a.kind===payload.kind&&Number(a.threshold)===payload.threshold&&String(a.email)===payload.email;\"},{\"line\":132,\"text\":\"const symbol=(data.coins&&data.coins[alert.coin_id])||alert.coin_id;\"},{\"line\":152,\"text\":\"const holding=(data.holdings&&data.holdings[alert.coin_id])||{};\"},{\"line\":217,\"text\":\"<style id=\\\"TRADINGVIEW_THREE_CHARTS_STYLE_V1\\\">#chart{display:none!important}#tvCharts{display:grid;grid-template-columns:1fr;gap:18px;margin-top:12px}.tv-card{min-height:470px;border:1px solid var(--l);border-radius:16px;overflow:hidden;background:#081823}.tv-card-head{padding:12px 14px 0;font-weight:800}.tv-widget-slot{height:430px;width:100%}@media(max-width:750px){.tv-widget-slot{height:370px}}</style>\"},{\"line\":218,\"text\":\"<script src=\\\"/vendor/lightweight-charts.js\\\"></script>\"},{\"line\":219,\"text\":\"<script id=\\\"LOCAL_TRADINGVIEW_CHARTS_V1\\\">\"},{\"line\":221,\"text\":\"const symbols=[\\\"HBAR\\\",\\\"POL\\\"];\"},{\"line\":224,\"text\":\"const response=await fetch(\\\"/api/klines/\\\"+encodeURIComponent(symbol)+\\\"?limit=1000&interval=1M\\\",{cache:\\\"no-store\\\"});\"},{\"line\":232,\"text\":\"if(!window.LightweightCharts)throw new Error(\\\"Локальная библиотека не загрузилась\\\");\"},{\"line\":233,\"text\":\"chart.style.display=\\\"none\\\";\"},{\"line\":234,\"text\":\"const panel=chart.closest(\\\".panel\\\");\"},{\"line\":236,\"text\":\"chartTitle.textContent=\\\"Графики монет\\\";\"},{\"line\":237,\"text\":\"const note=chartTitle.parentElement.querySelector(\\\".muted\\\");\"},{\"line\":239,\"text\":\"let root=document.getElementById(\\\"tvCharts\\\");\"},{\"line\":240,\"text\":\"if(!root){root=document.createElement(\\\"div\\\");root.id=\\\"tvCharts\\\";chart.insertAdjacentElement(\\\"afterend\\\",root)}\"},{\"line\":245,\"text\":\"card.innerHTML=`<div class=\\\"tv-card-head\\\">${symbol} / USDT</div><div class=\\\"tv-widget-slot\\\"></div><div class=\\\"tv-chart-error muted\\\" style=\\\"padding:0 14px 12px\\\">Загрузка...</div>`;\"},{\"line\":248,\"text\":\"const error=card.querySelector(\\\".tv-chart-error\\\");\"},{\"line\":249,\"text\":\"const api=LightweightCharts.createChart(box,{width:box.clientWidth||900,height:430,layout:{background:{type:LightweightCharts.ColorType.Solid,color:\\\"#081823\\\"},textColor:\\\"#8fa5b6\\\"},grid:{vertLines:{color:\\\"rgba(143,165,182,.08)\\\"},horzLines:{color:\\\"rgba(143,165,182,.08)\\\"}},rightPriceScale:{borderColor:\\\"rgba(143,165,182,.2)\\\"},timeScale:{borderColor:\\\"rgba(143,165,182,.2)\\\",timeVisible:false,secondsVisible:false}});\"},{\"line\":250,\"text\":\"const series=api.addSeries(LightweightCharts.CandlestickSeries,{upColor:\\\"#63e6be\\\",downColor:\\\"#ff6b81\\\",wickUpColor:\\\"#63e6be\\\",wickDownColor:\\\"#ff6b81\\\",borderVisible:false,priceFormat:{type:\\\"price\\\",precision:8,minMove:.00000001}});\"},{\"line\":261,\"text\":\"}catch(chartError){\"},{\"line\":262,\"text\":\"item.error.textContent=\\\"Ошибка: \\\"+String(chartError.message||chartError);\"},{\"line\":268,\"text\":\"console.error(\\\"Local TradingView chart error\\\",error);\"},{\"line\":269,\"text\":\"const note=chartTitle.parentElement.querySelector(\\\".muted\\\");\"},{\"line\":276,\"text\":\"<script id=\\\"MOVE_CHARTS_TO_BOTTOM_ALLTIME_V1\\\">(()=>{const move=()=>{const chart=document.getElementById(\\\"chart\\\");const panel=chart&&chart.closest(\\\".panel\\\");const main=document.querySelector(\\\"main\\\");if(!panel||!main)return;main.appendChild(panel);panel.style.gridColumn=\\\"1 / -1\\\";const title=document.getElementById(\\\"chartTitle\\\");if(title)title.textContent=\\\"Графики монет\\\";const note=panel.querySelector(\\\".muted\\\");if(note)note.textContent=\\\"Свечи Binance · 1 месяц · весь доступный период\\\"};document.addEventListener(\\\"DOMContentLoaded\\\",move);window.addEventListener(\\\"load\\\",move);setTimeout(move,300);setTimeout(move,1500);setTimeout(move,4000)})();</script></body></html>\"}],\"bytes\":29469,\"contains_avax_and_link\":false,\"contains_hbar_and_pol\":true,\"dynamic_coin_rendering\":true,\"sha256\":\"e497a36d8549654c6d451360a11a2ad714e19c23e6d384330a5436f7d32267cb\"},\"template_change_required\":false,\"worker\":{\"assignments\":[{\"end_line\":11,\"line\":11,\"literal\":{\"hedera-hashgraph\":\"HBAR\",\"polygon-ecosystem-token\":\"POL\"},\"names\":[\"COINS\"],\"source\":\"COINS = {\\\"hedera-hashgraph\\\": \\\"HBAR\\\", \\\"polygon-ecosystem-token\\\": \\\"POL\\\"}\"}]}},\"control_plane_error\":null,\"gitea_changed\":false,\"mutation_outcome\":\"NO_MUTATION\",\"next_decision\":\"BUILD_AND_RUN_ONE_ATOMIC_AVAX_LINK_MUTATION_CAPSULE\",\"previous_capsule_sha256\":\"9900070f7be5328505fd0132f5654699221c7448dce3c1e3163872ef41aef127\",\"previous_command_id\":\"GRAM1-SITE-AVAX-LINK-V18-EXACT-SOURCE-PLAN-CHUNKED-20260731T213100Z\",\"previous_output_sha256\":\"93760d077a34d34cc5f4c7732bd2c880e502a987805d58263deedaf35e3bd91a\",\"previous_runner_document_rc\":0,\"previous_runner_json_sha256\":\"410ce3f04d5e435798d87c153d1d3f13c8b009112ac3a56668dd183b23831464\",\"previous_runner_rc\":1,\"previous_runner_text_sha256\":\"77daa994aee633b485242b723f34c6fe763d0dc4e85fc9a882bee4a59e30fbb3\",\"previous_state_status\":\"FAIL\",\"previous_wrapper_matches_document\":false,\"production_site_changed\":false,\"rc\":0,\"rollback_restored\":null,\"rollback_started\":false,\"schema\":1,\"selected_method\":\"ALIAS_PINNED_AS_DEBIAN\",\"ssh_method_probes\":[{\"duration_seconds\":0.122,\"identity_and_sudo_read_ok\":true,\"identity_count\":null,\"name\":\"ALIAS_PINNED_AS_DEBIAN\",\"rc\":0,\"stderr\":\"\"},{\"duration_seconds\":0.116,\"identity_and_sudo_read_ok\":true,\"identity_count\":2,\"name\":\"DIRECT_PINNED_AS_DEBIAN_NO_PROXY\",\"rc\":0,\"stderr\":\"\"}],\"status\":\"OK\"}\n"
}
