microsoft/groom-backlog
Audits recently closed PRs in agent-host-protocol (AHP) to make sure any future work they promised has a tracking issue (filing new ones or linking PRs to existing ones), then triages every open issue into implementable-now / no-longer-relevant / blocked-on-a-dependency, closing or annotating each accordingly, and finally prioritizes and implements the ready issues. Validates every follow-up and issue against the current state of this repo — the canonical `types/`, the generated client mirrors, the conformance fixtures, and the published versioned artifacts — before acting. Use when asked to triage or groom the issue backlog, file follow-up issues from merged PRs, audit closed PRs for un-tracked work, or work through the open issues.
npx skills add https://github.com/microsoft/agent-host-protocol --skill groom-backlog
microsoft/agent-host-protocol (AHP) is the canonical wire spec plus the five clients generated and hand-maintained against it (Rust, Kotlin, Swift, TypeScript, Go). It accumulates two kinds of latent work that drift out of sync with reality if nobody tends them:
TODO / "Known … gap" left in types/, a client whose hand-written surface wasn't updated to match a spec change. Some of that becomes a tracking issue; some silently doesn't.docs/proposals/).This skill is a backlog-grooming pass with three phases:
This is the most important instruction in this skill. Do not rush, and do not jump to conclusions. Triage is an analysis task first and an editing task second. Opening a duplicate issue, closing one that is still needed, annotating the wrong blocker, or implementing against a stale description is expensive to unwind and erodes trust in the backlog. A shallow pass is worse than doing nothing.
types/ they point at, the generated mirrors, and the conformance fixtures — don't infer from titles and subjects alone.docs/specification/versioning.md and the version registry in types/version/, not made casually. When a fix would break the wire surface, treat the versioning policy as a hard constraint and surface the call rather than silently shipping it.Lean on the explore agent to parallelize research across many PRs / issues within this repo when the investigation is broad, and feel free to spend several passes reading before you conclude anything.
Before touching the backlog, ground yourself in the system the same way you would before any non-trivial change here:
types/ (the source of truth), the generated schema/, the prose in docs/specification/ and docs/guide/, and AGENTS.md, CONTRIBUTING.md, and RELEASING.md. The editorial rules for changing protocol types live in .github/instructions/general-instructions.instructions.md — follow them.types/ change ripples outward: every protocol change regenerates schema/ and each client's /generated/ mirror, may need a hand-written client update, must keep the conformance fixtures under types/test-cases/ in sync, and lands a docs/.changes fragment for every affected artifact (per AGENTS.md → "Adding changelog fragments"). The version surface lives in types/version/registry.ts (PROTOCOL_VERSION, SUPPORTED_PROTOCOL_VERSIONS).types/. AHP is a contract that external clients implement and external products consume, so "is this follow-up still relevant?" is answered against the current spec, the generated and hand-maintained clients in this repo, and what the protocol already guarantees — not against any single implementation.You don't need to memorize everything up front, but a follow-up audit and an issue triage are only as good as your understanding of the current state of the system. Invest in that first.
You triage, file, and implement against this one repo — microsoft/agent-host-protocol. This is a public repository; keep the entire pass inside it and don't reference, read, or depend on any non-public repository or code. "Validation context" therefore means the current, public state of this repo plus what the protocol already ships:
types/, the generated schema/, and each client's /generated/ mirror.clients/<lang>/, plus the conformance fixtures in types/test-cases/.docs/specification/ and docs/guide/, and the in-flight design notes in docs/proposals/.types/version/registry.ts and the published, versioned artifacts generated from it (the crates, npm package, Maven/JVM library, Swift package, and Go module).AHP is a contract that external clients implement and external products consume, but those live in other repositories that are out of scope here. Judge "is this still relevant?" from the spec and the clients in *this* repo and from what the protocol already guarantees. If an issue's real resolution clearly belongs to some external implementation, note it for the user rather than going to read or act on another repository.
Always judge relevance against the current state of this repo's default branch plus its recently active open PRs — not whatever a local clone happens to have checked out. Fetch/refresh before you judge, and use gh to read the remote authoritatively. Note: this repo is in the microsoft org, where gh's GraphQL-backed commands (gh issue list, gh pr list) can intermittently fail with a credentials error; when that happens, fall back to the REST endpoints via gh api repos/microsoft/agent-host-protocol/... (see the appendix).
Ground yourself in the local conventions so your issues match the house style and your triage uses the right signals:
follow-up label — don't assume one exists. Apply the labels a maintainer would: type/area labels like enhancement, documentation, bug, debt, dependencies, and language tags like rust, plus disposition labels wontfix, duplicate, and invalid for closes. gh label list -R microsoft/agent-host-protocol is authoritative; if the team would benefit from a follow-up label, suggest creating one rather than silently inventing it..github/ISSUE_TEMPLATE/ forms today, so new issues are free-form — which means a follow-up issue needs to carry its own structure and completeness.types//client code or spec prose in question, a Problem statement, a concrete Proposed fix, an Affected artifacts note (which of types/ / schema/ / each clients/<lang>/ / docs/ / the CHANGELOGs the fix touches), a Tests / conformance list (the types/test-cases/ fixtures or client tests it needs), and an Out of scope section. Well-scoped existing issues are the model; read a few current open ones to match the house depth (gh issue list / gh issue view).## What / ## Why / ## How notes, "out of scope", "future work", "follow-up", "deferred"), in review threads (a reviewer asks for something and the author defers it), and in the code the PR landed (TODO, FIXME, "Known … gap", "deferred from PR #…" in types/ comments, hand-written client source, or docs). The inverse — promised work with *no* issue — is exactly what phase 1 hunts for.types/ is the canonical wire contract. A change to the protocol surface is never local: it regenerates schema/ and every client's /generated/ mirror, may require a matching hand-written client change, must keep the conformance fixtures in types/test-cases/ aligned, and lands a docs/.changes fragment in each affected artifact's scope. AGENTS.md and .github/instructions/general-instructions.instructions.md are the authorities on when and how to touch that tree; the versioning policy governs anything that moves PROTOCOL_VERSION. Follow them.Treat the following as the shape of the work, not a rigid script. Adapt the order and depth to what you find; the goal is a confident, well-understood backlog plus a clear report — not mechanical step-execution.
TODO/FIXME it introduced, a reviewer request the author postponed, a client mirror left un-regenerated, a conformance fixture marked skipped.types//client code or doc it pointed at still there and still the right place?enhancement, documentation, bug, rust). Cross-link the PR.types//client code, the schema, the docs, and any docs/proposals/ discussion it refers to. Validate before you classify. Never close or annotate on a hunch.wontfix / duplicate / invalid). Use the "not planned" close reason when it wasn't completed.docs/proposals/ discussion, a prerequisite spec change). Leave it open and add a comment naming the *specific* blocker, why it must resolve first, and — where possible — a link to the issue / PR / proposal in this repo to watch.types/); then enhancements and docs. State the ordering and the reasoning.CONTRIBUTING.md).types/, run npm run generate so schema/ and every client's /generated/ mirror regenerate, update any hand-written client surface and the types/test-cases/ conformance fixtures, refresh the docs, and add the docs/.changes fragment(s) the change requires (per AGENTS.md). Validate with the repo's own build / lint / test gates (see appendix). Don't consider a change done until it builds and passes. Open the PR with Closes #N (list each issue in a cluster).Produce a clear, honest summary covering:
PROTOCOL_VERSION bump under the versioning policy).If the user wants a durable artifact, the report can be written to the repo's gitignored .local/ folder; otherwise present it in the conversation.
types/, the generated mirrors, the schema, the docs, and the conformance fixtures. A wrong close is worse than a stale issue.follow-up label) — suggest one if it's warranted. Closed issues get an explanatory comment and a disposition label.microsoft/agent-host-protocol and don't reference, read, or act on any other (non-public) repository. If an issue's resolution belongs elsewhere, describe it for the user instead of acting on it.types/, the regenerated schema/ + client mirrors, the conformance fixtures, the docs, and the scoped docs/.changes fragment move together — never hand-edit a /generated/ file. A breaking protocol change is gated by the versioning policy; don't ship one without honoring it.These are starting points, not the whole method — verify them against the repo's current state (AGENTS.md, CONTRIBUTING.md, RELEASING.md, gh label list), which is authoritative if it disagrees with anything here. For each gh issue/gh pr command below, if the GraphQL-backed form returns a credentials error in this microsoft-org repo, use the REST gh api repos/microsoft/agent-host-protocol/... form instead.
Survey recently closed PRs and read what they promised:
# Recently merged PRs (adjust --limit / filter the window you chose):
gh pr list -R microsoft/agent-host-protocol --state merged --limit 50 \
--json number,title,mergedAt,url --jq '.[] | "\(.number)\t\(.mergedAt)\t\(.title)"'
# REST fallback if the above errors:
gh api "repos/microsoft/agent-host-protocol/pulls?state=closed&per_page=50" \
--jq '.[] | select(.merged_at) | "\(.number)\t\(.merged_at)\t\(.title)"'
# A PR's body, the issues it already closes, and its review threads:
gh pr view <n> -R microsoft/agent-host-protocol --json title,body,url,closingIssuesReferences
gh pr view <n> -R microsoft/agent-host-protocol --comments
gh api repos/microsoft/agent-host-protocol/pulls/<n>/comments --jq '.[] | {path, line, body}'
# Deferred markers left in the code (run in the working tree):
grep -rniE 'TODO|FIXME|follow-up|known .* gap|deferred from' types/ clients/ docs/
Search existing issues before filing (open *and* closed), then file or link:
gh issue list -R microsoft/agent-host-protocol --state all --search "<keywords>" \
--json number,title,state --jq '.[] | "\(.number)\t\(.state)\t\(.title)"'
# REST fallback:
gh api "repos/microsoft/agent-host-protocol/issues?state=all&per_page=100" \
--jq '.[] | "\(.number)\t\(.state)\t\(.title)"'
# File a new follow-up issue (match the quality bar in the body; pick real labels):
gh issue create -R microsoft/agent-host-protocol \
--title "<area>: <concise follow-up>" --body-file <path> --label enhancement
# Or link a PR to an existing open issue instead of duplicating:
gh issue comment <n> -R microsoft/agent-host-protocol \
--body "Follow-up tracked here was deferred from #<pr> (<thread/code link>)."
Triage the open issues:
# Full open list with labels and recency:
gh issue list -R microsoft/agent-host-protocol --state open --limit 100 \
--json number,title,labels,updatedAt \
--jq '.[] | "\(.number)\t\(.updatedAt)\t[\(.labels|map(.name)|join(","))]\t\(.title)"'
gh issue view <n> -R microsoft/agent-host-protocol # read one in full
# No longer relevant — close with an explanation + disposition label:
gh issue close <n> -R microsoft/agent-host-protocol --reason "not planned" \
--comment "Closing: <why it's obsolete, with link to the PR/change that resolved or invalidated it>."
gh issue edit <n> -R microsoft/agent-host-protocol --add-label wontfix # or duplicate / invalid
# Blocked — leave open, annotate the specific blocker:
gh issue comment <n> -R microsoft/agent-host-protocol \
--body "Blocked on <dependency> (<blocking issue / PR / proposal link>); needs to land first because <reason>."
Judge relevance against this repo's own history and surface:
# Did a later merged PR already do it, or change its shape?
gh pr list -R microsoft/agent-host-protocol --state merged --limit 100 \
--search "<keywords>" --json number,title,mergedAt \
--jq '.[] | "\(.number)\t\(.mergedAt)\t\(.title)"'
# Is the spec surface it pointed at still there and still the right place?
grep -rniE '<symbol or keyword>' types/ docs/
# The protocol/version surface a follow-up was written against:
cat types/version/registry.ts
Validate every implementation before declaring it done (see CONTRIBUTING.md / AGENTS.md for the authoritative list):
npm install # root tooling
npm run generate # regenerate every client mirror + schemas from types/
npm test # typecheck + lint + release/changelog verification + reducer tests
# Per-client (run only what your change touches):
cd clients/typescript && npm ci && npm test && npm run build
cd clients/rust && cargo test --workspace
cd clients/kotlin && ./gradlew build
swift build && swift test # Swift uses the root Package.swift
cd clients/go && go test ./...
Take microsoft/groom-backlog from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference npm.
Without those the skill loads but fails at the first command.