Company formation

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

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 wordsmatter is a jobasset is a subjectreview is a tasksigner is a membernetwork is a pooloutcome is a end

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.

Run
cat services/formation.ts
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, and check after it.

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

Call
→ 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"]}}}}
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

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

Call
→ POST /reviews/tsk_7Hq2/attest {"checklist":["the founders know why this entity, in this state"]}   # as mbr_eligible
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

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:

Call
→ POST /asks/ask_7Hq4?t=… {"answer":"Acme Robotics Labs"}   # Ada Lovelace: rename, to answer
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

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

Call
→ POST /asks/ask_7Hq6?t=… {}   # Ada Lovelace: adopt, to sign
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

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

Call
→ POST /reviews/tsk_7Hq3/attest {"checklist":["the founder knows the 30-day limit"]}   # as mbr_eligible
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

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:

Run
npx services.dev check
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:

Run
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
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

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:

Call
→ GET /owner/jobs/job_7Hq2
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 and the customer portal cover the rest.

Call
→ GET /owner/matters/job_7Hq2   # the owner console
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 lists the magic value that turns the name down.