Agent skill

Model Triage

by joshukraine in joshukraine/dotfiles

Adopt the per-issue model-selection convention in a repo — tier every open issue, apply the model: labels, board field, and callouts behind an approval gate.

MITAuto-check passed

Install Model Triage

skills CLI
$ npx skills add joshukraine/dotfiles --skill model-triage -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install joshukraine/dotfiles model-triage --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/joshukraine/dotfiles.git skills-src && mkdir -p .claude/skills && cp -r skills-src/claude/.claude/skills/model-triage .claude/skills/model-triage && rm -rf skills-src

Use ~/.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/

Facts

Skill name
model-triage
GitHub stars
429
Token cost
~2.8k tokens
SKILL.md length
1,303 words
Files
1
Skills in repo
24
Repo updated
First seen
Licence
MIT

At a glance

Adopt the per-issue model-selection convention in a repo — tier every open issue, apply the model: labels, board field, and callouts behind an approval gate.

  • Works in 6 steps: Preflight → Gather → Tier → …
  • SKILL.md covers Where this runs, Arguments, The tiering heuristic and Your task, plus 1 more section
  • Calls gh

What it does

Model Triage is an agent skill from joshukraine/dotfiles. Adopt the per-issue model-selection convention in a repo — tier every open issue, apply the model: labels, board field, and callouts behind an approval gate. Also runs in maintenance mode to sweep up unlabeled issues and label/field drift.

Its SKILL.md is about 2.8k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

The repository describes itself as: :roundpushpin: My dotfiles for macOS using Neovim, Zsh, and Ghostty + Tmux. The licence is MIT.

Example prompts

  • “/model-triage”

Workflow steps

6 steps, taken from the step headings in SKILL.md.

  1. Preflight
  2. Gather
  3. Tier
  4. Present + APPROVAL GATE
  5. Apply
  6. Verify

What it can do on your machine

Read from SKILL.md and the folder at commit b59ad5b. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • gh

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use gh, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Model Triage loads about 2.8k tokens when it runs. Until then it costs about 63 tokens; SKILL.md has 1,303 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~63
When it runs · the whole SKILL.md, loaded when a task matches
~2.8k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from joshukraine/dotfiles at commit b59ad5b, republished under its MIT licence (© joshukraine). 1,303 words, ~2,776 tokens.

Download SKILL.mdSave it as .claude/skills/model-triage/SKILL.md (or your agent's skills folder).
name
model-triage
description
Adopt the per-issue model-selection convention in a repo — tier every open issue, apply the model: labels, board field, and callouts behind an approval gate. Also runs in maintenance mode to sweep up unlabeled issues and label/field drift.
disable-model-invocation
true
argument-hint
[--maintenance]

Model Triage

Roll the per-issue model-selection convention into a repository: tier each open issue, then apply the model: labels, the board's Model field, and any body callouts — all behind a single approval gate. The convention, its heuristic, and the manual runbook this encodes live in ~/.claude/docs/model-selection-strategy.md; the label vocabulary lives in ~/.claude/docs/label-taxonomy.md.

This is a rollout tool, not a routine one. Model labels are assigned at issue creation alongside the type label. Run this skill once when adopting the convention in a repo that already has open issues, and after that only in maintenance mode when drift has accumulated.

Where this runs

From the target repository's checkout — you need the issues and the code, because tiering an issue means judging what a fix would actually touch. If you must run from elsewhere, every gh issue call needs --repo <owner>/<name>; without it the command silently targets whatever repo you are standing in.

Arguments

  • (no args) — full rollout: tier every open issue that should carry a label.
  • --maintenance — sweep mode: tier only issues missing a label, reconcile label ↔ board-field drift, and refresh stale label descriptions. Leaves existing label assignments alone unless an issue's scope has visibly changed.

The tiering heuristic

Assign a tier by asking what a wrong answer costs and how far the reasoning reaches. Full treatment in the strategy doc; the working summary:

  • Fable (flagship) — a wrong answer would silently corrupt canonical/persistent data with no error surface. This is the insurance case, and only that case. Expect it rare, and expect each one to have a nameable reason. (Multi-module reasoning with non-obvious ripple used to qualify here too; Opus 5 absorbed it and the clause was cut on 2026-07-27.)
  • Opus (workhorse) — well-specified features with a test scaffold and a contained blast radius; migrations / data-model; thin specs; security-adjacent work. The default when you genuinely can't tell.
  • Sonnet (light) — docs, a single regression test, i18n / copy, mechanical pattern-following where the spec leaves little to interpret and failure is visible.

Lean one tier down for docs/tests, one tier up for anything touching data integrity.

Calibration: ComixDistro's settled pass was 4 Fable / 32 Opus / 25 Sonnet across 61 issues — roughly 6% flagship — but that pass was tiered under the older two-clause flagship bar. Under the tightened bar expect ~2–3%. Either way, a pass landing far above is not discriminating, it is just burning limit headroom. Check the two calibration references in the strategy doc — and the note on which rules they were measured under — before presenting.

Issues that get no tier

Some issues have nothing to build directly, and a tier on them is noise:

  • epics and tracking issues — the children carry the tiers
  • content hubs — durable reference/index issues
  • qa reports — the tech issue derived via /qa-triage carries the tier

Call these out explicitly as deliberate exclusions rather than silently skipping them; an unexplained gap looks identical to an oversight.

Your task

Step 0 — Preflight

Establish that everything the apply step needs exists, and stop early if it doesn't:

  1. Token scope — gh auth status must list project in the token scopes. If it's missing, stop: the user must run gh auth refresh -s project interactively. You cannot grant it for them.

  2. Locate the board — gh project list --owner <OWNER>; capture the project number and node ID (PVT_…). If the repo has no board, the label pass can still proceed — say so and skip the field work rather than stopping.

  3. Labels exist — gh label list. Create any missing ones from the taxonomy, exactly as specified there:

    bash
    gh label create "model: fable"  --color B60205 --description "Recommended model: Fable 5 (reserve for silent-data-corruption stakes)"
    gh label create "model: opus"   --color FBCA04 --description "Recommended model: Opus 5 (well-scoped features, refactors)"
    gh label create "model: sonnet" --color 0E8A16 --description "Recommended model: Sonnet (docs, single tests, mechanical edits)"

    Also check the descriptions of labels that already exist. A description names the model current at the time the label was created, so a repo adopted before a model release carries a stale one indefinitely — gh label create won't touch it and no other step will either. Compare against the strings above and repair any mismatch:

    bash
    gh label list --json name,description --jq '.[] | select(.name | startswith("model: ")) | "\(.name)\t\(.description)"'
    gh label edit "model: opus" --description "Recommended model: Opus 5 (well-scoped features, refactors)"

    Report each repair as drift fixed, not as a label created.

  4. Model field exists — gh project field-list <N> --owner <OWNER> --format json. If absent, create it once:

    bash
    gh project field-create <N> --owner <OWNER> \
      --name "Model" --data-type SINGLE_SELECT --single-select-options "Fable,Opus,Sonnet"
  5. Board membership — gh project item-list <N> --owner <OWNER> --limit 200 --format json. Diff against the open-issue list; an issue not on the board cannot receive a field value. Note the strays now so the apply step can gh project item-add them first. Trust item-list over any claim an issue body makes about its own board membership.

Report the preflight result compactly: what existed, what you created, what needs adding to the board.

Step 1 — Gather
  • gh issue list --state open --limit 200 --json number,title,labels,body.
  • In --maintenance mode, narrow to issues with no model: label — plus any whose scope has visibly changed since labeling.
Show full SKILL.md (612 more words)Show less
Step 2 — Tier

Read each issue's body and, where scope is unclear, the code a fix would touch. For each, decide:

  • its tier, with a one-line reason grounded in the heuristic (what a wrong answer costs / how far the reasoning reaches);
  • whether it is a deliberate exclusion (epic / tracker / hub / qa report);
  • whether it warrants a body callout — only where the tier choice carries real nuance a bare label cannot convey, e.g. "workhorse, but escalate this specific sub-problem to flagship if it gets gnarly." Plain light-tier docs issues need none. A callout on every issue is a callout on none.

Note anything else the pass turns up — duplicates, already-shipped work, issues whose spec has drifted from the code. A careful read of every open issue surfaces this whether you want it or not, and it is worth more than the tiering.

Step 3 — Present + APPROVAL GATE

Present the full mapping before touching anything:

text
Tiering — 23 issues (2 Fable / 12 Opus / 9 Sonnet)

  #58   Fable   chord_only_line? has four dependents; a miss silently corrupts song files
  #49   Opus    --transpose; test scaffold exists, contained. Watch: enharmonic spelling
  #50   Sonnet  docs over a settled pipeline, no correctness stakes
  …

Excluded (no tier, deliberate):
  #12   epic — children carry the tiers
  #77   qa report — derived tech issue carries the tier

Proposed callouts (3):
  #49   "Opus, but escalate the enharmonic-spelling logic to Fable if it proves gnarly"
  …

Also noticed:
  #61   appears to duplicate #44
  #83   spec references a helper that no longer exists

Board: 2 open issues are not board items (#71, #84) — will add before the field pass.

STOP for explicit approval. Nothing is labeled, no field is set, and no body is edited before the user says go. They may retier anything, drop callouts, or expand the exclusions. This gate is the whole safety model of the skill: it writes to every open issue in the repo, and a bad pass is tedious to unwind.

Step 4 — Apply

Only after approval, in this order:

  1. Board strays first — gh project item-add <N> --owner <OWNER> --url <issue-url> for each, or their field values silently no-op.

  2. Labels — gh issue edit <n> --add-label "model: <tier>".

  3. Field values — collect the field ID and option IDs (gh project field-list … --format json) and the item IDs (gh project item-list … --format json), then per issue:

    bash
    gh project item-edit --id <ITEM_ID> --project-id <PROJECT_NODE_ID> \
      --field-id <MODEL_FIELD_ID> --single-select-option-id <OPTION_ID>
  4. Callouts — round-trip the body, never retype it. Fetch, prepend, write back:

    bash
    gh issue view <n> --json body --jq .body > /tmp/body.md
    # build /tmp/head.md: the callout blockquote, a blank line, ---, a blank line
    cat /tmp/head.md /tmp/body.md > /tmp/final.md
    gh issue edit <n> --body-file /tmp/final.md

    Callout template:

    markdown
    > **🤖 Recommended model: <Model>.** <One sentence: why this tier, and the single watch-item or escalation trigger if any.>
  5. Board README — if the board's README has no "Model = recommended build tier" section, append it. The settled wording lives in the ComixDistro board #11 README; the template board carries it for new projects.

Step 5 — Verify
  • Run the drift check and confirm the only issues returned are the approved exclusions:

    bash
    gh issue list --state open --limit 200 --json number,labels --jq '[.[] | {n: .number, m: [.labels[].name | select(startswith("model"))]}] | map(select(.m | length != 1)) | map(.n)'
  • Spot-check a few board cards against their labels, and one edited body to confirm the callout landed with the original text intact below it.

  • Report the final distribution (N Fable / N Opus / N Sonnet, flagship share) and how it compares to the calibration references.

Important

  • The approval gate is a hard stop. This skill writes labels, board fields, and issue bodies across an entire repo. Nothing is applied speculatively.
  • Never retype an issue body. Callouts are prepended to a round-tripped body via --body-file. Retyping loses content, and the loss is silent.
  • The label is the source of truth; the field mirrors it. If they disagree, the label wins — fix the field.
  • This is a backstop, not the primary mechanism. Model labels belong at issue creation, alongside the type label. If maintenance mode keeps finding large numbers of unlabeled issues, the fix is upstream at issue creation, not more frequent sweeps — say so in the report rather than quietly re-sweeping.
  • Flag what the read surfaces. Tiering requires reading every open issue closely, which reliably turns up duplicates and stale specs. Report them; that byproduct is often worth more than the labels.

© joshukraine, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in claude/.claude/skills/model-triage of joshukraine/dotfiles.

Open the folder on GitHubat commit b59ad5b

Compare with similar skills

Model Triage 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.

Model Triage compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Model Triage this skilljoshukraine/dotfiles429—~2.8kAutomated safety check: PassMIT
Triaging Issuespytorch/pytorch104k—~4.2kAutomated safety check: PassCustom licence
Issue Triagepaperclipai/paperclip99k—~1kAutomated safety check: PassMIT
Triagepnpm/pnpm37k—~2.9kAutomated safety check: PassMIT
Herdr Issue Triageherdrdev/herdr43k—~517Automated safety check: PassApache-2.0
RTK Combined Issue and PR Triagertk-ai/rtk83k—~1.6kAutomated safety check: NotesApache-2.0

Similar skills

  • Triaging Issues

    pytorch/pytorch

    Triages GitHub issues by routing to oncall teams, applying labels, and closing questions.

    104k GitHub stars~4.2k tokensUpdated today
    AI & LLM EngineeringAuto-check passed
  • Issue Triage

    paperclipai/paperclip

    Triage Paperclip inbox issues that are stale, blocked, in-review, or assigned-but-not-progressing, and decide a single next action per issue (resume, reassign, unblock, escalate, or close).

    99k GitHub stars~1k tokensUpdated today
    DevelopmentAuto-check passed
  • Triage

    pnpm/pnpm

    Triage an incoming GitHub issue against the pnpm codebase and related open issues, then apply exactly one implementation-readiness label using pnpm's state: taxonomy.

    37k GitHub stars~2.9k tokensUpdated today
    DevelopmentAuto-check passed
  • 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.

    43k GitHub stars~517 tokensUpdated 2 days ago
    DevelopmentAuto-check passed
  • Runs issue triage and PR triage in parallel, then cross-analyzes the results to flag duplicate coverage, security gaps, P0 issues with no PR, and PR conflicts.

    83k GitHub stars~1.6k tokensUpdated today
    DevelopmentAuto-check: notes
  • Triage

    TalAter/annyang

    Triage and close GitHub issues on TalAter/annyang. An agent skill from TalAter/annyang.

    6.8k GitHub stars~810 tokensUpdated 3 days ago
    AI & LLM EngineeringAuto-check: notes

More from joshukraine/dotfiles

All 24 skills in this repo
  • Todoist CLI

    joshukraine/dotfiles

    Manage Todoist tasks, projects, labels, filters, sections, comments, reminders, and workspaces via the td CLI.

    429 GitHub starsUsed in 1 repo~6.9k tokens
    Auto-check passed
  • Autopilot Triage

    joshukraine/dotfiles

    Vet open issues for autonomous resolution and queue the qualifying ones with the autopilot-queued label — the start-of-day "fill the queue" half of the triage → run split.

    429 GitHub stars~2.1k tokensUpdated 4 days ago
    Auto-check passed
  • Checkpoint

    joshukraine/dotfiles

    Quick 2-minute status update on current phase, completed work, blockers, and health check.

    429 GitHub stars~600 tokensUpdated 4 days ago
    Auto-check passed
  • Create PR

    joshukraine/dotfiles

    Create a pull request with auto-generated description, issue linking, ROADMAP updates, and PR-metadata validation.

    429 GitHub stars~1.3k tokensUpdated 4 days ago
    Auto-check passed
  • Debrief

    joshukraine/dotfiles

    Detailed technical walkthrough covering architecture, test coverage, product tour, and key design decisions.

    429 GitHub stars~2.5k tokensUpdated 4 days ago
    Auto-check passed
  • Drift Check

    joshukraine/dotfiles

    Pre-PR advisory check for deviations from the project spec. An agent skill from joshukraine/dotfiles.

    429 GitHub stars~1.2k tokensUpdated 4 days ago
    Auto-check passed

Questions about Model Triage

What does Model Triage do?

Adopt the per-issue model-selection convention in a repo — tier every open issue, apply the model: labels, board field, and callouts behind an approval gate. Model Triage is an agent skill from joshukraine/dotfiles. Adopt the per-issue model-selection convention in a repo — tier every open issue, apply the model: labels, board field, and callouts behind an approval gate.

How do I install Model Triage in Claude Code?

Run `npx skills add joshukraine/dotfiles --skill model-triage -a claude-code`. Or copy the skill folder (claude/.claude/skills/model-triage in joshukraine/dotfiles) into .claude/skills/model-triage in your project. Claude Code loads it when a task matches its description.

How do I install Model Triage in Codex?

Run `npx skills add joshukraine/dotfiles --skill model-triage -a codex`. Or copy the skill folder (claude/.claude/skills/model-triage in joshukraine/dotfiles) into .agents/skills/model-triage in your project. Codex loads it when a task matches its description.

Can I use Model Triage in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add joshukraine/dotfiles --skill model-triage -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/model-triage, .gemini/skills/model-triage, .github/skills/model-triage and .opencode/skills/model-triage in your project.

What does Model Triage need to run?

Going by SKILL.md and its folder, Model Triage needs the command-line tools its instructions call (gh).

Does Model Triage access the network?

SKILL.md contains no URLs. Its commands use gh, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Model Triage safe to install?

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.

What licence does Model Triage use?

Model Triage is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Model Triage use?

About 2.8k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Model Triage?

Skills that share tags, products or a category with Model Triage: Triaging Issues (pytorch/pytorch, 104k stars), Issue Triage (paperclipai/paperclip, 99k stars), Triage (pnpm/pnpm, 37k stars) and Herdr Issue Triage (herdrdev/herdr, 43k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Model Triage?

joshukraine (a GitHub user) maintains it in joshukraine/dotfiles, which has 429 GitHub stars. The repository holds 24 skills in this directory. The repository was last updated on October 6, 2026.

Source: joshukraine/dotfiles on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.