Approval or completion: a Pool's 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 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 | the brief and the site, which open on claim |
| Who may take it | eligibility, 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 lists each act on a packet. This page specifies what a work register adds.
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.
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.
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 it inside the contest window |
A client who cancels a claimed Task inside notice pays the kill share, 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.
The Pool and the Service:
cat pools/interpreters.tsimport { 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',
})cat services/interpreting.ts 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,npx services.dev checkpools/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 registerA check-in from the wrong place is refused, then one from the site counts:
→ POST /tasks/tsk_7Hq2/arrive {"fix":{"lat":48.8791,"lng":2.3554,"accuracy_m":15}} # as mbr_eligible, 3 Nov 13:48← 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.→ POST /tasks/tsk_7Hq2/arrive {"fix":{"lat":48.8556,"lng":2.3605,"accuracy_m":12}} # as mbr_eligible, 3 Nov 13:56← 200 · tsk_7Hq2 · on_site · 38 m from the site · 4 min before the windowCompletion needs every evidence item, then the fee accrues and the charge releases:
→ POST /tasks/tsk_7Hq2/complete {"check_out":{"fix":{"lat":48.8557,"lng":2.3604,"accuracy_m":10}}} # as mbr_eligible, 3 Nov 15:02← 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.→ 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 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-offA visit where the client never came to the door:
→ 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 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_absentOn site: interpreting walks the whole visit, the teaser and the claim included, with the artifact the gate froze and a no-show.
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.
| 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 } | { within: '250m', early: '15min', late: '10min', grace: '15min', wait: '24h' } | 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. |
api.lawyer and apis.tax run in the expert register: an attorney or a signer attests on a packet. gigs.work is the work register's door, and lingua's interpreters 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.