# Build Effect Ts V3

> Use if building TypeScript with Effect-TS v3 — Effect.gen, Layer, Schema, typed errors, Stream.

- **Type:** Skill
- **Install:** `agentstack add skill-yigitkonur-skills-by-yigitkonur-build-effect-ts-v3`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [yigitkonur](https://agentstack.voostack.com/s/yigitkonur)
- **Installs:** 0
- **Category:** [Agent Skills](https://agentstack.voostack.com/c/agent-skills)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [yigitkonur](https://github.com/yigitkonur)
- **Source:** https://github.com/yigitkonur/skills-by-yigitkonur/tree/main/plugins/build-effect-ts-v3/skills/build-effect-ts-v3

## Install

```sh
agentstack add skill-yigitkonur-skills-by-yigitkonur-build-effect-ts-v3
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# Build Effect-TS v3

Build production-grade TypeScript applications with Effect-TS v3. `Effect` is a lazy, typed, immutable description of work; services and layers carry dependencies; `Schema` validates boundaries; fibers run structured concurrency; `Stream` carries pull-based async data. Ecosystem: `@effect/platform`, `@effect/sql` (+ 11 driver packages), `@effect/rpc`, `@effect/cli`, `@effect/vitest`, `@effect/opentelemetry`, plus `@effect-atom/atom-react` for React.

For the structured index of every reference file, read [references/00-reference-map.md](references/00-reference-map.md).

## When to use

- *Building, refactoring, debugging, or testing Effect-TS v3 code (`effect@3.x`)*
- *Implementing typed tagged errors, services and layers, fibers, streams, caching, scheduling, observability with the `effect` package*
- *Working with `import { Effect, Layer, Schema, Stream } from "effect"`, `Effect.gen(function*() { yield* … })`, `class X extends Effect.Service()(...)`, `class E extends Schema.TaggedError("Tag")(...)`, `Layer.provideMerge`, `Effect.fn("Service.method")`*
- *Building HTTP servers/clients with `@effect/platform`, CLIs with `@effect/cli`, RPC with `@effect/rpc`, SQL with `@effect/sql`, tests with `@effect/vitest`, OTel with `@effect/opentelemetry`*
- *Building React frontends with `@effect-atom/atom-react`*
- *Migrating Promise / `fp-ts` / `neverthrow` / RxJS code to Effect, or operating in gradual-adoption / portable-utility mode*

Do NOT use this skill for:

- *Effect-TS v4 / v4 beta* — strictly v3 only; v4 syntax (`ServiceMap.Service`, `Schema.TaggedErrorClass`, bare `Effect.catch`, `Effect.forkChild`, `Effect.forkDetach`, `Schema.makeUnsafe`, `Result` module) is forbidden, see [references/anti-patterns/19-v4-syntax-do-not-use.md](references/anti-patterns/19-v4-syntax-do-not-use.md)
- *`fp-ts`, `neverthrow`, or RxJS codebases that do not plan to adopt Effect* — only the migration/ docs apply
- *Plain TypeScript without Effect, or other functional ecosystems (cats, ZIO)*

## Hard Rules (load-bearing — read before coding)

| Rule | Recovery |
|---|---|
| Do not import from `@effect/schema` — deprecated since 3.10. Use `import { Schema } from "effect"` | [references/schema/20-deprecated-effect-schema.md](references/schema/20-deprecated-effect-schema.md) |
| Do not use v4 syntax: `ServiceMap.Service`, `Schema.TaggedErrorClass`, bare `Effect.catch`, `Effect.forkChild`, `Effect.forkDetach`, `Schema.makeUnsafe`, `Result` module | [references/anti-patterns/19-v4-syntax-do-not-use.md](references/anti-patterns/19-v4-syntax-do-not-use.md) |
| Do not `throw` inside `Effect.gen` — it becomes a defect. Use `return yield* new TaggedError({...})` or `Effect.fail(...)` | [references/anti-patterns/03-throw-in-gen.md](references/anti-patterns/03-throw-in-gen.md) |
| Do not write `yield fx` (no `*`) inside `Effect.gen` — yields the Effect object, not its value. Always `yield* fx` | [references/anti-patterns/02-yield-without-star.md](references/anti-patterns/02-yield-without-star.md) |
| Do not call `Effect.runPromise` / `Effect.runSync` inside library, service, or middleware code — only at program edges | [references/anti-patterns/04-runpromise-mid-code.md](references/anti-patterns/04-runpromise-mid-code.md), [references/anti-patterns/12-runsync-in-services.md](references/anti-patterns/12-runsync-in-services.md) |
| Do not call `Effect.all([...])` / `Effect.forEach(...)` / `Stream.mapEffect` without `{ concurrency: N }` on lists > 5 items | [references/anti-patterns/05-unbounded-parallelism.md](references/anti-patterns/05-unbounded-parallelism.md), [references/concurrency/07-bounded-parallelism.md](references/concurrency/07-bounded-parallelism.md) |
| Do not use `try / finally` for cleanup — bypasses interruption. Use `Effect.acquireRelease` or `Effect.ensuring` | [references/anti-patterns/15-manual-cleanup.md](references/anti-patterns/15-manual-cleanup.md) |
| Do not put `null` / `undefined` in domain types — use `Option` | [references/anti-patterns/10-null-undefined-domain.md](references/anti-patterns/10-null-undefined-domain.md) |
| Do not use `console.log` — use `Effect.log` / `logInfo` / `logError` | [references/anti-patterns/08-console-log.md](references/anti-patterns/08-console-log.md) |
| Do not read `process.env` directly — use `Config.string("X")` / `Config.redacted("X")` | [references/anti-patterns/09-process-env.md](references/anti-patterns/09-process-env.md) |
| Do not use `Option.getOrThrow` — use `Option.match` | [references/anti-patterns/11-option-getorthrow.md](references/anti-patterns/11-option-getorthrow.md) |
| Do not use `as never` / `as any` / `as unknown` to silence Effect type errors — find the real cause | [references/anti-patterns/17-type-assertions.md](references/anti-patterns/17-type-assertions.md) |
| Do not catch with `catchAll` when `catchTag` / `catchTags` would preserve narrowing | [references/anti-patterns/06-catchall-vs-catchtag.md](references/anti-patterns/06-catchall-vs-catchtag.md) |
| Do not invent generic error names (`NotFoundError`, `Error`) — use specific tagged errors (`UserNotFoundError`) so `catchTag` dispatches precisely | [references/anti-patterns/07-generic-error-types.md](references/anti-patterns/07-generic-error-types.md) |
| Do not call parameterized layer constructors inline at provide-sites — store layers in module-level constants for memoization | [references/anti-patterns/14-inline-layer-construction.md](references/anti-patterns/14-inline-layer-construction.md) |

For the full anti-pattern catalog, read [references/anti-patterns/01-overview.md](references/anti-patterns/01-overview.md).

## Default Stance (load-bearing)

- **Default to `Effect.Service`** over `Context.Tag` for business services. Use `Context.Tag` for libraries with multiple implementations and for infrastructure with runtime injection (worker bindings, KV).
- **Default to `Schema.TaggedError`** over `Data.TaggedError`. The Schema form is serializable across RPC / HTTP and integrates with `HttpApiSchema.annotations({ status: 404 })`.
- **Default to `import { Schema } from "effect"`**. The `@effect/schema` package is deprecated since 3.10. The migration is import-only.
- **Default to `Effect.fn("Service.method")`** for named functions to gain automatic span tracing and stack traces.
- **Default to `Effect.gen`** for sequential / branching logic; default to `pipe` for linear transformations.
- **Default to `{ concurrency: N }`** on every `Effect.all` / `Effect.forEach` / `Stream.mapEffect` over a list of more than five items.
- **Default to `Layer.provideMerge`** over `Layer.provide` for incremental composition (consumers can also use the merged service). Use `Layer.mergeAll` for flat composition of independent layers.
- **Default to `NodeRuntime.runMain`** for entry points (handles SIGINT / SIGTERM gracefully). Use `ManagedRuntime` for non-Effect framework integration (Hono, Express, Next.js route handlers).
- **Default to `acquireRelease`** for resource lifecycles, never `try / finally` (which bypasses interruption).
- **Default to `return yield*`** when raising tagged errors inside `Effect.gen` so TypeScript narrows the control flow.

## Recovery Moves (symptom → fix)

| Symptom | Cause / fix |
|---|---|
| `Missing 'X' in the expected Effect context` / `Effect not assignable to Effect` | confused `Layer.provide` for `Layer.provideMerge` — see [references/services-layers/12-layer-composition-gotchas.md](references/services-layers/12-layer-composition-gotchas.md), [references/anti-patterns/13-layer-provide-confusion.md](references/anti-patterns/13-layer-provide-confusion.md) |
| `Effect.cachedWithTTL is not a function` / unexpected double-yield | API returns `Effect>`; you yield twice — see [references/caching/04-effect-cached.md](references/caching/04-effect-cached.md) |
| `SubscriptionRef.unsafeMake is not a function` | never call unsafeMake; use `SubscriptionRef.make(initial)` — see [references/state/04-subscription-ref.md](references/state/04-subscription-ref.md) |
| AI hallucinated an API that doesn't exist | cross-check [references/anti-patterns/18-ai-hallucinations.md](references/anti-patterns/18-ai-hallucinations.md) and [references/anti-patterns/19-v4-syntax-do-not-use.md](references/anti-patterns/19-v4-syntax-do-not-use.md) |
| Effect resolved with `null` unexpectedly | `Effect.promise` swallowed the error as a defect — switch to `Effect.tryPromise({ try, catch })`, see [references/anti-patterns/16-effect-promise-confusion.md](references/anti-patterns/16-effect-promise-confusion.md) |
| Tests pass with mocks but fail in prod | mocks were `vi.mock`. Replace with `Layer.succeed(Service, mockImpl)` — see [references/testing/08-test-layers.md](references/testing/08-test-layers.md) |
| Hanging Stream / never-ending program | infinite stream without `take(N)` / `runHead` — see [references/streams/18-infinite-streams.md](references/streams/18-infinite-streams.md) |
| OOM on large `Effect.all` | unbounded parallelism — add `{ concurrency: 10 }`, see [references/concurrency/07-bounded-parallelism.md](references/concurrency/07-bounded-parallelism.md) |
| Finalizers not running on Ctrl-C | using `try / finally` instead of `acquireRelease`, or `Effect.runPromise` instead of `NodeRuntime.runMain` — see [references/resource-management/03-acquire-release.md](references/resource-management/03-acquire-release.md), [references/platform/12-node-runtime.md](references/platform/12-node-runtime.md) |
| Stale logs / no traces in OTel | forgot `NodeSdk.layer` and `OtlpTracer.layer` — see [references/observability/11-opentelemetry-setup.md](references/observability/11-opentelemetry-setup.md) |
| Header keys returned 404 | header keys must be lowercase in `HttpApiEndpoint.setHeaders` — see [references/http-server/05-headers.md](references/http-server/05-headers.md) |
| `Cannot find module '@effect/schema'` | deprecated package; switch to `import { Schema } from "effect"` — see [references/schema/20-deprecated-effect-schema.md](references/schema/20-deprecated-effect-schema.md) |

## Workflow / Routing

Load only the reference files needed for the current task.

### 1. Core: the Effect type, creation, running, combinators

Read [references/core/01-effect-type.md](references/core/01-effect-type.md), [references/core/02-creating-effects.md](references/core/02-creating-effects.md), [references/core/03-running-effects.md](references/core/03-running-effects.md), [references/core/04-pipelines.md](references/core/04-pipelines.md), [references/core/05-generators.md](references/core/05-generators.md), [references/core/06-gen-vs-pipe.md](references/core/06-gen-vs-pipe.md). For named service methods read [references/core/07-effect-fn.md](references/core/07-effect-fn.md). For combinators read [references/core/08-effect-all.md](references/core/08-effect-all.md), [references/core/09-effect-foreach.md](references/core/09-effect-foreach.md), [references/core/10-zip-and-tap.md](references/core/10-zip-and-tap.md), [references/core/11-short-circuiting.md](references/core/11-short-circuiting.md), [references/core/12-effect-match.md](references/core/12-effect-match.md).

### 2. Errors: typed tagged errors

Read [references/error-handling/01-overview.md](references/error-handling/01-overview.md), [references/error-handling/02-data-tagged-error.md](references/error-handling/02-data-tagged-error.md), [references/error-handling/03-schema-tagged-error.md](references/error-handling/03-schema-tagged-error.md), [references/error-handling/04-catch-tag.md](references/error-handling/04-catch-tag.md), [references/error-handling/05-catch-tags.md](references/error-handling/05-catch-tags.md), [references/error-handling/06-catch-all.md](references/error-handling/06-catch-all.md), [references/error-handling/07-cause-and-exit.md](references/error-handling/07-cause-and-exit.md), [references/error-handling/08-defects.md](references/error-handling/08-defects.md), [references/error-handling/09-recovery-patterns.md](references/error-handling/09-recovery-patterns.md), [references/error-handling/10-error-accumulation.md](references/error-handling/10-error-accumulation.md), [references/error-handling/11-yield-fail-pattern.md](references/error-handling/11-yield-fail-pattern.md), [references/error-handling/12-error-taxonomy.md](references/error-handling/12-error-taxonomy.md), [references/error-handling/13-error-remapping.md](references/error-handling/13-error-remapping.md), [references/error-handling/14-sandboxing.md](references/error-handling/14-sandboxing.md).

### 3. Services and Layers: dependencies

Read [references/services-layers/01-overview.md](references/services-layers/01-overview.md), [references/services-layers/02-context-tag.md](references/services-layers/02-context-tag.md), [references/services-layers/03-effect-service.md](references/services-layers/03-effect-service.md), [references/services-layers/04-context-vs-effect-service.md](references/services-layers/04-context-vs-effect-service.md), [references/services-layers/05-context-reference.md](references/services-layers/05-context-reference.md), [references/services-layers/06-layer-succeed.md](references/services-layers/06-layer-succeed.md), [references/services-layers/07-layer-effect.md](references/services-layers/07-layer-effect.md), [references/services-layers/08-layer-scoped.md](references/services-layers/08-layer-scoped.md), [references/services-layers/09-layer-merge.md](references/services-layers/09-layer-merge.md), [references/services-layers/10-layer-provide.md](references/services-layers/10-layer-provide.md), [references/services-layers/11-layer-providemerge.md](references/services-layers/11-layer-providemerge.md), and the **critical** [references/services-layers/12-layer-composition-gotchas.md](references/services-layers/12-layer-composition-gotchas.md). Runtime: [references/services-layers/13-layer-memoization.md](references/services-layers/13-layer-memoization.md), [references/services-layers/14-managed-runtime.md](references/services-layers/14-managed-runtime.md), [references/services-layers/15-effect-provide.md](references/services-layers/15-effect-provide.md), [references/services-layers/16-layer-tap-debug.md](references/services-layers/16-layer-tap-debug.md), [references/services-layers/17-fresh-vs-memoize.md](references/services-layers/17-fresh-vs-memoize.md).

### 4. Schema: validate boundaries (built into `effect`)

Read [references/schema/01-overview.md](references/schema/01-overview.md), [references/schema/02-schema-struct.md](references/schema/02-schema-struct.md), [references/schema/03-schema-class.md](references/schema/03-schema-class.md), [references/schema/04-schema-tagged-class.md](references/schema/04-schema-tagged-class.md), [references/schema/05-schema-tagged-error.md](references/schema/05-schema-tagged-error.md), [references/schema/06-branded-types.md](references/schema/06-branded-types.md), [references/schema/07-primitives.md](references/schema/07-primitives.md), [references/schema/08-collections.md](references/schema/08-collections.md), [references/schema/09-unions-and-literals.md](references/schema/09-unions-and-literals.md), [references/schema/10-decoding.md](references/schema/10-decoding.md), [references/schema/11-encoding.md](references/schema/11-encoding.md), [references/schema/12-transforms.md](references/schema/12-transforms.md), [references/schema/13-filters.md](references/schema/13-filters.md), [references/schema/14-annotations.md](references/schema/14-annotations.md), [references/schema/15-json-schema.md](references/schema/15-json-schema.md), [references/schema/16-arbitrary.md](references/schema/16-arbitrary.md), [references/schema/17-equivalence-and-order.md](references/schema/17-equivalence-and-order.md), [references/schema/18-recursive-schemas.md](references/schema/18-recursive-schemas.md), [references/schema/19-error-formatter.md](references/schema/19-error-formatter.md), and the migration banner [references/schema/20-deprecate

…

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [yigitkonur](https://github.com/yigitkonur)
- **Source:** [yigitkonur/skills-by-yigitkonur](https://github.com/yigitkonur/skills-by-yigitkonur)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** yes
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-yigitkonur-skills-by-yigitkonur-build-effect-ts-v3
- Seller: https://agentstack.voostack.com/s/yigitkonur
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
