reserved_act_unstaffed
A step performs a reserved act, and no role that does it holds the credential its row reserves it to.
| Fix | Fails in | Exit |
|---|---|---|
| Give the step to a role that holds the credential, or set the role's credential to one that meets it. | services/translation.ts:9 · roles.translator.credential | 1 |
Owned by Add a signer: the page that explains what this gate holds.
✗ 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 translator role holds only translator.
at services/translation.ts:9 · roles.translator.credential
✗ 1 to fiximport { Service } from 'services.dev'
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: { credential: 'translator' } },
deliver: {
translate: 'ai',
harden: { review: 'adversarial', lenses: ['meaning', 'terms'] },
sign: { by: 'translator', stamp: true },
},
price: 89,
})diff --git a/services/translation.ts b/services/translation.ts
index 0585d1f..d9dc9a6 100644
--- a/services/translation.ts
+++ b/services/translation.ts
@@ -6,7 +6,7 @@ export default Service({
input: { document: 'file', to: 'language: a BCP 47 tag, such as fr-CA' },
output: { document: 'file' },
rules,
- roles: { translator: { credential: 'translator' } },
+ roles: { translator: { credential: 'sworn translator' } },
deliver: {
translate: 'ai',
harden: { review: 'adversarial', lenses: ['meaning', 'terms'] },✓ ready to sell · 1 Service · it keeps at least 80% of every jobimport { 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.' },
},
},
})How the legal example passes this gate, in lines read from its files.
'provisional-patent': {
// …
sign: { reserved: practitioner, where: '*', self: true, rail: 'brand', position: 'Signed by a registered practitioner, or by the applicant for themselves.' },roles: {
// …
practitioner: { credential: ['patent attorney', 'patent agent'], where: '*' },roles: { practitioner: { pool: attorneys, pay: 150 } },
deliver: {
// …
sign: { by: 'practitioner', stamp: true, est: '1h', checklist: ['the claims read on the disclosure', 'every inventor is named', 'a reasonable inquiry was made'] },Read them in context: The rules table, The attorneys' Pool, Provisional patent application.
- Add a signer
- Pool(): your marketplace
- Refusals and cures
- Roles
- Rules: how a Service meets licensing by design
{
"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 translator role holds only translator.",
"doc_url": "https://services.dev/docs/reference/check/reserved_act_unstaffed",
"file": "services/translation.ts",
"line": 9,
"path": "roles.translator.credential"
}The whole document check --json prints
{
"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"
}
],
"services": [