[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6KC5BC9BYSEKRV06R1PTB0P":3,"skill-same:01M6KC5BC9BYSEKRV06R1PTB0P":75},{"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":30,"linkOnly":31,"markdownContent":32,"markdownBody":33,"frontMatter":34,"refName":36,"commitSha":37,"skillDirectory":38,"forksCount":39,"repositoryHtmlUrl":40,"repositoryHomepageUrl":6,"ownerHtmlUrl":41,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":42,"install":43,"resources":56},"01M6KC5BC9BYSEKRV06R1PTB0P","discovery",null,"Investigate a topic, then decompose it into backlog tickets grouped by epic. Ends at tickets, not a spec. Needs a topic argument — without one, use dev.","charleshall888\u002Fcortex-command","charleshall888","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F47426470?v=4","01M6KC1Z9S8HWSA07QDH85FYNE","Charlie Hall","01M6KC1ZDQNJX8EWA7KG5RK5E8",2,"MIT","https:\u002F\u002Fgithub.com\u002Fcharleshall888\u002Fcortex-command\u002Fblob\u002Fmain\u002Fplugins\u002Fcortex-core\u002Fskills\u002Fdiscovery\u002FSKILL.md",[],[5,19,20,21,22,23,24,25,26,27,28,29],"spec","dev","investigate","use","decompose","backlog","tickets","EPIC","it","argument","at","2026-11-10 10:12:30",false,"---\nname: discovery\ndescription: Investigate a topic, then decompose it into backlog tickets grouped by epic. Ends at tickets, not a spec. Needs a topic argument — without one, use dev.\nargument-hint: \"\u003Ctopic>\"\n---\n\n# Discovery\n\nTopic: $ARGUMENTS — required. Empty → stop with \"discovery requires a topic argument; for 'what should I work on' or 'next task' routing, use `\u002Fcortex-core:dev` instead.\" Directory: `cortex\u002Fresearch\u002F{{topic}}\u002F`, lowercase-kebab.\n\n## Step 1: Resolve the phase\n\n- No directory → **clarify**.\n- `research.md` without `decomposed.md` → **decompose**.\n- `decomposed.md` present → complete. Offer a re-run or an update.\n\nReport the phase and offer to continue or restart earlier. If several `cortex\u002Fresearch\u002F*\u002F` lack `decomposed.md`, list them and ask which.\n\n**A re-run from scratch** never overwrites. Use slug `{{topic}}-N` (smallest unused N ≥2). Open the new `research.md` with `superseded:` naming the artifact just before it. Leave the old directory as a record. Repointing `discovery_source:` or archiving is the user's call.\n\n## Step 2: Execute the phase\n\n| Phase | Reference | Artifact |\n|-------|-----------|----------|\n| Clarify | [clarify.md](${CLAUDE_SKILL_DIR}\u002Freferences\u002Fclarify.md) | none (conversation only) |\n| Research | [research.md](${CLAUDE_SKILL_DIR}\u002Freferences\u002Fresearch.md) | `cortex\u002Fresearch\u002F{{topic}}\u002Fresearch.md` |\n| Decompose | [decompose.md](${CLAUDE_SKILL_DIR}\u002Freferences\u002Fdecompose.md) | Epic + backlog tickets |\n\nRead **only** the current phase's reference. `${CLAUDE_SKILL_DIR}` resolves only here. Where a reference names a sibling, use the absolute path: **fanout** → `${CLAUDE_SKILL_DIR}\u002F..\u002Fresearch\u002Freferences\u002Ffanout.md`; **orchestrator-review** → `${CLAUDE_SKILL_DIR}\u002F..\u002Fbuild\u002Freferences\u002Forchestrator-review.md`.\n\nAfter each phase, commit `cortex\u002Fresearch\u002F{{topic}}\u002F`, summarize, and go on without asking — except at the gate below.\n\n## Step 3: Research → Decompose gate\n\nOne question the user must answer, reached by finishing Research or resuming into Decompose. No decompose work starts until it is answered.\n\n```\ncortex-discovery generate-brief --research-md cortex\u002Fresearch\u002F\u003Ctopic>\u002Fresearch.md \\\n    --persist-to cortex\u002Fresearch\u002F\u003Ctopic>\u002Fbrief.md\n```\n\nNon-zero exit, missing file, or failed validation → show the full `## Architecture` section with a warning that names the failure (`brief_generation_failed: \u003Creason>`). Over the advisory word cap → show the brief anyway with a one-line note.\n\n- **`approve`** — go to Decompose.\n- **`revise`** — free-text changes to Architecture only. Rework it against the template in `references\u002Fresearch.md` §3, rewrite `### Pieces` then `### How they connect`, show it again, and add one to `revision_round`. Repeat until `approve` or `drop`.\n- **`drop`** — a neutral end: the research is enough and needs no tickets, or the user abandons it. Write nothing to `cortex\u002Fbacklog\u002F`. The artifact stays.\n- **`promote-sub-topic`** — the user names a sub-topic. Compose a body via `\u002Fbacklog-author compose` with a `## Promoted from` section reading exactly `## Promoted from\\n\\nDiscovery: cortex\u002Fresearch\u002F\u003Ccurrent-topic>\u002F`. That section is the only link — no frontmatter pointer, no nested discovery. Create one `needs-discovery` ticket per the backend routing below, then return to this gate.\n\nLog one event per response:\n\n```\ncortex-discovery emit-checkpoint-response --topic \u003Ctopic> --checkpoint research-decompose \\\n    --response \u003Capprove|revise|drop|promote-sub-topic> --revision-round \u003Cint>\n```\n\n## Backend routing\n\nBefore a phase creates tickets, run `cortex-read-backlog-backend` (no arguments):\n\n- `cortex-backlog` → create normally.\n- `none` → create nothing. Keep the titles and bodies in `cortex\u002Fresearch\u002F{topic}\u002Fdecomposed.md` with a one-line note. Write nothing to `cortex\u002Fbacklog\u002F`.\n- Anything else → file as best you can per `backlog.instructions`. If filing fails, show the bodies inline.\n\nEvery ticket created carries `discovery_source:` pointing at the research artifact; `\u002Fcortex-core:refine` loads it as background.\n","# Discovery\n\nTopic: $ARGUMENTS — required. Empty → stop with \"discovery requires a topic argument; for 'what should I work on' or 'next task' routing, use `\u002Fcortex-core:dev` instead.\" Directory: `cortex\u002Fresearch\u002F{{topic}}\u002F`, lowercase-kebab.\n\n## Step 1: Resolve the phase\n\n- No directory → **clarify**.\n- `research.md` without `decomposed.md` → **decompose**.\n- `decomposed.md` present → complete. Offer a re-run or an update.\n\nReport the phase and offer to continue or restart earlier. If several `cortex\u002Fresearch\u002F*\u002F` lack `decomposed.md`, list them and ask which.\n\n**A re-run from scratch** never overwrites. Use slug `{{topic}}-N` (smallest unused N ≥2). Open the new `research.md` with `superseded:` naming the artifact just before it. Leave the old directory as a record. Repointing `discovery_source:` or archiving is the user's call.\n\n## Step 2: Execute the phase\n\n| Phase | Reference | Artifact |\n|-------|-----------|----------|\n| Clarify | [clarify.md](${CLAUDE_SKILL_DIR}\u002Freferences\u002Fclarify.md) | none (conversation only) |\n| Research | [research.md](${CLAUDE_SKILL_DIR}\u002Freferences\u002Fresearch.md) | `cortex\u002Fresearch\u002F{{topic}}\u002Fresearch.md` |\n| Decompose | [decompose.md](${CLAUDE_SKILL_DIR}\u002Freferences\u002Fdecompose.md) | Epic + backlog tickets |\n\nRead **only** the current phase's reference. `${CLAUDE_SKILL_DIR}` resolves only here. Where a reference names a sibling, use the absolute path: **fanout** → `${CLAUDE_SKILL_DIR}\u002F..\u002Fresearch\u002Freferences\u002Ffanout.md`; **orchestrator-review** → `${CLAUDE_SKILL_DIR}\u002F..\u002Fbuild\u002Freferences\u002Forchestrator-review.md`.\n\nAfter each phase, commit `cortex\u002Fresearch\u002F{{topic}}\u002F`, summarize, and go on without asking — except at the gate below.\n\n## Step 3: Research → Decompose gate\n\nOne question the user must answer, reached by finishing Research or resuming into Decompose. No decompose work starts until it is answered.\n\n```\ncortex-discovery generate-brief --research-md cortex\u002Fresearch\u002F\u003Ctopic>\u002Fresearch.md \\\n    --persist-to cortex\u002Fresearch\u002F\u003Ctopic>\u002Fbrief.md\n```\n\nNon-zero exit, missing file, or failed validation → show the full `## Architecture` section with a warning that names the failure (`brief_generation_failed: \u003Creason>`). Over the advisory word cap → show the brief anyway with a one-line note.\n\n- **`approve`** — go to Decompose.\n- **`revise`** — free-text changes to Architecture only. Rework it against the template in `references\u002Fresearch.md` §3, rewrite `### Pieces` then `### How they connect`, show it again, and add one to `revision_round`. Repeat until `approve` or `drop`.\n- **`drop`** — a neutral end: the research is enough and needs no tickets, or the user abandons it. Write nothing to `cortex\u002Fbacklog\u002F`. The artifact stays.\n- **`promote-sub-topic`** — the user names a sub-topic. Compose a body via `\u002Fbacklog-author compose` with a `## Promoted from` section reading exactly `## Promoted from\\n\\nDiscovery: cortex\u002Fresearch\u002F\u003Ccurrent-topic>\u002F`. That section is the only link — no frontmatter pointer, no nested discovery. Create one `needs-discovery` ticket per the backend routing below, then return to this gate.\n\nLog one event per response:\n\n```\ncortex-discovery emit-checkpoint-response --topic \u003Ctopic> --checkpoint research-decompose \\\n    --response \u003Capprove|revise|drop|promote-sub-topic> --revision-round \u003Cint>\n```\n\n## Backend routing\n\nBefore a phase creates tickets, run `cortex-read-backlog-backend` (no arguments):\n\n- `cortex-backlog` → create normally.\n- `none` → create nothing. Keep the titles and bodies in `cortex\u002Fresearch\u002F{topic}\u002Fdecomposed.md` with a one-line note. Write nothing to `cortex\u002Fbacklog\u002F`.\n- Anything else → file as best you can per `backlog.instructions`. If filing fails, show the bodies inline.\n\nEvery ticket created carries `discovery_source:` pointing at the research artifact; `\u002Fcortex-core:refine` loads it as background.\n",{"name":5,"description":7,"argument-hint":35},"\u003Ctopic>","main","3aac0752f0f020bd953cfed5bd29244d1c8f5f4f","plugins\u002Fcortex-core\u002Fskills\u002Fdiscovery",0,"https:\u002F\u002Fgithub.com\u002Fcharleshall888\u002Fcortex-command","https:\u002F\u002Fgithub.com\u002Fcharleshall888","2026-10-28 20:32:05",{"source":8,"skillName":5,"commands":44,"prompt":54,"zipAvailable":55},[45,48,51],{"tool":46,"command":47},"npx","npx skills add charleshall888\u002Fcortex-command --skill discovery",{"tool":49,"command":50},"bunx","bunx skills add charleshall888\u002Fcortex-command --skill discovery",{"tool":52,"command":53},"pnpm","pnpm dlx skills add charleshall888\u002Fcortex-command --skill discovery","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fcharleshall888\u002Fcortex-command\u002Fblob\u002Fmain\u002Fplugins\u002Fcortex-core\u002Fskills\u002Fdiscovery\u002FSKILL.md",true,[57,63,67,71],{"path":58,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":61,"sourceHtmlUrl":62},"references\u002Fclarify.md","REFERENCE","参考文档",2407,"https:\u002F\u002Fgithub.com\u002Fcharleshall888\u002Fcortex-command\u002Fblob\u002Fmain\u002Fplugins\u002Fcortex-core\u002Fskills\u002Fdiscovery\u002Freferences\u002Fclarify.md",{"path":64,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":65,"sourceHtmlUrl":66},"references\u002Fdecompose.md",4044,"https:\u002F\u002Fgithub.com\u002Fcharleshall888\u002Fcortex-command\u002Fblob\u002Fmain\u002Fplugins\u002Fcortex-core\u002Fskills\u002Fdiscovery\u002Freferences\u002Fdecompose.md",{"path":68,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":69,"sourceHtmlUrl":70},"references\u002Fresearch.md",3061,"https:\u002F\u002Fgithub.com\u002Fcharleshall888\u002Fcortex-command\u002Fblob\u002Fmain\u002Fplugins\u002Fcortex-core\u002Fskills\u002Fdiscovery\u002Freferences\u002Fresearch.md",{"path":72,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":73,"sourceHtmlUrl":74},"references\u002Fsize-pin.txt",5,"https:\u002F\u002Fgithub.com\u002Fcharleshall888\u002Fcortex-command\u002Fblob\u002Fmain\u002Fplugins\u002Fcortex-core\u002Fskills\u002Fdiscovery\u002Freferences\u002Fsize-pin.txt",[76,91,101,114,126,138],{"skillNo":77,"name":78,"nameZh":6,"description":79,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":80,"categories":81,"keywords":82,"publishedAt":30},"01M6KCB4DH17601DR5QA7WYG28","over-cap-no-marker","Synthetic fixture with 501 lines and no size-budget marker.","https:\u002F\u002Fgithub.com\u002Fcharleshall888\u002Fcortex-command\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskill_size_budget\u002Fover-cap-no-marker\u002FSKILL.md",[],[83,84,85,86,87,88,89,90],"over cap no marker","cap","marker","fixture","Budget","synthetic","with","size",{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":30},"01M6KCB0P08NTQBZVYP6Q0J74M","invalid-marker","Synthetic fixture exercising the invalid-marker failure path.","https:\u002F\u002Fgithub.com\u002Fcharleshall888\u002Fcortex-command\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskill_size_budget\u002Finvalid-marker\u002FSKILL.md",[],[98,85,99,100,88,86],"invalid","invalid marker","path",{"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":15,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":107,"publishedAt":30},"01M6KCAXS26V6DS7FTG7Z3D08V","boundary-29-char-reason","Synthetic fixture with marker rationale at the regex boundary (29 chars, just under min).","https:\u002F\u002Fgithub.com\u002Fcharleshall888\u002Fcortex-command\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskill_size_budget\u002Fboundary-29-char-reason\u002FSKILL.md",[],[108,109,110,88,111,29,85,89,112,86,113],"reason","boundary 29 char reason","boundary","rationale","regex","just",{"skillNo":115,"name":116,"nameZh":6,"description":117,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":118,"categories":119,"keywords":120,"publishedAt":30},"01M6KCARRB8SCQJNQTCCZY7WS9","valid-with-inputs","A skill that declares one input variable and uses it in the body.","https:\u002F\u002Fgithub.com\u002Fcharleshall888\u002Fcortex-command\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fcontracts\u002Fvalid-with-inputs\u002FSKILL.md",[],[121,89,122,123,27,124,125],"valid with inputs","valid","operate","STRING","input",{"skillNo":127,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":132,"publishedAt":30},"01M6KCAP369CPN1N3G8ZG95D6J","valid-minimal","A minimal skill with only the required fields present.","https:\u002F\u002Fgithub.com\u002Fcharleshall888\u002Fcortex-command\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fcontracts\u002Fvalid-minimal\u002FSKILL.md",[],[133,134,122,89,135,136,137],"minimal","valid minimal","present","only","minimal skill",{"skillNo":139,"name":140,"nameZh":6,"description":141,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":142,"categories":143,"keywords":144,"publishedAt":30},"01M6KCAJJXSZJ9JQM730JWFSMF","invalid-undeclared-variable","A skill whose body uses a variable not declared in inputs.","https:\u002F\u002Fgithub.com\u002Fcharleshall888\u002Fcortex-command\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fcontracts\u002Finvalid-undeclared-variable\u002FSKILL.md",[],[98,145,124],"invalid undeclared variable"]