agentsclimarketplace

Resonate defaults

Skill resonatehq/resonate-skills/resonate-defaults

Agent skills for building with Resonate — durable execution for long-running, crash-safe workflows.

Install
npx -y skills add resonatehq/resonate-skills --skill resonate-defaults

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 5 stars5 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Look up default values across the Resonate server and SDKs (TypeScript, Python, Rust, Go). Use when answering "what is the default for X?" — retry policies, ctx.run timeouts, Options fields, init parameters, server flags, or RESONATE_* environment variables. Directs to the canonical defaults reference and the per-SDK source files; do not deflect to "check the SDK source" — read the source listed here.

The file declares its own license as Apache-2.0. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.

SKILL.md

14.8 KB, as published. Nobody here has run it

Resonate Defaults

Overview

Use this skill when an agent (or user) needs to answer a "what is the default for X in Resonate?" question. The canonical reference page lives at:

That page is the single source of truth — every value below mirrors it. If the canonical page and this skill disagree, the canonical page wins and this skill is stale.

The skill carries a quick-lookup table so an agent can answer common questions in one hop. For anything not in the table, read the canonical page or the source files listed under Source-of-truth files.

When to use this skill

Trigger this skill when the question is about a default value, especially:

  • "What does ctx.run retry by default?"
  • "What is the default timeout for a durable function?"
  • "What is the default ttl / group / target?"
  • "What does Exponential() default to without arguments?"
  • "What is RESONATE_URL if I do not set it?"
  • "What is the default Resonate server port / log level / storage backend?"
  • Any "I called the constructor / Options(...) / Exponential(...) with no args — what did I get?"

If the question is how to configure something (versus what the default is), reach for the relevant resonate-basic-* or resonate-server-deployment skill instead.

Source-of-truth files

When the canonical page does not answer the question, read these files directly. Do not guess or deflect.

TypeScript SDK (resonatehq/resonate-sdk-ts)

  • src/options.ts — per-call Options defaults (timeout, target, tags, version, nonRetryableErrors, etc.)
  • src/retries.tsExponential, Constant, Linear, Never constructor defaults
  • src/resonate.ts — init defaults (group, ttl, pid, verbose, logLevel, prefix, url resolution)
  • src/network/http.tsHttpNetwork defaults (request timeout, URL fallback)
  • src/context.ts — runtime resolution that picks Exponential for regular functions vs Never for generator functions

Python SDK (resonatehq/resonate-sdk-py)

  • resonate/options.pyOptions dataclass defaults
  • resonate/retry_policies/exponential.py, constant.py, linear.py, never.py — retry-policy constructor defaults
  • resonate/resonate.py — init defaults (group, ttl, pid, log_level, env-var resolution)
  • resonate/processor.pyworkers cap (min(32, workers or os.cpu_count() or 1))

Rust SDK (resonatehq/resonate-sdk-rs)

  • resonate/src/options.rsOptions struct defaults (note: no per-call retry_policy field)
  • resonate/src/resonate.rs — init defaults (group, ttl, pid, env-var resolution)

Go SDK (resonatehq/resonate-sdk-go)

Pre-release — no semver tag yet; values verified against develop/go.mdx and the SDK at commit 22076134651f. The canonical doc-page summary lives in the Go SDK skill guide § Defaults.

  • resonate.goConfig defaults (TTL 60s, AsyncHeartbeat, NoopEncryptor, empty Prefix), New network resolution (URLNetworkRESONATE_URLErrNetworkRequired), DefaultTopLevelTimeout, DefaultRetryPolicy
  • context.go — child-call defaults (DefaultChildTimeout), RunOpts/RPCOpts/PromiseOpts/DetachedOpts
  • the retry-policy types (ConstantRetry, LinearRetry, ExponentialRetry, NoRetry) and NewNonRetryable
  • httpnet/http.goHTTPOptions{Group} (the default group is "default"); groups are set on the transport, not on Config

Server (resonatehq/resonate)

Server flag defaults are mirrored on the operator-facing page https://docs.resonatehq.io/deploy/run-server#configuration until iter-65 lands file:line citations from the server crate.

Quick-lookup table

The values below mirror the canonical page. If you cite from this table, the value is current as of the canonical page's last update; if the question is high-stakes, double-check by visiting the canonical URL.

Retry policies (per-call options)

PolicyTypeScript defaultPython defaultRustGo
Exponential delay / Base1000 ms1 secnot exposedBase 100ms (in DefaultRetryPolicy)
Exponential factor22not exposed×2 (implicit)
Exponential maxRetries / MaxAttemptsNumber.MAX_SAFE_INTEGERsys.maxsizenot exposedMaxAttempts: 3 (bounded)
Exponential maxDelay / Max30_000 ms30 secnot exposedMax 30s
Constant delay / Delay1000 ms1 secnot exposedrequired field (ConstantRetry{MaxAttempts, Delay})
Constant maxRetries / MaxAttemptsNumber.MAX_SAFE_INTEGERsys.maxsizenot exposedrequired field
Linear delay / Base1000 ms1 secnot exposedrequired field (LinearRetry{MaxAttempts, Base})
Linear maxRetries / MaxAttemptsNumber.MAX_SAFE_INTEGERsys.maxsizenot exposedrequired field
Never / NoRetryno parametersno parametersnot exposedNoRetry (no parameters)

Both TS and Py compute the n-th Exponential delay as min(delay * factor^attempt, maxDelay); Linear is delay * attempt; Never is 0 on attempt 0 and null/None after. Go's retry policies ARE exposed (unlike Rust) as the ConstantRetry / LinearRetry / ExponentialRetry / NoRetry structs implementing resonate.RetryPolicy, and Go's DefaultRetryPolicy is ExponentialRetry{MaxAttempts: 3, Base: 100ms, Max: 30s, Jitter: true} — a bounded 3-attempt default, the sharpest cross-SDK asymmetry (see below). Go durations are native time.Duration, never raw ms/sec.

ctx.run / per-call Options defaults

FieldTypeScriptPythonRustGo
idundefined (auto)None (auto)n/a (struct does not carry it)n/a (passed to Run/RPC, not the opts struct)
timeout86_400_000 ms = 24 h31_536_000 sec = 1 yearDuration::from_secs(86_400) = 24 hDefaultChildTimeout / DefaultTopLevelTimeout = 24 h (time.Duration)
target"default""default""default"configured group ("default")
tags{}{}empty HashMapnil map
version000reserved, not yet consumed (issue #5)
retryPolicy / retry_policy / RetryPolicyresolved at call time: Exponential() for regular fn, Never() for generator fnlambda f: Never() if isgeneratorfunction(f) else Exponential()no per-call retry policy (see asymmetries)has per-call RetryPolicy (like TS/Py); nil → DefaultRetryPolicy = ExponentialRetry{MaxAttempts: 3, ...}
nonRetryableErrors / non_retryable_exceptions[]()n/avia resonate.NewNonRetryable(err) wrapper
durablen/aTruen/an/a
idempotency_keyn/alambda id: id (identity)n/an/a
encoder / Encryptorn/aNonen/aNoopEncryptor (set on Config.Encryptor)

The short answer to "what does ctx.run retry by default in the TypeScript SDK?" is Exponential() (1 s base, ×2 factor, 30 s cap, effectively unbounded retries) for regular async functions, and Never() for generator functions. In Go the answer is different: DefaultRetryPolicy is bounded to 3 attempts (ExponentialRetry{MaxAttempts: 3, Base: 100ms, Max: 30s, Jitter: true}).

Init defaults (new Resonate() / Resonate() / Resonate::local() / resonate.New(Config{}))

FieldTypeScriptPythonRustGo
group"default""default""default""default" (set on the transport via httpnet.HTTPOptions{Group}, NOT on Config)
ttl60_000 ms = 60 sec10 sec60_000 ms (remote) / u64::MAX (local)60s (Config.TTL, a time.Duration)
pidrandom UUIDuuid.uuid4().hex"default" (local) / from network (remote)from network (localnet.NewLocal takes an explicit *pid)
verbose / log_levelverbose=false, logLevel="warn"logging.INFOn/an/a
prefixRESONATE_PREFIX or emptyn/aRESONATE_PREFIX or emptyConfig.Prefix (empty; not read from env)
heartbeatn/an/an/aAsyncHeartbeat at TTL/2 (use NoopHeartbeat{} with localnet)
workers / concurrency capnone (event loop)min(32, workers or os.cpu_count() or 1)none (Tokio runtime)none (goroutines)
HTTP request timeoutRESONATE_TIMEOUT or 10_000 msn/an/an/a
HTTP URL fallback"http://localhost:8001"derived from scheme/host/portderived from scheme/host/portnoneURLNetworkRESONATE_URL, else ErrNetworkRequired

Environment variables

Env varDefault when unset
RESONATE_URLunset → local in-memory mode in TS/Py/Rs; TS HttpNetwork falls back to "http://localhost:8001". Go is the exception: unset (with no Config.URL/Network) → ErrNetworkRequired, not a localhost fallback
RESONATE_HOSTunset (Py + Rs only — TS does not consume it)
RESONATE_SCHEME"http" (Py + Rs)
RESONATE_PORT"8001" (Py + Rs)
RESONATE_TOKENunset
RESONATE_USERNAMEunset (Py only)
RESONATE_PASSWORD"" (Py only)
RESONATE_PREFIXunset → empty (TS + Rs)
RESONATE_TIMEOUT10_000 ms (TS HTTP only)

Go reads ONLY RESONATE_URL from the environment. It does not consult RESONATE_HOST / RESONATE_PORT / RESONATE_SCHEME / RESONATE_TOKEN / RESONATE_PREFIX. Token, prefix, and group are set explicitly on Config (or, for group, on the transport). The single env hook is RESONATE_URL; if it (and Config.URL / Config.Network) is unset, resonate.New returns ErrNetworkRequired rather than falling back to localhost.

Server flag defaults (Rust binary)

FlagDefault
--server-hostlocalhost
--server-port8001
--server-bind0.0.0.0
--levelinfo
--storage-typesqlite
--storage-postgres-pool-size10
--storage-mysql-pool-size10
--tasks-lease-timeout15_000 ms
--tasks-retry-timeout30_000 ms (most deployments lower this to 500 ms)
--observability-metrics-port9090 (0 disables)
--transports-http-push-enabledtrue
--transports-http-poll-enabledtrue
--transports-gcps-enabledfalse
--transports-bash-exec-enabledfalse
--transports-http-push-auth-modenone
--transports-http-push-auth-headerAuthorization

Critical cross-SDK asymmetries

The defaults look like they line up across SDKs. They do not. Flag these explicitly when answering:

  • Time units differ. TypeScript expresses durations in milliseconds. Python expresses durations in seconds. Rust is mixedOptions.timeout is a Duration, but ttl is u64 milliseconds. Go uses native time.Duration everywhere (24 * time.Hour, 100 * time.Millisecond) — never a raw number. A naive copy-paste between SDKs is almost always wrong.
  • Go's default retry policy is BOUNDED. TS and Py default to effectively-unbounded retries (Number.MAX_SAFE_INTEGER / sys.maxsize). Go's DefaultRetryPolicy caps at MaxAttempts: 3. A Go workflow gives up after 3 attempts where the TS/Py equivalent would retry almost forever. This is load-bearing when porting — do not assume Go inherits the unbounded default.
  • Per-call retry policy: Go HAS one, Rust does NOT. Go's RunOptions/RunOpts carry a RetryPolicy field (like TS/Py); Rust has no per-call retry policy (server-side --tasks-retry-timeout governs it). Go is the TS/Py side of this split, not the Rust side.
  • Go has no Schedule API and no top-level promises sub-client (yet). External promise resolution (human-in-the-loop, webhooks) goes through the CLI (resonate promise resolve), the server HTTP API, or the low-level r.Sender().PromiseSettle (with manual JSON→base64→quoted-string Value encoding — issue #28); recurring work has no resonate.schedule(...) equivalent. Go and Python both lack schedule(); TS and Rust have it.
  • Options.timeout envelope. TypeScript and Rust default to 24 h. Python defaults to 1 year (31_536_000 seconds). Same field, drastically different upper bound.
  • ttl unit and value. TypeScript and Rust = 60_000 ms (= 60 s). Python = 10 sec. Same name, different unit and different value.
  • Retry-policy time units. TS retry-policy parameters are in milliseconds; Python's are in seconds. The curve shape is identical; the numbers are not.
  • Rust has no per-call retry_policy. Retry cadence for Rust workers is determined server-side by the --tasks-retry-timeout flag, not by anything on Options. This is a known asymmetry — do not assume Rust mirrors TS/Py here.
  • Worker concurrency cap. Only Python imposes one (min(32, workers or os.cpu_count() or 1)). TypeScript runs on the Node/Bun event loop; Rust runs on the user-supplied Tokio runtime. Neither caps task execution at the SDK layer.

Don't deflect — read the source

If a default is not in this skill and not on the canonical page, the correct response is to read the source file listed under Source-of-truth files. Do not answer with:

  • "check the SDK source"
  • "see the GitHub repo"
  • "consult the SDK documentation"

Those answers are the deflection pattern this skill exists to eliminate. The links above are the source. Fetch them and read.

If the canonical page itself is missing a value an agent needs, that is a gap in the canonical page — file it, do not paper over it.

Verifying the answer

Two quick checks before you cite a number:

  1. Unit check. If the SDK is Python and the number is in milliseconds, you are wrong. If the SDK is TypeScript and the number is in seconds, you are wrong (Rust Duration is the only place this gets nuanced).
  2. Asymmetry check. Before generalising a TS default to Python or Rust, re-read the asymmetries section above. Most cross-SDK questions have at least one trap.

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.