All four, in one filing

The running jobjob_7Hq2 · accepted · document.fr-CA.pdf · $49.00 final

Grow 1 to 4 in one Service, and every branch it writes run once, each by the magic value that produces it.

Each Grow page added one key. Together they make a regulated Service: the buyer answers a question, AI translates and a review attacks it, a sworn translator from the Pool signs, the client signs what was signed, and the filing goes to every registry it's owed to.

check counts 21 lines. Three keys are new here:

services/translation.ts
import { Pool, Rules, Service } from 'services.dev'

// Grow, all four at once: the buyer's glossary, a review, a sworn translator's stamped signature, the
// client's own signature on what was signed, and one filing per registry the translation is owed to.
// A rejection coded missing_certificate goes back to the signer; any other code, to the AI. Two
// rejections, or silence, hand the filing to the buyer.
export default Service({
  name: 'Translation',
  description: 'Translated, signed, filed.',
  input: { document: 'file', to: 'language: a BCP 47 tag, such as fr-CA', client: 'party', registries: 'jurisdiction[]: such as FR, BE' },
  output: { document: 'file', filings: 'text[]' },
  rules: rules(),
  roles: { translator: { pool: translators(), pay: 30 } },
  deliver: {
    glossary: { ask: 'buyer', to: 'answer', items: () => [{ id: 'terms', label: 'Which terms stay in English?' }] },
    translate: 'ai',
    harden: { review: 'adversarial', lenses: ['meaning', 'terms'], rounds: 2 },
    sign: { by: 'translator', stamp: true, est: '20min', checklist: ['the translation is complete', 'the terms match the glossary'] },
    authorize: { ask: 'client', to: 'sign', what: 'translate' },
    file: {

translators() and rules() are Grow 4's, unchanged.

KeyWhat it does
authorizeAn ask to sign: the client signs what, the translation, through their own link. A later change to it voids their signature
eachOne submission and one receipt per registry; lead files first
sign.checklistWhat the translator affirms before signing
Run
npx services.dev check
magic values: metadata.sandbox.review = flag_once, metadata.sandbox.outside = { reject: [missing_certificate] }, metadata.sandbox.outside = reject_once, metadata.sandbox.outside = alerts, metadata.sandbox.outside = never, client.email = declines@example.test, member = mbr_eligible
services/translation.ts · 21 lines · $129 per job, within 48 hours, charged on file's receipt.
  who     A translator signs every document before it is filed. (rules 2026-10) The buyer answers at glossary. The client signs at authorize.
  roles   translator · sworn translator · from sworn-translators · $30 an act
  steps   glossary · buyer · answer → translate · ai → harden · ai · adversarial · 2 lenses → sign · translator · * · stamped · 2-item checklist → authorize · client · sign → file · the registry → hand_off · buyer · answer · routed
  bounds  reserved sign to sworn translator · open file
  agent   order_translation · 29 of 30 words · add "such as …" to client for an agent to try it
  ledger  +$129.00 · AI $1.26 (example) · translator $30.00 · you $97.74
  margin  at least $73.20 when the first translator signs ($129.00 − $30.00 translator − $25.80 AI cap) · $58.20 at the ladder's cap, the lower of 50% and what the floor leaves · $43.20 after a decline and a second translator
          a job that stops costs you at most $55.80
  apps    customer portal · delivery portal · owner console

mcp     13 buyer tools · 4,595 of 8,000 tokens · 9 more with ?toolset=sandbox
✓ ready to sell · 1 Service · it keeps at least 57% of every job
  next    npx services.dev dev

AI and money are simulated until you wire them. $0.42 a call is an example.

One order per magic value, each driven to where it stops: the parties act through their links, the sandbox's eligible member, mbr_eligible, claims each signing Task, and the clock moves while the job waits on the registry.

Call
→ POST /jobs   # one order per magic value, each driven to where it stops
magic values: metadata.sandbox.review = flag_once, metadata.sandbox.outside = { reject: [missing_certificate] }, metadata.sandbox.outside = reject_once, metadata.sandbox.outside = alerts, metadata.sandbox.outside = never, client.email = declines@example.test, member = mbr_eligible
  none                                                          delivered · deed.fr.pdf · $129.00 charged
                                                                glossary.terms · answered | glossary · buyer · answer | translate · ai | harden · ai · adversarial · 2 lenses · pass | sign · person · sworn translator · * · mbr_eligible | authorize · client · sign | file · the registry · 2 accepted
  metadata.sandbox.review = flag_once                           delivered · deed.fr.pdf · $129.00 charged
                                                                glossary.terms · answered | glossary · buyer · answer | translate · ai | harden · ai · adversarial · 2 lenses · flagged | translate · ai · redo | harden · ai · adversarial · 2 lenses · pass | sign · person · sworn translator · * · mbr_eligible | authorize · client · sign | file · the registry · 2 accepted
  metadata.sandbox.outside = { reject: [missing_certificate] }  delivered · deed.fr.pdf · $129.00 charged
                                                                glossary.terms · answered | glossary · buyer · answer | translate · ai | harden · ai · adversarial · 2 lenses · pass | sign · person · sworn translator · * · mbr_eligible | authorize · client · sign | file · the registry · rejected · missing_certificate · repairing at sign | sign · person · sworn translator · * · mbr_eligible | authorize · signature void | authorize · client · sign | file · the registry · 2 accepted
  metadata.sandbox.outside = reject_once                        delivered · deed.fr.pdf · $129.00 charged
                                                                glossary.terms · answered | glossary · buyer · answer | translate · ai | harden · ai · adversarial · 2 lenses · pass | sign · person · sworn translator · * · mbr_eligible | authorize · client · sign | file · the registry · rejected · reject_once · repairing at translate | translate · ai · redo | sign · translator · refused · unattested · document changed after the translator signed it; they sign the new version before it is filed. | authorize · signature void | harden · ai · adversarial · 2 lenses · pass | sign · person · sworn translator · * · mbr_eligible | authorize · signature void | authorize · client · sign | file · the registry · 2 accepted
  metadata.sandbox.outside = alerts                             delivered · deed.fr.pdf · $129.00 charged
                                                                glossary.terms · answered | glossary · buyer · answer | translate · ai | harden · ai · adversarial · 2 lenses · pass | sign · person · sworn translator · * · mbr_eligible | authorize · client · sign | file · the registry · 2 accepted with alerts
  metadata.sandbox.outside = never                              delivered · deed.fr.pdf · $129.00 held
                                                                glossary.terms · answered | glossary · buyer · answer | translate · ai | harden · ai · adversarial · 2 lenses · pass | sign · person · sworn translator · * · mbr_eligible | authorize · client · sign | file · the registry · silent past wait · fallback hand_off | hand_off · buyer · answer
  client.email = declines@example.test                          ended · declined · deed.fr.pdf · $30.00 final
                                                                glossary.terms · answered | glossary · buyer · answer | translate · ai | harden · ai · adversarial · 2 lenses · pass | sign · person · sworn translator · * · mbr_eligible | declined · ended · Ada declined authorize.

The review flags once and the AI redoes the work. missing_certificate goes back to the signer, whose new signature voids the client's, so the client signs again. Any other code goes back to the AI: the gate refuses the old signature on the changed document, and both people sign again before it's filed. A filing accepted with alerts still releases the charge, and its receipt keeps the alerts. Silence past the wait hands the filing to the buyer, and the charge stays held, because the receipt that releases it never came. A client who declines ends the job at $30, the translator's signature.

The tax example writes the same shape for its filings: the federal one leads, a state's rejection routes to the signature it needs, and the repair keeps its first filing time. Federal first, then the states walks it, and the legal example runs the same parts in its own words.

Build with your coding agent: the agent in your editor writes the next Service in the same loop, and takes it live.