---
title: "Pool(): your marketplace"
url: https://services.dev/docs/people/pool
captured: [legal-check.txt, legal-fill.txt, pool-smallest.txt]
codes: [defects_required, ineligible, memo_required, needs_direction, not_cleared, not_contestable, question_open, task_taken]
---
# Pool(): your marketplace

URL: https://services.dev/docs/people/pool

> One kind of people, verified once, offered only work they can do, paid for every act and never charged to work. A role names a Pool, and the Pool fills it.

A Pool answers one question: who may take a role's work, and how does it reach them?

AI does every step it can, and a Pool member is the rung above your staff in [who does the step](https://services.dev/docs/people.md#who-does-the-step). Where you want a person, or the work needs a credentialed one, a role names a Pool. Each step that role does posts a **Task**, and the Pool's members claim it. A Pool is your marketplace for one kind of people: verified once, offered only work they can do, and paid for every act.

## The smallest Pool

Four keys: its name, the roles it fills, the application and the verifier. A role on Translation names it, and a rules row reserves the signature to the credential:

```bash
cat pools/translators.ts
```

```txt title="magic values: none"
import { Pool } from 'services.dev'

export const translators = Pool({
  name: 'translators',
  roles: { translator: { credential: 'sworn translator' } },
  join: { name: 'text', languages: 'language[]' },
  verify: 'https://verify.example.test/translators',
})
```

```bash
cat services/translation.ts
```

```txt title="magic values: none"
import { translators } from '../pools/translators.ts'
  roles: { translator: { pool: translators } },
  deliver: {
    translate: 'ai',
    sign: { by: 'translator', stamp: true },
```

`check` reads the Pool back, and `dev` serves its portal, its `/join` and its verifier's write path:

```bash
npx services.dev check
```

```txt title="magic values: none"
pools/translators.ts · 4 lines · translators · 1 role: translator · joins in 1 step · feed · hold 24h
  roles   translator · sworn translator · from translators
  bounds  reserved sign to sworn translator
  apps    customer portal · delivery portal · owner console
✓ ready to sell · 1 Service · it keeps at least 80% of every job
```

```bash
npx services.dev dev --no-try
```

```txt title="magic values: none"
  translators  http://localhost:8787/translators · join at /translators/join, or npx services.dev members add translators <email>
  verifier     vt_test_7Hq2 · the only writer of verified facts, at POST /<pool>/members/:id/verify
```

## What a member gets

- **Work they can do.** [Eligibility](https://services.dev/docs/people/pool/eligibility.md) is derived from the role and the rules table, never declared. The first predicate a member fails comes back with its cure.
- **An offer, never an assignment.** A [Task](https://services.dev/docs/people/pool/tasks.md) reaches members by its [dispatch](https://services.dev/docs/people/pool/dispatch.md), at a fee fixed when it posts. Only the [fill ladder](https://services.dev/docs/people/pool/fill.md) moves it, and only up.
- **Their floor, their hours.** Their minimum fee, areas, hours and the brands they work for [filter what they are offered](https://services.dev/docs/people/pool/dispatch.md#what-you-are-offered-is-yours-to-set), in one feed order for every brand.
- **Only what they need, when they need it.** A teaser, then a sheet, then [the packet](https://services.dev/docs/people/pool/packet.md), as [What a member sees](https://services.dev/docs/people/pool/disclosure.md) shows.
- **Their conflicts kept theirs.** A [hashed ledger](https://services.dev/docs/people/pool/conflicts.md) no one else reads.
- **Paid for every act, on a clock they can read.** A send-back or a decline is paid like an attestation, and [Pay](https://services.dev/docs/people/pool/pay.md) says when each dollar is theirs.
- **Their record, their own.** A [track record](https://services.dev/docs/people/pool/track.md#yours-to-carry) signed by the door, which they carry and share with another door's Pool when they choose.

## A Pool never charges members to work

No line charges a member per Task, per lead or by a percentage, and `check` fails `member_charged` on any line a member would pay. The one member charge a Pool can carry is a flat software fee, declared in the Pool as `fee` and shown on the door before anyone joins. It is the first line of [the member charter](https://services.dev/docs/people/pool/door.md#the-member-charter), which no Pool, importer or door can weaken.

Credentialed steps are how a Service meets licensing by design. The [rules table](https://services.dev/docs/people/rules.md) reserves an act to a credential, and only a member who holds it, verified and where the act needs it, can claim the Task.

## How it earns

The buyer pays the job's price. The member's fee is one line of it, paid for the act, and the brand keeps what's left after AI. A raise the ladder makes comes out of the brand's share, and the cap keeps a brand-funded raise from losing money. Here the ladder lifted a $50 fee to $55, and the buyer still paid the $99 they were quoted:

```txt
→ POST /matters/job_7Hq2/accept
```

```txt title="captured/legal-fill.txt · magic values: client.email = signs@example.test"
← job_7Hq2 · accepted · flags.pdf · memo.pdf · $99.00 final
  ledger  +$99.00 · attorney's fee $55.00, sold by the attorney (rail member) · brand $44.00 · AI $1.26 · you $42.74
```

## One Pool, many Services

Two Services, or two brands, that name one Pool share its members and one queue. The legal example's five Services all name its one Pool, each at its own fee:

```bash
npx services.dev check
```

```txt title="captured/legal-check.txt · magic values: none"
services/contract-review.ts · 16 lines · $99 per job, within 48 hours, charged on acceptance.
  roles   attorney · bar admission · from attorneys · $50 an act
services/demand-letter.ts · 26 lines · $149 per job, within 48 hours, charged on send's receipt.
  roles   attorney · bar admission · from attorneys · $75 an act
services/docket-watch.ts · 10 lines · $12 per month, charged at the start of each month.
  roles   watcher · patent attorney or agent · * · from attorneys · $4 an act
services/formation.ts · 30 lines · $299 per job, within 48 hours, charged on form_entity's receipt.
  roles   attorney · bar admission · from attorneys · $60 an act
services/provisional-patent.ts · 24 lines · $199 per job, within 5 days, charged on file's receipt.
  roles   practitioner · patent attorney or agent · * · from attorneys · $150 an act
services/trademark-response.ts · 21 lines · $349 per job, within 48 hours, charged on file's receipt.
  roles   attorney · bar admission · from attorneys · $175 an act
```

Its captures speak the brand's own words, as [your brand's words](https://services.dev/docs/service/brand-words.md) shows:

*legal's words: matter is a job, asset is a subject, review is a task, signer is a member, network is a pool, outcome is a end (examples/legal/brand.ts).*

## Every form

Each key links to the section that explains it.

| Key | Written | Left out | Does |
|---|---|---|---|
| `name` | `string` | required | The portal's name: its path, `/<name>`, and its people. |
| [`door`](https://services.dev/docs/people/pool/door.md) | `string` | `/<name>` on the Service's brand | Where members join and work: a domain your account operates, or an existing door, pinned at its terms' version. |
| [`register`](https://services.dev/docs/people/pool/register.md) | `'expert' \| 'work'` | `'expert'` | What members deliver: an approval on a packet, or a completed Task at a site, in a window. |
| [`roles`](https://services.dev/docs/people/roles.md) | `{ [K in R]: PoolRole }` | required | The roles this Pool fills, each with its credential expression and defaults. A Service names one by its key. |
| [`scopes`](https://services.dev/docs/people/where.md) | `{ [K in C]?: '*' \| 'region' }` | `'region'` | Each credential's scope: `'*'` (one admission counts everywhere) or `'region'`. A credential the roles name and this leaves out fails credential_unscoped. |
| [`join`](https://services.dev/docs/people/pool/join.md) | `Shape` | required | The application, field by field, in the type words. The feed reads `areas`, `min_fee` (dollars), `hours` and `turnaround` when it asks them. |
| [`verify`](https://services.dev/docs/people/pool/verify.md) | `Url \| Fn` | required | The verifier: the only writer of verified facts, on its write path with its `vt_` token. |
| [`fresh`](https://services.dev/docs/people/pool/verify.md#fresh-at-the-moment-of-use) | `Within` | `'30d'` | Re-verify every: freshness is read at use, so time alone makes a fact stale. |
| [`sees`](https://services.dev/docs/people/pool/disclosure.md) | `{ teaser: string[]; sheet?: string[] }` | &#123; teaser: [`'act'`, `'region'`, `'fee_usd'`] &#125; | What a member sees: the teaser before claiming (always with est_minutes, rate and due, never a party name), and the sheet. |
| [`clear`](https://services.dev/docs/people/pool/conflicts.md) | `string[] \| { attest: string[]; check?: string[] }` | none | What a member attests before the packet opens, and the party inputs checked, hashed, against their ledger. |
| [`hold`](https://services.dev/docs/people/pool/tasks.md#its-clocks) | `Within \| { claim; then: 'touch' }` | max(24h, 3 × est) | How long a claim holds before it reopens, never past its due: a span, or renewed by each touch. A member may extend it once. |
| [`window`](https://services.dev/docs/people/pool/tasks.md#its-clocks) | `ShortSpan` | `'1h'` | How long one member has a `cascade`'s offer, or a first refusal, to themselves. |
| [`sheet`](https://services.dev/docs/people/pool/tasks.md#its-clocks) | `ShortSpan` | `'10min'` | How long one member has a sheet to themselves. |
| [`jump`](https://services.dev/docs/people/pool/disclosure.md#a-pass) | `{ min?: number }` | &#123; min: 3 &#125; | When passes move the ladder: at least `min` distinct sheet viewers since the last rung, more than half passing for one reason. |
| [`kill`](https://services.dev/docs/people/pool/pay.md#other-lines-a-member-earns) | `Pct` | `'50%'` | The share of its fee a member keeps when a Task they cleared is withdrawn. |
| [`affinity`](https://services.dev/docs/people/pool/dispatch.md#rank) | `Within` | none | First refusal on follow-on work for the same subject. |
| [`rank`](https://services.dev/docs/people/pool/dispatch.md#rank) | `('fit' \| 'track' \| 'speed' \| 'price')[]` | [`'fit'`, `'track'`, `'speed'`] | How `cascade` ranks members. A member on probation ranks by fit and speed alone. |
| [`dispatch`](https://services.dev/docs/people/pool/dispatch.md) | `Dispatch` | `'feed'`, or `'cascade'` when `clear.check` names parties | How this Pool's Tasks reach members. |
| [`fill`](https://services.dev/docs/people/pool/fill.md) | `FillRung[] \| false` | raise 10% at 2h, widen at 4h, firms at 8h, staff at 12h | The fill ladder, for a Task no one claims. A raise is of the posted fee, never lowered; a rung never widens past eligibility. `false` waits, with an alarm. |
| [`fill_cap`](https://services.dev/docs/people/pool/fill.md) | `Pct` | the lower of 50% and what the job's margin leaves | Raises stop here, over the posted fee, so a brand-funded raise never loses money. |
| [`tiers`](https://services.dev/docs/people/pool/track.md#tiers-are-computed-from-it) | `Tier[]` | none | Tiers above eligibility, low to high, computed from the track record: a Task offers to the top eligible tier first. |
| [`probation`](https://services.dev/docs/people/pool/track.md#outcomes-only) | `{ tasks: number; sample: Pct }` | &#123; tasks: 5, sample: `'100%'` &#125; | A new member's first Tasks, all sampled. |
| [`golden`](https://services.dev/docs/people/pool/track.md#one-shape-for-ai-and-people) | `Pct \| false` | false | A share of Tasks with a known answer, scored only for quality. |
| [`contest`](https://services.dev/docs/people/pool/track.md#contests) | `{ by: 'peer' \| 'staff'; within?: Within }` | `'peer'` where a row reserves the act, else `'staff'` | Who rules a contest of a member's work. |
| [`limits`](https://services.dev/docs/people/pool/integrity.md) | `{ claims?; open?; declines?; late_releases? }` | none | Throttles and breakers, kept outside the track record. |
| [`firms`](https://services.dev/docs/people/roles.md#firms-and-the-buyers-own-professionals) | `boolean` | none | A firm may enroll a bench. |
| [`coverage`](https://services.dev/docs/people/pool/coverage.md) | `{ per_act: number; by: 'pool' \| 'member' \| 'either'; usd?: number }` | none | Insurance in force per act, who carries it, and what it costs the brand per act, a ledger line. |
| [`contact`](https://services.dev/docs/people/pool/tasks.md#talking-to-the-party-inside-a-task) | `'thread'` | `'thread'` | Member contact with a party relays through the job's thread: email and phone never cross either way. |
| [`fee`](https://services.dev/docs/people/pool/pay.md#whose-fee-it-is) | `{ usd: number; per: 'month' }` | none | The one member charge allowed: a flat software fee, shown on the door. |
| [`invite_by_buyer`](https://services.dev/docs/people/roles.md#firms-and-the-buyers-own-professionals) | `boolean` | none | A buyer may invite their own professional. |
| [`standby`](https://services.dev/docs/people/pool/pay.md#other-lines-a-member-earns) | `{ window: string; hours: number; retainer_usd: number }` | none | Committed capacity: a dated window, hours a week and a weekly retainer. |
| [`grow`](https://services.dev/docs/people/pool/door.md#grow-your-supply) | `{ waitlist?: true; referral_usd?: number; invites?: number }` | none | Supply growth: a waitlist, a referral bonus, invites per member. |
| [`public`](https://services.dev/docs/people/pool/door.md#the-demand-board) | `boolean` | none | Publish the demand board on the door and in llms.txt. |
| [`export`](https://services.dev/docs/people/pool/share.md#export-your-pool) | `{ placement; to; min_pay?; notice?; first? }` | none | Let other brands import this Pool, each paying `placement` dollars per filled Task. |
| [`descriptor`](https://services.dev/docs/money/lines-and-rails.md#the-two-seller-checkout) | `string`, with `{member}` | the member's name, then VIA and your domain | How a member-rail charge reads on the buyer's statement. |
| [`payouts`](https://services.dev/docs/people/pool/pay.md#every-schedule) | `{ at: 'act'; after?: Within } \| 'same-day' \| 'weekly' \| { schedule; hold_first?; instant_fee? }` | &#123; at: `'act'`, after: `'2d'` &#125; | When a member's pay is payable, and when payouts move it. |

## Seven surfaces

| Op | API | CLI | MCP | SDK | Site | Docs | App |
|---|---|---|---|---|---|---|---|
| `member.join` | `POST /:portal/join` | `members add <pool> <email> k=v …` | never: a person acts | never: a person acts |  | 2 error pages | delivery portal, owner console |
| `member.verify` | `POST /:portal/members/:id/verify` |  |  |  |  | 2 error pages | the verifier's write path, with its `vt_` token |
| `member.availability` | `POST /me/availability` | `me availability <availability>` | never: a person acts | never: a person acts |  | 1 error page | delivery portal |
| `member.ledger.get` | `GET /me/ledger` | `me ledger` | never: a person acts | never: a person acts |  |  | delivery portal |
| `member.ledger.add` | `POST /me/ledger` | `me ledger add <name> k=v …` | never: a person acts | never: a person acts |  | 1 error page | delivery portal |
| `member.ledger.checks` | `GET /me/ledger/checks` | `me ledger checks` | never: a person acts | never: a person acts |  |  | delivery portal |
| `member.missed` | `GET /me/missed` | `me missed` | never: a person acts | never: a person acts |  |  | delivery portal |
| `member.earnings` | `GET /me/earnings` | `me earnings` | never: a person acts | never: a person acts |  |  | delivery portal |
| `member.track` | `GET /me/track` | `me track` | never: a person acts | never: a person acts |  |  | delivery portal |
| `member.login` | `POST /owner/members/:id/login` | `members login <member>` | never: a person acts | never: a person acts |  | 1 error page | owner console |
| `task.list` | `GET /tasks`, `GET /owner/tasks` | `tasks list` | never: a person acts | never: a person acts |  |  | delivery portal, owner console |
| `task.get` | `GET /tasks/:id`, `GET /owner/tasks/:id` | `tasks get <task>` | never: a person acts | never: a person acts |  | 2 error pages | delivery portal, owner console |
| `task.sheet` | `GET /tasks/:id/sheet` | `tasks sheet <task>` | never: a person acts | never: a person acts |  | 3 error pages | delivery portal |
| `task.pass` | `POST /tasks/:id/pass` | `tasks pass <task> <reason>` | never: a person acts | never: a person acts |  | 2 error pages | delivery portal |
| `task.claim` | `POST /tasks/:id/claim` | `tasks claim <task>` | never: a person acts | never: a person acts |  | 3 error pages | delivery portal |
| `task.clear` | `POST /tasks/:id/clear` | `tasks clear <task>` | never: a person acts | never: a person acts |  | 3 error pages | delivery portal |
| `task.packet` | `GET /tasks/:id/packet` | `tasks packet <task>` | never: a person acts | never: a person acts |  | 2 error pages | delivery portal |
| `task.release` | `POST /tasks/:id/release` | `tasks release <task>` | never: a person acts | never: a person acts |  | 2 error pages | delivery portal |
| `task.extend` | `POST /tasks/:id/extend` | `tasks extend <task>` | never: a person acts | never: a person acts |  | 3 error pages | delivery portal |
| `task.offer` | `POST /owner/tasks/:id/offer` | `tasks offer <task> <member>` | never: a person acts | never: a person acts |  | 4 error pages | owner console |
| `task.arrive` | `POST /tasks/:id/arrive` | `tasks arrive <task>` | never: a person acts | never: a person acts |  | 1 error page | delivery portal |
| `task.complete` | `POST /tasks/:id/complete` | `tasks complete <task> k=v …` | never: a person acts | never: a person acts |  | 2 error pages | delivery portal |
| `task.attest` | `POST /tasks/:id/attest` | `tasks attest <task> k=v …` | never: a person acts | never: a person acts |  | 8 error pages | delivery portal |
| `task.send_back` | `POST /tasks/:id/send_back` | `tasks send-back <task> <defects>` | never: a person acts | never: a person acts |  | 5 error pages | delivery portal |
| `task.decline` | `POST /tasks/:id/decline` | `tasks decline <task> <memo>` | never: a person acts | never: a person acts |  | 4 error pages | delivery portal |
| `task.recuse` | `POST /tasks/:id/recuse` | `tasks recuse <task>` | never: a person acts | never: a person acts |  | 4 error pages | delivery portal |
| `task.contest` | `POST /tasks/:id/contest`, `POST /owner/tasks/:id/contest` | `tasks contest <task> <reason>` | never: a person acts | never: a person acts |  | 3 error pages | delivery portal, owner console |
| `task.message` | `POST /tasks/:id/messages` | `tasks message <task> <kind> <text>` | never: a person acts | never: a person acts |  | 6 error pages | delivery portal |

Objects: `tsk_`, `mbr_`.
Events: `member.applied`, `task.posted`, `task.unreached`, `task.offered`, `task.claimed`, `task.hold_expiring`, `task.extended`, `task.raised`, `task.widened`, `task.due_moved`, `task.declined`, `task.recused`, `task.contested`, `task.ruled`, `pay.accrued`, `pay.payable`, `pay.paid`.

[Operations](https://services.dev/docs/reference/operations.md) has every column of every row.

Every member act is a person's own, in their session. No MCP tool or SDK method exists for one, and an agent that reaches one gets the link to hand on.

## Refusals

| Code | Category | HTTP | Why |
|---|---|---|---|
| [`ineligible`](https://services.dev/docs/reference/errors.md#ineligible) | blocked | 403 | The member can't take this Task: the answer names the first eligibility predicate they fail, and its cure. |
| [`not_cleared`](https://services.dev/docs/reference/errors.md#not_cleared) | blocked | 403 | The packet opens only to the member who claimed the Task and cleared it. |
| [`task_taken`](https://services.dev/docs/reference/errors.md#task_taken) | conflict | 409 | Another member holds this Task, or has it offered to them first. |
| [`defects_required`](https://services.dev/docs/reference/errors.md#defects_required) | invalid_request | 422 | A send-back names its defects: what is wrong, for the step it returns to. |
| [`memo_required`](https://services.dev/docs/reference/errors.md#memo_required) | invalid_request | 422 | A decline carries a reasoned memo, which only the client reads. |
| [`needs_direction`](https://services.dev/docs/reference/errors.md#needs_direction) | conflict | 409 | A member declined, and only the client's direction moves the job on: another member, or an end. |
| [`not_contestable`](https://services.dev/docs/reference/errors.md#not_contestable) | conflict | 409 | There is no send-back on this attested work to contest, or it is already contested or ruled. |
| [`question_open`](https://services.dev/docs/reference/errors.md#question_open) | conflict | 409 | A question to the client is out already, and their reply comes through the thread. |

| `check` gate | Why |
|---|---|
| [`pool_role_unknown`](https://services.dev/docs/reference/check/pool_role_unknown.md) | A Service's role names a Pool that has no role by that name, so no member could ever be offered its Task. |
| [`reserved_act_unstaffed`](https://services.dev/docs/reference/check/reserved_act_unstaffed.md) | A step performs a reserved act, and no role that does it holds the credential its row reserves it to. |
| [`fill_bypasses_reserved`](https://services.dev/docs/reference/check/fill_bypasses_reserved.md) | A fill rung could offer a reserved act to someone who doesn't hold its credential. |
| [`rush_uncapped`](https://services.dev/docs/reference/check/rush_uncapped.md) | A role is paid from the buyer, its Pool's fill ladder raises the fee, and nothing caps what the buyer pays for it. |
| [`fill_underwater`](https://services.dev/docs/reference/check/fill_underwater.md) | The Pool's fill_cap lets the ladder raise a brand-funded fee past what the job leaves: a job filled at the cap loses money. |
| [`sheet_without_consent`](https://services.dev/docs/reference/check/sheet_without_consent.md) | A Pool's sheet names the job's parties to the members who read it, and the client hasn't consented before the first Task posts. |

| When the file won't load | Thrown by | Why |
|---|---|---|
| [`rung_unparsed`](https://services.dev/docs/reference/definition-errors.md#rung_unparsed) | `Pool()` | Pool translators: fill[0] is 'raise 10% in 2h'. A rung is 'raise 10% 2h', 'widen 4h', 'firms 8h', 'staff 12h' or 'cancel 24h'. |
| [`rungs_out_of_order`](https://services.dev/docs/reference/definition-errors.md#rungs_out_of_order) | `Pool()` | Pool translators: fill[1] 'raise 10% 2h' comes before 'widen 4h': rungs run in time order, so write them that way. |
| [`fill_cap_unparsed`](https://services.dev/docs/reference/definition-errors.md#fill_cap_unparsed) | `Pool()` | Pool translators: fill_cap is '0.5', and a cap is a share of the posted fee, such as '50%'. |
| [`credential_unscoped`](https://services.dev/docs/reference/definition-errors.md#credential_unscoped) | `Pool()` | Pool translators: scopes leaves out sworn translator, which its roles name. Say whether each counts everywhere ('*') or per region. |
| [`teaser_unknown`](https://services.dev/docs/reference/definition-errors.md#teaser_unknown) | `Pool()` | Pool translators: the teaser names client. A teaser shows Task facts only (act, region, fee, fee_usd, signals, kind, service, step, role), so a push payload never carries an input; show inputs on the sheet. |

## Three brands

The legal example's Pool, as its file writes it:

```bash
cat pools/attorneys.ts
```

```txt title="captured/legal-check.txt · magic values: none"
import { Pool } from 'services.dev'

// One Pool, shared by every legal Service: attorneys join, the verifier checks each admission, and
// a cascade offers each Task one member at a time, because `check` names parties. Tiers are computed from outcomes,
// so the default fill ladder widens to the next one down. An attorney's own malpractice policy covers their act; one
// who carries none is covered by the Pool's, at $4 an act. A claim holds three times the step's estimate, at least a day.
export const attorneys = Pool({
  name: 'attorneys',
  roles: {
    attorney: { credential: 'bar admission' },
    practitioner: { credential: ['patent attorney', 'patent agent'], where: '*' },
    watcher: { credential: ['patent attorney', 'patent agent'], where: '*' },
    student: { credential: 'law school enrollment' },
  },
  scopes: { 'bar admission': 'region', 'patent attorney': '*', 'patent agent': '*', 'law school enrollment': 'region' },
  join: {
    name: 'text: your name as admitted', credential: ['bar admission', 'patent attorney', 'patent agent', 'law school enrollment'],
    number: 'text: your bar or registration number', regions: 'jurisdiction[]: every place you are admitted',
    areas: ['patents', 'trademarks', 'contracts', 'entities', 'collections'], hours: 'number: spare hours a week',
    turnaround: ['same day', '24h', '48h'], min_fee: 'money: the least you would take per review',
  },
  verify: 'https://verify.example.test/credentials',
  coverage: { per_act: 1_000_000, by: 'either', usd: 4 },
  sees: { teaser: ['act', 'region', 'fee_usd', 'signals'], sheet: ['parties', 'kind', 'amount'] },
  clear: { attest: ['I checked conflicts across my full book, including my firm'], check: ['client', 'applicant', 'recipient'] },
  affinity: '30d', rank: ['fit', 'track', 'speed'],
  tiers: [{ name: 'reviewer' }, { name: 'signer', after: 20, sendbacks: '5%', on_time: '95%' }, { name: 'counsel', after: 100, sendbacks: '3%', on_time: '98%' }],
})
```

[The attorneys' Pool](https://services.dev/docs/examples/legal/pool.md) runs it end to end, and [the preparers' Pool](https://services.dev/docs/examples/tax/pool.md) adds a season.

Whether a live Pool fills and pays, with an alarm and a control for each measure: [Pool health](https://services.dev/docs/operate/pool-health.md).

---

- Up: [human: the line](https://services.dev/docs/people.md)
- Previous: [A sample that falls](https://services.dev/docs/people/sample.md)
- Next: [Approval or completion: a Pool's register](https://services.dev/docs/people/pool/register.md)
