A repository protocol agents can actually follow.

Rallypoint does not run your models. It gives every coding agent a shared operating system for deciding what to do, proving ownership, shipping changes, reviewing them, and keeping the queue healthy.

Principles

  1. One issue, one branch, one pull request.
  2. A worker claims exactly one claimable issue before editing code.
  3. A reviewer never approves work produced by the same agent.
  4. The repository and GitHub API are the only coordination state.
  5. Every role has explicit GitHub permissions and explicit prohibitions.
  6. Failed checks and requested changes stay with the current issue.

Role boundaries

Every session adopts exactly one role. The orchestrator decides which role a new session should adopt by reading repository state; every other role then works within its own boundary alone.

RoleClaims?Reviews?Purpose
OrchestratorNoNoReads repository state and recommends what to run next.
PlannerNoNoKeeps an ordered, well-scoped backlog.
WorkerExactly oneNever own workShips one issue as one pull request.
ReviewerNoYesJudges the current revision against the issue and repository rules.
TesterIts own filed gapNoFinds the weakest coverage area and closes one gap.
FixerNoNoAddresses review feedback on an existing pull request branch.
JanitorNoNoRepairs GitHub coordination state: stale claims, orphaned refs, leases.
MergerNoNoVerifies CI and the verdict, merges, and reconciles the claim.

Labels

Labels are state, and their names are configurable in .rallypoint/config.json. An open issue is claimable unless something holds it back: no assignee and none of status:claimed, status:blocked, status:deferred or needs:human. There is no readiness label.

Rallypoint labels, their config keys, and meanings
LabelConfig keyOnMeaning
status:claimedclaimedissueReserved by one worker right now.
status:blockedblockedissueWaiting on another issue, named in a Blocked-By: trailer.
status:deferreddeferredissueA deliberate hold that will not clear on its own.
needs:humanhumanissue or PRRequires an owner decision or a protected action.
review:approvedapprovedpull requestReviewer verdict on a pull request, bound to its head SHA.
status:changes-requestedchangesRequestedpull requestA reviewer asked for changes and they are outstanding.
merged:unreviewedmergedUnreviewedpull requestMerged without an approve verdict at its head.
prio:p1prio:p0 … prio:p9issuePriority. claim.mjs orders the claimable pool by this number and nothing else.

Install

Rallypoint’s CLI reads its own checksummed manifest and writes each file to an explicit repository-root path. It stops on conflicts rather than overwriting anything silently. An existing AGENTS.md gets special handling: it is left untouched, the rest of the loop still installs, and the CLI suggests adding a one-line @AGENTIC_LOOP.md reference to it.

npx rallypoint@latest view loop
npx rallypoint@latest add loop
npx rallypoint@latest init

init requires the GitHub CLI, installed and authenticated. It syncs the configured integration branch to the repository’s default branch, creates the labels the loop reads and writes, and reports — without changing — whether the default branch has protection rules.

Prompting

A role is one file, so at minimum, prompting an agent to become that role means pointing a fresh session at AGENTS.md and exactly one file under .rallypoint/roles/. The table below is that literal minimum — the shortest instruction an agent needs, stripped of anything a person would normally say.

Don’t know what should happen next? Prompt the orchestrator first. It reads the same queue every other role reads and names the next role and target, so you know exactly what to prompt a fresh session with.

Read AGENTS.md, then read .rallypoint/roles/orchestrator.md. Decide which role should run next and name the exact issue or pull request it targets.
RolePrompt
OrchestratorRead AGENTS.md, then read .rallypoint/roles/orchestrator.md. Decide which role should run next and name the exact issue or pull request it targets.
PlannerRead AGENTS.md, then read .rallypoint/roles/planner.md and follow it exactly.
WorkerRead AGENTS.md, then read .rallypoint/roles/worker.md and follow it exactly.
ReviewerRead AGENTS.md, then read .rallypoint/roles/reviewer.md and follow it exactly.
TesterRead AGENTS.md, then read .rallypoint/roles/tester.md and follow it exactly.
FixerRead AGENTS.md, then read .rallypoint/roles/fixer.md and follow it exactly.
JanitorRead AGENTS.md, then read .rallypoint/roles/janitor.md and follow it exactly.
MergerRead AGENTS.md, then read .rallypoint/roles/merger.md and follow it exactly.

How a person actually asks

Nobody talks like the table above. People say please, add context the role file doesn’t need, chain two or three asks into one message, run several roles at once, or set the whole thing on a schedule. None of that breaks the loop — the role files are boundaries, not scripts, so any of these land the same as the literal prompts above.

  • A simple, polite ask

    Could you grab the next ready issue and ship it? Thanks!
  • With extra context the role file doesn’t need

    A couple of users got stuck on the auth step in yesterday's onboarding call — can you check the backlog reflects that, add whatever's missing, and reprioritize anything blocking a fix?
  • Chained into one message

    Run the planner to top up the backlog, then have a worker pick up whatever's highest priority, and kick off review as soon as that PR is open.
  • Several roles at once

    Spin up three workers in parallel on the three oldest ready issues, and have a reviewer standing by for whichever one finishes first.
  • On a schedule

    Set this up to loop: run the janitor every morning to clear stale claims, and have the orchestrator check in every few hours to tell me what's next.