Refine
Refine a rough or underspecified Hydrant issue into an implementable one — fill missing scope, acceptance criteria, edge cases, and metadata so it can move to `/prep` without further coaching. Use when the user asks for `/refine`, says "refine HYD-123", or wants an issue cleaned up before implementation.From its SKILL.md
npx -y skills add Background-Craft/hydrant-skills --skill refineAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
6.7 KB, ~1.5k tokens by cl100k_base, as published. Nobody here has run it
Refine
Refine a Hydrant issue by comparing what it says against what the codebase and project state actually require, then update it with the user's approval. /refine is for issues that are incomplete — gaps in scope, acceptance criteria, dependencies, labels, milestone fit. For issues that are complete-but-soft (vague language, ungrounded references, metadata buried in prose), use /nail after /refine.
Source of truth
- Hydrant MCP for the live issue, sibling issues, labels, milestones, and dependencies. Use
mcp__hydrant__*tools exclusively — never shell out togh,curl, or hardcoded URLs. - The user's codebase for grounding the refinement in reality (file paths, existing patterns, what's already shipped).
Issue resolution
Normalize the input:
HYD-12→ use directly withmcp__hydrant__get_issue({ identifier: "HYD-12" }).12→ normalize toHYD-12.- Bare title or fragment →
mcp__hydrant__list_issueswith the keyword insearchTextfiltering, then ask the user which match they meant.
Fetch both:
mcp__hydrant__get_issue({ identifier, include: ["context"] })— issue body plus linked decisions, notes, dependencies, labels, space.
If the issue can't be found, list likely matches via mcp__hydrant__list_issues and ask the user.
Workflow
Phase 1: Gather context
- Fetch the issue with
include: ["context"]so you have its decisions, notes, dependencies, and labels in one round-trip. - Read project docs the user keeps at the repo root or in obvious doc directories (
README.md,AGENTS.md, anything the issue points at). Don't crawl the whole tree blindly — read what the issue references. - Inspect the codebase areas the issue would touch using whatever filesystem tools your harness exposes. The goal is to confirm references resolve and to spot what's already there.
- Inspect related issues for overlap. Use
mcp__hydrant__list_issuesfiltered by the issue's space, milestone, or labels — not a broad sweep. - Load
mcp__hydrant__list_labels({ spaceId })andmcp__hydrant__list_milestones({ spaceId })so you can recommend metadata fits.
Phase 2: Evaluate completeness
Judge each of the following as present, weak, or missing:
- Title — descriptive of the actual change?
- Status — appropriate for current readiness?
- Priority — set?
- Why this matters — problem or motivation paragraph?
- Goal — one-sentence statement of the change?
- In-scope items — concrete?
- Out-of-scope items — explicit fences?
- Acceptance criteria — testable from code or UI behavior?
- Implementation notes — file paths, APIs, conventions worth surfacing?
- Edge cases — at least the obvious failure modes named?
- Labels — applied, where the space has fitting ones?
- Milestone — assigned, when one fits?
- Dependencies —
blockedBy/blocks/relatesTopopulated as fields, not prose? - Follow-on tickets — anything large enough to belong in its own issue, captured separately?
Phase 3: Detect epic-level scope
If the issue would touch many independent surfaces or split naturally into 3+ tracks:
- State why it reads as epic-level (count of files/domains, parallel-run-able tracks).
- Suggest a breakdown: a milestone plus N flat issues. Hydrant uses flat issues grouped by milestones — there are no sub-issues. Don't propose parent/child structures.
- Note likely implementation order via
blockedBy/blocks. - Point out which sub-tickets can run in parallel.
The user decides whether to break it up. Don't auto-create sibling issues.
Phase 4: Interactive refinement
Present the gaps as a batch of decisions, not as a passive report. For each gap:
- Quote the relevant existing text (or note its absence).
- Explain what's missing and why it matters for implementation.
- Propose a concrete fix — actual replacement text, actual label IDs, actual milestone IDs.
Bundle the most important gaps first (acceptance criteria > scope > metadata > cosmetics). Ask the user to approve, reject, or modify the batch.
Phase 5: Apply changes
After approval:
mcp__hydrant__update_issue({ id, description, title?, priority?, type?, labelIds?, milestoneId?, estimate?, linkedDecisionIds?, linkedNoteIds? })with the approved updates in a single call.- If dependency changes were approved, apply the full desired state via
mcp__hydrant__set_dependencies({ issueId, blockedBy, blocks, relatesTo }). Pass the complete arrays —set_dependenciesis a replace, not a merge. - Create approved follow-on tickets via
mcp__hydrant__create_issueonly when the user explicitly opted into the breakdown.
Phase 6: Output
Summarize:
- Completeness level — readable in one phrase ("Implementation-ready", "Mostly there, two gaps left", "Needs scope decisions before coding").
- Changes applied — what actually got written to Hydrant.
- Open items still deferred — anything the user explicitly chose to leave for later.
- Next recommended step — usually
/prepif the issue is now solid;/nailif it's complete but the language is still vague;/create-issueif the breakdown produced new tickets.
If the issue was already solid before you started, say so explicitly and recommend /prep directly.
Edge cases
- Issue is in
donestatus. Refining a done issue is unusual — confirm with the user before changing it. The historical record matters. - Issue is a
bugwith no reproduction. Treat reproduction steps as a critical missing field. An unrepeatable bug isn't refine-able. - Description references files that don't exist. Flag the broken references in Phase 4 — those usually mean stale text or a partial migration. Either update the reference or remove it.
What this skill never does
- Modify sibling issues without explicit approval. Refining HYD-123 doesn't license you to edit HYD-124.
- Write metadata into the description prose. Dependencies, priority, labels, milestone, estimate, assignee — every one of those has a Hydrant field. Use the field.
- Skip the user's approval step. The whole point is collaborative refinement.
- Run code, tests, or migrations. Refinement is a thinking operation, not an executing one.
Why this matters
Underspecified issues either get implemented wrong or sit in the backlog forever because nobody knows where to start. /refine turns the second case into the first by surfacing what's missing and giving the user a single batch decision to make.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.