Skip to content

feat(integrations): per-agent integration access managed by the reconciler - #479

Closed
pinotelio wants to merge 1 commit into
mainfrom
feat/agents-access-signed
Closed

pinotelio wants to merge 1 commit into
mainfrom
feat/agents-access-signed

Conversation

@pinotelio

Copy link
Copy Markdown
Contributor

Per-agent integration access managed by the reconciler: each integration's Agents tab (and each agent's Access tab) turns an agent on or off at a vendor and sets its access in the vendor's own terms, and the reconciler applies and keeps it.

This is the work reviewed on #478, published as one signed-off commit with an identical tree, because #478 carried commits without a Signed-off-by trailer and the sign-off check judges every commit a branch adds.

What it does

  • One plan and one sync for every agent account (create, change, off, remove, rotate), from one ledger of the accounts the engine owns. Company passes do company-level work only.
  • Engine-owned credentials bound to each agent's tool; credentials handed in from outside Crewlet stay exclusive variables the engine never writes. A seat credential shared with a company setting or another seat is refused.
  • Safety rails: nothing taken from an account the ledger does not record, adopt rather than duplicate, revoke on a failed record, a shared company credential holds every retiring step until replaced, and an administration raise needs a person at a fresh step-up (failing closed when a vendor cannot be read).
  • Routes under /setup/integrations/{kind}/access, a Slack install link completed by the engine, the Dashboard Assistant's set_seat_access, operator-managed documents read-only.
  • A per-integration migration on first start, gated so an unmigrated kind is never read as all off; existing accounts keep their observed role.
  • Retires the company-wide Datadog role, GitLab access levels and token scopes, GitHub tiers, Mattermost's singular channel, and the crewlet gitlab|mattermost|slack provision seat paths.
  • Dashboard on uilet 0.79.0 (DataTable, SelectionBar).

Review
Three independent reviews (engine core, vendors, dashboard and operator) and a re-review; every blocker and major they raised is fixed with a test. main (#475, #142 and the rest) is merged in.

Companion
crewlet/crewlet-operator#51 renders the per-seat schema; it merges after this.

…ciler

Every integration's Agents tab, and each agent's own Access tab, now turns an
agent on or off at a vendor and sets its access in that vendor's own terms:
Datadog roles, GitHub App permissions, GitLab roles, Jira project roles,
Confluence space roles or permissions, Slack's app, Mattermost role sets. The
reconciler applies the setting at the vendor and keeps it there.

- One seat path: each vendor's company pass does company-level work only, and
  every agent account is created, changed, turned off, removed or rotated by
  one plan and one sync (internal/seataccess), from one ledger of the accounts
  the engine owns on the fleet's coordination store. Off disables and keeps an
  account; Remove is a separate, confirmed action. Access changed by hand at a
  vendor is restored and reported; an account a person turned off is never
  turned back on unasked.
- Engine-owned credentials: a seat's credential lives under a name the engine
  derives, sealed only by the engine, and bound to the agent's tool by the
  server's seat_credentials or a recognised default. A credential handed in
  from outside Crewlet stays an exclusive ${VAR} the engine never writes. The
  document refuses a seat credential shared with a company setting or another
  seat, which is the shape of the Datadog key incident.
- Safety: nothing is taken from an account the ledger does not record; an
  existing account is adopted, never duplicated; a credential that fails to
  record is revoked; a company credential that may hold an agent's value holds
  every retiring step until it is replaced; a raise to an administration grant,
  including one an integration starting to be provisioned would make, needs a
  person present at a fresh step-up, and fails closed when a vendor's levels
  cannot be read.
- API: GET, plan, PUT and seat actions under /setup/integrations/{kind}/access,
  a Slack install link minted on request and completed by the engine, the
  Dashboard Assistant's set_seat_access tool, and operator-managed documents
  answered read-only.
- Migration: on first start each integration moves onto per-seat access in one
  revision, gated per kind so an unmigrated kind is never read as all off;
  existing accounts keep their observed role and are recorded in the ledger.
- Retired: the company-wide Datadog role, GitLab access levels and token
  scopes, the GitHub access tiers, Mattermost's singular channel, and the
  crewlet gitlab, mattermost and slack provision seat paths.
- Dashboard: the Agents tab on uilet 0.79.0's DataTable and SelectionBar, the
  agent page's Access tab, and the integration pane's Check now in the tab
  row.

Signed-off-by: pinotelio <ahmadreza.mollapour@gmail.com>
@pinotelio

Copy link
Copy Markdown
Contributor Author

Duplicate of #478, whose branch now carries the same signed-off commit.

@pinotelio pinotelio closed this Oct 30, 2026
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.

1 participant