Getting it into your agent
This one installs as part of its plugin. Adding the marketplace and installing the plugin brings it with everything else the plugin ships.
/plugin marketplace add ihudak/ihudak-claude-plugins/plugin install product-workflowsWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/commands/ihudak/ihudak-claude-plugins/specify)<a href="https://agentmods.dev/commands/ihudak/ihudak-claude-plugins/specify"><img src="https://agentmods.dev/badge/commands/ihudak/ihudak-claude-plugins/specify/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/commands/ihudak/ihudak-claude-plugins/specify"><img src="https://agentmods.dev/badge/commands/ihudak/ihudak-claude-plugins/specify.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00000 | $0.27473 |
| Opus 5.5 | $0.00000 | $0.10989 |
| Sonnet 5.5 | $0.00000 | $0.05495 |
| Haiku 4.5 | $0.00000 | $0.02747 |
Grade A, and why
specify scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 1mo ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 1,173 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Author a product specification for the resolved item: $ARGUMENTS
Core references. A citation of the form workflows-core:<name> names a shared reference in the workflows-core plugin. Load it with Skill(skill: "workflows-core:reference", args: "<name>") — never by path: ${CLAUDE_PLUGIN_ROOT} resolves to this plugin, which does not carry it.
/specify is the PE-phase specification-authoring workflow — the specification step of the PM→PA→PE→Dev pipeline
(/specify → specification.md; then /design → design.md). Given an Epic or PRD address,
it reads the item from the specs tree, lightly scans code to
ground feasibility, and authors an org-standard specification.md through a relentless
one-question-at-a-time grill — resolving open questions live instead of stopping. It gates on the
Opus spec-reviewer and offers to land the spec on the specs repo's main branch (via branch + PR) as
Published: no.
Key distinction from /epics: /epics splits a PRD into Epic drafts; /specify authors one
specification for a single item (typically an Epic). Run /epics first, then /specify per Epic.
Usage: /specify <ADDRESS> [--no-docs] [--docs <path>], where <ADDRESS> is a key or an @<path>. --docs <path> — points documentation grounding at that root for this run instead of ${DOCS_PATH:-/workspace/docs}; strip the flag and its value together before any remaining-argument classification, or the path is read as part of the address. Declared for every consumer by workflows-core:docs-grounding Procedure step 1 (Flags first), which resolves it; this command only has to recognise it and pass the invocation through. On the BRD
route the run is seeded from a reconciled BRD and the address is the PRD- slice key
/brd-split carved; a BRD- container is refused (Phase 0 step 0). One address on every route: a
second positional token is refused (Phase 0 step 1, SPECIFY_ONE_ADDRESS).
Phase 0 — Resolve input
-
The route is a property of the resolved folder, not of a flag.
One resolution serves both routes now. A BRD key and a PRD key both name a folder under
$SPECS_PATH/specifications/, andresolve-addressresolves either — so this step no longer skips a front-end, it reads a differentkindfrom the same resolution. What distinguishes the routes is whatprd_dir(step 1) holds, not how it was addressed. The BRD route is aPRD-folder carrying abrd-link.md— the slice/brd-splitcarved, or a legacy slice with no prefix, which step 1 places as aPRD-folder by that samebrd-link.md— or anEPIC-folder inside one, which carries nobrd-link.mdof its own and is on the BRD route by the slice it sits in (step 3's Look one level up), and nothing else.A
BRD-container is refused, on either route. Take this on the folder step 1 resolves, the moment that resolution returnsstatus: foundand ahead of every read this command makes — and not as part of the BRD-route branch. The BRD route is detected from abrd-link.md, and a root BRD folder need not carry one:/brd-intakewrites none, and no command writes one into a root —/brd-splitplaces one in each slice it carves, and every command that mergesdepends-on:into one refuses a root. A refusal conditioned on the detected route would let/specify <ROOT-BRD-KEY>fall through to the keyed route and author a specification into the container. A BRD is a container: its requirements are built by thePRD-slices under it, one specification each, and aspecification.mdwritten into the container would sit besidebrd/,coverage-ledger.mdandslices.mdin a folder the design's §4.1 tree gives no specification. The test is the directory prefix, and never the folder's assertedkind:—/brd-splitwriteskind: brdinto thebrd-link.mdinside aPRD-slice folder, so a slice assertsbrdwhile being exactly the folder a specification belongs in, and a gate on the asserted kind would refuse every slice.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 1mo ago Changed · +74 lines 39d410bf136c
- 1mo ago Changed · +22 lines 60b37ebe54c3
- 1mo ago Changed · +4 lines de2220b459cc
- 2mo ago Changed · +16 lines 31659fbdb280
- 2mo ago Changed · +43 lines 4a1ba9b54e53
- 2mo ago First seen · 1,014 lines · 0 tokens per session scan A 4fc30751b480
specify is a command published in the GitHub repository ihudak/ihudak-claude-plugins (2 stars, last pushed 1mo ago), licensed MIT. It costs nothing until one of its globs matches a file; then it loads 27,473 tokens. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-05.
specify compared with commands from other repositories
| Mod | Type | Stars | Last push | Licence | Scan | Tokens | Works with |
|---|---|---|---|---|---|---|---|
| specifyihudak/ihudak-claude-plugins | Command | 2 | 1mo ago | MIT | A | 0 | Claude Code |
| battlecardphuryn/pm-skills | Command | 28k | 2d ago | MIT | A | 19 | Claude Code |
| memorizelucasrosati/claude-code-memory-setup | Command | 1.1k | 21d ago | MIT | A | 0 | Claude Code |
| watchMarcel-Bich/marcel-bich-claude-marketplace | Command | 12 | 2d ago | MIT | A | 11 | Claude Code |
| opsfrankxai/agentic-creator-os | Command | 12 | 2d ago | Apache-2.0 | A | 35 | Claude Code |
| value-prop-statementsstefanoskarakasis/Product-Marketing-Skills | Command | 11 | 2d ago | MIT | A | 16 | Claude Code |
| commitjoaquimscosta/arkhe-claude-plugins | Command | 22 | 26d ago | MIT | A | 11 | Claude Code |