Repository navigation
Specs config
How the owner, a lead and TeamCLI itself read and change settings: the operational values of an entity, a project, a team or a seat (a seat's model and effort, a team's workspace adapter, an entity's vault). Settings are values. Policies are limits. A setting is always checked against the policies in force (Kernel amendment 02), and can never loosen one.
Three commands, one registry of keys and one set of rules (OD-20261018-18):
-
team configreads and changes the values above a seat — atentity,projectandteamlevel; -
team settingsreads and changes one seat's settings; -
team seatshows the seat as an object — its status, model, conversation, cost and last turn — and groups the seat's lifecycle under it.
All three target 0.5.3.
- setting: one key and its value at one level.
-
level:
entity,project,teamorseat. A lower level inherits from the one above unless it sets its own value. Where a key also has a policy, the value must fit the policy at every level above. - settings registry: the list of known keys, with each key's levels, type, allowed values, default and how a change applies.
team config get <level> <name> [<key>] # one key, or all keys with where each comes from
team config set <level> <name> <key> <value> # one key
team config set <level> <name> <key>=<value> [<key>=<value> …] # several at once, applied together
team config unset <level> <name> <key> # back to the inherited value
team config keys [<level>] # the registry: keys, types, allowed values
team settings <seat> # the seat's settings, each with where it comes from
team settings set <seat> <key> <value> # one key
team settings set <seat> <key>=<value> [<key>=<value> …] # several at once, applied together
team settings unset <seat> <key> # back to the inherited value
team seat <seat> # status, model, conversation, cost, last turn
team seat add|remove|restart|rename … # the seat's lifecycle, grouped here; the top-level commands stay as aliases<level> is entity, project or team: team config does not take seat, whose settings are
team settings's.
Examples:
team settings <seat> # where the model and the effort come from
team settings set <seat> effort high
team settings set <seat> model=<model> effort=<level>
team settings unset <seat> effort
team seat <seat>
team config set team <team> workspace tmux
team config set entity <entity> vault <repository>--dry-run shows the change and how it would apply. --json follows the output contract.
| Kind of key | Applies |
|---|---|
| a seat's runtime (model, effort, cli, launch) | headless seats: the next turn. Live seats: a restart that resumes the same conversation (the default). --live: the CLI's own in-session command through the typed leg, read back, as the fallback only, never in a human: true pane |
| a seat's identity or routing (nickname, delivery_order, human) | at once, in the registry; the next send uses it |
| a team's, project's or entity's operational value (workspace, vault, storage, sender_name) | at the next team up or reload of the teams concerned; team check shows the difference until then |
Every change is a signed record in the registry, logged in the team log, and raises a
config.changed event.
- An unknown key is refused, naming the known keys at that level.
- A value outside the key's allowed values, or outside the CLI profile's range (an effort the CLI doesn't accept), is refused, naming the accepted values.
- A value that a policy forbids is refused, naming the policy. Config never loosens a policy.
- Who may set:
- the owner, at every level;
- a team's lead, at
seatandteamlevel within its team, for the keys and values its role's policy allows (for example an allowed-models list); - the budget's circuit breaker (008), for the keys its policy names (for example moving a seat to a cheaper model at a pace mark), logged and reversible.
-
getnever shows a secret. Keys that reference credentials hold keychain references only. - There are no per-key top-level commands (
team model,team effort): every setting goes throughteam configat the levels above a seat, or throughteam settingsfor a seat.
Keys at entity, project and team level are set through team config; keys at seat level,
through team settings. team seat shows a seat's settings from the same registry and changes
nothing.
config-keys (proposed; a first set):
| key | levels | type and allowed values | default | applies |
|---|---|---|---|---|
| model | seat | a model the seat's profile and the allowed-models policy accept | from the role or team | restart + resume / next turn |
| effort | seat | the profile's levels (for example low, medium, high, xhigh, max) | from the role or team | restart + resume / next turn |
| cli | seat | a known profile | — | restart (new conversation) |
| launch | seat | an adapter launch line (escape hatch) | from the account | restart + resume |
| account | seat | an account of the entity (Runtime commitment 50) | from the team | restart + resume |
| nickname | seat | unique in the team, never lead
|
none | at once |
| delivery_order | seat, team, project, entity | legs: native, mcp-inbox, drop, typed (tighten only) | native, mcp-inbox, typed, drop | at once |
| human | seat | true / false | false | at once |
| universe | team, project, entity | a universe name: a built-in public-domain universe, or the entity's own made with team universes add
|
none (plain seat numbering) | at once; the next team add draws the next free name from it — a change never renames existing seats |
| workspace | team, project, entity | headless, herdr, tmux | headless (from 0.6) | next up |
| vault | entity | a path or repository | none | next up |
| storage | entity | files, a database, Redis, online (an adapter) | files | next up |
| sender_name | project, entity | auto, nickname, seat, seat@team | auto | at once |
Storage (settled 2026-10-19, OD-20261018-08 and the orchestrator's ruling): settings sit beside policies in the registry's own signed records: entity in entities.yaml (.settings), project in projects.yaml (projects..settings), team in the registry's team record (teams.yaml teams..settings, never the team file), seat in agents/.yaml (settings). One hierarchy, inheritance by absence, a separate config signature domain. A multi-key write is atomic per record, and a write across levels is applied lowest level first. A change whose signed generation has no config.changed event is reconciled by the bus's reconcile pass, which appends one marked reconciled.
- A setting at
projectlevel for a team that spans projects: does the team's project win, or does the seat's? - Bulk changes across seats (
team settings set <seat> …one at a time): arolelevel, or a selector?
- 2026-10-18: draft 1 (the writer), from OD-20261018-14 and -17.
- 2026-10-19: split to the three commands of OD-20261018-18 —
team configabove a seat,team settingsfor one seat,team seatfor the seat as an object — all three targeting 0.5.3; generic examples in place of a named team, entity and seat; the first entry names the writer. - 2026-10-19: the
universekey added to the proposedconfig-keystable (OD-20261019-06, -10) — team, project and entity levels; a built-in public-domain universe or the entity's own, made withteam universes add; none by default; a change applies at once, the nextteam adddraws from it, and it never renames existing seats. A planned row: no key of this name is read at the tag. - 2026-10-19: the storage open point settled (OD-20261018-08 and the orchestrator's ruling): settings
sit beside policies in the registry's own signed records — entity, project, team (never the team
file) and seat — one hierarchy, inheritance by absence, a separate config signature domain; a
multi-key write is atomic per record, a cross-level write lowest level first, and a signed change
with no
config.changedevent is reconciled by the bus's reconcile pass.
Generated from docs/specs/config.md at v0.5.2 (1d1224a4) — edit the repository, not this page.