grokking simplicity and refactoring

This commit is contained in:
Geir Okkenhaug Jerstad 2025-06-16 13:43:21 +02:00
parent 89a7fe100d
commit fb4361d938
67 changed files with 6275 additions and 56 deletions

View file

@ -0,0 +1,979 @@
# RAG + MCP + TaskMaster Domain Model & Event Architecture
## Executive Summary
This document defines the domain model and event architecture for the RAG + MCP + TaskMaster implementation roadmap. It provides a structured approach to managing the complex integration of retrieval-augmented generation, model context protocol, and task management systems within the home lab environment.
**Purpose**: Enable systematic tracking, state management, and event-driven coordination across all implementation phases.
## Table of Contents
1. [Domain Model Overview](#domain-model-overview)
2. [Core Entities](#core-entities)
3. [Event Model](#event-model)
4. [State Machines](#state-machines)
5. [Integration Events](#integration-events)
6. [Implementation Schema](#implementation-schema)
7. [Event Sourcing Pattern](#event-sourcing-pattern)
## Domain Model Overview
### Bounded Contexts
```mermaid
graph TB
subgraph "Project Management Context"
A[Project] --> B[Phase]
B --> C[Task]
C --> D[Deliverable]
end
subgraph "Infrastructure Context"
E[Service] --> F[Deployment]
F --> G[Configuration]
G --> H[Environment]
end
subgraph "AI Integration Context"
I[RAG System] --> J[Vector Store]
I --> K[MCP Server]
K --> L[AI Assistant]
end
subgraph "Knowledge Context"
M[Document] --> N[Embedding]
M --> O[Index]
O --> P[Query]
end
```
### Core Domain Relationships
```mermaid
erDiagram
PROJECT ||--o{ PHASE : contains
PHASE ||--o{ TASK : contains
TASK ||--o{ DELIVERABLE : produces
TASK ||--o{ DEPENDENCY : depends_on
SERVICE ||--o{ DEPLOYMENT : deployed_as
DEPLOYMENT ||--o{ CONFIGURATION : configured_by
ENVIRONMENT ||--o{ SERVICE : hosts
RAG_SYSTEM ||--o{ VECTOR_STORE : uses
RAG_SYSTEM ||--o{ MCP_SERVER : exposes_via
MCP_SERVER ||--o{ AI_ASSISTANT : serves
DOCUMENT ||--o{ EMBEDDING : generates
DOCUMENT ||--o{ INDEX_ENTRY : indexed_as
QUERY ||--o{ RETRIEVAL_RESULT : produces
```
## Core Entities
### Project Management Domain
#### Project Aggregate
```typescript
interface Project {
id: ProjectId;
name: string;
description: string;
status: ProjectStatus;
phases: Phase[];
startDate: Date;
targetCompletionDate: Date;
actualCompletionDate?: Date;
resources: ResourceRequirement[];
risks: Risk[];
metadata: ProjectMetadata;
}
enum ProjectStatus {
PLANNED = "planned",
IN_PROGRESS = "in_progress",
PAUSED = "paused",
COMPLETED = "completed",
CANCELLED = "cancelled"
}
interface ProjectMetadata {
priority: Priority;
complexity: Complexity;
impact: Impact;
dependencies: ExternalDependency[];
}
```
#### Phase Entity
```typescript
interface Phase {
id: PhaseId;
projectId: ProjectId;
name: string;
description: string;
status: PhaseStatus;
objective: string;
tasks: Task[];
deliverables: Deliverable[];
duration: Duration;
dependencies: PhaseDependency[];
successCriteria: SuccessCriterion[];
}
enum PhaseStatus {
PENDING = "pending",
IN_PROGRESS = "in_progress",
COMPLETED = "completed",
BLOCKED = "blocked",
DEFERRED = "deferred"
}
```
#### Task Entity
```typescript
interface Task {
id: TaskId;
phaseId: PhaseId;
name: string;
description: string;
status: TaskStatus;
assignee?: UserId;
estimatedEffort: Duration;
actualEffort?: Duration;
dependencies: TaskDependency[];
deliverables: Deliverable[];
implementation: Implementation;
validation: ValidationCriteria;
}
enum TaskStatus {
TODO = "todo",
IN_PROGRESS = "in_progress",
TESTING = "testing",
REVIEW = "review",
DONE = "done",
BLOCKED = "blocked"
}
```
### Infrastructure Domain
#### Service Aggregate
```typescript
interface Service {
id: ServiceId;
name: string;
type: ServiceType;
status: ServiceStatus;
deployments: Deployment[];
configuration: ServiceConfiguration;
dependencies: ServiceDependency[];
healthChecks: HealthCheck[];
metrics: ServiceMetrics;
}
enum ServiceType {
RAG_CORE = "rag_core",
MCP_SERVER = "mcp_server",
TASK_MASTER = "task_master",
VECTOR_DB = "vector_db",
LLM_GATEWAY = "llm_gateway"
}
enum ServiceStatus {
PLANNED = "planned",
DEVELOPING = "developing",
TESTING = "testing",
DEPLOYED = "deployed",
RUNNING = "running",
DEGRADED = "degraded",
DOWN = "down"
}
```
#### Deployment Entity
```typescript
interface Deployment {
id: DeploymentId;
serviceId: ServiceId;
version: Version;
environment: Environment;
status: DeploymentStatus;
configuration: DeploymentConfiguration;
timestamp: Date;
rollbackConfiguration?: DeploymentConfiguration;
}
enum DeploymentStatus {
PENDING = "pending",
IN_PROGRESS = "in_progress",
SUCCESSFUL = "successful",
FAILED = "failed",
ROLLED_BACK = "rolled_back"
}
```
### AI Integration Domain
#### RAG System Aggregate
```typescript
interface RAGSystem {
id: RAGSystemId;
name: string;
status: RAGSystemStatus;
vectorStore: VectorStore;
embeddingModel: EmbeddingModel;
retrievalConfiguration: RetrievalConfiguration;
generationConfiguration: GenerationConfiguration;
documents: DocumentIndex;
queries: QueryHistory[];
performance: PerformanceMetrics;
}
enum RAGSystemStatus {
INITIALIZING = "initializing",
INDEXING = "indexing",
READY = "ready",
QUERYING = "querying",
MAINTENANCE = "maintenance",
ERROR = "error"
}
```
#### MCP Server Entity
```typescript
interface MCPServer {
id: MCPServerId;
name: string;
status: MCPServerStatus;
protocol: MCPProtocol;
tools: MCPTool[];
resources: MCPResource[];
clients: MCPClient[];
capabilities: MCPCapability[];
integration: IntegrationConfiguration;
}
enum MCPServerStatus {
STOPPED = "stopped",
STARTING = "starting",
RUNNING = "running",
ERROR = "error",
RESTARTING = "restarting"
}
```
### Knowledge Domain
#### Document Entity
```typescript
interface Document {
id: DocumentId;
path: string;
content: string;
metadata: DocumentMetadata;
embeddings: Embedding[];
indexStatus: IndexStatus;
lastModified: Date;
processingHistory: ProcessingEvent[];
}
interface DocumentMetadata {
title: string;
type: DocumentType;
tags: Tag[];
source: DocumentSource;
format: DocumentFormat;
size: number;
}
enum IndexStatus {
PENDING = "pending",
PROCESSING = "processing",
INDEXED = "indexed",
ERROR = "error",
STALE = "stale"
}
```
## Event Model
### Project Management Events
#### Project Events
```typescript
// Project Lifecycle Events
interface ProjectCreated {
type: "project.created";
projectId: ProjectId;
name: string;
description: string;
phases: PhaseDefinition[];
timestamp: Date;
}
interface ProjectStarted {
type: "project.started";
projectId: ProjectId;
startDate: Date;
timestamp: Date;
}
interface ProjectCompleted {
type: "project.completed";
projectId: ProjectId;
completionDate: Date;
finalStatus: ProjectStatus;
deliverables: Deliverable[];
timestamp: Date;
}
interface ProjectStatusChanged {
type: "project.status_changed";
projectId: ProjectId;
previousStatus: ProjectStatus;
newStatus: ProjectStatus;
reason: string;
timestamp: Date;
}
```
#### Phase Events
```typescript
interface PhaseStarted {
type: "phase.started";
phaseId: PhaseId;
projectId: ProjectId;
plannedDuration: Duration;
timestamp: Date;
}
interface PhaseCompleted {
type: "phase.completed";
phaseId: PhaseId;
projectId: ProjectId;
actualDuration: Duration;
deliverables: Deliverable[];
successCriteriaMet: boolean;
timestamp: Date;
}
interface PhaseBlocked {
type: "phase.blocked";
phaseId: PhaseId;
projectId: ProjectId;
blockingIssue: BlockingIssue;
estimatedDelay: Duration;
timestamp: Date;
}
```
#### Task Events
```typescript
interface TaskCreated {
type: "task.created";
taskId: TaskId;
phaseId: PhaseId;
name: string;
description: string;
estimatedEffort: Duration;
dependencies: TaskDependency[];
timestamp: Date;
}
interface TaskStarted {
type: "task.started";
taskId: TaskId;
assignee: UserId;
startDate: Date;
timestamp: Date;
}
interface TaskCompleted {
type: "task.completed";
taskId: TaskId;
completionDate: Date;
actualEffort: Duration;
deliverables: Deliverable[];
timestamp: Date;
}
interface TaskStatusChanged {
type: "task.status_changed";
taskId: TaskId;
previousStatus: TaskStatus;
newStatus: TaskStatus;
reason: string;
timestamp: Date;
}
```
### Infrastructure Events
#### Service Events
```typescript
interface ServiceDeploymentStarted {
type: "service.deployment_started";
serviceId: ServiceId;
deploymentId: DeploymentId;
version: Version;
environment: Environment;
timestamp: Date;
}
interface ServiceDeploymentCompleted {
type: "service.deployment_completed";
serviceId: ServiceId;
deploymentId: DeploymentId;
status: DeploymentStatus;
healthCheckResults: HealthCheckResult[];
timestamp: Date;
}
interface ServiceHealthChanged {
type: "service.health_changed";
serviceId: ServiceId;
previousStatus: ServiceStatus;
newStatus: ServiceStatus;
healthMetrics: HealthMetrics;
timestamp: Date;
}
interface ServiceConfigurationUpdated {
type: "service.configuration_updated";
serviceId: ServiceId;
previousConfiguration: ServiceConfiguration;
newConfiguration: ServiceConfiguration;
changeReason: string;
timestamp: Date;
}
```
### AI Integration Events
#### RAG System Events
```typescript
interface RAGSystemInitialized {
type: "rag.system_initialized";
ragSystemId: RAGSystemId;
configuration: RAGConfiguration;
vectorStoreId: VectorStoreId;
embeddingModelId: EmbeddingModelId;
timestamp: Date;
}
interface DocumentIndexingStarted {
type: "rag.indexing_started";
ragSystemId: RAGSystemId;
batchId: BatchId;
documentCount: number;
estimatedDuration: Duration;
timestamp: Date;
}
interface DocumentIndexingCompleted {
type: "rag.indexing_completed";
ragSystemId: RAGSystemId;
batchId: BatchId;
processedDocuments: number;
successfulIndexes: number;
errors: IndexingError[];
actualDuration: Duration;
timestamp: Date;
}
interface QueryExecuted {
type: "rag.query_executed";
ragSystemId: RAGSystemId;
queryId: QueryId;
query: string;
retrievedDocuments: number;
responseTime: Duration;
relevanceScore: number;
timestamp: Date;
}
```
#### MCP Integration Events
```typescript
interface MCPServerStarted {
type: "mcp.server_started";
mcpServerId: MCPServerId;
protocol: MCPProtocol;
availableTools: MCPTool[];
availableResources: MCPResource[];
timestamp: Date;
}
interface MCPClientConnected {
type: "mcp.client_connected";
mcpServerId: MCPServerId;
clientId: MCPClientId;
clientType: MCPClientType;
capabilities: MCPCapability[];
timestamp: Date;
}
interface MCPToolInvoked {
type: "mcp.tool_invoked";
mcpServerId: MCPServerId;
clientId: MCPClientId;
toolName: string;
parameters: ToolParameters;
executionTime: Duration;
success: boolean;
timestamp: Date;
}
interface MCPResourceAccessed {
type: "mcp.resource_accessed";
mcpServerId: MCPServerId;
clientId: MCPClientId;
resourceUri: string;
accessType: AccessType;
responseSize: number;
timestamp: Date;
}
```
## State Machines
### Project State Machine
```mermaid
stateDiagram-v2
[*] --> Planned
Planned --> InProgress : project.started
InProgress --> Paused : project.paused
InProgress --> Completed : project.completed
InProgress --> Cancelled : project.cancelled
Paused --> InProgress : project.resumed
Paused --> Cancelled : project.cancelled
Completed --> [*]
Cancelled --> [*]
state InProgress {
[*] --> PhaseExecution
PhaseExecution --> PhaseCompleted : phase.completed
PhaseCompleted --> PhaseExecution : next_phase
PhaseCompleted --> [*] : all_phases_complete
}
```
### Service State Machine
```mermaid
stateDiagram-v2
[*] --> Planned
Planned --> Developing : development.started
Developing --> Testing : development.completed
Testing --> Deployed : tests.passed
Testing --> Developing : tests.failed
Deployed --> Running : deployment.successful
Deployed --> Developing : deployment.failed
Running --> Degraded : health.degraded
Running --> Down : health.failed
Degraded --> Running : health.recovered
Degraded --> Down : health.failed
Down --> Running : service.restarted
Down --> Deployed : rollback.triggered
```
### RAG System State Machine
```mermaid
stateDiagram-v2
[*] --> Initializing
Initializing --> Indexing : initialization.completed
Initializing --> Error : initialization.failed
Indexing --> Ready : indexing.completed
Indexing --> Error : indexing.failed
Ready --> Querying : query.received
Ready --> Maintenance : maintenance.started
Ready --> Indexing : reindex.triggered
Querying --> Ready : query.completed
Querying --> Error : query.failed
Maintenance --> Ready : maintenance.completed
Maintenance --> Error : maintenance.failed
Error --> Initializing : system.reset
Error --> Maintenance : error.diagnosed
```
## Integration Events
### Cross-System Coordination Events
```typescript
// Project-Infrastructure Integration
interface InfrastructureRequirementIdentified {
type: "integration.infrastructure_requirement";
projectId: ProjectId;
phaseId: PhaseId;
requiredServices: ServiceRequirement[];
targetEnvironment: Environment;
deadline: Date;
timestamp: Date;
}
interface ServiceProvisionedForProject {
type: "integration.service_provisioned";
projectId: ProjectId;
serviceId: ServiceId;
environment: Environment;
endpoints: ServiceEndpoint[];
timestamp: Date;
}
// RAG-MCP Integration
interface RAGSystemConnectedToMCP {
type: "integration.rag_mcp_connected";
ragSystemId: RAGSystemId;
mcpServerId: MCPServerId;
availableTools: string[];
availableResources: string[];
timestamp: Date;
}
interface KnowledgeUpdatedInRAG {
type: "integration.knowledge_updated";
ragSystemId: RAGSystemId;
updatedDocuments: DocumentId[];
affectedQueries: QueryId[];
reindexRequired: boolean;
timestamp: Date;
}
// Task Master Integration
interface TaskMasterProjectSynced {
type: "integration.taskmaster_synced";
projectId: ProjectId;
taskMasterId: TaskMasterId;
syncedTasks: TaskId[];
syncedDeliverables: DeliverableId[];
timestamp: Date;
}
interface AIRecommendationGenerated {
type: "integration.ai_recommendation";
sourceSystem: SystemId;
targetEntity: EntityId;
recommendationType: RecommendationType;
recommendation: Recommendation;
confidence: number;
timestamp: Date;
}
```
## Implementation Schema
### Event Store Schema
```sql
-- Event Store Table
CREATE TABLE event_store (
id SERIAL PRIMARY KEY,
aggregate_id UUID NOT NULL,
aggregate_type VARCHAR(50) NOT NULL,
event_type VARCHAR(100) NOT NULL,
event_data JSONB NOT NULL,
event_metadata JSONB,
version INTEGER NOT NULL,
timestamp TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
correlation_id UUID,
causation_id UUID,
CONSTRAINT unique_aggregate_version UNIQUE (aggregate_id, version)
);
-- Projection Tables
CREATE TABLE project_projections (
id UUID PRIMARY KEY,
name VARCHAR(255) NOT NULL,
status VARCHAR(20) NOT NULL,
current_phase_id UUID,
progress_percentage DECIMAL(5,2),
start_date DATE,
target_completion_date DATE,
actual_completion_date DATE,
last_updated TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE TABLE service_projections (
id UUID PRIMARY KEY,
name VARCHAR(100) NOT NULL,
type VARCHAR(50) NOT NULL,
status VARCHAR(20) NOT NULL,
environment VARCHAR(20) NOT NULL,
current_version VARCHAR(20),
health_status VARCHAR(20),
last_deployment TIMESTAMP WITH TIME ZONE,
last_updated TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE TABLE rag_system_projections (
id UUID PRIMARY KEY,
name VARCHAR(100) NOT NULL,
status VARCHAR(20) NOT NULL,
indexed_documents INTEGER DEFAULT 0,
last_indexing TIMESTAMP WITH TIME ZONE,
query_count INTEGER DEFAULT 0,
average_response_time_ms INTEGER,
last_updated TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
```
### Event Handler Framework
```typescript
// Event Handler Interface
interface EventHandler<T extends DomainEvent> {
handle(event: T): Promise<void>;
getEventType(): string;
}
// Example Event Handlers
class ProjectStatusChangedHandler implements EventHandler<ProjectStatusChanged> {
async handle(event: ProjectStatusChanged): Promise<void> {
// Update read model projections
await this.updateProjectProjection(event);
// Trigger downstream events if needed
if (event.newStatus === ProjectStatus.COMPLETED) {
await this.publishProjectCompletedIntegrationEvent(event);
}
// Send notifications
await this.notifyStakeholders(event);
}
getEventType(): string {
return "project.status_changed";
}
}
class RAGIndexingCompletedHandler implements EventHandler<DocumentIndexingCompleted> {
async handle(event: DocumentIndexingCompleted): Promise<void> {
// Update RAG system projection
await this.updateRAGProjection(event);
// Notify MCP server of updated knowledge
await this.notifyMCPServer(event);
// Update project progress if this was part of a project task
await this.updateRelatedProjectProgress(event);
}
getEventType(): string {
return "rag.indexing_completed";
}
}
```
## Event Sourcing Pattern
### Command Handlers
```typescript
// Command Interface
interface Command {
aggregateId: string;
expectedVersion: number;
}
// Example Commands
interface StartProject extends Command {
type: "start_project";
name: string;
description: string;
phases: PhaseDefinition[];
}
interface DeployService extends Command {
type: "deploy_service";
serviceId: ServiceId;
version: Version;
environment: Environment;
configuration: DeploymentConfiguration;
}
interface IndexDocuments extends Command {
type: "index_documents";
ragSystemId: RAGSystemId;
documents: Document[];
batchSize: number;
}
// Command Handlers
class ProjectCommandHandler {
async handle(command: StartProject): Promise<ProjectCreated[]> {
// Load existing events for aggregate
const existingEvents = await this.eventStore.getEvents(command.aggregateId);
// Reconstruct aggregate state
const project = Project.fromEvents(existingEvents);
// Execute business logic
const newEvents = project.start(command);
// Save events
await this.eventStore.saveEvents(
command.aggregateId,
newEvents,
command.expectedVersion
);
return newEvents;
}
}
```
### Aggregate Root Pattern
```typescript
class Project {
private events: DomainEvent[] = [];
constructor(
public readonly id: ProjectId,
public status: ProjectStatus = ProjectStatus.PLANNED,
public phases: Phase[] = []
) {}
static fromEvents(events: DomainEvent[]): Project {
const project = new Project(events[0].aggregateId);
events.forEach(event => {
project.apply(event);
});
return project;
}
start(command: StartProject): DomainEvent[] {
if (this.status !== ProjectStatus.PLANNED) {
throw new Error("Project must be in planned status to start");
}
const event = new ProjectStarted({
projectId: this.id,
startDate: new Date(),
timestamp: new Date()
});
this.applyAndTrack(event);
return this.getUncommittedEvents();
}
private apply(event: DomainEvent): void {
switch (event.type) {
case "project.created":
this.applyProjectCreated(event as ProjectCreated);
break;
case "project.started":
this.applyProjectStarted(event as ProjectStarted);
break;
// ... other event handlers
}
}
private applyProjectStarted(event: ProjectStarted): void {
this.status = ProjectStatus.IN_PROGRESS;
}
private applyAndTrack(event: DomainEvent): void {
this.apply(event);
this.events.push(event);
}
getUncommittedEvents(): DomainEvent[] {
return [...this.events];
}
markEventsAsCommitted(): void {
this.events = [];
}
}
```
## Usage Examples
### Tracking Project Progress
```typescript
// Query current project status
const projectStatus = await projectRepository.getProjectStatus(projectId);
// Get detailed phase breakdown
const phaseProgress = await phaseRepository.getPhaseProgress(projectId);
// Generate project dashboard data
const dashboardData = {
overall: projectStatus,
phases: phaseProgress,
recentEvents: await eventStore.getRecentEvents(projectId, 10),
upcomingMilestones: await milestoneRepository.getUpcoming(projectId)
};
```
### Monitoring System Health
```typescript
// Real-time service monitoring
const serviceHealth = await serviceRepository.getServiceHealth();
// Check deployment status
const deploymentStatus = await deploymentRepository.getCurrentDeployments();
// RAG system performance metrics
const ragMetrics = await ragRepository.getPerformanceMetrics();
// Generate operations dashboard
const opsData = {
services: serviceHealth,
deployments: deploymentStatus,
rag: ragMetrics,
alerts: await alertRepository.getActiveAlerts()
};
```
### Event-Driven Automation
```typescript
// Automatic service provisioning when project phase starts
class PhaseStartedHandler implements EventHandler<PhaseStarted> {
async handle(event: PhaseStarted): Promise<void> {
const phase = await phaseRepository.getById(event.phaseId);
// Check if this phase requires new infrastructure
const infraRequirements = phase.getInfrastructureRequirements();
for (const requirement of infraRequirements) {
// Trigger service provisioning
await this.commandBus.send(new ProvisionService({
serviceType: requirement.serviceType,
environment: requirement.environment,
configuration: requirement.configuration,
projectId: event.projectId,
phaseId: event.phaseId
}));
}
}
}
```
This domain model and event architecture provides a robust foundation for managing the complex RAG + MCP + TaskMaster implementation, enabling clear tracking of progress, automated coordination between systems, and comprehensive monitoring of the entire ecosystem.

File diff suppressed because it is too large Load diff