Skip to content

Remove the package services primitive - #1552

Merged
kody-bot merged 8 commits into
mainfrom
cursor/remove-package-services-8713
Aug 19, 2026
Merged

kody-bot merged 8 commits into
mainfrom
cursor/remove-package-services-8713

Conversation

@kentcdodds

@kentcdodds kentcdodds commented Aug 19, 2026 •

Copy link
Copy Markdown
Member

Intent

Delete package services as a Kody primitive. Durable Object outbound sockets are not a process supervisor, and a fleet check found no one running services.

Summary

  • Removed kody.services, the MCP services domain, PackageServiceInstance, plan entitlements, and service / serviceContext runtime helpers.
  • Publish now rejects leftover kody.services instead of stripping the field.
  • Added ADR 0025 (renumbered after main claimed 0024).
  • D1 migration 0016-drop-package-service-states.sql drops the enumeration table. Leftover kind=service user_storage_buckets rows stay until the storage_bucket_estimate_backfill lane clears those StorageRunner Durable Objects and then deletes the inventory, so account export, deletion, and DR keep a user→storage_id map.
  • UserMeter schema v10 drops per-user package_service_states.
  • Wrangler: v26 (main worker) and v2 (runtime worker) deleted_classes for PackageServiceInstance, plus the DO deletion allowlist / baseline updates.
  • Docs, pricing, community install, and MCP copy no longer describe services. Long-running daemons stay on an external process (Fly). Exclusive or cancellable background work uses jobs or workflows.

Kent's @kentcdodds/discord gateway service is removed in the package repo separately; Fly kody-discord-gateway-proxy is the live Gateway. The hidden discord-gateway-cf-experiment package no longer declares kody.services.

Testing

  • Fleet check via Kody admin: 62 users, 0 running package_services / persistent_package_services. Only Kent had historical service_runtime from the gateway experiment.
  • Follow-up audit rejected leftover kody.services and rewrote remaining present-tense UI/docs/MCP copy.
  • Bugbot: keep leftover service storage inventory until StorageRunner clear succeeds. Node + workers tests cover failed clear (row stays) and successful clear (DO emptied, row deleted).
  • Focused tests: storage purge node/workers + check-migrations (15/15). Full npm run test:node: 1847/1847.
  • Preview kody-pr-1552 as seeded user me@kentcdodds.com / user-me on merge commit of e07a0e6b (will re-run after this HEAD's preview deploys):
    • Created value services-removed-audit.
    • GET /guides/package-service-pattern.json is 404.
    • Usage entitlements have no service resources.
    • Pricing/billing copy is jobs/workflows only.
    • Activity surface filter has no service.
    • UI pass confirmed the same pages after sign-in.

System changes

System recap — removes a primitive (high risk)

Mode: recap · Base: main · Head: cursor/remove-package-services-8713

Classification: removes package-services — Durable Object supervisor, MCP domain, entitlements, and runtime helpers are gone. Remaining work uses jobs, workflows, and external processes.

Primitives touched

Primitive Group Impact
package-services assistant removed — deleted from primitives.yaml
capability-registry assistant extends — MCP services domain deleted
user-meter storage extends — schema v10 drops package_service_states
d1-app-db storage extends — drop package_service_states; keep leftover kind=service inventory
durable-storage assistant extends — backfill lane clears leftover service StorageRunner DOs, then drops inventory
entitlements auth extends — package_services / persistent_package_services removed
package-runtime runtime extends — no service isolate or service helper
saved-packages assistant extends — kody.services rejected as unsupported
run-records storage extends — no service surface
usage-metering storage extends — no service_runtime writes
app-ui surfaces extends — pricing and community install drop services
mcp-server surfaces extends — instructions and search stop advertising services

Change flow

A package publish or service_start path no longer exists. Leftover kody.services fails publish instead of being stripped. Leftover service StorageRunner objects stay inventoried until the estimate-backfill lane clears them.

sequenceDiagram
	participant package as saved-packages
	participant registry as capability-registry
	participant runtime as package-runtime
	participant meter as user-meter
	participant d1 as d1-app-db
	participant storage as durable-storage
	package-->>registry: kody.services rejected as unsupported
	Note over registry: services domain deleted
	runtime-->>runtime: PackageServiceInstance class deleted
	meter->>meter: v10 DROP package_service_states
	d1->>d1: 0016 DROP package_service_states; keep service inventory
	storage->>storage: clear leftover service StorageRunner DOs
	storage->>d1: delete kind=service user_storage_buckets after clear
Loading

Before / after

Before: package.json#kody.services → PackageServiceInstance DO → Worker Loader isolate → service_start / service_stop.

After: no service declaration, no service MCP tools, no service DO. Daemons run outside Kody. Leftover service: StorageRunner objects stay exportable and deletable until the backfill purge clears them.

Invariants

Per-user isolation is unchanged. This change only removes a compute surface; it does not share state across users. Account export and deletion keep discovering leftover service storage ids until those Durable Objects are cleared.

Open in Web Open in Cursor 

Durable Object outbound sockets are not a process supervisor. Fleet usage
showed no running services. Keep only ADR 0024 and the D1/UserMeter/DO
migrations.

Co-authored-by: me <me@kentcdodds.com>
@coderabbitai

coderabbitai Bot commented Aug 19, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 149 files, which is 49 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 26b8a4f0-27ba-4f6b-b211-fa6b6561280c

📥 Commits

Reviewing files that changed from the base of the PR and between 9f477fe and 033c99e.

📒 Files selected for processing (149)
  • docs/contributing/architecture/data-storage.md
  • docs/contributing/architecture/entitlements.md
  • docs/contributing/architecture/invocation-overhead-guardrails.md
  • docs/contributing/architecture/primitives.yaml
  • docs/contributing/architecture/request-lifecycle.md
  • docs/contributing/architecture/run-records.md
  • docs/contributing/architecture/runtime-worker-migration-runbook.md
  • docs/contributing/architecture/usage-metering.md
  • docs/contributing/community-packages.md
  • docs/contributing/decisions/0025-no-package-services-primitive.md
  • docs/contributing/decisions/index.md
  • docs/contributing/disaster-recovery.md
  • docs/contributing/package-codemods.md
  • docs/contributing/packages-and-manifests.md
  • docs/guides/README.md
  • docs/guides/integration-backed-app-happy-path.md
  • docs/guides/package-lifecycle.md
  • docs/guides/package-service-pattern.md
  • docs/guides/package-subscriptions.md
  • docs/guides/what-is-kody.md
  • docs/use/activity.md
  • docs/use/community-packages.md
  • docs/use/execute.md
  • docs/use/packages.md
  • docs/use/repos.md
  • docs/use/workflows.md
  • packages/runtime-worker/readme.md
  • packages/runtime-worker/wrangler.jsonc
  • packages/worker/client/action-button-loader.tsx
  • packages/worker/client/charts/usage-metric-series.ts
  • packages/worker/client/routes/account-activity.tsx
  • packages/worker/client/routes/account-billing.tsx
  • packages/worker/client/routes/admin-insights.tsx
  • packages/worker/client/routes/community-detail.tsx
  • packages/worker/client/routes/pricing.tsx
  • packages/worker/migrations/0016-drop-package-service-states.sql
  • packages/worker/src/account/data-targets.ts
  • packages/worker/src/account/export.node.test.ts
  • packages/worker/src/account/export.ts
  • packages/worker/src/account/user-inventory.ts
  • packages/worker/src/account/user-owned-surfaces.ts
  • packages/worker/src/admin/entitlement-consumption.ts
  • packages/worker/src/admin/fleet-usage-insights.node.test.ts
  • packages/worker/src/admin/fleet-usage-insights.ts
  • packages/worker/src/admin/user-meter-parity.node.test.ts
  • packages/worker/src/admin/user-usage-data.node.test.ts
  • packages/worker/src/admin/user-usage-data.ts
  • packages/worker/src/app/account-deletion.node.test.ts
  • packages/worker/src/app/account-deletion.ts
  • packages/worker/src/app/handler.node.test.ts
  • packages/worker/src/app/ssr-render.node.test.ts
  • packages/worker/src/blog/posts/the-assistant-that-cant-leak-your-keychain.md
  • packages/worker/src/community/install.ts
  • packages/worker/src/dr/exporter-inventory.ts
  • packages/worker/src/dr/exporter.node.test.ts
  • packages/worker/src/email/system-email-subscriptions.workers.test.ts
  • packages/worker/src/email/user-email-mailbox-flow.workers.test.ts
  • packages/worker/src/entitlements/entitlements.node.test.ts
  • packages/worker/src/entitlements/package-services-user-meter.node.test.ts
  • packages/worker/src/entitlements/resource-visibility.ts
  • packages/worker/src/entitlements/service.ts
  • packages/worker/src/entitlements/test-schema.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/guides/catalog.ts
  • packages/worker/src/index.ts
  • packages/worker/src/jobs/service.ts
  • packages/worker/src/mcp/capabilities/account/account-export-section.ts
  • packages/worker/src/mcp/capabilities/admin/admin-user-usage.ts
  • packages/worker/src/mcp/capabilities/builtin-domains.ts
  • packages/worker/src/mcp/capabilities/coding/kody-official-guide.ts
  • packages/worker/src/mcp/capabilities/domain-metadata.ts
  • packages/worker/src/mcp/capabilities/packages/domain.ts
  • packages/worker/src/mcp/capabilities/packages/publish-external-push.node.test.ts
  • packages/worker/src/mcp/capabilities/runs/run-list.ts
  • packages/worker/src/mcp/capabilities/services/domain.ts
  • packages/worker/src/mcp/capabilities/services/service-get.ts
  • packages/worker/src/mcp/capabilities/services/service-list.ts
  • packages/worker/src/mcp/capabilities/services/service-start.node.test.ts
  • packages/worker/src/mcp/capabilities/services/service-start.ts
  • packages/worker/src/mcp/capabilities/services/service-stop.ts
  • packages/worker/src/mcp/capabilities/services/services-domain.node.test.ts
  • packages/worker/src/mcp/capabilities/services/shared.ts
  • packages/worker/src/mcp/executor.ts
  • packages/worker/src/mcp/fetch-gateway.ts
  • packages/worker/src/mcp/instructions/base-server-fragments.ts
  • packages/worker/src/mcp/run-kody-registry.node.test.ts
  • packages/worker/src/mcp/run-kody-registry.ts
  • packages/worker/src/mcp/runtime-helper-manifest.ts
  • packages/worker/src/mcp/tools/search-entity-plugins/package.ts
  • packages/worker/src/mcp/tools/search-entity-registry.node.test.ts
  • packages/worker/src/mcp/tools/search-package-rows.ts
  • packages/worker/src/mcp/tools/search-scoring.ts
  • packages/worker/src/mcp/tools/search.node.test.ts
  • packages/worker/src/oauth-handlers.workers.test.ts
  • packages/worker/src/package-codemods/codemods/0001-ambient-storage-to-package-storage.ts
  • packages/worker/src/package-invocations/background-identity.workers.test.ts
  • packages/worker/src/package-invocations/common.ts
  • packages/worker/src/package-invocations/http.node.test.ts
  • packages/worker/src/package-invocations/invoke-contract-cache.node.test.ts
  • packages/worker/src/package-invocations/service.node.test.ts
  • packages/worker/src/package-registry/manifest.node.test.ts
  • packages/worker/src/package-registry/manifest.ts
  • packages/worker/src/package-registry/service.node.test.ts
  • packages/worker/src/package-registry/service.ts
  • packages/worker/src/package-registry/types.ts
  • packages/worker/src/package-runtime/module-graph-artifacts.ts
  • packages/worker/src/package-runtime/module-graph.node.test.ts
  • packages/worker/src/package-runtime/package-app.ts
  • packages/worker/src/package-runtime/package-artifact-targets.ts
  • packages/worker/src/package-runtime/package-service.node.test.ts
  • packages/worker/src/package-runtime/package-service.ts
  • packages/worker/src/package-runtime/published-bundle-artifacts.node.test.ts
  • packages/worker/src/package-runtime/published-bundle-artifacts.ts
  • packages/worker/src/package-runtime/published-runtime-artifacts.ts
  • packages/worker/src/package-runtime/runtime-source-modules.ts
  • packages/worker/src/package-runtime/unbound-runtime-helpers.node.test.ts
  • packages/worker/src/platform-feedback/platform-feedback-subscriptions.workers.test.ts
  • packages/worker/src/repo/checks.node.test.ts
  • packages/worker/src/repo/checks.ts
  • packages/worker/src/run-records/dedicated-state.workers.test.ts
  • packages/worker/src/run-records/run-log-do.ts
  • packages/worker/src/run-records/run-records.workers.test.ts
  • packages/worker/src/run-records/types.ts
  • packages/worker/src/runtime-worker.ts
  • packages/worker/src/storage-buckets/estimate-backfill.node.test.ts
  • packages/worker/src/storage-buckets/estimate-backfill.ts
  • packages/worker/src/storage-buckets/estimate-backfill.workers.test.ts
  • packages/worker/src/storage-buckets/purge-retired-service-storage.node.test.ts
  • packages/worker/src/storage-buckets/purge-retired-service-storage.ts
  • packages/worker/src/storage-buckets/service.node.test.ts
  • packages/worker/src/storage-buckets/service.ts
  • packages/worker/src/storage-buckets/test-schema.ts
  • packages/worker/src/storage-runner.entitlement.node.test.ts
  • packages/worker/src/storage-runner.ts
  • packages/worker/src/test-support/user-meter.ts
  • packages/worker/src/usage/activation.node.test.ts
  • packages/worker/src/usage/record-usage.ts
  • packages/worker/src/user-scoped-durable-object-name.node.test.ts
  • packages/worker/src/user-scoped-durable-object-name.ts
  • packages/worker/universal/loader-data.ts
  • packages/worker/universal/plans.ts
  • packages/worker/universal/usage-event-types.ts
  • packages/worker/worker-configuration.d.ts
  • packages/worker/wrangler.jsonc
  • tools/ci/do-deletion-allowlist.json
  • tools/ci/durable-object-baseline.json
  • tools/migration-ledger.json

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


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 19, 2026 08:40
@github-actions

github-actions Bot commented Aug 19, 2026 •

Copy link
Copy Markdown
Contributor

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

Worker: kody-pr-1552
Runtime worker: kody-pr-1552-runtime (https://kody-pr-1552-runtime.kody-a99.workers.dev)
D1: kody-pr-1552-db
KV: kody-pr-1552-oauth-kv

Mocks:

cursoragent and others added 2 commits August 19, 2026 08:46
The first deletion pass left present-tense UI, docs, and MCP text that still
described package services, and silently stripped kody.services instead of
rejecting it.

Co-authored-by: me <me@kentcdodds.com>
Keep the deleted package-service tests; main only changed an oxlint import there.

Co-authored-by: me <me@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 629fd48. Configure here.

cursoragent and others added 4 commits August 19, 2026 09:20
D1 cannot delete Durable Objects, so migration 0016 now keeps kind=service
user_storage_buckets rows until the estimate-backfill lane clears those
StorageRunner objects and then deletes the inventory. Export, deletion, and
DR keep discovering leftover service storage ids until that purge succeeds.

Co-authored-by: me <me@kentcdodds.com>
0016 is new on this branch, so the ledger hash must match the revised
SQL that leaves leftover service storage rows for the StorageRunner purge.

Co-authored-by: me <me@kentcdodds.com>
Co-authored-by: me <me@kentcdodds.com>
Co-authored-by: me <me@kentcdodds.com>
@kody-bot
kody-bot marked this pull request as draft August 19, 2026 09:48
@kody-bot
kody-bot marked this pull request as ready for review August 19, 2026 09:48
Renumber the no-package-services ADR to 0025 after main claimed 0024
for packages-outrank-synthesized-providers.

Co-authored-by: me <me@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