Concept 4 of 10

Stop paying a model to decide what isn't a decision.

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.

Three round trips for zero decisions

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.

Tag the computable steps; the runtime chains them

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.

deploy-pipeline.yaml
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:

response.json
"chain": [
  { "transition": "run_lint",       "actor": "deterministic", "ok": true },
  { "transition": "run_tests",      "actor": "deterministic", "ok": true },
  { "transition": "build_artifact", "actor": "deterministic", "ok": true }
]

When a step fails, the model wakes up

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.

Concept 4 of 10

Next concept →

Guards & evidence

Policy is data — permission, role, expression, proof — not per-tool glue code.

See all concepts