Skip to content

Releases: crmne/copilot-triage

v0.18.0

Choose a tag to compare

@crmne crmne released this 17 Oct 12:47
f99b390

Triage talks less and gets more right. We audited everything it did across our repositories in one week: labels were 95% right, but only a third of its replies helped. This release fixes what that audit found: replies nobody needed, question chains, wrong closures, unreviewed pull requests waiting for your sign-off, and conversation state that was never saved.

New

  • Replies are for the reporter. A reply that tells the maintainer what to decide, investigate, or prioritize is dropped; that goes in the card's next step. The initial recap is kept for long, unstructured reports, not issue-template reports that are already easy to read. By @crmne.
  • At most two replies in a row. After two triage replies since a maintainer last commented, triage stops replying in that thread and moves the card to Decide, so nobody gets five questions in an hour. By @crmne.
  • No repeated links. A related issue the conversation already mentions, one triage linked before, or the issue a pull request closes is not posted again, and the agent cannot cite the report itself. By @crmne.
  • Unreviewed pull requests stay out of Sign off. A contributor's pull request reaches Sign off only after a bot or a person reviewed its latest commit; otherwise it waits in Do with "No review of the latest commit: read the change". This caught dozens of pull requests that CodeRabbit never reviewed after hitting its limit. By @crmne.
  • Contribution rules get checked. Each pull request report lists the media files it adds, the dependency files it changes, and any new git or path dependency, so the agent can match them against your CONTRIBUTING.md and send the change back naming the rule. Pull request replies that review code line by line are refused. By @crmne.
  • Discussions are answered where they belong. A request your documented scope rules out, or a maintainer already declined, is answered in the discussion instead of being moved to an issue only you can close, and a move no longer fails over citations, which the new issue's assessment finds for itself. A new question on a discussion closed as resolved gets a sourced answer. By @crmne.
  • Every file read says how far it is from the release. Files the agent reads from the default branch carry a note such as "(default branch, 183 commits after v0.19.0)". By @crmne.
  • Quiet manual runs. assess.yml takes a quiet input, so re-assessing a backlog sorts it onto the board without posting. By @crmne.

Fixed

  • Conversation state is saved again. GitHub made the cache read-only for issue and comment events, so every run forgot muted threads and its own earlier replies. The shared workflow now asks for cache writes. Callers that do not set cache-mode need no change; a job that calls the action directly needs cache-mode: write. By @crmne.
  • No more duplicate closures that hide a recurrence. An issue closed as completed, or an error tracker's report that reopened, is linked as a recurrence instead of closing the new report as a duplicate, and a reporter's re-filed copy stays open. By @crmne.
  • "Resolved" only on the reporter's word. A bystander retracting their own comment no longer produces a "Closing as resolved" reply. By @crmne.
  • Duplicates match the problem, not the title. By @crmne.
  • No contradictory labels. bug with enhancement, or a second type label on a report that already has one, is refused. A discussion that would be labeled wontfix, out-of-scope, or invalid stays a discussion. By @crmne.
  • Pull requests stop bouncing between columns. The sweep no longer withdraws and re-requests your review on an unchanged commit, no longer sends a pull request back over CodeRabbit's change request on an older commit, and keeps a pull request in Their move while triage's question waits on its author. By @crmne.
  • Next steps are in English, unreleased work you are implementing goes to Do, and waiting on upstream is never urgent Do work. By @crmne.
  • A repository without .github/triage.yml is skipped with a notice instead of failing, which happened on every policy pull request before its file merged. By @crmne.
  • Fallback runs finish. When the model stops without a decision, the reminder now forces the decision call, which fixes runs that ended with no decision on OpenRouter. By @crmne.
  • Replies can name a mention. A reply about @all or a username failed the whole assessment; mentions now become inline code, which names them without pinging anyone. By @crmne.
  • Clearer failures. An invalid assessment says which check rejected it, a failed GitHub call names the request and GitHub's reason, and board notes no longer fail on discussions. Em dashes in replies become commas. By @crmne.

Verified with RuboCop, 436 specs, the 32-case offline reply evaluation, and the live reply evaluation on gpt-5.6-luna, which passed 30 of 32 cases: the two misses found the right answer (an unreleased feature, a duplicate) but missed wording the cases require. Moving a real discussion and the cache write were not tried end to end; the first issue run after this release should show a saved triage-v2- cache.

Known limitations

  • The maintainer-directed filter matches words such as "maintainer", so a reply that needs to mention one is dropped unless it is about maintainer approval.
  • Pull request replies that name a setting key like show_queue can be refused as code review; the agent is told to rephrase.

Thanks

  • @crmne for the changes and the audit.

Full changelog: v0.17.0...v0.18.0

v0.17.0

Choose a tag to compare

@crmne crmne released this 17 Oct 11:10
ef027b4

Triage now knows what you have released. It reads your docs and code from the default branch, so it used to tell people a feature was already there when it was only on main. It also answers discussions it moves to issues, and keeps judging pull requests when CodeRabbit stops reviewing.

New

  • Unreleased work is called unreleased. Every assessment knows how far the default branch is ahead of your latest stable release, and a new search_changes tool says which release shipped a change or that it is still unreleased. A reply that cites your docs or code has to check first, so a request for something only on main now gets "this is on the default branch and not in v1.2.1 yet" instead of "already supported" or "this request is stale". By @crmne.
  • Pull requests get judged when CodeRabbit runs out. CodeRabbit posts "Review limit reached" or "Reviews paused" as a comment and leaves no review. That notice now runs triage: the agent judges the change without CodeRabbit instead of waiting on it, and the card's next step says when to ask CodeRabbit again with @coderabbitai review. Nothing is blocked from merging. If your workflow calls assess.yml@v0, this works after the update; if you call the action directly, let issue_comment events from coderabbitai[bot] through. By @crmne.

Fixed

  • Moved discussions get an answer. An issue created with the workflow token starts no workflow, and triage skipped issues a bot opened, so a discussion moved to an issue was never answered there. The run that moves a discussion now triages the new issue as if its author had just opened it, and later comments on it are triaged too. By @crmne.

Verified with RuboCop and 371 specs, the offline reply evaluation, and live runs of the new unreleased-feature case, where every run checked search_changes and told the reporter the feature was not in their release. Moving a real discussion was not tried end to end, since it creates a real issue.

Thanks

Full changelog: v0.16.1...v0.17.0

v0.16.1

Choose a tag to compare

@crmne crmne released this 11 Oct 23:49
8d7000f

Replies from the fallback model now report the input tokens they actually read.

Fixed

  • Correct input token counts in reply footers. RubyLLM reports prompt-cache reads apart from standard input, so fallback replies showed a handful of input tokens for runs that read about 20,000. The footer and metrics now count cached input too. By @crmne.

Verified with RuboCop and 360 specs.

Thanks

Full changelog: v0.16.0...v0.16.1

v0.16.0

Choose a tag to compare

@crmne crmne released this 11 Oct 23:37
0ed2a39

Triage keeps answering after your Copilot allowance runs out. The fallback used to place the card and post nothing, so every report filed after the allowance was spent went unanswered.

New

  • The fallback replies. Once fewer than 50 premium requests are left and overage is off, triage now runs gpt-5.6-luna, the same model as the Copilot engine, through the fallback key (OpenRouter by default), and comments, labels, and closes like a Copilot run. An assessment costs well under a cent. Copilot reviews wait until the allowance returns, since they would bill the same allowance. fallback-provider and fallback-model still pick another provider, such as OpenAI directly. By @crmne.
  • Previews use the fallback too. The "Preview real report" workflow can assess a report after the allowance is spent. By @crmne.

Fixed

  • The fallback no longer crashes. It failed on every run after the allowance ran out, maintainer comments included, so their cards never moved. By @crmne.
  • A maintainer's comment moves a pull request's card again. Right after a push to the base branch, GitHub briefly reports mergeability as unknown; triage took the change for a new report and dropped its decision. By @crmne.
  • Pull requests stay where your comment put them. The sweep no longer moves an approved, mergeable pull request back to Sign off after you asked its author for changes, until the author comments or pushes. By @crmne.

Upgraded to RubyLLM 2.1, with the reply evaluation built on its evaluations. Verified with RuboCop and 360 specs, and with fallback previews of two real Spotifast issues. The live Copilot reply evaluation was not run, because the allowance is spent.

Thanks

Full changelog: v0.15.1...v0.16.0

v0.15.1

Choose a tag to compare

@crmne crmne released this 03 Oct 14:44
bf3a584

The sweep no longer misreads pull requests right after a push to the base branch, and a failed run no longer moves cards.

Fixed

  • Pull requests keep their column while GitHub is still checking them. Right after a push to the base branch, GitHub briefly reports a pull request's mergeability as unknown. The sweep read that as mergeable, so conflicting contributor pull requests moved to Do and requested your review. Their cards now wait for the next sweep. By @crmne.
  • A failed run leaves the card where it is. When triage could not assess an update, it moved the card to Do and wrote the raw error as the next step. It now keeps the column and says in plain words that triage could not assess the latest update. By @crmne.
  • Clearer next steps from the sweep. Your own failing pull request says to fix its checks, a review bot's requested changes are named as such, and an issue that follows a pull request says which one. By @crmne.

Verified with RuboCop and 332 specs, and against a board audit after v0.15.0.

Thanks

Full changelog: v0.15.0...v0.15.1

v0.15.0

Choose a tag to compare

@crmne crmne released this 03 Oct 12:38
4703e5c

Repositories call one shared workflow, so new triggers, permissions, and secrets arrive with the v0 tag instead of a pull request in every repository. This release also fixes several things the board's first week turned up, and the film now shows a conversation that keeps going while you sleep.

copilot-triage-launch-board-v015-1080p60.mp4

Download the film in full quality

An issue thread at night: the reporter asks for a debug mode at 05:41 and Copilot Triage answers a minute later with the activity log path, two read-only commands, and links to the docs, while a tally reads 4 new comments, 2 answered, 0 by you

Illustration with a made-up repository and issue.

New

  • A shared workflow to call. A repository's workflow can now name its events and call crmne/copilot-triage/.github/workflows/assess.yml@v0 with secrets: inherit, and the board's sweep calls sweep.yml@v0. Permissions, queueing, inputs, and secrets live in Copilot Triage and update with the tag. See the README. By @crmne.
  • Shared policies. extends: owner/repo:path in .github/triage.yml inherits another policy's settings, section by section, with the repository's own keys winning. By @crmne.
  • Copilot reviews for private repositories only. pull_requests.reviews: private keeps Copilot's reviews, billed to you, for private repositories, when a free bot such as CodeRabbit reviews the public ones. By @crmne.

Fixed

  • Closing an issue or pull request moves its card to Done. Since v0.12 the step that handles closes never received the project token, so every close was skipped and cards waited for the daily sweep. Your own pull requests are placed from events again for the same reason. By @crmne.
  • The sweep's requests for the agent's judgment run. The workflow skipped events sent by bots, and the sweep's request is one, so fork pull requests that needed a closer look never got it. By @crmne.
  • New pull requests get a card. CodeRabbit adds its summary to a description seconds after a pull request opens, which looked like the author changing the report, so triage gave up. Its summary is now left out. By @crmne.
  • Your placements in Sign off stay. v0.12 treated any comment of yours as answering a closure proposal, even one written before it, and moved cards you had placed yourself. Only a reopen or a comment after the card was placed counts now. By @crmne.
  • Cards the sweep moves get a fitting next step, such as "Conflicts with the base branch: the author rebases", instead of the one written for their old column. By @crmne.
  • A pull request parked in Decide goes back to its author once it stops being mergeable. By @crmne.

Changes for existing workflows

Workflows on crmne/copilot-triage@v0 receive this release automatically. To stop maintaining permissions and secrets in each repository, switch your workflows to the shared ones shown in the README.

Verified with RuboCop, actionlint, 331 specs, 23 offline replays, and a cross-repository run of the shared workflow, which received the calling repository's secrets and variables.

Thanks

  • @crmne for the shared workflows and fixes.
  • The reporter whose overnight thread with the bot became the film's new beat.

Full changelog: v0.14.0...v0.15.0

v0.14.0

Choose a tag to compare

@crmne crmne released this 03 Oct 00:40
6f02c40

Triage keeps your board current after the Copilot allowance runs out, on a fallback model that costs about a cent a day.

New

  • A fallback when Copilot is spent. With fallback-api-key set, triage checks the remaining Copilot premium requests before each run. When fewer than 50 are left and overage is off, it uses openai/gpt-oss-120b through OpenRouter instead (fallback-provider and fallback-model change it). A fallback run only places the card on the board and posts nothing. In our evaluation, gpt-oss judged pull requests and cards as well as the default model but replied less reliably, 16 of 23 cases overall, for about one cent for the whole run. By @crmne.

Fixed

  • gpt-oss works through OpenRouter. OpenRouter's hosts of gpt-oss answer a required tool call with an empty error, so every run failed. Triage now lets OpenRouter models choose their tools, and reminds any model that stops without submitting its decision. By @crmne.
  • reviews: off written without quotes works. YAML reads a bare off as false, which triage rejected. By @crmne.

Verified with RuboCop, 323 specs, 23 offline replays, and a live evaluation of gpt-oss-120b through OpenRouter.

Thanks

Full changelog: v0.13.0...v0.14.0

v0.13.0

Choose a tag to compare

@crmne crmne released this 03 Oct 00:40
5b25538

Your own comments now move your cards, and a pull request no longer looks broken because of triage's own jobs.

New

  • Your comments move cards. Triage used to skip a maintainer's comment entirely, so a card stayed put after you asked for a pull request, deferred a request, or took the work. Now your comment runs triage in board-only mode: nothing is posted, and the agent places the card by what you said: Their move when you ask the reporter or author for something, Not now when you defer it, Do when you take it. In an audit of the board, this was the most common reason a card sat in the wrong column. By @crmne.
  • Not now is a move the agent can make, but only when you have said so. By @crmne.

Fixed

  • A pull request comes back to you after its author pushes. Your "changes requested" review kept a contributor's pull request in Their move even after the author addressed it. Once they push a new commit, it returns to Do for your review. By @crmne.
  • Triage's own jobs no longer count as failing checks. A cancelled triage run made a pull request's checks look red and sent it back to its author. The board now leaves triage's jobs and cancelled or skipped runs out of the checks. By @crmne.
  • Feature pull requests are no longer urgent. Urgent is for security, data loss, and regressions, never for a feature. By @crmne.

Verified with RuboCop, 317 specs, 23 offline replays, and dry runs on real issues: a maintainer's "Can you please open a PR?" placed the card in Their move three times out of three, and "Calls would be nice, but not now" placed it in Not now.

Thanks

  • @crmne for the board audit and the rules it led to.

Full changelog: v0.12.0...v0.13.0

v0.12.0

Choose a tag to compare

@crmne crmne released this 03 Oct 00:40
f8a44cc

Done now shows what finished today, and Sign off only holds closures nobody has weighed in on yet.

New

  • Done is today's work. The daily sweep archives everything already in Done, so the column shows what closed or merged since the morning. Set board.archive_after_days to keep finished work longer; it was 7 days before. By @crmne.
  • Drag an open item to Done to put it away. The sweep archives it without closing the issue or pull request, and brings it back when it is reopened or someone comments. Until now the sweep moved such a card straight back. By @crmne.
  • Cards move to Done the moment work finishes. The Copilot Triage workflow in crmne/github-automation now runs when issues and pull requests close, so a merged or closed item no longer waits for the daily sweep. Add closed to the issues and pull_request_target types in your own workflow to get the same. By @crmne.

Fixed

  • No more closure proposals you already answered. A duplicate or resolved issue went to Sign off even after it was reopened or after you commented on it, asking you to confirm a closure you had already rejected. Triage now proposes a closure only when no person has weighed in, and the sweep places existing stale proposals again: back to the reporter when you spoke last, to you when they did. By @crmne.
  • A proposed closure says so. Its next step now starts with "Close it if you agree:", so it is clear what signing off an issue means. By @crmne.

Verified with RuboCop, 314 specs, and a dry-run sweep of the real board: the reopened zapfast issue moved from Sign off to Do, and the omarchy-hyprmoncfg issue where the maintainer had asked for a pull request moved to Their move.

Thanks

Full changelog: v0.11.0...v0.12.0

v0.11.0

Choose a tag to compare

@crmne crmne released this 02 Oct 15:59
fc9295a

The board now knows when CodeRabbit found nothing: a clean, approved pull request comes to Sign off, and requested changes go to the agent to weigh.

copilot-triage-launch-board-v011-1080p60.mp4

Download the film in full quality

Two pull requests over the board: one approved by CodeRabbit with passing checks, headed to Sign off; one with a major race finding and a nitpick marked not a blocker, headed back to its author

Illustration with made-up repositories and pull requests.

New

  • CodeRabbit approvals reach the board. When CodeRabbit finds nothing, it used to post only a summary comment, which triage skips like any bot comment, so a clean pull request stayed where it landed. With request_changes_workflow: true in .coderabbit.yaml, CodeRabbit approves a clean pull request, and an approved, green, mergeable one goes to Sign off. By @crmne.
  • Requested changes are weighed, not obeyed. CodeRabbit requests changes for any finding, nitpicks included, so its "changes requested" now goes to the agent, which applies the same rules as for every finding: real problems go back to the author, nitpicks do not. The agent sees each bot's latest verdict next to its findings. By @crmne.
  • The film shows review bots. A new beat shows a clean, approved pull request coming to Sign off while one with a real problem goes back to its author. By @crmne.

Changes for existing workflows

Workflows on crmne/copilot-triage@v0 receive this release automatically.

  • To get CodeRabbit approvals, add this .coderabbit.yaml to your repository:

    reviews:
      profile: chill
      request_changes_workflow: true

    CodeRabbit's approval then counts as an approving review on GitHub; you still merge.

Verified with RuboCop, 311 specs, 23 offline replays, and the configuration rolled out to our repositories, where CodeRabbit approved the clean pull requests and requested changes on the others for minor findings, exactly the kind the agent now weighs instead of obeying.

Thanks

  • @crmne for the CodeRabbit rules and the film.

Full changelog: v0.10.3...v0.11.0