Skip to content

🤖 CoderMCPServer: decide whether an unresolved group blocks removing old access #313

Closed

Description

@ThomasK33

Problem

When a new generation of a CoderMCPServer names a group in spec.access.groups that does not exist in Coder, the apply step of #307 stops with GroupNotFound before it changes anything. That follows the plan's fail-static rule (#155 plan 4.8 item 3: "If a name does not resolve, the controller changes nothing and reports GroupNotFound").

A consequence: if the earlier generation allowed a broader group (for example Everyone), that group keeps access to the enabled config until the new group exists. This also holds when the same generation sets enabled: false or changes the URL, because the config PATCH is not sent either. The object reports Stalled with GroupNotFound.

The kind is not registered, so no install is affected today.

Decision needed before activation (M9)

Option A: keep fail static, as the plan says now, and document it in the how-to.

Option B: on GroupNotFound, still run the remove-only pass by name from the ACL answer (Coder returns each group's name), and send enabled: false when the new generation disables the server. Then add the groups once they resolve.

Found by the Codex normal and security reviews of #307 (threads 4266502717 and 4266511679).

Refs #155


Generated with xum • Model: anthropic:claude-opus-5-5 • Thinking: high • Cost: $94.89

Activity

  1. ThomasK33 commented on Oct 14, 2026

    @ThomasK33
    MemberAuthor

    Maintainer decision: Option B (fail closed).

    When a group in access.groups does not resolve in Coder (GroupNotFound), the controller must still remove the old ACL entries that the new spec no longer lists, by name from Coder's ACL answer. If the same generation disables the server, it must also send enabled: false. It adds the missing groups once they exist. It must never widen access while a group is missing.

    Reason: this matches the fail-closed rule that M6c (#330) and M6e (#360) use for consent and opt-in withdrawal. It only removes access, so it cannot expose a config to more users.

    Gate: before M9 (CoderMCPServer activation). The how-to must describe the behavior.


    Generated with xum • Model: anthropic:claude-opus-5-5 • Thinking: medium

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions