tackle ↑ subaud

sift · audits of the instruction files your agents read

Keep the files your agents read short and true.

sift audits the instruction files coding agents read and finds what is too big, duplicated, stale, dead or misplaced. An agent writes a revised version of each file with findings, and you decide each file on a local page. What you approve becomes one pull request per repo, and merging it is up to you.

what it reads

The files that tell an agent how to work.

An instruction file is a file a coding agent reads before it starts work, such as a repo's AGENTS.md or CLAUDE.md. Your agent also has a global file, which applies in every repo (Claude Code reads ~/.claude/CLAUDE.md, for example), and skills, which are instructions for one kind of task that the agent loads when the task comes up. These files grow a line at a time and are rarely reread, so over time they drift from the code they describe.

sift reads each global file and skill for the agents you use (Claude Code, Codex and pi), and every instruction file in the repos under the directories you name. It reads each repo at its fetched default branch, so the audit sees what is on that branch rather than your uncommitted work. It skips forks and the skill directories a vendor manages, and lists what it skipped.

what it finds

Eight checks, each with a reason.

Each finding names the file, the line, the check and a one-line reason. A finding marked certain is one sift can prove, such as a path that does not exist, and the recommendation for that file must fix it. Any other finding the agent can fix, or keep with a reason.

size

A file over its budget. Global files, repo files and skills each have their own budget, which you can change in the config.

load limit

An agent loads the global file and every instruction file from the repo root down to the directory it works in. Past the agent's own limit, it silently drops the rest.

duplicate

The same passage in two places, for example a rule in your global file that a repo's file repeats word for word.

dead path

A file or directory the text points to that no longer exists, such as docs/setup.md after it was renamed.

stale status

A status note that may be out of date, such as "waiting on the pull request that adds retries" after that pull request merged, or an old date.

retired store

A pointer to a notes store you have listed in the config as retired, so an agent stops reading from or writing to it.

misplaced

Text that belongs somewhere else, such as a rule about one repo written in the global file that every repo loads.

secret

A password, token or API key written into the file. The finding shows only its first characters and its length.

a round

Ask your agent for an audit.

A round is one audit from start to finish. With the sift skill installed, ask your agent to audit your instruction files, and it runs the round through the sift channel's tools:

  1. It audits the files, and tells you if they are clean.
  2. It writes one revised version of each file with findings, saying for each finding how it fixed it or why it kept the text. When text belongs in another file, it revises both files together.
  3. It opens the review page and waits while you decide.
  4. After you press Send, it writes what you approved, one branch and pull request per repo, and reports each pull request and anything it held back.
  5. Once you have merged or closed the pull requests, it removes the branches it made.

sift holds back a file whose branch moved on since the audit, or a repo with uncommitted or unpushed work, and says why. A file outside every repo is left for you, with its approved content saved and its path reported.

your review

You decide every file.

The review page runs on your machine. Each file to change shows its current and recommended versions side by side, with the findings, what the recommended version does about each, and a diff. Pick one version, or write your own, and add a note if you like. Linked files are decided together, so text moved from one file to another is never written to only one of them.

Files the agent would leave as they are get agree or disagree. Agreeing mutes their findings until the text changes. Disagreeing takes a note, and after Send the agent recommends that file again for you to decide.

Press Send to hand your decisions to the agent session that opened the page. In Claude Code, the sift plugin from the install steps delivers Send into the session, and in pi the sift channel does, through channels.tools. In any other agent, run sift wait, which returns when you press Send and prints what to do next.

install

Install sift, set it up once.

One command downloads sift, verifies its checksum, and puts it on your PATH (~/.local/bin). Then install the sift skill for each agent sift finds, and name the directories to audit. Run sift skills install again after each upgrade.

$ curl -fsSL https://tackle.tools/install.sh | sh -s sift

# then
$ sift skills install
$ sift init --root ~/src
$ sift doctor            # checks the setup

# Claude Code
$ claude plugin marketplace add subaud-tools/plugins
$ claude plugin install sift@subaud-tools

Then start claude as usual. In a session that is already open, run /reload-plugins to load the plugin.

Turn on auto-update for the subaud-tools marketplace so the plugin stays current: in Claude Code, run /plugin, open the Marketplaces tab, select subaud-tools and choose Enable auto-update.

On macOS, kempt can install sift from the manifest in a clone of the tackle repo, which also installs the sift plugin for Claude Code and registers the sift channel for pi: kempt apply -manifest cmd/sift/kempt.toml -packages sift. Then run the same sift skills install and sift init steps. sift opens pull requests with gh, so sign in to it first.