Skip to content

POST /datasources/:name/external/validate is the one federation route the #9901 ruling does not name — it stays authentication-only while its four siblings now require a capability #10255

Description

@os-elon

Found while implementing #9901. Filed rather than folded in: the 2026-08-20 maintainer ruling on that card enumerates four routes, and this is the fifth. Deciding it inside that PR would have been an un-ruled route quietly acquiring a capability.

Disclosure posture — inherited

No reproduction here, in any PR body, or in any commit message.#9901 inherited this posture from #9686 / #9391 for this same area, and so does this card. What follows is the source location and the contract question.

What is now true

registerExternalDatasourceRoutes (packages/rest/src/external-datasource-routes.ts) mounts five routes. After #9901 lands, four of them require a capability above the shared anonymous floor and one does not:

routeadmission after #9901
GET /:name/external/tablesauthenticated + manage_platform_settings
POST /:name/external/tables/:remote/draftauthenticated + manage_platform_settings
POST /:name/external/tables/:remote/importauthenticated + manage_metadata
POST /:name/external/refresh-catalogauthenticated + manage_metadata
POST /:name/external/validateauthenticated, and nothing more

The ruling's own words enumerate the read twins (external/tables, external/tables/:remote/draft) and the write pair (external/tables/:remote/import, external/refresh-catalog). validate appears in the #9901 body only obliquely — as the third of "three routes the admin spelling has no twin for, two of which write" — and no part of the ruling assigns it a capability.

Why it was left rather than decided

The two properties that pinned the other four do not reach this one:

That leaves a genuine question rather than an omission, which is why it is a card.

The open question

Should POST /external/validate require a capability, and if so which?

  1. manage_platform_settings, treating it as a read of the same federation surface the two read twins expose. Argues from family coherence: an unentitled caller currently cannot list a datasource's remote tables but can run a validation pass over its federated objects, and a validation report is not nothing — it is a statement about which declared objects still match the remote schema.
  2. Leave it on the authentication floor. Argues that a validity report over objects the caller can already see through normal metadata reads discloses nothing new, and that narrowing published SDK surface (datasources.external.validate on ObjectStackClient, plus the CLI's datasource validate) without a measured need is scope the startup posture does not buy.
  3. Something narrower — e.g. the ADR-0106 D4 read set (studio.access / setup.access), which is what the sibling package-routes.ts requires for its reads rather than manage_platform_settings.

This is published SDK surface, so options 1 and 3 are behaviour changes for existing credentialed callers in exactly the way #9901's read routes were — the same migration question, at a smaller scale.

Where it is currently pinned

packages/rest/src/external-datasource-routes-auth-guard.test.ts — the #9901 PR gives this route its own explicit 'authenticated' kind and a case asserting it is still served to a caller holding nothing, so the current answer is written down rather than incidental. Changing it means changing that case, deliberately.

Backlinks: #9901 (the ruling that named the other four) · #9686 (this family's authentication floor) · #9593 (where the admin twin's capability was measured).

Unassigned and unqueued — for the triage seat to level and route.


Generated by Claude Code

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions