Docs > Creating Agents

Creating Agents

Define AI personas with structured cognition, heuristics, and productive tensions

Agent Structure

Every agent is a directory containing two files:

core/agents/perspectives/
  catalyst/
    agent.yaml      # Schema, cognition, persona, tensions, capabilities
    prompt.md        # Full prompt template with {{variables}}

agent.yaml defines the agent's structured identity — how it thinks, what it values, who it clashes with, and what it can produce. The runtime reads this file to configure the agent before each session.

prompt.md is the full prompt sent to the LLM. It uses template variables (like {{brief}}, {{role_override}}, {{participants}}) that the runtime injects at execution time.

Schema Reference

A complete agent.yaml with every field annotated:

schema: aos/agent/v1                    # Required. Schema identifier.
id: catalyst                            # Unique agent ID. Lowercase, hyphenated.
name: Catalyst                          # Display name.
role: >                                 # One-line role description.
  Acceleration and monetization
  strategist. Pushes for commercial
  velocity and shipping speed.

cognition:                              # How the agent thinks.
  objective_function: >                 #   North star optimization target.
    Maximize momentum and commercial
    velocity. Ship, sell, collect.
  time_horizon:                         # Planning horizons.
    primary: 30-90 days                 #   Main focus window.
    secondary: this quarter             #   Awareness range.
    peripheral: next quarter            #   Peripheral vision.
  core_bias: speed-and-monetization     # Named cognitive bias.
  risk_tolerance: moderate              # low | moderate | high
  default_stance: >                     # Opening position in any debate.
    I want a version customers will
    pay for in 90 days.

persona:                                # Behavioral personality.
  temperament:                          # Character traits.
    - "Impatient — treats delays as costs"
    - "Revenue-obsessed"
    - "Action-biased"
    - "Direct"
  thinking_patterns:                    # Internal monologue patterns.
    - "Who will pay for this, and how much?"
    - "What is the fastest path to revenue?"
  heuristics:                           # Named decision rules.
    - name: Ship-It Rule
      rule: >
        If a version can ship in half the time,
        default to shipping it — unless
        irreversibility risk is proven.
    - name: Payback Period
      rule: >
        Every initiative must have a payback
        period under 6 months.
  evidence_standard:                    # What convinces or fails to convince.
    convinced_by:
      - "Revenue data and conversion metrics"
      - "Concrete timelines with ship dates"
    not_convinced_by:
      - "Abstract quality arguments without revenue impact"
      - "Timelines that keep extending"
  red_lines:                            # Hard boundaries.
    - "Never accept an indefinite timeline"
    - "Never ignore unit economics"

tensions:                               # Productive conflict definitions.
  - agent: sentinel                     #   ID of the opposing agent.
    dynamic: >                          #   Description of the tension.
      Ship now vs. protect long-term.
      Catalyst pushes speed; Sentinel
      demands sustainability.

report:                                 # How the agent structures output.
  structure: >
    Lead with revenue opportunity.
    State the recommended path with a
    concrete ship date.

model:                                  # LLM configuration.
  tier: standard                        #   standard | advanced | reasoning
  thinking: "off"                       #   off | on (extended thinking)

capabilities:                           # What this agent can produce.
  can_execute_code: false
  can_produce_files: false
  can_review_artifacts: true
  available_skills: []
  output_types: [text, markdown]

tools: null                             # External tool integrations (future).
skills: []                              # Linked skill definitions.
expertise:                              # Persistent scratch pad.
  - path: expertise/catalyst-notes.md
    mode: read-write

Cognition

The cognition block defines how the agent thinks — its optimization target, time horizon, biases, and risk appetite.

objective_function is the agent's north star. Every argument, recommendation, and challenge the agent makes should trace back to this function. Make it specific and measurable.

core_bias names the agent's intentional cognitive lean. This is not a flaw — it is a design choice. Agents are biased on purpose so that the council produces genuine tension. Examples: speed-and-monetization, risk-aversion, systems-thinking, user-empathy, contrarian.

risk_tolerance (low / moderate / high) controls how the agent weighs uncertain outcomes. A low agent demands proof before acting. A high agent acts on signal and adjusts.

time_horizon defines three nested windows. The primary horizon is where the agent does most of its thinking. The secondary is awareness. The peripheral is what it notices but does not prioritize.

Tip

Good councils have agents with different time horizons. A Catalyst focused on 30-90 days clashes productively with a Sentinel focused on 1-3 years. This asymmetry is intentional.

Persona

The persona block defines who the agent is — its character, patterns of reasoning, decision rules, evidence standards, and hard limits.

temperament is a list of character traits written as short descriptions. These set the tone for how the agent communicates. Write them as "Trait — explanation" pairs.

thinking_patterns are the internal questions the agent asks itself when evaluating any input. Write them as questions the agent would ask.

heuristics are named decision rules. Each has a name (short, memorable) and a rule (one or two sentences). Good heuristics are opinionated and actionable.

evidence_standard has two lists: convinced_by (what counts as good evidence) and not_convinced_by (what the agent rejects). This controls how the agent responds to other agents' arguments.

red_lines are absolute limits. The agent will never cross these regardless of the discussion. Keep the list short (2-4 items) and specific.

Tensions

Tensions define the productive conflicts between agents. They are the engine of deliberation.

tensions:
  - agent: sentinel
    dynamic: >
      Ship now vs. protect long-term. The Catalyst
      pushes for speed; the Sentinel demands
      sustainability. The tension is whether velocity
      creates value or destroys trust.
  - agent: pathfinder
    dynamic: >
      Proven revenue vs. speculative bets. The Catalyst
      wants to monetize the known; the Pathfinder wants
      to bet on the unknown.

Each tension entry names the opposing agent by ID and describes the dynamic — the specific disagreement that makes this pairing valuable.

Note

Tensions are bidirectional. If Catalyst defines a tension with Sentinel, Sentinel should also define a tension with Catalyst. The descriptions can differ — each agent describes the tension from its own perspective.

Capabilities

The capabilities block declares what an agent can produce during sessions.

capabilities:
  can_execute_code: false       # Run code in a sandboxed environment
  can_produce_files: false      # Write files to the output directory
  can_review_artifacts: true    # Read and critique other agents' outputs
  available_skills: []          # Skill IDs the agent can invoke
  output_types:                 # What formats this agent produces
    - text
    - markdown

For execution profiles, agents with can_produce_files: true generate artifacts (architecture docs, task breakdowns) that become part of the execution package. Agents with can_review_artifacts: true can read and critique those artifacts in later workflow steps.

output_types declares the formats this agent can produce: text, markdown, json, yaml, mermaid, code.

Template Variables

The prompt.md file uses {{variable}} placeholders that the runtime injects at execution time.

Variable Available In Description
{{agent_name}} prompt.md Display name of the agent (e.g., "Catalyst")
{{agent_id}} prompt.md Agent identifier (e.g., "catalyst")
{{session_id}} prompt.md Unique session identifier
{{participants}} prompt.md Comma-separated list of all agents in the session
{{constraints}} prompt.md Time, budget, and round constraints from the profile
{{brief}} prompt.md Full text of the user's brief
{{role_override}} prompt.md Profile-specific role override. Specializes the agent for a particular profile without modifying its base definition.
{{expertise_block}} prompt.md Contents of the agent's expertise scratch pad
{{deliberation_dir}} prompt.md Path to the output directory for this session
{{transcript_path}} prompt.md Path to the live transcript file

Tip

{{role_override}} is especially powerful in execution profiles. The same Architect agent can serve as "system designer" in a deliberation council and "produce architecture decision records" in an execution profile — same persona, different mission.

Prompt Writing Tips

  • Start with identity. The first section of prompt.md should establish who the agent is, what it cares about, and why it exists.
  • Use second person. Write "You are the Catalyst" not "The Catalyst is." Direct address produces stronger role adherence.
  • Include example reasoning. Show the agent's internal monologue with quoted examples.
  • Define engagement rules. Tell the agent how to interact with specific other agents.
  • Keep red lines few and firm. 2-4 hard limits. If you list 10, the LLM treats them all as soft.
  • Use {{role_override}} as an insertion point. Place it after the identity section so profile-specific instructions layer on top of the base persona.
  • End with report structure. Tell the agent exactly how to format its output. Numbered steps work better than vague instructions.

Validate

Validate your agent definition against the schema:

aos validate agent core/agents/perspectives/my-agent/agent.yaml

The validator checks:

  • Schema version is aos/agent/v1
  • All required fields are present (id, name, role, cognition, persona)
  • Tension references point to agents that exist
  • Capability fields use valid values
  • prompt.md exists in the same directory

To validate all agents at once:

aos validate agents