---
title: "effect-v4"
description: "The mechanical rules of the kitlangton Effect skill, enforced."
---

> Documentation Index
> Fetch the complete documentation index at: https://anydoctor.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# effect-v4

Effect v4 discipline: typed errors over hand-rolled tags, Config over
direct env reads, named Effect.fn, deterministic generators, validated
boundaries, no casts that silence the type system. The mechanical rules
of the kitlangton Effect skill, enforced.

Ships as `effect-v4-kitlangton`. All checks use semantic revision 2 and shared
JS/TS syntax, call, identity, binding and span facts. Syntax-only Effect checks
run only in files with a parser-resolved Effect import reference; zod checks
apply to resolved imports from zod.

| Severity | Check | Catches |
| -------- | ----- | ------- |
| warning | `type-silencing-cast` | `as any`, a double cast, or a non-null assertion in Effect code |
| warning | `schema-class-as-default` | `Schema.Class` / `Schema.TaggedClass` for application data modeling |
| warning | `handrolled-tagged-error` | A `_tag` error class hand-rolled instead of `Schema.TaggedErrorClass` |
| info | `cause-level-recovery` | `catchCause` / `catchAllCause` / `sandbox` where typed-error recovery is the default |
| warning | `direct-process-env-read` | `process.env` read directly inside Effect application code |
| warning | `unnamed-effect-fn` | `Effect.fn` without a span/tracing name |
| warning | `date-now-in-gen` | `Date.now()` inside an `Effect.gen` body |
| warning | `zod-single-record` | `z.record` called with a single argument |
| warning | `sleep-in-test` | `Effect.sleep` inside a test file |
| info | `blind-layer-merge` | `Layer.mergeAll` / `provideMerge` as a make-it-compile composition tool |

## Blind spots (the short version)

- Effect idioms routed through re-exporting wrappers are not covered;
  generated `.d.ts` files are skipped entirely.
- API aliases, multiline calls, static bracket access and shadowed lookalikes
  are resolved structurally. `Effect.fn` names and `Effect.gen` bodies must be
  direct static arguments; aliased or dynamic values and opaque generator
  factories narrow instead of producing a definite finding.
- Class and generator extents come from the parser; braces in strings, templates
  or regex literals do not truncate the scan.
- Boundary and startup code legitimately reads the environment — the
  check cannot tell application logic from boundaries.
- `cause-level-recovery` and `blind-layer-merge` record the skill's
  defaults, not proven misuse.
- `sleep-in-test` only fires when test files are scanned — pass
  `--include-tests` to check test discipline.
- Without the shared analysis provider, all checks narrow to silence; that is
  incomplete coverage, not a clean result.

The full list prints in every report this doctor appears in.

Source: https://anydoctor.dev/doctors/effect-v4-kitlangton/index.mdx
