[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6GYH5121BBCM7XM2HZY572P":3,"skill-same:01M6GYH5121BBCM7XM2HZY572P":72},{"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":30,"linkOnly":31,"markdownContent":32,"markdownBody":33,"frontMatter":34,"refName":35,"commitSha":36,"skillDirectory":37,"forksCount":38,"repositoryHtmlUrl":39,"repositoryHomepageUrl":6,"ownerHtmlUrl":40,"ownerBlogUrl":41,"ownerDescription":42,"updatedAt":43,"install":44,"resources":57},"01M6GYH5121BBCM7XM2HZY572P","enable-versioning-to-undo-deletes",null,"Use when a stray delete or overwrite has no recovery path. Turns on object versioning with a noncurrent-expiry so overwrites are reversible without unbounded growth.","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-enable-versioning-to-undo-deletes\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-enable-versioning-to-undo-deletes\u002FSKILL.md",[],[20,21,22,23,24,25,26,27,28,29],"versioning","enable versioning to undo deletes","delete","recovery","growth","use","with","object","path","when","2026-11-10 10:12:30",false,"---\nname: enable-versioning-to-undo-deletes\ndescription: Use when a stray delete or overwrite has no recovery path. Turns on object versioning with a noncurrent-expiry so overwrites are reversible without unbounded growth.\n---\n\n# Enable Versioning to Undo Deletes\n\nWithout versioning, an overwrite or `rm` is permanent and a bad deploy that rewrites every object is unrecoverable. Versioning keeps prior versions so a delete becomes a soft, reversible event — provided you cap how long noncurrent versions live.\n\n## Procedure\n\n1. Turn versioning on before you need it: `aws s3api put-bucket-versioning --bucket acme --versioning-configuration Status=Enabled`.\n2. Immediately add a `NoncurrentVersionExpiration` rule so old versions do not accumulate forever:\n   `{\"NoncurrentVersionExpiration\":{\"NoncurrentDays\":30}}`.\n3. For databases and filesystems, use the native equivalent: WAL + PITR for Postgres (`recovery_target_time`), ZFS\u002FBtrfs snapshots for files.\n4. Understand that a delete writes a delete-marker; the data is still there and recoverable by removing the marker:\n   `aws s3api delete-object --bucket acme --key path --version-id \u003Cdelete-marker-id>`.\n5. Recover a specific version: `aws s3api list-object-versions --bucket acme --prefix path` then `get-object --version-id`.\n6. Add MFA-delete or a bucket policy denying `DeleteObjectVersion` outside a break-glass role, so a compromise or script cannot purge history.\n7. Test the recovery: delete a test object, confirm the current listing hides it, restore the prior version, confirm content matches.\n8. Re-baseline storage cost after enabling; versioning multiplies stored bytes by the change rate within the retention window.\n\n## Pitfalls\n\n- Enabling versioning with no noncurrent expiry, so storage grows without bound and the cost alarm fires months later.\n- Believing versioning protects against a malicious actor who has `s3:DeleteObjectVersion` — it does not; lock the permission.\n- A lifecycle rule that deletes noncurrent versions after 1 day, which is too short to catch a slow-failing deploy's overwrites.\n- Confusing a delete-marker with the absence of the object; `list-objects` hides it but `list-object-versions` still shows the data.\n- Assuming versioning replicates to a bucket-replication target automatically; the target's versioning must be enabled too.\n- Enabling versioning on a bucket with a huge existing object count and no plan for the first-month cost of retained versions.\n- Forgetting that versioning changes ETag semantics and some SDK \"overwrite\" calls now leave the old bytes billed.\n\n## Verification\n\n    aws s3api get-bucket-versioning --bucket acme           # Status: Enabled\n    aws s3api list-object-versions --bucket acme --prefix test\u002Fkey \\\n      --query 'Versions[].VersionId' --output text | wc -w  # >1 after edits\n\nVersioning is Enabled, a prior version is retrievable by `--version-id`, and a `NoncurrentVersionExpiration` rule bounds retention.\n\nReport: \"Versioning enabled on \u003Cbucket> with 30d noncurrent expiry; recovered test\u002Fkey version \u003Cid>; delete now reversible within 30 days.\"\n","# Enable Versioning to Undo Deletes\n\nWithout versioning, an overwrite or `rm` is permanent and a bad deploy that rewrites every object is unrecoverable. Versioning keeps prior versions so a delete becomes a soft, reversible event — provided you cap how long noncurrent versions live.\n\n## Procedure\n\n1. Turn versioning on before you need it: `aws s3api put-bucket-versioning --bucket acme --versioning-configuration Status=Enabled`.\n2. Immediately add a `NoncurrentVersionExpiration` rule so old versions do not accumulate forever:\n   `{\"NoncurrentVersionExpiration\":{\"NoncurrentDays\":30}}`.\n3. For databases and filesystems, use the native equivalent: WAL + PITR for Postgres (`recovery_target_time`), ZFS\u002FBtrfs snapshots for files.\n4. Understand that a delete writes a delete-marker; the data is still there and recoverable by removing the marker:\n   `aws s3api delete-object --bucket acme --key path --version-id \u003Cdelete-marker-id>`.\n5. Recover a specific version: `aws s3api list-object-versions --bucket acme --prefix path` then `get-object --version-id`.\n6. Add MFA-delete or a bucket policy denying `DeleteObjectVersion` outside a break-glass role, so a compromise or script cannot purge history.\n7. Test the recovery: delete a test object, confirm the current listing hides it, restore the prior version, confirm content matches.\n8. Re-baseline storage cost after enabling; versioning multiplies stored bytes by the change rate within the retention window.\n\n## Pitfalls\n\n- Enabling versioning with no noncurrent expiry, so storage grows without bound and the cost alarm fires months later.\n- Believing versioning protects against a malicious actor who has `s3:DeleteObjectVersion` — it does not; lock the permission.\n- A lifecycle rule that deletes noncurrent versions after 1 day, which is too short to catch a slow-failing deploy's overwrites.\n- Confusing a delete-marker with the absence of the object; `list-objects` hides it but `list-object-versions` still shows the data.\n- Assuming versioning replicates to a bucket-replication target automatically; the target's versioning must be enabled too.\n- Enabling versioning on a bucket with a huge existing object count and no plan for the first-month cost of retained versions.\n- Forgetting that versioning changes ETag semantics and some SDK \"overwrite\" calls now leave the old bytes billed.\n\n## Verification\n\n    aws s3api get-bucket-versioning --bucket acme           # Status: Enabled\n    aws s3api list-object-versions --bucket acme --prefix test\u002Fkey \\\n      --query 'Versions[].VersionId' --output text | wc -w  # >1 after edits\n\nVersioning is Enabled, a prior version is retrievable by `--version-id`, and a `NoncurrentVersionExpiration` rule bounds retention.\n\nReport: \"Versioning enabled on \u003Cbucket> with 30d noncurrent expiry; recovered test\u002Fkey version \u003Cid>; delete now reversible within 30 days.\"\n",{"name":5,"description":7},"main","3df1d0d67b30ff15236561f8c0f9f06d33f42dfd","skills\u002Fpayments\u002F0xklen-enable-versioning-to-undo-deletes",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":45,"prompt":55,"zipAvailable":56},[46,49,52],{"tool":47,"command":48},"npx","npx skills add jiayaoqijia\u002Fcryptoskill --skill enable-versioning-to-undo-deletes",{"tool":50,"command":51},"bunx","bunx skills add jiayaoqijia\u002Fcryptoskill --skill enable-versioning-to-undo-deletes",{"tool":53,"command":54},"pnpm","pnpm dlx skills add jiayaoqijia\u002Fcryptoskill --skill enable-versioning-to-undo-deletes","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-enable-versioning-to-undo-deletes\u002FSKILL.md",true,[58,62,68],{"path":59,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":61,"sourceHtmlUrl":16},"LICENSE","许可证",1063,{"path":63,"resourceType":64,"resourceTypeDesc":65,"sizeBytes":66,"sourceHtmlUrl":67},"SOURCE.md","REFERENCE","参考文档",359,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-enable-versioning-to-undo-deletes\u002FSOURCE.md",{"path":69,"resourceType":64,"resourceTypeDesc":65,"sizeBytes":70,"sourceHtmlUrl":71},"TRUST.auto.yaml",2217,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-enable-versioning-to-undo-deletes\u002FTRUST.auto.yaml",[73,101,124,142,155,165],{"skillNo":74,"name":75,"nameZh":6,"description":76,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":77,"sourceHtmlUrl":78,"categories":79,"keywords":80,"publishedAt":30},"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",[],[81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100],"performance","recipe performance","recipe","mm","sentry","harness","app","deterministic","recipes","flow","cold","critical","analysis","tasks","react","browser","layout","screen","network","metamask",{"skillNo":102,"name":103,"nameZh":6,"description":104,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":105,"licenseFileUrl":106,"sourceHtmlUrl":107,"categories":108,"keywords":109,"publishedAt":30},"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",[],[110,111,112,113,114,115,116,117,118,119,120,121,122,123],"mexc spot websocket","spot","websocket","api","workflows","public","listen","streams","depth","keys","for","api keys","maintenance","protobuf",{"skillNo":125,"name":126,"nameZh":6,"description":127,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":105,"licenseFileUrl":128,"sourceHtmlUrl":129,"categories":130,"keywords":131,"publishedAt":30},"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",[],[132,111,133,134,135,136,137,121,120,119,138,139,140,115,141,114,113],"mexc spot rest","REST","admin","signing","Wallet","requests","actions","secure","data","orders",{"skillNo":143,"name":144,"nameZh":6,"description":145,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":105,"licenseFileUrl":146,"sourceHtmlUrl":147,"categories":148,"keywords":149,"publishedAt":30},"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",[],[150,151,112,152,153,122,120,154,118,117,115,114],"mexc futures websocket","futures","position","ping","subscriptions",{"skillNo":156,"name":157,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":158,"sourceHtmlUrl":159,"categories":160,"keywords":161,"publishedAt":30},"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",[],[162,163,164],"refresh","0xklen version and refresh sanctions lists","version",{"skillNo":166,"name":167,"nameZh":6,"description":168,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":169,"sourceHtmlUrl":170,"categories":171,"keywords":172,"publishedAt":30},"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",[],[173,174,175,176,177,178,179,25,180,181,182],"tests","cover","verify tests cover changed lines","verify","coverage","pr","exercise","patch","code","share"]