---
title: "Eligibility"
url: https://services.dev/docs/people/pool/eligibility
captured: [pool-eligibility.txt]
codes: [ineligible, task_taken]
---
# Eligibility

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

> Seven predicates, in order, decide whether a member may take a Task, and a work register adds two. The first one they fail is the answer, with its cure, and no tier overrides it.

## The predicates, in order

| # | Predicate | Needs | Cure |
|---|---|---|---|
| 1 | `credential` | `<credential>` | Finish /join: the verifier checks the application before any Task is offered. |
| 1 | `credential` | `<credential>` | Renew `<credential>`; the verifier writes it once it checks. |
| 2 | `region` | `<credential>` in `<region>` | Add `<region>` to your regions at /join; the verifier checks the admission. |
| 3 | `coverage` | `<amount>` of coverage in force per act | Renew the policy; the verifier writes the new term. |
| 4 | `availability` | availability on | Set your availability to on. |
| 4 | `availability` | verified facts fresh at use | The verifier rechecks your facts; nothing waits on you. |
| 5 | `separation` | a member who did not do `<role>` | None: another member takes this one. |
| 5 | `separation` | the member who did `<role>` | None: the member who did it takes this one. |
| 5 | `separation` | separation: recused from `<subject>` | None: you stepped aside, and another member takes it. |
| 6 | `conflict` | no party in your conflicts ledger | None for this Task: your ledger stays yours, and no one learns which entry matched. |
| 7 | `clearance` | each statement attested: `<statements>` | Send each statement in attest, word for word. |
| 8 | `in_range` | in a [work register](https://services.dev/docs/people/pool/register.md): the site within your `radius` of your `base` | Widen your radius at /join, or set a base nearer the work. |
| 9 | `window_free` | in a work register: the window, and 30 minutes either side, free of every window you hold | Give back a window you hold before `notice`, or wait for the next Task. |

## The sandbox's members

| Member | Branch |
|---|---|
| `mbr_eligible` | A member who holds every credential the Pool names, everywhere, with coverage in force: eligible for every Task, and the last member a `cascade` offers one to. |
| `mbr_lapsed_credential` | A member whose credential has lapsed: ineligible, on the credential predicate. |
| `mbr_lapsed_coverage` | A member whose coverage lapsed yesterday: ineligible, on the coverage predicate. |
| `mbr_out_of_region` | A member admitted only in ZZ, a region no job names: ineligible on the region predicate wherever an act needs a region. |

## One Task, claimed by each

```txt
→ POST /matters {"service":"contract-review","contract":"lease.pdf","client":{"name":"Ada Lovelace","email":"signs@example.test"},"client_region":"US-CA","max_usd":99,"key":"lease-ca"}
```

```txt title="magic values: client.email = signs@example.test, member = mbr_lapsed_credential, member = mbr_out_of_region, member = mbr_lapsed_coverage, member = mbr_eligible"
← job_7Hq2 · waiting · on claim · $99.00 held · advise · tsk_7Hq2

→ POST /reviews/tsk_7Hq2/claim   # as mbr_lapsed_credential
← 403 ineligible · credential: attorney needs bar admission, and the verifier holds no current one for mbr_lapsed_credential.
  cure  Renew bar admission; the verifier writes it once it checks.

→ POST /reviews/tsk_7Hq2/claim   # as mbr_out_of_region
← 403 ineligible · region: attorney needs bar admission in US-CA, and mbr_out_of_region holds it in ZZ.
  cure  Add US-CA to your regions at /join; the verifier checks the admission.

→ POST /reviews/tsk_7Hq2/claim   # as mbr_lapsed_coverage
← 403 ineligible · coverage: attorney needs $1,000,000 of coverage in force per act, and mbr_lapsed_coverage's policy lapsed on 2026-10-24.
  cure  Renew the policy; the verifier writes the new term.

→ POST /reviews/tsk_7Hq2/claim   # as mbr_eligible
← 200 tsk_7Hq2 · claimed · attorney · advise · US-CA · $50.00 · 45 min · $66.67 an hour · due 2026-10-27 14:02
```

## When members carry their own coverage

```bash
grep -E "coverage:|dispatch:" pools/attorneys.ts
```

```txt title="magic values: client.email = signs@example.test, member = mbr_lapsed_credential, member = mbr_out_of_region, member = mbr_lapsed_coverage, member = mbr_eligible"
  coverage: { per_act: 1_000_000, by: 'member', usd: 4 },
  dispatch: 'feed', affinity: '30d', rank: ['fit', 'track', 'speed'],

→ POST /matters {"service":"contract-review","contract":"lease.pdf","client":{"name":"Ada Lovelace","email":"signs@example.test"},"client_region":"US-CA","max_usd":99,"key":"lease-ca"}
← job_7Hq2 · waiting · on claim · $99.00 held · advise · tsk_7Hq2

→ POST /reviews/tsk_7Hq2/claim   # as mbr_lapsed_credential
← 403 ineligible · credential: attorney needs bar admission, and the verifier holds no current one for mbr_lapsed_credential.
  cure  Renew bar admission; the verifier writes it once it checks.
```

## 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. |
| [`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. |

---

- Up: [Pool(): your marketplace](https://services.dev/docs/people/pool.md)
- Previous: [Verify a member](https://services.dev/docs/people/pool/verify.md)
- Next: [Dispatch](https://services.dev/docs/people/pool/dispatch.md)
