Skip to content

feat: add seven capabilities the registry was missing - #78

Open
spydon wants to merge 1 commit into
mainfrom
feat/four-missing-capabilities
Open

feat: add seven capabilities the registry was missing#78
spydon wants to merge 1 commit into
mainfrom
feat/four-missing-capabilities

Conversation

@spydon

@spydon spydon commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Adds seven capability ids across three areas, plus two new groups.

These came out of backfilling supabase-flutter's sdk-compliance.yaml against its full public API (supabase-flutter#1673). Reaching 100% coverage meant every public symbol needed a home, which made it obvious which operations the registry has no id for. Each one below is a gap in the registry's own symmetry rather than a Dart-shaped request: in every case a sibling area already has the equivalent capability.

storage.analytics.access_catalog

storage.file_buckets.access_bucket ("Scope subsequent file operations to a specific bucket") and storage.vector_buckets.access_vector_index ("Scope subsequent vector operations to a specific index within a bucket") both exist.

Analytics has seventeen operations across namespaces and tables, and no id for the handle you need before you can call any of them. Worth noting the asymmetry is recent: #74 and #76 filled in the analytics operations without adding the accessor the other two groups have.

auth.passkey.list_passkeys, update_passkey, delete_passkey

auth.passkey_admin.list_passkeys and auth.passkey_admin.delete_passkey already cover an admin enumerating and revoking a user's passkeys. There was nothing for a user managing their own credentials, which is the more common flow of the two, and no id at all for renaming one.

update_passkey is described narrowly (mutable metadata, such as the friendly name) since the credential itself is immutable.

storage.file_buckets.request_cancellation and storage.configuration.auto_retry

database.using_modifiers.request_cancellation and functions.invocation.request_cancellation both exist, as does database.configuration.auto_retry.

Storage was the one area with retry and abort behaviour and no id for either, which is arguably backwards: aborting a multi-megabyte upload is more user-visible than aborting a query. auto_retry needs a new configuration group in the storage area, matching the group of the same name in database.

client.lifecycle.dispose

The client area had four groups and none of them covered lifecycle, so releasing websocket connections, background refresh timers, worker threads and pooled HTTP connections had nowhere to go.

The description is written so that runtimes without deterministic teardown can declare it not_applicable rather than not_implemented, since in a garbage-collected environment with no disposal protocol there is nothing to implement. That is the same treatment functions.invocation.timeout already gets in the Dart compliance file.

What I deliberately left out

Three more gaps surfaced in the same audit that I do not think belong here:

  • Client construction (Supabase.initialize, instance, isInitialized). Every SDK has it, but it is the precondition for the whole matrix rather than a feature within it. Disposal is different: it is a real capability an SDK can lack.
  • Table streams as a database capability (SupabaseQueryBuilder.stream). This one is a genuine inconsistency, but possibly on the Dart side. The registry already carries the modifiers of this capability, since supabase-flutter registers SupabaseStreamFilterBuilder.eq under database.using_filters.eq and SupabaseStreamBuilder.order under database.using_modifiers.order, yet there is no id for the operation those modify. supabase-js has no direct equivalent (you compose a channel with postgres changes by hand), so this may be Dart sugar that should be attributed differently rather than a missing id. Raising it as a question rather than proposing an id.
  • Typed row mapping (withConverter). The Dart idiom for what TypeScript does with generics, so not a cross-SDK capability.

Compliance impact

None of these is breaking. No id is renamed and no existing entry changes, so every SDK's sdk-compliance.yaml keeps validating; the seven new ids simply default to not_implemented until an SDK declares them.

supabase-flutter implements all seven and will declare them in a follow-up, which moves 21 symbols out of its generic top-level supporting_symbols list into the features they actually belong to.

Test plan

  • npm run validate: OK — capability matrix is valid.
  • npm test: 195 passed across 14 files.
  • npm run typecheck: clean.
  • Confirmed against capabilities/*.yaml that none of the seven ids already exists under another name, and that both new groups (storage.configuration, client.lifecycle) are new.

Each of these fills a hole in the registry's own symmetry, found while
backfilling supabase-flutter's compliance file against the full public API.

storage.analytics.access_catalog
  file_buckets and vector_buckets both have an accessor capability
  (access_bucket, access_vector_index). Analytics has seventeen operations
  and no way to name the handle you need before any of them.

auth.passkey.list_passkeys, update_passkey, delete_passkey
  auth.passkey_admin covers listing and deleting another user's passkeys,
  but there was nothing for a user managing their own, which is the more
  common flow.

storage.file_buckets.request_cancellation, storage.configuration.auto_retry
  database and functions both have request_cancellation, and database has
  configuration.auto_retry. Storage is the one area with retry and abort
  behaviour but no id for either, even though aborting a large upload is
  more user-visible than aborting a query.

client.lifecycle.dispose
  The client area had no lifecycle group, so releasing sockets, refresh
  timers and worker threads had nowhere to go. Garbage-collected runtimes
  with no deterministic teardown should declare this not_applicable.
@spydon
spydon requested a review from a team as a code owner August 7, 2026 15:19
@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: a6d7b8df-3c22-4ecb-9e87-6189beed778c

📥 Commits

Reviewing files that changed from the base of the PR and between c73e9fa and 4961855.

📒 Files selected for processing (3)
  • capabilities/auth.yaml
  • capabilities/client.yaml
  • capabilities/storage.yaml

📝 Walkthrough

Summary by CodeRabbit

  • New Features
    • Added user-scoped passkey management for listing, updating metadata, and deleting passkeys without administrator access.
    • Added client lifecycle controls for deterministic cleanup of connections, timers, workers, and pooled HTTP resources.
    • Added storage configuration capabilities for Iceberg catalog access, request cancellation, and automatic retries.

Walkthrough

The change adds capability declarations in three areas. Authentication now supports user-scoped passkey listing, metadata updates, and deletion. Client capabilities now document lifecycle configuration and deterministic resource disposal. Storage capabilities now include Iceberg catalog access, cancellation of in-flight requests, and automatic retry configuration.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Comment thread capabilities/client.yaml
group: observability
- id: client.lifecycle.dispose
name: Client Disposal
description: Deterministically release every resource the client holds, including websocket connections, background refresh timers, worker threads and pooled HTTP connections, so a client can be torn down without leaking them. Runtimes that reclaim these automatically have no equivalent.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm find this difficult to parse and vision how it applies to any given SDK's framework or runtime. I think the sentence on the end is the most confusing piece, as interpretation depends on where in any given stack you're looking at this from... ultimately a process terminating is available on every runtime, and that definitely disposes of all resources at that point! 🤷 ... I'm assuming this has come from a specific concern in Flutter/Dart, however ultimately I think any SDK that's idiomatically following framework conventions should intrinsically be managing disposal/release properly. That is, any SDK should be doing this as a foundational 'basic', surely?

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.

2 participants