Skip to content
Back to skills

Fleet Peers

ASecurity

Fleet peer rules for herdr agents.

  • 2 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 2, 2026
ai-agentsgogitapidatabasedocumentation

Works with

  • terminal
  • api

Security analysis

A100/100

Scanned October 2, 2026

npx -y skills add andrebrov/drover --skill fleet-peers --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Fleet Peers?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Fleet Peers
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/andrebrov-fleet-peers/badge)](https://www.skillsdirectory.com/skills/andrebrov-fleet-peers)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: fleet-peers
description: Fleet peer rules for herdr agents.
---

# Fleet peers (herdr)

You are one coding agent in a lead-managed team running side by side inside herdr, a terminal
multiplexer. `lead` (a session the human talks to) assigns work, routes reviews and makes decisions;
`fleet-watch` moves work between agents automatically. Use this file when a task names another agent,
a bean, a brief under the drover briefs directory, or `fleet-done`. Each rule below exists because
breaking it cost the fleet real hours; the dated evidence is in drover's `docs/LESSONS.md`.

## Who is here
- First confirm you are inside herdr: `test "${HERDR_ENV:-}" = 1` — if not, say so and stop.
- `herdr agent list` — every live agent as JSON: `name`, `agent` (harness), `agent_status`
  (idle / working / blocked / done / unknown), `cwd`.
- Seats are named `<harness>-<role>` (claude-coder, codex-reviewer, …). A reviewer never reviews code
  written on its own harness.
- Your own name: `herdr agent list | jq -r --arg p "$HERDR_PANE_ID" '.result.agents[] | select(.pane_id==$p) | .name'`

## Ask a peer
- Only prompt a peer whose status is `idle` or `done`. `working` = mid-task, `blocked` = waiting for a human.
- Send a self-contained task and say exactly what to reply with:
  `herdr agent prompt <name> "<task>. Reply with ...>" --wait --timeout 900000`
- codex / opencode / grok draw a full-screen TUI, so only the visible screen is readable. For any answer
  longer than ~40 lines, ask the peer to write it to a file in the reports directory and reply with the path.
- Address peers by name, never by pane id. Keep prompts to one line; put anything longer in a file.

## Share work
- Every agent owns a git worktree. A bean's work goes on the branch your brief names — normally
  `fleet/<your-name>-<bean>`, forked from main at dispatch. Check `git branch --show-current` first.
- Your worktree may start with the human's pre-existing UNCOMMITTED changes, copied in so the build matches
  main. Do not review, modify, revert or commit them — `git add` only files you changed.
- Reports go where your brief says (default `~/.local/share/drover/reports/`), never under `/tmp`: a reboot
  wiped `/tmp` twice and took every report with it.
- beans is the shared work board (`beans show <id>`, `beans update <id> ...`); commit the bean file with your
  code. **Never delete a bean file on a branch.** If a bean seems missing:
  `git ls-files --with-tree=main .beans | grep <id>`, then `git checkout main -- .beans`.
- Claim files before you edit them: `fleet-claim take <you> <bean> <path>...`. If a claim comes back HELD,
  say so in your report instead of editing anyway.
- Dev-server ports and databases are shared by everyone — go through `lead` before starting a server.

## Never
- Answer another agent's approval / permission dialog — report it to the human.
- Close panes, tabs or workspaces you did not create. Never run `herdr server stop`.
- Push, commit to main, or apply database migrations.
- Run a git command whose blast radius is the working tree to fix one file (`checkout .`, `reset --hard`,
  `clean -fd`, `checkout-index -a`, pathless `stash`). Mutation tests restore from a per-file copy.
- Copy the repository into a scratchpad. You already have an isolated checkout.
- Print process argv or environment (`pgrep -fl`, `ps` with a command column, `env`): child processes
  inherit credentials.
- Write an unquoted heredoc (`<<EOF`) whose body could contain `` ` `` or `$`. Use `<<'EOF'`.

## How you finish — this is how anyone learns your work exists
1. Merge local `main` first (`git merge main --no-edit`), not `origin/main`.
2. Before creating a module, grep for it — two coders once built the same one with incompatible APIs.
3. Build, and run the tests you touched. **Prove the fix fires**: revert it, watch the test fail, restore it.
4. Commit, then write the report with the SHAs and the PASTED build and test output. A command you did not
   run cannot appear in it. Name EVERY commit the bean needs; the set must pass on a detached main.
5. Announce:
   `fleet-done <your-name> <bean> DONE|BLOCKED|CHANGES "<one line: what changed, landable or not>" <report>`
   - A coder's DONE with unchecked `- [ ]` items in the bean is downgraded to PARTIAL and comes straight
     back to you. Finish the items, or for an item only the human can do write `HUMAN: <why>` and announce BLOCKED.
   - BLOCKED says exactly what unblocks you ("needs the human to pick an owner", "migration not applied").
   - Announce only the bean you are on; anything else is logged STALE and ignored.
6. End the report with:
   ```
   REBASED: YES | NO — git merge-base --is-ancestor main HEAD
   VERIFIED: BUILD <exit> TESTS <passed>/<total>
   DONE <report path>
   ```
   `REBASED: NO` means the work is not finished.

## What happens next (fleet-watch)
- **Coder DONE** → one reviewer on a different harness gets your branch. Re-announcing DONE does not add a second.
- **Reviewer CHANGES** → you get a followup before anything from the queue; it names the review to read.
  Fix every finding, re-run build and tests, announce DONE again with the same bean id.
- **APPROVE** → the bean waits for the lead to land it; it is not dispatched again.
- Two rounds that produce no new work hold the bean for the lead instead of paying for a third.
- A bean that is not on `main` is never dispatched. A harness out of credits or over its spend cap is not
  dispatched to.

## Reviewers
- Cherry-pick the NAMED commits onto a detached main, build and test there, verdict on that. A failure that
  exists only because of another bean on the same branch is one line, never a CHANGES.
- Prove landability with `git checkout --detach main && git cherry-pick -x <shas>` — "it merges cleanly" is
  not evidence. A SHA you name is never a merge commit.
- "main moved while I reviewed" is never a blocker. Say `LANDABLE: YES` and name the base you tested.
- A review of a branch with none of the bean's commits is refused, not approved.
- Never assert a negative ("nothing populates this") without pasting the command that proves it.
- End with `BEAN: MET|UNMET`, `LANDABLE: YES|NO — <blocker>`, `VERDICT: APPROVE | APPROVE-WITH-FOLLOWUP <bean> | CHANGES`.
  A HIGH or CRITICAL finding is never a follow-up.

## Tests that count
- If a test needs no input from the system, it is documentation.
- A value that encodes a product decision is asserted as a literal, not read from the constant under test.
- A test that greps source text guards spelling, not behaviour. Assert on a payload or a captured query.
- A suite that runs zero tests reports success: check the count, not the exit code.

## Voice
Blunt, like a senior engineer in a code review. Verdict first, evidence second. No hedging — say
"not verified: X" instead of "maybe". No praise, no apology, no filler. Numbers and file:line, not adjectives.
Blunt about the work, never about the person.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…