Skill

backlog

Single interface for backlog items and GitHub Issues. GitHub Issues are the source of truth; ~/.dh/projects/{slug}/backlog/ per-item files are the local cache. All backlog CRUD goes through MCP tools (mcp__plugin_dh_backlog__*) in orchestrator sessions — no direct file edits. Use when creating, listing, viewing, updating, closing, resolving, grooming, or syncing backlog items and GitHub issues.

From dh
Install
1
Run in your terminal
$
npx claudepluginhub jamie-bitflight/claude_skills --plugin development-harness
Tool Access

This skill uses the workspace's default tool permissions.

Supporting Assets
View in Repository
CLI_TO_MCP_MIGRATION.md
README.md
references/item-schema.md
references/known-patterns.md
references/state-machine.md
templates/item.md
templates/milestone-archive.md
Skill Content

Backlog

MCP tools are the primary interface for backlog items and GitHub Issues. GitHub Issues are the source of truth; ~/.dh/projects/{slug}/backlog/ per-item files are the local cache. Skills and agents invoke MCP tools or the CLI — no direct Write/Edit on per-item files.

Primary Interface (MCP)

All 10 tools return a dict. On error the dict contains an "error" key. On success it contains result data keys plus messages: list[str] and warnings: list[str] (always present, may be empty). Always check for "error" before consuming result fields.

The MCP tool name prefix is mcp__plugin_dh_backlog__ followed by the tool name below.

backlog_add

Create a new backlog item and optionally a GitHub issue.

ParameterTypeDefaultDescription
titlestrrequiredItem title
prioritystrrequiredP0, P1, P2, or Ideas
descriptionstrrequiredItem description
sourcestr"Not specified"Where this item came from
typestr"Feature"Feature, Bug, Refactor, Docs, or Chore
create_issueboolTrueCreate a GitHub issue for this item
forceboolFalseSkip fuzzy duplicate check

Returns {filepath, filename, title, priority, issue_num?, messages, warnings}.

Note — research_first has no MCP equivalent. Embed research questions in description.

backlog_list

List open backlog items with optional filters.

ParameterTypeDefaultDescription
from_githubboolFalseRefresh local cache from GitHub before listing
labelstr | NoneNoneFilter by GitHub label (e.g. "priority:p1")
sectionstr | NoneNoneFilter by priority section: P0, P1, P2, or Ideas
statusstr | NoneNoneFilter by status (e.g. "needs-grooming", "status:in-progress")
titlestr | NoneNoneFilter by title substring (case-insensitive)

Every response item includes state (open/closed) and status (workflow status from status:* labels). Returns {items: [{title, priority, issue, plan, state, status, milestone}], backend: {...}, messages, warnings}.

The backend dict is always present. It reports GitHub availability status probed on every call, regardless of the from_github parameter. No automatic sync is triggered.

backend fieldTypeDescription
namestrBackend name ("GitHub")
availabilitystr"reachable" | "not_checked" | "needs_authentication" | "rate_limited" | "error"
open_countintLive open issue count (0 when not reachable)
total_countintLive total issue count (0 when not reachable)
cache_open_countintOpen count from local cache, same filters as items
cache_total_countintTotal count from local cache
last_syncstrISO timestamp of most recent sync, empty string if never synced
errorstrError detail when availability is not "reachable", otherwise ""

Note — the CLI --format text|json flag has no MCP equivalent. MCP tools always return structured dicts (equivalent to JSON). Use backlog_view for detailed single-item output.

backlog_view

View a single backlog item in detail. Supports pagination for long bodies.

ParameterTypeDefaultDescription
selectorstrrequiredGitHub issue URL, #N, bare number, or title substring
include_contentboolTrueWhen True (default), returns full body and section entries. When False, returns metadata and section inventory only (section names with entry counts, no body or entry content).
offsetint0Skip N entry blocks from body start (for pagination)
limitint0Show at most N entry blocks (0 = all, no truncation)

Returns {title, priority, issue, plan, file_path, body, groomed, messages, warnings} when include_content=True (default). When include_content=False, returns compact metadata: {title, priority, issue, plan, file_path, groomed, sections_metadata, messages, warnings} where sections_metadata is a list of {name, num_entries, num_struck} dicts — no body or sections keys.

backlog_sync

Sync backlog items with GitHub — create missing issues and push groomed content. Emits progress messages via MCP context during execution.

ParameterTypeDefaultDescription
dry_runboolFalsePreview changes without modifying anything

Returns {created, pushed, messages, warnings}.

backlog_close

Dismiss a backlog item without completing it and close its GitHub issue. ADR-9.

Use for duplicates, out-of-scope items, superseded items, wontfix, or permanently blocked. For completed work, use backlog_resolve instead.

ParameterTypeDefaultDescription
selectorstrrequiredTitle substring, #N, bare number, or GitHub issue URL
reasonstrrequiredOne of: duplicate, out_of_scope, superseded, wontfix, blocked
referencestr""Related item: #N, URL, or title of item this duplicates/is superseded by
commentstr""Additional context about why this item is being closed
cleanupboolFalseRemove local file after close
forceboolFalseClose even if open PRs reference the issue

Returns {title, reason, closed, messages, warnings}.

backlog_resolve

Mark a backlog item as DONE (completed) and close its GitHub issue with an evidence trail.

Creates a structured completion record (summary, method, notes, follow-ups, findings) as an audit/retrospective trail. Only summary is required — a one-liner suffices for trivial items. For dismissals (duplicate, out of scope, etc.), use backlog_close instead.

ParameterTypeDefaultDescription
selectorstrrequiredTitle substring, #N, bare number, or GitHub issue URL
summarystrrequiredWhat was done — 1-2 sentence completion summary
planstr | NoneNonePlan path or completion reference
methodstr | NoneNoneHow the work was done
notesstr | NoneNoneProblems found, surprises, or other comments
follow_upsstr | NoneNoneCreated follow-up tickets (comma-separated refs)
findingsstr | NoneNoneRetrospective learnings from this work
cleanupboolFalseRemove local file after resolve
forceboolFalseResolve even if open PRs reference the issue

Returns {title, summary, resolved, messages, warnings}.

backlog_update

Update a backlog item — attach a plan, set status, create a GitHub issue, or write groomed content.

For groomed content: provide groomed_content for full replacement, or section + content for incremental section update.

ParameterTypeDefaultDescription
selectorstrrequiredTitle substring, #N, bare number, or GitHub issue URL
planstr | NoneNonePath to a plan file to attach
statusstr | NoneNoneSet item status (e.g. "in-progress")
create_issueboolFalseCreate a GitHub issue if the item lacks one (P0/P1 only)
groomed_contentstr | NoneNoneFull groomed content (replaces entire groomed section)
sectionstr | NoneNoneSection name for incremental update (use with content)
contentstr | NoneNoneContent for the named section (use with section)
titlestr | NoneNoneNew title — updates local file and GitHub issue title
descriptionstr | NoneNoneNew description (local file only, no GitHub sync)

Returns {title, changes, messages, warnings}.

backlog_groom

Write groomed content into a backlog item and sync to its GitHub issue. Emits progress messages via MCP context during execution.

Provide either groomed_content (full replacement) or section + content (incremental).

ParameterTypeDefaultDescription
selectorstrrequiredTitle substring, #N, bare number, or GitHub issue URL
groomed_contentstr | NoneNoneFull groomed content (replaces entire groomed section)
sectionstr | NoneNoneSection name for incremental update
contentstr | NoneNoneContent for the named section

Returns {title, synced, messages, warnings}.

Note — --groomed-file and stdin pipe patterns have no MCP equivalent. Provide content inline.

backlog_normalize

Normalize all per-item files to research-style metadata format and remove body duplication. One-off maintenance operation. Emits progress messages via MCP context during execution.

ParameterTypeDefaultDescription
dry_runboolFalsePreview changes without modifying files

Returns {updated, dry_run?, messages, warnings}.

backlog_pull

Pull issue body content from GitHub into local per-item files. Auto-migrates P0/P1 items lacking GitHub Issues by creating them. Merges by section, keeping the longer version unless force=True. Emits progress messages via MCP context during execution.

ParameterTypeDefaultDescription
selectorstr | NoneNonePull a single item: title substring, #N, bare number, or GitHub issue URL
dry_runboolFalsePreview changes without modifying local files
forceboolFalseOverwrite local content even if local version is newer or longer

Returns {pulled, messages, warnings} for bulk pull; {file_path, messages, warnings} for single-item pull.

Return Value Contract

All tools return a dict. Callers must handle both shapes:

Error:   {"error": "<message>", "messages": [...], "warnings": [...]}
Success: {<result fields>, "messages": [...], "warnings": [...]}

Always check for the "error" key before consuming result fields. Log messages and warnings when non-empty.

CI/CLI Interface

GitHub Actions and environments without an MCP client use fastmcp call against the MCP server.

uv run fastmcp call plugins/development-harness/.mcp.json <tool_name> [key=value ...]

Available tools mirror the MCP tools: backlog_add, backlog_list, backlog_view, backlog_sync, backlog_close, backlog_resolve, backlog_update, backlog_groom, backlog_normalize, backlog_pull.

Environment

  • GITHUB_TOKEN — Required for all GitHub issue operations (add, sync, close, resolve, update --create-issue, pull). Set in environment before invoking MCP tools or the CLI.

Integration

  • /create-backlog-item — calls mcp__plugin_dh_backlog__backlog_add to create per-item files and issues
  • /work-backlog-item — calls backlog_list, backlog_view, backlog_close, backlog_resolve, backlog_update
  • /groom-backlog-item — calls backlog_groom and backlog_update for groomed content
  • /group-items-to-milestone — calls backlog_list to enumerate items for milestone grouping
  • GitHub Action — invokes fastmcp call backlog_sync on ~/.dh/projects/{slug}/backlog/ changes

Do not edit ~/.dh/projects/{slug}/backlog/*.md files directly or use gh issue edit — both bypass sync logic. Use backlog_update MCP tool for all item modifications. If the MCP tools or CLI lack a needed operation, invoke /backlog-tools-administrator to close the gap.

Stats
Parent Repo Stars30
Parent Repo Forks4
Last CommitMar 23, 2026