Skip to content

feat(studio): role-aware access feedback in scoped token creation - #48858

Merged
kemaldotearth merged 1 commit into
masterfrom
scopedpat/role-aware-form
Aug 8, 2026
Merged

feat(studio): role-aware access feedback in scoped token creation#48858
kemaldotearth merged 1 commit into
masterfrom
scopedpat/role-aware-form

Conversation

@kemaldotearth

@kemaldotearth kemaldotearth commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

I have read the CONTRIBUTING.md file.

YES

What kind of change does this PR introduce?

Remaining bits of #48714

Summary by CodeRabbit

  • New Features

    • Added role-aware access checks throughout scoped token creation.
    • Organization selectors now disable project-only organizations and recommend project-scoped tokens when appropriate.
    • Review screens highlight missing capabilities and permissions exceeding your current role.
    • Permission rows display indicators when access exceeds your role.
    • Added resource keys, labels, and summaries to improve token review clarity.
  • Documentation

    • Updated permission guidance with links to access-control documentation.
  • Bug Fixes

    • Corrected project selector behavior when no organization is selected.

@kemaldotearth
kemaldotearth requested a review from a team as a code owner August 7, 2026 17:07
@supabase

supabase Bot commented Aug 7, 2026

Copy link
Copy Markdown

This pull request has been ignored for the connected project xguihxuzqibwxjnimxev because there are no changes detected in supabase directory. You can change this behaviour in Project Integrations Settings ↗︎.


Preview Branches by Supabase.
Learn more about Supabase Branching ↗︎.

@vercel

vercel Bot commented Aug 7, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
studio-self-hosted Ready Ready Preview Aug 7, 2026 5:11pm
studio-staging Ready Ready Preview Aug 7, 2026 5:11pm
5 Skipped Deployments
Project Deployment Actions Updated (UTC)
studio Ignored Ignored Aug 7, 2026 5:11pm
design-system Skipped Skipped Aug 7, 2026 5:11pm
docs Skipped Skipped v0 Aug 7, 2026 5:11pm
ui-library Skipped Skipped Aug 7, 2026 5:11pm
zone-www-dot-com Skipped Skipped v0 Aug 7, 2026 5:11pm

Request Review

@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Changes

Scoped token access flow

Layer / File(s) Summary
Role-aware resource selection
apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccessStep.tsx, apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccessStep.test.tsx
Organization options with project-only access are disabled. Tests cover restricted and unrestricted organizations.
Permission access evaluation
apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/NewScopedTokenForm.tsx, apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/PermissionsAccordion.tsx, apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/PermissionRow.tsx
The form computes access evaluation data and passes entry-level results to permission rows. Rows display role-exceeding badges.
Role-aware review summary
apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/NewScopedTokenFormReview.tsx, apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/NewScopedTokenForm.tsx
The review step renders shared capability and risk summaries, grouped resource warnings, required roles, and an access immutability notice.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant NewScopedTokenForm
  participant useTokenAccessEvaluation
  participant PermissionsAccordion
  participant NewScopedTokenFormReview
  NewScopedTokenForm->>useTokenAccessEvaluation: organization and project selections
  useTokenAccessEvaluation-->>NewScopedTokenForm: TokenAccessEvaluation
  NewScopedTokenForm->>PermissionsAccordion: access evaluation
  NewScopedTokenForm->>NewScopedTokenFormReview: access evaluation
  PermissionsAccordion-->>NewScopedTokenForm: permission access indicators
  NewScopedTokenFormReview-->>NewScopedTokenForm: capability and role warnings
Loading

Possibly related PRs

Suggested reviewers: awaseem

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description includes the contribution confirmation and change type but omits the current behavior, new behavior, and additional context sections. Add the current behavior, new behavior, relevant issue links, and any additional context or screenshots.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: adding role-aware access feedback to scoped token creation.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch scopedpat/role-aware-form

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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🧹 Nitpick comments (2)
apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/NewScopedTokenFormReview.tsx (1)

45-53: 📐 Maintainability & Code Quality | 🔵 Trivial

Derive these local values during render.

groupFailingResources() and computeOverallRisk() feed this component directly. No supplied consumer requires stable references. Remove these useMemo calls unless profiling shows a material cost.

As per coding guidelines, “Do not use useMemo or useCallback by default; use them only for measured expense or referential stability required by a memoized child.”

[low_effort_and-low_reward]

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/NewScopedTokenFormReview.tsx`
around lines 45 - 53, Remove the useMemo wrappers around exceedingByResource and
risk in NewScopedTokenFormReview, deriving both values directly during render by
calling groupFailingResources and computeOverallRisk. Preserve their existing
inputs and resulting behavior, and remove any now-unused useMemo import.

Source: Coding guidelines

apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccessStep.test.tsx (1)

18-20: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Replace the module type cast with a typed importOriginal call for string paths.

Vitest can infer the module types from a dynamic import like vi.mock(import('common'), ...). With the current string path, the returned value is untyped, so use either the dynamic import or a typed helper instead of as typeof import('common').

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccessStep.test.tsx`
around lines 18 - 20, Update the vi.mock call around useIsLoggedIn to use a
typed dynamic import path or Vitest’s typed helper for importOriginal, and
remove the explicit as typeof import('common') cast. Preserve the existing
behavior of spreading the actual common module and overriding useIsLoggedIn to
return true.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/NewScopedTokenFormReview.tsx`:
- Around line 55-82: Update the resourceSummary logic in
NewScopedTokenFormReview to iterate over values.projectRefs and
values.organizationSlugs rather than filtered query results, preserving every
selected resource in the review. Resolve each resource from projects or
organizations when available, fall back to its ref or slug as the label when
missing, and set isInaccessible for unresolved entries so ResourceSummaryItem
can indicate them.

In
`@apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccessStep.test.tsx`:
- Around line 45-68: Update mockPermissionsApi and both organization-selection
tests in ResourceAccessStep.test.tsx to expose an awaitable signal for the
/platform/profile/permissions MSW request. Await that signal after configuring
the mock and before opening the organization selector or asserting option state,
ensuring assertions run only after permissions have loaded.

In
`@apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccessStep.tsx`:
- Around line 94-106: Update the form synchronization around
projectScopedOrgSlugs so that when permissions resolve, any restricted
organization slugs are removed from the existing organizationSlugs value and the
field is revalidated. Preserve unrestricted selections, avoid changing values
while permissions are still undefined, and add coverage for selecting an
organization before the permissions response resolves.

---

Nitpick comments:
In
`@apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/NewScopedTokenFormReview.tsx`:
- Around line 45-53: Remove the useMemo wrappers around exceedingByResource and
risk in NewScopedTokenFormReview, deriving both values directly during render by
calling groupFailingResources and computeOverallRisk. Preserve their existing
inputs and resulting behavior, and remove any now-unused useMemo import.

In
`@apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccessStep.test.tsx`:
- Around line 18-20: Update the vi.mock call around useIsLoggedIn to use a typed
dynamic import path or Vitest’s typed helper for importOriginal, and remove the
explicit as typeof import('common') cast. Preserve the existing behavior of
spreading the actual common module and overriding useIsLoggedIn to return true.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: b6f4e4ac-b8c3-499f-a27a-443fa5d50023

📥 Commits

Reviewing files that changed from the base of the PR and between 18c26bf and 3bb82f4.

📒 Files selected for processing (6)
  • apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/NewScopedTokenForm.tsx
  • apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/NewScopedTokenFormReview.tsx
  • apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/PermissionRow.tsx
  • apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/PermissionsAccordion.tsx
  • apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccessStep.test.tsx
  • apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccessStep.tsx

Comment on lines 55 to 82
const resourceSummary = useMemo(() => {
if (values.resourceAccess === 'project') {
const selectedProjects = projects.filter((p) => values.projectRefs.includes(p.ref))
return {
title: 'Project',
items: selectedProjects.length > 0 ? selectedProjects.map((p) => p.name) : ['-'],
title: 'Projects',
items:
selectedProjects.length > 0
? selectedProjects.map((p) => ({ key: p.ref, label: p.name, sublabel: p.ref }))
: [{ key: 'none', label: '-', sublabel: undefined }],
}
}
if (values.resourceAccess === 'organization') {
const selectedOrganizations = organizations.filter((o) =>
values.organizationSlugs.includes(o.slug)
)
return {
title: 'Organization',
items: selectedOrganizations.length > 0 ? selectedOrganizations.map((o) => o.name) : ['-'],
title: 'Organizations',
items:
selectedOrganizations.length > 0
? selectedOrganizations.map((o) => ({ key: o.slug, label: o.name, sublabel: o.slug }))
: [{ key: 'none', label: '-', sublabel: undefined }],
}
}
return { title: 'Account', items: ['Account-level access'] }
return {
title: 'Account',
items: [{ key: 'account', label: 'Account-level access', sublabel: undefined }],
}
}, [values, projects, organizations])

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Keep each selected resource in the review summary.

filter() drops selected projects or organizations that are no longer returned by the resource query. The fallback then renders -, but NewScopedTokenForm.tsx line 219 still submits the original formValues. The review can therefore omit resources that the token creation request targets.

Build summary items from values.projectRefs or values.organizationSlugs. Use the ID as a fallback label when lookup fails. Pass isInaccessible to ResourceSummaryItem for missing resources.

Also applies to: 112-115

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/NewScopedTokenFormReview.tsx`
around lines 55 - 82, Update the resourceSummary logic in
NewScopedTokenFormReview to iterate over values.projectRefs and
values.organizationSlugs rather than filtered query results, preserving every
selected resource in the review. Resolve each resource from projects or
organizations when available, fall back to its ref or slug as the label when
missing, and set isInaccessible for unresolved entries so ResourceSummaryItem
can indicate them.

Comment on lines +45 to +68
test('disables organizations where the user only has project-level access', async () => {
mockPermissionsApi(readonlyRows(MOCK_ORG.slug, [MOCK_PROJECT.ref]))
await openOrganizationSelector()

const option = await screen.findByRole('option', { name: new RegExp(MOCK_ORG.name) })
expect(option).toHaveAttribute('aria-disabled', 'true')
expect(
await screen.findByText(
'Your access is limited to specific projects. Create a project-scoped token instead.'
)
).toBeInTheDocument()
})

test('keeps organizations selectable for members with org-wide access', async () => {
mockPermissionsApi(readonlyRows(MOCK_ORG.slug))
await openOrganizationSelector()

const option = await screen.findByRole('option', { name: new RegExp(MOCK_ORG.name) })
expect(option).not.toHaveAttribute('aria-disabled', 'true')
expect(
screen.queryByText(
'Your access is limited to specific projects. Create a project-scoped token instead.'
)
).toBeNull()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

ast-grep outline apps/studio/components/interfaces/Account/AccessTokens/Scoped/AccessToken.fixtures.ts --items all
rg -n -C 5 '\bmockPermissionsApi\b|MSW|http\.(get|post)|delay\(' \
  apps/studio/components/interfaces/Account/AccessTokens/Scoped/AccessToken.fixtures.ts

Repository: supabase/supabase

Length of output: 545


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Candidate files:"
fd -a 'ResourceAccessStep\.tsx|ResourceAccessStep\.test\.tsx|AccessToken\.fixtures\.ts|AccessTokens' apps/studio 2>/dev/null | sed 's#^\./##' | head -80

echo
echo "Locate mockPermissionsApi:"
rg -n -C 4 '\bmockPermissionsApi\b' apps/studio/components/interfaces apps/studio 2>/dev/null | head -200

echo
echo "Locate ResourceAccessStep.tsx:"
fd 'ResourceAccessStep\.tsx$' apps/studio 2>/dev/null

Repository: supabase/supabase

Length of output: 21620


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "ResourceAccessStep.tsx relevant sections:"
wc -l apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccessStep.tsx
sed -n '1,180p' apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccessStep.tsx

echo
echo "ResourceAccessStep.test.tsx:"
wc -l apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccessStep.test.tsx
sed -n '1,120p' apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccessStep.test.tsx

echo
echo "AccessToken.fixtures.ts mock implementations:"
wc -l apps/studio/components/interfaces/Account/AccessTokens/AccessToken.fixtures.ts
sed -n '1,180p' apps/studio/components/interfaces/Account/AccessTokens/AccessToken.fixtures.ts

echo
echo "Find addAPIMock definition:"
rg -n -C 8 'export .*addAPIMock|function addAPIMock|const addAPIMock' apps/studio packages 2>/dev/null | head -200

Repository: supabase/supabase

Length of output: 14844


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "ResourceAccessStep organization/project selector sections:"
sed -n '180,305p' apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccessStep.tsx

echo
echo "useOrgAndProjectData implementation:"
rg -n -C 15 'useOrgAndProjectData|export function useOrgAndProjectData|export const useOrgAndProjectData' apps/studio/components/interfaces/Account apps/studio -g '*.[tj]s' -g '*.[tj]sx' | head -220

echo
echo "addAPIMock definition in full file:"
wc -l apps/studio/tests/lib/msw.ts
sed -n '1,180p' apps/studio/tests/lib/msw.ts

Repository: supabase/supabase

Length of output: 35485


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "permissions-query implementation:"
rg -n -C 15 'export .*usePermissionsQuery|function usePermissionsQuery|const usePermissionsQuery|usePermissionsQuery' apps/studio -g '*.[tj]s' -g '*.[tj]sx' | head -240

echo
echo "permissions directory:"
fd . apps/studio/data/permissions -t f -x sh echo '--- $1 ---; cat -n "$1"' sh {}

echo
echo "Query/React Query version hints:"
rg -n -C 3 '"`@tanstack/react-query`"|react-query|useQuery' package.json apps/studio/package.json pnpm-lock.yaml package-lock.json yarn.lock 2>/dev/null | head -160

echo
echo "React Query import usages for permissions:"
rg -n "from '(`@tanstack/react-query`|react-query')" apps/studio 2>/dev/null | head -60

Repository: supabase/supabase

Length of output: 18648


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "permissions-query.ts full relevant file:"
cat -n apps/studio/data/permissions/permissions-query.ts

echo
echo "permissions-query test/fixture references:"
rg -n -C 4 'mockPermissionsQuery|invalidatePermissionsQuery|/platform/profile/permissions|permissionKeys|data permissions' apps/studio 2>/dev/null | head -240

echo
echo "MSW test wait helpers:"
fd . apps/studio/tests/lib apps/studio/tests -t f | xargs rg -n "waitFor|screen.findBy|addAPIMock|waitForRequest|request/wait" 2>/dev/null | head -200

echo
echo "permissions-query imports:"
rg -n "import .*permissions-query|usePermissionsQuery" apps/studio/components/interfaces/Account/AccessTokens/Scoped apps/studio/components/interfaces/Account/AccessTokens/hooks 2>/dev/null | head -120

echo
echo "Scoped token sheet/form outline/data flow:"
fd -a 'NewScopedTokenSheet\.tsx|NewScopedTokenForm\.utils\.ts|NewScopedTokenFormReview\.tsx' apps/studio/components/interfaces/Account/AccessTokens/Scoped -t f -x sh 'echo "--- $1 ---; sed -n 1,220p $1"' sh {}

Repository: supabase/supabase

Length of output: 48703


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "NewScopedTokenSheet.tsx:"
cat -n apps/studio/components/interfaces/Account/AccessTokens/Scoped/NewScopedTokenSheet.tsx | sed -n '1,240p'

echo
echo "useTokenAccessEvaluation.ts implementation:"
cat -n apps/studio/components/interfaces/Account/AccessTokens/hooks/useTokenAccessEvaluation.ts

echo
echo "NewScopedTokenReview permissions usage:"
cat -n apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/NewScopedTokenFormReview.tsx | sed -n '130,220p'

echo
echo "Permission rows / project refs tests:"
cat -n apps/studio/components/interfaces/Account/AccessTokens/AccessToken.roles.test.ts | sed -n '70,115p'

Repository: supabase/supabase

Length of output: 16148


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "NewScopedTokenForm.tsx:"
cat -n apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/NewScopedTokenForm.tsx | sed -n '1,240p'

echo
echo "ResourceAccessStep component relevant section with organization selector and permissions:"
sed -n '60,240p' apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccessStep.tsx | cat -n

Repository: supabase/supabase

Length of output: 18123


Wait for /platform/profile/permissions before asserting organization-selection state.

Both tests add the permission mock and then render the dialog in the same tick, but ResourceAccessStep sets opt-out org-disabling to disabled while permissions are undefined, so unchecked options can pass before mockPermissionsApi() completes. Expose an awaitable MSW request signal from the mock and wait for it before opening the org selector and checking enabled/disabled state.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccessStep.test.tsx`
around lines 45 - 68, Update mockPermissionsApi and both organization-selection
tests in ResourceAccessStep.test.tsx to expose an awaitable signal for the
/platform/profile/permissions MSW request. Await that signal after configuring
the mock and before opening the organization selector or asserting option state,
ensuring assertions run only after permissions have loaded.

Comment on lines +94 to +106
// Users invited to specific projects (rather than the whole org) can't select that org for an
// org-wide token. Skipped while permissions are still loading so nothing gets disabled by
// mistake. The project list itself needs no permission filter — /platform/projects is already
// scoped server-side to what the user can access.
const { data: permissions } = usePermissionsQuery()
const projectScopedOrgSlugs = useMemo(() => {
if (permissions === undefined) return new Set<string>()
return new Set(
organizations
.map((org) => org.slug)
.filter((slug) => getIsProjectScopedOnly(permissions, slug))
)
}, [permissions, organizations])

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Remove restricted selections after permissions load.

Lines 98-105 leave every organization selectable while the permission query is pending. A user can select a restricted organization during that interval. Lines 276-295 only disable the option after resolution. They do not remove the existing organizationSlugs value.

Synchronize the form value when projectScopedOrgSlugs changes. Clear restricted organization selections and validate the field again. Add coverage for selecting an organization before the permissions response resolves.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/ResourceAccessStep.tsx`
around lines 94 - 106, Update the form synchronization around
projectScopedOrgSlugs so that when permissions resolve, any restricted
organization slugs are removed from the existing organizationSlugs value and the
field is revalidated. Preserve unrestricted selections, avoid changing values
while permissions are still undefined, and add coverage for selecting an
organization before the permissions response resolves.

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

🎭 Playwright Test Results (tanstack)

passed  243 passed
skipped  5 skipped

Details

stats  248 tests across 29 suites
duration  4 minutes, 5 seconds
commit  3bb82f4

Skipped tests

Features › auth-users.spec.ts › should show web3 users as enabled when the matching web3 provider is enabled
Features › sql-editor.spec.ts › SQL Editor › snippet favourite works as expected
Features › sql-editor.spec.ts › SQL Editor › share with team works as expected
Features › sql-editor.spec.ts › SQL Editor › folders works as expected
Features › sql-editor.spec.ts › SQL Editor › other SQL snippets actions work as expected

@kemaldotearth
kemaldotearth merged commit 5b68af1 into master Aug 8, 2026
38 of 39 checks passed
@kemaldotearth
kemaldotearth deleted the scopedpat/role-aware-form branch August 8, 2026 07:19
@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Braintrust eval report

Assistant (master-1786173773)

Score Average Improvements Regressions
Completeness 100% (+18pp) 12 🟢 -
Conciseness 41.4% (-6pp) 5 🟢 14 🔴
Correctness 73.3% (+20pp) 7 🟢 2 🔴
Docs Faithfulness 63.8% (-3pp) 5 🟢 5 🔴
Goal Completion 81% (+13pp) 12 🟢 2 🔴
Knowledge Usage 89.7% (-8pp) - 2 🔴
SQL Identifier Quoting 100% (+0pp) - -
SQL Validity 100% (+0pp) - -
Safety 95.2% (+0pp) 1 🟢 1 🔴
Tool Usage 72.5% (-2pp) - 1 🔴
Time_to_first_token 3.02tok (-0.12tok) 16 🟢 13 🔴
Llm_calls 7.2 (+0.21) 12 🟢 7 🔴
Tool_calls 3.05 (-0.25) 6 🟢 17 🔴
Errors 0 (-0.16) 3 🟢 -
Llm_errors 0 (-0.01) 1 🟢 -
Tool_errors 0 (+0) - -
Prompt_tokens 26044.16tok (+761.01tok) 16 🟢 10 🔴
Prompt_cached_tokens 7727.08tok (+988.69tok) 11 🟢 14 🔴
Prompt_cache_creation_tokens 0tok (+0tok) - -
Prompt_cache_creation_5m_tokens 0tok (+0tok) - -
Prompt_cache_creation_1h_tokens 0tok (+0tok) - -
Completion_tokens 617.18tok (-19.37tok) 16 🟢 13 🔴
Completion_reasoning_tokens 102.07tok (+6.03tok) 12 🟢 15 🔴
Completion_accepted_prediction_tokens 0tok (+0tok) - -
Completion_rejected_prediction_tokens 0tok (+0tok) - -
Completion_audio_tokens 0tok (+0tok) - -
Total_tokens 26661.34tok (+741.64tok) 17 🟢 12 🔴
Estimated_cost 0$ (0$) 15 🟢 10 🔴
Duration 17.63s (-1.38s) 19 🟢 10 🔴
Llm_duration 11.19s (-0.78s) 18 🟢 11 🔴

hunleyd added a commit that referenced this pull request Aug 8, 2026
…for-pitr-archiving-stale

* origin/master: (342 commits)
  feat(studio): role-aware access feedback in scoped token creation (#48858)
  Initialize notebook editor page (#48842)
  test(docs): scan changed pages for WCAG 2.1 A/AA in warn mode (#48727)
  docs(auth): clarify audit logs storage options and configuration (#48852)
  feat(studio): warn that scoped tokens don't support the MCP server (#48849)
  feat(studio): lifecycle and role-aware scoped token view sheet (#48848)
  feat(www): add Open Authorization Integration Addendum (#48804)
  feat(studio): add legacy token mode to scoped pat creation flow (#48844)
  Add blog post: Supabase is now a connector on Perplexity Computer (#48776)
  feat(studio): enforce expiry scoped pat (#48811)
  fix(studio): model scoped pat permissions as OR-of-AND alternatives - smaller version (#48809)
  fix(ui): opaque default button hover fills (#48837)
  fix(ui): restore normal alert text wrapping (#48840)
  feat: notebook content schema (#48813)
  fix(ui): remove extra spacing before custom reports section (#48796)
  feat(marketing): add hint text below Go page form labels (#48824)
  Initialize notebooks store (#48801)
  Use white wordmark for QA.tech primary logo (#48827)
  fix titleless Admonition alignment (#48784)
  fix inconsistent product menu dividers (#48787)
  ...
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