Skip to main content

SlopCop

Static analysis deep enough for CI, fast enough to run on every edit.

CI Release npm PyPI License Go

slopcop sends one git patch, from the base commit to the working tree, to the hosted check API at https://slopcop.com. The service applies it, runs the hosted policy catalog plus the repository rules you selected, and returns the report: every finding with its severity, the file and line that triggered it, and the certainty behind it. The analysis is Bifrost, an open-source static analysis engine rather than a language model, so a finding traces back to a rule instead of to a guess.

There is no local analyzer and nothing to install per language: the CLI ships the change and prints what comes back, and it never decides on its own that there is nothing to check. The command is built for agents and one-shot CI: no prompts, one request, and the analyzer's exit contract.

Install

npm, PyPI, the release archive, and the PowerShell installer all install the same release binary for macOS, Linux, and Windows on x64 and arm64, so slopcop version reports which release it came from. The Go toolchain can build that binary from source instead.

Channel Platforms Needs
npm macOS, Linux, Windows Node 22 or newer
PyPI macOS, Linux, Windows Python 3.9 or newer
Release archive macOS, Linux, Windows nothing
PowerShell installer Windows PowerShell
Go built from source Go 1.25 or newer

npm

npm install --global @brokkai/slopcop
slopcop --help

The tarball carries the release binary for every supported platform, so it needs no Go toolchain. npx @brokkai/slopcop runs it without installing it.

PyPI

pip install brokk-slopcop

pipx install brokk-slopcop or uv tool install brokk-slopcop puts it in an environment of its own. The wheels carry the release binary, so no Go toolchain is needed either. The package is brokk-slopcop because PyPI already has an unrelated project named slopcop; the command it installs is still slopcop, and python -m brokk_slopcop runs the same binary.

Release archive

Each release publishes slopcop_v<version>_<os>_<arch>.tar.gz (.zip on Windows) holding the binary, README.md, and LICENSE, plus a checksums.txt covering every archive. Download them from https://github.com/BrokkAi/slopcop/releases/latest and check the sha256 before unpacking:

ver=0.0.3; os=linux; arch=amd64   # darwin/arm64 on Apple silicon
base=https://github.com/BrokkAi/slopcop/releases/download/v$ver
curl -fsSLO "$base/slopcop_v${ver}_${os}_${arch}.tar.gz"
curl -fsSLO "$base/checksums.txt"
grep "${os}_${arch}" checksums.txt | sha256sum -c -   # shasum -a 256 -c - on macOS
tar -xzf "slopcop_v${ver}_${os}_${arch}.tar.gz" slopcop
sudo install -m 755 slopcop /usr/local/bin/slopcop

PowerShell installer

irm https://raw.githubusercontent.com/BrokkAi/slopcop/master/install.ps1 | iex

It takes the latest release, verifies the archive against checksums.txt, installs slopcop.exe to %LOCALAPPDATA%\Programs\slopcop, and adds that directory to the user Path. SLOPCOP_VERSION, SLOPCOP_INSTALL_DIR, and SLOPCOP_NO_MODIFY_PATH override its defaults.

Go

go install github.com/BrokkAi/slopcop/cmd/slopcop@latest

Go 1.25 or newer is required to build. A plain go install reports dev as its version; in a clone, make install stamps the version from git describe.

Enable it in an agent

The binary carries the agent skill that teaches a coding agent how to run slopcop. slopcop init installs it into each well-known skills directory whose harness is present, and names what it did:

Location Harness
~/.agents/skills/slopcop/ Codex, opencode
~/.claude/skills/slopcop/ Claude Code, opencode
$CODEX_HOME/skills/slopcop/, or ~/.codex/skills/slopcop/ Codex home

A skill that is already there is left alone, so local edits survive and running init again is safe. slopcop init --no-skill skips the install and any update of it.

Sign in

slopcop login                           # browser device flow
slopcop login --token "$SLOPCOP_TOKEN"  # existing credential, for CI and agents

The browser flow prints a URL and a code and stores the token once the login is approved. The service URL defaults to https://slopcop.com; --service, $SLOPCOP_SERVICE, or a stored value override it.

The credential lives in slopcop/config.json under the user config directory and is written owner-only. slopcop logout clears it.

Precedence:

Value Order
Service URL --service, $SLOPCOP_SERVICE, stored by slopcop login, https://slopcop.com
Token $SLOPCOP_TOKEN, stored value

Check

slopcop                          # check the change in the current checkout
slopcop check --format json      # same, machine-readable
slopcop --root ../repo --base HEAD~1

The base commit defaults to the merge base with the branch upstream, then the merge base with origin/HEAD, then HEAD. The service must already have the base commit in its clone; a missing one comes back as the service's base_not_found message and remedy.

Every run sends one check request, even when the working tree matches the base and the patch is empty. A clean result or a failure always comes from the service.

Flags:

Flag Meaning
--root PATH repository to check (default .)
--base REV base commit or revision for the change
--format human|json|sarif report format (default human)
--fail-on never|finding|note|warning|error exit-1 threshold for new findings (default finding)
--show-existing also list the findings that were already in the code
--policy PATH repository-relative .rqlp file to evaluate (repeatable)
--no-policy-discovery skip .slopcop/policies rules
--timeout DURATION how long to wait for the result (default 10m)
--verbose print the resolved request to stderr

What is sent

One git patch from the base commit to the working tree. An empty change is sent as an empty patch, not filtered out. The patch carries committed but unpushed work, unstaged edits, untracked files, deletions, renames, mode changes, and binary content. Git-ignored files stay out, except selected .slopcop/policies rules, which must travel because the service evaluates them from the patched checkout.

The service owns the limits on what a check accepts. When a change is too large or touches too many files, the service's payload_too_large response is printed verbatim; the CLI does not impose its own limits.

Every check also runs the hosted catalog. Rules under .slopcop/policies/**/*.rqlp are added automatically unless --no-policy-discovery is set.

New and pre-existing findings

A check fails only on findings the change introduced or touched: the service marks a finding new when it is in a file the change writes and its lines meet a line the change added, or the line beside one it removed. Findings that were already in the code are counted, never fail the check, and are listed only with --show-existing. A change that introduces nothing exits 0, however many findings the repository already holds.

Output and exit codes

The service answers structured data; the CLI renders it. human prints one block per new finding, then the pre-existing ones with --show-existing, a summary line such as 1 new finding across 1 file(s); 72 already in the code (--show-existing lists them) | Analysis complete, and any omitted or incomplete checks. json prints status, baseCommit, summary (newFindings and existingFindings count the split), findings (each with new), incomplete, and failure when the analysis did not complete. sarif prints a SARIF 2.1.0 log whose results carry baselineState new or unchanged. --format and --show-existing only change the rendering, never the request, so the service answers the same check whichever is used.

Exit Meaning
0 Check completed; no new finding crossed the --fail-on level
1 A new finding crossed --fail-on
2 No new finding crossed --fail-on, but a check was incomplete; or the CLI or service failed
3 The check was still running when --timeout ran out

An inconclusive check fails the check only when it concerns a file the change writes. One about other files is listed on an Inconclusive outside the change line (inconclusiveElsewhere in json, a note notification in sarif) and never changes the exit code. A check that timed out counts wherever it is. The service can place an inconclusive check only once Bifrost reports which files it concerns; until then every one counts as in the change.

The service applies --fail-on and sets the status; the exit code follows it. The CLI always sends --fail-on, defaulting to finding: a check fails only on findings the change introduced, so any of them, a note or an unrated one included, is worth fixing before the change lands. The service's own default for a request without failOn is Bifrost's warning; pass --fail-on warning to match it. New findings that cross --fail-on exit 1 even when some check did not complete.

While the service answers check_running, the CLI waits the Retry-After it names and asks again until --timeout runs out; every ask attaches to the same running check. If it is still running then, the CLI exits 3, prints the service's message and remedy on stderr, and in json prints {"status": "pending", "retryAfter": 5, "message": …, "remedy": …} on stdout (sarif prints a run with slopcop.status pending). Running the same check again picks up the same analysis.

Service failures print the closed contract exactly: message, remedy, and any install URL. The codes, messages, and remedies are defined by the service in server/src/check.rs of BrokkAi/bifrost-service; the CLI does not rewrite them. The remedies name no client, so when one says to sign in the CLI adds the slopcop login command after it. A failed request prints no report on stdout.

While SlopCop is still indexing the repository, the service answers indexing_in_progress at once instead of running the check. The CLI prints it and exits 2 without waiting or retrying.

API

The CLI calls POST <service>/v1/check with a bearer token:

{
  "repoUrl": "https://github.com/owner/name",
  "baseCommit": "0123456789abcdef0123456789abcdef01234567",
  "change": "<base64 git patch>",
  "selection": {"files": [".slopcop/policies/rule.rqlp"]},
  "failOn": "finding"
}

The service rejects any other field. The response carries status, baseCommit, applied, summary, findings, incomplete, and failure when the analysis did not complete. Against a service from before findings were marked new, the CLI treats every finding as new, as that service gated on all of them. Non-2xx responses carry code, message, remedy, retryable, and an optional installUrl.

slopcop login uses the device flow: POST /api/device returns a deviceCode, userCode, verificationUri, expiresIn, and interval, and POST /api/token returns 202 while pending or 200 with a token once approved. The polling codes are authorization_pending, slow_down, expired_token, and access_denied.

Development

make test        # go test ./...
make vet         # go vet ./...
make build       # bin/slopcop-<goos>-<goarch>
make cross-check # linux, darwin, and windows on amd64 and arm64
make npm-test    # node --test npm/test
make wheels      # pypi-dist/, one wheel per release target

Releases are tag-driven. Pushing a v*.*.* tag runs GoReleaser, which builds linux, darwin, and windows for amd64 and arm64, packages tar.gz archives (zip on Windows) with checksums.txt, and publishes the GitHub release. .goreleaser.yaml is the single source of truth; CI runs goreleaser check and a snapshot build on every change, and make release-check runs the same locally when GoReleaser is installed. The same tag push then packs @brokkai/slopcop from those release archives and publishes it to npm with trusted publishing, so the package needs no npm token.

The same tag also packs a wheel per release target from the binaries GoReleaser just built, installs the wheel for every platform GitHub can run, and publishes brokk-slopcop to PyPI with trusted publishing, so that package needs no PyPI token either.

Layout:

Path Purpose
cmd/slopcop process entry point
internal/cli cobra commands, selection, exit codes
internal/gitx remote canonicalization, base resolution, patch building
internal/service /v1/check client and the wire contract
internal/report human, JSON, and SARIF rendering from the structured response
internal/config stored service URL and token
npm launcher, packer, and tests of the @brokkai/slopcop package
packaging/pypi wheel packer and launcher of the brokk-slopcop package
skills/slopcop the agent skill the binary embeds and installs
docs/npm-publishing.md npm release flow and trusted publisher setup
docs/pypi-publishing.md PyPI release flow and trusted publisher setup
.goreleaser.yaml tag release build, archives, and checksums

Metadata

Release files for brokk-slopcop 0.0.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for brokk-slopcop 0.0.4
File Actions
brokk_slopcop-0.0.4-py3-none-win_arm64.whl Python 3 none Windows ARM64 Details for brokk_slopcop-0.0.4-py3-none-win_arm64.whl
brokk_slopcop-0.0.4-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details for brokk_slopcop-0.0.4-py3-none-win_amd64.whl
brokk_slopcop-0.0.4-py3-none-musllinux_1_2_x86_64.whl Python 3 none Linux musl 1.2+ x86-64 Details for brokk_slopcop-0.0.4-py3-none-musllinux_1_2_x86_64.whl
brokk_slopcop-0.0.4-py3-none-musllinux_1_2_aarch64.whl Python 3 none Linux musl 1.2+ ARM64 Details for brokk_slopcop-0.0.4-py3-none-musllinux_1_2_aarch64.whl
brokk_slopcop-0.0.4-py3-none-manylinux_2_17_x86_64.whl Python 3 none Linux glibc 2.17+ x86-64 Details for brokk_slopcop-0.0.4-py3-none-manylinux_2_17_x86_64.whl
brokk_slopcop-0.0.4-py3-none-manylinux_2_17_aarch64.whl Python 3 none Linux glibc 2.17+ ARM64 Details for brokk_slopcop-0.0.4-py3-none-manylinux_2_17_aarch64.whl
brokk_slopcop-0.0.4-py3-none-macosx_12_0_x86_64.whl Python 3 none macOS 12.0+ x86-64 Details for brokk_slopcop-0.0.4-py3-none-macosx_12_0_x86_64.whl
brokk_slopcop-0.0.4-py3-none-macosx_12_0_arm64.whl Python 3 none macOS 12.0+ ARM64 Details for brokk_slopcop-0.0.4-py3-none-macosx_12_0_arm64.whl

Total release size: 26.9 MB

Release files / brokk_slopcop-0.0.4-py3-none-win_arm64.whl

Download URL brokk_slopcop-0.0.4-py3-none-win_arm64.whl
Size 3.2 MB
Tags Python 3 Windows ARM64
SHA-256 checksum
How to use checksums
ab804f8f135d3eee954b8e6637f163224f289dab214d50644b45e5327e5f31c5
BLAKE2b-256 checksum
How to use checksums
d90c0185f1030b8f6b6b5a8f79d2e64b75c8d5aeb4b0094fa617a872b51dab78
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / brokk_slopcop-0.0.4-py3-none-win_amd64.whl

Download URL brokk_slopcop-0.0.4-py3-none-win_amd64.whl
Size 3.6 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
32c60c0022e57f5f11f1c5ab0caa1bec97008135353e406a1a3334da645bf324
BLAKE2b-256 checksum
How to use checksums
213c6ed0fecc79beb0af4243530850d4137e209564c7407a180331774b3c7b32
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / brokk_slopcop-0.0.4-py3-none-musllinux_1_2_x86_64.whl

Download URL brokk_slopcop-0.0.4-py3-none-musllinux_1_2_x86_64.whl
Size 3.5 MB
Tags Linux musl 1.2+ x86-64 Python 3
SHA-256 checksum
How to use checksums
bcf520b08e78706141338a026bb42f9c3d9b2c83ce3559aa29ae5293663c7faa
BLAKE2b-256 checksum
How to use checksums
06603f6a3a59dd28699f23b55c5c91468d643ef5009dc1e72626da45dae59e06
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / brokk_slopcop-0.0.4-py3-none-musllinux_1_2_aarch64.whl

Download URL brokk_slopcop-0.0.4-py3-none-musllinux_1_2_aarch64.whl
Size 3.2 MB
Tags Linux musl 1.2+ ARM64 Python 3
SHA-256 checksum
How to use checksums
f26efede99a166d9e4aca8ff8194643d3e36a8c56ab8bdfe2869fbbd734ee3ad
BLAKE2b-256 checksum
How to use checksums
b4908ace2246f17898945d890a1103b70f245c6118734c35bea19cc076d1c329
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / brokk_slopcop-0.0.4-py3-none-manylinux_2_17_x86_64.whl

Download URL brokk_slopcop-0.0.4-py3-none-manylinux_2_17_x86_64.whl
Size 3.5 MB
Tags Linux glibc 2.17+ x86-64 Python 3
SHA-256 checksum
How to use checksums
c81efaeb37a7ec0f27ee094997ad494a4135290b84e9953cba3b8967aa166fb1
BLAKE2b-256 checksum
How to use checksums
6d3c76f99406b572a6872dfad825abdac357430ff7513363f00407f78d0b33e5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / brokk_slopcop-0.0.4-py3-none-manylinux_2_17_aarch64.whl

Download URL brokk_slopcop-0.0.4-py3-none-manylinux_2_17_aarch64.whl
Size 3.2 MB
Tags Linux glibc 2.17+ ARM64 Python 3
SHA-256 checksum
How to use checksums
cfd5347d910836971238b5b1aa6ad206e1659e46568277e9200ae03b19e1a40e
BLAKE2b-256 checksum
How to use checksums
996ba2d64164d70fa0fce41979ca9212ad5b845a6f1737638778282e4d45955d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / brokk_slopcop-0.0.4-py3-none-macosx_12_0_x86_64.whl

Download URL brokk_slopcop-0.0.4-py3-none-macosx_12_0_x86_64.whl
Size 3.5 MB
Tags Python 3 macOS 12.0+ x86-64
SHA-256 checksum
How to use checksums
2b5b28a30b8d5c2c2b77b371de8113f4214382307c514cbe49525767e0bf4990
BLAKE2b-256 checksum
How to use checksums
7d0424154c554d7b2ce8b19772d49fdc830b222f3345c5a4bd1b358d4bf37f86
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / brokk_slopcop-0.0.4-py3-none-macosx_12_0_arm64.whl

Download URL brokk_slopcop-0.0.4-py3-none-macosx_12_0_arm64.whl
Size 3.3 MB
Tags Python 3 macOS 12.0+ ARM64
SHA-256 checksum
How to use checksums
c9898d70f228e2ed856bbf93f9865eb619b2c371b2fdbe3d26762154eeaee9f4
BLAKE2b-256 checksum
How to use checksums
9a1ef25b7427bcc115569715f9002192aa2fcc37c1e3a9fde54c03225bec41a5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Security for brokk-slopcop 0.0.4

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 8 files in this release have been uploaded with provenance metadata.

Select from 8 files

Attestation for brokk_slopcop-0.0.4-py3-none-win_arm64.whl

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page