Notes
- Push-based; for poll-based checks use
<Task>with a compute function. taggedis an explicit migration opt-in: signal completion then stores{ kind: "signal", payload }and timeout continuation stores{ kind: "timeout" }. A schema that merely containskindandpayloadisn’t treated as tagged.onTimeout="continue"withouttaggedfails clearly instead of persisting an ambiguousnullrow.- External integration webhooks (
@smthrs/integrations) deliver these events. A source signalsintegration:<service>:<event>(e.g.integration:github:pull_request) with acorrelationIdofowner/repo#number,owner/repo, ornulldepending on payload, so setsignalName/correlationIdto match. - With
async, dependents viadependsOn/needsstill block until payload arrives. - Async waits are tracked by the
smithers_external_wait_async_pending{kind="event"}gauge while pending (it rises on start, falls on completion). - A run suspended on
<WaitForEvent>(statuswaiting-event) doesn’t resume itself when the event is delivered out of process: a controller should deliver it with GatewaysubmitSignal, then callresumeRun. For ad-hoc CLI operation, deliver the event and resume withbunx smthrs up workflow.tsx --run-id RUN_ID --resume truefrom the workspace root. Never locate or select the backing store yourself; discover the verified workspace Gateway withsmithers gateway status --format json. See the keeper-loop pattern in the CLI overview.