| name | effect-deslopify-idiomatic |
| description | Audit and remediate Effect code to idiomatic standards. Chains SDD audit methodology with Effect best practices to systematically identify and fix non-idiomatic patterns. USE THIS SKILL WHEN: 'deslopify', 'make this idiomatic effect', 'audit effect quality', 'is this good effect code', 'library-grade effect'. |
| version | 1.0.0 |
Effect Deslopify (Idiomatic Remediation)
Systematic audit and remediation of Effect-TS code to library-grade idiomatic standards.
Companion skills (install separately): effectts (pattern reference), sdd (methodology). These provide the pattern reference and methodology this skill orchestrates.
Target
Apply to any Effect-TS codebase, package, or file path.
Mission
- De-slopify the target
- Make code library-grade idiomatic Effect
- Keep behavior stable unless fixing a confirmed bug
Workflow
1. Audit (SDD Phases 1-4)
Run SDD audit mode across phases 1-4 on the target.
2. Gap Analysis
Produce a gap list covering:
- Schema modeling (bare brands, missing constraints, manual mappers)
- Service boundaries (wrong abstraction level, god services)
- Error channels (silent swallowing, wrong error types)
- Layer wiring (missing deps, provide vs provideMerge)
- Purity violations (impure ops outside Effect tracking)
- Exhaustiveness (switch instead of Match.exhaustive)
- Test coverage (missing property tests, bun scripts)
3. Decide: Remediate or Rewrite
For each gap:
- Remediate if architecture is sound and gaps are localized
- Rewrite only if architecture is unsalvageable (majority of phases FAIL)
4. Implement Fixes
Implement highest-impact fixes. Priority order:
- Bugs (incorrect behavior, discarded Effect values)
- Schema constraints (bare brands, missing validation)
- Error modeling (Data.TaggedError -> Schema.TaggedError)
- Service patterns (Effect.fn, annotateLogs)
- Test gaps (property tests, vitest conversion)
5. Regression Tests
Add/keep regression tests for bug fixes (TDD: failing test first, then fix).
6. Verify Gates
Run all applicable gates:
- Your project's typecheck command (e.g.
npx tsc --noEmit or pnpm check)
npx effect-language-service quickfixes --project tsconfig.json (if configured)
- Relevant test suites
Idiomatic Constraints
These are non-negotiable for library-grade Effect code:
| Constraint | Why |
|---|
No as any | Type escapes hide real errors |
No silent catchAll error swallowing | Errors must be logged or propagated |
No raw fetch when typed client exists | Duplicating URLs loses type safety |
| No ad-hoc mutable state in Effect paths | Use Ref for tracked state |
Impure ops wrapped in Effect.sync / Effect APIs | Effect must track all side effects |
Match.exhaustive not switch | Compile-time case coverage |
| Errors modeled explicitly | Schema.TaggedError with typed channels |
Effect.fn on all service methods | Automatic tracing spans |
Effect.annotateLogs per service module | Structured observability |
yield* new TaggedError() in generators | Not Effect.fail(new TaggedError()) |
Before / After Examples
Bare Brand -> Constrained Brand
const UserId = Schema.String.pipe(Schema.brand("UserId"))
const UserId = Schema.NonEmptyString.pipe(
Schema.pattern(/^usr_[a-z0-9]+$/),
Schema.brand("UserId")
)
Manual Tracing -> Effect.fn
findById: (id: UserId) =>
sql`SELECT * FROM users WHERE id = ${id}`.pipe(
Effect.flatMap(rows => decode(rows[0])),
Effect.withSpan("UserRepo.findById"),
),
findById: Effect.fn("UserRepo.findById")(function*(id: UserId) {
const rows = yield* sql`SELECT * FROM users WHERE id = ${id}`
if (rows.length === 0) return yield* new UserNotFound({ userId: id })
return yield* Schema.decodeUnknown(User)(rows[0])
}),
Silent Error Swallowing -> Explicit Handling
const result = yield* dangerousOp.pipe(
Effect.catchAll(() => Effect.succeed(fallback))
)
const result = yield* dangerousOp.pipe(
Effect.tapError((e) => Effect.logWarning("Falling back", { error: e })),
Effect.catchAll(() => Effect.succeed(fallback))
)
Output
After running deslopify, report:
- Changed files (with summary of what changed)
- Anti-patterns removed (count by category)
- Test/gate results (pass/fail)
- Residual risks + follow-ups (anything not fixed in this pass)