[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7ADJXSWV3SHE97HH5P01KZP":3,"skill-same:01M7ADJXSWV3SHE97HH5P01KZP":46},{"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":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":24,"commitSha":25,"skillDirectory":26,"forksCount":14,"repositoryHtmlUrl":27,"repositoryHomepageUrl":6,"ownerHtmlUrl":28,"ownerBlogUrl":29,"ownerDescription":30,"updatedAt":31,"install":32,"resources":45},"01M7ADJXSWV3SHE97HH5P01KZP","principle-make-operations-idempotent",null,"Apply when designing commands, lifecycle steps, or processing loops that run amid crashes, restarts, and retries. Converge to the same end state regardless of partial prior runs.","stepankuzmin\u002Fskills","stepankuzmin","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F533564?v=4","01M7ADH01MGRSMC0YNW589Q6CE","Stepan Kuzmin","01M7ADH02CTNTX4NFP4S5WVYT9",0,"MIT","https:\u002F\u002Fgithub.com\u002Fstepankuzmin\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fprinciple-make-operations-idempotent\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: principle-make-operations-idempotent\ndescription: \"Apply when designing commands, lifecycle steps, or processing loops that run amid crashes, restarts, and retries. Converge to the same end state regardless of partial prior runs.\"\n---\n\n# Make Operations Idempotent\n\nDesign operations so they converge to the correct state regardless of how many times they run or where they start from. Every state-mutating operation should answer: \"What happens if this runs twice? What happens if the previous run crashed halfway?\"\n\n**Why:** Commands, lifecycle operations, and processing loops run where crashes, restarts, and retries are normal. If partial state changes the next run's outcome, every restart becomes a debugging session.\n\n**The pattern:**\n- Convergent startup: scan for existing state, clean stale artifacts, adopt live sessions\n- Content-based cleanup: compare by content equivalence, not creation order\n- Self-healing locks: use PID-based stale lock detection\n- Idempotent scheduling: failed work respawns cleanly, fresh input regenerated after each cycle\n\n**The test:**\n1. What happens if this runs twice in a row?\n2. What happens if the previous run crashed at every possible point?\n3. Does re-execution converge to the same end state?\n\nIf any answer is \"it depends on what state was left behind,\" the operation needs a reconciliation step.\n","# Make Operations Idempotent\n\nDesign operations so they converge to the correct state regardless of how many times they run or where they start from. Every state-mutating operation should answer: \"What happens if this runs twice? What happens if the previous run crashed halfway?\"\n\n**Why:** Commands, lifecycle operations, and processing loops run where crashes, restarts, and retries are normal. If partial state changes the next run's outcome, every restart becomes a debugging session.\n\n**The pattern:**\n- Convergent startup: scan for existing state, clean stale artifacts, adopt live sessions\n- Content-based cleanup: compare by content equivalence, not creation order\n- Self-healing locks: use PID-based stale lock detection\n- Idempotent scheduling: failed work respawns cleanly, fresh input regenerated after each cycle\n\n**The test:**\n1. What happens if this runs twice in a row?\n2. What happens if the previous run crashed at every possible point?\n3. Does re-execution converge to the same end state?\n\nIf any answer is \"it depends on what state was left behind,\" the operation needs a reconciliation step.\n",{"name":5,"description":7},"main","7c3fa2c0275bcee7c1633a3ab6b0374e1a059b6e",".agents\u002Fskills\u002Fprinciple-make-operations-idempotent","https:\u002F\u002Fgithub.com\u002Fstepankuzmin\u002Fskills","https:\u002F\u002Fgithub.com\u002Fstepankuzmin","https:\u002F\u002Fstepankuzmin.com\u002F","Software Engineer at @Mapbox","2026-10-01 17:36:10",{"source":8,"skillName":5,"commands":33,"prompt":43,"zipAvailable":44},[34,37,40],{"tool":35,"command":36},"npx","npx skills add stepankuzmin\u002Fskills --skill principle-make-operations-idempotent",{"tool":38,"command":39},"bunx","bunx skills add stepankuzmin\u002Fskills --skill principle-make-operations-idempotent",{"tool":41,"command":42},"pnpm","pnpm dlx skills add stepankuzmin\u002Fskills --skill principle-make-operations-idempotent","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fstepankuzmin\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fprinciple-make-operations-idempotent\u002FSKILL.md",true,[],[47,54,61,68,75,82],{"skillNo":48,"name":49,"nameZh":6,"description":50,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":51,"categories":52,"keywords":53,"publishedAt":19},"01M7ADN40WWNARJK5XDNNY59MR","vendor-skill","Adapt an external skill into this marketplace, or review upstream changes to one already adapted. Use when asked to vendor, import, adapt, mirror, or update a skill from skills.sh, `npx skills add`, or any external GitHub skills repo, especially to work around Claude Code Web only allowing one marketplace per GitHub repo name.","https:\u002F\u002Fgithub.com\u002Fstepankuzmin\u002Fskills\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fvendor-skill\u002FSKILL.md",[],[],{"skillNo":55,"name":56,"nameZh":6,"description":57,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":58,"categories":59,"keywords":60,"publishedAt":19},"01M7ADMYB3AZ7CPMS9V6P48H61","why","Use when the user asks to investigate why code is built the way it is: 'why does X work this way', 'why we picked Y', design rationale, regressions, or postmortems. Not for explaining a single error or a quick question. Queries each available evidence source (git and PRs, issues, docs, team chat) in parallel, then returns a cited read on decisions and tradeoffs. Use how for runtime behavior.","https:\u002F\u002Fgithub.com\u002Fstepankuzmin\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fwhy\u002FSKILL.md",[],[],{"skillNo":62,"name":63,"nameZh":6,"description":64,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":65,"categories":66,"keywords":67,"publishedAt":19},"01M7ADMWR9QP2Q2G4D5ZEKPV8W","unslop","Cut AI tells from any writing. Must always apply.","https:\u002F\u002Fgithub.com\u002Fstepankuzmin\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Funslop\u002FSKILL.md",[],[],{"skillNo":69,"name":70,"nameZh":6,"description":71,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":72,"categories":73,"keywords":74,"publishedAt":19},"01M7ADMNW2S09DQBJ34JP7BBY7","uncomplect","Pressure-test a stateful system or replacement design through Rich Hickey's simplicity and complection, Greg Young's deletability, Ousterhout's deep modules, DDD boundaries, typed effects, and explicit lifecycle modeling. Use when the user asks \"what would Rich Hickey do\", \"optimize for deletion\", \"make this simpler\", \"define this error out of existence\", \"review this state machine\", \"design it twice\", or wants to replace a working prototype without preserving its accidental architecture.","https:\u002F\u002Fgithub.com\u002Fstepankuzmin\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Funcomplect\u002FSKILL.md",[],[],{"skillNo":76,"name":77,"nameZh":6,"description":78,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":81,"publishedAt":19},"01M7ADMJMJ8M5PGK63N0GQ5B59","typescript-best-practices","TypeScript best practices. Use when reading or editing any .ts or .tsx file.","https:\u002F\u002Fgithub.com\u002Fstepankuzmin\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Ftypescript-best-practices\u002FSKILL.md",[],[],{"skillNo":83,"name":84,"nameZh":6,"description":85,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":88,"publishedAt":19},"01M7ADMER5KTJPY8J7M8MTP6WA","technical-writing","Layered technical-writing standard: Diátaxis structure, Google developer style sentences, STE instruction rules, Global English syntax. Use for \u002Ftechnical-writing or when writing or reviewing docs, RFCs, readmes, PR descriptions, or commit messages.","https:\u002F\u002Fgithub.com\u002Fstepankuzmin\u002Fskills\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Ftechnical-writing\u002FSKILL.md",[],[]]