Skills redux-saga

install
source · Clone the upstream repo
git clone https://github.com/openclaw/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/anivar/redux-saga-skill" ~/.claude/skills/clawdbot-skills-redux-saga && rm -rf "$T"
manifest: skills/anivar/redux-saga-skill/SKILL.md
source content

Redux-Saga

IMPORTANT: Your training data about

redux-saga
may be outdated or incorrect — API behavior, middleware setup patterns, and RTK integration have changed. Always rely on this skill's rule files and the project's actual source code as the source of truth. Do not fall back on memorized patterns when they conflict with the retrieved reference.

When to Use Redux-Saga

Sagas are for workflow orchestration — complex async flows with concurrency, cancellation, racing, or long-running background processes. For simpler patterns, prefer:

NeedRecommended Tool
Data fetching + cachingRTK Query
Simple async (submit → status)
createAsyncThunk
Reactive logic within slices
createListenerMiddleware
Complex workflows, parallel tasks, cancellation, channelsRedux-Saga

Rule Categories by Priority

PriorityCategoryImpactPrefix
1Effects & YieldingCRITICAL
effect-
2Fork Model & ConcurrencyCRITICAL
fork-
3Error HandlingHIGH
error-
4Recipes & PatternsMEDIUM
recipe-
5Channels & External I/OMEDIUM
channel-
6RTK IntegrationMEDIUM
rtk-
7TroubleshootingLOW
troubleshoot-

Quick Reference

1. Effects & Yielding (CRITICAL)

  • effect-always-yield
    — Every effect must be yielded; missing yield freezes the app
  • effect-use-call
    — Use
    yield call()
    for async functions; never call directly
  • effect-take-concurrency
    — Choose
    takeEvery
    /
    takeLatest
    /
    takeLeading
    based on concurrency needs
  • effect-select-usage
    — Use selector functions with
    select()
    ; never access state paths directly
  • effect-race-patterns
    — Use
    race
    for timeouts and cancellation; only blocking effects inside

2. Fork Model & Concurrency (CRITICAL)

  • fork-attached-vs-detached
    fork
    shares lifecycle/errors with parent;
    spawn
    is independent
  • fork-error-handling
    — Errors from forks bubble to parent's caller; can't catch at fork site
  • fork-no-race
    — Never use
    fork
    inside
    race
    ; fork is non-blocking and always wins
  • fork-nonblocking-login
    — Use fork+take+cancel for auth flows that stay responsive to logout

3. Error Handling (HIGH)

  • error-saga-cleanup
    — Use
    try/finally
    with
    cancelled()
    for proper cancellation cleanup
  • error-root-saga
    — Use
    spawn
    in root saga for error isolation; avoid
    all
    for critical watchers

4. Recipes & Patterns (MEDIUM)

  • recipe-throttle-debounce
    — Rate-limiting with
    throttle
    ,
    debounce
    ,
    retry
    , exponential backoff
  • recipe-polling
    — Cancellable polling with error backoff using fork+take+cancel
  • recipe-optimistic-update
    — Optimistic UI with undo using race(undo, delay)

5. Channels & External I/O (MEDIUM)

  • channel-event-channel
    — Bridge WebSockets, DOM events, timers into sagas via
    eventChannel
  • channel-action-channel
    — Buffer Redux actions for sequential or worker-pool processing

6. RTK Integration (MEDIUM)

  • rtk-configure-store
    — Integrate saga middleware with RTK's
    configureStore
    without breaking defaults
  • rtk-with-slices
    — Use action creators from
    createSlice
    for type-safe saga triggers

7. Troubleshooting (LOW)

  • troubleshoot-frozen-app
    — Frozen apps, missed actions, bad stack traces, TypeScript yield types

Effect Creators Quick Reference

EffectBlockingPurpose
take(pattern)
YesWait for matching action
takeMaybe(pattern)
YesLike
take
, receives
END
takeEvery(pattern, saga)
NoConcurrent on every match
takeLatest(pattern, saga)
NoCancel previous, run latest
takeLeading(pattern, saga)
NoIgnore until current completes
put(action)
NoDispatch action
putResolve(action)
YesDispatch, wait for promise
call(fn, ...args)
YesCall, wait for result
apply(ctx, fn, [args])
YesCall with context
cps(fn, ...args)
YesNode-style callback
fork(fn, ...args)
NoAttached fork
spawn(fn, ...args)
NoDetached fork
join(task)
YesWait for task
cancel(task)
NoCancel task
cancel()
NoSelf-cancel
select(selector)
YesQuery store state
actionChannel(pattern)
NoBuffer actions
flush(channel)
YesDrain buffered messages
cancelled()
YesCheck cancellation in
finally
delay(ms)
YesPause execution
throttle(ms, pattern, saga)
NoRate-limit
debounce(ms, pattern, saga)
NoWait for silence
retry(n, delay, fn)
YesRetry with backoff
race(effects)
YesFirst wins
all([effects])
YesParallel, wait all
setContext(props)
/
getContext(prop)
No / YesSaga context

Pattern Matching

take
,
takeEvery
,
takeLatest
,
takeLeading
,
throttle
,
debounce
accept:

PatternMatches
'*'
or omitted
All actions
'ACTION_TYPE'
Exact
action.type
match
[type1, type2]
Any type in array
fn => boolean
Custom predicate

How to Use

Read individual rule files for detailed explanations and code examples:

rules/effect-always-yield.md
rules/fork-attached-vs-detached.md

Each rule file contains:

  • Brief explanation of why it matters
  • Incorrect code example with explanation
  • Correct code example with explanation
  • Additional context and decision tables

References

PriorityReferenceWhen to read
1
references/effects-and-api.md
Writing or debugging any saga
2
references/fork-model.md
Concurrency, error propagation, cancellation
3
references/testing.md
Writing or reviewing saga tests
4
references/channels.md
External I/O, buffering, worker pools
5
references/recipes.md
Throttle, debounce, retry, undo, batching, polling
6
references/anti-patterns.md
Common mistakes to avoid
7
references/troubleshooting.md
Debugging frozen apps, missed actions, stack traces

Full Compiled Document

For the complete guide with all rules expanded:

AGENTS.md