Son of Anton Docs
Getting started

What is Son of Anton?

Self-hosted GitHub PR review with configurable model providers, validation executors and review traces.

Son of Anton receives GitHub App webhooks, evaluates review policy, analyzes a pinned PR head, and publishes a review body and a check run when publication is enabled. Validation can run in a separately configured sandbox. Skipped or unavailable validation is reported, not counted as a successful check.

Access and source layout

These instructions require an authorized source checkout. The verified handoff records justgetAI/son-of-anton-review as private. The checked-out engine has no LICENSE file and its package is marked private: true; that package field alone does not establish GitHub visibility or grant a license. Do not assume a public clone or permission to redistribute. Ask the repository owner for access and licensing terms.

Source paths, repository names and branch references throughout these docs are citations for authorized users, not public source-download links. Publishing this documentation does not make the repositories public or grant source access.

The available trees are separate:

TreeChecked-out branchRole
son-of-anton-reviewfeat/cloudflare-nativeReview engine, Node entrypoints and Cloudflare-native runtime
son-of-anton-operator-parityfeat/greptile-operator-paritySeparate engine worktree containing the expanded Cloudflare operator API
anton-uifeat/hardening-observabilityOlder dashboard with an optional bearer gate
anton-ui-trace-parityfeat/trace-api-paritySeparate UI worktree with WorkOS-backed sessions and expanded operator views

The two parity directories are Git worktrees, not subdirectories of the engine deployment. There is no combined engine/operator deployment command. The native main Worker exposes ingress, not the parity /operator/api/* service. The Node server has its own smaller, read-only operator surface.

Model and validation choices

Model: OpenRouter is the recommended setup. The engine also implements OpenAI direct, Anthropic direct and Codex CLI providers. Native deployment uses GILF_MODEL_PROVIDER and GILF_MODEL; the checked-in Node worker.mjs instead reaches constructor fallbacks GILF_CODEX_PROVIDER and GILF_CODEX_MODEL. Set the appropriate pair explicitly. OpenRouter's free-only guard is enabled unless GILF_OPENROUTER_REQUIRE_FREE=0. Select a currently available model and approve paid usage deliberately; checked-in model names and price estimates are not a current provider catalog.

Validation: GILF_VALIDATION_EXECUTOR selects managed-crabbox, managed-e2b, managed-cf-sandbox or self-host. With no explicit or legacy selection the resolver chooses managed-crabbox; the native deployment instead configures Cloudflare Sandbox. A self-host command must provide the isolation itself. Environment filtering is not a container boundary. The legacy local executor requires an explicit unsafe opt-in and is not a production recommendation.

Validation uses supported repo-native commands when available. It does not prove every finding by execution, and docs-only changes can skip validation. See Validation executors.

Observability: persisted traces can include latency, tokens and estimated cost. Missing usage or unknown prices can leave cost null. A successful trace is evidence of the recorded operations, not a correctness guarantee or a billing invoice.

Two engine deployment modes

ModeProcesses and stateStart here
NodeLong-running server.mjs, one-shot worker.mjs, shared SQLite state and queueSelf-host quickstart
Cloudflare-nativeMain Worker, separate key-broker Worker, OMP and Sandbox container applications, Queue, D1, R2 and KV bindingsCloudflare quickstart

On Node, the server receives events and the separately scheduled worker drains jobs. In the native runtime, ingress verifies signatures and deduplicates delivery IDs; the consumer resolves the PR head and claims a dispatch lease before starting a container. The broker supplies scoped GitHub tokens without passing the App private key to the container.

Review identities include the repository, PR number and head SHA. Manual review comments create variants keyed by comment ID. Check runs are updated within a run; review bodies are POSTed, not edited in place across every push. This is not an exactly-one-review-per-PR promise.

Optional features are not defaults

FeatureEngine state
Context graphBuilds repository/commit context, including impact beyond changed files; not a multi-repository index
Hypothesis swarmNo worker runs by default. GILF_PRIME_SHADOW=1 selects the Prime worker; GILF_HYPOTHESIS_PRIMARY=1 requests primary use and normally enables that worker unless explicitly disabled. The worker harness needs its own setup.
LLM hypothesis plannerGILF_HYPOTHESIS_PLANNER=1, also requires an available hypothesis worker
Model inversionGILF_MODEL_INVERSION, default off
Execution-artifact processingGILF_EVIDENCE_ARTIFACTS=1, default off; requiring artifacts is a separate gate
Auto-approval, PR-description updates, Prompt to FixPolicy-controlled, default off

The native container environment allowlist does not forward the swarm, planner, inversion or evidence-artifact flags. Adding them to Worker vars alone does not enable those features. That requires an engine change, not a documented deployment toggle.

Reading the result

The review separates merge status, analyst confidence, findings and missing validations. Findings have file paths but no required line-number fields. There are no inline review comments or GitHub suggestion patches in the publisher. Optional status comments and PR-description updates are separate surfaces.

See Anatomy of a review. For an agent-assisted install with explicit human gates, use Agent onboarding.

Names

Use the actual GILF_ environment names. The parity operator Worker supports its own SON_OF_ANTON_ token-name fallbacks; that is not a general ANTON_ alias for engine configuration. The command parser accepts both @anton and @gilf, but supported replies differ by runtime.

On this page