Skip to content

Use stable user IDs across identity boundaries - #1072

Merged
kody-bot merged 7 commits into
mainfrom
cursor/track-identity-stable-id-e721
Jul 30, 2026
Merged

kody-bot merged 7 commits into
mainfrom
cursor/track-identity-stable-id-e721

Conversation

@kentcdodds

@kentcdodds kentcdodds commented Jul 30, 2026 •

Copy link
Copy Markdown
Member

Part of #1069

Summary

  • Version browser, 2FA verification, WebAuthn, package-app session, and handoff credentials around stable_user_id; old signed payloads fail closed and require re-login.
  • Resolve stable IDs to numeric users.id only after boundary validation, preserving integer PK/FK joins without schema changes.
  • Move admin URLs, JSON, MCP inputs/outputs, feature-flag targets, creation results, and audit identity fields to stable IDs. Email and normalized username remain operator-friendly selectors; numeric IDs are rejected.

Validation and deploy

  • Local npm run validate and PR CI passed, including all 19 Playwright tests.
  • Bugbot and CodeRabbit findings were addressed. CodeRabbit's usage-rollup suggestion was not applied because usage_rollups.user_id and entitlement-owned tables are intentionally TEXT stable IDs, not numeric users.id joins.
  • Squash merge: f1079665.
  • Main validation and production deploy passed on 3b84c504, which contains the merge.
  • Production /health reports 3b84c504; a fresh password login completed end-to-end and loaded the authenticated /account page.

Boundary grep evidence

These searches return no matches:

rg 'Numeric app user id|pkgUserId|\buid:\s*|userId:\s*String\(user\.userId\)' packages/worker/src/app -g '*.ts'
rg 'target_user_id=|actor_user_id=|user_id=\$\{[^}]*\.id' packages/worker/src -g '*.ts'
rg '\bid:\s*z\.number\(\)|\buserId:\s*z\.number\(\)|Numeric users\.id' packages/worker/src/mcp/capabilities/admin -g 'admin-{user-*,feature-flag-override}.ts'
rg '\?userId=|/admin/users/\$\{[^}]*\.id|userId:\s*selectedUser\.id|label:\s*\x27User id\x27' packages/worker -g '*.{ts,tsx}'

Remaining numeric userId uses in changed admin handlers are internal D1/RBAC/feature-flag join keys after stable-ID resolution.

System recap — extends existing primitives (medium risk)

Mode: recap · Base: main @ 21f2068e · Head: b94eaefb

Classification: extends — changes identity contracts at session, admin, OAuth, and feature-flag boundaries without adding a primitive or changing the database schema.

Primitives touched

Primitive Group Impact
app-sessions auth extends — versioned payloads now carry stable IDs
app-ui surfaces extends — admin URLs and JSON use stable IDs
mcp-oauth auth extends — browser-session resolution uses stable IDs
rbac auth extends — admin targets resolve stable IDs before internal joins
feature-flags auth extends — admin override boundaries expose stable IDs

System map

Stable identity crosses every credential and admin boundary, then resolves once to the unchanged numeric D1 join key.

Legend: green = composes (wiring only) · amber = extended by this PR · red = new primitive · gray = context (unchanged, included only when an edge crosses it).

flowchart LR
	appSessions["app-sessions<br/>Browser sessions"]:::extended
	appUi["app-ui<br/>Browser app (Remix 3)"]:::extended
	mcpOauth["mcp-oauth<br/>MCP OAuth"]:::extended
	rbac["rbac<br/>Role-based access control"]:::extended
	featureFlags["feature-flags<br/>Feature flags"]:::extended
	d1["D1 users table<br/>unchanged integer joins"]:::untouched
	appSessions -->|"stable_user_id session payload"| appUi
	appSessions -->|"stable identity for authorization"| mcpOauth
	appUi -->|"stable admin targets"| rbac
	rbac -->|"resolve once to users.id"| d1
	featureFlags -->|"stable admin override identity"| rbac
	classDef touched fill:#1a7f37,color:#fff
	classDef extended fill:#9a6700,color:#fff
	classDef added fill:#cf222e,color:#fff
	classDef untouched fill:#57606a,color:#fff
Loading

Invariants

  • Every user-owned read/write remains scoped after stable-to-internal-ID resolution.
  • Existing signed payloads fail closed; there is no compatibility window.
  • users.id remains an internal D1 PK/FK only; no migration is introduced.

Conductor report

Status: done

Verified: local validation, PR CI, main validation, production deploy/health, and a fresh production login all pass. No migrations or sibling-owned files changed.

Scope spill: production login verification created disposable account cursor-identity-login-2031. Cleanup was attempted twice through POST /account/delete, but the account remains because the fail-closed deletion safety checks returned 503; no further retries were made.

Open in Web Open in Cursor 

Summary by CodeRabbit

  • New Features

    • Admin user management now uses stable user identifiers across selection, usage, roles, plans, moderation, and feature-flag overrides (including stable targeting via stable ID, email, or username).
    • Admin UI metadata and URLs now surface stable account identifiers.
  • Security

    • Authentication, two-factor verification, passkeys, and package-app sessions now use versioned stableUserId cookies/tokens.
    • Legacy cookie/session formats are rejected and require a fresh login.
  • Documentation

    • Updated contributor and authentication documentation to clarify safe stable-identifier handling and boundary validation.

@coderabbitai

coderabbitai Bot commented Jul 30, 2026 •

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The PR replaces externally exposed numeric user identifiers with validated stable user IDs across authentication cookies, package-app handoffs, admin routes and APIs, feature flags, loader data, audit reasons, and related tests.

Changes

Stable user identity migration

Layer / File(s) Summary
Identity validation and data contracts
packages/worker/src/user-id.ts, packages/worker/src/app/loader-data.ts, packages/worker/src/admin/users-data.ts
Stable IDs are derived, normalized, validated, and used in admin loader contracts, selection parsing, targeting, mutations, and usage data.
Authentication and package-app flows
packages/worker/src/app/auth-session.ts, packages/worker/src/app/verify-session.ts, packages/worker/src/app/package-app-*.ts, packages/worker/src/app/handlers/auth*.ts, packages/worker/src/app/handlers/webauthn.ts, packages/worker/src/oauth-handlers.ts
Authentication, verification, WebAuthn, OAuth, handoff, and package-app cookies use versioned v2 stable-user-ID payloads and resolve internal rows through stable_user_id.
Admin APIs, MCP capabilities, and feature flags
packages/worker/src/app/handlers/admin-*.ts, packages/worker/src/mcp/capabilities/admin/*, packages/worker/src/feature-flags/*
Admin boundaries accept validated stableUserId, email, or username selectors, return stable identifiers, use internal numeric keys only for joins, and emit stable-ID audit metadata.
UI, documentation, and validation coverage
packages/worker/client/routes/admin-*, docs/contributing/*, e2e/admin-rbac.spec.ts, packages/worker/src/**/*.node.test.ts
Admin URLs, UI state, feature-flag rendering, documentation, fixtures, database mocks, cookie checks, and endpoint assertions are updated for stable-user-ID behavior and fail-closed legacy handling.

Estimated code review effort: 5 (Critical) | ~120 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Browser
  participant Worker
  participant D1
  participant PackageApp
  Browser->>Worker: Send v2 cookie with stableUserId
  Worker->>D1: Resolve users.stable_user_id
  D1-->>Worker: Return account and internal database id
  Worker-->>Browser: Return authenticated response
  PackageApp->>Worker: Consume v2 handoff token
  Worker->>D1: Resolve package-app owner by stableUserId
  D1-->>PackageApp: Return validated owner
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 9.09% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
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.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: replacing boundary-facing identity handling with stable user IDs.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cursor/track-identity-stable-id-e721

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.

@cursor
cursor Bot marked this pull request as ready for review July 30, 2026 19:32

@cursor cursor 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.

Cursor Bugbot has reviewed your changes using default effort and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit fc9cbc6. Configure here.

Comment thread packages/worker/src/app/handlers/admin-users.ts
Comment thread packages/worker/src/admin/users-data.ts Outdated
cursoragent and others added 5 commits July 30, 2026 19:45
Co-authored-by: Kent C. Dodds <me+github@kentcdodds.com>
Co-authored-by: Kent C. Dodds <me+github@kentcdodds.com>
Co-authored-by: Kent C. Dodds <me+github@kentcdodds.com>
Co-authored-by: Kent C. Dodds <me+github@kentcdodds.com>
Co-authored-by: Kent C. Dodds <me+github@kentcdodds.com>
@cursor
cursor Bot force-pushed the cursor/track-identity-stable-id-e721 branch from fc9cbc6 to d248457 Compare July 30, 2026 19:49
@github-actions

github-actions Bot commented Jul 30, 2026 •

Copy link
Copy Markdown
Contributor

🔎 Preview deployed: https://kody-pr-1072.kody-a99.workers.dev

Worker: kody-pr-1072
D1: kody-pr-1072-db
KV: kody-pr-1072-oauth-kv

Mocks:

Co-authored-by: Kent C. Dodds <me+github@kentcdodds.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/worker/src/admin/user-usage-data.ts (1)

85-130: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Keep downstream usage joins keyed by users.id.

The stable ID is correctly validated at this boundary, but loadUserMonthRollups and readEntitlementConsumption receive usageUserId derived from the stable ID rather than row.id. Their internal user_id queries will no longer match the existing numeric joins, producing empty or incorrect usage data. Return the stable ID publicly, but pass row.id to internal usage and entitlement reads.

Proposed direction
- const usageUserId = resolveUserStableId(row)
+ const usageStableUserId = resolveUserStableId(row)
+ const internalUserId = row.id

  loadUserMonthRollups({
-   userId: usageUserId,
+   userId: internalUserId,
  })

  readEntitlementConsumption({
-   usageUserId,
+   usageUserId: internalUserId,
  })

- stableUserId: usageUserId,
+ stableUserId: usageStableUserId,

As per coding guidelines, “every read and write path must be scoped by userId”; use the resolved numeric key for internal reads after validating the stable-ID boundary.

🤖 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 `@packages/worker/src/admin/user-usage-data.ts` around lines 85 - 130, Keep the
public response keyed by the resolved stable ID, but update the internal calls
to loadUserMonthRollups and readEntitlementConsumption to pass row.id as their
userId/usageUserId value. Leave stableUserId validation and the returned
stableUserId unchanged so downstream database queries continue matching
users.id.

Source: Coding guidelines

🧹 Nitpick comments (4)
packages/worker/src/app/handlers/admin-feature-flags.ts (1)

377-382: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Unreachable branch.

At this point hasUsername is true, which means username !== null, so this guard can never fire. Dropping it removes a misleading error path.

🤖 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 `@packages/worker/src/app/handlers/admin-feature-flags.ts` around lines 377 -
382, Remove the unreachable `if (!username)` guard and its invalid response from
the surrounding feature-flag handler, since `hasUsername` already guarantees a
non-null username. Preserve the remaining username-based processing and error
paths unchanged.
packages/worker/src/app/handlers/admin-users.node.test.ts (1)

46-49: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Duplicated stableUserId fixture helper. Both test files define the identical hex-padding helper while packages/worker/src/test-support/stable-user-id.ts already exists for stable-id test utilities.

  • packages/worker/src/app/handlers/admin-users.node.test.ts#L46-L49: move the helper into packages/worker/src/test-support/stable-user-id.ts and import it.
  • packages/worker/src/app/handlers/admin-feature-flags.node.test.ts#L48-L53: import the shared helper instead of redefining it.
🤖 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 `@packages/worker/src/app/handlers/admin-users.node.test.ts` around lines 46 -
49, The stableUserId helper is duplicated across both admin handler test files.
Move or consolidate the implementation into
packages/worker/src/test-support/stable-user-id.ts, export it there, and update
stableUserId usage in packages/worker/src/app/handlers/admin-users.node.test.ts
(lines 46-49) and
packages/worker/src/app/handlers/admin-feature-flags.node.test.ts (lines 48-53)
to import the shared helper and remove their local definitions.
packages/worker/src/admin/users-data.ts (1)

250-269: 🚀 Performance & Scalability | 🔵 Trivial | 💤 Low value

Three queries where two suffice.

loadAdminUserByTarget already resolves the row; re-fetching it via loadAdminUserRowByStableUserId just to obtain id adds a round trip per plan update (and a TOCTOU window). Consider having the target resolution return the row id, or resolving the row once and reusing it.

🤖 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 `@packages/worker/src/admin/users-data.ts` around lines 250 - 269, The
updateAdminUserPlan flow performs redundant target lookups before updating the
plan. Refactor target resolution so it retrieves and retains the matched row’s
id and stableUserId in one query, then use those values for the UPDATE and final
result lookup, removing the separate loadAdminUserRowByStableUserId call while
preserving the null behavior when no target matches.
packages/worker/src/mcp/capabilities/admin/admin-user-get.ts (1)

12-24: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Duplicated "exactly one selector" schema across two admin capabilities. Both files define an identical { stableUserId?, email?, username? } object with a .refine() requiring exactly one field. Extracting a shared schema/refine factory into admin-shared.ts (alongside stableUserIdSchema) would remove the duplication and keep future selector-validation changes in one place.

  • packages/worker/src/mcp/capabilities/admin/admin-user-get.ts#L12-L24: replace the inline object+refine with a shared adminUserTargetSelectorSchema (or similar) imported from admin-shared.ts.
  • packages/worker/src/mcp/capabilities/admin/admin-user-usage.ts#L64-L76: same replacement; merge with its existing usage-specific output fields.
🤖 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 `@packages/worker/src/mcp/capabilities/admin/admin-user-get.ts` around lines 12
- 24, Extract the shared exactly-one-user-selector schema into admin-shared.ts
alongside stableUserIdSchema, preserving the stableUserId, email, username
fields and validation message. In
packages/worker/src/mcp/capabilities/admin/admin-user-get.ts lines 12-24, import
and use the shared selector schema; in
packages/worker/src/mcp/capabilities/admin/admin-user-usage.ts lines 64-76,
replace the duplicated selector fields/refinement while retaining and merging
its usage-specific output fields.
🤖 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 `@packages/worker/src/admin/users-data.ts`:
- Around line 196-240: Update loadAdminUserByTarget to reject an explicitly
supplied stableUserId when isStableUserId returns false, rather than falling
through to the email or username selectors. Preserve the existing stable-ID,
email, username, and not-found lookup behavior for valid or absent stableUserId
values, using the function’s established error mechanism for the invalid-input
result.

In `@packages/worker/src/app/handlers/admin-users.ts`:
- Around line 520-526: Update readStableUserIdField in
packages/worker/src/app/handlers/admin-users.ts (lines 520-526) and the
corresponding stable-user-ID boundary readers in
packages/worker/src/app/handlers/admin-feature-flags.ts (lines 426-429),
packages/worker/src/admin/users-data.ts (lines 95-99), and
packages/worker/src/admin/users-data.ts (lines 206-210) to call
normalizeStableUserId before validation and return the canonical value. Ensure
the normalized ID is used for database bindings and self-account comparisons so
valid non-canonical input resolves correctly.

In `@packages/worker/src/mcp/capabilities/admin/feature-flag-shared.ts`:
- Around line 84-97: Update the username resolution branch in the input lookup
to normalize the supplied username with trimming and lowercasing before querying
users.username, matching the normalization used during admin user creation.
Preserve the empty-input validation, lookup, and returned dbUserId/stableUserId
behavior.

---

Outside diff comments:
In `@packages/worker/src/admin/user-usage-data.ts`:
- Around line 85-130: Keep the public response keyed by the resolved stable ID,
but update the internal calls to loadUserMonthRollups and
readEntitlementConsumption to pass row.id as their userId/usageUserId value.
Leave stableUserId validation and the returned stableUserId unchanged so
downstream database queries continue matching users.id.

---

Nitpick comments:
In `@packages/worker/src/admin/users-data.ts`:
- Around line 250-269: The updateAdminUserPlan flow performs redundant target
lookups before updating the plan. Refactor target resolution so it retrieves and
retains the matched row’s id and stableUserId in one query, then use those
values for the UPDATE and final result lookup, removing the separate
loadAdminUserRowByStableUserId call while preserving the null behavior when no
target matches.

In `@packages/worker/src/app/handlers/admin-feature-flags.ts`:
- Around line 377-382: Remove the unreachable `if (!username)` guard and its
invalid response from the surrounding feature-flag handler, since `hasUsername`
already guarantees a non-null username. Preserve the remaining username-based
processing and error paths unchanged.

In `@packages/worker/src/app/handlers/admin-users.node.test.ts`:
- Around line 46-49: The stableUserId helper is duplicated across both admin
handler test files. Move or consolidate the implementation into
packages/worker/src/test-support/stable-user-id.ts, export it there, and update
stableUserId usage in packages/worker/src/app/handlers/admin-users.node.test.ts
(lines 46-49) and
packages/worker/src/app/handlers/admin-feature-flags.node.test.ts (lines 48-53)
to import the shared helper and remove their local definitions.

In `@packages/worker/src/mcp/capabilities/admin/admin-user-get.ts`:
- Around line 12-24: Extract the shared exactly-one-user-selector schema into
admin-shared.ts alongside stableUserIdSchema, preserving the stableUserId,
email, username fields and validation message. In
packages/worker/src/mcp/capabilities/admin/admin-user-get.ts lines 12-24, import
and use the shared selector schema; in
packages/worker/src/mcp/capabilities/admin/admin-user-usage.ts lines 64-76,
replace the duplicated selector fields/refinement while retaining and merging
its usage-specific output fields.
🪄 Autofix (Beta)

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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: db031b6d-7c68-4d9e-8836-9c4b6b8c8e37

📥 Commits

Reviewing files that changed from the base of the PR and between 5be54d3 and e755f23.

📒 Files selected for processing (67)
  • docs/contributing/adding-capabilities.md
  • docs/contributing/architecture/authentication.md
  • e2e/admin-rbac.spec.ts
  • packages/worker/client/routes/admin-feature-flags.tsx
  • packages/worker/client/routes/admin-invites.tsx
  • packages/worker/client/routes/admin-users.tsx
  • packages/worker/src/admin/user-usage-data.node.test.ts
  • packages/worker/src/admin/user-usage-data.ts
  • packages/worker/src/admin/users-data.ts
  • packages/worker/src/app/admin-invites-data.ts
  • packages/worker/src/app/auth-redirect.node.test.ts
  • packages/worker/src/app/auth-session.node.test.ts
  • packages/worker/src/app/auth-session.ts
  • packages/worker/src/app/authenticated-user.node.test.ts
  • packages/worker/src/app/email-change.ts
  • packages/worker/src/app/handlers/account-billing.ts
  • packages/worker/src/app/handlers/account-email-change.node.test.ts
  • packages/worker/src/app/handlers/account-profile.node.test.ts
  • packages/worker/src/app/handlers/account-resend-verification.node.test.ts
  • packages/worker/src/app/handlers/account.node.test.ts
  • packages/worker/src/app/handlers/admin-feature-flags.node.test.ts
  • packages/worker/src/app/handlers/admin-feature-flags.ts
  • packages/worker/src/app/handlers/admin-invites.ts
  • packages/worker/src/app/handlers/admin-users.node.test.ts
  • packages/worker/src/app/handlers/admin-users.ts
  • packages/worker/src/app/handlers/auth-handler.node.test.ts
  • packages/worker/src/app/handlers/auth-page.node.test.ts
  • packages/worker/src/app/handlers/auth-provider.node.test.ts
  • packages/worker/src/app/handlers/auth-provider.ts
  • packages/worker/src/app/handlers/auth.ts
  • packages/worker/src/app/handlers/passkeys.node.test.ts
  • packages/worker/src/app/handlers/pending-verification.node.test.ts
  • packages/worker/src/app/handlers/session-handler.node.test.ts
  • packages/worker/src/app/handlers/two-factor.node.test.ts
  • packages/worker/src/app/handlers/verify-email-change.ts
  • packages/worker/src/app/handlers/verify.ts
  • packages/worker/src/app/handlers/webauthn.ts
  • packages/worker/src/app/loader-data.ts
  • packages/worker/src/app/package-app-handoff.node.test.ts
  • packages/worker/src/app/package-app-handoff.ts
  • packages/worker/src/app/package-app-origin.ts
  • packages/worker/src/app/package-app-origin.workers.test.ts
  • packages/worker/src/app/package-app-owner.ts
  • packages/worker/src/app/package-app-session.ts
  • packages/worker/src/app/permissions-server.node.test.ts
  • packages/worker/src/app/request-auth-cache.ts
  • packages/worker/src/app/routes.ts
  • packages/worker/src/app/ssr-render.node.test.ts
  • packages/worker/src/app/verify-session.ts
  • packages/worker/src/app/webauthn.ts
  • packages/worker/src/feature-flags/service.node.test.ts
  • packages/worker/src/feature-flags/service.ts
  • packages/worker/src/feature-flags/types.ts
  • packages/worker/src/identity/admin-user-creation.ts
  • packages/worker/src/mcp/capabilities/admin/admin-capabilities.node.test.ts
  • packages/worker/src/mcp/capabilities/admin/admin-feature-flag-capabilities.node.test.ts
  • packages/worker/src/mcp/capabilities/admin/admin-feature-flag-override.ts
  • packages/worker/src/mcp/capabilities/admin/admin-platform-account-create.ts
  • packages/worker/src/mcp/capabilities/admin/admin-shared.ts
  • packages/worker/src/mcp/capabilities/admin/admin-user-create.ts
  • packages/worker/src/mcp/capabilities/admin/admin-user-get.ts
  • packages/worker/src/mcp/capabilities/admin/admin-user-update.ts
  • packages/worker/src/mcp/capabilities/admin/admin-user-usage.ts
  • packages/worker/src/mcp/capabilities/admin/feature-flag-shared.ts
  • packages/worker/src/oauth-handlers.ts
  • packages/worker/src/oauth-handlers.workers.test.ts
  • packages/worker/src/user-id.ts

Comment thread packages/worker/src/admin/users-data.ts Outdated
Comment thread packages/worker/src/app/handlers/admin-users.ts
Comment thread packages/worker/src/mcp/capabilities/admin/feature-flag-shared.ts
Co-authored-by: Kent C. Dodds <me+github@kentcdodds.com>
@kody-bot
kody-bot merged commit f107966 into main Jul 30, 2026
10 checks passed
@kody-bot
kody-bot deleted the cursor/track-identity-stable-id-e721 branch July 30, 2026 20:19
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.

3 participants