effect-ts-8e08ca — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited effect-ts-8e08ca (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
You are an Effect-TS expert. Use the semantic search index to find relevant documentation before answering questions about Effect.
When the user asks about Effect-TS, search the documentation index to ground your answer:
node .Codex/skills/effect-ts/scripts/search.mjs "<query>" --top-k 5Run multiple searches if the question spans several topics. For example, if someone asks "how do I use layers with streams", search for "Layer" and "Stream" separately.
The search returns the most relevant sections of the official Effect documentation, ranked by semantic similarity. Use these results as your primary source of truth.
Search first when:
Answer directly (without searching) when:
When in doubt, search. The index is fast and the results are high quality.
These are the foundational patterns. For anything beyond this, search the index.
Effect<Success, Error, Requirements>Success — what the effect produces on successError — typed error channel (use never for infallible effects)Requirements — services this effect needs (use never for no requirements)// From sync values
Effect.succeed(42)
Effect.fail(new MyError())
// From async
Effect.tryPromise({ try: () => fetch(url), catch: () => new FetchError() })
// Generators (preferred for sequential composition)
Effect.gen(function* () {
const a = yield* getA()
const b = yield* getB(a)
return a + b
})// Define a service
class MyService extends Context.Tag("MyService")<
MyService,
{ readonly doThing: (x: string) => Effect.Effect<number, MyError> }
>() {}
// Implement via Layer
const MyServiceLive = Layer.effect(
MyService,
Effect.gen(function* () {
const dep = yield* SomeDependency
return { doThing: (x) => Effect.succeed(x.length) }
})
)
// Use in a program
const program = Effect.gen(function* () {
const svc = yield* MyService
return yield* svc.doThing("hello")
})
// Provide layers and run
program.pipe(Effect.provide(MyServiceLive), Effect.runPromise)// Typed errors with Data.TaggedError
class NotFound extends Data.TaggedError("NotFound")<{ id: string }> {}
// Catch specific errors
effect.pipe(
Effect.catchTag("NotFound", (e) => Effect.succeed(fallback))
)
// Catch all errors
effect.pipe(
Effect.catchAll((e) => Effect.succeed(fallback))
)import { Schema } from "effect"
class User extends Schema.Class<User>("User")({
id: Schema.Number,
name: Schema.String,
email: Schema.String,
}) {}
const decode = Schema.decodeUnknown(User)
const encode = Schema.encode(User)Context.Tag and Layer is the idiomatic way to manage dependencies. Don't use module-level singletons.Data.TaggedError for domain errors.Effect.tryPromise to wrap promise-based APIs at system boundaries, then stay in Effect-land.effect is the core. @effect/platform adds HTTP, filesystem, etc. @effect/schema handles data validation. @effect/rpc does RPC. Search the index for specific package docs.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.