---
title: "Approval or completion: a Pool's register"
url: https://services.dev/docs/people/pool/register
captured: [pool-register.txt]
---
# Approval or completion: a Pool's register

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

> A Pool's register is what its members deliver. An expert register attests on a packet; a work register completes a Task at a site, in a window, with evidence. A missing or silent party never costs the member their fee.

A register answers one question: what does a member hand the gate when their Task is done?

Every Task ends in a completion artifact, hashed, that the gate accepts or refuses. The register says what that artifact is. The Task, its fee fixed at post, its dispatch, its pay and the [member charter](https://services.dev/docs/people/pool/door.md#the-member-charter) are the same in both.

| | Expert register | Work register |
|---|---|---|
| Where the value lives | a credentialed judgement | a person at a place, in a window |
| What a member delivers | an approval: attest, send back or decline | a completed Task |
| The completion artifact | the packet's hash, with the member's credential, region and checklist | the evidence items, each stamped with time and place, hashed together |
| What a member works from | [the packet](https://services.dev/docs/people/pool/packet.md) | the brief and the site, which open on claim |
| Who may take it | [eligibility](https://services.dev/docs/people/pool/eligibility.md), from the role and the rules | the same, plus `in_range` and `window_free` |
| Pay | the fee, on every outcome of the act | the fee, per completed Task, `party_absent` included |
| Plan | Launch, with your first Pool | Team |

`register` is `'expert'` when left out. The expert register is the rest of this tab: [what a person can do](https://services.dev/docs/people/acts.md) lists each act on a packet. This page specifies what a work register adds.

## Evidence

The step's `evidence` lists what completes it. Each item is one of two kinds:

| Kind | Items | Who finishes it |
|---|---|---|
| Held by the member | `check_in`, `check_out`, `photo`, `scan`, `checklist` | the member, on their phone, at the site |
| Held by a party | an ask, such as `{ ask: 'client', to: 'sign' }` | the party, on the member's phone or through their own link |

The delivery portal captures each item and stamps it with the time and the device's fix. The gate accepts completion when every item is present, and the record keeps their hash.

## Where and when a check-in counts

`at` names the input that holds the site, and `window` names when. A check-in counts inside `site.within` of the site, from `site.early` before the window opens to `site.late` after it. Anything else is refused with the distance and the cure.

Location is read twice, at `arrive` and at `complete`, and at no other moment. A member's `base` is read only to offer them Tasks they can reach. It is never shown to a party or to the owner, and the site's address opens to the member only after they claim.

## When the party is missing or silent

Two clocks keep a party's absence from costing the member:

| Clock | Starts | When it runs out |
|---|---|---|
| `site.grace`, 15 minutes | the window opens, and the member is checked in | no party has appeared: the member completes as `party_absent`, on their own evidence, and the full fee accrues, because they travelled and held the window |
| `site.wait`, 24 hours | the member checks out, and a party-held item is unfinished | the Task completes as `completed · party_silent` on the member's evidence. The client may [contest](https://services.dev/docs/people/pool/track.md#contests) it inside the contest window |

A client who cancels a claimed Task inside `notice` pays the [kill share](https://services.dev/docs/people/pool/pay.md#other-lines-a-member-earns), and the member who held the slot keeps it. A member with no check-in by `site.late` is a no-show: the clock writes it, the Task reopens to members who can still reach the site, and the client is asked whether to wait or move the window.

## A visit, start to pay

The Pool and the Service:

```bash
cat pools/interpreters.ts
```

```txt title="magic values: client.email = signs@example.test, member = mbr_eligible"
import { Pool } from 'services.dev'

// A work-register Pool: the value is a person at a place, in a window. Members declare where they start from
// and how far they travel, so a Task is offered only to a member who can reach the site. A check-in counts
// within 250 metres of the site, from 15 minutes before the window opens to 10 minutes after.
export const interpreters = Pool({
  name: 'interpreters',
  register: 'work',
  roles: { interpreter: { credential: 'certified interpreter' } },
  join: { name: 'text', languages: 'language[]', base: 'address: where you start from', radius: 'km: how far you travel' },
  verify: 'https://verify.example.test/interpreters',
  site: { within: '250m', early: '15min', late: '10min' },
  notice: '24h',
})
```

```bash
cat services/interpreting.ts
```

```txt title="magic values: client.email = signs@example.test, member = mbr_eligible"
  roles: { interpreter: { pool: interpreters, pay: 90 } },
    attend: { by: 'interpreter', at: 'address', window: { from: 'at', length: 'length' }, evidence: ['check_in', 'check_out', { ask: 'client', to: 'sign' }] },
  price: 140,
```

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

```txt title="magic values: client.email = signs@example.test, member = mbr_eligible"
pools/interpreters.ts · 9 lines · interpreters · 1 role: interpreter · work register · joins in 2 steps · feed · hold to the window
  roles   interpreter · certified interpreter · from interpreters · $90 a completed visit
  steps   brief · ai → attend · interpreter · at address, in the window · check_in, check_out, sign → summarize · ai
  offers  only members whose base is within their radius of the address, free for the window and 30 minutes either side
  ledger  +$140.00 · AI $0.62 (example) · interpreter $90.00 · you $49.38
          a client who cancels inside 24h pays $45.00 · the member who held the slot keeps it
  location read at arrive and complete only · base never shown to a party or to you
✓ ready to sell · 1 Service · 1 Pool, work register
```

A check-in from the wrong place is refused, then one from the site counts:

```txt
→ POST /tasks/tsk_7Hq2/arrive {"fix":{"lat":48.8791,"lng":2.3554,"accuracy_m":15}}   # as mbr_eligible, 3 Nov 13:48
```

```txt title="magic values: client.email = signs@example.test, member = mbr_eligible"
← 403 not_on_site: The check-in is 2.9 km from the site, and a check-in counts within 250 m. Check in from the site.
```

```txt
→ POST /tasks/tsk_7Hq2/arrive {"fix":{"lat":48.8556,"lng":2.3605,"accuracy_m":12}}   # as mbr_eligible, 3 Nov 13:56
```

```txt title="200 · tsk_7Hq2 · on_site · 38 m from the site · 4 min before the window · magic values: client.email = signs@example.test, member = mbr_eligible"
← 200 · tsk_7Hq2 · on_site · 38 m from the site · 4 min before the window
```

Completion needs every evidence item, then the fee accrues and the charge releases:

```txt
→ POST /tasks/tsk_7Hq2/complete {"check_out":{"fix":{"lat":48.8557,"lng":2.3604,"accuracy_m":10}}}   # as mbr_eligible, 3 Nov 15:02
```

```txt title="magic values: client.email = signs@example.test, member = mbr_eligible"
← 422 evidence_missing: attend completes on check_in, check_out and the client's sign-off, and the sign-off is missing. The client signs on your phone: open the sign-off.
```

```txt
→ POST /tasks/tsk_7Hq2/complete {"check_out":{"fix":{"lat":48.8557,"lng":2.3604,"accuracy_m":10}},"sign_off":"ask_7Hq4"}   # as mbr_eligible, 3 Nov 15:04
```

```txt title="200 · tsk_7Hq2 · done · completed · sha256:5be1c0a7d29e · magic values: client.email = signs@example.test, member = mbr_eligible"
  15:04 · step.committed · attend · person · certified interpreter · FR · mbr_eligible
  15:04 · pay.accrued · mbr_eligible · complete · $90.00
  15:04 · job.charged · job_7Hq2 · $140.00 · released on the client's sign-off
```

A visit where the client never came to the door:

```txt
→ POST /tasks/tsk_7Hr6/complete {"party_absent":true,"check_out":{"fix":{"lat":48.8662,"lng":2.3411,"accuracy_m":11}}}   # as mbr_eligible, 4 Nov 10:16: on site since 09:58, and no one came to the door
```

```txt title="200 · tsk_7Hr6 · done · party_absent · sha256:91c4e2d07b3a · magic values: client.email = signs@example.test, member = mbr_eligible"
  10:16 · step.committed · attend · person · certified interpreter · FR · mbr_eligible · party_absent after site.grace 15min
  10:16 · pay.accrued · mbr_eligible · complete · party_absent · $90.00
  10:16 · job.charged · job_7Hr6 · $140.00 · released on party_absent
```

[On site: interpreting](https://services.dev/docs/examples/lingua.md#on-site-interpreting) walks the whole visit, the teaser and the claim included, with the artifact the gate froze and a no-show.

## How it earns

The buyer pays the price, released on the fact the Service names: here, the client's sign-off, or `party_absent` or `party_silent` in its place. The member's fee is one line of it, paid per completed Task. A late cancel charges the client the kill share, and it goes to the member.

## Every form

| Key | Written | Left out | Does |
|---|---|---|---|
| `register` | `'expert' \| 'work'` | `'expert'` | What the Pool's members deliver: an approval on a packet, or a completed Task at a site. |
| `site` | `{ within: Distance; early?: ShortSpan; late?: ShortSpan; grace?: ShortSpan; wait?: Within }` | &#123; within: `'250m'`, early: `'15min'`, late: `'10min'`, grace: `'15min'`, wait: `'24h'` &#125; | Where and when a check-in counts, how long a member waits for an absent party, and how long a party-held item may stay unfinished. |
| `notice` | `Within` | `'24h'` | Inside this, a client's cancel pays the member the kill share. |
| step `at` | `string` | required in a work register | The input that holds the site. |
| step `window` | `string \| { from: string; length: string }` | required in a work register | When the member attends: inputs, or a span. |
| step `evidence` | `('check_in' \| 'check_out' \| 'photo' \| 'scan' \| 'checklist' \| Ask)[]` | [`'check_in'`, `'check_out'`] | The completion artifact: every item, captured on site and hashed together. |
| `join.base`, `join.radius` | `address`, `km` | none | Where a member starts from and how far they travel. Read only to offer Tasks; never shown. |

## Three brands

api.lawyer and apis.tax run in the expert register: an attorney or a signer attests on a packet. [gigs.work](https://gigs.work) is the work register's door, and [lingua's interpreters](https://services.dev/docs/examples/lingua.md#on-site-interpreting) are its worked example. api.forsale pays by role, not by register: a setter's held meeting is a completed Task at a flat fee, and a closer is paid a share of the won deal.

---

- Up: [Pool(): your marketplace](https://services.dev/docs/people/pool.md)
- Previous: [Pool(): your marketplace](https://services.dev/docs/people/pool.md)
- Next: [Join: the application](https://services.dev/docs/people/pool/join.md)
