Concept 4 of 10
Lint passed, so… proceed? That's not a decision — it's a computation. Flowgate runs the computable steps itself and wakes the model only when there's a genuine choice.
A pipeline of lint → test → build → deploy has exactly one decision in it: whether to deploy. The first three steps either pass or fail. But a naive agent reads each result, reasons about a "choice" that doesn't exist, and burns a full round trip each time — latency and tokens spent rubber-stamping outcomes.
Every transition carries an actor — it says who performs the
step: code (actor: deterministic), the model
(actor: agent), or a person (actor: human). Mark
a transition actor: deterministic and the runtime walks
through it automatically; those transitions are auto-chained and never
shown to the model. The chain stops at the first step a model actually
needs to decide. Three executor calls, zero LLM round trips — and the
response arrives at the decision point with a chain trace of
everything that ran.
states:
lint:
transitions:
run_lint: { target: test, actor: deterministic,
executor: { kind: script, subject: lint } }
test:
transitions:
run_tests: { target: build, actor: deterministic,
executor: { kind: script, subject: test } }
build:
transitions:
build_artifact: { target: ready_to_deploy, actor: deterministic,
executor: { kind: script, subject: build } }
ready_to_deploy:
goal: Confirm deployment
transitions:
deploy: { target: deployed, actor: agent } # chain stops here
The model calls one transition; the runtime chains lint, test, build, and
hands back control at ready_to_deploy with guidance for the
decision ahead — plus the chain trace of what ran:
"chain": [
{ "transition": "run_lint", "actor": "deterministic", "ok": true },
{ "transition": "run_tests", "actor": "deterministic", "ok": true },
{ "transition": "build_artifact", "actor": "deterministic", "ok": true }
] Chaining doesn't hide failures — it routes them. If the tests fail, the chain halts at that step and control returns to the model with the failure in context and the legal moves from there: retry, open a fix, or escalate. You get the speed of skipping the busywork and a model that only engages when something actually needs a decision — including a broken one.