[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7ABNPK2GVG8EB3SSEAMK4FZ":3,"skill-same:01M7ABNPK2GVG8EB3SSEAMK4FZ":52},{"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},"01M7ABNPK2GVG8EB3SSEAMK4FZ","write-skills",null,"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.","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-skills\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: write-skills\ndescription: 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.\n---\n\nEvery lever in this skill serves one goal: **predictability**.\n\nEach bold term has its own heading in [`GLOSSARY.md`](GLOSSARY.md). Load it on every audit, and while writing whenever a bold term below is unclear. When given a term as an argument, answer from that entry alone.\n\n## Invocation\n\nBoth choices keep the `description` field, because the format requires it. Exposure is the switch:\n\n- **Model-invoked** — omit `disable-model-invocation` and write a model-facing description that carries the trigger branches (the pointer rules below apply in full). The agent fires it on its own, other skills can reach it, and you can still type its name. You pay **context load** on every turn.\n- **User-invoked** — set `disable-model-invocation: true`; the `description` becomes human-facing, a one-line summary with the trigger lists stripped. It costs zero context load and spends **cognitive load** instead: you are the index and must remember that it exists.\n\nPick model-invocation only when the agent must reach the skill on its own, or another skill must. A skill fired only by hand is user-invoked and pays no context load.\n\nA user-invoked skill exposes nothing, so two things follow:\n\n- When user-invoked skills multiply past what you can remember, the cure is a **router skill**: one user-invoked skill that names the others and says when to reach for each. It can only hint.\n- Reference that two user-invoked skills both need can live in neither. Push it to an **external reference**: a plain file outside the skill system that any skill can point at. (A model-invoked skill made entirely of reference can host shared reference itself, since another skill can invoke it.)\n\n_Gotcha_: frontmatter must parse as strict YAML. Wrap a `description` that contains `: ` in single quotes, doubling any `'` inside. Unquoted, Claude Code still loads the skill, but Copilot CLI silently drops it.\n\n## Writing pointers\n\nThe **description** is a **context pointer**, and the same rules govern a link to a disclosed file one level down. Must-have material behind a weakly worded pointer is a variance bug: sharpen the wording first, and inline the material only if sharpening fails.\n\nA pointer does two jobs: it states what the material is, and it lists the **branches** that should trigger reaching it. An always-loaded pointer costs something every turn, so it must earn harder pruning than the body:\n\n- _Front-load the leading word_ — put it where it does the triggering work.\n- _One trigger per branch._ Renaming a single branch with synonyms is **duplication** — \"build features using TDD … asks for test-first development\" is one branch written twice. Collapse them and keep only genuinely distinct branches.\n- _Draw the boundary._ Where a neighbouring skill could hijack this one or be hijacked by it, a \"not for X\" clause is triage between skills, not **negation**, and earns its place.\n- _Cut identity the body already carries._\n- _Name the material; spend the rest on branches._ A pointer that summarises the steps behind it gets acted on in place of the material, so one clause says what the material is and every other word lists a branch.\n\n## Information hierarchy\n\nA skill is built from two content types — **steps** and **reference** — which mix freely: all steps, all reference, or both. The core decision is which to use and where each sits on the **information hierarchy**, a ladder ranked by how immediately the agent needs the material:\n\n1. **Steps**, in-file — the primary tier: what the agent does, in order.\n2. **Reference**, in-file — consulted on demand. _This skill is all reference._\n3. **Reference**, disclosed — moved out of `SKILL.md`, reached by a **context pointer**, and loaded only when the pointer fires. It ranges from a sibling file in the skill folder (`GLOSSARY.md` here) to an **external reference** living outside the skill system.\n\nPush too little down and the top bloats; push too much and you hide material the agent actually needs. That tension is the whole decision.\n\nEach step ends on a **completion criterion**. Make it _checkable_ (can the agent tell done from not-done?) and, where it matters, _exhaustive_ (\"every modified model accounted for\", not \"produce a change list\"). A vague criterion invites **premature completion**; a demanding one drives **legwork**. Demand binds flat reference the same way (\"every rule applied\"), so a skill with no steps still carries an exhaustiveness bar.\n\nTwo boundaries hold the top rung. A sequence the task doesn't need is **over-prescription**: where several approaches are valid, state the target and the constraint, say _why_ the rule matters so the agent can generalise it, and let it pick its own path. A sequence too fragile for prose belongs in a **script**.\n\n**Progressive disclosure** moves material down the ladder — out of `SKILL.md` into a linked file — so the top stays legible. The mechanics: a linked `.md` in the skill folder, named for what it holds (this skill discloses its definitions to `GLOSSARY.md`). The **branch** is the cleanest disclosure test: inline what every branch needs, and push behind a pointer what only some branches reach. One class of reference resists disclosure — the _gotcha_, a fact that defies what the agent would otherwise assume — and stays inline: the agent can't recognise the moment it would need to load it, so a pointer to a surprise never fires.\n\nWhere the ladder decides _how far down_ a piece sits, **co-location** decides _what sits beside it_ once it is there: keep a concept's definition, rules, and caveats under one heading rather than scattered, so reading one part brings its neighbours with it.\n\nGive an output format as a template to fill rather than prose describing it — the agent pattern-matches a concrete structure more reliably than a description of one.\n\n## When to split\n\n**Granularity** is how finely you divide skills. Each cut spends one of two loads, so split only when the cut earns it. There are two cuts:\n\n- _By invocation_ — split off a **model-invoked** skill when it has a distinct **leading word** that should trigger it on its own (a word you actually use in prompts), or when another skill must reach it. You pay **context load** for the new always-loaded **description**, so the independent reach has to be worth it.\n- _By sequence_ — split a run of **steps** when the steps still ahead (**post-completion steps**) tempt the agent to rush the one in front. Keeping them out of view encourages more **legwork** on the current task. The reverse holds too: merging sequences exposes each step's post-completion steps to what follows.\n\nSplitting hides steps only across a real context boundary — a user-invoked hand-off or a subagent dispatch. An inline model-invoked call leaves the later steps in context and clears nothing.\n\nBoth cuts answer to coherence: one unit of work per skill. Cut too fine, and several skills must co-load for a single task — descriptions crowd and instructions collide. Cut too broad, and no description can trigger the skill precisely.\n\n## Pruning\n\nCheck every line for relevance.\n\nThen hunt **no-ops** sentence by sentence, not just line by line: run the no-op test on each sentence in isolation, and when one fails, delete the whole sentence rather than trimming words. Be aggressive — most prose that fails should go, not get rewritten. The test is model-relative: two people who disagree about a no-op disagree about the default, so settle it by running the skill, not by debate.\n\nCut every **cache** line whose lookup is cheap.\n\n## Leading words\n\nHunt for chances to refactor skills to use leading words. A triad spelled out at three sites (**duplication**), or a description spending a sentence to gesture at one idea — each such passage begs to collapse into a single token. Examples:\n\n- \"fast, deterministic, low-overhead\" -> _tight_ — one quality restated across a phrase, collapsed into a single pretrained word (a _tight_ loop).\n- \"a loop you believe in\" -> _red_ — a fuzzy gate converted into a binary observable state (the loop goes _red_ on the bug, or it doesn't).\n\nThis wins twice over: fewer tokens, _and_ a sharper hook for the agent to hang its thinking on. Assume every skill carries restatements that leading words can retire — go find them.\n\n## Failure modes\n\nSymptom, then cure:\n\n- **Premature completion** — a step ends before it is genuinely done, because attention slips to _being done_. Sharpen the completion criterion first (cheap, local); only if it is irreducibly fuzzy _and_ the rush is observed, hide the post-completion steps by splitting.\n- **Over-prescription** — the agent can't adapt when reality differs from the steps. State the target and the constraint instead; move a genuinely fragile sequence into a **script**, leaving a step that says \"run it\".\n- **Duplication** — you edit one place, and the behaviour survives in another. Fold it to a single source of truth.\n- **Sediment** — you have to core through stale lines to reach the live one. Prune on a schedule, not on suspicion.\n- **Sprawl** — past ~500 lines or ~5k tokens, a `SKILL.md` has sprawled by definition, even when every line is live and unique. Disclose **reference** behind pointers; split by **branch** or by sequence so each path carries only what it needs.\n- **No-op** — a line that changes nothing versus the default. Delete the whole sentence. A weak leading word (_be thorough_ when the agent is already thorough-ish) is a no-op; fix it with a stronger word (_relentless_), not a different technique.\n- **Menu** — different runs pick different options at the same fork, and predictability dies there. Name one default; demote the rest to escape hatches, each with the condition that earns it (\"use X; for scanned input, fall back to Y\").\n- **Negation** — banned behaviour turns up more, not less: _don't think of an elephant_ names the elephant. Prompt _positive_ — state the target behaviour so the banned one is never spoken. Keep a prohibition only as a hard guardrail you can't phrase positively, and even then pair it with what to do instead.\n\nDone when every lever above has been applied — invocation picked, every pointer sharpened, the hierarchy placed, every completion criterion checkable, every output format given as a template, the split decided, every line relevance-checked, no-ops hunted sentence by sentence, every cheap-lookup cache line cut, leading words coined, and every failure mode confirmed absent. The bar binds the whole body, not a subset of sections.\n","Every lever in this skill serves one goal: **predictability**.\n\nEach bold term has its own heading in [`GLOSSARY.md`](GLOSSARY.md). Load it on every audit, and while writing whenever a bold term below is unclear. When given a term as an argument, answer from that entry alone.\n\n## Invocation\n\nBoth choices keep the `description` field, because the format requires it. Exposure is the switch:\n\n- **Model-invoked** — omit `disable-model-invocation` and write a model-facing description that carries the trigger branches (the pointer rules below apply in full). The agent fires it on its own, other skills can reach it, and you can still type its name. You pay **context load** on every turn.\n- **User-invoked** — set `disable-model-invocation: true`; the `description` becomes human-facing, a one-line summary with the trigger lists stripped. It costs zero context load and spends **cognitive load** instead: you are the index and must remember that it exists.\n\nPick model-invocation only when the agent must reach the skill on its own, or another skill must. A skill fired only by hand is user-invoked and pays no context load.\n\nA user-invoked skill exposes nothing, so two things follow:\n\n- When user-invoked skills multiply past what you can remember, the cure is a **router skill**: one user-invoked skill that names the others and says when to reach for each. It can only hint.\n- Reference that two user-invoked skills both need can live in neither. Push it to an **external reference**: a plain file outside the skill system that any skill can point at. (A model-invoked skill made entirely of reference can host shared reference itself, since another skill can invoke it.)\n\n_Gotcha_: frontmatter must parse as strict YAML. Wrap a `description` that contains `: ` in single quotes, doubling any `'` inside. Unquoted, Claude Code still loads the skill, but Copilot CLI silently drops it.\n\n## Writing pointers\n\nThe **description** is a **context pointer**, and the same rules govern a link to a disclosed file one level down. Must-have material behind a weakly worded pointer is a variance bug: sharpen the wording first, and inline the material only if sharpening fails.\n\nA pointer does two jobs: it states what the material is, and it lists the **branches** that should trigger reaching it. An always-loaded pointer costs something every turn, so it must earn harder pruning than the body:\n\n- _Front-load the leading word_ — put it where it does the triggering work.\n- _One trigger per branch._ Renaming a single branch with synonyms is **duplication** — \"build features using TDD … asks for test-first development\" is one branch written twice. Collapse them and keep only genuinely distinct branches.\n- _Draw the boundary._ Where a neighbouring skill could hijack this one or be hijacked by it, a \"not for X\" clause is triage between skills, not **negation**, and earns its place.\n- _Cut identity the body already carries._\n- _Name the material; spend the rest on branches._ A pointer that summarises the steps behind it gets acted on in place of the material, so one clause says what the material is and every other word lists a branch.\n\n## Information hierarchy\n\nA skill is built from two content types — **steps** and **reference** — which mix freely: all steps, all reference, or both. The core decision is which to use and where each sits on the **information hierarchy**, a ladder ranked by how immediately the agent needs the material:\n\n1. **Steps**, in-file — the primary tier: what the agent does, in order.\n2. **Reference**, in-file — consulted on demand. _This skill is all reference._\n3. **Reference**, disclosed — moved out of `SKILL.md`, reached by a **context pointer**, and loaded only when the pointer fires. It ranges from a sibling file in the skill folder (`GLOSSARY.md` here) to an **external reference** living outside the skill system.\n\nPush too little down and the top bloats; push too much and you hide material the agent actually needs. That tension is the whole decision.\n\nEach step ends on a **completion criterion**. Make it _checkable_ (can the agent tell done from not-done?) and, where it matters, _exhaustive_ (\"every modified model accounted for\", not \"produce a change list\"). A vague criterion invites **premature completion**; a demanding one drives **legwork**. Demand binds flat reference the same way (\"every rule applied\"), so a skill with no steps still carries an exhaustiveness bar.\n\nTwo boundaries hold the top rung. A sequence the task doesn't need is **over-prescription**: where several approaches are valid, state the target and the constraint, say _why_ the rule matters so the agent can generalise it, and let it pick its own path. A sequence too fragile for prose belongs in a **script**.\n\n**Progressive disclosure** moves material down the ladder — out of `SKILL.md` into a linked file — so the top stays legible. The mechanics: a linked `.md` in the skill folder, named for what it holds (this skill discloses its definitions to `GLOSSARY.md`). The **branch** is the cleanest disclosure test: inline what every branch needs, and push behind a pointer what only some branches reach. One class of reference resists disclosure — the _gotcha_, a fact that defies what the agent would otherwise assume — and stays inline: the agent can't recognise the moment it would need to load it, so a pointer to a surprise never fires.\n\nWhere the ladder decides _how far down_ a piece sits, **co-location** decides _what sits beside it_ once it is there: keep a concept's definition, rules, and caveats under one heading rather than scattered, so reading one part brings its neighbours with it.\n\nGive an output format as a template to fill rather than prose describing it — the agent pattern-matches a concrete structure more reliably than a description of one.\n\n## When to split\n\n**Granularity** is how finely you divide skills. Each cut spends one of two loads, so split only when the cut earns it. There are two cuts:\n\n- _By invocation_ — split off a **model-invoked** skill when it has a distinct **leading word** that should trigger it on its own (a word you actually use in prompts), or when another skill must reach it. You pay **context load** for the new always-loaded **description**, so the independent reach has to be worth it.\n- _By sequence_ — split a run of **steps** when the steps still ahead (**post-completion steps**) tempt the agent to rush the one in front. Keeping them out of view encourages more **legwork** on the current task. The reverse holds too: merging sequences exposes each step's post-completion steps to what follows.\n\nSplitting hides steps only across a real context boundary — a user-invoked hand-off or a subagent dispatch. An inline model-invoked call leaves the later steps in context and clears nothing.\n\nBoth cuts answer to coherence: one unit of work per skill. Cut too fine, and several skills must co-load for a single task — descriptions crowd and instructions collide. Cut too broad, and no description can trigger the skill precisely.\n\n## Pruning\n\nCheck every line for relevance.\n\nThen hunt **no-ops** sentence by sentence, not just line by line: run the no-op test on each sentence in isolation, and when one fails, delete the whole sentence rather than trimming words. Be aggressive — most prose that fails should go, not get rewritten. The test is model-relative: two people who disagree about a no-op disagree about the default, so settle it by running the skill, not by debate.\n\nCut every **cache** line whose lookup is cheap.\n\n## Leading words\n\nHunt for chances to refactor skills to use leading words. A triad spelled out at three sites (**duplication**), or a description spending a sentence to gesture at one idea — each such passage begs to collapse into a single token. Examples:\n\n- \"fast, deterministic, low-overhead\" -> _tight_ — one quality restated across a phrase, collapsed into a single pretrained word (a _tight_ loop).\n- \"a loop you believe in\" -> _red_ — a fuzzy gate converted into a binary observable state (the loop goes _red_ on the bug, or it doesn't).\n\nThis wins twice over: fewer tokens, _and_ a sharper hook for the agent to hang its thinking on. Assume every skill carries restatements that leading words can retire — go find them.\n\n## Failure modes\n\nSymptom, then cure:\n\n- **Premature completion** — a step ends before it is genuinely done, because attention slips to _being done_. Sharpen the completion criterion first (cheap, local); only if it is irreducibly fuzzy _and_ the rush is observed, hide the post-completion steps by splitting.\n- **Over-prescription** — the agent can't adapt when reality differs from the steps. State the target and the constraint instead; move a genuinely fragile sequence into a **script**, leaving a step that says \"run it\".\n- **Duplication** — you edit one place, and the behaviour survives in another. Fold it to a single source of truth.\n- **Sediment** — you have to core through stale lines to reach the live one. Prune on a schedule, not on suspicion.\n- **Sprawl** — past ~500 lines or ~5k tokens, a `SKILL.md` has sprawled by definition, even when every line is live and unique. Disclose **reference** behind pointers; split by **branch** or by sequence so each path carries only what it needs.\n- **No-op** — a line that changes nothing versus the default. Delete the whole sentence. A weak leading word (_be thorough_ when the agent is already thorough-ish) is a no-op; fix it with a stronger word (_relentless_), not a different technique.\n- **Menu** — different runs pick different options at the same fork, and predictability dies there. Name one default; demote the rest to escape hatches, each with the condition that earns it (\"use X; for scanned input, fall back to Y\").\n- **Negation** — banned behaviour turns up more, not less: _don't think of an elephant_ names the elephant. Prompt _positive_ — state the target behaviour so the banned one is never spoken. Keep a prohibition only as a hard guardrail you can't phrase positively, and even then pair it with what to do instead.\n\nDone when every lever above has been applied — invocation picked, every pointer sharpened, the hierarchy placed, every completion criterion checkable, every output format given as a template, the split decided, every line relevance-checked, no-ops hunted sentence by sentence, every cheap-lookup cache line cut, leading words coined, and every failure mode confirmed absent. The bar binds the whole body, not a subset of sections.\n",{"name":5,"description":7},"main","534498267dccbe415f22f31fceac9da6771c195f","plugins\u002Fworkbench\u002Fskills\u002Fwrite-skills","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-skills",{"tool":38,"command":39},"bunx","bunx skills add j0hanz\u002Fj0hanz-marketplace --skill write-skills",{"tool":41,"command":42},"pnpm","pnpm dlx skills add j0hanz\u002Fj0hanz-marketplace --skill write-skills","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fj0hanz\u002Fj0hanz-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fworkbench\u002Fskills\u002Fwrite-skills\u002FSKILL.md",true,[46],{"path":47,"resourceType":48,"resourceTypeDesc":49,"sizeBytes":50,"sourceHtmlUrl":51},"GLOSSARY.md","REFERENCE","参考文档",17214,"https:\u002F\u002Fgithub.com\u002Fj0hanz\u002Fj0hanz-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fworkbench\u002Fskills\u002Fwrite-skills\u002FGLOSSARY.md",[53,60,67,74,81,88],{"skillNo":54,"name":55,"nameZh":6,"description":56,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":57,"categories":58,"keywords":59,"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":61,"name":62,"nameZh":6,"description":63,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":64,"categories":65,"keywords":66,"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":68,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":73,"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":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":6,"sourceHtmlUrl":78,"categories":79,"keywords":80,"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":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":87,"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":89,"name":90,"nameZh":6,"description":91,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":94,"publishedAt":19},"01M7ABNKNKPTZ5S8E3792Q0M6P","write-qa","Write coverage-mapped QA deliverables. Use when asked for a test plan, manual test cases, a regression suite, or a bug report. Not for automated tests (tdd) or hunting bugs in code (bug-hunt).","https:\u002F\u002Fgithub.com\u002Fj0hanz\u002Fj0hanz-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fworkbench\u002Fskills\u002Fwrite-qa\u002FSKILL.md",[],[]]