// merge gating for agent-written code

Agents push. cachet decides what's safe to land unattended.

A calibrated confidence score for every change, computed from the change itself. Clear the threshold and the floors, it merges, no human. Fall short, it escalates. Async by default: open a slice, get notified as CI and reviews land, never block.

$curl -fsSL cachet.sh/install | shcopy
read the docs →
agent — cachet slice session

no dashboard required. the slice is an async aggregation point; the agent is a background waiter, not a blocker.

// the model

Three nouns. No "pull requests."

A change is a slice. A slice is reviewed in segments. The gate returns one verdict. That is the whole vocabulary.

slice

A unit of change you open (commit, push). cachet's "PR." Carries a score and a list of what it's waiting on.

segment

A reviewable sub-chunk of a slice. Reviewed in parallel; a finding names one; you fix only it and re-vet only it.

gate

The single decision: merge · revise · blocked · review · pending. Aggregates confidence, CI and every reviewer into one verdict.

// the cli

The agent's whole life runs through one binary.

One command opens the slice, follows it, and lands it. The exit code is the verdict, so an agent branches on it directly, with no jq-and-while pipeline to babysit.

# open from the pushed ref, stream progress, land on a clean verdict
$ git push && cachet slice open --follow
  slice_8f3 · confidence mid · waiting: ci, review:coderabbit · bar: high
   ci.passed                47s
  ! review:coderabbit        1 finding on seg_b · confidence mid→low
  → fix seg_b, git push      re-vets only the changed segment
   resolved · confidence high · clears bar · floors pass
   merge → queue → landed on main    0 humans · signed + logged

# exit code = verdict. want per-event hooks? `cachet slice watch --json` streams NDJSON.
exitverdictthe agent does
0merge / landeddone: admitted to the queue, or landed on main
10revisefix actionable findings (or queue eviction), push, re-vet
11blockedhard floor failed (secret, security); must change
12reviewhuman required; escalate, stop
13waitingCI or reviews still outstanding; keep watching

fix is edit + git push. no patch command. pushing to the slice re-vets only the segments that changed.

// scoring

Honest about what a model can and can't judge.

cachet reports confidence in plain bands, None, Low, Mid, High, Excellent, calibrated against real outcomes: a "High" means the change lands clean about 90% of the time, measured by reverts and incidents. Most of the risk signal is computed; the model judges the soft part; the hard cases escalate. (A continuous value stays under the hood for ordering and config.)

reviews are optional. built-in or plugins (CodeRabbit, Greptile, Snyk): zero, one, or many. they feed the confidence; they don't gate it unless you ask.

// config

One file. Confidence-only by default; require a reviewer when you want a floor.

# cachet.yml
auto_merge:
  require: high              # auto-merge at this confidence or better
  require_pass: [security, secrets]   # hard floors, independent of confidence
review:
  plugins: []                # [] is confidence-only. add [coderabbit, greptile] to enrich
  require_review: []         # [coderabbit] makes a passing review a floor
paths:
  "infra/**": { require: excellent }   # only the highest confidence lands unattended
  "docs/**":  { require: mid }         # cheap to land
// trust

Built for a world where the author is an untrusted program.

Unattended merge is only defensible if the chain under it is stronger than a green checkmark.