Docs

The Vinaya process

Gates

Checks that refuse unsafe work at three points: on your machine, on the pull request, and after merge. They run for every writer, human or agent, and cannot be skipped.

37 checks
Ring 0
Ring 1
Ring 2
Always on

About gates

A written rule gets broken under pressure, even by an honest agent. A gate turns that rule into a check a machine runs, so the rule holds without anyone watching.

Each gate reads facts it can verify (the diff, the pull request, the Issue, the forge) and answers pass or fail. It never judges quality and never decides how severe a finding is. Reviewers judge; the pinned review policy decides what blocks.

Vinaya ships 37 core checks:

  • 17 implement generic gates. Every process must answer these questions, such as "is the evidence current?" or "is the review valid?". Vinaya answers them with its own checks.
  • 20 are Vinaya-specific. They exist because of how Vinaya works: briefs, tranches, task branches, Issue grammar, writing rules.

How gates run

Gates run in three rings. Each ring catches what the one before it cannot reach.

  1. 1

    Ring 0 · on your machine

    At every commit and push, the installed hooks run the checks before anything leaves the machine. A refusal comes back in the author's own session with the exact error, so an agent fixes it where it happened.

  2. 2

    Ring 1 · on the pull request

    The same checks run again in CI, from the same code, so the hooks and CI cannot disagree. Pull-request checks and the review gate run here too, and merge is blocked while any is red. Validated Issue and pull-request writes are checked before they reach GitHub. This ring catches every writer the hooks cannot reach: the web interface, other tools, people.

  3. 3

    Ring 2 · after merge

    Audits run on every merge and once a day. They close finished work and report drift from any source, such as a push to a branch whose work is already done, or a push straight to main.

All three rings are always on. A team cannot switch a ring off; see Configuration for the two narrow opt-outs.

The 37 checks

The checks are grouped by where they first run.

Run the checks yourself

The hooks and CI run the checks for you. You can also run them by hand.

Runs every check that can run locally.

vinaya check --all --local

Each check either passes, or fails with one line per problem. A check can also report a wait rather than a defect, for example while a Principal test-plan item is still unticked.

Customize the checks

A team adapts the checks in vinaya.config.json. Configuration selects and parameterizes checks; it never loads code.

Scaffold your own check, then register it under your own namespace.

vinaya new check

A check that declares validates: 'body' or validates: 'issue' joins the pull-request or Issue write path with no further wiring.

Configuration

KeyWhat it sets
checksWhich checks run, with what scope (diff or full), environment and timeout. Adds, replaces or silences checks.
ringsThe two opt-out flags below.
prePushExtra test files the push hook always runs.
securityScanThe scanner the review loop runs before the security review.
gateCutoversIssue or pull-request numbers below which a newer rule does not apply.
proseGatesInputs for the writing checks, such as where reader-facing docs live.
decisionRecordsWhere decision records live, for the writing checks.

The rings flags both default to true:

vinaya.config.json
{
  "rings": {
    "ring1_forgeWriteInterception": true,
    "ring2_asyncAudits": true
  }
}

What gets logged

Every check run writes to the Log:

EventWhenCarries
gate · summaryOnce per runHow many checks ran, passed, failed and were skipped, and which failed
gate · checkedOnce per check that did not passThe check, its outcome and a short reason code

A passing check is counted, not logged one by one. The reason is a short code, never the check's message, so nothing from a pull-request body leaks into the Log. See Events for every field.

Troubleshooting

What's next