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
# 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`
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.