# Debt ledger

> "Debt only shrinks."

Total: **137** directives.

## Count by directive kind

| Kind | Count |
| --- | ---: |
| effect-diagnostics | 52 |
| oxlint | 85 |

The vendored `tools/oxlint/anti-slop/` plugin is excluded. It is Dillon Mulroy's code, not our debt.

## Every directive

| File | Directive | Reason |
| --- | --- | --- |
| [apps/cli/src/cli.ts:11](https://github.com/joelhooks/rat-stack/blob/main/apps/cli/src/cli.ts#L11) | oxlint-disable-next-line promise/prefer-await-to-callbacks | Oxlint mistakes this Effect handler for an async Promise callback. |
| [apps/cli/src/surfaces.ts:1](https://github.com/joelhooks/rat-stack/blob/main/apps/cli/src/surfaces.ts#L1) | @effect-diagnostics-next-line nodeBuiltinImport:off | The Node HTTP server is the one place where nothing in Effect wraps the built-in: `NodeHttpServer.layer` takes a `node:http` server factory. |
| [apps/cli/test/cli.e2e.test.ts:1](https://github.com/joelhooks/rat-stack/blob/main/apps/cli/test/cli.e2e.test.ts#L1) | @effect-diagnostics nodeBuiltinImport:off asyncFunction:off newPromise:off globalTimers:off | Black-box tests of the built binary: they spawn dist/cli.js as a child process and assert on stdout, stderr, and exit codes. Node built-ins and a Promise-based stdio conversation are the right tools at that boundary, so the Effect-native diagnostics are off here. |
| [apps/cli/test/cli.e2e.test.ts:72](https://github.com/joelhooks/rat-stack/blob/main/apps/cli/test/cli.e2e.test.ts#L72) | oxlint-disable-next-line promise/avoid-new | A child process conversation has no library Promise to return. |
| [apps/mischief/scripts/generate-content.ts:1](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/scripts/generate-content.ts#L1) | @effect-diagnostics-next-line nodeBuiltinImport:off | Build-only hashing uses Node's stable SHA-256 implementation. |
| [apps/mischief/scripts/generate-content.ts:489](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/scripts/generate-content.ts#L489) | @effect-diagnostics-next-line asyncFunction:off | satori and resvg own this Promise boundary. |
| [apps/mischief/scripts/generate-content.ts:554](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/scripts/generate-content.ts#L554) | oxlint-disable-next-line typescript/promise-function-async | Node's module loader owns this Promise-returning boundary. |
| [apps/mischief/scripts/generate-content.ts:571](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/scripts/generate-content.ts#L571) | @effect-diagnostics-next-line asyncFunction:off | mdsvex owns this Promise boundary. |
| [apps/mischief/scripts/generate-content.ts:843](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/scripts/generate-content.ts#L843) | @effect-diagnostics-next-line asyncFunction:off | Shiki owns this Promise boundary. |
| [apps/mischief/src/a2a.ts:34](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/src/a2a.ts#L34) | oxlint-disable-next-line unicorn/no-array-method-this-argument | Effect.forEach is the Effect combinator, not Array#forEach with a thisArg. |
| [apps/mischief/src/app.ts:306](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/src/app.ts#L306) | oxlint-disable-next-line typescript/promise-function-async | Cloudflare's Cache API owns this Promise-returning boundary. |
| [apps/mischief/src/app.ts:330](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/src/app.ts#L330) | oxlint-disable-next-line typescript/promise-function-async | Cloudflare's Cache API owns this Promise-returning boundary. |
| [apps/mischief/src/app.ts:608](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/src/app.ts#L608) | oxlint-disable-next-line typescript/promise-function-async | The Fetch Request owns this Promise-returning boundary. |
| [apps/mischief/src/app.ts:752](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/src/app.ts#L752) | @effect-diagnostics-next-line cryptoRandomUUID:off | Workers ship Web Crypto and Effect has no Web Crypto layer; a random session id needs no injectable service. |
| [apps/mischief/src/legacy-mcp/durable-object.ts:20](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/src/legacy-mcp/durable-object.ts#L20) | oxlint-disable-next-line typescript/no-unsafe-type-assertion | no reason given |
| [apps/mischief/src/legacy-mcp/durable-object.ts:31](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/src/legacy-mcp/durable-object.ts#L31) | @effect-diagnostics-next-line returnEffectInGen:off | Alchemy's DurableObject contract returns the per-instance Effect. |
| [apps/mischief/src/legacy-mcp/runtime.ts:27](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/src/legacy-mcp/runtime.ts#L27) | @effect-diagnostics-next-line anyUnknownInErrorContext:off | HttpRouter declares asHttpEffect's error as unknown upstream; toWebHandler renders every failure as an HTTP response. |
| [apps/mischief/src/rate-limits.ts:75](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/src/rate-limits.ts#L75) | oxlint-disable-next-line typescript/promise-function-async | Cloudflare owns this Promise-returning runtime boundary. |
| [apps/mischief/src/sandbox-worker-loader.ts:1](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/src/sandbox-worker-loader.ts#L1) | oxlint-disable-next-line typescript/triple-slash-reference | The Worker runtime module has no Node-resolvable declaration of its own. |
| [apps/mischief/src/sandbox-worker-loader.ts:90](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/src/sandbox-worker-loader.ts#L90) | oxlint-disable-next-line typescript/promise-function-async | The built-in exists only inside workerd; keeping it lazy lets Alchemy import the Stack under Node without resolving the special URL. |
| [apps/mischief/src/sandbox-worker-loader.ts:97](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/src/sandbox-worker-loader.ts#L97) | @effect-diagnostics-next-line asyncFunction:off | Cloudflare RPC requires a Promise-returning method at this boundary. This is the sandbox's way out, so `input` arrives untrusted and is parsed as JSON before any capability sees it. |
| [apps/mischief/src/sandbox-worker-loader.ts:100](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/src/sandbox-worker-loader.ts#L100) | oxlint-disable-next-line anti-slop/no-unknown-parameters | no reason given |
| [apps/mischief/src/sandbox-worker-loader.ts:228](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/src/sandbox-worker-loader.ts#L228) | oxlint-disable-next-line typescript/promise-function-async | Effect.tryPromise accepts the platform Promise directly. |
| [apps/mischief/src/sandbox-worker-loader.ts:234](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/src/sandbox-worker-loader.ts#L234) | oxlint-disable-next-line promise/prefer-await-to-callbacks | Oxlint mistakes this Effect handler for a Promise callback. |
| [apps/mischief/src/worker.ts:22](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/src/worker.ts#L22) | oxlint-disable-next-line typescript/promise-function-async | Cloudflare provides this global only when a request reaches the Worker. |
| [apps/mischief/src/worker.ts:24](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/src/worker.ts#L24) | oxlint-disable-next-line typescript/promise-function-async | Cloudflare provides this global only when a request reaches the Worker. |
| [apps/mischief/src/worker.ts:57](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/src/worker.ts#L57) | oxlint-disable-next-line typescript/no-unsafe-type-assertion | no reason given |
| [apps/mischief/test/legacy-mcp-routing.test.ts:22](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/test/legacy-mcp-routing.test.ts#L22) | oxlint-disable-next-line typescript/promise-function-async | Matches Cloudflare's Promise-returning binding. |
| [apps/mischief/test/rpc-worker.test.ts:32](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/test/rpc-worker.test.ts#L32) | @effect-diagnostics-next-line asyncFunction:off | The in-memory HTTP handler exposes a Promise boundary. |
| [apps/mischief/test/worker-runtime-init.test.ts:19](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/test/worker-runtime-init.test.ts#L19) | oxlint-disable-next-line typescript/promise-function-async | Cloudflare's binding returns a native Promise. |
| [apps/mischief/test/worker-runtime-init.test.ts:69](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/test/worker-runtime-init.test.ts#L69) | oxlint-disable-next-line typescript/no-unsafe-type-assertion | runtimeServices provides the Worker init bindings. |
| [apps/mischief/test/worker-runtime-init.test.ts:90](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/test/worker-runtime-init.test.ts#L90) | oxlint-disable-next-line typescript/no-unsafe-type-assertion | makeRequestHandler erases its response effect type. |
| [apps/mischief/test/worker.test.ts:52](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/test/worker.test.ts#L52) | oxlint-disable-next-line typescript/promise-function-async | This fake deliberately matches Cloudflare's Promise-returning Cache API. |
| [apps/mischief/test/worker.test.ts:60](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/test/worker.test.ts#L60) | oxlint-disable-next-line typescript/promise-function-async | This fake deliberately matches Cloudflare's Promise-returning Cache API. |
| [apps/mischief/test/worker.test.ts:109](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/test/worker.test.ts#L109) | oxlint-disable-next-line typescript/promise-function-async | The fake deliberately matches Cloudflare's Promise-returning binding. |
| [apps/mischief/test/worker.test.ts:127](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/test/worker.test.ts#L127) | oxlint-disable-next-line typescript/promise-function-async | Web Crypto owns the Promise at this test boundary. |
| [apps/mischief/test/worker.test.ts:351](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/test/worker.test.ts#L351) | oxlint-disable-next-line typescript/promise-function-async | Web Crypto owns the Promise at this test boundary. |
| [apps/mischief/test/worker.test.ts:360](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/test/worker.test.ts#L360) | oxlint-disable-next-line typescript/promise-function-async | Web Crypto owns the Promise at this test boundary. |
| [apps/mischief/test/worker.test.ts:1660](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/test/worker.test.ts#L1660) | oxlint-disable-next-line typescript/promise-function-async | Fetch owns this Promise-returning test boundary. |
| [apps/mischief/test/worker.test.ts:1701](https://github.com/joelhooks/rat-stack/blob/main/apps/mischief/test/worker.test.ts#L1701) | oxlint-disable-next-line typescript/promise-function-async | Fetch owns this Promise-returning test boundary. |
| [apps/web/src/server/backend.ts:5](https://github.com/joelhooks/rat-stack/blob/main/apps/web/src/server/backend.ts#L5) | @effect-diagnostics-next-line asyncFunction:off | Cloudflare service bindings return Promises. |
| [apps/web/src/server/backend.ts:9](https://github.com/joelhooks/rat-stack/blob/main/apps/web/src/server/backend.ts#L9) | @effect-diagnostics-next-line asyncFunction:off | The TanStack route handler is a Promise boundary. |
| [apps/web/src/server/rpc.ts:5](https://github.com/joelhooks/rat-stack/blob/main/apps/web/src/server/rpc.ts#L5) | @effect-diagnostics-next-line asyncFunction:off | The TanStack route handler is a Promise boundary. |
| [apps/web/test/dev-content-routes.test.ts:29](https://github.com/joelhooks/rat-stack/blob/main/apps/web/test/dev-content-routes.test.ts#L29) | oxlint-disable-next-line anti-slop-effect/no-manual-tagged-construction | This is the Effect RPC wire message the browser sends; the test writes it by hand on purpose. |
| [apps/web/test/dev-server.test.ts:1](https://github.com/joelhooks/rat-stack/blob/main/apps/web/test/dev-server.test.ts#L1) | @effect-diagnostics nodeBuiltinImport:off asyncFunction:off newPromise:off globalTimers:off globalFetch:off | Black-box test of `vite dev`: it spawns the real dev server and talks HTTP to it, so Node built-ins, Promises, and fetch are the right tools at that boundary. |
| [apps/web/test/dev-server.test.ts:18](https://github.com/joelhooks/rat-stack/blob/main/apps/web/test/dev-server.test.ts#L18) | oxlint-disable-next-line promise/avoid-new | A child process's first log line has no library Promise to await. |
| [apps/web/test/dev-server.test.ts:49](https://github.com/joelhooks/rat-stack/blob/main/apps/web/test/dev-server.test.ts#L49) | oxlint-disable-next-line anti-slop-effect/no-manual-tagged-construction | This is the Effect RPC wire message the browser sends; the black-box test writes it by hand on purpose. |
| [apps/web/test/production-bundle.test.ts:1](https://github.com/joelhooks/rat-stack/blob/main/apps/web/test/production-bundle.test.ts#L1) | @effect-diagnostics nodeBuiltinImport:off | These tests build the app with the real Vite binary and read the emitted source maps from disk. |
| [apps/web/test/rpc-route.test.ts:8](https://github.com/joelhooks/rat-stack/blob/main/apps/web/test/rpc-route.test.ts#L8) | @effect-diagnostics-next-line asyncFunction:off | The service-binding test stub mirrors its Promise-only boundary. |
| [packages/auth/src/auth.ts:27](https://github.com/joelhooks/rat-stack/blob/main/packages/auth/src/auth.ts#L27) | @effect-diagnostics-next-line leakingRequirements:off | Better Auth methods intentionally retain the per-request RuntimeContext requirement. |
| [packages/auth/src/current-person-middleware.ts:27](https://github.com/joelhooks/rat-stack/blob/main/packages/auth/src/current-person-middleware.ts#L27) | oxlint-disable-next-line promise/prefer-await-to-callbacks | Effect.tapError needs an Effect continuation, not a Promise callback. |
| [packages/auth/src/devtools.ts:54](https://github.com/joelhooks/rat-stack/blob/main/packages/auth/src/devtools.ts#L54) | @effect-diagnostics-next-line asyncFunction:off | Better Auth's raw API is Promise-based. |
| [packages/auth/src/devtools.ts:61](https://github.com/joelhooks/rat-stack/blob/main/packages/auth/src/devtools.ts#L61) | @effect-diagnostics-next-line asyncFunction:off | Better Auth's raw API is Promise-based. |
| [packages/capability/src/approval.ts:10](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/approval.ts#L10) | oxlint-disable-next-line anti-slop/no-unknown-parameters | Every capability's decoded input passes through one gate, so its type is erased here; an implementation that shows it to a human encodes it. |
| [packages/capability/src/call-watch.ts:8](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/call-watch.ts#L8) | oxlint-disable-next-line anti-slop/no-unknown-parameters | The decoded input is erased by implement across heterogeneous capability lists. |
| [packages/capability/src/catalog.ts:114](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/catalog.ts#L114) | oxlint-disable-next-line no-use-before-define | printNode and the object/primitive printers are mutually recursive. |
| [packages/capability/src/catalog.ts:145](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/catalog.ts#L145) | oxlint-disable-next-line no-use-before-define | no reason given |
| [packages/capability/src/contract.ts:212](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/contract.ts#L212) | oxlint-disable-next-line typescript/no-unsafe-type-assertion | no reason given |
| [packages/capability/src/implement.ts:54](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/implement.ts#L54) | oxlint-disable-next-line typescript/no-unsafe-type-assertion, anti-slop/no-chained-type-assertions | The heterogeneous record erases its handler channels until the public generic type is restored. |
| [packages/capability/src/implement.ts:69](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/implement.ts#L69) | @effect-diagnostics-next-line anyUnknownInErrorContext:off | The erased handler of a heterogeneous list; `Around` preserves whatever channels it has. |
| [packages/capability/src/implement.ts:75](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/implement.ts#L75) | oxlint-disable-next-line typescript/no-unsafe-type-assertion, anti-slop/no-chained-type-assertions | The mapped runtime array cannot carry the tuple type of `Caps`. |
| [packages/capability/src/to-code-mode.ts:1](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-code-mode.ts#L1) | @effect-diagnostics anyUnknownInErrorContext:off unsafeEffectTypeAssertion:off missingEffectContext:off | See to-toolkit.ts: a projection over a heterogeneous list erases error and requirement types at the boundary and recovers them for callers. |
| [packages/capability/src/to-code-mode.ts:136](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-code-mode.ts#L136) | oxlint-disable-next-line typescript/no-unsafe-type-assertion | no reason given |
| [packages/capability/src/to-code-mode.ts:138](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-code-mode.ts#L138) | oxlint-disable-next-line anti-slop/no-unknown-parameters | no reason given |
| [packages/capability/src/to-code-mode.ts:196](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-code-mode.ts#L196) | oxlint-disable-next-line typescript/no-unsafe-type-assertion | no reason given |
| [packages/capability/src/to-code-mode.ts:233](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-code-mode.ts#L233) | oxlint-disable-next-line typescript/no-unsafe-type-assertion | no reason given |
| [packages/capability/src/to-command.ts:87](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-command.ts#L87) | oxlint-disable-next-line typescript/no-unsafe-type-assertion | no reason given |
| [packages/capability/src/to-command.ts:120](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-command.ts#L120) | oxlint-disable-next-line typescript/no-unsafe-type-assertion | `PlainSchema` has no requirements, so the CLI environment satisfies the codec. |
| [packages/capability/src/to-command.ts:213](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-command.ts#L213) | oxlint-disable-next-line typescript/no-unsafe-type-assertion | no reason given |
| [packages/capability/src/to-command.ts:234](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-command.ts#L234) | oxlint-disable-next-line typescript/no-unsafe-type-assertion | Decoded through `contract.input`, whose Type `C` makes precise. |
| [packages/capability/src/to-http-api.ts:1](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-http-api.ts#L1) | @effect-diagnostics anyUnknownInErrorContext:off unsafeEffectTypeAssertion:off missingEffectContext:off | See to-toolkit.ts: a projection over a heterogeneous list erases error and requirement types at the boundary and recovers them for callers. |
| [packages/capability/src/to-http-api.ts:29](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-http-api.ts#L29) | oxlint-disable-next-line typescript/no-unsafe-type-assertion, anti-slop/no-chained-type-assertions | no reason given |
| [packages/capability/src/to-http-api.ts:150](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-http-api.ts#L150) | oxlint-disable-next-line typescript/no-unsafe-type-assertion, anti-slop/no-chained-type-assertions | no reason given |
| [packages/capability/src/to-http-api.ts:162](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-http-api.ts#L162) | oxlint-disable-next-line typescript/no-unsafe-type-assertion | no reason given |
| [packages/capability/src/to-http-api.ts:164](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-http-api.ts#L164) | oxlint-disable-next-line anti-slop/no-unknown-parameters | no reason given |
| [packages/capability/src/to-http-api.ts:173](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-http-api.ts#L173) | oxlint-disable-next-line typescript/no-unsafe-type-assertion | no reason given |
| [packages/capability/src/to-http-api.ts:178](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-http-api.ts#L178) | oxlint-disable-next-line typescript/no-unsafe-type-assertion, anti-slop/no-chained-type-assertions | no reason given |
| [packages/capability/src/to-rpc-group.ts:43](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-rpc-group.ts#L43) | oxlint-disable-next-line typescript/no-unsafe-type-assertion | no reason given |
| [packages/capability/src/to-rpc.ts:1](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-rpc.ts#L1) | @effect-diagnostics anyUnknownInErrorContext:off unsafeEffectTypeAssertion:off missingEffectContext:off | This projection erases each capability's schema and requirement types while building the heterogeneous RpcGroup and recovers them at its public boundary. |
| [packages/capability/src/to-rpc.ts:29](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-rpc.ts#L29) | oxlint-disable-next-line typescript/no-unsafe-type-assertion | no reason given |
| [packages/capability/src/to-rpc.ts:40](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-rpc.ts#L40) | oxlint-disable-next-line anti-slop/no-unknown-parameters | RpcGroup invokes this only after decoding the RPC payload schema. |
| [packages/capability/src/to-rpc.ts:47](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-rpc.ts#L47) | oxlint-disable-next-line typescript/no-unsafe-type-assertion | no reason given |
| [packages/capability/src/to-rpc.ts:49](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-rpc.ts#L49) | oxlint-disable-next-line anti-slop/no-unknown-parameters | RpcGroup invokes this only after decoding the RPC payload schema. |
| [packages/capability/src/to-rpc.ts:58](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-rpc.ts#L58) | oxlint-disable-next-line typescript/no-unsafe-type-assertion, anti-slop/no-chained-type-assertions | This heterogeneous projection recovers the mapped handlers after the runtime name-indexed loop. |
| [packages/capability/src/to-rpc.ts:66](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-rpc.ts#L66) | oxlint-disable-next-line typescript/no-unsafe-type-assertion | no reason given |
| [packages/capability/src/to-toolkit.ts:1](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-toolkit.ts#L1) | @effect-diagnostics anyUnknownInErrorContext:off unsafeEffectTypeAssertion:off missingEffectContext:off | A projection over a heterogeneous list of capabilities erases each one's error and requirement types at the boundary and recovers them for callers through `ToolsOf` / `RequirementsOf`. The three diagnostics above cannot distinguish that boundary from a leak, so they are off for this file only. |
| [packages/capability/src/to-toolkit.ts:92](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-toolkit.ts#L92) | oxlint-disable-next-line typescript/no-unsafe-type-assertion | no reason given |
| [packages/capability/src/to-toolkit.ts:101](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-toolkit.ts#L101) | oxlint-disable-next-line anti-slop/no-unknown-parameters | The toolkit decodes each tool's parameters before calling; this record erases them because a loop cannot name each capability. |
| [packages/capability/src/to-toolkit.ts:107](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-toolkit.ts#L107) | oxlint-disable-next-line typescript/no-unsafe-type-assertion | no reason given |
| [packages/capability/src/to-toolkit.ts:109](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-toolkit.ts#L109) | oxlint-disable-next-line anti-slop/no-unknown-parameters | no reason given |
| [packages/capability/src/to-toolkit.ts:118](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/src/to-toolkit.ts#L118) | oxlint-disable-next-line typescript/no-unsafe-type-assertion, anti-slop/no-chained-type-assertions | no reason given |
| [packages/capability/test/mcp-harness.ts:1](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/test/mcp-harness.ts#L1) | @effect-diagnostics asyncFunction:off | The fetch shim below must be a Promise-returning function because that is what `FetchHttpClient.Fetch` calls; everything around it is Effect. |
| [packages/capability/test/sandbox.test.ts:1](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/test/sandbox.test.ts#L1) | @effect-diagnostics-next-line nodeBuiltinImport:off | This integration test needs a real loopback socket; `NodeHttpServer.layer` accepts the Node server factory. |
| [packages/capability/test/to-rpc.test.ts:164](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/test/to-rpc.test.ts#L164) | oxlint-disable-next-line typescript/promise-function-async | HttpRouter exposes a Promise API for this in-memory RPC transport test. |
| [packages/capability/test/to-rpc.test.ts:182](https://github.com/joelhooks/rat-stack/blob/main/packages/capability/test/to-rpc.test.ts#L182) | oxlint-disable-next-line typescript/promise-function-async | Web Response.text returns a Promise at this in-memory transport boundary. |
| [packages/core/src/config-service.ts:24](https://github.com/joelhooks/rat-stack/blob/main/packages/core/src/config-service.ts#L24) | @effect-diagnostics-next-line classSelfMismatch:off | The generic factory hands the Self type in from the caller, which is the point of the pattern, so the class-name check does not apply here. |
| [packages/core/src/config-service.ts:35](https://github.com/joelhooks/rat-stack/blob/main/packages/core/src/config-service.ts#L35) | oxlint-disable-next-line typescript/no-unsafe-type-assertion | no reason given |
| [packages/core/src/inspect-machine.ts:70](https://github.com/joelhooks/rat-stack/blob/main/packages/core/src/inspect-machine.ts#L70) | @effect-diagnostics-next-line anyUnknownInErrorContext:off | A machine-level error or an early stop is a programming error here: the domain failure travels through the `unreadable` state, not the actor. A machine's ErrorFrom is unknown by design (statelyai/xstate#5725), so the unknown-error diagnostic is off for this one call and orDie closes it. |
| [packages/core/test/boundaries-rule.test.ts:1](https://github.com/joelhooks/rat-stack/blob/main/packages/core/test/boundaries-rule.test.ts#L1) | @effect-diagnostics nodeBuiltinImport:off | These tests create temporary source fixtures and run the real oxlint binary against them. |
| [packages/core/test/docs-pins.test.ts:1](https://github.com/joelhooks/rat-stack/blob/main/packages/core/test/docs-pins.test.ts#L1) | @effect-diagnostics nodeBuiltinImport:off | This test reads the repository's manifests and docs from disk. |
| [packages/core/test/inspect-machine.test.ts:18](https://github.com/joelhooks/rat-stack/blob/main/packages/core/test/inspect-machine.test.ts#L18) | @effect-diagnostics-next-line anyUnknownInErrorContext:off | A machine's ErrorFrom is unknown (statelyai/xstate#5725); a machine-level error here is a test failure, not a case under test. |
| [packages/core/test/no-comments-rule.test.ts:1](https://github.com/joelhooks/rat-stack/blob/main/packages/core/test/no-comments-rule.test.ts#L1) | @effect-diagnostics nodeBuiltinImport:off | These tests run the real oxlint binary against fixture files, so they use Node's file system and child process modules directly. |
| [packages/core/test/patterns-rule.test.ts:1](https://github.com/joelhooks/rat-stack/blob/main/packages/core/test/patterns-rule.test.ts#L1) | @effect-diagnostics nodeBuiltinImport:off | These tests create temporary source fixtures and run the real oxlint binary against them. |
| [packages/core/test/unknown-parameters-rule.test.ts:1](https://github.com/joelhooks/rat-stack/blob/main/packages/core/test/unknown-parameters-rule.test.ts#L1) | @effect-diagnostics nodeBuiltinImport:off | These tests write temporary source fixtures and run the real oxlint binary against them. |
| [packages/database/src/hyperdrive-postgres.ts:71](https://github.com/joelhooks/rat-stack/blob/main/packages/database/src/hyperdrive-postgres.ts#L71) | oxlint-disable-next-line promise-function-async | Effect.promise consumes a Promise factory directly. |
| [packages/database/src/postgres-migrations.ts:60](https://github.com/joelhooks/rat-stack/blob/main/packages/database/src/postgres-migrations.ts#L60) | oxlint-disable-next-line promise-function-async | Effect.promise consumes a Promise factory directly. |
| [packages/database/src/postgres-migrations.ts:68](https://github.com/joelhooks/rat-stack/blob/main/packages/database/src/postgres-migrations.ts#L68) | @effect-diagnostics-next-line asyncFunction:off | The pg client exposes Promise-based connection setup. |
| [packages/database/src/postgres-migrations.ts:86](https://github.com/joelhooks/rat-stack/blob/main/packages/database/src/postgres-migrations.ts#L86) | @effect-diagnostics-next-line asyncFunction:off | The pg client exposes Promise-based shutdown. |
| [packages/database/src/store.ts:82](https://github.com/joelhooks/rat-stack/blob/main/packages/database/src/store.ts#L82) | oxlint-disable-next-line unicorn/no-array-method-this-argument | Effect.forEach is not Array#forEach; the callback is an effectful mapper. |
| [packages/database/src/store.ts:91](https://github.com/joelhooks/rat-stack/blob/main/packages/database/src/store.ts#L91) | oxlint-disable-next-line unicorn/no-array-method-this-argument | Effect.forEach is not Array#forEach; the callback is an effectful mapper. |
| [packages/database/test/local-layers.ts:49](https://github.com/joelhooks/rat-stack/blob/main/packages/database/test/local-layers.ts#L49) | @effect-diagnostics-next-line asyncFunction:off | SQL.js initializes its local SQLite engine through a Promise API. |
| [packages/database/test/local-layers.ts:81](https://github.com/joelhooks/rat-stack/blob/main/packages/database/test/local-layers.ts#L81) | @effect-diagnostics-next-line asyncFunction:off | The SQL.js Drizzle adapter exposes Promise-based queries. |
| [packages/database/test/local-layers.ts:102](https://github.com/joelhooks/rat-stack/blob/main/packages/database/test/local-layers.ts#L102) | @effect-diagnostics-next-line asyncFunction:off | The SQL.js Drizzle adapter exposes Promise-based queries. |
| [packages/database/test/local-layers.ts:122](https://github.com/joelhooks/rat-stack/blob/main/packages/database/test/local-layers.ts#L122) | @effect-diagnostics-next-line asyncFunction:off | PGlite creates its local Postgres engine through a Promise API. |
| [packages/database/test/local-layers.ts:127](https://github.com/joelhooks/rat-stack/blob/main/packages/database/test/local-layers.ts#L127) | @effect-diagnostics-next-line asyncFunction:off | PGlite closes its local Postgres engine through a Promise API. |
| [packages/database/test/local-layers.ts:144](https://github.com/joelhooks/rat-stack/blob/main/packages/database/test/local-layers.ts#L144) | @effect-diagnostics-next-line asyncFunction:off | PGlite transactions use a Promise callback. |
| [packages/database/test/local-layers.ts:147](https://github.com/joelhooks/rat-stack/blob/main/packages/database/test/local-layers.ts#L147) | @effect-diagnostics-next-line asyncFunction:off | PGlite exposes the transaction callback as a Promise API. |
| [packages/database/test/local-layers.ts:150](https://github.com/joelhooks/rat-stack/blob/main/packages/database/test/local-layers.ts#L150) | oxlint-disable-next-line no-await-in-loop | Migration statements must stay ordered inside one transaction. |
| [packages/database/test/local-layers.ts:165](https://github.com/joelhooks/rat-stack/blob/main/packages/database/test/local-layers.ts#L165) | @effect-diagnostics-next-line asyncFunction:off | PGlite queries use a Promise API. |
| [packages/database/test/local-layers.ts:188](https://github.com/joelhooks/rat-stack/blob/main/packages/database/test/local-layers.ts#L188) | @effect-diagnostics-next-line asyncFunction:off | PGlite's Drizzle adapter exposes Promise-based queries. |
| [packages/database/test/local-layers.ts:209](https://github.com/joelhooks/rat-stack/blob/main/packages/database/test/local-layers.ts#L209) | @effect-diagnostics-next-line asyncFunction:off | PGlite's Drizzle adapter exposes Promise-based queries. |
| [packages/devtools/src/actor-watcher.ts:47](https://github.com/joelhooks/rat-stack/blob/main/packages/devtools/src/actor-watcher.ts#L47) | oxlint-disable-next-line anti-slop/no-unknown-parameters | Machine context, state values, and events are user-defined and erased at the XState inspection boundary; turning them into JSON is this function's job. |
| [packages/devtools/src/json.ts:42](https://github.com/joelhooks/rat-stack/blob/main/packages/devtools/src/json.ts#L42) | oxlint-disable-next-line anti-slop/no-unknown-parameters | Handler values arrive erased across the heterogeneous capability list; the schema encodes them before anything reads them. |
| [packages/devtools/test/devtools.test.ts:535](https://github.com/joelhooks/rat-stack/blob/main/packages/devtools/test/devtools.test.ts#L535) | oxlint-disable-next-line anti-slop/no-unknown-parameters | CallWatch preserves the erased input across heterogeneous capability lists. |
| [packages/devtools/test/devtools.test.ts:553](https://github.com/joelhooks/rat-stack/blob/main/packages/devtools/test/devtools.test.ts#L553) | oxlint-disable-next-line anti-slop/no-unknown-parameters | aroundHandlers erases input across a heterogeneous capability list. |
| [scripts/find-peers.ts:1](https://github.com/joelhooks/rat-stack/blob/main/scripts/find-peers.ts#L1) | @effect-diagnostics nodeBuiltinImport:off | This Node CLI reads manifests and a local roster directly from disk. |
| [scripts/find-peers.ts:116](https://github.com/joelhooks/rat-stack/blob/main/scripts/find-peers.ts#L116) | @effect-diagnostics-next-line asyncFunction:off | This one-shot Node CLI batches Sourcegraph requests with native Promise I/O. |
| [scripts/find-peers.ts:123](https://github.com/joelhooks/rat-stack/blob/main/scripts/find-peers.ts#L123) | @effect-diagnostics-next-line globalFetch:off | This Node CLI fetches a public Sourcegraph endpoint outside an Effect runtime. |
| [scripts/oxlint-plugin-boundaries.ts:1](https://github.com/joelhooks/rat-stack/blob/main/scripts/oxlint-plugin-boundaries.ts#L1) | @effect-diagnostics nodeBuiltinImport:off | This Oxlint plugin runs as Node tooling and reads repository files directly. |
| [scripts/oxlint-plugin-boundaries.ts:104](https://github.com/joelhooks/rat-stack/blob/main/scripts/oxlint-plugin-boundaries.ts#L104) | oxlint-disable-next-line anti-slop/no-runtime-typeof | ESTree Literal also represents numbers and booleans, so module sources need a string boundary check. |
| [scripts/oxlint-plugin-boundaries.ts:259](https://github.com/joelhooks/rat-stack/blob/main/scripts/oxlint-plugin-boundaries.ts#L259) | oxlint-disable-next-line anti-slop/no-runtime-typeof | ESTree Literal also represents numbers and booleans, so object keys need a string check. |
| [scripts/oxlint-plugin-boundaries.ts:284](https://github.com/joelhooks/rat-stack/blob/main/scripts/oxlint-plugin-boundaries.ts#L284) | oxlint-disable-next-line anti-slop/no-runtime-typeof | ESTree Literal also represents numbers, booleans, and regexes, so a computed key needs a string check. |
| [scripts/oxlint-plugin-patterns.ts:1](https://github.com/joelhooks/rat-stack/blob/main/scripts/oxlint-plugin-patterns.ts#L1) | @effect-diagnostics nodeBuiltinImport:off | This Oxlint plugin runs as Node tooling and reads repository files directly. |
| [scripts/oxlint-plugin-patterns.ts:67](https://github.com/joelhooks/rat-stack/blob/main/scripts/oxlint-plugin-patterns.ts#L67) | oxlint-disable-next-line anti-slop/no-runtime-typeof | ESTree Literal also represents numbers, booleans, and regexes, so computed API names need a string check. |
| [scripts/oxlint-plugin-patterns.ts:91](https://github.com/joelhooks/rat-stack/blob/main/scripts/oxlint-plugin-patterns.ts#L91) | oxlint-disable-next-line anti-slop/no-runtime-typeof | ESTree Literal also represents numbers and booleans, so destructuring keys need a string check. |
| [scripts/oxlint-plugin-patterns.ts:110](https://github.com/joelhooks/rat-stack/blob/main/scripts/oxlint-plugin-patterns.ts#L110) | oxlint-disable-next-line anti-slop/no-runtime-typeof | ESTree Literal also represents numbers and booleans, so contract names need a string check. |
| [scripts/oxlint-plugin-xstate-effect.ts:14](https://github.com/joelhooks/rat-stack/blob/main/scripts/oxlint-plugin-xstate-effect.ts#L14) | oxlint-disable anti-slop/no-runtime-typeof | The walker below reads every child of an ESTree node generically, so each child arrives as `unknown`. Lint tooling has no schema layer; this structural guard is the boundary check the anti-slop rule asks for. |
