---
title: "Company formation"
url: https://services.dev/docs/examples/legal/formation
captured: [legal-build.txt, legal-check.txt, legal-flows.txt, legal-formation.txt, subject-watch.txt]
---
# Company formation

URL: https://services.dev/docs/examples/legal/formation

> The brand files the certificate itself, as an open act. An attorney admitted where the founders are advises on the entity and the 83(b) election, the state turns down a name and the founders rename it, and every founder signs.

*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 brand forms the company itself. Filing the certificate is an open act, so no attorney signs it. Two answers are advice, reserved to an attorney admitted where the founders are: which entity to form, and whether to make the 83(b) election. Any founder consents for all, and every founder signs.

Three of its clocks outlive the matter.

```bash
cat services/formation.ts
```

```txt title="magic values: none"
  roles: { attorney: { pool: attorneys, pay: 60 } },
  talk: { adopt: 'attorney' },
    advise_entity: { by: 'attorney', act: 'advise_entity_choice', est: '30min', checklist: ['the founders know why this entity, in this state'] },
    form_entity: { submit: 'https://filings.example.test/secretary-of-state', to: 'the state', receipt: 'file_number', rejected: { name_unavailable: 'rename' } },
    rename: { routed: true, ask: 'founders', to: 'answer', next: () => 'form_entity' },
    adopt: { ask: 'founders', to: 'sign', what: 'documents', all: true, how: 'esign', capacity: ['director', 'founder'] },
    advise_83b: { by: 'attorney', est: '20min', when: job => job.input.vesting, checklist: ['the founder knows the 30-day limit'] },
  clocks: {
    election: { due: '30d after adopt', owner: 'buyer', rungs: ['notice 14d', 'ack daily 7d'], lapse: ['mailed, with proof', 'not filing, in writing'] },
    agent: { due: '1y after form_entity', every: 'year', owner: 'brand', lives_on: 'subject' },
    franchise_tax: { due: job => franchiseTaxDue(job.input.state, job.record), every: 'year', owner: 'buyer', lives_on: 'subject', rungs: ['notice 30d'] },
  price: { usd: 299, release: 'form_entity' },
```

[The whole file](https://services.dev/docs/examples/legal/build.md#the-other-three), and `check` after it.

## One founder consents for all

Each founder gets a link. The first to consent consents for the founders, and the other link is voided:

```txt
→ POST /matters {"service":"formation","name":"Acme Robotics","founders":[{"name":"Ada Lovelace","email":"ada@example.com"},{"name":"Grace Hopper","email":"grace@example.com"}],"state":"DE","shares":10000000,"vesting":true,"client_region":"US-CA","max_usd":299,"key":"formation","metadata":{"sandbox":{"outside":{"reject":["name_unavailable"]}}}}
```

```txt title="magic values: metadata.sandbox.outside = { reject: [name_unavailable] }, member = mbr_eligible"
← job_7Hq2 · waiting · on party · $299.00 held · consent · ask_7Hq2, ask_7Hq3

# the founders, each through their own link
→ POST /asks/ask_7Hq2?t=… {}   # Ada Lovelace: consent, to consent
← 200 done
→ POST /asks/ask_7Hq3?t=… {}   # Grace Hopper: consent, to consent
← 410 ask_voided: This ask was voided, so its link no longer works.

← job_7Hq2 · waiting · on claim · $299.00 held · advise_entity · tsk_7Hq2
```

## Advice before the filing

An attorney admitted in California tells the founders why this entity, in this state:

```txt
→ POST /reviews/tsk_7Hq2/attest {"checklist":["the founders know why this entity, in this state"]}   # as mbr_eligible
```

```txt title="magic values: metadata.sandbox.outside = { reject: [name_unavailable] }, member = mbr_eligible"
← 200 tsk_7Hq2 · done · attorney · advise_entity_choice · US-CA · $60.00 · attested · 30 min · $120.00 an hour · due 2026-10-27 14:02
  14:02 · step.committed · advise_entity · person · bar admission · US-CA · mbr_eligible
  14:02 · pay.accrued · mbr_eligible · attest · $60.00
```

## A name the state turns down

The state rejects the first filing with `name_unavailable`, which routes to `rename`. The founders pick another name, and the second filing's receipt releases the charge:

```txt
→ POST /asks/ask_7Hq4?t=… {"answer":"Acme Robotics Labs"}   # Ada Lovelace: rename, to answer
```

```txt title="magic values: metadata.sandbox.outside = { reject: [name_unavailable] }, member = mbr_eligible"
← 200 done
→ POST /asks/ask_7Hq5?t=… {"answer":"Acme Robotics Labs"}   # Grace Hopper: rename, to answer
← 410 ask_voided: This ask was voided, so its link no longer works.

← job_7Hq2 · waiting · on party · $299.00 charged · adopt · ask_7Hq6, ask_7Hq7
```

## Every founder signs

`all: true` asks each founder to sign the documents, and the step waits for every one:

```txt
→ POST /asks/ask_7Hq6?t=… {}   # Ada Lovelace: adopt, to sign
```

```txt title="magic values: metadata.sandbox.outside = { reject: [name_unavailable] }, member = mbr_eligible"
← 200 done
→ POST /asks/ask_7Hq7?t=… {}   # Grace Hopper: adopt, to sign
← 200 done

← job_7Hq2 · waiting · on claim · $299.00 charged · advise_83b · tsk_7Hq3
```

## The election

Because the founders vest, an attorney advises on the 83(b) election, and checks the founder knows the deadline:

```txt
→ POST /reviews/tsk_7Hq3/attest {"checklist":["the founder knows the 30-day limit"]}   # as mbr_eligible
```

```txt title="magic values: metadata.sandbox.outside = { reject: [name_unavailable] }, member = mbr_eligible"
← 200 tsk_7Hq3 · done · attorney · advise_83b · US-CA · $60.00 · attested · 20 min · $180.00 an hour · due 2026-10-27 14:02
  14:02 · step.committed · advise_83b · person · bar admission · US-CA · mbr_eligible
  14:02 · pay.accrued · mbr_eligible · attest · $60.00
```

## Three clocks

The state's receipt opens two yearly clocks on the company, the brand's registered agent and the buyer's franchise tax. Signing opens the election's 30 days:

```bash
npx services.dev check
```

```txt title="magic values: none"
  clocks  election · 30d after adopt · the buyer
          agent · 1y after form_entity · the brand · every year · on the company
          franchise_tax · a date your code decides · the buyer · every year · on the company
```

Satisfying the franchise tax rolls it to next year. It never closes:

```bash
node -e "import('./flows.ts')"   # api.lawyer at a6b27b1: 77 tests in contract-review-playbook, de-formation-playbook, demand-letter-playbook, trademark-oa-playbook, gate, settle, eligibility
```

```txt title="magic values: none"
  de-formation-playbook#satisfying the franchise tax ROLLS the next occurrence forward — it never terminates the obligation
    → legal › formation: satisfying the franchise tax rolls the next occurrence forward
```

## The dates outlive the matter

A clock on the company keeps running after the matter ends. `subject-watch` runs the hand-off on a one-clock company: the end asks the client to own the date, and the customer portal offers the company's steward beside I'll own this date:

```txt
→ GET /owner/jobs/job_7Hq2
```

```txt title="magic values: none"
  clock.outlived · franchise_tax · 2027-03-25 · the client owns it, or orders Company Watch
  ask.opened · own_dates · sign · buyer

# the customer portal: the date, who answers for it, its next rung, and the two ways to keep it
→ GET /portal
  franchise tax · due 25 Mar 2027 · you answer for it · notice 23 Feb
    [Mark it done]  clock.satisfy · POST /clocks/clk_7Hq2/satisfy
    [Keep it with Company Watch · $9]  service.order · POST /company-watch
    [I'll own this date]  ask.complete · POST /asks/ask_7Hq2

# the client signs that they own the date, through their own link
→ POST /asks/ask_7Hq2?t=… {}
← 200 · ask_7Hq2 · done

→ GET /clocks?job=job_7Hq2
← 200 · OK · 1 clock
  clk_7Hq2 · franchise_tax · due 2027-03-25 · buyer · open · on the subject · every year · the client signed for it 2026-10-25
```

[Clocks](https://services.dev/docs/service/clocks.md) and [the customer portal](https://services.dev/docs/app/buyers.md) cover the rest.

## The record

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

```txt title="magic values: metadata.sandbox.outside = { reject: [name_unavailable] }, member = mbr_eligible"
← job_7Hq2 · delivered · $299.00 charged
  record  consent · founders · consent | advise_entity · person · bar admission · US-CA · mbr_eligible | review · ai · pass | form_entity · the state · rejected · name_unavailable · repairing at rename | rename · founders · answer | form_entity · the state · accepted · rcp_7Hq3 | documents · ai | adopt · founders · sign · esign | advise_83b · person · bar admission · US-CA · mbr_eligible
  ledger  +$299.00 · attorney's fee $60.00 at advise_entity, sold by the attorney (rail member) · attorney's fee $60.00 at advise_83b, sold by the attorney (rail member) · brand $179.00 · AI $0.84 · you $178.16
  events  matter.ordered · charge.held · ask.opened · ask.opened · matter.paused · consent.given · ask.done · ask.voided · step.proposed · step.committed · matter.paused · review.posted · review.offered · review.claimed · matter.paused · step.proposed · step.committed · pay.accrued · decision.made · review.done · step.proposed · step.committed · submission.sent · receipt.rejected · ask.opened · ask.opened · matter.paused · ask.done · ask.voided · step.proposed · step.committed · submission.sent · receipt.accepted · step.proposed · step.committed · clock.opened · clock.opened · charge.collected · decision.made · step.proposed · step.committed · ask.opened · ask.opened · matter.paused · ask.done · ask.done · step.proposed · step.committed · clock.opened · matter.paused · review.posted · review.offered · review.claimed · matter.paused · step.proposed · step.committed · pay.accrued · matter.delivered
```

[Every branch](https://services.dev/docs/examples/legal/branches.md) lists the magic value that turns the name down.

---

- Up: [The legal example](https://services.dev/docs/examples/legal.md)
- Previous: [Demand letter](https://services.dev/docs/examples/legal/demand-letter.md)
- Next: [Trademark response](https://services.dev/docs/examples/legal/trademark-response.md)
