Declines and direction

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

A member may decline any Task, with a memo only the client reads. The decline is paid, never scored, and final until the client directs the job, to another member they name or to an end.

A member's no is final. They decline on the merits with a reasoned memo, they are paid for the Task, and the decline never counts against them. Then the job waits on the one person who can move it: the client. A conflict with a party is not a decline: the member steps aside, unpaid, before reading the matter, as decline or step aside? sets out.

A member declines from the delivery portal or the member CLI, in their own session. In the legal example, a practitioner won't sign a claim that doesn't read on the disclosure, and an attorney won't demand more than the invoice supports:

SERVICES_DEV_SESSION=ms_psNemolonFiaQz8kWxgxgQ npx services.dev reviews decline tsk_7Hq2 "Claim 1 as drafted doesn't read on the one-handed lock in the disclosure; I won't sign it without a narrower claim."
tsk_7Hq2 · done · practitioner · sign · * · $150.00 · declined · 60 min · $150.00 an hour · due 2026-10-30 14:02
→ POST /reviews/tsk_7Hq2/decline {"memo":"The invoice supports $1,800 of the $4,200; I won't put my name to a demand for the full amount."}   # as mbr_7Hq2
← 200 tsk_7Hq2 · done · attorney · sign · US-NY · $75.00 · signals collections, recipient_elsewhere · declined · 30 min · $150.00 an hour · due 2026-10-27 14:02
  14:02 · task.declined · tsk_7Hq2 · mbr_7Hq2 · memo sha256:c8debd61…, the client's alone
  14:02 · pay.accrued · mbr_7Hq2 · decline · $75.00
  14:02 · job.paused · on the client's direction · sign

Never. A decline is a person's act, so no MCP tool takes it.

Never. A key can't decline for a member.

A decline with no memo answers 422 memo_required. The memo is the client's alone: the record keeps its hash.

Reading the job hands its caller the client's direct ask, as a link to pass on:

Call
→ GET /matters/job_7Hq2
magic values: none
← job_7Hq2 · waiting · on direction · $149.00 held
  next    {"do":"hand_to_person","to":"direct","party":"Ada Lovelace","url":"http://localhost:8787/a/ask_7Hq3?t=…"}

Nothing else moves it. The owner can't approve past the decline, and the buyer can't cancel it:

Call
→ POST /owner/matters/job_7Hq2/approve   # the owner console
magic values: none
← 409 needs_direction: A signer declined, and only the client's direction moves the matter on.
Call
→ POST /matters/job_7Hq2/cancel   # the buyer
magic values: none
← 409 needs_direction

The client reads the memo in their link and names another member. They can't name the one who declined:

Call
→ POST /asks/ask_7Hq3?t=… {"member":"mbr_7Hq2"}
magic values: none
← 422 input_invalid: mbr_7Hq2 declined sign: name another signer.
Call
→ POST /asks/ask_7Hq3?t=… {"member":"mbr_7Hq3"}
magic values: none
← 200 done

← job_7Hq2 · waiting · on claim · $149.00 held · sign · tsk_7Hq3
  task    dispatch direct · to mbr_7Hq3 · offered mbr_7Hq3 (client) · ladder none: it waits on the member named
  mbr_eligible GET /tasks → 0 Tasks

The next Task is locked to the member the client named. It goes to them alone, with no fill ladder, and no one else in the Pool sees it. The client can direct the job to an end instead, and a job that ends there owes only the acts already done.

To let the client pick the member before anyone is offered the Task, add a direct ask of your own: { ask: 'client', to: 'direct', names: 'attorney' }. Its names is the role whose next Task the client locks.

A decline is paid, so a job that needs a second member pays two fees out of one price. check prints that case on every Service before you sell it:

Run
npx services.dev check
magic values: none
services/demand-letter.ts · 26 lines · $149 per job, within 48 hours, charged on send's receipt.
  margin  at least $40.20 when the first attorney signs ($149.00 − $75.00 attorney − $29.80 AI cap − $4.00 coverage) · $2.70 at the ladder's cap, the lower of 50% and what the floor leaves · −$38.80 after a decline and a second attorney

The walk above ends below zero too. The buyer paid the price they were quoted, both members were paid, and the brand's share ran short:

Call
→ POST /reviews/tsk_7Hq3/attest {"checklist":["every claim is supported","no threat the client cannot carry out"]}   # as mbr_7Hq3
magic values: none
  ledger  +$149.00 · attorney's fee $75.00, sold by the attorney (rail member) · brand $74.00 · decline cover $75.00, funded from the brand's share · AI $2.10 · you −$3.10

Set the price so that margin line holds a second fee.

CodeWhen
memo_requiredA decline with no memo
needs_directionAnyone but the client tries to move a declined job
input_invalidThe client names the member who declined

Two sovereigns has why the gate holds both the member's no and the client's yes.