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

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

> The Pool's fill_cap lets the ladder raise a brand-funded fee past what the job leaves: a job filled at the cap loses money.

| Fix | Fails in | Exit |
|---|---|---|
| Lower the Pool's fill_cap, or leave it out so the default holds: the lower of 50% and what the margin leaves. | `services/translation.ts` | 1 |

**Owned by** [When no one claims](https://services.dev/docs/people/pool/fill.md): the page that explains what this gate holds.

## What check says

```txt title="npx services.dev check"
  ✗ The Pool's fill_cap lets the ladder raise a brand-funded fee past what the job leaves: a job filled at the cap loses money. Lower the Pool's fill_cap, or leave it out so the default holds: the lower of 50% and what the margin leaves. At the translators Pool's 100% cap a job leaves −$48.80.
    https://services.dev/docs/reference/check/fill_underwater
✗ 1 to fix
```

## The failing file

```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_cap: '100%',
  fill: ['raise 10% 2h', 'widen 4h'],
})
```

## The fix

```diff title="git add -A && git diff --staged"
diff --git a/pools/translators.ts b/pools/translators.ts
index d080b6f..71b927f 100644
--- a/pools/translators.ts
+++ b/pools/translators.ts
@@ -5,6 +5,5 @@ export const translators = Pool({
   roles: { translator: { credential: 'sworn translator' } },
   join: { name: 'text', languages: 'language[]' },
   verify: 'https://verify.example.test/translators',
-  fill_cap: '100%',
   fill: ['raise 10% 2h', 'widen 4h'],
 })
```

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

## The rest of the brand

```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: { translator: { pool: translators, pay: 60 } },
  deliver: {
    translate: 'ai',
    harden: { review: 'adversarial', lenses: ['meaning', 'terms'] },
    sign: { by: 'translator', stamp: true },
  },
  price: 89,
})
```

## Explained in

- [When no one claims](https://services.dev/docs/people/pool/fill.md)
- [Pool(): your marketplace](https://services.dev/docs/people/pool.md)

## What an agent reads

```json title="npx services.dev check --json · the fill_underwater failure"
{
  "code": "fill_underwater",
  "reason": "The Pool's fill_cap lets the ladder raise a brand-funded fee past what the job leaves: a job filled at the cap loses money.",
  "next": "Lower the Pool's fill_cap, or leave it out so the default holds: the lower of 50% and what the margin leaves. At the translators Pool's 100% cap a job leaves −$48.80.",
  "doc_url": "https://services.dev/docs/reference/check/fill_underwater"
}
```

<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": 4490,
    "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": 6,
      "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 · translator · * · stamped",
      "ok": false,
      "price": "$89 per job, within 48 hours, charged on delivery.",
      "who": "A translator signs every document before delivery. (rules 2026-10)",
      "roles": [
        "translator · sworn translator · from translators · $60 an act"
      ],
      "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) · translator $60.00 · you $27.74",
      "approved_ledger": null,
      "outcome": null,
      "margin": {
        "floor": {
          "cents": 1120,
          "pct": 13
        },
        "own": 1120,
        "stop": 7780,
        "nested": [],
        "cases": {
          "first": 1120,
          "cap": -4880,
          "decline": -4880,
          "advice": 0,
          "caps": {
            "sign": 1
          },
          "owned": true,
          "terms": {
            "price": 8900,
            "ai": 1780,
            "nested": 0,
            "fees": [
              {
                "role": "translator",
                "step": "sign",
                "cents": 6000
              }
            ],
            "coverage": 0
          },
          "who": "translator",
          "does": "signs",
          "again": "a second translator"
        }
      },
      "apps": [
        "customer portal",
        "delivery portal",
        "owner console"
      ],
      "failures": [
        {
          "code": "fill_underwater",
          "reason": "The Pool's fill_cap lets the ladder raise a brand-funded fee past what the job leaves: a job filled at the cap loses money.",
          "next": "Lower the Pool's fill_cap, or leave it out so the default holds: the lower of 50% and what the margin leaves. At the translators Pool's 100% cap a job leaves −$48.80.",
          "doc_url": "https://services.dev/docs/reference/check/fill_underwater"
        }
      ]
    }
  ]
}
```

</details>

---

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