<?xml version="1.0" encoding="UTF-8"?>
<spec xmlns="https://vibevm.org/spec/1">
  <title id="root">Как устроен vibe</title>
  <status stage="doc" state="work" audience="dev"/>
  <p p="1">vibe — один бинарник, собранный из набора библиотек на Rust, каждая из которых владеет одной заботой: прочитать описание проекта, выбрать версии, скачать оттуда, где пакеты опубликованы, записать дерево на диск, поговорить с агентами. Эта страница — карта библиотек, швов между ними и пути, который проходит через них установка.</p>
  <section id="five-layers" title="Пять слоёв">
    <p p="2">Читайте продукт снизу вверх. *Идентичность*: пакет — это [координата](../glossary/index.xml#coordinate) плюс [отпечаток](../glossary/index.xml#fingerprint) содержимого, а вид — метаданные. *[Реестр](../glossary/index.xml#registry)*: упорядоченные источники пакетов с зеркалами, [переопределениями](../glossary/index.xml#override) и необязательным [индексом](../glossary/index.xml#index-registry). *[Хранилище](../glossary/index.xml#store)*: каждая скачанная версия пакета хранится на машине один раз.</p>
    <p p="3">*Материализация*: разрешённый граф, скопированный в дерево зависимостей проекта и записанный в [лок-файл](../glossary/index.xml#lock-file). *Вычисленный старт*: [вклады](../glossary/index.xml#contribution) пакетов, спроецированные в два сгенерированных файла, которые читает агент. Всё, что видит пользователь, — один из этих пяти слоёв или поверхность над ними.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-000#surfaces" p="4"/>
  </section>
  <section id="the-crates" title="Крейты">
    <table p="5">
      <tr>
        <td>Забота</td>
        <td>Крейты</td>
        <td>Чем владеют</td>
      </tr>
      <tr>
        <td>базовый словарь</td>
        <td>`vibe-core`, `vibe-wire`</td>
        <td>манифесты, лок-файл, идентичности и хеши содержимого; сгенерированные типы каждого зарегистрированного машинного формата</td>
      </tr>
      <tr>
        <td>спецификации</td>
        <td>`vibe-spec`, `vibe-specdoc`, `progress-core`, `vibe-facts`, `vibe-trace`</td>
        <td>адреса и детерминированный маршрутизатор; модель документа с её Markdown- и XML-фронтендами и бэкендами; парсер разметки статусов и отчёты; реестр фактов принятия; запросы прослеживаемости</td>
      </tr>
      <tr>
        <td>реестры и хранилище</td>
        <td>`vibe-registry`, `vibe-index`, `vibe-publish`, `vibe-package-source`</td>
        <td>git-транспорт, зеркала и переопределения, кэш клонов и машинное хранилище; поисковый индекс и его сервер; публикация; единственная продуктивная композиция источников пакетов</td>
      </tr>
      <tr>
        <td>разрешение и установка</td>
        <td>`vibe-resolver`, `vibe-install`, `vibe-workspace`, `vibe-safefs`</td>
        <td>швы и ячейки решателя; план и применение; обнаружение рабочего пространства, материализация, вычисленный старт; изменение файловой системы строго по выданным правам</td>
      </tr>
      <tr>
        <td>жизненный цикл</td>
        <td>`vibe-lifecycle`, `vibe-extension-registry`, `vibe-orchestrator`, `vibe-ext`, `vibe-native-loader`, `vibe-llm`, `vibe-scrape`</td>
        <td>модель девяти фаз и цепочки; чистый реестр расширений; оркестрация, независимая от поверхности; безопасный SDK автора и карантинный загрузчик нативных расширений; шов провайдера модели; планирование зачистки</td>
      </tr>
      <tr>
        <td>агенты и предпочтения</td>
        <td>`vibe-mcp`, `vibe-agent-projection`, `vibe-settings`, `vibe-actions`, `vibe-requirements`</td>
        <td>MCP-сервер и менеджер интеграций; проекция навыков в агентов; трёхуровневые предпочтения; действия, независимые от фронтенда; запрос требований только для чтения</td>
      </tr>
      <tr>
        <td>поверхности и проверки</td>
        <td>`vibe-cli`, `vibe-check`</td>
        <td>командная строка; детерминированный линтер проекта</td>
      </tr>
      <tr>
        <td>документация</td>
        <td>`vibe-doc`, `vibe-doc-server`, `vibe-doc-shell`</td>
        <td>конвейер страниц за `vibe doc`: сборка, проверка, манифест, снимки поверхности, очередь сопровождения и сборщик сайта; сервер локальной читалки на loopback-адресе; оболочка читалки внутри бинарника</td>
      </tr>
      <tr>
        <td>зарезервированное и инструменты</td>
        <td>`vibe-graph`, `vibe-test-support`, `xtask`</td>
        <td>зарезервированный слот графа задач; изоляция домашней папки настроек в тестах; ворота сопровождающего: генерация кода, карта прослеживаемости, синхронизация движков, зеркалирование, сборка выпуска</td>
      </tr>
    </table>
    <p p="6">Направление зависимостей фиксировано: поверхность вызывает оркестратор, оркестратор вызывает библиотеку через шов, библиотека возвращает типизированные значения. Доменные библиотеки никогда не спрашивают, никогда не форматируют вывод терминала и никогда не решают вопросы аутентификации; эти решения принимаются в корне композиции, в CLI или в [MCP-сервере](../glossary/index.xml#mcp-server).</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-000#prod-arch" p="7"/>
    <p p="8">Дерево держат вместе четыре решения. Репозиторий — один Cargo-workspace, все крейты под `crates/`. Каждое умение продукта живёт в библиотеке, а командная строка, терминальный интерфейс и MCP-сервер — тонкие поверхности над ней. Схемы JSON Type Definition — единственный источник истины для каждого машинного контракта. А дисциплина коммитов — установленное [семейство](../glossary/index.xml#family) git-practices, которое читают в начале каждой сессии.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-000#WORKSPACE-LAYOUT" p="9"/>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-000#SURFACE-DISCIPLINE-IS-THE-OMNICHANNEL-FLOW" p="10"/>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-000#JTD-SSOT" p="11"/>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-000#GIT-PRACTICES-FAMILY" p="12"/>
  </section>
  <section id="the-install-path" title="Путь установки">
    <p p="13">1. Найти корень рабочего пространства и прочитать [манифесты](../glossary/index.xml#manifest), лок-файл, пользовательскую конфигурацию, реестры, зеркала, переопределения и локальные источники пакетов.</p>
    <p p="14">2. Сравнить манифесты с лок-файлом; если ничего не изменилось, пропустить разрешение.</p>
    <p p="15">3. Иначе квалифицировать каждую запрошенную координату и построить представление доступных версий для решателя. Решить весь граф, удерживая каждый пин, которого изменение не касается.</p>
    <p p="16">4. Скачать каждую выбранную идентичность: попадание в хранилище переиспользуется, промах обходит разрешённые источники и кладёт проверенное дерево в хранилище.</p>
    <p p="17">5. Построить план, проверить [управляемые блоки](../glossary/index.xml#managed-block) файлов инструкций и спросить подтверждения.</p>
    <p p="18">6. Материализовать граф в дерево зависимостей через диф, перегенерировать стартовые файлы, убрать устаревшие слоты.</p>
    <p p="19">7. Записать граф, происхождение и отпечатки в лок-файл.</p>
    <p p="20">8. Отрисовать человеческий, тихий или JSON-отчёт.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-011#TWO-PHASES-SPLIT" p="21"/>
  </section>
  <section id="the-seams" title="Швы">
    <p p="22">`GitBackend` изолирует git: продуктивная реализация вызывает системный git, так что SSH-агенты и помощники учётных данных ведут себя как везде. `Registry` перечисляет, разрешает и скачивает по локальным и git-источникам; `MultiRegistryResolver` владеет упорядоченным обходом, зеркалами, переопределениями, аутентификацией и офлайн-позицией. `DepProvider` — представление мира для решателя, а `DepSolver` превращает корни в граф; ячейка по умолчанию — resolvo, а ячейка SAT с откатами и наивная ячейка выбираются по желанию. `InstallSource` отделяет транзакцию от построения ячеек. `RepoCreator` изолирует создание репозиториев на хостах для публикации. У каждого шва больше одной реализации, и тесты гоняют шов, а не продуктивную ячейку.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-resolver/PROP-003#SOLVER-TWO-IMPLS" p="23"/>
  </section>
  <section id="wire-and-authored" title="Проводные и авторские форматы">
    <p p="24">Границу продукта пересекают два вида текста. Машинные форматы, JSON-отчёты, записи лок-файла, манифесты выпусков, описаны схемами JSON Typedef, и их типы генерируются; рукописный парсер нашего собственного формата — дефект, который считает сборка. Авторские форматы, манифест и спецификации, разбираются рукописным кодом намеренно, потому что их пишет человек, и ошибки должны говорить на языке человека.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-000#jtd" p="25"/>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-044#M-FORMAT-REGISTRY" p="26"/>
    <p p="27">В языке схем нет 64-битного целого, поэтому любое целое шире 32 бит едет по проводу десятичной строкой.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-044#M-WIDE-INTEGERS-AS-STRINGS" p="28"/>
  </section>
  <section id="reading-order" title="Что читать дальше">
    <p p="29">Спецификации — авторитет: `PROP-000` об основополагающих решениях, `PROP-009` о модели загрузки, `PROP-002` и `PROP-010` о реестрах и хранилище, `PROP-054` о [жизненном цикле](../glossary/index.xml#lifecycle) и машине расширений, `PROP-045` о модели документа, `PROP-057` и `PROP-058` о пакетах документации, сайте и о том, как сопровождается это руководство. Страница о прослеживаемости в этом руководстве объясняет, как код их цитирует и как спросить карту, какой код стоит за каким правилом. Руководство разработчика в репозитории описывает сборку, тесты и панель самопроверки.</p>
  </section>
</spec>
