Skip to content

System Anatomy

Context Management

Context Management ​

Each arm has a limited context budget to prevent cognitive overload. This page describes how context is managed at a high level and how file ownership works.

Context Budget ​

Every arm operates within a context budget that limits how much information they hold at once.

Budget Configuration (Conceptual) ​

The exact mechanics of context budgeting and pruning are handled by the harness (opencode-api) and the underlying model. Coleo treats these as conceptual constraints rather than implementing its own token-level pruning logic.

We think about budgets in terms of:

  • How many files it is reasonable for an arm to consider at once
  • How much text (roughly, tokens) those files represent
  • Which areas of the repo are most relevant to the current task

In code, this is represented as a simple configuration shape that higher-level logic can reference when deciding what to show or emphasize to arms:

typescript
interface ContextBudget {
  mode: "auto" | "manual";

  // Hints for manual/advanced use; not a hard tokenizer
  maxFiles?: number;         // Max files that should be considered
  maxTokens?: number;        // Rough guidance for prompt size
  maxDirectories?: number;   // Max directories before work should be narrowed
}

Mode: Auto vs Manual ​

ModeDescriptionUse Case
AutoHarness/model manage context pruning internallyDefault, hands-off
ManualHumans give high-level hints (e.g., "focus only on these dirs")Advanced, debugging or constrained work

In practice, auto is the default: we trust opencode-api and the model to manage token budgets. Coleo focuses on passing good, focused context (relevant files, plan excerpts, decisions) rather than micromanaging token counts.

Context Snapshot (Conceptual) ​

When we talk about an arm's "current context" in the Observatory or status reports, we mean a soft snapshot like:

typescript
interface ContextSnapshot {
  files: string[];           // Files the arm is currently focused on
  estimatedTokens?: number;  // Optional rough estimate from harness
  utilization?: number;      // 0-1, rough sense of fullness (if available)
  lastUpdated?: Date;        // When this snapshot was last refreshed
}

This is primarily for observability and human understanding, not for driving a home-grown pruning algorithm.

Ownership Protocol ​

Arms can optionally claim files before modifying them. Claims can be disabled for speed, with automatic detection when conflicts arise.

Claim Modes ​

typescript
interface ClaimConfig {
  mode: "strict" | "lazy" | "disabled";
  thrashingDetection: boolean;     // Auto-enable claims on conflict
  thrashingThreshold: number;      // Overwrites before triggering (default: 2)
}
ModeBehaviorUse Case
strictMust claim before any writeHigh-conflict codebases, many arms
lazyClaims optional, detected on conflictDefault - balance speed and safety
disabledNo claims, parallel writes allowedSolo arm, trusted coordination

Lazy Mode with Thrashing Detection (Design) ​

In lazy mode, arms can work in parallel without claiming files. The long-term design is for the system to monitor for thrashing – when one arm's changes repeatedly get overwritten by another arm during their work session.

The following types describe the intended shape of such events and responses; they are design-level, not fully implemented behavior:

typescript
interface ThrashingEvent {
  path: string;
  victimArm: string;           // Arm whose changes were lost
  overwriterArm: string;       // Arm that overwrote
  victimChangeAt: Date;
  overwriteAt: Date;
  linesLost: number;           // Estimate of lost work
}

interface ThrashingResponse {
  action: "notify" | "enable_claims" | "pause_arm";
  message: string;
  suggestedClaim?: FileClaim;
}

At a high level, repeated thrashing should:

  • Notify affected arms and log the event
  • Encourage or auto-enable claims for the affected file(s)
  • Potentially pause an arm that is repeatedly overwriting others without coordination

Requesting a Claim After Thrashing ​

When an arm experiences thrashing, it can request a claim:

typescript
interface ClaimRequest {
  type: "claim_request";
  armId: string;
  path: string;
  reason: "thrashing" | "exclusive_work" | "long_task";
  duration?: number;           // Minutes, if temporary
  thrashingContext?: {
    overwrittenBy: string;
    changesSummary: string;
  };
}

The Protocol (Conceptual) ​

┌─────────────────────────────────────────────────────────────┐
│                   OWNERSHIP PROTOCOL                       │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. Arm wants to touch file F                               │
│  2. Check: Is F claimed by another arm?                     │
│  3. If unclaimed or shared, proceed                         │
│  4. If claimed and write is needed, request handoff         │
│  5. If handoff fails, escalate to Brain / human             │
│                                                             │
└─────────────────────────────────────────────────────────────┘

The exact mechanics of detection and enforcement live in the Brain and database layers, not in this document.

File Claims ​

typescript
interface FileClaim {
  id: string;
  armId: string;
  path: string;              // File or directory path
  pattern?: string;          // Glob pattern (for directory claims)
  claimedAt: Date;
  expiresAt?: Date;          // Optional auto-expiry
  exclusive: boolean;        // Can others read?
}

Claim Types ​

TypeScopeExclusiveUse Case
File claimSingle fileYesActive editing
Directory claimAll files matching patternNo (read ok)Domain ownership
Temporary claimTime-limitedYesQuick fix

Conflict Resolution (Design) ​

When two arms want the same file, the Brain should consider:

  1. Task priority: Higher priority task wins
  2. Reputation: Higher reputation arm wins ties
  3. History: Arm with more recent relevant work wins ties
  4. Escalation: Ask a human if still unclear

Context Pruning ​

Coleo does not implement its own token-level pruning algorithm. Instead, it relies on the harness (opencode-api) and the underlying model to manage context windows safely.

Coleo's responsibility is to:

  • Select and pass relevant files, plan excerpts, decisions, and status information
  • Avoid flooding arms with unnecessary or low-signal context
  • Expose a high-level view of what an arm is currently focused on (for humans)

In other words, we shape the inputs; the harness enforces the limits.

Handoff Protocol (Design) ​

When one arm needs a file that another owns, we model a simple handoff:

Request Message ​

typescript
interface HandoffRequest {
  type: "handoff_request";
  fromArm: string;
  toArm: string;
  path: string;
  reason: string;
  priority: "normal" | "high" | "urgent";
}

Response Options ​

typescript
interface HandoffResponse {
  type: "handoff_response";
  fromArm: string;
  toArm: string;
  path: string;
  decision: "granted" | "denied" | "busy" | "collaborate";
  reason?: string;
  estimatedAvailable?: Date;  // If busy
}

Collaboration Mode (Conceptual) ​

If both arms need the file at the same time:

typescript
interface CollaborationAgreement {
  path: string;
  participants: string[];     // Arm IDs
  mode: "sequential" | "parallel";
  coordinator: string;        // Arm ID of lead
  protocol: "lock" | "merge"; // How to handle conflicts
}
ModeDescription
sequentialArms take turns, one edits at a time
parallelBoth edit, merge conflicts later

These shapes describe how a future governance/coordination layer might reason about shared files; they are not a promise that such workflows are fully implemented today.

Monitoring Context (Future UI) ​

The Observatory is intended to provide views into arm context and ownership over time.

Context Dashboard (Planned) ​

  • Utilization gauge: Rough sense of how much context an arm is using (if harness exposes it)
  • File list: What files the arm is currently focused on
  • Claim map: Who (if anyone) currently claims what
  • Conflict alerts: Where ownership disputes or thrashing have been detected

API Endpoints (Design) ​

These endpoints describe the intended surface once context/claims are wired through the Brain and database:

GET /api/arms/:id/context      # Get arm's current context snapshot
GET /api/arms/:id/claims       # Get arm's file claims
POST /api/arms/:id/prune       # Hint that an arm may want to prune context (optional)
POST /api/claims/:id/transfer  # Transfer claim to another arm
DELETE /api/claims/:id         # Release claim

Until these exist in code, treat this section as forward-looking design, not current behavior.