---
title: "Of record"
url: https://services.dev/docs/people/of-record
captured: [of-record.txt, people-seat.txt]
codes: [input_invalid, not_found]
---
# Of record

URL: https://services.dev/docs/people/of-record

> A member who attests at a named step stays of record on the subject across jobs. They withdraw by naming a successor, and if their credential or coverage lapses, the custodian ladder covers the subject so nothing falls into a gap.

Of record answers one question: who answers for a subject between jobs? A patent family outlives the filing that opened it, and someone has to stay on it. The member who attests at the step you name is that person, until they hand it on.

## The smallest form

One line on the subject: the role, the step that names them, and who covers it if they can't:

```bash
grep -A3 subject: services/provisional-patent.ts
```

```txt title="magic values: applicant.email = signs@example.test"
  subject: {
    kind: 'patent family', key: 'application_number', steward: docketWatch,
    of_record: { role: 'practitioner', named_at: 'sign', custodian: ['practitioner', 'brand'] },
  },
```

## Named at a step

The practitioner signs and the application is filed. The subject now names them, and so does their own list. The legal brand calls a subject an `asset`, so its routes read `/assets`:

```txt
→ GET /assets/sbj_7Hq2
```

```json title="200 · magic values: applicant.email = signs@example.test"
{
  "id": "sbj_7Hq2",
  "object": "subject",
  "livemode": false,
  "kind": "patent family",
  "key": {
    "field": "application_number",
    "value": "rcp_7Hq2"
  },
  "created": "2026-10-25T14:02:11.000Z",
  "jobs": [
    "job_7Hq2"
  ],
  "of_record": {
    "role": "practitioner",
    "member": "mbr_7Hq2",
    "named_at": "sign",
    "since": "2026-10-25T14:02:11.000Z",
    "status": "of_record"
  },
  "history": [
    "opened",
    "of_record · mbr_7Hq2"
  ],
  "facts": {},
  "periods": [],
  "simulated": true
}
```

```txt
→ GET /me/assets   # as mbr_7Hq2
```

```txt title="magic values: applicant.email = signs@example.test"
← 200 sbj_7Hq2 · patent family rcp_7Hq2 · of_record
```

## Withdrawing names a successor

A member of record may withdraw at any time, and withdrawal is an act that names who takes the seat. Without a successor it is refused:

```txt
→ POST /assets/sbj_7Hq2/withdraw {}   # as mbr_7Hq2
```

```txt title="magic values: applicant.email = signs@example.test"
← 422 input_invalid: Withdrawal names a successor: the mbr_ id of the signer who becomes of record.
```

The seat stays theirs, withdrawing, until the successor accepts it, in a Task offered to them alone. Accepting is an attestation, unpaid, after the same conflicts check as any Task:

```txt
→ POST /assets/sbj_7Hq2/withdraw {"successor":"mbr_7Hq3"}   # as mbr_7Hq2
```

```txt title="200 · magic values: applicant.email = signs@example.test"
  of_record  mbr_7Hq2 · withdrawing · successor mbr_7Hq3
  history    opened | of_record mbr_7Hq2 | withdrawing mbr_7Hq2 mbr_7Hq3
  14:02 · task.posted · tsk_7Hq3 · $0.00 · dispatch direct · to mbr_7Hq3
  14:02 · task.offered · tsk_7Hq3 · mbr_7Hq3 · client
```

```txt
→ POST /reviews/tsk_7Hq3/attest {"checklist":["I take this subject of record, and its deadlines with it"]}   # as mbr_7Hq3
```

```txt title="magic values: applicant.email = signs@example.test"
← 200 tsk_7Hq3 · done · practitioner · of_record · * · $0.00 · attested · no estimate · due 2026-10-30 14:02
```

```txt
→ GET /assets/sbj_7Hq2
```

```txt title="magic values: applicant.email = signs@example.test"
← 200 sbj_7Hq2 · patent family
  of_record  mbr_7Hq3 · of_record
  history    opened | of_record mbr_7Hq2 | withdrawing mbr_7Hq2 mbr_7Hq3 | withdrawn mbr_7Hq2 mbr_7Hq3
```

## When the seat falls vacant

A member of record whose credential or coverage lapses can't hold the seat. The subject turns vacant, the custodian ladder covers it, rung by rung and then the brand, and the owner console raises an alarm:

```txt
→ POST /attorneys/signers/mbr_7Hq3/verify {"facts":{"credentials":{"patent agent":["US-CA"]},"coverage":{"per_act":1000000,"until":"2026-10-01T00:00:00Z"}}}   # the verifier: the policy lapsed
```

```txt title="magic values: applicant.email = signs@example.test"

→ GET /assets/sbj_7Hq2
← 200 sbj_7Hq2 · patent family
  of_record  mbr_7Hq3 · vacant · covered by brand · coverage lapsed on 2026-10-01
  history    opened | of_record mbr_7Hq2 | withdrawing mbr_7Hq2 mbr_7Hq3 | withdrawn mbr_7Hq2 mbr_7Hq3 | vacant mbr_7Hq3 brand
```

```bash
open http://localhost:8787/console   # the owner console
```

```txt title="magic values: applicant.email = signs@example.test"
alarm · vacant · sbj_7Hq2 · patent family rcp_7Hq2 · practitioner mbr_7Hq3: coverage lapsed on 2026-10-01 · covered by brand
```

## Why stay of record

Staying of record carries first refusal: a follow-on Task on the same subject, such as the next filing on a patent family, is offered to the member of record first, for the Pool's `affinity` window, before anyone else.

## When a member leaves

- **Withdraw with a successor.** The member names who takes the seat, and the successor accepts in their own session.
- **Withdraw without one.** The seat goes to the Pool, offered like any Task, and the custodian ladder covers it until someone accepts.
- **Before a lapse.** A notice goes out 30, 14 and 3 days before a credential or a policy lapses, so the member renews before the seat falls vacant. A seat that falls vacant anyway alarms in the owner console, and the custodian covers it.

## Every form

| Key | What it says | Default |
|---|---|---|
| `of_record.role` | The role whose member stays of record | required |
| `of_record.named_at` | The step whose attestation names them | required |
| `of_record.custodian` | Who covers a vacant seat, in order: roles, then `'brand'` | `['brand']` |

## Seven surfaces

| Surface | What it adds |
|---|---|
| API | `GET /subjects/:id`, and for a member `GET /me/subjects` and `POST /subjects/:id/withdraw` |
| CLI | `subjects get`, and `me subjects` and `subjects withdraw` in a member's session |
| MCP | the `subject://` resource, with its clocks and who is of record |
| SDK | `subjects.get()`, typed, with its clocks and who is of record |
| Site | — |
| Docs | The subject routes, in openapi.json |
| App | The delivery portal lists where the member is of record; the owner console alarms on a vacancy |

## Refusals

| Code | When |
|---|---|
| [`input_invalid`](https://services.dev/docs/reference/errors.md#input_invalid) | A withdrawal names no successor, or one who holds no current credential for the role |
| [`not_found`](https://services.dev/docs/reference/errors.md#not_found) | The member isn't of record on that subject |
| [`custodian_unqualified`](https://services.dev/docs/reference/check/custodian_unqualified.md) | `check`: the ladder leaves the brand of record for a credential it doesn't hold |

## Three brands

- **Legal.** The practitioner who signs stays of record on the patent family, and a vacant seat is covered by the brand. [Provisional patent application](https://services.dev/docs/examples/legal/provisional-patent.md).
- **Tax.** The signer stays of record on the taxpayer across years, and owns the filing clock. [Annual return](https://services.dev/docs/examples/tax/annual-return.md).
- **Sales.** A deal's account names no one of record.

---

- Up: [human: the line](https://services.dev/docs/people.md)
- Previous: [Two sovereigns](https://services.dev/docs/people/sovereignty.md)
- Next: [Buyer, client, party](https://services.dev/docs/people/parties.md)
