Files
roboco/docs/workflows/GIT_WORKFLOW.md
T
2025-12-30 19:37:03 +01:00

9.5 KiB

Git Workflow

Status: Implemented

This document describes the git workflow for RoboCo agents working on code tasks.


Multi-Agent Workspace Structure

Each agent gets their own isolated workspace (git clone) for a project. This allows multiple agents to work on the same project in parallel, each on their own branch, without file conflicts.

{workspaces_root}/
└── {project-slug}/
    └── {team}/
        └── {agent-slug}/
            └── [git repo files]

Example Structure

/data/workspaces/
└── roboco/
    ├── backend/
    │   ├── be-dev-1/    # Backend Developer 1's workspace
    │   ├── be-dev-2/    # Backend Developer 2's workspace
    │   ├── be-qa/       # Backend QA's workspace
    │   ├── be-pm/       # Backend PM's workspace
    │   └── be-doc/      # Backend Documenter's workspace
    ├── frontend/
    │   ├── fe-dev-1/
    │   ├── fe-dev-2/
    │   └── ...
    └── ux_ui/
        ├── ux-dev-1/
        └── ...

Workspace Features

  • Auto-clone: When workspace_auto_clone is enabled, workspaces are automatically cloned when first accessed
  • Isolation: Each agent has their own working tree - no file locking conflicts
  • Branch independence: Agents can be on different branches simultaneously
  • Project-scoped: Workspaces are organized by project slug

Branch Naming

Branches are created by PMs and include team context:

{type}/{team}/{task-id-prefix}

Types

Type Use
feature/ New functionality
fix/ Bug fixes
refactor/ Code restructuring
docs/ Documentation
test/ Test additions
chore/ Maintenance

Examples

feature/backend/a1b2c3d4
fix/frontend/e5f6g7h8
refactor/backend/i9j0k1l2

Commit Messages

Commits are automatically linked to tasks with a task ID prefix:

[{task-id-prefix}] {message}

Automatic Linking

When you use roboco_git_commit(), the commit:

  1. Is prefixed with the task ID (first 8 chars)
  2. Is recorded in the task's commit history
  3. Is added to the work session if one exists

Manual Format

{type}({scope}): {description}

{body}

Task: {task-id}
Co-authored-by: {agent-name}

Types

Type Description
feat New feature
fix Bug fix
docs Documentation
style Formatting
refactor Code restructure
test Tests
chore Maintenance
perf Performance

Example

feat(auth): add Redis-based rate limiting

Implements sliding window rate limiter using Redis.
- Configurable limits per endpoint
- Lua script for atomic operations
- Returns rate limit headers

Task: a1b2c3d4-e5f6-7890-abcd-ef1234567890
Co-authored-by: be-dev-1

Workflow

PM Setup Phase

1. PM CREATES TASK (status: backlog)
   │
   ▼
2. PM CREATES SESSION
   │  roboco_session_start(channel, "collaborative", task_id)
   │
   ▼
3. PM ACTIVATES TASK (status: pending)
   │  roboco_task_activate(task_id)
   │
   ▼
4. PM CREATES BRANCH
   │  roboco_git_create_branch(project_slug, task_id, "feature")
   │  → Creates: feature/{team}/{task-id-prefix}
   │  → Auto-pushes to remote with tracking
   │
   ▼
5. PM ASSIGNS DEVELOPER
   │  roboco_task_claim(task_id, agent_id="be-dev-1")

Developer Flow

1. CLAIM TASK
   │  roboco_task_claim(task_id)
   │
   ▼
2. START WORK (requires branch for git tasks)
   │  roboco_task_start(task_id)
   │
   ▼
3. CHECKOUT BRANCH
   │  roboco_git_checkout(project_slug, branch_name)
   │
   ▼
4. WORK & COMMIT
   │  # Multiple commits linked to task
   │  roboco_git_commit(project_slug, task_id, "add rate limiter")
   │  roboco_git_commit(project_slug, task_id, "add tests")
   │
   ▼
5. PUSH BRANCH
   │  roboco_git_push(project_slug)
   │
   ▼
6. SUBMIT FOR QA
   │  roboco_task_submit_qa(task_id, notes)
   │
   ▼
7. QA REVIEWS (on branch)
   │
   ├── PASS → Continue to Documentation
   └── FAIL → Task returns to needs_revision

QA Flow

QA reviews the code on the branch:

1. QA CLAIMS TASK
   │  roboco_task_claim(task_id)
   │
   ▼
2. QA CHECKS OUT BRANCH
   │  roboco_git_checkout(project_slug, branch_name)
   │
   ▼
3. QA REVIEWS
   │  roboco_git_status(project_slug)
   │  roboco_git_diff(project_slug)
   │  roboco_git_log(project_slug)
   │
   ├── PASS: roboco_task_pass_qa(task_id, notes)
   │         → Status: awaiting_documentation
   │
   └── FAIL: roboco_task_fail_qa(task_id, notes)
             → Status: needs_revision

Documentation Phase (Parallel Execution)

When a task reaches awaiting_documentation, two things happen in parallel:

                 awaiting_documentation
                          │
          ┌───────────────┴───────────────┐
          │                               │
     DOCUMENTER                      DEVELOPER
          │                               │
    writes docs                     creates PR
          │                               │
 roboco_task_docs_complete()    roboco_git_create_pr()
          │                               │
          │    sets docs_complete=True    │
          │                               │
          │      sets pr_created=True     │
          │                               │
          └───────────────┬───────────────┘
                          │
              BOTH must be true
                          │
                          ▼
                awaiting_pm_review

PR Creation

Developer creates PR after QA passes:

roboco_git_create_pr(
    project_slug="roboco",
    task_id="a1b2c3d4-...",
    title="[TASK-a1b2c3d4] Add rate limiting",
    body="## Summary\n- Implemented sliding window...\n\n## Test Plan\n..."
)

This:

  • Creates PR via GitHub CLI (gh pr create)
  • Targets the project's default branch
  • Sets pr_created=True on the task
  • Records PR number and URL on the task

PM Review and Completion

Standard Completion

1. TASK IN awaiting_pm_review
   │
   ▼
2. PM REVIEWS PR
   │  - Check commits: roboco_git_log(project_slug, branch)
   │  - Check changes: roboco_git_diff(project_slug)
   │
   ▼
3. PM COMPLETES TASK
   │  roboco_task_complete(task_id)
   │
   ▼
4. PM MERGES PR (Optional)
   │  roboco_git_merge_pr(project_slug, pr_number, "squash")

CEO Approval (Major Tasks)

For significant changes, PM escalates to CEO:

1. TASK IN awaiting_pm_review
   │
   ▼
2. PM ESCALATES TO CEO
   │  roboco_task_escalate_to_ceo(task_id, notes)
   │  → Status: awaiting_ceo_approval
   │  → Requires PR number to exist
   │
   ▼
3. CEO REVIEWS
   │
   ├── APPROVE: roboco_task_ceo_approve(task_id, notes)
   │            → Status: completed
   │
   └── REJECT: roboco_task_ceo_reject(task_id, notes)
               → Status: needs_revision
               → Assigned back to developer

Git API Endpoints

Read-Only Operations

Endpoint Tool Description
GET /git/status roboco_git_status Get git status for project
GET /git/log roboco_git_log Get commit history
GET /git/branches roboco_git_branches List branches
GET /git/diff roboco_git_diff View changes

Write Operations

Endpoint Tool Description
POST /git/commit roboco_git_commit Create commit linked to task
POST /git/push roboco_git_push Push to remote
POST /git/branch/create roboco_git_create_branch Create task branch (PM only)
POST /git/checkout roboco_git_checkout Checkout branch
POST /git/pr/create roboco_git_create_pr Create pull request
POST /git/pr/merge roboco_git_merge_pr Merge PR (PM only)

Git Requirements for Transitions

Tasks with requires_git=True have additional validation:

claimed -> in_progress

  • Requirement: branch_name must be set
  • Why: PM must create branch before developer can start

awaiting_documentation -> awaiting_pm_review

  • Requirements: BOTH docs_complete=True AND pr_created=True
  • Why: Parallel workflow - documenter and developer must both finish

awaiting_pm_review -> awaiting_ceo_approval

  • Requirement: pr_number must be set
  • Why: CEO needs to review the PR before final approval

Branch Protection (Main)

  • No direct pushes
  • PR required
  • QA must pass
  • PM approval required
  • CI must pass (when configured)

Handling QA Failures

QA finds issues
      │
      ▼
Developer gets task back (needs_revision)
      │
      ▼
Developer claims, continues on SAME branch
      │
      ▼
Fix commits:
  roboco_git_commit(project_slug, task_id, "fix edge case X")
      │
      ▼
Push to same branch
  roboco_git_push(project_slug)
      │
      ▼
Re-submit for QA
  roboco_task_submit_qa(task_id, "Fixed issues noted in QA")

Commit Linking

Every commit made through roboco_git_commit is:

  1. Prefixed with task ID (first 8 chars)
  2. Recorded in task.commits array
  3. Linked to work session if active
  4. Attributed to the committing agent

This creates full traceability from commit back to task.