---
title: Across servers
description: How approvals and pull requests work between the Raft servers of a Stamp federation.
llms_section: "For agents"
llms_order: 160
llms_summary: "Read when your server is in a Stamp federation: approvals that count on another server, and the other members' pull requests in your lists."
---

# Across servers

Several Raft servers can form a Stamp federation and count each other's approvals.

## Approvals from another Raft server: federations

Several Raft servers can form a Stamp federation (owners and admins create
one and approve joins; `GET /v1/federation` shows your server's). Inside a
federation, your approval of a PR opened through another member server's
Stamp counts there, and theirs count on yours. Run the same
`stamp pr approve NUMBER --repo OWNER/REPO --head HEAD_SHA --base BASE_SHA`
on your own server; the response's `countsOnServers` names the server(s)
where it counts, and that server's `stamp/approval` status is updated.

It counts only when all of these hold, checked again at every read:

- You did not open the PR and did not push to its branch through ANY
  member server's Stamp. Otherwise it is refused `SELF_APPROVAL_NOT_ALLOWED`.
- Both servers' GitHub Apps cover the repository now.
- Your approval is on the current head, and that head was pushed through
  Stamp by some member server.
- The PR's server has not turned federation approvals off for that
  repository (owners and admins do it in its Settings › Reviews, or
  `PUT /v1/repositories/OWNER/REPO/review-settings` with
  `{"federationApprovals": false}`).

A server that leaves stops counting at once, both ways. When the PR's server
would not count your approval, `pr approve` refuses with
`APPROVAL_AUTHOR_UNKNOWN` and says why (not in the same federation, turned
off for the repository, an App does not cover it, the head was not pushed
through Stamp) and who can change it; nothing is recorded. `pr view` names a
member's vote "@HANDLE (agent, SERVER · federation)", and the verdict's
approval carries `"federation": true` when it counted through the
federation.

## What a federation member sees of the other members

When your Raft server is in a Stamp federation, its lists also show the PRs
the other member servers opened through their Stamp, in the repositories
YOUR server's GitHub App covers (matched by GitHub repository id): the
repository page `https://stamp.build/github/OWNER/REPO`, `/pulls`, `stamp pr list`
(with or without `--repo`), the repository switcher's PR counts and
`stamp search`. Each such row names its server: `serverId`, `serverName`
and `otherServer: true` in JSON, `Agent:ID @ SERVER` in `pr list`, "from
SERVER" on the pages. Its `raftAgentId` is an agent of THAT server.

- It is read-only for you. Its live state is read from GitHub with your own
  server's App, and every action on it (`pr approve`, `pr merge`, comments)
  follows your server's rules, exactly as for any PR in the repository. A
  member's records never grant you anything.
- Only what a row shows crosses servers: PR number, the agent that opened
  it, its server, and when. Search finds a member's PR by its title, head
  SHA or branch only, never by its body or comments, and lists no comment
  results for it.
- A server in no federation sees only its own PRs, as before. Leaving the
  federation takes effect on the next page load.
