Publish curated ITWorx-ModelForge source from 990401737f96c8d46a9f7b0d84994516cadcb6a0

This commit is contained in:
Public Source Publisher committed 2026-09-30 09:23:17 +00:00
1 parent 7082ab955a
commit 848f0d8f8a
434 files changed
+67298 -4315

No files matched your search

@@ -19,6 +19,49 @@ def upgrade() -> None:
# The declarative metadata is the reviewed M0 schema contract. create_all is
# used only from this baseline migration; later changes require explicit ops.
Base.metadata.create_all(bind=op.get_bind(), checkfirst=False)
# BenchmarkRun was part of M0. The evolving metadata also contains RC-LAB-02's later
# capability-target, actor/idempotency and environment fields, so rebuild its original
# shape here; migration 0039 adds those fields at the correct historical boundary.
op.drop_table("benchmark_runs")
op.create_table(
"benchmark_runs",
sa.Column("id", sa.Uuid(), nullable=False),
sa.Column("deployment_id", sa.Uuid(), nullable=False),
sa.Column("suite_id", sa.Uuid(), nullable=False),
sa.Column("model_revision_sha", sa.String(length=64), nullable=False),
sa.Column("artifact_sha256", sa.String(length=64), nullable=False),
sa.Column("runtime_type", sa.String(length=32), nullable=False),
sa.Column("runtime_version", sa.String(length=128), nullable=False),
sa.Column("runtime_image_digest", sa.String(length=71), nullable=True),
sa.Column("launch_arguments", sa.JSON(), nullable=False),
sa.Column("suite_revision", sa.String(length=128), nullable=False),
sa.Column("dataset_revision", sa.String(length=255), nullable=False),
sa.Column("environment_fingerprint", sa.JSON(), nullable=False),
sa.Column("environment_digest", sa.String(length=64), nullable=False),
sa.Column("seed", sa.Integer(), nullable=True),
sa.Column("results", sa.JSON(), nullable=False),
sa.Column("status", sa.String(length=32), nullable=False),
sa.Column("comparable", sa.Boolean(), nullable=False),
sa.Column("stale_reason", sa.Text(), nullable=True),
sa.Column("started_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("completed_at", sa.DateTime(timezone=True), nullable=True),
sa.ForeignKeyConstraint(["deployment_id"], ["deployments.id"], ondelete="RESTRICT"),
sa.ForeignKeyConstraint(["suite_id"], ["benchmark_suites.id"], ondelete="RESTRICT"),
sa.PrimaryKeyConstraint("id"),
)
op.create_index("ix_benchmark_runs_deployment_id", "benchmark_runs", ["deployment_id"])
op.create_index("ix_benchmark_runs_suite_id", "benchmark_runs", ["suite_id"])
op.create_index("ix_benchmark_runs_artifact_sha256", "benchmark_runs", ["artifact_sha256"])
op.create_index(
"ix_benchmark_runs_environment_digest", "benchmark_runs", ["environment_digest"]
)
op.create_index(
"ix_benchmark_runs_deployment_completed",
"benchmark_runs",
["deployment_id", "completed_at"],
)
op.drop_constraint("ck_capability_serving_generation", "capability_contracts", type_="check")
op.drop_column("capability_contracts", "serving_generation")
# Freeze the original M0 shape even though the declarative metadata evolves.
# Remove newer foreign-key columns before dropping the tables they target.
for column in (
@@ -36,6 +79,27 @@ def upgrade() -> None:
# Later milestone tables are present in the evolving declarative metadata
# used to build this baseline. Drop dependants before their M5/M0 targets
# so a fresh upgrade still reconstructs each historical revision exactly.
"model_change_cases",
"selected_model_comparisons",
"external_creative_action_attestations",
"external_creative_profile_observations",
"external_creative_resources",
"external_creative_allocations",
"model_update_notices",
"model_update_watches",
"portfolio_repository_observations",
"portfolio_reconciliation_runs",
"platform_secret_activations",
"platform_secret_tests",
"platform_secret_versions",
"platform_secret_state",
"managed_operator_credential_activations",
"managed_operator_credentials",
"managed_operator_identities",
"managed_operator_state",
"configuration_revisions",
"project_onboarding",
"configuration_state",
"audit_chain_heads",
"node_decommission_operations",
# M15 recovery tables come first: artifact_recovery_operations references
@@ -50,6 +114,8 @@ def upgrade() -> None:
"recovery_asset_records",
"recovery_policy_revisions",
"incident_timeline_events",
# The M37 outbox restricts deletion of its alert history parent.
"alert_notification_deliveries",
"alert_history_events",
"operational_alerts",
"operational_incidents",
@@ -107,6 +173,9 @@ def upgrade() -> None:
"project_evaluation_bindings",
"serving_gpu_leases",
"serving_jobs",
# M38 durable LAB history owns a restrictive reference to gateway_requests;
# drop it before the M0 gateway table while reconstructing the historical baseline.
"lab_execution_runs",
"gateway_requests",
"residency_allocations",
"service_credentials",
@@ -581,7 +581,7 @@ def _remove_postgres_audit_boundary(connection: Connection) -> None:
"drop trigger if exists trg_modelforge_audit_head_owner on public.audit_chain_heads; "
"drop trigger if exists trg_modelforge_audit_head_truncate_owner "
"on public.audit_chain_heads; "
"drop function if exists modelforge_audit.append_event_v2("
"drop function if exists modelforge_audit.append_event_v2("
"uuid, timestamptz, text, text, text, text, text, text, text, jsonb, "
"bigint, bigint, text, text, bigint, bigint, text); "
"drop function if exists modelforge_audit.enforce_owner_mutation(); "
@@ -0,0 +1,46 @@
"""Durable operator configuration and revision history.
Revision ID: 20260907_0025
Revises: 20260830_0024
"""
import sqlalchemy as sa
from alembic import op
revision = "20260907_0025"
down_revision = "20260830_0024"
branch_labels = None
depends_on = None
def upgrade() -> None:
op.create_table(
"configuration_state",
sa.Column("id", sa.Integer(), primary_key=True),
sa.Column("revision", sa.Integer(), nullable=False),
sa.Column("overrides", sa.JSON(), nullable=False),
sa.CheckConstraint("id = 1"),
sa.CheckConstraint("revision >= 0"),
)
op.create_table(
"configuration_revisions",
sa.Column("revision", sa.Integer(), primary_key=True),
sa.Column("previous_revision", sa.Integer(), nullable=False),
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("actor", sa.String(255), nullable=False),
sa.Column("correlation_id", sa.String(255), nullable=False),
sa.Column("overrides", sa.JSON(), nullable=False),
sa.Column("preview_digest", sa.String(64), nullable=False),
)
if op.get_bind().dialect.name == "postgresql":
op.execute("GRANT SELECT, INSERT, UPDATE ON configuration_state TO modelforge_runtime")
op.execute("REVOKE UPDATE, DELETE, TRUNCATE ON configuration_revisions FROM modelforge_runtime")
op.execute("GRANT SELECT, INSERT ON configuration_revisions TO modelforge_runtime")
def downgrade() -> None:
if op.get_bind().execute(sa.text("SELECT count(*) FROM configuration_revisions")).scalar_one():
raise RuntimeError("Configuration history exists; recover the pre-migration backup instead.")
op.drop_table("configuration_revisions")
op.drop_table("configuration_state")
@@ -0,0 +1,51 @@
"""Project onboarding and bounded credential overlap.
Revision ID: 20260908_0026
Revises: 20260907_0025
"""
import sqlalchemy as sa
from alembic import op
revision = "20260908_0026"
down_revision = "20260907_0025"
branch_labels = None
depends_on = None
def upgrade() -> None:
op.create_table(
"project_onboarding",
sa.Column("project_id", sa.Uuid(), sa.ForeignKey("projects.id", ondelete="RESTRICT"), primary_key=True),
sa.Column("owner", sa.String(128), nullable=False),
sa.Column("environment", sa.String(32), nullable=False),
sa.Column("labels", sa.JSON(), nullable=False),
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
)
op.add_column("service_credentials", sa.Column("superseded_at", sa.DateTime(timezone=True)))
op.drop_index("uq_active_service_client_credential", table_name="service_credentials")
op.create_index(
"uq_active_service_client_credential", "service_credentials", ["service_client_id"],
unique=True,
postgresql_where=sa.text("revoked_at IS NULL AND superseded_at IS NULL"),
sqlite_where=sa.text("revoked_at IS NULL AND superseded_at IS NULL"),
)
if op.get_bind().dialect.name == "postgresql":
op.execute("GRANT SELECT, INSERT ON project_onboarding TO modelforge_runtime")
op.execute("REVOKE UPDATE, DELETE, TRUNCATE ON project_onboarding FROM modelforge_runtime")
def downgrade() -> None:
connection = op.get_bind()
if connection.execute(sa.text("SELECT count(*) FROM project_onboarding")).scalar_one() or connection.execute(
sa.text("SELECT count(*) FROM service_credentials WHERE superseded_at IS NOT NULL")
).scalar_one():
raise RuntimeError("Onboarding or rotation history exists; recover the pre-migration backup instead.")
op.drop_index("uq_active_service_client_credential", table_name="service_credentials")
op.create_index(
"uq_active_service_client_credential", "service_credentials", ["service_client_id"],
unique=True, postgresql_where=sa.text("revoked_at IS NULL"), sqlite_where=sa.text("revoked_at IS NULL"),
)
op.drop_column("service_credentials", "superseded_at")
op.drop_table("project_onboarding")
@@ -0,0 +1,60 @@
"""Managed personal identities with recovery-cleared credential admission.
Revision ID: 20260908_0027
Revises: 20260908_0026
"""
import sqlalchemy as sa
from alembic import op
revision = "20260908_0027"
down_revision = "20260908_0026"
branch_labels = None
depends_on = None
def upgrade() -> None:
op.create_table("managed_operator_state",
sa.Column("singleton_id", sa.Integer(), primary_key=True),
sa.Column("revision", sa.Integer(), nullable=False),
sa.CheckConstraint("singleton_id = 1", name="ck_managed_operator_singleton"),
sa.CheckConstraint("revision >= 0", name="ck_managed_operator_revision"))
op.execute("INSERT INTO managed_operator_state (singleton_id, revision) VALUES (1, 0)")
op.create_table("managed_operator_identities",
sa.Column("slug", sa.String(63), primary_key=True),
sa.Column("role", sa.String(16), nullable=False),
sa.Column("enabled", sa.Boolean(), nullable=False),
sa.Column("version", sa.Integer(), nullable=False),
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
sa.CheckConstraint("role IN ('viewer','operator','admin')", name="ck_managed_operator_role"),
sa.CheckConstraint("version >= 1", name="ck_managed_operator_version"))
op.create_table("managed_operator_credentials",
sa.Column("id", sa.Uuid(), primary_key=True),
sa.Column("identity_slug", sa.String(63), sa.ForeignKey("managed_operator_identities.slug", ondelete="RESTRICT"), nullable=False),
sa.Column("token_sha256", sa.String(64), nullable=False, unique=True),
sa.Column("expires_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("revoked_at", sa.DateTime(timezone=True)),
sa.Column("superseded_at", sa.DateTime(timezone=True)),
sa.Column("last_used_at", sa.DateTime(timezone=True)),
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False))
op.create_index("ix_managed_operator_credentials_identity_slug", "managed_operator_credentials", ["identity_slug"])
op.create_index("uq_managed_operator_current", "managed_operator_credentials", ["identity_slug"], unique=True,
postgresql_where=sa.text("revoked_at IS NULL AND superseded_at IS NULL"),
sqlite_where=sa.text("revoked_at IS NULL AND superseded_at IS NULL"))
op.create_table("managed_operator_credential_activations",
sa.Column("credential_id", sa.Uuid(), sa.ForeignKey("managed_operator_credentials.id", ondelete="RESTRICT"), primary_key=True),
sa.Column("activated_at", sa.DateTime(timezone=True), nullable=False))
if op.get_bind().dialect.name == "postgresql":
op.execute("GRANT SELECT, INSERT, UPDATE ON managed_operator_state, managed_operator_identities, managed_operator_credentials TO modelforge_runtime")
op.execute("GRANT SELECT, INSERT, DELETE ON managed_operator_credential_activations TO modelforge_runtime")
op.execute("REVOKE DELETE, TRUNCATE ON managed_operator_state, managed_operator_identities, managed_operator_credentials FROM modelforge_runtime")
def downgrade() -> None:
connection = op.get_bind()
if connection.execute(sa.text("SELECT revision FROM managed_operator_state WHERE singleton_id = 1")).scalar_one() != 0 or connection.execute(sa.text("SELECT count(*) FROM managed_operator_identities")).scalar_one():
raise RuntimeError("Managed identity history exists; recover the pre-migration backup instead.")
op.drop_table("managed_operator_credential_activations")
op.drop_table("managed_operator_credentials")
op.drop_table("managed_operator_identities")
op.drop_table("managed_operator_state")
@@ -0,0 +1,56 @@
"""Encrypted HF control-plane secret history and recovery-cleared admission.
Revision ID: 20260908_0028
Revises: 20260908_0027
"""
import sqlalchemy as sa
from alembic import op
revision = "20260908_0028"
down_revision = "20260908_0027"
branch_labels = None
depends_on = None
def upgrade() -> None:
op.create_table("platform_secret_state",
sa.Column("singleton_id", sa.Integer(), primary_key=True),
sa.Column("revision", sa.Integer(), nullable=False),
sa.Column("initialized", sa.Boolean(), nullable=False),
sa.CheckConstraint("singleton_id = 1", name="ck_secret_state_singleton"),
sa.CheckConstraint("revision >= 0", name="ck_secret_state_revision"))
op.execute("INSERT INTO platform_secret_state (singleton_id, revision, initialized) VALUES (1, 0, false)")
op.create_table("platform_secret_versions",
sa.Column("version", sa.Integer(), primary_key=True, autoincrement=False),
sa.Column("key_id", sa.String(64), nullable=False),
sa.Column("secret_ciphertext", sa.Text(), nullable=False),
sa.Column("secret_nonce", sa.String(32), nullable=False),
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("revoked_at", sa.DateTime(timezone=True)),
sa.CheckConstraint("version > 0", name="ck_secret_version_positive"))
op.create_table("platform_secret_tests",
sa.Column("version", sa.Integer(), sa.ForeignKey("platform_secret_versions.version", ondelete="RESTRICT"), primary_key=True),
sa.Column("passed", sa.Boolean(), nullable=False),
sa.Column("tested_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("code", sa.String(64), nullable=False))
op.create_table("platform_secret_activations",
sa.Column("singleton_id", sa.Integer(), primary_key=True),
sa.Column("version", sa.Integer(), sa.ForeignKey("platform_secret_versions.version", ondelete="RESTRICT"), nullable=False),
sa.Column("activated_at", sa.DateTime(timezone=True), nullable=False),
sa.CheckConstraint("singleton_id = 1", name="ck_secret_activation_singleton"))
if op.get_bind().dialect.name == "postgresql":
op.execute("REVOKE ALL ON platform_secret_state, platform_secret_versions, platform_secret_tests, platform_secret_activations FROM modelforge_runtime")
op.execute("GRANT SELECT, UPDATE ON platform_secret_state TO modelforge_runtime")
op.execute("GRANT SELECT, INSERT ON platform_secret_versions TO modelforge_runtime")
op.execute("GRANT UPDATE (revoked_at) ON platform_secret_versions TO modelforge_runtime")
op.execute("GRANT SELECT, INSERT, UPDATE, DELETE ON platform_secret_tests, platform_secret_activations TO modelforge_runtime")
def downgrade() -> None:
connection = op.get_bind()
state = connection.execute(sa.text("SELECT revision, initialized FROM platform_secret_state WHERE singleton_id=1")).one()
if state.revision != 0 or state.initialized or connection.scalar(sa.text("SELECT count(*) FROM platform_secret_versions")):
raise RuntimeError("Secret slot history exists; recover the pre-migration backup instead.")
for table in ("platform_secret_activations", "platform_secret_tests", "platform_secret_versions", "platform_secret_state"):
op.drop_table(table)
@@ -0,0 +1,57 @@
"""External creative GPU coordination.
Revision ID: 20260909_0029
Revises: 20260908_0028
"""
import sqlalchemy as sa
from alembic import op
revision = "20260909_0029"
down_revision = "20260908_0028"
branch_labels = None
depends_on = None
def upgrade() -> None:
op.create_table(
"external_creative_allocations",
sa.Column("id", sa.Uuid(), nullable=False),
sa.Column("service_client_id", sa.Uuid(), nullable=False),
sa.Column("project_id", sa.Uuid(), nullable=False),
sa.Column("accelerator_id", sa.Uuid()),
sa.Column("request_id", sa.String(128), nullable=False),
sa.Column("idempotency_key", sa.String(128), nullable=False),
sa.Column("request_sha256", sa.String(64), nullable=False),
sa.Column("workload", sa.String(16), nullable=False),
sa.Column("resource_ref", sa.String(255), nullable=False),
sa.Column("provider_resource_id", sa.String(128), nullable=False),
sa.Column("required_vram_bytes", sa.BigInteger(), nullable=False),
sa.Column("priority", sa.String(32), nullable=False),
sa.Column("ttl_seconds", sa.Integer(), nullable=False),
sa.Column("state", sa.String(32), nullable=False),
sa.Column("decision_code", sa.String(64), nullable=False),
sa.Column("decision_evidence", sa.JSON(), nullable=False),
sa.Column("required_actions", sa.JSON(), nullable=False),
sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False),
sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False),
sa.Column("acquired_at", sa.DateTime(timezone=True)),
sa.Column("heartbeat_at", sa.DateTime(timezone=True)),
sa.Column("expires_at", sa.DateTime(timezone=True)),
sa.Column("uncertain_at", sa.DateTime(timezone=True)),
sa.Column("released_at", sa.DateTime(timezone=True)),
sa.CheckConstraint("required_vram_bytes > 0", name="ck_external_creative_vram_positive"),
sa.CheckConstraint("ttl_seconds >= 30 AND ttl_seconds <= 3600", name="ck_external_creative_ttl"),
sa.ForeignKeyConstraint(["service_client_id"], ["service_clients.id"], ondelete="RESTRICT"),
sa.ForeignKeyConstraint(["project_id"], ["projects.id"], ondelete="RESTRICT"),
sa.ForeignKeyConstraint(["accelerator_id"], ["accelerators.id"], ondelete="RESTRICT"),
sa.PrimaryKeyConstraint("id"),
sa.UniqueConstraint("service_client_id", "idempotency_key", name="uq_external_creative_idempotency"),
)
for column in ("service_client_id", "project_id", "accelerator_id", "request_id", "state", "expires_at"):
op.create_index(f"ix_external_creative_allocations_{column}", "external_creative_allocations", [column])
def downgrade() -> None:
op.drop_table("external_creative_allocations")
@@ -0,0 +1,43 @@
"""Explicit selected-model upstream watches and deduplicated revision notices."""
import sqlalchemy as sa
from alembic import op
revision = "20260909_0030"
down_revision = "20260909_0029"
branch_labels = None
depends_on = None
def upgrade() -> None:
op.create_table("model_update_watches",
sa.Column("id", sa.Uuid(), primary_key=True),
sa.Column("model_id", sa.Uuid(), sa.ForeignKey("models.id", ondelete="RESTRICT"), nullable=False),
sa.Column("baseline_revision_id", sa.Uuid(), sa.ForeignKey("model_revisions.id", ondelete="RESTRICT"), nullable=False),
sa.Column("baseline_commit_sha", sa.String(64), nullable=False),
sa.Column("upstream_ref", sa.String(255), nullable=False),
sa.Column("last_checked_at", sa.DateTime(timezone=True)),
sa.Column("last_error_code", sa.String(64)),
sa.Column("check_until", sa.DateTime(timezone=True)),
sa.Column("check_token", sa.Uuid()),
sa.UniqueConstraint("model_id", "upstream_ref", name="uq_model_watch_ref"))
op.create_table("model_update_notices",
sa.Column("id", sa.Uuid(), primary_key=True),
sa.Column("watch_id", sa.Uuid(), sa.ForeignKey("model_update_watches.id", ondelete="RESTRICT"), nullable=False),
sa.Column("model_id", sa.Uuid(), sa.ForeignKey("models.id", ondelete="RESTRICT"), nullable=False),
sa.Column("baseline_commit_sha", sa.String(64), nullable=False),
sa.Column("candidate_revision_id", sa.Uuid(), sa.ForeignKey("model_revisions.id", ondelete="RESTRICT"), nullable=False),
sa.Column("candidate_commit_sha", sa.String(64), nullable=False),
sa.Column("status", sa.String(16), nullable=False),
sa.Column("discovered_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False),
sa.UniqueConstraint("watch_id", "candidate_commit_sha", name="uq_model_notice_commit"),
sa.CheckConstraint("status IN ('new', 'dismissed')", name="ck_model_notice_status"))
if op.get_bind().dialect.name == "postgresql":
op.execute("GRANT SELECT, INSERT, UPDATE ON model_update_watches, model_update_notices TO modelforge_runtime")
def downgrade() -> None:
if op.get_bind().scalar(sa.text("SELECT count(*) FROM model_update_watches")):
raise RuntimeError("Model update history exists; restore the pre-migration backup instead.")
op.drop_table("model_update_notices")
op.drop_table("model_update_watches")
@@ -0,0 +1,114 @@
"""Govern external creative resources, measurements, and action attestations.
Revision ID: 20260909_0031
Revises: 20260909_0030
"""
import sqlalchemy as sa
from alembic import op
revision = "20260909_0031"
down_revision = "20260909_0030"
branch_labels = None
depends_on = None
def upgrade() -> None:
op.create_table(
"external_creative_resources",
sa.Column("id", sa.Uuid(), primary_key=True),
sa.Column(
"project_id",
sa.Uuid(),
sa.ForeignKey("projects.id", ondelete="RESTRICT"),
nullable=False,
),
sa.Column("resource_ref", sa.String(255), nullable=False),
sa.Column("workload", sa.String(16), nullable=False),
sa.Column("provider_resource_id", sa.String(128), nullable=False),
sa.Column("approved", sa.Boolean(), nullable=False, server_default=sa.false()),
sa.Column("configured_vram_bytes", sa.BigInteger(), nullable=False),
sa.Column("measured_peak_vram_bytes", sa.BigInteger()),
sa.Column("measurement_count", sa.Integer(), nullable=False, server_default="0"),
sa.Column(
"updated_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.func.now()
),
sa.UniqueConstraint(
"project_id",
"resource_ref",
"workload",
"provider_resource_id",
name="uq_external_creative_resource_binding",
),
sa.CheckConstraint("configured_vram_bytes > 0", name="ck_external_resource_vram_positive"),
)
op.create_index(
"ix_external_creative_resources_project",
"external_creative_resources",
["project_id", "approved"],
)
op.create_table(
"external_creative_action_attestations",
sa.Column("id", sa.Uuid(), primary_key=True),
sa.Column(
"allocation_id",
sa.Uuid(),
sa.ForeignKey("external_creative_allocations.id", ondelete="RESTRICT"),
nullable=False,
),
sa.Column("action", sa.String(64), nullable=False),
sa.Column("before_vram_bytes", sa.BigInteger(), nullable=False),
sa.Column("after_vram_bytes", sa.BigInteger(), nullable=False),
sa.Column("observed_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("validated", sa.Boolean(), nullable=False),
sa.Column(
"created_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.func.now()
),
sa.UniqueConstraint(
"allocation_id", "action", name="uq_external_creative_action_attestation"
),
sa.CheckConstraint(
"before_vram_bytes >= 0 AND after_vram_bytes >= 0",
name="ck_external_action_vram_nonnegative",
),
)
op.create_table(
"external_creative_profile_observations",
sa.Column("id", sa.Uuid(), primary_key=True),
sa.Column(
"allocation_id",
sa.Uuid(),
sa.ForeignKey("external_creative_allocations.id", ondelete="RESTRICT"),
nullable=False,
),
sa.Column("resource_ref", sa.String(255), nullable=False),
sa.Column("provider_resource_id", sa.String(128), nullable=False),
sa.Column("workload", sa.String(16), nullable=False),
sa.Column("observed_peak_vram_bytes", sa.BigInteger(), nullable=False),
sa.Column("reserved_vram_bytes", sa.BigInteger(), nullable=False),
sa.Column("duration_ms", sa.BigInteger(), nullable=False),
sa.Column("outcome", sa.String(16), nullable=False),
sa.Column(
"created_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.func.now()
),
sa.UniqueConstraint(
"allocation_id", name="uq_external_creative_profile_observation_allocation"
),
sa.CheckConstraint(
"observed_peak_vram_bytes > 0 AND reserved_vram_bytes > 0",
name="ck_external_profile_vram_positive",
),
sa.CheckConstraint(
"duration_ms >= 0 AND duration_ms <= 604800000", name="ck_external_profile_duration"
),
)
def downgrade() -> None:
op.drop_table("external_creative_profile_observations")
op.drop_table("external_creative_action_attestations")
op.drop_index(
"ix_external_creative_resources_project", table_name="external_creative_resources"
)
op.drop_table("external_creative_resources")
@@ -0,0 +1,44 @@
"""Allow explicit audio and film creative workload names.
Revision ID: 20260909_0032
Revises: 20260909_0031
"""
import sqlalchemy as sa
from alembic import op
revision = "20260909_0032"
down_revision = "20260909_0031"
branch_labels = None
depends_on = None
def upgrade() -> None:
for table in (
"external_creative_allocations",
"external_creative_resources",
"external_creative_profile_observations",
):
with op.batch_alter_table(table) as batch:
batch.alter_column(
"workload",
existing_type=sa.String(16),
type_=sa.String(32),
existing_nullable=False,
)
def downgrade() -> None:
for table in (
"external_creative_profile_observations",
"external_creative_resources",
"external_creative_allocations",
):
with op.batch_alter_table(table) as batch:
batch.alter_column(
"workload",
existing_type=sa.String(32),
type_=sa.String(16),
existing_nullable=False,
)
@@ -0,0 +1,154 @@
"""Persist one explicitly delegated current/candidate comparison per project binding."""
import sqlalchemy as sa
from alembic import op
revision = "20260909_0033"
down_revision = "20260909_0032"
branch_labels = None
depends_on = None
def upgrade() -> None:
op.add_column(
"model_update_watches",
sa.Column("enabled", sa.Boolean(), nullable=False, server_default=sa.true()),
)
op.add_column(
"model_update_watches",
sa.Column("version", sa.Integer(), nullable=False, server_default="1"),
)
op.create_table(
"selected_model_comparisons",
sa.Column("id", sa.Uuid(), primary_key=True),
sa.Column(
"project_binding_id",
sa.Uuid(),
sa.ForeignKey("project_bindings.id", ondelete="RESTRICT"),
nullable=False,
),
sa.Column(
"consumer_client_id",
sa.Uuid(),
sa.ForeignKey("service_clients.id", ondelete="RESTRICT"),
nullable=False,
),
sa.Column(
"suite_revision_id",
sa.Uuid(),
sa.ForeignKey("evaluation_suite_revisions.id", ondelete="RESTRICT"),
nullable=False,
),
sa.Column(
"current_deployment_id",
sa.Uuid(),
sa.ForeignKey("capability_deployments.id", ondelete="RESTRICT"),
nullable=False,
),
sa.Column(
"candidate_deployment_id",
sa.Uuid(),
sa.ForeignKey("capability_deployments.id", ondelete="RESTRICT"),
nullable=False,
),
sa.Column(
"candidate_route_id",
sa.Uuid(),
sa.ForeignKey("capability_experiment_routes.id", ondelete="RESTRICT"),
nullable=False,
),
sa.Column("idempotency_key", sa.String(128), nullable=False),
sa.Column("request_digest", sa.String(64), nullable=False),
sa.Column("actor_id", sa.String(128), nullable=False),
sa.Column("pins", sa.JSON(), nullable=False),
sa.Column("status", sa.String(32), nullable=False),
sa.Column("version", sa.Integer(), nullable=False, server_default="1"),
sa.Column("current_completed_cases", sa.Integer(), nullable=False, server_default="0"),
sa.Column("candidate_completed_cases", sa.Integer(), nullable=False, server_default="0"),
sa.Column("expected_cases", sa.Integer(), nullable=False),
sa.Column("claim_token_hash", sa.String(64)),
sa.Column("claim_expires_at", sa.DateTime(timezone=True)),
sa.Column("deadline_at", sa.DateTime(timezone=True)),
sa.Column("claimed_at", sa.DateTime(timezone=True)),
sa.Column("cancel_requested_at", sa.DateTime(timezone=True)),
sa.Column("finished_at", sa.DateTime(timezone=True)),
sa.Column("error_code", sa.String(64)),
sa.Column("result_digest", sa.String(64)),
sa.Column(
"baseline_run_id", sa.Uuid(), sa.ForeignKey("evaluation_runs.id", ondelete="RESTRICT")
),
sa.Column(
"candidate_run_id", sa.Uuid(), sa.ForeignKey("evaluation_runs.id", ondelete="RESTRICT")
),
sa.Column(
"evaluation_comparison_id",
sa.Uuid(),
sa.ForeignKey("evaluation_comparisons.id", ondelete="RESTRICT"),
),
sa.Column(
"created_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False
),
sa.Column(
"updated_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False
),
sa.UniqueConstraint(
"project_binding_id", "idempotency_key", name="uq_selected_comparison_key"
),
sa.CheckConstraint(
"status IN ('pending', 'running', 'cancel_requested', 'completed', 'failed', 'cancelled', 'interrupted')",
name="ck_selected_comparison_status",
),
sa.CheckConstraint("expected_cases BETWEEN 1 AND 100", name="ck_selected_comparison_cases"),
sa.CheckConstraint(
"current_completed_cases BETWEEN 0 AND expected_cases AND candidate_completed_cases BETWEEN 0 AND expected_cases",
name="ck_selected_comparison_progress",
),
sa.CheckConstraint("version > 0", name="ck_selected_comparison_version"),
sa.CheckConstraint(
"current_deployment_id <> candidate_deployment_id",
name="ck_selected_comparison_distinct_targets",
),
)
op.create_index(
"uq_selected_comparison_active_binding",
"selected_model_comparisons",
["project_binding_id"],
unique=True,
postgresql_where=sa.text("status IN ('pending', 'running', 'cancel_requested')"),
sqlite_where=sa.text("status IN ('pending', 'running', 'cancel_requested')"),
)
if op.get_bind().dialect.name == "postgresql":
op.execute(
"REVOKE DELETE, TRUNCATE ON model_update_watches, model_update_notices FROM modelforge_runtime"
)
op.execute(
"GRANT SELECT, INSERT, UPDATE ON model_update_watches, model_update_notices TO modelforge_runtime"
)
op.execute("REVOKE DELETE, TRUNCATE ON selected_model_comparisons FROM modelforge_runtime")
op.execute(
"GRANT SELECT, INSERT, UPDATE ON selected_model_comparisons TO modelforge_runtime"
)
def downgrade() -> None:
# Earlier deployed migrations have destructive downgrades. Never permit this
# release to cross back into that graph while authoritative history exists.
for table in (
"selected_model_comparisons",
"model_update_watches",
"model_update_notices",
"external_creative_allocations",
"external_creative_resources",
"external_creative_action_attestations",
"external_creative_profile_observations",
):
if op.get_bind().scalar(sa.select(sa.func.count()).select_from(sa.table(table))):
raise RuntimeError(
"Control-plane history exists; restore the pre-migration backup instead."
)
op.drop_index("uq_selected_comparison_active_binding", table_name="selected_model_comparisons")
op.drop_table("selected_model_comparisons")
op.drop_column("model_update_watches", "version")
op.drop_column("model_update_watches", "enabled")
# Deliberately retain the safer runtime privilege restrictions on empty old tables.
@@ -0,0 +1,28 @@
"""Fence approved stable serving transitions and rollback against ABA changes."""
import sqlalchemy as sa
from alembic import op
revision = "20260910_0034"
down_revision = "20260909_0033"
branch_labels = None
depends_on = None
def upgrade() -> None:
op.add_column("capability_contracts", sa.Column(
"serving_generation", sa.BigInteger(), nullable=False, server_default="0"))
with op.batch_alter_table("capability_contracts") as batch:
batch.create_check_constraint("ck_capability_serving_generation", "serving_generation >= 0")
def downgrade() -> None:
contracts = sa.table("capability_contracts", sa.column("serving_generation"))
if op.get_bind().scalar(sa.select(sa.func.count()).select_from(contracts).where(
contracts.c.serving_generation != 0
)):
raise RuntimeError("Serving route history exists; restore the pre-migration backup instead.")
with op.batch_alter_table("capability_contracts") as batch:
batch.drop_constraint("ck_capability_serving_generation", type_="check")
batch.drop_column("serving_generation")
@@ -0,0 +1,95 @@
"""Add the user-facing model replacement case without duplicating lifecycle truth."""
import sqlalchemy as sa
from alembic import op
revision = "20260911_0035"
down_revision = "20260910_0034"
branch_labels = None
depends_on = None
STATUSES = (
"searching",
"found",
"source_checked",
"downloaded",
"ready_to_test",
"tested",
"comparison_available",
"migration_required",
"ready_to_activate",
"active",
"checked",
"rolled_back",
"rejected",
)
def upgrade() -> None:
op.create_table(
"model_change_cases",
sa.Column("id", sa.Uuid(), nullable=False),
sa.Column("project_binding_id", sa.Uuid(), nullable=False),
sa.Column("current_deployment_id", sa.Uuid(), nullable=False),
sa.Column("candidate_model_id", sa.Uuid(), nullable=True),
sa.Column("candidate_revision_id", sa.Uuid(), nullable=True),
sa.Column("candidate_artifact_set_id", sa.Uuid(), nullable=True),
sa.Column("candidate_deployment_id", sa.Uuid(), nullable=True),
sa.Column("discovery_assessment_id", sa.Uuid(), nullable=True),
sa.Column("download_plan_id", sa.Uuid(), nullable=True),
sa.Column("artifact_job_id", sa.Uuid(), nullable=True),
sa.Column("selected_comparison_id", sa.Uuid(), nullable=True),
sa.Column("migration_plan_id", sa.Uuid(), nullable=True),
sa.Column("lifecycle_plan_id", sa.Uuid(), nullable=True),
sa.Column("status", sa.String(length=32), nullable=False, server_default="searching"),
sa.Column("status_reason", sa.Text(), nullable=False, server_default=""),
sa.Column("version", sa.Integer(), nullable=False, server_default="1"),
sa.Column("created_by", sa.String(length=255), nullable=False),
sa.Column("updated_by", sa.String(length=255), nullable=False),
sa.Column("context", sa.JSON(), nullable=False),
sa.Column("activated_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("checked_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("closed_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False),
sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False),
sa.ForeignKeyConstraint(["project_binding_id"], ["project_bindings.id"], ondelete="RESTRICT"),
sa.ForeignKeyConstraint(["current_deployment_id"], ["capability_deployments.id"], ondelete="RESTRICT"),
sa.ForeignKeyConstraint(["candidate_model_id"], ["models.id"], ondelete="RESTRICT"),
sa.ForeignKeyConstraint(["candidate_revision_id"], ["model_revisions.id"], ondelete="RESTRICT"),
sa.ForeignKeyConstraint(["candidate_artifact_set_id"], ["artifact_sets.id"], ondelete="RESTRICT"),
sa.ForeignKeyConstraint(["candidate_deployment_id"], ["capability_deployments.id"], ondelete="RESTRICT"),
sa.ForeignKeyConstraint(["discovery_assessment_id"], ["discovery_candidate_assessments.id"], ondelete="RESTRICT"),
sa.ForeignKeyConstraint(["download_plan_id"], ["download_plans.id"], ondelete="RESTRICT"),
sa.ForeignKeyConstraint(["artifact_job_id"], ["artifact_jobs.id"], ondelete="RESTRICT"),
sa.ForeignKeyConstraint(["selected_comparison_id"], ["selected_model_comparisons.id"], ondelete="RESTRICT"),
sa.ForeignKeyConstraint(["migration_plan_id"], ["migration_plans.id"], ondelete="RESTRICT"),
sa.ForeignKeyConstraint(["lifecycle_plan_id"], ["lifecycle_promotion_plans.id"], ondelete="RESTRICT"),
sa.PrimaryKeyConstraint("id"),
sa.CheckConstraint("version >= 1", name="ck_model_change_case_version"),
sa.CheckConstraint(
"status IN (" + ",".join(repr(value) for value in STATUSES) + ")",
name="ck_model_change_case_status",
),
)
op.create_index("ix_model_change_cases_binding", "model_change_cases", ["project_binding_id"])
op.create_index("ix_model_change_cases_status", "model_change_cases", ["status"])
op.create_index(
"uq_model_change_cases_open_binding",
"model_change_cases",
["project_binding_id"],
unique=True,
postgresql_where=sa.text("closed_at IS NULL"),
sqlite_where=sa.text("closed_at IS NULL"),
)
def downgrade() -> None:
changes = sa.table("model_change_cases", sa.column("id"))
if op.get_bind().scalar(sa.select(sa.func.count()).select_from(changes)):
raise RuntimeError("Model change cases exist; restore the pre-migration backup instead.")
op.drop_index("uq_model_change_cases_open_binding", table_name="model_change_cases")
op.drop_index("ix_model_change_cases_status", table_name="model_change_cases")
op.drop_index("ix_model_change_cases_binding", table_name="model_change_cases")
op.drop_table("model_change_cases")
@@ -0,0 +1,122 @@
"""Persist secret-free repository observations and snapshot idempotency."""
import sqlalchemy as sa
from alembic import op
revision = "20260923_0036"
down_revision = "20260911_0035"
branch_labels = None
depends_on = None
def upgrade() -> None:
op.create_table(
"portfolio_reconciliation_runs",
sa.Column("id", sa.Uuid(), nullable=False),
sa.Column("source_system", sa.String(length=16), nullable=False),
sa.Column("snapshot_id", sa.String(length=128), nullable=False),
sa.Column("payload_digest", sa.String(length=64), nullable=False),
sa.Column("observed_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("complete", sa.Boolean(), nullable=False),
sa.Column("stale_snapshot", sa.Boolean(), nullable=False),
sa.Column("projects_created", sa.Integer(), nullable=False),
sa.Column("repositories_created", sa.Integer(), nullable=False),
sa.Column("repositories_updated", sa.Integer(), nullable=False),
sa.Column("stale_observations", sa.Integer(), nullable=False),
sa.Column("repositories_marked_stale", sa.Integer(), nullable=False),
sa.Column("runtime_observations_updated", sa.Integer(), nullable=False),
sa.Column("head_changes_review_required", sa.Integer(), nullable=False),
sa.Column("head_changes_accepted", sa.Integer(), nullable=False),
sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False),
sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False),
sa.PrimaryKeyConstraint("id"),
sa.UniqueConstraint("source_system", "snapshot_id", name="uq_portfolio_snapshot_identity"),
sa.CheckConstraint("length(payload_digest) = 64", name="ck_portfolio_snapshot_digest_length"),
sa.CheckConstraint(
"projects_created >= 0 AND repositories_created >= 0 "
"AND repositories_updated >= 0 AND stale_observations >= 0 "
"AND repositories_marked_stale >= 0 AND runtime_observations_updated >= 0 "
"AND head_changes_review_required >= 0 AND head_changes_accepted >= 0",
name="ck_portfolio_snapshot_counts_nonnegative",
),
)
op.create_index(
"ix_portfolio_snapshot_source_observed",
"portfolio_reconciliation_runs",
["source_system", "complete", "observed_at"],
)
op.create_table(
"portfolio_repository_observations",
sa.Column("id", sa.Uuid(), nullable=False),
sa.Column("project_id", sa.Uuid(), nullable=True),
sa.Column("project_key", sa.String(length=128), nullable=True),
sa.Column("source_system", sa.String(length=16), nullable=False),
sa.Column("external_repository_id", sa.String(length=128), nullable=False),
sa.Column("slug", sa.String(length=255), nullable=False),
sa.Column("default_branch", sa.String(length=255), nullable=False),
sa.Column("head_sha", sa.String(length=40), nullable=False),
sa.Column("classification", sa.String(length=32), nullable=False),
sa.Column("code_evidence", sa.JSON(), nullable=False),
sa.Column("runtime_evidence", sa.JSON(), nullable=False),
sa.Column("source_observed_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("source_snapshot_id", sa.String(length=128), nullable=False),
sa.Column("source_snapshot_digest", sa.String(length=64), nullable=False),
sa.Column("pending_head_sha", sa.String(length=40), nullable=True),
sa.Column("pending_default_branch", sa.String(length=255), nullable=True),
sa.Column("pending_project_key", sa.String(length=128), nullable=True),
sa.Column("pending_classification", sa.String(length=32), nullable=True),
sa.Column("pending_code_evidence", sa.JSON(), nullable=True),
sa.Column("pending_observed_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("pending_snapshot_id", sa.String(length=128), nullable=True),
sa.Column("pending_snapshot_digest", sa.String(length=64), nullable=True),
sa.Column("last_seen_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("stale_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False),
sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False),
sa.ForeignKeyConstraint(["project_id"], ["projects.id"], ondelete="RESTRICT"),
sa.PrimaryKeyConstraint("id"),
sa.UniqueConstraint(
"source_system", "external_repository_id", name="uq_portfolio_repo_external_id"
),
sa.UniqueConstraint(
"source_system", "project_key", name="uq_portfolio_source_project_key"
),
sa.UniqueConstraint("project_id", name="uq_portfolio_repository_project_id"),
sa.CheckConstraint("length(head_sha) = 40", name="ck_portfolio_repo_head_sha_length"),
sa.CheckConstraint(
"pending_head_sha IS NULL OR length(pending_head_sha) = 40",
name="ck_portfolio_repo_pending_sha_length",
),
sa.CheckConstraint(
"classification IN ('local_model', 'hosted_model', 'gateway', 'mixed', "
"'model_management', 'runtime_observer', 'non_ai', 'unknown')",
name="ck_portfolio_repo_classification",
),
)
op.create_index(
"ix_portfolio_repository_observations_project_id",
"portfolio_repository_observations",
["project_id"],
)
def downgrade() -> None:
bind = op.get_bind()
runs = sa.table("portfolio_reconciliation_runs", sa.column("id"))
repositories = sa.table("portfolio_repository_observations", sa.column("id"))
if bind.scalar(sa.select(sa.func.count()).select_from(runs)) or bind.scalar(
sa.select(sa.func.count()).select_from(repositories)
):
raise RuntimeError(
"portfolio reconciliation history exists; restore the pre-migration backup instead."
)
op.drop_index(
"ix_portfolio_repository_observations_project_id",
table_name="portfolio_repository_observations",
)
op.drop_table("portfolio_repository_observations")
op.drop_index(
"ix_portfolio_snapshot_source_observed", table_name="portfolio_reconciliation_runs"
)
op.drop_table("portfolio_reconciliation_runs")
@@ -0,0 +1,99 @@
"""Add durable, single-route operational alert notification outbox."""
import sqlalchemy as sa
from alembic import op
revision = "20260923_0037"
down_revision = "20260923_0036"
branch_labels = None
depends_on = None
def upgrade() -> None:
op.create_table(
"alert_notification_deliveries",
sa.Column("id", sa.Uuid(), nullable=False),
sa.Column("alert_history_event_id", sa.Uuid(), nullable=True),
sa.Column("route_key", sa.String(length=64), nullable=False),
sa.Column("idempotency_key", sa.String(length=160), nullable=False),
sa.Column("event_kind", sa.String(length=16), nullable=False),
sa.Column("severity", sa.String(length=16), nullable=True),
sa.Column("payload", sa.JSON(), nullable=False),
sa.Column("status", sa.String(length=24), nullable=False),
sa.Column("attempt_count", sa.Integer(), nullable=False),
sa.Column("next_attempt_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("last_attempt_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("delivered_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("lease_expires_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("claim_token_hash", sa.String(length=64), nullable=True),
sa.Column("last_http_status", sa.Integer(), nullable=True),
sa.Column("last_error_code", sa.String(length=64), nullable=True),
sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False),
sa.CheckConstraint(
"event_kind IN ('FIRING', 'RESOLVED', 'TEST')",
name="ck_alert_notification_event_kind",
),
sa.CheckConstraint(
"status IN ('PENDING', 'DISPATCHING', 'RETRY_WAIT', 'DELIVERED', 'FAILED', 'HELD_FOR_REVIEW')",
name="ck_alert_notification_status",
),
sa.CheckConstraint("attempt_count >= 0", name="ck_alert_notification_attempt_count"),
sa.ForeignKeyConstraint(
["alert_history_event_id"], ["alert_history_events.id"], ondelete="RESTRICT"
),
sa.PrimaryKeyConstraint("id"),
sa.UniqueConstraint("idempotency_key", name="uq_alert_notification_idempotency"),
)
op.create_index(
"ix_alert_notification_deliveries_alert_history_event_id",
"alert_notification_deliveries",
["alert_history_event_id"],
)
op.create_index(
"ix_alert_notification_deliveries_event_kind",
"alert_notification_deliveries",
["event_kind"],
)
op.create_index(
"ix_alert_notification_deliveries_severity",
"alert_notification_deliveries",
["severity"],
)
op.create_index(
"ix_alert_notification_deliveries_status",
"alert_notification_deliveries",
["status"],
)
op.create_index(
"ix_alert_notification_deliveries_next_attempt_at",
"alert_notification_deliveries",
["next_attempt_at"],
)
op.create_index(
"ix_alert_notification_deliveries_lease_expires_at",
"alert_notification_deliveries",
["lease_expires_at"],
)
op.create_index(
"ix_alert_notification_dispatch_due",
"alert_notification_deliveries",
["status", "next_attempt_at", "created_at"],
)
def downgrade() -> None:
bind = op.get_bind()
deliveries = sa.table("alert_notification_deliveries", sa.column("id"))
if bind.scalar(sa.select(sa.func.count()).select_from(deliveries)):
raise RuntimeError(
"alert notification history exists; restore the pre-migration backup instead."
)
op.drop_index("ix_alert_notification_dispatch_due", table_name="alert_notification_deliveries")
op.drop_index("ix_alert_notification_deliveries_lease_expires_at", table_name="alert_notification_deliveries")
op.drop_index("ix_alert_notification_deliveries_next_attempt_at", table_name="alert_notification_deliveries")
op.drop_index("ix_alert_notification_deliveries_status", table_name="alert_notification_deliveries")
op.drop_index("ix_alert_notification_deliveries_severity", table_name="alert_notification_deliveries")
op.drop_index("ix_alert_notification_deliveries_event_kind", table_name="alert_notification_deliveries")
op.drop_index("ix_alert_notification_deliveries_alert_history_event_id", table_name="alert_notification_deliveries")
op.drop_table("alert_notification_deliveries")
@@ -0,0 +1,104 @@
"""Persist actor-scoped Model Lab execution identities."""
import sqlalchemy as sa
from alembic import op
revision = "20260924_0038"
down_revision = "20260923_0037"
branch_labels = None
depends_on = None
def upgrade() -> None:
op.create_table(
"lab_execution_runs",
sa.Column("id", sa.Uuid(), nullable=False),
sa.Column("actor_subject", sa.String(length=255), nullable=False),
sa.Column("idempotency_key", sa.String(length=128), nullable=False),
sa.Column("request_fingerprint", sa.String(length=64), nullable=False),
sa.Column("status", sa.String(length=24), server_default="accepted", nullable=False),
sa.Column("capability", sa.String(length=128), server_default="rag.embedding@1", nullable=False),
sa.Column("target_snapshot", sa.JSON(), nullable=False),
sa.Column("input_sha256", sa.String(length=64), nullable=False),
sa.Column("input_count", sa.Integer(), nullable=False),
sa.Column("input_encoded_bytes", sa.Integer(), nullable=False),
sa.Column("payload_reference", sa.String(length=128), nullable=True),
sa.Column("input_payload_expires_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("gateway_request_id", sa.Uuid(), nullable=False),
sa.Column("timeout_seconds", sa.Integer(), server_default="60", nullable=False),
sa.Column("queue_timeout_seconds", sa.Integer(), server_default="10", nullable=False),
sa.Column("retention_seconds", sa.Integer(), server_default="300", nullable=False),
sa.Column("output_metadata", sa.JSON(), nullable=True),
sa.Column("worker_observations", sa.JSON(), nullable=True),
sa.Column("failure_code", sa.String(length=64), nullable=True),
sa.Column("started_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("dispatch_started_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("heartbeat_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("cancellation_requested_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("cancellation_acknowledged_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("finished_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False),
sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False),
sa.CheckConstraint(
"status IN ('accepted', 'preparing', 'queued', 'running', 'cancel_requested', "
"'completed', 'failed', 'cancelled', 'interrupted')",
name="ck_lab_execution_run_status",
),
sa.CheckConstraint("input_count BETWEEN 1 AND 8", name="ck_lab_execution_run_input_count"),
sa.CheckConstraint("timeout_seconds BETWEEN 5 AND 300", name="ck_lab_execution_run_timeout"),
sa.CheckConstraint("queue_timeout_seconds BETWEEN 1 AND 60", name="ck_lab_execution_run_queue_timeout"),
sa.CheckConstraint("retention_seconds BETWEEN 60 AND 3600", name="ck_lab_execution_run_retention"),
sa.ForeignKeyConstraint(
["gateway_request_id"], ["gateway_requests.id"], ondelete="RESTRICT"
),
sa.PrimaryKeyConstraint("id"),
sa.UniqueConstraint("actor_subject", "idempotency_key", name="uq_lab_run_actor_idempotency"),
sa.UniqueConstraint("gateway_request_id", name="uq_lab_execution_run_gateway_request"),
)
op.create_index("ix_lab_execution_runs_actor_subject", "lab_execution_runs", ["actor_subject"])
op.create_index("ix_lab_execution_runs_status", "lab_execution_runs", ["status"])
op.create_index("ix_lab_execution_runs_gateway_request_id", "lab_execution_runs", ["gateway_request_id"])
op.create_index("ix_lab_execution_runs_actor_status_created", "lab_execution_runs", ["actor_subject", "status", "created_at"])
op.add_column(
"serving_jobs",
sa.Column("lab_execution_run_id", sa.Uuid(), nullable=True),
)
op.create_foreign_key(
"fk_serving_jobs_lab_execution_run_id_lab_execution_runs",
"serving_jobs",
"lab_execution_runs",
["lab_execution_run_id"],
["id"],
ondelete="SET NULL",
)
op.create_index(
"ix_serving_jobs_lab_execution_run_id", "serving_jobs", ["lab_execution_run_id"]
)
if op.get_bind().dialect.name == "postgresql":
op.execute(
"REVOKE DELETE, TRUNCATE ON lab_execution_runs FROM modelforge_runtime"
)
op.execute(
"GRANT SELECT, INSERT, UPDATE ON lab_execution_runs TO modelforge_runtime"
)
def downgrade() -> None:
bind = op.get_bind()
if bind.scalar(sa.select(sa.func.count()).select_from(sa.table("lab_execution_runs", sa.column("id")))):
raise RuntimeError(
"LAB run history exists; restore the pre-migration backup instead of deleting it."
)
op.drop_index("ix_serving_jobs_lab_execution_run_id", table_name="serving_jobs")
op.drop_constraint(
"fk_serving_jobs_lab_execution_run_id_lab_execution_runs",
"serving_jobs",
type_="foreignkey",
)
op.drop_column("serving_jobs", "lab_execution_run_id")
op.drop_index("ix_lab_execution_runs_actor_status_created", table_name="lab_execution_runs")
op.drop_index("ix_lab_execution_runs_gateway_request_id", table_name="lab_execution_runs")
op.drop_index("ix_lab_execution_runs_status", table_name="lab_execution_runs")
op.drop_index("ix_lab_execution_runs_actor_subject", table_name="lab_execution_runs")
op.drop_table("lab_execution_runs")
@@ -0,0 +1,164 @@
"""Bind persisted benchmark evidence to authenticated capability runs."""
import sqlalchemy as sa
from alembic import op
revision = "20260924_0039"
down_revision = "20260924_0038"
branch_labels = None
depends_on = None
def upgrade() -> None:
if op.get_bind().dialect.name == "sqlite":
# SQLite cannot ALTER TABLE to add the FK/check/unique constraints. Alembic's batch
# recreation preserves historical benchmark rows and their indexes.
with op.batch_alter_table("benchmark_runs", recreate="always") as batch:
batch.alter_column("deployment_id", existing_type=sa.Uuid(), nullable=True)
batch.add_column(sa.Column("capability_deployment_id", sa.Uuid(), nullable=True))
batch.add_column(sa.Column("target_snapshot", sa.JSON(), nullable=True))
batch.add_column(sa.Column("actor_subject", sa.String(255), nullable=True))
batch.add_column(sa.Column("idempotency_key", sa.String(128), nullable=True))
batch.add_column(sa.Column("request_fingerprint", sa.String(64), nullable=True))
batch.add_column(sa.Column("failure_code", sa.String(64), nullable=True))
batch.add_column(sa.Column("cancellation_requested_at", sa.DateTime(timezone=True)))
batch.add_column(
sa.Column(
"created_at",
sa.DateTime(timezone=True),
server_default=sa.func.now(),
nullable=False,
)
)
batch.add_column(
sa.Column("generation", sa.Integer(), server_default="1", nullable=False)
)
batch.create_foreign_key(
"fk_benchmark_runs_capability_deployment",
"capability_deployments",
["capability_deployment_id"],
["id"],
ondelete="RESTRICT",
)
batch.create_check_constraint(
"ck_benchmark_runs_operator_identity",
"(actor_subject IS NULL AND idempotency_key IS NULL AND "
"request_fingerprint IS NULL AND capability_deployment_id IS NULL) OR "
"(actor_subject IS NOT NULL AND idempotency_key IS NOT NULL AND "
"request_fingerprint IS NOT NULL AND capability_deployment_id IS NOT NULL)",
)
batch.create_unique_constraint(
"uq_benchmark_runs_actor_idempotency", ["actor_subject", "idempotency_key"]
)
else:
op.alter_column("benchmark_runs", "deployment_id", existing_type=sa.Uuid(), nullable=True)
op.add_column(
"benchmark_runs", sa.Column("capability_deployment_id", sa.Uuid(), nullable=True)
)
op.add_column("benchmark_runs", sa.Column("target_snapshot", sa.JSON(), nullable=True))
op.add_column("benchmark_runs", sa.Column("actor_subject", sa.String(255), nullable=True))
op.add_column("benchmark_runs", sa.Column("idempotency_key", sa.String(128), nullable=True))
op.add_column(
"benchmark_runs", sa.Column("request_fingerprint", sa.String(64), nullable=True)
)
op.add_column("benchmark_runs", sa.Column("failure_code", sa.String(64), nullable=True))
op.add_column(
"benchmark_runs", sa.Column("cancellation_requested_at", sa.DateTime(timezone=True))
)
op.add_column(
"benchmark_runs",
sa.Column(
"created_at",
sa.DateTime(timezone=True),
server_default=sa.func.now(),
nullable=False,
),
)
op.add_column(
"benchmark_runs",
sa.Column("generation", sa.Integer(), server_default="1", nullable=False),
)
op.create_foreign_key(
"fk_benchmark_runs_capability_deployment",
"benchmark_runs",
"capability_deployments",
["capability_deployment_id"],
["id"],
ondelete="RESTRICT",
)
op.create_check_constraint(
"ck_benchmark_runs_operator_identity",
"benchmark_runs",
"(actor_subject IS NULL AND idempotency_key IS NULL AND "
"request_fingerprint IS NULL AND capability_deployment_id IS NULL) OR "
"(actor_subject IS NOT NULL AND idempotency_key IS NOT NULL AND "
"request_fingerprint IS NOT NULL AND capability_deployment_id IS NOT NULL)",
)
op.create_unique_constraint(
"uq_benchmark_runs_actor_idempotency",
"benchmark_runs",
["actor_subject", "idempotency_key"],
)
op.create_index("ix_benchmark_runs_actor_subject", "benchmark_runs", ["actor_subject"])
op.create_index(
"ix_benchmark_runs_capability_deployment_completed",
"benchmark_runs",
["capability_deployment_id", "completed_at"],
)
if op.get_bind().dialect.name == "postgresql":
op.execute("REVOKE DELETE, TRUNCATE ON benchmark_runs FROM modelforge_runtime")
op.execute("GRANT SELECT, INSERT, UPDATE ON benchmark_runs TO modelforge_runtime")
def downgrade() -> None:
bind = op.get_bind()
benchmark_runs = sa.table("benchmark_runs", sa.column("actor_subject", sa.String()))
operator_history = bind.scalar(
sa.select(sa.func.count())
.select_from(benchmark_runs)
.where(benchmark_runs.c.actor_subject.is_not(None))
)
if operator_history:
raise RuntimeError(
"Operator benchmark history exists; restore the pre-migration backup instead of deleting it."
)
op.drop_index("ix_benchmark_runs_capability_deployment_completed", table_name="benchmark_runs")
op.drop_index("ix_benchmark_runs_actor_subject", table_name="benchmark_runs")
if op.get_bind().dialect.name == "sqlite":
with op.batch_alter_table("benchmark_runs", recreate="always") as batch:
batch.drop_constraint("uq_benchmark_runs_actor_idempotency", type_="unique")
batch.drop_constraint("ck_benchmark_runs_operator_identity", type_="check")
batch.drop_constraint("fk_benchmark_runs_capability_deployment", type_="foreignkey")
for column in (
"generation",
"created_at",
"cancellation_requested_at",
"request_fingerprint",
"failure_code",
"idempotency_key",
"actor_subject",
"target_snapshot",
"capability_deployment_id",
):
batch.drop_column(column)
batch.alter_column("deployment_id", existing_type=sa.Uuid(), nullable=False)
else:
op.drop_constraint("uq_benchmark_runs_actor_idempotency", "benchmark_runs", type_="unique")
op.drop_constraint("ck_benchmark_runs_operator_identity", "benchmark_runs", type_="check")
op.drop_constraint(
"fk_benchmark_runs_capability_deployment", "benchmark_runs", type_="foreignkey"
)
for column in (
"generation",
"created_at",
"cancellation_requested_at",
"request_fingerprint",
"failure_code",
"idempotency_key",
"actor_subject",
"target_snapshot",
"capability_deployment_id",
):
op.drop_column("benchmark_runs", column)
op.alter_column("benchmark_runs", "deployment_id", existing_type=sa.Uuid(), nullable=False)