feat(ci): claude-code-action triage + interactive workflows#123
Conversation
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.
|
Note Reviews pausedIt 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 Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughReplaces 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
Sequence Diagram(s)mermaid User->>GitHub: Open/Reopen issue or comment (or dispatch) Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
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.
There was a problem hiding this comment.
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
📒 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.yamlscripts/claude-triage-dry-run.shworkflows/bug-fix.yamlworkflows/code-review.yamlworkflows/feature-implement.yamlworkflows/planning-pipeline.yamlworkflows/prompts/bug-fix.mdworkflows/prompts/code-review.mdworkflows/prompts/feature-implement.mdworkflows/prompts/task-decompose.mdworkflows/prompts/triage.mdworkflows/task-decompose.yamlworkflows/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
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.
There was a problem hiding this comment.
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
📒 Files selected for processing (3)
.github/workflows/claude-triage.yaml.github/workflows/claude.yamlscripts/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
# Conflicts: # .github/workflows/agentry-bug-fix.yaml # .github/workflows/agentry-code-review.yaml # .github/workflows/agentry-feature-implement.yaml # .github/workflows/agentry-triage.yaml
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.
There was a problem hiding this comment.
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
markdownortextas 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
📒 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
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.
There was a problem hiding this comment.
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
📒 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
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.
There was a problem hiding this comment.
♻️ Duplicate comments (2)
.github/prompts/triage-distillery.md (2)
254-256:⚠️ Potential issue | 🟠 MajorConflicting 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-selfin## 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
📒 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.
|
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. |
Replaces the agentry triage pipeline with a single-step workflow driven by
anthropics/claude-code-action@v1and 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@v1directly, 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 onissues: [opened, reopened]+workflow_dispatchwithissue_numberinput. Loads the prompt from.github/prompts/triage.mdat 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 viagh issue view --json, pipes toclaude -plocally, 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)
elasticsearch_cluster_settingsconvention, named the_security/roleAPI endpoint. ~90 words.1d5eb53), named concrete shared-file targets. ~180 words.All three grounded, no fluff, no invented personas. First-attempt output.
Not in this branch
Next session will
claude-triage.yamlagainst all 14 open issues viagh workflow run -f issue_number=N./home/sam/backups/triage-comparison/(to be moved from/tmp/in a moment).workflows/directory +agentry-*.yamlfiles in a follow-up commit on this branch, then un-draft the PR.Summary by CodeRabbit