Repository navigation
Specs roles
This specification defines the role definition a library carries, how each level references,
overlays and inherits one, how skills are bound and delivered, the rule-versus-skill test, the two
launch policies the module names, and the planned universe setting, team universes add command,
and seat-naming, team-role and standing role-name rules (OD-20261019-06, OD-20261019-10,
OD-20261019-15 to OD-20261019-21). It leaves capabilities, their vocabulary and their
enforcement to the Kernel, the seat's list and the envelope to the grants specification, and the
address grammar and the nickname's resolution to messaging. Nothing of the libraries or the
universe setting is built at int/0.5.1 8acb470b: the sections below separate what the code reads
today, marked built, from the decided forms the code does not read, marked planned.
-
role: a TeamCLI base function (orchestrator,operator,builder,reviewer,tester,documentarist,communicationorarchitect;OD-20261019-15,OD-20261019-16,OD-20261019-21,OD-20261019-32answer 29) or the named job a seat's line references; it carries capability words, a skill set and written rules. -
team role: a team's or universe's word for a job, mapped onto one of the base functions and optionally adding its own grants, capabilities and skills within the team envelope (OD-20261019-16,OD-20261019-21,OD-20261019-32answer 29). -
seat: a position in a team that keeps its registry id (agt_…), its list and its leases across occupants and renames. -
nickname: a name for humans, unique within its team, conferring nothing. -
universe: the world from which a team draws its seat names, titles and team-role words; a setting at entity, project or team level, inherited downwards (OD-20261019-06,OD-20261019-10,OD-20261019-21). -
entry: a sourced record in a universe's canon carrying a name, its titles and when they apply, relations and relevant traits (OD-20261019-12,OD-20261019-21). -
name: the human-readable name of a seat, drawn from its selected entry in lowercase with hyphens; unique within a team, addressed across the entity asname@team, and distinct from the seat's stable registry id (OD-20261019-17,OD-20261019-19,OD-20261019-21). -
title: a sourced rank, office or occupation attached to an entry at a stated point, paired with the name on the seat's labelName · Title(OD-20261019-12,OD-20261019-21). -
role name: a universe's standing seat name for a role, reused by teams that adopt that universe definition (OD-20261019-19,OD-20261019-21). -
occupant: the program and session filling a seat. -
defaults: the role templates TeamCLI ships. -
library: a generic, versioned, reusable source of roles, skills or universes; the storage and the format are implementation decisions. -
overlay: a level's own rules laid over the roles it references. -
binding: a level's act of attaching a skill to a seat, a context or a task. -
context: a declared trigger for a binding: a phase, a file kind the work touches, or a label. -
agreed set: the set of skills the owner has agreed a seat may receive. -
required/optional: the binding's property, never the role's; an optional skill is reported when undelivered, a required one refuses. -
resolved content: a role's text after inheritance, which is what the owner agrees. -
lead: the seat whose role holdsleads; one per team or none.
The team file's seat line carries role (required) and, optionally, nickname, beside the seat's
name. The file's load reads both; the registry copies the role and the nickname into the seat's
record. The line's leads: true is a separate mark, not a role.
| Field | Type | Required | Default | Since | Meaning |
|---|---|---|---|---|---|
role |
string | yes | — | 0.5.0 | the role's name; recorded and never decides |
nickname |
string | no | — | 0.5.0 | a human name; unique in the team, not another seat's name, never lead, and equal to its own seat's name is allowed |
leads |
boolean | no | — | 0.5.0 | the team's lead mark; exactly one seat carries it |
Example, from test/rename.test.ts: a seat worker-alpha renames to worker-beta; its pending
send-drops, signed mailbox messages, rules file and queue files move with it, its leases follow
the new name, and a send to worker-beta arrives. Renaming it to max, a nickname another seat
already carries, is refused (cases 5 and 6 of the same file).
A role lives in a roles library and is referenced by name from a level. Its storage is out of scope; its content is not.
| Field | Type | Required | Default | Since | Meaning |
|---|---|---|---|---|---|
name |
string | yes | — | planned | the role's name, the owner's, in any language |
base_function |
orchestrator | operator | builder | reviewer | tester | documentarist | communication | architect
|
for a team role | the role itself when it is a base function | planned | the base function a team role maps onto so admission and permission checks hold underneath (OD-20261019-15, OD-20261019-16, OD-20261019-32 answer 29) |
inherits |
string | no | — | planned | a parent role; the resolved content is the parent's plus this role's |
capabilities |
list of {name, scope}
|
no | — | planned | Kernel vocabulary words with the scope each is bounded to |
constraints |
list | no | — | planned | the Kernel's recorded constraints (allowed, required, forbidden) |
skills |
list of strings | no | — | planned | skill names the library must resolve for this role |
rules |
text | no | — | planned | written rules, composed as §3.3 says |
A role definition MUST name no person, local path, operating-system folder or company. The words
grant, agree and create are never in a role; leads may be, in exactly one role per team.
The shipped base functions include communication — the seat role that converses with the owner
through the communication module, carrying read on state, send/route grants, and the skills to
read state, route asks, confirm commands and speak on every channel (OD-20261019-15) — and
architect, whose admission rules differ because it rules on texts and dispatches nothing, while
archivist and recorder map onto documentarist and first assistant maps onto operator as
team roles (OD-20261019-32 answer 29).
Each level (the shipped defaults, the entity's library, the project's library, the team's overlay, the seat's identity) references roles and lays its own rules over them.
| Field | Type | Required | Default | Since | Meaning |
|---|---|---|---|---|---|
library |
reference | no | the level above | planned | where this level's roles are read from |
role |
string | one of the two | — | planned | a role this level's seats may reference |
rules |
text | no | — | planned | this level's overlay rules |
skills |
list of bindings | no | — | planned | §3.4 |
contexts |
map name → trigger | no | — | planned | the declared triggers of this level |
An overlay MAY add a limit and MUST NOT remove one. Composition of the written rules goes from the
role's rules (with what it inherits) to the entity's, the project's and the team's overlay rules,
each level tightening the one above; a limit against a looser rule resolves to the more
restrictive. Two positive duties that cannot both hold are a duty-conflict (§3.6).
A binding attaches a skill to a seat by a level, a context or a task, and says whether it is
required. A task record carries needs, a list of skill names.
| Field | Type | Required | Default | Since | Meaning |
|---|---|---|---|---|---|
skill |
string | yes | — | planned | the skill's name in the library |
required |
boolean | no | false |
planned | refuses when undelivered; optional reports |
trigger |
phase | file-kind | label
|
no | — | planned | a context's declared trigger |
needs |
list of strings | no | — | 0.5.1, recorded only | a task's skill names; a record carrying any is not claimable |
A needs entry MUST name only a skill in the owner's agreed set for that seat; one outside it is
escalated, not granted. At int/0.5.1 8acb470b the task record reads and prints needs, and
team next does not consider a record that carries any (src/commands/next.ts, takeable), so
no skill is bound or delivered.
An adapter answers four questions in the same words for every harness: what the seat is shown,
where it is written, how the team verifies the seat received it, and, where the harness cannot
take a binding, that it says so and refuses where required-skill-delivery requires — never
dropping the binding silently. The delivery legs these answers name are the delivery-legs
registry's; this spec fixes only the four questions.
The library revisions and each level's own configuration are pinned together by content in the agreement record; the per-seat file generated from them is throwaway output. An upgrade of a library is reviewed and re-agreed like any change. The record's fields belong to the Kernel's agreement record; this spec fixes only that the pin is by content over both the libraries and the levels.
Both are written in the policy object's form (the policies specification), enforced at the Runtime's launch step.
| Name | Scope | Values | Default | Kind | Set by | Since |
|---|---|---|---|---|---|---|
required-skill-delivery |
entity, project, team |
refuse, report; refuse is tighter |
refuse |
enforced at launch | the owner; a holder named by grant; a project lead may set report for a harness listed as unable to deliver skills (OD-20261019-32 answer 28) |
planned |
duty-conflict |
entity, project, team |
refuse, report; refuse is tighter |
refuse |
enforced at launch | the owner only (OD-20261019-32 answer 28: nobody below the owner sets report) |
planned |
A project lead MAY set required-skill-delivery: report for a harness listed as unable to deliver
skills, never for all harnesses; nobody below the owner MAY set duty-conflict: report
(OD-20261019-32 answer 28).
A team's universe setting selects the package from which seat names, titles, team-role words and
standing role names are drawn (OD-20261019-06, OD-20261019-10, OD-20261019-12,
OD-20261019-16 to OD-20261019-21, OD-20261019-32 answer 29).
| Element | Scope / Location | Type / Fields | Required | Default | Since | Meaning |
|---|---|---|---|---|---|---|
universe |
config key at entity, project, team
|
string | no | inherited from the level above | planned | the universe name (team config set <level> <target> universe <name>); changing it never renames existing seats (OD-20261019-06, OD-20261019-10) |
entry |
universe canon.md row |
{name, titles, relations, traits, sources} |
yes (per entry) | — | planned | one sourced canon entry; every factual claim cites a source and date, and any unsupported claim is marked unverified, never guessed (OD-20261019-12, OD-20261019-21) |
team_role |
universe roles.md row |
{name, base_function, capabilities, grants, skills} |
no | — | planned | a team role in the universe's vocabulary mapped onto one of the eight base functions (OD-20261019-16, OD-20261019-21, OD-20261019-32 answer 29) |
role_name |
universe roles.md row |
{role, entry, reason, sources} |
no | — | planned | a standing entry name for a role across teams that use the universe (OD-20261019-19, OD-20261019-21) |
seat name and label
|
seat record / casting output |
name (<entry> in lowercase with hyphens), label (Name · Title) |
yes (when cast) | next free entry in universe
|
planned | the seat's name is the entry it plays (OD-20261019-17), unique in its team and addressed across the entity as name@team (OD-20261019-19); re-casting changes the name while preserving the agt_… registry id |
Built-in universes shipped with TeamCLI MUST be public-domain only; universes from trademarked
franchises or authors' works remain user-made and private to their owner unless licensed
(OD-20261019-06, OD-20261019-10, OD-20261019-18).
At int/0.5.1 8acb470b, this area's built formats are read by existing Runtime and task commands,
and OD-20261019-06, OD-20261019-10 and OD-20261019-18 add the planned universe command and
team add naming behavior:
| Command / Option | Status | Meaning |
|---|---|---|
team check |
built | reports a second leads mark, a nickname collision and a seat name lead
|
team add / team rename
|
built | refuse lead as a new seat name or nickname and refuse a nickname another seat in the team carries |
team next |
built | skips a task record that carries needs
|
team seats |
built | prints the role and the nickname |
team universes add <name> |
planned | adds a universe from a local list or fetches a versioned, sourced, reviewed universe package from the library API (OD-20261019-06, OD-20261019-10, OD-20261019-18) |
team config set <level> <target> universe <name> |
planned | sets the universe setting at entity, project or team level (OD-20261018-17, OD-20261018-18, OD-20261019-06, OD-20261019-10); never renames existing seats |
team add (universe name selection) |
planned | takes the next free entry name from the team's universe (or accepts a hand-chosen entry name), suggests names by role when the universe provides role hints, and numbers names (<name>-2) with a warning when the universe runs out (OD-20261019-06, OD-20261019-10, OD-20261019-19) |
The exit ids of those commands belong to their own specifications (operations and exit codes).
-
A role is a named bundle of capability words and a skill set. A role MUST NOT carry
grant,agreeorcreate;leadsMAY travel in one role's bundle. Source: no role section at int/0.5.1 8acb470b; the seat'sroleis a required string (src/file/sections/seats.ts). Proof: none at int/0.5.1 8acb470b. - A definition names no person, path, folder or company. Source: no library at int/0.5.1 8acb470b. Proof: none at int/0.5.1 8acb470b.
-
Levels inherit and tighten. A level MUST inherit the level above and MUST NOT loosen it
except where a text says so; an overlay adds limits, never removes them. Source: no library
and no overlay at int/0.5.1 8acb470b; the policy chain's tighten-only rule is
src/policy/resolve.ts. Proof:test/policy.test.tsproves the policy chain only. -
A seat's list is its role's bundle plus its own seat grants, inside the team envelope.
A team grant MUST reach a seat only through a capability its role holds; a seat grant only
narrows. Source: the resolver's role-bundle slot is empty at int/0.5.1 8acb470b
(
src/permissions/who.ts). Proof:test/settings-as-policies.test.tsproves the policy chain; none for the bundle. -
leadstravels in a role; nothing resolves by a role's name. A seat holdsleadsonly because its role's bundle names it, and everything that needs the lead resolves to that seat, never to a seat called by a word. Source: at int/0.5.1 8acb470bleadsis a per-seat boolean in the file, read as the roster's mark (src/file/sections/lead.ts,src/file/sections/seats.ts), andlead@<team>addresses the seat so marked. Proof:test/check-lead-role-note.test.ts,test/leads-at-most-one.test.ts. -
Zero or one
leadsper team. A second mark MUST be refused, naming both seats, and the launch with it. Source:src/file/sections/lead.tsrefuses a second mark at its line and names every marked seat. Proof:test/leads-at-most-one.test.ts. At int/0.5.1 8acb470b a file with no lead is also refused (src/file/sections/lead.ts: "the file has no seat that leads"), where this rule and the Kernel allow zero; the code is stricter at the tag. -
A required skill that cannot be delivered refuses; an optional one reports. The property
MUST belong to the binding, never to the role, and a harness MUST NOT drop a binding silently;
a project lead MAY set
required-skill-delivery: reportonly for a harness listed as unable to deliver skills (OD-20261019-32answer 28). Source: norequired-skill-deliverypolicy at int/0.5.1 8acb470b. Proof: none at int/0.5.1 8acb470b. -
Incompatible positive duties fail visibly, naming both rules, and nobody below the owner sets
duty-conflict: report. Source: noduty-conflictpolicy at int/0.5.1 8acb470b (OD-20261019-32answer 28). Proof: none at int/0.5.1 8acb470b. - The library rejects a skill that carries a rule or a permission. A would-be skill containing a must, a may-not or a permission MUST NOT enter a library. Source: no library check at int/0.5.1 8acb470b. Proof: none at int/0.5.1 8acb470b.
-
A task's
needsgrants nothing. It MUST name only agreed skills, and a record carrying any is not claimable while no binding exists. Source:src/commands/next.ts(takeable),src/tasks/format.ts(the printedneeds). Proof:test/next.test.ts. -
A nickname is unique in its team and
leadis reserved. A nickname MUST NOT equal another seat's nickname or name in the same team; equal to its own seat's name it is allowed. No new seat name or nickname may belead; a seat already namedleadkeeps loading, andteam checknotes it when it does not carry the mark. Source:src/file/sections/seats.ts(nicknameProblem,LEAD_NAME),src/commands/add.ts,src/commands/rename.ts. Proof:test/rename.test.ts,test/check-lead-name-note.test.ts. -
The lead is addressed as
lead@<team>, a nickname as@<nickname>or<nickname>@<team>. Source:src/commands/send.ts,src/file/sections/seats.ts. Proof:test/route.test.ts. (The grammar is messaging's; this spec links to messaging.md.) -
A seat rename keeps the registry id, the grants and the leases. Source:
src/commands/rename.ts(renameSeatLeases). Proof:test/rename.test.ts. - A rule says what a seat must or may not do; a skill says how to do what is already allowed. A mandatory step MUST split: the "must" is a rule, the skill carries the how. A worked example: a reviewer's scope, its write of the verdict only and its citation requirement are rules or constraints, while how to review well is a skill; no skill can make it able to merge, because merging is a capability its role does not hold. Source: no library at int/0.5.1 8acb470b. Proof: none at int/0.5.1 8acb470b; rule 9 is the check that would refuse a skill carrying a rule.
-
The
universesetting inherits downwards, built-in universes are public-domain only, and changing a team's universe never renames existing seats. Auniversesetting atentity,projectorteamlevel MUST inherit downwards; built-in universes MUST be public-domain only (OD-20261019-06,OD-20261019-10,OD-20261019-18); and changing theuniversesetting MUST NOT rename existing seats. Source: not built at int/0.5.1 8acb470b. Proof: none at int/0.5.1 8acb470b. -
team addtakes the next free name from the team's universe and numbers with a warning when the set runs out. When a team has auniverseset,team addMUST take the next free entry name in that team (while allowing a name to be chosen by hand, and optional role hints), and when the universe's entries are exhausted MUST number the name (<name>-2) and emit a warning (OD-20261019-06,OD-20261019-10). Source: not built at int/0.5.1 8acb470b. Proof: none at int/0.5.1 8acb470b. -
A seat's name is the entry it plays and changes on a re-cast, while the registry's agent id
is the stable identity underneath. A seat's name (lowercase with hyphens) and label
(
Name · Title) MUST come from its cast entry; on a reviewed re-cast to a different entry, the seat's name MUST change with the entry while the registry's agent id (agt_…), grants, leases and session history stay intact (OD-20261019-17,OD-20261019-21). Source:src/commands/rename.tspreserves the id, grants and leases on rename; casting-driven rename is not built at int/0.5.1 8acb470b. Proof:test/rename.test.tsfor rename preservation; none for casting. -
Seat names are unique within a team and addressed as
name@teamacross the entity. Two teams in the same entity MAY use the same seat name; within a team, seat names MUST be unique, and cross-team addressing MUST usename@team, with the registry's agent id as the canonical identity (OD-20261019-19). Source:src/file/sections/seats.ts,src/send/resolve.ts. Proof:test/rename.test.ts,test/route.test.ts. -
Every team role maps onto a base function. A team role defined in a universe's vocabulary
MUST map onto one of the eight base functions (
orchestrator,operator,builder,reviewer,tester,documentarist,communication,architect) so admission and permission checks hold underneath (archivistandrecordermapping ontodocumentaristandfirst assistantontooperator), and MAY declare its own grants, capabilities and skills within the team envelope (OD-20261019-15,OD-20261019-16,OD-20261019-21,OD-20261019-32answer 29). Source: not built at int/0.5.1 8acb470b. Proof: none at int/0.5.1 8acb470b. -
A universe's standing role names are sourced, reviewed across labs and confer no authority.
A universe MAY assign standing role names in its
roles.mdfile, reviewed by at least the configured number of distinct labs other than the author's (default 2), and a standing role name MUST NOT confer any capability or grant (OD-20261019-12,OD-20261019-19,OD-20261019-20,OD-20261019-21). Source: not built at int/0.5.1 8acb470b. Proof: none at int/0.5.1 8acb470b.
policy-names (planned entries; not in the policy object at int/0.5.1 8acb470b):
| Entry | Meaning | Since | Source at the tag | Note |
|---|---|---|---|---|
required-skill-delivery |
refuse or report an undelivered required skill at launch | planned | not in src/policy/types.ts at int/0.5.1 8acb470b |
default refuse; scope entity, project, team; a project lead may set report for a harness listed as unable to deliver skills (OD-20261019-32 answer 28) |
duty-conflict |
refuse or report two incompatible positive duties | planned | not in src/policy/types.ts at int/0.5.1 8acb470b |
default refuse; nobody below the owner sets report (OD-20261019-32 answer 28); the error names both rules |
capabilities (the one word this area places in a role):
| Entry | Meaning | Since | Source at the tag | Note |
|---|---|---|---|---|
leads |
the team's lead | 0.5.0 (carried in a role: planned) | src/file/sections/seats.ts |
one per team; carried as the file's leads mark at int/0.5.1 8acb470b |
operations (the lifecycle acts this area keeps out of every role, plus the planned universe operation):
| Entry | Meaning | Since | Source at the tag | Note |
|---|---|---|---|---|
start |
start a team or a seat | 0.5.0 | src/commands/up.ts |
one principal: the owner, or the team's leads
|
stop |
stop a team or a seat | 0.5.0 | src/commands/down.ts |
as start
|
restart |
restart a seat | 0.5.0 | src/commands/restart.ts |
as start
|
reload |
reload a seat | 0.5.0 | src/commands/reload.ts |
as start
|
add |
add a seat | 0.5.0 | src/commands/add.ts |
owner-only base gate at the pinned revision (declared delegation paths qualified separately; add-same-copy is a proposed conceptual delegated form, not a command or capability); planned next-free-name selection from universe (OD-20261019-06, OD-20261019-10) |
remove |
remove a seat | 0.5.0 | src/commands/remove.ts |
remove-ordinary delegated; a seat holding grant, agree or leads is never removed this way |
universes add |
add a universe from a list or package (team universes add <name>) |
planned | proposed; not in src/permissions/map.ts at int/0.5.1 8acb470b |
OD-20261019-06, OD-20261019-10, OD-20261019-18
|
config (planned setting contributed to config.md):
| Entry | Meaning | Since | Source at the tag | Note |
|---|---|---|---|---|
universe |
the universe from which a team draws seat names, titles, team-role words and standing role names | planned | not in src/ at int/0.5.1 8acb470b |
scope entity, project, team, inherited downwards; changing it never renames existing seats (OD-20261019-06, OD-20261019-10) |
briefs (the general seat brief, first record under OD-20261018-08):
| Entry | Meaning | Since | Source at the tag | Note |
|---|---|---|---|---|
general |
the default seat brief: what a seat is, who it reports to, and the one rule — tell your lead in one line when you finish or are blocked | 0.5.1 (delivery built on an unmerged feature branch ahead of int/0.5.1 8acb470b; the registry record planned) |
scripts/brief.ts (unmerged feature branch; not at int/0.5.1 8acb470b) |
built in; delivered by up, add, restart and reload as a signed message record by drop, never typed; overridable by an entity or a project (planned); role-and-trade and start follow |
-
No library, no role section, no bundle. A seat's
roleis a required string recorded and never decides; the resolver's bundle is empty, so capabilities come from grants alone. -
No binding, no adapter, no delivery report. A task record's
needsis printed and skipped; no skill is bound, delivered or reported. -
The two policies are absent from the policy object.
required-skill-deliveryandduty-conflictare decided in catalogue form and not insrc/policy/types.ts. - Library distribution and layering in detail: how a level points at a library, how a shared library is published and imported, and how an overlay names what it overrides.
- The neutral format and each adapter's translation, and the full set of context triggers.
- Inheritance: how it is written, how deep it may go, and whether a child may narrow a parent's capabilities (it never widens).
-
The list of harnesses unable to deliver skills: settled by
OD-20261019-32answer 28 that a project lead may setrequired-skill-delivery: reportfor a harness on that list and nobody below the owner setsduty-conflict: report; the concrete harness list remains for the build. - The Kernel's own line on an unresolvable composition being refused at launch as the Kernel's act (the round's question Q1).
-
The lead name:
leadis reserved, and a team whose lead seat is still namedleadis noted byteam checkwith the rename that fixes it; whether the name is ever refused outright is open. -
Zero leads: the text and the Kernel allow a team with no lead; the file at int/0.5.1
8acb470b refuses one, so the code is stricter. No seat resolves
lead@<team>in such a team. The open point is kept and nothing is decided here. -
Universe naming details (
OD-20261019-06,OD-20261019-10toOD-20261019-21): how numbered exhaustion names (<name>-2) interact with reviewed canon and standing role names, how overlapping target names are ordered safely during a re-cast rename, and where multi-team casting files live inside a universe package.
-
Draft (the writer, 2026-10-18): lifted from 009 Roles and Skills (draft 2) and its
0.5.1 catalogue annex; read at int/0.5.1 8acb470b; the built formats (the seat's role, nickname
and lead mark, the task's
needs, the rename) are separated from the planned ones, and every rule cites the code or says "proof: none". -
Draft, amended (the writer, 2026-10-18): §6 gains the
briefsregistry, whose first record isgeneral, the general seat brief shipping in 0.5.1 as the built-in default under OD-20261018-08; its drop delivery is on an unmerged feature branch ahead of int/0.5.1, its registry record planned. -
Draft, amended (the writer, 2026-10-19): added the planned
universesetting,team universes addcommand,team addnext-free-name behavior,communicationbase role, team-rolebase_functionmapping, standing role names, and rules 15 to 20 (OD-20261019-06,OD-20261019-10,OD-20261019-12,OD-20261019-15toOD-20261019-21); and folded a Phase B pre-round review on the §6addrow (owner-onlybase gate at the pinned revision, with declared delegation paths qualified separately andadd-same-copya proposed conceptual form). -
Draft, amended (the writer, 2026-10-19): folded
OD-20261019-32answers 28 and 29 (architectadded to the base functions,archivistandrecordermapped ontodocumentaristandfirst assistantontooperatoras team roles, and project-lead vs owner setter rules forrequired-skill-delivery: reportandduty-conflict: reportin §2, §3.2, §3.6, §3.7, §5 rules 7, 8 and 19, §6, and §7).
Generated from docs/specs/roles.md at v0.5.2 (1d1224a4) — edit the repository, not this page.