GeezerVison is showing github.com — feat: add organization skill ACL routes by ibetitsmike · Pull Request #30592 · coder/coder
Conversation
ibetitsmike
commented
Oct 10, 2026
•
edited
Loading
Uh oh!
There was an error while loading. Please reload this page.
Part of CODAGT-1341.
Adds the ACL routes for organization skills under /api/experimental/organizations/{organization}/skills/{skillName}: GET /acl, PATCH /acl and GET /acl/available, copying the MCP server config ACL routes. They reuse the previous layer's shared helpers; the Everyone grant on new skills comes from the create route in a lower layer.
- Every route sits behind
ExtractOrganizationSkillParam(..., policy.ActionShare), so a caller without share gets 404: a member who reads the skill through Everyone, an org auditor, or an API key without organization_skill:share.
- After the share check,
GET /acl resolves users and groups (with member counts) as system, and GET /acl/available lists the skill organization's members and groups as AsSystemRestricted, never through the generic directories.
PATCH /acl takes sparse deltas with only read or "". It returns 400 for a user outside the organization, a group from another organization, an unknown principal, any other role, or two spellings of one UUID; removing an absent entry succeeds. In one transaction it locks the granted users' memberships FOR KEY SHARE, then the skill row (a member removal's order, so no deadlock), validates, applies the deltas to copies of the current ACLs, and writes with the caller's context, so dbauthz checks share again. A delete between the middleware read and the lock returns 404. The change is audited as a write on organization_skill with the organization ID and the old and new rows.
Testing
TestOrganizationSkillACL: an org admin and the site owner use all three routes; an Everyone reader and an org auditor get 404; a sparse update changes who can list and get the skill and is audited with the ACL diff; the 400 cases and absent removals; available excludes other organizations; a read scoped key gets 404 on PATCH while a share key succeeds. TestOrganizationSkillACLConcurrentDelete: a delete after the middleware read returns 404, not 500. TestOrganizationSkillACLMemberRemoval: RemovalBeforeGrant gets 400 with the lock (204 and a stale grant without it); RemovalAfterGrant covers removal and rejoin.
- Red-green: admitting
read instead of share fails the non-sharer and scoped-key cases; skipping the membership check fails the outside-user case; dropping the 404 mapping fails the concurrent delete test.
- Ran the skill and MCP tests, swagger checks, golangci-lint on
./coderd/, and make gen with no diff.
Review record
- Remote UAT round 6 through Coder Agents: PASS on the final stack tip
afdd4a9f954 (chat); its low notes are in docs(docs/ai-coder/agents): document organization skills #30604.
- UAT round 1: a direct user grant stayed in
user_acl after the user left the organization and applied again on rejoin. Fixed in round 3 by the owners layer's organization_members delete trigger, which also covers deleted users. MCP server and chat model ACLs keep the old behavior.
- Codex round 1: fixed in 80c1c35 with the acl-queries membership lock, so a member removed during an ACL update can't keep a direct grant; in-transaction revalidation alone, as suggested, still missed the race.
This stack adds organization skills to Coder Agents: admins publish a skill once per organization, share it with groups or members, and chats in that organization load it next to personal and workspace skills.
Stack, bottom to top: #30584, #30585, #30586, #30587, #30588, #30589, #30590, #30591, #30592, #30593, #30594, #30595, #30596, #30597, #30598, #30599, #30600, #30601, #30602, #30603, #30604.
Xum opened this PR on behalf of @ibetitsmike.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
chatgpt-codex-connector[bot] reacted with thumbs up emoji
This was referenced Oct 10, 2026
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Codex Review Summary
This comment shows the latest Codex review activity on this pull request.
| Review |
Status |
Commit |
Review trigger |
| 📝 Code Review |
✅ Completed 2026-10-10T03:41:42.646978Z |
80c1c35 |
Manual request |
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review" or "@codex security review".
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 781e3de4ff
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
Codex Review: Didn't find any major issues. You're on a roll.
Reviewed commit: 80c1c3594e
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Milestone
No milestone
Development
Successfully merging this pull request may close these issues.
Uh oh!
There was an error while loading. Please reload this page.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
|