[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6H0D419ZDX65Z7676YR7F2C":3,"skill-same:01M6H0D419ZDX65Z7676YR7F2C":73},{"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":31,"linkOnly":32,"markdownContent":33,"markdownBody":34,"frontMatter":35,"refName":36,"commitSha":37,"skillDirectory":38,"forksCount":39,"repositoryHtmlUrl":40,"repositoryHomepageUrl":6,"ownerHtmlUrl":41,"ownerBlogUrl":42,"ownerDescription":43,"updatedAt":44,"install":45,"resources":58},"01M6H0D419ZDX65Z7676YR7F2C","silent-failure-detection",null,"Use when a command may exit 0 without doing its job, or when a tool reports success but the effect is unverified. Asserts the intended effect on the artefact, not merely the exit status.","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-silent-failure-detection\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-silent-failure-detection\u002FSKILL.md",[],[20,21,22,23,24,25,26,27,28,29,30],"detection","silent failure detection","status","tool","effect","command","use","reports","exit","but","when","2026-11-10 10:12:30",false,"---\nname: silent-failure-detection\ndescription: Use when a command may exit 0 without doing its job, or when a tool reports success but the effect is unverified. Asserts the intended effect on the artefact, not merely the exit status.\n---\n\n# Silent Failure Detection\n\nExit code 0 means the program finished, not that it worked. Assert the effect you wanted on the real artefact; a green checkmark on an empty result is the classic silent failure.\n\n## Procedure\n\n1. Turn on strict shell behaviour for any step that must not silently miss: `set -euo pipefail` at the top of scripts.\n2. Assert the artefact, not the status. After a write, check it exists and is non-empty: `test -s out.json || { echo \"empty output\"; exit 1; }`.\n3. After an upsert or count-changing operation, compare before\u002Fafter counts and fail if unchanged when it should have changed: `[ \"$after\" -gt \"$before\" ] || exit 1`.\n4. Never treat \"no output\" as success. An empty `grep` means either no match or a bad pattern; print the count explicitly and branch on it: `n=$(grep -c \"ERROR\" app.log || true); [ \"$n\" -gt 0 ] && ...`.\n5. Check stderr even when the exit code is 0. Many tools print the real error to stderr and still exit 0: capture and inspect it (`2>err.txt; test ! -s err.txt || cat err.txt`).\n6. For HTTP work, assert the body\u002Fparse, not just the status: a 200 that returns an error page or `{\"error\": ...}` is a failure. Validate a field exists: `jq -e '.results | length > 0' resp.json`.\n7. For find\u002Fglob\u002Floop steps, assert the input set was non-empty before iterating; a loop over zero items \"succeeds\" while doing nothing.\n8. For pipelines, know that `set -o pipefail` catches a failing earlier stage whose success masked a crash.\n9. Record the assertion's evidence (the count, the byte size, the parsed field) in the workspace so the check is auditable.\n10. For each critical step, name the one number that proves it worked (row count, byte size, parsed field) and assert it.\n11. Assert the input set was non-empty before a loop or map, so zero items is a failure rather than a success.\n12. Hash the artefact when a transform should change it: `shasum -a 256 before.bin after.bin` must differ.\n\n## Pitfalls\n\n- Reporting \"tests passed\" when the runner collected 0 tests.\n- `find src -name '*.ts' | xargs tsc` passing because the glob matched nothing.\n- A fetch that returns a login\u002Ferror HTML page with HTTP 200, parsed as if it were data.\n- Ignoring stderr because the exit code was 0, missing a warning that foreshadows data loss.\n- A migration that \"ran\" but affected 0 rows because the WHERE clause matched nothing.\n- A test runner reporting success while collecting zero tests, because the glob matched nothing.\n- Grepping for a success string that also appears in an error message, so failures read as passes.\n\n## Verification\n\n    test -s out.json && jq -e '.results|length>0' out.json >\u002Fdev\u002Fnull && echo OK\n    # passes only when the artefact exists, is non-empty, and contains real results\n\nReport to the user: for each critical step, the effect assertion run and its observed value (count, size, parsed field), not just the exit code.\n","# Silent Failure Detection\n\nExit code 0 means the program finished, not that it worked. Assert the effect you wanted on the real artefact; a green checkmark on an empty result is the classic silent failure.\n\n## Procedure\n\n1. Turn on strict shell behaviour for any step that must not silently miss: `set -euo pipefail` at the top of scripts.\n2. Assert the artefact, not the status. After a write, check it exists and is non-empty: `test -s out.json || { echo \"empty output\"; exit 1; }`.\n3. After an upsert or count-changing operation, compare before\u002Fafter counts and fail if unchanged when it should have changed: `[ \"$after\" -gt \"$before\" ] || exit 1`.\n4. Never treat \"no output\" as success. An empty `grep` means either no match or a bad pattern; print the count explicitly and branch on it: `n=$(grep -c \"ERROR\" app.log || true); [ \"$n\" -gt 0 ] && ...`.\n5. Check stderr even when the exit code is 0. Many tools print the real error to stderr and still exit 0: capture and inspect it (`2>err.txt; test ! -s err.txt || cat err.txt`).\n6. For HTTP work, assert the body\u002Fparse, not just the status: a 200 that returns an error page or `{\"error\": ...}` is a failure. Validate a field exists: `jq -e '.results | length > 0' resp.json`.\n7. For find\u002Fglob\u002Floop steps, assert the input set was non-empty before iterating; a loop over zero items \"succeeds\" while doing nothing.\n8. For pipelines, know that `set -o pipefail` catches a failing earlier stage whose success masked a crash.\n9. Record the assertion's evidence (the count, the byte size, the parsed field) in the workspace so the check is auditable.\n10. For each critical step, name the one number that proves it worked (row count, byte size, parsed field) and assert it.\n11. Assert the input set was non-empty before a loop or map, so zero items is a failure rather than a success.\n12. Hash the artefact when a transform should change it: `shasum -a 256 before.bin after.bin` must differ.\n\n## Pitfalls\n\n- Reporting \"tests passed\" when the runner collected 0 tests.\n- `find src -name '*.ts' | xargs tsc` passing because the glob matched nothing.\n- A fetch that returns a login\u002Ferror HTML page with HTTP 200, parsed as if it were data.\n- Ignoring stderr because the exit code was 0, missing a warning that foreshadows data loss.\n- A migration that \"ran\" but affected 0 rows because the WHERE clause matched nothing.\n- A test runner reporting success while collecting zero tests, because the glob matched nothing.\n- Grepping for a success string that also appears in an error message, so failures read as passes.\n\n## Verification\n\n    test -s out.json && jq -e '.results|length>0' out.json >\u002Fdev\u002Fnull && echo OK\n    # passes only when the artefact exists, is non-empty, and contains real results\n\nReport to the user: for each critical step, the effect assertion run and its observed value (count, size, parsed field), not just the exit code.\n",{"name":5,"description":7},"main","3df1d0d67b30ff15236561f8c0f9f06d33f42dfd","skills\u002Fpayments\u002F0xklen-silent-failure-detection",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":46,"prompt":56,"zipAvailable":57},[47,50,53],{"tool":48,"command":49},"npx","npx skills add jiayaoqijia\u002Fcryptoskill --skill silent-failure-detection",{"tool":51,"command":52},"bunx","bunx skills add jiayaoqijia\u002Fcryptoskill --skill silent-failure-detection",{"tool":54,"command":55},"pnpm","pnpm dlx skills add jiayaoqijia\u002Fcryptoskill --skill silent-failure-detection","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-silent-failure-detection\u002FSKILL.md",true,[59,63,69],{"path":60,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":62,"sourceHtmlUrl":16},"LICENSE","许可证",1063,{"path":64,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":67,"sourceHtmlUrl":68},"SOURCE.md","REFERENCE","参考文档",350,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-silent-failure-detection\u002FSOURCE.md",{"path":70,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":71,"sourceHtmlUrl":72},"TRUST.auto.yaml",2224,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-silent-failure-detection\u002FTRUST.auto.yaml",[74,102,125,143,156,166],{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":78,"sourceHtmlUrl":79,"categories":80,"keywords":81,"publishedAt":31},"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",[],[82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101],"performance","recipe performance","recipe","mm","sentry","harness","app","deterministic","recipes","flow","cold","critical","analysis","tasks","react","browser","layout","screen","network","metamask",{"skillNo":103,"name":104,"nameZh":6,"description":105,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":106,"licenseFileUrl":107,"sourceHtmlUrl":108,"categories":109,"keywords":110,"publishedAt":31},"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",[],[111,112,113,114,115,116,117,118,119,120,121,122,123,124],"mexc spot websocket","spot","websocket","api","workflows","public","listen","streams","depth","keys","for","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":106,"licenseFileUrl":129,"sourceHtmlUrl":130,"categories":131,"keywords":132,"publishedAt":31},"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,112,134,135,136,137,138,122,121,120,139,140,141,116,142,115,114],"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":106,"licenseFileUrl":147,"sourceHtmlUrl":148,"categories":149,"keywords":150,"publishedAt":31},"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,113,153,154,123,121,155,119,118,116,115],"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":31},"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":31},"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,177,178,179,180,26,181,182,183],"tests","cover","verify tests cover changed lines","verify","coverage","pr","exercise","patch","code","share"]