"Code this idea" — a Claude Code plugin that turns a plan into an AI-coding-agent-ready docs set, then plans and builds the modules it defines. The only application code is examples/fixtures/pickup-queue/, a dependency-free Node project the skills are run against; everything else is markdown. Four skills: three run in sequence — scaffold (.agents/skills/scaffold/SKILL.md) writes the docs set including docs/development-roadmap.md; plan-module (.agents/skills/plan-module/SKILL.md) turns one module of that roadmap into docs/guides/feature_<module>_plan.md; and execute-plan (.agents/skills/execute-plan/SKILL.md) builds that plan file task by task. The fourth, test-and-verify (.agents/skills/test-and-verify/SKILL.md), is a service the others call rather than a stage: it runs the tests, fixes what fails within a bounded loop, and returns a verdict. No skill name is reserved-but-unbuilt.
- Confirmation must be explicit, never assumed from silence. A fact that appears in a planning conversation because the assistant proposed it, or because it showed up in a prototype/demo (especially one shaped by the demo environment's own constraints), is NOT the same as something the user explicitly stated or confirmed. Step 2 of
.agents/skills/scaffold/SKILL.mdmust apply the recommend-and-confirm pattern to both cases the same way — don't let "it's already in the conversation" substitute for a real confirmation. - Each
SKILL.mdstays lean. Treat ~150 lines as a hard ceiling, ~30 as a starting point. If an edit grows it significantly, something else should shrink. - The frontmatter
descriptionhas a hard 1024-character limit. Exceeding it is a load-time error — the skill silently fails to register, so nothing else in it can work. Measure after any edit to that field, and never trim a quoted trigger phrase to fit; cut descriptive text instead.examples/test-scenarios.mdS33 is the check. - The frontmatter
descriptionmust contain no<or>. Claude.ai and Claude Desktop reject an uploaded skill whose description holds anything tag-shaped —SKILL.md description cannot contain XML tags— because the description is injected into a system prompt where tags are structural. A placeholder written<module>is enough to trigger it. Claude Code, the skills CLI, and every other agent accept it happily, so the skill installs everywhere except the one surface that refuses it, and nothing in the repo says why. Write a placeholder as[module]. The release workflow's description checks are the guard. - Never leave placeholder or TODO content in any
SKILL.mdorreferences/— seeCONTRIBUTING.md. .agents/skills/scaffold/references/recommendation-heuristics.mdis expected to age. Verify a specific tool/version recommendation against a current search before trusting it, and treat outdated entries there as a normal, welcome PR rather than a bug.- The container is per-agent; the content is not. Which files the skill generates depends on the target agent (Claude Code reads
CLAUDE.mdand neverAGENTS.md; Codex and Antigravity readAGENTS.mdnatively). What those files say is identical in every mode. When changing aSKILL.md, check you haven't let a layout assumption leak into content guidance or vice versa —examples/test-scenarios.mdS12 is the check for this. - The skills live at
.agents/skills/, andplugin.json'sskillsfield is the only thing pointing Claude Code at them. Every agent but Claude Code reads.agents/skills/natively; Claude Code reads it only because the manifest says to. Move or rename that directory without updating the manifest and Claude Code falls back to scanning./skills/, finds nothing, and loads zero skills with no error anywhere — the same silent-non-registration failure as an over-lengthdescription. Change the two together. The release workflow's manifest step is the check. - The frontmatter must be valid YAML under a strict parser, and use only the spec's six fields (
name,description,license,compatibility,metadata,allowed-tools). Claude Code's parser is lenient enough to hide breakage that makes every other agent skip the skill entirely — a:inside an unquoteddescriptiondid exactly that, undetected, for two skills. Use an em dash or a period instead. The release workflow parses all four with PyYAML as the check. .claude-plugin/plugin.jsonis the single answer to "what version is this?", and two other places must agree with it. The git tag, and each skill'smetadata.version— which exists becauseplugin.jsondoes not travel with a skill copied into.agents/skills/, so a standalone install has no other way to know. Bump all of them together; CI blocks a tag whoseplugin.jsondisagrees, and blocks a skill whosemetadata.versiondisagrees..claude-plugin/marketplace.jsondeliberately carries no version — don't add one there.- A skill directory without a
SKILL.mdis not a placeholder for a future skill. Git can't track an empty directory, and a.gitkeepstub registers a broken skill for every user. Reserve a future skill's name inREADME.mdandCHANGELOG.md; create the directory when you write it. scaffoldstops at sub-modules.docs/development-roadmap.mdrecords modules and sub-modules only — never task tables. Task detail isplan-module's output, and inventing it at scaffold time means guessing implementation detail nobody has decided.examples/test-scenarios.mdS37 is the check.- The roadmap is the contract between the two skills, and
scaffoldowns it. TheStatusvocabulary, theDepends on:rules, and theTasks:field are specified once, in.agents/skills/scaffold/references/templates.md.plan-modulereads that spec and must never restate it — changing the format in one skill without the other silently breaks the handoff, and nothing errors when it does.examples/test-scenarios.mdS45 is the check. plan-modulenever overwrites a plan in flight. A re-plan preserves every[x],[~], and[-]item with its annotation, plus the whole## Progress Log. A re-cut task becomes[~]with a reason; it never reverts to[ ], which would silently un-do finished work. S48 is the check.- No implementation or test code in a plan file. Details names endpoints, tables, and data shapes; scenarios describe observable behavior in plain English. Writing the code or the assertions decides at plan time what
execute-planexists to decide. S47 is the check. - Three skills write to the docs set, and their fields are disjoint.
scaffoldowns the roadmap's format,plan-moduleowns each sub-module's**Tasks:**pointer, andexecute-planownsStatus:write-back as phases close. Nothing else updates a roadmap status, so anexecute-planthat skips it sends the nextplan-modulerun at a module that is already built. Never let one skill start writing another's field. S67 is the check. test-and-verifynever writes a plan file. Not a glyph, not a count, not the Progress Log. It returns a verdict;execute-planwrites it down. Two writers on one file is how a plan stops being trustworthy, and it's the same disjoint-fields rule the roadmap follows. S89 is the check.- The three-attempt circuit breaker is a ceiling, not a suggestion.
execute-planmust not re-invoketest-and-verifyto get past a failing verdict — that's the same attempt with the safety removed. A red verdict closes nothing and stops the loop. S90 is the check. .agents/skills/test-and-verify/references/test-commands.mdis expected to age, likerecommendation-heuristics.md. Runners and flags shift. A command read out of the project always beats one read out of that table — it's a fallback for when the project is silent, never an override..agents/skills/execute-plan/references/progress-updates.mdis subordinate to the two specs it applies. The checkbox vocabulary and counting rules live inplan-module'splan-template.md; the roadmapStatusvocabulary lives inscaffold'stemplates.md. That file says only how to apply them during execution and must never become a third source of truth — if it disagrees with either, it is the bug. S66 is the check.[x]means verified, never merely written.execute-planmay not close an item on inspection, on intent, or on a passing type-check — a test covering that scenario has to have actually run and been read. Behavior that genuinely can't be checked in the environment is[~]with what would verify it, never[x]on faith. S68 is the check.- A
SKILL.mdnever names another skill outside this plugin.execute-planStep 2 consults a domain skill when the environment offers one, but the hook is capability-shaped, not a list — namingimpeccableorvercel:nextjsbakes a Claude-Code-plugin assumption into content that must also run on Codex, Cursor and the rest, and a renamed skill becomes a dead invocation with nothing erroring. The in-plugintest-and-verifydelegation is the exception, and it survives because that skill has a contract — a verdict, and no plan-file writes. Anything consulted advises; the calling skill still decides, bounded by the task's Details and the project's conventions. It is its own step, ahead of implementation, and it has to produce something — a stated direction — so the consult is observable rather than assumed.examples/test-scenarios.mdS102–S104 are the checks; S105–S106 cover the step's positioning and per-task cadence and are open, not passing — an A/B eval could not show the positioning changes behavior, so don't cite them as settled. - A deferred decision is not a placeholder. "Undecided as of [date], do X meanwhile" is required output when the user defers;
[Project name]andTODOare not. Don't let the no-placeholder rule suppress the pending-decision feature.
- No build step — this is a pure markdown plugin.
- Package for release:
.github/workflows/release.ymlhandles this automatically on av*.*.*tag push. To test packaging locally, see the packaging step in that workflow file directly.
- See
CONTRIBUTING.md's "Testing a change" section — run the skill against a sample plan before and after anySKILL.mdedit, including at least one case where the new/changed rule should clearly fire and one where it clearly shouldn't.
README.md— human-facing overview, install/usageCONTRIBUTING.md— contribution guidelines and file-ownership mapCHANGELOG.md— release history.agents/skills/scaffold/references/best-practices.md— the reasoning behind the skill's rules.agents/skills/scaffold/references/recommendation-heuristics.md— stack/database/UI defaults it proposes during its interview.agents/skills/scaffold/references/agent-profiles.md— per-agent container facts, with sources and dates; expected to age.agents/skills/plan-module/references/plan-template.md— the plan file's format, checkbox vocabulary, and counting rules.agents/skills/plan-module/references/scenario-writing.md— what makes a plain-English test scenario checkable.agents/skills/execute-plan/references/verification.md— finding or bootstrapping a test runner, and what counts as verified.agents/skills/execute-plan/references/progress-updates.md— the plan-file and roadmap writes execution makes.agents/skills/test-and-verify/references/test-commands.md— finding and scoping the test command; expected to age.agents/skills/test-and-verify/references/remediation.md— app-bug vs test-bug, the circuit breaker, and the report formatsscripts/install.sh— installs the skills into any supported agent; its agent table carries sources and a verified-on date, and is expected to ageexamples/test-scenarios.md— the scenarios a change must be checked againstexamples/fixtures/pickup-queue/— the runnable Fixture I, plus how to A/B one skill text against another; read its README before claiming a change altered behavior