Skip to content

Restructure purchasable tiers: Standard ($5) and Pro ($20), persistent-service counts - #1242

Merged
kody-bot merged 9 commits into
mainfrom
cursor/tier-restructure-22b0
Aug 5, 2026
Merged

kody-bot merged 9 commits into
mainfrom
cursor/tier-restructure-22b0

Conversation

@kentcdodds

@kentcdodds kentcdodds commented Aug 5, 2026 •

Copy link
Copy Markdown
Member

What

Approved product restructure of the plan tiers:

  • Renames: pro → standard (same $5/month price and mostly unchanged limits), partner → pro (new $20/month purchasable tier). free and operator-only max remain. Rank order: free < standard < pro < max.
  • New limits (usage-derived; heavy-user Pro sized at ~2× the operator's measured usage): Pro gets 150 scheduled jobs, 10,000 execute calls/day, 40,000 outbound fetches/day, 5 GiB storage, 400 repo sessions, 200 secrets/packages, 100 concurrent workflows. Free secrets raised 15 → 25 (a real user sits at exactly 15).
  • Persistent package services become a per-plan count (free 0, standard 1, pro 3, max 10) instead of a 0/1 gate. Persistent services have no duration cap (executorTimeoutMs: null), so the concurrent count is the cost/margin control. Enforcement at service_start counts running persistent-mode services.
  • D1 migration 0002-restructure-plan-tiers.sql: fail-closed assertions on unknown stored values, single-pass CASE rename (cannot double-apply) across users.plan, users.stripe_plan, and invites.plan, CHECK-constraint rebuild for the new vocabulary, FK-referencing tables snapshotted/restored, AUTOINCREMENT high-water mark preserved, post-migration assertion that no partner values remain.
  • Stripe/billing: STRIPE_STANDARD_PRICE_ID (the existing $5 price) resolves to standard; new STRIPE_PRO_PRICE_ID resolves to pro at $20/month. Legacy subscription metadata (kody_plan written before the rename) maps partner→pro and pro→standard; price-id resolution is preferred. Billing degrades gracefully when either env var is unset. Billing UI shows three cards: Free $0, Standard $5/mo, Pro $20/mo.

Deployment steps (operator)

  1. Create the $20/month Pro subscription price in Stripe.
  2. Set STRIPE_PRO_PRICE_ID to the new price id and move the old $5 price id to STRIPE_STANDARD_PRICE_ID in deployment secrets.
  3. Until then, the Pro tier renders but is not purchasable (graceful degradation).

Testing

npm run validate fully green in the implementing environment (1,859 unit/Workers tests + 7 e2e) and re-validated by the conductor after merging latest main (which brought in the usage-visibility and admin-fleet-visibility PRs; one semantic conflict fixed — a new test referenced the retired partner plan name).

System recap — extends existing primitives (high care: users-table migration)

Mode: recap · Base: main · Head: 63e4c748

Classification: extends — changes the plan registry vocabulary and limit contract, rebuilds users/invites CHECK constraints, and extends billing price resolution. No new primitives.

Primitives touched

Primitive Group Impact
entitlements auth extends — plan renames, new limits, persistent-service count resource
billing auth extends — two-price resolution, legacy metadata mapping
d1-app-db storage extends — migration 0002 rebuilds users and invites with new plan CHECKs
app-ui surfaces extends — three-card billing page, plan rank mirror
package-services assistant extends — service_start enforces persistent running count

System map

The plan registry rename flows from the entitlements module through the users-table migration into billing price resolution and the billing UI; service_start picks up the persistent count.

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
	entitlements["entitlements<br/>Plans & entitlements"]:::extended
	d1AppDb["d1-app-db<br/>D1 app database"]:::extended
	billing["billing<br/>Stripe billing"]:::extended
	appUi["app-ui<br/>Browser app"]:::extended
	packageServices["package-services<br/>Package services"]:::extended
	entitlements -->|"migration 0002: rename stored plans + CHECK rebuild"| d1AppDb
	billing -->|"STRIPE_STANDARD_PRICE_ID / STRIPE_PRO_PRICE_ID → standard / pro"| entitlements
	appUi -->|"three planTiers cards + rank mirror"| billing
	packageServices -->|"service_start counts running persistent services"| entitlements
	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

Conductor report

Implemented by the tier-restructure track; PR opened and shepherded by the conductor after the track's environment could not create PRs. Conductor verified all limit values against the approved table, reviewed the migration, merged latest main, and re-ran validate. Status: awaiting CI + CodeRabbit, then squash-merge. Post-deploy: conductor migrates existing manual max grants to standard (keeping the operator and platform accounts).

Open in Web Open in Cursor 

Summary by CodeRabbit

  • New Features

    • Added a Standard plan at $5/month alongside Free and Pro at $20/month.
    • Billing now supports independently configured checkout and pricing for Standard and Pro.
    • Added clearer persistent package-service limits across paid plans.
  • Bug Fixes

    • Improved plan-tier migration and compatibility with existing subscriptions.
    • Prevented persistent-service checks from incorrectly blocking service restarts.
  • Documentation

    • Updated pricing, billing setup, environment configuration, email quotas, workflow limits, and plan details.

@coderabbitai

coderabbitai Bot commented Aug 5, 2026 •

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@cursor[bot], you've reached your PR review limit, so we couldn't start this review.

Next review available in: 45 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: b3bbca6c-0363-4608-b0d7-cc19b1a05240

📥 Commits

Reviewing files that changed from the base of the PR and between 16d409d and 28f481d.

📒 Files selected for processing (5)
  • packages/worker/client/routes/account-usage.tsx
  • packages/worker/src/app/loader-data.ts
  • packages/worker/src/entitlements/resource-visibility.ts
  • packages/worker/src/entitlements/usage-snapshot.ts
  • packages/worker/src/mcp/capabilities/account/usage-get.ts
📝 Walkthrough

Walkthrough

The PR replaces the partner tier with Standard, adds independent Standard and Pro Stripe billing, migrates stored plan values, introduces bounded and persistent package-service modes, and enforces finite persistent-service limits through UserMeter.

Changes

Entitlements, billing, and service limits

Layer / File(s) Summary
Plan contracts and tier migration
packages/worker/src/entitlements/plans.ts, packages/worker/migrations/0002-restructure-plan-tiers.sql, packages/worker/src/entitlements/*test.ts
Plan names, rankings, limits, and legacy Stripe metadata mappings now use Standard and Pro. Migration 0002 rebuilds constrained tables, maps stored tiers, preserves dependent data, and fails closed for unknown values.
Plan-specific billing and checkout
packages/worker/src/billing/*, packages/worker/src/app/*billing*, packages/worker/client/routes/account-billing.tsx, packages/worker/src/env-schema.ts
Billing supports separate Standard and Pro price IDs. Account data exposes purchasablePlans. Checkout validates the selected paid plan and resolves its configured price.
UserMeter package-service modes
packages/worker/src/entitlements/user-meter-do.ts, packages/worker/src/package-runtime/package-service.ts, packages/worker/src/test-support/user-meter.ts, packages/worker/src/entitlements/user-meter.workers.test.ts
UserMeter schema version 9 stores bounded or persistent modes, filters running counts by mode, migrates legacy rows as persistent, and propagates mode through projections and RPCs.
Persistent-service entitlement enforcement
packages/worker/src/entitlements/service.ts, packages/worker/src/mcp/capabilities/services/service-start.ts, packages/worker/src/mcp/capabilities/services/service-start.node.test.ts
Persistent-service usage now comes from UserMeter. Service restart checks count persistent services and exclude the current service. Tests cover Standard limits and entitlement errors.
Plan presentation and documentation
packages/worker/client/routes/pricing.tsx, docs/contributing/architecture/*, docs/contributing/*, docs/use/*, packages/worker/src/og/pages.ts, packages/worker/src/blog/posts/zero-inference-calls.md
Pricing and documentation describe Free, Standard, and Pro plans, updated limits, separate Stripe configuration, and the new checkout payload.
Migration bookkeeping validation
tools/migration-ledger.json, tools/ci/reset-migration-bookkeeping.ts, tools/ci/reset-migration-bookkeeping.node.test.ts
The migration ledger records migration 0002. Bookkeeping accepts valid post-squash migration sets and rejects frozen pre-squash mixtures.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant AccountBillingPage
  participant accountBilling
  participant billingConfig
  participant Stripe
  AccountBillingPage->>accountBilling: Submit selected standard or pro plan
  accountBilling->>billingConfig: Resolve plan price ID
  billingConfig->>Stripe: Create checkout session
  Stripe-->>AccountBillingPage: Return checkout session
Loading

Possibly related PRs

  • kentcdodds/kody#1115: Uses the same UserMeter and entitlement paths for package-service limits.
  • kentcdodds/kody#1148: Also changes package-service counting in entitlement and service-start code.
  • kentcdodds/kody#1228: Modifies migration bookkeeping classification for squashed and post-squash migrations.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 25.71% 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
Title check ✅ Passed The title clearly summarizes the plan-tier restructuring and persistent-service count changes.
Description check ✅ Passed The description explains the intent, changes, deployment steps, testing, and system impact in sufficient detail.
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 💡 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/tier-restructure-22b0

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.

@kody-bot
kody-bot marked this pull request as ready for review August 5, 2026 17:42
@github-actions

github-actions Bot commented Aug 5, 2026 •

Copy link
Copy Markdown
Contributor

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

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

Mocks:

@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: 2

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/test-support/user-meter.ts (1)

363-375: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Validate mode inputs in the in-memory UserMeter.

When input.mode is an unsupported string, this test double stores persistent at Line 374. Production UserMeter rejects that input. At Line 491, an unsupported filter returns zero instead of rejecting the request.

Tests can pass for calls that fail in production. Reject unsupported non-undefined modes in both RPC methods. Keep the persistent default only when callers omit mode.

Proposed fix
+		function normalizePackageServiceMode(
+			mode: string | undefined,
+		): UserMeterPackageServiceMode {
+			if (mode === undefined) return 'persistent'
+			if (mode === 'bounded' || mode === 'persistent') return mode
+			throw new Error(`Invalid package service mode: ${JSON.stringify(mode)}`)
+		}
+
 			async upsertPackageServiceState(input: {
 				packageId: string
 				serviceName: string
 				status: string
 				mode?: string
@@
-				const mode: UserMeterPackageServiceMode =
-					input.mode === 'bounded' ? 'bounded' : 'persistent'
+				const mode = normalizePackageServiceMode(input.mode)
@@
 			async countRunningPackageServices(
@@
 			) {
+				const mode =
+					input.mode === undefined
+						? undefined
+						: normalizePackageServiceMode(input.mode)
 				const now = input.now ? new Date(input.now) : new Date()
@@
-					if (input.mode && row.mode !== input.mode) continue
+					if (mode && row.mode !== mode) continue

Also applies to: 476-491

🤖 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/test-support/user-meter.ts` around lines 363 - 375,
Update the in-memory UserMeter RPC handlers around the `input.mode`
normalization and the filter handling near the second method to reject any
unsupported non-undefined mode, matching production behavior. Preserve
`persistent` as the default only when `mode` is omitted, and ensure invalid mode
filters throw instead of returning zero results.
🧹 Nitpick comments (3)
packages/worker/client/routes/account-billing.tsx (1)

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

Consider an auto-fitting track for three cards.

Three fixed columns compress each card to about one third of the width at tablet sizes. minmax(0, 1fr) prevents overflow, so this is readability only. An auto-fitting track wraps cards before they become too narrow, without adding a breakpoint.

♻️ Proposed change
-									gridTemplateColumns: 'repeat(3, minmax(0, 1fr))',
+									gridTemplateColumns: 'repeat(auto-fit, minmax(16rem, 1fr))',
🤖 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/client/routes/account-billing.tsx` at line 509, Update the
gridTemplateColumns configuration for the three-card layout to use an
auto-fitting responsive track that wraps cards when available width becomes too
narrow, while preserving the existing minimum-width and flexible-column
behavior.
packages/worker/src/entitlements/plan-tier-migration.node.test.ts (1)

33-71: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add coverage for the AUTOINCREMENT high-water mark.

The migration contains dedicated logic to preserve sqlite_sequence for users (Lines 196-212 of packages/worker/migrations/0002-restructure-plan-tiers.sql). No test asserts it. Delete the highest-id user before running the migration, then assert that a new insert does not reuse that id.

💚 Proposed test addition
test('tier migration preserves the users autoincrement high-water mark', () => {
	const db = new DatabaseSync(':memory:')
	db.exec(baselineSql)
	insertUser(db, { id: 10, plan: 'pro', stripePlan: null })
	insertUser(db, { id: 42, plan: 'free', stripePlan: null })
	db.prepare(`DELETE FROM users WHERE id = 42`).run()

	db.exec(tierMigrationSql)

	db.prepare(
		`INSERT INTO users (username, email, password_hash, stable_user_id)
		 VALUES ('fresh', 'fresh@example.com', 'hash', 'stable-fresh')`,
	).run()
	expect(
		db.prepare(`SELECT MAX(id) AS id FROM users`).get()?.id,
	).toBe(43)
})
🤖 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/entitlements/plan-tier-migration.node.test.ts` around
lines 33 - 71, Add a test alongside the existing tier migration tests that
inserts a user with the highest ID, deletes it before executing
tierMigrationSql, then inserts a new user afterward and asserts the generated ID
is one greater than the deleted high-water mark. Use the existing baselineSql
and insertUser helpers, and keep the assertion focused on users AUTOINCREMENT
behavior.
packages/worker/src/billing/billing-config.node.test.ts (1)

128-167: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add a case where one subscription holds both price ids.

planFromSubscription short-circuits on the Pro price and defers the Standard match through matchedStandardPrice. No test covers a subscription that contains both prices, and item order decides whether the flag path or the short-circuit runs first.

💚 Proposed test addition
	expect(
		resolveSubscriptionPlan(
			[
				subscription({
					status: 'active',
					priceIds: ['price_standard', 'price_pro'],
				}),
			],
			env,
		).stripePlan,
	).toBe('pro')
🤖 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/billing/billing-config.node.test.ts` around lines 128 -
167, Add a test in the resolveSubscriptionPlan cases for a single active
subscription whose priceIds contain both price_standard and price_pro, asserting
the returned stripePlan is pro. This should cover planFromSubscription behavior
regardless of the price ID order.
🤖 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 `@docs/contributing/setup-manifest.md`:
- Around line 362-366: Update the GitHub Actions deployment section to document
both STRIPE_STANDARD_PRICE_ID and STRIPE_PRO_PRICE_ID as Worker deployment
secrets, and remove the outdated instruction describing STRIPE_PRO_PRICE_ID as a
committed Wrangler variable. Keep the documented secret names and plan mappings
consistent with the entries above.

In `@packages/worker/client/routes/account-billing.tsx`:
- Around line 246-249: Update startCheckout and its related completion/error
cleanup paths to track the pending plan in checkoutPendingPlan rather than the
shared checkoutPending boolean, setting it to the selected plan and resetting it
to null wherever checkoutPending is cleared. In the paid-card rendering logic,
show “Starting checkout…” only when that card’s plan matches
checkoutPendingPlan; leave other cards’ labels unchanged.

---

Outside diff comments:
In `@packages/worker/src/test-support/user-meter.ts`:
- Around line 363-375: Update the in-memory UserMeter RPC handlers around the
`input.mode` normalization and the filter handling near the second method to
reject any unsupported non-undefined mode, matching production behavior.
Preserve `persistent` as the default only when `mode` is omitted, and ensure
invalid mode filters throw instead of returning zero results.

---

Nitpick comments:
In `@packages/worker/client/routes/account-billing.tsx`:
- Line 509: Update the gridTemplateColumns configuration for the three-card
layout to use an auto-fitting responsive track that wraps cards when available
width becomes too narrow, while preserving the existing minimum-width and
flexible-column behavior.

In `@packages/worker/src/billing/billing-config.node.test.ts`:
- Around line 128-167: Add a test in the resolveSubscriptionPlan cases for a
single active subscription whose priceIds contain both price_standard and
price_pro, asserting the returned stripePlan is pro. This should cover
planFromSubscription behavior regardless of the price ID order.

In `@packages/worker/src/entitlements/plan-tier-migration.node.test.ts`:
- Around line 33-71: Add a test alongside the existing tier migration tests that
inserts a user with the highest ID, deletes it before executing
tierMigrationSql, then inserts a new user afterward and asserts the generated ID
is one greater than the deleted high-water mark. Use the existing baselineSql
and insertUser helpers, and keep the assertion focused on users AUTOINCREMENT
behavior.
🪄 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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 74f638cc-ce6f-4970-bf6e-5f32f2d40bf7

📥 Commits

Reviewing files that changed from the base of the PR and between 8d7b7b4 and 63e4c74.

📒 Files selected for processing (36)
  • docs/contributing/architecture/entitlements.md
  • docs/contributing/architecture/index.md
  • docs/contributing/environment-variables.md
  • docs/contributing/setup-manifest.md
  • docs/use/email-primitives.md
  • docs/use/index.md
  • docs/use/workflows.md
  • packages/worker/.env.example
  • packages/worker/client/routes/account-billing.tsx
  • packages/worker/client/routes/admin-insights.tsx
  • packages/worker/client/routes/pricing.tsx
  • packages/worker/migrations/0002-restructure-plan-tiers.sql
  • packages/worker/src/admin/user-usage-data.node.test.ts
  • packages/worker/src/app/account-billing-data.node.test.ts
  • packages/worker/src/app/account-billing-data.ts
  • packages/worker/src/app/handlers/account-billing.ts
  • packages/worker/src/app/loader-data.ts
  • packages/worker/src/billing/billing-config.node.test.ts
  • packages/worker/src/billing/billing-config.ts
  • packages/worker/src/blog/posts/zero-inference-calls.md
  • packages/worker/src/entitlements/entitlements.node.test.ts
  • packages/worker/src/entitlements/plan-tier-migration.node.test.ts
  • packages/worker/src/entitlements/plans.ts
  • packages/worker/src/entitlements/service.ts
  • packages/worker/src/entitlements/usage-snapshot.node.test.ts
  • packages/worker/src/entitlements/user-meter-do.ts
  • packages/worker/src/entitlements/user-meter.workers.test.ts
  • packages/worker/src/env-schema.ts
  • packages/worker/src/mcp/capabilities/services/service-start.node.test.ts
  • packages/worker/src/mcp/capabilities/services/service-start.ts
  • packages/worker/src/og/pages.ts
  • packages/worker/src/package-runtime/package-service.ts
  • packages/worker/src/test-support/user-meter.ts
  • packages/worker/worker-configuration.d.ts
  • packages/worker/wrangler.jsonc
  • tools/migration-ledger.json

Comment thread docs/contributing/setup-manifest.md Outdated
Comment on lines +362 to +366
- `STRIPE_STANDARD_PRICE_ID` (optional Worker secret; Stripe Price id mapped to
the $5/month `standard` plan and used for authenticated Checkout Sessions.)
- `STRIPE_PRO_PRICE_ID` (optional Worker secret; Stripe Price id mapped to the
$20/month `pro` plan and used for authenticated Checkout Sessions.) Each price
id is independent; an unset value only disables checkout for that tier.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Keep the Stripe deployment contract consistent.

These entries define both price IDs as Worker secrets. The GitHub Actions section below still says STRIPE_PRO_PRICE_ID is a committed Wrangler variable. Update that section to document both STRIPE_STANDARD_PRICE_ID and STRIPE_PRO_PRICE_ID as deployment secrets and remove the old variable instruction. Otherwise, a production deploy can omit Standard checkout configuration or keep the old Pro mapping.

🤖 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 `@docs/contributing/setup-manifest.md` around lines 362 - 366, Update the
GitHub Actions deployment section to document both STRIPE_STANDARD_PRICE_ID and
STRIPE_PRO_PRICE_ID as Worker deployment secrets, and remove the outdated
instruction describing STRIPE_PRO_PRICE_ID as a committed Wrangler variable.
Keep the documented secret names and plan mappings consistent with the entries
above.

Comment thread packages/worker/client/routes/account-billing.tsx Outdated
…eckout pending

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

@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 1 potential issue.

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 5af94fb. Configure here.

Comment thread packages/worker/src/entitlements/service.ts
cursoragent and others added 3 commits August 5, 2026 17:56
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>
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