priv/repo/migrations/20260821082652_create_scv_runs.exs

58e6347eeb72 · 3 KB

defmodule OpenAgents.Repo.Migrations.CreateScvRuns do
  use Ecto.Migration

  def change do
    create table(:scv_runs, primary_key: false) do
      add :id, :uuid, primary_key: true

      add :driver_account_id,
          references(:scv_driver_accounts, type: :uuid, on_delete: :restrict),
          null: false

      add :issue_id, references(:issues, on_delete: :nilify_all)
      add :driver, :string, null: false
      add :principal, :string, null: false
      add :repository_revision, :string, null: false
      add :objective, :text, null: false
      add :permission_profile, :string, null: false
      add :model, :string, null: false
      add :reasoning_effort, :string, null: false
      add :status, :string, null: false
      add :owner_node, :string, null: false
      add :generation, :bigint, null: false
      add :lease_expires_at, :utc_datetime_usec, null: false
      add :driver_thread_id, :string
      add :driver_turn_id, :string
      add :report, :text
      add :report_digest, :string
      add :event_count, :integer, null: false, default: 0
      add :usage, :map
      add :resources, :map
      add :error_code, :string
      add :started_at, :utc_datetime_usec, null: false
      add :completed_at, :utc_datetime_usec

      timestamps(type: :utc_datetime_usec)
    end

    create index(:scv_runs, [:issue_id, :inserted_at])
    create index(:scv_runs, [:status, :lease_expires_at])

    create unique_index(:scv_runs, [:driver_account_id],
             where: "status = 'running'",
             name: :scv_runs_one_active_account_index
           )

    create unique_index(:scv_runs, [:driver_account_id, :generation])

    create constraint(:scv_runs, :scv_runs_driver_check, check: "driver IN ('codex_app_server')")

    create constraint(:scv_runs, :scv_runs_permission_profile_check,
             check: "permission_profile IN ('read_only')"
           )

    create constraint(:scv_runs, :scv_runs_reasoning_effort_check,
             check: "reasoning_effort IN ('none', 'low')"
           )

    create constraint(:scv_runs, :scv_runs_status_check,
             check: "status IN ('running', 'succeeded', 'failed', 'cancelled', 'uncertain')"
           )

    create constraint(:scv_runs, :scv_runs_repository_revision_check,
             check: "repository_revision ~ '^[0-9a-f]{40}$'"
           )

    create constraint(:scv_runs, :scv_runs_objective_bound_check,
             check: "octet_length(objective) BETWEEN 1 AND 32768"
           )

    create constraint(:scv_runs, :scv_runs_report_bound_check,
             check: "report IS NULL OR octet_length(report) BETWEEN 1 AND 32768"
           )

    create table(:scv_run_events) do
      add :run_id, references(:scv_runs, type: :uuid, on_delete: :delete_all), null: false
      add :schema, :string, null: false
      add :event_type, :string, null: false
      add :payload, :map, null: false
      add :emitted_at, :utc_datetime_usec, null: false
      timestamps(type: :utc_datetime_usec, updated_at: false)
    end

    create index(:scv_run_events, [:run_id, :id])

    create constraint(:scv_run_events, :scv_run_events_schema_check,
             check: "schema = 'openagents.scv.event.v1'"
           )

    create constraint(:scv_run_events, :scv_run_events_payload_bound_check,
             check: "octet_length(payload::text) BETWEEN 2 AND 16384"
           )
  end
end