Approval or completion: a Pool's register

The running jobjob_7Hq2 · waiting · on approval · $49.00 held

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 registerWork register
Where the value livesa credentialed judgementa person at a place, in a window
What a member deliversan approval: attest, send back or declinea completed Task
The completion artifactthe packet's hash, with the member's credential, region and checklistthe evidence items, each stamped with time and place, hashed together
What a member works fromthe packetthe brief and the site, which open on claim
Who may take iteligibility, from the role and the rulesthe same, plus in_range and window_free
Paythe fee, on every outcome of the actthe fee, per completed Task, party_absent included
PlanLaunch, with your first PoolTeam

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:

KindItemsWho finishes it
Held by the membercheck_in, check_out, photo, scan, checklistthe member, on their phone, at the site
Held by a partyan 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:

ClockStartsWhen it runs out
site.grace, 15 minutesthe window opens, and the member is checked inno 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 hoursthe member checks out, and a party-held item is unfinishedthe 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:

Run
cat pools/interpreters.ts
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',
})
Run
cat services/interpreting.ts
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,
Run
npx services.dev check
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) ·  · 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:

Call
→ POST /tasks/tsk_7Hq2/arrive {"fix":{"lat":48.8791,"lng":2.3554,"accuracy_m":15}}   # as mbr_eligible, 3 Nov 13:48
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.
Call
→ 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 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:

Call
→ POST /tasks/tsk_7Hq2/complete {"check_out":{"fix":{"lat":48.8557,"lng":2.3604,"accuracy_m":10}}}   # as mbr_eligible, 3 Nov 15:02
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.
Call
→ 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
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:

Call
→ 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
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 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.

KeyWrittenLeft outDoes
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.
noticeWithin'24h'Inside this, a client's cancel pays the member the kill share.
step atstringrequired in a work registerThe input that holds the site.
step windowstring | { from: string; length: string }required in a work registerWhen 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.radiusaddress, kmnoneWhere 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.