export const ru = {
  app: {
    title: "kodex",
    subtitle: "staff console",
  },
  nav: {
    operations: "Операции",
    projectManagement: "Управление проектами",
    platform: "Платформа",
    missionControl: "Панель управления",
    projects: "Проекты",
    runs: "Запуски",
    runtimeDeployTasks: "Сборка и деплой",
    waitQueue: "Очередь ожидания",
    approvals: "Апрувы",
    users: "Пользователи",
    projectDetails: "Детали проекта",
    repositories: "Репозитории",
    members: "Участники",
    systemSettings: "Системные настройки",
  },
  common: {
    back: "Назад",
    copy: "Скопировать",
    copied: "Скопировано",
    refresh: "Обновить",
    restart: "Перезапустить",
    stop: "Остановить",
    save: "Сохранить",
    close: "Закрыть",
    doNotShowAgain: "Больше не показывать",
    notImplementedYet: "Пока не реализовано.",
    saved: "Сохранено",
    cancel: "Отмена",
    delete: "Удалить",
    deleted: "Удалено",
    comingSoon: "Скоро",
    createOrUpdate: "Создать / Обновить",
    attachEnsureWebhook: "Подключить + настроить вебхук",
    loading: "Загрузка...",
    logout: "Выйти",
    loginWithGitHub: "Войти через GitHub",
    id: "ID",
    reset: "Сбросить",
    expand: "раскрыть",
    collapse: "свернуть",
  },
  context: {
    allObjects: "Все объекты",
    projectNotSelected: "Проект не выбран",
    project: "Проект",
  },
  nextStep: {
    loading: "Проверяю переход и рассчитываю изменения лейблов...",
    confirm: "Запустить шаг",
    executeSuccess: "Следующий шаг запущен.",
    fields: {
      repository: "Репозиторий",
      thread: "Тред GitHub",
      actionKind: "Тип действия",
      targetLabel: "Целевой лейбл",
    },
    actionKinds: {
      issue_stage_transition: "Переход этапа на Issue",
      pull_request_label_add: "Постановка лейбла на PR",
    },
    thread: {
      issue: "Issue",
      pullRequest: "PR",
    },
    labels: {
      removed: "Будут сняты",
      added: "Будут добавлены",
      final: "Итоговый набор лейблов",
      empty: "Нет изменений",
    },
    variants: {
      revise: {
        title: "🔁 Доработать текущий этап",
        description: "Платформа снимет текущие run-лейблы с Issue и запустит revise-итерацию для выбранного этапа.",
      },
      full_flow: {
        title: "🧭 Полный флоу",
        description: "Переход к следующему этапу полного delivery-флоу для крупных инициатив и новых сервисов.",
      },
      shortened_flow: {
        title: "⚡ Сокращенный флоу",
        description: "Переход к следующему этапу сокращенного флоу для доработки существующего сервиса или продукта.",
      },
      very_short_flow: {
        title: "🚀 Очень короткий флоу",
        description: "Переход к следующему этапу quick-fix траектории с минимальным числом стадий.",
      },
      full_or_shortened_flow: {
        title: "🧭 Полный или сокращенный флоу",
        description: "Этот шаг подходит одновременно для полного и сокращенного delivery-флоу.",
      },
      full_or_very_short_flow: {
        title: "🧭 Полный или очень короткий флоу",
        description: "Этот шаг подходит для полного флоу и для очень короткой quick-fix траектории.",
      },
      shortened_or_very_short_flow: {
        title: "⚡ Сокращенный или очень короткий флоу",
        description: "Этот шаг подходит для сокращенного feature-флоу и для очень короткой quick-fix траектории.",
      },
      all_flows: {
        title: "🧭 Любой рабочий флоу",
        description: "Этот шаг разрешен во всех основных delivery-флоу и ведет к общей следующей стадии.",
      },
      reviewer: {
        title: "🔎 Запустить reviewer",
        description: "Платформа добавит `need:reviewer` на PR и запустит reviewer без изменения run-лейблов на Issue.",
      },
      rethink: {
        title: "♻️ Переосмыслить задачу",
        description: "Платформа снимет текущие run-лейблы и запустит переосмысление задачи перед новым выбором траектории.",
      },
      doc_audit: {
        title: "📚 Запустить doc-audit",
        description: "Платформа переключит Issue на аудит документации, трассируемости и соответствия кодовой базы.",
      },
      self_improve: {
        title: "🧠 Запустить self-improve",
        description: "Платформа переключит Issue на улучшение промптов, инструкций и вспомогательных инструментов платформы.",
      },
      prepare_plan: {
        title: "🗂 Подготовить plan/remediation",
        description: "Платформа переключит Issue на подготовку remediation-плана после аудита или анализа проблемы.",
      },
      go_to_dev: {
        title: "🛠 Перейти к исправлениям",
        description: "Платформа переключит Issue на реализацию исправлений и подготовку изменений в коде или документации.",
      },
      go_to_qa: {
        title: "🧪 Проверить исправления",
        description: "Платформа переключит Issue на проверку уже подготовленных изменений и регрессионных сценариев.",
      },
      restart_full: {
        title: "🧭 Полный перезапуск флоу",
        description: "Платформа перезапустит проработку по полной траектории, начиная с `run:intake`.",
      },
      restart_shortened: {
        title: "⚡ Сокращенный перезапуск",
        description: "Платформа перезапустит проработку по сокращенному feature-флоу, начиная с `run:prd`.",
      },
      restart_very_short: {
        title: "🚀 Очень короткий перезапуск",
        description: "Платформа перезапустит проработку по quick-fix траектории, начиная с `run:plan`.",
      },
    },
  },
  notifications: {
    title: "Уведомления",
    items: {
      sample1: { title: "Запрошен MCP-апрув", subtitle: "Tool: github, action: create.pull_request" },
      sample2: { title: "Запуск в ожидании", subtitle: "wait_state = owner_review" },
    },
  },
  scaffold: {
    metrics: {
      total: "Всего",
      filtered: "Отфильтровано",
      updatedAt: "Обновлено",
    },
    filters: {
      search: "Поиск",
    },
    table: {
      settings: "Настройки таблицы",
      density: "Плотность",
      densityDefault: "По умолчанию",
      densityComfortable: "Комфортная",
      densityCompact: "Компактная",
      columns: "Колонки",
    },
    states: {
      errorTitle: "Не удалось загрузить",
      errorText: "Это scaffold-состояние ошибки. Нажмите «Повторить», чтобы повторить загрузку.",
      emptyTitle: "Ничего не найдено",
      emptyText: "Нет строк, подходящих под текущие фильтры.",
      noRows: "Строк нет.",
    },
    actions: {
      retry: "Повторить",
      clearFilters: "Сбросить фильтры",
    },
    rowActions: {
      view: "Открыть",
      edit: "Редактировать",
      delete: "Удалить",
    },
  },
  table: {
    fields: {
      name: "Имя",
      namespace: "Namespace",
      status: "Статус",
      age: "Возраст",
      part_of: "Часть",
      keys: "Ключи",
      type: "Тип",
      volume: "Том",
      capacity: "Емкость",
      accessModes: "Доступ",
      storageClass: "StorageClass",
      ready: "Готовность",
      updated: "Обновлено",
      restarts: "Рестарты",
      completions: "Завершения",
      duration: "Длительность",
      kind: "Тип",
      key: "Ключ",
      description: "Описание",
      created_at: "Время создания",
      started_at: "Начато",
      finished_at: "Завершено",
      wait_since: "Ожидание с",
      dominant_wait: "Dominant wait",
      next_step: "Следующий шаг",
      trigger_kind: "Вид триггера",
      agent_key: "Агент",
      wait_state: "Состояние ожидания",
      project: "Проект",
      run: "Запуск",
      tool_name: "Инструмент",
      tool: "Инструмент",
      action: "Действие",
      scope: "Scope",
      approver: "Апрувер",
      outcome: "Результат",
      requested_by: "Запросил",
      actor: "Актор",
      object: "Объект",
      env: "Окружение",
      correlation_id: "Корреляция",
      code: "Код",
      is_default: "По умолчанию",
      limits: "Лимиты",
      mode: "Режим",
      job_namespace: "Job namespace",
      job_name: "Job",
      target_env: "Целевое окружение",
      runtime_mode: "Режим рантайма",
      build_ref: "Build ref",
      updated_at: "Обновлено",
      slot_no: "Слот",
      repository_full_name: "Репозиторий",
      services_yaml_path: "Путь services.yaml",
      attempts: "Попытки",
      operation_class: "Операция",
      last_error: "Последняя ошибка",
      stage: "Этап",
      level: "Уровень",
      message: "Сообщение",
      repository: "Репозиторий",
      tag: "Тег",
      digest: "Digest",
      config_size_bytes: "Размер конфигурации",
    },
  },
  cluster: {
    namespace: "Namespace",
    mode: {
      viewOnly: "view-only",
      dryRun: "dry-run",
      normal: "normal",
    },
    modeHint: {
      viewOnly: "Режим только просмотра. Действия create/update/delete должны быть выключены.",
      dryRun: "Режим dry-run. Кнопки действий есть для dogfooding, но backend не должен применять destructive изменения.",
      normal: "Обычный режим (будущее).",
    },
    details: {
      title: "Ресурс",
      scaffoldNote: "Заглушка: страница ресурса. Интеграция с backend пока не реализована.",
      tabs: {
        overview: "Обзор",
        yaml: "YAML",
        events: "События",
        related: "Связанные",
        logs: "Логи",
      },
      metrics: {
        status: "Статус",
        age: "Возраст",
        mode: "Режим",
      },
      previewTitle: "Предпросмотр действия",
      viewOnlyWarning: "view-only: destructive действия выключены.",
      dryRunWarning: "dry-run: backend не должен применять destructive изменения.",
      dryRunOk: "dry-run OK, но действие запрещено в этом режиме.",
      deleteNotImplemented: "Удаление пока не реализовано.",
    },
  },
  roles: {
    read: "только чтение",
    readWrite: "чтение/запись",
    admin: "админ",
  },
  bool: {
    true: "true",
    false: "false",
  },
  placeholders: {
    projectSlug: "kodex",
    projectName: "kodex",
    // vue-i18n treats `@` as a linked-message marker, so we must use literal interpolation.
    userEmail: "user{'@'}example.com",
    repoOwner: "kodex",
    repoName: "kodex",
    servicesYamlPath: "services.yaml",
    repoToken: "ghp_... / fine-grained token",
  },
  states: {
    accessRequiredTitle: "Требуется доступ",
    accessRequiredText:
      "Эта консоль защищена GitHub OAuth. Попросите администратора добавить ваш email в allowlist перед первым входом.",
    noProjects: "Пока нет проектов. Сначала вызовите запуск через вебхук.",
    noRuns: "Пока нет запусков.",
    noUsers: "Пользователей нет.",
    noMembers: "Участников нет.",
    noRepos: "Пока нет подключенных репозиториев.",
    noEvents: "Событий нет.",
    noLearningFeedback: "Пока нет learning feedback.",
    noPendingApprovals: "Ожидающих апрувов нет.",
    noWaitQueue: "Очередь ожидания пуста.",
    noRunLogs: "Логи запуска пока не получены.",
    noRuntimeDeployTasks: "Задачи деплоя пока не найдены.",
    noWaitQueueByFilters: "По текущим фильтрам очередь ожидания пуста.",
    noData: "Данных нет.",
  },
  runs: {
    timeline: {
      title: "Таймлайн",
      created: "Создано",
      buildDeploy: "Сборка и деплой",
      started: "Начато",
      authResolved: "Авторизация Codex пройдена",
      agentReady: "Агент готов",
      waiting: "Ожидание",
      finished: "Завершено",
      waitState: "wait_state",
      status: "status",
      buildFailed: "Завершилось до передачи управления агенту",
      events: {
        workerHeartbeatMissed: "Worker перестал отправлять heartbeat",
        workerHeartbeatMissedWithActor: "Worker перестал отправлять heartbeat · {actorId}",
        staleLeaseDetected: "Обнаружен stale lease",
        staleLeaseDetectedWithActor: "Обнаружен stale lease · {actorId}",
        staleLeaseReleased: "Освобожден stale lease",
        staleLeaseReleasedWithActor: "Освобожден stale lease · {actorId}",
        leaseReclaimedAfterStale: "Lease восстановлен после stale lease",
        leaseReclaimedAfterStaleWithActor: "Lease восстановлен после stale lease · {actorId}",
      },
    },
    waits: {
      waitStates: {
        waitingBackpressure: "GitHub backpressure",
      },
      waitReasons: {
        githubRateLimit: "GitHub rate limit",
      },
      contours: {
        platformPat: "Platform PAT",
        agentBotToken: "Agent bot token",
      },
      limitKinds: {
        primary: "Primary limit",
        secondary: "Secondary limit",
      },
      operationClasses: {
        runStatusComment: "Обновление service-comment",
        issueLabelTransition: "Переход stage-лейбла",
        repositoryProviderCall: "Platform GitHub call",
        agentGithubCall: "Agent GitHub call",
      },
      states: {
        open: "Открыт",
        autoResumeScheduled: "Автовозобновление запланировано",
        autoResumeInProgress: "Автовозобновление выполняется",
        resolved: "Разрешен",
        manualActionRequired: "Нужно ручное действие",
        cancelled: "Отменен",
      },
      confidence: {
        deterministic: "Детерминированно",
        conservative: "Консервативно",
        providerUncertain: "Провайдер неуверен",
      },
      hints: {
        rateLimitReset: "Ждать до reset",
        retryAfter: "Ждать Retry-After",
        exponentialBackoff: "Ждать по backoff",
        manualOnly: "Только ручной путь",
      },
      hintSources: {
        resetAt: "Источник: x-ratelimit-reset",
        retryAfter: "Источник: Retry-After",
        providerUncertain: "Источник: provider uncertain",
      },
      manualActions: {
        requeuePlatformOperation: "Повторить platform operation",
        resumeAgentSession: "Возобновить agent session",
        retryAfterOperatorReview: "Повтор после operator review",
      },
      commentMirror: {
        synced: "Comment mirror синхронизирован",
        pendingRetry: "Comment mirror ждет retry",
        notAttempted: "Comment mirror не запускался",
      },
      realtime: {
        waitEntered: "Run вошел в wait",
        waitUpdated: "Wait обновлен",
        waitResolved: "Wait разрешен",
        waitManualActionRequired: "Нужно ручное действие",
        resolutions: {
          autoResumed: "Автовозобновление",
          manuallyResolved: "Разрешено вручную",
          cancelled: "Отменено",
        },
      },
    },
  },
  logs: {
    title: "Логи",
    follow: "Следить",
    download: "Скачать",
    status: "Статус",
    updatedAt: "Обновлено",
    lines: "Строк",
    search: "Поиск по логам",
    noLines: "Строк логов нет.",
  },
  runtimeErrors: {
    open: "Открыть",
    dismiss: "Скрыть",
    levels: {
      error: "Ошибка платформы",
      warning: "Предупреждение платформы",
      critical: "Критическая ошибка платформы",
    },
  },
  pages: {
    missionControl: {
      title: "Mission Control",
      hint: "Graph-first workspace для continuity между discussion, work items, runs и pull requests.",
      refreshNow: "Обновить сейчас",
      freshness: "Свежесть",
      realtime: "Realtime",
      listProjection: "Открыть list projection",
      primaryWorkspace: "Primary workspace",
      graphTitle: "Graph workspace",
      listTitle: "List projection",
      filterLabel: "Active-state preset",
      searchLabel: "Поиск по graph workspace",
      viewModes: {
        graph: "Graph",
        list: "List",
      },
      fixedFilters: {
        openScope: "open_only",
        assignmentScope: "assigned_to_me_or_unassigned",
      },
      freshnessStates: {
        fresh: "fresh",
        stale: "stale",
        degraded: "degraded",
        unknown: "unknown",
      },
      realtimeStates: {
        connecting: "подключение",
        connected: "подключено",
        reconnecting: "переподключение",
        disconnected: "отключено",
      },
      summary: {
        roots: "Инициативы",
        nodes: "Узлы",
        blocking_gaps: "Blocking gaps",
        warning_gaps: "Warning gaps",
        recent_closed_context: "Recent closed",
        review: "Ревью",
      },
      summaryHints: {
        roots: "Количество корневых инициатив в текущем snapshot.",
        nodes: "Сколько graph-узлов попало в рабочую выборку.",
        blocking_gaps: "Пробелы continuity, которые блокируют следующий stage step.",
        warning_gaps: "Неблокирующие continuity сигналы, которые нужно держать в поле зрения.",
        recent_closed_context: "Dimmed recent-closed context, оставленный только для graph integrity.",
        review: "Узлы в состоянии review внутри текущего active preset.",
      },
      filters: {
        all_active: "Всё активное",
        working: "В работе",
        waiting: "Ожидают",
        blocked: "Блокеры",
        review: "Ревью",
        recent_critical_updates: "Критичные обновления",
      },
      states: {
        working: "В работе",
        waiting: "Ожидают",
        blocked: "Блокеры",
        review: "Ревью",
        recent_critical_updates: "Критичные обновления",
        archived: "Архивный контекст",
      },
      nodeKinds: {
        discussion: "Discussion",
        work_item: "Work item",
        run: "Run",
        pull_request: "Pull request",
      },
      visibility: {
        primary: "Primary",
        secondary_dimmed: "Secondary / dimmed",
      },
      continuity: {
        complete: "Continuity complete",
        missing_run: "Нет связанного run",
        missing_pull_request: "Нет связанного pull request",
        missing_follow_up_issue: "Нет follow-up issue",
        stale_provider: "Provider stale",
        out_of_scope: "Out of scope",
      },
      coverage: {
        open_primary: "Open primary scope",
        recent_closed_context: "Recent closed context",
        out_of_scope: "Out of scope",
      },
      badges: {
        continuity_gap: "Continuity gap",
        provider_stale: "Provider stale",
        recent_closed_context: "Recent closed context",
        waiting_mcp: "Waiting MCP",
        review_required: "Review required",
      },
      watermarks: {
        provider_freshness: "Provider freshness",
        provider_coverage: "Provider coverage",
        graph_projection: "Graph projection",
        launch_policy: "Launch policy",
      },
      gapSeverity: {
        blocking: "Blocking",
        warning: "Warning",
        info: "Info",
      },
      gapKinds: {
        missing_run: "Отсутствует run",
        missing_pull_request: "Отсутствует pull request",
        missing_follow_up_issue: "Отсутствует follow-up issue",
        provider_out_of_scope: "Provider out of scope",
        provider_stale: "Provider stale",
        orphan_node: "Orphan node",
      },
      launchSurfaces: {
        preview_next_stage: "Read-only preview следующего stage",
        open_linked_pull_request: "Открыть связанный pull request",
        open_linked_follow_up_issue: "Открыть связанный follow-up issue",
        open_provider_context: "Открыть provider context",
        inspect_run_context: "Открыть run context",
      },
      providerLinks: {
        "provider.open_issue": "Открыть issue в провайдере",
        "provider.open_pr": "Открыть pull request в провайдере",
        "provider.review": "Открыть review в провайдере",
        "provider.merge": "Открыть merge flow в провайдере",
        "provider.reply_comment": "Открыть discussion в провайдере",
      },
      columns: {
        kind: "Тип",
        title: "Заголовок",
        state: "Состояние",
        continuity: "Continuity",
        visibility: "Visibility",
        root: "Root",
        updated: "Обновлено",
      },
      rootsVisible: "Показано {count} root groups из {total}.",
      groupNodes: "{count} узлов",
      columnIndex: "Колонка {value}",
      blockingGap: "Blocking gap",
      lastActivity: "Последняя активность",
      emptyTitle: "Graph workspace пока пуст",
      emptyText: "Попробуйте другой active preset или обновите snapshot после появления новой continuity-цепочки.",
      loadMore: "Загрузить ещё root groups",
      alerts: {
        invalidateTitle: "Snapshot помечен как устаревший",
        invalidateText: "Realtime запросил refresh. Причина: {reason}. Scope: {scope}. Затронутых узлов: {count}.",
        staleTitle: "Snapshot устарел",
        staleText: "Graph остаётся доступным, но continuity и preview могли измениться. Причина: {reason}. С: {since}.",
        snapshotStaleText: "Snapshot уже загружен в stale-режиме. Перед review continuity и preview лучше выполнить refresh.",
        degradedTitle: "Realtime деградировал",
        degradedText: "Realtime переключился в degraded-режим. Причина: {reason}. Fallback: {fallback}. Затронутые возможности: {capabilities}.",
        snapshotDegradedText: "Snapshot находится в degraded-состоянии. Проверьте watermarks и при необходимости переключитесь в list projection.",
        resyncTitle: "Требуется resync",
        resyncText: "Resume token больше не валиден. Причина: {reason}. Потерянных событий: {dropped}. Нужен новый snapshot.",
        errorTitle: "Ошибка realtime",
        errorText: "Realtime вернул код {code}: {message}. Явный refresh остаётся доступным.",
      },
      relatedSections: {
        formalizations: "Formalization targets",
        linkedRuns: "Связанные runs",
        followUpIssues: "Follow-up issues",
        linkedPullRequests: "Связанные pull requests",
        producedIssues: "Созданные issues",
        linkedIssues: "Связанные issues",
      },
      sidePanel: {
        placeholder: "Выберите узел, чтобы открыть continuity details, activity и launch preview.",
        overview: "Обзор",
        nodeId: "Node ID",
        rootId: "Root node ID",
        projectionVersion: "Projection version",
        providerRef: "Provider reference",
        lastActivity: "Последняя активность",
        repository: "Репозиторий",
        issueNumber: "Issue",
        stageLabel: "Stage label",
        lastProviderSync: "Last provider sync",
        discussionKind: "Тип discussion",
        status: "Статус",
        author: "Автор",
        participants: "Участники",
        latestComment: "Последний комментарий",
        labels: "Лейблы",
        assignees: "Assignees",
        runId: "Run ID",
        agentKey: "Agent key",
        runStatus: "Статус run",
        runtimeMode: "Runtime mode",
        triggerLabel: "Trigger label",
        buildRef: "Build ref",
        candidateNamespace: "Candidate namespace",
        startedAt: "Started at",
        finishedAt: "Finished at",
        pullRequestNumber: "Pull request",
        branchHead: "Head branch",
        branchBase: "Base branch",
        mergeState: "Merge state",
        reviewDecision: "Review decision",
        checksSummary: "Checks summary",
        continuity: "Continuity gaps",
        noContinuityGaps: "Persisted continuity gaps для этого узла не найдены.",
        watermarks: "Watermarks",
        noWatermarks: "Node-level watermarks не возвращены.",
        linkedArtifacts: "Linked artifacts",
        adjacentNodes: "Adjacent nodes",
        noLinkedArtifacts: "Связанные артефакты и соседние узлы не найдены.",
        activity: "Activity / chat",
        noActivity: "Activity stream пока пуст.",
        openProviderEvent: "Открыть событие в провайдере",
        loadMoreActivity: "Загрузить ещё activity",
        launchSurfaces: "Launch surfaces",
        noLaunchSurfaces: "Launch surfaces сейчас недоступны.",
        ownerReviewRequired: "Перед фактическим запуском потребуется owner review.",
        noApprovalRequired: "Дополнительный апрув для preview не требуется.",
        providerLinks: "Provider links",
        noProviderLinks: "Provider deep-links отсутствуют.",
      },
      preview: {
        title: "Launch preview",
        loading: "Подготавливаю read-only preview...",
        readOnlyTitle: "Read-only preview",
        readOnlyText: "Этот экран не запускает command ledger и показывает только ожидаемый label diff и continuity effect.",
        fields: {
          node: "Узел",
          thread: "Thread",
          targetLabel: "Target label",
          approval: "Approval",
        },
        threadKind: {
          issue: "Issue",
          pull_request: "Pull request",
        },
        ownerReviewRequired: "Owner review required",
        noApprovalRequired: "Дополнительный апрув не нужен",
        labels: {
          removed: "Будут сняты",
          added: "Будут добавлены",
          final: "Итоговый набор",
        },
        resolvedGaps: "Будут закрыты",
        remainingGaps: "Останутся открытыми",
        resultingNodes: "Ожидаемые resulting nodes",
        providerRedirects: "Provider redirects",
        openRedirect: "Открыть redirect",
        open: "Открыть preview",
        empty: "Нет данных",
      },
    },
    projects: {
      title: "Проекты",
      createTitle: "Создать / Обновить проект",
      createProject: "Создать проект",
      editProject: "Редактировать проект",
      makeCurrent: "Сделать текущим",
      slug: "Слаг",
      name: "Название",
      role: "Роль",
      manage: "Управление",
      id: "ID",
      repos: "Репо",
      members: "Участники",
      adminOnlyHint: "Только platform admin может создавать проекты и управлять репо/участниками.",
    },
    users: {
      title: "Пользователи",
      editTitle: "Редактировать пользователя",
      addAllowedUser: "Добавить разрешенного пользователя",
      addAllowedUserHint:
        "Регистрация выключена. Добавление email позволяет первичный вход через GitHub OAuth для этого email.",
      email: "Email",
      github: "GitHub",
      admin: "Админ",
      platformAdmin: "Админ платформы",
      yes: "да",
      no: "нет",
    },
    runs: {
      title: "Запуски",
      status: "Статус",
      project: "Проект",
      issue: "Issue",
      pr: "PR",
      triggerKind: "Вид триггера",
      triggerLabel: "Триггер-лейбл",
      correlation: "Корреляция",
      created: "Создано",
      started: "Начато",
      finished: "Завершено",
      details: "Детали",
      id: "ID",
      prevPage: "Назад",
      nextPage: "Далее",
      pageInfo: "Страница {current} из {total}",
      pendingApprovals: "Ожидающие апрувы",
      waitQueue: "Очередь ожидания",
      waitQueueHint: "Запуски, ожидающие внешнего действия: MCP-апрува или ревью от владельца.",
      showFilters: "Показать фильтры",
      hideFilters: "Скрыть фильтры",
      applyFilters: "Применить",
      resetFilters: "Сбросить",
      activeFilters: "Фильтров: {count}",
      triggerKindPlaceholder: "например: dev, qa, release",
      statusPlaceholder: "например: running, pending, failed",
      agentKeyPlaceholder: "например: developer, reviewer",
      waitStatePlaceholder: "например: mcp, owner_review",
      waitsFiltersHint: "Для wait queue чаще всего достаточно wait_state = mcp или owner_review.",
      agentKey: "Агент",
      waitState: "Состояние ожидания",
      waitSince: "Ожидание с",
      waitSla: "SLA",
      lastHeartbeatAt: "Последний heartbeat",
      tool: "Инструмент",
      action: "Действие",
      requestedBy: "Запросил",
      resolve: "Решение",
      approve: "Одобрить",
      deny: "Отклонить",
      reasonPrompt: "Причина (опционально)",
    },
    runDetails: {
      title: "Детали запуска",
      runId: "run_id",
      correlation: "correlation_id",
      project: "Проект",
      issue: "Issue",
      pr: "PR",
      triggerKind: "Вид триггера",
      triggerLabel: "Триггер-лейбл",
      job: "Job",
      jobNamespace: "Job namespace",
      noJob: "Job не найдена",
      flowEvents: "События",
      learningFeedback: "Фидбек (learning)",
      cancelRun: "Остановить run",
      cancelRunConfirm: "Отменить этот run и остановить связанные runtime-артефакты?",
      runCanceled: "run отменен",
      runAlreadyTerminal: "run уже был в terminal status",
      runCanceledWaits: "Отменено GitHub wait: {count}",
      deleteNamespace: "Удалить namespace",
      deleteNamespaceConfirm: "Выполнить принудительное удаление namespace для этого запуска?",
      namespace: "namespace",
      namespaceDeleted: "удален",
      namespaceAlreadyDeleted: "уже удален",
      waitState: "wait_state",
      waitReason: "wait_reason",
      agentKey: "agent_key",
      waitSince: "wait_since",
      lastHeartbeatAt: "last_heartbeat_at",
      realtime: "Realtime",
      realtimeConnecting: "подключение",
      realtimeConnected: "подключено",
      realtimeReconnecting: "переподключение",
      runLogs: "Логи запуска",
      logsUpdatedAt: "обновлено",
      rawLogsSnapshot: "Сырой JSON snapshot",
      loadEventPayloads: "Загрузить payload событий",
      eventPayloadLoaded: "Payload событий загружен",
      loadSnapshot: "Загрузить snapshot",
      snapshotLoaded: "Snapshot загружен",
      codexAuthRequiredTitle: "Требуется авторизация Codex",
      codexAuthRequiredBadge: "AUTH",
      codexAuthRequiredText:
        "Этот запуск ожидает авторизацию Codex через device code. Откройте ссылку, введите код, затем дождитесь продолжения выполнения.",
      codexAuthUserCode: "Код",
      codexAuthVerificationUrl: "Ссылка",
      codexAuthOpenPage: "Открыть страницу авторизации",
      codexAuthSecurityHint: "Не передавайте код другим. Авторизуйте только если вы запускали этот run.",
      waitProjectionTitle: "Wait visibility",
      dominantWaitTitle: "Dominant wait",
      relatedWaitsTitle: "Related waits",
      realtimeWaitActivity: "Realtime wait-обновления",
      realtimeWaitEmpty: "Realtime wait-события появятся здесь после следующего изменения projection.",
      waitProjectionPending: "Run уже находится в waiting_backpressure, но typed wait projection еще не подтянулась в staff API.",
      waitId: "wait_id",
      waitEnteredAt: "entered_at",
      resumeNotBefore: "resume_not_before",
      suggestedNotBefore: "suggested_not_before",
      recoveryHintSource: "Источник recovery hint",
    },
    projectDetails: {
      title: "Детали проекта",
      projectId: "project_id",
      slug: "Слаг",
      name: "Название",
    },
    projectRepositories: {
      title: "Репозитории проекта",
      projectId: "project_id",
      provider: "Провайдер",
      repo: "Репозиторий",
      servicesYaml: "services.yaml",
      bot: "Бот",
      botParams: "Параметры бота",
      botParamsTitle: "Параметры бота (token/login/email)",
      botUsername: "Bot username",
      botEmail: "Bot email",
      botToken: "Bot token",
      botTokenHint: "Если оставить пустым, текущий bot token будет сохранён.",
      preflight: "Preflight",
      preflightTitle: "Repository preflight",
      runPreflight: "Запустить preflight",
      preflightUpdatedAt: "Preflight обновлён",
      preflightStatus: "Статус",
      preflightChecks: "Проверки",
      preflightRawReport: "Сырой JSON отчёт",
      check: "Проверка",
      status: "Статус",
      details: "Детали",
      docsetImport: "Импорт доксета",
      docsetImportTitle: "Импорт доксета (PR-based)",
      docsetSync: "Синк доксета",
      docsetSyncTitle: "Safe sync доксета (PR-based)",
      docsetLocale: "Локаль",
      docsetRef: "Docset ref",
      docsetGroups: "Группы",
      docsetPrCreated: "Создан PR",
      externalId: "External ID",
      id: "ID",
      attachTitle: "Подключить GitHub репозиторий",
      owner: "Owner",
      name: "Name",
      servicesYamlPath: "Путь к services.yaml",
      repoToken: "Токен репозитория (храним зашифрованным в БД)",
      deleteConfirmMessage:
        "Удалить репозиторий {repo} из проекта? Будут удалены настройки репозитория, результаты preflight и связанные конфиги/секреты уровня репозитория.",
    },
    projectMembers: {
      title: "Участники проекта",
      projectId: "project_id",
      addTitle: "Добавить участника проекта",
      email: "Email",
      userId: "User ID",
      role: "Роль",
      learningOverride: "Переопределение learning mode",
      inherit: "наследовать",
    },

    approvals: {
      title: "Апрувы",
      hint: "Ожидающие апрувы и решения (центр).",
      filters: {
        tool: "Инструмент",
        action: "Действие",
        requestedBy: "Запросил",
      },
      approve: "Одобрить",
      deny: "Отклонить",
      approveTitle: "Одобрить запрос",
      denyTitle: "Отклонить запрос",
      reason: "Причина (опционально)",
    },
    runtimeDeployTasks: {
      title: "Сборка и деплой",
      hint: "Задачи full-env/runtime deploy: статус, параметры и детализация по логам.",
      realtime: "Realtime",
      realtimeConnecting: "подключение",
      realtimeConnected: "подключено",
      realtimeReconnecting: "переподключение",
    },
    runtimeDeployTaskDetails: {
      title: "Детали задачи деплоя",
      summary: "Сводка",
      logs: "Логи задачи",
      realtime: "Realtime",
      realtimeConnecting: "подключение",
      realtimeConnected: "подключено",
      realtimeReconnecting: "переподключение",
      cancelAction: "Безопасно отменить",
      stopAction: "Аварийно остановить",
      actionsGuideTitle: "Операторские действия",
      actionsGuideIntro: "Сначала используйте безопасную отмену. Аварийную остановку применяйте только для зависшего выполняемого деплоя, когда нужен принудительный разрыв выполнения.",
      cancelHelp: "Штатная отмена дает задаче завершить текущий шаг без принудительного обрыва.",
      stopHelp: "Принудительная остановка считается аварийной мерой и доступна только пока у задачи есть активный lease.",
      stopAvailabilityActive: "Аварийная остановка сейчас доступна до {until}. Lease удерживает: {owner}.",
      stopAvailabilityExpired: "Аварийная остановка недоступна: lease истек {until}.",
      stopAvailabilityMissing: "Аварийная остановка недоступна: у задачи сейчас нет активного lease.",
      cancelConfirm: "Отправить штатную безопасную отмену для этой задачи деплоя.",
      stopConfirm: "Принудительно остановить зависший выполняемый деплой. Используйте только если безопасная отмена уже не помогает.",
      actionReasonLabel: "Причина (опционально)",
      actionReasonPlaceholder: "Например: deploy завис на этапе apply и требует ручной остановки",
      actionReasonHint: "Причина попадет в аудит control-plane и будет видна в деталях задачи.",
      actionRequestedResult: "Действие «{action}» отправлено. Текущий статус задачи: {status}.",
      actionAlreadyTerminalResult: "Задача уже завершена в статусе {status}. Дополнительное действие не требуется.",
      cancelUnavailableError: "Безопасная отмена больше недоступна: задача уже завершилась или сменила состояние.",
      stopUnavailableError: "Аварийная остановка больше недоступна: задача уже сменила состояние или lease истек.",
      terminalAudit: "Терминальный аудит",
      cancelAudit: "Запрос на безопасную отмену",
      stopAudit: "Запрос на аварийную остановку",
    },
    waitQueue: {
      title: "Очередь ожидания",
      hint: "Запуски в wait-state: MCP/owner review и GitHub backpressure с contour attribution.",
      genericWait: "Подробная typed wait-проекция для этого run пока недоступна.",
    },
    auditLog: {
      title: "Аудит лог",
      hint: "Заглушка: фильтры и макетные строки.",
    },
    labelsStages: {
      title: "Лейблы и стадии",
      hint: "Политики лейблов и быстрый переход этапа по deep-link из GitHub.",
      transitionCardTitle: "Переход этапа из GitHub",
      transitionCardHint: "Подтвердите смену run:* лейбла. Backend снимет текущие run:* и установит целевой лейбл.",
      repository: "Репозиторий",
      issue: "Issue",
      targetLabel: "Целевой лейбл",
      openIssue: "Открыть Issue",
      applyTransition: "Применить переход",
      confirmTitle: "Подтвердите переход этапа",
      confirmMessage: "Issue {issue}: применить лейбл {label}?",
      transitionApplied: "Переход этапа успешно применен.",
      transitionInvalidQuery: "Ссылка перехода из GitHub неполная или некорректная.",
      removedLabels: "Снятые лейблы",
      addedLabels: "Добавленные лейблы",
      finalLabels: "Итоговые лейблы",
    },
    cluster: {
      namespaces: { title: "Namespaces", hint: "Заглушка: список namespaces (макет + TODO)." },
      configMaps: { title: "ConfigMaps", hint: "Заглушка: список configmaps (макет + TODO)." },
      secrets: { title: "Secrets", hint: "Заглушка: список secrets (только метаданные; макет + TODO)." },
      deployments: { title: "Deployments", hint: "Заглушка: список deployments (макет + TODO)." },
      pods: { title: "Pods", hint: "Заглушка: список pods (макет + TODO)." },
      jobs: { title: "Jobs", hint: "Заглушка: список jobs (макет + TODO)." },
      pvc: { title: "PVC", hint: "Заглушка: список PVC (макет + TODO)." },
    },
    systemSettings: {
      title: "Системные настройки",
      hint: "DB-backed runtime settings с hot reload для long-lived pod'ов и staff UI.",
      realtime: "Realtime",
      realtimeConnecting: "подключение",
      realtimeConnected: "подключено",
      realtimeReconnecting: "переподключение",
      liveHint: "Изменения пишутся в PostgreSQL, versioned audit хранится в control-plane, worker/control-plane перечитывают snapshot без рестарта.",
      empty: "Системные настройки пока не зарегистрированы.",
      enabled: "Включено",
      disabled: "Выключено",
      noActor: "Система",
      saveSuccess: "Системная настройка сохранена.",
      resetSuccess: "Системная настройка сброшена к значению каталога.",
      fields: {
        currentValue: "Текущее значение",
        defaultValue: "Значение по умолчанию",
        updatedAt: "Последнее изменение",
        updatedBy: "Кто изменил",
        visibility: "Видимость",
        key: "Ключ",
      },
      sections: {
        github_rate_limit: "GitHub rate limit",
        quality_governance: "Quality governance",
      },
      sources: {
        default: "Значение каталога",
        staff: "Переопределено staff",
      },
      reload: {
        hot_reload: "Hot reload",
        new_runs_only: "Только для новых запусков",
        restart_required: "Нужен рестарт",
      },
      visibility: {
        staff_visible: "Видно в staff UI",
        internal_only: "Только internal",
        secret_forbidden_in_ws: "Скрыто из realtime",
      },
      settings: {
        github_rate_limit_wait_enabled: {
          title: "GitHub rate-limit wait recovery",
          description: "Управляет persisted wait-контуром, worker sweep и deterministic replay/resume для GitHub rate-limit resilience.",
        },
        quality_governance_enabled: {
          title: "Quality governance foundation",
          description: "Включает canonical change-governance aggregate, hidden draft ingress, semantic wave publication и projection refresh для новых запусков и live callbacks.",
        },
      },
    },
  },
  crumb: {
    missionControl: "Mission Control",
    projectDetails: "Детали проекта",
    projectRepositories: "Репозитории проекта",
    projectMembers: "Участники проекта",
    runDetails: "Детали запуска",
    runtimeDeployTasks: "Сборка и деплой",
    runtimeDeployTaskDetails: "Детали задачи деплоя",
    waitQueue: "Очередь ожидания",
    approvals: "Апрувы",
    systemSettings: "Системные настройки",
  },
  errors: {
    unknown: "Что-то пошло не так.",
    network: "Сетевая ошибка. Попробуйте еще раз.",
    timeout: "Таймаут запроса. Попробуйте еще раз.",
    realtimeUnavailable: "Realtime-поток недоступен. Фоновое переподключение продолжается.",
    copyFailed: "Не удалось скопировать.",
    unauthorized: "Не аутентифицировано.",
    forbidden: "Недостаточно прав.",
    emailNotAllowed: "Ваш email не разрешен. Попросите администратора добавить его.",
    invalidArgument: "Некорректные данные.",
    conflict: "Конфликт.",
    failedPrecondition: "Операцию нельзя выполнить в текущем состоянии задачи.",
    platformAdminRequired: "Требуется админ платформы.",
    platformOwnerRequired: "Требуется овнер платформы.",
    cannotDeleteSelf: "Нельзя удалить самого себя.",
    cannotDeletePlatformAdmin: "Нельзя удалить админа платформы.",
    cannotRemovePlatformOwner: "Нельзя удалить овнера платформы из участников проекта.",
  },
  i18n: {
    enFlag: "🇺🇸",
    ruFlag: "🇷🇺",
  },
} as const;
