Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

592 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

NoSlop

NoSlop is the reviewer that knows the author is an AI.

Most review tools evaluate a diff as if a person wrote it. AI-authored changes have additional failure modes: checks that prove nothing, tests weakened to fit an implementation, expected values copied from production logic, permissive defaults after an unknown result, and fixes applied to one path but not its siblings.

NoSlop makes those patterns a first-class review contract. It classifies the change before spending reviewer time, applies named AI-authorship lenses, and uses artifact-specific checks for code and outbound prose.

When generating-agent provenance is supplied, NoSlop also conditions the policy on the last 10 changes from that lane and model. Repeated accepted findings can raise the tier, move affected lenses first, and enable mapped deterministic probes. Every decision prints the history rationale. Missing history keeps the v1 route and says so; unreadable history selects full-adversarial.

This repository is an MIT-licensed fork of kunchenguid/no-mistakes. The inherited no-mistakes gate remains available. The new noslop gate command is a front stage that can run before it or on its own.

Three pillars

Risk-proportional depth

Every gate starts by scoring:

  • Blast radius: what the changed files can reach at runtime.
  • Novelty: new logic, changed logic, mechanical work, or documentation.
  • Reversibility: whether a revert is enough to contain the result.

The selected tier and all three reasons print before validation continues. Use --tier to override the result. When the override changes the tier, the output records both the original and overridden tier.

Tier Work
leak-scan-only Mandatory leak and identity checks, the configured test-count floor, plus any applicable artifact oracle
single-review Mandatory checks and one reviewer pass through every slop lens
full-adversarial Mandatory checks, a lens review, an adversarial challenge round, the test-count floor, and the configured test command

A Markdown-only diff routes to leak-scan-only unless it matches a configured high-risk path or the operator overrides it. Substantial new source additions also reach the full tier even on a feature branch.

AI-slop lenses

The reviewer receives nine named lenses:

  • vacuous-check
  • test-capitulation
  • self-consistent-oracle
  • comment-defended-workaround
  • scope-expansion
  • asserted-followup-without-artifact
  • fail-open-default
  • rule-applied-in-one-place-not-sibling
  • redundant-comment

Every finding carries its lens name. The taxonomy defines the failure, reviewer guidance, and available mechanical pre-check for each lens.

Artifact-class oracles

Secrets and private identity markers are scanned at every tier. The scanner recognizes common credential shapes, personal home paths, and private names from a local blocklist. A missing built-in default blocklist means no private-name list; an explicitly configured missing file and any unreadable file stop evaluation. Findings identify the file and line without copying the matched value. Every honored noslop:allow-leak marker prints its file and line and counts in the verdict. Set slop.leak_scan.allow_exemptions: false when CI must reject all inline exemptions.

Outbound text can be selected by a configured path or outbound: true front matter. The prose oracle checks AI-tell vocabulary, em dashes, cited JSON or CSV numbers, and optional live GitHub issue or pull request state. With --thread, it uses gh to verify the thread is open and checks whether an existing comment already makes substantially the same claim. An explicit thread with no outbound artifact is an evaluation error.

Build

NoSlop requires Go 1.25 or newer.

git clone https://github.com/Blakeolson21/no-slop.git
cd no-slop
go build -o ./bin/noslop ./cmd/noslop

The inherited gate can still be built separately:

go build -o ./bin/no-mistakes ./cmd/no-mistakes

Run

Review committed changes against the merge base of the default branch:

./bin/noslop gate

Name the comparison explicitly:

./bin/noslop gate --base origin/main --head HEAD

Supply the requested scope when the gate should mechanically compare new files and reviewer findings with intent:

./bin/noslop gate --base origin/main --intent "Add the no-store response header only."

Override validation depth:

./bin/noslop gate --base origin/main --tier full-adversarial

If provenance raises the tier, a lower --tier is refused unless --force-tier is also present. The output prints both the provenance signal and the forced override.

Check outbound text against a live GitHub thread:

./bin/noslop gate --base origin/main --thread https://github.com/owner/repo/issues/123

Capture generating-agent provenance for conditioning and later evaluation:

./bin/noslop gate --base origin/main \
  --provider example-provider \
  --model example-model \
  --reasoning-effort high \
  --lane-id review-lane-1 \
  --change-class source

Because the caller supplies --lane-id and --model, provenance conditioning is advisory until a trusted external system supplies and enforces those values.

Use a different private-name blocklist:

./bin/noslop gate --base origin/main --blocklist .private-names

Exit code 0 means pass, 1 means findings blocked the gate, and 2 means the gate could not evaluate the change.

Configure

NoSlop uses the existing .no-mistakes.yaml repository config shape:

slop:
  data_dir: ".noslop-data"
  leak_scan:
    allow_exemptions: false
  test_command: "go test -race ./..."

Keep the real blocklist private and uncommitted. The repository config reference owns all fields, defaults, outbound selection, and blocklist details.

Replay captured policy findings against the seed corpus:

./bin/noslop evaluate \
  --corpus corpus/seeds \
  --unconditioned-results results/unconditioned.json \
  --conditioned-results results/conditioned.json

The corpus format records diffs and independent expected findings. The runner labels the seed corpus and result files as replayed inputs, then reports found, missed, and false-positive counts without inventing reviewer output.

The first measured 32-case campaign found 10 expectations, missed 22, and emitted no unmatched findings under both policies. All model-backed reviewer invocations timed out, so the result does not support a superiority claim. Raw captures and latency records are checked in for replay and inspection.

Development

make build
go test ./internal/slop/...
go test -race ./...
make lint
go build -o ./bin/noslop ./cmd/noslop

License and credit

MIT licensed. The gate foundation is derived from no-mistakes by Kun Chen.

About

A validation gate that reviews, tests, lints, and documents changes before they reach your push target. Derived from kunchenguid/no-mistakes (MIT).

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages