Everyone gets an app
Who takes part in a job is worked out from your Service, never declared, and each of them gets the app and the calls their part needs.
You never list who takes part in a job. check reads it off your Service: who orders it, who the work is for, who acts at each step, and who runs the business. Each of them gets an app, and each app shows only the calls their part allows.
Translation, as npx services.dev writes it, has no person in it, so check finds two apps:
$ npx services.dev check
services/translation.ts · 4 lines · $49 per job, within 48 hours, charged on delivery.
who AI delivers every job.
steps draft · ai → review · ai · adversarial
agent order_translation · 24 of 30 words · bought job_7Hq2 · $49.00 · no person
ledger +$49.00 · AI $0.84 (example) · you $48.16
margin at least $39.20 a job (80%) · a job that stops costs you at most $9.80
apps customer portal · owner consoleGrow it with a question for the buyer and a sworn translator's signature, and the third app appears. Nothing declared it:
$ npx services.dev check
services/translation.ts · 13 lines · $89 per job, within 48 hours, charged on delivery.
who A translator signs every document before delivery. (rules 2026-10) The buyer answers at glossary.
roles translator · sworn translator · from sworn-translators · $30 an act
steps glossary · buyer · answer → translate · ai → harden · ai · adversarial · 2 lenses → sign · translator · * · stamped
bounds reserved sign to sworn translator
agent order_translation · 25 of 30 words · job_7Hq2 waits on party
ledger +$89.00 · AI $1.26 (example) · translator $30.00 · you $57.74
margin at least $41.20 when the first translator signs ($89.00 − $30.00 translator − $17.80 AI cap) · $26.20 at the ladder's cap, the lower of 50% and what the floor leaves · $11.20 after a decline and a second translator
a job that stops costs you at most $47.80
apps customer portal · delivery portal · owner consoleThe signer is on the ledger, the buyer is on the glossary step, and the delivery portal is where the signer signs.
check --who prints, for one Service, the doer of every step, why it is theirs, how they are paid, and the plan its line needs. apis.tax's annual return:
$ npx services.dev check --who services/annual-return.ts
services/annual-return.ts · Annual Return · 12 steps · $1,800 per return, charged when the federal return is accepted
consent party the owner, as officer · an ask: the §7216 consent · nothing · Free
organizer party the owner · an ask: upload the request list · nothing · Free
compute code schedules, your code · by: schedules, citing each one · nothing · Free
draft ai AI, citing the workpapers · the default · AI, at cost · Free
check ai AI, with three adversarial lenses · the default · AI, at cost · Free
sign credentialed a signer from practitioners: a PTIN, and a CPA licence or an enrolled agent's card, as the paid preparer for the brand's firm · rules: sign is reserved · $45 + $15 a jurisdiction an act · Launch: roles.signer.pool at :34
authorize party the owner, id-verified · an ask: Form 8879-CORP or 8879-PE · nothing · Free
Each doer is a rung of who does the step.
| Who | Their part | Their app | Money | Plan |
|---|---|---|---|---|
| buyer | pays, holding a key with a cap; often an agent | customer portal | pays the price, held until the fact it names | Free |
| client | the party the work is for, when it isn't the buyer: a party input. Only the client sets the choices that are theirs to make | customer portal, or a link that needs no account | pays nothing, unless they're also the buyer | Free |
| member | a credentialed person who does a step, from a Pool | delivery portal | paid the fee fixed at post, on every outcome of the act | Launch |
| staff | your own team, at the steps you keep in house | owner console | on your own payroll; no fee line | Free |
| tenant | an integrator reselling your Service as its own offer | tenant console | pays your price and sets its own | Team |
| practice | a buyer that brings its own professionals to do the steps | practice console | pays your price; its professionals are its own | Scale |
| owner | you: every job, every ledger line, the line where people come in | owner console | keeps the ledger's last line | Free |
A credentialed step needs a person who holds the credential. You and two staff sign on Free, with a role and no pool. Past that, a Pool's members come from one of five places, each one line:
| From | One line | Roster · rules · name members see | Placement | Plan |
|---|---|---|---|---|
| A Pool you rent | pool: 'gigs.expert/translators' | the operator's, throughout | theirs, on each Task it fills | Launch |
| Your own Pool | Pool({...}), at /<pool> on your brand | yours · yours · your brand | none | Launch |
| An existing door | door: 'gigs.expert' | the door's · yours · the door | the door's, on each Task it fills | Launch |
| Your own door | door: 'join.lingua.example' | yours · yours · your door | none | Team |
| Your Pool, sold | export on your Pool | yours · yours, for every importer | yours, paid to you | Scale |
Every source keeps one member charter that no Pool, importer or door can weaken. Which step each person does, and how they're paid, is who does the step.
Each credential reaches the operations its holder may call, and no more. This table is generated from the credential and operation registries:
| Who | Holds | Can | Operations | Reaches | A person? |
|---|---|---|---|---|---|
| a buyer | secret key, test mode, sk_test_ | order, read, accept, send back, cancel, end, watch, and run test clocks | 37 | http, cli, mcp, sdk | |
| a buyer | secret key, sk_live_ | order, read, accept, send back, cancel, end, watch | 35 | http, cli, mcp, sdk | |
| an agent a party delegated, scoped by Service and time | delegated key, dlg_ | order within its cap; complete answer and upload asks; read that party's jobs | 31 | http, mcp, sdk |
A key can order, wait, accept and send back, so an agent can buy a whole job. Some acts need the person themselves: signing, consenting, directing, deciding and approving. Those take a person's own session or the link their ask carries, and they are never an MCP tool. An agent that reaches one gets the link first in next, to hand to the person it asks, and the calls it can still make:
→ tools/call get_job {"id":"job_7Hq2","wait":50}
# the text an agent reads first, beside structuredContent
← job_7Hq2 · waiting · on party · $49.00 held
next hand http://localhost:8787/a/ask_7Hq2?t=8FaWT5EoCj4h-uMyjlXp3_ to the person it asks
next get_job {"id":"job_7Hq2"}
next cancel_job {"id":"job_7Hq2"}If it tries to finish the job itself, the answer is needs_the_party, with the same link.
So a person keeps every act that is theirs, and an agent still does everything else.
Choose your shape: the reference Service that looks like yours, what each job leaves you, and the plans it climbs.