Skip to content

feat(connections): a client names the scopes it may ask, and a way takes the one covering its scope - #289

Merged
rami-hatoum merged 2 commits into
mainfrom
feat/a-client-names-the-scopes-it-may-ask
Oct 22, 2026
Merged

rami-hatoum merged 2 commits into
mainfrom
feat/a-client-names-the-scopes-it-may-ask

Conversation

@rami-hatoum

Copy link
Copy Markdown
Contributor

What this changes

A client names the scopes it may ask. A registered client under registered_clients may list scopes, the scopes it may ask at its issuers. A way is served by the first client at its issuer whose scopes cover the way's scope, every scope the way asks being one the client names; a client that names none covers every way, so nothing changes for a vendor with one client. Where several clients serve one issuer, each names its scopes, and a configuration with two clients at one issuer of which one names none is refused at that client's scopes, since the one naming none would serve every way the clients before it leave and a client after it never. An empty list is refused too: a client that may ask any scope leaves scopes out.

Auto's clients follow the same rule. The consent service lists each of its clients with the scopes it names, and a way takes Auto's client by coverage; a listed client without scopes covers every way, as before.

A connection renews with the client that got its tokens. A renewal or a revocation of a registered connection finds the client the connection names, by its id at its issuer, not the first at the issuer; a client no longer configured fails the call as a client gone, as before.

The self-host page registers a Google client per verification tier. Google verifies a project at the tier of its most demanding scope, and two scopes the five Workspace servers require are restricted, so their project goes through the restricted review with a yearly security assessment while the eight API providers' scopes are sensitive and need the justifications and the video alone. The page's table names each provider's tier; the steps say one project per tier an operator offers, both or one, with the scopes of that tier on its consent screen and one client per project; the registered_clients example shows the two clients with their scopes. The configuration page documents scopes and the two refusals.

Tests

  • Two registered clients at one issuer with different scopes: a way covered by the second takes the second, a way neither covers is set up first, a way both cover takes the first; a client naming no scopes serves every way; the refusal of two clients at one issuer where one names none, at its path, in either order; an empty scopes refused.
  • The service's listing with and without scopes, and a way taken from Auto's client by coverage; a listing whose scope is empty is unanswered.
  • A renewal and a revocation of a registered connection with the client its id names while another client stands first at the issuer.
  • The page's example read through the configuration gives two clients of nine scopes each, and the shipped entries take the first for the eight API providers and the second for the five Workspace servers.

Checklist

  • The PR title is a conventional commit with a workspace scope, such as feat(reasoning): .... It becomes the squash commit and the changelog entry.
  • pnpm check passes locally, with every file at 100% coverage.
  • I've signed the Contributor License Agreement (the CLA bot asks on your first PR).

rami-hatoum and others added 2 commits October 22, 2026 12:29
…kes the one covering its scope

A vendor that verifies a project at the tier of its most demanding scope holds every scope of the
project behind the review of that tier, so one issuer may need a client for each tier. The consent
client found a registered client, and a client of Auto's consent service, by the issuer alone, and
the reading of registered_clients refused a second client at an issuer.

A client names scopes, the scopes it may ask at its issuers, and a way takes the first client at
its issuer whose scopes hold every scope the way asks, its scope split on spaces and compared as
written; a client that names none covers every way, so a vendor with one client is served as
before. registeredClientFor and serviceClientFor take the way, whose WayOfClients carries its
scope, in place of registeredClientAt and serviceClientAt; the sources a way has, the start, the
listing of the providers and an addition all judge with it. A way no client covers is set up
first, in the words a way without a client has.

registered_clients takes scopes, at least one and none empty. Clients that name one issuer, a
trailing slash aside, each name their scopes: one that names none is refused at its scopes, since
it would serve every way there that no client before it covers, and a client after it never.

Auto's consent service lists a client's scopes where it names them. ServiceClient is the type of
ServiceClientSchema, which reads the listing, in place of an interface beside a second shape of
the same fields.

A finish, a renewal and a revocation of a registered connection take the client registered at
the issuer under the client id the connection recorded, registeredClientNamed, and not the first
client at the issuer, which would fail a connection made with a later one as client_gone. A
connection of auto sends the service what it sent.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…tered per verification tier

The configuration reference gives scopes on registered_clients with the rule a way takes its
client by: the first client at its issuer whose scopes hold every scope the way asks, one that
names none covering every way, and each client naming its scopes where several serve one issuer.
It lists the two refusals of the reading among the checks at start.

The page on connections names scopes among the fields of a registered client, and each mention
of a client at an issuer, a registered one or one of Auto's, says it covers the way's scope. The
table of the Google providers gives Google's tier of each: sensitive for the eight APIs and
restricted for the five Workspace servers, whose scopes Google's own pages fix. The steps make one
project for each tier an operator offers, both or one, with the scopes of that tier on its
consent screen and one client in it, and the example lists two clients at
https://accounts.google.com, each with the scopes of its tier; read through the setting, each of
the eight APIs takes the first and each of the five servers the second. The verification step
asks the brand, the justifications and the video of both tiers, and the yearly security
assessment of the restricted one alone, so a finding on one never touches the other. At a vendor
that verifies in tiers, Auto has a client for each tier, which its consent service lists with the
scopes it covers.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@rami-hatoum
rami-hatoum merged commit e05a127 into main Oct 22, 2026
20 checks passed
@rami-hatoum
rami-hatoum deleted the feat/a-client-names-the-scopes-it-may-ask branch October 22, 2026 11:46
rami-hatoum pushed a commit that referenced this pull request Oct 22, 2026
🤖 I have created a release *beep* *boop*
---


##
[0.17.0](v0.16.0...v0.17.0)
(2026-10-22)


### Features

* **api:** the instructions and the playbook tools claim a request for a
playbook ([#288](#288))
([e4e6f86](e4e6f86))
* **connections:** a client names the scopes it may ask, and a way takes
the one covering its scope
([#289](#289))
([e05a127](e05a127))
* **connections:** a connect link names what its page cannot know, and
the agent shows it as a link
([#290](#290))
([8d1de91](8d1de91))
* **definitions:** the overview is its author's markdown, and a read
names what uses a definition
([#287](#287))
([7c1c637](7c1c637))
* **ledger:** a layout number, written at creation and checked at open,
replaces the shape checks
([#281](#281))
([a48be0e](a48be0e))


### Bug Fixes

* **operations:** a version 7 uuid made in the same millisecond as the
last sorts after it
([#285](#285))
([846a36d](846a36d))
* **prediction:** a model loads with the telemetry of onnxruntime off,
so its process leaves nothing
([#283](#283))
([ea1a6d8](ea1a6d8))
* **server:** the start's waits run on Effect's clock and the restart
mark names its port
([#282](#282))
([db6c858](db6c858))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: beonautobot[bot] <298957281+beonautobot[bot]@users.noreply.github.com>
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