Product · deterministic guardrails + your own model review

Two jobs, one product.
Zero auto-merge.

Local mode is the second thought at the keyboard: preflight, review, and evidence before code leaves your machine. The Raccoon is the forge-side gatekeeper that reviews MRs and PRs without taking merge authority away from humans. Both are advisory. Both are yours.

How Sober works

Two jobs, one product. Local mode is the second thought at the keyboard. Raccoon is the forge-side gatekeeper that reviews MRs and PRs without taking merge authority away from humans.

Local tool

At the keyboard

Run status, preflight, and review before commit or push. State lives under .sober/. Nothing is published unless you run an explicit write command.

sober status
sober preflight --base main
sober review --base main
sober forge post --merge-request 42
Raccoon daemon

Beside the forge

Webhooks from Forgejo or GitLab enqueue jobs. Raccoon reviews the MR worktree, stores evidence, posts append-only notes, and can set advisory labels. Humans still merge.

sober raccoon forge serve-webhook \
  --config /etc/sober/raccoon.kdl \
  --listen 0.0.0.0:8787

sober raccoon forge catchup --once
01

Status

Read real repo state before any model call.

sober status
02

Preflight

Secrets, private metadata, shell danger, prompt injection.

sober preflight
03

Review

Route to local or approved remote models under your policy.

sober review
04

Evidence

SQLite store keeps runs, findings, jobs, memory, resume packs.

sober plan evidence
05

Forge post

Optional write: one append-only note, optional advisory labels.

sober forge post

What ships in the Defense Module

This is what state-of-the-art code review looks like in the agentic era: deterministic guardrails that run in milliseconds, model review with evidence you can inspect, and a forge daemon that never auto-merges. Built for the age of agent-generated code — and for the humans who have to live with it.

Git hooks, one command

sober hooks install all wires pre-commit, pre-merge, and pre-push to run deterministic preflight — no model, works offline, catches secrets and slop before they leave your machine.

Explain every finding

Each finding gets a stable ID (F-49, F-720). sober explain F-49 shows severity, evidence, the exact source line, a suggested fix, and copy-paste verify commands. --polish adds a plain-language model summary.

Deterministic preflight

No model required. Pattern-matches secrets, private files, unsafe eval(/exec( calls, curl|sh pipes, and AI-slop shapes. Tightened to stop false-positives on comments and test fixtures; a later release kills the identifier-substring and fixture-URL false-positive classes. a later release adds the agent-hook detector — flags .claude/settings.json SessionStart hooks, VS Code folderOpen tasks, and npm lifecycle scripts that fetch runtimes (the Shai-Hulud worm surfaces).

Four model routes

local (Ollama, default), daily, frontier, security. Each with its own budget, privacy classification, and endpoint chain. BYOK — your keys, your providers, your call-home policy.

Advisory, never auto-merge

The Raccoon daemon posts evidence and sets advisory labels (Sober clean, Sober findings, Sober error). Merge authority stays with the human. Always. By design.

Universal anti-slop

Every reviewer profile includes a non-negotiable anti-slop floor: reject rubber-stamp LGTM, untested paste, vendored junk. AI-assisted code is assumed; the demand is evidence, not approval.

Tier-1 language intelligence

10 languages reason, 320 route. Sober parses 320 tree-sitter grammars and extracts review-relevant AST facts — functions, calls, auth/db calls, defers, injection sinks — for Go, Rust, Zig, Janus, Python, JavaScript, TypeScript, TSX, C, and Bash. Bash is the highest-stakes surface: eval, exec, source sinks. Adding a language's reasoning is one declarative .scm query file — no hand-coded extractor per language. --auto-provision recovers a missing grammar during review; local_only routes stay hermetically offline by constitutional design.

One reviewer, two voices. Yours either way.

Sober adapts to whoever is writing the code. Senior engineers get signal, not noise. Junior developers get a reviewer that teaches. Same product, two professional modes — and the human keeps merge authority in both.

For senior engineers · reviewer "senior"

Senior mode — zero-noise review

You've been burned by agentic coding: rubber-stamp LGTMs, untested paste, and review bots that never shut up. Senior mode assumes high skill and reviews for long-term ownership — contracts, tests, the future maintainer reading this code. It leads with blockers only, skips the mentoring essays, and prefers an empty findings list when the diff is sound. Signal. Nothing else.

reviewer "senior" objective="maintainability" style="maintainer"
For junior developers · reviewer "junior"

Teaching mode — the Raccoon as mentor

Onboard juniors with a reviewer that actually teaches. Teaching mode separates true blockers from teaching notes, explains the tradeoffs behind every fix, and carries up to six prior reviews on the branch — so the Raccoon mentors against history instead of restarting from zero. Your juniors level up in public. Your seniors keep their peace.

group_rule "junior-interns" reviewer="junior" style="teaching"

Same product. Your merge authority.

Deterministic preflight before the commit. Your own model review before the push. Advisory evidence on the forge. And no auto-merge path in the binary — because the merge decision is a responsibility, not a convenience.