# Generated by Django 5.2.16 on 2026-08-15 05:46 import django.db.models.deletion import uuid from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ('agents', '0001_initial'), ] operations = [ migrations.CreateModel( name='Project', fields=[ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('name', models.CharField(max_length=200)), ('project_type', models.CharField(default='WEB_APP', max_length=100)), ('goal', models.TextField()), ('repository_url', models.TextField(blank=True)), ('repository_path', models.TextField(blank=True)), ('status', models.CharField(choices=[('PLANNING', 'Planning'), ('READY', 'Ready'), ('ARCHAEOLOGY', 'Archaeology'), ('BUILDING', 'Building'), ('PAUSING', 'Pausing'), ('PAUSED', 'Paused'), ('BLOCKED', 'Blocked'), ('VERIFYING', 'Verifying'), ('FINISHED', 'Finished'), ('FAILED', 'Failed')], default='PLANNING', max_length=32)), ('current_plan_version', models.PositiveIntegerField(default=0)), ('architecture_summary', models.TextField(blank=True)), ('constraints', models.JSONField(blank=True, default=dict)), ('budget', models.JSONField(blank=True, default=dict)), ], options={ 'abstract': False, }, ), migrations.CreateModel( name='Milestone', fields=[ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('key', models.CharField(max_length=50)), ('title', models.CharField(max_length=200)), ('goal', models.TextField()), ('status', models.CharField(choices=[('QUEUED', 'Queued'), ('READY', 'Ready'), ('RUNNING', 'Running'), ('VERIFYING', 'Verifying'), ('COMPLETE', 'Complete'), ('BLOCKED', 'Blocked'), ('FAILED', 'Failed')], default='QUEUED', max_length=32)), ('verification_contract', models.JSONField(blank=True, default=dict)), ('order', models.PositiveIntegerField(default=0)), ('dependencies', models.ManyToManyField(blank=True, to='projects.milestone')), ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='milestones', to='projects.project')), ], options={ 'ordering': ['order', 'created_at'], }, ), migrations.CreateModel( name='Finding', fields=[ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('source', models.CharField(max_length=80)), ('finding_type', models.CharField(max_length=80)), ('severity', models.CharField(default='INFO', max_length=32)), ('title', models.CharField(max_length=255)), ('description', models.TextField(blank=True)), ('evidence', models.JSONField(blank=True, default=list)), ('status', models.CharField(default='OPEN', max_length=32)), ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='findings', to='projects.project')), ], options={ 'abstract': False, }, ), migrations.CreateModel( name='Feature', fields=[ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('title', models.CharField(max_length=200)), ('description', models.TextField(blank=True)), ('acceptance_criteria', models.JSONField(blank=True, default=list)), ('status', models.CharField(choices=[('QUEUED', 'Queued'), ('READY', 'Ready'), ('RUNNING', 'Running'), ('VERIFYING', 'Verifying'), ('COMPLETE', 'Complete'), ('BLOCKED', 'Blocked'), ('FAILED', 'Failed')], default='QUEUED', max_length=32)), ('milestone', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='features', to='projects.milestone')), ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='features', to='projects.project')), ], options={ 'abstract': False, }, ), migrations.CreateModel( name='Decision', fields=[ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('decision_type', models.CharField(max_length=80)), ('decision', models.TextField()), ('reason', models.TextField(blank=True)), ('evidence', models.JSONField(blank=True, default=list)), ('project_plan_version', models.PositiveIntegerField(default=0)), ('actor', models.CharField(max_length=120)), ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='decisions', to='projects.project')), ], options={ 'abstract': False, }, ), migrations.CreateModel( name='ProjectPlan', fields=[ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('version', models.PositiveIntegerField()), ('goal', models.TextField()), ('scope', models.TextField(blank=True)), ('stack', models.JSONField(blank=True, default=dict)), ('architecture', models.JSONField(blank=True, default=dict)), ('constraints', models.JSONField(blank=True, default=dict)), ('acceptance_criteria', models.JSONField(blank=True, default=list)), ('permissions', models.JSONField(blank=True, default=dict)), ('budget', models.JSONField(blank=True, default=dict)), ('open_decisions', models.JSONField(blank=True, default=list)), ('approved_at', models.DateTimeField(blank=True, null=True)), ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='plans', to='projects.project')), ], ), migrations.AddField( model_name='milestone', name='plan', field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='milestones', to='projects.projectplan'), ), migrations.CreateModel( name='RoadmapItem', fields=[ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('title', models.CharField(max_length=200)), ('description', models.TextField(blank=True)), ('source', models.CharField(default='user', max_length=80)), ('status', models.CharField(choices=[('INBOX', 'Inbox'), ('NOW', 'Now'), ('NEXT', 'Next'), ('LATER', 'Later'), ('EXPLORING', 'Exploring'), ('DECLINED', 'Declined'), ('DONE', 'Done')], default='INBOX', max_length=32)), ('priority', models.PositiveSmallIntegerField(default=50)), ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='roadmap_items', to='projects.project')), ], options={ 'abstract': False, }, ), migrations.CreateModel( name='Scenario', fields=[ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('name', models.CharField(max_length=200)), ('target_type', models.CharField(max_length=80)), ('target_id', models.CharField(max_length=120)), ('definition', models.JSONField(blank=True, default=dict)), ('status', models.CharField(default='DRAFT', max_length=32)), ('project', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='scenarios', to='projects.project')), ], options={ 'abstract': False, }, ), migrations.CreateModel( name='Task', fields=[ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('task_type', models.CharField(max_length=80)), ('status', models.CharField(choices=[('QUEUED', 'Queued'), ('READY', 'Ready'), ('RUNNING', 'Running'), ('WAITING_TOOL', 'Waiting Tool'), ('REVIEW', 'Review'), ('BLOCKED', 'Blocked'), ('FAILED', 'Failed'), ('COMPLETE', 'Complete')], default='QUEUED', max_length=32)), ('priority', models.PositiveSmallIntegerField(choices=[(10, 'Low'), (50, 'Normal'), (80, 'High'), (100, 'Critical')], default=50)), ('goal', models.TextField()), ('acceptance_criteria', models.JSONField(blank=True, default=list)), ('retry_count', models.PositiveIntegerField(default=0)), ('max_retries', models.PositiveIntegerField(default=2)), ('assigned_agent_version', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='tasks', to='agents.agentversion')), ('feature', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='tasks', to='projects.feature')), ('milestone', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='tasks', to='projects.milestone')), ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tasks', to='projects.project')), ], ), migrations.CreateModel( name='Artifact', fields=[ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('artifact_type', models.CharField(max_length=80)), ('name', models.CharField(max_length=255)), ('uri', models.TextField(blank=True)), ('content', models.JSONField(blank=True, default=dict)), ('generated_by', models.CharField(blank=True, max_length=120)), ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='artifacts', to='projects.project')), ('task', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='artifacts', to='projects.task')), ], options={ 'abstract': False, }, ), migrations.CreateModel( name='Action', fields=[ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('action_type', models.CharField(max_length=80)), ('status', models.CharField(default='PENDING', max_length=32)), ('contract', models.JSONField(blank=True, default=dict)), ('result', models.JSONField(blank=True, default=dict)), ('started_at', models.DateTimeField(blank=True, null=True)), ('finished_at', models.DateTimeField(blank=True, null=True)), ('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='actions', to='projects.task')), ], options={ 'abstract': False, }, ), migrations.CreateModel( name='TaskDependency', fields=[ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('depends_on', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='dependent_edges', to='projects.task')), ('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='dependency_edges', to='projects.task')), ], ), migrations.CreateModel( name='Worktree', fields=[ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('repository_path', models.TextField()), ('worktree_path', models.TextField()), ('branch_name', models.CharField(max_length=255)), ('base_ref', models.CharField(default='main', max_length=255)), ('status', models.CharField(default='ACTIVE', max_length=32)), ('task', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='worktree', to='projects.task')), ], options={ 'abstract': False, }, ), migrations.CreateModel( name='CommitRecord', fields=[ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('sha', models.CharField(max_length=64)), ('branch_name', models.CharField(max_length=255)), ('message', models.TextField()), ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='commits', to='projects.project')), ('task', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='commits', to='projects.task')), ('worktree', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='commits', to='projects.worktree')), ], options={ 'abstract': False, }, ), migrations.AddConstraint( model_name='projectplan', constraint=models.UniqueConstraint(fields=('project', 'version'), name='unique_plan_version'), ), migrations.AddConstraint( model_name='milestone', constraint=models.UniqueConstraint(fields=('project', 'key'), name='unique_milestone_key'), ), migrations.AddIndex( model_name='task', index=models.Index(fields=['project', 'status', 'priority'], name='projects_ta_project_423b1c_idx'), ), migrations.AddConstraint( model_name='taskdependency', constraint=models.UniqueConstraint(fields=('task', 'depends_on'), name='unique_task_dependency'), ), ]