# Data Model This document describes the core entities in the RoboCo system, their relationships, and key fields. ## Entity Relationship Overview ``` +--------+ | CEO | +---+----+ | v +--------+ +----------+ +-------+ +---------+ | Project| <-- |WorkSession| -- | Task | -- | Agent | +---+----+ +----------+ +---+---+ +----+----+ | | | | | | v v v +----------+ +---------------+ +----------+ | Workspace| | SessionTask | | Journal | | (on disk)| | (many-to-many)| +----+-----+ +----------+ +-------+-------+ | | v v +-------------+ +----------+ |JournalEntry | | Session | +-------------+ +----+-----+ | v +----------+ | Message | +----------+ +----------+ +-------+ +---------+ | Channel | --> | Group | --> | Session | +----------+ +-------+ +---------+ +---------------+ | Notification | +---------------+ +---------------+ | Handoff | (Reserved for future use) +---------------+ +------------------+ | IndexedDocument | (Knowledge base tracking) +------------------+ ``` ## Core Entities ### Agent Represents an AI agent in the organization. Each agent has a role, team affiliation, capabilities, and permissions. **Table**: `agents` | Field | Type | Description | |-------|------|-------------| | `id` | UUID | Primary key | | `name` | String(100) | Display name | | `slug` | String(50) | URL-safe identifier (e.g., `be-dev-1`) | | `role` | Enum | `developer`, `qa`, `documenter`, `cell_pm`, `main_pm`, `product_owner`, `head_marketing`, `auditor`, `ceo`, `system` | | `team` | Enum | `backend`, `frontend`, `ux_ui`, `main_pm`, `board`, `marketing` (nullable for board members) | | `status` | Enum | `active`, `idle`, `offline` | | `current_task_id` | UUID | Currently assigned task (FK) | | `model_config` | JSON | LLM configuration (provider, model name, temperature, etc.) | | `system_prompt` | Text | Base system prompt for this agent | | `capabilities` | Array[String] | List of capabilities (`code_execution`, `git_operations`, etc.) | | `permissions` | JSON | Channel access permissions | | `metrics` | JSON | Performance metrics (tasks completed, quality score, etc.) | | `journal_id` | UUID | Agent's personal journal ID | | `description` | Text | Human-readable description | | `created_at` | Timestamp | Creation time | | `updated_at` | Timestamp | Last update time | **Agent Roles**: - **Executive**: `ceo` - **Board**: `product_owner`, `head_marketing`, `auditor` - **Management**: `main_pm`, `cell_pm` - **Cell Members**: `developer`, `qa`, `documenter` - **System**: `system` (internal orchestrator) --- ### Task The atomic unit of work in RoboCo. Every piece of work follows the universal task lifecycle. **Table**: `tasks` | Field | Type | Description | |-------|------|-------------| | `id` | UUID | Primary key | | `title` | String(200) | Task title | | `description` | Text | Detailed description | | `acceptance_criteria` | Array[String] | How we know it's done | | `status` | Enum | Current lifecycle state (see [Task Lifecycle](./task_lifecycle.md)) | | `priority` | Integer | 0=P0 (highest) to 3=P3 (lowest) | | `task_type` | Enum | `code`, `documentation`, `research`, `planning`, `design`, `administrative` | | `requires_git` | Boolean | Whether git workflow applies | | `project_id` | UUID | Associated project (FK) | | `branch_name` | String(500) | Git branch for this task | | `work_session_id` | UUID | Active work session (FK) | | `pr_number` | Integer | GitHub/GitLab PR number | | `pr_url` | String(500) | Full URL to PR | | `docs_complete` | Boolean | Documenter has finished | | `pr_created` | Boolean | Developer has created PR | | `pm_approvals` | JSON | PM approval tracking | | `created_by` | UUID | Agent who created the task (FK) | | `assigned_to` | UUID | Currently assigned agent (FK) | | `team` | Enum | Which cell owns this task | | `parent_task_id` | UUID | Parent task for sub-tasks (FK) | | `dependency_ids` | Array[UUID] | Tasks this is blocked by | | `blocker_ids` | Array[UUID] | Tasks this is blocking | | `claimed_at` | Timestamp | When task was claimed | | `started_at` | Timestamp | When work started | | `completed_at` | Timestamp | When task completed | | `target_date` | Timestamp | Target completion date | | `plan` | JSON | Implementation plan (sub-tasks, risks, questions) | | `estimated_complexity` | Enum | `low`, `medium`, `high` | | `execution_log` | JSON | Execution events and errors | | `checkpoints` | JSON | State recovery checkpoints | | `progress_updates` | JSON | Progress update history | | `commits` | JSON | Linked commits | | `documents` | JSON | Linked documents | | `outputs` | JSON | Output artifacts | | `dev_notes` | Text | Developer journey notes | | `qa_notes` | Text | QA feedback | | `auditor_notes` | Text | Auditor observations | | `self_verified` | Boolean | Self-verification passed | | `qa_verified` | Boolean | QA verification result | | `quick_context` | Text | 2-3 sentences for quick context restoration | | `proactive_context` | JSON | RAG context injected when claimed | | `created_at` | Timestamp | Creation time | | `updated_at` | Timestamp | Last update time | **Indexes**: - `ix_tasks_team_status` - Team + Status queries - `ix_tasks_assigned_status` - Assignee + Status queries - `ix_tasks_project_status` - Project + Status queries --- ### Project A git repository that agents work on. Projects are registered by PMs and contain configuration for the development workflow. **Table**: `projects` | Field | Type | Description | |-------|------|-------------| | `id` | UUID | Primary key | | `name` | String(100) | Project name | | `slug` | String(50) | URL-safe identifier (e.g., `roboco`, `roboco-panel`) | | `git_url` | String(500) | Git repository URL | | `default_branch` | String(100) | Default branch (default: `main`) | | `protected_branches` | Array[String] | Branches that cannot be pushed directly | | `test_command` | String(500) | Command to run tests | | `lint_command` | String(500) | Command to run linter | | `format_command` | String(500) | Command to format code | | `typecheck_command` | String(500) | Command to run type checker | | `build_command` | String(500) | Command to build | | `assigned_cell` | Enum | Which cell owns this project | | `allowed_agents` | Array[UUID] | Specific agents allowed (null = all in cell) | | `workspace_path` | String(500) | Local workspace path | | `last_synced_at` | Timestamp | Last sync from remote | | `head_commit` | String(40) | Current HEAD commit SHA | | `created_by` | UUID | PM who registered the project (FK) | | `is_active` | Boolean | Whether project is active | | `created_at` | Timestamp | Creation time | | `updated_at` | Timestamp | Last update time | --- ### WorkSession Tracks an agent's working session on a task, including branch management, commits, and PR tracking. **Table**: `work_sessions` | Field | Type | Description | |-------|------|-------------| | `id` | UUID | Primary key | | `project_id` | UUID | Project being worked on (FK) | | `task_id` | UUID | Task being worked on (FK) | | `agent_id` | UUID | Agent doing the work (FK) | | `branch_name` | String(500) | Full branch name | | `base_branch` | String(500) | Branch this was forked from | | `target_branch` | String(500) | Branch to merge into | | `started_at` | Timestamp | Session start time | | `ended_at` | Timestamp | Session end time | | `status` | Enum | `active`, `completed`, `abandoned` | | `commits` | Array[String] | Commit SHAs made in this session | | `files_modified` | Array[String] | Files touched in this session | | `pr_number` | Integer | PR number | | `pr_url` | String(500) | Full URL to PR | | `pr_status` | String(50) | `open`, `merged`, `closed` | | `pr_created_at` | Timestamp | When PR was created | | `pr_merged_at` | Timestamp | When PR was merged | | `merged_by` | UUID | Agent who merged the PR (FK) | | `created_at` | Timestamp | Creation time | | `updated_at` | Timestamp | Last update time | --- ### Session Sessions group messages within boundaries (time, count, content length). They are automatically created and closed based on configuration. **Table**: `sessions` | Field | Type | Description | |-------|------|-------------| | `id` | UUID | Primary key (sesh_id) | | `group_id` | UUID | Parent group (FK) | | `max_time_window` | Interval | Maximum session duration (default: 30 min) | | `max_message_count` | Integer | Maximum messages per session (default: 100) | | `max_content_length` | Integer | Maximum total characters (default: 50000) | | `timeout_seconds` | Integer | Inactivity timeout (default: 300) | | `status` | Enum | `active`, `closed`, `timed_out` | | `scope` | Enum | `initiative`, `cell`, `task` | | `started_at` | Timestamp | Session start time | | `last_activity_at` | Timestamp | Last activity time | | `closed_at` | Timestamp | Session close time | | `message_count` | Integer | Number of messages | | `total_content_length` | Integer | Total character count | | `created_at` | Timestamp | Creation time | **Session Scopes**: - `initiative`: Cross-cell coordination (Main PM, #dev-all) - `cell`: Cell-specific work (Cell PM, #backend-cell) - `task`: Individual task execution (Developer level) --- ### SessionTask (Junction Table) Many-to-many relationship between Sessions and Tasks. PMs can create work sessions as discussion contexts for tasks. **Table**: `session_tasks` | Field | Type | Description | |-------|------|-------------| | `id` | UUID | Primary key | | `session_id` | UUID | Session (FK) | | `task_id` | UUID | Task (FK) | | `is_primary` | Boolean | Primary discussion session for this task | | `relationship_type` | String(50) | `discussion`, `planning`, `review`, `retrospective` | | `added_at` | Timestamp | When link was created | | `added_by` | UUID | PM who created the link (FK) | --- ### Message Extracted, stored message from agent streams. Messages are the atomic unit of communication. **Table**: `messages` | Field | Type | Description | |-------|------|-------------| | `id` | UUID | Primary key (msg_id) | | `agent_id` | UUID | Agent who sent the message (FK) | | `channel_id` | UUID | Channel the message is in (FK) | | `group_id` | UUID | Group the message belongs to (FK) | | `session_id` | UUID | Session ID (FK) | | `type` | Enum | `reasoning`, `dialogue`, `decision`, `action`, `blocker`, `technical` | | `content` | Text | Message content | | `content_length` | Integer | Character count | | `is_reply` | Boolean | Whether this is a reply | | `reply_to` | UUID | Parent message ID (FK) | | `mentions` | Array[UUID] | Agent IDs mentioned | | `task_id` | UUID | Related task ID (FK) | | `commit_ref` | String(40) | Related commit hash | | `timestamp` | Timestamp | Message timestamp | | `confidence` | Float | Extraction confidence | | `raw_excerpt` | Text | Original text before extraction | | `edited_at` | Timestamp | Last edit time | | `edit_history` | JSON | Previous versions | | `created_at` | Timestamp | Creation time | --- ### Channel Communication channels for agent messaging. **Table**: `channels` | Field | Type | Description | |-------|------|-------------| | `id` | UUID | Primary key | | `name` | String(100) | Channel name | | `slug` | String(50) | URL-safe identifier | | `type` | Enum | `cell`, `cross_cell`, `management`, `special` | | `description` | Text | Channel description | | `topic` | String(500) | Current topic | | `members` | Array[UUID] | Member agent IDs | | `writers` | Array[UUID] | Agents with write access | | `silent_observers` | Array[UUID] | Agents with silent read access (Auditor) | | `is_archived` | Boolean | Whether channel is archived | | `is_private` | Boolean | Private channel flag | | `allow_threads` | Boolean | Whether threads are allowed | | `allow_reactions` | Boolean | Whether reactions are allowed | | `message_retention_days` | Integer | Message retention (default: 90) | | `max_message_length` | Integer | Maximum message length (default: 10000) | | `message_count` | Integer | Total messages | | `group_count` | Integer | Total groups | | `last_activity` | Timestamp | Last activity time | | `created_at` | Timestamp | Creation time | | `updated_at` | Timestamp | Last update time | **Channel Types**: - `cell`: Internal team channels (#backend-cell, #frontend-cell, #uxui-cell) - `cross_cell`: Coordination channels (#dev-all, #qa-all, #pm-all, #doc-all) - `management`: Management channels (#main-pm-board, #board-private) - `special`: Special channels (#announcements, #all-hands) --- ### Group Groups within channels, used to organize conversations. **Table**: `groups` | Field | Type | Description | |-------|------|-------------| | `id` | UUID | Primary key | | `name` | String(100) | Group name | | `channel_id` | UUID | Parent channel (FK) | | `allowed_roles` | Array[String] | Roles allowed in this group | | `hierarchy_level` | Integer | Hierarchy level (default: 4) | | `members` | Array[UUID] | Member agent IDs | | `is_active` | Boolean | Whether group is active | | `active_session_id` | UUID | Current active session | | `default_session_config` | JSON | Session boundary configuration | | `total_sessions` | Integer | Total sessions | | `total_messages` | Integer | Total messages | | `last_activity` | Timestamp | Last activity time | | `created_at` | Timestamp | Creation time | | `updated_at` | Timestamp | Last update time | --- ### Notification Formal notifications requiring acknowledgment. **Table**: `notifications` | Field | Type | Description | |-------|------|-------------| | `id` | UUID | Primary key | | `type` | Enum | `task_assignment`, `priority_change`, `blocker_escalation`, `review_request`, `documentation_request`, `alert`, `broadcast`, `knowledge_share`, `mention` | | `priority` | Enum | `normal`, `high`, `urgent` | | `from_agent` | UUID | Sender agent (FK) | | `to_agents` | Array[UUID] | Recipient agent IDs | | `subject` | String(200) | Notification subject | | `body` | Text | Notification body | | `requires_ack` | Boolean | Requires acknowledgment | | `acked_by` | Array[UUID] | Agents who acknowledged | | `acked_at` | JSON | Acknowledgment timestamps | | `related_task_id` | UUID | Related task (FK) | | `related_message_ids` | Array[UUID] | Related message IDs | | `timestamp` | Timestamp | Notification timestamp | | `expires_at` | Timestamp | Expiration time | | `read_by` | Array[UUID] | Agents who read | | `delivered_at` | Timestamp | Delivery time | | `created_at` | Timestamp | Creation time | --- ### Journal Agent personal journal for reflections and growth tracking. **Table**: `journals` | Field | Type | Description | |-------|------|-------------| | `id` | UUID | Primary key | | `agent_id` | UUID | Agent owner (FK, unique) | | `total_entries` | Integer | Entry count | | `last_entry_at` | Timestamp | Last entry time | | `latest_summary` | Text | Latest summary | | `summary_updated_at` | Timestamp | Summary update time | | `entries_by_type` | JSON | Entry counts by type | | `created_at` | Timestamp | Creation time | | `updated_at` | Timestamp | Last update time | --- ### JournalEntry Individual journal entries. **Table**: `journal_entries` | Field | Type | Description | |-------|------|-------------| | `id` | UUID | Primary key | | `journal_id` | UUID | Parent journal (FK) | | `type` | Enum | `task_reflection`, `decision_log`, `learning`, `struggle`, `general` | | `title` | String(200) | Entry title | | `content` | Text | Entry content | | `task_id` | UUID | Related task (FK) | | `session_id` | UUID | Related session (FK) | | `timestamp` | Timestamp | Entry timestamp | | `tags` | Array[String] | Entry tags | | `sentiment` | String(50) | Entry sentiment | | `is_private` | Boolean | Private entry flag | | `created_at` | Timestamp | Creation time | | `updated_at` | Timestamp | Last update time | --- ### IndexedDocument Tracks documents indexed into the knowledge base. **Table**: `indexed_documents` | Field | Type | Description | |-------|------|-------------| | `id` | UUID | Primary key | | `index_type` | String(50) | `code`, `docs`, `conversations`, `journals`, `errors`, `standards`, etc. | | `source` | String(1000) | Source path/URL | | `source_hash` | String(64) | SHA256 for deduplication | | `title` | String(500) | Document title | | `preview` | Text | First 500 chars for UI | | `chunk_count` | Integer | Number of chunks | | `extra_data` | JSON | Additional metadata | | `indexed_at` | Timestamp | Indexing time | | `updated_at` | Timestamp | Last update time | --- ### Handoff (Reserved) Structured documentation handoffs. Currently unused - reserved for future implementation. **Table**: `handoffs` | Field | Type | Description | |-------|------|-------------| | `id` | UUID | Primary key | | `task_id` | UUID | Related task (FK, unique) | | `summary` | Text | Handoff summary | | `new_functionality` | Array[String] | New features | | `modified_behavior` | Array[String] | Modified behaviors | | `breaking_changes` | Array[String] | Breaking changes | | `required_docs` | JSON | Required documentation items | | `optional_docs` | JSON | Optional documentation items | | `commits` | JSON | Key commits | | `new_files` | JSON | New file locations | | `modified_files` | JSON | Modified file locations | | `key_conversations` | JSON | Key conversations | | `code_samples` | JSON | Code samples | | `gotchas` | JSON | Gotchas and warnings | | `related_docs` | Array[String] | Related documentation | | `changelog_entry` | Text | Changelog entry | | `key_learnings` | Array[String] | Key learnings | | `key_decisions` | JSON | Key decisions | | `questions` | Array[String] | Open questions | | `dev_notes_location` | String(500) | Dev notes file path | | `status` | Enum | `pending`, `claimed`, `in_progress`, `accepted`, `completed` | | `assigned_to` | UUID | Assigned documenter (FK) | | `documenter_notes` | Text | Documenter feedback | | `created_at` | Timestamp | Creation time | | `updated_at` | Timestamp | Last update time | | `claimed_at` | Timestamp | Claim time | | `completed_at` | Timestamp | Completion time | ## Enumerations ### TaskStatus `backlog`, `pending`, `claimed`, `in_progress`, `blocked`, `paused`, `verifying`, `needs_revision`, `awaiting_qa`, `awaiting_documentation`, `awaiting_pm_review`, `awaiting_ceo_approval`, `completed`, `cancelled` ### TaskType `code`, `documentation`, `research`, `planning`, `design`, `administrative` ### Complexity `low`, `medium`, `high` ### Team `backend`, `frontend`, `ux_ui`, `main_pm`, `board`, `marketing` ### AgentRole `system`, `ceo`, `product_owner`, `head_marketing`, `auditor`, `main_pm`, `cell_pm`, `developer`, `qa`, `documenter` ### AgentStatus `active`, `idle`, `offline` ### SessionStatus `active`, `closed`, `timed_out` ### SessionScope `initiative`, `cell`, `task` ### MessageType `reasoning`, `dialogue`, `decision`, `action`, `blocker`, `technical` ### NotificationType `task_assignment`, `priority_change`, `blocker_escalation`, `review_request`, `documentation_request`, `alert`, `broadcast`, `knowledge_share`, `mention` ### NotificationPriority `normal`, `high`, `urgent` ### ChannelType `cell`, `cross_cell`, `management`, `special` ### JournalEntryType `task_reflection`, `decision_log`, `learning`, `struggle`, `general` ### WorkSessionStatus `active`, `completed`, `abandoned` ### HandoffStatus `pending`, `claimed`, `in_progress`, `accepted`, `completed` ### ModelProvider `anthropic`, `openai`, `local`