Demand letter

The running jobjob_7Hq2 · waiting · on claim · $149.00 held · sign · tsk_7Hq2

An attorney signs a demand letter, the brand sends it to the other side and waits for the delivery receipt, and the client alone decides whether to settle, against a floor only she sets.

legal's wordsmatter is a jobasset is a subjectreview is a tasksigner is a membernetwork is a pooloutcome is a end

The client consents, the AI drafts the letter, and an adversarial review reads it for accuracy, tone and the collection rules. An attorney admitted where the client is signs it, stamped. The brand sends it, and the delivery receipt releases the charge. An offer in reply is the client's to decide.

Run
cat services/demand-letter.ts
magic values: none
  policy: { floor: { word: 'money', default: 0, binds: 'merits', note: 'the least you will settle for: your default answer to an offer; only you set it' } },
    below_floor: job => job.output.settlement !== undefined && job.output.settlement < job.policy.floor,
    sign: { by: 'attorney', stamp: true, est: '30min', checklist: ['every claim is supported', 'no threat the client cannot carry out'] },
    send: { submit: 'https://delivery.example.test/certified', to: 'the recipient', receipt: 'delivery', fallback: 'courier' },
    courier: { routed: true, submit: 'https://delivery.example.test/courier', to: 'a courier', receipt: 'delivery' },
    settle: { ask: 'client', to: 'decide', choices: ['accept', 'counter', 'close the file'], when: job => job.output.settlement !== undefined },
  ends: { settled: { charge: true }, closed: { charge: true, by: 'client' } },
  price: { usd: 149, release: 'send' },

The whole file, and check after it.

send is a submit step: the letter goes out, and the matter waits for its receipt. release: 'send' names that receipt as the one that releases the charge, since the courier's would be a second. A recipient in another state raises recipient_elsewhere on the review, from the rules row, so the attorney sees it before they claim:

Call
→ POST /matters {"service":"demand-letter","client":{"name":"Ada Lovelace","email":"ada@example.com"},"recipient":{"name":"Initech","email":"ap@initech.example","org":"Initech Inc"},"claim":"unpaid invoice 1042","amount":4200,"client_region":"US-NY","recipient_region":"US-NJ","evidence":["invoice-1042.pdf"],"max_usd":149,"key":"settle","metadata":{"sandbox":{"propose":{"settlement":[3800]}}}}
magic values: metadata.sandbox.propose = { settlement: [3800] }, member = mbr_eligible
← job_7Hq2 · waiting · on party · $149.00 held · consent · ask_7Hq2

# Ada, the client, consents through her own link
→ POST /asks/ask_7Hq2?t=… {}   # Ada Lovelace: consent, to consent
← 200 done

← job_7Hq2 · waiting · on claim · $149.00 held · sign · tsk_7Hq2

# mbr_eligible, in their own session: GET /tasks/tsk_7Hq2/sheet · POST /tasks/tsk_7Hq2/claim · POST /tasks/tsk_7Hq2/clear
→ POST /reviews/tsk_7Hq2/attest {"checklist":["every claim is supported","no threat the client cannot carry out"]}   # as mbr_eligible
← 200 tsk_7Hq2 · done · attorney · sign · US-NY · $75.00 · signals recipient_elsewhere · attested · 30 min · $150.00 an hour · due 2026-10-27 14:02
  14:02 · step.committed · sign · person · bar admission · US-NY · mbr_eligible
  14:02 · pay.accrued · mbr_eligible · attest · $75.00

The reply carries an offer of $3,800, so settle asks the client to accept, counter or close the file. Her link is the only way to answer it:

Call
→ POST /asks/ask_7Hq3?t=… {"choice":"accept"}   # Ada Lovelace: settle, to decide
magic values: metadata.sandbox.propose = { settlement: [3800] }, member = mbr_eligible
← 200 done

← job_7Hq2 · delivered · letter.pdf · $149.00 charged

  output  settlement 3800 · delivery rcp_7Hq2 · letter.pdf

policy.floor binds the merits, so only she sets it. An offer under it raises below_floor, and still reaches her.

An attorney who would cut a threat line signs the edited letter instead of sending it back. The attestation binds both hashes, and the record reads sign · person · edited · sha256:a→b.

Call
→ GET /owner/matters/job_7Hq2   # the owner console
magic values: metadata.sandbox.propose = { settlement: [3800] }, member = mbr_eligible
← job_7Hq2 · delivered · letter.pdf · $149.00 charged
  record  recipient_elsewhere · signal | consent · client · consent | draft · ai | attack · ai · adversarial · 3 lenses · pass | sign · person · bar admission · US-NY · mbr_eligible | send · the recipient · accepted · rcp_7Hq2 | reply · ai | settle · client · decide · decided accept
  ledger  +$149.00 · attorney's fee $75.00, sold by the attorney (rail member) · brand $74.00 · AI $2.10 · you $71.90
  events  matter.ordered · charge.held · signal.raised · ask.opened · matter.paused · consent.given · ask.done · step.proposed · step.committed · decision.made · step.proposed · step.committed · decision.made · decision.made · decision.made · review.done · step.proposed · step.committed · matter.paused · review.posted · review.offered · review.claimed · matter.paused · step.proposed · step.committed · pay.accrued · submission.sent · receipt.accepted · step.proposed · step.committed · charge.collected · decision.made · step.proposed · step.committed · ask.opened · matter.paused · ask.done · step.proposed · step.committed · matter.delivered

If she declines the ask instead, the matter ends declined. A party's decline charges only the paid acts already committed, so she pays for the attorney's signature and the brand carries the AI. Declare declined in ends to charge it otherwise:

Call
→ POST /matters {"service":"demand-letter","client":{"name":"Ada","email":"ada@example.com"},"recipient":{"name":"Initech","email":"ap@initech.example"},"claim":"unpaid invoice 1042","amount":4200,"client_region":"US-NY","recipient_region":"US-NJ","evidence":["invoice-1042.pdf"],"max_usd":149,"key":"demand"}
magic values: member = mbr_eligible
← job_7Hq2 · waiting · on party · $149.00 charged · settle · ask_7Hq3
# Ada declines at settle, through her own link: ask_7Hq3
← job_7Hq2 · ended · declined · letter.pdf · $75.00 final
  record  recipient_elsewhere · signal | consent · client · consent | draft · ai | attack · ai · adversarial · 3 lenses · pass | sign · person · bar admission · US-NY · mbr_eligible | send · the recipient · accepted · rcp_7Hq2 | reply · ai | declined · ended · Ada declined settle.
  ledger  +$75.00 · attorney's fee $75.00, sold by the attorney (rail member) · brand $0.00 · AI $2.10 · you −$2.10

Two sovereigns covers who sets the merits and who sets the mechanics.