Demand letter
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.
cat services/demand-letter.ts 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:
→ 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]}}}}← 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.00The 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:
→ POST /asks/ask_7Hq3?t=… {"choice":"accept"} # Ada Lovelace: settle, to decide← 200 done
← job_7Hq2 · delivered · letter.pdf · $149.00 charged
output settlement 3800 · delivery rcp_7Hq2 · letter.pdfpolicy.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.
→ GET /owner/matters/job_7Hq2 # the owner console← 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.deliveredIf 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:
→ 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"}← 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.10Two sovereigns covers who sets the merits and who sets the mechanics.