Skip to content

Give issues and pull requests a first reader - #368

Merged
HardMax71 merged 18 commits into
mainfrom
three-agent-lanes
Aug 11, 2026
Merged

HardMax71 merged 18 commits into
mainfrom
three-agent-lanes

Conversation

@HardMax71

@HardMax71 HardMax71 commented Aug 10, 2026 •

Copy link
Copy Markdown
Owner

Three agent lanes for issues and pull requests, final architecture: gh-aw workflows whose agents run read-only on DeepSeek and express every action through schema-validated safe outputs that a separate harness job executes. Reviews land as one consolidated card, summary plus line-anchored comments in a single API call; issue triage answers whoever opened the issue, with evidence; /oc summons the agent for collaborators and can produce a comment, a pull request, or a push to the PR branch, and nothing else is expressible. The DeepSeek key rides Copilot BYOK, isolated in the sandbox proxy where the agent process cannot read it.

The road here is the review history: an opencode-based stack (composite action, digest-pinned install, permission config, a comment-template plugin) fell one lane at a time to findings its own reviewer raised, the decisive one being the pinned harness's write-access gate on issue authors, which no triage audience survives. The compiled .lock.yml files are generated by gh aw compile, sha-pinned and zizmor-clean, and exempted from the file-start-comment hook like Cargo.lock.

Arming: DEEPSEEK_API_KEY is the only secret the lanes need.

Summary by CodeRabbit

  • New Features
    • Added automated issue triage with evidence-based feedback and repository references.
    • Added automated pull-request reviews with focused findings and inline comments.
    • Added collaborator-triggered /oc workflows for investigations and implementation pull requests.
    • Release pull requests are now created as drafts.
  • Documentation
    • Documented available automated agent workflows and their behavior.
  • Chores
    • Updated repository metadata and validation rules for generated workflow files.

Three agent lanes, none gating. A new issue gets its premise checked
against the tree behind an account-age gate; a new pull request gets
one evidence-based review comment; /oc in a collaborator's comment
summons the agent for anything else, including fixing an issue behind
a pull request. The shared body is one composite: checkout, warm
cache, nextest, and opencode on deepseek-v4-flash with sharing off.
The key travels as a composite input and reaches exactly one step's
env, under the name the provider contract requires. The mention lane
borrows the release token so an agent-opened PR still triggers ci;
the other two hold only their lane's write scope. Prompts treat issue
text as a claim under test, not as instructions.
Copilot AI lite review requested due to automatic review settings August 10, 2026 21:36

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@coderabbitai

coderabbitai Bot commented Aug 10, 2026 •

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@HardMax71, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 46 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 09ee3967-66c4-416c-aea8-6fb76732f269

📥 Commits

Reviewing files that changed from the base of the PR and between 3eba090 and f3d3266.

📒 Files selected for processing (1)
  • docs/src/development.md
📝 Walkthrough

Walkthrough

Adds three non-gating DeepSeek agent workflows for issue triage, pull-request review, and collaborator-triggered /oc remediation. Adds command routing, action locking metadata, workflow validation settings, documentation, and draft release pull-request configuration.

Changes

Agent automation

Layer / File(s) Summary
Workflow action support
.github/aw/actions-lock.json, .gitattributes, .pre-commit-config.yaml, .github/zizmor.yml
Adds the locked setup action, marks workflow lockfiles as generated, and excludes generated workflow files from related checks.
Issue triage automation
.github/workflows/agent-triage.md
Adds a read-only DeepSeek workflow for opened issues. It validates claims and posts one structured verdict with evidence and session details.
Pull-request review automation
.github/workflows/agent-review.md
Adds a read-only DeepSeek workflow for pull-request events. It limits findings to verified issues and posts one constrained review summary.
Comment-triggered agent runs
.github/workflows/agentic_commands.yml, .github/workflows/agent-mention.md
Routes collaborator /oc and /opencode comments to agent processing for investigations and implementation requests. The agent can comment or create or update pull requests under defined policy constraints.
Development workflow documentation
docs/src/development.md
Documents the three agent workflows, their restrictions, structured outputs, and linked run artifacts.

Release pull-request drafts

Layer / File(s) Summary
Draft release configuration
release-plz.toml
Configures workspace release pull requests as drafts.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant GitHubEvent
  participant AgentWorkflow
  participant DeepSeek
  participant GitHubOutput
  GitHubEvent->>AgentWorkflow: Trigger issue, pull-request, or comment workflow
  AgentWorkflow->>DeepSeek: Run with read-only repository access and bounded outputs
  DeepSeek->>GitHubOutput: Post verdict, review, comment, or pull request
Loading
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 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: adding first-reader agent support for issues and pull requests.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch three-agent-lanes

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actions

Copy link
Copy Markdown
Contributor

Model not found: deepseek/deepseek-v4-flash. Did you mean: deepseek-v4-flash?

github run

@github-actions

Copy link
Copy Markdown
Contributor

Skeptical pass over the three lanes and the composite. Two claims in the PR body do not survive contact with the pinned action.

Discrepancies

  1. The default model id is wrong, and it already failed on this PR. .github/actions/agent/action.yml:10 defaults model to deepseek/deepseek-v4-flash. The agent-review lane that this PR triggered (run 31434641081) resolved that id against the model registry and failed: the github-actions comment on this PR at 21:37:11Z reads "Model not found: deepseek/deepseek-v4-flash. Did you mean: deepseek-v4-flash?". models.dev's DeepSeek provider lists the model id as deepseek-v4-flash, not deepseek/deepseek-v4-flash. Since all three lanes inherit this default, none of them can run, which also means the new docs/src/development.md:97-98 claim that "all three run opencode on DeepSeek" describes lanes that currently cannot run.

  2. The release-token wiring is dead. .github/workflows/agent-mention.yml:37 passes token: ${{ secrets.RELEASE_TOKEN }}, and .github/actions/agent/action.yml:46 forwards it to anomalyco/opencode/github. But the pinned action (@a3647eb025c7615159d417dcc49fc39fdaeba65b = v1.18.16, verified) declares only model, agent, share, prompt, use_github_token, mentions, variant, oidc_base_url as inputs — there is no token input, so the value is dropped with an "unexpected input" warning. At that version opencode github run honors either GITHUB_TOKEN (when use_github_token is true) or an OIDC exchange against https://api.opencode.ai. So the body's central claim — "that lane alone carries the release token so a pull request it opens still triggers ci" — and the comments at agent-mention.yml:32-33 and docs/src/development.md:95-97 are not implemented: with use_github_token: "false" the lane will attempt the OpenCode-app OIDC exchange, not use RELEASE_TOKEN.

Not mentioned in the text

  • All checkouts use fetch-depth: 0 (full history) with persist-credentials: false; fine, just unstated.
  • timeout-minutes of 20/30 per lane is unstated.
  • agent-review requests issues: write on top of pull-requests: write; harmless, unstated.
  • In agent-mention the composite's opencode step exports GITHUB_TOKEN="" (empty-string github_token input default at .github/actions/agent/action.yml:42), which sits next to the "only step that holds a credential" comment; worth confirming it does not confuse the exchange once issue 2 is fixed.

What held up

  • The composite split is justified (GitHub only discovers .github/workflows, so grouping via agent- prefix + one composite is the right shape), and the body's inventory is accurate: pinned checkout/install/rust-cache, restore-only cache (save-if: "false"), and the sha-pinned opencode action with share: "false".
  • The DeepSeek key travels as a composite input and lands in exactly one step's env under DEEPSEEK_API_KEY, the name models.dev requires for this provider; it never appears at caller level.
  • zizmor 1.29.0 reports the three workflows clean (10 informational findings suppressed).
  • The triage gate (30-day account age, agent-triage.yml:24-34), the review exclusions (same-repo, non-draft, release-plz-* branches, agent-review.yml:17-20), and the collaborator-only /oc trigger (agent-mention.yml:19-22) all match the described behavior.
  • No Rust code changes, so the workspace suite is unaffected.

@github-actions

Copy link
Copy Markdown
Contributor

Posted one review comment on PR #368.

Two of the PR body's claims fail against the tree:

  • .github/actions/agent/action.yml:10 — model deepseek/deepseek-v4-flash is unresolvable; the agent-review lane this PR triggered already failed on it (run 31434641081, "Did you mean: deepseek-v4-flash?"), and models.dev's id is deepseek-v4-flash. All three lanes inherit the bad default.
  • .github/workflows/agent-mention.yml:37 — the pinned opencode v1.18.16 action has no token input, so RELEASE_TOKEN is dropped and the "release token so CI triggers" claim is not implemented (the lane would fall to the OpenCode-app OIDC exchange instead).

Held up: composite split + pinned actions, restore-only rust-cache, key scoped to one step under DEEPSEEK_API_KEY, zizmor clean, and the account-age/repo/draft/author gates. No Rust code touched, so the suite was unaffected.

github run

The agent's own first review caught it: the pinned opencode release
has no token input, so the mention lane's release token was silently
dropped and the lane would have fallen to an app exchange we never
installed. The mechanism this release actually offers is the
GITHUB_TOKEN env behind use_github_token, so the composite takes one
required github_token and the mention lane hands it the release
token. The model-id half of that review refuted itself: the run that
posted it resolved deepseek/deepseek-v4-flash.

@cubic-dev-ai cubic-dev-ai Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

All reported issues were addressed across 5 files

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread .github/workflows/agent-mention.yml Outdated
Comment thread .github/workflows/agent-triage.yml Outdated
Comment thread .github/actions/agent/action.yml Outdated
Comment thread .github/actions/agent/action.yml Outdated
@HardMax71

Copy link
Copy Markdown
Owner Author

Verified both findings before acting, and the verdict splits. The token finding is confirmed and fixed in f352195: the pinned release's action.yml has no token input (checked at the sha: model, agent, share, prompt, use_github_token, mentions, variant, oidc_base_url), so the composite now takes one required github_token routed through the GITHUB_TOKEN env behind use_github_token, and the mention lane hands it the release token. The model finding refutes itself: the very run that posted the review logs 'model: deepseek/deepseek-v4-flash' and completed, so the id resolves; the earlier failure was the not-yet-set key, not the id.

The wrapper action resolved and installed whatever release was latest
while credentials sat in its environment; the composite now installs
the CLI itself, version and digest pinned, cached, with credentials
entering only at the run step. A comment on a pull request works on
that PR's head instead of main. Sessions share their transcript,
which is the only real window into what the agent did, since the CLI
prints an unquietable event stream.

Prompts rebuilt on the collected review-agent practices: reason, then
finding, then confidence, with low confidence dropped; inline review
comments anchored through the reviews API instead of quoted
citations; questions and counterexamples over assertions; links
mandatory. The shared voice lives in .github/agent-voice.md, loaded
through opencode.json instructions so the mention lane gets it too,
because a PROMPT there would replace the comment text itself. Triage
comments end by inviting /oc follow-ups.
@HardMax71
HardMax71 marked this pull request as draft August 10, 2026 22:01
@HardMax71
HardMax71 marked this pull request as ready for review August 10, 2026 22:01
Comment thread .github/actions/agent/action.yml Fixed
Comment thread .github/actions/agent/action.yml Fixed

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

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 current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/actions/agent/action.yml:
- Around line 20-22: Change the default value of the share input in the action
configuration from "true" to "false", so omitted share inputs do not enable
session sharing and callers must explicitly opt in.

In @.github/workflows/agent-mention.yml:
- Around line 25-27: Remove the unused id-token: write permission from the
permissions blocks in .github/workflows/agent-mention.yml (lines 25-27),
.github/workflows/agent-review.yml (lines 23-27), and
.github/workflows/agent-triage.yml (lines 18-21); retain contents: read and the
existing GITHUB_TOKEN/RELEASE_TOKEN behavior.
- Around line 29-39: Update the workflow around the local agent action checkout
to query pull request metadata before any checkout and reject requests whose
head.repo.full_name differs from github.repository. Ensure
./.github/actions/agent is loaded only from a trusted default-branch revision,
and do not pass fork pull-request refs to the privileged workflow.

In `@docs/src/development.md`:
- Line 94: Update the pull-request review statement in the development
documentation to describe the eligibility gates enforced by the agent-review
workflow: only same-repository, non-draft pull requests are reviewed, excluding
head branches matching release-plz-*. Keep the existing review behavior
description for eligible pull requests.
🪄 Autofix

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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 6d347eca-3705-46c0-9be0-c20a80854e21

📥 Commits

Reviewing files that changed from the base of the PR and between 61b9741 and 4a6b3b6.

📒 Files selected for processing (7)
  • .github/actions/agent/action.yml
  • .github/agent-voice.md
  • .github/workflows/agent-mention.yml
  • .github/workflows/agent-review.yml
  • .github/workflows/agent-triage.yml
  • docs/src/development.md
  • opencode.json

Comment thread .github/actions/agent/action.yml Outdated
Comment thread .github/workflows/agent-mention.yml Outdated
Comment thread .github/workflows/agent-mention.yml Outdated
Comment thread docs/src/development.md Outdated

@cubic-dev-ai cubic-dev-ai Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

All reported issues were addressed across 7 files (changes from recent commits).

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

Comment thread .github/actions/agent/action.yml Outdated
Comment thread .github/workflows/agent-mention.yml Outdated
Comment thread .github/actions/agent/action.yml Outdated
Comment thread .github/workflows/agent-review.yml Outdated
The smoke stalled ten minutes silent: the agent wrote its review
payload to /tmp, the external_directory rule's default is ask, and
nothing in CI answers. The run step now carries OPENCODE_PERMISSION
allowing /tmp and denying the other askable surfaces outright, since
a deny returns an error the agent can route around while an ask
waits forever. The review prompt also keeps scratch files inside the
checkout.

@cubic-dev-ai cubic-dev-ai Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

All reported issues were addressed across 7 files

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread .github/actions/agent/action.yml Outdated
Comment thread docs/src/development.md Outdated
Comment thread .github/workflows/agent-review.yml Outdated
The three-key permission fix left every unlisted permission kind on
its upstream default, so any other ask rule would stall a future run
the same way. The blanket allow closes the class; question and
doom_loop stay denied, external writes stay fenced to /tmp, and the
real boundaries were never this layer anyway: token scopes, the
capped key, fork exclusion, and a discarded runner.
@HardMax71
HardMax71 marked this pull request as draft August 10, 2026 22:17
@HardMax71
HardMax71 marked this pull request as ready for review August 10, 2026 22:18
workflow_dispatch takes a PR number, checks out that PR's head, and
tells the agent to fetch the body, diff, and threads itself, since a
dispatched run carries no event context. Also retires the
draft-toggle as the smoke mechanism.
Three reviewers converged on the same hole: a collaborator's /oc on a
fork PR would have checked out the fork's tree into a job holding the
release token and the model key. A gate now resolves the PR through
the API, refuses fork heads outright, and pins same-repo heads to the
sha it saw, which also closes the TOCTOU window. id-token: write
leaves all three lanes since the GITHUB_TOKEN path never exchanges
OIDC, transcript sharing follows opencode's own public-only default
instead of a hardcoded true, the review prompt derives repository and
PR number from the event, and the book states the review lane's
eligibility gates and which lane takes instructions.
The reviewer ran on opened and ready_for_review alone, a cost choice
now overruled: synchronize joins the triggers, and the concurrency
group already cancels superseded runs so rapid pushes collapse to the
newest head.
The scanner's stubbornness found the one path the mention-lane fix
missed: a hand-dispatched review of a fork PR would have checked out
the fork's tree. The dispatch path now resolves the PR the same way,
same-repository heads only, pinned to the observed sha.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

One high-confidence finding: the mention lane's fork exclusion fails on the pull_request_review_comment trigger, where a fork's merge ref is checked out before the gate and the local composite then runs from that tree. Composite split, sha-pinned actions, one-step key scoping, and the review/triage eligibility gates all check out; no Rust code is touched.

Comment thread .github/workflows/agent-mention.yml Outdated
@github-actions

Copy link
Copy Markdown
Contributor

Review posted: #368 (review)

One high-confidence finding. For pull_request_review_comment, GITHUB_REF is refs/pull/N/merge, so the mention lane's ref-less checkout runs before the place gate and pulls the fork's merge commit into the workspace; the local composite ./.github/actions/agent then loads from that tree, letting a fork PR that edits action.yml execute arbitrary steps with RELEASE_TOKEN and DEEPSEEK_API_KEY in env. The issue_comment path is safe (default-branch event ref). Verified against the events reference and the gate's empty-ref fallback in the tree.

Everything else held: composite split + sha-pinned actions, restore-only rust-cache, key scoped to one step, zizmor-era permission trimming, and the review/triage eligibility gates. No Rust code touched, so the workspace suite was not run.

New%20session%20-%202026-08-10T22%3A33%3A51.406Z
opencode session  |  github run

@cubic-dev-ai cubic-dev-ai Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

All reported issues were addressed across 5 files (changes from recent commits).

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

Comment thread .github/workflows/agent-mention.yml Outdated
Comment thread .github/workflows/agent-review.yml Outdated
The agent's own review caught what three reviewers and the scanner
missed in spirit: pull_request_review_comment events check out the PR
merge ref before any step runs, so a fork's tree, composite included,
would execute in the credentialed job. That trigger now refuses
foreign heads at the job boundary.

Every lane mints its identity from one GitHub App, downscoped per
lane, falling back to its old token while the app secrets are absent;
app-authored PRs also trigger ci, which retires the release token
once the app exists. The reviewer posts its findings as an empty-body
review of anchored comments and puts the summary in its one comment,
whose tail, review link, session link, run link, folds into a closed
details block via the voice file's ending rule.

@github-actions github-actions Bot left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Every prior finding resolves in the head, and nothing new survives contact with the tree.

What I verified, not asserted: the deepseek/deepseek-v4-flash default resolves at runtime — run 31434641081 logs providerID: "deepseek", modelID: "deepseek-v4-flash" and completes, so the 21:37 "Did you mean: deepseek-v4-flash?" is stale. The pinned sha256 in .github/actions/agent/action.yml:52 matches the v1.18.16 artifact I downloaded and checked. OPENCODE_PERMISSION is read and JSON-merged by the pinned version, and every env name the composite sets matches the pinned action's contract. The merge-ref door is closed at the job boundary: the events reference gives pull_request_review_comment a refs/pull/N/merge checkout, and the gate at .github/workflows/agent-mention.yml:25-26 refuses fork heads before any checkout; issue_comment runs on the default branch, so no fork tree reaches a credentialed workspace on either trigger. Token routing uses only the pinned action's real inputs — no stray token — behind USE_GITHUB_TOKEN with the app-token/RELEASE_TOKEN fallback, and no id-token remains in any workflow. All three workflows and the composite parse; every action is sha-pinned.

One prior item stays open: cubic's dispatch-for-fork agent-review P1 runs on the trusted default-branch tree with the fork's text read as claims — the same trust model as the triage lane, behind a write-access dispatcher — so it does not clear the bar for a finding.

No Rust code is touched, so the workspace suite was not run.

The rewrite regressed the blob URL into a placeholder template, which
the scanner reads as a same-repo reference and fails to resolve, the
exact law the file exists to teach. The example is a real path again,
with the swap-main-for-sha instruction in prose.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

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 current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/agent-voice.md:
- Line 9: Update the citation URL template in the documentation around the
link-format guidance to escape or inline-code the <sha>, <path>, and <n>
placeholders, preventing them from being interpreted as markup while preserving
the documented URL format.

In @.github/workflows/agent-mention.yml:
- Around line 37-50: Update the workflow’s place step to emit an allowed output:
set allowed=true for ordinary issues, and for pull requests set it false when
the head repository differs from REPOSITORY while retaining the existing ref
lookup for same-repository PRs. Add allowed=true/false to the step outputs and
gate both the identity step and agent execution step on
steps.place.outputs.allowed == 'true', preventing fork pull requests from
reaching credential or agent steps.

In `@docs/src/development.md`:
- Line 96: Update the collaborator mention-command paragraph to document both
supported aliases, /oc and /opencode, while preserving the existing workflow
description.
- Around line 94-95: Update the review-trigger documentation near the
description of new pull requests to enumerate all supported triggers: pull
request creation, transition to ready for review, every subsequent push, and
manual dispatch. Preserve the existing eligibility conditions for the automated
review lane.
🪄 Autofix

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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 5d8adeaf-9fbb-4518-a570-eee5a597a4f7

📥 Commits

Reviewing files that changed from the base of the PR and between 4a6b3b6 and 005eea8.

📒 Files selected for processing (6)
  • .github/actions/agent/action.yml
  • .github/agent-voice.md
  • .github/workflows/agent-mention.yml
  • .github/workflows/agent-review.yml
  • .github/workflows/agent-triage.yml
  • docs/src/development.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/actions/agent/action.yml

Comment thread .github/agent-voice.md Outdated
Comment thread .github/workflows/agent-mention.yml Outdated
Comment thread docs/src/development.md Outdated
Comment thread docs/src/development.md Outdated
@github-actions

Copy link
Copy Markdown
Contributor

Everything held. I verified each claim against the tree and found no new high-confidence defect, so per the rule I post no review.

What I checked, not asserted: every pinned action sha dereferences to its stated tag, and the pinned opencode v1.18.16 artifact's sha256 matches the digest in .github/actions/agent/action.yml:52. The binary honors the env names the composite sets: MODEL in provider/model form, GITHUB_TOKEN behind USE_GITHUB_TOKEN (no OIDC exchange, no id-token left in any lane), SHARE empty means the vendor's public-only default, and OPENCODE_PERMISSION is JSON-parsed and merged into the session permission. All three workflows and the composite parse; zizmor 1.29.0 reports them clean; CI is green including the self-scan.

The security posture survives the events reference. issue_comment checks out the default branch, pull_request_review_comment checks out refs/pull/N/merge, and .github/workflows/agent-mention.yml:25-26 refuses foreign heads at the job boundary before any checkout, so a fork tree never reaches a credentialed workspace on either trigger. Same for agent-review: forks are refused at the job boundary on pull_request events and by the place step's exit 1 on dispatch, with same-repo heads pinned to the observed sha. The issue_comment-on-fork-PR path still runs the credentialed agent on the default branch reading fork text as claims; cubic and coderabbit both raised it, the maintainer accepted it as the triage trust model, and it does not meet the bar for a new finding.

No Rust code is touched, so the workspace suite was not run.

New%20session%20-%202026-08-11T10%3A47%3A18.955Z
opencode session  |  github run

The mention lane's empty-ref fallback silently ran against main with
credentials when a collaborator summoned it on a fork PR; it exits 1
now, matching the dispatch gate. The book's lane paragraph gains the
per-push and dispatch triggers and the /opencode alias.

@cubic-dev-ai cubic-dev-ai Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

All reported issues were addressed across 2 files (changes from recent commits).

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

Comment thread docs/src/development.md Outdated
The comment structure the lanes promise is now assembled by an
opencode plugin at the one published hook that reaches posted text,
experimental.text.complete: a STATUS marker becomes the visible
callout, WHAT WAS DONE folds into a closed details block, a trailing
review link and the harness's appended session and run links land
inside an open-ended Session details block, shapes verified against
GitHub's own renderer. The plugin no-ops outside Actions, passes
marker-less text through untouched, and covers all three lanes from
one file, since every lane's session loads it. The model's formatting
duty shrinks to two marker lines, stated in the voice file all lanes
read.
Comment thread .opencode/plugin/comment-template.js Outdated
Comment thread .github/workflows/agent-triage.yml Outdated
@github-actions

Copy link
Copy Markdown
Contributor

Review posted: #368 (review)

The head commit's templating machinery is dead on arrival. .opencode/plugin/comment-template.js:48 exports _test, a plain object, and opencode v1.18.16's legacy loader treats every export as a function or an object with a .server method, throwing TypeError: Plugin export is not a function before any hook registers. I reproduced the throw by importing the module and running the loader logic copied from the pinned source, and the throw string exists in the pinned binary (sha256 matches the composite's digest). The experimental.text.complete hook never wires up, so the reworded voice line that tells the model to emit STATUS:/WHAT WAS DONE/review: markers now posts those markers literally instead of the folded callout the commit promises.

The triage lane cannot serve the population its gate admits. The pinned harness treats issues as a user event and calls assertPermissions() before any work, requiring the issue author to hold admin/write; a non-collaborator on this public repo gets read (verified with the API), so every age-gate-approved issue from a stranger throws, posts User X does not have write permissions on the issue, and fails the run. The account-age gate is exactly what lets non-collaborator reporters through, so the body's claim that every opened issue gets its premise verified cannot hold.

Everything else held up: the composite split and sha-pinned actions, restore-only rust-cache, one-step key scoping, the merge-ref door and fork refusals, and the eligibility gates. No Rust code is touched, so the workspace suite was not run.

review: #368 (review)

New%20session%20-%202026-08-11T11%3A17%3A31.290Z
opencode session  |  github run

The reviewer caught the plugin dead on arrival: the pinned loader
treats every module export as a plugin and throws on the test-only
object export, so no hook ever registered. The test rides the public
export now.
@HardMax71

Copy link
Copy Markdown
Owner Author

Warning

The fix holds, verified against the pinned loader and not the commit message. The head's module exports only CommentTemplate, so the loader's getLegacyPlugins sees a single function and registers it: I ran the loader logic copied from the pinned source (packages/opencode/src/plugin/index.ts:90-121, a3647eb0) against the module and it returned [CommentTemplate] with no throw, and CommentTemplate() with GITHUB_RUN_ID set yields the experimental.text.complete hook, which folds a STATUS: text into the callout, the WHAT WAS DONE block, and the session-details footer while passing marker-less text through untouched. The dead-on-arrival finding is closed.

One claim in the reply does not survive contact with the tree: there is no offline test. The only committed file under .opencode/ is the plugin itself, .opencode/package.json declares no scripts, and none of the PR's eight files is a test, so the offline check that used to drive _test and now drives CommentTemplate lives outside the repo, and CI has nothing that would have caught the dead export. template() is private now, reachable only through the hook with GITHUB_RUN_ID set, so the templating these last two commits are about has no committed regression guard. Nit: a two-line node check against CommentTemplate would close that and make the reply's claim true.

What was done

Confirmed abafd97 deletes _test and leaves one function export. Copied getServerPlugin/getLegacyPlugins/readV1Plugin detect mode from the pinned tag and ran them on the module: no V1 match, [CommentTemplate], no throw. Called CommentTemplate() with GITHUB_RUN_ID set and ran the returned hook on STATUS: and marker-less text. Grepped the tree and the PR diff for any plugin test: none exist, and auto-discovery of .opencode/plugin is in the pinned config (config.ts:462).

Session details

New%20session%20-%202026-08-11T11%3A24%3A46.368Z
opencode session  |  github run

Comment thread .github/workflows/agent-triage.yml Outdated
@github-actions

Copy link
Copy Markdown
Contributor

One finding, verified against the pinned binary and the API, posted as a review.

The triage lane cannot serve the issue authors its own gate admits. The pinned opencode v1.18.16 artifact (sha256 matches the digest in .github/actions/agent/action.yml:52) runs assertPermissions() before any work on issues events, throwing User X does not have write permissions unless the author holds admin or write; I confirmed a non-collaborator resolves to read on this repo via the API, so a stranger with a 30-day-old account fails at the harness, the catch block posts the error as a comment on the issue, and the run dies. The lane has no author gate of its own, so the body's claim that every opened issue gets its premise verified holds only for collaborators; the maintainer has not addressed the finding.

What held up, verified not asserted: the plugin fix in abafd97 — the module now exports only a function, and I reproduced the loader's getLegacyPlugins from the pinned binary against the new export with no throw, while the successful mention-lane run (31486473774) confirms the hook registers and templates STATUS: text. The deepseek/deepseek-v4-flash default resolves at runtime (that run logs providerID: "deepseek", modelID: "deepseek-v4-flash"). All action SHAs dereference to their stated tags (annotated-tag objects peel to the pinned commits). The merge-ref and fork doors are closed at the job boundary or the place step, tokens route through GITHUB_TOKEN behind USE_GITHUB_TOKEN, no id-token remains, and the mention lane runs end to end. No Rust code is touched, so the workspace suite was not run.

review: #368 (review)

New%20session%20-%202026-08-11T11%3A24%3A38.611Z
opencode session  |  github run

opencode's github harness posts a conversational comment it fully
owns, permission-gates issue authors to write access, which no triage
audience survives, and follows formatting only as far as the model
cooperates. The lanes are gh-aw workflows now: agents run read-only
on DeepSeek through Copilot BYOK, whose provider key lives in the
sandbox proxy where the agent cannot read it, and a separate harness
job executes their schema-validated outputs, one consolidated review
with anchored comments for pushes, one comment for issue triage, and
comment, pull request, or branch push for /oc, nothing else
expressible. The composite, the plugin, the voice file, and the app
token plumbing all retire; the compiled locks are generated,
zizmor-clean, and exempt from the file-start rule like Cargo.lock.
The book's lane paragraph moves with the architecture.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Warning

"One finding: the triage lane's /oc follow-up instruction is a dead-end for the external issue openers it serves."

The triage lane (agent-triage.md#L59) tells whomever opened an issue to "reply with /oc," but /oc is gated to admin/maintainer/write team members, so the external openers this lane explicitly targets (public repo, roles: all) hit a command that never activates for them. Either make the /oc suggestion collaborator-scoped or point reject/unclear issue authors at a working path.

Session details

github.com/HardMax71/amiss/actions/runs/31487981359

Reviewed the workflow-source .md files and verified their compiled .lock.yml outputs (agent-mention.lock.yml membership gate vs agent-triage.md roles: all); no Rust sources changed.

> Generated by [Review this pull request](https://github.com/HardMax71/amiss/actions/runs/31487981359) for #368 · ⊞ 27.2K

Comment thread .github/workflows/agent-triage.md Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/agent-mention.md:
- Around line 3-4: Update the slash_command name configuration to register both
oc and opencode aliases, then run gh aw compile to regenerate the corresponding
.github/workflows/agent-mention.lock.yml output and GH_AW_COMMANDS value.

In @.github/workflows/agent-review.md:
- Around line 2-4: Update the pull_request trigger configuration to include
draft: false and add an explicit github.event.pull_request.head.ref guard
excluding the repository’s release-plz branch pattern, while preserving the
existing opened, synchronize, and ready_for_review event types.
- Around line 2-4: Extend the workflow triggers with a workflow_dispatch input
identifying the pull request, then update the prompt construction to use that
input for manual runs and pass the same value as pull_request_number to
submit-pull-request-review. Preserve the existing pull_request trigger behavior.

In @.github/workflows/agent-triage.md:
- Around line 2-5: Update the source workflow’s trigger configuration to enforce
the required account-age condition instead of allowing all roles via roles: all.
Then regenerate the derived .github/workflows/agent-triage.lock.yml so it
reflects the updated workflow configuration.
- Around line 14-16: Replace the retired COPILOT_MODEL value with
deepseek-v4-flash in .github/workflows/agent-triage.md (lines 14-16),
.github/workflows/agent-review.md (lines 13-15), and
.github/workflows/agent-mention.md (lines 14-16), preserving the existing
provider URL and API key settings; then run gh aw compile to regenerate each
corresponding .lock.yml workflow file.
🪄 Autofix

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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 75de43d7-c29c-412d-a91f-10d16b3ed5cc

📥 Commits

Reviewing files that changed from the base of the PR and between 005eea8 and b2fc298.

📒 Files selected for processing (10)
  • .gitattributes
  • .github/aw/actions-lock.json
  • .github/workflows/agent-mention.lock.yml
  • .github/workflows/agent-mention.md
  • .github/workflows/agent-review.lock.yml
  • .github/workflows/agent-review.md
  • .github/workflows/agent-triage.lock.yml
  • .github/workflows/agent-triage.md
  • .pre-commit-config.yaml
  • docs/src/development.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/src/development.md

Comment thread .github/workflows/agent-mention.md Outdated
Comment thread .github/workflows/agent-review.md
Comment thread .github/workflows/agent-triage.md
Comment thread .github/workflows/agent-triage.md

@cubic-dev-ai cubic-dev-ai Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

All reported issues were addressed across 17 files (changes from recent commits).

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

Comment thread .github/workflows/agent-mention.md Outdated
Comment thread .github/workflows/agent-triage.md
Comment thread docs/src/development.md
Comment thread .github/workflows/agent-review.md
Comment thread .github/workflows/agent-review.md
The callout drops its quotation marks and carries the verdict as its
own quoted line; the run link becomes a real markdown link the agent
assembles from its environment; the generated-by footers turn off
where this gh-aw version allows; and the mention lane routes through
the centralized dispatcher, so skipped runs stop littering every
comment and /opencode works beside /oc, on comment events only, which
also makes the book's collaborator sentence true. Reviews skip drafts,
and release-plz pull requests become drafts at the source, restoring
both old exclusions in one filter. The model id moves to
deepseek-v4-flash for robustness, though the retirement claim is
contradicted by the run that reviewed the migration on the alias. The
generated dispatcher joins the generated-file exemptions and its two
audit findings are excepted by name; both belong upstream.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

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 current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/agent-review.md:
- Line 75: Remove the trailing space inside the inline code span on the
referenced instruction line, changing the representation of the blockquote
marker to `>` or a fenced example while preserving the required `> ` output
format.

In @.github/workflows/agent-triage.md:
- Line 54: Update the instruction text in the relevant Markdown guidance so the
blockquote marker code span contains only `>` and places the following space
outside the span, eliminating the MD038 warning while preserving the intended
wording.
- Around line 57-59: Update the evidence-link guidance in the triage
instructions so every cited file and line uses the inspected commit SHA in the
blob URL instead of the mutable blob/main reference, matching the commit-pinning
requirement in agent-review.md.

In @.github/workflows/agentic_commands.yml:
- Around line 55-58: Regenerate the router so the Setup Scripts step uses the
pinned github/gh-aw-actions/setup commit
2709137ea6c5b0e19aa621454dc643ea8dc526b1 with the v0.85.4 annotation; in
.github/workflows/agentic_commands.yml lines 55-58 update that action and set
checkout persist-credentials to false. In .github/zizmor.yml lines 4-9 remove
the unpinned-uses ignore and remove the artipacked ignore unless the regenerated
router still requires Git credentials.
🪄 Autofix

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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 3ba0f706-1785-4e90-9d0a-8de992ab633e

📥 Commits

Reviewing files that changed from the base of the PR and between b2fc298 and 3eba090.

📒 Files selected for processing (10)
  • .github/workflows/agent-mention.lock.yml
  • .github/workflows/agent-mention.md
  • .github/workflows/agent-review.lock.yml
  • .github/workflows/agent-review.md
  • .github/workflows/agent-triage.lock.yml
  • .github/workflows/agent-triage.md
  • .github/workflows/agentic_commands.yml
  • .github/zizmor.yml
  • .pre-commit-config.yaml
  • release-plz.toml
🚧 Files skipped from review as they are similar to previous changes (1)
  • .pre-commit-config.yaml

Then submit one review with the submit_pull_request_review tool, event
COMMENT. Its body opens with `> [!TIP]` when everything holds or `> [!WARNING]`
when findings exist, with the verdict sentence as the callout body on its
own `> ` line, no quotation marks around it, followed by at most a paragraph per finding, one line each. Link

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Remove the trailing space from the code span.

Line 75 contains `> `, which triggers markdownlint MD038. Use `>` line or a fenced example while preserving the required blockquote output format.

🧰 Tools
🪛 markdownlint-cli2 (0.23.2)

[warning] 75-75: Spaces inside code span elements

(MD038, no-space-in-code)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/agent-review.md at line 75, Remove the trailing space
inside the inline code span on the referenced instruction line, changing the
representation of the blockquote marker to `>` or a fenced example while
preserving the required `> ` output format.

Source: Linters/SAST tools

Post one comment with the add_comment tool. It opens with `> [!TIP]` when the claim
does not reproduce or the issue is fine as filed, or `> [!WARNING]` when
the claim is confirmed, with the verdict sentence as the callout body on
its own `> ` line, no quotation marks around it. Then: confirmed means what breaks, where, and the command with

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Resolve the MD038 warning in the instruction text.

Line 54 places a space inside the > code span. markdownlint reports MD038. Keep only > inside the code span.

Suggested wording
-its own `> ` line, no quotation marks around it.
+its own line prefixed by `>`, with no quotation marks.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
its own `> ` line, no quotation marks around it. Then: confirmed means what breaks, where, and the command with
its own line prefixed by `>`, with no quotation marks. Then: confirmed means what breaks, where, and the command with
🧰 Tools
🪛 markdownlint-cli2 (0.23.2)

[warning] 54-54: Spaces inside code span elements

(MD038, no-space-in-code)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/agent-triage.md at line 54, Update the instruction text in
the relevant Markdown guidance so the blockquote marker code span contains only
`>` and places the following space outside the span, eliminating the MD038
warning while preserving the intended wording.

Source: Linters/SAST tools

Comment on lines +57 to +59
would decide it, prefixed Question:. Link every file and line you mention
as a blob URL like
https://github.com/HardMax71/amiss/blob/main/README.md#L1. Close the

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -eu

printf '%s\n' '--- triage lines 45-75 ---'
cat -n .github/workflows/agent-triage.md | sed -n '45,75p'

printf '%s\n' '--- review contract lines 45-100 ---'
cat -n .github/workflows/agent-review.md | sed -n '45,100p'

printf '%s\n' '--- related wording ---'
rg -n -C 3 'blob/(main|<commit|SHA)|head commit|commit SHA|evidence|inspected' .github/workflows/agent-triage.md .github/workflows/agent-review.md

printf '%s\n' '--- repository state ---'
git status --short
git rev-parse HEAD

Repository: HardMax71/amiss

Length of output: 6503


Pin evidence links to the inspected commit.

blob/main can change after the agent posts its verdict. Require the triage lane to use the inspected commit SHA, as required by .github/workflows/agent-review.md.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/agent-triage.md around lines 57 - 59, Update the
evidence-link guidance in the triage instructions so every cited file and line
uses the inspected commit SHA in the blob URL instead of the mutable blob/main
reference, matching the commit-pinning requirement in agent-review.md.

Comment on lines +55 to +58
- name: Setup Scripts
uses: github/gh-aw-actions/setup@v0.85.4
with:
destination: ${{ runner.temp }}/gh-aw/actions

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -eu

printf '%s\n' '--- candidate files ---'
git ls-files | rg '(^|/)(agentic_commands\.yml|zizmor\.yml|.*lock.*|.*gh-aw.*)$' || true

printf '%s\n' '--- setup action references ---'
rg -n -C 4 'github/gh-aw-actions/setup|unpinned-uses|artipacked|immutable|lock|sha256|v0\.85\.4' \
  .github 2>/dev/null || true

printf '%s\n' '--- workflow and zizmor sections ---'
if test -f .github/workflows/agentic_commands.yml; then
  cat -n .github/workflows/agentic_commands.yml | sed -n '45,68p'
fi
if test -f .github/zizmor.yml; then
  cat -n .github/zizmor.yml | sed -n '1,30p'
fi

printf '%s\n' '--- repository metadata references ---'
rg -n -S 'gh-aw-actions/setup|setup@v0\.85\.4|agentic_commands\.yml|gh-aw compile|action.*lock|lock.*action' \
  . --glob '!node_modules/**' --glob '!dist/**' --glob '!build/**' 2>/dev/null || true

Repository: HardMax71/amiss

Length of output: 50372


🏁 Script executed:

#!/bin/bash
set -eu

printf '%s\n' '--- exact tracked workflow/config files ---'
git ls-files '.github/workflows/*agentic*' '.github/zizmor.yml' | sort

printf '%s\n' '--- agentic workflow references ---'
for f in .github/workflows/agentic_commands.yml .github/workflows/agentic_commands.lock.yml .github/zizmor.yml; do
  if test -f "$f"; then
    printf '\n### %s\n' "$f"
    rg -n -C 3 'gh-aw-actions/setup|gh-aw-metadata|gh-aw-manifest|unpinned-uses|artipacked|agentic_commands' "$f" || true
  fi
done

printf '%s\n' '--- all exact setup references in agentic files ---'
rg -n '^[[:space:]]*uses:[[:space:]]*github/gh-aw-actions/setup@' \
  .github/workflows --glob 'agentic_commands*' --glob '*.lock.yml' \
  | rg 'agentic_commands|gh-aw-actions/setup' | head -n 100 || true

Repository: HardMax71/amiss

Length of output: 3363


🏁 Script executed:

#!/bin/bash
set -eu

printf '%s\n' '--- all agentic-related tracked paths ---'
git ls-files | rg -i 'agentic|gh[-_ ]?aw|zizmor' | sort

printf '%s\n' '--- workflow header and action references ---'
cat -n .github/workflows/agentic_commands.yml | sed -n '1,90p'
printf '%s\n' '--- all uses references in agentic_commands.yml ---'
rg -n '^[[:space:]]*(uses|-[[:space:]]+uses):' .github/workflows/agentic_commands.yml || true

printf '%s\n' '--- generator and compile references ---'
rg -n -S -C 3 'gh aw compile|gh-aw compile|agentic_commands\.yml|agentic_commands|unpinned-uses|artipacked' \
  --glob '!*.lock.yml' --glob '!target/**' --glob '!node_modules/**' .github AGENTS.md README.md 2>/dev/null || true

printf '%s\n' '--- deterministic action-reference comparison ---'
python3 - <<'PY'
from pathlib import Path
import re

pat = re.compile(r'uses:\s*([^@\s]+)@([^\s#]+)')
files = [
    Path('.github/workflows/agentic_commands.yml'),
    *sorted(Path('.github/workflows').glob('*.lock.yml')),
]
for path in files:
    if not path.exists():
        continue
    refs = [(repo, ref) for repo, ref in pat.findall(path.read_text())]
    setup = [(repo, ref) for repo, ref in refs if repo == 'github/gh-aw-actions/setup']
    if setup:
        print(f'{path}: setup={setup}')
PY

Repository: HardMax71/amiss

Length of output: 6705


🌐 Web query:

github gh-aw compile generated agentic commands router setup action SHA pinning v0.85.4

💡 Result:

In GitHub Agentic Workflows (gh-aw), the "agentic_commands" router is a compiler-generated workflow (typically named agentic_commands.yml) that centralizes the handling of slash commands and label-based triggers [1][2][3]. When workflows are configured with on.slash_command.strategy: centralized or on.label_command.strategy: decentralized, the gh-aw compiler replaces individual triggers with a dispatch-centric model [2][3]. This router works by: 1. Listening to merged events (e.g., issue_comment, labeled) [1][3]. 2. Executing a JavaScript-based router (route_slash_command.cjs) which uses the GH_AW_SLASH_ROUTING or GH_AW_LABEL_ROUTING metadata to match events to specific workflows [4][3]. 3. Dispatching the target workflows using workflow_dispatch, while propagating essential context via aw_context [1][5][3]. Regarding SHA pinning and version v0.85.4: - The gh-aw project enforces supply chain security through mandatory SHA pinning for dependencies and action references [6]. - The compiler tool (gh-aw compile) is responsible for maintaining these pins [7]. Users are instructed never to edit these references by hand, but rather to use gh-aw compile or gh-aw update-actions to regenerate them [7]. - Version v0.85.4, released on August 6, 2026, includes various security improvements, including audit enhancements and dependency remediations, continuing the project's focus on secure, pinned supply-chain management [8][9][10]. To ensure correct setup, verify your workflow configuration includes the appropriate strategy in the frontmatter, then run the compiler to generate the router and update the SHA pins: gh aw compile This ensures that the generated agentic_commands.yml router and all action references are correctly pinned and aligned with your current project version [7].

Citations:


🌐 Web query:

github github/gh-aw-actions setup v0.85.4 commit 2709137ea6c5b0e19aa621454dc643ea8dc526b1

💡 Result:

The repository github/gh-aw-actions is a shared library of custom GitHub Actions used by the GitHub Agentic Workflows (gh-aw) project [1][2]. These actions are designed to support compiled workflows, providing capabilities such as file management for Model Context Protocol (MCP) servers [1][3]. The commit hash 2709137ea6c5b0e19aa621454dc643ea8dc526b1 identifies a specific version state within the GitHub ecosystem for these workflows. The version tag v0.85.4, released on August 6, 2026, is part of the gh-aw release cycle, where versioning for the actions repository is aligned with the main gh-aw project [1][4]. Important usage notes include: - You should not manually edit action references in your workflows [5]. Instead, use the gh-aw CLI tools (e.g., gh aw compile or gh aw update-actions) to ensure that your workflows are correctly synchronized with the required action versions and commit SHAs [5]. - Dependabot pull requests attempting to bump these action versions should generally not be merged, as pins must be coordinated through the gh-aw compiler to maintain consistency [5].

Citations:


🏁 Script executed:

#!/bin/bash
set -eu

repo='github/gh-aw-actions'
tag='v0.85.4'
pin='2709137ea6c5b0e19aa621454dc643ea8dc526b1'

printf '%s\n' '--- tag ref ---'
if command -v gh >/dev/null 2>&1; then
  gh api "repos/$repo/git/refs/tags/$tag" --jq '.object | [.type, .sha] | `@tsv`'
  obj="$(gh api "repos/$repo/git/refs/tags/$tag" --jq '.object | [.type, .sha] | `@tsv`')"
  type="${obj%%$'\t'*}"
  sha="${obj#*$'\t'}"
  if [ "$type" = tag ]; then
    printf '%s\n' '--- annotated tag target ---'
    gh api "repos/$repo/git/tags/$sha" --jq '.object | [.type, .sha] | `@tsv`'
    sha="$(gh api "repos/$repo/git/tags/$sha" --jq '.object.sha')"
  fi
  printf '%s\n' '--- resolved commit ---'
  gh api "repos/$repo/commits/$sha" --jq '.sha'
  printf '%s\n' '--- contributor pin resolution ---'
  gh api "repos/$repo/commits/$pin" --jq '.sha'
  printf '%s\n' '--- comparison ---'
  if [ "$sha" = "$pin" ]; then echo MATCH; else echo MISMATCH; fi
else
  printf '%s\n' 'gh CLI is unavailable'
  exit 2
fi

printf '%s\n' '--- upstream compilation references ---'
curl -fsSL https://raw.githubusercontent.com/github/gh-aw/main/docs/reference/compilation-process.md \
  | rg -n -C 4 'pin|SHA|update-actions|agentic_commands|compile' | head -n 160 || true

printf '%s\n' '--- upstream router setup references ---'
for ref in main v0.85.4; do
  url="https://raw.githubusercontent.com/github/gh-aw/$ref/.github/workflows/agentic_commands.yml"
  printf '\n### %s\n' "$url"
  curl -fsSL "$url" 2>/dev/null | rg -n -C 2 'gh-aw-actions/setup|uses:' | head -n 80 || true
done

Repository: HardMax71/amiss

Length of output: 20397


🌐 Web query:

zizmor artipacked rule actions checkout GitHub Actions documentation

💡 Result:

In the context of the zizmor security tool, the artipacked audit rule is designed to detect potentially insecure credential persistence in GitHub Actions workflows, specifically concerning the use of actions/checkout [1][2]. By default, the actions/checkout action persists Git credentials on the runner's disk to allow subsequent Git operations [1][3]. The artipacked rule flags these instances because this behavior can inadvertently lead to the leakage of credentials—such as the GITHUB_TOKEN—if the workspace is later uploaded as an artifact (e.g., using actions/upload-artifact) [1][3]. Key aspects of the artipacked rule and its interaction with actions/checkout include: - Credential Persistence: In versions of actions/checkout prior to v6.0.0, credentials are stored directly in the repository's.git/config file [1][3]. In v6.0.0 and later, they are stored under $RUNNER_TEMP, which is a more secure, misuse-resistant location [1][4]. - Rule Behavior: zizmor's artipacked audit identifies when persist-credentials is not explicitly set to false [1][5]. Starting in zizmor v1.17.0, the severity of the finding is downgraded if the workflow is using actions/checkout v6.0.0 or higher, reflecting the reduced risk of credential leakage [1][4]. - Remediation: The recommended remediation is to explicitly disable credential persistence when it is not required for Git operations by setting persist-credentials to false in the actions/checkout step [1][2]. Example of a remediated workflow step: - uses: actions/checkout@v4 with: persist-credentials: false [1][6] If a workflow requires these credentials for specific Git operations (e.g., pushing commits or tagging), you should explicitly set persist-credentials: true to maintain clarity and security, ensuring credentials are only available where necessary [1][2].

Citations:


🏁 Script executed:

#!/bin/bash
set -eu

printf '%s\n' '--- checkout and routing context ---'
cat -n .github/workflows/agentic_commands.yml | sed -n '39,80p'

printf '%s\n' '--- local documentation mentioning Zizmor or artipacked ---'
rg -n -S -C 3 'zizmor|artipacked|unpinned-uses|persist-credentials|agentic_commands' \
  . --glob '!*.lock.yml' --glob '!target/**' --glob '!node_modules/**' 2>/dev/null || true

Repository: HardMax71/amiss

Length of output: 3276


Pin the generated setup action.

Regenerate the router with github/gh-aw-actions/setup@2709137ea6c5b0e19aa621454dc643ea8dc526b1 # v0.85.4, then remove the unpinned-uses ignore. Set persist-credentials: false for checkout and remove the artipacked ignore unless the router requires Git credentials.

📍 Affects 2 files
  • .github/workflows/agentic_commands.yml#L55-L58 (this comment)
  • .github/zizmor.yml#L4-L9
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/agentic_commands.yml around lines 55 - 58, Regenerate the
router so the Setup Scripts step uses the pinned github/gh-aw-actions/setup
commit 2709137ea6c5b0e19aa621454dc643ea8dc526b1 with the v0.85.4 annotation; in
.github/workflows/agentic_commands.yml lines 55-58 update that action and set
checkout persist-credentials to false. In .github/zizmor.yml lines 4-9 remove
the unpinned-uses ignore and remove the artipacked ignore unless the regenerated
router still requires Git credentials.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Warning

The automatic PR-review lane fires only for same-repo PRs from collaborators; the docs' "every push gets one consolidated review" promise is broader than what activates.

Question: Is collaborator-only automatic review the intended scope, and should the docs sentence (and the manual workflow_dispatch fallback) be qualified to match the triggers? The source trigger in agent-review.md#L3 compiles to a same-repo head guard plus an admin/maintainer/write role gate (agent-review.lock.yml#L88, #L1581), so fork, dependabot, and release-plz PRs (draft, github-actions[bot] author) are never auto-reviewed, while development.md#L96 says every push gets one consolidated review. Confidence: high.

Session details
  • run
  • Reviewed all three lane sources and their compiled .lock.yml files against the tree: trigger/role/fork gates, safe-outputs configs and job permissions, secret routing (COPILOT_PROVIDER_API_KEY excluded from the agent container), and log-artifact upload. CI-only PR — no cargo tests run.

Comment thread .github/workflows/agent-review.md
The lane's own first fixed-format review caught the sentence its
migration rewrite had widened: fork heads and drafts never activate,
so the promise carries the qualifiers again, plus the dispatch path.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

1 issue found across 10 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name=".github/workflows/agent-review.md">

<violation number="1" location=".github/workflows/agent-review.md:9">
P2: A manual dispatch via the new `pr` input is not wired into the harness: the compiled workflow only checks out the target PR branch when `aw_context.item_type == 'pull_request'` is set, and `github.event.pull_request.head.sha` (used for GH_AW_HEAD_SHA / blob links) is empty on a dispatch. So a dispatched review runs `cargo nextest` and verifies against the default-branch tree rather than the PR's code, and the agent has no PR head sha in its environment to pin blob URLs to the head commit as the instructions demand. Consider either having the dispatch resolve the PR from `inputs.pr` (checkout the branch and export its head sha) or directing the agent to fetch and check out the PR head itself before verifying/linking.</violation>
</file>

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

workflow_dispatch:
inputs:
pr:
description: Pull request number to review

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2: A manual dispatch via the new pr input is not wired into the harness: the compiled workflow only checks out the target PR branch when aw_context.item_type == 'pull_request' is set, and github.event.pull_request.head.sha (used for GH_AW_HEAD_SHA / blob links) is empty on a dispatch. So a dispatched review runs cargo nextest and verifies against the default-branch tree rather than the PR's code, and the agent has no PR head sha in its environment to pin blob URLs to the head commit as the instructions demand. Consider either having the dispatch resolve the PR from inputs.pr (checkout the branch and export its head sha) or directing the agent to fetch and check out the PR head itself before verifying/linking.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .github/workflows/agent-review.md, line 9:

<comment>A manual dispatch via the new `pr` input is not wired into the harness: the compiled workflow only checks out the target PR branch when `aw_context.item_type == 'pull_request'` is set, and `github.event.pull_request.head.sha` (used for GH_AW_HEAD_SHA / blob links) is empty on a dispatch. So a dispatched review runs `cargo nextest` and verifies against the default-branch tree rather than the PR's code, and the agent has no PR head sha in its environment to pin blob URLs to the head commit as the instructions demand. Consider either having the dispatch resolve the PR from `inputs.pr` (checkout the branch and export its head sha) or directing the agent to fetch and check out the PR head itself before verifying/linking.</comment>

<file context>
@@ -2,6 +2,13 @@
+  workflow_dispatch:
+    inputs:
+      pr:
+        description: Pull request number to review
+        required: true
+        type: string
</file context>

@HardMax71 HardMax71 self-assigned this Aug 11, 2026
@HardMax71
HardMax71 enabled auto-merge (rebase) August 11, 2026 16:51
@HardMax71
HardMax71 merged commit e1318b2 into main Aug 11, 2026
26 checks passed
@HardMax71
HardMax71 deleted the three-agent-lanes branch August 11, 2026 16:52

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Warning

The review lane's hand-dispatch path is wired to nothing: pr is declared, promised in the prompt, and documented, but the compiled workflow never reads it.

One finding. The review lane declares workflow_dispatch.inputs.pr (agent-review.md), its prompt tells a dispatched agent to use "the number in the pr input" (lines 52-53), and docs/src/development.md (added by this PR) promises "a review can be dispatched by hand for any PR number" — but the compiled agent-review.lock.yml resolves the PR only from github.event.pull_request.number or aw_context.item_type/item_number, and its PR-checkout gate (line 498) keys off aw_context.item_type == 'pull_request', so a manual dispatch that fills the required pr input yields no PR number, no pull-request-number context, and a default-branch checkout. The mention lane's dispatch path works (the dispatcher passes only aw_context); the documented manual path is a no-op.

Session details

run — extracted the three compiled lane workflows and the pinned gh-aw-actions v0.85.4 scripts (route_slash_command.cjs, check_membership.cjs, checkout_pr_branch.cjs, safe-output handler manager), grepped the compiled locks for every inputs.* and secret reference, and verified the PR body claims against the tree.

draft: false
workflow_dispatch:
inputs:
pr:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Reason: the compiled agent-review.lock.yml reads dispatch context only from github.event.inputs.aw_context and github.event.pull_request.number (context expressions at lines 190, 268-271, 344-347), and its PR-checkout gate (line 498) keys on aw_context.item_type == 'pull_request'; github.event.inputs.pr appears nowhere in the compiled file, and the dispatcher (route_slash_command.cjs) passes only aw_context, never pr.

Problem: the required 'pr' dispatch input declared here is never read, so a manual workflow_dispatch that fills it hands the agent no PR number, no pull-request-number context block, and a default-branch checkout — the prompt's 'on a dispatched run the number in the pr input' (lines 52-53) and the docs promise of dispatching a review 'by hand for any PR number' (docs/src/development.md line 97, added by this PR) do not hold as wired.

Confidence: high.

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.

3 participants