Skip to content

Gees & Teams

A Gee is a persistent AI identity — not a chat session, but a named agent with its own memory, mission, guardrails, tools, and evolving sense of self. When you run gee-code, you’re operating through a Gee. Every tool call, every objective, every credential resolves through that Gee’s scope.

A Gee is defined by its configuration stored at ~/.gee-code/modes/{name}/. Here’s what it carries:

FieldDescription
nameUnique identifier (lowercase, hyphens)
display_nameHuman-readable name
descriptionWhat this Gee does
roleJob title — “Security Auditor”, “UI Designer”, etc.
gee_idEmail-like identity (e.g., analyst@gee.pub)

The role and description feed into the system prompt, shaping how the AI behaves. A Gee with role “Security Auditor” reasons differently than one titled “UI Designer”.

~/.gee-code/modes/{name}/
├── mode.json # Core configuration
├── settings.json # Runtime preferences (model, skills, rlm)
├── instructions.md # System instructions (the Gee's playbook)
├── rules.md # Hard rules injected into every prompt
├── mission.md # Guiding mission (tamper-protected)
├── identity.md # Evolving sense-of-self document
├── identity_history/ # Archived identity snapshots
├── guardrails.json # Safety constraints
├── heartbeat.md # Checklist for autonomous activations
├── agents/ # Mode-specific agent definitions
├── skills/ # Mode-specific skills
├── flights/ # Flight templates
├── swarms/ # Swarm configurations
├── comms/ # Inter-Gee messaging
│ ├── inbox.jsonl
│ ├── outbox.jsonl
│ └── bulletin.jsonl
└── output/ # Autonomous result delivery

Each Gee has a memory_visibility setting:

LevelSees
selfOnly its own memories (default)
systemIts own + system-level memories
omniscientAll memories across all Gees

A Gee doesn’t have to see everything. Filters control which agents, skills, MCP servers, and other components are available:

{
"agents": { "available": ["coder", "reviewer"], "disabled": ["admin"] },
"skills": { "bundled": ["commit"], "disabled": ["deploy"] },
"mcp": { "enabled": ["filesystem"] }
}
/gee # Open interactive browser (Gees | Teams | Endeavors | Objectives)
/mode create analyst # Create a new Gee
/mode switch analyst # Switch to it
/mode delete analyst # Delete it

The Gee browser provides a full management interface where you can create, edit, configure, and monitor Gees.

Teams group Gees together for collaboration and shared resources:

{
"name": "content-team",
"description": "Content creation and review",
"repos": ["https://github.com/user/docs-site"]
}
  • Shared repos — team repos merge into each member’s effective workspace
  • Visibility — Gees in the same team can see each other (sibling awareness)
  • Shared guardrails — team-level guardrails apply to all members
  • Shared objectives — objectives assigned to a team reach all members

A Gee can belong to multiple teams. Solo Gees (no teams) see no siblings.

Endeavors are project-scoped groupings that sit above teams — representing a coordinated effort across multiple teams and individual Gees. Think of them as initiatives or projects: a product launch, a migration, a research spike. They exist to coordinate work that cuts across team boundaries.

Use the Gee browser to create endeavors:

/gee

Navigate to the Endeavors tab. You can also create endeavors implicitly — assigning a Gee to a non-existent endeavor auto-creates it.

Endeavors are stored at ~/.gee-code/endeavors/{name}/:

~/.gee-code/endeavors/q1-launch/
├── config.json # Name, description, teams, direct gees
└── guardrails.json # Endeavor-level guardrails (optional)

The config defines membership:

{
"name": "q1-launch",
"description": "Ship v2.0 by end of Q1",
"teams": ["frontend-team", "backend-team"],
"gees": ["project-manager"]
}

Endeavors have two types of members:

TypeHow they joinResolution
Direct GeesListed in gees arrayThe Gee is a direct member
TeamsListed in teams arrayAll Gees in the team become members

A Gee’s effective endeavor membership is computed from both paths — direct membership plus any endeavors that include its teams. This means a Gee can be part of an endeavor without being explicitly listed, simply by being on a member team.

Objectives can be assigned to endeavors, which means every Gee in that endeavor sees the objective. The resolution chain checks:

  1. Is the objective assigned to all Gees? (assign_all)
  2. Is this Gee directly assigned?
  3. Is this Gee in an assigned endeavor?
  4. Is this Gee on an assigned team?

This lets you broadcast work to an entire initiative with a single assignment.

Endeavors can define their own guardrails in guardrails.json. These are additive — they merge with team and Gee-level guardrails, never loosening constraints:

Effective guardrails = Gee guardrails + Team guardrails + Endeavor guardrails

The Terminal’s Endeavors Panel provides a full management interface for Gees, teams, and endeavors. It includes three views:

ViewTab LabelWhat It Shows
AgentsGeesMode selector, autonomy settings, assignments, mission, objectives, file editor, guardrails
CommsTeamsInter-Gee inbox and outbox messages
ThinkingSwarmsLive daemon event stream (tool calls, activations, reasoning)

From the Agents view you can:

  • Configure autonomy level, heartbeat, cost limits, and model clamping
  • Assign teams and endeavors (with auto-creation for new names)
  • Edit mission statements and mode files (identity, heartbeat, instructions, rules)
  • Create and manage objectives with status, priority, and multi-level assignment
  • Set guardrails and fine-grained permission filters

Deleting an endeavor does not cascade to its teams or Gees — they continue to exist independently. The endeavor is just an organizational container; removing it simply dissolves the grouping.

Endeavor ("q1-launch")
├── Teams
│ ├── "frontend-team" -> [gee-a, gee-b]
│ └── "backend-team" -> [gee-c, gee-d]
├── Direct Gees
│ └── "project-manager"
├── Guardrails (additive)
└── Objectives (visible to all members)

Many systems resolve values through the hierarchy:

SystemResolution Rule
CredentialsMost specific wins — Gee overrides team overrides global
GuardrailsAdditive — rules merge, limits take the most restrictive value
ObjectivesUnion — a Gee sees objectives from all its scopes
ReposMerge — effective repos = own + team repos
PermissionsIntersection — tightest allowed set wins

The key principle: adding constraints at a higher scope only tightens, never loosens.

Gees communicate through the Comms system:

TypePurpose
messageDirect one-way communication
requestCollaboration ask (pending -> accepted -> completed)
broadcastAnnouncement to team members
bulletinPublic board post visible to everyone
/comms # View messages
/comms send reviewer "Build fixed, CI green"

Unread messages and pending requests are automatically surfaced in the system prompt on every activation.

Every Gee has an evolving identity document with sections for who it is, what it knows, its track record, priorities, and problem-solving approach. After each autonomous activation, the identity evolves based on what happened — updating stats, knowledge, and learnings.

/identity # View current identity
/identity history # See evolution timeline

The Mission and Boundaries sections are protected from modification by the AI.

In Gee-Code, a “Gee” and a “Mode” are the same entity at the config level. The distinction is conceptual:

  • Gee emphasizes the persistent identity (name, role, memory, mission)
  • Mode emphasizes the operational profile (model, agents, autonomy settings)

When you create a mode, you’re creating a Gee. The terms are interchangeable.