---
title: "Demand letter"
url: https://services.dev/docs/examples/legal/demand-letter
captured: [legal-build.txt, legal-demand.txt, legal-walk.txt]
---
# Demand letter

URL: https://services.dev/docs/examples/legal/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 words: matter is a job, asset is a subject, review is a task, signer is a member, network is a pool, outcome is a end (examples/legal/brand.ts).*

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.

```bash
cat services/demand-letter.ts
```

```txt title="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](https://services.dev/docs/examples/legal/build.md#the-other-three), and `check` after it.

## A submission to the other side

`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:

```txt
→ 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]}}}}
```

```txt title="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
```

## A decision only the client makes

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:

```txt
→ POST /asks/ask_7Hq3?t=… {"choice":"accept"}   # Ada Lovelace: settle, to decide
```

```txt title="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's edit

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`.

## What the matter leaves

```txt
→ GET /owner/matters/job_7Hq2   # the owner console
```

```txt title="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
```

## When she declines

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:

```txt
→ 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"}
```

```txt title="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](https://services.dev/docs/people/sovereignty.md) covers who sets the merits and who sets the mechanics.

---

- Up: [The legal example](https://services.dev/docs/examples/legal.md)
- Previous: [Contract review](https://services.dev/docs/examples/legal/contract-review.md)
- Next: [Company formation](https://services.dev/docs/examples/legal/formation.md)
