Agent skill

Grind

by atgreen in atgreen/Whistler

Whistler-local autonomous work loop. An agent skill from atgreen/Whistler.

MITAuto-check passedDevelopment

Install Grind

skills CLI
$ npx skills add atgreen/Whistler --skill grind -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install atgreen/Whistler grind --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/atgreen/Whistler.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/grind .claude/skills/grind && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
grind
GitHub stars
101
Token cost
~2.4k tokens
SKILL.md length
1,151 words
Files
1
Skills in repo
2
Repo updated
First seen
Licence
MIT

At a glance

Whistler-local autonomous work loop. An agent skill from atgreen/Whistler.

  • Works in 7 steps: Orient (every run) → Choose the next task — selection rubric → Anti-rat-hole guardrails → …
  • The user says /grind
  • SKILL.md covers 0. Orient (every run), 1. Choose the next task —…, 2. Anti-rat-hole guardrails and 3. Codegen-correctness mandate…, plus 3 more sections
  • Calls make and git

What it does

Grind is an agent skill from atgreen/Whistler. Whistler-local autonomous work loop. Survey the Beads queue, pick the highest-value next task (prioritizing correctness of generated eBPF and progress toward the Lisp→eBPF compiler goal), reprioritize the queue accordingly, then execute it end-to-end with the project's validation discipline (verifier-correct codegen, instruction-count/disassembly parity, test + kernel-load suites). Trigger when the user says "/grind", "grind", "pick the next thing and do it", "keep making progress", or wants an autonomous session…

Its SKILL.md is about 2.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development, covering Project scaffolding and End-to-end testing. The repository describes itself as: A lisp that compiles to eBPF. The licence is MIT.

When your agent uses it

  • The user says /grind
  • Pick the next thing and do it
  • Keep making progress
  • Wants an autonomous session that decides and works without hand-holding

Example prompts

  • “/grind”
  • “pick the next thing and do it”
  • “keep making progress”
  • “/grind”

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. Orient (every run)
  2. Choose the next task — selection rubric
  3. Anti-rat-hole guardrails
  4. Codegen-correctness mandate (non-negotiable)
  5. Reprioritize the queue
  6. Execute end-to-end
  7. Loop or hand off

What it can do on your machine

Read from SKILL.md and the folder at commit efb7cae. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • make
    • git

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Grind loads about 2.4k tokens when it runs. Until then it costs about 142 tokens; SKILL.md has 1,151 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~142
When it runs · the whole SKILL.md, loaded when a task matches
~2.4k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from atgreen/Whistler at commit efb7cae, republished under its MIT licence (© atgreen). 1,151 words, ~2,400 tokens.

Download SKILL.mdSave it as .claude/skills/grind/SKILL.md (or your agent's skills folder).
name
grind
description
Whistler-local autonomous work loop. Survey the Beads queue, pick the highest-value next task (prioritizing correctness of generated eBPF and progress toward the Lisp→eBPF compiler goal), reprioritize the queue accordingly, then execute it end-to-end with the project's validation discipline (verifier-correct codegen, instruction-count/disassembly parity, test + kernel-load suites). Trigger when the user says "/grind", "grind", "pick the next thing and do it", "keep making progress", or wants an autonomous session that decides and works without hand-holding.

grind — the Whistler progress loop

You are advancing Whistler: a Lisp that compiles to eBPF, written in Common Lisp (SBCL). The pipeline is source → macro expansion → lowering → SSA IR → optimization (ssa-opt, sccp) → register allocation → BPF emission → peephole → ELF, with a pure-CL userspace loader (no libbpf/CFFI), a bpftrace frontend, and a standalone symbolizer. The north star: correct, verifier-passing eBPF that holds its own against clang -O2 on instruction count, across every program type and frontend.

/grind = decide what to work on next, reprioritize the queue so that decision is legible, then do the work to completion. One good increment, committed and closed, beats a half-finished heroic epic. Prefer correctness and demonstrable progress toward the goal over breadth.

0. Orient (every run)

bash
bd prime            # workflow + memories (if context is stale)
bd ready            # claimable work
bd stats            # open/blocked/in-progress shape

Skim CLAUDE.md (Architecture + Conventions) for the subsystem you're about to touch — do not re-read all of src/. The pass ordering and the "must include this op" invariants (ir-insn-side-effect-p, regalloc call-positions, shared-definition single-source-of-truth in compiler.lisp) are where correctness bugs hide; re-read the relevant Conventions bullet before editing that pass.

Build the system:

bash
make                # loads/compiles the whistler ASDF system

Compile a program the standard way (state is auto-isolated by compile-file* / with-bpf-session; in the REPL call (reset-compilation-state) between separate compile-to-elf runs):

bash
sbcl --noinform --non-interactive \
  --eval '(require :asdf)' \
  --eval '(push #P"/home/green/git/whistler/" asdf:*central-registry*)' \
  --eval '(asdf:load-system "whistler")' \
  --eval '(whistler::compile-file* "examples/synflood-xdp.lisp" "output.bpf.o")'

1. Choose the next task — selection rubric

Score candidates in this order and pick the highest that is tractable now:

  1. Correctness first. A bug that produces wrong eBPF — a miscompile, a verifier rejection, a wrong runtime value, a broken relocation (map, kfunc, CO-RE), a bad ELF section — outranks any feature or perf work. Wrong code poisons everything built on it, and the verifier is unforgiving.
  2. On the critical path to the goal. Prefer work that widens verifier-correct coverage (program types, helpers/kfuncs, protocol/context accessors) or closes the gap to clang -O2 on real benchmarks (e.g. nodeport-lb4: Whistler 76 vs clang 75 instructions).
  3. Serves the compiler goal. Codegen quality (optimization passes, peephole, regalloc/spilling), shared single-source-of-truth correctness across the two frontends + loader (helpers/kfuncs/constants in compiler.lisp), loader/ session parity (both paths must patch the same relocations). Value work that makes the compiler better, not incidental surface.
  4. Tractable and verifiable. A clear done-signal and a way to observe it end-to-end — a test that flips, an instruction count that drops, a program that now loads into the kernel. Favor a well-scoped bug or a decomposable slice over an open-ended epic.

Deprioritize: cosmetic cleanups, speculative features, anything with no line to the goal, and tracking/rollup epics — don't "work" a rollup; decompose it into a concrete child and do that.

When the top candidate is a large epic, carve off the smallest child that delivers real, verifiable value and do that this run.

2. Anti-rat-hole guardrails

  • Time-box the investigation. If after a bounded dig the task reveals itself as an architecture epic (multi-subsystem, no clear done-signal), stop: write findings + a decomposition as Beads, pick a smaller adjacent win, and proceed. Don't sink the session into a bottomless path.
  • Chase a done-signal, not a rabbit. Every task needs an observable "it works now" (a form that compiles to the right instructions, a test that flips, a program that loads and attaches). If you can't state it, you're rat-holing.
  • Commit validated increments. Don't stockpile a giant uncommitted change. Land each proven step; the next session/agent benefits.
  • A decision that's genuinely the maintainer's (a language-semantics policy, a big irreversible direction) — surface it briefly and pick the safe default or ask, rather than guessing and building the wrong thing at length.
Show full SKILL.md (606 more words)Show less

3. Codegen-correctness mandate (non-negotiable)

Whistler emits code the BPF verifier must accept and the kernel must run correctly. Two disciplines protect that:

  1. Preserve the pass invariants. Any op that modifies state must be in ir-insn-side-effect-p (stores, calls, tail-call, struct-alloc, branches) or DCE will silently delete it. Any call-like op (map-lookup, map-lookup-ptr, tail-call, …) must be in regalloc's call-positions list or R1–R5 clobbering corrupts live values. Peephole passes are order-dependent. A violation here is exactly a silent miscompile — treat it as the top-priority failure mode.
  2. Keep the shared definitions single-source. Helpers, constants, builtins, and the kfunc registry live in compiler.lisp; lower.lisp, the bpftrace frontend, and the loader reference them, never copy. When you change a kfunc/helper/reloc, update the one registry and confirm both load paths still patch it (ELF loader patch-kfunc-relocations, session session-load-progs).

Prove it before committing on any codegen path you touched:

  • Compile and inspect the output. Regenerate the affected example and read the disassembly (whistler::disassemble-cu on the compilation-unit from compile-to-elf). For codegen changes, compare instruction counts and disassembly against the prior output — a count that went up unexpectedly, or a changed instruction you can't explain, is a regression until proven otherwise.
  • Run the suites (§5). A green make test plus a clean disassembly diff is the cheapest evidence a codegen change is correct.
  • Load it into the kernel when the change can affect what the verifier sees — make test-torture actually loads compiled programs (needs CAP_BPF). Use /usr/bin/sbcl (it carries the BPF caps), not the Homebrew SBCL, for any kernel-load test.

An unexplained instruction-count change, a verifier rejection under torture, or a relocation the loader no longer patches means you broke something — find it before committing.

4. Reprioritize the queue

Make the decision legible by aligning priorities with the rubric — before you start coding:

  • Raise correctness/miscompile bugs and critical-path/goal work that are currently underranked; lower speculative or off-goal items. bd update <id> --priority N.
  • Leave a one-line bd comment on anything you re-rank, saying why (e.g. "raise: verifier-reject on the tail-call path" / "lower: cosmetic, off critical path"). Keep churn minimal — reprioritize to reflect the plan, not to reshuffle the whole board.
  • File newly discovered work as Beads immediately (never a // TODO or a mental note): bd create "…" -t bug|task -p N. Model blockers with bd dep add.

5. Execute end-to-end

bash
bd update <id> --claim
  1. Implement the smallest correct change. Match surrounding code idiom; keep the shared definitions in compiler.lisp authoritative (§3).
  2. Rebuild (make); drive the affected flow and observe the result (the /verify discipline) — compile the relevant example and read its disassembly, don't trust tests alone. Wrong-code bugs demand you see the right instructions now.
  3. Run the suites:
    bash
    make test               # FiveAM (whistler/tests)
    make bpftrace-parse-test # when the bpftrace frontend is touched
    make test-torture       # kernel-load, needs CAP_BPF (use /usr/bin/sbcl)
    For codegen changes, also compare instruction counts and disassembly against the pre-change output (§3).
  4. Commit with an imperative subject citing the bead id and a note on what codegen/verifier behavior you confirmed; end the message with: Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
  5. bd close <id> with the commit hash and what was verified (tests green, disassembly diff, kernel-load result); bd sync. git push only when the user asks. If not on a branch and about to commit, branch first.

6. Loop or hand off

Report: what you picked and why (the rubric line it satisfied), the change, how you verified it (tests, instruction-count/disassembly diff, and any kernel-load evidence), what you re-ranked, and any new Beads filed. Then pick the next task (repeat) until told to stop or the queue has no tractable correctness/goal work left — at which point say so plainly rather than inventing busywork.

© atgreen, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/grind of atgreen/Whistler.

Open the folder on GitHubat commit efb7cae

Compare with similar skills

Grind next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Grind compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Grind this skillatgreen/Whistler101—~2.4kAutomated safety check: PassMIT
Jinja Codegenxberg-io/alef100—~735Automated safety check: PassMIT
Dx Harnesspproenca/dot-skills215—~1.5kAutomated safety check: PassMIT
Add Full Slicefullstackhero/dotnet-starter-kit6.8k—~783Automated safety check: PassMIT
Release WorkflowGoldziher/spikard123—~909Automated safety check: PassMIT
Bmad Testarch Atddbmad-code-org/bmad-method-test-architecture-enterprise1043 repos~1.2kAutomated safety check: PassCustom licence

Similar skills

  • Jinja Codegen

    xberg-io/alef

    Mechanics of alef's Minijinja template system: which templateenv module to call, how to register a template, inline-template rules, and engine settings.

    100 GitHub stars~735 tokensUpdated today
    DevelopmentAuto-check passed
  • Dx Harness

    pproenca/dot-skills

    Developer-experience friction auditing and fixing — slow onboarding, repeated manual setup steps, missing bootstrap/reset/seed scripts, undiscoverable conventions.

    215 GitHub stars~1.5k tokensUpdated 1 mo ago
    DevelopmentAuto-check passed
  • Add Full Slice

    fullstackhero/dotnet-starter-kit

    Build a capability end-to-end — backend vertical slice (Contracts→handler→validator→endpoint) AND the React page wired to it.

    6.8k GitHub stars~783 tokensUpdated 8 days ago
    Testing & QAAuto-check passed
  • Release Workflow

    Goldziher/spikard

    Release/publish the spikard Rust core crate and CLI end-to-end.

    123 GitHub stars~909 tokensUpdated 5 days ago
    Backend & APIsAuto-check passed
  • Bmad Testarch Atdd

    bmad-code-org/bmad-method-test-architecture-enterprise

    Generate red-phase acceptance test scaffolds using the TDD cycle.

    104 GitHub starsUsed in 3 repos~1.2k tokens
    Testing & QAAuto-check passed
  • NestJS Expert

    Jeffallan/claude-skills

    Scaffolds NestJS modules, controllers, services, DTOs and guards for TypeScript backends, with validation, JWT and Passport auth, Swagger docs and unit and E2E tests.

    12k GitHub stars~2k tokensUpdated 5 days ago
    Backend & APIsAuto-check passed

More from atgreen/Whistler

  • Make Release

    atgreen/Whistler

    Cut a new Whistler release. An agent skill from atgreen/Whistler.

    101 GitHub stars~1.6k tokensUpdated 22 days ago
    Auto-check: notes

Categories

Questions about Grind

What does Grind do?

Whistler-local autonomous work loop. An agent skill from atgreen/Whistler. Grind is an agent skill from atgreen/Whistler. Whistler-local autonomous work loop.

When should I use Grind?

Grind fits situations like: the user says /grind; pick the next thing and do it; keep making progress; wants an autonomous session that decides and works without hand-holding.

How do I install Grind in Claude Code?

Run `npx skills add atgreen/Whistler --skill grind -a claude-code`. Or copy the skill folder (.claude/skills/grind in atgreen/Whistler) into .claude/skills/grind in your project. Claude Code loads it when a task matches its description.

How do I install Grind in Codex?

Run `npx skills add atgreen/Whistler --skill grind -a codex`. Or copy the skill folder (.claude/skills/grind in atgreen/Whistler) into .agents/skills/grind in your project. Codex loads it when a task matches its description.

Can I use Grind in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add atgreen/Whistler --skill grind -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/grind, .gemini/skills/grind, .github/skills/grind and .opencode/skills/grind in your project.

What does Grind need to run?

Going by SKILL.md and its folder, Grind needs the command-line tools its instructions call (make and git).

Does Grind access the network?

SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Grind safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Grind use?

Grind is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Grind use?

About 2.4k tokens (SKILL.md is roughly 9.6k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Grind?

Skills that share tags, products or a category with Grind: Jinja Codegen (xberg-io/alef, 100 stars), Dx Harness (pproenca/dot-skills, 215 stars), Add Full Slice (fullstackhero/dotnet-starter-kit, 6.8k stars) and Release Workflow (Goldziher/spikard, 123 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Grind?

atgreen (a GitHub user) maintains it in atgreen/Whistler, which has 101 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on September 16, 2026.

Source: atgreen/Whistler on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.