Reviewer checks — the gates on a story
satelle runs the actor model (see the satelle-actor-model
principle): a story moves through a graph of steps, each run by a defined
actor, and the story's status decides what is valid now. The agent's goal is
to drive the story to done; satelle is the gatekeeper of status — a status
advances only through a reviewer's accept, and always through it.
- executor — does the work and mutates the tree.
- reviewer — is limited to reviewing: an isolated, fresh-context judge that
reads the requested transition and returns one JSON verdict
{"decision":"accept"|"reject","notes":"…"}. It is read-only and never mutates — a quality-management invariant, enforced by its grant, not by trust.
Each gate is an isolated, fresh-context call: satelle builds the payload (the work item + the requested transition), spawns a fresh agent with the step's skill as its prompt and a read-only grant, and aggregates the one verdict to gate the status. satelle does the context selection; the reviewer reads what it needs through its tools. This applies to stories and tasks alike — gating is by category, kind-agnostic.
Workflows are authored — YAML or DOT
The active workflow is authored substrate (the embedded satelle-baseline-workflow,
or a repo override under .satelle/workflows). Its lifecycle may be written two
ways, both parsed by the shared wfdot/web parser:
- an inline-YAML
states:/transitions:block (transitions carryreviewer_skill); or - a fenced ```dot graph (node-centric): each node is a step carrying an
actor, a reviewer node names its gate asprompt="@skill:NAME", and the edge into a reviewer node is the gated transition.satelle validategraph-checks a DOT workflow (structural soundness + the mandatory spine gate intodone).
An edge is gated only when the workflow names a reviewer skill and that skill's rubric is installed; a named-but-absent rubric is advisory, so a fresh repo keeps working until the rubrics ship.
The actors layer — how a step runs
What is injected (the skill + context subset) is satelle's; how and where an
actor runs is the actors layer (.satelle/actors.toml). It binds each actor to
a backend and grant, defaulting to today's behaviour — the executor runs in-loop,
the reviewer runs as an isolated agent -p with the read-only Read,Grep,Glob
grant. A repo may rebind a backend or grant without touching the workflow; the
read-only limit travels with the binding.
Two gate kinds: LLM reviewers and functional checks
A gate is either:
- an LLM reviewer — the skill's markdown body rides as a fresh-context agent's system prompt and the agent returns the verdict (judgment: structure, intent, acceptance); or
- a functional check — a self-contained ```check script (or a
check:in frontmatter). The gate runs it in the repo root; exit 0 accepts, non-zero rejects with the output tail as notes. No LLM — the command is the decision. Like the commit-push gate, a functional check may run real mechanism.
Create gate — satelle-story-review
Runs when a draft is created (opt-in per repo via [review] gate_create). Judges
required structure only: a specific title, a clear goal in the body, and at
least one numbered, testable acceptance criterion.
Begin-work gate — satelle-story-intent-review (→ in_progress)
Judges readiness of intent before work starts — concrete title, clear goal, testable criteria. Unclear intent is rejected; the story stays in backlog.
Commit-push step — commit-push (executor) + satelle-commit-push-review (gate)
The commit-push executor step stages and commits the slice (conventional
message, the story id, no AI attribution), pushes to main (trunk-based release),
and watches the GitHub Actions run to conclusion — recording the conclusion and run
URL as evidence. The commit happens while the story is engaged (an executor
state), so commits are always tracked. The commit-push gate
(satelle-commit-push-review, a functional check) then confirms the CI run for the
pushed commit concluded success — evidence the deployment worked — and emits a
PR-style commit-summary document under .satelle/documents/.
Close gate — satelle-story-done-review (→ done)
An isolated, read-only reviewer that reads the repository to verify each
numbered acceptance criterion against concrete evidence. Unmet criteria are
rejected with specifics. done is always terminal (see satelle-done-is-last),
and the mandatory close gate is the spine a custom workflow cannot drop.
Always-on system layer — estimate/actual + cancel
satelle-estimate-actual-review runs on every gated transition (after the
workflow-named reviewers) but only governs two edges: entry to in_progress
requires a recorded plan estimate, and entry to done requires the recorded
actual (satelle story estimate / satelle story actual).
satelle-story-cancel-review records why an item is abandoned.
Summariser — satelle-step-summary
Not a gate. After a transition enacts, this read-only observer produces a 1–3
sentence recap recorded as a step_summary ledger row.
Where the rubrics live
The create-structure reviewer and summariser are embedded canonical defaults
(internal/config/substrate/skills). A repo MAY override them — or add its own
gates (this repo's commit-push reviewer) — under .satelle/skills/. The binary
runs the gates; the substrate defines them.
See also: satelle help create-story.
Mirrored from satelle’s built-in help. Read it in the binary with
satelle help reviewer-checks, or see the canonical source in the
satelle repo.