Software Design Document (SDD)
Coditect Activity Dashboard
Document Version: 1.0
Date: November 27, 2025
Status: Draft
Author: Architecture Team
1. Introductionβ
1.1 Purposeβ
This Software Design Document (SDD) describes the architectural design, component specifications, and implementation details for the Coditect Activity Dashboard. The dashboard provides a unified view of development progress across multiple projects by synthesizing data from LLM sessions, Git commits, project plans, and task lists.
1.2 Scopeβ
This document covers:
- System architecture and component design
- Data models and relationships
- API specifications
- Integration patterns
- Security considerations
1.3 Definitions and Acronymsβ
| Term | Definition |
|---|---|
| LLM | Large Language Model |
| ADR | Architecture Decision Record |
| DTO | Data Transfer Object |
| DI | Dependency Injection |
| ERD | Entity Relationship Diagram |
1.4 Referencesβ
- Activity Dashboard Design Specification v2.0
- Coditect Platform Architecture Guide
- FoundationDB Operations Manual
2. System Overviewβ
2.1 System Contextβ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CODITECT PLATFORM β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β Git Providerβ β LLM Service β β Task Store β β
β β (GitHub) β β (Claude) β β (Internal) β β
β ββββββββ¬βββββββ ββββββββ¬βββββββ ββββββββ¬βββββββ β
β β β β β
β βΌ βΌ βΌ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β DATA INTEGRATION LAYER β β
β β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β β
β β β Commit β β Session β β Task β β Project β β β
β β β Ingester β β Ingester β β Sync β β Sync β β β
β β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β βΌ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β LINKING SERVICE β β
β β ββββββββββββββββββ ββββββββββββββββββ ββββββββββββββββββ β β
β β β SessionβTask β β CommitβTask β β Progress β β β
β β β Matcher β β Matcher β β Calculator β β β
β β ββββββββββββββββββ ββββββββββββββββββ ββββββββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β βΌ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β AGGREGATION SERVICE β β
β β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β β
β β β Project β β Blocker β β Activity β β Work β β β
β β β Progress β β Detector β β Feed β β Distrib β β β
β β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β βΌ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β DASHBOARD API β β
β β /api/v1/dashboard | /api/v1/projects β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β βΌ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β DASHBOARD UI β β
β β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β β
β β β Portfolioβ β Kanban β β Activity β β Blocker β β β
β β β Summary β β Board β β Feed β β Panel β β β
β β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
2.2 Design Principlesβ
- Task-Centric View: All data flows toward task progress, not session metrics
- Exception-Based Display: Only show anomalies; hide uniform data
- Progressive Disclosure: Three-level information hierarchy
- Real-Time Updates: WebSocket-based live updates
- Offline Resilience: Graceful degradation when services unavailable
3. Architectural Designβ
3.1 Component Architectureβ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β FRONTEND LAYER β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β React Application β β
β β βββββββββββββββ βββββββββββββββ βββββββββββββββββββββββββββ β β
β β β DashboardPageβ β ProjectPage β β TaskDetailPage β β β
β β βββββββββββββββ βββββββββββββββ βββββββββββββββββββββββββββ β β
β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β Components ββ β
β β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββββββββββ ββ β
β β β βProjectSummaryβ β KanbanBoard β β ActivityFeed β ββ β
β β β βBar β β β β β ββ β
β β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββββββββββ ββ β
β β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββββββββββ ββ β
β β β βBlockerPanel β βWorkDistrib β β TaskCard β ββ β
β β β β β βChart β β β ββ β
β β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββββββββββ ββ β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β State Management ββ β
β β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββββββββββ ββ β
β β β βDashboardStoreβ β ProjectStore β β WebSocketManager β ββ β
β β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββββββββββ ββ β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β BACKEND LAYER β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β API Gateway (FastAPI) β β
β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββββββββββββββ β β
β β β/dashboard β β/projects β β/tasks β β β
β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββββββββββββββ β β
β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββββββββββββββ β β
β β β/commits β β/sessions β β/ws/dashboard β β β
β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββββββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Service Layer β β
β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββββββββββββββ β β
β β βDashboardSvc β βProjectSvc β βTaskSvc β β β
β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββββββββββββββ β β
β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββββββββββββββ β β
β β βLinkingSvc β βAggregationSvcβ βActivitySvc β β β
β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββββββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Repository Layer β β
β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββββββββββββββ β β
β β βProjectRepo β βTaskRepo β βSessionRepo β β β
β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββββββββββββββ β β
β β ββββββββββββββββ ββββββββββββββββ β β
β β βCommitRepo β βLinkRepo β β β
β β ββββββββββββββββ ββββββββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DATA LAYER β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββββββββββββββββββ β
β β FoundationDB β β Redis β β Git Provider API β β
β β (Primary) β β (Cache) β β (GitHub/GitLab) β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
3.2 Data Flowβ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DATA FLOW DIAGRAM β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β External Sources β
β ββββββββββββββββ β
β β β
β βΌ β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β 1. INGESTION β β
β β βββββββββββββββ βββββββββββββββ βββββββββββββββ β β
β β βGit Webhooks β βSession End β βTask Update β β β
β β β β βEvents β βEvents β β β
β β ββββββββ¬βββββββ ββββββββ¬βββββββ ββββββββ¬βββββββ β β
β ββββββββββββββΌβββββββββββββββββΌβββββββββββββββββΌββββββββββββββββββββ β
β β β β β
β βΌ βΌ βΌ β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β 2. NORMALIZATION β β
β β βββββββββββββββ βββββββββββββββ βββββββββββββββ β β
β β βParse Commit β βExtract β βValidate β β β
β β βMessage β βSession Meta β βTask Schema β β β
β β ββββββββ¬βββββββ ββββββββ¬βββββββ ββββββββ¬βββββββ β β
β ββββββββββββββΌβββββββββββββββββΌβββββββββββββββββΌββββββββββββββββββββ β
β β β β β
β βΌ βΌ βΌ β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β 3. LINKING β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Task Matcher β β β
β β β β’ Explicit refs: #TASK-123, closes #456 β β β
β β β β’ Fuzzy match: title similarity > 0.7 β β β
β β β β’ File overlap: commit files β© task context β β β
β β ββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββ β β
β βββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ β
β β β
β βΌ β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β 4. AGGREGATION β β
β β βββββββββββββββ βββββββββββββββ βββββββββββββββ β β
β β βProgress % β βBlocked List β βActivity β β β
β β βby Project β βDetection β βRanking β β β
β β ββββββββ¬βββββββ ββββββββ¬βββββββ ββββββββ¬βββββββ β β
β ββββββββββββββΌβββββββββββββββββΌβββββββββββββββββΌββββββββββββββββββββ β
β β β β β
β βΌ βΌ βΌ β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β 5. PRESENTATION β β
β β βββββββββββββββ βββββββββββββββ βββββββββββββββ β β
β β βPortfolio β βKanban β βActivity β β β
β β βSummary β βBoard β βFeed (5 max) β β β
β β βββββββββββββββ βββββββββββββββ βββββββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
4. Data Designβ
4.1 Entity Relationship Diagramβ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ERD β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β PROJECT β 1 * β GIT_REPO β 1 * β GIT_COMMIT β β
β ββββββββββββββββ€βββββββββββββββββββββββββ€βββββββββββββββββββββββββ€ β
β β id β β id β β sha β β
β β name β β project_id β β repo_id β β
β β description β β url β β message β β
β β status β β default_branchβ β author β β
β β created_at β β current_commitβ β timestamp β β
β β updated_at β ββββββββββββββββ β additions β β
β ββββββββ¬ββββββββ β deletions β β
β β βββββββββ¬βββββββ β
β β 1 β β
β β β β
β βΌ 1 β β
β ββββββββββββββββ β β
β β PROJECT_PLAN β β β
β ββββββββββββββββ€ β β
β β id β β β
β β project_id β β β
β β name β β β
β β target_date β β β
β ββββββββ¬ββββββββ β β
β β 1 β β
β β β β
β βΌ * β β
β ββββββββββββββββ ββββββββββββββββ β β
β β TASK_LIST β 1 * β TASK ββββββββββββββββββ β
β ββββββββββββββββ€βββββββββββββββββββββββββ€ (commit_links) β
β β id β β id β β
β β plan_id β β list_id β ββββββββββββββββ β
β β name β β title β β LLM_SESSION β β
β β order β β description ββββββββββββββββββββββββββ€ β
β β category β β checked β β id β β
β ββββββββββββββββ β status β (sessionβ project_id β β
β β complexity β _links)β started_at β β
β β due_date β β ended_at β β
β β created_at β β message_countβ β
β β updated_at β β summary β β
β ββββββββββββββββ ββββββββββββββββ β
β β
β ββββββββββββββββ ββββββββββββββββ β
β β TASK_LINK β βSESSION_LINK β β
β ββββββββββββββββ€ ββββββββββββββββ€ β
β β id β β id β β
β β task_id β β task_id β β
β β commit_sha β β session_id β β
β β confidence β β confidence β β
β β link_type β β link_type β β
β β evidence β β evidence β β
β ββββββββββββββββ ββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
4.2 Database Schemaβ
-- Projects
CREATE TABLE projects (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(255) NOT NULL,
description TEXT,
status VARCHAR(50) DEFAULT 'active' CHECK (status IN ('active', 'archived', 'paused')),
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Git Repositories
CREATE TABLE git_repos (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
project_id UUID NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
url VARCHAR(500) NOT NULL,
default_branch VARCHAR(100) DEFAULT 'main',
current_commit VARCHAR(40),
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Git Commits
CREATE TABLE git_commits (
sha VARCHAR(40) PRIMARY KEY,
repo_id UUID NOT NULL REFERENCES git_repos(id) ON DELETE CASCADE,
author VARCHAR(255) NOT NULL,
message TEXT NOT NULL,
timestamp TIMESTAMP WITH TIME ZONE NOT NULL,
additions INTEGER DEFAULT 0,
deletions INTEGER DEFAULT 0,
files_changed JSONB DEFAULT '[]'
);
-- Project Plans
CREATE TABLE project_plans (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
project_id UUID NOT NULL UNIQUE REFERENCES projects(id) ON DELETE CASCADE,
name VARCHAR(255) NOT NULL,
description TEXT,
target_date DATE
);
-- Task Lists
CREATE TABLE task_lists (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
plan_id UUID NOT NULL REFERENCES project_plans(id) ON DELETE CASCADE,
name VARCHAR(255) NOT NULL,
list_order INTEGER DEFAULT 0,
category VARCHAR(100)
);
-- Tasks
CREATE TABLE tasks (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
list_id UUID NOT NULL REFERENCES task_lists(id) ON DELETE CASCADE,
title VARCHAR(500) NOT NULL,
description TEXT,
checked BOOLEAN DEFAULT FALSE,
status VARCHAR(50) DEFAULT 'pending'
CHECK (status IN ('pending', 'in_progress', 'review', 'blocked', 'done')),
complexity VARCHAR(10) CHECK (complexity IN ('S', 'M', 'L', 'XL')),
due_date DATE,
blocked_reason TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- LLM Sessions
CREATE TABLE llm_sessions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
project_id UUID NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
started_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
ended_at TIMESTAMP WITH TIME ZONE,
message_count INTEGER DEFAULT 0,
summary TEXT
);
-- Task-Commit Links
CREATE TABLE task_commit_links (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
task_id UUID NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
commit_sha VARCHAR(40) NOT NULL REFERENCES git_commits(sha) ON DELETE CASCADE,
confidence DECIMAL(3,2) DEFAULT 1.0 CHECK (confidence BETWEEN 0 AND 1),
link_type VARCHAR(20) DEFAULT 'inferred' CHECK (link_type IN ('explicit', 'inferred')),
evidence TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
UNIQUE(task_id, commit_sha)
);
-- Task-Session Links
CREATE TABLE task_session_links (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
task_id UUID NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
session_id UUID NOT NULL REFERENCES llm_sessions(id) ON DELETE CASCADE,
confidence DECIMAL(3,2) DEFAULT 1.0 CHECK (confidence BETWEEN 0 AND 1),
link_type VARCHAR(20) DEFAULT 'inferred' CHECK (link_type IN ('explicit', 'inferred')),
evidence TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
UNIQUE(task_id, session_id)
);
-- Indexes for performance
CREATE INDEX idx_tasks_list_id ON tasks(list_id);
CREATE INDEX idx_tasks_status ON tasks(status);
CREATE INDEX idx_tasks_checked ON tasks(checked);
CREATE INDEX idx_git_commits_repo_id ON git_commits(repo_id);
CREATE INDEX idx_git_commits_timestamp ON git_commits(timestamp DESC);
CREATE INDEX idx_llm_sessions_project_id ON llm_sessions(project_id);
CREATE INDEX idx_task_commit_links_task_id ON task_commit_links(task_id);
CREATE INDEX idx_task_session_links_task_id ON task_session_links(task_id);
5. API Designβ
5.1 REST API Endpointsβ
Dashboard Endpointsβ
GET /api/v1/dashboard
Returns: DashboardResponse
Query Params:
- project_id (optional): Filter to single project
- time_range: 'day' | 'week' | 'month' (default: 'week')
GET /api/v1/dashboard/portfolio
Returns: ProjectSummary[]
GET /api/v1/dashboard/activity
Returns: ActivityHighlight[]
Query Params:
- limit: number (default: 5, max: 20)
- project_id (optional)
GET /api/v1/dashboard/blockers
Returns: BlockedTask[]
Query Params:
- project_id (optional)
Project Endpointsβ
GET /api/v1/projects
Returns: Project[]
GET /api/v1/projects/{id}
Returns: Project with related entities
GET /api/v1/projects/{id}/kanban
Returns: KanbanBoard
GET /api/v1/projects/{id}/progress
Returns: ProgressMetrics
Task Endpointsβ
GET /api/v1/tasks/{id}
Returns: Task with linked sessions and commits
PATCH /api/v1/tasks/{id}
Body: { checked?, status?, title?, description? }
Returns: Task
GET /api/v1/tasks/{id}/evidence
Returns: { sessions: SessionLink[], commits: CommitLink[] }
5.2 WebSocket Eventsβ
Connection: ws://api/v1/ws/dashboard
Events (Server β Client):
- task.updated: { task_id, changes }
- task.completed: { task_id, project_id }
- task.blocked: { task_id, reason }
- commit.new: { commit, linked_tasks }
- session.ended: { session_id, linked_tasks }
- progress.changed: { project_id, new_progress }
Events (Client β Server):
- subscribe: { project_ids: string[] }
- unsubscribe: { project_ids: string[] }
5.3 Response DTOsβ
interface DashboardResponse {
portfolio_summary: ProjectSummary[];
selected_project?: {
project: Project;
kanban: KanbanBoard;
};
recent_activity: ActivityHighlight[];
blocked_tasks: BlockedTask[];
work_distribution: WorkDistribution[];
last_updated: string; // ISO timestamp
}
interface ProjectSummary {
project_id: string;
project_name: string;
progress_pct: number;
tasks_completed: number;
tasks_total: number;
commits_this_period: number;
sessions_this_period: number;
blocked_count: number;
has_blockers: boolean;
}
interface KanbanBoard {
columns: KanbanColumn[];
}
interface KanbanColumn {
status: TaskStatus;
label: string;
tasks: TaskCard[];
count: number;
}
interface TaskCard {
id: string;
title: string;
checked: boolean;
status: TaskStatus;
complexity?: string;
linked_commits_count: number;
linked_sessions_count: number;
days_in_status: number;
}
interface ActivityHighlight {
id: string;
type: 'task_completed' | 'commit' | 'session' | 'status_change' | 'blocked';
title: string;
subtitle?: string;
project_id: string;
project_name: string;
task_id?: string;
timestamp: string;
icon: 'check' | 'git' | 'chat' | 'alert';
}
interface BlockedTask {
task_id: string;
task_title: string;
project_id: string;
project_name: string;
task_list_name: string;
blocked_reason?: string;
days_blocked: number;
}
interface WorkDistribution {
project_id: string;
project_name: string;
percentage: number;
commit_count: number;
session_count: number;
tasks_completed: number;
}
6. Component Designβ
6.1 Frontend Componentsβ
| Component | Purpose | Props | State |
|---|---|---|---|
DashboardPage | Main container | - | selectedProject, timeRange |
ProjectSummaryBar | Portfolio overview | projects: ProjectSummary[] | - |
KanbanBoard | Task visualization | kanban: KanbanBoard | dragState |
TaskCard | Individual task | task: TaskCard | expanded |
ActivityFeed | Recent highlights | activities: ActivityHighlight[] | - |
BlockerPanel | Exception display | blockers: BlockedTask[] | - |
WorkDistributionChart | Effort breakdown | distribution: WorkDistribution[] | - |
6.2 Service Classesβ
class DashboardService:
"""Aggregates data for dashboard display"""
async def get_dashboard(
self,
project_id: Optional[str] = None,
time_range: str = 'week'
) -> DashboardResponse:
"""Get complete dashboard data"""
async def get_portfolio_summary(self) -> List[ProjectSummary]:
"""Get all projects with progress metrics"""
async def get_activity_feed(
self,
limit: int = 5,
project_id: Optional[str] = None
) -> List[ActivityHighlight]:
"""Get prioritized activity highlights"""
class LinkingService:
"""Links sessions and commits to tasks"""
async def link_commit_to_tasks(
self,
commit: GitCommit
) -> List[TaskLink]:
"""Find and create task links for a commit"""
async def link_session_to_tasks(
self,
session: LLMSession
) -> List[TaskLink]:
"""Find and create task links for a session"""
def calculate_link_confidence(
self,
source_text: str,
task: Task
) -> float:
"""Calculate confidence score for a potential link"""
class ProgressService:
"""Calculates progress metrics"""
async def calculate_project_progress(
self,
project_id: str
) -> ProgressMetrics:
"""Calculate progress from checkbox state"""
async def detect_blocked_tasks(
self,
project_id: Optional[str] = None
) -> List[BlockedTask]:
"""Find all tasks with status='blocked'"""
7. Security Considerationsβ
7.1 Authentication & Authorizationβ
- JWT-based authentication
- Project-level access control
- Role-based permissions (viewer, editor, admin)
7.2 Data Protectionβ
- All API endpoints require authentication
- Sensitive data encrypted at rest
- Audit logging for task modifications
7.3 Input Validationβ
- Schema validation on all API inputs
- SQL injection prevention via parameterized queries
- XSS prevention in frontend rendering
8. Performance Considerationsβ
8.1 Caching Strategyβ
| Data | Cache Duration | Invalidation |
|---|---|---|
| Portfolio summary | 1 minute | On task update |
| Kanban board | 30 seconds | On task update |
| Activity feed | 1 minute | On new activity |
| Work distribution | 5 minutes | On commit/session |
8.2 Query Optimizationβ
- Denormalized progress counters on project_plans
- Materialized view for activity feed
- Batch loading for linked entities
8.3 Scalabilityβ
- Horizontal scaling via stateless API servers
- Read replicas for dashboard queries
- Message queue for async linking operations
9. Deployment Architectureβ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β GCP DEPLOYMENT β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Cloud Load Balancer β β
β βββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββ β
β β β
β βββββββββββββββββββββΌββββββββββββββββββββ β
β βΌ βΌ βΌ β
β ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ β
β β Cloud Run β β Cloud Run β β Cloud Run β β
β β (API) β β (API) β β (API) β β
β ββββββββββ¬ββββββββββ ββββββββββ¬ββββββββββ ββββββββββ¬ββββββββββ β
β β β β β
β ββββββββββββββββββββββΌβββββββββββββββββββββ β
β β β
β βββββββββββββββββββββΌββββββββββββββββββββ β
β βΌ βΌ βΌ β
β ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ β
β β FoundationDB β β Memorystore β β Cloud Pub/Sub β β
β β (Primary DB) β β (Redis Cache) β β (Events) β β
β ββββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
10. Appendicesβ
10.1 Glossaryβ
| Term | Definition |
|---|---|
| Checkbox | Boolean flag indicating task completion |
| Linking | Process of associating sessions/commits with tasks |
| Portfolio | Collection of all user's projects |
| Blocker | Task with status='blocked' requiring attention |
10.2 Document Historyβ
| Version | Date | Author | Changes |
|---|---|---|---|
| 1.0 | 2025-11-27 | Architecture Team | Initial release |