Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
302 commits
Select commit Hold shift + click to select a range
4fbf5a8
Simplify task usage patterns example
kingwill101 Mar 20, 2026
57b7e9a
Simplify getting started example bootstrap
kingwill101 Mar 20, 2026
a4086f6
Use StemClient in Redis producer examples
kingwill101 Mar 20, 2026
8a54516
Use StemClient in TLS producer examples
kingwill101 Mar 20, 2026
00786c2
Use StemClient in producer lab examples
kingwill101 Mar 20, 2026
afb9e8a
Add delayed enqueue support to task enqueuers
kingwill101 Mar 20, 2026
bcfe632
Simplify producer documentation snippets
kingwill101 Mar 20, 2026
91b6a6f
Use StemClient in enqueuer examples
kingwill101 Mar 20, 2026
ca0f92d
Use StemClient in publisher services
kingwill101 Mar 20, 2026
5bf5653
Use StemClient in task context enqueue example
kingwill101 Mar 20, 2026
860520a
Use StemClient in image API example
kingwill101 Mar 20, 2026
126f6ef
Simplify typed task docs snippet
kingwill101 Mar 20, 2026
70730a6
Use StemClient in routing parity publisher
kingwill101 Mar 20, 2026
160e52e
Simplify best practices docs snippet
kingwill101 Mar 20, 2026
935bd5b
Use StemClient in microservice enqueuer
kingwill101 Mar 20, 2026
5a08767
Generalize signing enqueue snippet
kingwill101 Mar 20, 2026
fcb9ab5
Generalize microservice autofill enqueuer
kingwill101 Mar 20, 2026
0d73d98
Use StemClient in encrypted container producer
kingwill101 Mar 20, 2026
3e4cf2a
Use StemClient in rate limit producer
kingwill101 Mar 20, 2026
bb21c3b
Use StemClient in dlq producer
kingwill101 Mar 20, 2026
9b9831e
Simplify routing bootstrap docs snippet
kingwill101 Mar 20, 2026
3670ed5
Simplify observability tracing snippet
kingwill101 Mar 20, 2026
8b9558b
Simplify otel metrics example bootstrap
kingwill101 Mar 20, 2026
a5dac11
Simplify production signing checklist snippet
kingwill101 Mar 20, 2026
0a71b11
Simplify persistence backend docs snippets
kingwill101 Mar 20, 2026
e3e5f0b
Simplify README task examples
kingwill101 Mar 20, 2026
e93854d
Use StemClient in mixed-cluster enqueuer
kingwill101 Mar 20, 2026
ed1c917
Simplify developer environment bootstrap
kingwill101 Mar 20, 2026
13d2932
Remove unused raw Stem demo helpers
kingwill101 Mar 20, 2026
d8a2a68
Use StemClient in unique-task example
kingwill101 Mar 20, 2026
11145b4
Simplify README unique task snippet
kingwill101 Mar 20, 2026
2b23229
Add StemClient canvas helper
kingwill101 Mar 20, 2026
faf2657
Remove client.stem example leak
kingwill101 Mar 20, 2026
9ded080
Clarify low-level runtime examples
kingwill101 Mar 20, 2026
ef0f685
Add task and group status helpers
kingwill101 Mar 20, 2026
d3b8192
Use status helpers in developer docs
kingwill101 Mar 20, 2026
b7b5c37
Simplify canvas pattern examples
kingwill101 Mar 20, 2026
c11dea5
Add StemApp workflow bootstrap helper
kingwill101 Mar 20, 2026
6453500
Auto-initialize custom canvas group IDs
kingwill101 Mar 20, 2026
d4a7e68
Add workflow run detail app helper
kingwill101 Mar 20, 2026
4342d20
Add workflow execute-run app helper
kingwill101 Mar 20, 2026
5a2c6a6
Add workflow run view app helpers
kingwill101 Mar 20, 2026
b9fabee
Add workflow manifest app helper
kingwill101 Mar 20, 2026
1746032
Add workflow module registration helper
kingwill101 Mar 20, 2026
9cbfab8
Add workflow rewind app helper
kingwill101 Mar 20, 2026
1bc8e88
Add workflow watcher app helper
kingwill101 Mar 20, 2026
271feb4
Add workflow due-run resume helper
kingwill101 Mar 20, 2026
993e503
Add workflow registration app helper
kingwill101 Mar 20, 2026
4ea1817
Add flow and script registration app helpers
kingwill101 Mar 20, 2026
dda2a48
Add custom workflow queue bootstrap options
kingwill101 Mar 20, 2026
c5a2346
Clarify workflow happy-path docs
kingwill101 Mar 20, 2026
56146a5
Refresh workflow docs snippets
kingwill101 Mar 20, 2026
3809337
Add bulk workflow registration app helpers
kingwill101 Mar 20, 2026
9b89b2d
Add bulk definition registration app helper
kingwill101 Mar 20, 2026
4c62a72
Document workflow queue and registration helpers
kingwill101 Mar 20, 2026
50c05c1
Prefer direct context-aware checkpoint calls
kingwill101 Mar 20, 2026
f2ba087
Add fluent workflow start builders
kingwill101 Mar 20, 2026
3807b1d
Add typed await-event workflow helpers
kingwill101 Mar 20, 2026
9097747
Clarify producer happy-path APIs
kingwill101 Mar 20, 2026
2266f50
Add task enqueue-and-wait builders
kingwill101 Mar 20, 2026
5f58070
Add typed workflow event calls
kingwill101 Mar 20, 2026
8ebfccf
Add child workflow helpers to task contexts
kingwill101 Mar 20, 2026
923014d
Add workflow event emitters to task contexts
kingwill101 Mar 20, 2026
a6ca3e1
Add caller-bound workflow start builders
kingwill101 Mar 20, 2026
5610a3c
Add caller-bound workflow event builders
kingwill101 Mar 20, 2026
c84be25
Add caller-bound task enqueue builders
kingwill101 Mar 20, 2026
a3c62f9
Prefer bound workflow event builder docs
kingwill101 Mar 20, 2026
2c7870a
Prefer no-arg task definitions in examples
kingwill101 Mar 20, 2026
283ed39
Add definition-first task enqueue builders
kingwill101 Mar 20, 2026
da57ebd
Add direct no-arg workflow helpers
kingwill101 Mar 20, 2026
6b6716a
Prefer enqueue-and-wait in typed task docs
kingwill101 Mar 20, 2026
3bce6f0
Use direct no-arg workflow helpers in examples
kingwill101 Mar 20, 2026
9469a0b
Use no-arg task definitions in no-input producers
kingwill101 Mar 20, 2026
29d91ef
Use no-arg task definitions in persistence snippets
kingwill101 Mar 20, 2026
d692b3b
Prefer direct child workflow builders in docs
kingwill101 Mar 20, 2026
f8bac39
Clarify name-based workflow APIs in docs
kingwill101 Mar 20, 2026
99d8868
Prefer direct child workflow helpers in docs
kingwill101 Mar 20, 2026
3068585
Prefer direct no-arg child workflow helper
kingwill101 Mar 20, 2026
6409250
Prefer direct workflow event ref emission
kingwill101 Mar 20, 2026
715c086
Add StemModule merge helper
kingwill101 Mar 20, 2026
cde8c53
Add plural module bootstrap helpers
kingwill101 Mar 20, 2026
d25cfa6
Add named-arg workflow suspension helpers
kingwill101 Mar 20, 2026
88b43f7
Add direct workflow event wait helpers
kingwill101 Mar 20, 2026
7e51ea4
Add map payload codec helpers
kingwill101 Mar 20, 2026
86f489b
Add json payload codec shortcut
kingwill101 Mar 20, 2026
fe11371
Add manual json task and workflow helpers
kingwill101 Mar 20, 2026
56af4be
Add json result helpers for manual definitions
kingwill101 Mar 20, 2026
5c78007
Add module queue inspection helpers
kingwill101 Mar 20, 2026
d8f2c45
Add module subscription inspection helpers
kingwill101 Mar 20, 2026
3a2f826
Add named workflow start aliases
kingwill101 Mar 20, 2026
a4aba65
Add json result helpers to manual workflow refs
kingwill101 Mar 20, 2026
77ff242
Add plain app registration helpers
kingwill101 Mar 20, 2026
7c75a1e
Prefer direct workflow start aliases in examples
kingwill101 Mar 20, 2026
55b7278
Prefer direct child workflow aliases in docs
kingwill101 Mar 20, 2026
808a06c
Prefer direct start aliases in workflow docs
kingwill101 Mar 20, 2026
d6cef59
Prefer builder start alias in docs
kingwill101 Mar 20, 2026
f387094
Add direct workflow event aliases
kingwill101 Mar 20, 2026
597ab98
Deprecate workflow event with-aliases
kingwill101 Mar 20, 2026
6fefcaf
Deprecate workflow start with-aliases
kingwill101 Mar 20, 2026
400446f
Deprecate workflow event builders
kingwill101 Mar 20, 2026
1bb2848
Deprecate context event-ref wait helpers
kingwill101 Mar 20, 2026
11fda34
Deprecate flow event-ref wait methods
kingwill101 Mar 20, 2026
7e65f0c
Rename stale workflow alias tests
kingwill101 Mar 20, 2026
14625b4
Deprecate script event-ref wait helper
kingwill101 Mar 20, 2026
cfdecea
Add flow event await helper
kingwill101 Mar 20, 2026
5919a7a
Prefer direct workflow overrides in docs
kingwill101 Mar 20, 2026
d3316ae
Document flow event await helper
kingwill101 Mar 20, 2026
4937ebe
Align stem_builder workflow override docs
kingwill101 Mar 20, 2026
82f4cda
Rename workflow start builders
kingwill101 Mar 20, 2026
0e545b5
Add prepareEnqueue task builder aliases
kingwill101 Mar 20, 2026
c80f88e
Add direct json task and workflow aliases
kingwill101 Mar 20, 2026
2ae698e
Remove old custom codec helper aliases
kingwill101 Mar 20, 2026
12ddda9
Remove deprecated workflow event aliases
kingwill101 Mar 20, 2026
cecc880
Remove deprecated workflow start aliases
kingwill101 Mar 20, 2026
4f96fac
Remove deprecated task builder aliases
kingwill101 Mar 20, 2026
faf27da
Remove deprecated json codec aliases
kingwill101 Mar 20, 2026
dc865c6
Remove SimpleTaskRegistry alias
kingwill101 Mar 20, 2026
aa7d303
Support dynamic-map DTO codecs
kingwill101 Mar 20, 2026
c947425
Rename workflow start builders to prepareStart
kingwill101 Mar 20, 2026
a08639b
Rename caller workflow builders to prepareStart
kingwill101 Mar 20, 2026
5e0191b
Relax workflow result json decoders
kingwill101 Mar 20, 2026
59388e0
Add direct json workflow and task helpers
kingwill101 Mar 20, 2026
62d6215
Add direct json workflow definition helpers
kingwill101 Mar 20, 2026
d3bceb4
Add direct codec workflow and task helpers
kingwill101 Mar 20, 2026
6f7e5e9
Add shared workflow resume context
kingwill101 Mar 20, 2026
406ff3d
Drop unused manual json decoders
kingwill101 Mar 20, 2026
afc0479
Add shared workflow execution context
kingwill101 Mar 20, 2026
004848c
Add typed payload map readers
kingwill101 Mar 20, 2026
9d4cd1e
Add typed workflow context value helpers
kingwill101 Mar 20, 2026
7447248
Add typed task context arg helpers
kingwill101 Mar 20, 2026
c17be10
Add typed task and workflow result helpers
kingwill101 Mar 20, 2026
a116c09
Add json decoding to low-level waits
kingwill101 Mar 20, 2026
6f09287
Add low-level json enqueue and start helpers
kingwill101 Mar 20, 2026
5507076
Add low-level json workflow event helpers
kingwill101 Mar 20, 2026
1704906
Add json queue event helpers
kingwill101 Mar 20, 2026
a8b3b3f
Add typed queue event payload readers
kingwill101 Mar 20, 2026
a779b8e
Add queue event DTO decode helpers
kingwill101 Mar 20, 2026
dec4970
Add task status DTO decode helpers
kingwill101 Mar 20, 2026
394090b
Add workflow result DTO decode helpers
kingwill101 Mar 20, 2026
bd0b206
Add run state DTO decode helpers
kingwill101 Mar 20, 2026
df5248d
Add workflow watcher and checkpoint DTO helpers
kingwill101 Mar 20, 2026
b059135
Add task result DTO decode helpers
kingwill101 Mar 20, 2026
4e0dd44
Add group status result decode helpers
kingwill101 Mar 20, 2026
cc11f96
Add typed payload list readers
kingwill101 Mar 20, 2026
5f30d8a
Add direct json payload entry readers
kingwill101 Mar 20, 2026
f385b32
Add workflow previous and resume json helpers
kingwill101 Mar 20, 2026
f0e24c1
Add direct json payload list readers
kingwill101 Mar 20, 2026
0b06909
Add workflow view DTO decode helpers
kingwill101 Mar 20, 2026
a99a977
Add workflow introspection result helpers
kingwill101 Mar 20, 2026
d36c95a
Add json task progress helpers
kingwill101 Mar 20, 2026
42a5294
Add json workflow suspension helpers
kingwill101 Mar 20, 2026
49b2cd7
Add task signal result helpers
kingwill101 Mar 20, 2026
0ed2dfa
Prefer workflow json wait helpers in docs snippets
kingwill101 Mar 20, 2026
3b4dcc9
Tidy helper API follow-up cleanup
kingwill101 Mar 20, 2026
e6d8700
Add task success signal result helpers
kingwill101 Mar 20, 2026
2080fd4
Add flow control payload decode helpers
kingwill101 Mar 20, 2026
03996f8
Add workflow run metadata decode helpers
kingwill101 Mar 20, 2026
aae21e6
Add shared task execution context
kingwill101 Mar 20, 2026
c3a43d6
Add task progress signal decode helpers
kingwill101 Mar 20, 2026
cca2dd9
Add shared task retry surface
kingwill101 Mar 20, 2026
3625f9c
Prefer shared task context in docs
kingwill101 Mar 20, 2026
7af0d67
Add shared task spawn surface
kingwill101 Mar 20, 2026
d53f369
Add versioned json payload codecs
kingwill101 Mar 20, 2026
2d355c6
Add whole-payload context decode helpers
kingwill101 Mar 20, 2026
e4f4113
Add versioned low-level dto dispatch helpers
kingwill101 Mar 20, 2026
6a3c599
Add direct versioned json shortcuts
kingwill101 Mar 20, 2026
d7a7ffb
Add versioned dto result decode helpers
kingwill101 Mar 20, 2026
9f0e817
Add versioned workflow inspection decode helpers
kingwill101 Mar 20, 2026
dcc4a3d
Add versioned signal decode helpers
kingwill101 Mar 20, 2026
04834ad
Add versioned task signal result helpers
kingwill101 Mar 20, 2026
d740ada
Add versioned workflow event result helpers
kingwill101 Mar 20, 2026
3fdf699
Add versioned queue event decode helpers
kingwill101 Mar 20, 2026
7f59e43
Add versioned flow control decode helpers
kingwill101 Mar 20, 2026
39c9857
Add versioned context payload helpers
kingwill101 Mar 20, 2026
4485e25
Add versioned payload map readers
kingwill101 Mar 20, 2026
5a2acde
Add versioned nested context readers
kingwill101 Mar 20, 2026
993c18b
Add versioned suspension payload helpers
kingwill101 Mar 20, 2026
7692a0b
Add versioned low-level wait decode helpers
kingwill101 Mar 20, 2026
9cceca3
Add versioned workflow resume decode helpers
kingwill101 Mar 20, 2026
2b93d8f
Add versioned task progress helpers
kingwill101 Mar 20, 2026
5795f67
Add progress signal payload decode helpers
kingwill101 Mar 20, 2026
3dc4184
Add workflow signal metadata payload helpers
kingwill101 Mar 20, 2026
90392e6
Add envelope payload decode helpers
kingwill101 Mar 20, 2026
2b6ef89
Add isolate bridge payload decode helpers
kingwill101 Mar 20, 2026
e3d4277
Add observability payload decode helpers
kingwill101 Mar 20, 2026
9663b80
Add control message payload helpers
kingwill101 Mar 20, 2026
c685ea5
Add schedule and dead-letter payload helpers
kingwill101 Mar 20, 2026
0bc1b35
Add worker heartbeat extras helpers
kingwill101 Mar 20, 2026
b4e564c
Add workflow runtime payload helpers
kingwill101 Mar 20, 2026
4d23854
Add workflow run param decode helpers
kingwill101 Mar 20, 2026
5320215
Add task error metadata helpers
kingwill101 Mar 20, 2026
40af1a0
Add run state param decode helpers
kingwill101 Mar 20, 2026
d9ee469
Add workflow watcher data decode helpers
kingwill101 Mar 20, 2026
6a85fba
Add task status metadata helpers
kingwill101 Mar 20, 2026
a585380
Add queue event metadata helpers
kingwill101 Mar 20, 2026
10b5640
Clarify direct workflow and task happy paths
kingwill101 Mar 20, 2026
54fd937
Prefer direct workflow start overrides in docs
kingwill101 Mar 20, 2026
16bc4c0
Prefer direct task enqueue overrides in examples
kingwill101 Mar 20, 2026
b60437c
Rename read-side versioned decode defaults
kingwill101 Mar 20, 2026
fdb43cf
Clarify versioned decode fallback docs
kingwill101 Mar 20, 2026
8d3514e
Remove no-args call convenience helpers
kingwill101 Mar 20, 2026
c3dd1c5
Remove no-args workflow builder wrappers
kingwill101 Mar 20, 2026
d8c7992
Remove no-args task builder wrappers
kingwill101 Mar 20, 2026
65a5b52
Remove workflow event call wrappers
kingwill101 Mar 20, 2026
883d555
Remove workflow start call helper
kingwill101 Mar 20, 2026
5187b76
Remove no-args workflow ref builder wrapper
kingwill101 Mar 20, 2026
9ae2641
Remove task definition call helper
kingwill101 Mar 20, 2026
0b979a9
Remove prebuilt call dispatch wrappers
kingwill101 Mar 20, 2026
270e1a0
Remove builder dispatch helpers
kingwill101 Mar 20, 2026
3115f3b
Remove bound builder wrappers
kingwill101 Mar 20, 2026
e7c073b
Remove caller prepare builder wrappers
kingwill101 Mar 20, 2026
e0daf52
Remove caller prepare builder wrappers
kingwill101 Mar 20, 2026
421fedc
Clarify transport objects as advanced APIs
kingwill101 Mar 20, 2026
53c6a6e
Add direct explicit transport builders
kingwill101 Mar 20, 2026
025797a
Remove workflow start builder path
kingwill101 Mar 20, 2026
2e3847b
Remove task enqueue builder path
kingwill101 Mar 20, 2026
6106f67
Remove duplicate typed wrapper helpers
kingwill101 Mar 20, 2026
5f66cdc
Remove transport call copy helpers
kingwill101 Mar 20, 2026
a3f05b4
Add versioned manual result helpers
kingwill101 Mar 20, 2026
43c878f
Refresh stale transport call examples
kingwill101 Mar 20, 2026
57dd4ec
Add versioned result support to argful task definitions
kingwill101 Mar 20, 2026
590946e
Add versioned result support to manual workflow refs
kingwill101 Mar 20, 2026
b2fdeff
Add versioned result support to json task definitions
kingwill101 Mar 20, 2026
dc27a96
Add versioned result support to json workflow refs
kingwill101 Mar 20, 2026
60e1763
Refresh stem_builder transport examples
kingwill101 Mar 20, 2026
54006d0
Add versioned custom map payload codec
kingwill101 Mar 20, 2026
fbfde9b
Add codec-backed low-level task enqueue
kingwill101 Mar 20, 2026
f27c9c4
Add codec-backed low-level workflow start
kingwill101 Mar 20, 2026
e3c3b77
Add codec-backed queue event publish
kingwill101 Mar 20, 2026
b76ed27
Add versioned map workflow helpers
kingwill101 Mar 20, 2026
392ae62
Add versioned map task helpers
kingwill101 Mar 20, 2026
80f50df
Add versioned map workflow result helpers
kingwill101 Mar 20, 2026
ec72d1f
Add payload version decoder registry
kingwill101 Mar 21, 2026
ea914ef
Add registry-backed versioned factories
kingwill101 Mar 21, 2026
2099c93
Add stack reuse to StemClient.fromUrl
kingwill101 Mar 21, 2026
3404a7a
Bump stem to 0.2.0
kingwill101 Mar 21, 2026
34defb1
Add stack-based StemClient bootstrap
kingwill101 Mar 21, 2026
8b64df0
Prefer client bootstrap in public docs
kingwill101 Mar 21, 2026
f2210d7
Prefer client-first bootstrap in public docs
kingwill101 Mar 21, 2026
c10ea64
Prefer adapter bootstrap in runnable producers
kingwill101 Mar 21, 2026
1d4a2d2
Clean Stem analyzer noise and runtime tests
kingwill101 Mar 21, 2026
d9c24cc
Bump stem_builder to 0.2.0
kingwill101 Mar 21, 2026
f1585b0
Add pretty mode to Stem logging
kingwill101 Mar 21, 2026
dec8a5c
Make pretty logging the default
kingwill101 Mar 21, 2026
8c7ea38
Increase pretty log contrast
kingwill101 Mar 21, 2026
254a8d8
Disable Stem logging by default
kingwill101 Mar 21, 2026
8b6f030
readme update
kingwill101 Mar 21, 2026
970f59d
Control worker auto-start in app shortcuts
kingwill101 Mar 28, 2026
87ffab4
fix(bootstrap): preserve workflow app ownership
kingwill101 Mar 28, 2026
b4d588b
fix(tests): unblock workflow and postgres CI
kingwill101 Mar 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 18 additions & 9 deletions .site/docs/core-concepts/canvas.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,15 @@ This guide walks through Stem's task composition primitives—chains, groups, an
chords—using in-memory brokers and backends. Each snippet references a runnable
file under `packages/stem/example/docs_snippets/` so you can experiment locally
with `dart run`. If you bootstrap with `StemApp`, use `app.canvas` to reuse the
same broker, backend, task handlers, and encoder registry.
same broker, backend, task handlers, and encoder registry. `StemApp` lazy-starts
its managed worker for canvas dispatch too, so the common path does not need an
explicit `await app.start()`.

## Chains

Chains execute tasks serially. Each step receives the previous result via
`context.meta['chainPrevResult']`.
`context.meta`, so prefer typed reads like
`context.meta.valueOr<String>('chainPrevResult', 'fallback')` over raw casts.

```dart file=<rootDir>/../packages/stem/example/docs_snippets/lib/canvas_chain.dart#canvas-chain

Expand Down Expand Up @@ -46,16 +49,19 @@ state:

## Chords

Chords combine a group with a callback. Once all body tasks succeed, the callback
runs with `context.meta['chordResults']` populated.
Chords combine a group with a callback. Once all body tasks succeed, the
callback runs with `context.meta['chordResults']` populated. Prefer
`context.meta.valueListOr<T>('chordResults', const [])` over manual list casts
when reading those results.

```dart file=<rootDir>/../packages/stem/example/docs_snippets/lib/canvas_chord.dart#canvas-chord

```

If any branch fails, the callback is skipped and the chord group is marked as
failed. Inspect `backend.getGroup(chordId)` to see which branch failed before
retrying.
failed. Inspect the latest group status via `StemApp.getGroupStatus(...)` or
`StemClient.getGroupStatus(...)` before retrying. If you are operating below
the runtime layer, read the raw backend directly.

## Dependency semantics

Expand All @@ -71,7 +77,10 @@ retrying.
- `Canvas.group` returns a `GroupDispatch` with a result stream for each child.
- `Canvas.chord` preserves the original signature order when building
`chordResults`, so you can map results back to inputs deterministically.
- `backend.getGroup(groupId)` returns the latest status for each child task.
- `StemApp.getGroupStatus(...)` and `StemClient.getGroupStatus(...)` return the
latest status for each child task. Use `status.resultValues<T>()` for scalar
child results or `status.resultJson(...)` / `status.resultAs(codec: ...)` for
DTO payloads before dropping down to raw backend reads.

## Removal semantics

Expand All @@ -89,8 +98,8 @@ dart run lib/canvas_group.dart
dart run lib/canvas_chord.dart
```

Each script bootstraps a `StemApp` in-memory runtime, starts a worker, and then
uses `app.canvas` for composition.
Each script bootstraps a `StemApp` in-memory runtime and then uses `app.canvas`
for composition.

## Best practices

Expand Down
2 changes: 1 addition & 1 deletion .site/docs/core-concepts/cli-control.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ ensure the CLI and workers share the same task-definition entrypoint so task
names, encoders, and routing rules stay consistent.

A common pattern is to build that CLI registry from the same shared task list
or generated `stemModule.tasks` your app uses, so task metadata stays consistent
or generated `stemModule` your app uses, so task metadata stays consistent
without teaching registry-first bootstrap for normal services.

If a command needs a registry and none is available, it will exit with an error
Expand Down
37 changes: 37 additions & 0 deletions .site/docs/core-concepts/observability.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,19 @@ control-plane commands.

```

When you inspect `TaskPostrunPayload` or `TaskSuccessPayload` directly, prefer
`payload.resultJson(...)`, `payload.resultVersionedJson(...)`, or
`payload.resultAs(codec: ...)` over manual
`payload.result as Map<String, Object?>` casts.
For workflow lifecycle signals, prefer
`payload.metadataJson('key', ...)`,
`payload.metadataVersionedJson('key', ...)`, or
`payload.metadataAs('key', codec: ...)` over manual
`payload.metadata['key'] as Map<String, Object?>` casts. If the entire
metadata map is one DTO, use `payload.metadataPayloadJson(...)`,
`payload.metadataPayloadVersionedJson(...)`, or
`payload.metadataPayloadAs(codec: ...)` instead.

## Workflow Introspection

Workflow runtimes can emit execution events (started/completed/failed/retrying)
Expand All @@ -80,6 +93,25 @@ class LoggingWorkflowIntrospectionSink implements WorkflowIntrospectionSink {
}
```

When a completed step or checkpoint carries a DTO payload, prefer
`event.resultJson(...)`, `event.resultVersionedJson(...)`, or
`event.resultAs(codec: ...)` over manual
`event.result as Map<String, Object?>` casts.
Step and runtime introspection events also expose typed metadata helpers via
`event.metadataJson('key', ...)`, `event.metadataVersionedJson('key', ...)`,
`event.metadataAs('key', codec: ...)`, `event.metadataPayloadJson(...)`, and
`event.metadataPayloadVersionedJson(...)`.
When worker events carry structured `data`, prefer `event.dataJson(...)`,
`event.dataVersionedJson(...)`, or `event.dataAs(codec: ...)` over manual
`event.data!['key']` casts. For completed control commands, use
`payload.responseJson(...)`, `payload.responseVersionedJson(...)`,
`payload.responseAs(codec: ...)`, `payload.errorJson(...)`,
`payload.errorVersionedJson(...)`, or `payload.errorAs(codec: ...)` instead of
walking raw `response` / `error` maps.
Persisted worker heartbeats expose the same typed decode path on `extras` via
`heartbeat.extrasJson(...)`, `heartbeat.extrasVersionedJson(...)`, and
`heartbeat.extrasAs(codec: ...)`.

## Logging

Use `stemLogger` (Contextual logger) for structured logs.
Expand All @@ -88,6 +120,11 @@ Use `stemLogger` (Contextual logger) for structured logs.

```

The shared `stemLogger` starts silent by default, so opt in explicitly with
`configureStemLogging(level: Level.info, format: StemLogFormat.pretty)`.
When you want machine-oriented output for production log shipping, switch to
`configureStemLogging(format: StemLogFormat.plain)`.

Workers automatically include attempt, queue, and worker id in log contexts when
`StemSignals` are enabled.

Expand Down
5 changes: 5 additions & 0 deletions .site/docs/core-concepts/persistence.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@ Use persistence when you need durable task state, workflow state, shared
schedules, or revocation storage. Stem ships with Redis, Postgres, and SQLite
adapters plus in-memory variants for local development.

For the normal path, prefer `StemClient.inMemory(...)`,
`StemClient.fromUrl(...)`, or a reusable `StemStack.fromUrl(...).createClient(...)`.
Drop to `StemClient.create(...)` only when you really need custom broker or
backend factories that the adapter stack cannot express.

import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

Expand Down
41 changes: 29 additions & 12 deletions .site/docs/core-concepts/producer.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,18 @@ sidebar_position: 2
slug: /core-concepts/producer
---

Enqueue tasks from your Dart services using `Stem.enqueue`. Start with the
in-memory broker, then opt into Redis/Postgres as needed.
Enqueue tasks from your Dart services through a `TaskEnqueuer` surface such as
`StemClient`, `StemApp`, or `StemWorkflowApp`. Start with the in-memory broker,
then opt into Redis/Postgres as needed.

For adapter-backed deployments, prefer `StemClient.fromUrl(...)` or
`StemStack.fromUrl(...).createClient(...)`. Keep `StemClient.create(...)` for
the rarer case where you must provide custom factories directly.

import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';

## Enqueue tasks
## Raw Enqueue

<Tabs>
<TabItem value="in-memory" label="In-memory (bin/producer.dart)">
Expand Down Expand Up @@ -39,19 +44,30 @@ import TabItem from '@theme/TabItem';

## Typed Enqueue Helpers

When you need compile-time guarantees for task arguments and result types, wrap
your handler in a `TaskDefinition`. The definition knows how to encode args and
decode results, and exposes a fluent builder for overrides (headers, meta,
options, scheduling):
For the common producer path, prefer `TaskDefinition<TArgs, TResult>`. The
definition owns argument encoding, result decoding, and default publish
metadata, while exposing direct helpers and a fluent builder for overrides
(headers, meta, options, scheduling):

```dart title="bin/producer_typed.dart" file=<rootDir>/../packages/stem/example/docs_snippets/lib/producer.dart#producer-typed

```

Typed helpers are also available on `Canvas` (`definition.toSignature`) so
group/chain/chord APIs produce strongly typed `TaskResult<T>` streams.
Need to tweak headers/meta/queue at call sites? Wrap the definition in a
`TaskEnqueueBuilder` and invoke `await builder.enqueueWith(stem);`.
group/chain/chord APIs produce strongly typed `TaskResult<T>` streams. Need to
tweak headers/meta/queue at call sites? Start from
`definition.buildCall(args, ...)` when you need the explicit advanced
transport path.

Raw task-name strings still work, but they are the lower-level interop path.
Reach for them when the task name is truly dynamic or you are crossing a
boundary that does not have the generated/manual `TaskDefinition`. When those
calls already have typed DTO args, prefer
`enqueuer.enqueueValue(name, dto, codec: ...)` over hand-building an `args`
map.
If you later inspect the raw `Envelope`, prefer `envelope.argsJson(...)`,
`envelope.argsVersionedJson(...)`, `envelope.metaJson(...)`, or
`envelope.metaVersionedJson(...)` over manual map casts.

## Enqueue options

Expand All @@ -68,7 +84,7 @@ unsupported.
Example:

```dart
await stem.enqueue(
await enqueuer.enqueue(
'tasks.email',
args: {'to': 'ops@example.com'},
enqueueOptions: TaskEnqueueOptions(
Expand All @@ -86,7 +102,8 @@ await stem.enqueue(

## Tips

- Reuse a single `Stem` instance; create it during application bootstrap.
- Reuse a single `TaskEnqueuer` implementation; in most apps that means
`StemClient`, `StemApp`, or `StemWorkflowApp`.
- Capture the returned task id when you need to poll status from the result backend.
- Use `TaskOptions` to set queue, retries, priority, isolation, and visibility timeouts.
- `meta` is stored with result backend entries—great for audit trails.
Expand Down
18 changes: 18 additions & 0 deletions .site/docs/core-concepts/queue-events.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,22 @@ Use this when you need lightweight event streams for domain notifications
## API Surface

- `QueueEventsProducer.emit(queue, eventName, payload, headers, meta)`
- `QueueEventsProducer.emitValue(queue, eventName, value, codec, headers, meta)`
- `QueueEventsProducer.emitJson(queue, eventName, dto, headers, meta)`
- `QueueEventsProducer.emitVersionedJson(queue, eventName, dto, version, headers, meta)`
- `QueueEvents.start()` / `QueueEvents.close()`
- `QueueEvents.events` stream (all events for that queue)
- `QueueEvents.on(eventName)` stream (filtered by name)

All events are delivered as `QueueCustomEvent`, which implements `StemEvent`.
Use `event.payloadValue(...)` / `event.requiredPayloadValue(...)` to read typed
payload fields instead of repeating raw `payload['key']` casts.
If one queue event maps to one DTO, use `event.payloadJson(...)`,
`event.payloadVersionedJson(...)`, or `event.payloadAs(codec: ...)` to decode
the whole payload in one step.
If the whole queue-event metadata map is one DTO, use `event.metaJson(...)`,
`event.metaVersionedJson(...)`, or `event.metaAs(codec: ...)` instead of
manual `event.meta[...]` casts.

## Producer + Listener

Expand All @@ -38,6 +49,13 @@ Multiple listeners on the same queue receive each emitted event.

- Events are queue-scoped: listeners receive only events for their configured
queue.
- `emitValue(...)` is the codec-backed path when the payload should be
authored as a typed object but still use a custom map encoder or explicit
`PayloadCodec<T>`.
- `emitJson(...)` is the DTO convenience path when the payload already exposes
`toJson()`.
- `emitVersionedJson(...)` is the same convenience path when the payload
schema should persist an explicit `__stemPayloadVersion`.
- `on(eventName)` matches exact event names.
- `headers` and `meta` round-trip to listeners.
- Event names and queue names must be non-empty.
Expand Down
9 changes: 6 additions & 3 deletions .site/docs/core-concepts/signing.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ reason.
## How signing works in Stem

- Producers create a `PayloadSigner` from environment-derived config and pass it
into `Stem` to sign new envelopes.
into the producer runtime (`StemClient` or raw `Stem`) to sign new
envelopes.
- Workers create the same signer (or verification-only config) and pass it into
`Worker` to verify each delivery.
- Schedulers/Beat that enqueue tasks should also sign.
Expand All @@ -46,8 +47,10 @@ export STEM_SIGNING_ACTIVE_KEY=v1

2) Wire the signer into producers, workers, and schedulers.

These snippets come from the `packages/stem/example/microservice` project so you can see the
full context.
These snippets come from the `packages/stem/example/microservice` project so you
can see the full context. They intentionally show the lower-level signing
plumbing; for the normal happy path, still prefer `StemClient`/`StemApp`
bootstrap.

<Tabs>
<TabItem value="producer" label="Producer (enqueuer): sign outgoing envelopes">
Expand Down
Loading
Loading