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 to gh, 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 with mcp__hydrant__get_issue({ identifier: "HYD-12" }).
12 → normalize to HYD-12.
- Bare title or fragment →
mcp__hydrant__list_issues with the keyword in searchText filtering, 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_issues filtered by the issue's space, milestone, or labels — not a broad sweep.
- Load
mcp__hydrant__list_labels({ spaceId }) and mcp__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 / relatesTo populated 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_dependencies is a replace, not a merge.
- Create approved follow-on tickets via
mcp__hydrant__create_issue only 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
/prep if the issue is now solid; /nail if it's complete but the language is still vague; /create-issue if 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
done status. Refining a done issue is unusual — confirm with the user before changing it. The historical record matters.
- Issue is a
bug with 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.
1---2name: refine3description: 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.4---56# Refine78Refine 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`.910## Source of truth1112- Hydrant MCP for the live issue, sibling issues, labels, milestones, and dependencies. Use `mcp__hydrant__*` tools exclusively — never shell out to `gh`, `curl`, or hardcoded URLs.13- The user's codebase for grounding the refinement in reality (file paths, existing patterns, what's already shipped).1415## Issue resolution1617Normalize the input:1819- `HYD-12` → use directly with `mcp__hydrant__get_issue({ identifier: "HYD-12" })`.20- `12` → normalize to `HYD-12`.21- Bare title or fragment → `mcp__hydrant__list_issues` with the keyword in `searchText` filtering, then ask the user which match they meant.2223Fetch both:2425- `mcp__hydrant__get_issue({ identifier, include: ["context"] })` — issue body plus linked decisions, notes, dependencies, labels, space.2627If the issue can't be found, list likely matches via `mcp__hydrant__list_issues` and ask the user.2829## Workflow3031### Phase 1: Gather context32331. Fetch the issue with `include: ["context"]` so you have its decisions, notes, dependencies, and labels in one round-trip.342. 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.353. 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.364. Inspect related issues for overlap. Use `mcp__hydrant__list_issues` filtered by the issue's space, milestone, or labels — not a broad sweep.375. Load `mcp__hydrant__list_labels({ spaceId })` and `mcp__hydrant__list_milestones({ spaceId })` so you can recommend metadata fits.3839### Phase 2: Evaluate completeness4041Judge each of the following as **present**, **weak**, or **missing**:4243- Title — descriptive of the actual change?44- Status — appropriate for current readiness?45- Priority — set?46- Why this matters — problem or motivation paragraph?47- Goal — one-sentence statement of the change?48- In-scope items — concrete?49- Out-of-scope items — explicit fences?50- Acceptance criteria — testable from code or UI behavior?51- Implementation notes — file paths, APIs, conventions worth surfacing?52- Edge cases — at least the obvious failure modes named?53- Labels — applied, where the space has fitting ones?54- Milestone — assigned, when one fits?55- Dependencies — `blockedBy` / `blocks` / `relatesTo` populated as fields, not prose?56- Follow-on tickets — anything large enough to belong in its own issue, captured separately?5758### Phase 3: Detect epic-level scope5960If the issue would touch many independent surfaces or split naturally into 3+ tracks:61621. State why it reads as epic-level (count of files/domains, parallel-run-able tracks).632. 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.643. Note likely implementation order via `blockedBy` / `blocks`.654. Point out which sub-tickets can run in parallel.6667The user decides whether to break it up. Don't auto-create sibling issues.6869### Phase 4: Interactive refinement7071Present the gaps as a batch of decisions, not as a passive report. For each gap:7273- Quote the relevant existing text (or note its absence).74- Explain what's missing and why it matters for implementation.75- Propose a concrete fix — actual replacement text, actual label IDs, actual milestone IDs.7677Bundle the most important gaps first (acceptance criteria > scope > metadata > cosmetics). Ask the user to approve, reject, or modify the batch.7879### Phase 5: Apply changes8081After approval:82831. `mcp__hydrant__update_issue({ id, description, title?, priority?, type?, labelIds?, milestoneId?, estimate?, linkedDecisionIds?, linkedNoteIds? })` with the approved updates in a single call.842. If dependency changes were approved, apply the *full desired state* via `mcp__hydrant__set_dependencies({ issueId, blockedBy, blocks, relatesTo })`. Pass the complete arrays — `set_dependencies` is a replace, not a merge.853. Create approved follow-on tickets via `mcp__hydrant__create_issue` only when the user explicitly opted into the breakdown.8687### Phase 6: Output8889Summarize:9091- **Completeness level** — readable in one phrase ("Implementation-ready", "Mostly there, two gaps left", "Needs scope decisions before coding").92- **Changes applied** — what actually got written to Hydrant.93- **Open items still deferred** — anything the user explicitly chose to leave for later.94- **Next recommended step** — usually `/prep` if the issue is now solid; `/nail` if it's complete but the language is still vague; `/create-issue` if the breakdown produced new tickets.9596If the issue was already solid before you started, say so explicitly and recommend `/prep` directly.9798## Edge cases99100- **Issue is in `done` status.** Refining a done issue is unusual — confirm with the user before changing it. The historical record matters.101- **Issue is a `bug` with no reproduction.** Treat reproduction steps as a critical missing field. An unrepeatable bug isn't refine-able.102- **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.103104## What this skill never does105106- Modify sibling issues without explicit approval. Refining HYD-123 doesn't license you to edit HYD-124.107- Write metadata into the description prose. Dependencies, priority, labels, milestone, estimate, assignee — every one of those has a Hydrant field. Use the field.108- Skip the user's approval step. The whole point is collaborative refinement.109- Run code, tests, or migrations. Refinement is a *thinking* operation, not an executing one.110111## Why this matters112113Underspecified 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.