Keeps settled things settled in a repository worked on with agents.

A project accumulates decisions faster than it accumulates ways to keep them. Three months on, nobody can say whether a thing was decided, drifted, or was never settled at all — and a settled thing quietly unsettled surfaces as a surprise rather than a red.

snubber gives a repository a record: Decisions, the Evidence behind them, and the Work they gate, written as Markdown files that live and travel with the code they govern. snubber check compares the record against the tree and fails when the two disagree. The format is the point; the tool enforces it.

Status, plainly

A git repository is required — the repository is what git reports present and not ignored, so no git is an error, not a fallback. Below 1.0.0 the format is not stable: a minor bump may fail a record that conforms today.

node
>=22.18
package
snubber@0.1.0
action
snubber-dev/snubber@v0.1.0
licence
MIT

Try it

npx snubber init      # seed record/ in the current repository
npx snubber check     # 0 clean, 1 violations, 2 the tool could not run
npx snubber board     # the computed view of the record's state

The exit code is the whole external contract. Every error names what was not understood and the way out.

0

clean

1

violations

2

the tool could not run

As an action

on: pull_request

jobs:
  record:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
      - uses: snubber-dev/snubber@v0.1.0

It runs the check on a pull request and posts the board to the step summary. There is deliberately no floating major tag — consumers pin an exact version.

What a record looks like

record/decisions/R-D-fail-closed.md
# R-D-fail-closed — Unrecognised
  input is an error, everywhere

**Status.** `closed`
**Opened.** 2026-08-23

## Closed — 2026-08-23

**Ruling.** Unrecognised input is an
error: name what was not understood
and exit non-zero, at every site.
**Scope.** `src/cli.ts`, `src/check.ts`,
`src/runtime.ts`, `src/format.ts`
npx snubber board
Open questions (7)
  R-D-scope-ceiling  Scope is one
    line, and a real project may
    not fit
  R-D-unfalsifiable-decisions  Must
    an open Decision declare what
    settles it
  …

Work in flight (0)

Scope that does not hold (1)
  R-D-evidence-lineage
    record/evidence/**  (gated)

The published package ships the checker and the spec, never a record: a record travels with its repository, not with the tool.