Skip to content

System Anatomy

Project Management

Project Management ​

Coleo manages the software project itself through architect-classified tasks that coordinate work, update documentation, track progress, and ensure human feedback is properly incorporated.

Instead of a permanently specialized "PM arm", any general-purpose arm can temporarily execute project management tasks when the brain assigns it an architect (project-management) classification with the right context and task configuration template.

Project Management via Architect Tasks ​

When running in a project management role, an architect-classified task behaves like a project manager. It is the human's primary interface into the system's overall progress and plans.

┌──────────────────────────────────────────────────────────────────────────────┐
│                ARCHITECT (PROJECT MANAGEMENT)                               │
├──────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│  Does NOT primarily write product code. Instead it:                          │
│                                                                              │
│  ├── Watches arm and task activity                                           │
│  ├── Updates project plans and task lists in .project/                       │
│  ├── Maintains phase acceptance criteria                                     │
│  ├── Writes status updates and summaries                                     │
│  ├── Drafts communications to humans                                         │
│  ├── Ensures human feedback is captured and acted on                         │
│  ├── Tracks blockers and escalates when needed                               │
│  └── Keeps documentation in sync with reality                                │
│                                                                              │
└──────────────────────────────────────────────────────────────────────────────┘

These responsibilities are fulfilled by architect tasks operating over the .project/ directory and docs/, guided by a task configuration template, not by a separate PM-only agent type.

Architect Task Profile (Project Management Flavor) ​

Architect tasks that focus on project management use a predictable set of inputs and outputs.

typescript
interface ProjectManagementTaskContext {
  classification: "architect";               // Architect task
  subtype: "project-management";             // Flavor: project management

  // Inputs from the brain
  projectRoot: string;                        // Path to repo
  projectDir: string;                         // Path to .project/
  docsDir: string;                            // Path to docs/
  recentActivityMinutes: number;              // Window to summarize

  // Current state snapshots
  planFile: string;                           // .project/plan.md contents
  requirementsFile: string;                   // .project/requirements.md contents
  decisionsIndex: string[];                   // .project/decisions/*.md
  inboxFile: string;                         // .project/inbox.md contents
}

interface ProjectManagementTaskOutput {
  updatedFiles: {
    path: string;
    content: string;
  }[];
  statusSummary?: string;                     // For email / Observatory
  humanAttentionItems?: string[];             // Bullets for "Human Attention Needed"
}

The same physical arm instance might perform:

  • A development task (implementing code)
  • Then an architect/project-management task (updating .project/status.md and docs)
  • Then a QA task (writing tests)

The brain decides which classification to assign based on current needs, and then selects an appropriate task configuration template for that classification.

Task Configuration Templates ​

Coleo replaces MR-specific templates with task configuration templates that are keyed by task classification (and optional subtype). These templates live in code (see src/types/index.ts) and describe how different kinds of tasks should behave.

Template Fields ​

typescript
interface TaskConfigurationTemplate {
  classification: string;       // e.g., "architect", "development", "qa"
  subtype?: string;             // e.g., "project-management"
  description: string;          // Human-readable summary
  allowedTools?: string[];      // Logical tool names ("fs", "git", "mcp:guidance")
  contextBundles?: string[];    // What context to load (".project/*", "docs/", "discoveries")
  governance?: {
    requiresProposal?: boolean; // Should large changes go through proposals?
    typicalProposalTypes?: string[]; // Common proposal types for this task
    emphasizeStatusReports?: boolean; // Should tasks send frequent status?
  };
  hints?: {
    systemHint?: string;        // Short instruction for the arm
  };
}

A registry of built-in templates (TASK_CONFIGURATION_TEMPLATES) maps keys of the form "classification:subtype" to concrete configurations. Examples:

  • "architect:project-management" – drives status/doc-focused architect tasks over .project/ and docs/.
  • "development:default" – for ordinary implementation work.
  • "qa:default" – for testing and verification.
  • "documentation:default" – for documentation sync.

How the Brain Uses Templates ​

  1. Determine next task via progressive planning.
  2. Choose classification and (optional) subtype for that task.
  3. Look up template key ${classification}:${subtype ?? "default"} in TASK_CONFIGURATION_TEMPLATES.
  4. Prepare context according to contextBundles (e.g., .project/*, related files, discoveries).
  5. Shape prompts and tools based on allowedTools, governance, and hints.systemHint.

This replaces MR-style templates and "spawn a special arm for this MR" patterns with classification-driven behavior for general-purpose arms.

On-Disk Project Structure ​

All project management happens through plain text files in a .project/ directory. This makes the project state:

  • Version controlled - Full history of project evolution
  • Human readable - No proprietary formats, just markdown
  • Diff-friendly - Easy to see what changed
  • Tool agnostic - Works with any editor or viewer

Directory Structure ​

This structure reflects the current implementation and planning in .project/:

.project/
├── README.md              # Project overview and quick status
├── requirements.md        # Core philosophy & task classifications
├── plan.md                # High-level project plan and phases
├── inbox.md               # Quick task input - processed and cleared by brain
├── decisions/             # Architecture Decision Records (ADRs)
│   ├── 001-use-bun.md
│   ├── 002-maildir-for-communication.md
│   ├── ...
├── acceptance/
│   ├── phase-0.md         # Acceptance criteria for Phase 0
│   ├── phase-1.md
│   ├── phase-2.md
│   └── ...
└── plans/                 # Implementation plans generated by architect tasks

Note: Tasks are stored in SQLite (the system of record), not in markdown files. The inbox.md file is the only task input mechanism - items are converted to database tasks and the inbox is cleared.

File Formats ​

inbox.md ​

Quick task input that the brain processes every poll cycle. Items are parsed, deduplicated against existing tasks, and then the inbox is cleared.

markdown
# Inbox

## Add favicon to web app
Need Coleo branding - octopus icon for the browser tab.

- [ ] Update API documentation for new endpoints
- [ ] Review error handling in arm spawner

Format rules:

  • ## Header creates a task with the header as title, following paragraph as description
  • - [ ] Text creates a task with Text as title
  • After processing, items become tasks in SQLite and the inbox is cleared
  • Goal: inbox should always be empty after brain processes it

Architect Project-Management Behaviors ​

The following behaviors describe architect project-management tasks, not a dedicated PM arm type. Any general-purpose arm can perform these when assigned the appropriate classification, template, and context.

1. Status Updates ​

Note: Full status report automation is planned for Phase 2.4. The interfaces below describe the target behavior.

Architect project-management tasks regularly update status.md:

typescript
interface StatusUpdateTrigger {
  event:
    | "task_completed"
    | "task_started"
    | "blocker_detected"
    | "human_feedback"
    | "arm_paused"
    | "deploy_completed"
    | "scheduled";  // Every 30 min if active work

  action: "update_status";
}

async function updateStatus(event: StatusUpdateTrigger): Promise<void> {
  const currentState = await gatherArmStates();
  const recentActivity = await getRecentActivity(24 * 60); // 24h
  const blockers = await detectBlockers();
  const humanNeeds = await getPendingHumanItems();

  await writeStatusFile({
    timestamp: new Date(),
    state: determineOverallState(currentState, blockers),
    activeWork: formatActiveWork(currentState),
    recentCompletions: formatCompletions(recentActivity),
    blockers: formatBlockers(blockers),
    humanAttention: formatHumanNeeds(humanNeeds),
    metrics: calculateMetrics(recentActivity),
  });
}

2. Task Tracking ​

Tasks are stored in SQLite (see tasks table schema). When tasks complete, the brain updates the database:

typescript
async function onTaskCompleted(armId: string, taskId: string): Promise<void> {
  // Update task status in database
  await db.run(`
    UPDATE tasks 
    SET status = 'completed', 
        completed_at = datetime('now'),
        assigned_to = ?
    WHERE id = ?
  `, [armId, taskId]);

  // Check if any blocked tasks can now start
  await checkUnblockedTasks(taskId);

  // Update status
  await updateStatus({ event: "task_completed" });
}

3. Feedback Incorporation ​

Human feedback flows through inbox.md and becomes tasks in SQLite:

typescript
// Feedback added to inbox.md by human or email processor
// Brain's processInbox() parses and creates tasks:

async function processInbox(): Promise<void> {
  const inboxPath = path.join(projectDir, "inbox.md");
  const content = await fs.readFile(inboxPath, "utf-8");
  
  const items = parseInboxItems(content);
  
  for (const item of items) {
    // Check for duplicates by title similarity
    const existing = await findSimilarTask(item.title);
    if (existing) continue;
    
    // Create task in SQLite
    await db.run(`
      INSERT INTO tasks (id, subject, description, source_type, priority)
      VALUES (?, ?, ?, 'manual', 'normal')
    `, [generateId(), item.title, item.description || ""]);
  }
  
  // Clear inbox after processing
  await fs.writeFile(inboxPath, "# Inbox\n");
}

4. Communication Drafting ​

Note: Automated communication drafting is planned for Phase 2.6 (Agentic Brain). The interfaces below describe the target behavior.

Architect project-management tasks draft updates for humans, which can then be sent via Maildir / future IMAP/SMTP gateway:

typescript
interface CommunicationDraft {
  type: "daily_summary" | "blocker_alert" | "milestone_reached" | "decision_needed";
  recipient: "human";
  subject: string;
  body: string;
  attachments?: string[];  // Paths to relevant files
  urgency: "immediate" | "normal" | "low";
}

async function draftDailySummary(): Promise<CommunicationDraft> {
  const activity = await getActivitySince(lastSummary);
  const blockers = await getBlockers();
  const decisions = await getPendingDecisions();

  return {
    type: "daily_summary",
    recipient: "human",
    subject: `Coleo Daily: ${completedCount} done, ${inProgressCount} active`,
    body: formatDailySummary(activity, blockers, decisions),
    urgency: blockers.length > 0 ? "immediate" : "normal",
  };
}

5. Documentation Sync ​

Architect project-management tasks help keep docs in sync with implementation:

typescript
async function checkDocSync(): Promise<DocSyncReport> {
  const issues: DocSyncIssue[] = [];

  // Check if code has changed but docs haven't
  const codeChanges = await getRecentCodeChanges();
  for (const change of codeChanges) {
    const relatedDocs = findRelatedDocs(change.path);
    for (const doc of relatedDocs) {
      if (!await wasUpdatedSince(doc, change.date)) {
        issues.push({
          type: "stale_docs",
          doc,
          reason: `Code changed in ${change.path} but docs not updated`,
          suggestion: `Review ${doc} for accuracy`,
        });
      }
    }
  }

  // Check if docs reference non-existent code
  const docRefs = await extractCodeReferences(getAllDocs());
  for (const ref of docRefs) {
    if (!await exists(ref.path)) {
      issues.push({
        type: "broken_reference",
        doc: ref.sourceDoc,
        reason: `References ${ref.path} which doesn't exist`,
        suggestion: `Update or remove reference`,
      });
    }
  }

  return { issues, checkedAt: new Date() };
}

Human Communication Principles ​

These principles describe how architect project-management tasks communicate with humans (usually via email), rather than a special PM arm.

1. Proactive, Not Reactive ​

Don't wait for humans to ask. Provide regular updates:

  • Status changes when significant events occur
  • Daily summaries if work is ongoing
  • Immediate alerts for blockers or decisions needed

2. Concise but Complete ​

markdown
# Good
✅ Completed API server setup. Tests passing. Ready for UI integration.
Blocker: Need decision on auth approach before proceeding.

# Bad  
I have finished working on the API server. The server is now set up and 
running. I ran all the tests and they are all passing now. The next step
is to integrate with the UI. However, there is a blocker...

3. Always Actionable ​

Every communication should be clear about:

  • What happened
  • What it means
  • What (if anything) is needed from the human
markdown
## Decision Needed: API Authentication

**Context**: We're implementing the Observatory API and need to choose 
an authentication approach.

**Options**:
1. Simple API key (X-API-Key header) - quick to implement
2. JWT tokens - more secure, supports expiration
3. OAuth - full-featured, more complex

**Recommendation**: Option 1 for Phase 1, upgrade to Option 2 in Phase 3.

**Your Input Needed**: Approve recommendation or choose alternative.

4. Track Everything ​

All human feedback is logged and tracked:

  • When it was received
  • What was done about it
  • When it was completed (or why it was declined)

5. No Surprises ​

Humans should never be surprised by:

  • What the system is working on
  • Why something was done a certain way
  • The current state of the project

Metrics and Reporting ​

Note: Full metrics collection is partially implemented. Some metrics (task completion, arm status) are available; others (feedback incorporation rate, doc sync score) are planned for future phases.

Architect project-management tasks track metrics for project health:

typescript
interface ProjectMetrics {
  // Velocity
  tasksCompletedThisWeek: number;
  averageTaskDuration: number;  // hours

  // Quality
  feedbackIncorporationRate: number;  // % of feedback acted on
  docSyncScore: number;  // % of docs up-to-date

  // Health
  currentBlockers: number;
  averageBlockerDuration: number;  // hours
  armUtilization: Record<string, number>;  // % time active

  // Communication
  humanResponseTime: number;  // avg hours to respond to questions
  decisionsAwaitingInput: number;
}

Integration with Brain ​

Rather than a dedicated PM arm with special privileges, the brain knows how to:

  • Spawn general-purpose arms
  • Assign them architect project-management tasks when the project needs coordination
  • Provide .project/ and activity context bundles to those tasks based on the selected task configuration template

Architect project-management tasks, in turn, rely on the brain for:

  • Subscriptions to activity streams (arm.*, proposal.*, deploy.*, claim.*, etc.)
  • A way to send human-facing messages (Maildir / future IMAP/SMTP gateway)
  • APIs for querying current arms, tasks, and discoveries

Why Text Files? ​

The choice to use plain text files for human-facing project documentation:

BenefitExplanation
TransparencyAnyone can read the files, no special tools needed
Git-friendlyFull history, diffs show exactly what changed
AI-friendlyEasy for arms to read/write markdown
Human-friendlyHumans can edit directly if needed
InspectableDebug by just reading the files
CollaborativeMultiple arms can update different files

This approach makes the project state a first-class part of the codebase, not hidden in an external tool.

Note: SQLite is the system of record for operational state (tasks, arms, activity, discoveries). Text files (.project/*.md) are the human-facing interface for plans, status, and decisions. The brain reads these files and syncs relevant items to SQLite.