[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6GXEYYR8ACGB91TTY2EMF3C":3,"skill-same:01M6GXEYYR8ACGB91TTY2EMF3C":75},{"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":19,"publishedAt":33,"linkOnly":34,"markdownContent":35,"markdownBody":36,"frontMatter":37,"refName":38,"commitSha":39,"skillDirectory":40,"forksCount":41,"repositoryHtmlUrl":42,"repositoryHomepageUrl":6,"ownerHtmlUrl":43,"ownerBlogUrl":44,"ownerDescription":45,"updatedAt":46,"install":47,"resources":60},"01M6GXEYYR8ACGB91TTY2EMF3C","attach-a-safer-probe-to-a-live-process",null,"Use when a running process is misbehaving and restarting it would lose the state. Inspects it in place with non-destructive tools, capturing evidence before any intervention.","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-attach-a-safer-probe-to-a-live-process\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-attach-a-safer-probe-to-a-live-process\u002FSKILL.md",[],[20,21,22,23,24,25,26,27,28,29,30,31,32],"process","probe","attach","live","attach a safer probe to a live process","state","Tools","use","evidence","it","with","when","running","2026-11-10 10:12:30",false,"---\nname: attach-a-safer-probe-to-a-live-process\ndescription: Use when a running process is misbehaving and restarting it would lose the state. Inspects it in place with non-destructive tools, capturing evidence before any intervention.\n---\n\n# Attach a Safer Probe to a Live Process\n\nA hung or slow process holds the only evidence you need. Inspect its threads, stacks, and file descriptors from outside; kill nothing until you have captured and copied that evidence.\n\n## Procedure\n\n1. Identify the target precisely: `pgrep -af myservice` and confirm the pid, user, and start time so you never attach to the wrong one.\n2. Check liveness cheaply first: `top -b -n1 -p \u003Cpid>` and `cat \u002Fproc\u002F\u003Cpid>\u002Fstatus | grep -E 'State|Threads|VmRSS'`. A state of `D` points at I\u002FO, `R` at CPU spin, `S` at a wait.\n3. Take thread stacks non-invasively: `py-spy dump --pid \u003Cpid>` (Python), `jstack \u003Cpid>` (JVM), `gdb -p \u003Cpid> -batch -ex 'thread apply all bt'` (native), `pstack \u003Cpid>`. Do this twice, seconds apart.\n4. Diff the two stack samples. A line that stays in the same frame is the stuck work; a line that moves is just activity.\n5. Inspect open resources: `lsof -p \u003Cpid>` for leaked handles and `ss -tnp | grep \u003Cpid>` for connections in `CLOSE_WAIT` or `SYN_SENT`.\n6. Snapshot heap or metrics if the runtime supports it without pausing long: `jcmd \u003Cpid> GC.heap_info`, `curl localhost:\u003Cport>\u002Fmetrics`, or a `SIGQUIT` that triggers a graceful dump.\n7. Copy every artefact out before acting: save stacks and outputs under `evidence\u002Fpid-\u003Cpid>-\u003Ctime>\u002F`.\n8. Only then choose an intervention; prefer a graceful `SIGTERM` and a restart over `kill -9`, and never attach a write-capable debugger in production without a rollback.\n\n## Pitfalls\n\n- `gdb` with a breakpoint that halts all threads in production, turning a slowdown into an outage.\n- Attaching with a thread-heavy sampler that itself adds latency; sample from outside the process.\n- Killing with `kill -9` first, which discards the core and the answer.\n- Assuming the newest pid is the one; supervisors restart children, so match start time.\n- Reading a single stack sample and concluding \"stuck in X\" — one sample cannot distinguish wait from valid work.\n- Leaving the process in an attached state (gdb stopped) while stepping away.\n\n## Verification\n\n    py-spy dump --pid \"$(pgrep -f myservice | head -1)\" > evidence\u002Fstack1.txt\n    sleep 3\n    py-spy dump --pid \"$(pgrep -f myservice | head -1)\" > evidence\u002Fstack2.txt\n    diff evidence\u002Fstack1.txt evidence\u002Fstack2.txt\n    # the unchanged frame across both dumps is the suspect; log the pid and timestamp with the capture\n\nReport to the user: the pid and its state, the frame frozen across both samples, and the resource anomaly (fd or connection) if one exists.\n","# Attach a Safer Probe to a Live Process\n\nA hung or slow process holds the only evidence you need. Inspect its threads, stacks, and file descriptors from outside; kill nothing until you have captured and copied that evidence.\n\n## Procedure\n\n1. Identify the target precisely: `pgrep -af myservice` and confirm the pid, user, and start time so you never attach to the wrong one.\n2. Check liveness cheaply first: `top -b -n1 -p \u003Cpid>` and `cat \u002Fproc\u002F\u003Cpid>\u002Fstatus | grep -E 'State|Threads|VmRSS'`. A state of `D` points at I\u002FO, `R` at CPU spin, `S` at a wait.\n3. Take thread stacks non-invasively: `py-spy dump --pid \u003Cpid>` (Python), `jstack \u003Cpid>` (JVM), `gdb -p \u003Cpid> -batch -ex 'thread apply all bt'` (native), `pstack \u003Cpid>`. Do this twice, seconds apart.\n4. Diff the two stack samples. A line that stays in the same frame is the stuck work; a line that moves is just activity.\n5. Inspect open resources: `lsof -p \u003Cpid>` for leaked handles and `ss -tnp | grep \u003Cpid>` for connections in `CLOSE_WAIT` or `SYN_SENT`.\n6. Snapshot heap or metrics if the runtime supports it without pausing long: `jcmd \u003Cpid> GC.heap_info`, `curl localhost:\u003Cport>\u002Fmetrics`, or a `SIGQUIT` that triggers a graceful dump.\n7. Copy every artefact out before acting: save stacks and outputs under `evidence\u002Fpid-\u003Cpid>-\u003Ctime>\u002F`.\n8. Only then choose an intervention; prefer a graceful `SIGTERM` and a restart over `kill -9`, and never attach a write-capable debugger in production without a rollback.\n\n## Pitfalls\n\n- `gdb` with a breakpoint that halts all threads in production, turning a slowdown into an outage.\n- Attaching with a thread-heavy sampler that itself adds latency; sample from outside the process.\n- Killing with `kill -9` first, which discards the core and the answer.\n- Assuming the newest pid is the one; supervisors restart children, so match start time.\n- Reading a single stack sample and concluding \"stuck in X\" — one sample cannot distinguish wait from valid work.\n- Leaving the process in an attached state (gdb stopped) while stepping away.\n\n## Verification\n\n    py-spy dump --pid \"$(pgrep -f myservice | head -1)\" > evidence\u002Fstack1.txt\n    sleep 3\n    py-spy dump --pid \"$(pgrep -f myservice | head -1)\" > evidence\u002Fstack2.txt\n    diff evidence\u002Fstack1.txt evidence\u002Fstack2.txt\n    # the unchanged frame across both dumps is the suspect; log the pid and timestamp with the capture\n\nReport to the user: the pid and its state, the frame frozen across both samples, and the resource anomaly (fd or connection) if one exists.\n",{"name":5,"description":7},"main","3df1d0d67b30ff15236561f8c0f9f06d33f42dfd","skills\u002Fpayments\u002F0xklen-attach-a-safer-probe-to-a-live-process",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":48,"prompt":58,"zipAvailable":59},[49,52,55],{"tool":50,"command":51},"npx","npx skills add jiayaoqijia\u002Fcryptoskill --skill attach-a-safer-probe-to-a-live-process",{"tool":53,"command":54},"bunx","bunx skills add jiayaoqijia\u002Fcryptoskill --skill attach-a-safer-probe-to-a-live-process",{"tool":56,"command":57},"pnpm","pnpm dlx skills add jiayaoqijia\u002Fcryptoskill --skill attach-a-safer-probe-to-a-live-process","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-attach-a-safer-probe-to-a-live-process\u002FSKILL.md",true,[61,65,71],{"path":62,"resourceType":62,"resourceTypeDesc":63,"sizeBytes":64,"sourceHtmlUrl":16},"LICENSE","许可证",1063,{"path":66,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":69,"sourceHtmlUrl":70},"SOURCE.md","REFERENCE","参考文档",364,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-attach-a-safer-probe-to-a-live-process\u002FSOURCE.md",{"path":72,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":73,"sourceHtmlUrl":74},"TRUST.auto.yaml",2221,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-attach-a-safer-probe-to-a-live-process\u002FTRUST.auto.yaml",[76,104,127,145,158,168],{"skillNo":77,"name":78,"nameZh":6,"description":79,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":80,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":33},"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",[],[84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103],"performance","recipe performance","recipe","mm","sentry","harness","app","deterministic","recipes","flow","cold","critical","analysis","tasks","react","browser","layout","screen","network","metamask",{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":108,"licenseFileUrl":109,"sourceHtmlUrl":110,"categories":111,"keywords":112,"publishedAt":33},"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",[],[113,114,115,116,117,118,119,120,121,122,123,124,125,126],"mexc spot websocket","spot","websocket","api","workflows","public","listen","streams","depth","keys","for","api keys","maintenance","protobuf",{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":108,"licenseFileUrl":131,"sourceHtmlUrl":132,"categories":133,"keywords":134,"publishedAt":33},"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",[],[135,114,136,137,138,139,140,124,123,122,141,142,143,118,144,117,116],"mexc spot rest","REST","admin","signing","Wallet","requests","actions","secure","data","orders",{"skillNo":146,"name":147,"nameZh":6,"description":148,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":108,"licenseFileUrl":149,"sourceHtmlUrl":150,"categories":151,"keywords":152,"publishedAt":33},"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",[],[153,154,115,155,156,125,123,157,121,120,118,117],"mexc futures websocket","futures","position","ping","subscriptions",{"skillNo":159,"name":160,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":161,"sourceHtmlUrl":162,"categories":163,"keywords":164,"publishedAt":33},"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",[],[165,166,167],"refresh","0xklen version and refresh sanctions lists","version",{"skillNo":169,"name":170,"nameZh":6,"description":171,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":172,"sourceHtmlUrl":173,"categories":174,"keywords":175,"publishedAt":33},"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",[],[176,177,178,179,180,181,182,27,183,184,185],"tests","cover","verify tests cover changed lines","verify","coverage","pr","exercise","patch","code","share"]