[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6H132FETE3ZQYVJD0QFPJFD":3,"skill-same:01M6H132FETE3ZQYVJD0QFPJFD":78},{"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":36,"linkOnly":37,"markdownContent":38,"markdownBody":39,"frontMatter":40,"refName":41,"commitSha":42,"skillDirectory":43,"forksCount":44,"repositoryHtmlUrl":45,"repositoryHomepageUrl":6,"ownerHtmlUrl":46,"ownerBlogUrl":47,"ownerDescription":48,"updatedAt":49,"install":50,"resources":63},"01M6H132FETE3ZQYVJD0QFPJFD","write-a-sunset-plan-for-a-feature",null,"Use when retiring a feature, endpoint, or product. Plans the deprecation notice, the migration path, the data disposition, and the removal date so users are not stranded.","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-write-a-sunset-plan-for-a-feature\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-write-a-sunset-plan-for-a-feature\u002FSKILL.md",[],[20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35],"plan","write","feature","for","write a sunset plan for a feature","product","data","endpoint","use","migration","plans","notice","users","path","deprecation","when","2026-11-10 10:12:30",false,"---\nname: write-a-sunset-plan-for-a-feature\ndescription: Use when retiring a feature, endpoint, or product. Plans the deprecation notice, the migration path, the data disposition, and the removal date so users are not stranded.\n---\n\n# Write a sunset plan for a feature\n\nRemoving something is a product change, not a cleanup. This skill plans the notice, the migration, and the data handling so a sunset does not become an incident.\n\n## Procedure\n\n1. Inventory who uses it: query the telemetry (`events.md`) or access logs for the last 90 days, and list the distinct accounts, not just the request count.\n2. Classify users: `no usage`, `light`, `heavy`, and `automated` (bots, integrations); each needs a different migration message.\n3. Pick the removal date with margin, and a freeze date after which no new usage is allowed; put both in `sunset.md`.\n4. Write the notice with the three facts a user needs: what ends, when it ends, and the exact replacement with a link.\n5. Define the migration path: an export, a redirect, a new endpoint, or a documented manual step. Test it end-to-end on a real account.\n6. Decide data disposition: export to the user, retain under policy, or delete — with the retention rule and deletion method named, never \"clean up later\".\n7. Set the escalation path for stragglers: who contacts heavy users directly, and by what date before removal.\n8. Stage the removal: return `410 Gone` (or the platform equivalent) before physically deleting, so callers get a clear signal, not a 404.\n9. After removal, confirm no traffic remains in the logs, then delete the code, the config, and the docs.\n10. Confirm the replacement actually covers the use cases the old feature supported, not just the common one.\n11. Give the removal its own monitoring window, watching for calls from callers you did not inventory.\n\n12. Send at least two reminders before the freeze date, spaced so a vacation does not swallow them.\n\n## Pitfalls\n\n- Removing an API used by a partner's cron nobody told you about; check for automated callers first.\n- Emailing only the admin, not the integration owner who actually calls it.\n- A deprecation date with no migration tooling, leaving users to hand-port data.\n- Deleting data the user was entitled to export under a retention policy.\n- Leaving a 404 where a 410 and a message belong, which reads as a breakage.\n- Announcing the sunset after disabling the endpoint, which strands users with no warning.\n- Assuming a redirect is a drop-in replacement when the payload shapes differ.\n\n- Removing docs before the code, so stragglers have nowhere to read the migration path.\n\n## Verification\n\n    grep -c 'users:\\|date:\\|replacement:' sunset.md; grep -cE '410|redirect|export' sunset.md\n\nReport the distinct-user count, the removal date, and the migration path with its tested status.\n","# Write a sunset plan for a feature\n\nRemoving something is a product change, not a cleanup. This skill plans the notice, the migration, and the data handling so a sunset does not become an incident.\n\n## Procedure\n\n1. Inventory who uses it: query the telemetry (`events.md`) or access logs for the last 90 days, and list the distinct accounts, not just the request count.\n2. Classify users: `no usage`, `light`, `heavy`, and `automated` (bots, integrations); each needs a different migration message.\n3. Pick the removal date with margin, and a freeze date after which no new usage is allowed; put both in `sunset.md`.\n4. Write the notice with the three facts a user needs: what ends, when it ends, and the exact replacement with a link.\n5. Define the migration path: an export, a redirect, a new endpoint, or a documented manual step. Test it end-to-end on a real account.\n6. Decide data disposition: export to the user, retain under policy, or delete — with the retention rule and deletion method named, never \"clean up later\".\n7. Set the escalation path for stragglers: who contacts heavy users directly, and by what date before removal.\n8. Stage the removal: return `410 Gone` (or the platform equivalent) before physically deleting, so callers get a clear signal, not a 404.\n9. After removal, confirm no traffic remains in the logs, then delete the code, the config, and the docs.\n10. Confirm the replacement actually covers the use cases the old feature supported, not just the common one.\n11. Give the removal its own monitoring window, watching for calls from callers you did not inventory.\n\n12. Send at least two reminders before the freeze date, spaced so a vacation does not swallow them.\n\n## Pitfalls\n\n- Removing an API used by a partner's cron nobody told you about; check for automated callers first.\n- Emailing only the admin, not the integration owner who actually calls it.\n- A deprecation date with no migration tooling, leaving users to hand-port data.\n- Deleting data the user was entitled to export under a retention policy.\n- Leaving a 404 where a 410 and a message belong, which reads as a breakage.\n- Announcing the sunset after disabling the endpoint, which strands users with no warning.\n- Assuming a redirect is a drop-in replacement when the payload shapes differ.\n\n- Removing docs before the code, so stragglers have nowhere to read the migration path.\n\n## Verification\n\n    grep -c 'users:\\|date:\\|replacement:' sunset.md; grep -cE '410|redirect|export' sunset.md\n\nReport the distinct-user count, the removal date, and the migration path with its tested status.\n",{"name":5,"description":7},"main","3df1d0d67b30ff15236561f8c0f9f06d33f42dfd","skills\u002Fpayments\u002F0xklen-write-a-sunset-plan-for-a-feature",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-13 02:31:19",{"source":8,"skillName":5,"commands":51,"prompt":61,"zipAvailable":62},[52,55,58],{"tool":53,"command":54},"npx","npx skills add jiayaoqijia\u002Fcryptoskill --skill write-a-sunset-plan-for-a-feature",{"tool":56,"command":57},"bunx","bunx skills add jiayaoqijia\u002Fcryptoskill --skill write-a-sunset-plan-for-a-feature",{"tool":59,"command":60},"pnpm","pnpm dlx skills add jiayaoqijia\u002Fcryptoskill --skill write-a-sunset-plan-for-a-feature","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-write-a-sunset-plan-for-a-feature\u002FSKILL.md",true,[64,68,74],{"path":65,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":67,"sourceHtmlUrl":16},"LICENSE","许可证",1063,{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},"SOURCE.md","REFERENCE","参考文档",359,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-write-a-sunset-plan-for-a-feature\u002FSOURCE.md",{"path":75,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":76,"sourceHtmlUrl":77},"TRUST.auto.yaml",2217,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-write-a-sunset-plan-for-a-feature\u002FTRUST.auto.yaml",[79,107,129,146,159,169],{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":83,"sourceHtmlUrl":84,"categories":85,"keywords":86,"publishedAt":36},"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",[],[87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106],"performance","recipe performance","recipe","mm","sentry","harness","app","deterministic","recipes","flow","cold","critical","analysis","tasks","react","browser","layout","screen","network","metamask",{"skillNo":108,"name":109,"nameZh":6,"description":110,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":111,"licenseFileUrl":112,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":36},"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",[],[116,117,118,119,120,121,122,123,124,125,23,126,127,128],"mexc spot websocket","spot","websocket","api","workflows","public","listen","streams","depth","keys","api keys","maintenance","protobuf",{"skillNo":130,"name":131,"nameZh":6,"description":132,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":111,"licenseFileUrl":133,"sourceHtmlUrl":134,"categories":135,"keywords":136,"publishedAt":36},"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",[],[137,117,138,139,140,141,142,126,23,125,143,144,26,121,145,120,119],"mexc spot rest","REST","admin","signing","Wallet","requests","actions","secure","orders",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":111,"licenseFileUrl":150,"sourceHtmlUrl":151,"categories":152,"keywords":153,"publishedAt":36},"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",[],[154,155,118,156,157,127,23,158,124,123,121,120],"mexc futures websocket","futures","position","ping","subscriptions",{"skillNo":160,"name":161,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":162,"sourceHtmlUrl":163,"categories":164,"keywords":165,"publishedAt":36},"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",[],[166,167,168],"refresh","0xklen version and refresh sanctions lists","version",{"skillNo":170,"name":171,"nameZh":6,"description":172,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":173,"sourceHtmlUrl":174,"categories":175,"keywords":176,"publishedAt":36},"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",[],[177,178,179,180,181,182,183,28,184,185,186],"tests","cover","verify tests cover changed lines","verify","coverage","pr","exercise","patch","code","share"]