Herdr Issue Triage
herdrdev/herdr
Triages open herdr GitHub issues into a short decision-first Markdown table with a priority light, recommendation, age, reactions and a reason for each.
Grooms the Backlog column of a GitHub project board by re-verifying each issue against current main, closing dead ones, promoting actionable ones to Ready and naming the decision the rest need.
$ npx skills add adamayoung/TMDb --skill triage-issues -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install adamayoung/TMDb triage-issues --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/adamayoung/TMDb.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/triage-issues .claude/skills/triage-issues && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "triage-issues" agent skill from https://github.com/adamayoung/TMDb/tree/main/.claude/skills/triage-issues into .claude/skills/triage-issues/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "triage-issues", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/adamayoung/TMDb/tree/main/.claude/skills/triage-issuesType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add adamayoung/TMDb --skill triage-issues -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install adamayoung/TMDb triage-issues --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/adamayoung/TMDb.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/triage-issues .agents/skills/triage-issues && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "triage-issues" agent skill from https://github.com/adamayoung/TMDb/tree/main/.claude/skills/triage-issues into .agents/skills/triage-issues/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "triage-issues", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add adamayoung/TMDb --skill triage-issues -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install adamayoung/TMDb triage-issues --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/adamayoung/TMDb.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/triage-issues .cursor/skills/triage-issues && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "triage-issues" agent skill from https://github.com/adamayoung/TMDb/tree/main/.claude/skills/triage-issues into .cursor/skills/triage-issues/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "triage-issues", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/adamayoung/TMDb.git --path .claude/skills/triage-issues--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add adamayoung/TMDb --skill triage-issues -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install adamayoung/TMDb triage-issues --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/adamayoung/TMDb.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/triage-issues .gemini/skills/triage-issues && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "triage-issues" agent skill from https://github.com/adamayoung/TMDb/tree/main/.claude/skills/triage-issues into .gemini/skills/triage-issues/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "triage-issues", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install adamayoung/TMDb triage-issuesInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add adamayoung/TMDb --skill triage-issues -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/adamayoung/TMDb.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/triage-issues .github/skills/triage-issues && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "triage-issues" agent skill from https://github.com/adamayoung/TMDb/tree/main/.claude/skills/triage-issues into .github/skills/triage-issues/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "triage-issues", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add adamayoung/TMDb --skill triage-issues -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install adamayoung/TMDb triage-issues --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/adamayoung/TMDb.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/triage-issues .opencode/skills/triage-issues && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "triage-issues" agent skill from https://github.com/adamayoung/TMDb/tree/main/.claude/skills/triage-issues into .opencode/skills/triage-issues/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "triage-issues", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
triage-issuesGrooms the Backlog column of a GitHub project board by re-verifying each issue against current main, closing dead ones, promoting actionable ones to Ready and naming the decision the rest need.
The skill discovers its own work with no input: it resolves the GitHub project by exact title rather than a hard-coded number, since a stale number would make later writes silent no-ops, and stops rather than guessing if zero or more than one project matches. Project reads and writes go through the GitHub MCP's project tools rather than the gh CLI, because the project scope the gh CLI needs is not on this repository's usual token. Before judging anything it fetches the latest main so every verdict is checked against current history rather than a stale checkout.
Priority and size come from a single shared rubric file that every agent run reads, so the triage logic and the rubric are never duplicated elsewhere in the repository. Its output is limited to field updates on the board, at most one comment per changed issue, a status update carrying the ordered run list, and a summary; it never opens a pull request, edits source, or touches an issue that is not already in Backlog. The excerpt breaks off while still describing the git fetch step.
9 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit a3f1311. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
ghgitpython3From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use gh and git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
TMDb Backlog Triager loads about 5k tokens when it runs. Until then it costs about 111 tokens; SKILL.md has 2,937 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from adamayoung/TMDb at commit a3f1311, republished under its Apache-2.0 licence (© adamayoung). 2,937 words, ~5,018 tokens.
.claude/skills/triage-issues/SKILL.md (or your agent's skills folder).Grooms the Backlog column of the TMDb GitHub Project into a queue someone
can work from without asking a question first.
The board is at github.com/users/adamayoung/projects/<n>; issues live in
adamayoung/TMDb. This skill owns the Ready test, the four exits, the
wontfix rules and the skip rule; the priority and size rubrics live in
.claude/workflows/triage-issues.js (RUBRIC), the copy handed to every
agent — nothing else in the repo restates any of them.
Issue creation is owned by .github/ISSUE_FILING.md;
this skill consumes what that produces.
Input: nothing. It discovers its own work. Output: field updates on the board, at most one comment per changed issue, a Project status update carrying the ordered run-list, and a summary to the caller. Never: opens a PR, edits source, or changes an issue that is not in Backlog.
Project operations go through the GitHub MCP (mcp__github__projects_*), not
gh project. Per ADR-0009 the MCP is the default and gh covers only the
enumerated exceptions, which Projects is not — and concretely, gh project
requires a read:project token scope this repo's usual token does not carry, so
the gh route fails at the first call.
Resolve by title, never a hard-coded number — the number changes if the board is recreated, and a stale number makes every later write a silent no-op:
mcp__github__projects_list / list_projects owner: adamayoung, owner_type: user
→ select the project whose title is exactly "TMDb"Zero matches or more than one → stop and say so. Do not guess.
"Headless" here means unattended within a session — it decides for itself. It cannot run on a GitHub Actions runner: the Project MCP is user-scoped and is not mounted there (ADR-0009 records this as the reason
claude.ymlandintegration-failure.ymlstay ongit/gh), andgh projectneeds a scope this repo's token lacks. Wiring this to a cron would fail at the call above.
Then pin the tree the verdicts are about. The Ready test says "re-verified at HEAD", which is worth nothing if HEAD is a stale checkout or a feature branch — run this skill from an unfetched branch and every verdict is stamped against history while claiming to be current.
git fetch origin
git rev-parse --abbrev-ref HEAD # must be main
git rev-parse --short origin/main # this is the sha passed to the workflowNot on main, or main behind origin/main → say so and stop. The agents run
git log in this checkout, so the checkout has to be the thing being triaged.
A skill cannot be tested from the branch that introduces it. This guard demands
main, and checking outmainremoves an unmerged skill file — so the first real run necessarily comes after the merge. That is the right way round: a branch's tree is not what the issues are about. When this was first hit,Sources/andTests/were identical tomainbutci.yml,MakefileandScripts/were not — which is exactly what two of the open CI issues were about. Dry-run the workflow directly if you need to exercise the machinery before merging; do not relax this.
Capture that sha and today's date; both are passed to the workflow, which cannot compute a date itself.
Any open issue in adamayoung/TMDb that is not on the board is invisible to
this skill. Sweep them in before triaging, or a forgotten project assignment
silently loses work:
gh issue list --repo adamayoung/TMDb --state open --limit 200 --json number,urlAdd each missing one with projects_write / add_project_item, then set its
Status to Backlog explicitly with update_project_item. Do not rely on the
board's "Item added" workflow to do it: whether that automation is enabled is not
queryable through the API and nothing here can check it. If it is off, adopted
items arrive with no Status — and since Phase 3 onward works from the Backlog
set and the
scope rule forbids touching anything outside Backlog, they would be permanently
invisible. That is the precise outcome this phase exists to prevent, so it must
not depend on an unverifiable assumption.
For the same reason, Phase 3 treats an item with empty Status as Backlog.
Report the count adopted. A growing count usually means an issue-filing skill is
skipping its board step — a bug in that skill, not here. One standing
exception: .github/workflows/integration-failure.yml files its alert issue
with plain gh issue create and cannot add it to the board, for the same reason
this skill cannot run on a runner. Those arrive as orphans every time. Adopt them,
but do not read them as a filing bug — and take care triaging one that tracks an
in-flight fix PR, since it is not stale, it is in progress.
Do this before fanning out, not after. A triage agent costs roughly 80k tokens, so a full backlog is over a million tokens a run. The comment-suppression rule in Phase 7 saves noise; it does not save any of that, because the agent has already run by the time the digest is compared. On a schedule, most runs would spend a million tokens re-discovering that nothing moved.
For each Backlog issue, read the most recent triage marker in its comments:
<!-- triaged: <sha> | <digest> | <exit> | <priority> | <size> | deps=<csv> -->Skip the agent when all four hold:
<sha> matches the origin/main sha from Phase 1 — compare
by prefix, either direction, since one may be short and the other full;updated_at is no later than the marker comment's updated_at
— that is the operational test, and it is why Phase 7 writes the marker
comment last: any label or field write landing after it would stamp the
issue as touched by this skill's own hand, and the item would re-triage
forever;verifiedBy cites no live-API check, and its priority
rests on no dated trigger (see below).A skipped issue carries its marker's exit, priority, size and deps
forward, which is why the marker holds them rather than the digest alone — it
keeps its place in the ordering without an agent having read it.
Conditions 3 and 4 exist because "main has not moved" is narrower than it
sounds. A verdict rests on three things this repo does not control:
mcp__tmdb__* rather than trust the body. The API drifts on its own schedule;
an issue can start or stop reproducing with main untouched.wontfix, which is
no commit at all.The 30-day ceiling costs one full sweep a month and bounds all three.
Anything else is triaged: no marker, an unparseable one, a moved main, a
touched issue, an old marker, or a live-API/dated-trigger verdict. Prefer
re-triaging on doubt — the cost of a needless agent is tokens, the cost of a
wrongly-skipped one is a stale verdict presented as current.
Report the split (n skipped, m triaged). A run that skips everything is the
expected steady state, not a failure.
Take the issues that survived Phase 3 — including any item whose Status is empty, per Phase 2 — and run the workflow:
Workflow({ scriptPath: '.claude/workflows/triage-issues.js',
args: { issues: [437, 434, ...], head: '<sha>', today: '<YYYY-MM-DD>' } })Pass issues as a real array, not a JSON string — a stringified array reaches
the script as one string and fans out per character. The script guards this, but
the guard is a backstop, not a licence.
One read-only agent per issue. They report; only this skill writes. That separation is what keeps a parallel run from racing on the board.
If the workflow reports untriaged, those issues are unknown, not clean.
Leave them in Backlog untouched and name them in the summary.
The agents saw one issue each; the cross-issue judgements are yours.
dependsOn graph. A cycle means at least one edge
is wrong — re-read both issues rather than picking one to break. An edge onto a
closed issue is discharged; drop it.filesTouched overlap are not dependent, but
landing them in parallel costs a rebase. Record it; it changes the order, not
the status.ready only if every issue it dependsOn is
closed or also becoming Ready ahead of it. Otherwise it stays Backlog.wontfix/duplicate verdicts pointing at each other means
neither agent saw the other. Keep the older issue, close the newer.The ordering is computed, not composed. Run it:
python3 Scripts/build_run_list.py .build/run-list-input.jsonInput is { head, ready, closed }. ready uses triage-issues.js'
VERDICT_SCHEMA field names (issue, priority, size, dependsOn,
filesTouched), so a freshly-triaged verdict is passed through untouched —
re-shaping records by hand would put back, at the input, the transcription risk
the script removes at the output. A skipped issue is assembled from its
marker (issue, priority, size, dependsOn; it carries no filesTouched).
closed lists the issues Phase 5 discharged edges onto.
It returns ordered, runListLine, and the three disclosures Phase 8 needs:
depsOutrankPriority, dischargedEdges, unseparableContention.
An empty Ready set returns runListLine: null with a note saying why —
deliberately, because a line with an empty issue list would parse as a
well-formed run-list containing nothing, which is worse than no line at all.
Publish the update without the line in that case, and carry the note.
The four sort rules — dependency order, priority, contention, size — are
defined in Scripts/build_run_list.py,
which is the copy that actually decides. Read them there; do not restate them
here. That is the same single-ownership rule this file already applies to the
rubrics, and for the same reason: a second copy drifted from the
script within a day of being written. What is worth knowing without opening it:
rule 1 outranks rule 2 (a P2 that unblocks a P0 goes first, which the script
implements as effective priority — a plain topological sort does not do
this), rule 2 outranks rule 3 (separating contenders never crosses a priority
band), and contention is computed only over freshly-triaged issues because a
marker carries no filesTouched.
Do not re-sort what it returns. Phase 8 pastes ordered and runListLine
as they came back.
If it exits non-zero, it has found something Phase 5 should have resolved — a cycle, an edge onto an issue that is neither Ready nor closed, or a malformed record. Fix the input and re-invoke. Never hand-write the line: a hand-assembled line is the exact defect this phase was changed to remove. If it cannot be fixed this run, publish the status update without the line and say why — no line is honest, a wrong line is not.
Per issue, by exit:
| Exit | Status | Also |
|---|---|---|
ready | Ready | set Priority + Size |
blocked | stays Backlog | add question label; comment leads with the decision needed |
wontfix | close as not planned | add wontfix label; comment states the basis and cites the evidence |
split | stays Backlog | comment proposes the split; do not create the child issues |
Set Priority and Size on blocked and split items too — an unsized backlog
item cannot be planned around. Only ready moves column.
split deliberately stops at a recommendation. Fanning one issue into six
headless is a lot of tracker churn from a judgement call, and the split is
usually obvious to a human in ten seconds.
Headless on a schedule, a comment per issue per run makes the issues unreadable within a month. So:
marker field, verbatim. The
workflow script assembles it so the written form and the form Phase 3 parses
cannot drift apart. Do not hand-build it.evidenceDigest differs from the previous run. A new HEAD alone is not a
reason to comment; nothing changed for the reader.HEAD has advanced, refresh the marker in
place — edit the existing triage comment so its <sha> is current, rather
than posting a new one. Without this the marker's sha only ever advances when
a verdict changes, so in the steady state this skill is built for — main
moves, verdicts do not — Phase 3's skip could never fire and every run would
pay the full fan-out. The comment body stays as it was; only the marker moves.The digest and the marker are computed by the workflow script, not by the
agent. The digest covers the decision-bearing fields only (exit, priority,
size, wontfixBasis, sorted dependsOn, sorted staleClaims locations).
Prose is deliberately excluded. Do
not ask an agent for it and do not recompute it here: an LLM asked for a "stable
fingerprint" will word the same findings differently each run, the digests will
differ every time, and this rule quietly becomes a no-op that still looks
enforced.
Comment content: what changed since filing, then corrected file:line pointers, then anything a picker-upper needs that the body lacks. Do not restate the issue back at its author.
One Project status update per run — this is where execution order lives, since the board has no rank field:
mcp__github__projects_write / create_project_status_update
status: ON_TRACK (or AT_RISK if anything P0 is blocked)Body: the ordered Ready list (number, title, priority, size, one-line reason), then dependency edges, then contention warnings, then the Backlog-blocked items each with its one-sentence decision. Keep it scannable — it is read at a glance, and it is the diff between one run and the next.
End the body with Phase 6's runListLine, exactly as it came back, and
nothing after it. Do not reword, prettify, annotate, wrap, or re-derive it — you
are pasting a field, not writing to a format.
/deliver next parses that line and nothing else to decide what to work on
(.claude/skills/deliver/references/next-mode.md
§3). The prose table above it is for humans and is rewritten from scratch every
run — the 2026-08-18 and 2026-08-20 updates already use different column headers
and different cell formats, so anything parsing the table is parsing a moving
target, and a near-miss would silently discard the dependency and contention
ordering this phase exists to publish.
The grammar is defined by build_run_list_line in
Scripts/build_run_list.py and parsed by
RUN_LIST_RE in that same module, so the written form and the parsed form cannot
drift apart — the same discipline as the per-issue marker, for the same reason.
It is not restated here; if you need to see it, read it there.
A status update without the line is not a usable run-list. Attended,
/deliver next says so and falls back to board fields — which reproduces two of
Phase 6's four sort rules and loses the other two. Unattended, auto next and
auto merge next stop outright, because a warning nobody reads is not a
warning. So an omitted line does not merely degrade the next run; it can halt it.
Also carry, in prose, the three disclosures Phase 6 returns — they are facts the script supplies so this phase need not remember them:
depsOutrankPriority — each case where a lower-priority issue precedes a
higher one because it unblocks it. Say so, or the order reads as a mis-sort.unseparableContention — contending pairs left adjacent because nothing
could sit between them.dischargedEdges — dependencies dropped because their target is closed.Contention is computed only over freshly-triaged issues, since a marker carries
no filesTouched. Say that, rather than implying full coverage.
Mark AT_RISK when a P0 sits in blocked: the highest-priority work being
un-startable is exactly the state a status colour exists to surface.
To the caller: counts by exit, the ordered Ready list, every blocked item with
its decision, anything closed and why, adopted orphans, and any untriaged
issues. If nothing changed since the last run, say that plainly rather than
padding — a quiet run is a good outcome, not a failed one.
The Ready test. All four, every time: claims re-verified at HEAD; fix
approach determined; no unmerged dependency; line references refreshed. A P0
that needs a decision is blocked. Priority never overrides the test — shipping
someone into an unmade decision is worse than leaving it visible.
Wontfix is mechanical. no-longer-reproduces, superseded, duplicate.
Nothing else. "Not worth doing" is a judgement a human takes; route it to
blocked with the case made. A wrongly-ready issue costs twenty minutes; a
wrongly-closed one is gone and nothing catches it.
Verify, do not trust. These issue bodies are written against older trees.
Line numbers rot, whole mechanisms get replaced, ADRs land that decide the open
question. An agent that reports without opening a file has not triaged anything —
that is what verifiedBy is for, and "read the issue body" forces blocked.
Scope. Backlog only, plus the orphan sweep. Never touch In progress, In
review or Done; someone is working there and a status change under them is
hostile. Those three columns have owners of their own — /deliver sets In
progress, /watch-pr sets In review, and the board's own automation sets Done;
the whole lifecycle is tabulated in
.github/ISSUE_FILING.md → Board status —
the column lifecycle.
The rubrics live in .claude/workflows/triage-issues.js (RUBRIC) — that is
the copy handed to every agent, so it is the one that actually reaches a
decision. Read it there; do not restate it here. A second copy in this file
drifted from the script within a day of being written, which is precisely the
decay this repo's single-ownership rule exists to prevent.
What this skill owns and states above, because no agent needs it: the Ready test's four conditions, the wontfix bases, the four exits, and the skip rule.
© adamayoung, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/triage-issues of adamayoung/TMDb.
Open the folder on GitHubat commit a3f1311
TMDb Backlog Triager next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| TMDb Backlog Triager this skilladamayoung/TMDb | 178 | — | ~5k | Automated safety check: Pass | Apache-2.0 | |
| Herdr Issue Triageherdrdev/herdr | 43k | — | ~517 | Automated safety check: Pass | Apache-2.0 | |
| Issue Triagemono/SkiaSharp | 5.6k | — | ~3.4k | Automated safety check: Pass | MIT | |
| Issue Triage Loopcobusgreyling/loop-engineering | 11k | — | ~522 | Automated safety check: Pass | MIT | |
| Triagearcee-ai/nac | 280 | — | ~2k | Automated safety check: Pass | Apache-2.0 | |
| GitHub IssuesCybereason-Public/owLSM | 280 | — | ~1.8k | Automated safety check: Pass | GPL-2.0 |
herdrdev/herdr
Triages open herdr GitHub issues into a short decision-first Markdown table with a priority light, recommendation, age, reactions and a reason for each.
mono/SkiaSharp
Triage a SkiaSharp GitHub issue or PR into structured JSON with classification (type, area, platform, severity), suggested response, automatable actions, and companion Markdown/HTML reports.
cobusgreyling/loop-engineering
Scans open GitHub issues and discussions, flags duplicates, scores priority and proposes labels into issue-triage-state.md without ever labeling or closing.
arcee-ai/nac
Triage a GitHub repository's open issues by finding exact duplicates, rejecting evidenceably off-base requests, requesting concrete clarification, applying only existing labels, and opening a linked…
Cybereason-Public/owLSM
Manage GitHub issues - create, edit, close, comment, assign, and delegate to Copilot.
decebals/claude-code-java
Sorts open GitHub issues for a Java project into bug, feature, question, duplicate or unclear, then labels them and assigns a priority.
adamayoung/TMDb
Writes and maintains DocC /// comments for the public API of the TMDb Swift package, following the project's summary patterns and comment structure.
adamayoung/TMDb
Diagnoses a failing scheduled TMDb Integration run, re-runs transient failures, and fixes real API drift on its own branch with a PR, merging it only when told to.
adamayoung/TMDb
Drives an approved plan to completion test-first, deriving a Canon TDD test list, showing it before any code and stopping only when every item is written, passing and green.
adamayoung/TMDb
Has your agent build features and fix bugs in Canon TDD order: write a test list, then one failing test, make it pass, refactor, and repeat until the list is empty.
adamayoung/TMDb
Records non-obvious lessons from a finished task, such as gotchas, API quirks and design decisions, into a project's knowledge folder before a pull request opens.
adamayoung/TMDb
Cut a new TMDb release — work out the next SemVer version from the evidence, do the pre-tag housekeeping a tag would otherwise freeze in place, draft release notes, then tag and publish the GitHub…
Works with
Categories
Grooms the Backlog column of a GitHub project board by re-verifying each issue against current main, closing dead ones, promoting actionable ones to Ready and naming the decision the rest need. The skill discovers its own work with no input: it resolves the GitHub project by exact title rather than a hard-coded number, since a stale number would make later writes silent no-ops, and stops rather than guessing if zero or more than one project matches. Project reads and writes go through the GitHub MCP's project tools rather than the gh CLI, because the project scope the gh CLI needs is not on this repository's usual token.
TMDb Backlog Triager fits situations like: grooming a GitHub project board's backlog before planning a release; re-verifying old backlog issues against the current codebase; running a scheduled or on-demand pass to close mechanically dead issues.
Run `npx skills add adamayoung/TMDb --skill triage-issues -a claude-code`. Or copy the skill folder (.claude/skills/triage-issues in adamayoung/TMDb) into .claude/skills/triage-issues in your project. Claude Code loads it when a task matches its description.
Run `npx skills add adamayoung/TMDb --skill triage-issues -a codex`. Or copy the skill folder (.claude/skills/triage-issues in adamayoung/TMDb) into .agents/skills/triage-issues in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add adamayoung/TMDb --skill triage-issues -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/triage-issues, .gemini/skills/triage-issues, .github/skills/triage-issues and .opencode/skills/triage-issues in your project.
Going by SKILL.md and its folder, TMDb Backlog Triager needs the command-line tools its instructions call (gh, git and python3). Our summary lists: GitHub MCP project tools with access to the board; A fetched, current git checkout.
SKILL.md contains no URLs. Its commands use gh and git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
TMDb Backlog Triager is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with TMDb Backlog Triager: Herdr Issue Triage (herdrdev/herdr, 43k stars), Issue Triage (mono/SkiaSharp, 5.6k stars), Issue Triage Loop (cobusgreyling/loop-engineering, 11k stars) and Triage (arcee-ai/nac, 280 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
adamayoung (a GitHub user) maintains it in adamayoung/TMDb, which has 178 GitHub stars. The repository holds 18 skills in this directory. The repository was last updated on October 3, 2026.
Source: adamayoung/TMDb on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.