[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7ABNERXHH3Q2AC0RYKQHZP0":3,"skill-same:01M7ABNERXHH3Q2AC0RYKQHZP0":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":28,"ownerHtmlUrl":29,"ownerBlogUrl":30,"ownerDescription":6,"updatedAt":31,"install":32,"resources":45},"01M7ABNERXHH3Q2AC0RYKQHZP0","write-plan",null,"Write an implementation plan. Use when the behavior is settled and how to build or fix it is open — a pinned cause, settled spec, hunt finding, or review comment. Not for deciding the behavior (write-specs) or multi-session work (frontier).","j0hanz\u002Fj0hanz-marketplace","j0hanz","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F159924955?v=4","01M7ABFK415CKHXYV9GZRJ16T7","Linus Johansson","01M7ABFK52FCPP2PNBH1YR7ZPA",0,"MIT","https:\u002F\u002Fgithub.com\u002Fj0hanz\u002Fj0hanz-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fworkbench\u002Fskills\u002Fwrite-plan\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: write-plan\ndescription: Write an implementation plan. Use when the behavior is settled and how to build or fix it is open — a pinned cause, settled spec, hunt finding, or review comment. Not for deciding the behavior (write-specs) or multi-session work (frontier).\n---\n\n# Write Plan\n\nIt is read by a **cold executor**: a session with no memory of yours, possibly a cheaper model.\n\nThree properties make a plan executable by that reader:\n\n1. **Self-contained** — every path, excerpt, convention, and command is in the file. \"As discussed above\" is a broken plan.\n2. **Gated** — each step ends in a command with an expected result, so the executor never has to _judge_ whether it worked.\n3. **Bounded** — an explicit out-of-scope list, and STOP conditions that end the run.\n\n## Steps\n\n### 1. Recon\n\nOpen every file the plan will name. Fan out [research](..\u002Fresearch\u002FSKILL.md) when the change touches more files than you can open in one pass — it maps callers and conventions while you route, and you still open what the plan names. Run every command it will cite — guessed commands are the most common way a plan dies on contact. Record `git rev-parse --short HEAD`. Note the conventions the change must match, each with one exemplar file to imitate.\n\n**Done when** every path, symbol, and command destined for the plan has been verified against the repo, every convention the change must match has a linked exemplar file to imitate, and the SHA is recorded.\n\n### 2. Route\n\nOrder the steps so the build stays passing between them — e.g., add the new path, switch the callers, then delete the old one. Where the change spans layers, make the first step a thin **vertical slice** and widen from there. Tests are steps, not a wish at the end — a step that adds behavior is worked test-first by [tdd](..\u002Ftdd\u002FSKILL.md), so its Verify command is the suite.\n\n**Done when** each step verifies on its own, and the step list reads in that order — every new path added before the caller switch, every caller switch before the deletion.\n\n### 3. Write, then read it cold\n\nFill the template, then reread it as the executor. Wherever you filled a gap from memory, inline the missing fact.\n\n**Done when** every **Current state** excerpt has been re-opened at its `file:line` and matched, every step is Gated, every file and symbol mention is a working relative link, every out-of-scope file is listed with a reason touching it is wrong, each STOP condition names a risk specific to this change, and every Verify and Done command has been run once and resolves (no command-not-found, unknown script, bad flag, or missing path), with its expected output naming the state after the step, not the state today.\n\n## Referencing\n\nEvery file, line, and symbol the plan names is a link, so the executor opens it instead of searching for it. A plan lives beside its spec as `\u003Cname>.plan.md`, under the [referencing convention](..\u002Fwrite-specs\u002FSKILL.md#referencing) — paths relative to the plan file.\n\n```markdown\nfile [`src\u002Flib\u002Fdb.ts`](..\u002F..\u002F..\u002Fsrc\u002Flib\u002Fdb.ts)\nline [`db.ts:42`](..\u002F..\u002F..\u002Fsrc\u002Flib\u002Fdb.ts#L42)\nrange [`db.ts:40-60`](..\u002F..\u002F..\u002Fsrc\u002Flib\u002Fdb.ts#L40-L60)\nsymbol [`Pool.acquire()`](..\u002F..\u002F..\u002Fsrc\u002Flib\u002Fdb.ts#L40)\nrequirement [`R2`](\u003Cname>.spec.md#requirements)\nsibling spec [`\u003Cname>.spec.md`](\u003Cname>.spec.md)\n```\n\nCommands, flags, patterns, and expected output stay in plain backticks — nothing to open.\n\n## Template\n\n```markdown\n# Plan: \u003Cimperative title — what is true once this lands>\n\n> **Executor rules**: work the steps in order. Run every Verify command and\n> confirm its expected result before moving on. On any STOP condition, stop and\n> report the condition, the step, and the evidence.\n>\n> **Written against** commit `\u003Cshort SHA>`, \u003CYYYY-MM-DD>.\n> **Drift check (run first)**: `git diff --stat \u003CSHA>..HEAD -- \u003Cin-scope paths>`\n> Its file list is what narrows the excerpt match: compare\n> [Current state](#current-state) against the live code for every file it flags.\n> A mismatch is a [STOP](#stop) condition.\n\n## Goal\n\n2–5 sentences: the problem, its concrete cost, what improves when this lands.\nRequirements covered: [`R2`](\u003Cname>.spec.md#requirements), [`R5`](\u003Cname>.spec.md#requirements)\n— or \"none, this is a fix\".\n\n## Current state\n\nThe facts, inlined — every excerpt readable without opening another document:\n\n- [`\u003Cpath>`](\u003Crel-path>#L10-L40) — its role here, and the lines that matter\n- Short excerpts as the code exists today, each headed by its linked\n  `file:line`, enough that the executor can confirm it is looking at the right\n  thing\n- Each convention to match, with its linked exemplar: \"errors follow the\n  pattern in [`result.ts:12-30`](\u003Crel-path>#L12-L30)\"\n- Any decided constraint from a spec or ADR, quoted, with the source linked —\n  the executor has not read those documents\n\n## Commands\n\n| Purpose   | Command | Expected on success |\n| --------- | ------- | ------------------- |\n| Typecheck | `\u003Ccmd>` | exit 0, no errors   |\n| Tests     | `\u003Ccmd>` | all pass            |\n\n## Scope\n\n**In scope** — the only files to modify:\n\n- [`\u003Cpath>`](rel-path)\n\n**Files out of scope** — leave alone even though they look related:\n\n- [`\u003Cpath>`](rel-path) — \u003Cwhy touching it is wrong>\n\n## Steps\n\n### 1. \u003Cimperative title>\n\nExactly what to do, with every file and symbol linked. Include the target shape\nwhere it is load-bearing — the pattern to produce, not every line.\n\n**Verify**: `\u003Ccommand>` → `\u003Cexpected output>`\n\n### 2. …\n\n## Done\n\nMachine-checkable. All must hold:\n\n- [ ] `\u003Ctypecheck cmd>` exits 0\n- [ ] `\u003Ctest cmd>` exits 0, including the new tests for \u003Ccase>\n- [ ] `git status` shows no files outside the in-scope list\n\n## STOP\n\nStop and report if:\n\n- The code at a [Current state](#current-state) location does not match its\n  excerpt.\n- A step's verification fails twice after one fix attempt — a second failure\n  means the step's assumption is wrong, not its implementation.\n- The fix appears to require an out-of-scope file.\n- \u003Cthe key assumption this plan rests on> turns out to be false.\n\n## Notes\n\n- What a reviewer should scrutinize, and anything deliberately deferred.\n- Rollback, as commands — for migrations, deletions, and production data only.\n```\n\n## Sizing\n\nThe full template is the default. For a change touching at most two files with no ordering constraint, drop Commands and Notes and keep every other section: run-plan's Orient runs the header's Drift check, its Stopping reads STOP, and Done's last box checks Scope. With no Commands table to fall back on, every step carries its own Verify line.\n\n## Secrets\n\nSecrets never appear in a plan: reference `file:line` and the credential type, and recommend rotation.\n\n## Handing off\n\nThe plan is written, not trusted. Hand it to\n[plan-hunt](..\u002Fplan-hunt\u002FSKILL.md) — a blind refuter kills dead steps cheaper\nthan run-plan discovers them. A plan of at most two steps against files this\nsession already read may go straight to [run-plan](..\u002Frun-plan\u002FSKILL.md); say\nwhich route you took and why.\n\nA plan comes back from plan-hunt with a `\u003Cname>.plan-hunt.md` report when the hunt confirmed a finding. Revise it rather than rewriting it: fix each step or section a Confirmed finding names, re-run [Recon](#1-recon) for the files those fixes touch, update **Written against** if HEAD moved, and hand the plan to plan-hunt again. A Suspected finding is a check, not a fix: run its **Settles it** check, and change the step only if the check fails.\n","# Write Plan\n\nIt is read by a **cold executor**: a session with no memory of yours, possibly a cheaper model.\n\nThree properties make a plan executable by that reader:\n\n1. **Self-contained** — every path, excerpt, convention, and command is in the file. \"As discussed above\" is a broken plan.\n2. **Gated** — each step ends in a command with an expected result, so the executor never has to _judge_ whether it worked.\n3. **Bounded** — an explicit out-of-scope list, and STOP conditions that end the run.\n\n## Steps\n\n### 1. Recon\n\nOpen every file the plan will name. Fan out [research](..\u002Fresearch\u002FSKILL.md) when the change touches more files than you can open in one pass — it maps callers and conventions while you route, and you still open what the plan names. Run every command it will cite — guessed commands are the most common way a plan dies on contact. Record `git rev-parse --short HEAD`. Note the conventions the change must match, each with one exemplar file to imitate.\n\n**Done when** every path, symbol, and command destined for the plan has been verified against the repo, every convention the change must match has a linked exemplar file to imitate, and the SHA is recorded.\n\n### 2. Route\n\nOrder the steps so the build stays passing between them — e.g., add the new path, switch the callers, then delete the old one. Where the change spans layers, make the first step a thin **vertical slice** and widen from there. Tests are steps, not a wish at the end — a step that adds behavior is worked test-first by [tdd](..\u002Ftdd\u002FSKILL.md), so its Verify command is the suite.\n\n**Done when** each step verifies on its own, and the step list reads in that order — every new path added before the caller switch, every caller switch before the deletion.\n\n### 3. Write, then read it cold\n\nFill the template, then reread it as the executor. Wherever you filled a gap from memory, inline the missing fact.\n\n**Done when** every **Current state** excerpt has been re-opened at its `file:line` and matched, every step is Gated, every file and symbol mention is a working relative link, every out-of-scope file is listed with a reason touching it is wrong, each STOP condition names a risk specific to this change, and every Verify and Done command has been run once and resolves (no command-not-found, unknown script, bad flag, or missing path), with its expected output naming the state after the step, not the state today.\n\n## Referencing\n\nEvery file, line, and symbol the plan names is a link, so the executor opens it instead of searching for it. A plan lives beside its spec as `\u003Cname>.plan.md`, under the [referencing convention](..\u002Fwrite-specs\u002FSKILL.md#referencing) — paths relative to the plan file.\n\n```markdown\nfile [`src\u002Flib\u002Fdb.ts`](..\u002F..\u002F..\u002Fsrc\u002Flib\u002Fdb.ts)\nline [`db.ts:42`](..\u002F..\u002F..\u002Fsrc\u002Flib\u002Fdb.ts#L42)\nrange [`db.ts:40-60`](..\u002F..\u002F..\u002Fsrc\u002Flib\u002Fdb.ts#L40-L60)\nsymbol [`Pool.acquire()`](..\u002F..\u002F..\u002Fsrc\u002Flib\u002Fdb.ts#L40)\nrequirement [`R2`](\u003Cname>.spec.md#requirements)\nsibling spec [`\u003Cname>.spec.md`](\u003Cname>.spec.md)\n```\n\nCommands, flags, patterns, and expected output stay in plain backticks — nothing to open.\n\n## Template\n\n```markdown\n# Plan: \u003Cimperative title — what is true once this lands>\n\n> **Executor rules**: work the steps in order. Run every Verify command and\n> confirm its expected result before moving on. On any STOP condition, stop and\n> report the condition, the step, and the evidence.\n>\n> **Written against** commit `\u003Cshort SHA>`, \u003CYYYY-MM-DD>.\n> **Drift check (run first)**: `git diff --stat \u003CSHA>..HEAD -- \u003Cin-scope paths>`\n> Its file list is what narrows the excerpt match: compare\n> [Current state](#current-state) against the live code for every file it flags.\n> A mismatch is a [STOP](#stop) condition.\n\n## Goal\n\n2–5 sentences: the problem, its concrete cost, what improves when this lands.\nRequirements covered: [`R2`](\u003Cname>.spec.md#requirements), [`R5`](\u003Cname>.spec.md#requirements)\n— or \"none, this is a fix\".\n\n## Current state\n\nThe facts, inlined — every excerpt readable without opening another document:\n\n- [`\u003Cpath>`](\u003Crel-path>#L10-L40) — its role here, and the lines that matter\n- Short excerpts as the code exists today, each headed by its linked\n  `file:line`, enough that the executor can confirm it is looking at the right\n  thing\n- Each convention to match, with its linked exemplar: \"errors follow the\n  pattern in [`result.ts:12-30`](\u003Crel-path>#L12-L30)\"\n- Any decided constraint from a spec or ADR, quoted, with the source linked —\n  the executor has not read those documents\n\n## Commands\n\n| Purpose   | Command | Expected on success |\n| --------- | ------- | ------------------- |\n| Typecheck | `\u003Ccmd>` | exit 0, no errors   |\n| Tests     | `\u003Ccmd>` | all pass            |\n\n## Scope\n\n**In scope** — the only files to modify:\n\n- [`\u003Cpath>`](rel-path)\n\n**Files out of scope** — leave alone even though they look related:\n\n- [`\u003Cpath>`](rel-path) — \u003Cwhy touching it is wrong>\n\n## Steps\n\n### 1. \u003Cimperative title>\n\nExactly what to do, with every file and symbol linked. Include the target shape\nwhere it is load-bearing — the pattern to produce, not every line.\n\n**Verify**: `\u003Ccommand>` → `\u003Cexpected output>`\n\n### 2. …\n\n## Done\n\nMachine-checkable. All must hold:\n\n- [ ] `\u003Ctypecheck cmd>` exits 0\n- [ ] `\u003Ctest cmd>` exits 0, including the new tests for \u003Ccase>\n- [ ] `git status` shows no files outside the in-scope list\n\n## STOP\n\nStop and report if:\n\n- The code at a [Current state](#current-state) location does not match its\n  excerpt.\n- A step's verification fails twice after one fix attempt — a second failure\n  means the step's assumption is wrong, not its implementation.\n- The fix appears to require an out-of-scope file.\n- \u003Cthe key assumption this plan rests on> turns out to be false.\n\n## Notes\n\n- What a reviewer should scrutinize, and anything deliberately deferred.\n- Rollback, as commands — for migrations, deletions, and production data only.\n```\n\n## Sizing\n\nThe full template is the default. For a change touching at most two files with no ordering constraint, drop Commands and Notes and keep every other section: run-plan's Orient runs the header's Drift check, its Stopping reads STOP, and Done's last box checks Scope. With no Commands table to fall back on, every step carries its own Verify line.\n\n## Secrets\n\nSecrets never appear in a plan: reference `file:line` and the credential type, and recommend rotation.\n\n## Handing off\n\nThe plan is written, not trusted. Hand it to\n[plan-hunt](..\u002Fplan-hunt\u002FSKILL.md) — a blind refuter kills dead steps cheaper\nthan run-plan discovers them. A plan of at most two steps against files this\nsession already read may go straight to [run-plan](..\u002Frun-plan\u002FSKILL.md); say\nwhich route you took and why.\n\nA plan comes back from plan-hunt with a `\u003Cname>.plan-hunt.md` report when the hunt confirmed a finding. Revise it rather than rewriting it: fix each step or section a Confirmed finding names, re-run [Recon](#1-recon) for the files those fixes touch, update **Written against** if HEAD moved, and hand the plan to plan-hunt again. A Suspected finding is a check, not a fix: run its **Settles it** check, and change the step only if the check fails.\n",{"name":5,"description":7},"main","534498267dccbe415f22f31fceac9da6771c195f","plugins\u002Fworkbench\u002Fskills\u002Fwrite-plan","https:\u002F\u002Fgithub.com\u002Fj0hanz\u002Fj0hanz-marketplace","https:\u002F\u002Fj0hanz-marketplace.vercel.app","https:\u002F\u002Fgithub.com\u002Fj0hanz","linus-johansson-cv-d308be9b73e1.herokuapp.com","2026-11-15 02:42:07",{"source":8,"skillName":5,"commands":33,"prompt":43,"zipAvailable":44},[34,37,40],{"tool":35,"command":36},"npx","npx skills add j0hanz\u002Fj0hanz-marketplace --skill write-plan",{"tool":38,"command":39},"bunx","bunx skills add j0hanz\u002Fj0hanz-marketplace --skill write-plan",{"tool":41,"command":42},"pnpm","pnpm dlx skills add j0hanz\u002Fj0hanz-marketplace --skill write-plan","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fj0hanz\u002Fj0hanz-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fworkbench\u002Fskills\u002Fwrite-plan\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},"01M7ABP78JFYBMCXJ9GMETCYZM","unslop","Use when writing or editing prose a person will read, or when text sounds AI-generated.","https:\u002F\u002Fgithub.com\u002Fj0hanz\u002Fj0hanz-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fwriteup\u002Fskills\u002Funslop\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},"01M7ABP52BNV7NRPNBR6PCNZWC","show-me","Use when asked to show, diagram, or walk through how code fits together or what a change does, or before explaining a multi-file flow in prose.","https:\u002F\u002Fgithub.com\u002Fj0hanz\u002Fj0hanz-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fwriteup\u002Fskills\u002Fshow-me\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},"01M7ABP3EPN4KFB4HPJNMY31NR","pr","Use when writing or updating a pull request description, or before running `gh pr create`.","https:\u002F\u002Fgithub.com\u002Fj0hanz\u002Fj0hanz-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fwriteup\u002Fskills\u002Fpr\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},"01M7ABP08MXTHPZYTG4HKEP7WQ","commit","Use when writing a commit message, or before running `git commit`.","https:\u002F\u002Fgithub.com\u002Fj0hanz\u002Fj0hanz-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fwriteup\u002Fskills\u002Fcommit\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},"01M7ABNV9J7DN1AFRBGDBHVBY2","write-specs","Spec a feature's observable behavior. Use when asked for requirements, when a request says what the system should do but not how, or to capture what a built system already guarantees. Not for how to build it (write-plan).","https:\u002F\u002Fgithub.com\u002Fj0hanz\u002Fj0hanz-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fworkbench\u002Fskills\u002Fwrite-specs\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},"01M7ABNPK2GVG8EB3SSEAMK4FZ","write-skills","Write, fix, or audit a skill's frontmatter, trigger description, and body. Use when a skill is asked for, never fires, or fires at the wrong moment. Not for a hook (write-hooks) or the plugin manifest and catalog.","https:\u002F\u002Fgithub.com\u002Fj0hanz\u002Fj0hanz-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fworkbench\u002Fskills\u002Fwrite-skills\u002FSKILL.md",[],[]]