resonate-defaults — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited resonate-defaults (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.
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.
Trigger this skill when the question is about a default value, especially:
ctx.run retry by default?"ttl / group / target?"Exponential() default to without arguments?"RESONATE_URL if I do not set it?"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.
When the canonical page does not answer the question, read these files directly. Do not guess or deflect.
resonatehq/resonate-sdk-ts)src/options.ts — per-call Options defaults (timeout, target, tags, version, nonRetryableErrors, etc.)src/retries.ts — Exponential, Constant, Linear, Never constructor defaultssrc/resonate.ts — init defaults (group, ttl, pid, verbose, logLevel, prefix, url resolution)src/network/http.ts — HttpNetwork defaults (request timeout, URL fallback)src/context.ts — runtime resolution that picks Exponential for regular functions vs Never for generator functionsresonatehq/resonate-sdk-py)resonate/options.py — Options dataclass defaultsresonate/retry_policies/exponential.py, constant.py, linear.py, never.py — retry-policy constructor defaultsresonate/resonate.py — init defaults (group, ttl, pid, log_level, env-var resolution)resonate/processor.py — workers cap (min(32, workers or os.cpu_count() or 1))resonatehq/resonate-sdk-rs)resonate/src/options.rs — Options struct defaults (note: no per-call retry_policy field)resonate/src/resonate.rs — init defaults (group, ttl, pid, env-var resolution)resonatehq/resonate-sdk-go)Tagged 0.1.0 (the tag has no v prefix — go get github.com/resonatehq/[email protected] to pin it; @latest does not resolve to the tag). Values verified against the 0.1.0 tag source. The canonical doc-page summary lives in the Go SDK skill guide § Defaults.
resonate.go — Config defaults (TTL 60s, AsyncHeartbeat, NoopEncryptor, empty Prefix), New network resolution (URL → Network → RESONATE_URL → ErrNetworkRequired), DefaultTopLevelTimeout, DefaultRetryPolicycontext.go — child-call defaults (DefaultChildTimeout), RunOpts/RPCOpts/PromiseOpts/DetachedOptsConstantRetry, LinearRetry, ExponentialRetry, NoRetry) and NewNonRetryablehttpnet/http.go — HTTPOptions{Group} (the default group is "default"); groups are set on the transport, not on Configpromises.go / schedules.go — the direct Promises / Schedules sub-clients (PromiseCreateOptions, ScheduleCreateOptions, DefaultTopLevelTimeout as their timeout fallback)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.
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.
| Policy | TypeScript default | Python default | Rust | Go |
|---|---|---|---|---|
Exponential delay / Base | 1000 ms | 1 sec | not exposed | Base 100ms (in DefaultRetryPolicy) |
Exponential factor | 2 | 2 | not exposed | ×2 (implicit) |
Exponential maxRetries / MaxAttempts | Number.MAX_SAFE_INTEGER | sys.maxsize | not exposed | `MaxAttempts: 3` (bounded) |
Exponential maxDelay / Max | 30_000 ms | 30 sec | not exposed | Max 30s |
Constant delay / Delay | 1000 ms | 1 sec | not exposed | required field (ConstantRetry{MaxAttempts, Delay}) |
Constant maxRetries / MaxAttempts | Number.MAX_SAFE_INTEGER | sys.maxsize | not exposed | required field |
Linear delay / Base | 1000 ms | 1 sec | not exposed | required field (LinearRetry{MaxAttempts, Base}) |
Linear maxRetries / MaxAttempts | Number.MAX_SAFE_INTEGER | sys.maxsize | not exposed | required field |
Never / NoRetry | no parameters | no parameters | not exposed | NoRetry (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| Field | TypeScript | Python | Rust | Go |
|---|---|---|---|---|
id | undefined (auto) | None (auto) | n/a (struct does not carry it) | n/a (passed to Run/RPC, not the opts struct) |
timeout | 86_400_000 ms = 24 h | 31_536_000 sec = 1 year | Duration::from_secs(86_400) = 24 h | DefaultChildTimeout / DefaultTopLevelTimeout = 24 h (time.Duration) |
target | "default" | "default" | "default" | configured group ("default") |
tags | {} | {} | empty HashMap | nil map |
version | 0 | 0 | 0 | reserved, not yet consumed (issue #5) |
retryPolicy / retry_policy / RetryPolicy | resolved at call time: Exponential() for regular fn, Never() for generator fn | lambda 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/a | via resonate.NewNonRetryable(err) wrapper |
durable | n/a | True | n/a | n/a |
idempotency_key | n/a | lambda id: id (identity) | n/a | n/a |
encoder / Encryptor | n/a | None | n/a | NoopEncryptor (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}).
new Resonate() / Resonate() / Resonate::local() / resonate.New(Config{}))| Field | TypeScript | Python | Rust | Go |
|---|---|---|---|---|
group | "default" | "default" | "default" | "default" (set on the transport via httpnet.HTTPOptions{Group}, NOT on Config) |
ttl | 60_000 ms = 60 sec | 10 sec | 60_000 ms (remote) / u64::MAX (local) | 60s (Config.TTL, a time.Duration) |
pid | random UUID | uuid.uuid4().hex | "default" (local) / from network (remote) | from network (localnet.NewLocal takes an explicit *pid) |
verbose / log_level | verbose=false, logLevel="warn" | logging.INFO | n/a | n/a |
prefix | RESONATE_PREFIX or empty | n/a | RESONATE_PREFIX or empty | Config.Prefix (empty; not read from env) |
heartbeat | n/a | n/a | n/a | AsyncHeartbeat at TTL/2 (use NoopHeartbeat{} with localnet) |
workers / concurrency cap | none (event loop) | min(32, workers or os.cpu_count() or 1) | none (Tokio runtime) | none (goroutines) |
| HTTP request timeout | RESONATE_TIMEOUT or 10_000 ms | n/a | n/a | n/a |
| HTTP URL fallback | "http://localhost:8001" | derived from scheme/host/port | derived from scheme/host/port | none — URL→Network→RESONATE_URL, else ErrNetworkRequired |
| Env var | Default when unset |
|---|---|
RESONATE_URL | unset → 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_HOST | unset (Py + Rs only — TS does not consume it) |
RESONATE_SCHEME | "http" (Py + Rs) |
RESONATE_PORT | "8001" (Py + Rs) |
RESONATE_TOKEN | unset |
RESONATE_USERNAME | unset (Py only) |
RESONATE_PASSWORD | "" (Py only) |
RESONATE_PREFIX | unset → empty (TS + Rs) |
RESONATE_TIMEOUT | 10_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.
| Flag | Default |
|---|---|
--server-host | localhost |
--server-port | 8001 |
--server-bind | 0.0.0.0 |
--level | info |
--storage-type | sqlite |
--storage-postgres-pool-size | 10 |
--storage-mysql-pool-size | 10 |
--tasks-lease-timeout | 15_000 ms |
--tasks-retry-timeout | 30_000 ms (most deployments lower this to 500 ms) |
--observability-metrics-port | 9090 (0 disables) |
--transports-http-push-enabled | true |
--transports-http-poll-enabled | true |
--transports-gcps-enabled | false |
--transports-bash-exec-enabled | false |
--transports-http-push-auth-mode | none |
--transports-http-push-auth-header | Authorization |
The defaults look like they line up across SDKs. They do not. Flag these explicitly when answering:
Options.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.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.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.r.Promises().Resolve/Reject/Cancel/Create/Get and r.Schedules().Create/Get/Delete are real methods now — prefer them over the CLI, the server HTTP API, or the low-level r.Sender().PromiseSettle (that low-level path still requires manual JSON→base64→quoted-string Value encoding; the sub-client methods do it for you via the instance's Codec). The remaining Go gap is a top-level resonate.Schedule(id, cron, fn, args) convenience wrapper that dispatches a registered function by name on a cron — Python, TypeScript, and Rust all have one; Go's Schedules().Create only creates the underlying cron-fired promise, so dispatching a registered function through it means setting the resonate:target tag and {"func":...,"args":...} param shape by hand.31_536_000 seconds). Same field, drastically different upper bound.60_000 ms (= 60 s). Python = 10 sec. Same name, different unit and different value.--tasks-retry-timeout flag, not by anything on Options. This is a known asymmetry — do not assume Rust mirrors TS/Py here.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.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:
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.
Two quick checks before you cite a number:
Duration is the only place this gets nuanced).~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.