GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — feat: add organization skill sharing ACL routes by ibetitsmike · Pull Request #30611 · coder/coder

Conversation

@ibetitsmike

@ibetitsmike ibetitsmike commented Oct 11, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Collaborator

Stack

Part of CODAGT-1341. 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. It replaces the 21-PR draft stack #30584 to #30604 with five PRs, bottom to top:

  1. feat: add the organization skills data model #30609 data model: one migration, queries, RBAC and dbauthz
  2. feat: add organization skill API routes #30610 organization skill API routes and the scope-neutral SDK
  3. feat: add organization skill sharing ACL routes #30611 sharing ACL routes (this PR)
  4. feat(site): add organization skill settings with a shared skills UI #30612 settings UI: shared skills table, admin page, member section
  5. feat: load organization skills in chats #30613 chats: chatd loading, / menu, docs

What changes

This PR adds the routes that let admins choose who can read an organization skill. It reuses the MCP server ACL machinery rather than adding a second implementation.

Routes under /api/experimental/organizations/{organization}/skills/{skillName}, all behind httpmw.ExtractOrganizationSkillParam with share, so a caller without share gets 404:

  • GET /acl returns the resolved user and group grants.
  • GET /acl/available returns the organization's users and groups that can be granted, with the same q, after_id, limit and offset paging as the MCP endpoint.
  • PATCH /acl takes a sparse UpdateOrganizationSkillACLRequest: only the listed principals change, read grants and "" removes. It returns 204 and writes a write audit entry with the old and new ACL.

Concurrency (please review closely): the PATCH transaction first locks the granted users' organization_members rows FOR KEY SHARE (new query LockOrganizationMembersByUserIDsForShare, run as system), then locks the skill row FOR UPDATE, then validates the update on the transaction handle. Member removal takes the same locks in the same order (its membership row, then the skill rows through the #30609 trigger), so the two can't deadlock, and a removal can't miss a grant written by a concurrent PATCH. A skill deleted between the middleware read and the row lock stays a 404.

Grants are users and groups, the same as MCP server configs (Mike's decision, for parity). Only the read role exists; any other role is a validation error, as are users or groups outside the organization.

Supporting changes:

  • coderd/mcp_acl.go: the MCP ACL handlers' resolution, candidate listing and validation move into generic helpers (writeOrganizationACLAvailable, validateOrganizationACLUpdate, resolveACLUsers, resolveACLGroups) shared by both resources; acl.Validate accepts a named acl.Role constraint that now includes codersdk.OrganizationSkillRole.
  • codersdk/skills.go: OrganizationSkillRole, OrganizationSkillACL with its user and group entries, UpdateOrganizationSkillACLRequest, and client methods.
  • New sqlc query UpdateOrganizationSkillACLByID with its dbauthz wrapper (requires share).

Commits

The first commit reproduces the reviewed code from the old stack; each later commit is a labeled trim or fix.

  • b1c85560b69 feat: add organization skill sharing ACL routes. Reproduction: every file this commit changes equals the reviewed old acl-routes head 80c1c3594e6; the rest of the tree differs only by feat: add the organization skills data model #30609's migration merge and main.
  • b5d2ee265c8 test(coderd): merge duplicate organization skill ACL route tests (+49/-111). The removed cases repeated TestMCPServerConfigACL, TestMCPServerConfigACLAvailable or TestRolePermissions; with the MCP tests included, the covered block set of organizationskills_acl.go, mcp_acl.go and rbac/acl/updatevalidator.go is identical before and after. Kept: TestOrganizationSkillACL (OrgAdminManagesACL, ReadersGetNotFound, SparseUpdateChangesReaders with the audit diff, RejectsUnsupportedRole, ScopedAPIKeys), TestOrganizationSkillACLConcurrentDelete, and the lock order tests TestOrganizationSkillACLMemberRemoval (RemovalBeforeGrant, RemovalAfterGrant). OrgAdminManagesACL now also checks that users from another organization are not candidates (mutation checked). Sharing the param extractor with MCP was skipped: it would save about 10 lines of security-sensitive code.
  • e09c4dba66b Merge the updated org-api layer into sharing. Brings in feat: add organization skill API routes #30610's ad0a7a37504; the merge has no changes of its own.
  • 1d3817dc639 and c8c88f84d18 merge the updated feat: add organization skill API routes #30610 layer, including main; no changes of their own.
  • c4d22c47990 merges the updated feat: add organization skill API routes #30610 layer (main at e7b76872098); no changes of its own.

Size

Production +431/-102, tests +377/-0, generated +918/-0; total +1726/-102. This is above the 500-line reviewer-friendly limit on purpose: Mike asked for 4 to 5 PRs instead of the 21 small ones this stack replaces.

Replaces

#30591 (ACL queries), #30592 (ACL routes).

Validation

  • go build and go vet passed; make gen exited 0 with no diff.
  • go test passed for coderd (skill, MCP and ACL tests), coderd/database, dbauthz, migrations, gentest, coderd/rbac/..., coderd/httpmw, coderd/x/skills/..., coderd/x/chatd/..., and the audit and skill tests in enterprise/audit and enterprise/coderd.
  • The covered block comparison above, before and after the test merge.
  • On c4d22c47990: the same checks as feat: add organization skill API routes #30610's head, plus go test ./coderd/ -run 'Skill|MCP|ACL', pass.
  • Remote UAT round 7 through Coder Agents passed on the whole stack; see feat: load organization skills in chats #30613's Validation for scope and findings.

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
All reactions
  • 👍 1 reaction
@github-actions github-actions Bot assigned ibetitsmike Oct 11, 2026
@ibetitsmike
ibetitsmike added this pull request to stack #30614 October 11, 2026 00:29
@ibetitsmike

ibetitsmike commented Oct 11, 2026

Copy link
Copy Markdown
Collaborator Author

@codex review

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 11, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown

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-13T15:32:07.331643Z c4d22c4 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.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 11, 2026

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. 🚀

Reviewed commit: b5d2ee265c

ℹ️ 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".

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

This was referenced Oct 11, 2026
feat: add the organization skills data model #30609
Merged
feat: add organization skill API routes #30610
Merged
@ibetitsmike ibetitsmike changed the title mike/skills/sharing feat: add organization skill sharing ACL routes Oct 11, 2026
This was referenced Oct 11, 2026
feat(site): add organization skill settings with a shared skills UI #30612
Merged
feat: load organization skills in chats #30613
Merged
@linear-code

linear-code Bot commented Oct 11, 2026

Copy link
Copy Markdown

CODAGT-1341

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@ibetitsmike

ibetitsmike commented Oct 11, 2026

Copy link
Copy Markdown
Collaborator Author

@codex review

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 11, 2026

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Hooray!

Reviewed commit: e09c4dba66

ℹ️ 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".

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

This was referenced Oct 11, 2026
refactor: rename user_skills to skills #30584
Closed
feat: add organization and project owners to skills #30585
Closed
feat: add the organization_skill RBAC resource and skill queries #30586
Closed
feat: make skill types scope-neutral and add a personal skill enabled toggle #30587
Closed
feat: add organization skill read routes #30588
Closed
feat: add organization skill write routes and audit #30589
Closed
refactor(site/src/pages/AgentsPage): make skill components scope-neutral #30590
Closed
feat: add organization skill ACL queries and share organization ACL helpers #30591
Closed
feat: add organization skill ACL routes #30592
Closed
feat(coderd/x): merge skills from personal, org, and workspace sources #30593
Closed
feat(coderd/x): load organization skills in chats #30594
Closed
feat(site/src): add organization skill API methods and owner-scoped skill queries #30595
Closed
refactor(site/src): parameterize the skills table by owner, copy, and edit access #30596
Closed
feat(site/src): add an enabled toggle and a view dialog to the skills table #30597
Closed
feat(site): add the organization skills settings page #30598
Closed
refactor(site/src/pages/AISettingsPage): share the ACL principal autocomplete #30599
Closed
feat(site/src): add organization skill permissions #30600
Closed
This was referenced Oct 11, 2026
refactor(site/src/pages/AgentsPage): resolve slash menu aliases with one n-source helper #30601
Closed
feat(site/src/pages/AgentsPage): show organization skills in the slash menu #30602
Closed
feat(site/src): show organization skills on the member skills page #30603
Closed
docs(docs/ai-coder/agents): document organization skills #30604
Closed
@ibetitsmike
ibetitsmike marked this pull request as ready for review October 11, 2026 10:18
@ibetitsmike
ibetitsmike requested a review from nickvigilante as a code owner October 11, 2026 10:18
@pr-queue-manager
pr-queue-manager Bot requested a review from f0ssel October 11, 2026 10:19
f0ssel
f0ssel approved these changes Oct 12, 2026
View reviewed changes
@ibetitsmike

ibetitsmike commented Oct 13, 2026

Copy link
Copy Markdown
Collaborator Author

@codex review

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 13, 2026

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Keep them coming!

Reviewed commit: c8c88f84d1

ℹ️ 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".

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@ibetitsmike

ibetitsmike commented Oct 13, 2026

Copy link
Copy Markdown
Collaborator Author

@codex review

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 13, 2026

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Hooray!

Reviewed commit: c4d22c4799

ℹ️ 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".

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

ibetitsmike added a commit that referenced this pull request Oct 13, 2026
@ibetitsmike
feat: add the organization skills data model (#30609)
b67587c
## Stack

Part of
[CODAGT-1341](https://linear.app/codercom/issue/CODAGT-1341/support-organization-level-skills-in-coder-agents).
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. It
replaces the 21-PR draft stack #30584 to #30604 with five PRs, bottom to
top:

1. **#30609** data model: one migration, queries, RBAC and dbauthz (this
PR)
2. #30610 organization skill API routes and the scope-neutral SDK
3. #30611 sharing ACL routes
4. #30612 settings UI: shared skills table, admin page, member section
5. #30613 chats: chatd loading, `/` menu, docs

## What changes

This PR adds the data model and authorization for organization skills.
Personal skills keep working unchanged: `git diff origin/main --
codersdk site` shows only generated RBAC and API key scope additions
(`apikey_scopes_gen.go`, `rbacresources_gen.go`,
`rbacresourcesGenerated.ts`, the RBAC and scope unions in
`typesGenerated.ts`) and `codersdk.ResourceTypeOrganizationSkill` with
its friendly string. No personal route, SDK type or site component
changes, and `coderd/userskills_test.go` changes only by mechanical
constant renames.

**One migration, `000621_skills`** (please review it closely):

- renames `user_skills` to `skills` with its constraints, index and
triggers, and recreates the cap function and
`delete_deleted_user_resources`, whose PL/pgSQL bodies name the table;
- adds `organization_id` and `project_id` (`ON DELETE CASCADE`),
`enabled` (default true), and `group_acl` / `user_acl` (`jsonb`, default
`{}`), with CHECKs for exactly one owner, ACLs that are JSON objects,
and ACLs that stay empty unless an organization owns the row, plus
partial unique name indexes per owner kind;
- replaces the cap trigger with `enforce_skills_per_owner_limit()`: 100
rows per owner, disabled rows included, locking the owner row `FOR NO
KEY UPDATE` so unrelated foreign key checks are not blocked;
- adds a `BEFORE DELETE` trigger on `organization_members` that removes
a departing member from `user_acl` on that organization's skills, so
rejoining doesn't restore a direct grant;
- adds the `organization_skill` `resource_type` and `api_key_scope` enum
values last; nothing in the migration uses them.

The down migration undoes the three old migrations in reverse order: it
drops organization and project rows and restores `user_skills`, its
names, the cap function and `user_id NOT NULL`.

Authorization: a new RBAC resource `organization_skill` (create, read,
update, delete, share). Owner and org admin get it; site and org
auditors get read; members read only through the skill's ACL, which
applies only to members of its organization. `Skill.RBACObject()`
returns the organization object with both ACLs; project rows stay denied
to everyone. New sqlc queries cover organization insert, get, list
(SQL-filtered through `GetAuthorizedOrganizationSkillMetadata` and a
`regosql` converter), update and delete, with dbauthz wrappers and the
audit table entries. No routes yet.

## Commits

The first commit reproduces the reviewed code from the old stack; each
later commit is a labeled trim or fix.

- `baa3150e3b7` feat: add the organization skills data model.
Reproduction: every non-site file this commit changes equals the
reviewed old `authz` head `1e16b3004c4`, except that the old stack's
migrations 000615, 000616 and 000617 are merged into one migration (then
`000615_skills`, now `000621_skills`) with one fixture
(`testdata/fixtures/000621_skills.up.sql`) and one migration test (now
`testMigration000621Skills`). At that commit, `dump.sql` was
byte-identical to the old head's.
- `1b84e83463a` test(coderd/database): keep only the SQL paths of the
org skill matrix. `TestOrganizationSkillAuthorization` becomes
`TestOrganizationSkillQueries` instead of being deleted, because
coverage showed it is this PR's only run of the
`GetAuthorizedOrganizationSkillMetadata` row scan (80% to 65% without
it) and of the organization update and delete queries (100% to 0%).
Swapping `group_acl` and `user_acl` in the converter makes
`GrantedMember` fail. The removed cases are decided by
`TestRolePermissions`, `TestSkillRBACObjectOrganizationACL` and the
dbauthz method suite.
- `e2931b412e9` test(coderd/database): fold the skill cap cases into
existing coverage. The user case is covered by `TestUserSkillLimit` and
`TestUserSkillLimitConcurrentCreates`; the organization case folds into
`ConcurrentOrganizationInsertsHonorCap`, which now also checks that
disabled rows count and another organization is unaffected (mutation
checked); the project case stays.
- `be62aea9021` test(coderd/rbac): drop
`TestOrganizationSkillReadScope`, covered by `TestExternalScopeNames`
and the generated scope file.
- `0c275ba37de` merges main at `454a2fcc697`, which took 000615 to
000618: it renumbers the migration to 000619 and resolves `dump.sql`,
`check_constraint.go` and the generated API docs. `8f2b4b87ee2` merges
main at `ad85646164e`, which took 000619: it renumbers the migration to
000620.
- `5248d56b64f` merges main at `e7b76872098`, which took 000620
(`000620_audit_chat_project_instructions_resource_type`): it renumbers
the migration, fixture and migration test to `000621_skills` (step
`Migration000621Skills`, version 621), and resolves
`enterprise/audit/table.go` (keeping main's
`AuditableChatProjectInstructions` entries and the `Skill` entry),
`dump.sql` and `models.go` (the `resource_type` enum gets
`chat_project_instructions`, then `organization_skill`) and the
regenerated `schemas.md`. The up and down SQL are unchanged by every
renumbering.

## Size

Production +549/-67, tests +728/-33, generated +881/-314; total
+2158/-414. This is above the 500-line reviewer-friendly limit on
purpose: Mike asked for 4 to 5 PRs instead of the 21 small ones this
stack replaces.

## Replaces

#30584 (rename `user_skills` to `skills`), #30585 (skill owners), #30586
(organization skill authorization).

## Validation

- Migration test: up keeps the existing personal row and its ID; down
restores the `user_skills` names, cap function and `NOT NULL`, and drops
organization rows; soft-deleting a user removes their skills after up,
after down, and after re-up.
- `go test` passed on `be62aea9021`, before the main merges, for
`coderd` (skill tests), `coderd/database`, `dbauthz`, `migrations`,
`gentest`, `coderd/rbac/...`, `coderd/x/chatd`, `coderd/x/skills`,
`enterprise/audit` and `enterprise/coderd`; `make lint/check-scopes`
passed; the four personal skills Vitest files pass unchanged.
- On `5248d56b64f`: build, vet, `TestMigrate`, `TestMigrationChain`, the
`migrations`, `database`, `dbauthz`, `gentest`, `rbac` and
`enterprise/audit` packages pass; `make gen` run twice is clean, and
`make pre-commit` passes.
- Remote UAT round 7 through Coder Agents passed on the whole stack; see
#30613's Validation for scope and findings.

> Xum opened this PR on behalf of @ibetitsmike.
Base automatically changed from mike/skills/org-api to main October 13, 2026 16:24
@ibetitsmike
ibetitsmike requested a review from a team as a code owner October 13, 2026 16:24
ibetitsmike added a commit that referenced this pull request Oct 13, 2026
@ibetitsmike
feat: add organization skill API routes (#30610)
db7f5a7
## Stack

Part of
[CODAGT-1341](https://linear.app/codercom/issue/CODAGT-1341/support-organization-level-skills-in-coder-agents).
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. It
replaces the 21-PR draft stack #30584 to #30604 with five PRs, bottom to
top:

1. #30609 data model: one migration, queries, RBAC and dbauthz
2. **#30610** organization skill API routes and the scope-neutral SDK
(this PR)
3. #30611 sharing ACL routes
4. #30612 settings UI: shared skills table, admin page, member section
5. #30613 chats: chatd loading, `/` menu, docs

## What changes

This PR adds the organization skill CRUD routes and makes the skill SDK
types owner-neutral so personal and organization skills share them.

**API contract change (experimental API, personal and organization
skills):** skill list and get responses gain `enabled`, and `PATCH
.../skills/{skillName}` now takes `{content?, enabled?}`, so `content`
is optional and a toggle doesn't resend it. A PATCH with neither field
returns 400; `content`, when present, is validated as before. In the
SDK, `UserSkill`, `UserSkillMetadata`, `CreateUserSkillRequest` and
`UpdateUserSkillRequest` become `Skill`, `SkillMetadata`,
`CreateSkillRequest` and `UpdateSkillRequest` (`codersdk/userskills.go`
moves to `codersdk/skills.go`), and `UpdateSkillRequest.Content` is now
`*string`. The personal client method names are unchanged. The site
changes are the handwritten edits that rename forces (`api.ts`,
`queries/userSkills.ts`, `testHelpers/skills.ts` and three call sites),
with no UI change.

Organization routes under
`/api/experimental/organizations/{organization}/skills`, not gated by an
experiment or license, like the personal ones:

- `GET` lists with the caller's own permissions, so admins, the site
owner and org auditors see every skill and members see only skills
shared with them. `GET /{skillName}` goes through the new
`httpmw.ExtractOrganizationSkillParam` and admits only read, so a
missing skill and a denied one both return 404.
- `POST` checks `create` on the organization before reading the body,
then seeds `group_acl` with the Everyone group (whose ID is the
organization ID) so a new skill reaches every member until an admin
narrows it. The 100-skill cap and a duplicate name return 409.
- `PATCH` admits only callers who can read the skill, because its
response includes the content; `DELETE` admits callers who can read or
delete it. A reader who can't change the skill gets a write-specific 403
from the database wrapper, and everyone else gets 404. PATCH locks the
row as system, updates as the caller in the same transaction, and audits
the locked row only after the transaction commits.
- Audit: `database.AuditableOrganizationSkill` records resource type
`organization_skill` with the organization ID; personal skills keep
`user_skill`.

Personal and organization handlers share one create and update path in
`coderd/userskills.go` (`createSkill`, `updateSkill`, and a
`skillWriteErrors` table per owner and action).

## Commits

The first commit reproduces the reviewed code from the old stack; each
later commit is a labeled trim or fix.

- `49cb2c84276` feat: add organization skill API routes. Reproduction:
every file this commit changes, including the SDK layer's site edits,
equals the reviewed old `write-routes` head `aa597100f28`; the rest of
the tree differs only by #30609's migration merge and main.
- `dc893bc60d6` refactor(coderd): share the skill create and update path
across owners (production +164/-188). It keeps the organization create
check before the body read, the lock as system then update as caller
order, and audit assignment after the transaction. No swagger,
`codersdk` or `typesGenerated.ts` change; `make gen` is clean.
- `f94925425ef` test(coderd): merge duplicate personal and organization
skill tests. `TestSkillsCRUD`, `TestSkillValidationAndConflicts` and
`TestSkillAudit` are table-driven over Personal, OrgAdmin and SiteOwner,
alongside `TestOrganizationSkillAuditsDeniedWrites` and one
`ScopedAPIKeys` subtest; `TestPatchUserSkill` is deleted because none of
its blocks were unique. Coverage of `userskills.go`,
`organizationskills.go` and `httpmw/organizationskillparam.go` is 101 of
117 blocks before and after, the same block set.
- `ad0a7a37504` fix(coderd): require read access to patch an
organization skill. The organization PATCH route now admits only `read`,
because its response carries the skill's content: a key scoped to
`organization_skill:update` without read gets 404, like GET, instead of
200 with the content. Readers without update still get 403, and DELETE
is unchanged. `TestOrganizationSkillAccess/ScopedAPIKeys` asserts the
404, that the response has no content, and that the skill is unchanged;
against the old route it fails with 200.
- `69d00ded0b6` and `f67b79343ec` merge the updated #30609 layer,
including main; `69d00ded0b6` resolves a conflict in the personal skills
page with main. No other changes of their own.
- `18373ffd59e` merges the updated #30609 layer (main at `e7b76872098`)
and reapplies the `AuditableOrganizationSkill` entry in
`enterprise/audit/table.go` alongside main's new
`AuditableChatProjectInstructions` entries.

## Size

Production +838/-308, tests +733/-322, generated +801/-274; total
+2372/-904. This is above the 500-line reviewer-friendly limit on
purpose: Mike asked for 4 to 5 PRs instead of the 21 small ones this
stack replaces.

## Replaces

#30587 (scope-neutral SDK and personal enabled state), #30588 (read
routes), #30589 (write routes and audit).

## Validation

- The coverage comparison above, before and after the test merge.
- `make gen` leaves no diff after the shared create and update refactor.
- On `18373ffd59e`: `make gen` is clean; build, vet, the `coderd` and
`enterprise/coderd` skill tests, `rbac`, `httpmw`, `dbauthz` and
`enterprise/audit` pass; `pnpm check`, `pnpm lint` and `make pre-commit`
pass.
- Remote UAT round 7 through Coder Agents passed on the whole stack; see
#30613's Validation for scope and findings.

> Xum opened this PR on behalf of @ibetitsmike.
ibetitsmike added 2 commits October 13, 2026 18:24
@ibetitsmike
feat: add organization skill sharing ACL routes
9721973
Add per-skill user and group ACL queries and GET/PATCH
/api/experimental/organizations/{organization}/skills/{skill}/acl plus
GET .../acl/available. Extract the MCP server ACL helpers into
coderd/mcp_acl.go so both resources share validation. The PATCH locks
the granted users' organization memberships before the skill row, which
matches the member-removal trigger's lock order.
@ibetitsmike
test(coderd): merge duplicate organization skill ACL route tests
7922e20
The ACL handlers share their validation, canonicalization and candidate
listing helpers in coderd/mcp_acl.go with MCP server configs, and
TestMCPServerConfigACL and TestMCPServerConfigACLAvailable already cover
every block of those helpers. Role coverage of the share action lives in
TestRolePermissions.

So the site owner sharer case, the org auditor non-sharer case, the
foreign user, foreign group and duplicate spelling rejections, and the
separate available-candidates subtest go. The org admin subtest now also
checks that a user from another organization is not a candidate, which
fails if the handler passes the wrong organization. The unsupported role
rejection, sparse updates with user and group grants, scoped API keys,
the concurrent delete, and the member removal lock order tests stay.
@ibetitsmike
ibetitsmike force-pushed the mike/skills/sharing branch from c4d22c4 to 7922e20 Compare October 13, 2026 16:24
@ibetitsmike
ibetitsmike merged commit 2c432a1 into main Oct 13, 2026
32 checks passed

Uh oh!

There was an error while loading. Please reload this page.

@ibetitsmike
ibetitsmike deleted the mike/skills/sharing branch October 13, 2026 16:43
@github-actions github-actions Bot locked and limited conversation to collaborators Oct 13, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Reviewers

@f0ssel f0ssel f0ssel approved these changes
@nickvigilante nickvigilante Awaiting requested review from nickvigilante

Uh oh!

There was an error while loading. Please reload this page.

Assignees

@ibetitsmike ibetitsmike

Labels

None yet

Projects

None yet

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.

2 participants

@ibetitsmike @f0ssel
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.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.