{
  "nav": {
    "docs": "Документация",
    "github": "GitHub",
    "status": "Статус",
    "skills": "Скиллы",
    "star": "Star",
    "blog": "Блог"
  },
  "blog": {
    "title": "Заметки про память агентов",
    "subtitle": "Битемпоральные графы, retrieval и жизненный цикл факта — как устроен Brain и почему именно так.",
    "readTime": "{n} мин чтения",
    "read": "Читать",
    "backToBlog": "Все статьи",
    "fallbackNotice": "Перевод готовится — показываем английскую версию.",
    "directAnswer": "Коротко",
    "faqTitle": "Частые вопросы",
    "related": "Похожее"
  },
  "hero": {
    "eyebrow": "Битемпоральный граф знаний",
    "title": "Память, которая помнит когда.",
    "subtitle": "У каждого факта двое часов: когда факт был верен и когда Brain о нём узнал. Спроси, что верно сейчас, — или посмотри, что граф знал в марте. Конфликты не перезаписываются молча — они получают оценку. Forget — это удаление, а не флажок «скрыто». REST или MCP, у себя или в облаке.",
    "ctaPrimary": "Начать",
    "ctaSecondary": "Self-host",
    "trust": {
      "license": "AGPL-3.0",
      "stack": "NestJS · SurrealDB · BGE-M3",
      "eval": "под eval-гейтами в CI"
    },
    "panel": {
      "title": "Битемпоральная шкала",
      "valid": "valid time",
      "txn": "transaction time",
      "note": "По умолчанию запрос отвечает «сейчас». Передай asOf — и тот же запрос вернёт то, что Brain знал на тот момент. Ничего не дорисовывается задним числом."
    }
  },
  "bitemporal": {
    "eyebrow": "Bitemporal · живое демо",
    "title": "Посмотри, что Brain знал — а не что верно сейчас.",
    "subtitle": "Acme перешла со starter на growth 10 марта, но Brain записал это только 12-го. Подвигай оба ползунка: история не переписывается, а воспроизводится.",
    "validLabel": "valid time — когда было правдой",
    "txnLabel": "transaction time — когда Brain узнал",
    "markSwitch": "смена тарифа",
    "markRecorded": "Brain записал",
    "answerLabel": "Brain отвечает",
    "scenario": "сценарий · смена тарифа acme · starter → growth",
    "notes": {
      "unknown": "Часы транзакции стоят раньше 12 марта — Brain ещё не записал смену и отвечает starter даже для дат после 10-го. Это и есть прошлое, воспроизведённое точь-в-точь.",
      "past": "Valid time раньше 10 марта — тогда верным был starter.",
      "current": "Оба времени на «сейчас»: смена произошла, и Brain о ней знает. Актуальный ответ — growth."
    }
  },
  "retrieval": {
    "eyebrow": "Движок поиска",
    "title": "Между запросом и ответом — семь стадий.",
    "subtitle": "Brain не просто сортирует эмбеддинги по похожести. Каждый запрос идёт через пайплайн поверх графа, где любую стадию можно включить флагом и снять с неё метрики — отдельно по каждому тенанту.",
    "queryIn": "запрос и scope тенанта",
    "answerOut": "ранжированные факты с разбивкой score по этапам",
    "note": "Каждую стадию можно включить и измерить отдельно; CI-eval показывает recall по каждому этапу. HNSW, HyPE, PPR и rerank переключаются для каждого тенанта.",
    "stages": [
      { "name": "Hybrid fusion", "desc": "Vector + BM25, свёртка с w=0.5" },
      { "name": "HyPE alt-embeddings", "desc": "Эмбеддинги гипотетических промптов; max(cos_main, cos_alt)" },
      { "name": "Predicate + type router", "desc": "Общий LLM-роутер поднимает нужный класс предиката" },
      { "name": "Edge expansion", "desc": "Обход графа на один шаг добавляет соседей в кандидаты" },
      { "name": "Tier-aware PPR", "desc": "Personalized PageRank в стиле HippoRAG по графу" },
      { "name": "Cross-encoder rerank", "desc": "Cohere переранжирует широкое окно" },
      { "name": "Listwise LLM rerank", "desc": "Permutation self-consistency, агрегация по Борда" }
    ]
  },
  "beyondVector": {
    "eyebrow": "Дальше эмбеддингов",
    "title": "Чего не скажет vector store.",
    "subtitle": "Эмбеддинги находят похожий текст. Слою памяти этого мало.",
    "colA": "Обычный vector store",
    "colB": "INITE Brain",
    "rows": [
      { "a": "Куски текста, ранжированные по косинусу", "b": "Типизированные SPO-факты на графе" },
      { "a": "Только то, что похоже на правду прямо сейчас", "b": "Двое часов — запрос сейчас или на любой момент в прошлом" },
      { "a": "Новый эмбеддинг молча затирает старый", "b": "Конфликты оцениваются; близкие по score помечаются COMPETING" },
      { "a": "Удалил строку и надеешься, что её нет", "b": "Forget каскадом удаляет факты, рёбра и эмбеддинги — остаётся только HMAC-tombstone" },
      { "a": "Связей между записями нет вообще", "b": "Типизированные рёбра и multi-hop планировщик по ним" },
      { "a": "PII лежит в том же индексе, что и всё остальное", "b": "PII закрыта на уровне БД, по scope вызывающего" }
    ]
  },
  "dualPath": {
    "eyebrow": "Self-host или хостинг",
    "title": "Два способа запустить. Один граф.",
    "selfHost": {
      "label": "Open source",
      "title": "Self-host",
      "desc": "Склонируй репозиторий, подними SurrealDB, пропиши свои ключи. AGPL-3.0 — каждую строчку можно прочитать, форкнуть и прислать обратно.",
      "bullets": [
        "Docker Compose — SurrealDB и сервис за минуты",
        "Ничего не уходит из твоей сети",
        "BGE-M3 считает эмбеддинги локально — без обращений к OpenAI",
        "Админ-панель и набор eval-тестов — всё в репозитории"
      ],
      "cmd": "docker compose up -d",
      "cta": "Гайд по self-host"
    },
    "managed": {
      "label": "Managed",
      "title": "brain.inite.ai",
      "desc": "Та же сборка, только без возни с серверами. Хостинг-эндпоинт передеплоивается на каждый push в main.",
      "bullets": [
        "Ни серверов, ни базы, за которыми надо следить",
        "Изоляция на тенанта, scoped API-ключи",
        "Health и Prometheus-метрики из коробки",
        "Тот же REST + MCP, что в self-host"
      ],
      "endpoint": "https://brain.inite.ai",
      "cta": "Открыть дашборд"
    }
  },
  "stats": {
    "eyebrow": "Результаты eval",
    "title": "Насколько хорошо он на самом деле ищет.",
    "subtitle": "У Brain есть собственный eval-сьют. Это свежие оценки на бенчмарках retrieval и memory-lifecycle — измеренные, а не заявленные.",
    "gateLabel": "гейт",
    "byVertical": "recall@1 по вертикалям",
    "correctness": "корректность · всё под гейтом 1.0",
    "footnote": "Из eval-отчёта, n=262 (multi-vertical сьют + wikidata). На temporal-запросах recall@1 1.000 (n=21), на current — 0.959 (n=241). Каждый push прогоняет заново; ниже гейта сборка падает.",
    "items": [
      { "label": "recall@1", "value": "0.965", "floor": "≥ 0.6" },
      { "label": "faithfulness", "value": "1.000", "floor": "≥ 0.8" },
      { "label": "identity-F1", "value": "1.000", "floor": "≥ 0.8" },
      { "label": "memory-lifecycle", "value": "1.000", "floor": "= 1.0" }
    ]
  },
  "features": {
    "eyebrow": "Остальной стек",
    "title": "Не просто ретривер.",
    "subtitle": "Всё, что между ingest и ответом, которому можно верить.",
    "items": [
      {
        "tag": "Ingest",
        "title": "Разрешение конфликтов",
        "desc": "Два ingest на один факт идут через лестницу скоринга — confidence × source-trust × recency × authority. Близкие по score случаи помечаются COMPETING, а не перезаписываются молча."
      },
      {
        "tag": "Граф",
        "title": "Резолюция идентичности",
        "desc": "Слияния между вертикалями схлопывают дубликаты в одну сущность через рёбра identity_of; переатрибуция идёт по mergedInto. B³ identity-F1 держится на 1.0."
      },
      {
        "tag": "Lifecycle",
        "title": "GDPR-forget",
        "desc": "Forget — синхронное жёсткое удаление: факты, рёбра, эмбеддинги исчезают. Остаётся только HMAC-tombstone — доказательство, что это произошло."
      },
      {
        "tag": "Safety",
        "title": "Барьер для PII",
        "desc": "PII закрыта на уровне БД через PERMISSIONS и scope вызывающего. Каждый предикат заранее объявляет свой PII-класс."
      },
      {
        "tag": "Retrieval",
        "title": "Multi-hop",
        "desc": "Планировщик-LLM режет вопрос на несколько заякоренных под-запросов — до четырёх. Опорные факты тянутся дальше, чтобы считать joint-F1 в стиле HotpotQA."
      },
      {
        "tag": "Synthesis",
        "title": "Честные ответы",
        "desc": "/v1/synthesize гоняет corrective-RAG в режимах strict / lenient / off и проверяет правдивость каждого утверждения. Pass-rate под гейтом 1.0."
      },
      {
        "tag": "Schema",
        "title": "Онтология предикатов",
        "desc": "Реестр на каждого тенанта, по сути OWL. У каждого предиката есть семантика, decay и PII-класс — их читают и роутер, и резолвер."
      },
      {
        "tag": "Ops",
        "title": "Dreams",
        "desc": "В нерабочие часы Brain дедупит сущности, разрешает конкурирующие факты и суммаризует. Самоулучшение по расписанию, а не руками."
      },
      {
        "tag": "Tenancy",
        "title": "Изоляция на тенанта",
        "desc": "У каждой компании своя база (co_<id>). Один REMOVE DATABASE забывает целого тенанта. Между тенантами ничего не протекает."
      }
    ]
  },
  "quickstart": {
    "eyebrow": "Быстрый старт",
    "title": "Три способа поговорить с Brain.",
    "subtitle": "Выбери тот, что подходит под твой стек."
  },
  "mcpBlock": {
    "eyebrow": "Model Context Protocol",
    "title": "Один блок конфига. Шесть инструментов. Любой клиент.",
    "subtitle": "MCP-URL на тенанта, scope-aware. Вставь в Claude Desktop, Cursor, Goose или n8n — агент получает те же шесть инструментов.",
    "toolsLabel": "Шесть scope-aware инструментов",
    "clients": "Один URL, один заголовок, ноль glue-кода — всё, что говорит на MCP.",
    "linkLabel": "Гайд по настройке MCP"
  },
  "skillsBlock": {
    "eyebrow": "Скиллы агента",
    "title": "Скиллы, которые учат агента работать с Brain.",
    "subtitle": "Четыре Anthropic-skill — search, recall, битемпоральные запросы и пошаговая настройка. Один curl ставит их в ~/.claude/skills.",
    "linkLabel": "Все скиллы",
    "installCmd": "curl -fsSL https://brain.inite.ai/install.sh | sh"
  },
  "openSource": {
    "eyebrow": "Open source",
    "title": "Разрабатывается открыто, лицензия AGPL-3.0.",
    "subtitle": "Читай код, поднимай своё, присылай PR. Всё, что крутит brain.inite.ai, лежит в репозитории.",
    "license": {
      "note": "Сетевой copyleft: self-host — свободно, но правки, которые ты отдаёшь по сети, остаются открытыми."
    },
    "links": {
      "readme": "README",
      "contributing": "Контрибьютинг",
      "security": "Безопасность",
      "license": "Лицензия"
    },
    "stack": {
      "label": "Собрано на"
    },
    "cta": {
      "title": "Поставь звезду",
      "desc": "Следи за релизами, заводи issues, присылай патчи. Роадмап открытый.",
      "button": "Star на GitHub"
    }
  },
  "footer": {
    "tagline": "Open-source битемпоральный граф знаний для AI-агентов. System of insight, не system of record.",
    "columns": {
      "product": {
        "title": "Продукт",
        "docs": "Документация",
        "blog": "Блог",
        "quickstart": "Быстрый старт",
        "mcp": "Настройка MCP",
        "skills": "Скиллы"
      },
      "project": {
        "title": "Проект",
        "github": "GitHub",
        "license": "Лицензия",
        "contributing": "Контрибьютинг",
        "security": "Безопасность"
      },
      "resources": {
        "title": "Ресурсы",
        "openapi": "OpenAPI",
        "status": "Статус",
        "api": "API-референс"
      }
    },
    "copyright": "© 2026 INITE Brain",
    "license": "AGPL-3.0-or-later"
  },
  "docs": {
    "indexTitle": "Документация",
    "indexSubtitle": "Концепции, REST API, настройка MCP, оператор-плейбук.",
    "groups": {
      "start": "С чего начать",
      "concepts": "Концепции",
      "rest": "REST API",
      "mcp": "MCP",
      "ops": "Эксплуатация"
    },
    "pages": {
      "getting-started": {
        "title": "Getting started",
        "description": "Авторизация, первый ingest, первый search. ~5 минут."
      },
      "bitemporal": {
        "title": "Битемпоральная модель",
        "description": "Две оси времени у факта. Семантика asOf и Allen-interval примеры."
      },
      "predicates": {
        "title": "Словарь предикатов",
        "description": "single_active vs bitemporal vs append_only. Decay, PII, v1.1 контент-предикаты."
      },
      "conflict-resolution": {
        "title": "Разрешение конфликтов",
        "description": "Формула скоринга, исходы COMPETING / SUPERSEDED / REJECTED, dead-letter."
      },
      "search": {
        "title": "POST /v1/search",
        "description": "Гибридный pipeline поиска, форма запроса/ответа, per-leg CI."
      },
      "synthesize": {
        "title": "POST /v1/synthesize",
        "description": "Corrective-RAG со строгими/мягкими/выключенными guardrails + claim-level faithfulness."
      },
      "ingest": {
        "title": "POST /v1/ingest/*",
        "description": "Структурированный ingest, NLU mention extraction, типизированные ребра."
      },
      "multi-hop": {
        "title": "POST /v1/search/multi-hop",
        "description": "Planner LLM раскладывает запрос на под-запросы, joint-F1 evaluable supporting facts."
      },
      "entities": {
        "title": "GET /v1/entities/*",
        "description": "Профиль + timeline + connections + forget."
      },
      "retract": {
        "title": "POST /v1/facts/:id/retract",
        "description": "Пометить факт retracted. Остаётся в audit trail с причиной."
      },
      "mcp-setup": {
        "title": "Настройка MCP",
        "description": "Конфиги для Claude Desktop, Cursor, Goose, n8n."
      },
      "mcp-tools": {
        "title": "MCP инструменты",
        "description": "Шесть scope-aware инструментов с полными Zod-схемами."
      },
      "skills": {
        "title": "Бандл скиллов",
        "description": "Четыре Anthropic-skill, install.sh, модель версионирования."
      },
      "operator-playbook": {
        "title": "Оператор-плейбук",
        "description": "Day-2 операции — ключи, скоупы, dreams cron, baseline diffs."
      },
      "security": {
        "title": "Модель безопасности",
        "description": "JWT, скоупы, per-tenant изоляция, GDPR forget, PII gating."
      }
    },
    "prev": "Назад",
    "next": "Дальше",
    "rev": {
      "ru-pending": "Перевод готовится — показываем английскую версию."
    }
  },
  "admin": {
    "common": {
      "refresh": "обновить",
      "auto": "авто",
      "autoSeconds": "авто {seconds}с",
      "loading": "загрузка…",
      "noData": "—"
    },
    "leases": {
      "title": "Аренды и заявки",
      "subtitle": "Выборы лидера и активные заявки job_run по флоту. Здесь видно зависших воркеров, протухшие аренды без перезахвата и поды, держащие больше своей доли.",
      "queueModeTip": {
        "enqueue": "крон складывает строки в очередь; worker loop диспатчит",
        "inline": "kill switch активен — крон работает инлайн (поведение до Phase J)"
      },
      "queueModeLabel": "очередь",
      "leaderBadge": "worker_loop лидер",
      "followerBadge": "фолловер",
      "handlersLabel": "хэндлеры",
      "noHandlers": "нет",
      "poolLabel": "пул",
      "poolBusy": "{busy}/{size} занято",
      "poolDisabled": "выключен",
      "poolWaiting": "+{n} ждут",
      "poolTip": "JobWorkerPool — пул node:worker_threads для cpuBound-хэндлеров (сейчас ни один хэндлер не включён; size=0 выключает пул)",
      "leaderLeases": {
        "title": "Аренды лидера",
        "subtitle": "Именованные локи в leader_lease (system DB). При multi-pod деплое одну аренду держит один под.",
        "headers": {
          "name": "имя",
          "leader": "лидер",
          "acquired": "захвачено",
          "expires": "истекает через"
        },
        "empty": "Аренд нет. Либо система свежая, либо все кроны чисто отпустили свои аренды."
      },
      "activeClaims": {
        "title": "Активные заявки",
        "subtitle": "Строки job_run в статусе 'running'. Просроченные heartbeat'ы зачищает LeaseManagerService.",
        "headers": {
          "runId": "runId",
          "jobType": "тип",
          "tenant": "тенант",
          "worker": "воркер",
          "attempts": "попытки",
          "heartbeat": "heartbeat",
          "lease": "аренда через"
        },
        "empty": "Активных заявок нет. Очередь пуста или все воркеры только что закончили цикл.",
        "heartbeatAgo": "{n}с назад"
      }
    },
    "jobs": {
      "title": "Запуски джоб",
      "subtitle": "Длинные операторские джобы (dreams / compaction / calibration refit / reindex / changefeed drain). Переходы по SSE; drill на джобу показывает progress / result / error.",
      "live": "лайв",
      "sseHint": "SSE на принятых переходах job_run",
      "filters": {
        "allTypes": "все типы",
        "allStatuses": "все статусы",
        "companyIdPlaceholder": "фильтр по companyId"
      },
      "table": {
        "started": "старт",
        "type": "тип",
        "tenant": "тенант",
        "trigger": "триггер",
        "status": "статус",
        "duration": "длительность"
      },
      "empty": "Нет джоб по фильтру.",
      "drill": {
        "prompt": "Выбери джобу для drill.",
        "trigger": "триггер",
        "actor": "actor",
        "tenant": "тенант",
        "started": "старт",
        "finished": "финиш",
        "attempts": "попытки",
        "claimedBy": "claimedBy",
        "visibleAfter": "видна с",
        "leaseUntil": "аренда до",
        "cancelRequested": "отмена запрошена",
        "requestCancel": "Запросить отмену",
        "payload": "payload",
        "payloadHint": "(вход хэндлера)",
        "progress": "progress",
        "result": "result",
        "error": "error"
      }
    },
    "maintenance": {
      "title": "Кокпит обслуживания",
      "subtitle": "Расписанные джобы и ручные триггеры. Каждая карточка показывает последний персистнутый запуск (через job_run + SchedulerRegistry), ETA следующего срабатывания и кнопку Run now, которая идёт тем же кодом что и крон.",
      "runNow": "Запустить",
      "cards": {
        "dreams": {
          "title": "Dreams (dedup + resolve + summarize)",
          "description": "04:00 UTC — дедуп сущностей и разрешение конфликтующих фактов."
        },
        "compaction": {
          "title": "Compaction (горячий → тёплый ярус)",
          "description": "03:17 UTC — факты за пределами retention переезжают в тёплый ярус, опционально LLM-summary."
        },
        "calibration_refit": {
          "title": "Calibration refit (изотонический)",
          "description": "03:51 UTC — пересчёт изотонической карты по retraction'ам за 30 дней. Тот же триггер также кидает source-trust refit."
        },
        "source_trust_refit": {
          "title": "Source-trust refit",
          "description": "03:42 UTC — апсёрт source_trust(rate, sampleCount). Триггерится вместе с calibration-refit выше."
        },
        "reindex_embeddings": {
          "title": "Reindex embeddings",
          "description": "Без крона — переэмбеддинг knowledge_fact по всем тенантам. Запускать после смены EMBEDDER_PROVIDER или dimension'а модели."
        },
        "changefeed_drain": {
          "title": "Changefeed drain → audit_event",
          "description": "Каждую минуту — SHOW CHANGES по каждому source, запись audit_event, продвижение курсора."
        }
      },
      "cron": {
        "label": "крон",
        "lastFire": "посл. срабат.",
        "nextFire": "след. срабат.",
        "state": "состояние",
        "running": "работает",
        "idle": "ожидает",
        "noCron": "—"
      },
      "lastRun": "последний запуск: {status}",
      "drillLink": "drill →",
      "changefeed": {
        "title": "Changefeed consumer",
        "enabled": "включен",
        "disabled": "выключен",
        "stats": {
          "lastTick": "посл. tick",
          "pending": "pending",
          "consumedTotal": "всего обработано",
          "ticks": "tick'ов",
          "batchLimit": "лимит батча"
        },
        "cursors": "курсоры по (тенант × source)",
        "cursorHeaders": {
          "tenant": "тенант",
          "source": "source",
          "versionstamp": "versionstamp"
        }
      },
      "recentJobs": "Недавние запуски",
      "fullHistory": "вся история →",
      "noRecentJobs": "Пока нет персистнутых запусков. Запусти джобу выше или дождись следующего срабатывания крона."
    }
  }
}
