[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6GWQGE635B7MN7TC5PDMMMY":3,"skill-same:01M6GWQGE635B7MN7TC5PDMMMY":74},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":41,"linkOnly":42,"markdownContent":43,"markdownBody":44,"frontMatter":45,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":54,"repositoryHtmlUrl":55,"repositoryHomepageUrl":6,"ownerHtmlUrl":56,"ownerBlogUrl":57,"ownerDescription":58,"updatedAt":59,"install":60,"resources":73},"01M6GWQGE635B7MN7TC5PDMMMY","safe-update-restart",null,"Safe update\u002Frestart procedure for a production Hermes VPS that runs many live APIs, services, and multiple agent gateways sharing one venv. Full backup → controlled window → restart → verify every service and endpoint after. Never blind-restart.","jiayaoqijia\u002Fcryptoskill","jiayaoqijia","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1453879?v=4","01M6GMYTX7Q7S504VC6E756ENR","YQ","01M6GMYV1QKJ1CC75MTTGT9PR0",81,"MIT","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fmcp-servers\u002Fgentech-labs-gentech-agent-kit\u002Fskills\u002Fsafe-update-restart\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40],"update","safe update restart","restart","safe","verify","window","for","venv","vps","live","service","never","operations","backup","Safety","sharing","Production","services","gateways","gateway","verification","deployment","2026-11-10 10:12:30",false,"---\nname: safe-update-restart\ndescription: \"Safe update\u002Frestart procedure for a production Hermes VPS that runs many live APIs, services, and multiple agent gateways sharing one venv. Full backup → controlled window → restart → verify every service and endpoint after. Never blind-restart.\"\nversion: 1.0.0\nauthor: Gentech\ntags: [update, restart, deployment, operations, hermes, gateway, verification, backup, safety]\nlicense: MIT\n---\n\n# Safe Update & Restart for Production VPS\n\n> ### ? Running in a CONTAINER? Read `fleet-update-container` instead — several commands here do NOT work there.\n> If your agent runs from a **Docker image** (no writable `\u002Fopt\u002Fhermes`, no `systemd`, `\u002Fopt\u002Fdata` is a\n> bind mount), the commands below are **wrong for your box**: `hermes update` refuses in-container,\n> `systemctl` does not exist (services are **s6**), and the update is a **host recreate**, not an agent\n> action. Use the companion skill **`fleet-update-container`** for the container-correct procedure —\n> it also covers how to read the real version from the image's install stamp and the boot trap that\n> false-flags lost ports.\n\n## When to Use\n- Updating Hermes Agent (`hermes update`) on a box that runs live services.\n- Restarting the gateway, x402 gateway, or any service someone may be connected to.\n- Any restart where \"someone could be connecting any minute.\"\n- Recovering after a service or gateway change.\n\n## The Core Principle\n**Never blind-restart.** A production VPS hosts many live APIs, x402 services, and\nmultiple agent gateways that share one Hermes venv. A careless update\u002Frestart can drop\na live connection or take down a service with no warning. Always: **backup → controlled\nwindow → restart each service → verify everything after.**\n\n## The Procedure\n\n### Step 1 — Record the baseline (BEFORE touching anything)\nCapture current state so you can prove nothing regressed:\n```bash\n# hermes gateways (note PIDs)\nfor p in \u003Cprofile1> \u003Cprofile2> \u003Cprofile3>; do\n  pid=$(pgrep -f \"profile $p gateway run\" | head -1)\n  echo \"$p: pid=${pid:-DOWN}\"\ndone\n# systemd services\nfor svc in \u003Cx402-api> \u003Cx402-backend@...> \u003Cother services>; do\n  echo \"$svc: $(systemctl is-active \"$svc\" 2>\u002Fdev\u002Fnull)\"\ndone\n# public endpoints\nfor u in \"https:\u002F\u002Fapi.example.net\u002F\" \"https:\u002F\u002Fapi.example.net\u002Fstatus\"; do\n  echo \"$u -> $(curl -s -m 12 -o \u002Fdev\u002Fnull -w '%{http_code}' \"$u\")\"\ndone\n```\n\n### Step 2 — Take a rollback-safe backup\nUse the **quick snapshot** (covers config, .env, auth, state.db, cron — the\nrollback-critical files). A full zip of `~\u002F.hermes` can be 30-40GB+ and take 30+ min —\ntoo heavy for rollback needs.\n```bash\nhermes backup -q -l pre-update-$(date +%Y%m%d) -o \u002Froot\u002Fhermes-quick-backup.zip\n```\nAlso record the git rollback point:\n```bash\ncd \u002Fusr\u002Flocal\u002Flib\u002Fhermes-agent && git log -1 --oneline && git describe --tags\n```\n> **PITFALL:** A full `hermes backup` (no `-q`) zips the entire 30-40GB `~\u002F.hermes`\n> including cargo\u002Fnode caches — it's slow and produces giant zips that fill disk. Use\n> `-q` unless you have a specific reason for the full archive. Delete any stale\n> `.partial` files it leaves behind.\n\n### Step 3 — Controlled update\n```bash\ncd \u002Fusr\u002Flocal\u002Flib\u002Fhermes-agent && hermes update --yes\n```\nRun it in the **background** with completion notification — a large commit jump (hundreds\nof commits) takes several minutes for git pull + dependency reinstall, and will exceed a\nforeground timeout.\n> The update does a **graceful gateway drain** before restarting managed gateways on the\n> new code — this is the safe handoff, not a bug. Wait it out; don't kill it.\n\n### Step 4 — Verify every service and endpoint AFTER (the checklist)\nCompare against the Step 1 baseline. All gateways should have **new PIDs** (restarted on\nnew code); all services `active`; all endpoints matching the baseline code.\n```bash\n# 1. gateways restarted on new code?\nfor p in \u003Cprofiles>; do echo \"$p: pid=$(pgrep -f \"profile $p gateway run\" | head -1)\"; done\n# 2. version bumped?\nhermes --version\n# 3. services still active?\nfor svc in \u003Cservices>; do echo \"$svc: $(systemctl is-active \"$svc\")\"; done\n# 4. public endpoints still up (must match baseline)?\nfor u in \u003Cendpoints>; do echo \"$u -> $(curl -s -m 12 -o \u002Fdev\u002Fnull -w '%{http_code}' \"$u\")\"; done\n# 5. paid API rail still intact (x402 returns 402 PaymentRequired, not 500)?\ncurl -s -m 15 -L \"\u003Cpaid-endpoint>\" -o \u002Ftmp\u002Fresp.json -w \"HTTP %{http_code}\\n\"\n```\n\n## Pitfalls\n- ❌ **Blind `hermes update`** on a box with other live agents — can drop their sessions. Backup + controlled window first.\n- ❌ **Full backup when you only need rollback state** — `-q` snapshot is enough; full zip is 30-40GB and slow.\n- ❌ **Killing the update during gateway drain** — the drain is the graceful handoff; killing it mid-drain can orphan gateways.\n- ❌ **Truncating a 402 body with `head -c`** then failing JSON parse — a 402 PaymentRequired response is correct; parse the *full* body to verify the rail.\n- ❌ **Assuming a service is broken when it was `inactive` in the baseline too** — compare against the Step 1 baseline, not an assumed \"should be active\" list.\n- ❌ **`git rev-list --count \u003Cold>..origin\u002Fmain`** counts all upstream commits; the actual update jump may differ (see `hermes version`).\n\n## Verification\n- All gateways show new PIDs (restarted on new code).\n- `hermes --version` shows the new version.\n- Every service `active` (matching baseline).\n- Every public endpoint returns the baseline HTTP code.\n- Paid API rail returns HTTP 402 with valid x402Version + accepts (not 5xx).\n","# Safe Update & Restart for Production VPS\n\n> ### ? Running in a CONTAINER? Read `fleet-update-container` instead — several commands here do NOT work there.\n> If your agent runs from a **Docker image** (no writable `\u002Fopt\u002Fhermes`, no `systemd`, `\u002Fopt\u002Fdata` is a\n> bind mount), the commands below are **wrong for your box**: `hermes update` refuses in-container,\n> `systemctl` does not exist (services are **s6**), and the update is a **host recreate**, not an agent\n> action. Use the companion skill **`fleet-update-container`** for the container-correct procedure —\n> it also covers how to read the real version from the image's install stamp and the boot trap that\n> false-flags lost ports.\n\n## When to Use\n- Updating Hermes Agent (`hermes update`) on a box that runs live services.\n- Restarting the gateway, x402 gateway, or any service someone may be connected to.\n- Any restart where \"someone could be connecting any minute.\"\n- Recovering after a service or gateway change.\n\n## The Core Principle\n**Never blind-restart.** A production VPS hosts many live APIs, x402 services, and\nmultiple agent gateways that share one Hermes venv. A careless update\u002Frestart can drop\na live connection or take down a service with no warning. Always: **backup → controlled\nwindow → restart each service → verify everything after.**\n\n## The Procedure\n\n### Step 1 — Record the baseline (BEFORE touching anything)\nCapture current state so you can prove nothing regressed:\n```bash\n# hermes gateways (note PIDs)\nfor p in \u003Cprofile1> \u003Cprofile2> \u003Cprofile3>; do\n  pid=$(pgrep -f \"profile $p gateway run\" | head -1)\n  echo \"$p: pid=${pid:-DOWN}\"\ndone\n# systemd services\nfor svc in \u003Cx402-api> \u003Cx402-backend@...> \u003Cother services>; do\n  echo \"$svc: $(systemctl is-active \"$svc\" 2>\u002Fdev\u002Fnull)\"\ndone\n# public endpoints\nfor u in \"https:\u002F\u002Fapi.example.net\u002F\" \"https:\u002F\u002Fapi.example.net\u002Fstatus\"; do\n  echo \"$u -> $(curl -s -m 12 -o \u002Fdev\u002Fnull -w '%{http_code}' \"$u\")\"\ndone\n```\n\n### Step 2 — Take a rollback-safe backup\nUse the **quick snapshot** (covers config, .env, auth, state.db, cron — the\nrollback-critical files). A full zip of `~\u002F.hermes` can be 30-40GB+ and take 30+ min —\ntoo heavy for rollback needs.\n```bash\nhermes backup -q -l pre-update-$(date +%Y%m%d) -o \u002Froot\u002Fhermes-quick-backup.zip\n```\nAlso record the git rollback point:\n```bash\ncd \u002Fusr\u002Flocal\u002Flib\u002Fhermes-agent && git log -1 --oneline && git describe --tags\n```\n> **PITFALL:** A full `hermes backup` (no `-q`) zips the entire 30-40GB `~\u002F.hermes`\n> including cargo\u002Fnode caches — it's slow and produces giant zips that fill disk. Use\n> `-q` unless you have a specific reason for the full archive. Delete any stale\n> `.partial` files it leaves behind.\n\n### Step 3 — Controlled update\n```bash\ncd \u002Fusr\u002Flocal\u002Flib\u002Fhermes-agent && hermes update --yes\n```\nRun it in the **background** with completion notification — a large commit jump (hundreds\nof commits) takes several minutes for git pull + dependency reinstall, and will exceed a\nforeground timeout.\n> The update does a **graceful gateway drain** before restarting managed gateways on the\n> new code — this is the safe handoff, not a bug. Wait it out; don't kill it.\n\n### Step 4 — Verify every service and endpoint AFTER (the checklist)\nCompare against the Step 1 baseline. All gateways should have **new PIDs** (restarted on\nnew code); all services `active`; all endpoints matching the baseline code.\n```bash\n# 1. gateways restarted on new code?\nfor p in \u003Cprofiles>; do echo \"$p: pid=$(pgrep -f \"profile $p gateway run\" | head -1)\"; done\n# 2. version bumped?\nhermes --version\n# 3. services still active?\nfor svc in \u003Cservices>; do echo \"$svc: $(systemctl is-active \"$svc\")\"; done\n# 4. public endpoints still up (must match baseline)?\nfor u in \u003Cendpoints>; do echo \"$u -> $(curl -s -m 12 -o \u002Fdev\u002Fnull -w '%{http_code}' \"$u\")\"; done\n# 5. paid API rail still intact (x402 returns 402 PaymentRequired, not 500)?\ncurl -s -m 15 -L \"\u003Cpaid-endpoint>\" -o \u002Ftmp\u002Fresp.json -w \"HTTP %{http_code}\\n\"\n```\n\n## Pitfalls\n- ❌ **Blind `hermes update`** on a box with other live agents — can drop their sessions. Backup + controlled window first.\n- ❌ **Full backup when you only need rollback state** — `-q` snapshot is enough; full zip is 30-40GB and slow.\n- ❌ **Killing the update during gateway drain** — the drain is the graceful handoff; killing it mid-drain can orphan gateways.\n- ❌ **Truncating a 402 body with `head -c`** then failing JSON parse — a 402 PaymentRequired response is correct; parse the *full* body to verify the rail.\n- ❌ **Assuming a service is broken when it was `inactive` in the baseline too** — compare against the Step 1 baseline, not an assumed \"should be active\" list.\n- ❌ **`git rev-list --count \u003Cold>..origin\u002Fmain`** counts all upstream commits; the actual update jump may differ (see `hermes version`).\n\n## Verification\n- All gateways show new PIDs (restarted on new code).\n- `hermes --version` shows the new version.\n- Every service `active` (matching baseline).\n- Every public endpoint returns the baseline HTTP code.\n- Paid API rail returns HTTP 402 with valid x402Version + accepts (not 5xx).\n",{"name":5,"tags":46,"author":49,"license":15,"version":50,"description":7},[19,21,40,31,47,38,39,32,48],"hermes","safety","Gentech","1.0.0","main","3df1d0d67b30ff15236561f8c0f9f06d33f42dfd","skills\u002Fmcp-servers\u002Fgentech-labs-gentech-agent-kit\u002Fskills\u002Fsafe-update-restart",17,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia","https:\u002F\u002Feth2030.com","Hardcore infra. Building @alt-research and applied cryptography.","2026-11-15 02:28:10",{"source":8,"skillName":5,"commands":61,"prompt":71,"zipAvailable":72},[62,65,68],{"tool":63,"command":64},"npx","npx skills add jiayaoqijia\u002Fcryptoskill --skill safe-update-restart",{"tool":66,"command":67},"bunx","bunx skills add jiayaoqijia\u002Fcryptoskill --skill safe-update-restart",{"tool":69,"command":70},"pnpm","pnpm dlx skills add jiayaoqijia\u002Fcryptoskill --skill safe-update-restart","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fmcp-servers\u002Fgentech-labs-gentech-agent-kit\u002Fskills\u002Fsafe-update-restart\u002FSKILL.md",true,[],[75,103,125,143,156,166],{"skillNo":76,"name":77,"nameZh":6,"description":78,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":79,"sourceHtmlUrl":80,"categories":81,"keywords":82,"publishedAt":41},"01M712C436EQYE43342Q4E7GG1","recipe-performance","Diagnose a specific MetaMask user flow's real-app performance and Sentry critical-user-flow telemetry with deterministic mm-harness recipes. Use for CUF boundaries, cold\u002Fwarm\u002Fbackground-resume behavior, latency regressions, lifecycle tags, duplicate or blocking network requests, long tasks, layout\u002Fpaint cost, screen redraws, React rerenders, or browser trace analysis where tests alone cannot prove the real app.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-performance\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-performance\u002FSKILL.md",[],[83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102],"performance","recipe performance","recipe","mm","sentry","harness","app","deterministic","recipes","flow","cold","critical","analysis","tasks","react","browser","layout","screen","network","metamask",{"skillNo":104,"name":105,"nameZh":6,"description":106,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":107,"licenseFileUrl":108,"sourceHtmlUrl":109,"categories":110,"keywords":111,"publishedAt":41},"01M70XT2F8A5CQZ81JBP98KSW3","mexc-spot-websocket","MEXC Spot WebSocket workflows for public streams, protobuf handling, depth maintenance, listen keys, and private streams without exposing API keys.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-websocket\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-websocket\u002FSKILL.md",[],[112,113,114,115,116,117,118,119,120,121,25,122,123,124],"mexc spot websocket","spot","websocket","api","workflows","public","listen","streams","depth","keys","api keys","maintenance","protobuf",{"skillNo":126,"name":127,"nameZh":6,"description":128,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":107,"licenseFileUrl":129,"sourceHtmlUrl":130,"categories":131,"keywords":132,"publishedAt":41},"01M70XT0MBXN3WZY1BKN0CPNKR","mexc-spot-rest","MEXC Spot REST workflows for public data, signed account requests, orders, wallet\u002Fadmin actions, and secure signing without exposing API keys.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-rest\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-rest\u002FSKILL.md",[],[133,113,134,135,136,137,138,122,25,121,139,140,141,117,142,116,115],"mexc spot rest","REST","admin","signing","Wallet","requests","actions","secure","data","orders",{"skillNo":144,"name":145,"nameZh":6,"description":146,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":107,"licenseFileUrl":147,"sourceHtmlUrl":148,"categories":149,"keywords":150,"publishedAt":41},"01M70XSYSVZ2N0N91XCAR2CAK0","mexc-futures-websocket","MEXC Futures WebSocket workflows for public streams, private account\u002Forder\u002Fposition streams, ping\u002Fpong, subscriptions, and depth maintenance.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-futures-websocket\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-futures-websocket\u002FSKILL.md",[],[151,152,114,153,154,123,25,155,120,119,117,116],"mexc futures websocket","futures","position","ping","subscriptions",{"skillNo":157,"name":158,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":159,"sourceHtmlUrl":160,"categories":161,"keywords":162,"publishedAt":41},"01M6H0ZWHVE5W04WG2DKQE2SQC","0xklen-version-and-refresh-sanctions-lists","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-version-and-refresh-sanctions-lists\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-version-and-refresh-sanctions-lists\u002FSKILL.md",[],[163,164,165],"refresh","0xklen version and refresh sanctions lists","version",{"skillNo":167,"name":168,"nameZh":6,"description":169,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":170,"sourceHtmlUrl":171,"categories":172,"keywords":173,"publishedAt":41},"01M6H0Z28Q3R8J0S799GJQWXM3","verify-tests-cover-changed-lines","Use when a PR adds code that the existing suite may not exercise. Measures patch coverage — the share of newly changed lines hit by tests — before approving.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-tests-cover-changed-lines\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-tests-cover-changed-lines\u002FSKILL.md",[],[174,175,176,23,177,178,179,180,181,182,183],"tests","cover","verify tests cover changed lines","coverage","pr","exercise","use","patch","code","share"]