Skip to main content

Signals

A signal is how a stage communicates its outcome to the pipeline. In the DB-first runtime, the routing signal is the result document: a JSON file written to $RESULT_DOC_PATH and ingested after the stage subprocess exits.

Result document

After the subprocess finishes, the orchestrator reads the result document at $RESULT_DOC_PATH. This is the primary signal for post-stage routing.

FieldRequiredPurpose
verdictYes"pass", "fail", or "blocked"
summaryYesOne sentence describing what happened
commentNoText to post as a comment on the issue
blockersNoArray of {title, description} objects
artifactsNoArray of filenames produced in $ARTIFACTS_DIR
meta.modelNoModel identifier used
meta.input_tokensNoInput token count
meta.output_tokensNoOutput token count

Verdict meanings:

  • pass — work is complete; gate rules are evaluated, then onPass routing applies
  • fail — work was attempted but did not meet the bar; onFail routing applies
  • blocked — the stage cannot continue; gate rules are skipped; fallback routing applies

The orchestrator posts comment text to the issue, surfaces blockers in the UI, and records artifacts for download.

Signal metadata

Some seeded stage prompts still describe a flux:signal shape as shorthand for the stage outcome:

{"flux:signal": {"verdict": "hold", "reason": "already_complete", "meta": {"targetState": "review"}}}

Signal verdicts: proceed, hold, rework, abort.

That shape does not create an immediate stdout fast path in the DB-first runtime. The orchestrator ingests $RESULT_DOC_PATH after the subprocess exits, maps verdict (pass, fail, blocked) to pipeline routing, and reads optional signal_reason / signal_meta fields from the result document when it needs reason-specific behavior.

signal_reason can carry hold-style reasons:

  • already_complete — issue is ahead of its current state; signal_meta.targetState tells the orchestrator where to jump. Reason-driven jumps bypass the normal state transition table — the orchestrator calls stateOverride() directly.
  • needs_human — ambiguous or blocked; sets issue status to Blocked and surfaces it for human review. signal_meta.question can carry a message.

For the full signal type reference, see Signal Types.

Realtime dependency

Live updates in the UI depend on Supabase Realtime. The orchestrator writes stage events to the database as they arrive; Realtime pushes those writes to the browser. If the connection is interrupted, the UI will stop updating for that run — it shows the last known state until reconnected.