Skip to content

Post Merge Checks

VINH BUI edited this page Nov 1, 2026 · 1 revision

Post-Merge Checks

There is no merge queue. Following the model Anthropic describes for Scion, main is checked after each merge rather than before, and bisect and revert are cheap.

av repo settings myrepo --check "python -m pytest -q"
av runner --repo myrepo --trust        # checks main, then every merge as it lands
av health --repo myrepo                # green, or red since which merge and its task
av log --repo myrepo                   # ✓ passed · ✗ failed · · unchecked
av bisect --repo myrepo --trust        # which merge broke main, and its task
av revert <task> --reason "..."        # take one merge out of main, even an older one
av why app/util.py:42 --repo myrepo    # the task, goal and decisions behind a line
  • The daemon never runs commands. av runner runs on the machine where the code should be tested. It fetches each new main through the read API (no checkout), runs the command and posts the result. Because that command comes from the daemon's database, the runner refuses to start without --trust.
  • While main is red, every context pack opens with a warning naming the culprit merge.
  • av why reads a per-path blame computed from each commit's parent blame and cached by commit id, so it is computed once and never needs invalidating.
  • Required conventions can carry check commands, and submit refuses leftover conflict markers.

Backups

av repo backup myrepo --remote git@github.com:me/myrepo.git [--branch av-main]

Main is pushed after every merge and undo (AV_BACKUP_REMOTES sets this at start-up). The push runs in the background and is never forced. A failure is stored and retried with backoff (1 s, 2 s, 4 s … up to 5 min); av status and av repo backup show it. A backup failure never fails the merge. --branch av-main pushes to a separate branch, for example to open a pull request from it.

Ideas borrowed from Scion

Idea from the article In Scholion
A thin client; the server owns history, merges and rebases The daemon owns all state; the CLI and MCP tools are thin HTTP clients
An API complete enough that jobs need no checkout GET /v1/repos/{r}/files, /tree, /diff, /log and the MCP tools read_file, list_files, diff, log
Derived data computed per change from its parent's value Blame cached by immutable commit id; av why path:line
No global merge queue: merge, test after, bisect and revert av runner, av health, av bisect, av revert
Approvals with constraints, so a mechanical rebase needs no fresh review An approval carries over when the task's own patch is unchanged, or the only overlap is in carry_globs files
Push instead of polling GET /v1/events long-poll and av events --follow

Scholion is independent and not affiliated with Anthropic; it only borrows ideas from the public article Redesigning source control.

Clone this wiki locally