Files
ss-tools/backend/alembic/versions/e6f7a8b9c0d1_add_translation_run_observability_metrics.py
busya 49a566359a feat: translate module — runtime knobs, GRACE anchors, two-layer testing, QA fixes
Implementation:
- Performance knobs: llm_batch_max_rows, llm_concurrency, insert_concurrency,
  multi_lang_mode, batch_aggressiveness, max_in_flight_batches
- Alembic migration f7a8b9c0d1e2 (idempotent, nullable, non-destructive)
- LLM provider capabilities: throughput_class, reasoning_control,
  supports_json_object, default/max_llm_concurrency
- TargetSchemaValidationRequest with conditional validator (sqllab/direct_db)
- Scheduler: background dispatch, local imports for lazy bootstrap

GRACE-Poly compliance:
- Semantic anchors on orchestrator_aggregator, orchestrator_sql, llm_provider
- Shared module _llm_http.py: _apply_reasoning_control extraction (INV_4)
- Alembic migration anchors per C3/C1 template
- Four renamed Svelte components: RunOutcomeSummary, DetectionQualityCard,
  LanguageStatList, SourceLanguageOverride

QA (this session):
- 11 backend test regressions fixed: spec'd MagicMock null fields for new
  columns, _check_translation_cache_bulk retarget, scheduler mock wiring,
  language_detection=auto assertions, token budget constant update
- 4 frontend eslint errors fixed: SvelteSet/SvelteDate imports,
  unused lang parameter, dead isTransientError
- Production bugfix: job_to_response() mapped 6 missing fields
- Pre-existing auth test failure documented (dependencies.py untouched)
- Axiom: 6440 contracts, 0 warnings
2026-07-20 14:19:47 +03:00

50 lines
2.2 KiB
Python

# #region Alembic.AddTranslationRunObservabilityMetrics [C:3] [TYPE Module] [SEMANTICS alembic,translate,metrics]
# @defgroup Alembic Persist independent source, translation, and insert metrics for translation runs.
"""add translation run observability metrics
Revision ID: e6f7a8b9c0d1
Revises: f5e6d7c8b9a0
"""
from collections.abc import Sequence
import sqlalchemy as sa
from alembic import op
revision: str = "e6f7a8b9c0d1"
down_revision: str | Sequence[str] | None = "f5e6d7c8b9a0"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
# #region Alembic.AddTranslationRunObservabilityMetrics.Upgrade [C:3] [TYPE Function] [SEMANTICS alembic,translate,metrics]
# @ingroup Alembic
# @BRIEF Add nullable run metrics so historical runs remain explicitly unknown.
def upgrade() -> None:
op.add_column("translation_runs", sa.Column("source_records_read", sa.Integer(), nullable=True))
op.add_column("translation_runs", sa.Column("eligible_records", sa.Integer(), nullable=True))
op.add_column("translation_runs", sa.Column("translated_records", sa.Integer(), nullable=True))
op.add_column("translation_runs", sa.Column("same_language_skipped_records", sa.Integer(), nullable=True))
op.add_column("translation_runs", sa.Column("insert_rows_prepared", sa.Integer(), nullable=True))
op.add_column("translation_runs", sa.Column("insert_rows_affected", sa.Integer(), nullable=True))
# #endregion Alembic.AddTranslationRunObservabilityMetrics.Upgrade
# #region Alembic.AddTranslationRunObservabilityMetrics.Downgrade [C:2] [TYPE Function] [SEMANTICS alembic,translate,metrics]
# @ingroup Alembic
# @BRIEF Remove translation-run observability metrics.
def downgrade() -> None:
op.drop_column("translation_runs", "insert_rows_affected")
op.drop_column("translation_runs", "insert_rows_prepared")
op.drop_column("translation_runs", "same_language_skipped_records")
op.drop_column("translation_runs", "translated_records")
op.drop_column("translation_runs", "eligible_records")
op.drop_column("translation_runs", "source_records_read")
# #endregion Alembic.AddTranslationRunObservabilityMetrics.Downgrade
# #endregion Alembic.AddTranslationRunObservabilityMetrics