Enable seidroid xreview, bump uci to v0.0.15 - #85
Conversation
Enables seidroid xreview (on-demand, sandbox-backed agentic PR review via `seidroid xreview` comment), and brings ai-review/ai-assist onto the same uci release for consistency. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
PR SummaryMedium Risk Overview ai-review and ai-assist are updated from uci v0.0.13 to v0.0.15 on the same commit SHA so all three seidroid workflows share one uci release. Reviewed by Cursor Bugbot for commit 2094db8. Bugbot is set up for automated code reviews on this repo. Configure here. |
There was a problem hiding this comment.
CI-only change adding a thin caller workflow for seidroid xreview plus a uci v0.0.13→v0.0.15 SHA bump on the two existing AI workflows; the security posture (full-SHA pins, scoped secrets: rather than inherit, minimal permissions, local trust gate) is sound and I found no blockers. Remaining notes are non-blocking: a substring command match, no caller-level concurrency, an unverified/absent trigger secret, and secrets: inherit left in place on the two bumped workflows.
Findings: 0 blocking | 8 non-blocking | 4 posted inline
Blockers
- None at the file/PR level.
Non-blocking
- The Cursor second-opinion pass produced no output (
cursor-review.mdis empty), so that perspective is missing from this synthesis. Codex reported no material issues.REVIEW_GUIDELINES.mdis also empty, so no repo-specific standards were applied. - Consistency: the new file's comment argues (correctly) that
secrets: inheritwould hand a cross-repo reusable workflow every secret in this repo. That same reasoning applies toai-review.yml:14andai-assist.yml:18, which still usesecrets: inheritand are unchanged here. Worth a follow-up to narrow those to the specific secrets uci actually needs — not required for this PR. - I could not verify from this environment that
65901242783550521f25a19199a6b10e54550b97is in fact the tip of uciv0.0.15, nor that the callee declares onlyuci-refas an input and onlyOMNIGENT_M2M_CLIENT_SECRETas a secret. If the callee declares any otherrequired: truesecret or input, every run fails at dispatch. Please confirm against the uci repo before merge. - The job comment (lines 12–17) asserts behavior of the external workflow — that it does an authoritative exact-command check and owns a job-level concurrency group. Those claims can silently drift as uci is bumped. Consider trimming to what this file controls, or noting the uci version the claims were verified against.
- 4 suggestion(s)/nit(s) flagged inline on specific lines.
| ${{ github.event.issue.pull_request | ||
| && github.event.comment.user.type != 'Bot' | ||
| && contains(fromJSON('["OWNER","MEMBER","COLLABORATOR"]'), github.event.comment.author_association) | ||
| && contains(github.event.comment.body, 'seidroid xreview') }} |
There was a problem hiding this comment.
[suggestion] contains(...) is an unanchored substring match, so any comment that merely mentions the command dispatches a run — e.g. a reviewer writing "you can run seidroid xreview on this", or a quoted reply (> seidroid xreview) — as long as the commenter is OWNER/MEMBER/COLLABORATOR. Not a security hole (the callee does the authoritative exact-command check, per the comment above), but it burns a runner slot and shows a spurious check on the PR.
Suggest anchoring it, which also makes the local pre-filter match the callee's intent more closely:
&& startsWith(github.event.comment.body, 'seidroid xreview')| types: [created] | ||
|
|
||
| jobs: | ||
| xreview: |
There was a problem hiding this comment.
[suggestion] No concurrency group is declared at the caller level. The comment above states overlapping runs are handled by the reusable workflow's job-level group, but that is an external guarantee this repo can't enforce and that can drift on the next uci bump. A cheap belt-and-braces addition:
xreview:
concurrency:
group: seidroid-xreview-${{ github.event.issue.number }}
cancel-in-progress: trueThis also caps damage from the substring match above if someone posts the command several times in a row.
| # Pass ONLY the one secret xreview needs — not `secrets: inherit`, which would hand the | ||
| # cross-repo reusable workflow every secret on this repo (release, ECR/GHCR, Slack, …). | ||
| secrets: | ||
| OMNIGENT_M2M_CLIENT_SECRET: ${{ secrets.OMNIGENT_M2M_CLIENT_SECRET }} |
There was a problem hiding this comment.
[suggestion] Per the PR description, OMNIGENT_M2M_CLIENT_SECRET is not currently visible at the repo-secret level and may still need to be added. If it's unset, this expression resolves to an empty string rather than erroring, so the job dispatches and then fails during omnigent auth — a red check on the PR with a non-obvious cause.
Recommend confirming the secret (repo or org level) before merging, since issue_comment workflows are read from the default branch and go live for everyone the moment this lands. Optionally add if: secrets.OMNIGENT_M2M_CLIENT_SECRET != ''-style guarding, though caller-level secrets context isn't available in job if:, so confirming the secret is the practical fix.
| # (to the next release's commit SHA) to adopt a new xreview release. The verdict is posted to | ||
| # the PR as one sticky comment when a review produces one. | ||
| on: | ||
| issue_comment: |
There was a problem hiding this comment.
[nit] Two issue_comment properties worth noting for the test plan:
- Workflows triggered by
issue_commentare always loaded from the default branch, so the test-plan step "open a test PR, commentseidroid xreview" will not exercise this file until after merge. Plan to validate post-merge. - The trust gate keys off
github.event.comment.author_association— the commenter — not the PR author or head repo. A MEMBER can therefore trigger the review on a fork PR containing untrusted head code, with the job holdingpull-requests: writeand the M2M secret. That's the standard shape for this pattern and presumably fine given xreview's sandbox, but the sandbox is the only thing standing between untrusted code and those credentials — worth confirming that boundary in uci rather than assuming it.
masih
left a comment
There was a problem hiding this comment.
This looks good.
Blocking until UCI part is reviewed.
Enables seidroid xreview on sei-go-ethereum — the on-demand, sandbox-backed agentic review, a third seidroid capability alongside the
ai-review/ai-assistthis repo already runs. Also bumps those two existing workflows to the same uci release for consistency.Linear: PLT-873
What this adds
New file
.github/workflows/seidroid-xreview.yml— a thin caller thatuses:the uci reusable workflow, so the review logic lives insei-protocol/uci:6590124) on bothuses:anduci-ref— a fixed ref, never a moving tag.OMNIGENT_M2M_CLIENT_SECRET(notsecrets: inherit), so the cross-repo reusable workflow never receives this repo's other secrets.if:gate mirrors the reusable workflow's trust check (PR comment, non-bot,OWNER/MEMBER/COLLABORATOR, command mentioned) so an unrelated or untrusted comment never dispatches it.seidroid xreviewon a PR to trigger it; the verdict posts as a single sticky comment.What this changes
ai-review.ymlandai-assist.ymlbumped from uci v0.0.13 (29a9c73) to v0.0.15 (6590124), same commit as xreview, so all three workflows track one release.Prerequisites (need verification before this is live)
sei-droidGitHub App installed on this repouci-defaultrunner-group access granted to this repoOMNIGENT_M2M_CLIENT_SECRETsecret configured (not currently visible at the repo-secret level — onlyCODECOV_TOKENshows; may be an org-level secret, or may still need adding)Test plan
sei-droidapp + runner-group access +OMNIGENT_M2M_CLIENT_SECRETare in placeseidroid xreview, confirm sticky verdict comment is postedai-review/ai-assiststill run correctly on the bumped uci ref