generator client { provider = "prisma-client-js" } datasource db { provider = "mysql" url = env("DATABASE_URL") } model Pipeline { id String @id @db.VarChar(26) // ULID projectName String @db.VarChar(255) requirements String @db.Text currentState String @db.VarChar(50) @default("idle") contextJson String @db.LongText createdAt DateTime @default(now()) updatedAt DateTime @updatedAt transitions StateTransition[] actorSpawns ActorSpawn[] contracts Contract[] escalations Escalation[] subTasks SubTask[] @@index([currentState]) @@index([createdAt]) @@map("pipelines") } model StateTransition { id Int @id @default(autoincrement()) pipelineId String @db.VarChar(26) fromState String @db.VarChar(50) toState String @db.VarChar(50) eventType String @db.VarChar(50) eventPayload String @db.LongText timestamp DateTime @default(now()) pipeline Pipeline @relation(fields: [pipelineId], references: [id], onDelete: Cascade) @@index([pipelineId, timestamp]) @@index([eventType]) @@map("state_transitions") } model ActorSpawn { id Int @id @default(autoincrement()) pipelineId String @db.VarChar(26) actorName String @db.VarChar(100) stage String @db.VarChar(50) spawnedAt DateTime @default(now()) exitCode Int? exitedAt DateTime? resultJson String? @db.LongText pipeline Pipeline @relation(fields: [pipelineId], references: [id], onDelete: Cascade) @@index([pipelineId, spawnedAt]) @@map("actor_spawns") } model Contract { id String @id @db.VarChar(26) // ULID pipelineId String @db.VarChar(26) sprintId String @db.VarChar(100) version String @db.VarChar(20) @default("v1") bodyJson String @db.LongText frozenAt DateTime? createdAt DateTime @default(now()) pipeline Pipeline @relation(fields: [pipelineId], references: [id], onDelete: Cascade) @@index([pipelineId]) @@index([sprintId]) @@map("contracts") } model SubTask { id String @id @db.VarChar(26) pipelineId String @db.VarChar(26) parentId String? @db.VarChar(26) role String @db.VarChar(30) agentName String @db.VarChar(50) title String @db.VarChar(500) description String @db.Text state String @db.VarChar(30) @default("queued") complexityScore Int? complexityTier String? @db.VarChar(20) model String @db.VarChar(50) @default("") resultJson String? @db.LongText errorReason String? @db.Text startedAt DateTime? completedAt DateTime? createdAt DateTime @default(now()) pipeline Pipeline @relation(fields: [pipelineId], references: [id], onDelete: Cascade) parent SubTask? @relation("SubTaskHierarchy", fields: [parentId], references: [id], onDelete: NoAction, onUpdate: NoAction) children SubTask[] @relation("SubTaskHierarchy") events SubTaskEvent[] @@index([pipelineId, parentId]) @@index([state]) @@index([agentName, state]) @@map("sub_tasks") } model SubTaskEvent { id Int @id @default(autoincrement()) subTaskId String @db.VarChar(26) eventType String @db.VarChar(50) payloadJson String @db.LongText timestamp DateTime @default(now()) subTask SubTask @relation(fields: [subTaskId], references: [id], onDelete: Cascade) @@index([subTaskId, timestamp]) @@index([eventType]) @@map("sub_task_events") } model Escalation { id String @id @db.VarChar(26) // ULID pipelineId String @db.VarChar(26) reason String @db.VarChar(500) errorCategory String @db.VarChar(50) stage String @db.VarChar(50) @default("") attempts Int @default(0) contextSnapshot String @db.LongText resolvedAt DateTime? resolution String? @db.VarChar(50) createdAt DateTime @default(now()) pipeline Pipeline @relation(fields: [pipelineId], references: [id], onDelete: Cascade) @@index([pipelineId]) @@index([createdAt]) @@map("escalations") }