---
title: "Definition errors"
url: https://services.dev/docs/reference/definition-errors
---
# Definition errors

URL: https://services.dev/docs/reference/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](https://services.dev/docs/reference/check.md).

| Code | Thrown by | Path | Message |
|---|---|---|---|
| [`row_unpositioned`](#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`](#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`](#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`](#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`](#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`](#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`](#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`](#word_repeated) | `Brand()` | `words.task` | Brand: words.job and words.task are both 'order', so two things would read the same. |
| [`word_unlowercase`](#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`](#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`](#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`](#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`](#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`](#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`](#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`](#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`](#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`](#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`](#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`](#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`](#every_unknown) | `Service()` | `price.every` | Service Glossary: price.every is 'fortnight'. A subscription is charged every day, week, month, quarter, year. |
| [`calendar_unknown`](#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`](#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`](#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`](#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`](#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 code, as thrown

Each block is the captured run: `→` the definition as written, `←` what it threw, and on "Show all" the error whole.

### `row_unpositioned`

```txt title="Rules() · row_unpositioned"
→ Rules({ version: '2026-10', services: { translation: { sign: { reserved: 'sworn translator' } } } })
← DefinitionError · row_unpositioned · services['translation'].sign
{
  "code": "row_unpositioned",
  "path": "services['translation'].sign",
  "message": "Rules 2026-10: services['translation'].sign has no position. Every row records the position counsel gives for it.",
  "doc_url": "https://services.dev/docs/reference/definition-errors#row_unpositioned"
}
```

### `row_kind`

```txt title="Rules() · row_kind"
→ Rules({ version: '2026-10', services: { translation: { sign: { reserved: 'sworn translator', open: true, position: 'Certified copies are sworn.' } } } })
← DefinitionError · row_kind · services['translation'].sign
{
  "code": "row_kind",
  "path": "services['translation'].sign",
  "message": "Rules 2026-10: services['translation'].sign is reserved and open: a row is reserved, open, refused or the client's, exactly one.",
  "doc_url": "https://services.dev/docs/reference/definition-errors#row_kind"
}
```

### `rung_unparsed`

```txt title="Pool() · rung_unparsed"
→ Pool({ …, fill: ['raise 10% in 2h'] })
← DefinitionError · rung_unparsed · fill[0]
{
  "code": "rung_unparsed",
  "path": "fill[0]",
  "message": "Pool translators: fill[0] is 'raise 10% in 2h'. A rung is 'raise 10% 2h', 'widen 4h', 'firms 8h', 'staff 12h' or 'cancel 24h'.",
  "doc_url": "https://services.dev/docs/reference/definition-errors#rung_unparsed"
}
```

### `rungs_out_of_order`

```txt title="Pool() · rungs_out_of_order"
→ Pool({ …, fill: ['widen 4h', 'raise 10% 2h'] })
← DefinitionError · rungs_out_of_order · fill[1]
{
  "code": "rungs_out_of_order",
  "path": "fill[1]",
  "message": "Pool translators: fill[1] 'raise 10% 2h' comes before 'widen 4h': rungs run in time order, so write them that way.",
  "doc_url": "https://services.dev/docs/reference/definition-errors#rungs_out_of_order"
}
```

### `fill_cap_unparsed`

```txt title="Pool() · fill_cap_unparsed"
→ Pool({ …, fill_cap: '0.5' })
← DefinitionError · fill_cap_unparsed · fill_cap
{
  "code": "fill_cap_unparsed",
  "path": "fill_cap",
  "message": "Pool translators: fill_cap is '0.5', and a cap is a share of the posted fee, such as '50%'.",
  "doc_url": "https://services.dev/docs/reference/definition-errors#fill_cap_unparsed"
}
```

### `credential_unscoped`

```txt title="Pool() · credential_unscoped"
→ Pool({ …, scopes: { notary: '*' } })
← DefinitionError · credential_unscoped · scopes
{
  "code": "credential_unscoped",
  "path": "scopes",
  "message": "Pool translators: scopes leaves out sworn translator, which its roles name. Say whether each counts everywhere ('*') or per region.",
  "doc_url": "https://services.dev/docs/reference/definition-errors#credential_unscoped"
}
```

### `teaser_unknown`

```txt title="Pool() · teaser_unknown"
→ Pool({ …, sees: { teaser: ['act', 'client'] } })
← DefinitionError · teaser_unknown · sees.teaser
{
  "code": "teaser_unknown",
  "path": "sees.teaser",
  "message": "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.",
  "doc_url": "https://services.dev/docs/reference/definition-errors#teaser_unknown"
}
```

### `word_repeated`

```txt title="Brand() · word_repeated"
→ Brand({ words: { job: 'order', task: 'order' } })
← DefinitionError · word_repeated · words.task
{
  "code": "word_repeated",
  "path": "words.task",
  "message": "Brand: words.job and words.task are both 'order', so two things would read the same.",
  "doc_url": "https://services.dev/docs/reference/definition-errors#word_repeated"
}
```

### `word_unlowercase`

```txt title="Brand() · word_unlowercase"
→ Brand({ words: { job: 'Matter' } })
← DefinitionError · word_unlowercase · words.job
{
  "code": "word_unlowercase",
  "path": "words.job",
  "message": "Brand: words.job is 'Matter'. A word is lowercase letters and hyphens, and its plural is made for it: 'matter'.",
  "doc_url": "https://services.dev/docs/reference/definition-errors#word_unlowercase"
}
```

### `also_unknown`

```txt title="Brand() · also_unknown"
→ Brand({ words: { job: 'matter' }, also: { matters: '/matters/:id/journal' } })
← DefinitionError · also_unknown · also['matters']
{
  "code": "also_unknown",
  "path": "also['matters']",
  "message": "Brand: also names 'matters', which isn't an operation id: write it as the registry does, such as 'member.ledger.get'.",
  "doc_url": "https://services.dev/docs/reference/definition-errors#also_unknown"
}
```

### `writes_unknown`

```txt title="Service() · writes_unknown"
→ Service({ …, subject: { …, keeps: { glossary: 'terms' } } })
← DefinitionError · writes_unknown · subject.keeps.glossary
{
  "code": "writes_unknown",
  "path": "subject.keeps.glossary",
  "message": "Service Glossary: subject.keeps.glossary is written from terms, which isn't an output. A kept fact is written from the output: glossary.",
  "doc_url": "https://services.dev/docs/reference/definition-errors#writes_unknown"
}
```

### `period_unknown`

```txt title="Service() · period_unknown"
→ Service({ …, subject: { …, period: 'edition' } })
← DefinitionError · period_unknown · subject.period
{
  "code": "period_unknown",
  "path": "subject.period",
  "message": "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.",
  "doc_url": "https://services.dev/docs/reference/definition-errors#period_unknown"
}
```

### `clock_due_unknown`

```txt title="Service() · clock_due_unknown"
→ Service({ …, clocks: { expires: { due: 'next spring', owner: 'buyer' } } })
← DefinitionError · clock_due_unknown · clocks.expires.due
{
  "code": "clock_due_unknown",
  "path": "clocks.expires.due",
  "message": "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.",
  "doc_url": "https://services.dev/docs/reference/definition-errors#clock_due_unknown"
}
```

### `clock_owner_unknown`

```txt title="Service() · clock_owner_unknown"
→ Service({ …, clocks: { expires: { due: '1d after expires', owner: 'buyer', lives_on: 'subject' } } })
← DefinitionError · clock_owner_unknown · clocks.expires.lives_on
{
  "code": "clock_owner_unknown",
  "path": "clocks.expires.lives_on",
  "message": "Service Renewal: clocks.expires.lives_on is 'subject', and the Service has no subject for the clock to outlive the job on.",
  "doc_url": "https://services.dev/docs/reference/definition-errors#clock_owner_unknown"
}
```

### `clock_rung_unparsed`

```txt title="Service() · clock_rung_unparsed"
→ Service({ …, clocks: { expires: { …, rungs: ['remind 3d'] } } })
← DefinitionError · clock_rung_unparsed · clocks.expires.rungs[0]
{
  "code": "clock_rung_unparsed",
  "path": "clocks.expires.rungs[0]",
  "message": "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.",
  "doc_url": "https://services.dev/docs/reference/definition-errors#clock_rung_unparsed"
}
```

### `clock_step_unknown`

```txt title="Service() · clock_step_unknown"
→ Service({ …, clocks: { expires: { …, rungs: ['run renew 3d'] } } })
← DefinitionError · clock_step_unknown · clocks.expires.rungs[0]
{
  "code": "clock_step_unknown",
  "path": "clocks.expires.rungs[0]",
  "message": "Service Renewal: clocks.expires.rungs[0] runs renew, which isn't a step. Its steps are draft, extend.",
  "doc_url": "https://services.dev/docs/reference/definition-errors#clock_step_unknown"
}
```

### `clock_run_unrouted`

```txt title="Service() · clock_run_unrouted"
→ Service({ …, clocks: { expires: { …, rungs: ['run draft 3d'] } } })
← DefinitionError · clock_run_unrouted · clocks.expires.rungs[0]
{
  "code": "clock_run_unrouted",
  "path": "clocks.expires.rungs[0]",
  "message": "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.",
  "doc_url": "https://services.dev/docs/reference/definition-errors#clock_run_unrouted"
}
```

### `clock_evidence_unknown`

```txt title="Service() · clock_evidence_unknown"
→ Service({ …, clocks: { expires: { …, satisfied_by: ['renew'] } } })
← DefinitionError · clock_evidence_unknown · clocks.expires.satisfied_by[0]
{
  "code": "clock_evidence_unknown",
  "path": "clocks.expires.satisfied_by[0]",
  "message": "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.",
  "doc_url": "https://services.dev/docs/reference/definition-errors#clock_evidence_unknown"
}
```

### `clock_hard_moved`

```txt title="Service() · clock_hard_moved"
→ Service({ …, clocks: { expires: { …, hard: true, moves: { extend: '7d after due' } } } })
← DefinitionError · clock_hard_moved · clocks.expires.moves
{
  "code": "clock_hard_moved",
  "path": "clocks.expires.moves",
  "message": "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.",
  "doc_url": "https://services.dev/docs/reference/definition-errors#clock_hard_moved"
}
```

### `span_ambiguous`

```txt title="Service() · span_ambiguous"
→ Service({ …, deliver: { draft: 'ai', sign: { by: 'person', est: '30m' } } })
← DefinitionError · span_ambiguous · deliver.sign.est
{
  "code": "span_ambiguous",
  "path": "deliver.sign.est",
  "message": "Service Renewal: deliver.sign.est is '30m'. '30m' could be 30 minutes or 30 months. Write '30min' or '30mo'.",
  "doc_url": "https://services.dev/docs/reference/definition-errors#span_ambiguous"
}
```

### `every_unknown`

```txt title="Service() · every_unknown"
→ Service({ …, price: { usd: 19, every: 'fortnight' } })
← DefinitionError · every_unknown · price.every
{
  "code": "every_unknown",
  "path": "price.every",
  "message": "Service Glossary: price.every is 'fortnight'. A subscription is charged every day, week, month, quarter, year.",
  "doc_url": "https://services.dev/docs/reference/definition-errors#every_unknown"
}
```

### `calendar_unknown`

```txt title="Brand() · calendar_unknown"
→ Brand({ calendar: { zone: 'Eastern' } })
← DefinitionError · calendar_unknown · calendar.zone
{
  "code": "calendar_unknown",
  "path": "calendar.zone",
  "message": "Brand: calendar.zone is 'Eastern', which isn't an IANA zone. Write one such as 'America/New_York', or 'UTC'.",
  "doc_url": "https://services.dev/docs/reference/definition-errors#calendar_unknown"
}
```

### `trigger_unparsed`

```txt title="Service() · trigger_unparsed"
→ Service({ …, on: { schedule: { refresh: 'the first Monday' } }, price: { usd: 19, every: 'month' } })
← DefinitionError · trigger_unparsed · on.schedule.refresh
{
  "code": "trigger_unparsed",
  "path": "on.schedule.refresh",
  "message": "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.",
  "doc_url": "https://services.dev/docs/reference/definition-errors#trigger_unparsed"
}
```

### `subscription_unpriced`

```txt title="Service() · subscription_unpriced"
→ Service({ …, on: { schedule: { refresh: 'every month' } }, price: 19 })
← DefinitionError · subscription_unpriced · on
{
  "code": "subscription_unpriced",
  "path": "on",
  "message": "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.",
  "doc_url": "https://services.dev/docs/reference/definition-errors#subscription_unpriced"
}
```

### `allowance_uncounted`

```txt title="Service() · allowance_uncounted"
→ Service({ …, price: { usd: 19, every: 'month', includes: { translation: 2.5 } } })
← DefinitionError · allowance_uncounted · price.includes['translation']
{
  "code": "allowance_uncounted",
  "path": "price.includes['translation']",
  "message": "Service Glossary: price.includes['translation'] is 2.5. An allowance is a whole number of jobs per cycle, such as 12.",
  "doc_url": "https://services.dev/docs/reference/definition-errors#allowance_uncounted"
}
```

### `needs_unknown`

```txt title="Service() · needs_unknown"
→ Service({ …, deliver: { draft: 'ai', extend: { by: 'ai', needs: 'draft' } } })
← DefinitionError · needs_unknown · deliver.extend.needs
{
  "code": "needs_unknown",
  "path": "deliver.extend.needs",
  "message": "Service Renewal: extend needs draft, which isn't a grant ask. needs names a step written { ask, to: 'grant' }, and this Service has none.",
  "doc_url": "https://services.dev/docs/reference/definition-errors#needs_unknown"
}
```

## As check reports it

The same refusal, in a Service file: `check` names the file and stops, before any gate runs.

```txt
$ 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
```

---

- Up: [Your first paid job](https://services.dev/docs.md)
- Previous: [Errors](https://services.dev/docs/reference/errors.md)
- Next: [check’s gates](https://services.dev/docs/reference/check.md)
