Definition errors
What Rules(), Pool() and Brand() refuse as they are written, before anything loads: each code, the path in what you wrote, and the message that says the fix.
26 codes. A definition that can never run is refused where it is written, as a DefinitionError with its code, the path in what you wrote, a message that says the fix, and this page. load reports it with the file, and check exits 1 with it, so a file that won't load never reaches check’s gates.
| Code | Thrown by | Path | Message |
|---|---|---|---|
row_unpositioned | Rules() | services['translation'].sign | Rules 2026-10: services['translation'].sign has no position. Every row records the position counsel gives for it. |
row_kind | Rules() | services['translation'].sign | Rules 2026-10: services['translation'].sign is reserved and open: a row is reserved, open, refused or the client's, exactly one. |
rung_unparsed | Pool() | fill[0] | Pool translators: fill[0] is 'raise 10% in 2h'. A rung is 'raise 10% 2h', 'widen 4h', 'firms 8h', 'staff 12h' or 'cancel 24h'. |
rungs_out_of_order | Pool() | fill[1] | Pool translators: fill[1] 'raise 10% 2h' comes before 'widen 4h': rungs run in time order, so write them that way. |
fill_cap_unparsed | Pool() | fill_cap | Pool translators: fill_cap is '0.5', and a cap is a share of the posted fee, such as '50%'. |
credential_unscoped | Pool() | scopes | Pool translators: scopes leaves out sworn translator, which its roles name. Say whether each counts everywhere ('*') or per region. |
teaser_unknown | Pool() | sees.teaser | Pool translators: the teaser names client. A teaser shows Task facts only (act, region, fee, fee_usd, signals, kind, service, step, role), so a push payload never carries an input; show inputs on the sheet. |
word_repeated | Brand() | words.task | Brand: words.job and words.task are both 'order', so two things would read the same. |
word_unlowercase | Brand() | words.job | Brand: words.job is 'Matter'. A word is lowercase letters and hyphens, and its plural is made for it: 'matter'. |
also_unknown | Brand() | also['matters'] | Brand: also names 'matters', which isn't an operation id: write it as the registry does, such as 'member.ledger.get'. |
writes_unknown | Service() | subject.keeps.glossary | Service Glossary: subject.keeps.glossary is written from terms, which isn't an output. A kept fact is written from the output: glossary. |
period_unknown | Service() | subject.period | Service Glossary: subject.period is edition, which isn't an input. Name the input that says the period, such as year: 'text', or write period as a function of the order. |
clock_due_unknown | Service() | clocks.expires.due | Service Renewal: clocks.expires.due is 'next spring'. A due date is a span after something, such as '30d after file' or '3mo after issued', or a function of the job that returns a date. |
clock_owner_unknown | Service() | clocks.expires.lives_on | Service Renewal: clocks.expires.lives_on is 'subject', and the Service has no subject for the clock to outlive the job on. |
clock_rung_unparsed | Service() | clocks.expires.rungs[0] | Service Renewal: clocks.expires.rungs[0] is 'remind 3d'. A rung is 'notice 30d', 'escalate 3d', 'ack daily 7d' or 'run <step> 3d', counted in days. |
clock_step_unknown | Service() | clocks.expires.rungs[0] | Service Renewal: clocks.expires.rungs[0] runs renew, which isn't a step. Its steps are draft, extend. |
clock_run_unrouted | Service() | clocks.expires.rungs[0] | Service Renewal: clocks.expires.rungs[0] runs draft, which runs in written order anyway. Mark it routed: true, so it runs only when the clock sends the job there. |
clock_evidence_unknown | Service() | clocks.expires.satisfied_by[0] | Service Renewal: clocks.expires.satisfied_by[0] names renew, which isn't a step, so its commit can never satisfy the clock. Its steps are draft, extend. |
clock_hard_moved | Service() | clocks.expires.moves | Service Renewal: clocks.expires is hard, and moves names extend. Nothing moves a hard date: if one date can move and another can't, write two clocks. |
span_ambiguous | Service() | deliver.sign.est | Service Renewal: deliver.sign.est is '30m'. '30m' could be 30 minutes or 30 months. Write '30min' or '30mo'. |
every_unknown | Service() | price.every | Service Glossary: price.every is 'fortnight'. A subscription is charged every day, week, month, quarter, year. |
calendar_unknown | Brand() | calendar.zone | Brand: calendar.zone is 'Eastern', which isn't an IANA zone. Write one such as 'America/New_York', or 'UTC'. |
trigger_unparsed | Service() | on.schedule.refresh | Service Glossary: on.schedule.refresh has 'the first Monday'. A date is 'Feb 1' each year, '2027-02-01' once, 'every monday', or every day, week, month, quarter or year. |
subscription_unpriced | Service() | on | Service Glossary: on mints jobs on a subscription, and the price has no every. Add every: 'month', 'quarter' or 'year' to the price: one charge per cycle. |
allowance_uncounted | Service() | price.includes['translation'] | Service Glossary: price.includes['translation'] is 2.5. An allowance is a whole number of jobs per cycle, such as 12. |
needs_unknown | Service() | deliver.extend.needs | Service Renewal: extend needs draft, which isn't a grant ask. needs names a step written { ask, to: 'grant' }, and this Service has none. |
Each block is the captured run: → the definition as written, ← what it threw, and on "Show all" the error whole.
row_unpositioned
→ Rules({ version: '2026-10', services: { translation: { sign: { reserved: 'sworn translator' } } } })
← DefinitionError · row_unpositioned · services['translation'].signrow_kind
→ Rules({ version: '2026-10', services: { translation: { sign: { reserved: 'sworn translator', open: true, position: 'Certified copies are sworn.' } } } })
← DefinitionError · row_kind · services['translation'].signrung_unparsed
→ Pool({ …, fill: ['raise 10% in 2h'] })
← DefinitionError · rung_unparsed · fill[0]rungs_out_of_order
→ Pool({ …, fill: ['widen 4h', 'raise 10% 2h'] })
← DefinitionError · rungs_out_of_order · fill[1]fill_cap_unparsed
→ Pool({ …, fill_cap: '0.5' })
← DefinitionError · fill_cap_unparsed · fill_capcredential_unscoped
→ Pool({ …, scopes: { notary: '*' } })
← DefinitionError · credential_unscoped · scopesteaser_unknown
→ Pool({ …, sees: { teaser: ['act', 'client'] } })
← DefinitionError · teaser_unknown · sees.teaserword_repeated
→ Brand({ words: { job: 'order', task: 'order' } })
← DefinitionError · word_repeated · words.taskword_unlowercase
→ Brand({ words: { job: 'Matter' } })
← DefinitionError · word_unlowercase · words.jobalso_unknown
→ Brand({ words: { job: 'matter' }, also: { matters: '/matters/:id/journal' } })
← DefinitionError · also_unknown · also['matters']writes_unknown
→ Service({ …, subject: { …, keeps: { glossary: 'terms' } } })
← DefinitionError · writes_unknown · subject.keeps.glossaryperiod_unknown
→ Service({ …, subject: { …, period: 'edition' } })
← DefinitionError · period_unknown · subject.periodclock_due_unknown
→ Service({ …, clocks: { expires: { due: 'next spring', owner: 'buyer' } } })
← DefinitionError · clock_due_unknown · clocks.expires.dueclock_owner_unknown
→ Service({ …, clocks: { expires: { due: '1d after expires', owner: 'buyer', lives_on: 'subject' } } })
← DefinitionError · clock_owner_unknown · clocks.expires.lives_onclock_rung_unparsed
→ Service({ …, clocks: { expires: { …, rungs: ['remind 3d'] } } })
← DefinitionError · clock_rung_unparsed · clocks.expires.rungs[0]clock_step_unknown
→ Service({ …, clocks: { expires: { …, rungs: ['run renew 3d'] } } })
← DefinitionError · clock_step_unknown · clocks.expires.rungs[0]clock_run_unrouted
→ Service({ …, clocks: { expires: { …, rungs: ['run draft 3d'] } } })
← DefinitionError · clock_run_unrouted · clocks.expires.rungs[0]clock_evidence_unknown
→ Service({ …, clocks: { expires: { …, satisfied_by: ['renew'] } } })
← DefinitionError · clock_evidence_unknown · clocks.expires.satisfied_by[0]clock_hard_moved
→ Service({ …, clocks: { expires: { …, hard: true, moves: { extend: '7d after due' } } } })
← DefinitionError · clock_hard_moved · clocks.expires.movesspan_ambiguous
→ Service({ …, deliver: { draft: 'ai', sign: { by: 'person', est: '30m' } } })
← DefinitionError · span_ambiguous · deliver.sign.estevery_unknown
→ Service({ …, price: { usd: 19, every: 'fortnight' } })
← DefinitionError · every_unknown · price.everycalendar_unknown
→ Brand({ calendar: { zone: 'Eastern' } })
← DefinitionError · calendar_unknown · calendar.zonetrigger_unparsed
→ Service({ …, on: { schedule: { refresh: 'the first Monday' } }, price: { usd: 19, every: 'month' } })
← DefinitionError · trigger_unparsed · on.schedule.refreshsubscription_unpriced
→ Service({ …, on: { schedule: { refresh: 'every month' } }, price: 19 })
← DefinitionError · subscription_unpriced · onallowance_uncounted
→ Service({ …, price: { usd: 19, every: 'month', includes: { translation: 2.5 } } })
← DefinitionError · allowance_uncounted · price.includes['translation']needs_unknown
→ Service({ …, deliver: { draft: 'ai', extend: { by: 'ai', needs: 'draft' } } })
← DefinitionError · needs_unknown · deliver.extend.needsThe same refusal, in a Service file: check names the file and stops, before any gate runs.
$ head -3 services/translation.ts
import { Pool, Service } from 'services.dev'
export const translators = Pool({ name: 'translators', roles: { translator: { credential: 'sworn translator' } }, join: { name: 'text' }, verify: 'https://verify.example.test/translators', fill: ['raise 10% in 2h'] })
$ npx services.dev check
services/translation.ts:3 Pool translators: fill[0] is 'raise 10% in 2h'. A rung is 'raise 10% 2h', 'widen 4h', 'firms 8h', 'staff 12h' or 'cancel 24h'.
at fill[0]
next fix services/translation.ts, then npx services.dev check
docs https://services.dev/docs/reference/definition-errors#rung_unparsed