Skip to content

feat(ci): claude-code-action triage + interactive workflows#123

Merged
Oddly merged 10 commits intomainfrom
feat/claude-triage
Apr 11, 2026
Merged

feat(ci): claude-code-action triage + interactive workflows#123
Oddly merged 10 commits intomainfrom
feat/claude-triage

Conversation

@Oddly
Copy link
Copy Markdown
Owner

@Oddly Oddly commented Apr 11, 2026

Replaces the agentry triage pipeline with a single-step workflow driven by anthropics/claude-code-action@v1 and a tight prompt file. Comes with a client-side dry-run script so the prompt can be iterated on without touching CI or issue timelines. Agentry workflows stay in place in this PR — the point of this branch is to run the two side-by-side on the same 14 existing issues and compare.

Why
Ran the agentry triage over all 14 open issues this morning. Results: 5 issues got literal *No structured triage output* markers, 9 got corporate-speak with invented personas and hallucinated facts (e.g. "9-node cluster" on #121 which was never stated), every job reported {"overall_status": "failed", "node_statuses": {"triage": "failed", "task-decompose": "failed"}} internally while showing green at the GHA job level, and ~4M input tokens were burned for zero actionable content. Agentry's github-actions binder can't parse its own structured output, so even when the model produces something useful, the schema-validation layer drops it.

Norrie's distillery uses a much simpler pattern — anthropics/claude-code-action@v1 directly, a ~60-line prompt, a plugin marketplace for PR reviews, and no custom wrapper. Borrowed that shape here.

What's in the branch

  • .github/workflows/claude-triage.yaml — single-step GHA workflow, triggers on issues: [opened, reopened] + workflow_dispatch with issue_number input. Loads the prompt from .github/prompts/triage.md at runtime, passes it to claude-code-action with read-only tools (Read, Grep, Glob, Bash(git:*), Bash(gh issue:*), Bash(gh search:*), Bash(gh api repos/Oddly/elasticstack/contents/*)).
  • .github/prompts/triage.md — four-section markdown contract (Severity, Category, Affected paths, Next action). Hard rules against DevOps/SRE/Platform personas, corporate risk language, and hallucinated specifics. Severity and Category tokens required to be backticked singletons.
  • scripts/claude-triage-dry-run.sh — client-side preview. Reads the same prompt, fetches issue metadata via gh issue view --json, pipes to claude -p locally, prints what the workflow would post. Does not touch the issue. Usage: scripts/claude-triage-dry-run.sh 121.

Dry-run evidence (three issues, different shapes)

All three grounded, no fluff, no invented personas. First-attempt output.

Not in this branch

  • No changes to the agentry workflows yet. They stay so we can compare apples-to-apples.
  • No merge. This PR is draft specifically because the next step is to run both pipelines on the same 14 issues in a fresh session and land the comparison + the migration together.

Next session will

  1. Run claude-triage.yaml against all 14 open issues via gh workflow run -f issue_number=N.
  2. Collect the posted comments, compare against the archived agentry baseline at /home/sam/backups/triage-comparison/ (to be moved from /tmp/ in a moment).
  3. If the comparison confirms the dry-run result, remove the agentry workflows + workflows/ directory + agentry-*.yaml files in a follow-up commit on this branch, then un-draft the PR.

Summary by CodeRabbit

  • Chores
    • Removed legacy automated agent workflows and consolidated automation into a Claude-based triage flow.
  • New Features
    • Added Claude-driven triage that runs on issue events and in-thread prompts, producing strict, consistent triage output and explicit next actions.
    • Introduced standardized prompt/spec to enforce citation, search, and output formatting rules for triage.
  • New Tools
    • Added a dry-run script to preview triage recommendations locally before posting.

Replaces the agentry-triage pipeline with a single-step workflow that
calls anthropics/claude-code-action@v1 with a tight prompt and grounded
tool access (Read, Grep, Glob, git, gh issue view, gh search, gh api
contents). Triggered by new/reopened issues and by workflow_dispatch
with an issue_number input so we can re-triage without close/reopen
noise.

The prompt lives in .github/prompts/triage.md and is loaded by the
workflow via GITHUB_OUTPUT multiline. It enforces a four-section
markdown comment (Severity, Category, Affected paths, Next action),
hard-bans corporate stakeholder language, and requires verifying file
paths against the actual repo instead of guessing. Severity and
category tokens are explicitly required to be backticked singletons
after three dry-runs drifted across backticked/plain/bold formats.

scripts/claude-triage-dry-run.sh is a client-side preview: reads the
same prompt file, fetches issue metadata via gh, feeds it to claude -p
locally with the same read-only tool set as the workflow, and prints
what would be posted without touching the issue. Lets us iterate on
the prompt without burning CI or posting to real issues.

Agentry triage workflow and its workflows/*.yaml definitions are
untouched in this commit so CI stays green while we A/B against this
one on the same issues. They'll be removed in a follow-up once the
comparison lands.
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 11, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Replaces several Agentry/agent workflow files and prompts with Claude-based GitHub Actions and prompts: adds two Claude workflows, a strict triage prompt + distillery variant, and a local dry-run script; deletes multiple agentry workflows, agent workflow YAMLs, and related prompt files. (49 words)

Changes

Cohort / File(s) Summary
New Claude Workflows
\.github/workflows/claude-triage.yaml, \.github/workflows/claude.yaml
Add GitHub Actions that invoke Claude Code (actor-gated, concurrency per-issue/thread) to run triage from constructed prompts and handle interactive @claude triggers; run on self-hosted runners and use secrets.
New Prompts
\.github/prompts/triage-distillery.md, \.github/prompts/triage.md
Add strict, contract-driven triage prompts: distillery variant mandates KB search/citation rules and exact output token format; complementary triage prompt added.
Local Dry‑run Script
scripts/claude-triage-dry-run.sh
Add executable script to fetch issue metadata via gh, assemble the triage prompt locally, and run claude -p for a client-side preview (no GitHub side-effects).
Removed Agentry Workflows
\.github/workflows/agentry-bug-fix.yaml, \.github/workflows/agentry-code-review.yaml, \.github/workflows/agentry-feature-implement.yaml, \.github/workflows/agentry-triage.yaml
Delete four Agentry-based workflow files that previously installed/ran agentry/Claude-Code on issue/PR events.
Removed Agent Workflow Definitions
workflows/bug-fix.yaml, workflows/code-review.yaml, workflows/feature-implement.yaml, workflows/planning-pipeline.yaml, workflows/task-decompose.yaml, workflows/triage.yaml
Remove six agent/workflow definition files (identity, inputs, runtimes, tool capabilities, outputs, composition steps) relied upon by the deleted Agentry flows.
Removed Agent Prompts
workflows/prompts/bug-fix.md, workflows/prompts/code-review.md, workflows/prompts/feature-implement.md, workflows/prompts/task-decompose.md, workflows/prompts/triage.md
Delete five detailed agent prompt files that supplied system prompts and output schemas for the removed workflows; callers should be audited for stale references.

Sequence Diagram(s)

mermaid
sequenceDiagram
participant User as Issue Author
participant GitHub as GitHub Actions
participant Runner as Self‑hosted Runner
participant Repo as Repository (prompt files)
participant Claude as Claude Code Action

User->>GitHub: Open/Reopen issue or comment (or dispatch)
GitHub->>Runner: Trigger job, checkout repo
Runner->>Repo: Read/concat .github/prompts/triage-distillery.md / .github/prompts/triage.md
Runner->>Claude: Invoke Claude Code Action (prompt + MCP config, allowed-tools, secrets)
Claude->>Runner: Return triage output (structured text)
Runner->>GitHub: Post issue comment / set outputs / manage concurrency

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: migration from agentry workflows to claude-code-action for triage and interactive workflows, matching the changeset content.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/claude-triage

Comment @coderabbitai help to get the list of available commands and usage tips.

Oddly added 3 commits April 11, 2026 13:42
Two complementary workflows, ported from norrietaylor/distillery's shape:

.github/workflows/claude.yaml is the interactive mention pattern: fires on
@claude in issue body/title, issue comments, PR review comments, and PR
reviews. No explicit prompt, so claude-code-action treats the mention's
body as the instruction. A human has to opt in.

.github/workflows/claude-triage.yaml is the author-gated auto-triage:
fires on `issues: opened` only when the issue author is the maintainer
(github.event.issue.user.login == 'Oddly') — she's already vetted the
issue, so the structured triage prompt can run without asking. For
anyone else's issues, either drop `@claude` in the body (fires claude.yaml)
or manually re-run via `gh workflow run claude-triage.yaml -f issue_number=N`.

The reopened trigger is removed from claude-triage because re-opening
doesn't imply fresh vetting; use the workflow_dispatch re-run path instead.
Previously only the auto-triage path checked the issue author, so anyone
could still fire the mention-based claude.yaml by dropping @claude into a
comment on our issues. Unify both workflows on a single actor check —
github.actor is the account that fired the event and is populated for
every event type we handle, so one gate covers issue opens, issue
comments, PR review comments, PR reviews, and workflow_dispatch
invocations. Anyone else's mentions and dispatch attempts are now silent
no-ops.

Tradeoff: external contributors can't ping @claude for help on their own
issues even if that would be useful — they have to wait for Oddly to
@claude themselves. That's the intended trust model: LLM spend only
happens with maintainer consent.
Agentry's triage composition pipeline didn't work for this project:
every run reported both nodes failed internally while showing job-level
success, and the github-actions binder swallowed the structured output
on every code-review run. Replaced wholesale by claude.yaml (mention-
gated) and claude-triage.yaml (author-gated), which use anthropics/
claude-code-action@v1 directly and produce grounded, citation-rich
triage output against a Jina v5 KB.

Removes the four .github/workflows/agentry-*.yaml files, the six
workflows/*.yaml agentry definitions (bug-fix, code-review,
feature-implement, planning-pipeline, task-decompose, triage), and the
five workflows/prompts/*.md prompt files they referenced.
@Oddly Oddly marked this pull request as ready for review April 11, 2026 16:09
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (1)
.github/workflows/claude.yaml (1)

23-56: Consider adding workflow concurrency to suppress duplicate Claude runs.

Rapid comment/review bursts can trigger parallel runs for the same context; a concurrency group helps control spend and noise.

Suggested refactor
+concurrency:
+  group: claude-code-${{ github.event.issue.number || github.event.pull_request.number || github.event.comment.id || github.run_id }}
+  cancel-in-progress: true
+
 jobs:
   claude:

As per coding guidelines, .github/workflows/** changes should include checks for “concurrency settings.”

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/claude.yaml around lines 23 - 56, The workflow is missing
concurrency controls on the claude job which can lead to duplicate runs; add a
top-level concurrency block for the claude job (referencing the job name
"claude") with a stable group (e.g., combining github.workflow and github.ref or
the comment/PR ID) and cancel-in-progress: true so new invocations cancel prior
in-flight runs for the same context; update the job definition that starts with
"claude:" to include this concurrency setting to suppress duplicate Claude runs.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/claude-triage.yaml:
- Around line 4-6: The workflow currently triggers on issue events with types:
[opened]; update the GitHub Actions trigger configuration under the "issues" key
to include "reopened" (e.g., issues.types should be [opened, reopened]) so
reopened issues also kick off the claude-triage workflow automatically; modify
the issues.types array in the claude-triage.yaml workflow to add "reopened"
alongside "opened".

In `@scripts/claude-triage-dry-run.sh`:
- Around line 26-27: The script documents but does not enforce running from the
repo root before invoking claude -p; modify the top of the script (near the
script_dir and prompt_file variables) to determine the repository root (e.g.,
via git rev-parse --show-toplevel or checking for a known repo-root marker like
.git or the prompt_file relative path), verify the current working directory
matches that repo root, and if not either cd to the repo root or print an error
and exit; update logic that uses prompt_file and the subsequent claude -p
invocation to rely on the enforced repo-root so paths resolve correctly.

---

Nitpick comments:
In @.github/workflows/claude.yaml:
- Around line 23-56: The workflow is missing concurrency controls on the claude
job which can lead to duplicate runs; add a top-level concurrency block for the
claude job (referencing the job name "claude") with a stable group (e.g.,
combining github.workflow and github.ref or the comment/PR ID) and
cancel-in-progress: true so new invocations cancel prior in-flight runs for the
same context; update the job definition that starts with "claude:" to include
this concurrency setting to suppress duplicate Claude runs.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: fc474fff-9b5b-45f2-b81d-c0fb955bebfc

📥 Commits

Reviewing files that changed from the base of the PR and between b9169f7 and 0c4c064.

📒 Files selected for processing (19)
  • .github/prompts/triage.md
  • .github/workflows/agentry-bug-fix.yaml
  • .github/workflows/agentry-code-review.yaml
  • .github/workflows/agentry-feature-implement.yaml
  • .github/workflows/agentry-triage.yaml
  • .github/workflows/claude-triage.yaml
  • .github/workflows/claude.yaml
  • scripts/claude-triage-dry-run.sh
  • workflows/bug-fix.yaml
  • workflows/code-review.yaml
  • workflows/feature-implement.yaml
  • workflows/planning-pipeline.yaml
  • workflows/prompts/bug-fix.md
  • workflows/prompts/code-review.md
  • workflows/prompts/feature-implement.md
  • workflows/prompts/task-decompose.md
  • workflows/prompts/triage.md
  • workflows/task-decompose.yaml
  • workflows/triage.yaml
💤 Files with no reviewable changes (15)
  • workflows/prompts/bug-fix.md
  • workflows/triage.yaml
  • workflows/prompts/triage.md
  • workflows/task-decompose.yaml
  • workflows/prompts/task-decompose.md
  • workflows/prompts/feature-implement.md
  • workflows/prompts/code-review.md
  • workflows/planning-pipeline.yaml
  • workflows/bug-fix.yaml
  • .github/workflows/agentry-feature-implement.yaml
  • .github/workflows/agentry-bug-fix.yaml
  • workflows/feature-implement.yaml
  • .github/workflows/agentry-code-review.yaml
  • .github/workflows/agentry-triage.yaml
  • workflows/code-review.yaml

Comment thread .github/workflows/claude-triage.yaml
Comment thread scripts/claude-triage-dry-run.sh Outdated
Pick up the three coderabbit comments on #123. Triage now also fires on
reopened issues so a recurring problem we close and reopen still gets
fresh context. The dry-run script anchors itself at the repo root so
running it from any cwd still gives Claude the read/grep grounding the
prompt assumes. The interactive workflow gets a concurrency group so a
double-@claude on the same thread cancels the older run instead of
spending tokens twice.
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/claude.yaml:
- Around line 45-50: Remove the unnecessary id-token: write permission from the
permissions block in the workflow (the line "id-token: write"); this job uses
the claude_code_oauth_token for authentication so delete that permission entry
to follow least-privilege, leaving the other permissions (contents,
pull-requests, issues, actions) intact.
- Around line 59-63: The workflow is pinning anthropics/claude-code-action to
the mutable tag "anthropics/claude-code-action@v1"; replace that with an
immutable full commit SHA (e.g.,
"anthropics/claude-code-action@<full-commit-sha>") to eliminate supply-chain
risk. Locate the uses line containing "uses: anthropics/claude-code-action@v1"
and update it to reference a specific commit SHA (use the commit SHA you intend
to trust, matching the pattern used for checkout), then commit the change so the
action is pinned immutably.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: df9c633b-a1ec-4376-ae4d-42e117396498

📥 Commits

Reviewing files that changed from the base of the PR and between 0c4c064 and df38cc0.

📒 Files selected for processing (3)
  • .github/workflows/claude-triage.yaml
  • .github/workflows/claude.yaml
  • scripts/claude-triage-dry-run.sh
✅ Files skipped from review due to trivial changes (1)
  • scripts/claude-triage-dry-run.sh
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/claude-triage.yaml

Comment thread .github/workflows/claude.yaml
Comment thread .github/workflows/claude.yaml Outdated
# Conflicts:
#	.github/workflows/agentry-bug-fix.yaml
#	.github/workflows/agentry-code-review.yaml
#	.github/workflows/agentry-feature-implement.yaml
#	.github/workflows/agentry-triage.yaml
@Oddly Oddly changed the title feat(ci): claude-code-action triage workflow + dry-run [DRAFT, do not merge] feat(ci): claude-code-action triage + interactive workflows Apr 11, 2026
Both claude workflows move from ubuntu-latest to self-hosted so they
run on the incus-ci LXC inside the lab's 172.30.0.0/16, where the
distillery MCP server on 172.30.0.62:8000 is reachable. Triage now
loads the round-4 KB-augmented prompt and registers distillery via an
inline --mcp-config tempfile, with mcp__distillery__distillery_search
in allowed tools. The interactive @claude workflow gets the runner swap
for free internal-network access but no MCP registration — mention
distillery explicitly if you want it in a free-form session.
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (1)
.github/prompts/triage-distillery.md (1)

36-43: Consider adding language specifiers to fenced code blocks for markdown lint compliance.

The code blocks at lines 36-43 (call pattern), 58-60 (format template), and 104-112 (example output) lack language specifiers, which markdownlint flags. Since these are template/example blocks rather than executable code, you could either:

  • Add markdown or text as the language identifier for lint compliance
  • Leave as-is if the template nature is more important than strict lint adherence

This is a style choice rather than a functional issue.

Also applies to: 58-60, 104-112

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/prompts/triage-distillery.md around lines 36 - 43, The fenced code
blocks shown (the mcp__distillery__distillery_search(...) call snippet, the
format template block, and the example output block) are missing language
specifiers; update each triple-backtick fence to include a language identifier
such as markdown or text (e.g., change ``` to ```markdown or ```text) so
markdownlint stops flagging them, keeping the block contents unchanged; locate
these blocks by the identifiable snippet mcp__distillery__distillery_search(...)
and the nearby “format template” and “example output” sections and apply the
same change to each.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/prompts/triage-distillery.md:
- Around line 45-47: The prompt is ambiguous about whether the mandatory "## KB
analysis" section should include results from both the initial and optional
follow-up search; update the prompt so "## KB analysis" explicitly aggregates
results from all performed searches (first and any allowed follow-up),
deduplicates entries by unique identifier or title, annotates each entry with
its originating search (e.g., "search 1" or "follow-up search"), and orders
entries by relevance/priority; also state that if the follow-up search is not
performed only search-1 results appear. Ensure references to "## KB analysis"
and the follow-up-search allowance are updated together.
- Around line 49-88: The KB analysis section is ambiguous when distillery_search
returns zero non-self entries; update the prompt around the "## KB analysis"
requirement (and the "one line per returned entry" rule) to explicitly handle
the zero-entry case: require that the assistant still emits the visible "## KB
analysis" header followed by a single canonical line such as "No prior related
entries found" (or "No non-self entries returned") when there are no non-self
results, so callers and downstream checks always see the section and parsers
have a stable sentinel; reference the exact phrase "## KB analysis", the search
function name "distillery_search", and the rule "one line per returned entry"
when making the change.

---

Nitpick comments:
In @.github/prompts/triage-distillery.md:
- Around line 36-43: The fenced code blocks shown (the
mcp__distillery__distillery_search(...) call snippet, the format template block,
and the example output block) are missing language specifiers; update each
triple-backtick fence to include a language identifier such as markdown or text
(e.g., change ``` to ```markdown or ```text) so markdownlint stops flagging
them, keeping the block contents unchanged; locate these blocks by the
identifiable snippet mcp__distillery__distillery_search(...) and the nearby
“format template” and “example output” sections and apply the same change to
each.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: f5cacc97-2b6e-4f0e-8428-9df7b893791f

📥 Commits

Reviewing files that changed from the base of the PR and between df38cc0 and b36faf3.

📒 Files selected for processing (3)
  • .github/prompts/triage-distillery.md
  • .github/workflows/claude-triage.yaml
  • .github/workflows/claude.yaml
🚧 Files skipped from review as they are similar to previous changes (2)
  • .github/workflows/claude.yaml
  • .github/workflows/claude-triage.yaml

Comment thread .github/prompts/triage-distillery.md
Comment thread .github/prompts/triage-distillery.md Outdated
Drop the unused id-token: write permission from claude.yaml — we
authenticate via claude_code_oauth_token, not OIDC, so the permission
was inherited dead weight from the upstream template. Pin
anthropics/claude-code-action to its v1 commit SHA in both workflows so
the action is immutable across runs, matching the existing convention
this repo uses for actions/checkout. Tighten the round-4 distillery
prompt with two clarifications: when two searches happen the KB
analysis section must aggregate both with id-level dedup, and when
zero non-self entries come back the section still appears with a
single empty-state line so the contract isn't silently dropped.
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/prompts/triage-distillery.md:
- Around line 60-71: The KB analysis section is self-contradictory: it currently
mandates "For every non-self entry returned by distillery_search" but still
defines and exemplifies the skip-self tag and a self entry; fix by making the
contract consistent—either (A) change the rule to "For every entry returned by
distillery_search" and keep the `skip-self` tag and example, or (B) remove the
`skip-self` tag and any self-entry examples and update all occurrences to say
"non-self" (including the example block and the tag list). Update the text
around distillery_search, the `skip-self` tag definition, and the example in the
KB analysis so they all reflect the chosen option.
- Around line 186-187: Several indented token/example blocks (e.g., the indented
line showing `critical`  `high`  `medium`  `low` and the other occurrences
referenced) must be converted to fenced code blocks to satisfy markdownlint
MD046; locate the indented examples in the document (the lines containing those
backticked token lists) and replace each indented block with a fenced
triple-backtick block (```), optionally specifying a language like `text`,
ensuring there are no leading spaces before the fence and that the enclosed
lines remain unchanged; repeat this replacement for the other occurrences noted
(the two additional token/example blocks) so all examples use fenced code
blocks.
- Around line 165-179: The prompt contains conflicting directives: the strict
five-section output block ("Produce a single comment in Markdown. The output
order is **exactly** this: 1. `## KB analysis` ... 5. `## Next action`") and the
later allowance to "instead of producing a full triage." Resolve by making the
five-section requirement conditional or merging the behaviors: update the block
containing that exact output order text to state it applies only when a full
triage is requested, and modify the later line with "instead of producing a full
triage" to explicitly override the five-section requirement when brevity/partial
triage is chosen; search for the exact quoted strings (`## KB analysis` block
and "instead of producing a full triage") to locate and change the wording so
they no longer conflict.
- Around line 36-43: The markdown fenced code blocks in this file (for example
the mcp__distillery__distillery_search snippet and the “## KB analysis” block)
are missing language identifiers and trigger markdownlint MD040; update each
triple-backtick block shown (including the snippets containing
mcp__distillery__distillery_search, the “entry <short-id>…” line, the “(no prior
related entries surfaced…)” line, and the “## KB analysis” block) to include an
appropriate language tag (e.g., ```text or ```markdown) so the blocks are
lint-safe.
🪄 Autofix (Beta)

❌ Autofix failed (check again to retry)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: e5621382-3701-4060-9729-5641ea7e25f2

📥 Commits

Reviewing files that changed from the base of the PR and between b36faf3 and b10acd0.

📒 Files selected for processing (3)
  • .github/prompts/triage-distillery.md
  • .github/workflows/claude-triage.yaml
  • .github/workflows/claude.yaml
✅ Files skipped from review due to trivial changes (1)
  • .github/workflows/claude-triage.yaml
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/claude.yaml

Comment thread .github/prompts/triage-distillery.md Outdated
Comment thread .github/prompts/triage-distillery.md Outdated
Comment thread .github/prompts/triage-distillery.md
Comment thread .github/prompts/triage-distillery.md Outdated
Resolve the contradictions coderabbit caught in the round-4 distillery
prompt. The KB analysis contract now consistently says "every entry"
(including the self-match) instead of toggling between "non-self" and
"every", and the skip-self tag definition is explicit that the line
appears in KB analysis but is never cited downstream. The duplicate
escape-hatch is rewritten so all five section headers remain mandatory
for parser stability — Severity, Category, and Affected paths may
collapse to one-line stubs in the duplicate case, but the headers stay.
Markdownlint hygiene: language tags on the call-pattern, entry-line,
empty-state, and KB-analysis-example fences (text/markdown), and the
indented severity/category/citation examples are now fenced too.
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

♻️ Duplicate comments (2)
.github/prompts/triage-distillery.md (2)

254-256: ⚠️ Potential issue | 🟠 Major

Conflicting self-match rule breaks deterministic KB output.

These lines say to ignore self-results entirely, but earlier contract clauses require including self-match entries as skip-self in ## KB analysis (Line 60, Line 169). This creates nondeterministic behavior.

Suggested contract-tightening diff
-- **Do NOT cite the issue you are triaging as a prior reference.** If
-  `distillery_search` returns the current issue itself, ignore that result
-  entirely.
+- **Do NOT cite the issue you are triaging as a prior reference.** If
+  `distillery_search` returns the current issue itself, include it only in
+  `## KB analysis` tagged as `skip-self`, and never cite it in
+  `## Affected paths` or `## Next action`.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/prompts/triage-distillery.md around lines 254 - 256, The comment
points out a contradiction between "Do NOT cite the issue you are triaging" and
the requirement to include self-matches as `skip-self` in `## KB analysis`;
resolve it by changing the rule for `distillery_search` so self-results are not
entirely ignored but are included deterministically as `skip-self` entries in
`## KB analysis` (keep the `skip-self` token and ensure `distillery_search`
returns self-matches with that flag instead of dropping them); update any
wording that currently says "ignore that result entirely" to explicitly require
including exact self-matches only as `skip-self` to preserve deterministic
output.

274-275: ⚠️ Potential issue | 🟠 Major

“Skip straight to next action” conflicts with the mandatory five-section contract.

This wording implies section omission, which conflicts with the strict output format (Line 167 onward) and parser stability guarantees (Line 280 onward).

Suggested wording fix
-- Do NOT pad the comment with summary/rationale boilerplate. If the issue
-  body already analyzes the problem well, acknowledge that and skip straight
-  to the next action.
+- Do NOT pad the comment with summary/rationale boilerplate. If the issue
+  body already analyzes the problem well, keep `## Severity`, `## Category`,
+  and `## Affected paths` minimal and put the substantive guidance in
+  `## Next action`.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/prompts/triage-distillery.md around lines 274 - 275, The phrase
"body already analyzes the problem well, acknowledge that and skip straight to
the next action." implies omitting required sections and conflicts with the
mandatory five-section contract; update this wording to explicitly instruct to
acknowledge the analysis and proceed promptly to the next action while still
producing the full five-section output as defined from "Line 167 onward" and
preserving parser stability expectations referenced near "Line 280 onward"
(i.e., keep all five sections present and formatted exactly, but reduce extra
commentary before moving to the next action).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In @.github/prompts/triage-distillery.md:
- Around line 254-256: The comment points out a contradiction between "Do NOT
cite the issue you are triaging" and the requirement to include self-matches as
`skip-self` in `## KB analysis`; resolve it by changing the rule for
`distillery_search` so self-results are not entirely ignored but are included
deterministically as `skip-self` entries in `## KB analysis` (keep the
`skip-self` token and ensure `distillery_search` returns self-matches with that
flag instead of dropping them); update any wording that currently says "ignore
that result entirely" to explicitly require including exact self-matches only as
`skip-self` to preserve deterministic output.
- Around line 274-275: The phrase "body already analyzes the problem well,
acknowledge that and skip straight to the next action." implies omitting
required sections and conflicts with the mandatory five-section contract; update
this wording to explicitly instruct to acknowledge the analysis and proceed
promptly to the next action while still producing the full five-section output
as defined from "Line 167 onward" and preserving parser stability expectations
referenced near "Line 280 onward" (i.e., keep all five sections present and
formatted exactly, but reduce extra commentary before moving to the next
action).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 5af12cdc-3d6a-475d-9a31-c463497d0346

📥 Commits

Reviewing files that changed from the base of the PR and between b10acd0 and bbbf686.

📒 Files selected for processing (1)
  • .github/prompts/triage-distillery.md

Two follow-ups to the round-3 fix that I missed in the Hard rules
section. The "do not cite the issue you are triaging" rule now matches
the rest of the contract: self-matches go in KB analysis as skip-self,
they just never appear in Affected paths or Next action. The
"acknowledge and skip straight to next action" rule is rewritten so
all five section headers stay present — Severity, Category, and
Affected paths can collapse to one-line stubs but the structure is
non-negotiable.
@Oddly Oddly merged commit a963b49 into main Apr 11, 2026
11 checks passed
@Oddly Oddly deleted the feat/claude-triage branch April 11, 2026 18:26
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 11, 2026

Note

Autofix is a beta feature. Expect some limitations and changes as we gather feedback and continue to improve it.

Autofix skipped. No unresolved CodeRabbit review comments with fix instructions found.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant