From pm-skills
Guides contributors from a PM skill idea to a complete Skill Implementation Packet with draft files, gap analysis, and staging for review.
How this skill is triggered — by the user, by Claude, or both
Slash command
/pm-skills:utility-pm-skill-builderThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
<!-- PM-Skills | https://github.com/product-on-purpose/pm-skills | Apache 2.0 -->
This skill creates new PM skills for the pm-skills library. It produces a Skill Implementation Packet - a complete design document with draft files in a staging area for review before promotion to canonical locations.
utility-pm-skill-iterateutility-pm-skill-validateWhen asked to create a new PM skill, follow these steps:
Accept the idea in either form:
Both entry points produce the same downstream flow. If the user provides one form, do not ask for the other - extract what you need and proceed.
If the idea is vague, ask ONE follow-up question to clarify the artifact type and target audience before proceeding.
Check ALL existing skills for overlap. Use the Current Library Reference
below (derive the live inventory from skill-manifest.json or AGENTS.md)
AND scan the skills/ directory for the latest inventory. Include all four
families - domain, foundation, utility, and tool - the tool family is easy
to miss since it has no phase prefix pattern in common conversation.
Present findings with specificity:
Why Gate (triggers when overlap is found): Ask the user: "Name 2-3 specific prompts or scenarios where the existing skills fail to produce what you need."
Kill Gate: If the user cannot articulate convincing gaps, recommend an alternative:
Do not proceed past the kill gate without either convincing evidence of a gap or explicit user override.
Evaluate whether the idea should be ONE skill or MULTIPLE skills.
Splitting signals:
If splitting is warranted, present the recommendation: "This seems to cover two distinct PM activities:
Determine the skill's classification and naming:
Domain skills (phase-specific PM activities):
{phase}-{skill-name}phase: {phase} (required), no classification fieldFoundation skills (cross-cutting, used across phases):
foundation-{skill-name}classification: foundation (required), no phase fieldUtility skills (meta-skills, repo tooling):
utility-{skill-name}classification: utility (required), no phase fieldDialect and exemplar selection: First, pick the skill's dialect from Skeleton Canon: The Three Sanctioned Dialects (classic, contract-shaped, or tool-family) - this fixes the required heading skeleton before any exemplar is chosen. Do not default to "mirror the closest exemplar": an exemplar can itself carry drift (a case variant, an extra or missing section), and a straight mirror copies that drift forward into the new skill.
Then identify 1-2 existing skills in the SAME dialect that are the closest structural match:
Present the classification, dialect, and exemplar selection for user confirmation.
A new skill must ship eval-ready so coverage never falls behind: routing health and output quality are both measurable from day one. Decide the eval contract here, then emit its assets in Step 5. Four parts:
A. Nearest neighbors (C-2). Name the new skill's 1-3 nearest neighbors - the existing skills whose triggers most overlap. Derive them from the Step 2 gap analysis plus same-phase / same-category siblings. These neighbors drive the boundary pointers (below), the near-miss trigger fixtures (Step 5), and the collision probe (Step 7).
B. Reciprocal boundary pointers (C-3). The draft SKILL.md MUST include a
## When NOT to Use section that names each neighbor and says when to use that
neighbor instead. For every neighbor, also add the reciprocal pointer back: a
"When NOT to Use" bullet in the neighbor's SKILL.md pointing to the new skill. If the
overlap is strong enough to be a measured collision pair, add the pair to
COLLISION_PAIRS in scripts/check-trigger-fixtures.mjs so the reciprocity gate
(check-reciprocal-boundary-pointers.mjs) and the collision probe both cover it.
Reciprocal pointers are what kept the v2.26.0 rewrites collision-clean.
C. Output-eval family (C-4). Map the skill to an output-eval family rubric so its artifact quality is measurable. Pick by phase/category:
| Family rubric | Covers (phase / kind) |
|---|---|
framing | define-* problem/hypothesis/jtbd/opportunity/prioritization + foundation-okr-writer/persona/lean-canvas |
specification | deliver-* prd/acceptance-criteria/user-stories/edge-cases/launch-checklist |
discovery | discover-* interview-synthesis/competitive/market-sizing/journey/stakeholder |
technical | develop-* adr/design-rationale/solution-brief/spike-summary |
measurement | measure-* experiment-design/results/okr-grader/dashboard/instrumentation/survey |
learning | iterate-* retrospective/lessons-log/pivot-decision/refinement-notes |
communication | audience-facing: deliver-release-notes, foundation-stakeholder-update |
Family rubrics live at docs/internal/eval-rubrics/{family}.md. If the skill fits a
family that has a rubric, use that family value in the scenario frontmatter. If it
opens a NEW family (meeting/tool skills have none yet), note "no family rubric yet -
author one before the skill enters the output-eval roster" and skip the family value.
D. Fixture + scenario plan (C-1, C-4). Plan the two eval-asset files emitted in
Step 5: a trigger-fixtures.json (routing) and an output-scenarios/<id>.md (output
quality). Their shapes are specified in Step 5 items 13-14.
Present the neighbors + family + reciprocal-pointer plan for user confirmation before generating the packet.
Produce the complete packet using references/TEMPLATE.md as the format.
The packet includes:
--- at byte 0 of the file (no preceding content of any kind, including HTML comments, BOM, or whitespace). Place any attribution comment AFTER the closing --- fence, never before. Reference: library/skill-output-samples/SAMPLE_CREATION.md Section 5.evals/trigger-fixtures.json:
a JSON object { "schema": 1, "skill": "{name}", "runs_per_query": 3, "trigger_threshold": 0.5, "queries": [...] }. The queries array needs >= 16
total, >= 8 with "expect": "trigger" (drawn from the skill's real intents,
NOT just artifact keywords - include intent-only asks) and >= 8 with
"expect": "no-trigger", of which >= 2 are near-misses aimed at the Step 4.5
neighbors (mark them "near_miss_of": "{neighbor}"). Split each class ~60/40 across
"split": "train" / "split": "validation". This is the B-4 fixture contract
(scripts/check-trigger-fixtures.mjs).evals/output-scenarios/{id}.md:
frontmatter scenario: {id} / skill: {name} / family: {family from Step 4.5} /
created: {date}, then a realistic input brief (>= 100 chars of body) that gives the
skill arm and a freehand control the same raw material. This is the B-7 asset contract
(scripts/check-output-eval-assets.mjs). Omit family only if Step 4.5 found no
rubric yet.Write all generated files to the staging area:
_staging/pm-skill-builder/{skill-name}/
├── SKILL.md ← draft skill file
├── references/
│ ├── TEMPLATE.md ← draft template
│ └── EXAMPLE.md ← draft example
├── evals/
│ ├── trigger-fixtures.json ← draft routing fixtures (C-1)
│ └── output-scenarios/{id}.md ← draft output-quality scenario (C-4)
└── command.md ← draft command
Note:
_staging/is gitignored - draft artifacts never ship in releases. The staging folder is discarded after promotion.
Report what was written and where.
Ask: "Review the packet above. When ready, I'll promote the files to their canonical locations. Proceed? [yes/no]"
If yes, promote by copying each file from staging to its canonical path:
| Staging file | Canonical location |
|---|---|
_staging/pm-skill-builder/{skill-name}/SKILL.md | skills/{dir-name}/SKILL.md |
_staging/pm-skill-builder/{skill-name}/references/TEMPLATE.md | skills/{dir-name}/references/TEMPLATE.md |
_staging/pm-skill-builder/{skill-name}/references/EXAMPLE.md | skills/{dir-name}/references/EXAMPLE.md |
_staging/pm-skill-builder/{skill-name}/evals/trigger-fixtures.json | skills/{dir-name}/evals/trigger-fixtures.json |
_staging/pm-skill-builder/{skill-name}/evals/output-scenarios/{id}.md | skills/{dir-name}/evals/output-scenarios/{id}.md |
_staging/pm-skill-builder/{skill-name}/command.md | commands/{command-name}.md |
Where {dir-name} is the classification-prefixed directory (e.g., deliver-change-communication).
Then:
skills/{dir-name}/references/ and skills/{dir-name}/evals/output-scenarios/COLLISION_PAIRS in scripts/check-trigger-fixtures.mjs and add the reciprocal "When NOT to Use" bullet to each neighbor's SKILL.mdbash scripts/lint-skills-frontmatter.sh && bash scripts/validate-agents-md.sh && bash scripts/validate-commands.sh, then the eval-asset gates node scripts/check-trigger-fixtures.mjs, node scripts/check-output-eval-assets.mjs, node scripts/check-reciprocal-boundary-pointers.mjs, and the collision probe node scripts/check-new-skill-collision.mjs --skill={name} (C-2 - confirms the new skill recalls its own triggers and steals none of a neighbor's). Regenerate the catalog surfaces: node scripts/gen-skill-manifest.mjs && node scripts/gen-skill-manifest.mjs --agents_staging/pm-skill-builder/{skill-name}/Design rationale lives in the GitHub issue, PR, or effort brief - not in a permanent packet file.
Provide post-promotion guidance:
bash scripts/lint-skills-frontmatter.sh"/{command-name} with a realistic scenario"Do not hand-maintain a skill inventory in this file. A static table here has drifted from the real catalog before (most recently: an entire family untracked, plus a missing row in another) because every new or removed skill would require a hand edit here too. Instead, derive the live inventory at run time, every time, from one of:
skill-manifest.json (repo root) - generated, machine-readable; every
skill's name, classification, phase (if any), category, and description.AGENTS.md - generated, human-browsable; the same catalog grouped by
family with a short description per skill.Both are regenerated by node scripts/gen-skill-manifest.mjs (and
--agents) whenever a skill is added, changed, or removed, so they track
skills/ on disk exactly - unlike a hand-written table, they cannot drift.
The families, for orientation (no counts kept here on purpose - read the manifest for the current total):
| Family | Phase-scoped? | Directory prefix | Covers |
|---|---|---|---|
| Domain | Yes (discover/define/develop/deliver/measure/iterate) | {phase}- | PM activities scoped to one Triple Diamond phase |
| Foundation | No | foundation- | Cross-cutting artifacts used across phases (canvases, personas, OKRs, meeting artifacts, stakeholder communication, pre-build risk review) |
| Utility | No | utility- | Meta/tooling skills that operate on the repo, workflow, or other skills (this skill is one) |
| Tool | No | tool- | Workshop facilitation formats (Foundation Sprint family, Design Sprint family, standalone facilitation formats) |
For gap analysis (Step 2), read skill-manifest.json or AGENTS.md in
full - all four families, not just domain and foundation - before judging
overlap. The tool family is the easiest to miss because none of its skills
share a phase name with the idea being pitched.
The builder MUST produce draft files for the new skill:
SKILL.md - full skill instructions (including a When NOT to Use section naming neighbors, C-3)references/TEMPLATE.md - output template with guidance commentsreferences/EXAMPLE.md - complete worked example (150-300 lines)evals/trigger-fixtures.json - routing eval fixtures (C-1; B-4 contract)evals/output-scenarios/{id}.md - output-quality scenario + family rubric (C-4; B-7 contract)command.md - slash command fileAll drafts are written to _staging/pm-skill-builder/{skill-name}/ (gitignored).
On promotion, files are copied to canonical locations, AGENTS.md is updated, and the staging folder is discarded.
Before finalizing the packet, verify all items in both tiers:
name matches directory nameversion, updated, license all presentphase:, foundation/utility → classification:){phase/classification}-{skill-name}## sections#### + **Path:** formatWhen NOT to Use section points to eachCOLLISION_PAIRS if strong overlapevals/trigger-fixtures.json present and meets the B-4 contract (>=16 queries, >=8/class, >=2 near-misses, train/validation split)evals/output-scenarios/{id}.md present with scenario/skill/family frontmatter mapping to an existing rubric (or family deferred with a noted reason)check-new-skill-collision.mjs --skill={name} --emit-tasks, then dispatch the pm-skill-router sub-agent (Haiku) over the emitted queries and apply the verdict; the new skill recalls its triggers and steals none of a neighbor's. (Unattended CI may instead use the Messages-API path with ANTHROPIC_API_KEY.)See references/EXAMPLE.md for a completed Skill Implementation Packet
demonstrating a realistic domain skill creation.
npx claudepluginhub product-on-purpose/pm-skills --plugin pm-skillsDesign a new PM skill through guided conversation. Use when you have raw content or an idea and want to shape it into a compliant skill.
Creates a SKILL.md file following the Agent Skills open standard (agentskills.io). Covers frontmatter schema, section structure, Expected/On failure pairs, validation checklists, and registry integration.
Creates and extends harness skills with structured phases for defining purpose, choosing type, writing skill.yaml and SKILL.md, validating, and testing.