---
title: "pool_role_unknown"
url: https://services.dev/docs/reference/check/pool_role_unknown
---
# pool_role_unknown

URL: https://services.dev/docs/reference/check/pool_role_unknown

> A Service's role names a Pool that has no role by that name, so no member could ever be offered its Task.

| Fix | Fails in | Exit |
|---|---|---|
| Name the role as the Pool does, or add it to the Pool's roles. | `services/translation.ts:10` · `roles.sworn` | 1 |

**Owned by** [Pool(): your marketplace](https://services.dev/docs/people/pool.md): the page that explains what this gate holds.

## What check says

```txt title="npx services.dev check"
  ✗ A step performs a reserved act, and no role that does it holds the credential its row reserves it to. Give the step to a role that holds the credential, or set the role's credential to one that meets it. sign performs sign, reserved to sworn translator (rules 2026-10), and the sworn role holds no credential.
    at services/translation.ts:10 · roles.sworn.credential
  ✗ A Service's role names a Pool that has no role by that name, so no member could ever be offered its Task. Name the role as the Pool does, or add it to the Pool's roles. translation's role sworn names the translators Pool, which fills translator.
    at services/translation.ts:10 · roles.sworn
✗ 2 to fix
```

## Often arrives with

The same file failed [`reserved_act_unstaffed`](https://services.dev/docs/reference/check/reserved_act_unstaffed.md) in the same run. Each has its own page.

## The failing file

```ts title="services/translation.ts"
import { Service } from 'services.dev'
import { translators } from '../pools/translators.ts'
import rules from '../rules.ts'

export default Service({
  name: 'Translation',
  input: { document: 'file', to: 'language: a BCP 47 tag, such as fr-CA' },
  output: { document: 'file' },
  rules,
  roles: { sworn: { pool: translators } },
  deliver: {
    translate: 'ai',
    harden: { review: 'adversarial', lenses: ['meaning', 'terms'] },
    sign: { by: 'sworn', stamp: true },
  },
  price: 89,
})
```

## The fix

```diff title="git add -A && git diff --staged"
diff --git a/services/translation.ts b/services/translation.ts
index 2f71f3d..e68b75e 100644
--- a/services/translation.ts
+++ b/services/translation.ts
@@ -7,11 +7,11 @@ export default Service({
   input: { document: 'file', to: 'language: a BCP 47 tag, such as fr-CA' },
   output: { document: 'file' },
   rules,
-  roles: { sworn: { pool: translators } },
+  roles: { translator: { pool: translators } },
   deliver: {
     translate: 'ai',
     harden: { review: 'adversarial', lenses: ['meaning', 'terms'] },
-    sign: { by: 'sworn', stamp: true },
+    sign: { by: 'translator', stamp: true },
   },
   price: 89,
 })
```

```txt title="npx services.dev check"
✓ ready to sell · 1 Service · it keeps at least 80% of every job
```

## The rest of the brand

```ts title="pools/translators.ts"
import { Pool } from 'services.dev'

export const translators = Pool({
  name: 'translators',
  roles: { translator: { credential: 'sworn translator' } },
  join: { name: 'text', languages: 'language[]' },
  verify: 'https://verify.example.test/translators',
  fill: ['raise 10% 2h', 'widen 4h'],
})
```

```ts title="rules.ts"
import { Rules } from 'services.dev'

export default Rules({
  version: '2026-10',
  services: {
    translation: {
      sign: { reserved: 'sworn translator', where: '*', position: 'A sworn translator signs a translation filed with a registry.' },
    },
  },
})
```

## In the legal example

How the legal example passes this gate, in lines read from its files.

```ts title="examples/legal/pools/attorneys.ts"
roles: {
  attorney: { credential: 'bar admission' },
  practitioner: { credential: ['patent attorney', 'patent agent'], where: '*' },
// …
  student: { credential: 'law school enrollment' },
```

```ts title="examples/legal/services/contract-review.ts"
roles: { attorney: { pool: attorneys, pay: 50 } },
```

Read them in context: [The attorneys' Pool](https://services.dev/docs/examples/legal/pool.md), [Contract review](https://services.dev/docs/examples/legal/contract-review.md).

## Explained in

- [Pool(): your marketplace](https://services.dev/docs/people/pool.md)

## What an agent reads

```json title="npx services.dev check --json · the pool_role_unknown failure"
{
  "code": "pool_role_unknown",
  "reason": "A Service's role names a Pool that has no role by that name, so no member could ever be offered its Task.",
  "next": "Name the role as the Pool does, or add it to the Pool's roles. translation's role sworn names the translators Pool, which fills translator.",
  "doc_url": "https://services.dev/docs/reference/check/pool_role_unknown",
  "file": "services/translation.ts",
  "line": 10,
  "path": "roles.sworn"
}
```

<details>
<summary>The whole document check --json prints</summary>

```json title="npx services.dev check --json"
{
  "ai": {
    "cents_per_call": 42,
    "simulated": true
  },
  "mcp": {
    "tools": 13,
    "tokens": 4488,
    "sandbox": 9,
    "budget": 8000
  },
  "files": [
    {
      "path": "rules.ts",
      "lines": 6,
      "kind": "rules",
      "says": "rules 2026-10 · 1 Service · 1 row"
    },
    {
      "path": "pools/translators.ts",
      "lines": 5,
      "kind": "pool",
      "pools": [
        "translators"
      ],
      "says": "translators · 1 role: translator · joins in 1 step · feed · hold 24h"
    }
  ],
  "services": [
    {
      "path": "services/translation.ts",
      "lines": 11,
      "steps": "translate · ai → harden · ai · adversarial · 2 lenses → sign · sworn · * · stamped",
      "ok": false,
      "price": "$89 per job, within 48 hours, charged on delivery.",
      "who": "A sworn signs every document before delivery. (rules 2026-10)",
      "roles": [
        "sworn · no credential · from translators"
      ],
      "rules": "2026-10",
      "boundary": {
        "full": [
          "reserved sign to sworn translator"
        ]
      },
      "agent": {
        "tool": "order_translation",
        "words": 26,
        "job": "job_7Hq2",
        "status": "waiting",
        "on": "claim",
        "charged": null,
        "person": true,
        "why": ""
      },
      "ledger": "+$89.00 · AI $1.26 (example) · you $87.74",
      "approved_ledger": null,
      "outcome": null,
      "margin": {
        "floor": {
          "cents": 7120,
          "pct": 80
        },
        "own": 7120,
        "stop": 1780,
        "nested": [],
        "cases": {
          "first": 7120,
          "cap": 7120,
          "decline": 7120,
          "advice": 0,
          "caps": {
            "sign": 0.5
          },
          "owned": false,
          "terms": {
            "price": 8900,
            "ai": 1780,
            "nested": 0,
            "fees": [
              {
                "role": "sworn",
                "step": "sign",
                "cents": 0
              }
            ],
            "coverage": 0
          },
          "who": "sworn",
          "does": "signs",
          "again": "a second sworn"
        }
      },
      "apps": [
        "customer portal",
        "delivery portal",
        "owner console"
      ],
      "failures": [
        {
          "code": "reserved_act_unstaffed",
          "reason": "A step performs a reserved act, and no role that does it holds the credential its row reserves it to.",
          "next": "Give the step to a role that holds the credential, or set the role's credential to one that meets it. sign performs sign, reserved to sworn translator (rules 2026-10), and the sworn role holds no credential.",
          "doc_url": "https://services.dev/docs/reference/check/reserved_act_unstaffed",
          "file": "services/translation.ts",
          "line": 10,
          "path": "roles.sworn.credential"
        },
        {
          "code": "pool_role_unknown",
          "reason": "A Service's role names a Pool that has no role by that name, so no member could ever be offered its Task.",
          "next": "Name the role as the Pool does, or add it to the Pool's roles. translation's role sworn names the translators Pool, which fills translator.",
          "doc_url": "https://services.dev/docs/reference/check/pool_role_unknown",
          "file": "services/translation.ts",
          "line": 10,
          "path": "roles.sworn"
        }
      ]
    }
  ]
}
```

</details>

---

- Up: [check’s gates](https://services.dev/docs/reference/check.md)
- Previous: [custodian_unqualified](https://services.dev/docs/reference/check/custodian_unqualified.md)
- Next: [fill_bypasses_reserved](https://services.dev/docs/reference/check/fill_bypasses_reserved.md)
