[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6GY983MMZGRZ9NQHC2MKX2H":3,"skill-same:01M6GY983MMZGRZ9NQHC2MKX2H":89},{"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":16,"sourceHtmlUrl":17,"categories":18,"keywords":29,"publishedAt":47,"linkOnly":48,"markdownContent":49,"markdownBody":50,"frontMatter":51,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":55,"repositoryHtmlUrl":56,"repositoryHomepageUrl":6,"ownerHtmlUrl":57,"ownerBlogUrl":58,"ownerDescription":59,"updatedAt":60,"install":61,"resources":74},"01M6GY983MMZGRZ9NQHC2MKX2H","design-health-and-readiness-probes",null,"Use when a load balancer or orchestrator needs liveness and readiness signals — splits the two endpoints, keeps liveness dependency-free, and makes readiness reflect actual ability to serve.","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\u002Fpayments\u002F0xklen-design-health-and-readiness-probes\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-design-health-and-readiness-probes\u002FSKILL.md",[19,24],{"categoryNo":20,"categoryName":21,"taxonomyType":22,"taxonomyTypeDesc":23},"01JBSEEDCAT000000000000015","视觉设计","SCENARIO","使用场景",{"categoryNo":25,"categoryName":26,"taxonomyType":27,"taxonomyTypeDesc":28},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"health","design health and readiness probes","design","readiness","free","when","splits","balancer","load","load balancer","serve","signals","endpoints","dependency","use","orchestrator","reflect","2026-11-10 10:12:30",false,"---\nname: design-health-and-readiness-probes\ndescription: Use when a load balancer or orchestrator needs liveness and readiness signals — splits the two endpoints, keeps liveness dependency-free, and makes readiness reflect actual ability to serve.\n---\n\n# Design health and readiness probes\n\nLiveness asks \"should this process be killed?\"; readiness asks \"should it take traffic?\". Conflating them makes an orchestrator restart every pod during a dependency blip, or route to a pod that cannot serve.\n\n## Procedure\n\n1. Expose two endpoints with distinct meanings:\n       \u002Fhealthz   liveness:  is the process itself alive and not wedged?\n       \u002Freadyz    readiness: can it serve a request right now?\n\n2. Keep liveness cheap and dependency-free. It returns 200 as long as the event loop is responsive and must never call the database, cache or any peer. A liveness probe that fails when the database is down restarts every pod at once — the classic cascading restart.\n\n3. Let readiness check only what is needed to serve: migrations applied, config loaded, warm cache, connection pool established. Leave peer health out unless the service is genuinely useless without it.\n\n4. Configure with real timings and separate budgets:\n       livenessProbe:  { httpGet: {path: \u002Fhealthz, port: 8080}, periodSeconds: 10, timeoutSeconds: 1, failureThreshold: 3 }\n       readinessProbe: { httpGet: {path: \u002Freadyz,  port: 8080}, periodSeconds: 5,  timeoutSeconds: 2, failureThreshold: 2 }\n       startupProbe:   { httpGet: {path: \u002Fhealthz, port: 8080}, periodSeconds: 2, failureThreshold: 30 }\n\n5. Use a `startupProbe` for slow boots so a slow start does not trip liveness and cause a restart loop; it gates the other probes until the app is up (here, up to 60 s).\n\n6. Return an accurate status code plus a small JSON body a human can read:\n       {\"status\":\"unready\",\"reason\":\"migrations_pending\",\"version\":\"a1b2c3\"}\n   Never return 200 with `{\"status\":\"degraded\"}` — the orchestrator cannot read prose.\n\n7. Drain on shutdown: on SIGTERM flip `\u002Freadyz` to 503 first, wait 5–10 s for the endpoint to leave the load balancer, then stop accepting, with `terminationGracePeriodSeconds` at least the in-flight drain time.\n\n8. Keep the probe handler off the request hot path and free of any lock a stuck request could hold, or the probe itself hangs and the pod is killed.\n\n## Pitfalls\n\n- Readiness that probes the database: a 30 s database blip empties the endpoint list and turns a degradation into a full outage.\n- Liveness with `failureThreshold: 1` and a 1 s timeout, so one GC pause restarts every pod simultaneously.\n- A single endpoint serving both meanings, so you cannot restart without dropping traffic or drain without restarting.\n- A readiness handler that always returns 200, so a rollout declares ready before the app can actually serve.\n\n## Verification\n\n    curl -s -o \u002Fdev\u002Fnull -w '%{http_code}\\n' localhost:8080\u002Fhealthz   # 200 while a dependency is stopped\n    curl -s -o \u002Fdev\u002Fnull -w '%{http_code}\\n' localhost:8080\u002Freadyz    # 503 while it is stopped\n    kubectl get pods -w    # READY only after readinessProbe passes, not before\n\nReport: the two endpoints' semantics, the probe timings, and the observed behaviour — liveness stays 200 while a dependency is down, readiness flips 503→200 without any restart.\n","# Design health and readiness probes\n\nLiveness asks \"should this process be killed?\"; readiness asks \"should it take traffic?\". Conflating them makes an orchestrator restart every pod during a dependency blip, or route to a pod that cannot serve.\n\n## Procedure\n\n1. Expose two endpoints with distinct meanings:\n       \u002Fhealthz   liveness:  is the process itself alive and not wedged?\n       \u002Freadyz    readiness: can it serve a request right now?\n\n2. Keep liveness cheap and dependency-free. It returns 200 as long as the event loop is responsive and must never call the database, cache or any peer. A liveness probe that fails when the database is down restarts every pod at once — the classic cascading restart.\n\n3. Let readiness check only what is needed to serve: migrations applied, config loaded, warm cache, connection pool established. Leave peer health out unless the service is genuinely useless without it.\n\n4. Configure with real timings and separate budgets:\n       livenessProbe:  { httpGet: {path: \u002Fhealthz, port: 8080}, periodSeconds: 10, timeoutSeconds: 1, failureThreshold: 3 }\n       readinessProbe: { httpGet: {path: \u002Freadyz,  port: 8080}, periodSeconds: 5,  timeoutSeconds: 2, failureThreshold: 2 }\n       startupProbe:   { httpGet: {path: \u002Fhealthz, port: 8080}, periodSeconds: 2, failureThreshold: 30 }\n\n5. Use a `startupProbe` for slow boots so a slow start does not trip liveness and cause a restart loop; it gates the other probes until the app is up (here, up to 60 s).\n\n6. Return an accurate status code plus a small JSON body a human can read:\n       {\"status\":\"unready\",\"reason\":\"migrations_pending\",\"version\":\"a1b2c3\"}\n   Never return 200 with `{\"status\":\"degraded\"}` — the orchestrator cannot read prose.\n\n7. Drain on shutdown: on SIGTERM flip `\u002Freadyz` to 503 first, wait 5–10 s for the endpoint to leave the load balancer, then stop accepting, with `terminationGracePeriodSeconds` at least the in-flight drain time.\n\n8. Keep the probe handler off the request hot path and free of any lock a stuck request could hold, or the probe itself hangs and the pod is killed.\n\n## Pitfalls\n\n- Readiness that probes the database: a 30 s database blip empties the endpoint list and turns a degradation into a full outage.\n- Liveness with `failureThreshold: 1` and a 1 s timeout, so one GC pause restarts every pod simultaneously.\n- A single endpoint serving both meanings, so you cannot restart without dropping traffic or drain without restarting.\n- A readiness handler that always returns 200, so a rollout declares ready before the app can actually serve.\n\n## Verification\n\n    curl -s -o \u002Fdev\u002Fnull -w '%{http_code}\\n' localhost:8080\u002Fhealthz   # 200 while a dependency is stopped\n    curl -s -o \u002Fdev\u002Fnull -w '%{http_code}\\n' localhost:8080\u002Freadyz    # 503 while it is stopped\n    kubectl get pods -w    # READY only after readinessProbe passes, not before\n\nReport: the two endpoints' semantics, the probe timings, and the observed behaviour — liveness stays 200 while a dependency is down, readiness flips 503→200 without any restart.\n",{"name":5,"description":7},"main","3df1d0d67b30ff15236561f8c0f9f06d33f42dfd","skills\u002Fpayments\u002F0xklen-design-health-and-readiness-probes",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-14 02:27:51",{"source":8,"skillName":5,"commands":62,"prompt":72,"zipAvailable":73},[63,66,69],{"tool":64,"command":65},"npx","npx skills add jiayaoqijia\u002Fcryptoskill --skill design-health-and-readiness-probes",{"tool":67,"command":68},"bunx","bunx skills add jiayaoqijia\u002Fcryptoskill --skill design-health-and-readiness-probes",{"tool":70,"command":71},"pnpm","pnpm dlx skills add jiayaoqijia\u002Fcryptoskill --skill design-health-and-readiness-probes","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-design-health-and-readiness-probes\u002FSKILL.md",true,[75,79,85],{"path":76,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":78,"sourceHtmlUrl":16},"LICENSE","许可证",1063,{"path":80,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":83,"sourceHtmlUrl":84},"SOURCE.md","REFERENCE","参考文档",360,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-design-health-and-readiness-probes\u002FSOURCE.md",{"path":86,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":87,"sourceHtmlUrl":88},"TRUST.auto.yaml",2217,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-design-health-and-readiness-probes\u002FTRUST.auto.yaml",[90,118,141,159,172,182],{"skillNo":91,"name":92,"nameZh":6,"description":93,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":94,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":47},"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",[],[98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117],"performance","recipe performance","recipe","mm","sentry","harness","app","deterministic","recipes","flow","cold","critical","analysis","tasks","react","browser","layout","screen","network","metamask",{"skillNo":119,"name":120,"nameZh":6,"description":121,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":122,"licenseFileUrl":123,"sourceHtmlUrl":124,"categories":125,"keywords":126,"publishedAt":47},"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",[],[127,128,129,130,131,132,133,134,135,136,137,138,139,140],"mexc spot websocket","spot","websocket","api","workflows","public","listen","streams","depth","keys","for","api keys","maintenance","protobuf",{"skillNo":142,"name":143,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":122,"licenseFileUrl":145,"sourceHtmlUrl":146,"categories":147,"keywords":148,"publishedAt":47},"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",[],[149,128,150,151,152,153,154,138,137,136,155,156,157,132,158,131,130],"mexc spot rest","REST","admin","signing","Wallet","requests","actions","secure","data","orders",{"skillNo":160,"name":161,"nameZh":6,"description":162,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":122,"licenseFileUrl":163,"sourceHtmlUrl":164,"categories":165,"keywords":166,"publishedAt":47},"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",[],[167,168,129,169,170,139,137,171,135,134,132,131],"mexc futures websocket","futures","position","ping","subscriptions",{"skillNo":173,"name":174,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":175,"sourceHtmlUrl":176,"categories":177,"keywords":178,"publishedAt":47},"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",[],[179,180,181],"refresh","0xklen version and refresh sanctions lists","version",{"skillNo":183,"name":184,"nameZh":6,"description":185,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":186,"sourceHtmlUrl":187,"categories":188,"keywords":189,"publishedAt":47},"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",[],[190,191,192,193,194,195,196,44,197,198,199],"tests","cover","verify tests cover changed lines","verify","coverage","pr","exercise","patch","code","share"]