Skip to content

Members, agents, hosts, placements

The ameesh profile of OKF defines four card types. All are ordinary OKF files; the file name is free. The examples below come from the fictitious canon in examples/canon/.

Member: a human

type: Member
title: alice
roles: [project-lead, reviewer]
authenticators: []        # enrolled passkeys, added by reviewed pull request

authenticators lists the public keys a human may sign approvals with (see Receipts and ameesh-approve). Adding or removing one is a reviewed change to the canon.

Agent

type: Agent
title: orchestre                      # the agent's name
responsible: human:alice              # REQUIRED
team: acme-web                        # team or project; also the project of its thread
capabilities: [read, report-drift, propose]   # `approve` is forbidden for agents
harness: claude                       # claude | codex | deepseek
model: claude-opus                    # optional
provider: anthropic                   # who bills the model
credential_mode: subscription         # api-key | subscription
budget_usd_per_day: 30                # optional
tools: [git, "mcp:transport-readonly"]
reviewers: [relecteur]                # optional
priority: 5                           # optional: paused last under critical host pressure (v1.3.0)
memory:                               # optional: the persona's memory repository (v1.3.0)
  mode: neutral
  repository: "git@forge.example:acme/persona-orchestre.git"

Responsibility. An agent without a responsible that resolves to a unique human Member is not claimable. When a canon is configured, AMEESH_REQUIRE_RESPONSIBLE defaults to on.

No agent approves. A card with approve in capabilities is a blocking error: authority belongs to humans, and is proven by a receipt.

Host: a machine or a cluster

type: Host
title: banc
responsible: human:alice      # REQUIRED
tags: [test]                  # optional: labels that admissions can target (v1.3.0)
admins: [human:bruno]         # optional: administrators, for the visibility rule (v1.3.0)
policy:
  harnesses: [deepseek, codex]          # absent = all
  providers: [deepseek, openai]
  credential_modes: [api-key]
  max_agents: 2
  resources:                            # optional pressure limits (v1.3.0)
    min_mem_available: 1GiB
    max_swap_used: 8GiB
    max_load: 24
    min_disk_free: 2GiB
  work_roots: {acme-web: /srv/acme/acme-web}   # working directory per team (v1.3.0)
  work_root: /srv                               # default: work_root/<team>
  work_dirs: {ouvrier: /srv/acme/ouvrier}       # per agent, wins over the above (v1.3.1)

The host's responsible human sets the rules of their machine, for example "only DeepSeek and Codex agents, billed by API key". The host also decides where agents work: the working directory is policy.work_dirs[<agent>], else policy.work_roots[<team>], else policy.work_root/<team>, and each accepts the {agent} template (/srv/acme/acme-web-{agent}: one worktree per agent). See Runner and leases for the transitional fallback and what the runner does when the directory is missing, and host resources for policy.resources.

Placement: which agent may run where

Since v1.3.0 a Placement card is an admission: the hosts (by name or by tag) where an agent is admitted, without a working directory. The current host of the agent is execution state.

type: Placement
title: orchestre@atelier
agent: orchestre
hosts: [atelier]              # admitted hosts, in order of preference
host_tags: [prod]             # or tags of admitted hosts
credential_mode: subscription

Older cards (a single host:, a cwd:) are still read: host is a single admitted host. Their cwd is ignored when the host's policy gives a directory (admission-cwd-ignored); when it does not, it is used as a transitional fallback with the warning admission-cwd-inherited. That fallback is removed in v1.5.0 at the latest: move working directories to policy.work_dirs / work_roots.

Governed placement. The project's responsible human decides where an agent runs, within the policy of the host's responsible human. For every canon agent of a host, canon sync writes whether its placement on that host is admitted. It is refused when the host policy rejects the agent's harness, provider, model or credential mode, when the agent has no placement on this host, when the placement is ambiguous, or when the Host card is missing. A refused, missing or not-yet-evaluated verdict closes new claims; it never interrupts a running lease.

A verdict holds only for the profile it judged (host, harness, provider, model, credential mode). Any change made outside canon sync (registering the agent by hand with another harness, an import, manual SQL) closes new claims until the next sync. canon sync never moves an agent whose current host is still admitted; ameesh moves an agent by itself only between two turns, to another admitted host, when relocation under pressure is enabled (AMEESH_RELOCATE=1).

Visibility rule (v1.3.0). When an agent declares a memory repository (memory.repository), it runs on a host only if its responsible human and the host's admins have access to that repository. canon sync checks it through the forge (AMEESH_FORGE), caches the verdict briefly, and refuses the placement otherwise (persona-hidden-from-host); canon check stays offline.

ameesh placement check [--agent A] [--json]   # read-only: current placements, why refused,
                                              # admissible hosts and modes; exit 1 if one is refused

Ephemeral agents

ameesh agent spawn <name> --by <creator> --ttl 2h [--cwd DIR] [--prompt TEXT]

An ephemeral agent inherits its responsible from its creator at creation, gets capabilities limited to read and propose (and to the creator's), and has a mandatory expiry (at most 7 days, never beyond an ephemeral creator's). Expired ephemeral agents are never claimable.

Validation

ameesh canon check reports, as text or --json (code, severity, file, explanation):

Blocking errors: an Agent without responsible, or with approve in capabilities; a responsible that does not resolve to a human Member; a Placement to an unknown agent or host, or without hosts nor host_tags; a placement that violates the host policy; two placements for the same agent; an unreadable policy.resources.

Warnings: a host without placement, an agent without placement, a review policy declared without a default class, an admission tag that matches no host (admission-tag-unknown), a placement cwd ignored or inherited (admission-cwd-ignored, admission-cwd-inherited), an agent without a working directory (host-work-dir-missing).

An error tied to an agent blocks that agent; an error tied to a host blocks the agents placed there; any other error (federation, unreadable profile card) blocks every agent of the host.