<?xml version="1.0" encoding="UTF-8"?>
<spec xmlns="https://vibevm.org/spec/1">
  <title id="root">Документация VibeVM — вижен</title>
  <status stage="spec" state="done" comment="design rationale behind PROP-057 — the campaign vision, twelve editions 2026-09-09..11; imported 2026-09-11; non-normative, PROP-057 wins where they disagree"/>
  <p p="1"><fact id="companion-line" status="spec/done">**Explains:** [PROP-057](../common/PROP-057-documentation-packages-and-site.xml) — the documentation packages and site contract; the thirty decision records D-01…D-30 below are its rationale, and PROP-057 wins where they disagree (the spec-genres precedence law). Written in Russian for the owner; the norm it explains is English.</fact></p>
  <section id="how-to-read" title="0. Как читать">
    <list ordered="false" p="2">
      <item><fact id="how-to-read-1" status="spec/done">**Жанр.** Это design-документ: «почему и как мы решили». Он не связывает
  никого сам по себе. Связывают PROP-документы после переноса нормы (§5.17), а до
  переноса — решения владельца в §3. При конфликте этого текста с PROP побеждает
  PROP, и этот текст правится.</fact></item>
      <item><fact id="how-to-read-2" status="spec/done">**Решения пронумерованы `D-NN`** и стоят под якорями `#d-NN`. План исполнения
  (`AGENT-PLAN.md`) ссылается на них по якорю и не пересуждает их.</fact></item>
      <item><fact id="how-to-read-3" status="spec/done">**Каждое решение записано четырьмя полями** по закону decision-records
  проекта: Решение · Почему · Отвергнуто · Пересмотреть когда.</fact></item>
      <item><fact id="how-to-read-4" status="spec/done">**Термины** собраны в §9. Идентификаторы проекта (имена файлов, команд,
  элементов) остаются в оригинале.</fact></item>
      <item><fact id="how-to-read-5" status="spec/done">**Журнал редакций** — §11: что изменилось между редакциями и почему.</fact></item>
    </list>
  </section>
  <section id="summary" title="1. Что строим, в одном экране">
    <list ordered="true" p="3">
      <item><fact id="summary-1" status="spec/done">**Документация — это пакеты.** Вводится kind `doc`. У любого пакета есть
   бесплатный базовый уровень документации, выводимый из его собственного
   содержимого. Расширенная документация едет отдельным пакетом-спутником
   `&lt;группа&gt;/&lt;имя&gt;-docs`, а документация самого инструмента — пакетом
   `org.vibevm.core/vibevm-docs`. Каждая документация несёт человекочитаемый
   заголовок, аннотацию и, по желанию, картинки.</fact></item>
      <item><fact id="summary-2" status="spec/done">**Переводы — тоже пакеты.** Один пакет на язык, зеркалящий дерево
   источника. Сайт показывает селектор языка и никогда не отвечает 404 на
   отсутствующую страницу — подставляет исходный язык с пометкой. Первая
   адаптация, русская, — третья волна: после того как всё остальное
   проверено и работает (D-29).</fact></item>
      <item><fact id="summary-3" status="spec/done">**Сайт `vibevm.org/doc` — «docs.rs для реестра vibespecs».** Он рендерит
   каждую опубликованную версию каждого пакета из её байтов, подписан на индекс
   реестра как на ленту изменений и пересобирает только то, у чего изменился
   content hash. Сам vibevm рендерится из своего репозитория исходников.
   Пакет сайта — `org.vibevm.doc/web`, kind `app`.</fact></item>
      <item><fact id="summary-4" status="spec/done">**Официальное и сообщество — обе полки видимы.** Официальность на каждом
   уровне назначается «сверху»: документацию называет предмет, перевод —
   исходная документация. Всё остальное сайт тоже находит по рёбрам и
   показывает как community, со звёздочками только у официальных элементов.</fact></item>
      <item><fact id="summary-5" status="spec/done">**Локальный читатель.** Та же программа запускается на машине пользователя
   как `vibe doc serve`, читает машинный store, lock-файл проекта и приватные
   реестры, работает офлайн и встраивается в приложения и плагины через
   webview. Так читается документация проприетарных пакетов, которых в
   публичном реестре нет.</fact></item>
      <item><fact id="summary-6" status="spec/done">**Инфраструктура для агентов.** Стабильные якоря, адрес `spec://` на каждое
   правило, `llms.txt` и `llms-full.txt` на каждый язык, каждая страница в виде
   Markdown и XML по стабильному URL, каталог документаций с аннотациями в
   стиле arXiv, JSON-манифест страниц, резолвер адресов, точечные запросы
   через CLI и MCP, и скилл, который ведёт агента по петле
   «ошибка → якорь → правило → объяснение → пример».</fact></item>
      <item><fact id="summary-7" status="spec/done">**Механика без дрейфа.** Документация цитирует спеки и никогда не
   пересказывает нормативные значения; примеры исполняются на каждой сборке;
   справочники выводятся из кода и схем; `rule` цитирует текущий текст спеки,
   а роняет сборку только исчезнувший якорь; покрытие обязательств измеряется
   гейтом, а не ощущается. Ничто в документации не требует истории, которую
   нельзя переписать (D-27).</fact></item>
      <item><fact id="summary-8" status="spec/done">**Визуальный язык и ридер.** Сайт наследует тёплую дизайн-систему,
   выработанную по старым страницам Anthropic, в двух темах: светлая — её
   собственные токены, тёмная — токены лендинга `vibevm.org`; одна терракота на
   обе. Страница документации — ридер по образцу oleg.guru: нумерованные
   абзацы со ссылкой на каждый, переключение перевода с сохранением места,
   настройки чтения, возврат к месту, где остановился, липкое оглавление,
   сноски, лайтбокс. Раздел о дизайне — заведомо предварительный и
   пересматривается после первого живого рендера (D-21).</fact></item>
      <item><fact id="summary-9" status="spec/done">**Один сайт на домене, один хостинг.** Лендинг переезжает с Astro на
   Qwik в ходе кампании и становится маршрутами `/` и `/ru/` того же сайта,
   что и документация, на одной дизайн-системе (D-28). Сайт живёт на том же
   сервере, где сегодня лендинг, по существующему runbook инфраструктуры:
   один контейнер выдачи на весь домен и контейнер-рендерер; переключение
   занимает место нынешнего контейнера лендинга, хостовый nginx не трогается.
   Детали сервера — в приватном документе инфраструктуры и сюда не
   переносятся (D-23).</fact></item>
      <item><fact id="summary-10" status="spec/done">**Текст.** Английский — исходный язык документации, все остальные языки,
    включая русский, — адаптации. Пишем для умного читателя, который ещё
    ничего нашего не читал: сложность живёт в контейнерах (`rule`, таблицы,
    `derived`, fence, глоссарий), повествовательные абзацы остаются простыми;
    технические места — по Simplified Technical English; регистр — эссе для
    образованного читателя, юмор редок и точен; клаудизмы вырезаются линтером
    и рукой; прозу пишет сильнейшая модель в центральной сессии, воркеры —
    код и фикстуры (D-25, `STYLE.md`).</fact></item>
      <item><fact id="summary-11" status="spec/done">**Сопровождение спроектировано до написания.** Четыре петли обновления:
    коммита (продукт несёт документацию в том же коммите или строку долга),
    недельная (очередь `vibe doc todo`, до пяти мелких правок, страница
    недели вслух), месячная (метрики, аудит корпуса, переписывание,
    изменения регламента, релиз пакета документации), полная сверка по
    обещанию команды (раз в квартал и перед вехой, не на каждый релиз:
    продукт выходит по десять раз в день, дрейф между сверками принят как
    риск); смена номера версии — осознанное решение владельца, и в этот
    момент `vibe doc diff` по снимкам поверхности называет страницы, которые
    надо обновить, — внутренняя кухня разработчиков документации, невидимая
    читателю (D-27). Кампания ведёт журнал успехов, неудач и
    находок с полем «→ регламент»; регламент пишется из журнала в фазе 6
    после двух репетиций (D-26, `MAINTENANCE.md`, `JOURNAL.md`).</fact></item>
    </list>
  </section>
  <section id="context" title="2. Откуда стартуем">
    <section id="context-mechanics" title="2.1 Механика, которая уже есть">
      <p p="4"><fact id="context-mechanics-1" status="spec/done">Ничего из перечисленного строить не нужно — на это опирается всё остальное.</fact></p>
      <list ordered="false" p="5">
        <item><fact id="context-mechanics-2" status="spec/done">**Адресуемость.** Каждый факт в спеке — именованный XML-элемент с
  идентификатором; адрес `spec://&lt;группа&gt;/&lt;имя&gt;[@версия]/&lt;документ&gt;#&lt;якорь&gt;`
  резолвится без индекса, один к одному в путь файла. Якоря неизменяемы,
  снятие — только tombstone.</fact></item>
        <item><fact id="context-mechanics-3" status="spec/done">**Карта трассируемости (specmap).** Глаголы рёбер `implements`, `verifies`,
  `documents`, `deviates`, `informs`; ревизии юнитов с асимметричной
  инвалидацией; команды `vibe explain`, `vibe query`, `vibe select` и те же
  инструменты по MCP. Глагол `documents` уже существует в движке
  (`crates/vibe-trace/src/select/parse.rs`). **Движок specmap вендорится:**
  его авторская копия живёт в пакете дисциплины, хостовая копия синхронизируется
  через `cargo xtask sync-engines` и не правится напрямую.</fact></item>
        <item><fact id="context-mechanics-4" status="spec/done">**Пивот документов (`vibe-specdoc`).** Один IR, фронтенды Markdown и XML,
  бэкенды Markdown и XML; преобразование только через IR; диалект закрыт:
  чужой элемент — громкая ошибка. Зарезервированный словарь блоков: `p`,
  `list`, `facts`, `table`, `fence`, `quote`.</fact></item>
        <item><fact id="context-mechanics-5" status="spec/done">**Интернационализация (PROP-003 §2.7, `crates/vibe-core/src/manifest/i18n.rs`).**
  Теги BCP-47, блок `[i18n]` с каноническим языком, списком доступных и
  предпочтением проекта, цепочка отката «точный тег → тег без региона →
  канонический», sidecar-файлы `README.ru.md` внутри пакета, проверка покрытия
  в `vibe check`, запись выбранного языка в lock-файл. Грамматика и цепочка
  отката переиспользуются (§5.18); sidecar-раскладка для документации не
  используется.</fact></item>
        <item><fact id="context-mechanics-6" status="spec/done">**Пакеты и реестр.** Идентичность `(group, name, version, content_hash)`;
  реестр — репозитории `github.com/vibespecs/&lt;группа&gt;.&lt;имя&gt;`; индекс
  `vibe-index` — git-репозиторий на организацию с `repomd.json` и JSONL-первичкой,
  плюс HTTP-сервер на axum с маршрутами `/v1/index/*` и `/v1/packages/*`;
  машинный store `~/.vibe/cache/` с прогревом `vibe cache add`, который не
  трогает проект; git-источники пакетов по тегу, ветке или ревизии (PROP-002).</fact></item>
        <item><fact id="context-mechanics-7" status="spec/done">**Семейства пакетов (PROP-028).** Стем плюс роли `-lang` и `-mcp` в одной
  группе; агрегатор без содержимого; члены семейства версионируются в унисон.</fact></item>
        <item><fact id="context-mechanics-8" status="spec/done">**Скиллы и MCP.** `[[skill]]` в манифесте, `vibe skill install` проецирует
  скиллы в Claude Code, OpenCode и Codex; `vibe mcp serve` отдаёт lock-файл,
  сабскиллы и карту.</fact></item>
        <item><fact id="context-mechanics-9" status="spec/done">**Разметка фактов (PROP-043).** Атрибуты `audience` (`user`, `author`,
  `dev`) и `actionstage`; вид `vibe progress report --view doc --audience …`
  перечисляет факты спек, помеченные как «должны быть рассказаны этой
  аудитории». Это перечень обязательств, а не навигация.</fact></item>
        <item><fact id="context-mechanics-10" status="spec/done">**Токеномика (PROP-048).** Закон слоёв: редко меняющееся читается первым;
  STATIC — кэш-стабильный префикс; изменяемое знание — точечный запрос, а не
  часть префикса.</fact></item>
        <item><fact id="context-mechanics-11" status="spec/done">**Условия загрузки.** Предикаты `when="os:…"` и `when="installed:…"` в
  boot-лейне.</fact></item>
        <item><fact id="context-mechanics-12" status="spec/done">**Дисциплина TypeScript** (`typescript-ai-native`) установлена и обязательна
  для любого TS-кода в проекте; планка качества владельца: production-grade,
  без «MVP». Есть `cargo xtask add-cell` для заведения новой ячейки по
  дисциплине.</fact></item>
      </list>
    </section>
    <section id="context-docs" title="2.2 Документация сегодня">
      <table p="6">
        <tr>
          <td>Что</td>
          <td>Состояние на 2026-09-09</td>
        </tr>
        <tr>
          <td><fact id="context-docs-1" status="spec/done">`docs/`</fact></td>
          <td><fact id="context-docs-2" status="spec/done">48 Markdown-файлов, 316 КБ; альфа-слой «вариант А» от 2026-08-20, сверен с `--help` бинарника 1.0.0</fact></td>
        </tr>
        <tr>
          <td><fact id="context-docs-3" status="spec/done">Страниц с устаревшими путями и именами</fact></td>
          <td><fact id="context-docs-4" status="spec/done">37 из 51 проверенных: старая раскладка `spec/`, `STATIC.md`, `INLINE.md`, `WAL.md`, ссылки на `.md`-спеки</fact></td>
        </tr>
        <tr>
          <td><fact id="context-docs-5" status="spec/done">Наблюдаемость</fact></td>
          <td><fact id="context-docs-6" status="spec/done">`docs/` не входит ни в один include-glob `facts.toml`: не размечена, не судилась, не проверяется</fact></td>
        </tr>
        <tr>
          <td><fact id="context-docs-7" status="spec/done">`CHANGELOG.md`</fact></td>
          <td><fact id="context-docs-8" status="spec/done">раздел Unreleased пуст при 839 коммитах после релиза 1.0.0</fact></td>
        </tr>
        <tr>
          <td><fact id="context-docs-9" status="spec/done">Установленный `vibe 1.0.0`</fact></td>
          <td><fact id="context-docs-10" status="spec/done">не знает команд `lifecycle`, `build`, `package`, `deploy`, `scrape`, `extensions`; отладочная сборка из исходников их показывает</fact></td>
        </tr>
        <tr>
          <td><fact id="context-docs-11" status="spec/done">Корневые гайды</fact></td>
          <td><fact id="context-docs-12" status="spec/done">`README.md`, `DEV-GUIDE.md`, `RUNTIME-GUIDE.md` — load-bearing, живут по закону same-commit</fact></td>
        </tr>
        <tr>
          <td><fact id="context-docs-13" status="spec/done">Инвентарь для сайта</fact></td>
          <td><fact id="context-docs-14" status="spec/done">`docs/SITE-MANIFEST.toml` — ручной, курируемый список страниц</fact></td>
        </tr>
        <tr>
          <td><fact id="context-docs-15" status="spec/done">Язык</fact></td>
          <td><fact id="context-docs-16" status="spec/done">существующая документация и спеки — английский; книга redbook — русский</fact></td>
        </tr>
      </table>
    </section>
    <section id="context-prior" title="2.3 Два предыдущих проекта документации">
      <list ordered="false" p="7">
        <item><fact id="context-prior-1" status="spec/done">**`campaigns/packages-2026-09/PHASE-G-SPEC.md` (2026-07-26, не ратифицирован).**
  Предложил перенос `docs/` в `docs-legacy/`, пакет `org.vibevm.doc/doc`,
  закон односторонней цитаты, ребро `documents`, оглавления из разметки
  `audience`, зарезервированный пакет сайта `org.vibevm.doc/web` и строку
  «документация» в карте жанров. **Что остаётся:** односторонняя цитата,
  ребро `documents`, `docs-legacy/`, жанровая строка, пакет `web`. **Что
  меняется:** имя `org.vibevm.doc/doc` уходит — документация ядра становится
  спутником координаты хоста `org.vibevm.core/vibevm-docs` (§5.3); вводится kind
  `doc`; разметка `audience` даёт не оглавление, а гейт покрытия (§5.14).</fact></item>
        <item><fact id="context-prior-2" status="spec/done">**Маршрут `DOCS` в плане стюарда (r145, 2026-09-09).** Восемь узлов от
  инвентаризации и заморозки информационной архитектуры до гейта приёмки, с
  четырьмя аудиториями. **Что остаётся:** все узлы и их критерии приёмки; они
  отображаются на фазы плана. **Что добавляется:** kind `doc` и `app`,
  пакеты-спутники, переводы, сайт, локальный читатель, SEO-контракт.</fact></item>
      </list>
    </section>
    <section id="context-external" title="2.5 Пять внешних источников третьей редакции">
      <p p="8"><fact id="context-external-1" status="spec/done">Проанализированы 2026-09-10 в режиме только для чтения; ни один не
изменялся. Пути — на машине владельца.</fact></p>
      <table p="9">
        <tr>
          <td>Источник</td>
          <td>Где</td>
          <td>Что берём</td>
          <td>Что не берём</td>
        </tr>
        <tr>
          <td><fact id="context-external-2" status="spec/done">Скриншоты старого сайта Anthropic</fact></td>
          <td><fact id="context-external-3" status="spec/done">`C:\Users\olegc\git\talks\2026.08.08-agents-talk\screenshots\` (1–13; 13 — страница `/docs`)</fact></td>
          <td><fact id="context-external-4" status="spec/done">образ страницы документации: шапка с поиском `Ctrl K`, вкладки разделов, серифный hero, карточки-входы, плавающая кнопка «спросить»; статья с центрированной шапкой, тегами, датой; липкое оглавление слева с подсветкой; тёмный футер-каталог</fact></td>
          <td><fact id="context-external-5" status="spec/done">тексты, логотипы, продуктовую структуру</fact></td>
        </tr>
        <tr>
          <td><fact id="context-external-6" status="spec/done">Тёплая дизайн-система</fact></td>
          <td><fact id="context-external-7" status="spec/done">`C:\Users\olegc\git\talks\2026.08.08-agents-talk\design-system\` (`public/assets/css/anthropic.css` — 19 секций, токены в `:root`; `ui.js`; `docs.html`, `research-paper.html`, `gallery.html` — витрина компонентов)</fact></td>
          <td><fact id="context-external-8" status="spec/done">токены светлой темы (палитра слоновой кости, тан, чернила, терракота, цвета графиков, радиусы, тени), компоненты: `.docs-header`, `.docs-nav`, `.doc-card`, `.search-box`, `.toc` (sticky + IntersectionObserver), `.prose`, `.footnotes`, `.tag`, `.badge`, `.accordion`, `.tab-pills`, `.data-table`, `.table-scroll`, `.breakout`, `.fab`, `.share-row`, `.photo-ph` (тёплый градиентный плейсхолдер)</fact></td>
          <td><fact id="context-external-9" status="spec/done">шрифты Manrope и Source Serif 4 как обязательные (см. D-21: резерв), мега-меню, карусель цитат, промо-панели</fact></td>
        </tr>
        <tr>
          <td><fact id="context-external-10" status="spec/done">Центральный лендинг</fact></td>
          <td><fact id="context-external-11" status="spec/done">`C:\Users\olegc\git\v\vibevm-org\` (Astro 5, Tailwind 3.4, `src/styles/global.css`, `BaseLayout.astro`, `i18n.ts`; развёрнут на `vibevm.org`, remote `github.com/vibevm/vibevm-org-web`)</fact></td>
          <td><fact id="context-external-12" status="spec/done">токены тёмной темы (`--ink`, `--ink-raise`, `--cream`, `--dim`, `--faint`, `--accent #D97757`, `--line`), шрифты Spectral + Inter + JetBrains Mono, самохостинг с кириллическими подсетами, i18n `en` в корне и `ru` под `/ru/`, `hreflang`, JSON-LD, `llms.txt` с дизамбигуацией имени, `robots.txt` с явным allow AI-краулеров (ASCII-only), `build-llms-full.mjs` из `dist/`, IndexNow, Dockerfile «node:22-alpine → nginx:alpine», контейнерный `nginx.conf` (charset для текстовых типов, immutable-кэш ассетов, заголовки безопасности), тег Umami</fact></td>
          <td><fact id="context-external-13" status="spec/done">сам Astro и Tailwind: лендинг переезжает на Qwik и токены (D-28); содержание и адреса переносятся один к одному</fact></td>
        </tr>
        <tr>
          <td><fact id="context-external-14" status="spec/done">Инфраструктура хостинга</fact></td>
          <td><fact id="context-external-15" status="spec/done">`C:\Users\olegc\git\infra\main\main.md` (**приватный**, единый источник правды по серверу)</fact></td>
          <td><fact id="context-external-16" status="spec/done">модель деплоя B «git-чекаут на сервере + `docker compose up -d --build`», TLS снаружи контейнера, контейнер слушает `:80`, `absolute_redirect off` обязателен, runbook «поднять сайт», протокол удаления, Umami для новых сайтов, правило «маршрутизацию нового сервиса на существующем домене делать в контейнерном nginx, не в хостовом»</fact></td>
          <td><fact id="context-external-17" status="spec/done">**ничего из содержимого не переносится**: адреса, порты, схема трафика, VPN — только ссылка на файл; директива о VPN становится стоп-правилом плана</fact></td>
        </tr>
        <tr>
          <td><fact id="context-external-18" status="spec/done">Ридер статей oleg.guru</fact></td>
          <td><fact id="context-external-19" status="spec/done">`C:\Users\olegc\git\oleg-guru\` (`scripts/templates/article.html.tpl`, `podcast-episode.html.tpl`, `build-articles.mjs`, `public/js/{theme,lang-fallback,lightbox}.js`, `CLAUDE.md`)</fact></td>
          <td><fact id="context-external-20" status="spec/done">весь набор фич ридера, разобранный в D-22</fact></td>
          <td><fact id="context-external-21" status="spec/done">палитру (холодная тёмная с бирюзой и розовым — не наш язык), Roboto Flex, модалку гражданства, GA/Метрику, нумерацию якорей на клиенте (у нас — на сборке)</fact></td>
        </tr>
      </table>
    </section>
    <section id="context-audiences" title="2.4 Аудитории">
      <table p="10">
        <tr>
          <td>Аудитория</td>
          <td>Кто это</td>
          <td>Значение `audience`</td>
        </tr>
        <tr>
          <td><fact id="context-audiences-1" status="spec/done">Новичок</fact></td>
          <td><fact id="context-audiences-2" status="spec/done">человек, впервые открывший VibeVM</fact></td>
          <td><fact id="context-audiences-3" status="spec/done">маршрут внутри `user`, не отдельное значение</fact></td>
        </tr>
        <tr>
          <td><fact id="context-audiences-4" status="spec/done">Пользователь и оператор</fact></td>
          <td><fact id="context-audiences-5" status="spec/done">ставит vibe, ведёт проект, устанавливает пакеты, деплоит</fact></td>
          <td><fact id="context-audiences-6" status="spec/done">`user`</fact></td>
        </tr>
        <tr>
          <td><fact id="context-audiences-7" status="spec/done">Автор пакетов и расширений</fact></td>
          <td><fact id="context-audiences-8" status="spec/done">пишет flow/feat/stack/tool/mcp/lang/doc/app, провайдеры и расширения, переводы</fact></td>
          <td><fact id="context-audiences-9" status="spec/done">`author`</fact></td>
        </tr>
        <tr>
          <td><fact id="context-audiences-10" status="spec/done">Мейнтейнер</fact></td>
          <td><fact id="context-audiences-11" status="spec/done">правит код и спеки самого vibevm</fact></td>
          <td><fact id="context-audiences-12" status="spec/done">`dev`</fact></td>
        </tr>
        <tr>
          <td><fact id="context-audiences-13" status="spec/done">Сессия агента</fact></td>
          <td><fact id="context-audiences-14" status="spec/done">AI-сессия проекта-потребителя, читающая при загрузке или по запросу</fact></td>
          <td><fact id="context-audiences-15" status="spec/done">`agent` (новое, §5.11)</fact></td>
        </tr>
      </table>
    </section>
  </section>
  <section id="mandate" title="3. Мандат владельца, дословно">
    <p p="11"><fact id="mandate-1" status="spec/done">Цитаты — чат 2026-09-09 и 2026-09-10.</fact></p>
    <quote p="12"><fact id="mandate-2" status="spec/done">«я хочу следующим этапом начать писать документацию. И я хочу понять, как
правильно ее писать, чтобы она а) хорошо анализировалась ИИ агентами
б) идеально читалась людьми.»</fact></quote>
    <quote p="13"><fact id="mandate-3" status="spec/done">«Мы сможем сделать так, чтобы в нем можно было перейти от документов к
спецификациям и прочитать подробные правила? (как часть делают в книгах по
C++, где упрощенное описание в учебной книге ссылается на точные строки
стандарта C++). Еще, мы можем сделать какие-то примеры, чтобы пользователи
могли быстро понять как пользоваться фичей и им не приходилось долго и
сложно думать? Дальше, можем ли мы сделать какую-то специальную
инфраструктуру для агентов, чтобы им было проще исследовать эту документацию
и через веб, и через локальный доступ (если сделать возможность скачать
документацию и читать ее локально - тогда в будущем мы можем сделать "скилл
по использованию vibevm" который будет в случае проблем отсылать не только к
спекам, но и к документации).»</fact></quote>
    <quote p="14"><fact id="mandate-4" status="spec/done">«Я бы сделал основную механику vibevm всегда доступной в виде пакета. При
переходе проекта в продакшен все пакеты из packages будут опубликованы наружу
и лягут в репозиторий, поэтому они в этот пакет не войдут. Но сделать аналог
docs.rs который генерирует документацию для ВСЕГО что лежит в репозитории -
это очень круто и очень хотелось бы сделать так. Но важно, что пакеты в
центральном репозитории vibespecs меняются и технически сайт должен уметь это
всё обновлять у себя. Возможно, опциональная документация должна идти
сопроводительным пакетом типа org.vibevm.world.docs/multi-user-planning (или
выработать еще какую-то конвенцию более правильную, если эта не подходит)»</fact></quote>
    <quote p="15"><fact id="mandate-5" status="spec/done">«1) вводим kind doc 2) пакет org.vibevm.doc/web, сайт vibevm.org/doc 3) было
бы неплохо в будущем сделать этот сайт запускаемым и локально, чтобы потом
сделать приложение для чтения документации (например, плагин для vscode как
встроенный iframe на это локальное приложение) - это нужно для чтения
документации закрытых проприетарных пакетов. которых нет в репозитории 4) всё
должно быть сделано для максимального SEO, включая LLM SEO для того чтобы
краулеры Anthropic и OpenAI находили быстрее: llms.txt, llms-full.txt для
базового корпуса документации, и другие приёмы 5) технически стек для веба -
https://qwik.dev, а точнее - его свежая версия 2.0: https://next.qwik.dev/
(да, она в бете, это нормально)»</fact></quote>
    <quote p="16"><fact id="mandate-6" status="spec/done">«канал хоста - пока что только тот репозиторий который мы указали в
настройках при запуске/генерации (по умолчанию - гитхаб), зеркала и прочее -
когда-нибудь в будущем»</fact></quote>
    <quote p="17"><fact id="mandate-7" status="spec/done">«я боюсь что если ребро документации будет исходить из самого пакета, то три
разных человека законтрибьютят три разных пакета документации, и непонятно
будет - какой "официальный" пакет показывать на нашем сайте. Может быть,
ребро должно исходить и из самого документируемого пакета тоже? То есть,
пакет указывает свою "официальную" документацию (и там может быть одна штука
выбрана как "основная" документация, и сколько угодно как дополнительные
"официальные"). Но при этом остается возможность самим пакетам с
документацией сделать обратное ребро тоже - и тогда на сайте мы сможем
сделать раздел с "неофициальной" документацией (community docs).»</fact></quote>
    <quote p="18"><fact id="mandate-8" status="spec/done">«2) вариант Б, а приложения и VSCode-плагины будут вставлять в себя этот
интерфейс через webview 3) сразу A, и спланировать самые частые вещи
5) вариант А, добавить agent 6) Б для локального читателя, А для сборки
публичного сайта на сервере, где Node есть. Но прежде чем подтвержу, скажи
как именно ты собрался встраивать оболочку vibe»</fact></quote>
    <quote p="19"><fact id="mandate-9" status="spec/done">«ты помнишь что бывают локализации? скорей всего, нужно каждую из
локализаций иметь отдельным пакетом, а сайту показывать селектор локализации.
А в пакете иметь официальную ссылку на каждый из пакетов для разных языков.»</fact></quote>
    <quote p="20"><fact id="mandate-10" status="spec/done">«только не забудь, что неофициальные переводы тоже должны искаться сайтом
(просто отображаться как переводы сообщества, а не официальные). Эта
иерархия официальной и неофициальной документации, их официальных и
неофициальных переводов должна как-то понятно и наглядно отражаться в
интерфейсе (например, звездочки на "официальных" элементах)»</fact></quote>
    <quote p="21"><fact id="mandate-11" status="spec/done">«можно сделать, чтобы документация могла иметь собственные названия.
Например, сам автор пакета пишет для нее официальный мануал, а потом
сообщество пишет три неофициальных гайда с новыми названиями. […] Имеется
в виду человекочитаемое имя, таким как оно будет выглядеть в интерфейсе
сайта»</fact></quote>
    <quote p="22"><fact id="mandate-12" status="spec/done">«обычно для библиотеки документации лучше иметь человекочитаемое название и
человекочитаемый абстракт - так же как это делают поисковики по arxiv.org,
например»</fact></quote>
    <quote p="23"><fact id="mandate-13" status="spec/done">«еще я бы советовал сразу добавить возможность сделать большую квадратную
иконку (как аватар в твиттере) или большой горизонтальный баннер (как баннер
профиля в твиттере 1500x500). […] Обе картинки опциональны. В случае если
нет картинки, на аватаре отображается плейсхолдер (например, книга), а
вместо баннера отображается тоже какой-то плейсхолдер в виде красивого
градиента или абстрактного узора»</fact></quote>
    <quote p="24"><fact id="mandate-14" status="spec/done">«картинки для опенграфа я бы сделал отдельной опцией. То есть баннер - это
нечто длинное и узкое что отображается сверху страницы документации в
каталоге, и оно по пропорциям плохо похоже на og:image которую ждут как
"превью веб-страницы"»</fact></quote>
    <p p="25"><fact id="mandate-15" status="spec/done">Что в этом мандате **ещё не подтверждено** владельцем: механизм встраивания
оболочки в `vibe` (§5.12 помечено «предложено») и набор ссылок хоста, которые
рендерит сайт: только теги релизов или ещё `main` (§5.16). Всё остальное —
принятые решения.</fact></p>
    <quote p="26"><fact id="mandate-16" status="spec/done">«Мы когда-то вырабатывали дизайн-систему. В качестве вдохновения мы брали
старые версии сайта Антропика […]. И даже выработали конкретную дизайн
систему в виде CSS и примерного портала […]. Еще мы сделали центральный
лендинг […] и выложили его на хостинг […]. Кроме того, на моем личном сайте
[…] есть просто офигенный интерфейс просмотра статей, который стоит
перенести и на наш сайт тоже. Документы по ссылкам, которые я дал, менять не
нужно. Нужно их аккуратно проанализировать (в том числе подробно понять фичи
ридера статей на oleg.guru типа нумерованых абзацев, переключения между
переводами, свойствами чтения, возвращения к закладке, и так далее) и внести
в наше ТЗ и вижен. Секция визуального языка и дизайн-системы, возможно,
требует дополнительного доисследования и улучшения уже после того, как мы
поймем что у нас получается.»</fact></quote>
    <quote p="27"><fact id="mandate-17" status="spec/done">«Скоро мы будем писать доки, и поэтому важное про стиль. Claude известна
написанием доков с огромной кучей "клаудизмов". Но клаудизмы - полбеды.
Одна из важнейших проблем - неправильный баланс и точки притяжения
сложности. Мы пишем документацию для умных, технологически продвинутых
людей, многие из которых - senior developers или имеют академический
бэкграунд в ИИ. И часто даже они не понимают, что написала Claude. Потому
что агенты Claude обычно пишут исходя из неверного предположения, что
человек вначале прочитал всю документацию и все спеки, и вот теперь агент
может написать сложные информационно плотные абзацы, сплошь состоящие из
терминов спецификации. Как правило это неправда, особенно для
документации. Поэтому технические места лучше описывать словами:
ASD-STE100 Simplified Technical English (STE), открыто и просто говорить
как делаются те или иные вещи (без "посмотрите в спецификацию, прочитайте
все и сами поймете). Но это не отменяет того, что нас читают умные,
образованные люди, и поэтому писать для них нужно как в лучших
научно-популярных журналах - ярко, броско и с юмором, типичным для
образованных людей (не обязательно в сфере IT). Важно, что юмор - это вещь
очень редкая и должна быть применена точно и к месту, ровно как и другие
резкие стилистические приемы. […] Важно: исходный текст английский, все
остальные языки (включая русский!) это адаптации английского. Красивые
тексты пишешь ты сама (Fable, Astra, Sol), маленьких агентов можно
использовать для технических задач типа программирования (все наши
веб-интерфейсы и так далее)»</fact></quote>
    <quote p="28"><fact id="mandate-18" status="spec/done">«Пожалуйста всю работу по программированию делай в режиме оркестратора,
выдавая задачи Opus 5 в режиме High. Все задачи про нечто умное и
творческое (написание статей, перевод на русский, проектирование смысла
дизайн-системы и так далее) - делай сама.»</fact></quote>
    <quote p="29"><fact id="mandate-19" status="spec/done">«Наша задача сэкономить токены так, чтобы Fable использовалась только там,
где Fable действительно нужна. Механическую работу могут сделать и другие
модели.»</fact></quote>
    <quote p="30"><fact id="mandate-20" status="spec/done">«Предлагаю по ходу выполнения задачи собирать журнал успехов, неудач и
главное - интересных находок. И дальше на основании того что у нас
получилось, нужно написать спецификацию с подробным объяснением как
обновлять эту документацию. Потому что написать документацию - полдела, а
вот регулярно обновлять ее в мелочках и периодически например раз в
неделю/месяц - глобальное ревью и улучшение - это другая важная часть.
Продумай сразу как мы будем обновлять доку, чтобы все наши находки по ходу
кампании реализации доков только улучшали этот процесс»</fact></quote>
    <quote p="31"><fact id="mandate-21" status="spec/done">«Единственное что мне не нравится твое правило "продукт не выходит без
обновления документации". Это неправда в нашем случае. Мы можем релизить
новые версии 10 раз в день и мерджить по 100 пулл-риквестов в день. Нет
никаких шансов, что документация не будет дрейфовать. Этот риск мы
принимаем. Мы просто обещаем себе чисто исходя из процессов нашей команды
(не технически) время от времени проводить полную проверку - ту что ты
назвала "релизной" но возможно ее стоит назвать как-то еще, потому что мы
не можем делать ее каждый релиз»</fact></quote>
    <quote p="32"><fact id="mandate-22" status="spec/done">«Я на всякий случай напоминаю тебе, что мы очень редко обновляем версию
Vibe. Узнать что версия изменилась нельзя почти никак, и это фича. Так что
у тебя вполне может быть ситуация, когда спека дрейфует в рамках одной и
той же версии. Например, мы в день выпустили десять версий и все с версией
2.0.0, в расчете что пользователи будут делать vibe self update --force и
перекачивать текущую версию с сервера. Это аналог git amend в реальной
жизни ))) Мы постоянно делаем trunk based development с переписыванием
истории чтобы увеличить скорость итераций и выпуска релизов (не 1 раз в
месяц, а 10 раз в день). Иногда впрочем номер версии действительно
меняется и там можно что-то показывать.»</fact></quote>
    <quote p="33"><fact id="mandate-23" status="spec/done">«Гляди, мне нравится идея того, что между версиями можно посмотреть
разницу. И ты можешь добавить туда некий Pseudo-history mechanism для
этого. Но я предлагаю тебе не рассчитывать ни на что кроме самого номера
версии. То есть, разница считается между номерами версий. Например,
владелец решил, что 1.0.0 надо поднять до 2.0.0. Вот теперь ты можешь
смотреть разницу между ними. Но эта смена версии происходит не из-за
каких-то хитрых механик с чексуммами, не из постоянства файлов или чего-то
такого. Она происходит из осознанного желания владельца поменять номер
версии.»</fact></quote>
    <quote p="34"><fact id="mandate-24" status="spec/done">«Почему мне нравится твой pseudo-version-mechanism из предыдущих версий.
Потому что он позволяет алгоритмически понять, какую часть документации
надо обновить. Не нужно с помощью LLM штудировать ВСЮ документацию. НО
важно, что эти данные - это всё нужно для разработчиков документации. А
пользователи всей этой внутренней кухни видеть не должны. Они видят версию
1.0.0 и воспринимают это как контракт "версия 1 делает то, что должна
делать версия 1". Какие там внутри файлы для пользователей обычно не важно.
[…] Ты же считаешь сейчас версию не контрактом на поведение, а каким-то
конкретным замороженным набором файлов, это неправильно.»</fact></quote>
    <quote p="35"><fact id="mandate-25" status="spec/done">«В ходе кампании нужно наш лендинг vibevm-org тоже переделать на Qwik
чтобы было однообразно и хорошо композировалось»</fact></quote>
    <quote p="36"><fact id="mandate-26" status="spec/done">«По плану - вначале сделай всю документацию на английском, русский
перевод будет следующей волной, когда все остальное мы проверили и
увидели, что оно хорошо работает»</fact></quote>
    <quote p="37"><fact id="mandate-27" status="spec/done">«Ты можешь так вообще сдвинуть план, чтобы ты вначале написала все
красивые тексты на английском, и дальше мы полностью переключимся на Опус
и будем работать в нем над всей разработческой частью?»</fact></quote>
    <quote p="38"><fact id="mandate-28" status="spec/done">«Еще кажется важная идея: теперь любое действие можно сделать не только
вручную, но и агентом. Поэтому для сценариев имеет смысл вначале писать,
каким простым промптом достичь результата (например, создания пакета
vibevm), и только потом уже разворачивать механику работы без агентов
целиком вручную (если это вообще нужно! иногда не нужно!). […] Зачастую
люди будут заходить в документацию просто чтобы узнать "как это работает"
и "какой промпт запустить чтобы активировать эту механику". […] Это важное
отличие от документации прошлого, где все делалось только руками.»</fact></quote>
  </section>
  <section id="principles" title="4. Принципы">
    <p p="39"><fact id="principles-1" status="spec/done">Это законы проекта, которые документация наследует. Здесь они названы, чтобы
решения §5 читались как их следствия, а не как вкусовщина.</fact></p>
    <list ordered="false" p="40">
      <item><fact id="P-01" status="spec/done">**P-01 Спеки — IPC, документация — жанр поверх них.** Спека обязательна и
  адресуема; документация объясняет и не требует. Источник: flow
  `two-process-model`, `addressable-specs`, `spec-genres`.</fact></item>
      <item><fact id="P-02" status="spec/done">**P-02 Цитируй, не копируй.** Нормативное значение живёт у одного якоря.
  Страница документации цитирует адрес и никогда не пересказывает число, флаг,
  путь или правило. Источник: `addressable-specs`, PHASE-G-SPEC §3.1.</fact></item>
      <item><fact id="P-03" status="spec/done">**P-03 Односторонняя связь в источнике, двусторонняя в рендере.** Текст спеки
  о документации не знает. Обратные ссылки «объяснено в», «переведено на»,
  «зависят от» вычисляются из индекса и карты и никогда не пишутся руками.</fact></item>
      <item><fact id="P-04" status="spec/done">**P-04 Выводимое не ведётся руками.** Справочник команд, таблицы полей,
  навигация, манифесты страниц, `llms.txt`, плейсхолдеры картинок, превью
  ссылок, обратные связи — генерируются. Источник: `omnichannel`, BACKLOG
  `ENTRY-PREFER-GENERATED`.</fact></item>
      <item><fact id="P-05" status="spec/done">**P-05 Объяснение исполняемо.** Пример, который никто не запускает, — это
  обещание. Каждый пример прогоняется на сборке, один раз, на исходном языке.
  Источник: дисциплина ai-native, `manual-tests`.</fact></item>
      <item><fact id="P-06" status="spec/done">**P-06 Адресуемость применяется к любому тексту, который читает агент.** Один
  юнит — одна мысль; юнит понятен без соседей; инварианты в начале или в конце;
  проверяемое утверждение снаружи fence. Источник: `authoring-rules`.</fact></item>
      <item><fact id="P-07" status="spec/done">**P-07 Токеномика.** Документация никогда не попадает в boot-префикс; она
  читается точечно. Всё, что мутирует, стоит после того, что стабильно.
  Источник: PROP-048.</fact></item>
      <item><fact id="P-08" status="spec/done">**P-08 Логика в библиотеке, поверхности тонкие.** Рендер, манифесты, проверки,
  плейсхолдеры живут в Rust-библиотеке; CLI, MCP, HTTP и локальный сервер — её
  проекции. Источник: `omnichannel`, PROP-000 §21.</fact></item>
      <item><fact id="P-09" status="spec/done">**P-09 Машинные контракты — JTD.** Любой wire между Rust и TypeScript
  описывается JTD-схемой, из которой генерируются типы; wire регистрируется в
  реестре форматов. Источник: PROP-000 §16, PROP-044.</fact></item>
      <item><fact id="P-10" status="spec/done">**P-10 Идентичность пакета — исходник.** В пакет не кладутся артефакты
  сборки. Картинки — исходник. Источник: `tool-design-lessons`, PROP-024 §2.2.</fact></item>
      <item><fact id="P-11" status="spec/done">**P-11 Решения записываются с отвергнутыми вариантами и триггером
  пересмотра.** Источник: `decision-records`.</fact></item>
      <item><fact id="P-12" status="spec/done">**P-12 Объём работ не является доводом.** Источник:
  `vibevm/vibespecs/boot/90-user.xml`, директива владельца 2026-08-09.</fact></item>
      <item><fact id="P-13" status="spec/done">**P-13 Официальность назначается сверху, видимость — по рёбрам.** Кто выше
  в иерархии, тот называет официальное; сайт находит всё, что объявило ребро,
  и показывает как community. Издатель всегда виден.</fact></item>
    </list>
    <list ordered="false" p="41">
      <item><fact id="P-14" status="spec/done">**P-14 Сшивать, не рисовать заново.** Визуальный язык, ридер и хостинг
  берутся из того, что у владельца уже сделано и работает: дизайн-система по
  эталону, лендинг, ридер oleg.guru, runbook инфраструктуры. Новое рисуется
  только там, где источники молчат, и помечается как предварительное до
  дизайн-ревью на живом рендере. Источник: слово владельца 2026-09-10 (§3),
  закон «дешевле проверить, чем породить».</fact></item>
      <item><fact id="P-15" status="spec/done">**P-15 Страница стоит одна.** Каждая страница читается как единственная,
  которую читатель когда-либо откроет: термины введены на месте, объяснение
  полно без спек, спека — подтверждение, не отсылка. Сложность допускается
  только в контейнерах, которые читатель видит заранее. Источник: слово
  владельца 2026-09-10 (§3), `STYLE.md` §1–§2.</fact></item>
      <item><fact id="P-16" status="spec/done">**P-16 Промпт сначала.** Любое действие в VibeVM делается агентом или
  руками, и агент — основной путь. Страница сценария сначала даёт задание
  агенту, затем объясняет, что произойдёт, и только потом — если это вообще
  нужно — ручные шаги. Это отличие от документации прошлого, где всё
  делалось руками. Источник: слово владельца 2026-09-10 (§3), D-30.</fact></item>
    </list>
  </section>
  <section id="decisions" title="5. Решения">
    <section id="d-01" title="D-01 Документация — это пакет; вводится kind `doc`">
      <p p="42"><fact id="D-01-DECISION" status="spec/done">**Решение.** В реестр видов добавляется `doc`. Пакет kind `doc`:</fact></p>
      <list ordered="false" p="43">
        <item><fact id="d-01-2" status="spec/done">ОБЯЗАН объявлять хотя бы один предмет в `[[documents]]` (D-04), а также
  `title` и `abstract` (D-20);</fact></item>
        <item><fact id="d-01-3" status="spec/done">НЕ МОЖЕТ объявлять `[boot_snippet]`, `[[mcp_server]]`, `[[binary]]`;</fact></item>
        <item><fact id="d-01-4" status="spec/done">МОЖЕТ объявлять `[[skill]]`, `[translates]`, `[media]` (список переводов
  в источнике не хранится — уточнение 2026-09-11, D-18);</fact></item>
        <item><fact id="d-01-5" status="spec/done">держит страницы под `vibevm/vibespecs/` своего дерева, как любой пакет со
  спеками; документы этого пакета относятся к жанру «документация» по признаку
  kind содержащего пакета;</fact></item>
        <item><fact id="d-01-6" status="spec/done">не устанавливается в проект командой `vibe install` (она отказывает с
  подсказкой), а прогревается в машинный store командой `vibe cache add`;
  локальный читатель и `vibe explain` читают store.</fact></item>
      </list>
      <p p="44"><fact id="d-01-why" status="spec/done">**Почему.** Три требования владельца — локальное чтение, скилл, сайт —
удовлетворяются одним механизмом: пакетом. Локальное чтение — это прогрев
store; скилл — это `[[skill]]` в манифесте; сайт — рендер тех же байтов. Отказ
от материализации в `vibedeps/` держит деревья потребителей тонкими и не даёт
агенту наткнуться на туториалы при grep по зависимостям. Kind, а не жанр
документа, задаёт поведение, потому что kind известен инструментам до чтения
файлов: индекс, гейт публикации, `vibe init`, `vibe list`.</fact></p>
      <p p="45"><fact id="d-01-limit" status="spec/done">**Известное ограничение.** Прогрев store — машинный, не проектный: теммейт,
клонировавший проект, не получит ту же версию документации автоматически.
Скилл называет команду прогрева; проектного объявления «консультируйся с
такой-то документацией» в этой волне нет.</fact></p>
      <p p="46"><fact id="d-01-rejected" status="spec/done">**Отвергнуто.**</fact></p>
      <list ordered="false" p="47">
        <item><fact id="d-01-10" status="spec/done">Документация как бес-kind-овый контент (форма PHASE-G-SPEC): инструменты не
  могли бы отличить её от flow и не могли бы запретить boot-сниппет.</fact></item>
        <item><fact id="d-01-11" status="spec/done">Материализация doc-пакетов в `vibedeps/` по умолчанию: раздувает
  коммитимое дерево каждого потребителя.</fact></item>
        <item><fact id="d-01-12" status="spec/done">Пятый корень раскладки `vibevm/vibedocs/`: ломает закон одного модуля
  раскладки (PROP-052) без выигрыша — адресация, сканеры и пивот уже работают
  над `vibevm/vibespecs/`.</fact></item>
      </list>
      <p p="48"><fact id="d-01-revisit" status="spec/done">**Пересмотреть когда.** Появится потребитель, которому документация нужна в
коммитимом дереве проекта или воспроизводимо между машинами команды
(наблюдение: запрос в BACKLOG или отказ `vibe install` в реальном сценарии) —
тогда добавить проектное объявление и режим материализации, не меняя default.</fact></p>
    </section>
    <section id="d-02" title="D-02 Два уровня документации">
      <p p="49"><fact id="D-02-DECISION" status="spec/done">**Решение.** Уровень 0: сайт рендерит любую опубликованную версию любого
пакета из её собственных байтов — манифест как справочная страница, README,
boot-сниппет, спеки с якорями, объявленные скиллы, бинарники и MCP-серверы,
картинки из `[media]`. Уровень 1: расширенная документация — отдельный пакет
kind `doc`, любое количество на предмет. Сайт сшивает уровни на одной странице
пакета.</fact></p>
      <p p="50"><fact id="d-02-why" status="spec/done">**Почему.** Уровень 0 бесплатен для автора и покрывает весь реестр сразу, как
rustdoc покрывает каждый крейт. Уровень 1 нужен только там, где кто-то хочет
большего, и не заставляет остальных ничего писать.</fact></p>
      <p p="51"><fact id="d-02-rejected" status="spec/done">**Отвергнуто.** Только уровень 1 — пустой сайт на старте. Только уровень 0 —
нет места туториалам и примерам.</fact></p>
      <p p="52"><fact id="d-02-revisit" status="spec/done">**Пересмотреть когда.** Никогда в рамках этой волны; уровни ортогональны.</fact></p>
    </section>
    <section id="d-03" title="D-03 Именование спутника и роль в семействе">
      <p p="53"><fact id="D-03-DECISION" status="spec/done">**Решение.** Официальная по умолчанию документация предмета `&lt;группа&gt;/&lt;имя&gt;`
называется `&lt;группа&gt;/&lt;имя&gt;-docs`, в той же группе. Документация ядра —
`org.vibevm.core/vibevm-docs`, спутник координаты хоста `org.vibevm.core/vibevm`.
Официальный по умолчанию перевод документации `&lt;группа&gt;/&lt;имя-документации&gt;`
на язык `&lt;lang&gt;` называется `&lt;группа&gt;/&lt;имя-документации&gt;-&lt;lang&gt;`, где `&lt;lang&gt;`
— тег BCP-47 в нижнем регистре (`ru`, `pt-br`, `zh-hans`). Любая другая
документация или перевод носят любое имя в любой группе: соглашение об имени
нужно только для официальности по умолчанию, а отображаемое имя — это `title`
(D-20). В PROP-028 добавляется роль `-docs` как **спутник**: он не участвует в
унисонном версионировании семейства, ведёт собственную линию версий, а
совместимость с предметом выражает ограничением версии в `[[documents]]`.</fact></p>
      <p p="54"><fact id="d-03-why" status="spec/done">**Почему.** Суффикс в той же группе — уже действующее правило семейств рядом с
`-lang` и `-mcp`; новой грамматики именования не нужно. Публиковать в группу
предмета может только её владелец, поэтому подделать «официальность» через имя
нельзя. Унисон семейства — закон для «проверенного набора» кода; проза и
переводы меняются в другом ритме.</fact></p>
      <p p="55"><fact id="d-03-rejected" status="spec/done">**Отвергнуто.**</fact></p>
      <list ordered="false" p="56">
        <item><fact id="d-03-4" status="spec/done">Подгруппа `org.vibevm.world.docs/&lt;имя&gt;` (форма DefinitelyTyped): копирует
  чужое пространство имён по договорённости, не несёт версию предмета, для
  сторонних авторов не работает, требует нового закона именования.</fact></item>
        <item><fact id="d-03-5" status="spec/done">Включить `-docs` в унисон семейства: каждая правка документации бампает
  весь код семейства.</fact></item>
        <item><fact id="d-03-6" status="spec/done">Кодировать язык в группе (`org.vibevm.core.ru/…`): та же ошибка подгруппы.</fact></item>
      </list>
      <p p="57"><fact id="d-03-revisit" status="spec/done">**Пересмотреть когда.** PROP-028 получит четвёртую кодовую роль, и суффиксов
станет тесно (наблюдение: конфликт стемов в реестре).</fact></p>
    </section>
    <section id="d-04" title="D-04 Связь документации с предметом">
      <p p="58"><fact id="D-04-DECISION" status="spec/done">**Решение.** Связь объявляется в обе стороны полями манифеста, а не именем.</fact></p>
      <fence lang="toml" p="59"># в пакете kind = "doc"
[[documents]]
package = "org.vibevm.world/multi-user-planning"
version = "^1.0"

# в предмете, любого kind
[documentation]
primary  = "org.vibevm.world/multi-user-planning-docs"
official = ["org.vibevm.world/multi-user-planning-tutorials"]</fence>
      <p p="60"><fact id="d-04-2" status="spec/done">Правила:</fact></p>
      <list ordered="false" p="61">
        <item><fact id="d-04-3" status="spec/done">`[[documents]]` обязателен в doc-пакете, может перечислять несколько
  предметов; версия — ограничение semver.</fact></item>
        <item><fact id="d-04-4" status="spec/done">`[documentation]` в предмете называет координаты **без версии**; `primary`
  — не более одной, `official` — сколько угодно.</fact></item>
        <item><fact id="d-04-5" status="spec/done">**Официальная** документация — та, для которой ребра сходятся: предмет
  назвал пакет, пакет объявил предмет. **Community** — есть только ребро от
  документации. Только ребро от предмета — «не опубликовано или ошибка»,
  сайт показывает предупреждение.</fact></item>
        <item><fact id="d-04-6" status="spec/done">**Соглашение по умолчанию:** если предмет не объявил `[documentation]`,
  пакет `&lt;имя&gt;-docs` в той же группе считается официальным и основным.
  Объявленный `[documentation]` заменяет соглашение целиком.</fact></item>
        <item><fact id="d-04-7" status="spec/done">Для версии предмета V сайт показывает документацию тех версий, чьё
  ограничение в `[[documents]]` допускает V, выбирая новейшую.</fact></item>
        <item><fact id="d-04-8" status="spec/done">Прогрев doc-пакета через `vibe cache add` прогревает и его предметы, чтобы
  цитаты `spec://` резолвились офлайн.</fact></item>
        <item><fact id="d-04-9" status="spec/done">Поля связи попадают в запись индекса реестра, чтобы обратные связи
  строились по `primary.jsonl`, а не скачиванием пакетов.</fact></item>
      </list>
      <p p="62"><fact id="d-04-why" status="spec/done">**Почему.** Ребро от предмета снимает опасение владельца: три разных
контрибьютора не смогут спорить за «официальность», потому что её назначает
предмет. Указатель без версии — потому что документация почти всегда выходит
позже кода. Соглашение по умолчанию избавляет от переиздания предмета ради
очевидного случая. Прецедент — поле `documentation` в Cargo.toml.</fact></p>
      <p p="63"><fact id="d-04-rejected" status="spec/done">**Отвергнуто.**</fact></p>
      <list ordered="false" p="64">
        <item><fact id="d-04-12" status="spec/done">Capability `docs:&lt;координата&gt;` в `provides`: грамматика capability допускает
  только kebab-case в обеих половинах (`crates/vibe-core/src/capability_ref.rs`),
  координата туда не помещается.</fact></item>
        <item><fact id="d-04-13" status="spec/done">Обычная зависимость `requires` на предмет: зависимость не означает
  «документирую».</fact></item>
        <item><fact id="d-04-14" status="spec/done">Пометка официальности в индексе реестра, вне байтов пакета: второй источник
  правды, исчезающий в локальном режиме и в приватных реестрах.</fact></item>
        <item><fact id="d-04-15" status="spec/done">Только соглашение об имени: ноль гарантий.</fact></item>
      </list>
      <p p="65"><fact id="d-04-revisit" status="spec/done">**Пересмотреть когда.** Появится третий тип связи между пакетами такой же
природы, помимо `documents` и `translates` — тогда обобщить в одну таблицу
отношений, не плодя поля.</fact></p>
    </section>
    <section id="d-05" title="D-05 Kind `app` и граница с `tool`">
      <p p="66"><fact id="D-05-DECISION" status="spec/done">**Решение.** Kind `app` допускается в этой же поправке. Граница по механике:
`tool` живёт в проекте и запускается через `vibe bin exec` по lock-файлу; `app`
— самостоятельный продукт со своим профилем деплоя в плоскости build, package,
deploy. Пакет сайта `org.vibevm.doc/web` — kind `app`.</fact></p>
      <p p="67"><fact id="d-05-why" status="spec/done">**Почему.** Граница по существующей механике проверяема инструментами; граница
«по впечатлению» — нет.</fact></p>
      <p p="68"><fact id="d-05-rejected" status="spec/done">**Отвергнуто.** Считать сайт `tool`: у сайта нет смысла «выполниться в
проекте по lock-файлу».</fact></p>
      <p p="69"><fact id="d-05-revisit" status="spec/done">**Пересмотреть когда.** Появится второй `app` с другой механикой запуска.</fact></p>
    </section>
    <section id="d-06" title="D-06 Сайт `vibevm.org/doc` и схема адресов">
      <p p="70"><fact id="D-06-DECISION" status="spec/done">**Решение.** Сайт монтируется под путём `/doc` основного домена. Язык — сегмент
пути после `/doc/`; исходный язык документации не носит префикса. Отображение
адресов детерминированное и без индекса:</fact></p>
      <fence p="71">spec://&lt;группа&gt;/&lt;имя&gt;@&lt;версия&gt;/&lt;документ&gt;#&lt;якорь&gt;
  → https://vibevm.org/doc/&lt;группа&gt;/&lt;имя&gt;/&lt;версия&gt;/&lt;документ&gt;#&lt;якорь&gt;
spec://&lt;группа&gt;/&lt;имя&gt;/&lt;документ&gt;#&lt;якорь&gt;
  → https://vibevm.org/doc/&lt;группа&gt;/&lt;имя&gt;/latest/&lt;документ&gt;#&lt;якорь&gt;
перевод на ru той же страницы
  → https://vibevm.org/doc/ru/&lt;группа&gt;/&lt;имя&gt;/&lt;версия&gt;/&lt;документ&gt;#&lt;якорь&gt;</fence>
      <p p="72"><fact id="d-06-2" status="spec/done">Страницы старых версий несут `rel=canonical` на `latest` в пределах своего
языка. Локальный читатель использует ту же схему с другим origin. Адрес
страницы заканчивается слэшем (`…/&lt;документ&gt;/`), проекции лежат рядом как
файлы (`…/&lt;документ&gt;.md`, `…/&lt;документ&gt;.xml`); адрес без слэша получает
редирект 308 и в вебе, и локально (уточнение 2026-09-11 по A0.10:
единственный рабочий режим статического адаптера).</fact></p>
      <p p="73"><fact id="d-06-3" status="spec/done">Адрес с номером версии всегда показывает **текущее** содержимое этой версии
в реестре: один номер может быть опубликован десять раз за день, и сайт
показывает последнюю публикацию. Постоянных ссылок на прошлые публикации
нет — их не существует и в реестре (D-27).</fact></p>
      <p p="74"><fact id="d-06-4" status="spec/done">Весь домен — один сайт (девятая редакция, D-28): лендинг `vibevm.org/` и
`vibevm.org/ru/` и документация `/doc/…` собираются одной сборкой из одного
пакета. Корневые машинные файлы — `robots.txt`, `llms.txt`, `llms-full.txt`,
`sitemap.xml`, `feed.xml`, ключ-файл IndexNow — генерирует та же сборка,
сохраняя нынешние адреса и содержание лендинга: `robots.txt` один на домен
(ASCII-only, allow-лист краулеров) и несёт `Sitemap:` на `/sitemap.xml` и
`/doc/sitemap.xml`; корневой `llms.txt` открывается абзацем дизамбигуации
имени «VibeVM» и ссылается на `/doc/llms.txt`; документация публикует свои
файлы под `/doc/`: `/doc/sitemap.xml`, `/doc/llms.txt`, `/doc/llms-full.txt`,
`/doc/manifest.json`. Корневой `llms-full.txt` — лендинг, не копия
документации.</fact></p>
      <p p="75"><fact id="d-06-why" status="spec/done">**Почему.** Путь под основным доменом делит его авторитет для SEO. Одна и та
же схема в вебе и локально означает, что ссылка в документации работает в обоих
мирах. Язык в пути, а не в параметре, — так его индексируют и цитируют.
Лендинг уже проиндексирован и несёт дизамбигуацию имени «VibeVM» для
AI-краулеров, поэтому его адреса и корневые файлы сохраняются при переезде на
тот же сайт байт в байт, где это возможно, и проверяются тестом паритета
(D-28).</fact></p>
      <p p="76"><fact id="d-06-rejected" status="spec/done">**Отвергнуто.** Поддомен `docs.vibevm.org`; язык в query-параметре; язык в
поддомене; два сайта на одном домене — Astro-лендинг плюс Qwik-документация с
контрактом трёх строк между репозиториями (решение третьей редакции, снято
D-28).</fact></p>
      <p p="77"><fact id="d-06-revisit" status="spec/done">**Пересмотреть когда.** Никогда в рамках волны; смена схемы адресов —
ломающее изменение с редиректами.</fact></p>
    </section>
    <section id="d-07" title="D-07 Реестровый сайт: источники, лента изменений, сборка по хэшу">
      <p p="78"><fact id="D-07-DECISION" status="spec/done">**Решение.** У сайта два источника, оба заданы конфигурацией той же формы, что
`[[registry]]` проекта:</fact></p>
      <list ordered="false" p="79">
        <item><fact id="d-07-2" status="spec/done">**реестр пакетов** — один, по умолчанию GitHub-организация `vibespecs`;
  его индекс — лента изменений: сайт опрашивает `repomd.json` и `primary.jsonl`
  (или получает webhook), сравнивает пары «координата, content hash» с
  отрендеренным и пересобирает только изменившиеся;</fact></item>
        <item><fact id="d-07-3" status="spec/done">**репозиторий исходников хоста** — один, по умолчанию `github.com/vibevm/vibevm`;
  из него рендерится сам `org.vibevm.core/vibevm` **по текущему состоянию
  ветки `main`**: рендерер держит выкладку репозитория на диске (`git pull`
  деплоем) и читает её как проект и как project-local реестр in-tree
  пакетов — без публикации хоста в реестр и без git-источника пакетов
  (уточнение 2026-09-11 по A0.20: корень хоста не пакет). Тегов релизов у
  хоста нет (журнал, J-014). Сайт хранит только текущий рендер и
  пересобирает его, когда ветка изменилась, с дебаунсом (D-16, D-27).</fact></item>
      </list>
      <p p="80"><fact id="d-07-4" status="spec/done">Рендер ключуется хэшем, идемпотентен и кэшируется. Ошибка рендера показывается
как страница версии. Обратные связи — зависимые, «объяснено в», «переведено
на» — берутся из индекса и карт, которые пакеты несут (`vibe specmap`).
Зеркала и вторые реестры — будущее.</fact></p>
      <p p="81"><fact id="d-07-why" status="spec/done">**Почему.** Так устроен docs.rs над индексом crates.io, а у нас дешевле:
версия заморожена по content hash. Хост — не пакет реестра, и заставлять его
им стать ради сайта было бы ложным обобщением; git-источник уже поддержан.</fact></p>
      <p p="82"><fact id="d-07-rejected" status="spec/done">**Отвергнуто.** Полная пересборка по расписанию; публикация хоста в реестр
ради рендера; чтение хоста с зеркала.</fact></p>
      <p p="83"><fact id="d-07-revisit" status="spec/done">**Пересмотреть когда.** Владелец откроет зеркала или второй реестр.</fact></p>
    </section>
    <section id="d-08" title="D-08 Контент-конвейер на Rust, оболочка на Qwik">
      <p p="84"><fact id="D-08-DECISION" status="spec/done">**Решение.** Всё содержательное — в Rust-библиотеке (рабочее имя крейта
`vibe-doc`): HTML-бэкенд пивота, выдающий «остров» страницы; JSON-манифест
страниц; `llms.txt` всех уровней и языков; Markdown- и XML-проекции; проверка
примеров, цитат, переводов и покрытия; генерация плейсхолдеров и превью;
чтение источников (store, lock, реестр, git-источник). Поверхности над ней:
CLI `vibe doc build | serve | check | manifest`, инструменты MCP, HTTP-сервер.
Qwik-оболочка ничего не парсит: она получает остров как готовый HTML и данные
по JTD-контракту с генерируемыми TypeScript-типами.</fact></p>
      <p p="85"><fact id="d-08-why" status="spec/done">**Почему.** Закон omnichannel. Если бы сайт заново парсил Markdown, якоря и
факты потеряли бы идентичность, а локальный и публичный рендер разошлись бы.</fact></p>
      <p p="86"><fact id="d-08-rejected" status="spec/done">**Отвергнуто.** Статический генератор на стороне TypeScript, читающий
исходники сам.</fact></p>
      <p p="87"><fact id="d-08-revisit" status="spec/done">**Пересмотреть когда.** Никогда в рамках волны.</fact></p>
    </section>
    <section id="d-09" title="D-09 Локальный читатель и режим встраивания">
      <p p="88"><fact id="D-09-DECISION" status="spec/done">**Решение.** `vibe doc serve` поднимает HTTP-сервер **только на 127.0.0.1**,
отдаёт оболочку и на каждый запрос вклеивает остров, отрендеренный из
машинного store, lock-файла текущего проекта или приватного реестра.
Предпочтение языка берётся из `[i18n].preferred` проекта, если он есть. Режим
полностью автономен: никаких обращений к vibevm.org, никаких внешних CDN и
шрифтов, всё в бандле. Сервер отдаёт файлы только из известных корней (store,
оболочка), без обхода путей и без листинга каталогов, с CSP без внешних
источников. Контракт встраивания для webview: относительные адреса и
настраиваемый базовый путь; команда «открой адрес» через URL и postMessage;
обратный сигнал «клик по файлу», чтобы хост-приложение открыло файл в
редакторе; тема — параметром запуска, и хост может переключить её на лету
через postMessage (плагин VS Code следует теме редактора, см. D-22). Локальный
сервер отдаёт `Content-Security-Policy: frame-ancestors` только для origin
хоста, который его запустил — параметром запуска `--frame-ancestor
&lt;origin&gt;`, потому что origin webview меняется от окна к окну; без параметра
`'none'`; CORS-слоя у читателя нет вовсе, а параметры запуска передаются в
страницу неисполняемым блоком `&lt;script type="application/json"&gt;` без
`'unsafe-inline'` (уточнение 2026-09-11 по A0.7); публичный сайт во фреймы
не встраивается.</fact></p>
      <p p="89"><fact id="d-09-why" status="spec/done">**Почему.** Так читается документация проприетарных пакетов; так плагин
VS Code получает интерфейс через iframe; так контент никогда не покидает
машину и не виден другим пользователям машины.</fact></p>
      <p p="90"><fact id="d-09-rejected" status="spec/done">**Отвергнуто.** Отдельное «локальное приложение» с собственным кодом;
привязка к `0.0.0.0`.</fact></p>
      <p p="91"><fact id="d-09-revisit" status="spec/done">**Пересмотреть когда.** Владелец откроет работу над плагином VS Code и
захочет нативный интерфейс вместо webview.</fact></p>
    </section>
    <section id="d-10" title="D-10 Словарь документации в диалекте">
      <p p="92"><fact id="D-10-DECISION" status="spec/done">**Решение.** Диалект XML расширяется словарём жанра «документация»: пять
элементов и один атрибут, легальные только в документах doc-пакетов. У каждого
элемента записана проекция в Markdown и свой проверяющий.</fact></p>
      <table p="93">
        <tr>
          <td>Элемент</td>
          <td>Назначение</td>
          <td>Проекция в Markdown</td>
          <td>Проверяющий</td>
        </tr>
        <tr>
          <td><fact id="d-10-2" status="spec/done">`example` с детьми `run`, `expect` (stdout) и необязательным `stderr`; атрибуты `id`, `fixture`, `lang`, `exit` (по умолчанию `0`), `when`</fact></td>
          <td><fact id="d-10-3" status="spec/done">команды и ожидаемый вывод; `fixture` называет герметичный проект-фикстуру, которая объявляет правила нормализации и карту «документ `--json` → JTD-схема»; отсутствующий `stderr` — утверждение «stderr пуст»</fact></td>
          <td><fact id="d-10-4" status="spec/done">два соседних fence, `sh` и `output` (третий — `stderr`, если есть)</fact></td>
          <td><fact id="d-10-5" status="spec/done">раннер `vibe doc check --examples` против собранного бинарника: точное совпадение после объявленной нормализации, шаблонов `match` нет (уточнение 2026-09-11 по A0.12); расхождение — красный</fact></td>
        </tr>
        <tr>
          <td><fact id="d-10-6" status="spec/done">`example ref="&lt;id&gt;"`</fact></td>
          <td><fact id="d-10-7" status="spec/done">в переводе: ссылка на пример источника вместо собственного</fact></td>
          <td><fact id="d-10-8" status="spec/done">те же два fence, скопированные из источника при проекции</fact></td>
          <td><fact id="d-10-9" status="spec/done">существование `id` в источнике</fact></td>
        </tr>
        <tr>
          <td><fact id="d-10-10" status="spec/done">`rule ref="spec://…#ЯКОРЬ"`</fact></td>
          <td><fact id="d-10-11" status="spec/done">точка вставки правила из спеки; сайт показывает **текущий** текст факта на месте, на языке спеки</fact></td>
          <td><fact id="d-10-12" status="spec/done">ссылка на якорь</fact></td>
          <td><fact id="d-10-13" status="spec/done">резолвер якорей; ребро `documents` без пина; исчезнувший якорь — ошибка сборки (D-27)</fact></td>
        </tr>
        <tr>
          <td><fact id="d-10-14" status="spec/done">`derived kind="cli-help / jtd-schema / manifest-field" ref="…"`</fact></td>
          <td><fact id="d-10-15" status="spec/done">вставка машинно-выведенного справочника или поля манифеста (например, `abstract`)</fact></td>
          <td><fact id="d-10-16" status="spec/done">fence с текстом или таблица</fact></td>
          <td><fact id="d-10-17" status="spec/done">генератор при сборке; расхождение — красный, кроме явного `--accept`</fact></td>
        </tr>
        <tr>
          <td><fact id="d-10-18" status="spec/done">`note kind="note / tip / warning"`</fact></td>
          <td><fact id="d-10-19" status="spec/done">врезка</fact></td>
          <td><fact id="d-10-20" status="spec/done">цитата с меткой в первой строке</fact></td>
          <td><fact id="d-10-21" status="spec/done">схема</fact></td>
        </tr>
        <tr>
          <td><fact id="d-10-22" status="spec/done">`figure src alt` с ребёнком `caption`</fact></td>
          <td><fact id="d-10-23" status="spec/done">рисунок с подписью; файл лежит в дереве пакета как исходник</fact></td>
          <td><fact id="d-10-24" status="spec/done">inline-картинка плюс абзац подписи</fact></td>
          <td><fact id="d-10-25" status="spec/done">существование файла</fact></td>
        </tr>
        <tr>
          <td><fact id="d-10-26" status="spec/done">`prompt id` с телом-заданием и детьми `needs`, `outcome`, `assert*` (седьмой элемент, по слову владельца — D-30)</fact></td>
          <td><fact id="d-10-27" status="spec/done">задание агенту в голосе пользователя, что агенту нужно, что увидит человек, шелл-команды, обязанные завершиться нулём после работы агента</fact></td>
          <td><fact id="d-10-28" status="spec/done">fence `prompt`, список «нужно», абзац «результат», список ассертов; в `llms*.txt` — тот же fence</fact></td>
          <td><fact id="d-10-29" status="spec/done">`vibe doc check --prompts`: прогон настроенным агентом в чистом временном каталоге, затем ассерты; не в панели; на странице сценария ассерт обязателен (линтер стиля)</fact></td>
        </tr>
        <tr>
          <td><fact id="d-10-30" status="spec/done">атрибут `when="os:…"` на `example`, `note` и секциях</fact></td>
          <td><fact id="d-10-31" status="spec/done">платформенные варианты</fact></td>
          <td><fact id="d-10-32" status="spec/done">подзаголовок с именем платформы</fact></td>
          <td><fact id="d-10-33" status="spec/done">существующий словарь условий boot-лейна</fact></td>
        </tr>
      </table>
      <p p="94"><fact id="d-10-34" status="spec/done">Вкладок нет намеренно, их заменяет `when`. Пошаговые процедуры — упорядоченный
список с `example` внутри. Инлайн-содержимое остаётся Markdown. Вывод команд в
`expect` нормализуется: временные пути, разделители, переводы строк, версии,
ANSI-последовательности.</fact></p>
      <p p="95"><fact id="d-10-35" status="spec/done">*(Уточнено 2026-09-11 по находке A0.4 — как словарь ложится в пивот
`vibe-specdoc`, не меняя таблицы выше.)*</fact></p>
      <list ordered="false" p="96">
        <item><fact id="d-10-36" status="spec/done">**Словарь — параметр читателя.** `Vocabulary::{Spec, Doc}` (умолчание
  `Spec`), аддитивные `from_xml_with` и `load_spec_text_with`; отображение
  «kind пакета → словарь» делает вызывающая сторона, потому что пивот по
  закону отделимости не знает `PackageKind`. Элемент жанра, встреченный в
  словаре `Spec`, — громкая ошибка с жанровым сообщением, не игнор.</fact></item>
        <item><fact id="d-10-37" status="spec/done">**Дискриминатор против коллизии имён.** Имена `example`, `rule`, `derived`,
  `run` уже живут в корпусе как именованные секции (`&lt;example title="…"&gt;`).
  Правило словаря: **блок жанра никогда не несёт `title=`, именованная
  секция несёт его всегда**. Поэтому `&lt;example title="…"&gt;` — секция в любом
  словаре, `&lt;example&gt;` без `title` — блок в словаре `Doc`; писатель от
  словаря не зависит.</fact></item>
        <item><fact id="d-10-38" status="spec/done">**`when` — на любом блоке и на секциях**, не только на `example` и `note`:
  в пивоте условие — свойство слота (`BlockNode { when, block }`), а не
  рода блока. Значения — закрытый список условий boot-лейна.</fact></item>
        <item><fact id="d-10-39" status="spec/done">**Проекция в Markdown необратима** для doc-жанра: `md_out` даёт лучшую
  проекцию каждого элемента (колонка таблицы), обратный разбор даёт другой
  IR; это закон жанра, закреплённый тестом, а не дефект. Авторинг
  документации — только XML.</fact></item>
        <item><fact id="d-10-40" status="spec/done">**Адрес `rule` отбрасывает `~rN`**: пин, случайно попавший в атрибут, не
  становится пином ребра (D-18, D-27).</fact></item>
        <item><fact id="d-10-41" status="spec/done">**Тексты `run`, `expect`, тела `prompt` и `assert`** — дословные, как
  `fence`; CDATA в них разрешена явным списком.</fact></item>
        <item><fact id="d-10-42" status="spec/done">**Раннер примеров** (по макету A0.12): cwd команды — свежая песочница с
  копией фикстуры, никогда дерево; изоляция одной переменной
  `VIBE_SETTINGS` в нативном написании пути плюс `NO_COLOR`; поведенческие
  переменные (`VIBE_OFFLINE`, `VIBE_UNATTENDED`, `VIBE_INVOKED_BY`,
  `VIBETERM`, `VIBEFRAME`) вычищаются — флаги стоят в самом примере;
  tripwire на неизменность настоящего `~/.vibe` и исходного дерева; stdout
  и stderr захватываются раздельно; примеры документируют не-TTY ветку
  продукта (интерактивные подсказки описываются прозой); `--json`
  разбирается как поток документов, каждый сверяется со схемой по карте
  фикстуры, документ без схемы сообщается как непроверенный; валидатор
  JTD пишется в `vibe-doc` (в `vibe-wire` его нет — схемы там вход
  кодогенерации). Нормализация: `&lt;TMP&gt;`, `&lt;HOME&gt;`, `&lt;REPO&gt;`, слэши, CRLF в
  ожидаемых файлах, `vibe &lt;VERSION&gt;` (версии пакетов не трогаются), ANSI,
  сортировка блоков по объявленной форме строки, локальные `replace`
  фикстуры; порядок — замены путей до унификации слэшей, сортировка после
  всех замен.</fact></item>
      </list>
      <p p="97"><fact id="d-10-limit" status="spec/done">**Известное ограничение.** README и спеки пакетов других видов не могут нести
проверяемые примеры — словарь включается по kind пакета. Их fence-блоки
рендерятся на уровне 0 как есть, непроверенными.</fact></p>
      <p p="98"><fact id="d-10-why" status="spec/done">**Почему.** Владелец выбрал вариант А: именованный тэг самоописателен для
агента, а пример проверяем по построению. Это переоткрытие записанного решения
PROP-045 «диалект — ровно подмножество Markdown»; по закону decision-records
переоткрытие обязано назвать сработавший триггер: появился потребитель,
которому нужна конструкция, невыразимая в Markdown. Триггер назван — жанр
документации.</fact></p>
      <p p="99"><fact id="d-10-rejected" status="spec/done">**Отвергнуто.** Markdown с директивами; соглашения внутри нынешнего диалекта;
элемент вкладок; собственные примеры в переводах.</fact></p>
      <p p="100"><fact id="d-10-revisit" status="spec/done">**Пересмотреть когда.** Два авторских запроса на конструкцию вне этого набора
или на проверяемые примеры в README обычного пакета, записанных в BACKLOG.</fact></p>
    </section>
    <section id="d-11" title="D-11 Аудитория `agent`">
      <p p="101"><fact id="D-11-DECISION" status="spec/done">**Решение.** В словарь `audience` добавляется значение `agent`. Значения
`user`, `author`, `dev` остаются и соответствуют оператору, автору и
мейнтейнеру из плана DOCS; «новичок» — маршрут внутри `user`. Текст с
`audience="agent"` подчиняется законам агентского текста: бюджет токенов, без
повествования, никогда не в boot-префиксе; сайт отдаёт его в разделе «для
агентов» и первым в `llms.txt`. Аудитории документации не объявляются в
манифесте — выводятся из разметки страниц.</fact></p>
      <p p="102"><fact id="d-11-why" status="spec/done">**Почему.** PHASE-G-SPEC предсказал дыру: boot-сниппет и инструкции скилла
читает не человек, а сессия. Разметки `audience` в корпусе почти нет, менять
словарь дёшево сейчас.</fact></p>
      <p p="103"><fact id="d-11-rejected" status="spec/done">**Отвергнуто.** Отдельный жанр вместо аудитории; две оси «кто читает × роль»;
поле аудиторий в манифесте.</fact></p>
      <p p="104"><fact id="d-11-revisit" status="spec/done">**Пересмотреть когда.** Появится текст, которому не хватает ни одного из
четырёх значений.</fact></p>
    </section>
    <section id="d-12" title="D-12 Стек и встраивание оболочки">
      <p p="105"><fact id="D-12-DECISION" status="spec/done">**Решение.** Сайт — TypeScript под дисциплиной `typescript-ai-native`, Qwik
2.0 beta (next.qwik.dev), версия запинена точно, вместе с версиями Node и
pnpm. Один код оболочки, два адаптера: статический для сервера (пререндер
каждого маршрута, остров вклеен при сборке) и встраиваемый для `vibe`.</fact></p>
      <p p="106"><fact id="d-12-2" status="spec/done">**Предложенный механизм встраивания (ждёт подтверждения владельца):**</fact></p>
      <list ordered="true" p="107">
        <item><fact id="d-12-3" status="spec/done">Шаг `cargo xtask embed-doc-shell` собирает web-пакет из исходника
   (pnpm build со встраиваемым адаптером) и складывает результат — шаблон
   маршрута с местом под остров, скрипты, стили — в каталог, который крейт
   `vibe-doc-shell` включает в бинарник через `rust-embed` или `include_dir`
   за фича-флагом `embedded-shell`.</fact></item>
        <item><fact id="d-12-4" status="spec/done">Релизная сборка `vibe` включает флаг и падает, если оболочки нет.
   Обычная `cargo build` без Node компилируется с запасной оболочкой — голый
   HTML без скриптов.</fact></item>
        <item><fact id="d-12-5" status="spec/done">**Сборка из исходников без Node** (`vibe self install`, `first-run`) не
   остаётся с голой оболочкой навсегда: при первом `vibe doc serve` читатель
   предлагает скачать оболочку, соответствующую его версии, из релизных
   активов, проверяет content hash по пину и кладёт в store версий VVM; при
   отказе или офлайн работает запасная оболочка. Скачивание только по явному
   согласию, никогда автоматически.</fact></item>
        <item><fact id="d-12-6" status="spec/done">`vibe doc serve` отдаёт статику оболочки из бинарника или из store версий и
   на каждый запрос вклеивает остров, отрендеренный Rust-конвейером.</fact></item>
        <item><fact id="d-12-7" status="spec/done">Координата и content hash оболочки пинуются в lock-файле рядом с `vibe`;
   self-check сверяет встроенную оболочку с пином; `vibe doc serve` умеет
   сообщить, что несёт.</fact></item>
        <item><fact id="d-12-8" status="spec/done">Оболочка собирается с настраиваемым базовым путём и относительными
   адресами; внешних скриптов нет.</fact></item>
        <item><fact id="d-12-9" status="spec/done">Тест паритета: над одним пакетом прогоняются оба адаптера и сравнивают
   остров байт в байт.</fact></item>
        <item><fact id="d-12-10" status="spec/done">Шрифты — самохостинг в бандле оболочки, латиница и кириллица отдельными
   подсетами woff2 с `unicode-range` (тот же приём и те же файлы, что у
   лендинга); внешних шрифтовых сервисов нет ни в вебе, ни локально.</fact></item>
      </list>
      <p p="108"><fact id="d-12-11" status="spec/done">*(Уточнено 2026-09-11 по находкам A0.10 и A0.11.)* Пины: `@qwik.dev/core`
и `@qwik.dev/router` `2.0.0-beta.43` (линия 2.0 с next.qwik.dev живёт под
npm-тегом `beta`; `latest` — это 1.x и не используется), Vite `8.2.1`, Node
`24.18.0`, pnpm `10.33.2`; статический адаптер — `ssg`
(`@qwik.dev/router/adapters/ssg/vite`). Один сайт собирается с `base: "/"`,
а `/`, `/ru/` и `/doc/…` — каталоги маршрутов; встроенный адаптер —
отдельная конфигурация с `base: "/doc/"` и маршрутами документации в
корне. Адреса страниц заканчиваются слэшем: это единственный рабочий режим
беты (D-06). Встраивание — крейт `include_dir` (MIT, четыре зависимости;
`rust-embed` в отладочной сборке читает с диска), `build.rs` с
`rerun-if-changed` и остановкой при отсутствии `shell/index.html` под
фичей `embedded-shell`, пин — `VIBE_DOC_SHELL_SHA256` константой бинарника.
Оболочка в релизе — **отдельный актив** `vibevm-doc-shell-&lt;версия&gt;.zip` без
цели платформы с отдельным манифестом `DOC-SHELL.json` той же формы, что
`DISTRIBUTIONS.json` (в который поле добавлять нельзя: схема закрыта, и
старые `vibe` потеряли бы `self update`). Скачанная оболочка живёт в общем
контент-адресуемом каталоге `~/.vibe/opt/vibevm/doc-shell/&lt;sha256&gt;/`, не
внутри неизменяемого экземпляра; команда — `vibe doc shell install
[--assume-yes]` с согласием по образцу `install`; без оболочки и без сети
читатель работает на запасной оболочке и предупреждает — никаких
обращений в сеть без согласия.</fact></p>
      <p p="109"><fact id="d-12-12" status="spec/done">Провайдер сборки Node в плоскости build нужен только серверной сборке; на
машине читателя Node не требуется. Серверная сборка идёт в Docker по образцу
лендинга: стадия сборки на образе Node собирает оболочку и рендерит
страницы, стадия выдачи — стоковый nginx (D-23).</fact></p>
      <p p="110"><fact id="d-12-why" status="spec/done">**Почему.** Владелец выбрал Qwik 2.0 и Б для локального читателя. Бета
допустима по закону «свежая, но хорошо спроектированная библиотека» с точным
пином и триггером пересмотра. Тождество публичного и локального рендера держится
на общем острове, а не на общем JS-рантайме. Пункт 3 закрывает дыру: иначе
каждый, кто ставит vibe из исходников, получал бы урезанный читатель.</fact></p>
      <p p="111"><fact id="d-12-rejected" status="spec/done">**Отвергнуто.**</fact></p>
      <list ordered="false" p="112">
        <item><fact id="d-12-15" status="spec/done">SSR Qwik локально через встроенный JS-движок (QuickJS).</fact></item>
        <item><fact id="d-12-16" status="spec/done">Собранная оболочка рядом с бинарником в релизном zip вместо встраивания.</fact></item>
        <item><fact id="d-12-17" status="spec/done">Собранные ассеты внутри пакета `org.vibevm.doc/web`: закон P-10.</fact></item>
        <item><fact id="d-12-18" status="spec/done">Требовать Node для сборки vibe из исходников.</fact></item>
      </list>
      <p p="113"><fact id="d-12-revisit" status="spec/done">**Пересмотреть когда.** Выход стабильной Qwik 2.0 или ломающее изменение
беты, требующее переписывания.</fact></p>
    </section>
    <section id="d-13" title="D-13 Контракт SEO и LLM SEO">
      <p p="114"><fact id="D-13-DECISION" status="spec/done">**Решение.** Публичный сайт ОБЯЗАН:</fact></p>
      <list ordered="false" p="115">
        <item><fact id="d-13-2" status="spec/done">отдавать полностью серверно отрендеренный HTML, без содержимого за
  скриптами;</fact></item>
        <item><fact id="d-13-3" status="spec/done">держать одну каноническую страницу на факт и язык: старые версии несут
  `rel=canonical` на `latest` своего языка; между языками — `hreflang` на
  каждый доступный язык и `x-default` на исходный язык документации;</fact></item>
        <item><fact id="d-13-4" status="spec/done">публиковать sitemap-индекс по пакетам и языкам с `lastmod` из даты
  публикации;</fact></item>
        <item><fact id="d-13-5" status="spec/done">в `robots.txt` явно разрешать краулеров OpenAI, Anthropic, Google, Perplexity
  и других; список имён агентов **проверяется по документации провайдеров при
  каждой сборке**, а не переписывается по памяти; `robots.txt` один на домен
  и генерируется сборкой сайта вместе с корневыми `llms.txt`, `sitemap.xml`,
  `feed.xml` (D-06, D-28); файл держится ASCII-only, как у прежнего лендинга;
  домен не за Cloudflare (D-23), поэтому снимать там блокировку AI-краулеров
  не нужно;</fact></item>
        <item><fact id="d-13-6" status="spec/done">отдавать все текстовые форматы с `charset=utf-8` (`charset_types` в
  контейнерном nginx, как у лендинга) и все редиректы относительными
  (`absolute_redirect off; port_in_redirect off;`) — TLS терминируется вне
  контейнера, и абсолютный `Location: http://…` роняет строгих фетчеров в
  петлю редиректов, что уже случалось с фетчером Claude на oleg.guru;</fact></item>
        <item><fact id="d-13-7" status="spec/done">после каждого деплоя с изменением страниц отправлять список изменённых URL
  в IndexNow ключом лендинга (ключ-файл в корне домена уже есть);</fact></item>
        <item><fact id="d-13-8" status="spec/done">нести JSON-LD (`TechArticle` с `headline`, `abstract`, `author`,
  `inLanguage`, `keywords`, `datePublished`, `image`; `SoftwareApplication`;
  `BreadcrumbList`; `FAQPage` где уместно), Open Graph и Twitter Card
  `summary_large_image` с превью из `[media].preview` или сгенерированной
  карточкой (D-20);</fact></item>
        <item><fact id="d-13-9" status="spec/done">публиковать `llms.txt` (индекс с однострочными резюме) и `llms-full.txt`
  для базового корпуса, плюс `llms-small.txt` и `llms-medium.txt` под бюджет
  токенов, все — выведенные из того же манифеста, что и навигация, а полный
  корпус упорядочен по закону слоёв; те же файлы — на каждый язык и на каждый
  пакет; реестровый `llms.txt` — каталог документаций в стиле arXiv: заголовок,
  звёздочка официальности, издатель, язык, аудитории, аннотация, ссылка;</fact></item>
        <item><fact id="d-13-10" status="spec/done">отдавать каждую страницу как чистый Markdown по адресу с суффиксом `.md` и
  как сырой XML по адресу с суффиксом `.xml`;</fact></item>
        <item><fact id="d-13-11" status="spec/done">отдавать JSON-манифест страниц со статусами официальности, языками,
  аудиториями, жанрами, якорями и резюме, эндпоинт-резолвер `spec://` и,
  опционально, MCP-сервер сайта;</fact></item>
        <item><fact id="d-13-12" status="spec/done">держать плотный внутренний граф ссылок: зависимые, «объяснено в»,
  «переведено на», спека ↔ документация;</fact></item>
        <item><fact id="d-13-13" status="spec/done">строить страницы по одному шаблону: ответ первой фразой, один концепт на
  страницу, глоссарий с каноническими терминами, FAQ в форме вопросов, примеры
  с ожидаемым выводом; страницы сценариев — промпт сначала, механика потом,
  ручные шаги только когда они нужны (D-30).</fact></item>
      </list>
      <p p="116"><fact id="d-13-14" status="spec/done">Локальный режим ничего из этого не публикует и ни к чему внешнему не
обращается.</fact></p>
      <p p="117"><fact id="d-13-why" status="spec/done">**Почему.** Слово владельца: максимальное SEO включая LLM SEO. Каждый пункт
либо стандарт, либо следствие закона проекта.</fact></p>
      <p p="118"><fact id="d-13-rejected" status="spec/done">**Отвергнуто.** Блокировать AI-краулеров; ручные описания страниц; превью
ссылки обрезкой баннера; собственный `robots.txt` под `/doc/`.</fact></p>
      <p p="119"><fact id="d-13-revisit" status="spec/done">**Пересмотреть когда.** Появится новый стандарт машинного индекса.</fact></p>
    </section>
    <section id="d-14" title="D-14 Документация наблюдаема, проверяема и покрывает обязательства">
      <p p="120"><fact id="D-14-DECISION" status="spec/done">**Решение.** Doc-пакеты входят в include-globs `facts.toml` и в карту
трассируемости, но **не судятся**: их факты не входят в долг судейства, потому
что жанр ненормативен; механизм исключения выбирается спайком. Каждый `rule`
даёт ребро `documents` **без пина**: цитата — живая, страница при каждом
рендере показывает текущий текст факта по адресу; `vibe doc check
--citations` проверяет одно — что якорь существует; исчезнувший якорь без
tombstone роняет сборку. Никаких ревизий, хэшей текста и «спека ушла
вперёд»: такие проверки требовали бы истории, которой в проекте нет по
замыслу (D-27). Устарела ли **проза вокруг** цитаты — вопрос к человеку на
полной сверке (D-26), не к машине. Примеры с `expect` прогоняются в панели self-check как
golden-тесты — единственная техническая связка продукта с документацией;
оставить ли её — вопрос владельцу (§10 п. 12). **Гейт покрытия:** факты спек, помеченные
`actionstage="doc"` с аудиторией, — это обязательства; `vibe doc check
--coverage` требует, чтобы каждое обязательство было процитировано страницей
для той же аудитории; разметка обязательств в корпусе спек — отдельный атом
кампании, тот самый «суд», которого фазе G не хватило. Навигация сайта
выводится из манифеста страниц, а не из этого отчёта.</fact></p>
      <p p="121"><fact id="d-14-why" status="spec/done">**Почему.** Односторонняя связь без обратного обнаружения — это тихое гниение.
Покрытие, измеренное гейтом, отвечает на вопрос «всё ли рассказано», на который
навигация не отвечает.</fact></p>
      <p p="122"><fact id="d-14-rejected" status="spec/done">**Отвергнуто.** Ручной список страниц как источник; оглавление из отчёта
обязательств; судейство фактов документации.</fact></p>
      <p p="123"><fact id="d-14-revisit" status="spec/done">**Пересмотреть когда.** Никогда; это следствие P-02 и P-04.</fact></p>
    </section>
    <section id="d-15" title="D-15 Судьба существующей `docs/`">
      <p p="124"><fact id="D-15-DECISION" status="spec/done">**Решение.** `docs/` переезжает в `docs-legacy/` одним коммитом-переносом
без иных изменений. Новая документация пишется против неё: факт, который был
там и отсутствует в новой, — либо снят с записанной причиной, либо
регрессия. `README.md`, `DEV-GUIDE.md`, `RUNTIME-GUIDE.md` остаются на месте и
обновляются по закону same-commit.</fact></p>
      <p p="125"><fact id="d-15-why" status="spec/done">**Почему.** Так постановил PHASE-G-SPEC §2: архив, не удаление.</fact></p>
      <p p="126"><fact id="d-15-rejected" status="spec/done">**Отвергнуто.** Удалить `docs/`; переписать на месте.</fact></p>
      <p p="127"><fact id="d-15-revisit" status="spec/done">**Пересмотреть когда.** Регрессионный список закрыт и владелец подтвердил.</fact></p>
    </section>
    <section id="d-16" title="D-16 Канал хоста">
      <p p="128"><fact id="D-16-DECISION" status="spec/done">**Решение.** Сам vibevm рендерится из одного настроенного репозитория
исходников, по умолчанию `github.com/vibevm/vibevm`, **по текущему
состоянию ветки `main`** — и только по нему. Тегов релизов у хоста нет
(единственный тег — `pre-cultural-refactor`, не релизный; журнал J-014);
релиз по факту — это то, что сейчас в `main` и что `vibe self install
latest` собирает из исходников. Сайт опрашивает ветку, при изменении
пересобирает рендер с дебаунсом (конфигурация A5.1: не чаще раза в час) и
хранит один текущий рендер плюс предыдущий до успешного завершения нового.
Никакой истории состояний: её нет и в самом репозитории. Зеркала и
дополнительные репозитории — будущее. **Вопрос владельцу переформулирован**
(§10 п. 2): только частота опроса.</fact></p>
      <p p="129"><fact id="d-16-2" status="spec/done">*(Уточнено 2026-09-11 по находке A0.20.)* Корень хоста — `[project]`, не
`[package]` (B-031 дал ему полное имя `org.vibevm.core/vibevm`, но не сделал
публикуемым пакетом), поэтому «хост как пакет» не выбирается ни через
git-источник, ни через store. Канал хоста — **выкладка на диске**: деплой
делает `git checkout main &amp;&amp; git pull` в каталоге рендерера, и рендерер
читает оттуда сам хост как проект (уровень 0 — `README.md`, `vibevm/vibespecs/**`,
boot-сниппет, манифест) и документацию ядра как in-tree пакет через
project-local реестр (`vibevm/vibepacks`). Клон в кэш пакетов и `vibe cache
add` на сервере не нужны. Перерендер — когда содержимое выкладки изменилось;
сравнение по внутреннему хэшу содержимого, который наружу не показывается
(D-27): у in-tree пакетов номер версии стоит на месте, а содержимое идёт.</fact></p>
      <p p="130"><fact id="d-16-why" status="spec/done">**Почему.** Слово владельца: «тот репозиторий, который указали в настройках,
по умолчанию гитхаб». Первая редакция этого вижена прочла это как «реестр»;
вторая и третья — как «по тегам»; шестая пыталась хранить состояния по хэшу
дерева; седьмая, по слову владельца, оставила только текущее: история
переписывается намеренно, и документация не должна притворяться, что помнит
её.</fact></p>
      <p p="131"><fact id="d-16-rejected" status="spec/done">**Отвергнуто.** Публикация хоста в реестр ради рендера; зеркала; рендер по
тегам (их нет); хранение состояний по хэшу дерева или коммита (фича,
требующая истории — D-27).</fact></p>
      <p p="132"><fact id="d-16-revisit" status="spec/done">**Пересмотреть когда.** Владелец откроет зеркала.</fact></p>
    </section>
    <section id="d-17" title="D-17 Куда ложится норма">
      <p p="133"><fact id="D-17-DECISION" status="spec/done">**Решение.**</fact></p>
      <list ordered="false" p="134">
        <item><fact id="d-17-2" status="spec/done">Поправка реестра видов в `VIBEVM-SPEC.md` §4.1 — рукой владельца; агент
  готовит точный дифф.</fact></item>
        <item><fact id="d-17-3" status="spec/done">`PROP-000`: инвариант словаря и набор видов.</fact></item>
        <item><fact id="d-17-4" status="spec/done">Новая спека `PROP-057` в `vibevm/vibespecs/common/`: семантика kind `doc` и
  `app`, конвенция спутника, поля связи, локализация, обнаруживаемость и
  иерархия, карточка, контракт сайта, контракт SEO, локальный режим,
  реестровый билдер. С полными записями решений.</fact></item>
        <item><fact id="d-17-5" status="spec/done">Поправки: `PROP-028` (роль `-docs`), `PROP-045` (словарь жанра
  документации), `PROP-043` (значение `agent`), `PROP-003` (переиспользование
  тегов и цепочки отката для пакетов-переводов, без sidecar).</fact></item>
        <item><fact id="d-17-6" status="spec/done">Строка «документация» в таблице жанров хоста.</fact></item>
        <item><fact id="d-17-7" status="spec/done">`PHASE-G-SPEC.md` получает пометку «замещён PROP-057».</fact></item>
        <item><fact id="d-17-8" status="spec/done">План стюарда: маршрут `DOCS` расширяется узлами по фазам плана.</fact></item>
        <item><fact id="d-17-9" status="spec/done">Этот вижен импортируется как design-документ хоста **в XML-диалекте**, по
  правилу корпуса, и связывается с PROP-057 двусторонней ссылкой.</fact></item>
      </list>
      <p p="135"><fact id="d-17-why" status="spec/done">**Почему.** Закон two-process: знание, оставшееся только в разговоре, не
переживает сессию.</fact></p>
    </section>
    <section id="d-18" title="D-18 Локализация: один пакет на язык">
      <p p="136"><fact id="D-18-DECISION" status="spec/done">**Решение.** Перевод документации — отдельный пакет kind `doc`:</fact></p>
      <fence lang="toml" p="137">[package]
name  = "vibevm-docs-ru"
group = "org.vibevm.core"
kind  = "doc"
title = "Руководство VibeVM"
abstract = "…"

[i18n]
canonical = "ru"                  # язык пакета — существующее поле PROP-003, тег BCP-47

[[documents]]                     # тот же предмет, что у источника
package = "org.vibevm.core/vibevm"
version = "^1.0"

[translates]
package = "org.vibevm.core/vibevm-docs"
version = "^0.3"</fence>
      <p p="138"><fact id="d-18-2" status="spec/done">*(Уточнено 2026-09-11 по находкам A0.18 и A0.21: язык doc-пакета — уже
существующее поле `[i18n].canonical` (по умолчанию `en`), а не новое поле
`lang`; один факт — один якорь. Обратная таблица `[translations]` в
манифесте источника **не хранится**: какие переводы есть у документации,
сайт и локальный читатель вычисляют из рёбер `translates` при каждом
рендере — так же, как официальность из `documents` и `documentation`
(R-23). `[i18n].available` у doc-пакета пуст по построению.)*</fact></p>
      <p p="139"><fact id="d-18-3" status="spec/done">Правила:</fact></p>
      <list ordered="false" p="140">
        <item><fact id="d-18-4" status="spec/done">у источника `[i18n].canonical` по умолчанию `en`, как канонический язык
  PROP-003; sidecar-раскладка §2.7.1 к doc-пакетам не применяется;</fact></item>
        <item><fact id="d-18-5" status="spec/done">перевод **зеркалит дерево источника файл в файл**: те же пути, те же якоря,
  те же идентификаторы фактов; добавлять или удалять якоря нельзя;</fact></item>
        <item><fact id="d-18-6" status="spec/done">перевод **не хранит ни ревизии, ни хэша** исходной страницы (D-27:
  сравнение «с тех пор» требует истории); `vibe doc check --translations`
  проверяет только структуру — те же пути, якоря, число и типы блоков;
  отстала ли адаптация по смыслу — вопрос к человеку на полной сверке
  (D-26); сайт показывает дату последнего чтения адаптации из
  `reviews.toml`;</fact></item>
        <item><fact id="d-18-7" status="spec/done">перевод не авторит примеры: только `example ref` на пример источника;
  вывод команд проверяется один раз, на источнике;</fact></item>
        <item><fact id="d-18-8" status="spec/done">`documents` перевода обязан совпадать с `documents` источника; `vibe check`
  это проверяет;</fact></item>
        <item><fact id="d-18-9" status="spec/done">**официальный** перевод — тот, что объявил `translates` на источник и
  издан **той же группой**, что источник, под именем
  `&lt;имя-документации&gt;-&lt;lang&gt;`; всё остальное — перевод сообщества (D-19);
  отдельного списка переводов в источнике нет (уточнение 2026-09-11 выше);</fact></item>
        <item><fact id="d-18-10" status="spec/done">сайт: язык в пути (D-06), селектор на каждой странице, откат на исходный
  язык постранично с пометкой, никогда не 404; `hreflang` и `x-default`;
  `llms.txt` на язык;</fact></item>
        <item><fact id="d-18-11" status="spec/done">локальный читатель: то же из store; предпочтение — `[i18n].preferred`
  проекта или флаг;</fact></item>
        <item><fact id="d-18-12" status="spec/done">нормативные спеки остаются на языке спеки: `rule` показывает текст правила
  на языке источника с пометкой; перевод нормативного текста в эту волну не
  входит.</fact></item>
      </list>
      <p p="141"><fact id="d-18-why" status="spec/done">**Почему.** Цели владельца — разные авторы, разные ритмы, официальность по
языку — это цели владения, а единица владения в проекте — пакет. Правила
зеркалирования и ссылочных примеров берут у sidecar-модели то, что делало её
безопасной: совпадающие якоря, постраничный откат, один источник вывода
команд.</fact></p>
      <p p="142"><fact id="d-18-rejected" status="spec/done">**Отвергнуто.**</fact></p>
      <list ordered="false" p="143">
        <item><fact id="d-18-15" status="spec/done">Sidecar-файлы внутри одного пакета (PROP-003 как есть): пакет растёт с
  каждым языком, переводчику нужны права на пакет, любая правка перевода
  бампает всю документацию, проверка покрытия не видит устаревания.</fact></item>
        <item><fact id="d-18-16" status="spec/done">Гибрид «официальные как sidecar, сторонние как пакеты»: два механизма.</fact></item>
        <item><fact id="d-18-17" status="spec/done">Перевод, объявляемый предметом: переиздание предмета на каждый язык.</fact></item>
        <item><fact id="d-18-18" status="spec/done">Собственные примеры в переводе: расхождение выводов по языкам.</fact></item>
      </list>
      <p p="144"><fact id="d-18-revisit" status="spec/done">**Пересмотреть когда.** Появится запрос на перевод нормативных спек
(наблюдение: пакет-перевод, пытающийся зеркалить дерево спек, а не
документации).</fact></p>
    </section>
    <section id="d-19" title="D-19 Обнаруживаемость и иерархия официального и сообщества">
      <p p="145"><fact id="D-19-DECISION" status="spec/done">**Решение.** Сайт находит документацию и переводы **по рёбрам**: все пакеты
kind `doc` из индекса, у которых `documents` или `translates` указывают на
данную координату, из любой группы. Звёздочка появляется только там, где
ребро подтверждено сверху.</fact></p>
      <table p="146">
        <tr>
          <td>Уровень</td>
          <td>Статус</td>
          <td>Кто подтверждает</td>
        </tr>
        <tr>
          <td><fact id="d-19-2" status="spec/done">Документация предмета</fact></td>
          <td><fact id="d-19-3" status="spec/done">★ основная · ★ официальная · community</fact></td>
          <td><fact id="d-19-4" status="spec/done">предмет через `[documentation]` или соглашение `&lt;имя&gt;-docs` в своей группе</fact></td>
        </tr>
        <tr>
          <td><fact id="d-19-5" status="spec/done">Перевод документации</fact></td>
          <td><fact id="d-19-6" status="spec/done">★ официальный · community</fact></td>
          <td><fact id="d-19-7" status="spec/done">исходная документация через `[translations]` или соглашение `&lt;имя-документации&gt;-&lt;lang&gt;` в своей группе</fact></td>
        </tr>
      </table>
      <p p="147"><fact id="d-19-8" status="spec/done">Четыре сочетания видимы все: официальная документация с официальным
переводом; официальная с переводом сообщества; документация сообщества с
переводом, который её автор назвал официальным; документация сообщества с
переводом сообщества. Звёздочка у перевода означает «назван автором этой
документации», а не «одобрен предметом»; подсказка говорит это словами.</fact></p>
      <p p="148"><fact id="d-19-9" status="spec/done">Правила интерфейса:</fact></p>
      <list ordered="false" p="149">
        <item><fact id="d-19-10" status="spec/done">три сигнала согласованы: звёздочка, подпись «официальная» или «сообщество»,
  порядок «основная, официальные, community»; ни один не противоречит другим;</fact></item>
        <item><fact id="d-19-11" status="spec/done">издатель всегда виден: группа пакета печатается рядом с названием;</fact></item>
        <item><fact id="d-19-12" status="spec/done">селектор языка показывает все найденные языки: сначала со звёздочкой, потом
  community, у каждого группа издателя и отставание;</fact></item>
        <item><fact id="d-19-13" status="spec/done">полки на странице пакета повторяют схему для документации; внутри полки —
  те же значки для переводов.</fact></item>
      </list>
      <p p="150"><fact id="d-19-14" status="spec/done">Машинное зеркало: манифест страниц несёт статус на обоих уровнях, `primary`,
`official` или `community`, и язык; `llms.txt` помечает официальные элементы,
чтобы агент предпочитал их, но видел и остальные. Индекс несёт поля связи,
`lang`, `title`, `abstract`. Модерации нет: полка community показывает всё,
что нашлось; защита от подмены — издатель на виду; списки исключений —
отложенное.</fact></p>
      <p p="151"><fact id="d-19-why" status="spec/done">**Почему.** Слово владельца: неофициальное должно находиться и показываться
как сообщество, а иерархия — быть наглядной. Рёбра дают полноту, назначение
сверху — однозначность, звёздочки и порядок — наглядность.</fact></p>
      <p p="152"><fact id="d-19-rejected" status="spec/done">**Отвергнуто.** Показывать только официальное; пометки официальности в
индексе; модерация в этой волне.</fact></p>
      <p p="153"><fact id="d-19-revisit" status="spec/done">**Пересмотреть когда.** Первый случай злоупотребления полкой community
(наблюдение: жалоба владельцу пакета).</fact></p>
    </section>
    <section id="d-20" title="D-20 Карточка документации: заголовок, аннотация, картинки">
      <p p="154"><fact id="D-20-DECISION" status="spec/done">**Решение.** Манифест пакета получает поля карточки; для kind `doc` `title` и
`abstract` обязательны, для остальных видов необязательны, `[media]`
необязателен для всех:</fact></p>
      <fence lang="toml" p="155">[package]
title       = "VibeVM Manual"
description = "The operator's guide to vibe: install, lifecycle, registries, agents."
abstract    = """
What it covers, for whom, what it assumes known, what it leaves out.
Three to six sentences, one language — the package's own.
"""

[media]
icon    = "media/icon.png"       # квадрат, 256–1024 px, PNG/JPEG/WebP, до 256 КБ
banner  = "media/banner.jpg"     # 3:1, рекомендовано 1500×500, до 1 МБ
preview = "media/preview.png"    # 1,91:1, рекомендовано 1200×630, до 1 МБ</fence>
      <p p="156"><fact id="d-20-2" status="spec/done">Правила:</fact></p>
      <list ordered="false" p="157">
        <item><fact id="d-20-3" status="spec/done">`title` — отображаемое имя в полках, селекторе, заголовке страницы и
  каталоге; уникальность не проверяется, идентичность остаётся координатой,
  издатель виден рядом;</fact></item>
        <item><fact id="d-20-4" status="spec/done">`description` остаётся однострочным подзаголовком для списков и
  мета-описания страницы; `abstract` отвечает на четыре вопроса — что
  покрывает, для кого, что предполагает известным, чего не покрывает — и
  ограничен примерно тысячей знаков; входная страница не пересказывает
  аннотацию, а вставляет её через `derived kind="manifest-field"`;</fact></item>
        <item><fact id="d-20-5" status="spec/done">аудитории и языки в карточке не объявляются — выводятся из разметки
  страниц и связей `translates`;</fact></item>
        <item><fact id="d-20-6" status="spec/done">картинки — исходник в дереве пакета; форматы PNG, JPEG, WebP; SVG в этой
  волне запрещён, потому что умеет нести скрипты, а локальный читатель отдаёт
  картинки проприетарных пакетов как есть; `vibe check` и гейт публикации
  проверяют существование, сигнатуру формата, пропорции и размер; лимиты малы
  намеренно — пакеты обычных видов материализуются и коммитятся у
  потребителей;</fact></item>
        <item><fact id="d-20-7" status="spec/done">`icon` — в шапке страницы пакета и на карточках полок; `banner` — шапка
  страницы пакета; `preview` — `og:image`, `twitter:image` с карточкой
  `summary_large_image`, `image` в JSON-LD;</fact></item>
        <item><fact id="d-20-8" status="spec/done">**плейсхолдеры генерируются**, не хранятся: градиент или узор для баннера и
  глиф для иконки вычисляются из хэша координаты, так что пакет выглядит
  одинаково на сайте и в локальном читателе, а разные пакеты различимы; глиф
  зависит от вида — книга для `doc`, свои знаки для остальных видов;
  встроенный SVG при рендере, без файлов и без сети;</fact></item>
        <item><fact id="d-20-9" status="spec/done">превью при отсутствии `preview` собирается при сборке сайта из
  плейсхолдера, иконки и заголовка — не обрезкой баннера; в первой волне
  превью одно на пакет, карточки с заголовком отдельной страницы — отложенное;</fact></item>
        <item><fact id="d-20-10" status="spec/done">перевод наследует картинки источника, если не объявил свои;</fact></item>
        <item><fact id="d-20-11" status="spec/done">сборка сайта копирует картинки под хэшированными именами для кэширования и
  никогда не подгружает их с чужих адресов; alt-текст — из `title`.</fact></item>
      </list>
      <p p="158"><fact id="d-20-why" status="spec/done">**Почему.** Слово владельца: карточка как у arXiv и как у профиля в
Twitter. Заголовок и аннотация в манифесте — потому что индекс и полка должны
показывать их без скачивания пакета; отдельное превью — потому что пропорции
баннера и превью ссылки несовместимы; генерируемые плейсхолдеры — закон P-04.</fact></p>
      <p p="159"><fact id="d-20-rejected" status="spec/done">**Отвергнуто.**</fact></p>
      <list ordered="false" p="160">
        <item><fact id="d-20-14" status="spec/done">Показывать `description` вместо заголовка; брать заголовок из входной
  страницы; аннотация как раздел страницы с копией в индексе.</fact></item>
        <item><fact id="d-20-15" status="spec/done">Статический набор плейсхолдеров.</fact></item>
        <item><fact id="d-20-16" status="spec/done">Превью обрезкой баннера; имя поля `og_image` (картинку читают не только
  Open Graph).</fact></item>
        <item><fact id="d-20-17" status="spec/done">SVG в этой волне.</fact></item>
      </list>
      <p p="161"><fact id="d-20-revisit" status="spec/done">**Пересмотреть когда.** Запрос на SVG-иконки с санацией; запрос на
многоязычные заголовки в одном пакете (наблюдение: BACKLOG).</fact></p>
    </section>
    <section id="d-21" title="D-21 Визуальный язык и дизайн-система — предварительно">
      <p p="162"><fact id="d-21-1" status="spec/done">**Статус.** Рабочая гипотеза, чтобы разработка не ждала дизайнера. Решение
пересматривается на **дизайн-ревью** после первого живого рендера
документации ядра (план, A4.14): владелец смотрит полку, страницу пакета и
страницу документации в обеих темах и решает про шрифты, плотность и тему по
умолчанию. До ревью всё ниже — норма для разработки, после — правится на
месте с датой.</fact></p>
      <p p="163"><fact id="D-21-DECISION" status="spec/done">**Решение.** Одна дизайн-система в двух темах, сшитая из двух существующих
источников владельца (§2.5); оба построены на одной терракоте.</fact></p>
      <list ordered="false" p="164">
        <item><fact id="d-21-3" status="spec/done">**Светлая тема — токены тёплой дизайн-системы** (`design-system/public/assets/css/anthropic.css`, `:root`):
  фон страниц `--ivory-100 #FAF9F5` (`--ivory-50 #FCFBF8` для документации,
  как на её странице `/docs`), секции `--ivory-200 #F0EEE6` и `--ivory-300
  #E8E5D9`, карточки спек и сводных таблиц `--cream-100 #F1ECDF`, панели
  `--tan-100/200/300`; чернила `--ink #141413`, текст `--text #1F1E1B`,
  вторичный `--muted #63625B`, подписи `--faint #8E8D85`; границы `--border
  #E0DDD2`, `--border-strong #C9C6BA`; акцент `--terracotta #CC785C`,
  `--terracotta-deep #C15F3C`, `--terracotta-bright #D97757`,
  `--terracotta-soft #EBCBBC`, `--terracotta-bg #F6EDE6`; палитра
  иллюстраций (`--olive`, `--periwinkle`, `--blue`, `--sage`, `--beige-illo`);
  цвета графиков `--chart-1…6`, `--chart-grid`; радиусы 8/12/16/24/pill; три
  тени (`card`, `hover`, `mega`); `--speed 0.18s`.</fact></item>
        <item><fact id="d-21-4" status="spec/done">**Тёмная тема — токены лендинга** (`vibevm-org/src/styles/global.css`):
  фон `--ink #14120E`, поверхности `--ink-raise #1C1A15`, футер `--ink-sink
  #100F0B`, текст `--cream #F4F1E8`, вторичный `--dim #A8A197`, подписи
  `--faint #6F695E`, акцент `--accent #D97757`, `--accent-hover #E08A6D`,
  `--accent-soft rgba(217,119,87,.14)`, границы `--line #2E2A22`,
  `--line-strong #3A352B`; тёплый радиальный «ambient wash» фона.</fact></item>
        <item><fact id="d-21-5" status="spec/done">**Один акцент на обе темы.** `--terracotta-bright` дизайн-системы и
  `--accent` лендинга — один и тот же `#D97757`; значит, это одна система в
  двух режимах, а не две системы. В оболочке токены **семантические**
  (`--bg`, `--bg-raise`, `--bg-sink`, `--text`, `--text-2`, `--text-3`,
  `--line`, `--line-strong`, `--accent`, `--accent-hover`, `--accent-soft`,
  `--code-bg`, `--selection`) с двумя картами значений под
  `:root` / `[data-theme="light"]` / `[data-theme="dark"]` и
  `prefers-color-scheme`; сырые имена цветов остаются только в файле палитры
  как источник карт. Компонент никогда не пишет цвет литералом.</fact></item>
        <item><fact id="d-21-6" status="spec/done">**Типографика.** Spectral (display: hero, `h1`, заголовки пакетов; курсив
  для акцентного слова, как на лендинге), Inter (текст и интерфейс, с
  `font-feature-settings 'cv05' 1, 'ss01' 1`), JetBrains Mono (код, номера
  абзацев, eyebrow-метки, мета-строки). Все три уже самохостятся лендингом
  раздельными подсетами латиницы и кириллицы (`unicode-range`) — один
  шрифтовой конвейер на домен и на бандл оболочки. Manrope + Source Serif 4
  дизайн-системы — **резервный вариант для A/B на дизайн-ревью**, не
  обязательство. Размеры: текст 16–18px, `line-height` 1.6–1.75, колонка
  чтения 740px по умолчанию (шаги ширины — D-22).</fact></item>
        <item><fact id="d-21-7" status="spec/done">**Компоненты, переносимые из дизайн-системы** (по именам в `anthropic.css`,
  переписываются как Qwik-компоненты на семантических токенах, а не
  подключаются файлом): `.docs-header` + `.docs-nav` (шапка: бренд, селектор
  языка пилюлей, поиск `Ctrl K`, ссылки, тема; строка вкладок разделов),
  `.doc-card` (карточки-входы с линейными иконками), `.search-box`, `.toc`
  (липкое оглавление, подсветка активного пункта через IntersectionObserver
  с `rootMargin '-15% 0px -70% 0px'`, как в `ui.js`), `.toc--numbered`,
  `.prose`, `.footnotes`, `.tag` / `.badge`, `.accordion`, `.tab-pills`
  (переключатель платформ для `when`), `.data-table` / `.table-scroll` /
  `.breakout` (широкие таблицы внутри узкой колонки), `.share-row`,
  `.photo-ph` (тёплый градиентный плейсхолдер — основа генерируемых баннеров
  D-20), `.fab` (плавающая кнопка: у нас «для агента» — адрес `spec://`,
  ссылки `.md`/`.xml`/llms, копирование; **не** ИИ-чат), тёмный
  футер-каталог, `.section-head` («Related» + «See all»).</fact></item>
        <item><fact id="d-21-8" status="spec/done">**Образ страниц из скриншотов** (образ, не копия): `/docs` — шапка,
  поиск, вкладки, серифный hero с одной строкой подзаголовка и полем
  «спросить», сетка карточек 3×2; статья — центрированная шапка с тегами и
  датой, узкая колонка, сноски, «Related»; страница продукта — липкое
  оглавление слева 190px, столбец 660px, кнопка действия под оглавлением.</fact></item>
        <item><fact id="d-21-9" status="spec/done">**Тема по умолчанию** — системная (`prefers-color-scheme`) с ручным
  переключателем и запоминанием; embedded-режим следует теме хоста (D-09).
  Обе темы проходят **APCA-аудит** скриптом по приёму
  `oleg-guru/scripts/audit-contrast.mjs`, но собственной реализацией
  опубликованной формулы APCA (библиотека `apca-w3` — AGPL и в дерево не
  входит; уточнение 2026-09-11 по A0.23). Пороги по ролям: основной текст
  Lc ≥ 75; вторичный и третичный (подписи, eyebrow, мета-строки) ≥ 60;
  интерактивные контуры ≥ 45; разделители `--line`/`--line-strong` и номера
  абзацев с `opacity .5` — декоративны и из гейта выведены; акцентные цвета —
  by design. Аудит A0.23 показал: третичный текст светлой темы и вторичный с
  третичным тёмной ниже 60 (предсказание 10 подтверждено, Lc 57.15) — в
  палитре чеканятся новые тона на том же хью с суффиксом `-docs`, ближайшие к
  исходным, которые проходят порог; точные значения подбирает аудит, не
  глаз. Один `--bg` на тему: светлый — `--ivory-100`, как `--page-bg`
  источника; отдельного фона страниц документации нет.</fact></item>
        <item><fact id="d-21-10" status="spec/done">**Движение** только осмысленное (стрелка кнопки, подсветка оглавления,
  дорисовка графа на лендинге); `prefers-reduced-motion` отключает всё.</fact></item>
        <item><fact id="d-21-11" status="spec/done">**Локальный читатель** — те же токены и компоненты; отличия только в
  шапке (нет поиска по реестру, есть «источник: store / lock / реестр»).</fact></item>
      </list>
      <p p="165"><fact id="d-21-why" status="spec/done">**Почему.** У владельца уже есть две согласованные вещи: дизайн-система по
эталону «документация, которую любят», и развёрнутый лендинг с тёмной тёплой
палитрой на той же терракоте. Сшить их дешевле и честнее, чем рисовать
третью систему (P-14). Семантические токены — потому что две темы и
embedded-режим иначе размножат CSS. Выбор шрифтов лендинга — потому что они
уже самохостятся с кириллицей и держат бренд между корнем домена и `/doc/`.</fact></p>
      <p p="166"><fact id="d-21-rejected" status="spec/done">**Отвергнуто.** Палитра oleg.guru (холодная тёмная с бирюзой и розовым — не
язык бренда; берутся её фичи, не цвета); Tailwind где бы то ни было на сайте — лендинг тоже переезжает на токены
(D-28); подключение `anthropic.css` целиком; внешние шрифтовые сервисы;
ИИ-чат на сайте.</fact></p>
      <p p="167"><fact id="d-21-revisit" status="spec/done">**Пересмотреть когда.** Дизайн-ревью A4.14; появление дизайнера; A/B
шрифтов.</fact></p>
    </section>
    <section id="d-22" title="D-22 Ридер: фичи страницы документации">
      <p p="168"><fact id="D-22-DECISION" status="spec/done">**Решение.** Страница документации (уровень 1; README и спеки уровня 0 — в
том же ридере) повторяет поведение ридера статей oleg.guru
(`scripts/templates/article.html.tpl`, `podcast-episode.html.tpl`,
`public/js/{theme,lang-fallback,lightbox}.js`) с поправками на документацию.
Десять фич:</fact></p>
      <list ordered="true" p="169">
        <item><fact id="d-22-2" status="spec/done">**Нумерованные абзацы** (якоря «по Лебедеву»). Каждый блок пивота —
   абзац, заголовок, список, таблица, fence, цитата, `example`, `rule`,
   `note`, `figure` — получает порядковый номер и id `pNN` **на сборке**
   (Rust-конвейер, не клиентский скрипт, как у oleg.guru): номер — позиция
   блока в **текущем** тексте страницы (считается до фильтрации `when`,
   так что `p12` означает один и тот же блок в сборке для любой ОС и
   агента и в переводе, а пропуски в выводе приняты — уточнение
   2026-09-11 по A0.25); он попадает в HTML-остров, в
   проекции `.md` и `.xml` (как `[p12]` в начале блока) и в `llms-full.txt`,
   поэтому человек и агент цитируют одно и то же место. После правки
   страницы старая ссылка `#p12` может указать на соседний блок — как ссылка
   на строку файла после правки; это принято, и ничто не пытается это
   «помнить» (D-27). Вид: число в левом поле мелким моно с
   `opacity .5`, две цифры с ведущим нулём; клик — `#pNN` в адресной строке
   через `history.replaceState`, полный URL в буфере, галочка на 1.5 с;
   открытие `#pNN` скроллит блок в центр; на узких экранах номер — строкой над
   блоком; внутри цитаты сдвинут в поле; переключатель «якоря» прячет номера
   (сохраняется). Заголовки сохраняют именованные якоря `{#id}` поверх номера;
   именованные якоря живут по R-06, позиционные `pNN` — по текущему тексту;
   ссылка «для агента» — адрес страницы и `#pNN`, без версий и хэшей.</fact></item>
        <item><fact id="d-22-3" status="spec/done">**Переключение перевода с сохранением места.** Селектор языка (D-18, D-19)
   ведёт на ту же страницу другого языка **с тем же фрагментом** (`#pNN` или
   `#id`). Это возможно, потому что перевод зеркалит блоки один к одному: R-18
   расширяется с якорей на блоки, `vibe doc check --translations` сверяет число
   и типы блоков. Нет страницы на выбранном языке — сайт отдаёт исходный язык
   под адресом выбранного как статически материализованный фоллбэк (`&lt;html
   lang&gt;` исходного, `rel=canonical` на исходную страницу, `noindex`),
   показывает двуязычную плашку «страница пока только на …» один раз за сессию
   (`sessionStorage`) и переписывает внутренние ссылки, чтобы навигация
   осталась в выбранном языке (приём `lang-fallback.js`). Выбранный язык
   запоминается cookie `lang` на 365 дней — тем же именем, что у лендинга,
   поэтому корень домена и `/doc/` помнят один выбор.</fact></item>
        <item><fact id="d-22-4" status="spec/done">**Настройки чтения.** Шестерёнка справа сверху раскрывает панель: тема
   (тёмная / светлая / системная), размер шрифта `A−`/`A+` по шагам 80, 90,
   100, 110, 120, 135, 150 %, ширина колонки `W−`/`W+` по шагам 740, 900,
   1100, 1400 px (только десктоп), якоря вкл/выкл, «Сброс». Значения — в
   `localStorage` (в embedded-режиме — у хоста через postMessage). Защита от
   FOUC: инлайн-скрипт в `&lt;head&gt;` ставит `data-theme` до загрузки CSS.</fact></item>
        <item><fact id="d-22-5" status="spec/done">**Режим чтения.** Когда оглавление или первый заголовок ушёл выше 40 %
   высоты окна, у шестерёнки появляются быстрые кнопки: оглавление, якоря,
   `A−`/`A+`, «вернуться» — без раскрытия панели.</fact></item>
        <item><fact id="d-22-6" status="spec/done">**Возврат к месту чтения.** Раз в секунду при прокрутке запоминается
   ближайший якорь над верхом экрана (`localStorage`, ключ
   `reading-pos:&lt;путь&gt;`); при следующем открытии страницы читатель **не**
   скроллится сам — появляется кнопка «вернуться к месту», которая исчезает,
   как только он сам прокрутил дальше первого заголовка. Кнопка «оглавление»
   сохраняет текущее место и включает ту же кнопку возврата; выбор пункта
   оглавления сбрасывает её. `history.scrollRestoration = 'manual'`.</fact></item>
        <item><fact id="d-22-7" status="spec/done">**Оглавление.** На десктопе — липкое слева (190px, подсветка активного
   пункта), на узких экранах — сворачиваемый `&lt;details&gt;` над текстом;
   вложенность до h3; у страницы с `rule` — блок «правила, на которые ссылается
   страница» (адреса `spec://`).</fact></item>
        <item><fact id="d-22-8" status="spec/done">**Сноски** с обратными ссылками; **таблицы** в прокручиваемом контейнере с
   кнопкой «развернуть» в overlay, зебра, первый столбец жирный; **картинки**
   — лайтбокс (overlay `position:fixed; inset:0`, без `backdrop-filter`,
   кнопка закрытия под контентом — приёмы `lightbox.js`); **код** — кнопка
   копирования и подпись языка; `example` показывает ожидаемый вывод под
   кодом; `derived` помечен «сгенерировано из …» с адресом источника.</fact></item>
        <item><fact id="d-22-9" status="spec/done">**Мета-блок** страницы: издатель, версия пакета и признак `latest`, дата
   публикации, у перевода — какой пакет он адаптирует, аудитории, время
   чтения (200 слов/мин для ru, 250 для en — как у oleg.guru), ссылки `.md`,
   `.xml`, «для агента».</fact></item>
        <item><fact id="d-22-10" status="spec/done">**Кнопка «для агента»** (`.fab`): показывает адрес `spec://…#pNN` текущего
   места, ссылки на `.md`, `.xml`, `llms.txt` пакета; копирует одним кликом.</fact></item>
        <item><fact id="d-22-11" status="spec/done">**Печать**: стиль печати без панелей, с номерами абзацев и адресами
    ссылок в сносках.</fact></item>
      </list>
      <p p="170"><fact id="d-22-why" status="spec/done">**Почему.** Слово владельца: ридер oleg.guru «стоит перенести». Нумерация на
сборке, а не на клиенте, — потому что клиентские номера не попадают в
Markdown, XML и llms-корпус, а нам нужно, чтобы человек и агент цитировали
одно место; позиционные номера — не якоря в смысле R-06, а нумерация
текущего текста, поэтому закон неизменяемых якорей на них не распространяется. Зеркало блоков 1:1
— единственный способ сохранить место при смене языка. Отказ от авто-скролла
— из опыта oleg.guru: он ломает deep-links и раздражает.</fact></p>
      <p p="171"><fact id="d-22-rejected" status="spec/done">**Отвергнуто.** Нумерация на клиенте; авто-скролл к сохранённому месту;
cookie для настроек чтения (у нас одна оболочка, `localStorage` достаточно;
cookie только для `lang`, потому что его читает и лендинг); классы Tailwind в
острове; модалка согласия.</fact></p>
      <p p="172"><fact id="d-22-revisit" status="spec/done">**Пересмотреть когда.** Дизайн-ревью A4.14; запрос на аннотации и подсветку
выделений (отложенное).</fact></p>
    </section>
    <section id="d-23" title="D-23 Хостинг и деплой: один сайт на том же сервере">
      <p p="173"><fact id="D-23-DECISION" status="spec/done">**Решение.** Сайт — лендинг и документация вместе (D-28) — живёт на том же
сервере и домене, где сегодня лендинг, по существующему runbook «поднять
сайт» из приватного документа инфраструктуры
`C:\Users\olegc\git\infra\main\main.md`. **Содержимое этого документа —
адреса, порты, схема трафика, VPN — в вижен, план и репозиторий не
переносится**; здесь только форма решения.</fact></p>
      <list ordered="false" p="174">
        <item><fact id="d-23-2" status="spec/done">**Два контейнера вместо нынешнего одного.** Выдача: контейнер сайта —
  стоковый `nginx:alpine` с томом отрендеренного сайта на весь домен: `/`,
  `/ru/`, `/doc/…`, корневые машинные файлы. Рендер: `vibevm-site-renderer`
  — образ, в котором `vibe` собран из текущего `main` и собрана оболочка; он
  наполняет том командой `vibe doc build-site` (уровень 0 и документация из
  реестра и хоста, D-07) и статической сборкой Qwik-сайта. В первой волне
  рендерер запускается деплой-скриптом по образцу нынешнего скрипта
  лендинга (`git pull` чекаута → `docker compose run --rm
  vibevm-site-renderer` → `docker compose up -d &lt;сервис выдачи&gt;`); таймер или
  вебхук индекса — вторая волна.</fact></item>
        <item><fact id="d-23-3" status="spec/done">**Переключение.** До готовности нового сайта домен обслуживает нынешний
  Astro-лендинг из `vibevm-org`. Переключение — один шаг: контейнер выдачи
  нового сайта занимает место контейнера лендинга — тот же compose-сервис и
  тот же порт, чтобы хостовый nginx не трогать, — после зелёного теста
  паритета лендинга (план, A4.17) и локальной пробы полного стека. Откат —
  вернуть прежний сервис. Ни переключение, ни откат не касаются хостового
  nginx, портов, сертификатов, compose-блоков соседей и VPN: это правило
  самого runbook и граница директивы о VPN.</fact></item>
        <item><fact id="d-23-4" status="spec/done">**Контейнерный nginx сайта** наследует `vibevm-org/nginx.conf`: `charset
  utf-8` с `charset_types` для текстовых типов, `absolute_redirect off;
  port_in_redirect off;` (TLS терминируется снаружи), `expires -1` для HTML и
  immutable-кэш для `/_assets/` и `/fonts/`, редирект `/en/` → `/` (301),
  `X-Content-Type-Options nosniff`, `Referrer-Policy
  strict-origin-when-cross-origin`, `X-Frame-Options SAMEORIGIN`, `error_page
  404`, `try_files $uri $uri/ $uri/index.html`.</fact></item>
        <item><fact id="d-23-5" status="spec/done">**Деплой** — модель «git-чекаут на сервере + `docker compose up -d
  --build`»: чекаут — репозиторий vibevm (рендереру нужен `vibe` из
  исходников, а пакет сайта лежит в его дереве); образ собирается на
  сервере, никуда не пушится; запуск — одной командой по SSH с дев-машины
  нативным Windows OpenSSH (Git-Bash-овый `ssh` глотает вывод). После
  деплоя: `curl -sI https://vibevm.org/` и `/doc/` → `200`, ни одного
  `Location: http://` в редиректах, `/llms.txt` с `charset=utf-8`, IndexNow по
  изменённым URL.</fact></item>
        <item><fact id="d-23-6" status="spec/done">**Кто что коммитит.** `Dockerfile` рендерера и `docker/nginx.conf` — в
  пакете `org.vibevm.doc/web` (конфигурация сборки, не артефакт — R-10
  соблюдён); compose-сервисы, деплой-скрипт, смена чекаута и запись в
  `main.md` — на сервере, рукой владельца или под его явным присмотром; в
  `vibevm-org` — только финальный коммит снятия с эксплуатации после
  переключения (план, A5.8; слово владельца, §10 п. 15).</fact></item>
        <item><fact id="d-23-7" status="spec/done">DNS, TLS, порты домена уже есть; ничего нового не выпускается; домен не за
  Cloudflare.</fact></item>
      </list>
      <p p="175"><fact id="d-23-why" status="spec/done">**Почему.** Хостинг у владельца есть, задокументирован и работает; один сайт
на домене (D-28) означает один контейнер выдачи и никакого прокси между
контейнерами; рендерер отдельным контейнером — потому что `vibe` (Rust) и
Qwik (Node) не должны жить в образе выдачи; занятие места контейнера
лендинга тем же сервисом и портом — единственный способ переключить домен,
не касаясь хостового nginx, от которого зависит VPN.</fact></p>
      <p p="176"><fact id="d-23-rejected" status="spec/done">**Отвергнуто.** Отдельный домен или поддомен (D-06); сторонний статический
хостинг (авторитет домена, готовая инфраструктура); правки хостового nginx;
два сайта на домене с прокси `/doc/` между контейнерами (третья редакция,
снято D-28); сборка образа на дев-машине с пушем в реестр образов; чекаут
`vibevm-org` как источник сайта после переключения.</fact></p>
      <p p="177"><fact id="d-23-revisit" status="spec/done">**Пересмотреть когда.** Переезд на другой хостинг или CDN; второй сервер или
зеркало.</fact></p>
    </section>
    <section id="d-24" title="D-24 Аналитика: тот же first-party тег, что у лендинга">
      <p p="178"><fact id="D-24-DECISION" status="spec/done">**Решение.** На публичных страницах документации стоит тот же
самохостинговый тег Umami, что и на лендинге — `&lt;script defer src="/u/s.js"
data-website-id="…" data-host-url="https://vibevm.org"&gt;` с website-id домена
— тем же, что стоял на Astro-лендинге (значение переносится из
`BaseLayout.astro` в конфигурацию сайта, план A5.1). Пути `/u/s.js` и `/u/e`
обслуживает домен, сайт их не трогает. Ничего сверх: ни GA, ни
Метрики, ни модалки согласия — Umami без cookie и без персональных данных.
Локальный читатель и embedded-режим — без тега (R-09).</fact></p>
      <p p="179"><fact id="d-24-why" status="spec/done">**Почему.** Вторая редакция относила аналитику к не-целям; но тег уже стоит
на домене, стоит одну строку, first-party и даёт цифры по чтению документации,
не нарушая закон «никаких внешних ресурсов».</fact></p>
      <p p="180"><fact id="d-24-rejected" status="spec/done">**Отвергнуто.** Собственный инстанс аналитики; GA и Метрика; события чтения
(какие абзацы читают) — отложенное.</fact></p>
      <p p="181"><fact id="d-24-revisit" status="spec/done">**Пересмотреть когда.** Запрос на события (поиск, копирование адреса для
агента).</fact></p>
    </section>
    <section id="d-25" title="D-25 Язык и стиль текста">
      <p p="182"><fact id="D-25-DECISION" status="spec/done">**Решение.**</fact></p>
      <list ordered="false" p="183">
        <item><fact id="d-25-2" status="spec/done">**Исходный язык — английский.** `org.vibevm.core/vibevm-docs` несёт
  `lang = "en"`. Все остальные языки, включая русский, — **адаптации**
  отдельными пакетами (D-18): зеркало по блокам, свобода по предложениям,
  свои шутки, свой глоссарий терминов. Слово «перевод» в этом документе и в
  плане читается как «адаптация»; машинный перевод — только черновик.</fact></item>
        <item><fact id="d-25-3" status="spec/done">**Норма стиля — `STYLE.md`** в этой же папке; при импорте она становится
  `AUTHORING.md` пакета `vibevm-docs` и цитируется из PROP-057. Её суть в
  четырёх пунктах.</fact></item>
        <item><fact id="d-25-4" status="spec/done">**Читатель** — умный, занятой, ничего нашего ещё не читал. Страница
     обязана работать как единственная, которую он прочтёт (P-15).</fact></item>
        <item><fact id="d-25-5" status="spec/done">**Где живёт сложность.** Только в контейнерах: `rule`, таблицы,
     `derived`, fence, глоссарий. Повествовательные абзацы — коридоры:
     термин вводится до употребления (ссылкой на глоссарий или глоссой в
     той же фразе), не больше двух терминов на фразу, одна мысль на абзац,
     «см. спецификацию» вместо объяснения запрещено — объяснение полно на
     странице, спека цитируется как подтверждение. Понятия идут лестницей:
     каждая ступень опирается только на нижние.</fact></item>
        <item><fact id="d-25-6" status="spec/done">**Технические места — по ASD-STE100.** Одно слово — одно значение,
     синонимов у технических существительных нет; одна инструкция на фразу,
     повелительное наклонение, настоящее время, действительный залог; до 20
     слов в процедурной фразе и 25 в описательной, до 6 фраз в абзаце;
     предупреждение до шага; последовательности — нумерованными списками.</fact></item>
        <item><fact id="d-25-7" status="spec/done">**Регистр — эссе, не мануал**, по образцам Money Stuff (механизм
     сначала и простыми словами, остроумие через недосказанность), The
     Economist (короткие слова, первая фраза несёт суть), Quanta (лестница
     понятий, термин после показа вещи), McPhee (структура до первой фразы,
     конкретная деталь), Increment и ACM Queue (честность о компромиссах),
     Feynman и Bryson (радость от понятого механизма). Юмор редкий, сухой,
     информативный, в местах отдыха; не больше одного на страницу; никогда в
     процедурах, предупреждениях, справочниках, ошибках, заголовках;
     понятный образованному человеку любой страны без IT-фона.</fact></item>
        <item><fact id="d-25-8" status="spec/done">**Клаудизмы** — слова, обороты и структуры из `STYLE.md` §3 (английские) и
  §10 (русские) — удаляются при виде. Механическая часть проверки —
  `vibe doc check --style`: запрещённые слова по языку страницы, длины фраз и
  абзацев по видам блоков, термин до его введения, плотность терминов,
  отсылка вместо объяснения, заголовки Overview/Summary/Conclusion,
  восклицания, эмодзи, жирный в прозе, индекс читаемости в отчёт.
  Человеческая часть — самоправка автора по `STYLE.md` §2–§8 и чтение
  владельцем трёх страниц вслух на гейте фазы 3.</fact></item>
        <item><fact id="d-25-9" status="spec/done">**Кто пишет.** Прозу — страницы, первые абзацы, `title` и `abstract`,
  глоссарий, FAQ, текст скилла, адаптации — пишет сильнейшая модель в
  центральной сессии (владелец назвал Fable, Astra, Sol). Воркерам — код,
  фикстуры, ожидаемый вывод, зеркала блоков, оболочка, проверки; воркер по
  умолчанию — Opus 5 в режиме High (агент `opus5`), а центральная сессия
  работает оркестратором и берёт на себя всё умное и творческое: тексты,
  адаптации, смысл дизайн-системы, информационную архитектуру, решения.
  Черновик прозы от воркера переписывается, не редактируется.</fact></item>
        <item><fact id="d-25-10" status="spec/done">**Скелет страницы** дополняет D-13: заголовок — существительное для
  понятия или повелительное наклонение для задачи; первый абзац — что это и
  когда нужно, без единого термина (он же строка страницы в `llms.txt`);
  затем пример с ожидаемым выводом; затем механизм лестницей; затем
  граничные случаи с `rule`; вопросы, если они есть; никакого заключения.</fact></item>
      </list>
      <p p="184"><fact id="d-25-why" status="spec/done">**Почему.** Слово владельца (§3): тексты моделей страдают клаудизмами, но
главная беда — неверный баланс и точки притяжения сложности: агент пишет
так, будто читатель уже прочёл все спеки. STE даёт проверяемые правила для
технических мест; эссеистический регистр — для остального; деление на
контейнеры и коридоры делает «где сложно» предсказуемым и проверяемым.
Английский источник — так устроен проект (спеки, код, реестр) и так читают
AI-краулеры; адаптация, а не перевод, — потому что шутки и ритм не
переводятся. Проза — самая дорогая и самая заметная часть работы, и именно
на неё стоит тратить сильную модель; код и фикстуры воркер проверит гейтом,
текст гейтом не проверить.</fact></p>
      <p p="185"><fact id="d-25-rejected" status="spec/done">**Отвергнуто.** Русский как исходный язык; дословный перевод; делегирование
прозы дешёвым моделям ради скорости; инфостиль в чистом виде для русского
(слишком сухо — берётся только борьба с канцеляритом); юмор «как у
разработчиков» с внутренними мемами; крайность Thing Explainer (тысяча слов)
— STE применяется к техническим местам, не к эссе; ИИ-переписывание готовых
страниц «для гладкости».</fact></p>
      <p p="186"><fact id="d-25-revisit" status="spec/done">**Пересмотреть когда.** Стиль-ревью владельца на гейте фазы 3 (план,
A3.16) даст замечания; появится человек-редактор; линтер начнёт мешать
чаще, чем помогать (два ложных срабатывания подряд на одном правиле — запись
в BACKLOG).</fact></p>
    </section>
    <section id="d-26" title="D-26 Сопровождение: журнал кампании и регламент обновления">
      <p p="187"><fact id="D-26-DECISION" status="spec/done">**Решение.**</fact></p>
      <list ordered="false" p="188">
        <item><fact id="d-26-2" status="spec/done">**Журнал с первого дня.** `JOURNAL.md` (в папке вижена; с фазы 1 — в зоне
  кампании; после кампании — в пакете документации) — одна таблица, только
  дописывается: дата, тип (`успех`, `неудача`, `находка`, `наблюдение`),
  стабильный `J-NNN`, что случилось, свидетельство, **→ регламент**. Запись
  делается в том же атоме, где случилось событие; поле «→ регламент» не
  остаётся пустым дольше месячной петли; правило регламента без ссылки на
  запись — гипотеза. Так каждая находка кампании либо меняет процесс, либо
  осознанно помечается «наблюдение без действия».</fact></item>
        <item><fact id="d-26-3" status="spec/done">**Четыре петли обновления** (`MAINTENANCE.md` §2): **коммита** —
  изменение продукта, видное пользователю, несёт документацию в том же
  коммите или строку долга `docs:` в `BACKLOG.md`; **недельная** — очередь
  `vibe doc todo`, до пяти мелких правок, сортировка долга, сигналы недели,
  одна страница вслух, запись в журнал; **месячная** — восемь метрик, аудит
  корпуса, аналитика, адаптации, дренаж долга, пополнение списков линтера,
  «журнал → регламент», три страницы вслух, релиз пакета документации;
  **полная сверка** — не на каждый релиз, а по обещанию команды: раз в
  квартал и перед крупной вехой. Продукт выходит по десять раз в день, и
  дрейф между сверками принят как риск. На сверке дрейф сводится к нулю
  против текущего релиза: пины сдвигаются осознанно после чтения диффов,
  `derived` перегенерируются, адаптации перечитываются, каждая перечитанная
  страница получает дату чтения в `reviews.toml`, пакет документации
  релизится.</fact></item>
        <item><fact id="d-26-4" status="spec/done">**Замков нет.** Ни один технический гейт не связывает релиз продукта с
  документацией: `vibe doc todo` печатает пробелы числом; чекбокс
  «документация: обновлена / долг записан / не нужна» в шаблоне pull
  request'а — привычка; красной остаётся только внутренняя поломка
  документации (пример с `expect` как golden-тест, `derived` не собирается,
  исчезнувший якорь цитаты). Страница несёт только две даты: когда
  отрендерена и когда её в последний раз читали вслух.</fact></item>
        <item><fact id="d-26-5" status="spec/done">**Смена версии.** Когда владелец осознанно поднимает номер версии
  продукта, разработчики документации запускают `vibe doc diff &lt;старая&gt;
  &lt;новая&gt;` по снимкам поверхности (D-27): он называет страницы, которые
  надо обновить, и почему. Обновляются только они, записывается снимок новой
  версии, пакет документации выходит с новым `[[documents]] version`, а
  человеческий changelog для читателей пишется по выводу diff. Это
  процедура, не технический гейт релиза (`MAINTENANCE.md` §2.5).</fact></item>
        <item><fact id="d-26-6" status="spec/done">**Инструменты**: `vibe doc todo` (очередь сопровождения по текущему
  состоянию продукта и документации: пробелы покрытия, красные примеры,
  неразрешимые цитаты, возраст страниц, долг, статистика линтера),
  `vibe doc surface` и `vibe doc diff` (псевдоистория версий, D-27),
  `reviews.toml` (дата последнего чтения страницы, порядок «страницы
  недели»), `CHANGELOG.md` пакета документации из журнала, долг строками
  `docs:` в `BACKLOG.md`.</fact></item>
        <item><fact id="d-26-7" status="spec/done">**Дисциплина мелких правок**: один коммит на правку; якоря и `derived` не
  трогаются; термин вводится на месте; **правило пяти правок** — пятая
  мелкая правка страницы с последнего чтения ставит её в очередь чтения;
  правка, тянущая другие страницы, — не мелкая.</fact></item>
        <item><fact id="d-26-8" status="spec/done">**Регламент выводится, а не выдумывается**: в фазе 6 журнал
  консолидируется, недельная и месячная петли репетируются на свежей
  документации, и только потом регламент переписывается в норму: PROP
  (следующий свободный после PROP-057), страница для мейнтейнера в пакете,
  чеклисты `maintenance/weekly.md`, `monthly.md`, `release.md`. Каждое
  правило нормы ссылается на `J-NNN`.</fact></item>
        <item><fact id="d-26-9" status="spec/done">**Регламент худеет**: раз в квартал правила, ни разу не сработавшие,
  помечаются «спящими» и уходят из чеклистов; метрики, которые никто не
  смотрит, снимаются.</fact></item>
      </list>
      <p p="189"><fact id="d-26-why" status="spec/done">**Почему.** Слово владельца (§3): написать документацию — полдела; обновлять
её в мелочах и периодически пересматривать целиком — вторая половина, и
находки кампании должны улучшать именно этот процесс. Механика вижена уже
ловит дрейф продукта (пины цитат, `derived`, примеры), но не ловит дрейф
мира и старение текста — их ловят петли и сигналы. Журнал с полем
«→ регламент» — единственный способ, чтобы находки не терялись в чате и не
превращались в правила «по памяти».</fact></p>
      <p p="190"><fact id="d-26-rejected" status="spec/done">**Отвергнуто.** Регламент, написанный до кампании как готовая норма (он
был бы выдуман); «обновляем, когда руки дойдут»; журнал в чате или в
отчётах воркеров; регламент как flow-пакет уже в этой волне (сначала один
проект должен прожить по нему); **технический гейт «продукт не выходит без
документации»** — отвергнут владельцем 2026-09-10: сто pull request'ов и
десять релизов в день, документация неизбежно дрейфует, риск принят
(журнал, J-013: правило родилось без записи-основания и было гипотезой).</fact></p>
      <p p="191"><fact id="d-26-revisit" status="spec/done">**Пересмотреть когда.** Второй проект захочет тот же ритуал для своих
doc-пакетов — тогда регламент становится flow-пакетом
`org.vibevm.world/docs-maintenance`; появится поиск по сайту (новый
сигнал); квартальный пересмотр покажет лишние петли.</fact></p>
    </section>
    <section id="d-27" title="D-27 Версия — контракт; псевдоистория версий для разработчиков">
      <p p="192"><fact id="D-27-DECISION" status="spec/done">**Решение.**</fact></p>
      <list ordered="false" p="193">
        <item><fact id="d-27-2" status="spec/done">**Версия — контракт на поведение, а не замороженный набор файлов.**
  «Версия 1 делает то, что должна делать версия 1.» Внутри версии продукт
  меняется сколько угодно раз — amend, переписанная история, `vibe self
  update --force` сто раз в день, — и это невидимо по замыслу: пользователи и
  их пайплайны, построенные на воспроизводимости, видят один номер и один
  контракт. Документация версии описывает контракт. Какие файлы внутри —
  читателю неважно, и документация об этом молчит.</fact></item>
        <item><fact id="d-27-3" status="spec/done">**Смена номера — осознанное решение владельца.** Не чексуммы, не хэши
  файлов, не история: владелец решил, что контракт изменился, и поднял
  `1.0.0` до `2.0.0`. Это **единственное событие**, по которому документация
  считает «разницу между версиями».</fact></item>
        <item><fact id="d-27-4" status="spec/done">**Псевдоистория версий — внутренняя кухня разработчиков документации.**
  Документация хранит **снимок поверхности** продукта на каждую объявленную
  версию — `maintenance/surface/&lt;версия&gt;.json` в пакете документации:
  структурное описание, а не хэш: команды и флаги из `--help`, поля
  манифеста и lock-файла, схемы, тексты фактов спек с `actionstage="doc"`,
  реестр форматов. Снимок записывает `vibe doc surface --record &lt;версия&gt;`
  — в момент смены версии и в конце каждой полной сверки. `vibe doc diff
  &lt;старая&gt; &lt;новая&gt;` сравнивает два снимка и через граф цитат `rule`,
  источники `derived` и карту покрытия выдаёт **список страниц, которые
  надо обновить, с причиной у каждой**: «`vibe deploy` получил флаг
  `--dry-run` → how-to/deploy, reference/cli». LLM правит перечисленное, а не
  штудирует всю документацию.</fact></item>
        <item><fact id="d-27-5" status="spec/done">**Наружу ничего не выходит.** Сайт и читатель показывают номер версии как
  контракт и ничего из кухни: ни «проверено против», ни «устарело с r7», ни
  счётчиков дрейфа, ни отпечатков, ни постоянных ссылок по хэшу, ни
  уведомлений «доступна новая версия». Единственные даты на странице — когда
  она отрендерена и когда её в последний раз читали вслух. Человеческий
  changelog между версиями пишется руками по выводу `vibe doc diff`.</fact></item>
        <item><fact id="d-27-6" status="spec/done">**Внутри версии** машина сравнивает только текущее с текущим: пробелы
  покрытия, красные примеры, неразрешимые цитаты (`vibe doc todo`); `rule`
  цитирует текущий текст спеки без пинов; устаревшую прозу читает человек на
  полной сверке (D-26). Тот же `vibe doc diff &lt;версия&gt; now` можно запустить
  внутри версии как подсказку сверке — внутренняя кухня, не факт для
  читателя (вопрос владельцу, §10 п. 14).</fact></item>
        <item><fact id="d-27-7" status="spec/done">**Остаётся удалённым** после седьмой редакции всё, что требовало истории
  или показывало кухню читателю: пины ревизий и хэши у цитат, пометки на
  страницах, постоянные ссылки `/doc/@&lt;hash&gt;/…`, состояния хоста по хэшу
  дерева, отпечатки блоков `#p12-a3f9`, отставание адаптаций по хэшу.</fact></item>
      </list>
      <p p="194"><fact id="d-27-why" status="spec/done">**Почему.** Слово владельца (§3): разницу между версиями смотреть полезно;
опираться — только на номер версии, который меняется осознанно; данные
нужны разработчикам документации, чтобы алгоритмически знать, что обновлять,
а не перечитывать всё; пользователи видят контракт, не файлы. Шестая
редакция путала контракт с замороженным набором файлов и пыталась отличить
неразличимое (J-016); седьмая вычеркнула вместе с этим и полезное; восьмая
возвращает ровно то, что просил владелец, в его формулировке (J-017).</fact></p>
      <p p="195"><fact id="d-27-rejected" status="spec/done">**Отвергнуто.** Чексуммы, хэши дерева и коммитов, отпечатки как
идентичность продукта; снимки поверхности по каждому изменению вместо
объявленных версий; любые метки состояния на страницах для читателя;
постоянные ссылки на прошлые публикации; уведомления «доступна новая
версия».</fact></p>
      <p p="196"><fact id="d-27-revisit" status="spec/done">**Пересмотреть когда.** Владелец захочет машинно публиковать changelog между
версиями для читателей — тогда вывод `vibe doc diff` получит человеческую
проекцию, но по-прежнему только по объявленным версиям.</fact></p>
    </section>
    <section id="d-28" title="D-28 Лендинг на Qwik: один сайт, одна дизайн-система">
      <p p="197"><fact id="D-28-DECISION" status="spec/done">**Решение.** Лендинг `vibevm.org/` и `/ru/` переезжает с Astro на Qwik **в
ходе этой кампании** и становится маршрутами того же сайта, что и
документация. Один пакет `org.vibevm.doc/web`, одна pnpm-workspace из двух
частей: `design/` — токены, темы, шрифты и компоненты D-21; `site/` —
Qwik-приложение с маршрутами лендинга (`/`, `/ru/`) и документации
(`/doc/…`), статический адаптер для сервера и встраиваемый адаптер для
`vibe`, в который маршруты лендинга не попадают. Шапка, футер, тема,
селектор языка и шрифты — общие компоненты лендинга и документации, без
копирования.</fact></p>
      <p p="198"><fact id="d-28-2" status="spec/done">Содержание лендинга переносится **один к одному**: строки `i18n.ts` (en в
корне, ru под `/ru/`), заголовок с акцентным словом, лид с мандатным
описателем, кнопки GitHub и GitVerse, пилюля Early Access и команда
установки, анимированный граф зависимостей с `prefers-reduced-motion`, три
карточки способностей, футер с копирайтом, `404`, редирект `/en/` → `/`.
Машинные файлы корня домена — `robots.txt` (ASCII-only, allow-лист
краулеров), `llms.txt` с абзацем дизамбигуации имени дословно,
`llms-full.txt`, `sitemap.xml`, `feed.xml`, ключ-файл IndexNow, `og.png`,
шрифты по прежним путям — генерирует та же сборка. Адреса, `canonical`,
`hreflang`, JSON-LD (`SoftwareApplication`, `WebSite`) и тег Umami
сохраняются байт в байт там, где это возможно, и проверяются **тестом
паритета лендинга** (план, A4.17) до переключения домена. Переключение —
один шаг деплоя (D-23); после него репозиторий `vibevm-org` снимается с
эксплуатации (§10 п. 15). Контракт трёх строк и прокси `/doc/` третьей
редакции больше не нужны.</fact></p>
      <p p="199"><fact id="d-28-why" status="spec/done">**Почему.** Слово владельца: однообразно и хорошо композируется. Два стека на
одном домене — это две системы компонентов, два шрифтовых конвейера, два
генератора корневых файлов и прокси между контейнерами; один Qwik-сайт на
общей дизайн-системе убирает всё это. Лендинг мал — одна страница на двух
языках, — и цена переноса измеряется днями.</fact></p>
      <p p="200"><fact id="d-28-rejected" status="spec/done">**Отвергнуто.** Два Qwik-приложения с общим npm-пакетом дизайн-системы
(композиция через публикацию пакета — лишний шов для сайта из одной страницы
и документации; вернуться к этому, если лендинг разрастётся); оставить
Astro-лендинг и связать через прокси (третья редакция); редизайн содержания
лендинга по ходу переноса — перенос один к одному, правки содержания
отдельным решением после дизайн-ревью.</fact></p>
      <p p="201"><fact id="d-28-revisit" status="spec/done">**Пересмотреть когда.** Лендинг разрастётся в маркетинговый сайт с
собственным ритмом релизов — тогда его можно выделить во второе приложение
на той же дизайн-системе.</fact></p>
    </section>
    <section id="d-29" title="D-29 Три волны: тексты на английском, разработка, адаптация">
      <p p="202"><fact id="D-29-DECISION" status="spec/done">**Решение.** Кампания идёт тремя волнами с разной центральной сессией:</fact></p>
      <list ordered="true" p="203">
        <item><fact id="d-29-2" status="spec/done">**Волна A — тексты.** Fable: находки фазы 0 (механика — дешёвыми
   моделями), контракт фазы 1 (PROP-057 и поправки пишет Fable), и **вся
   проза документации ядра на английском** — до механики, в каркасе пакета,
   с реально снятыми `expect`, с проверкой цитат и стиля скриптами вместо
   ещё не написанных инструментов, с приёмкой владельцем (три страницы
   вслух). Заканчивается пакетом передачи.</fact></item>
        <item><fact id="d-29-3" status="spec/done">**Волна B — разработка.** Opus 5 в режиме High как центральная сессия:
   механика, подключение написанной прозы, сайт, лендинг на Qwik, деплой,
   репетиции сопровождения. Прозу Opus не переписывает; замечания линтера и
   раннера, которые не чинятся одной-двумя строками, копятся в очередь
   «нужен автор». Fable возвращается в четырёх названных точках: после
   первого прогона линтера и раннера по прозе, на дизайн-ревью, на
   стиль-ревью после механики, и в фазе 6 — регламент сопровождения из
   журнала и changelog.</fact></item>
        <item><fact id="d-29-4" status="spec/done">**Волна C — адаптация.** Fable: русская адаптация документации ядра,
   когда всё остальное проверено и работает; плюс всё, что волна B положила
   в отложенное для автора.</fact></item>
      </list>
      <p p="204"><fact id="d-29-5" status="spec/done">Английский — единственный язык волн A и B; механика адаптаций в волне B
проверяется на фикстуре из двух страниц, не на боевом пакете.</fact></p>
      <p p="205"><fact id="d-29-why" status="spec/done">**Почему.** Слово владельца (§3): сначала все красивые тексты на
английском, потом полностью переключиться на Opus для разработки; русский —
следующей волной после проверки. Это и экономия: Fable тратится на то, что
умеет только она, одним непрерывным куском, а не размазанными по месяцам
правками; Opus получает замороженный контракт и принятую прозу и работает
без оглядки. Русская адаптация после проверки — потому что адаптировать
стоит только то, что уже читается и работает.</fact></p>
      <p p="206"><fact id="d-29-rejected" status="spec/done">**Отвергнуто.** Писать прозу после механики (она ждала бы инструментов,
которые ей не нужны для написания); чередовать Fable и Opus поатомно (дорого
и рвёт контекст обеим); адаптировать параллельно с источником (двойная
правка каждого абзаца).</fact></p>
      <p p="207"><fact id="d-29-revisit" status="spec/done">**Пересмотреть когда.** Волна B покажет, что проза массово требует
переписывания под инструменты — тогда точка возврата F1 становится
полноценной под-волной.</fact></p>
    </section>
    <section id="d-30" title="D-30 Промпт сначала: сценарий — это задание агенту">
      <p p="208"><fact id="D-30-DECISION" status="spec/done">**Решение.** Любое действие в VibeVM делается двумя способами — руками и
агентом, — и второй теперь основной. Страница сценария («как сделать»)
строится в таком порядке:</fact></p>
      <list ordered="true" p="209">
        <item><fact id="d-30-2" status="spec/done">**Что это и когда нужно** — первый абзац без терминов, как везде.</fact></item>
        <item><fact id="d-30-3" status="spec/done">**Промпт** — блок `prompt`: простое задание агенту в голосе пользователя;
   самодостаточное (координаты, пути, реестр названы, а не подразумеваются);
   одно на результат; без секретов; нейтральное к агенту — работает у
   любого агента с установленным скиллом `vibevm`. Рядом `needs` — что
   агенту нужно (скилл, MCP, сеть или её отсутствие) — и `outcome` — что
   увидит человек, когда получилось.</fact></item>
        <item><fact id="d-30-4" status="spec/done">**Что произойдёт** — три–шесть фраз механизма: какие команды агент
   выполнит, какие файлы появятся или изменятся, чем проверить результат.
   Это и есть ответ «как это работает» для тех, кто дальше не пойдёт;
   пишется как коридор, не как контейнер.</fact></item>
        <item><fact id="d-30-5" status="spec/done">**Руками** — нумерованные шаги по STE, только если ручной путь имеет
   смысл. Иногда его нет, и раздел отсутствует, а не заполняется для
   порядка.</fact></item>
        <item><fact id="d-30-6" status="spec/done">Граничные случаи с `rule`, вопросы — как везде.</fact></item>
      </list>
      <p p="210"><fact id="d-30-7" status="spec/done">Страницы-объяснения не меняются. Карточка сценария в каталоге и на уровне 0
показывает первую строку промпта.</fact></p>
      <p p="211"><fact id="d-30-8" status="spec/done">Механика:</fact></p>
      <list ordered="false" p="212">
        <item><fact id="d-30-9" status="spec/done">**Элемент словаря `prompt`** — седьмой, по слову владельца (D-10
  пересмотрено): тело — текст задания; дети `needs`, `outcome` и `assert*` —
  ноль и больше шелл-команд, обязанных завершиться нулём после работы агента
  (`vibe check`, `test -f vibe.toml`, `vibe explain "spec://…"`). В Markdown
  — fence `prompt`, список «нужно», абзац «результат», список ассертов; в
  `llms*.txt` — тот же fence, чтобы агент-читатель мог взять задание как
  есть; в ридере — блок с кнопкой «скопировать», в embedded-режиме — «передать
  агенту» (§7.5).</fact></item>
        <item><fact id="d-30-10" status="spec/done">**Проверка `vibe doc check --prompts`**: каждый промпт прогоняется
  настроенным агентом-исполнителем (`[doc.prompts] runner`) в чистом
  временном каталоге с фикстурой, затем выполняются ассерты. Текст ответа
  агента недетерминирован, ассерты — детерминированы. **В панель не
  входит**: дорого и небыстро. Гоняется в фазе P до приёмки прозы, в
  месячной петле выборкой, на полной сверке целиком (`MAINTENANCE.md`).</fact></item>
        <item><fact id="d-30-11" status="spec/done">На странице сценария промпт без ассерта — ошибка линтера стиля (R-30);
  промпт-иллюстрация на странице-объяснении помечается `assert="none"`.</fact></item>
        <item><fact id="d-30-12" status="spec/done">Скилл `vibevm-docs` берёт блок `prompt` как задание, когда пользователь
  просит сделать то, что описано страницей (§7.4).</fact></item>
      </list>
      <p p="213"><fact id="d-30-why" status="spec/done">**Почему.** Слово владельца (§3): теперь любое действие делается не только
руками, но и агентом; люди приходят узнать «как это работает» и «какой
промпт запустить»; это отличие от документации прошлого, где всё делалось
руками. Для VibeVM это ещё и предмет: продукт устанавливает контекст агентам,
и документировать его через агента — значит показывать продукт в его среде.
Ассерты — потому что промпт, в отличие от команды, нельзя проверить
golden-выводом, а непроверяемый промпт устаревает молча.</fact></p>
      <p p="214"><fact id="d-30-rejected" status="spec/done">**Отвергнуто.** Промпт как обычный `fence` без проверки; привязка промптов
к одному агенту; ручной путь на каждой странице «для полноты»; прогон
промптов в панели на каждый коммит.</fact></p>
      <p p="215"><fact id="d-30-revisit" status="spec/done">**Пересмотреть когда.** Появится второй способ поручать задачи изнутри
продукта — тогда блок `prompt` получит ещё одну проекцию.</fact></p>
    </section>
  </section>
  <section id="ia" title="6. Информационная архитектура документации ядра">
    <p p="216"><fact id="ia-1" status="spec/done">Пакет `org.vibevm.core/vibevm-docs`, язык `en`; первая адаптация — `vibevm-docs-ru`, волна C (D-29)
в объёме по слову владельца. Навигация по Diátaxis: учебник, как сделать,
справочник, объяснение. Каждая страница — один концепт, ответ первой фразой,
ведущий факт с якорем, инварианты в начале или в конце. Каждая страница
«как сделать» — промпт сначала: задание агенту, что произойдёт, и лишь потом
ручные шаги, если они нужны (D-30).</fact></p>
    <table p="217">
      <tr>
        <td>Раздел</td>
        <td>Аудитория</td>
        <td>Тип</td>
        <td>Источник правды</td>
        <td>Генерируется?</td>
      </tr>
      <tr>
        <td><fact id="ia-2" status="spec/done">Начало: что такое VibeVM, границы, словарь, установка, первый проект</fact></td>
        <td><fact id="ia-3" status="spec/done">user (маршрут новичка)</fact></td>
        <td><fact id="ia-4" status="spec/done">учебник</fact></td>
        <td><fact id="ia-5" status="spec/done">README, RUNTIME-GUIDE, PROP-000, VIBEVM-SPEC</fact></td>
        <td><fact id="ia-6" status="spec/done">нет; примеры исполняемы</fact></td>
      </tr>
      <tr>
        <td><fact id="ia-7" status="spec/done">Модель: два дерева, boot-лейны, пакеты, реестр, store, lock</fact></td>
        <td><fact id="ia-8" status="spec/done">user</fact></td>
        <td><fact id="ia-9" status="spec/done">объяснение</fact></td>
        <td><fact id="ia-10" status="spec/done">PROP-009, 010, 002, 008 через `rule`</fact></td>
        <td><fact id="ia-11" status="spec/done">нет</fact></td>
      </tr>
      <tr>
        <td><fact id="ia-12" status="spec/done">Как сделать: установить, обновить, удалить, офлайн, приватный реестр, публикация, workspace</fact></td>
        <td><fact id="ia-13" status="spec/done">user</fact></td>
        <td><fact id="ia-14" status="spec/done">как сделать, промпт сначала</fact></td>
        <td><fact id="ia-15" status="spec/done">PROP по теме</fact></td>
        <td><fact id="ia-16" status="spec/done">примеры исполняемы; промпты прогоняются агентом</fact></td>
      </tr>
      <tr>
        <td><fact id="ia-17" status="spec/done">Работа через агента: какой скилл и MCP нужны агенту, как поручить задачу и проверить результат, как агент читает эту документацию</fact></td>
        <td><fact id="ia-18" status="spec/done">user, agent</fact></td>
        <td><fact id="ia-19" status="spec/done">учебник + как сделать</fact></td>
        <td><fact id="ia-20" status="spec/done">скиллы `vibevm` и `vibevm-docs`, PROP-057</fact></td>
        <td><fact id="ia-21" status="spec/done">промпты прогоняются агентом</fact></td>
      </tr>
      <tr>
        <td><fact id="ia-22" status="spec/done">Lifecycle и расширения: фазы, контроль, build, package, deploy, scrape, применимость по платформам</fact></td>
        <td><fact id="ia-23" status="spec/done">user, author</fact></td>
        <td><fact id="ia-24" status="spec/done">как сделать + объяснение</fact></td>
        <td><fact id="ia-25" status="spec/done">PROP-054, 056, ledger кампании</fact></td>
        <td><fact id="ia-26" status="spec/done">примеры исполняемы</fact></td>
      </tr>
      <tr>
        <td><fact id="ia-27" status="spec/done">Справочник команд</fact></td>
        <td><fact id="ia-28" status="spec/done">user</fact></td>
        <td><fact id="ia-29" status="spec/done">справочник</fact></td>
        <td><fact id="ia-30" status="spec/done">clap</fact></td>
        <td><fact id="ia-31" status="spec/done">да, `derived kind="cli-help"`</fact></td>
      </tr>
      <tr>
        <td><fact id="ia-32" status="spec/done">Справочник манифеста и lock-файла</fact></td>
        <td><fact id="ia-33" status="spec/done">user, author</fact></td>
        <td><fact id="ia-34" status="spec/done">справочник</fact></td>
        <td><fact id="ia-35" status="spec/done">PROP-024, VIBEVM-SPEC §7 через `rule`</fact></td>
        <td><fact id="ia-36" status="spec/done">частично</fact></td>
      </tr>
      <tr>
        <td><fact id="ia-37" status="spec/done">Машинные форматы и JSON-отчёты</fact></td>
        <td><fact id="ia-38" status="spec/done">user, dev</fact></td>
        <td><fact id="ia-39" status="spec/done">справочник</fact></td>
        <td><fact id="ia-40" status="spec/done">JTD-схемы</fact></td>
        <td><fact id="ia-41" status="spec/done">да, `derived kind="jtd-schema"`</fact></td>
      </tr>
      <tr>
        <td><fact id="ia-42" status="spec/done">Авторство пакетов и расширений: flow, feat, stack, tool, mcp, lang, doc, app; провайдеры; переводы; карточка и картинки</fact></td>
        <td><fact id="ia-43" status="spec/done">author</fact></td>
        <td><fact id="ia-44" status="spec/done">учебник + как сделать</fact></td>
        <td><fact id="ia-45" status="spec/done">PROP-024, 027, 028, 054, 057</fact></td>
        <td><fact id="ia-46" status="spec/done">примеры исполняемы</fact></td>
      </tr>
      <tr>
        <td><fact id="ia-47" status="spec/done">Архитектура и модель мейнтейнера</fact></td>
        <td><fact id="ia-48" status="spec/done">dev</fact></td>
        <td><fact id="ia-49" status="spec/done">объяснение</fact></td>
        <td><fact id="ia-50" status="spec/done">код, PROP, design-документы</fact></td>
        <td><fact id="ia-51" status="spec/done">схемы только где проясняют</fact></td>
      </tr>
      <tr>
        <td><fact id="ia-52" status="spec/done">Что доставил lifecycle-эпик: маршрут R1–R8, рулинги, миграции, отложенное</fact></td>
        <td><fact id="ia-53" status="spec/done">dev, user</fact></td>
        <td><fact id="ia-54" status="spec/done">объяснение</fact></td>
        <td><fact id="ia-55" status="spec/done">ledger, коммиты, PROP-054</fact></td>
        <td><fact id="ia-56" status="spec/done">нет</fact></td>
      </tr>
      <tr>
        <td><fact id="ia-57" status="spec/done">Глоссарий</fact></td>
        <td><fact id="ia-58" status="spec/done">все</fact></td>
        <td><fact id="ia-59" status="spec/done">справочник</fact></td>
        <td><fact id="ia-60" status="spec/done">канонические термины по якорям</fact></td>
        <td><fact id="ia-61" status="spec/done">навигация генерируется</fact></td>
      </tr>
      <tr>
        <td><fact id="ia-62" status="spec/done">FAQ</fact></td>
        <td><fact id="ia-63" status="spec/done">user</fact></td>
        <td><fact id="ia-64" status="spec/done">как сделать</fact></td>
        <td><fact id="ia-65" status="spec/done">реальные вопросы</fact></td>
        <td><fact id="ia-66" status="spec/done">нет</fact></td>
      </tr>
      <tr>
        <td><fact id="ia-67" status="spec/done">Диагностика: от сообщения об ошибке к правилу</fact></td>
        <td><fact id="ia-68" status="spec/done">user, agent</fact></td>
        <td><fact id="ia-69" status="spec/done">как сделать</fact></td>
        <td><fact id="ia-70" status="spec/done">якоря в сообщениях об ошибках</fact></td>
        <td><fact id="ia-71" status="spec/done">список ошибок генерируется</fact></td>
      </tr>
      <tr>
        <td><fact id="ia-72" status="spec/done">Для агентов: как исследовать документацию, скилл, эндпоинты</fact></td>
        <td><fact id="ia-73" status="spec/done">agent</fact></td>
        <td><fact id="ia-74" status="spec/done">справочник</fact></td>
        <td><fact id="ia-75" status="spec/done">PROP-057</fact></td>
        <td><fact id="ia-76" status="spec/done">манифест генерируется</fact></td>
      </tr>
    </table>
    <p p="218"><fact id="ia-77" status="spec/done">Маршрут «новичок»: одна страница-путь через установку, первый проект, первую
установку пакета, первый `vibe check`, на каждом шаге цитируя правило.</fact></p>
  </section>
  <section id="site" title="7. Сайт и инфраструктура для агентов">
    <section id="site-package-page" title="7.1 Страница пакета, уровень 0">
      <p p="219"><fact id="site-package-page-1" status="spec/done">Шапка: баннер или плейсхолдер, поверх — иконка или глиф вида, заголовок или
координата, издатель, однострочное описание, аннотация раскрывается по клику.
Далее обзор из манифеста (координата, kind, версии, лицензия, ключевые слова,
требования, capabilities), README, boot-сниппет с пометкой «читается сессией»,
спеки с якорями и подсветкой факта по адресу, объявленные скиллы, бинарники и
MCP-серверы, зависимые пакеты, «объяснено в», «переведено на». Версии — в
боковой навигации, `latest` — псевдоним.</fact></p>
    </section>
    <section id="site-shelves" title="7.2 Полки документации и селектор языка">
      <p p="220"><fact id="site-shelves-1" status="spec/done">Полки: основная, официальные дополнительные, community; над ними — уровень 0.
Карточка на полке: иконка, заголовок со звёздочкой, издатель, язык, версия и
дата, описание, аннотация по клику, аудитории значками. Селектор языка на
каждой странице: сначала официальные переводы со звёздочкой, потом
community, у каждого — издатель и отставание в ревизиях. Для проприетарных
пакетов в локальном режиме — те же полки из store.</fact></p>
    </section>
    <section id="site-agent-endpoints" title="7.3 Эндпоинты для агентов">
      <table p="221">
        <tr>
          <td>Веб</td>
          <td>Локально</td>
          <td>Что</td>
        </tr>
        <tr>
          <td><fact id="site-agent-endpoints-1" status="spec/done">`/doc/llms.txt`, `llms-full.txt`, `llms-small.txt`, `llms-medium.txt`; `/doc/&lt;lang&gt;/llms*.txt`</fact></td>
          <td><fact id="site-agent-endpoints-2" status="spec/done">`vibe doc manifest --llms &lt;tier&gt; [--lang]`</fact></td>
          <td><fact id="site-agent-endpoints-3" status="spec/done">индекс и корпус под бюджет, по языкам</fact></td>
        </tr>
        <tr>
          <td><fact id="site-agent-endpoints-4" status="spec/done">`/doc/&lt;…&gt;/&lt;страница&gt;.md`, `.xml`</fact></td>
          <td><fact id="site-agent-endpoints-5" status="spec/done">файл в store; `vibe doc build --format md/xml`</fact></td>
          <td><fact id="site-agent-endpoints-6" status="spec/done">сырые проекции страницы</fact></td>
        </tr>
        <tr>
          <td><fact id="site-agent-endpoints-7" status="spec/done">`/doc/manifest.json`</fact></td>
          <td><fact id="site-agent-endpoints-8" status="spec/done">`vibe doc manifest --json`</fact></td>
          <td><fact id="site-agent-endpoints-9" status="spec/done">страницы, статусы, языки, аудитории, жанры, якоря</fact></td>
        </tr>
        <tr>
          <td><fact id="site-agent-endpoints-10" status="spec/done">`/doc/resolve?uri=spec://…`</fact></td>
          <td><fact id="site-agent-endpoints-11" status="spec/done">`vibe explain "spec://…"`</fact></td>
          <td><fact id="site-agent-endpoints-12" status="spec/done">резолвер адреса и одношаговый подграф</fact></td>
        </tr>
        <tr>
          <td><fact id="site-agent-endpoints-13" status="spec/done">`/doc/&lt;группа&gt;/&lt;имя&gt;/llms.txt`</fact></td>
          <td><fact id="site-agent-endpoints-14" status="spec/done">то же по store</fact></td>
          <td><fact id="site-agent-endpoints-15" status="spec/done">каталог документаций пакета: заголовки, звёздочки, аннотации</fact></td>
        </tr>
        <tr>
          <td><fact id="site-agent-endpoints-16" status="spec/done">MCP сайта (опционально)</fact></td>
          <td><fact id="site-agent-endpoints-17" status="spec/done">`vibe mcp serve`</fact></td>
          <td><fact id="site-agent-endpoints-18" status="spec/done">поиск, explain, select, `read_doc`</fact></td>
        </tr>
      </table>
    </section>
    <section id="site-skill" title="7.4 Скилл">
      <p p="222"><fact id="site-skill-1" status="spec/done">Doc-пакет ядра объявляет скилл `vibevm-docs`, проецируемый `vibe skill install`.
Тело короткое, по принципу progressive disclosure: описание для маршрутизации;
при ошибке — прочитать якорь, который она цитирует; разрешить его локально или
в вебе; перейти по ребру `documents` к объяснению; прогнать пример; при выборе
гайда — читать каталог с аннотациями и предпочитать официальное; когда
пользователь просит сделать то, что описано страницей сценария, — взять её
блок `prompt` как задание, подставить координаты и пути пользователя и
проверить результат её ассертами (D-30). Существующий скилл `vibevm` получает
одну строку-указатель.</fact></p>
    </section>
    <section id="site-embedding" title="7.5 Контракт встраивания">
      <p p="223"><fact id="site-embedding-1" status="spec/done">Относительные адреса; базовый путь задаётся при запуске; хост открывает адрес
через URL-фрагмент или postMessage `{ "open": "spec://…" }`; читатель шлёт
`{ "openFile": "&lt;путь&gt;" }` при клике по локальной ссылке; тема — параметром
запуска и `{ "theme": "dark" | "light" }` на лету; настройки чтения — `{
"settings": {…} }` в обе стороны; язык — из `[i18n].preferred` или параметра;
кнопка «передать агенту» у блока `prompt` шлёт `{ "prompt": "&lt;текст&gt;" }`
наружу, и хост сам решает, что с ним делать (D-30); никаких внешних ресурсов.</fact></p>
    </section>
    <section id="site-layouts" title="7.6 Четыре типа страниц и их раскладка">
      <table p="224">
        <tr>
          <td>Страница</td>
          <td>Раскладка (D-21)</td>
          <td>Ридер (D-22)</td>
        </tr>
        <tr>
          <td><fact id="site-layouts-1" status="spec/done">Лендинг `/`, `/ru/` (D-28)</fact></td>
          <td><fact id="site-layouts-2" status="spec/done">та же шапка и футер, что у документации; hero: eyebrow с точкой, заголовок Spectral с акцентным словом курсивом, лид с мандатным описателем, кнопки GitHub и GitVerse, пилюля Early Access и команда установки, анимированный граф зависимостей справа (с `prefers-reduced-motion`); ряд из трёх карточек способностей; содержание и адреса — один к одному с нынешним лендингом</fact></td>
          <td><fact id="site-layouts-3" status="spec/done">нет</fact></td>
        </tr>
        <tr>
          <td><fact id="site-layouts-4" status="spec/done">Каталог `/doc/`, `/doc/&lt;lang&gt;/`</fact></td>
          <td><fact id="site-layouts-5" status="spec/done">шапка `docs-header` с поиском и селектором языка; серифный hero с одной строкой; сетка `doc-card` 3×2 по разделам ИА ядра (начало, как сделать, справочник, авторство, архитектура, для агентов); ниже — полки пакетов карточками с иконкой или плейсхолдером, звёздочкой, издателем</fact></td>
          <td><fact id="site-layouts-6" status="spec/done">нет</fact></td>
        </tr>
        <tr>
          <td><fact id="site-layouts-7" status="spec/done">Страница пакета, уровень 0</fact></td>
          <td><fact id="site-layouts-8" status="spec/done">баннер или градиентный плейсхолдер, поверх — иконка, заголовок, издатель; вкладки `docs-nav`: Обзор · README · Спеки · Документация · Версии · Для агентов; липкое оглавление слева, версии — в нём же</fact></td>
          <td><fact id="site-layouts-9" status="spec/done">README и спеки открываются в ридере</fact></td>
        </tr>
        <tr>
          <td><fact id="site-layouts-10" status="spec/done">Страница документации</fact></td>
          <td><fact id="site-layouts-11" status="spec/done">оглавление слева 190px, колонка 740px (шаги ширины), мета-блок, `prose`, сноски, `share-row` → «для агента»</fact></td>
          <td><fact id="site-layouts-12" status="spec/done">все десять фич</fact></td>
        </tr>
        <tr>
          <td><fact id="site-layouts-13" status="spec/done">Версия с ошибкой рендера, фоллбэк перевода, 404</fact></td>
          <td><fact id="site-layouts-14" status="spec/done">та же шапка; плашка причины; ссылки на соседние версии и языки</fact></td>
          <td><fact id="site-layouts-15" status="spec/done">нет</fact></td>
        </tr>
      </table>
    </section>
  </section>
  <section id="risks" title="8. Не-цели и риски">
    <section id="non-goals" title="8.1 Не делаем в этой волне">
      <list ordered="false" p="225">
        <item><fact id="non-goals-1" status="spec/done">Плагин VS Code — зона владельца; здесь только контракт встраивания.</fact></item>
        <item><fact id="non-goals-2" status="spec/done">LSP и IDE-расширения — не объявлены по решению владельца.</fact></item>
        <item><fact id="non-goals-3" status="spec/done">Зеркала, второй реестр; канал `main` хоста — до слова владельца.</fact></item>
        <item><fact id="non-goals-4" status="spec/done">Модерация community-полок, комментарии, авторизация на сайте; аналитика
  сверх тега лендинга (D-24).</fact></item>
        <item><fact id="non-goals-5" status="spec/done">Перевод нормативных спек.</fact></item>
        <item><fact id="non-goals-6" status="spec/done">Карточки-превью на отдельную страницу.</fact></item>
        <item><fact id="non-goals-7" status="spec/done">SVG-картинки.</fact></item>
        <item><fact id="non-goals-8" status="spec/done">Проектное объявление «консультируйся с такой-то документацией».</fact></item>
        <item><fact id="non-goals-9" status="spec/done">ИИ-чат «спросить документацию» на сайте; кнопка `.fab` — «для агента».</fact></item>
        <item><fact id="non-goals-10" status="spec/done">Дизайнерская работа сверх сшивки двух источников — до дизайн-ревью (D-21).</fact></item>
        <item><fact id="non-goals-11" status="spec/done">Аннотации, выделения, закладки с синхронизацией между устройствами.</fact></item>
        <item><fact id="non-goals-12" status="spec/done">Таймер или вебхук пересборки реестрового сайта — вторая волна (D-23).</fact></item>
        <item><fact id="non-goals-13" status="spec/done">Любые правки хостового nginx, портов, сертификатов, compose-блоков
  соседних сайтов и VPN: не цель и не средство.</fact></item>
        <item><fact id="non-goals-14" status="spec/done">Редизайн содержания лендинга при переносе на Qwik: переносится один к
  одному (D-28); правки содержания — после дизайн-ревью, отдельным решением.</fact></item>
      </list>
    </section>
    <section id="risk-list" title="8.2 Риски">
      <table p="226">
        <tr>
          <td>Риск</td>
          <td>Ранний признак</td>
          <td>Смягчение</td>
        </tr>
        <tr>
          <td><fact id="risk-list-1" status="spec/done">Бета Qwik 2.0 меняет API</fact></td>
          <td><fact id="risk-list-2" status="spec/done">красная сборка web-пакета после обновления пина</fact></td>
          <td><fact id="risk-list-3" status="spec/done">точный пин; обновление пина — отдельный атом с записанной причиной</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-4" status="spec/done">Словарь документации расползается</fact></td>
          <td><fact id="risk-list-5" status="spec/done">запрос на седьмой элемент</fact></td>
          <td><fact id="risk-list-6" status="spec/done">D-10: два запроса в BACKLOG — триггер, не тихое добавление</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-7" status="spec/done">Раннер примеров нестабилен на Windows</fact></td>
          <td><fact id="risk-list-8" status="spec/done">расхождения только по путям, переводам строк, ANSI</fact></td>
          <td><fact id="risk-list-9" status="spec/done">правила нормализации на фикстуру; примеры без сети; временный `VIBE_SETTINGS`</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-10" status="spec/done">Дублирование контента ломает SEO</fact></td>
          <td><fact id="risk-list-11" status="spec/done">версии или языки индексируются как дубли</fact></td>
          <td><fact id="risk-list-12" status="spec/done">canonical на `latest` в языке, `hreflang`, sitemap только с `latest`</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-13" status="spec/done">Дрейф между адаптерами оболочки</fact></td>
          <td><fact id="risk-list-14" status="spec/done">остров различается байтами</fact></td>
          <td><fact id="risk-list-15" status="spec/done">тест паритета в панели</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-16" status="spec/done">Новые kind ломают чужие матчи</fact></td>
          <td><fact id="risk-list-17" status="spec/done">`cargo build` красный в неожиданном крейте</fact></td>
          <td><fact id="risk-list-18" status="spec/done">желаемое: компилятор перечисляет места; никаких `_ =&gt;`</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-19" status="spec/done">Новые поля манифеста непрочитаемы старым `vibe`</fact></td>
          <td><fact id="risk-list-20" status="spec/done">отказ старой версии на новом манифесте</fact></td>
          <td><fact id="risk-list-21" status="spec/done">`min_vibe_version` в пакетах, которые их используют</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-22" status="spec/done">Регрессии при переносе `docs/`</fact></td>
          <td><fact id="risk-list-23" status="spec/done">факт из legacy не найден в новом дереве</fact></td>
          <td><fact id="risk-list-24" status="spec/done">регрессионный список — обязательный артефакт фазы</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-25" status="spec/done">Перевод тихо отстаёт от источника</fact></td>
          <td><fact id="risk-list-26" status="spec/done">адаптацию давно не читали против источника</fact></td>
          <td><fact id="risk-list-27" status="spec/done">дата чтения в `reviews.toml`; страница недели; полная сверка; `--translations` ловит только расхождение структуры (D-27)</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-28" status="spec/done">Подмена на полке community</fact></td>
          <td><fact id="risk-list-29" status="spec/done">пакет с чужим `documents` и вводящим в заблуждение `title`</fact></td>
          <td><fact id="risk-list-30" status="spec/done">издатель всегда виден; звёздочка только сверху</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-31" status="spec/done">Картинка с вредоносным содержимым</fact></td>
          <td><fact id="risk-list-32" status="spec/done">SVG со скриптом, неверная сигнатура</fact></td>
          <td><fact id="risk-list-33" status="spec/done">SVG запрещён; проверка сигнатуры и размеров; CSP</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-34" status="spec/done">Локальный сервер виден другим</fact></td>
          <td><fact id="risk-list-35" status="spec/done">привязка не к loopback</fact></td>
          <td><fact id="risk-list-36" status="spec/done">только 127.0.0.1; без листинга; без обхода путей</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-37" status="spec/done">Две центральные сессии пишут план стюарда</fact></td>
          <td><fact id="risk-list-38" status="spec/done">живой конфликт записи</fact></td>
          <td><fact id="risk-list-39" status="spec/done">закон LIVE-CONFLICT-STOPS; кастодия — диагностика</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-40" status="spec/done">Правка вендоренного движка карты</fact></td>
          <td><fact id="risk-list-41" status="spec/done">`sync-engines --check` красный</fact></td>
          <td><fact id="risk-list-42" status="spec/done">правки только в авторском движке</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-43" status="spec/done">Атом задевает хостовый nginx, порты, сертификаты, VPN</fact></td>
          <td><fact id="risk-list-44" status="spec/done">шаг требует правки конфигурации сервера вне контейнеров сайта</fact></td>
          <td><fact id="risk-list-45" status="spec/done">стоп и вопрос владельцу заранее (план R-24); маршрутизация только в контейнерном nginx лендинга (D-23)</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-46" status="spec/done">Детали инфраструктуры утекают в публичный документ</fact></td>
          <td><fact id="risk-list-47" status="spec/done">адрес, порт или имя VPN-компонента в вижене, плане, пакете</fact></td>
          <td><fact id="risk-list-48" status="spec/done">правило «только ссылка на `main.md`» (план R-25); grep-гейт при импорте в репозиторий</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-49" status="spec/done">Дизайн не нравится владельцу после первого рендера</fact></td>
          <td><fact id="risk-list-50" status="spec/done">замечания по цвету, шрифту, плотности на ревью</fact></td>
          <td><fact id="risk-list-51" status="spec/done">семантические токены: замена карты значений — один файл; шрифты — три `@font-face`-блока; ревью запланировано (A4.14)</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-52" status="spec/done">Номер абзаца ведёт не туда после новой версии</fact></td>
          <td><fact id="risk-list-53" status="spec/done">`#pNN` в ссылке на `latest` попал на другой блок</fact></td>
          <td><fact id="risk-list-54" status="spec/done">ссылка «для агента» и llms-корпус всегда с версией; сайт при `latest#pNN` показывает версию, в которой номер был скопирован, если она известна из referrer, иначе — как есть</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-55" status="spec/done">Фоллбэк-страницы перевода индексируются как дубли</fact></td>
          <td><fact id="risk-list-56" status="spec/done">страницы `/doc/ru/…` с английским текстом в индексе</fact></td>
          <td><fact id="risk-list-57" status="spec/done">`noindex` и `canonical` на исходную; фоллбэки не попадают в sitemap</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-58" status="spec/done">Настройки чтения ломают вёрстку</fact></td>
          <td><fact id="risk-list-59" status="spec/done">ширина 1400px с липким оглавлением</fact></td>
          <td><fact id="risk-list-60" status="spec/done">оглавление уходит в `&lt;details&gt;` при ширине колонки выше 1100px; шаги ограничены</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-61" status="spec/done">Локальный ридер тянет шрифт извне</fact></td>
          <td><fact id="risk-list-62" status="spec/done">запрос за пределы 127.0.0.1 при открытии страницы</fact></td>
          <td><fact id="risk-list-63" status="spec/done">шрифты в бандле; тест R-09 проверяет отсутствие внешних запросов</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-64" status="spec/done">Страница написана «для тех, кто прочёл спеки»</fact></td>
          <td><fact id="risk-list-65" status="spec/done">термин без введения; три термина на фразу; «см. спецификацию» вместо объяснения</fact></td>
          <td><fact id="risk-list-66" status="spec/done">линтер стиля (термин до определения, плотность, отсылки); чтение вслух на гейте фазы 3</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-67" status="spec/done">Клаудизмы просачиваются в текст</fact></td>
          <td><fact id="risk-list-68" status="spec/done">слова и обороты из `STYLE.md` §3</fact></td>
          <td><fact id="risk-list-69" status="spec/done">`vibe doc check --style` со списками по языкам; удаление при виде</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-70" status="spec/done">Проза делегирована воркеру ради скорости</fact></td>
          <td><fact id="risk-list-71" status="spec/done">шаблонная страница без лестницы понятий</fact></td>
          <td><fact id="risk-list-72" status="spec/done">проза — только центральная сессия (план R-29); черновик воркера переписывается</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-73" status="spec/done">Русская адаптация читается как перевод</fact></td>
          <td><fact id="risk-list-74" status="spec/done">канцелярит, кальки, переведённые шутки</fact></td>
          <td><fact id="risk-list-75" status="spec/done">`STYLE.md` §10; русский список тиков в линтере; адаптацию пишет та же модель</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-76" status="spec/done">Линтер стиля ложно срабатывает и его начинают обходить</fact></td>
          <td><fact id="risk-list-77" status="spec/done">правки текста «под линтер»</fact></td>
          <td><fact id="risk-list-78" status="spec/done">два ложных срабатывания одного правила подряд — запись в BACKLOG и правка правила, не текста</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-79" status="spec/done">Документация после кампании стареет молча</fact></td>
          <td><fact id="risk-list-80" status="spec/done">пробелы покрытия растут, страницы не читались месяцами</fact></td>
          <td><fact id="risk-list-81" status="spec/done">петли D-26; `vibe doc todo`; возраст страниц в `reviews.toml`; полная сверка по календарю</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-82" status="spec/done">Находки кампании теряются в чате</fact></td>
          <td><fact id="risk-list-83" status="spec/done">правило регламента «по памяти», без записи</fact></td>
          <td><fact id="risk-list-84" status="spec/done">журнал в том же атоме (план R-33); правило без `J-NNN` — гипотеза</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-85" status="spec/done">Регламент разбухает в ритуал</fact></td>
          <td><fact id="risk-list-86" status="spec/done">чеклисты, которые никто не выполняет</fact></td>
          <td><fact id="risk-list-87" status="spec/done">квартальный пересмотр: спящие правила уходят; восемь метрик, не больше</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-88" status="spec/done">Мелкие правки ломают лестницу страницы</fact></td>
          <td><fact id="risk-list-89" status="spec/done">пять заплаток без чтения</fact></td>
          <td><fact id="risk-list-90" status="spec/done">правило пяти правок; страница недели вслух</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-91" status="spec/done">Фича, требующая истории или показывающая кухню читателю, просачивается обратно</fact></td>
          <td><fact id="risk-list-92" status="spec/done">ревизия, хэш, отпечаток, «устарело» на странице; снимок не по объявленной версии</fact></td>
          <td><fact id="risk-list-93" status="spec/done">D-27: единственная разница — между объявленными версиями по снимкам, и только для разработчиков; план F-68</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-94" status="spec/done">Рендер хоста на каждый пуш перегружает сервер</fact></td>
          <td><fact id="risk-list-95" status="spec/done">десять сборок Rust в день на рендерере</fact></td>
          <td><fact id="risk-list-96" status="spec/done">дебаунс A5.1; спайк A0.28 меряет цену сборки</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-97" status="spec/done">Ссылка агента на `#p12` после правки страницы бьёт мимо</fact></td>
          <td><fact id="risk-list-98" status="spec/done">блок сместился</fact></td>
          <td><fact id="risk-list-99" status="spec/done">принято, как ссылка на строку файла; именованные якоря заголовков не сдвигаются (R-06)</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-100" status="spec/done">Перенос лендинга роняет его SEO</fact></td>
          <td><fact id="risk-list-101" status="spec/done">после переключения меняются адреса, `canonical`, `hreflang`, JSON-LD, тексты, теряется ключ-файл IndexNow</fact></td>
          <td><fact id="risk-list-102" status="spec/done">тест паритета A4.17 до переключения; адреса и корневые файлы байт в байт; редирект `/en/` → `/`; IndexNow после переключения; Search Console под наблюдением месяц</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-103" status="spec/done">Перенос лендинга теряет мелочи</fact></td>
          <td><fact id="risk-list-104" status="spec/done">нет анимации графа, `prefers-reduced-motion`, кириллических подсетов, тега Umami, `og.png`</fact></td>
          <td><fact id="risk-list-105" status="spec/done">чеклист переноса в A4.16; паритет проверяет и ассеты</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-106" status="spec/done">Перенос лендинга превращается в редизайн</fact></td>
          <td><fact id="risk-list-107" status="spec/done">новые тексты и блоки в атоме переноса</fact></td>
          <td><fact id="risk-list-108" status="spec/done">не-цель §8.1; один к одному; правки содержания — после дизайн-ревью</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-109" status="spec/done">Промпты устаревают молча</fact></td>
          <td><fact id="risk-list-110" status="spec/done">ассерт падает при прогоне агентом; агент не понимает промпт без прочитанных спек</fact></td>
          <td><fact id="risk-list-111" status="spec/done">ассерты обязательны на страницах сценариев; прогон в фазе P, выборкой в месячной петле, целиком на сверке; промпт самодостаточен и нейтрален к агенту (D-30)</fact></td>
        </tr>
        <tr>
          <td><fact id="risk-list-112" status="spec/done">Промпт становится заклинанием</fact></td>
          <td><fact id="risk-list-113" status="spec/done">читатель копирует промпт, не понимая, что произойдёт</fact></td>
          <td><fact id="risk-list-114" status="spec/done">раздел «что произойдёт» обязателен и пишется как коридор; ручной путь — только где нужен</fact></td>
        </tr>
      </table>
    </section>
  </section>
  <section id="glossary" title="9. Глоссарий">
    <list ordered="false" p="227">
      <item><fact id="glossary-1" status="spec/done">**Уровень 0** — документация, выведенная из байтов пакета без авторства.</fact></item>
      <item><fact id="glossary-2" status="spec/done">**Уровень 1** — пакет kind `doc`.</fact></item>
      <item><fact id="glossary-3" status="spec/done">**Предмет** — пакет, который документируется.</fact></item>
      <item><fact id="glossary-4" status="spec/done">**Спутник** — пакет `&lt;имя&gt;-docs` или `&lt;имя-документации&gt;-&lt;lang&gt;`; роль
  семейства вне унисона.</fact></item>
      <item><fact id="glossary-5" status="spec/done">**Источник (перевода)** — документация, которую перевод зеркалит.</fact></item>
      <item><fact id="glossary-6" status="spec/done">**Официальная документация** — рёбра сходятся: предмет назвал, пакет объявил.</fact></item>
      <item><fact id="glossary-7" status="spec/done">**Официальный перевод** — рёбра сходятся: источник назвал, перевод объявил.</fact></item>
      <item><fact id="glossary-8" status="spec/done">**Community** — есть только ребро от документации или перевода.</fact></item>
      <item><fact id="glossary-9" status="spec/done">**Карточка** — `title`, `description`, `abstract`, `[media]`, издатель,
  язык, версия, дата, аудитории.</fact></item>
      <item><fact id="glossary-10" status="spec/done">**Остров** — HTML-фрагмент содержимого страницы, выданный Rust-конвейером.</fact></item>
      <item><fact id="glossary-11" status="spec/done">**Оболочка** — Qwik-приложение вокруг острова.</fact></item>
      <item><fact id="glossary-12" status="spec/done">**Адаптер** — вариант сборки оболочки: статический (сервер) или встраиваемый
  (`vibe`).</fact></item>
      <item><fact id="glossary-13" status="spec/done">**Всегда текущий рендер** — режим документации для читателя: всё
  показывается против продукта, каким он есть сейчас; ничего не сравнивается
  «с тех пор» (D-27).</fact></item>
      <item><fact id="glossary-14" status="spec/done">**Контракт версии** — то, что версия обещает делать; версия — не набор
  файлов. Внутри версии продукт может меняться невидимо (D-27).</fact></item>
      <item><fact id="glossary-15" status="spec/done">**Снимок поверхности** — структурное описание команд, полей, схем и
  обязательств продукта на объявленную версию; `maintenance/surface/&lt;версия&gt;.json`;
  внутренняя кухня (D-27).</fact></item>
      <item><fact id="glossary-16" status="spec/done">**Псевдоистория версий** — последовательность снимков по объявленным
  версиям и `vibe doc diff` между ними: список страниц к обновлению с
  причинами; только для разработчиков документации (D-27).</fact></item>
      <item><fact id="glossary-17" status="spec/done">**Обязательство** — факт спеки с `actionstage="doc"` и аудиторией; гейт
  покрытия требует его цитирования.</fact></item>
      <item><fact id="glossary-18" status="spec/done">**Манифест страниц** — JSON-перечень страниц со статусами, языками,
  аудиториями, жанрами, якорями и резюме; источник навигации и `llms.txt`.</fact></item>
      <item><fact id="glossary-19" status="spec/done">**Плейсхолдер** — генерируемая из координаты иконка или баннер.</fact></item>
      <item><fact id="glossary-20" status="spec/done">**Store** — машинный store пакетов `~/.vibe/cache/`.</fact></item>
      <item><fact id="glossary-21" status="spec/done">**Ридер** — режим страницы документации с десятью фичами D-22.</fact></item>
      <item><fact id="glossary-22" status="spec/done">**Позиционный якорь `pNN`** — номер блока на странице, присвоенный на
  сборке; стабилен в пределах версии, в отличие от именованного якоря.</fact></item>
      <item><fact id="glossary-23" status="spec/done">**Семантический токен** — CSS-переменная по роли (`--text-2`), не по цвету;
  две карты значений — две темы.</fact></item>
      <item><fact id="glossary-24" status="spec/done">**Дизайн-ревью** — стоп-точка после первого живого рендера, на которой
  владелец пересматривает D-21.</fact></item>
      <item><fact id="glossary-25" status="spec/done">**Лендинг** — маршруты `/` и `/ru/` того же Qwik-сайта, что и
  документация (D-28); прежний Astro-лендинг из репозитория `vibevm-org` —
  источник его содержания, адресов и тёмных токенов.</fact></item>
      <item><fact id="glossary-26" status="spec/done">**Паритет лендинга** — тест, сравнивающий старую и новую сборки лендинга
  по адресам, мета-тегам, JSON-LD, текстам и корневым файлам; гейт
  переключения домена.</fact></item>
      <item><fact id="glossary-27" status="spec/done">**Промпт-блок** — элемент `prompt`: задание агенту в голосе пользователя с
  `needs`, `outcome` и ассертами; открывает страницу сценария (D-30).</fact></item>
      <item><fact id="glossary-28" status="spec/done">**Ассерт промпта** — шелл-команда, обязанная завершиться нулём после
  работы агента; единственный детерминированный способ проверить промпт.</fact></item>
      <item><fact id="glossary-29" status="spec/done">**Прогон промптов** — `vibe doc check --prompts`: агент-исполнитель в
  чистом каталоге, затем ассерты; не в панели, а в фазе P, месячной петле и
  на сверке.</fact></item>
      <item><fact id="glossary-30" status="spec/done">**Рендерер** — вспомогательный контейнер с `vibe`, наполняющий том сайта.</fact></item>
      <item><fact id="glossary-31" status="spec/done">**Клаудизм** — узнаваемое слово, оборот или структура модельной прозы;
  списки в `STYLE.md` §3 и §10.</fact></item>
      <item><fact id="glossary-32" status="spec/done">**Контейнер и коридор** — где сложности можно (`rule`, таблица, `derived`,
  fence, глоссарий) и где нельзя (повествовательный абзац).</fact></item>
      <item><fact id="glossary-33" status="spec/done">**Лестница** — порядок понятий на странице, при котором каждое опирается
  только на уже введённые.</fact></item>
      <item><fact id="glossary-34" status="spec/done">**Адаптация** — версия документации на другом языке: зеркало по блокам,
  свобода по предложениям; в этом документе то же, что «перевод».</fact></item>
      <item><fact id="glossary-35" status="spec/done">**STE** — ASD-STE100 Simplified Technical English; правила для
  технических мест страницы.</fact></item>
      <item><fact id="glossary-36" status="spec/done">**Петля** — цикл обновления документации со своим триггером: коммита,
  недельная, месячная; плюс полная сверка по обещанию команды (D-26).</fact></item>
      <item><fact id="glossary-37" status="spec/done">**Полная сверка** — чтение документации против текущего продукта:
  пробелы покрытия к нулю, примеры зелёные, справочники перегенерированы,
  страницы и адаптации перечитаны; раз в квартал и перед вехой, не на каждый
  релиз.</fact></item>
      <item><fact id="glossary-38" status="spec/done">**Журнал** — `JOURNAL.md`: успехи, неудачи, находки и наблюдения кампании
  с полем «→ регламент».</fact></item>
      <item><fact id="glossary-39" status="spec/done">**Долг документации** — строка `docs:` в `BACKLOG.md` с severity и
  адресом изменения, которое осталось без страницы.</fact></item>
      <item><fact id="glossary-40" status="spec/done">**Дрейф** — расхождение продукта, мира или текста с документацией; машине
  видна только его текущая часть: пробелы покрытия, красные примеры,
  неразрешимые цитаты (`vibe doc todo`); остальное видит человек.</fact></item>
      <item><fact id="glossary-41" status="spec/done">**Страница недели** — одна страница, прочитанная вслух в недельной петле;
  порядок в `reviews.toml`.</fact></item>
    </list>
  </section>
  <section id="open" title="10. Открытые вопросы владельцу">
    <list ordered="true" p="228">
      <item><fact id="open-1" status="spec/done">**Механизм встраивания оболочки** (D-12) — подтвердить или поправить,
   включая пункт 3 о скачивании оболочки для сборок из исходников.</fact></item>
      <item><fact id="open-2" status="spec/done">**Хост на сайте** (D-16, D-27): тегов нет, рендерится текущее состояние
   `main`, истории нет. Единственный вопрос — частота опроса и пересборки
   (рекомендация: не чаще раза в час).</fact></item>
      <item><fact id="open-3" status="spec/done">**Хостинг `vibevm.org`** — закрыт третьей редакцией (D-23): тот же сервер,
   второй контейнер выдачи и контейнер-рендерер, маршрутизация `/doc/` в
   контейнерном nginx лендинга. Остаётся два уточнения: (а) compose-сервисы и
   деплой-скрипт на сервере добавляет владелец сам по runbook или поручает
   агенту под явным присмотром; (б) рендер по деплой-скрипту достаточен для
   первой волны или сразу нужен таймер.</fact></item>
      <item><fact id="open-4" status="spec/done">**Точное место полей** `[[documents]]`, `[documentation]`, `[translates]`,
   `[translations]`, `[media]` — верхний уровень манифеста, как `[boot_snippet]`
   и `[[skill]]`, или внутри `[package]`. Рекомендация: верхний уровень;
   `title`, `abstract`, `lang` — внутри `[package]`, рядом с `description`.</fact></item>
      <item><fact id="open-5" status="spec/done">Закрыт (D-29): первая адаптация — волна C, вся документация ядра, после
   проверки волны B.</fact></item>
      <item><fact id="open-6" status="spec/done">**Версия `vibe`, вводящая новые поля манифеста**: 1.1.0 при посадке
   фазы 2 или изменяемый альфа-слот 1.0.0.</fact></item>
      <item><fact id="open-7" status="spec/done">**Тема по умолчанию публичного сайта** (D-21): системная, как записано,
   или светлая, как у эталона Anthropic. Решается на дизайн-ревью, до него —
   системная.</fact></item>
      <item><fact id="open-8" status="spec/done">**Шрифты** (D-21): Spectral + Inter + JetBrains Mono лендинга или
   Manrope + Source Serif 4 дизайн-системы. Рекомендация — первое; A/B на
   дизайн-ревью.</fact></item>
      <item><fact id="open-9" status="spec/done">**Что делать с oleg.guru после переноса ридера**: оставить два ридера или
   со временем перевести статьи на тот же Qwik-ридер. Вне этой волны; вопрос
   записан, чтобы не потерять.</fact></item>
      <item><fact id="open-10" status="spec/done">**Стиль-ревью** (D-25): сколько страниц владелец готов читать вслух на
    гейте фазы 3. Рекомендация — три: маршрут новичка, справочная страница,
    объяснение архитектуры.</fact></item>
      <item><fact id="open-11" status="spec/done">**Сопровождение** (D-26, `MAINTENANCE.md` §11): каденции неделя и месяц
    или две недели и квартал; дежурный по недельной петле; публиковать
    мелкие правки патч-версией еженедельно или копить до месячного релиза;
    можно ли скиллу писать `docs-gap:` в `BACKLOG.md` чужого проекта;
    каденция полной сверки — квартал, веха или оба.</fact></item>
      <item><fact id="open-12" status="spec/done">**Примеры как golden-тесты в панели** (D-14): единственная оставшаяся
    техническая связка продукта с документацией. Оставить (рекомендация:
    правятся как любой golden-файл за минуты) или тоже перевести в
    измеритель.</fact></item>
      <item><fact id="open-13" status="spec/done">Снят (седьмая редакция): вопрос об отпечатке сборки в `vibe --version`
    противоречил замыслу проекта — версии неразличимы намеренно (D-27).</fact></item>
      <item><fact id="open-14" status="spec/done">**Псевдоистория версий** (D-27): (а) хранить снимки поверхности в
    пакете документации под `maintenance/surface/` (рекомендация: да, это
    данные разработчиков документации, сайт их не рендерит) или в зоне
    кампании хоста; (б) разрешить ли внутренний `vibe doc diff &lt;версия&gt; now`
    как подсказку полной сверке внутри версии (рекомендация: да, с пометкой
    «кухня», без следов на страницах).</fact></item>
      <item><fact id="open-15" status="spec/done">**Судьба репозитория `vibevm-org`** после переключения домена (D-28):
    архивировать с финальным коммитом-указателем на новый дом сайта
    (рекомендация) или оставить как тонкий деплой-репозиторий. Чекаут на
    сервере в любом случае меняется на репозиторий vibevm — рендереру нужен
    `vibe` из исходников.</fact></item>
      <item><fact id="open-16" status="spec/done">**Момент переключения**: вместе с первым деплоем документации (фаза 5,
    рекомендация — один cutover, один тест паритета) или раньше, отдельным
    шагом, как только лендинг на Qwik готов.</fact></item>
      <item><fact id="open-17" status="spec/done">**Что значит «всё проверено» для старта волны C** (D-29): гейт фазы 6
    зелёный и сайт живёт месяц без красных сигналов недельной петли
    (рекомендация), или сразу после гейта.</fact></item>
      <item><fact id="open-18" status="spec/done">**Запись в репозиторий для волны A**: фаза P пишет прозу в
    `vibevm/vibepacks/org.vibevm.core/vibevm-docs/` — значит, режим «только
    чтение» этой сессии снимается для этого каталога и зоны кампании в
    новой сессии Fable.</fact></item>
      <item><fact id="open-19" status="spec/done">**Агент-исполнитель для прогона промптов** (D-30): `opus5` через тот же
    механизм, что воркеры кампании (рекомендация — он уже есть и стоит
    дёшево в сравнении с Fable), Codex, или оба по очереди для нейтральности;
    и каденция: выборка из десяти в месячной петле, все — на сверке.</fact></item>
    </list>
  </section>
  <section id="changelog" title="11. Журнал редакций">
    <list ordered="false" p="229">
      <item><fact id="changelog-1" status="spec/done">**2026-09-11, двенадцатая редакция — фаза 0.** Кампания перешла в
  worktree `vibevm-docs`, ветка `research-preview-1-docs`, тег
  `research-preview-1-implementation`. Двадцать шесть спайков фазы 0
  выполнены воркерами; вердикты — `PHASE-0-FINDINGS.md`, отложенное —
  `DEFERRALS.md`, журнал J-021…J-041. Решения уточнены на месте:
  словарь документации как параметр читателя, дискриминатор `title=`
  против коллизии имён, `when` на любом блоке, необратимость проекции в
  Markdown, `example` с `exit` и `stderr` без шаблонов `match` (D-10);
  язык doc-пакета — `[i18n].canonical`, `[translations]` не хранится (D-01,
  D-18, D-20); адреса страниц со слэшем (D-06); канал хоста — выкладка на
  диске, корень хоста не пакет (D-07, D-16); `--frame-ancestor` и блок
  конфигурации без `'unsafe-inline'` (D-09); пины Qwik 2.0.0-beta.43 /
  Vite 8.2.1 / Node 24.18, адаптер `ssg`, `base: "/"`, `include_dir`,
  оболочка отдельным релизным активом с `DOC-SHELL.json` и каталогом
  `doc-shell/&lt;sha256&gt;/` (D-12); пороги APCA по ролям, разделители вне
  гейта, чеканка тонов `-docs`, один `--bg`, собственная реализация
  формулы вместо AGPL-библиотеки (D-21); нумерация до фильтрации `when`
  (D-22). Предсказание 10 подтверждено. Найден вероятный обход путей в
  `vibe-index` — P1 в BACKLOG. Открытые вопросы владельцу — в
  `PHASE-0-FINDINGS.md` §«Вопросы владельцу».</fact></item>
    </list>
    <list ordered="false" p="230">
      <item><fact id="changelog-2" status="spec/done">**2026-09-10, одиннадцатая редакция.** Слово владельца (§3): любое
  действие делается и агентом, поэтому сценарии — промпт сначала; это
  отличие от документации прошлого. Добавлены P-16 и D-30 (порядок страницы
  сценария; элемент `prompt` с `needs`, `outcome`, `assert`; прогон
  промптов агентом вне панели; скилл берёт промпт как задание; кнопка
  «передать агенту» в embedded-режиме); D-10 получил седьмой элемент; D-13,
  §6 (раздел «работа через агента»), §7.4, §7.5, §8.2, §9, §10 п. 19.
  Журнал J-020.</fact></item>
      <item><fact id="changelog-3" status="spec/done">**2026-09-10, десятая редакция.** Слово владельца (§3): сначала вся
  документация на английском, русский — следующей волной; тексты пишет
  Fable, потом полное переключение на Opus для разработки. Добавлено D-29
  (три волны, точки возврата Fable, фикстура адаптации в волне B); §1 п. 2,
  §10 п. 5 закрыт, п. 17–18 добавлены. План: §6.0, фаза P, §12.1.
  Журнал J-019.</fact></item>
      <item><fact id="changelog-4" status="spec/done">**2026-09-10, девятая редакция.** Слово владельца (§3): лендинг тоже
  переделать на Qwik, чтобы было однообразно и композировалось. Добавлено
  D-28 (один сайт, одна дизайн-система; pnpm-workspace `design/` + `site/`;
  перенос один к одному; тест паритета; снятие `vibevm-org` с
  эксплуатации). Переписаны D-06 (корневые файлы генерирует одна сборка;
  контракт трёх строк снят) и D-23 (один контейнер выдачи на домен,
  переключение на месте контейнера лендинга, без прокси); правки D-13,
  D-21, D-24, §1, §2.5, §7.6, §8.1, §8.2, §9, §10 п. 15–16. Журнал J-018.</fact></item>
      <item><fact id="changelog-5" status="spec/done">**2026-09-10, восьмая редакция.** Слово владельца (§3): версия —
  контракт на поведение, не набор файлов; смена номера — осознанное решение;
  разница считается только между номерами версий; механизм нужен
  разработчикам документации, чтобы алгоритмически знать, что обновлять, а
  читатели кухни не видят. D-27 переписано: псевдоистория версий — снимки
  поверхности по объявленным версиям (`vibe doc surface --record`) и
  `vibe doc diff &lt;старая&gt; &lt;новая&gt;` со списком страниц к обновлению; D-26
  получил процедуру смены версии; §1, §8.2, §9, §10 п. 14. Всё, что
  требовало истории или показывало кухню читателю, остаётся удалённым.
  Журнал J-017.</fact></item>
      <item><fact id="changelog-6" status="spec/done">**2026-09-10, седьмая редакция.** Слово владельца (§3): неразличимость
  версий — фича, amend-версии неотличимы по определению, митигация — не
  строить фичи, требующие истории, а удалить их. D-27 переписано в «Ничего,
  что требует истории» со списком удалённого; откачены отпечатки и хэши
  шестой редакции: D-06 (нет постоянных ссылок), D-07 и D-16 (только текущее
  состояние `main`), D-10 (`rule` без `rev`), D-14 (живая цитата, проверка
  только существования якоря), D-18 (адаптация без ревизий и хэшей), D-22
  (номера — позиция в текущем тексте), D-26 (без меток «проверено против»,
  без `vibe doc drift`); §1, §8.2, §9, §10 п. 2 и 13. Журнал J-016.</fact></item>
      <item><fact id="changelog-7" status="spec/done">**2026-09-10, шестая редакция.** Слово владельца об amend-релизах (§3):
  версия постоянна, история переписывается, десять релизов в день под одним
  номером. Добавлено D-27 «идентичность продукта: отпечатки, не версии» с
  таблицей ключей; исправлены D-06 (постоянная ссылка `/doc/@&lt;hash&gt;/…`,
  версия — псевдоним), D-07 и D-16 (хост по состояниям `main` с ключом «хэш
  дерева», тегов нет — J-014), D-14 (пин цитаты несёт хэш текста факта),
  D-18 (адаптация хранит хэш исходной страницы), D-22 (номера по
  содержимому, отпечаток блока в ссылке), D-26 (метка с отпечатком
  поверхности); §8.2, §9, §10 п. 2 и 13.</fact></item>
      <item><fact id="changelog-8" status="spec/done">**2026-09-10, дополнение к пятой редакции.** По слову владельца снят
  технический гейт «продукт не выходит без документации»: релизов до
  десяти в день, дрейф принят как риск. Релизная петля переименована в
  **полную сверку** по обещанию команды (квартал и веха); добавлены
  измеритель дрейфа (число, не ratchet), метки `verified_against` и
  `verified_at`, видимость дрейфа читателю (D-14, D-26, §1, §8.2, §9, §10
  п. 11–12; `MAINTENANCE.md` §0, §1, §2, §3, §7, §8, §10, §11; журнал
  J-013).</fact></item>
      <item><fact id="changelog-9" status="spec/done">**2026-09-10, пятая редакция.** Слово владельца о журнале и обновлении
  (§3). Добавлены D-26 «сопровождение», `MAINTENANCE.md` (три источника
  дрейфа, четыре петли, инструменты `vibe doc drift` и `todo`, журнал с
  законом «правило без находки — гипотеза», сигналы, дисциплина мелких
  правок с правилом пяти правок, восемь метрик, роли по ярусам, как худеет
  регламент, куда ложится норма) и `JOURNAL.md` с первыми двенадцатью
  записями этой сессии. Дополнены §1, §8.2, §9, §10.</fact></item>
      <item><fact id="changelog-10" status="spec/done">**2026-09-10, дополнение к четвёртой редакции.** Слово владельца о
  разделении труда (§3): программирование — Opus 5 в режиме High по пакетам,
  всё умное и творческое — центральная сессия сама (D-25).</fact></item>
      <item><fact id="changelog-11" status="spec/done">**2026-09-10, четвёртая редакция.** Слово владельца о стиле (§3):
  клаудизмы и, главное, точки притяжения сложности. Добавлены P-15
  «страница стоит одна», D-25 «язык и стиль текста» и отдельный документ
  `STYLE.md` (норма стиля на английском: читатель, контейнеры и коридоры,
  список тиков, регистр по образцам эссеистики, STE для технических мест,
  правила юмора, скелет страницы, до/после, адаптации и русские тики,
  проверки, кто пишет). Английский закреплён исходным языком, остальные —
  адаптации; проза — только сильнейшая модель центральной сессии. Дополнены
  §1, §8.2, §9, §10.</fact></item>
      <item><fact id="changelog-12" status="spec/done">**2026-09-10, третья редакция.** Проанализированы пять внешних источников
  (§2.5): скриншоты старого сайта Anthropic, тёплая дизайн-система, лендинг
  `vibevm-org`, приватный документ инфраструктуры, ридер oleg.guru. Добавлены
  принцип P-14 и решения D-21 (визуальный язык и дизайн-система —
  **предварительно, до дизайн-ревью**), D-22 (десять фич ридера: нумерованные
  абзацы на сборке, переключение перевода с сохранением места, настройки
  чтения, режим чтения, возврат к месту, оглавление, сноски и лайтбокс,
  мета-блок, «для агента», печать), D-23 (хостинг рядом с лендингом: два
  контейнера, маршрутизация в контейнерном nginx лендинга, деплой по runbook,
  детали инфраструктуры не переносятся), D-24 (тег Umami лендинга). Правки:
  D-06 (корень домена — за лендингом, контракт трёх строк), D-09 (тема и CSP
  `frame-ancestors`), D-12 (шрифты в бандле, серверная сборка в Docker), D-13
  (`robots.txt` один на домен, charset и относительные редиректы, IndexNow).
  §7.5 расширен, добавлен §7.6 с раскладками; §8.1, §8.2, §9 дополнены; §10:
  вопрос 3 закрыт, добавлены 7–9.</fact></item>
      <item><fact id="changelog-13" status="spec/done">**2026-09-10, вторая редакция.** Исправлено прочтение канала хоста
  (D-07, D-16: репозиторий исходников, не реестр). Отчёт обязательств
  `--view doc` переосмыслен как гейт покрытия, навигация — из манифеста
  страниц (D-14). Закрыта дыра встраивания для сборок из исходников (D-12,
  пункт 3). Документация наблюдаема, но не судится (D-14). Ужесточён
  локальный сервер (D-09). Записано ограничение для README обычных пакетов
  и нормализация ANSI (D-10). Вижен импортируется в XML (D-17). Добавлены
  D-18 локализация, D-19 обнаруживаемость и иерархия, D-20 карточка с
  `title`, `abstract`, `[media]`. Обновлены принципы (P-13), ИА, сайт, риски,
  глоссарий, открытые вопросы.</fact></item>
      <item><fact id="changelog-14" status="spec/done">**2026-09-09, первая редакция.**</fact></item>
    </list>
  </section>
</spec>
