# Документация VibeVM — вижен {#root}

@status:spec/done

[p01] @fact:companion-line **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. @status:spec/done

## 0. Как читать {#how-to-read}

- [p02] @fact:how-to-read-1 **Жанр.** Это design-документ: «почему и как мы решили». Он не связывает
  никого сам по себе. Связывают PROP-документы после переноса нормы (§5.17), а до
  переноса — решения владельца в §3. При конфликте этого текста с PROP побеждает
  PROP, и этот текст правится. @status:spec/done
- @fact:how-to-read-2 **Решения пронумерованы `D-NN`** и стоят под якорями `#d-NN`. План исполнения
  (`AGENT-PLAN.md`) ссылается на них по якорю и не пересуждает их. @status:spec/done
- @fact:how-to-read-3 **Каждое решение записано четырьмя полями** по закону decision-records
  проекта: Решение · Почему · Отвергнуто · Пересмотреть когда. @status:spec/done
- @fact:how-to-read-4 **Термины** собраны в §9. Идентификаторы проекта (имена файлов, команд,
  элементов) остаются в оригинале. @status:spec/done
- @fact:how-to-read-5 **Журнал редакций** — §11: что изменилось между редакциями и почему. @status:spec/done

## 1. Что строим, в одном экране {#summary}

1. [p03] @fact:summary-1 **Документация — это пакеты.** Вводится kind `doc`. У любого пакета есть
   бесплатный базовый уровень документации, выводимый из его собственного
   содержимого. Расширенная документация едет отдельным пакетом-спутником
   `<группа>/<имя>-docs`, а документация самого инструмента — пакетом
   `org.vibevm.core/vibevm-docs`. Каждая документация несёт человекочитаемый
   заголовок, аннотацию и, по желанию, картинки. @status:spec/done
2. @fact:summary-2 **Переводы — тоже пакеты.** Один пакет на язык, зеркалящий дерево
   источника. Сайт показывает селектор языка и никогда не отвечает 404 на
   отсутствующую страницу — подставляет исходный язык с пометкой. Первая
   адаптация, русская, — третья волна: после того как всё остальное
   проверено и работает (D-29). @status:spec/done
3. @fact:summary-3 **Сайт `vibevm.org/doc` — «docs.rs для реестра vibespecs».** Он рендерит
   каждую опубликованную версию каждого пакета из её байтов, подписан на индекс
   реестра как на ленту изменений и пересобирает только то, у чего изменился
   content hash. Сам vibevm рендерится из своего репозитория исходников.
   Пакет сайта — `org.vibevm.doc/web`, kind `app`. @status:spec/done
4. @fact:summary-4 **Официальное и сообщество — обе полки видимы.** Официальность на каждом
   уровне назначается «сверху»: документацию называет предмет, перевод —
   исходная документация. Всё остальное сайт тоже находит по рёбрам и
   показывает как community, со звёздочками только у официальных элементов. @status:spec/done
5. @fact:summary-5 **Локальный читатель.** Та же программа запускается на машине пользователя
   как `vibe doc serve`, читает машинный store, lock-файл проекта и приватные
   реестры, работает офлайн и встраивается в приложения и плагины через
   webview. Так читается документация проприетарных пакетов, которых в
   публичном реестре нет. @status:spec/done
6. @fact:summary-6 **Инфраструктура для агентов.** Стабильные якоря, адрес `spec://` на каждое
   правило, `llms.txt` и `llms-full.txt` на каждый язык, каждая страница в виде
   Markdown и XML по стабильному URL, каталог документаций с аннотациями в
   стиле arXiv, JSON-манифест страниц, резолвер адресов, точечные запросы
   через CLI и MCP, и скилл, который ведёт агента по петле
   «ошибка → якорь → правило → объяснение → пример». @status:spec/done
7. @fact:summary-7 **Механика без дрейфа.** Документация цитирует спеки и никогда не
   пересказывает нормативные значения; примеры исполняются на каждой сборке;
   справочники выводятся из кода и схем; `rule` цитирует текущий текст спеки,
   а роняет сборку только исчезнувший якорь; покрытие обязательств измеряется
   гейтом, а не ощущается. Ничто в документации не требует истории, которую
   нельзя переписать (D-27). @status:spec/done
8. @fact:summary-8 **Визуальный язык и ридер.** Сайт наследует тёплую дизайн-систему,
   выработанную по старым страницам Anthropic, в двух темах: светлая — её
   собственные токены, тёмная — токены лендинга `vibevm.org`; одна терракота на
   обе. Страница документации — ридер по образцу oleg.guru: нумерованные
   абзацы со ссылкой на каждый, переключение перевода с сохранением места,
   настройки чтения, возврат к месту, где остановился, липкое оглавление,
   сноски, лайтбокс. Раздел о дизайне — заведомо предварительный и
   пересматривается после первого живого рендера (D-21). @status:spec/done
9. @fact:summary-9 **Один сайт на домене, один хостинг.** Лендинг переезжает с Astro на
   Qwik в ходе кампании и становится маршрутами `/` и `/ru/` того же сайта,
   что и документация, на одной дизайн-системе (D-28). Сайт живёт на том же
   сервере, где сегодня лендинг, по существующему runbook инфраструктуры:
   один контейнер выдачи на весь домен и контейнер-рендерер; переключение
   занимает место нынешнего контейнера лендинга, хостовый nginx не трогается.
   Детали сервера — в приватном документе инфраструктуры и сюда не
   переносятся (D-23). @status:spec/done
10. @fact:summary-10 **Текст.** Английский — исходный язык документации, все остальные языки,
    включая русский, — адаптации. Пишем для умного читателя, который ещё
    ничего нашего не читал: сложность живёт в контейнерах (`rule`, таблицы,
    `derived`, fence, глоссарий), повествовательные абзацы остаются простыми;
    технические места — по Simplified Technical English; регистр — эссе для
    образованного читателя, юмор редок и точен; клаудизмы вырезаются линтером
    и рукой; прозу пишет сильнейшая модель в центральной сессии, воркеры —
    код и фикстуры (D-25, `STYLE.md`). @status:spec/done
11. @fact:summary-11 **Сопровождение спроектировано до написания.** Четыре петли обновления:
    коммита (продукт несёт документацию в том же коммите или строку долга),
    недельная (очередь `vibe doc todo`, до пяти мелких правок, страница
    недели вслух), месячная (метрики, аудит корпуса, переписывание,
    изменения регламента, релиз пакета документации), полная сверка по
    обещанию команды (раз в квартал и перед вехой, не на каждый релиз:
    продукт выходит по десять раз в день, дрейф между сверками принят как
    риск); смена номера версии — осознанное решение владельца, и в этот
    момент `vibe doc diff` по снимкам поверхности называет страницы, которые
    надо обновить, — внутренняя кухня разработчиков документации, невидимая
    читателю (D-27). Кампания ведёт журнал успехов, неудач и
    находок с полем «→ регламент»; регламент пишется из журнала в фазе 6
    после двух репетиций (D-26, `MAINTENANCE.md`, `JOURNAL.md`). @status:spec/done

## 2. Откуда стартуем {#context}

### 2.1 Механика, которая уже есть {#context-mechanics}

[p04] @fact:context-mechanics-1 Ничего из перечисленного строить не нужно — на это опирается всё остальное. @status:spec/done

- [p05] @fact:context-mechanics-2 **Адресуемость.** Каждый факт в спеке — именованный XML-элемент с
  идентификатором; адрес `spec://<группа>/<имя>[@версия]/<документ>#<якорь>`
  резолвится без индекса, один к одному в путь файла. Якоря неизменяемы,
  снятие — только tombstone. @status:spec/done
- @fact:context-mechanics-3 **Карта трассируемости (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` и не правится напрямую. @status:spec/done
- @fact:context-mechanics-4 **Пивот документов (`vibe-specdoc`).** Один IR, фронтенды Markdown и XML,
  бэкенды Markdown и XML; преобразование только через IR; диалект закрыт:
  чужой элемент — громкая ошибка. Зарезервированный словарь блоков: `p`,
  `list`, `facts`, `table`, `fence`, `quote`. @status:spec/done
- @fact:context-mechanics-5 **Интернационализация (PROP-003 §2.7, `crates/vibe-core/src/manifest/i18n.rs`).**
  Теги BCP-47, блок `[i18n]` с каноническим языком, списком доступных и
  предпочтением проекта, цепочка отката «точный тег → тег без региона →
  канонический», sidecar-файлы `README.ru.md` внутри пакета, проверка покрытия
  в `vibe check`, запись выбранного языка в lock-файл. Грамматика и цепочка
  отката переиспользуются (§5.18); sidecar-раскладка для документации не
  используется. @status:spec/done
- @fact:context-mechanics-6 **Пакеты и реестр.** Идентичность `(group, name, version, content_hash)`;
  реестр — репозитории `github.com/vibespecs/<группа>.<имя>`; индекс
  `vibe-index` — git-репозиторий на организацию с `repomd.json` и JSONL-первичкой,
  плюс HTTP-сервер на axum с маршрутами `/v1/index/*` и `/v1/packages/*`;
  машинный store `~/.vibe/cache/` с прогревом `vibe cache add`, который не
  трогает проект; git-источники пакетов по тегу, ветке или ревизии (PROP-002). @status:spec/done
- @fact:context-mechanics-7 **Семейства пакетов (PROP-028).** Стем плюс роли `-lang` и `-mcp` в одной
  группе; агрегатор без содержимого; члены семейства версионируются в унисон. @status:spec/done
- @fact:context-mechanics-8 **Скиллы и MCP.** `[[skill]]` в манифесте, `vibe skill install` проецирует
  скиллы в Claude Code, OpenCode и Codex; `vibe mcp serve` отдаёт lock-файл,
  сабскиллы и карту. @status:spec/done
- @fact:context-mechanics-9 **Разметка фактов (PROP-043).** Атрибуты `audience` (`user`, `author`,
  `dev`) и `actionstage`; вид `vibe progress report --view doc --audience …`
  перечисляет факты спек, помеченные как «должны быть рассказаны этой
  аудитории». Это перечень обязательств, а не навигация. @status:spec/done
- @fact:context-mechanics-10 **Токеномика (PROP-048).** Закон слоёв: редко меняющееся читается первым;
  STATIC — кэш-стабильный префикс; изменяемое знание — точечный запрос, а не
  часть префикса. @status:spec/done
- @fact:context-mechanics-11 **Условия загрузки.** Предикаты `when="os:…"` и `when="installed:…"` в
  boot-лейне. @status:spec/done
- @fact:context-mechanics-12 **Дисциплина TypeScript** (`typescript-ai-native`) установлена и обязательна
  для любого TS-кода в проекте; планка качества владельца: production-grade,
  без «MVP». Есть `cargo xtask add-cell` для заведения новой ячейки по
  дисциплине. @status:spec/done

### 2.2 Документация сегодня {#context-docs}

[p06]
| Что | Состояние на 2026-09-09 |
| --- | --- |
| @fact:context-docs-1 `docs/` @status:spec/done | @fact:context-docs-2 48 Markdown-файлов, 316 КБ; альфа-слой «вариант А» от 2026-08-20, сверен с `--help` бинарника 1.0.0 @status:spec/done |
| @fact:context-docs-3 Страниц с устаревшими путями и именами @status:spec/done | @fact:context-docs-4 37 из 51 проверенных: старая раскладка `spec/`, `STATIC.md`, `INLINE.md`, `WAL.md`, ссылки на `.md`-спеки @status:spec/done |
| @fact:context-docs-5 Наблюдаемость @status:spec/done | @fact:context-docs-6 `docs/` не входит ни в один include-glob `facts.toml`: не размечена, не судилась, не проверяется @status:spec/done |
| @fact:context-docs-7 `CHANGELOG.md` @status:spec/done | @fact:context-docs-8 раздел Unreleased пуст при 839 коммитах после релиза 1.0.0 @status:spec/done |
| @fact:context-docs-9 Установленный `vibe 1.0.0` @status:spec/done | @fact:context-docs-10 не знает команд `lifecycle`, `build`, `package`, `deploy`, `scrape`, `extensions`; отладочная сборка из исходников их показывает @status:spec/done |
| @fact:context-docs-11 Корневые гайды @status:spec/done | @fact:context-docs-12 `README.md`, `DEV-GUIDE.md`, `RUNTIME-GUIDE.md` — load-bearing, живут по закону same-commit @status:spec/done |
| @fact:context-docs-13 Инвентарь для сайта @status:spec/done | @fact:context-docs-14 `docs/SITE-MANIFEST.toml` — ручной, курируемый список страниц @status:spec/done |
| @fact:context-docs-15 Язык @status:spec/done | @fact:context-docs-16 существующая документация и спеки — английский; книга redbook — русский @status:spec/done |

### 2.3 Два предыдущих проекта документации {#context-prior}

- [p07] @fact:context-prior-1 **`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). @status:spec/done
- @fact:context-prior-2 **Маршрут `DOCS` в плане стюарда (r145, 2026-09-09).** Восемь узлов от
  инвентаризации и заморозки информационной архитектуры до гейта приёмки, с
  четырьмя аудиториями. **Что остаётся:** все узлы и их критерии приёмки; они
  отображаются на фазы плана. **Что добавляется:** kind `doc` и `app`,
  пакеты-спутники, переводы, сайт, локальный читатель, SEO-контракт. @status:spec/done

### 2.5 Пять внешних источников третьей редакции {#context-external}

[p08] @fact:context-external-1 Проанализированы 2026-09-10 в режиме только для чтения; ни один не
изменялся. Пути — на машине владельца. @status:spec/done

[p09]
| Источник | Где | Что берём | Что не берём |
| --- | --- | --- | --- |
| @fact:context-external-2 Скриншоты старого сайта Anthropic @status:spec/done | @fact:context-external-3 `C:\Users\olegc\git\talks\2026.08.08-agents-talk\screenshots\` (1–13; 13 — страница `/docs`) @status:spec/done | @fact:context-external-4 образ страницы документации: шапка с поиском `Ctrl K`, вкладки разделов, серифный hero, карточки-входы, плавающая кнопка «спросить»; статья с центрированной шапкой, тегами, датой; липкое оглавление слева с подсветкой; тёмный футер-каталог @status:spec/done | @fact:context-external-5 тексты, логотипы, продуктовую структуру @status:spec/done |
| @fact:context-external-6 Тёплая дизайн-система @status:spec/done | @fact:context-external-7 `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` — витрина компонентов) @status:spec/done | @fact:context-external-8 токены светлой темы (палитра слоновой кости, тан, чернила, терракота, цвета графиков, радиусы, тени), компоненты: `.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` (тёплый градиентный плейсхолдер) @status:spec/done | @fact:context-external-9 шрифты Manrope и Source Serif 4 как обязательные (см. D-21: резерв), мега-меню, карусель цитат, промо-панели @status:spec/done |
| @fact:context-external-10 Центральный лендинг @status:spec/done | @fact:context-external-11 `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`) @status:spec/done | @fact:context-external-12 токены тёмной темы (`--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 @status:spec/done | @fact:context-external-13 сам Astro и Tailwind: лендинг переезжает на Qwik и токены (D-28); содержание и адреса переносятся один к одному @status:spec/done |
| @fact:context-external-14 Инфраструктура хостинга @status:spec/done | @fact:context-external-15 `C:\Users\olegc\git\infra\main\main.md` (**приватный**, единый источник правды по серверу) @status:spec/done | @fact:context-external-16 модель деплоя B «git-чекаут на сервере + `docker compose up -d --build`», TLS снаружи контейнера, контейнер слушает `:80`, `absolute_redirect off` обязателен, runbook «поднять сайт», протокол удаления, Umami для новых сайтов, правило «маршрутизацию нового сервиса на существующем домене делать в контейнерном nginx, не в хостовом» @status:spec/done | @fact:context-external-17 **ничего из содержимого не переносится**: адреса, порты, схема трафика, VPN — только ссылка на файл; директива о VPN становится стоп-правилом плана @status:spec/done |
| @fact:context-external-18 Ридер статей oleg.guru @status:spec/done | @fact:context-external-19 `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`) @status:spec/done | @fact:context-external-20 весь набор фич ридера, разобранный в D-22 @status:spec/done | @fact:context-external-21 палитру (холодная тёмная с бирюзой и розовым — не наш язык), Roboto Flex, модалку гражданства, GA/Метрику, нумерацию якорей на клиенте (у нас — на сборке) @status:spec/done |

### 2.4 Аудитории {#context-audiences}

[p10]
| Аудитория | Кто это | Значение `audience` |
| --- | --- | --- |
| @fact:context-audiences-1 Новичок @status:spec/done | @fact:context-audiences-2 человек, впервые открывший VibeVM @status:spec/done | @fact:context-audiences-3 маршрут внутри `user`, не отдельное значение @status:spec/done |
| @fact:context-audiences-4 Пользователь и оператор @status:spec/done | @fact:context-audiences-5 ставит vibe, ведёт проект, устанавливает пакеты, деплоит @status:spec/done | @fact:context-audiences-6 `user` @status:spec/done |
| @fact:context-audiences-7 Автор пакетов и расширений @status:spec/done | @fact:context-audiences-8 пишет flow/feat/stack/tool/mcp/lang/doc/app, провайдеры и расширения, переводы @status:spec/done | @fact:context-audiences-9 `author` @status:spec/done |
| @fact:context-audiences-10 Мейнтейнер @status:spec/done | @fact:context-audiences-11 правит код и спеки самого vibevm @status:spec/done | @fact:context-audiences-12 `dev` @status:spec/done |
| @fact:context-audiences-13 Сессия агента @status:spec/done | @fact:context-audiences-14 AI-сессия проекта-потребителя, читающая при загрузке или по запросу @status:spec/done | @fact:context-audiences-15 `agent` (новое, §5.11) @status:spec/done |

## 3. Мандат владельца, дословно {#mandate}

[p11] @fact:mandate-1 Цитаты — чат 2026-09-09 и 2026-09-10. @status:spec/done

> [p12] @fact:mandate-2 «я хочу следующим этапом начать писать документацию. И я хочу понять, как
> правильно ее писать, чтобы она а) хорошо анализировалась ИИ агентами
> б) идеально читалась людьми.» @status:spec/done

> [p13] @fact:mandate-3 «Мы сможем сделать так, чтобы в нем можно было перейти от документов к
> спецификациям и прочитать подробные правила? (как часть делают в книгах по
> C++, где упрощенное описание в учебной книге ссылается на точные строки
> стандарта C++). Еще, мы можем сделать какие-то примеры, чтобы пользователи
> могли быстро понять как пользоваться фичей и им не приходилось долго и
> сложно думать? Дальше, можем ли мы сделать какую-то специальную
> инфраструктуру для агентов, чтобы им было проще исследовать эту документацию
> и через веб, и через локальный доступ (если сделать возможность скачать
> документацию и читать ее локально - тогда в будущем мы можем сделать "скилл
> по использованию vibevm" который будет в случае проблем отсылать не только к
> спекам, но и к документации).» @status:spec/done

> [p14] @fact:mandate-4 «Я бы сделал основную механику vibevm всегда доступной в виде пакета. При
> переходе проекта в продакшен все пакеты из packages будут опубликованы наружу
> и лягут в репозиторий, поэтому они в этот пакет не войдут. Но сделать аналог
> docs.rs который генерирует документацию для ВСЕГО что лежит в репозитории -
> это очень круто и очень хотелось бы сделать так. Но важно, что пакеты в
> центральном репозитории vibespecs меняются и технически сайт должен уметь это
> всё обновлять у себя. Возможно, опциональная документация должна идти
> сопроводительным пакетом типа org.vibevm.world.docs/multi-user-planning (или
> выработать еще какую-то конвенцию более правильную, если эта не подходит)» @status:spec/done

> [p15] @fact:mandate-5 «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/
> (да, она в бете, это нормально)» @status:spec/done

> [p16] @fact:mandate-6 «канал хоста - пока что только тот репозиторий который мы указали в
> настройках при запуске/генерации (по умолчанию - гитхаб), зеркала и прочее -
> когда-нибудь в будущем» @status:spec/done

> [p17] @fact:mandate-7 «я боюсь что если ребро документации будет исходить из самого пакета, то три
> разных человека законтрибьютят три разных пакета документации, и непонятно
> будет - какой "официальный" пакет показывать на нашем сайте. Может быть,
> ребро должно исходить и из самого документируемого пакета тоже? То есть,
> пакет указывает свою "официальную" документацию (и там может быть одна штука
> выбрана как "основная" документация, и сколько угодно как дополнительные
> "официальные"). Но при этом остается возможность самим пакетам с
> документацией сделать обратное ребро тоже - и тогда на сайте мы сможем
> сделать раздел с "неофициальной" документацией (community docs).» @status:spec/done

> [p18] @fact:mandate-8 «2) вариант Б, а приложения и VSCode-плагины будут вставлять в себя этот
> интерфейс через webview 3) сразу A, и спланировать самые частые вещи
> 5) вариант А, добавить agent 6) Б для локального читателя, А для сборки
> публичного сайта на сервере, где Node есть. Но прежде чем подтвержу, скажи
> как именно ты собрался встраивать оболочку vibe» @status:spec/done

> [p19] @fact:mandate-9 «ты помнишь что бывают локализации? скорей всего, нужно каждую из
> локализаций иметь отдельным пакетом, а сайту показывать селектор локализации.
> А в пакете иметь официальную ссылку на каждый из пакетов для разных языков.» @status:spec/done

> [p20] @fact:mandate-10 «только не забудь, что неофициальные переводы тоже должны искаться сайтом
> (просто отображаться как переводы сообщества, а не официальные). Эта
> иерархия официальной и неофициальной документации, их официальных и
> неофициальных переводов должна как-то понятно и наглядно отражаться в
> интерфейсе (например, звездочки на "официальных" элементах)» @status:spec/done

> [p21] @fact:mandate-11 «можно сделать, чтобы документация могла иметь собственные названия.
> Например, сам автор пакета пишет для нее официальный мануал, а потом
> сообщество пишет три неофициальных гайда с новыми названиями. […] Имеется
> в виду человекочитаемое имя, таким как оно будет выглядеть в интерфейсе
> сайта» @status:spec/done

> [p22] @fact:mandate-12 «обычно для библиотеки документации лучше иметь человекочитаемое название и
> человекочитаемый абстракт - так же как это делают поисковики по arxiv.org,
> например» @status:spec/done

> [p23] @fact:mandate-13 «еще я бы советовал сразу добавить возможность сделать большую квадратную
> иконку (как аватар в твиттере) или большой горизонтальный баннер (как баннер
> профиля в твиттере 1500x500). […] Обе картинки опциональны. В случае если
> нет картинки, на аватаре отображается плейсхолдер (например, книга), а
> вместо баннера отображается тоже какой-то плейсхолдер в виде красивого
> градиента или абстрактного узора» @status:spec/done

> [p24] @fact:mandate-14 «картинки для опенграфа я бы сделал отдельной опцией. То есть баннер - это
> нечто длинное и узкое что отображается сверху страницы документации в
> каталоге, и оно по пропорциям плохо похоже на og:image которую ждут как
> "превью веб-страницы"» @status:spec/done

[p25] @fact:mandate-15 Что в этом мандате **ещё не подтверждено** владельцем: механизм встраивания
оболочки в `vibe` (§5.12 помечено «предложено») и набор ссылок хоста, которые
рендерит сайт: только теги релизов или ещё `main` (§5.16). Всё остальное —
принятые решения. @status:spec/done

> [p26] @fact:mandate-16 «Мы когда-то вырабатывали дизайн-систему. В качестве вдохновения мы брали
> старые версии сайта Антропика […]. И даже выработали конкретную дизайн
> систему в виде CSS и примерного портала […]. Еще мы сделали центральный
> лендинг […] и выложили его на хостинг […]. Кроме того, на моем личном сайте
> […] есть просто офигенный интерфейс просмотра статей, который стоит
> перенести и на наш сайт тоже. Документы по ссылкам, которые я дал, менять не
> нужно. Нужно их аккуратно проанализировать (в том числе подробно понять фичи
> ридера статей на oleg.guru типа нумерованых абзацев, переключения между
> переводами, свойствами чтения, возвращения к закладке, и так далее) и внести
> в наше ТЗ и вижен. Секция визуального языка и дизайн-системы, возможно,
> требует дополнительного доисследования и улучшения уже после того, как мы
> поймем что у нас получается.» @status:spec/done

> [p27] @fact:mandate-17 «Скоро мы будем писать доки, и поэтому важное про стиль. Claude известна
> написанием доков с огромной кучей "клаудизмов". Но клаудизмы - полбеды.
> Одна из важнейших проблем - неправильный баланс и точки притяжения
> сложности. Мы пишем документацию для умных, технологически продвинутых
> людей, многие из которых - senior developers или имеют академический
> бэкграунд в ИИ. И часто даже они не понимают, что написала Claude. Потому
> что агенты Claude обычно пишут исходя из неверного предположения, что
> человек вначале прочитал всю документацию и все спеки, и вот теперь агент
> может написать сложные информационно плотные абзацы, сплошь состоящие из
> терминов спецификации. Как правило это неправда, особенно для
> документации. Поэтому технические места лучше описывать словами:
> ASD-STE100 Simplified Technical English (STE), открыто и просто говорить
> как делаются те или иные вещи (без "посмотрите в спецификацию, прочитайте
> все и сами поймете). Но это не отменяет того, что нас читают умные,
> образованные люди, и поэтому писать для них нужно как в лучших
> научно-популярных журналах - ярко, броско и с юмором, типичным для
> образованных людей (не обязательно в сфере IT). Важно, что юмор - это вещь
> очень редкая и должна быть применена точно и к месту, ровно как и другие
> резкие стилистические приемы. […] Важно: исходный текст английский, все
> остальные языки (включая русский!) это адаптации английского. Красивые
> тексты пишешь ты сама (Fable, Astra, Sol), маленьких агентов можно
> использовать для технических задач типа программирования (все наши
> веб-интерфейсы и так далее)» @status:spec/done

> [p28] @fact:mandate-18 «Пожалуйста всю работу по программированию делай в режиме оркестратора,
> выдавая задачи Opus 5 в режиме High. Все задачи про нечто умное и
> творческое (написание статей, перевод на русский, проектирование смысла
> дизайн-системы и так далее) - делай сама.» @status:spec/done

> [p29] @fact:mandate-19 «Наша задача сэкономить токены так, чтобы Fable использовалась только там,
> где Fable действительно нужна. Механическую работу могут сделать и другие
> модели.» @status:spec/done

> [p30] @fact:mandate-20 «Предлагаю по ходу выполнения задачи собирать журнал успехов, неудач и
> главное - интересных находок. И дальше на основании того что у нас
> получилось, нужно написать спецификацию с подробным объяснением как
> обновлять эту документацию. Потому что написать документацию - полдела, а
> вот регулярно обновлять ее в мелочках и периодически например раз в
> неделю/месяц - глобальное ревью и улучшение - это другая важная часть.
> Продумай сразу как мы будем обновлять доку, чтобы все наши находки по ходу
> кампании реализации доков только улучшали этот процесс» @status:spec/done

> [p31] @fact:mandate-21 «Единственное что мне не нравится твое правило "продукт не выходит без
> обновления документации". Это неправда в нашем случае. Мы можем релизить
> новые версии 10 раз в день и мерджить по 100 пулл-риквестов в день. Нет
> никаких шансов, что документация не будет дрейфовать. Этот риск мы
> принимаем. Мы просто обещаем себе чисто исходя из процессов нашей команды
> (не технически) время от времени проводить полную проверку - ту что ты
> назвала "релизной" но возможно ее стоит назвать как-то еще, потому что мы
> не можем делать ее каждый релиз» @status:spec/done

> [p32] @fact:mandate-22 «Я на всякий случай напоминаю тебе, что мы очень редко обновляем версию
> Vibe. Узнать что версия изменилась нельзя почти никак, и это фича. Так что
> у тебя вполне может быть ситуация, когда спека дрейфует в рамках одной и
> той же версии. Например, мы в день выпустили десять версий и все с версией
> 2.0.0, в расчете что пользователи будут делать vibe self update --force и
> перекачивать текущую версию с сервера. Это аналог git amend в реальной
> жизни ))) Мы постоянно делаем trunk based development с переписыванием
> истории чтобы увеличить скорость итераций и выпуска релизов (не 1 раз в
> месяц, а 10 раз в день). Иногда впрочем номер версии действительно
> меняется и там можно что-то показывать.» @status:spec/done

> [p33] @fact:mandate-23 «Гляди, мне нравится идея того, что между версиями можно посмотреть
> разницу. И ты можешь добавить туда некий Pseudo-history mechanism для
> этого. Но я предлагаю тебе не рассчитывать ни на что кроме самого номера
> версии. То есть, разница считается между номерами версий. Например,
> владелец решил, что 1.0.0 надо поднять до 2.0.0. Вот теперь ты можешь
> смотреть разницу между ними. Но эта смена версии происходит не из-за
> каких-то хитрых механик с чексуммами, не из постоянства файлов или чего-то
> такого. Она происходит из осознанного желания владельца поменять номер
> версии.» @status:spec/done

> [p34] @fact:mandate-24 «Почему мне нравится твой pseudo-version-mechanism из предыдущих версий.
> Потому что он позволяет алгоритмически понять, какую часть документации
> надо обновить. Не нужно с помощью LLM штудировать ВСЮ документацию. НО
> важно, что эти данные - это всё нужно для разработчиков документации. А
> пользователи всей этой внутренней кухни видеть не должны. Они видят версию
> 1.0.0 и воспринимают это как контракт "версия 1 делает то, что должна
> делать версия 1". Какие там внутри файлы для пользователей обычно не важно.
> […] Ты же считаешь сейчас версию не контрактом на поведение, а каким-то
> конкретным замороженным набором файлов, это неправильно.» @status:spec/done

> [p35] @fact:mandate-25 «В ходе кампании нужно наш лендинг vibevm-org тоже переделать на Qwik
> чтобы было однообразно и хорошо композировалось» @status:spec/done

> [p36] @fact:mandate-26 «По плану - вначале сделай всю документацию на английском, русский
> перевод будет следующей волной, когда все остальное мы проверили и
> увидели, что оно хорошо работает» @status:spec/done

> [p37] @fact:mandate-27 «Ты можешь так вообще сдвинуть план, чтобы ты вначале написала все
> красивые тексты на английском, и дальше мы полностью переключимся на Опус
> и будем работать в нем над всей разработческой частью?» @status:spec/done

> [p38] @fact:mandate-28 «Еще кажется важная идея: теперь любое действие можно сделать не только
> вручную, но и агентом. Поэтому для сценариев имеет смысл вначале писать,
> каким простым промптом достичь результата (например, создания пакета
> vibevm), и только потом уже разворачивать механику работы без агентов
> целиком вручную (если это вообще нужно! иногда не нужно!). […] Зачастую
> люди будут заходить в документацию просто чтобы узнать "как это работает"
> и "какой промпт запустить чтобы активировать эту механику". […] Это важное
> отличие от документации прошлого, где все делалось только руками.» @status:spec/done

## 4. Принципы {#principles}

[p39] @fact:principles-1 Это законы проекта, которые документация наследует. Здесь они названы, чтобы
решения §5 читались как их следствия, а не как вкусовщина. @status:spec/done

- [p40] @fact:P-01 **P-01 Спеки — IPC, документация — жанр поверх них.** Спека обязательна и
  адресуема; документация объясняет и не требует. Источник: flow
  `two-process-model`, `addressable-specs`, `spec-genres`. @status:spec/done
- @fact:P-02 **P-02 Цитируй, не копируй.** Нормативное значение живёт у одного якоря.
  Страница документации цитирует адрес и никогда не пересказывает число, флаг,
  путь или правило. Источник: `addressable-specs`, PHASE-G-SPEC §3.1. @status:spec/done
- @fact:P-03 **P-03 Односторонняя связь в источнике, двусторонняя в рендере.** Текст спеки
  о документации не знает. Обратные ссылки «объяснено в», «переведено на»,
  «зависят от» вычисляются из индекса и карты и никогда не пишутся руками. @status:spec/done
- @fact:P-04 **P-04 Выводимое не ведётся руками.** Справочник команд, таблицы полей,
  навигация, манифесты страниц, `llms.txt`, плейсхолдеры картинок, превью
  ссылок, обратные связи — генерируются. Источник: `omnichannel`, BACKLOG
  `ENTRY-PREFER-GENERATED`. @status:spec/done
- @fact:P-05 **P-05 Объяснение исполняемо.** Пример, который никто не запускает, — это
  обещание. Каждый пример прогоняется на сборке, один раз, на исходном языке.
  Источник: дисциплина ai-native, `manual-tests`. @status:spec/done
- @fact:P-06 **P-06 Адресуемость применяется к любому тексту, который читает агент.** Один
  юнит — одна мысль; юнит понятен без соседей; инварианты в начале или в конце;
  проверяемое утверждение снаружи fence. Источник: `authoring-rules`. @status:spec/done
- @fact:P-07 **P-07 Токеномика.** Документация никогда не попадает в boot-префикс; она
  читается точечно. Всё, что мутирует, стоит после того, что стабильно.
  Источник: PROP-048. @status:spec/done
- @fact:P-08 **P-08 Логика в библиотеке, поверхности тонкие.** Рендер, манифесты, проверки,
  плейсхолдеры живут в Rust-библиотеке; CLI, MCP, HTTP и локальный сервер — её
  проекции. Источник: `omnichannel`, PROP-000 §21. @status:spec/done
- @fact:P-09 **P-09 Машинные контракты — JTD.** Любой wire между Rust и TypeScript
  описывается JTD-схемой, из которой генерируются типы; wire регистрируется в
  реестре форматов. Источник: PROP-000 §16, PROP-044. @status:spec/done
- @fact:P-10 **P-10 Идентичность пакета — исходник.** В пакет не кладутся артефакты
  сборки. Картинки — исходник. Источник: `tool-design-lessons`, PROP-024 §2.2. @status:spec/done
- @fact:P-11 **P-11 Решения записываются с отвергнутыми вариантами и триггером
  пересмотра.** Источник: `decision-records`. @status:spec/done
- @fact:P-12 **P-12 Объём работ не является доводом.** Источник:
  `vibevm/vibespecs/boot/90-user.xml`, директива владельца 2026-08-09. @status:spec/done
- @fact:P-13 **P-13 Официальность назначается сверху, видимость — по рёбрам.** Кто выше
  в иерархии, тот называет официальное; сайт находит всё, что объявило ребро,
  и показывает как community. Издатель всегда виден. @status:spec/done

- [p41] @fact:P-14 **P-14 Сшивать, не рисовать заново.** Визуальный язык, ридер и хостинг
  берутся из того, что у владельца уже сделано и работает: дизайн-система по
  эталону, лендинг, ридер oleg.guru, runbook инфраструктуры. Новое рисуется
  только там, где источники молчат, и помечается как предварительное до
  дизайн-ревью на живом рендере. Источник: слово владельца 2026-09-10 (§3),
  закон «дешевле проверить, чем породить». @status:spec/done
- @fact:P-15 **P-15 Страница стоит одна.** Каждая страница читается как единственная,
  которую читатель когда-либо откроет: термины введены на месте, объяснение
  полно без спек, спека — подтверждение, не отсылка. Сложность допускается
  только в контейнерах, которые читатель видит заранее. Источник: слово
  владельца 2026-09-10 (§3), `STYLE.md` §1–§2. @status:spec/done
- @fact:P-16 **P-16 Промпт сначала.** Любое действие в VibeVM делается агентом или
  руками, и агент — основной путь. Страница сценария сначала даёт задание
  агенту, затем объясняет, что произойдёт, и только потом — если это вообще
  нужно — ручные шаги. Это отличие от документации прошлого, где всё
  делалось руками. Источник: слово владельца 2026-09-10 (§3), D-30. @status:spec/done

## 5. Решения {#decisions}

### D-01 Документация — это пакет; вводится kind `doc` {#d-01}

[p42] @fact:D-01-DECISION **Решение.** В реестр видов добавляется `doc`. Пакет kind `doc`: @status:spec/done

- [p43] @fact:d-01-2 ОБЯЗАН объявлять хотя бы один предмет в `[[documents]]` (D-04), а также
  `title` и `abstract` (D-20); @status:spec/done
- @fact:d-01-3 НЕ МОЖЕТ объявлять `[boot_snippet]`, `[[mcp_server]]`, `[[binary]]`; @status:spec/done
- @fact:d-01-4 МОЖЕТ объявлять `[[skill]]`, `[translates]`, `[media]` (список переводов
  в источнике не хранится — уточнение 2026-09-11, D-18); @status:spec/done
- @fact:d-01-5 держит страницы под `vibevm/vibespecs/` своего дерева, как любой пакет со
  спеками; документы этого пакета относятся к жанру «документация» по признаку
  kind содержащего пакета; @status:spec/done
- @fact:d-01-6 не устанавливается в проект командой `vibe install` (она отказывает с
  подсказкой), а прогревается в машинный store командой `vibe cache add`;
  локальный читатель и `vibe explain` читают store. @status:spec/done

[p44] @fact:d-01-why **Почему.** Три требования владельца — локальное чтение, скилл, сайт —
удовлетворяются одним механизмом: пакетом. Локальное чтение — это прогрев
store; скилл — это `[[skill]]` в манифесте; сайт — рендер тех же байтов. Отказ
от материализации в `vibedeps/` держит деревья потребителей тонкими и не даёт
агенту наткнуться на туториалы при grep по зависимостям. Kind, а не жанр
документа, задаёт поведение, потому что kind известен инструментам до чтения
файлов: индекс, гейт публикации, `vibe init`, `vibe list`. @status:spec/done

[p45] @fact:d-01-limit **Известное ограничение.** Прогрев store — машинный, не проектный: теммейт,
клонировавший проект, не получит ту же версию документации автоматически.
Скилл называет команду прогрева; проектного объявления «консультируйся с
такой-то документацией» в этой волне нет. @status:spec/done

[p46] @fact:d-01-rejected **Отвергнуто.** @status:spec/done

- [p47] @fact:d-01-10 Документация как бес-kind-овый контент (форма PHASE-G-SPEC): инструменты не
  могли бы отличить её от flow и не могли бы запретить boot-сниппет. @status:spec/done
- @fact:d-01-11 Материализация doc-пакетов в `vibedeps/` по умолчанию: раздувает
  коммитимое дерево каждого потребителя. @status:spec/done
- @fact:d-01-12 Пятый корень раскладки `vibevm/vibedocs/`: ломает закон одного модуля
  раскладки (PROP-052) без выигрыша — адресация, сканеры и пивот уже работают
  над `vibevm/vibespecs/`. @status:spec/done

[p48] @fact:d-01-revisit **Пересмотреть когда.** Появится потребитель, которому документация нужна в
коммитимом дереве проекта или воспроизводимо между машинами команды
(наблюдение: запрос в BACKLOG или отказ `vibe install` в реальном сценарии) —
тогда добавить проектное объявление и режим материализации, не меняя default. @status:spec/done

### D-02 Два уровня документации {#d-02}

[p49] @fact:D-02-DECISION **Решение.** Уровень 0: сайт рендерит любую опубликованную версию любого
пакета из её собственных байтов — манифест как справочная страница, README,
boot-сниппет, спеки с якорями, объявленные скиллы, бинарники и MCP-серверы,
картинки из `[media]`. Уровень 1: расширенная документация — отдельный пакет
kind `doc`, любое количество на предмет. Сайт сшивает уровни на одной странице
пакета. @status:spec/done

[p50] @fact:d-02-why **Почему.** Уровень 0 бесплатен для автора и покрывает весь реестр сразу, как
rustdoc покрывает каждый крейт. Уровень 1 нужен только там, где кто-то хочет
большего, и не заставляет остальных ничего писать. @status:spec/done

[p51] @fact:d-02-rejected **Отвергнуто.** Только уровень 1 — пустой сайт на старте. Только уровень 0 —
нет места туториалам и примерам. @status:spec/done

[p52] @fact:d-02-revisit **Пересмотреть когда.** Никогда в рамках этой волны; уровни ортогональны. @status:spec/done

### D-03 Именование спутника и роль в семействе {#d-03}

[p53] @fact:D-03-DECISION **Решение.** Официальная по умолчанию документация предмета `<группа>/<имя>`
называется `<группа>/<имя>-docs`, в той же группе. Документация ядра —
`org.vibevm.core/vibevm-docs`, спутник координаты хоста `org.vibevm.core/vibevm`.
Официальный по умолчанию перевод документации `<группа>/<имя-документации>`
на язык `<lang>` называется `<группа>/<имя-документации>-<lang>`, где `<lang>`
— тег BCP-47 в нижнем регистре (`ru`, `pt-br`, `zh-hans`). Любая другая
документация или перевод носят любое имя в любой группе: соглашение об имени
нужно только для официальности по умолчанию, а отображаемое имя — это `title`
(D-20). В PROP-028 добавляется роль `-docs` как **спутник**: он не участвует в
унисонном версионировании семейства, ведёт собственную линию версий, а
совместимость с предметом выражает ограничением версии в `[[documents]]`. @status:spec/done

[p54] @fact:d-03-why **Почему.** Суффикс в той же группе — уже действующее правило семейств рядом с
`-lang` и `-mcp`; новой грамматики именования не нужно. Публиковать в группу
предмета может только её владелец, поэтому подделать «официальность» через имя
нельзя. Унисон семейства — закон для «проверенного набора» кода; проза и
переводы меняются в другом ритме. @status:spec/done

[p55] @fact:d-03-rejected **Отвергнуто.** @status:spec/done

- [p56] @fact:d-03-4 Подгруппа `org.vibevm.world.docs/<имя>` (форма DefinitelyTyped): копирует
  чужое пространство имён по договорённости, не несёт версию предмета, для
  сторонних авторов не работает, требует нового закона именования. @status:spec/done
- @fact:d-03-5 Включить `-docs` в унисон семейства: каждая правка документации бампает
  весь код семейства. @status:spec/done
- @fact:d-03-6 Кодировать язык в группе (`org.vibevm.core.ru/…`): та же ошибка подгруппы. @status:spec/done

[p57] @fact:d-03-revisit **Пересмотреть когда.** PROP-028 получит четвёртую кодовую роль, и суффиксов
станет тесно (наблюдение: конфликт стемов в реестре). @status:spec/done

### D-04 Связь документации с предметом {#d-04}

[p58] @fact:D-04-DECISION **Решение.** Связь объявляется в обе стороны полями манифеста, а не именем. @status:spec/done

[p59]
```toml
# в пакете 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"]
```

[p60] @fact:d-04-2 Правила: @status:spec/done

- [p61] @fact:d-04-3 `[[documents]]` обязателен в doc-пакете, может перечислять несколько
  предметов; версия — ограничение semver. @status:spec/done
- @fact:d-04-4 `[documentation]` в предмете называет координаты **без версии**; `primary`
  — не более одной, `official` — сколько угодно. @status:spec/done
- @fact:d-04-5 **Официальная** документация — та, для которой ребра сходятся: предмет
  назвал пакет, пакет объявил предмет. **Community** — есть только ребро от
  документации. Только ребро от предмета — «не опубликовано или ошибка»,
  сайт показывает предупреждение. @status:spec/done
- @fact:d-04-6 **Соглашение по умолчанию:** если предмет не объявил `[documentation]`,
  пакет `<имя>-docs` в той же группе считается официальным и основным.
  Объявленный `[documentation]` заменяет соглашение целиком. @status:spec/done
- @fact:d-04-7 Для версии предмета V сайт показывает документацию тех версий, чьё
  ограничение в `[[documents]]` допускает V, выбирая новейшую. @status:spec/done
- @fact:d-04-8 Прогрев doc-пакета через `vibe cache add` прогревает и его предметы, чтобы
  цитаты `spec://` резолвились офлайн. @status:spec/done
- @fact:d-04-9 Поля связи попадают в запись индекса реестра, чтобы обратные связи
  строились по `primary.jsonl`, а не скачиванием пакетов. @status:spec/done

[p62] @fact:d-04-why **Почему.** Ребро от предмета снимает опасение владельца: три разных
контрибьютора не смогут спорить за «официальность», потому что её назначает
предмет. Указатель без версии — потому что документация почти всегда выходит
позже кода. Соглашение по умолчанию избавляет от переиздания предмета ради
очевидного случая. Прецедент — поле `documentation` в Cargo.toml. @status:spec/done

[p63] @fact:d-04-rejected **Отвергнуто.** @status:spec/done

- [p64] @fact:d-04-12 Capability `docs:<координата>` в `provides`: грамматика capability допускает
  только kebab-case в обеих половинах (`crates/vibe-core/src/capability_ref.rs`),
  координата туда не помещается. @status:spec/done
- @fact:d-04-13 Обычная зависимость `requires` на предмет: зависимость не означает
  «документирую». @status:spec/done
- @fact:d-04-14 Пометка официальности в индексе реестра, вне байтов пакета: второй источник
  правды, исчезающий в локальном режиме и в приватных реестрах. @status:spec/done
- @fact:d-04-15 Только соглашение об имени: ноль гарантий. @status:spec/done

[p65] @fact:d-04-revisit **Пересмотреть когда.** Появится третий тип связи между пакетами такой же
природы, помимо `documents` и `translates` — тогда обобщить в одну таблицу
отношений, не плодя поля. @status:spec/done

### D-05 Kind `app` и граница с `tool` {#d-05}

[p66] @fact:D-05-DECISION **Решение.** Kind `app` допускается в этой же поправке. Граница по механике:
`tool` живёт в проекте и запускается через `vibe bin exec` по lock-файлу; `app`
— самостоятельный продукт со своим профилем деплоя в плоскости build, package,
deploy. Пакет сайта `org.vibevm.doc/web` — kind `app`. @status:spec/done

[p67] @fact:d-05-why **Почему.** Граница по существующей механике проверяема инструментами; граница
«по впечатлению» — нет. @status:spec/done

[p68] @fact:d-05-rejected **Отвергнуто.** Считать сайт `tool`: у сайта нет смысла «выполниться в
проекте по lock-файлу». @status:spec/done

[p69] @fact:d-05-revisit **Пересмотреть когда.** Появится второй `app` с другой механикой запуска. @status:spec/done

### D-06 Сайт `vibevm.org/doc` и схема адресов {#d-06}

[p70] @fact:D-06-DECISION **Решение.** Сайт монтируется под путём `/doc` основного домена. Язык — сегмент
пути после `/doc/`; исходный язык документации не носит префикса. Отображение
адресов детерминированное и без индекса: @status:spec/done

[p71]
```
spec://<группа>/<имя>@<версия>/<документ>#<якорь>
  → https://vibevm.org/doc/<группа>/<имя>/<версия>/<документ>#<якорь>
spec://<группа>/<имя>/<документ>#<якорь>
  → https://vibevm.org/doc/<группа>/<имя>/latest/<документ>#<якорь>
перевод на ru той же страницы
  → https://vibevm.org/doc/ru/<группа>/<имя>/<версия>/<документ>#<якорь>
```

[p72] @fact:d-06-2 Страницы старых версий несут `rel=canonical` на `latest` в пределах своего
языка. Локальный читатель использует ту же схему с другим origin. Адрес
страницы заканчивается слэшем (`…/<документ>/`), проекции лежат рядом как
файлы (`…/<документ>.md`, `…/<документ>.xml`); адрес без слэша получает
редирект 308 и в вебе, и локально (уточнение 2026-09-11 по A0.10:
единственный рабочий режим статического адаптера). @status:spec/done

[p73] @fact:d-06-3 Адрес с номером версии всегда показывает **текущее** содержимое этой версии
в реестре: один номер может быть опубликован десять раз за день, и сайт
показывает последнюю публикацию. Постоянных ссылок на прошлые публикации
нет — их не существует и в реестре (D-27). @status:spec/done

[p74] @fact:d-06-4 Весь домен — один сайт (девятая редакция, 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` — лендинг, не копия
документации. @status:spec/done

[p75] @fact:d-06-why **Почему.** Путь под основным доменом делит его авторитет для SEO. Одна и та
же схема в вебе и локально означает, что ссылка в документации работает в обоих
мирах. Язык в пути, а не в параметре, — так его индексируют и цитируют.
Лендинг уже проиндексирован и несёт дизамбигуацию имени «VibeVM» для
AI-краулеров, поэтому его адреса и корневые файлы сохраняются при переезде на
тот же сайт байт в байт, где это возможно, и проверяются тестом паритета
(D-28). @status:spec/done

[p76] @fact:d-06-rejected **Отвергнуто.** Поддомен `docs.vibevm.org`; язык в query-параметре; язык в
поддомене; два сайта на одном домене — Astro-лендинг плюс Qwik-документация с
контрактом трёх строк между репозиториями (решение третьей редакции, снято
D-28). @status:spec/done

[p77] @fact:d-06-revisit **Пересмотреть когда.** Никогда в рамках волны; смена схемы адресов —
ломающее изменение с редиректами. @status:spec/done

### D-07 Реестровый сайт: источники, лента изменений, сборка по хэшу {#d-07}

[p78] @fact:D-07-DECISION **Решение.** У сайта два источника, оба заданы конфигурацией той же формы, что
`[[registry]]` проекта: @status:spec/done

- [p79] @fact:d-07-2 **реестр пакетов** — один, по умолчанию GitHub-организация `vibespecs`;
  его индекс — лента изменений: сайт опрашивает `repomd.json` и `primary.jsonl`
  (или получает webhook), сравнивает пары «координата, content hash» с
  отрендеренным и пересобирает только изменившиеся; @status:spec/done
- @fact:d-07-3 **репозиторий исходников хоста** — один, по умолчанию `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). @status:spec/done

[p80] @fact:d-07-4 Рендер ключуется хэшем, идемпотентен и кэшируется. Ошибка рендера показывается
как страница версии. Обратные связи — зависимые, «объяснено в», «переведено
на» — берутся из индекса и карт, которые пакеты несут (`vibe specmap`).
Зеркала и вторые реестры — будущее. @status:spec/done

[p81] @fact:d-07-why **Почему.** Так устроен docs.rs над индексом crates.io, а у нас дешевле:
версия заморожена по content hash. Хост — не пакет реестра, и заставлять его
им стать ради сайта было бы ложным обобщением; git-источник уже поддержан. @status:spec/done

[p82] @fact:d-07-rejected **Отвергнуто.** Полная пересборка по расписанию; публикация хоста в реестр
ради рендера; чтение хоста с зеркала. @status:spec/done

[p83] @fact:d-07-revisit **Пересмотреть когда.** Владелец откроет зеркала или второй реестр. @status:spec/done

### D-08 Контент-конвейер на Rust, оболочка на Qwik {#d-08}

[p84] @fact:D-08-DECISION **Решение.** Всё содержательное — в 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-типами. @status:spec/done

[p85] @fact:d-08-why **Почему.** Закон omnichannel. Если бы сайт заново парсил Markdown, якоря и
факты потеряли бы идентичность, а локальный и публичный рендер разошлись бы. @status:spec/done

[p86] @fact:d-08-rejected **Отвергнуто.** Статический генератор на стороне TypeScript, читающий
исходники сам. @status:spec/done

[p87] @fact:d-08-revisit **Пересмотреть когда.** Никогда в рамках волны. @status:spec/done

### D-09 Локальный читатель и режим встраивания {#d-09}

[p88] @fact:D-09-DECISION **Решение.** `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
<origin>`, потому что origin webview меняется от окна к окну; без параметра
`'none'`; CORS-слоя у читателя нет вовсе, а параметры запуска передаются в
страницу неисполняемым блоком `<script type="application/json">` без
`'unsafe-inline'` (уточнение 2026-09-11 по A0.7); публичный сайт во фреймы
не встраивается. @status:spec/done

[p89] @fact:d-09-why **Почему.** Так читается документация проприетарных пакетов; так плагин
VS Code получает интерфейс через iframe; так контент никогда не покидает
машину и не виден другим пользователям машины. @status:spec/done

[p90] @fact:d-09-rejected **Отвергнуто.** Отдельное «локальное приложение» с собственным кодом;
привязка к `0.0.0.0`. @status:spec/done

[p91] @fact:d-09-revisit **Пересмотреть когда.** Владелец откроет работу над плагином VS Code и
захочет нативный интерфейс вместо webview. @status:spec/done

### D-10 Словарь документации в диалекте {#d-10}

[p92] @fact:D-10-DECISION **Решение.** Диалект XML расширяется словарём жанра «документация»: пять
элементов и один атрибут, легальные только в документах doc-пакетов. У каждого
элемента записана проекция в Markdown и свой проверяющий. @status:spec/done

[p93]
| Элемент | Назначение | Проекция в Markdown | Проверяющий |
| --- | --- | --- | --- |
| @fact:d-10-2 `example` с детьми `run`, `expect` (stdout) и необязательным `stderr`; атрибуты `id`, `fixture`, `lang`, `exit` (по умолчанию `0`), `when` @status:spec/done | @fact:d-10-3 команды и ожидаемый вывод; `fixture` называет герметичный проект-фикстуру, которая объявляет правила нормализации и карту «документ `--json` → JTD-схема»; отсутствующий `stderr` — утверждение «stderr пуст» @status:spec/done | @fact:d-10-4 два соседних fence, `sh` и `output` (третий — `stderr`, если есть) @status:spec/done | @fact:d-10-5 раннер `vibe doc check --examples` против собранного бинарника: точное совпадение после объявленной нормализации, шаблонов `match` нет (уточнение 2026-09-11 по A0.12); расхождение — красный @status:spec/done |
| @fact:d-10-6 `example ref="<id>"` @status:spec/done | @fact:d-10-7 в переводе: ссылка на пример источника вместо собственного @status:spec/done | @fact:d-10-8 те же два fence, скопированные из источника при проекции @status:spec/done | @fact:d-10-9 существование `id` в источнике @status:spec/done |
| @fact:d-10-10 `rule ref="spec://…#ЯКОРЬ"` @status:spec/done | @fact:d-10-11 точка вставки правила из спеки; сайт показывает **текущий** текст факта на месте, на языке спеки @status:spec/done | @fact:d-10-12 ссылка на якорь @status:spec/done | @fact:d-10-13 резолвер якорей; ребро `documents` без пина; исчезнувший якорь — ошибка сборки (D-27) @status:spec/done |
| @fact:d-10-14 `derived kind="cli-help / jtd-schema / manifest-field" ref="…"` @status:spec/done | @fact:d-10-15 вставка машинно-выведенного справочника или поля манифеста (например, `abstract`) @status:spec/done | @fact:d-10-16 fence с текстом или таблица @status:spec/done | @fact:d-10-17 генератор при сборке; расхождение — красный, кроме явного `--accept` @status:spec/done |
| @fact:d-10-18 `note kind="note / tip / warning"` @status:spec/done | @fact:d-10-19 врезка @status:spec/done | @fact:d-10-20 цитата с меткой в первой строке @status:spec/done | @fact:d-10-21 схема @status:spec/done |
| @fact:d-10-22 `figure src alt` с ребёнком `caption` @status:spec/done | @fact:d-10-23 рисунок с подписью; файл лежит в дереве пакета как исходник @status:spec/done | @fact:d-10-24 inline-картинка плюс абзац подписи @status:spec/done | @fact:d-10-25 существование файла @status:spec/done |
| @fact:d-10-26 `prompt id` с телом-заданием и детьми `needs`, `outcome`, `assert*` (седьмой элемент, по слову владельца — D-30) @status:spec/done | @fact:d-10-27 задание агенту в голосе пользователя, что агенту нужно, что увидит человек, шелл-команды, обязанные завершиться нулём после работы агента @status:spec/done | @fact:d-10-28 fence `prompt`, список «нужно», абзац «результат», список ассертов; в `llms*.txt` — тот же fence @status:spec/done | @fact:d-10-29 `vibe doc check --prompts`: прогон настроенным агентом в чистом временном каталоге, затем ассерты; не в панели; на странице сценария ассерт обязателен (линтер стиля) @status:spec/done |
| @fact:d-10-30 атрибут `when="os:…"` на `example`, `note` и секциях @status:spec/done | @fact:d-10-31 платформенные варианты @status:spec/done | @fact:d-10-32 подзаголовок с именем платформы @status:spec/done | @fact:d-10-33 существующий словарь условий boot-лейна @status:spec/done |

[p94] @fact:d-10-34 Вкладок нет намеренно, их заменяет `when`. Пошаговые процедуры — упорядоченный
список с `example` внутри. Инлайн-содержимое остаётся Markdown. Вывод команд в
`expect` нормализуется: временные пути, разделители, переводы строк, версии,
ANSI-последовательности. @status:spec/done

[p95] @fact:d-10-35 *(Уточнено 2026-09-11 по находке A0.4 — как словарь ложится в пивот
`vibe-specdoc`, не меняя таблицы выше.)* @status:spec/done

- [p96] @fact:d-10-36 **Словарь — параметр читателя.** `Vocabulary::{Spec, Doc}` (умолчание
  `Spec`), аддитивные `from_xml_with` и `load_spec_text_with`; отображение
  «kind пакета → словарь» делает вызывающая сторона, потому что пивот по
  закону отделимости не знает `PackageKind`. Элемент жанра, встреченный в
  словаре `Spec`, — громкая ошибка с жанровым сообщением, не игнор. @status:spec/done
- @fact:d-10-37 **Дискриминатор против коллизии имён.** Имена `example`, `rule`, `derived`,
  `run` уже живут в корпусе как именованные секции (`<example title="…">`).
  Правило словаря: **блок жанра никогда не несёт `title=`, именованная
  секция несёт его всегда**. Поэтому `<example title="…">` — секция в любом
  словаре, `<example>` без `title` — блок в словаре `Doc`; писатель от
  словаря не зависит. @status:spec/done
- @fact:d-10-38 **`when` — на любом блоке и на секциях**, не только на `example` и `note`:
  в пивоте условие — свойство слота (`BlockNode { when, block }`), а не
  рода блока. Значения — закрытый список условий boot-лейна. @status:spec/done
- @fact:d-10-39 **Проекция в Markdown необратима** для doc-жанра: `md_out` даёт лучшую
  проекцию каждого элемента (колонка таблицы), обратный разбор даёт другой
  IR; это закон жанра, закреплённый тестом, а не дефект. Авторинг
  документации — только XML. @status:spec/done
- @fact:d-10-40 **Адрес `rule` отбрасывает `~rN`**: пин, случайно попавший в атрибут, не
  становится пином ребра (D-18, D-27). @status:spec/done
- @fact:d-10-41 **Тексты `run`, `expect`, тела `prompt` и `assert`** — дословные, как
  `fence`; CDATA в них разрешена явным списком. @status:spec/done
- @fact:d-10-42 **Раннер примеров** (по макету 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` его нет — схемы там вход
  кодогенерации). Нормализация: `<TMP>`, `<HOME>`, `<REPO>`, слэши, CRLF в
  ожидаемых файлах, `vibe <VERSION>` (версии пакетов не трогаются), ANSI,
  сортировка блоков по объявленной форме строки, локальные `replace`
  фикстуры; порядок — замены путей до унификации слэшей, сортировка после
  всех замен. @status:spec/done

[p97] @fact:d-10-limit **Известное ограничение.** README и спеки пакетов других видов не могут нести
проверяемые примеры — словарь включается по kind пакета. Их fence-блоки
рендерятся на уровне 0 как есть, непроверенными. @status:spec/done

[p98] @fact:d-10-why **Почему.** Владелец выбрал вариант А: именованный тэг самоописателен для
агента, а пример проверяем по построению. Это переоткрытие записанного решения
PROP-045 «диалект — ровно подмножество Markdown»; по закону decision-records
переоткрытие обязано назвать сработавший триггер: появился потребитель,
которому нужна конструкция, невыразимая в Markdown. Триггер назван — жанр
документации. @status:spec/done

[p99] @fact:d-10-rejected **Отвергнуто.** Markdown с директивами; соглашения внутри нынешнего диалекта;
элемент вкладок; собственные примеры в переводах. @status:spec/done

[p100] @fact:d-10-revisit **Пересмотреть когда.** Два авторских запроса на конструкцию вне этого набора
или на проверяемые примеры в README обычного пакета, записанных в BACKLOG. @status:spec/done

### D-11 Аудитория `agent` {#d-11}

[p101] @fact:D-11-DECISION **Решение.** В словарь `audience` добавляется значение `agent`. Значения
`user`, `author`, `dev` остаются и соответствуют оператору, автору и
мейнтейнеру из плана DOCS; «новичок» — маршрут внутри `user`. Текст с
`audience="agent"` подчиняется законам агентского текста: бюджет токенов, без
повествования, никогда не в boot-префиксе; сайт отдаёт его в разделе «для
агентов» и первым в `llms.txt`. Аудитории документации не объявляются в
манифесте — выводятся из разметки страниц. @status:spec/done

[p102] @fact:d-11-why **Почему.** PHASE-G-SPEC предсказал дыру: boot-сниппет и инструкции скилла
читает не человек, а сессия. Разметки `audience` в корпусе почти нет, менять
словарь дёшево сейчас. @status:spec/done

[p103] @fact:d-11-rejected **Отвергнуто.** Отдельный жанр вместо аудитории; две оси «кто читает × роль»;
поле аудиторий в манифесте. @status:spec/done

[p104] @fact:d-11-revisit **Пересмотреть когда.** Появится текст, которому не хватает ни одного из
четырёх значений. @status:spec/done

### D-12 Стек и встраивание оболочки {#d-12}

[p105] @fact:D-12-DECISION **Решение.** Сайт — TypeScript под дисциплиной `typescript-ai-native`, Qwik
2.0 beta (next.qwik.dev), версия запинена точно, вместе с версиями Node и
pnpm. Один код оболочки, два адаптера: статический для сервера (пререндер
каждого маршрута, остров вклеен при сборке) и встраиваемый для `vibe`. @status:spec/done

[p106] @fact:d-12-2 **Предложенный механизм встраивания (ждёт подтверждения владельца):** @status:spec/done

1. [p107] @fact:d-12-3 Шаг `cargo xtask embed-doc-shell` собирает web-пакет из исходника
   (pnpm build со встраиваемым адаптером) и складывает результат — шаблон
   маршрута с местом под остров, скрипты, стили — в каталог, который крейт
   `vibe-doc-shell` включает в бинарник через `rust-embed` или `include_dir`
   за фича-флагом `embedded-shell`. @status:spec/done
2. @fact:d-12-4 Релизная сборка `vibe` включает флаг и падает, если оболочки нет.
   Обычная `cargo build` без Node компилируется с запасной оболочкой — голый
   HTML без скриптов. @status:spec/done
3. @fact:d-12-5 **Сборка из исходников без Node** (`vibe self install`, `first-run`) не
   остаётся с голой оболочкой навсегда: при первом `vibe doc serve` читатель
   предлагает скачать оболочку, соответствующую его версии, из релизных
   активов, проверяет content hash по пину и кладёт в store версий VVM; при
   отказе или офлайн работает запасная оболочка. Скачивание только по явному
   согласию, никогда автоматически. @status:spec/done
4. @fact:d-12-6 `vibe doc serve` отдаёт статику оболочки из бинарника или из store версий и
   на каждый запрос вклеивает остров, отрендеренный Rust-конвейером. @status:spec/done
5. @fact:d-12-7 Координата и content hash оболочки пинуются в lock-файле рядом с `vibe`;
   self-check сверяет встроенную оболочку с пином; `vibe doc serve` умеет
   сообщить, что несёт. @status:spec/done
6. @fact:d-12-8 Оболочка собирается с настраиваемым базовым путём и относительными
   адресами; внешних скриптов нет. @status:spec/done
7. @fact:d-12-9 Тест паритета: над одним пакетом прогоняются оба адаптера и сравнивают
   остров байт в байт. @status:spec/done
8. @fact:d-12-10 Шрифты — самохостинг в бандле оболочки, латиница и кириллица отдельными
   подсетами woff2 с `unicode-range` (тот же приём и те же файлы, что у
   лендинга); внешних шрифтовых сервисов нет ни в вебе, ни локально. @status:spec/done

[p108] @fact:d-12-11 *(Уточнено 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-<версия>.zip` без
цели платформы с отдельным манифестом `DOC-SHELL.json` той же формы, что
`DISTRIBUTIONS.json` (в который поле добавлять нельзя: схема закрыта, и
старые `vibe` потеряли бы `self update`). Скачанная оболочка живёт в общем
контент-адресуемом каталоге `~/.vibe/opt/vibevm/doc-shell/<sha256>/`, не
внутри неизменяемого экземпляра; команда — `vibe doc shell install
[--assume-yes]` с согласием по образцу `install`; без оболочки и без сети
читатель работает на запасной оболочке и предупреждает — никаких
обращений в сеть без согласия. @status:spec/done

[p109] @fact:d-12-12 Провайдер сборки Node в плоскости build нужен только серверной сборке; на
машине читателя Node не требуется. Серверная сборка идёт в Docker по образцу
лендинга: стадия сборки на образе Node собирает оболочку и рендерит
страницы, стадия выдачи — стоковый nginx (D-23). @status:spec/done

[p110] @fact:d-12-why **Почему.** Владелец выбрал Qwik 2.0 и Б для локального читателя. Бета
допустима по закону «свежая, но хорошо спроектированная библиотека» с точным
пином и триггером пересмотра. Тождество публичного и локального рендера держится
на общем острове, а не на общем JS-рантайме. Пункт 3 закрывает дыру: иначе
каждый, кто ставит vibe из исходников, получал бы урезанный читатель. @status:spec/done

[p111] @fact:d-12-rejected **Отвергнуто.** @status:spec/done

- [p112] @fact:d-12-15 SSR Qwik локально через встроенный JS-движок (QuickJS). @status:spec/done
- @fact:d-12-16 Собранная оболочка рядом с бинарником в релизном zip вместо встраивания. @status:spec/done
- @fact:d-12-17 Собранные ассеты внутри пакета `org.vibevm.doc/web`: закон P-10. @status:spec/done
- @fact:d-12-18 Требовать Node для сборки vibe из исходников. @status:spec/done

[p113] @fact:d-12-revisit **Пересмотреть когда.** Выход стабильной Qwik 2.0 или ломающее изменение
беты, требующее переписывания. @status:spec/done

### D-13 Контракт SEO и LLM SEO {#d-13}

[p114] @fact:D-13-DECISION **Решение.** Публичный сайт ОБЯЗАН: @status:spec/done

- [p115] @fact:d-13-2 отдавать полностью серверно отрендеренный HTML, без содержимого за
  скриптами; @status:spec/done
- @fact:d-13-3 держать одну каноническую страницу на факт и язык: старые версии несут
  `rel=canonical` на `latest` своего языка; между языками — `hreflang` на
  каждый доступный язык и `x-default` на исходный язык документации; @status:spec/done
- @fact:d-13-4 публиковать sitemap-индекс по пакетам и языкам с `lastmod` из даты
  публикации; @status:spec/done
- @fact:d-13-5 в `robots.txt` явно разрешать краулеров OpenAI, Anthropic, Google, Perplexity
  и других; список имён агентов **проверяется по документации провайдеров при
  каждой сборке**, а не переписывается по памяти; `robots.txt` один на домен
  и генерируется сборкой сайта вместе с корневыми `llms.txt`, `sitemap.xml`,
  `feed.xml` (D-06, D-28); файл держится ASCII-only, как у прежнего лендинга;
  домен не за Cloudflare (D-23), поэтому снимать там блокировку AI-краулеров
  не нужно; @status:spec/done
- @fact:d-13-6 отдавать все текстовые форматы с `charset=utf-8` (`charset_types` в
  контейнерном nginx, как у лендинга) и все редиректы относительными
  (`absolute_redirect off; port_in_redirect off;`) — TLS терминируется вне
  контейнера, и абсолютный `Location: http://…` роняет строгих фетчеров в
  петлю редиректов, что уже случалось с фетчером Claude на oleg.guru; @status:spec/done
- @fact:d-13-7 после каждого деплоя с изменением страниц отправлять список изменённых URL
  в IndexNow ключом лендинга (ключ-файл в корне домена уже есть); @status:spec/done
- @fact:d-13-8 нести JSON-LD (`TechArticle` с `headline`, `abstract`, `author`,
  `inLanguage`, `keywords`, `datePublished`, `image`; `SoftwareApplication`;
  `BreadcrumbList`; `FAQPage` где уместно), Open Graph и Twitter Card
  `summary_large_image` с превью из `[media].preview` или сгенерированной
  карточкой (D-20); @status:spec/done
- @fact:d-13-9 публиковать `llms.txt` (индекс с однострочными резюме) и `llms-full.txt`
  для базового корпуса, плюс `llms-small.txt` и `llms-medium.txt` под бюджет
  токенов, все — выведенные из того же манифеста, что и навигация, а полный
  корпус упорядочен по закону слоёв; те же файлы — на каждый язык и на каждый
  пакет; реестровый `llms.txt` — каталог документаций в стиле arXiv: заголовок,
  звёздочка официальности, издатель, язык, аудитории, аннотация, ссылка; @status:spec/done
- @fact:d-13-10 отдавать каждую страницу как чистый Markdown по адресу с суффиксом `.md` и
  как сырой XML по адресу с суффиксом `.xml`; @status:spec/done
- @fact:d-13-11 отдавать JSON-манифест страниц со статусами официальности, языками,
  аудиториями, жанрами, якорями и резюме, эндпоинт-резолвер `spec://` и,
  опционально, MCP-сервер сайта; @status:spec/done
- @fact:d-13-12 держать плотный внутренний граф ссылок: зависимые, «объяснено в»,
  «переведено на», спека ↔ документация; @status:spec/done
- @fact:d-13-13 строить страницы по одному шаблону: ответ первой фразой, один концепт на
  страницу, глоссарий с каноническими терминами, FAQ в форме вопросов, примеры
  с ожидаемым выводом; страницы сценариев — промпт сначала, механика потом,
  ручные шаги только когда они нужны (D-30). @status:spec/done

[p116] @fact:d-13-14 Локальный режим ничего из этого не публикует и ни к чему внешнему не
обращается. @status:spec/done

[p117] @fact:d-13-why **Почему.** Слово владельца: максимальное SEO включая LLM SEO. Каждый пункт
либо стандарт, либо следствие закона проекта. @status:spec/done

[p118] @fact:d-13-rejected **Отвергнуто.** Блокировать AI-краулеров; ручные описания страниц; превью
ссылки обрезкой баннера; собственный `robots.txt` под `/doc/`. @status:spec/done

[p119] @fact:d-13-revisit **Пересмотреть когда.** Появится новый стандарт машинного индекса. @status:spec/done

### D-14 Документация наблюдаема, проверяема и покрывает обязательства {#d-14}

[p120] @fact:D-14-DECISION **Решение.** 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 не хватило. Навигация сайта
выводится из манифеста страниц, а не из этого отчёта. @status:spec/done

[p121] @fact:d-14-why **Почему.** Односторонняя связь без обратного обнаружения — это тихое гниение.
Покрытие, измеренное гейтом, отвечает на вопрос «всё ли рассказано», на который
навигация не отвечает. @status:spec/done

[p122] @fact:d-14-rejected **Отвергнуто.** Ручной список страниц как источник; оглавление из отчёта
обязательств; судейство фактов документации. @status:spec/done

[p123] @fact:d-14-revisit **Пересмотреть когда.** Никогда; это следствие P-02 и P-04. @status:spec/done

### D-15 Судьба существующей `docs/` {#d-15}

[p124] @fact:D-15-DECISION **Решение.** `docs/` переезжает в `docs-legacy/` одним коммитом-переносом
без иных изменений. Новая документация пишется против неё: факт, который был
там и отсутствует в новой, — либо снят с записанной причиной, либо
регрессия. `README.md`, `DEV-GUIDE.md`, `RUNTIME-GUIDE.md` остаются на месте и
обновляются по закону same-commit. @status:spec/done

[p125] @fact:d-15-why **Почему.** Так постановил PHASE-G-SPEC §2: архив, не удаление. @status:spec/done

[p126] @fact:d-15-rejected **Отвергнуто.** Удалить `docs/`; переписать на месте. @status:spec/done

[p127] @fact:d-15-revisit **Пересмотреть когда.** Регрессионный список закрыт и владелец подтвердил. @status:spec/done

### D-16 Канал хоста {#d-16}

[p128] @fact:D-16-DECISION **Решение.** Сам vibevm рендерится из одного настроенного репозитория
исходников, по умолчанию `github.com/vibevm/vibevm`, **по текущему
состоянию ветки `main`** — и только по нему. Тегов релизов у хоста нет
(единственный тег — `pre-cultural-refactor`, не релизный; журнал J-014);
релиз по факту — это то, что сейчас в `main` и что `vibe self install
latest` собирает из исходников. Сайт опрашивает ветку, при изменении
пересобирает рендер с дебаунсом (конфигурация A5.1: не чаще раза в час) и
хранит один текущий рендер плюс предыдущий до успешного завершения нового.
Никакой истории состояний: её нет и в самом репозитории. Зеркала и
дополнительные репозитории — будущее. **Вопрос владельцу переформулирован**
(§10 п. 2): только частота опроса. @status:spec/done

[p129] @fact:d-16-2 *(Уточнено 2026-09-11 по находке A0.20.)* Корень хоста — `[project]`, не
`[package]` (B-031 дал ему полное имя `org.vibevm.core/vibevm`, но не сделал
публикуемым пакетом), поэтому «хост как пакет» не выбирается ни через
git-источник, ни через store. Канал хоста — **выкладка на диске**: деплой
делает `git checkout main && git pull` в каталоге рендерера, и рендерер
читает оттуда сам хост как проект (уровень 0 — `README.md`, `vibevm/vibespecs/**`,
boot-сниппет, манифест) и документацию ядра как in-tree пакет через
project-local реестр (`vibevm/vibepacks`). Клон в кэш пакетов и `vibe cache
add` на сервере не нужны. Перерендер — когда содержимое выкладки изменилось;
сравнение по внутреннему хэшу содержимого, который наружу не показывается
(D-27): у in-tree пакетов номер версии стоит на месте, а содержимое идёт. @status:spec/done

[p130] @fact:d-16-why **Почему.** Слово владельца: «тот репозиторий, который указали в настройках,
по умолчанию гитхаб». Первая редакция этого вижена прочла это как «реестр»;
вторая и третья — как «по тегам»; шестая пыталась хранить состояния по хэшу
дерева; седьмая, по слову владельца, оставила только текущее: история
переписывается намеренно, и документация не должна притворяться, что помнит
её. @status:spec/done

[p131] @fact:d-16-rejected **Отвергнуто.** Публикация хоста в реестр ради рендера; зеркала; рендер по
тегам (их нет); хранение состояний по хэшу дерева или коммита (фича,
требующая истории — D-27). @status:spec/done

[p132] @fact:d-16-revisit **Пересмотреть когда.** Владелец откроет зеркала. @status:spec/done

### D-17 Куда ложится норма {#d-17}

[p133] @fact:D-17-DECISION **Решение.** @status:spec/done

- [p134] @fact:d-17-2 Поправка реестра видов в `VIBEVM-SPEC.md` §4.1 — рукой владельца; агент
  готовит точный дифф. @status:spec/done
- @fact:d-17-3 `PROP-000`: инвариант словаря и набор видов. @status:spec/done
- @fact:d-17-4 Новая спека `PROP-057` в `vibevm/vibespecs/common/`: семантика kind `doc` и
  `app`, конвенция спутника, поля связи, локализация, обнаруживаемость и
  иерархия, карточка, контракт сайта, контракт SEO, локальный режим,
  реестровый билдер. С полными записями решений. @status:spec/done
- @fact:d-17-5 Поправки: `PROP-028` (роль `-docs`), `PROP-045` (словарь жанра
  документации), `PROP-043` (значение `agent`), `PROP-003` (переиспользование
  тегов и цепочки отката для пакетов-переводов, без sidecar). @status:spec/done
- @fact:d-17-6 Строка «документация» в таблице жанров хоста. @status:spec/done
- @fact:d-17-7 `PHASE-G-SPEC.md` получает пометку «замещён PROP-057». @status:spec/done
- @fact:d-17-8 План стюарда: маршрут `DOCS` расширяется узлами по фазам плана. @status:spec/done
- @fact:d-17-9 Этот вижен импортируется как design-документ хоста **в XML-диалекте**, по
  правилу корпуса, и связывается с PROP-057 двусторонней ссылкой. @status:spec/done

[p135] @fact:d-17-why **Почему.** Закон two-process: знание, оставшееся только в разговоре, не
переживает сессию. @status:spec/done

### D-18 Локализация: один пакет на язык {#d-18}

[p136] @fact:D-18-DECISION **Решение.** Перевод документации — отдельный пакет kind `doc`: @status:spec/done

[p137]
```toml
[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"
```

[p138] @fact:d-18-2 *(Уточнено 2026-09-11 по находкам A0.18 и A0.21: язык doc-пакета — уже
существующее поле `[i18n].canonical` (по умолчанию `en`), а не новое поле
`lang`; один факт — один якорь. Обратная таблица `[translations]` в
манифесте источника **не хранится**: какие переводы есть у документации,
сайт и локальный читатель вычисляют из рёбер `translates` при каждом
рендере — так же, как официальность из `documents` и `documentation`
(R-23). `[i18n].available` у doc-пакета пуст по построению.)* @status:spec/done

[p139] @fact:d-18-3 Правила: @status:spec/done

- [p140] @fact:d-18-4 у источника `[i18n].canonical` по умолчанию `en`, как канонический язык
  PROP-003; sidecar-раскладка §2.7.1 к doc-пакетам не применяется; @status:spec/done
- @fact:d-18-5 перевод **зеркалит дерево источника файл в файл**: те же пути, те же якоря,
  те же идентификаторы фактов; добавлять или удалять якоря нельзя; @status:spec/done
- @fact:d-18-6 перевод **не хранит ни ревизии, ни хэша** исходной страницы (D-27:
  сравнение «с тех пор» требует истории); `vibe doc check --translations`
  проверяет только структуру — те же пути, якоря, число и типы блоков;
  отстала ли адаптация по смыслу — вопрос к человеку на полной сверке
  (D-26); сайт показывает дату последнего чтения адаптации из
  `reviews.toml`; @status:spec/done
- @fact:d-18-7 перевод не авторит примеры: только `example ref` на пример источника;
  вывод команд проверяется один раз, на источнике; @status:spec/done
- @fact:d-18-8 `documents` перевода обязан совпадать с `documents` источника; `vibe check`
  это проверяет; @status:spec/done
- @fact:d-18-9 **официальный** перевод — тот, что объявил `translates` на источник и
  издан **той же группой**, что источник, под именем
  `<имя-документации>-<lang>`; всё остальное — перевод сообщества (D-19);
  отдельного списка переводов в источнике нет (уточнение 2026-09-11 выше); @status:spec/done
- @fact:d-18-10 сайт: язык в пути (D-06), селектор на каждой странице, откат на исходный
  язык постранично с пометкой, никогда не 404; `hreflang` и `x-default`;
  `llms.txt` на язык; @status:spec/done
- @fact:d-18-11 локальный читатель: то же из store; предпочтение — `[i18n].preferred`
  проекта или флаг; @status:spec/done
- @fact:d-18-12 нормативные спеки остаются на языке спеки: `rule` показывает текст правила
  на языке источника с пометкой; перевод нормативного текста в эту волну не
  входит. @status:spec/done

[p141] @fact:d-18-why **Почему.** Цели владельца — разные авторы, разные ритмы, официальность по
языку — это цели владения, а единица владения в проекте — пакет. Правила
зеркалирования и ссылочных примеров берут у sidecar-модели то, что делало её
безопасной: совпадающие якоря, постраничный откат, один источник вывода
команд. @status:spec/done

[p142] @fact:d-18-rejected **Отвергнуто.** @status:spec/done

- [p143] @fact:d-18-15 Sidecar-файлы внутри одного пакета (PROP-003 как есть): пакет растёт с
  каждым языком, переводчику нужны права на пакет, любая правка перевода
  бампает всю документацию, проверка покрытия не видит устаревания. @status:spec/done
- @fact:d-18-16 Гибрид «официальные как sidecar, сторонние как пакеты»: два механизма. @status:spec/done
- @fact:d-18-17 Перевод, объявляемый предметом: переиздание предмета на каждый язык. @status:spec/done
- @fact:d-18-18 Собственные примеры в переводе: расхождение выводов по языкам. @status:spec/done

[p144] @fact:d-18-revisit **Пересмотреть когда.** Появится запрос на перевод нормативных спек
(наблюдение: пакет-перевод, пытающийся зеркалить дерево спек, а не
документации). @status:spec/done

### D-19 Обнаруживаемость и иерархия официального и сообщества {#d-19}

[p145] @fact:D-19-DECISION **Решение.** Сайт находит документацию и переводы **по рёбрам**: все пакеты
kind `doc` из индекса, у которых `documents` или `translates` указывают на
данную координату, из любой группы. Звёздочка появляется только там, где
ребро подтверждено сверху. @status:spec/done

[p146]
| Уровень | Статус | Кто подтверждает |
| --- | --- | --- |
| @fact:d-19-2 Документация предмета @status:spec/done | @fact:d-19-3 ★ основная · ★ официальная · community @status:spec/done | @fact:d-19-4 предмет через `[documentation]` или соглашение `<имя>-docs` в своей группе @status:spec/done |
| @fact:d-19-5 Перевод документации @status:spec/done | @fact:d-19-6 ★ официальный · community @status:spec/done | @fact:d-19-7 исходная документация через `[translations]` или соглашение `<имя-документации>-<lang>` в своей группе @status:spec/done |

[p147] @fact:d-19-8 Четыре сочетания видимы все: официальная документация с официальным
переводом; официальная с переводом сообщества; документация сообщества с
переводом, который её автор назвал официальным; документация сообщества с
переводом сообщества. Звёздочка у перевода означает «назван автором этой
документации», а не «одобрен предметом»; подсказка говорит это словами. @status:spec/done

[p148] @fact:d-19-9 Правила интерфейса: @status:spec/done

- [p149] @fact:d-19-10 три сигнала согласованы: звёздочка, подпись «официальная» или «сообщество»,
  порядок «основная, официальные, community»; ни один не противоречит другим; @status:spec/done
- @fact:d-19-11 издатель всегда виден: группа пакета печатается рядом с названием; @status:spec/done
- @fact:d-19-12 селектор языка показывает все найденные языки: сначала со звёздочкой, потом
  community, у каждого группа издателя и отставание; @status:spec/done
- @fact:d-19-13 полки на странице пакета повторяют схему для документации; внутри полки —
  те же значки для переводов. @status:spec/done

[p150] @fact:d-19-14 Машинное зеркало: манифест страниц несёт статус на обоих уровнях, `primary`,
`official` или `community`, и язык; `llms.txt` помечает официальные элементы,
чтобы агент предпочитал их, но видел и остальные. Индекс несёт поля связи,
`lang`, `title`, `abstract`. Модерации нет: полка community показывает всё,
что нашлось; защита от подмены — издатель на виду; списки исключений —
отложенное. @status:spec/done

[p151] @fact:d-19-why **Почему.** Слово владельца: неофициальное должно находиться и показываться
как сообщество, а иерархия — быть наглядной. Рёбра дают полноту, назначение
сверху — однозначность, звёздочки и порядок — наглядность. @status:spec/done

[p152] @fact:d-19-rejected **Отвергнуто.** Показывать только официальное; пометки официальности в
индексе; модерация в этой волне. @status:spec/done

[p153] @fact:d-19-revisit **Пересмотреть когда.** Первый случай злоупотребления полкой community
(наблюдение: жалоба владельцу пакета). @status:spec/done

### D-20 Карточка документации: заголовок, аннотация, картинки {#d-20}

[p154] @fact:D-20-DECISION **Решение.** Манифест пакета получает поля карточки; для kind `doc` `title` и
`abstract` обязательны, для остальных видов необязательны, `[media]`
необязателен для всех: @status:spec/done

[p155]
```toml
[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 МБ
```

[p156] @fact:d-20-2 Правила: @status:spec/done

- [p157] @fact:d-20-3 `title` — отображаемое имя в полках, селекторе, заголовке страницы и
  каталоге; уникальность не проверяется, идентичность остаётся координатой,
  издатель виден рядом; @status:spec/done
- @fact:d-20-4 `description` остаётся однострочным подзаголовком для списков и
  мета-описания страницы; `abstract` отвечает на четыре вопроса — что
  покрывает, для кого, что предполагает известным, чего не покрывает — и
  ограничен примерно тысячей знаков; входная страница не пересказывает
  аннотацию, а вставляет её через `derived kind="manifest-field"`; @status:spec/done
- @fact:d-20-5 аудитории и языки в карточке не объявляются — выводятся из разметки
  страниц и связей `translates`; @status:spec/done
- @fact:d-20-6 картинки — исходник в дереве пакета; форматы PNG, JPEG, WebP; SVG в этой
  волне запрещён, потому что умеет нести скрипты, а локальный читатель отдаёт
  картинки проприетарных пакетов как есть; `vibe check` и гейт публикации
  проверяют существование, сигнатуру формата, пропорции и размер; лимиты малы
  намеренно — пакеты обычных видов материализуются и коммитятся у
  потребителей; @status:spec/done
- @fact:d-20-7 `icon` — в шапке страницы пакета и на карточках полок; `banner` — шапка
  страницы пакета; `preview` — `og:image`, `twitter:image` с карточкой
  `summary_large_image`, `image` в JSON-LD; @status:spec/done
- @fact:d-20-8 **плейсхолдеры генерируются**, не хранятся: градиент или узор для баннера и
  глиф для иконки вычисляются из хэша координаты, так что пакет выглядит
  одинаково на сайте и в локальном читателе, а разные пакеты различимы; глиф
  зависит от вида — книга для `doc`, свои знаки для остальных видов;
  встроенный SVG при рендере, без файлов и без сети; @status:spec/done
- @fact:d-20-9 превью при отсутствии `preview` собирается при сборке сайта из
  плейсхолдера, иконки и заголовка — не обрезкой баннера; в первой волне
  превью одно на пакет, карточки с заголовком отдельной страницы — отложенное; @status:spec/done
- @fact:d-20-10 перевод наследует картинки источника, если не объявил свои; @status:spec/done
- @fact:d-20-11 сборка сайта копирует картинки под хэшированными именами для кэширования и
  никогда не подгружает их с чужих адресов; alt-текст — из `title`. @status:spec/done

[p158] @fact:d-20-why **Почему.** Слово владельца: карточка как у arXiv и как у профиля в
Twitter. Заголовок и аннотация в манифесте — потому что индекс и полка должны
показывать их без скачивания пакета; отдельное превью — потому что пропорции
баннера и превью ссылки несовместимы; генерируемые плейсхолдеры — закон P-04. @status:spec/done

[p159] @fact:d-20-rejected **Отвергнуто.** @status:spec/done

- [p160] @fact:d-20-14 Показывать `description` вместо заголовка; брать заголовок из входной
  страницы; аннотация как раздел страницы с копией в индексе. @status:spec/done
- @fact:d-20-15 Статический набор плейсхолдеров. @status:spec/done
- @fact:d-20-16 Превью обрезкой баннера; имя поля `og_image` (картинку читают не только
  Open Graph). @status:spec/done
- @fact:d-20-17 SVG в этой волне. @status:spec/done

[p161] @fact:d-20-revisit **Пересмотреть когда.** Запрос на SVG-иконки с санацией; запрос на
многоязычные заголовки в одном пакете (наблюдение: BACKLOG). @status:spec/done

### D-21 Визуальный язык и дизайн-система — предварительно {#d-21}

[p162] @fact:d-21-1 **Статус.** Рабочая гипотеза, чтобы разработка не ждала дизайнера. Решение
пересматривается на **дизайн-ревью** после первого живого рендера
документации ядра (план, A4.14): владелец смотрит полку, страницу пакета и
страницу документации в обеих темах и решает про шрифты, плотность и тему по
умолчанию. До ревью всё ниже — норма для разработки, после — правится на
месте с датой. @status:spec/done

[p163] @fact:D-21-DECISION **Решение.** Одна дизайн-система в двух темах, сшитая из двух существующих
источников владельца (§2.5); оба построены на одной терракоте. @status:spec/done

- [p164] @fact:d-21-3 **Светлая тема — токены тёплой дизайн-системы** (`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`. @status:spec/done
- @fact:d-21-4 **Тёмная тема — токены лендинга** (`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» фона. @status:spec/done
- @fact:d-21-5 **Один акцент на обе темы.** `--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`; сырые имена цветов остаются только в файле палитры
  как источник карт. Компонент никогда не пишет цвет литералом. @status:spec/done
- @fact:d-21-6 **Типографика.** 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). @status:spec/done
- @fact:d-21-7 **Компоненты, переносимые из дизайн-системы** (по именам в `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»). @status:spec/done
- @fact:d-21-8 **Образ страниц из скриншотов** (образ, не копия): `/docs` — шапка,
  поиск, вкладки, серифный hero с одной строкой подзаголовка и полем
  «спросить», сетка карточек 3×2; статья — центрированная шапка с тегами и
  датой, узкая колонка, сноски, «Related»; страница продукта — липкое
  оглавление слева 190px, столбец 660px, кнопка действия под оглавлением. @status:spec/done
- @fact:d-21-9 **Тема по умолчанию** — системная (`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`
  источника; отдельного фона страниц документации нет. @status:spec/done
- @fact:d-21-10 **Движение** только осмысленное (стрелка кнопки, подсветка оглавления,
  дорисовка графа на лендинге); `prefers-reduced-motion` отключает всё. @status:spec/done
- @fact:d-21-11 **Локальный читатель** — те же токены и компоненты; отличия только в
  шапке (нет поиска по реестру, есть «источник: store / lock / реестр»). @status:spec/done

[p165] @fact:d-21-why **Почему.** У владельца уже есть две согласованные вещи: дизайн-система по
эталону «документация, которую любят», и развёрнутый лендинг с тёмной тёплой
палитрой на той же терракоте. Сшить их дешевле и честнее, чем рисовать
третью систему (P-14). Семантические токены — потому что две темы и
embedded-режим иначе размножат CSS. Выбор шрифтов лендинга — потому что они
уже самохостятся с кириллицей и держат бренд между корнем домена и `/doc/`. @status:spec/done

[p166] @fact:d-21-rejected **Отвергнуто.** Палитра oleg.guru (холодная тёмная с бирюзой и розовым — не
язык бренда; берутся её фичи, не цвета); Tailwind где бы то ни было на сайте — лендинг тоже переезжает на токены
(D-28); подключение `anthropic.css` целиком; внешние шрифтовые сервисы;
ИИ-чат на сайте. @status:spec/done

[p167] @fact:d-21-revisit **Пересмотреть когда.** Дизайн-ревью A4.14; появление дизайнера; A/B
шрифтов. @status:spec/done

### D-22 Ридер: фичи страницы документации {#d-22}

[p168] @fact:D-22-DECISION **Решение.** Страница документации (уровень 1; README и спеки уровня 0 — в
том же ридере) повторяет поведение ридера статей oleg.guru
(`scripts/templates/article.html.tpl`, `podcast-episode.html.tpl`,
`public/js/{theme,lang-fallback,lightbox}.js`) с поправками на документацию.
Десять фич: @status:spec/done

1. [p169] @fact:d-22-2 **Нумерованные абзацы** (якоря «по Лебедеву»). Каждый блок пивота —
   абзац, заголовок, список, таблица, 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`, без версий и хэшей. @status:spec/done
2. @fact:d-22-3 **Переключение перевода с сохранением места.** Селектор языка (D-18, D-19)
   ведёт на ту же страницу другого языка **с тем же фрагментом** (`#pNN` или
   `#id`). Это возможно, потому что перевод зеркалит блоки один к одному: R-18
   расширяется с якорей на блоки, `vibe doc check --translations` сверяет число
   и типы блоков. Нет страницы на выбранном языке — сайт отдаёт исходный язык
   под адресом выбранного как статически материализованный фоллбэк (`<html
   lang>` исходного, `rel=canonical` на исходную страницу, `noindex`),
   показывает двуязычную плашку «страница пока только на …» один раз за сессию
   (`sessionStorage`) и переписывает внутренние ссылки, чтобы навигация
   осталась в выбранном языке (приём `lang-fallback.js`). Выбранный язык
   запоминается cookie `lang` на 365 дней — тем же именем, что у лендинга,
   поэтому корень домена и `/doc/` помнят один выбор. @status:spec/done
3. @fact:d-22-4 **Настройки чтения.** Шестерёнка справа сверху раскрывает панель: тема
   (тёмная / светлая / системная), размер шрифта `A−`/`A+` по шагам 80, 90,
   100, 110, 120, 135, 150 %, ширина колонки `W−`/`W+` по шагам 740, 900,
   1100, 1400 px (только десктоп), якоря вкл/выкл, «Сброс». Значения — в
   `localStorage` (в embedded-режиме — у хоста через postMessage). Защита от
   FOUC: инлайн-скрипт в `<head>` ставит `data-theme` до загрузки CSS. @status:spec/done
4. @fact:d-22-5 **Режим чтения.** Когда оглавление или первый заголовок ушёл выше 40 %
   высоты окна, у шестерёнки появляются быстрые кнопки: оглавление, якоря,
   `A−`/`A+`, «вернуться» — без раскрытия панели. @status:spec/done
5. @fact:d-22-6 **Возврат к месту чтения.** Раз в секунду при прокрутке запоминается
   ближайший якорь над верхом экрана (`localStorage`, ключ
   `reading-pos:<путь>`); при следующем открытии страницы читатель **не**
   скроллится сам — появляется кнопка «вернуться к месту», которая исчезает,
   как только он сам прокрутил дальше первого заголовка. Кнопка «оглавление»
   сохраняет текущее место и включает ту же кнопку возврата; выбор пункта
   оглавления сбрасывает её. `history.scrollRestoration = 'manual'`. @status:spec/done
6. @fact:d-22-7 **Оглавление.** На десктопе — липкое слева (190px, подсветка активного
   пункта), на узких экранах — сворачиваемый `<details>` над текстом;
   вложенность до h3; у страницы с `rule` — блок «правила, на которые ссылается
   страница» (адреса `spec://`). @status:spec/done
7. @fact:d-22-8 **Сноски** с обратными ссылками; **таблицы** в прокручиваемом контейнере с
   кнопкой «развернуть» в overlay, зебра, первый столбец жирный; **картинки**
   — лайтбокс (overlay `position:fixed; inset:0`, без `backdrop-filter`,
   кнопка закрытия под контентом — приёмы `lightbox.js`); **код** — кнопка
   копирования и подпись языка; `example` показывает ожидаемый вывод под
   кодом; `derived` помечен «сгенерировано из …» с адресом источника. @status:spec/done
8. @fact:d-22-9 **Мета-блок** страницы: издатель, версия пакета и признак `latest`, дата
   публикации, у перевода — какой пакет он адаптирует, аудитории, время
   чтения (200 слов/мин для ru, 250 для en — как у oleg.guru), ссылки `.md`,
   `.xml`, «для агента». @status:spec/done
9. @fact:d-22-10 **Кнопка «для агента»** (`.fab`): показывает адрес `spec://…#pNN` текущего
   места, ссылки на `.md`, `.xml`, `llms.txt` пакета; копирует одним кликом. @status:spec/done
10. @fact:d-22-11 **Печать**: стиль печати без панелей, с номерами абзацев и адресами
    ссылок в сносках. @status:spec/done

[p170] @fact:d-22-why **Почему.** Слово владельца: ридер oleg.guru «стоит перенести». Нумерация на
сборке, а не на клиенте, — потому что клиентские номера не попадают в
Markdown, XML и llms-корпус, а нам нужно, чтобы человек и агент цитировали
одно место; позиционные номера — не якоря в смысле R-06, а нумерация
текущего текста, поэтому закон неизменяемых якорей на них не распространяется. Зеркало блоков 1:1
— единственный способ сохранить место при смене языка. Отказ от авто-скролла
— из опыта oleg.guru: он ломает deep-links и раздражает. @status:spec/done

[p171] @fact:d-22-rejected **Отвергнуто.** Нумерация на клиенте; авто-скролл к сохранённому месту;
cookie для настроек чтения (у нас одна оболочка, `localStorage` достаточно;
cookie только для `lang`, потому что его читает и лендинг); классы Tailwind в
острове; модалка согласия. @status:spec/done

[p172] @fact:d-22-revisit **Пересмотреть когда.** Дизайн-ревью A4.14; запрос на аннотации и подсветку
выделений (отложенное). @status:spec/done

### D-23 Хостинг и деплой: один сайт на том же сервере {#d-23}

[p173] @fact:D-23-DECISION **Решение.** Сайт — лендинг и документация вместе (D-28) — живёт на том же
сервере и домене, где сегодня лендинг, по существующему runbook «поднять
сайт» из приватного документа инфраструктуры
`C:\Users\olegc\git\infra\main\main.md`. **Содержимое этого документа —
адреса, порты, схема трафика, VPN — в вижен, план и репозиторий не
переносится**; здесь только форма решения. @status:spec/done

- [p174] @fact:d-23-2 **Два контейнера вместо нынешнего одного.** Выдача: контейнер сайта —
  стоковый `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 <сервис выдачи>`); таймер или
  вебхук индекса — вторая волна. @status:spec/done
- @fact:d-23-3 **Переключение.** До готовности нового сайта домен обслуживает нынешний
  Astro-лендинг из `vibevm-org`. Переключение — один шаг: контейнер выдачи
  нового сайта занимает место контейнера лендинга — тот же compose-сервис и
  тот же порт, чтобы хостовый nginx не трогать, — после зелёного теста
  паритета лендинга (план, A4.17) и локальной пробы полного стека. Откат —
  вернуть прежний сервис. Ни переключение, ни откат не касаются хостового
  nginx, портов, сертификатов, compose-блоков соседей и VPN: это правило
  самого runbook и граница директивы о VPN. @status:spec/done
- @fact:d-23-4 **Контейнерный 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`. @status:spec/done
- @fact:d-23-5 **Деплой** — модель «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. @status:spec/done
- @fact:d-23-6 **Кто что коммитит.** `Dockerfile` рендерера и `docker/nginx.conf` — в
  пакете `org.vibevm.doc/web` (конфигурация сборки, не артефакт — R-10
  соблюдён); compose-сервисы, деплой-скрипт, смена чекаута и запись в
  `main.md` — на сервере, рукой владельца или под его явным присмотром; в
  `vibevm-org` — только финальный коммит снятия с эксплуатации после
  переключения (план, A5.8; слово владельца, §10 п. 15). @status:spec/done
- @fact:d-23-7 DNS, TLS, порты домена уже есть; ничего нового не выпускается; домен не за
  Cloudflare. @status:spec/done

[p175] @fact:d-23-why **Почему.** Хостинг у владельца есть, задокументирован и работает; один сайт
на домене (D-28) означает один контейнер выдачи и никакого прокси между
контейнерами; рендерер отдельным контейнером — потому что `vibe` (Rust) и
Qwik (Node) не должны жить в образе выдачи; занятие места контейнера
лендинга тем же сервисом и портом — единственный способ переключить домен,
не касаясь хостового nginx, от которого зависит VPN. @status:spec/done

[p176] @fact:d-23-rejected **Отвергнуто.** Отдельный домен или поддомен (D-06); сторонний статический
хостинг (авторитет домена, готовая инфраструктура); правки хостового nginx;
два сайта на домене с прокси `/doc/` между контейнерами (третья редакция,
снято D-28); сборка образа на дев-машине с пушем в реестр образов; чекаут
`vibevm-org` как источник сайта после переключения. @status:spec/done

[p177] @fact:d-23-revisit **Пересмотреть когда.** Переезд на другой хостинг или CDN; второй сервер или
зеркало. @status:spec/done

### D-24 Аналитика: тот же first-party тег, что у лендинга {#d-24}

[p178] @fact:D-24-DECISION **Решение.** На публичных страницах документации стоит тот же
самохостинговый тег Umami, что и на лендинге — `<script defer src="/u/s.js"
data-website-id="…" data-host-url="https://vibevm.org">` с website-id домена
— тем же, что стоял на Astro-лендинге (значение переносится из
`BaseLayout.astro` в конфигурацию сайта, план A5.1). Пути `/u/s.js` и `/u/e`
обслуживает домен, сайт их не трогает. Ничего сверх: ни GA, ни
Метрики, ни модалки согласия — Umami без cookie и без персональных данных.
Локальный читатель и embedded-режим — без тега (R-09). @status:spec/done

[p179] @fact:d-24-why **Почему.** Вторая редакция относила аналитику к не-целям; но тег уже стоит
на домене, стоит одну строку, first-party и даёт цифры по чтению документации,
не нарушая закон «никаких внешних ресурсов». @status:spec/done

[p180] @fact:d-24-rejected **Отвергнуто.** Собственный инстанс аналитики; GA и Метрика; события чтения
(какие абзацы читают) — отложенное. @status:spec/done

[p181] @fact:d-24-revisit **Пересмотреть когда.** Запрос на события (поиск, копирование адреса для
агента). @status:spec/done

### D-25 Язык и стиль текста {#d-25}

[p182] @fact:D-25-DECISION **Решение.** @status:spec/done

- [p183] @fact:d-25-2 **Исходный язык — английский.** `org.vibevm.core/vibevm-docs` несёт
  `lang = "en"`. Все остальные языки, включая русский, — **адаптации**
  отдельными пакетами (D-18): зеркало по блокам, свобода по предложениям,
  свои шутки, свой глоссарий терминов. Слово «перевод» в этом документе и в
  плане читается как «адаптация»; машинный перевод — только черновик. @status:spec/done
- @fact:d-25-3 **Норма стиля — `STYLE.md`** в этой же папке; при импорте она становится
  `AUTHORING.md` пакета `vibevm-docs` и цитируется из PROP-057. Её суть в
  четырёх пунктах. @status:spec/done
- @fact:d-25-4 **Читатель** — умный, занятой, ничего нашего ещё не читал. Страница
     обязана работать как единственная, которую он прочтёт (P-15). @status:spec/done
- @fact:d-25-5 **Где живёт сложность.** Только в контейнерах: `rule`, таблицы,
     `derived`, fence, глоссарий. Повествовательные абзацы — коридоры:
     термин вводится до употребления (ссылкой на глоссарий или глоссой в
     той же фразе), не больше двух терминов на фразу, одна мысль на абзац,
     «см. спецификацию» вместо объяснения запрещено — объяснение полно на
     странице, спека цитируется как подтверждение. Понятия идут лестницей:
     каждая ступень опирается только на нижние. @status:spec/done
- @fact:d-25-6 **Технические места — по ASD-STE100.** Одно слово — одно значение,
     синонимов у технических существительных нет; одна инструкция на фразу,
     повелительное наклонение, настоящее время, действительный залог; до 20
     слов в процедурной фразе и 25 в описательной, до 6 фраз в абзаце;
     предупреждение до шага; последовательности — нумерованными списками. @status:spec/done
- @fact:d-25-7 **Регистр — эссе, не мануал**, по образцам Money Stuff (механизм
     сначала и простыми словами, остроумие через недосказанность), The
     Economist (короткие слова, первая фраза несёт суть), Quanta (лестница
     понятий, термин после показа вещи), McPhee (структура до первой фразы,
     конкретная деталь), Increment и ACM Queue (честность о компромиссах),
     Feynman и Bryson (радость от понятого механизма). Юмор редкий, сухой,
     информативный, в местах отдыха; не больше одного на страницу; никогда в
     процедурах, предупреждениях, справочниках, ошибках, заголовках;
     понятный образованному человеку любой страны без IT-фона. @status:spec/done
- @fact:d-25-8 **Клаудизмы** — слова, обороты и структуры из `STYLE.md` §3 (английские) и
  §10 (русские) — удаляются при виде. Механическая часть проверки —
  `vibe doc check --style`: запрещённые слова по языку страницы, длины фраз и
  абзацев по видам блоков, термин до его введения, плотность терминов,
  отсылка вместо объяснения, заголовки Overview/Summary/Conclusion,
  восклицания, эмодзи, жирный в прозе, индекс читаемости в отчёт.
  Человеческая часть — самоправка автора по `STYLE.md` §2–§8 и чтение
  владельцем трёх страниц вслух на гейте фазы 3. @status:spec/done
- @fact:d-25-9 **Кто пишет.** Прозу — страницы, первые абзацы, `title` и `abstract`,
  глоссарий, FAQ, текст скилла, адаптации — пишет сильнейшая модель в
  центральной сессии (владелец назвал Fable, Astra, Sol). Воркерам — код,
  фикстуры, ожидаемый вывод, зеркала блоков, оболочка, проверки; воркер по
  умолчанию — Opus 5 в режиме High (агент `opus5`), а центральная сессия
  работает оркестратором и берёт на себя всё умное и творческое: тексты,
  адаптации, смысл дизайн-системы, информационную архитектуру, решения.
  Черновик прозы от воркера переписывается, не редактируется. @status:spec/done
- @fact:d-25-10 **Скелет страницы** дополняет D-13: заголовок — существительное для
  понятия или повелительное наклонение для задачи; первый абзац — что это и
  когда нужно, без единого термина (он же строка страницы в `llms.txt`);
  затем пример с ожидаемым выводом; затем механизм лестницей; затем
  граничные случаи с `rule`; вопросы, если они есть; никакого заключения. @status:spec/done

[p184] @fact:d-25-why **Почему.** Слово владельца (§3): тексты моделей страдают клаудизмами, но
главная беда — неверный баланс и точки притяжения сложности: агент пишет
так, будто читатель уже прочёл все спеки. STE даёт проверяемые правила для
технических мест; эссеистический регистр — для остального; деление на
контейнеры и коридоры делает «где сложно» предсказуемым и проверяемым.
Английский источник — так устроен проект (спеки, код, реестр) и так читают
AI-краулеры; адаптация, а не перевод, — потому что шутки и ритм не
переводятся. Проза — самая дорогая и самая заметная часть работы, и именно
на неё стоит тратить сильную модель; код и фикстуры воркер проверит гейтом,
текст гейтом не проверить. @status:spec/done

[p185] @fact:d-25-rejected **Отвергнуто.** Русский как исходный язык; дословный перевод; делегирование
прозы дешёвым моделям ради скорости; инфостиль в чистом виде для русского
(слишком сухо — берётся только борьба с канцеляритом); юмор «как у
разработчиков» с внутренними мемами; крайность Thing Explainer (тысяча слов)
— STE применяется к техническим местам, не к эссе; ИИ-переписывание готовых
страниц «для гладкости». @status:spec/done

[p186] @fact:d-25-revisit **Пересмотреть когда.** Стиль-ревью владельца на гейте фазы 3 (план,
A3.16) даст замечания; появится человек-редактор; линтер начнёт мешать
чаще, чем помогать (два ложных срабатывания подряд на одном правиле — запись
в BACKLOG). @status:spec/done

### D-26 Сопровождение: журнал кампании и регламент обновления {#d-26}

[p187] @fact:D-26-DECISION **Решение.** @status:spec/done

- [p188] @fact:d-26-2 **Журнал с первого дня.** `JOURNAL.md` (в папке вижена; с фазы 1 — в зоне
  кампании; после кампании — в пакете документации) — одна таблица, только
  дописывается: дата, тип (`успех`, `неудача`, `находка`, `наблюдение`),
  стабильный `J-NNN`, что случилось, свидетельство, **→ регламент**. Запись
  делается в том же атоме, где случилось событие; поле «→ регламент» не
  остаётся пустым дольше месячной петли; правило регламента без ссылки на
  запись — гипотеза. Так каждая находка кампании либо меняет процесс, либо
  осознанно помечается «наблюдение без действия». @status:spec/done
- @fact:d-26-3 **Четыре петли обновления** (`MAINTENANCE.md` §2): **коммита** —
  изменение продукта, видное пользователю, несёт документацию в том же
  коммите или строку долга `docs:` в `BACKLOG.md`; **недельная** — очередь
  `vibe doc todo`, до пяти мелких правок, сортировка долга, сигналы недели,
  одна страница вслух, запись в журнал; **месячная** — восемь метрик, аудит
  корпуса, аналитика, адаптации, дренаж долга, пополнение списков линтера,
  «журнал → регламент», три страницы вслух, релиз пакета документации;
  **полная сверка** — не на каждый релиз, а по обещанию команды: раз в
  квартал и перед крупной вехой. Продукт выходит по десять раз в день, и
  дрейф между сверками принят как риск. На сверке дрейф сводится к нулю
  против текущего релиза: пины сдвигаются осознанно после чтения диффов,
  `derived` перегенерируются, адаптации перечитываются, каждая перечитанная
  страница получает дату чтения в `reviews.toml`, пакет документации
  релизится. @status:spec/done
- @fact:d-26-4 **Замков нет.** Ни один технический гейт не связывает релиз продукта с
  документацией: `vibe doc todo` печатает пробелы числом; чекбокс
  «документация: обновлена / долг записан / не нужна» в шаблоне pull
  request'а — привычка; красной остаётся только внутренняя поломка
  документации (пример с `expect` как golden-тест, `derived` не собирается,
  исчезнувший якорь цитаты). Страница несёт только две даты: когда
  отрендерена и когда её в последний раз читали вслух. @status:spec/done
- @fact:d-26-5 **Смена версии.** Когда владелец осознанно поднимает номер версии
  продукта, разработчики документации запускают `vibe doc diff <старая>
  <новая>` по снимкам поверхности (D-27): он называет страницы, которые
  надо обновить, и почему. Обновляются только они, записывается снимок новой
  версии, пакет документации выходит с новым `[[documents]] version`, а
  человеческий changelog для читателей пишется по выводу diff. Это
  процедура, не технический гейт релиза (`MAINTENANCE.md` §2.5). @status:spec/done
- @fact:d-26-6 **Инструменты**: `vibe doc todo` (очередь сопровождения по текущему
  состоянию продукта и документации: пробелы покрытия, красные примеры,
  неразрешимые цитаты, возраст страниц, долг, статистика линтера),
  `vibe doc surface` и `vibe doc diff` (псевдоистория версий, D-27),
  `reviews.toml` (дата последнего чтения страницы, порядок «страницы
  недели»), `CHANGELOG.md` пакета документации из журнала, долг строками
  `docs:` в `BACKLOG.md`. @status:spec/done
- @fact:d-26-7 **Дисциплина мелких правок**: один коммит на правку; якоря и `derived` не
  трогаются; термин вводится на месте; **правило пяти правок** — пятая
  мелкая правка страницы с последнего чтения ставит её в очередь чтения;
  правка, тянущая другие страницы, — не мелкая. @status:spec/done
- @fact:d-26-8 **Регламент выводится, а не выдумывается**: в фазе 6 журнал
  консолидируется, недельная и месячная петли репетируются на свежей
  документации, и только потом регламент переписывается в норму: PROP
  (следующий свободный после PROP-057), страница для мейнтейнера в пакете,
  чеклисты `maintenance/weekly.md`, `monthly.md`, `release.md`. Каждое
  правило нормы ссылается на `J-NNN`. @status:spec/done
- @fact:d-26-9 **Регламент худеет**: раз в квартал правила, ни разу не сработавшие,
  помечаются «спящими» и уходят из чеклистов; метрики, которые никто не
  смотрит, снимаются. @status:spec/done

[p189] @fact:d-26-why **Почему.** Слово владельца (§3): написать документацию — полдела; обновлять
её в мелочах и периодически пересматривать целиком — вторая половина, и
находки кампании должны улучшать именно этот процесс. Механика вижена уже
ловит дрейф продукта (пины цитат, `derived`, примеры), но не ловит дрейф
мира и старение текста — их ловят петли и сигналы. Журнал с полем
«→ регламент» — единственный способ, чтобы находки не терялись в чате и не
превращались в правила «по памяти». @status:spec/done

[p190] @fact:d-26-rejected **Отвергнуто.** Регламент, написанный до кампании как готовая норма (он
был бы выдуман); «обновляем, когда руки дойдут»; журнал в чате или в
отчётах воркеров; регламент как flow-пакет уже в этой волне (сначала один
проект должен прожить по нему); **технический гейт «продукт не выходит без
документации»** — отвергнут владельцем 2026-09-10: сто pull request'ов и
десять релизов в день, документация неизбежно дрейфует, риск принят
(журнал, J-013: правило родилось без записи-основания и было гипотезой). @status:spec/done

[p191] @fact:d-26-revisit **Пересмотреть когда.** Второй проект захочет тот же ритуал для своих
doc-пакетов — тогда регламент становится flow-пакетом
`org.vibevm.world/docs-maintenance`; появится поиск по сайту (новый
сигнал); квартальный пересмотр покажет лишние петли. @status:spec/done

### D-27 Версия — контракт; псевдоистория версий для разработчиков {#d-27}

[p192] @fact:D-27-DECISION **Решение.** @status:spec/done

- [p193] @fact:d-27-2 **Версия — контракт на поведение, а не замороженный набор файлов.**
  «Версия 1 делает то, что должна делать версия 1.» Внутри версии продукт
  меняется сколько угодно раз — amend, переписанная история, `vibe self
  update --force` сто раз в день, — и это невидимо по замыслу: пользователи и
  их пайплайны, построенные на воспроизводимости, видят один номер и один
  контракт. Документация версии описывает контракт. Какие файлы внутри —
  читателю неважно, и документация об этом молчит. @status:spec/done
- @fact:d-27-3 **Смена номера — осознанное решение владельца.** Не чексуммы, не хэши
  файлов, не история: владелец решил, что контракт изменился, и поднял
  `1.0.0` до `2.0.0`. Это **единственное событие**, по которому документация
  считает «разницу между версиями». @status:spec/done
- @fact:d-27-4 **Псевдоистория версий — внутренняя кухня разработчиков документации.**
  Документация хранит **снимок поверхности** продукта на каждую объявленную
  версию — `maintenance/surface/<версия>.json` в пакете документации:
  структурное описание, а не хэш: команды и флаги из `--help`, поля
  манифеста и lock-файла, схемы, тексты фактов спек с `actionstage="doc"`,
  реестр форматов. Снимок записывает `vibe doc surface --record <версия>`
  — в момент смены версии и в конце каждой полной сверки. `vibe doc diff
  <старая> <новая>` сравнивает два снимка и через граф цитат `rule`,
  источники `derived` и карту покрытия выдаёт **список страниц, которые
  надо обновить, с причиной у каждой**: «`vibe deploy` получил флаг
  `--dry-run` → how-to/deploy, reference/cli». LLM правит перечисленное, а не
  штудирует всю документацию. @status:spec/done
- @fact:d-27-5 **Наружу ничего не выходит.** Сайт и читатель показывают номер версии как
  контракт и ничего из кухни: ни «проверено против», ни «устарело с r7», ни
  счётчиков дрейфа, ни отпечатков, ни постоянных ссылок по хэшу, ни
  уведомлений «доступна новая версия». Единственные даты на странице — когда
  она отрендерена и когда её в последний раз читали вслух. Человеческий
  changelog между версиями пишется руками по выводу `vibe doc diff`. @status:spec/done
- @fact:d-27-6 **Внутри версии** машина сравнивает только текущее с текущим: пробелы
  покрытия, красные примеры, неразрешимые цитаты (`vibe doc todo`); `rule`
  цитирует текущий текст спеки без пинов; устаревшую прозу читает человек на
  полной сверке (D-26). Тот же `vibe doc diff <версия> now` можно запустить
  внутри версии как подсказку сверке — внутренняя кухня, не факт для
  читателя (вопрос владельцу, §10 п. 14). @status:spec/done
- @fact:d-27-7 **Остаётся удалённым** после седьмой редакции всё, что требовало истории
  или показывало кухню читателю: пины ревизий и хэши у цитат, пометки на
  страницах, постоянные ссылки `/doc/@<hash>/…`, состояния хоста по хэшу
  дерева, отпечатки блоков `#p12-a3f9`, отставание адаптаций по хэшу. @status:spec/done

[p194] @fact:d-27-why **Почему.** Слово владельца (§3): разницу между версиями смотреть полезно;
опираться — только на номер версии, который меняется осознанно; данные
нужны разработчикам документации, чтобы алгоритмически знать, что обновлять,
а не перечитывать всё; пользователи видят контракт, не файлы. Шестая
редакция путала контракт с замороженным набором файлов и пыталась отличить
неразличимое (J-016); седьмая вычеркнула вместе с этим и полезное; восьмая
возвращает ровно то, что просил владелец, в его формулировке (J-017). @status:spec/done

[p195] @fact:d-27-rejected **Отвергнуто.** Чексуммы, хэши дерева и коммитов, отпечатки как
идентичность продукта; снимки поверхности по каждому изменению вместо
объявленных версий; любые метки состояния на страницах для читателя;
постоянные ссылки на прошлые публикации; уведомления «доступна новая
версия». @status:spec/done

[p196] @fact:d-27-revisit **Пересмотреть когда.** Владелец захочет машинно публиковать changelog между
версиями для читателей — тогда вывод `vibe doc diff` получит человеческую
проекцию, но по-прежнему только по объявленным версиям. @status:spec/done

### D-28 Лендинг на Qwik: один сайт, одна дизайн-система {#d-28}

[p197] @fact:D-28-DECISION **Решение.** Лендинг `vibevm.org/` и `/ru/` переезжает с Astro на Qwik **в
ходе этой кампании** и становится маршрутами того же сайта, что и
документация. Один пакет `org.vibevm.doc/web`, одна pnpm-workspace из двух
частей: `design/` — токены, темы, шрифты и компоненты D-21; `site/` —
Qwik-приложение с маршрутами лендинга (`/`, `/ru/`) и документации
(`/doc/…`), статический адаптер для сервера и встраиваемый адаптер для
`vibe`, в который маршруты лендинга не попадают. Шапка, футер, тема,
селектор языка и шрифты — общие компоненты лендинга и документации, без
копирования. @status:spec/done

[p198] @fact:d-28-2 Содержание лендинга переносится **один к одному**: строки `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/` третьей
редакции больше не нужны. @status:spec/done

[p199] @fact:d-28-why **Почему.** Слово владельца: однообразно и хорошо композируется. Два стека на
одном домене — это две системы компонентов, два шрифтовых конвейера, два
генератора корневых файлов и прокси между контейнерами; один Qwik-сайт на
общей дизайн-системе убирает всё это. Лендинг мал — одна страница на двух
языках, — и цена переноса измеряется днями. @status:spec/done

[p200] @fact:d-28-rejected **Отвергнуто.** Два Qwik-приложения с общим npm-пакетом дизайн-системы
(композиция через публикацию пакета — лишний шов для сайта из одной страницы
и документации; вернуться к этому, если лендинг разрастётся); оставить
Astro-лендинг и связать через прокси (третья редакция); редизайн содержания
лендинга по ходу переноса — перенос один к одному, правки содержания
отдельным решением после дизайн-ревью. @status:spec/done

[p201] @fact:d-28-revisit **Пересмотреть когда.** Лендинг разрастётся в маркетинговый сайт с
собственным ритмом релизов — тогда его можно выделить во второе приложение
на той же дизайн-системе. @status:spec/done

### D-29 Три волны: тексты на английском, разработка, адаптация {#d-29}

[p202] @fact:D-29-DECISION **Решение.** Кампания идёт тремя волнами с разной центральной сессией: @status:spec/done

1. [p203] @fact:d-29-2 **Волна A — тексты.** Fable: находки фазы 0 (механика — дешёвыми
   моделями), контракт фазы 1 (PROP-057 и поправки пишет Fable), и **вся
   проза документации ядра на английском** — до механики, в каркасе пакета,
   с реально снятыми `expect`, с проверкой цитат и стиля скриптами вместо
   ещё не написанных инструментов, с приёмкой владельцем (три страницы
   вслух). Заканчивается пакетом передачи. @status:spec/done
2. @fact:d-29-3 **Волна B — разработка.** Opus 5 в режиме High как центральная сессия:
   механика, подключение написанной прозы, сайт, лендинг на Qwik, деплой,
   репетиции сопровождения. Прозу Opus не переписывает; замечания линтера и
   раннера, которые не чинятся одной-двумя строками, копятся в очередь
   «нужен автор». Fable возвращается в четырёх названных точках: после
   первого прогона линтера и раннера по прозе, на дизайн-ревью, на
   стиль-ревью после механики, и в фазе 6 — регламент сопровождения из
   журнала и changelog. @status:spec/done
3. @fact:d-29-4 **Волна C — адаптация.** Fable: русская адаптация документации ядра,
   когда всё остальное проверено и работает; плюс всё, что волна B положила
   в отложенное для автора. @status:spec/done

[p204] @fact:d-29-5 Английский — единственный язык волн A и B; механика адаптаций в волне B
проверяется на фикстуре из двух страниц, не на боевом пакете. @status:spec/done

[p205] @fact:d-29-why **Почему.** Слово владельца (§3): сначала все красивые тексты на
английском, потом полностью переключиться на Opus для разработки; русский —
следующей волной после проверки. Это и экономия: Fable тратится на то, что
умеет только она, одним непрерывным куском, а не размазанными по месяцам
правками; Opus получает замороженный контракт и принятую прозу и работает
без оглядки. Русская адаптация после проверки — потому что адаптировать
стоит только то, что уже читается и работает. @status:spec/done

[p206] @fact:d-29-rejected **Отвергнуто.** Писать прозу после механики (она ждала бы инструментов,
которые ей не нужны для написания); чередовать Fable и Opus поатомно (дорого
и рвёт контекст обеим); адаптировать параллельно с источником (двойная
правка каждого абзаца). @status:spec/done

[p207] @fact:d-29-revisit **Пересмотреть когда.** Волна B покажет, что проза массово требует
переписывания под инструменты — тогда точка возврата F1 становится
полноценной под-волной. @status:spec/done

### D-30 Промпт сначала: сценарий — это задание агенту {#d-30}

[p208] @fact:D-30-DECISION **Решение.** Любое действие в VibeVM делается двумя способами — руками и
агентом, — и второй теперь основной. Страница сценария («как сделать»)
строится в таком порядке: @status:spec/done

1. [p209] @fact:d-30-2 **Что это и когда нужно** — первый абзац без терминов, как везде. @status:spec/done
2. @fact:d-30-3 **Промпт** — блок `prompt`: простое задание агенту в голосе пользователя;
   самодостаточное (координаты, пути, реестр названы, а не подразумеваются);
   одно на результат; без секретов; нейтральное к агенту — работает у
   любого агента с установленным скиллом `vibevm`. Рядом `needs` — что
   агенту нужно (скилл, MCP, сеть или её отсутствие) — и `outcome` — что
   увидит человек, когда получилось. @status:spec/done
3. @fact:d-30-4 **Что произойдёт** — три–шесть фраз механизма: какие команды агент
   выполнит, какие файлы появятся или изменятся, чем проверить результат.
   Это и есть ответ «как это работает» для тех, кто дальше не пойдёт;
   пишется как коридор, не как контейнер. @status:spec/done
4. @fact:d-30-5 **Руками** — нумерованные шаги по STE, только если ручной путь имеет
   смысл. Иногда его нет, и раздел отсутствует, а не заполняется для
   порядка. @status:spec/done
5. @fact:d-30-6 Граничные случаи с `rule`, вопросы — как везде. @status:spec/done

[p210] @fact:d-30-7 Страницы-объяснения не меняются. Карточка сценария в каталоге и на уровне 0
показывает первую строку промпта. @status:spec/done

[p211] @fact:d-30-8 Механика: @status:spec/done

- [p212] @fact:d-30-9 **Элемент словаря `prompt`** — седьмой, по слову владельца (D-10
  пересмотрено): тело — текст задания; дети `needs`, `outcome` и `assert*` —
  ноль и больше шелл-команд, обязанных завершиться нулём после работы агента
  (`vibe check`, `test -f vibe.toml`, `vibe explain "spec://…"`). В Markdown
  — fence `prompt`, список «нужно», абзац «результат», список ассертов; в
  `llms*.txt` — тот же fence, чтобы агент-читатель мог взять задание как
  есть; в ридере — блок с кнопкой «скопировать», в embedded-режиме — «передать
  агенту» (§7.5). @status:spec/done
- @fact:d-30-10 **Проверка `vibe doc check --prompts`**: каждый промпт прогоняется
  настроенным агентом-исполнителем (`[doc.prompts] runner`) в чистом
  временном каталоге с фикстурой, затем выполняются ассерты. Текст ответа
  агента недетерминирован, ассерты — детерминированы. **В панель не
  входит**: дорого и небыстро. Гоняется в фазе P до приёмки прозы, в
  месячной петле выборкой, на полной сверке целиком (`MAINTENANCE.md`). @status:spec/done
- @fact:d-30-11 На странице сценария промпт без ассерта — ошибка линтера стиля (R-30);
  промпт-иллюстрация на странице-объяснении помечается `assert="none"`. @status:spec/done
- @fact:d-30-12 Скилл `vibevm-docs` берёт блок `prompt` как задание, когда пользователь
  просит сделать то, что описано страницей (§7.4). @status:spec/done

[p213] @fact:d-30-why **Почему.** Слово владельца (§3): теперь любое действие делается не только
руками, но и агентом; люди приходят узнать «как это работает» и «какой
промпт запустить»; это отличие от документации прошлого, где всё делалось
руками. Для VibeVM это ещё и предмет: продукт устанавливает контекст агентам,
и документировать его через агента — значит показывать продукт в его среде.
Ассерты — потому что промпт, в отличие от команды, нельзя проверить
golden-выводом, а непроверяемый промпт устаревает молча. @status:spec/done

[p214] @fact:d-30-rejected **Отвергнуто.** Промпт как обычный `fence` без проверки; привязка промптов
к одному агенту; ручной путь на каждой странице «для полноты»; прогон
промптов в панели на каждый коммит. @status:spec/done

[p215] @fact:d-30-revisit **Пересмотреть когда.** Появится второй способ поручать задачи изнутри
продукта — тогда блок `prompt` получит ещё одну проекцию. @status:spec/done

## 6. Информационная архитектура документации ядра {#ia}

[p216] @fact:ia-1 Пакет `org.vibevm.core/vibevm-docs`, язык `en`; первая адаптация — `vibevm-docs-ru`, волна C (D-29)
в объёме по слову владельца. Навигация по Diátaxis: учебник, как сделать,
справочник, объяснение. Каждая страница — один концепт, ответ первой фразой,
ведущий факт с якорем, инварианты в начале или в конце. Каждая страница
«как сделать» — промпт сначала: задание агенту, что произойдёт, и лишь потом
ручные шаги, если они нужны (D-30). @status:spec/done

[p217]
| Раздел | Аудитория | Тип | Источник правды | Генерируется? |
| --- | --- | --- | --- | --- |
| @fact:ia-2 Начало: что такое VibeVM, границы, словарь, установка, первый проект @status:spec/done | @fact:ia-3 user (маршрут новичка) @status:spec/done | @fact:ia-4 учебник @status:spec/done | @fact:ia-5 README, RUNTIME-GUIDE, PROP-000, VIBEVM-SPEC @status:spec/done | @fact:ia-6 нет; примеры исполняемы @status:spec/done |
| @fact:ia-7 Модель: два дерева, boot-лейны, пакеты, реестр, store, lock @status:spec/done | @fact:ia-8 user @status:spec/done | @fact:ia-9 объяснение @status:spec/done | @fact:ia-10 PROP-009, 010, 002, 008 через `rule` @status:spec/done | @fact:ia-11 нет @status:spec/done |
| @fact:ia-12 Как сделать: установить, обновить, удалить, офлайн, приватный реестр, публикация, workspace @status:spec/done | @fact:ia-13 user @status:spec/done | @fact:ia-14 как сделать, промпт сначала @status:spec/done | @fact:ia-15 PROP по теме @status:spec/done | @fact:ia-16 примеры исполняемы; промпты прогоняются агентом @status:spec/done |
| @fact:ia-17 Работа через агента: какой скилл и MCP нужны агенту, как поручить задачу и проверить результат, как агент читает эту документацию @status:spec/done | @fact:ia-18 user, agent @status:spec/done | @fact:ia-19 учебник + как сделать @status:spec/done | @fact:ia-20 скиллы `vibevm` и `vibevm-docs`, PROP-057 @status:spec/done | @fact:ia-21 промпты прогоняются агентом @status:spec/done |
| @fact:ia-22 Lifecycle и расширения: фазы, контроль, build, package, deploy, scrape, применимость по платформам @status:spec/done | @fact:ia-23 user, author @status:spec/done | @fact:ia-24 как сделать + объяснение @status:spec/done | @fact:ia-25 PROP-054, 056, ledger кампании @status:spec/done | @fact:ia-26 примеры исполняемы @status:spec/done |
| @fact:ia-27 Справочник команд @status:spec/done | @fact:ia-28 user @status:spec/done | @fact:ia-29 справочник @status:spec/done | @fact:ia-30 clap @status:spec/done | @fact:ia-31 да, `derived kind="cli-help"` @status:spec/done |
| @fact:ia-32 Справочник манифеста и lock-файла @status:spec/done | @fact:ia-33 user, author @status:spec/done | @fact:ia-34 справочник @status:spec/done | @fact:ia-35 PROP-024, VIBEVM-SPEC §7 через `rule` @status:spec/done | @fact:ia-36 частично @status:spec/done |
| @fact:ia-37 Машинные форматы и JSON-отчёты @status:spec/done | @fact:ia-38 user, dev @status:spec/done | @fact:ia-39 справочник @status:spec/done | @fact:ia-40 JTD-схемы @status:spec/done | @fact:ia-41 да, `derived kind="jtd-schema"` @status:spec/done |
| @fact:ia-42 Авторство пакетов и расширений: flow, feat, stack, tool, mcp, lang, doc, app; провайдеры; переводы; карточка и картинки @status:spec/done | @fact:ia-43 author @status:spec/done | @fact:ia-44 учебник + как сделать @status:spec/done | @fact:ia-45 PROP-024, 027, 028, 054, 057 @status:spec/done | @fact:ia-46 примеры исполняемы @status:spec/done |
| @fact:ia-47 Архитектура и модель мейнтейнера @status:spec/done | @fact:ia-48 dev @status:spec/done | @fact:ia-49 объяснение @status:spec/done | @fact:ia-50 код, PROP, design-документы @status:spec/done | @fact:ia-51 схемы только где проясняют @status:spec/done |
| @fact:ia-52 Что доставил lifecycle-эпик: маршрут R1–R8, рулинги, миграции, отложенное @status:spec/done | @fact:ia-53 dev, user @status:spec/done | @fact:ia-54 объяснение @status:spec/done | @fact:ia-55 ledger, коммиты, PROP-054 @status:spec/done | @fact:ia-56 нет @status:spec/done |
| @fact:ia-57 Глоссарий @status:spec/done | @fact:ia-58 все @status:spec/done | @fact:ia-59 справочник @status:spec/done | @fact:ia-60 канонические термины по якорям @status:spec/done | @fact:ia-61 навигация генерируется @status:spec/done |
| @fact:ia-62 FAQ @status:spec/done | @fact:ia-63 user @status:spec/done | @fact:ia-64 как сделать @status:spec/done | @fact:ia-65 реальные вопросы @status:spec/done | @fact:ia-66 нет @status:spec/done |
| @fact:ia-67 Диагностика: от сообщения об ошибке к правилу @status:spec/done | @fact:ia-68 user, agent @status:spec/done | @fact:ia-69 как сделать @status:spec/done | @fact:ia-70 якоря в сообщениях об ошибках @status:spec/done | @fact:ia-71 список ошибок генерируется @status:spec/done |
| @fact:ia-72 Для агентов: как исследовать документацию, скилл, эндпоинты @status:spec/done | @fact:ia-73 agent @status:spec/done | @fact:ia-74 справочник @status:spec/done | @fact:ia-75 PROP-057 @status:spec/done | @fact:ia-76 манифест генерируется @status:spec/done |

[p218] @fact:ia-77 Маршрут «новичок»: одна страница-путь через установку, первый проект, первую
установку пакета, первый `vibe check`, на каждом шаге цитируя правило. @status:spec/done

## 7. Сайт и инфраструктура для агентов {#site}

### 7.1 Страница пакета, уровень 0 {#site-package-page}

[p219] @fact:site-package-page-1 Шапка: баннер или плейсхолдер, поверх — иконка или глиф вида, заголовок или
координата, издатель, однострочное описание, аннотация раскрывается по клику.
Далее обзор из манифеста (координата, kind, версии, лицензия, ключевые слова,
требования, capabilities), README, boot-сниппет с пометкой «читается сессией»,
спеки с якорями и подсветкой факта по адресу, объявленные скиллы, бинарники и
MCP-серверы, зависимые пакеты, «объяснено в», «переведено на». Версии — в
боковой навигации, `latest` — псевдоним. @status:spec/done

### 7.2 Полки документации и селектор языка {#site-shelves}

[p220] @fact:site-shelves-1 Полки: основная, официальные дополнительные, community; над ними — уровень 0.
Карточка на полке: иконка, заголовок со звёздочкой, издатель, язык, версия и
дата, описание, аннотация по клику, аудитории значками. Селектор языка на
каждой странице: сначала официальные переводы со звёздочкой, потом
community, у каждого — издатель и отставание в ревизиях. Для проприетарных
пакетов в локальном режиме — те же полки из store. @status:spec/done

### 7.3 Эндпоинты для агентов {#site-agent-endpoints}

[p221]
| Веб | Локально | Что |
| --- | --- | --- |
| @fact:site-agent-endpoints-1 `/doc/llms.txt`, `llms-full.txt`, `llms-small.txt`, `llms-medium.txt`; `/doc/<lang>/llms*.txt` @status:spec/done | @fact:site-agent-endpoints-2 `vibe doc manifest --llms <tier> [--lang]` @status:spec/done | @fact:site-agent-endpoints-3 индекс и корпус под бюджет, по языкам @status:spec/done |
| @fact:site-agent-endpoints-4 `/doc/<…>/<страница>.md`, `.xml` @status:spec/done | @fact:site-agent-endpoints-5 файл в store; `vibe doc build --format md/xml` @status:spec/done | @fact:site-agent-endpoints-6 сырые проекции страницы @status:spec/done |
| @fact:site-agent-endpoints-7 `/doc/manifest.json` @status:spec/done | @fact:site-agent-endpoints-8 `vibe doc manifest --json` @status:spec/done | @fact:site-agent-endpoints-9 страницы, статусы, языки, аудитории, жанры, якоря @status:spec/done |
| @fact:site-agent-endpoints-10 `/doc/resolve?uri=spec://…` @status:spec/done | @fact:site-agent-endpoints-11 `vibe explain "spec://…"` @status:spec/done | @fact:site-agent-endpoints-12 резолвер адреса и одношаговый подграф @status:spec/done |
| @fact:site-agent-endpoints-13 `/doc/<группа>/<имя>/llms.txt` @status:spec/done | @fact:site-agent-endpoints-14 то же по store @status:spec/done | @fact:site-agent-endpoints-15 каталог документаций пакета: заголовки, звёздочки, аннотации @status:spec/done |
| @fact:site-agent-endpoints-16 MCP сайта (опционально) @status:spec/done | @fact:site-agent-endpoints-17 `vibe mcp serve` @status:spec/done | @fact:site-agent-endpoints-18 поиск, explain, select, `read_doc` @status:spec/done |

### 7.4 Скилл {#site-skill}

[p222] @fact:site-skill-1 Doc-пакет ядра объявляет скилл `vibevm-docs`, проецируемый `vibe skill install`.
Тело короткое, по принципу progressive disclosure: описание для маршрутизации;
при ошибке — прочитать якорь, который она цитирует; разрешить его локально или
в вебе; перейти по ребру `documents` к объяснению; прогнать пример; при выборе
гайда — читать каталог с аннотациями и предпочитать официальное; когда
пользователь просит сделать то, что описано страницей сценария, — взять её
блок `prompt` как задание, подставить координаты и пути пользователя и
проверить результат её ассертами (D-30). Существующий скилл `vibevm` получает
одну строку-указатель. @status:spec/done

### 7.5 Контракт встраивания {#site-embedding}

[p223] @fact:site-embedding-1 Относительные адреса; базовый путь задаётся при запуске; хост открывает адрес
через URL-фрагмент или postMessage `{ "open": "spec://…" }`; читатель шлёт
`{ "openFile": "<путь>" }` при клике по локальной ссылке; тема — параметром
запуска и `{ "theme": "dark" | "light" }` на лету; настройки чтения — `{
"settings": {…} }` в обе стороны; язык — из `[i18n].preferred` или параметра;
кнопка «передать агенту» у блока `prompt` шлёт `{ "prompt": "<текст>" }`
наружу, и хост сам решает, что с ним делать (D-30); никаких внешних ресурсов. @status:spec/done

### 7.6 Четыре типа страниц и их раскладка {#site-layouts}

[p224]
| Страница | Раскладка (D-21) | Ридер (D-22) |
| --- | --- | --- |
| @fact:site-layouts-1 Лендинг `/`, `/ru/` (D-28) @status:spec/done | @fact:site-layouts-2 та же шапка и футер, что у документации; hero: eyebrow с точкой, заголовок Spectral с акцентным словом курсивом, лид с мандатным описателем, кнопки GitHub и GitVerse, пилюля Early Access и команда установки, анимированный граф зависимостей справа (с `prefers-reduced-motion`); ряд из трёх карточек способностей; содержание и адреса — один к одному с нынешним лендингом @status:spec/done | @fact:site-layouts-3 нет @status:spec/done |
| @fact:site-layouts-4 Каталог `/doc/`, `/doc/<lang>/` @status:spec/done | @fact:site-layouts-5 шапка `docs-header` с поиском и селектором языка; серифный hero с одной строкой; сетка `doc-card` 3×2 по разделам ИА ядра (начало, как сделать, справочник, авторство, архитектура, для агентов); ниже — полки пакетов карточками с иконкой или плейсхолдером, звёздочкой, издателем @status:spec/done | @fact:site-layouts-6 нет @status:spec/done |
| @fact:site-layouts-7 Страница пакета, уровень 0 @status:spec/done | @fact:site-layouts-8 баннер или градиентный плейсхолдер, поверх — иконка, заголовок, издатель; вкладки `docs-nav`: Обзор · README · Спеки · Документация · Версии · Для агентов; липкое оглавление слева, версии — в нём же @status:spec/done | @fact:site-layouts-9 README и спеки открываются в ридере @status:spec/done |
| @fact:site-layouts-10 Страница документации @status:spec/done | @fact:site-layouts-11 оглавление слева 190px, колонка 740px (шаги ширины), мета-блок, `prose`, сноски, `share-row` → «для агента» @status:spec/done | @fact:site-layouts-12 все десять фич @status:spec/done |
| @fact:site-layouts-13 Версия с ошибкой рендера, фоллбэк перевода, 404 @status:spec/done | @fact:site-layouts-14 та же шапка; плашка причины; ссылки на соседние версии и языки @status:spec/done | @fact:site-layouts-15 нет @status:spec/done |

## 8. Не-цели и риски {#risks}

### 8.1 Не делаем в этой волне {#non-goals}

- [p225] @fact:non-goals-1 Плагин VS Code — зона владельца; здесь только контракт встраивания. @status:spec/done
- @fact:non-goals-2 LSP и IDE-расширения — не объявлены по решению владельца. @status:spec/done
- @fact:non-goals-3 Зеркала, второй реестр; канал `main` хоста — до слова владельца. @status:spec/done
- @fact:non-goals-4 Модерация community-полок, комментарии, авторизация на сайте; аналитика
  сверх тега лендинга (D-24). @status:spec/done
- @fact:non-goals-5 Перевод нормативных спек. @status:spec/done
- @fact:non-goals-6 Карточки-превью на отдельную страницу. @status:spec/done
- @fact:non-goals-7 SVG-картинки. @status:spec/done
- @fact:non-goals-8 Проектное объявление «консультируйся с такой-то документацией». @status:spec/done
- @fact:non-goals-9 ИИ-чат «спросить документацию» на сайте; кнопка `.fab` — «для агента». @status:spec/done
- @fact:non-goals-10 Дизайнерская работа сверх сшивки двух источников — до дизайн-ревью (D-21). @status:spec/done
- @fact:non-goals-11 Аннотации, выделения, закладки с синхронизацией между устройствами. @status:spec/done
- @fact:non-goals-12 Таймер или вебхук пересборки реестрового сайта — вторая волна (D-23). @status:spec/done
- @fact:non-goals-13 Любые правки хостового nginx, портов, сертификатов, compose-блоков
  соседних сайтов и VPN: не цель и не средство. @status:spec/done
- @fact:non-goals-14 Редизайн содержания лендинга при переносе на Qwik: переносится один к
  одному (D-28); правки содержания — после дизайн-ревью, отдельным решением. @status:spec/done

### 8.2 Риски {#risk-list}

[p226]
| Риск | Ранний признак | Смягчение |
| --- | --- | --- |
| @fact:risk-list-1 Бета Qwik 2.0 меняет API @status:spec/done | @fact:risk-list-2 красная сборка web-пакета после обновления пина @status:spec/done | @fact:risk-list-3 точный пин; обновление пина — отдельный атом с записанной причиной @status:spec/done |
| @fact:risk-list-4 Словарь документации расползается @status:spec/done | @fact:risk-list-5 запрос на седьмой элемент @status:spec/done | @fact:risk-list-6 D-10: два запроса в BACKLOG — триггер, не тихое добавление @status:spec/done |
| @fact:risk-list-7 Раннер примеров нестабилен на Windows @status:spec/done | @fact:risk-list-8 расхождения только по путям, переводам строк, ANSI @status:spec/done | @fact:risk-list-9 правила нормализации на фикстуру; примеры без сети; временный `VIBE_SETTINGS` @status:spec/done |
| @fact:risk-list-10 Дублирование контента ломает SEO @status:spec/done | @fact:risk-list-11 версии или языки индексируются как дубли @status:spec/done | @fact:risk-list-12 canonical на `latest` в языке, `hreflang`, sitemap только с `latest` @status:spec/done |
| @fact:risk-list-13 Дрейф между адаптерами оболочки @status:spec/done | @fact:risk-list-14 остров различается байтами @status:spec/done | @fact:risk-list-15 тест паритета в панели @status:spec/done |
| @fact:risk-list-16 Новые kind ломают чужие матчи @status:spec/done | @fact:risk-list-17 `cargo build` красный в неожиданном крейте @status:spec/done | @fact:risk-list-18 желаемое: компилятор перечисляет места; никаких `_ =>` @status:spec/done |
| @fact:risk-list-19 Новые поля манифеста непрочитаемы старым `vibe` @status:spec/done | @fact:risk-list-20 отказ старой версии на новом манифесте @status:spec/done | @fact:risk-list-21 `min_vibe_version` в пакетах, которые их используют @status:spec/done |
| @fact:risk-list-22 Регрессии при переносе `docs/` @status:spec/done | @fact:risk-list-23 факт из legacy не найден в новом дереве @status:spec/done | @fact:risk-list-24 регрессионный список — обязательный артефакт фазы @status:spec/done |
| @fact:risk-list-25 Перевод тихо отстаёт от источника @status:spec/done | @fact:risk-list-26 адаптацию давно не читали против источника @status:spec/done | @fact:risk-list-27 дата чтения в `reviews.toml`; страница недели; полная сверка; `--translations` ловит только расхождение структуры (D-27) @status:spec/done |
| @fact:risk-list-28 Подмена на полке community @status:spec/done | @fact:risk-list-29 пакет с чужим `documents` и вводящим в заблуждение `title` @status:spec/done | @fact:risk-list-30 издатель всегда виден; звёздочка только сверху @status:spec/done |
| @fact:risk-list-31 Картинка с вредоносным содержимым @status:spec/done | @fact:risk-list-32 SVG со скриптом, неверная сигнатура @status:spec/done | @fact:risk-list-33 SVG запрещён; проверка сигнатуры и размеров; CSP @status:spec/done |
| @fact:risk-list-34 Локальный сервер виден другим @status:spec/done | @fact:risk-list-35 привязка не к loopback @status:spec/done | @fact:risk-list-36 только 127.0.0.1; без листинга; без обхода путей @status:spec/done |
| @fact:risk-list-37 Две центральные сессии пишут план стюарда @status:spec/done | @fact:risk-list-38 живой конфликт записи @status:spec/done | @fact:risk-list-39 закон LIVE-CONFLICT-STOPS; кастодия — диагностика @status:spec/done |
| @fact:risk-list-40 Правка вендоренного движка карты @status:spec/done | @fact:risk-list-41 `sync-engines --check` красный @status:spec/done | @fact:risk-list-42 правки только в авторском движке @status:spec/done |
| @fact:risk-list-43 Атом задевает хостовый nginx, порты, сертификаты, VPN @status:spec/done | @fact:risk-list-44 шаг требует правки конфигурации сервера вне контейнеров сайта @status:spec/done | @fact:risk-list-45 стоп и вопрос владельцу заранее (план R-24); маршрутизация только в контейнерном nginx лендинга (D-23) @status:spec/done |
| @fact:risk-list-46 Детали инфраструктуры утекают в публичный документ @status:spec/done | @fact:risk-list-47 адрес, порт или имя VPN-компонента в вижене, плане, пакете @status:spec/done | @fact:risk-list-48 правило «только ссылка на `main.md`» (план R-25); grep-гейт при импорте в репозиторий @status:spec/done |
| @fact:risk-list-49 Дизайн не нравится владельцу после первого рендера @status:spec/done | @fact:risk-list-50 замечания по цвету, шрифту, плотности на ревью @status:spec/done | @fact:risk-list-51 семантические токены: замена карты значений — один файл; шрифты — три `@font-face`-блока; ревью запланировано (A4.14) @status:spec/done |
| @fact:risk-list-52 Номер абзаца ведёт не туда после новой версии @status:spec/done | @fact:risk-list-53 `#pNN` в ссылке на `latest` попал на другой блок @status:spec/done | @fact:risk-list-54 ссылка «для агента» и llms-корпус всегда с версией; сайт при `latest#pNN` показывает версию, в которой номер был скопирован, если она известна из referrer, иначе — как есть @status:spec/done |
| @fact:risk-list-55 Фоллбэк-страницы перевода индексируются как дубли @status:spec/done | @fact:risk-list-56 страницы `/doc/ru/…` с английским текстом в индексе @status:spec/done | @fact:risk-list-57 `noindex` и `canonical` на исходную; фоллбэки не попадают в sitemap @status:spec/done |
| @fact:risk-list-58 Настройки чтения ломают вёрстку @status:spec/done | @fact:risk-list-59 ширина 1400px с липким оглавлением @status:spec/done | @fact:risk-list-60 оглавление уходит в `<details>` при ширине колонки выше 1100px; шаги ограничены @status:spec/done |
| @fact:risk-list-61 Локальный ридер тянет шрифт извне @status:spec/done | @fact:risk-list-62 запрос за пределы 127.0.0.1 при открытии страницы @status:spec/done | @fact:risk-list-63 шрифты в бандле; тест R-09 проверяет отсутствие внешних запросов @status:spec/done |
| @fact:risk-list-64 Страница написана «для тех, кто прочёл спеки» @status:spec/done | @fact:risk-list-65 термин без введения; три термина на фразу; «см. спецификацию» вместо объяснения @status:spec/done | @fact:risk-list-66 линтер стиля (термин до определения, плотность, отсылки); чтение вслух на гейте фазы 3 @status:spec/done |
| @fact:risk-list-67 Клаудизмы просачиваются в текст @status:spec/done | @fact:risk-list-68 слова и обороты из `STYLE.md` §3 @status:spec/done | @fact:risk-list-69 `vibe doc check --style` со списками по языкам; удаление при виде @status:spec/done |
| @fact:risk-list-70 Проза делегирована воркеру ради скорости @status:spec/done | @fact:risk-list-71 шаблонная страница без лестницы понятий @status:spec/done | @fact:risk-list-72 проза — только центральная сессия (план R-29); черновик воркера переписывается @status:spec/done |
| @fact:risk-list-73 Русская адаптация читается как перевод @status:spec/done | @fact:risk-list-74 канцелярит, кальки, переведённые шутки @status:spec/done | @fact:risk-list-75 `STYLE.md` §10; русский список тиков в линтере; адаптацию пишет та же модель @status:spec/done |
| @fact:risk-list-76 Линтер стиля ложно срабатывает и его начинают обходить @status:spec/done | @fact:risk-list-77 правки текста «под линтер» @status:spec/done | @fact:risk-list-78 два ложных срабатывания одного правила подряд — запись в BACKLOG и правка правила, не текста @status:spec/done |
| @fact:risk-list-79 Документация после кампании стареет молча @status:spec/done | @fact:risk-list-80 пробелы покрытия растут, страницы не читались месяцами @status:spec/done | @fact:risk-list-81 петли D-26; `vibe doc todo`; возраст страниц в `reviews.toml`; полная сверка по календарю @status:spec/done |
| @fact:risk-list-82 Находки кампании теряются в чате @status:spec/done | @fact:risk-list-83 правило регламента «по памяти», без записи @status:spec/done | @fact:risk-list-84 журнал в том же атоме (план R-33); правило без `J-NNN` — гипотеза @status:spec/done |
| @fact:risk-list-85 Регламент разбухает в ритуал @status:spec/done | @fact:risk-list-86 чеклисты, которые никто не выполняет @status:spec/done | @fact:risk-list-87 квартальный пересмотр: спящие правила уходят; восемь метрик, не больше @status:spec/done |
| @fact:risk-list-88 Мелкие правки ломают лестницу страницы @status:spec/done | @fact:risk-list-89 пять заплаток без чтения @status:spec/done | @fact:risk-list-90 правило пяти правок; страница недели вслух @status:spec/done |
| @fact:risk-list-91 Фича, требующая истории или показывающая кухню читателю, просачивается обратно @status:spec/done | @fact:risk-list-92 ревизия, хэш, отпечаток, «устарело» на странице; снимок не по объявленной версии @status:spec/done | @fact:risk-list-93 D-27: единственная разница — между объявленными версиями по снимкам, и только для разработчиков; план F-68 @status:spec/done |
| @fact:risk-list-94 Рендер хоста на каждый пуш перегружает сервер @status:spec/done | @fact:risk-list-95 десять сборок Rust в день на рендерере @status:spec/done | @fact:risk-list-96 дебаунс A5.1; спайк A0.28 меряет цену сборки @status:spec/done |
| @fact:risk-list-97 Ссылка агента на `#p12` после правки страницы бьёт мимо @status:spec/done | @fact:risk-list-98 блок сместился @status:spec/done | @fact:risk-list-99 принято, как ссылка на строку файла; именованные якоря заголовков не сдвигаются (R-06) @status:spec/done |
| @fact:risk-list-100 Перенос лендинга роняет его SEO @status:spec/done | @fact:risk-list-101 после переключения меняются адреса, `canonical`, `hreflang`, JSON-LD, тексты, теряется ключ-файл IndexNow @status:spec/done | @fact:risk-list-102 тест паритета A4.17 до переключения; адреса и корневые файлы байт в байт; редирект `/en/` → `/`; IndexNow после переключения; Search Console под наблюдением месяц @status:spec/done |
| @fact:risk-list-103 Перенос лендинга теряет мелочи @status:spec/done | @fact:risk-list-104 нет анимации графа, `prefers-reduced-motion`, кириллических подсетов, тега Umami, `og.png` @status:spec/done | @fact:risk-list-105 чеклист переноса в A4.16; паритет проверяет и ассеты @status:spec/done |
| @fact:risk-list-106 Перенос лендинга превращается в редизайн @status:spec/done | @fact:risk-list-107 новые тексты и блоки в атоме переноса @status:spec/done | @fact:risk-list-108 не-цель §8.1; один к одному; правки содержания — после дизайн-ревью @status:spec/done |
| @fact:risk-list-109 Промпты устаревают молча @status:spec/done | @fact:risk-list-110 ассерт падает при прогоне агентом; агент не понимает промпт без прочитанных спек @status:spec/done | @fact:risk-list-111 ассерты обязательны на страницах сценариев; прогон в фазе P, выборкой в месячной петле, целиком на сверке; промпт самодостаточен и нейтрален к агенту (D-30) @status:spec/done |
| @fact:risk-list-112 Промпт становится заклинанием @status:spec/done | @fact:risk-list-113 читатель копирует промпт, не понимая, что произойдёт @status:spec/done | @fact:risk-list-114 раздел «что произойдёт» обязателен и пишется как коридор; ручной путь — только где нужен @status:spec/done |

## 9. Глоссарий {#glossary}

- [p227] @fact:glossary-1 **Уровень 0** — документация, выведенная из байтов пакета без авторства. @status:spec/done
- @fact:glossary-2 **Уровень 1** — пакет kind `doc`. @status:spec/done
- @fact:glossary-3 **Предмет** — пакет, который документируется. @status:spec/done
- @fact:glossary-4 **Спутник** — пакет `<имя>-docs` или `<имя-документации>-<lang>`; роль
  семейства вне унисона. @status:spec/done
- @fact:glossary-5 **Источник (перевода)** — документация, которую перевод зеркалит. @status:spec/done
- @fact:glossary-6 **Официальная документация** — рёбра сходятся: предмет назвал, пакет объявил. @status:spec/done
- @fact:glossary-7 **Официальный перевод** — рёбра сходятся: источник назвал, перевод объявил. @status:spec/done
- @fact:glossary-8 **Community** — есть только ребро от документации или перевода. @status:spec/done
- @fact:glossary-9 **Карточка** — `title`, `description`, `abstract`, `[media]`, издатель,
  язык, версия, дата, аудитории. @status:spec/done
- @fact:glossary-10 **Остров** — HTML-фрагмент содержимого страницы, выданный Rust-конвейером. @status:spec/done
- @fact:glossary-11 **Оболочка** — Qwik-приложение вокруг острова. @status:spec/done
- @fact:glossary-12 **Адаптер** — вариант сборки оболочки: статический (сервер) или встраиваемый
  (`vibe`). @status:spec/done
- @fact:glossary-13 **Всегда текущий рендер** — режим документации для читателя: всё
  показывается против продукта, каким он есть сейчас; ничего не сравнивается
  «с тех пор» (D-27). @status:spec/done
- @fact:glossary-14 **Контракт версии** — то, что версия обещает делать; версия — не набор
  файлов. Внутри версии продукт может меняться невидимо (D-27). @status:spec/done
- @fact:glossary-15 **Снимок поверхности** — структурное описание команд, полей, схем и
  обязательств продукта на объявленную версию; `maintenance/surface/<версия>.json`;
  внутренняя кухня (D-27). @status:spec/done
- @fact:glossary-16 **Псевдоистория версий** — последовательность снимков по объявленным
  версиям и `vibe doc diff` между ними: список страниц к обновлению с
  причинами; только для разработчиков документации (D-27). @status:spec/done
- @fact:glossary-17 **Обязательство** — факт спеки с `actionstage="doc"` и аудиторией; гейт
  покрытия требует его цитирования. @status:spec/done
- @fact:glossary-18 **Манифест страниц** — JSON-перечень страниц со статусами, языками,
  аудиториями, жанрами, якорями и резюме; источник навигации и `llms.txt`. @status:spec/done
- @fact:glossary-19 **Плейсхолдер** — генерируемая из координаты иконка или баннер. @status:spec/done
- @fact:glossary-20 **Store** — машинный store пакетов `~/.vibe/cache/`. @status:spec/done
- @fact:glossary-21 **Ридер** — режим страницы документации с десятью фичами D-22. @status:spec/done
- @fact:glossary-22 **Позиционный якорь `pNN`** — номер блока на странице, присвоенный на
  сборке; стабилен в пределах версии, в отличие от именованного якоря. @status:spec/done
- @fact:glossary-23 **Семантический токен** — CSS-переменная по роли (`--text-2`), не по цвету;
  две карты значений — две темы. @status:spec/done
- @fact:glossary-24 **Дизайн-ревью** — стоп-точка после первого живого рендера, на которой
  владелец пересматривает D-21. @status:spec/done
- @fact:glossary-25 **Лендинг** — маршруты `/` и `/ru/` того же Qwik-сайта, что и
  документация (D-28); прежний Astro-лендинг из репозитория `vibevm-org` —
  источник его содержания, адресов и тёмных токенов. @status:spec/done
- @fact:glossary-26 **Паритет лендинга** — тест, сравнивающий старую и новую сборки лендинга
  по адресам, мета-тегам, JSON-LD, текстам и корневым файлам; гейт
  переключения домена. @status:spec/done
- @fact:glossary-27 **Промпт-блок** — элемент `prompt`: задание агенту в голосе пользователя с
  `needs`, `outcome` и ассертами; открывает страницу сценария (D-30). @status:spec/done
- @fact:glossary-28 **Ассерт промпта** — шелл-команда, обязанная завершиться нулём после
  работы агента; единственный детерминированный способ проверить промпт. @status:spec/done
- @fact:glossary-29 **Прогон промптов** — `vibe doc check --prompts`: агент-исполнитель в
  чистом каталоге, затем ассерты; не в панели, а в фазе P, месячной петле и
  на сверке. @status:spec/done
- @fact:glossary-30 **Рендерер** — вспомогательный контейнер с `vibe`, наполняющий том сайта. @status:spec/done
- @fact:glossary-31 **Клаудизм** — узнаваемое слово, оборот или структура модельной прозы;
  списки в `STYLE.md` §3 и §10. @status:spec/done
- @fact:glossary-32 **Контейнер и коридор** — где сложности можно (`rule`, таблица, `derived`,
  fence, глоссарий) и где нельзя (повествовательный абзац). @status:spec/done
- @fact:glossary-33 **Лестница** — порядок понятий на странице, при котором каждое опирается
  только на уже введённые. @status:spec/done
- @fact:glossary-34 **Адаптация** — версия документации на другом языке: зеркало по блокам,
  свобода по предложениям; в этом документе то же, что «перевод». @status:spec/done
- @fact:glossary-35 **STE** — ASD-STE100 Simplified Technical English; правила для
  технических мест страницы. @status:spec/done
- @fact:glossary-36 **Петля** — цикл обновления документации со своим триггером: коммита,
  недельная, месячная; плюс полная сверка по обещанию команды (D-26). @status:spec/done
- @fact:glossary-37 **Полная сверка** — чтение документации против текущего продукта:
  пробелы покрытия к нулю, примеры зелёные, справочники перегенерированы,
  страницы и адаптации перечитаны; раз в квартал и перед вехой, не на каждый
  релиз. @status:spec/done
- @fact:glossary-38 **Журнал** — `JOURNAL.md`: успехи, неудачи, находки и наблюдения кампании
  с полем «→ регламент». @status:spec/done
- @fact:glossary-39 **Долг документации** — строка `docs:` в `BACKLOG.md` с severity и
  адресом изменения, которое осталось без страницы. @status:spec/done
- @fact:glossary-40 **Дрейф** — расхождение продукта, мира или текста с документацией; машине
  видна только его текущая часть: пробелы покрытия, красные примеры,
  неразрешимые цитаты (`vibe doc todo`); остальное видит человек. @status:spec/done
- @fact:glossary-41 **Страница недели** — одна страница, прочитанная вслух в недельной петле;
  порядок в `reviews.toml`. @status:spec/done

## 10. Открытые вопросы владельцу {#open}

1. [p228] @fact:open-1 **Механизм встраивания оболочки** (D-12) — подтвердить или поправить,
   включая пункт 3 о скачивании оболочки для сборок из исходников. @status:spec/done
2. @fact:open-2 **Хост на сайте** (D-16, D-27): тегов нет, рендерится текущее состояние
   `main`, истории нет. Единственный вопрос — частота опроса и пересборки
   (рекомендация: не чаще раза в час). @status:spec/done
3. @fact:open-3 **Хостинг `vibevm.org`** — закрыт третьей редакцией (D-23): тот же сервер,
   второй контейнер выдачи и контейнер-рендерер, маршрутизация `/doc/` в
   контейнерном nginx лендинга. Остаётся два уточнения: (а) compose-сервисы и
   деплой-скрипт на сервере добавляет владелец сам по runbook или поручает
   агенту под явным присмотром; (б) рендер по деплой-скрипту достаточен для
   первой волны или сразу нужен таймер. @status:spec/done
4. @fact:open-4 **Точное место полей** `[[documents]]`, `[documentation]`, `[translates]`,
   `[translations]`, `[media]` — верхний уровень манифеста, как `[boot_snippet]`
   и `[[skill]]`, или внутри `[package]`. Рекомендация: верхний уровень;
   `title`, `abstract`, `lang` — внутри `[package]`, рядом с `description`. @status:spec/done
5. @fact:open-5 Закрыт (D-29): первая адаптация — волна C, вся документация ядра, после
   проверки волны B. @status:spec/done
6. @fact:open-6 **Версия `vibe`, вводящая новые поля манифеста**: 1.1.0 при посадке
   фазы 2 или изменяемый альфа-слот 1.0.0. @status:spec/done
7. @fact:open-7 **Тема по умолчанию публичного сайта** (D-21): системная, как записано,
   или светлая, как у эталона Anthropic. Решается на дизайн-ревью, до него —
   системная. @status:spec/done
8. @fact:open-8 **Шрифты** (D-21): Spectral + Inter + JetBrains Mono лендинга или
   Manrope + Source Serif 4 дизайн-системы. Рекомендация — первое; A/B на
   дизайн-ревью. @status:spec/done
9. @fact:open-9 **Что делать с oleg.guru после переноса ридера**: оставить два ридера или
   со временем перевести статьи на тот же Qwik-ридер. Вне этой волны; вопрос
   записан, чтобы не потерять. @status:spec/done
10. @fact:open-10 **Стиль-ревью** (D-25): сколько страниц владелец готов читать вслух на
    гейте фазы 3. Рекомендация — три: маршрут новичка, справочная страница,
    объяснение архитектуры. @status:spec/done
11. @fact:open-11 **Сопровождение** (D-26, `MAINTENANCE.md` §11): каденции неделя и месяц
    или две недели и квартал; дежурный по недельной петле; публиковать
    мелкие правки патч-версией еженедельно или копить до месячного релиза;
    можно ли скиллу писать `docs-gap:` в `BACKLOG.md` чужого проекта;
    каденция полной сверки — квартал, веха или оба. @status:spec/done
12. @fact:open-12 **Примеры как golden-тесты в панели** (D-14): единственная оставшаяся
    техническая связка продукта с документацией. Оставить (рекомендация:
    правятся как любой golden-файл за минуты) или тоже перевести в
    измеритель. @status:spec/done
13. @fact:open-13 Снят (седьмая редакция): вопрос об отпечатке сборки в `vibe --version`
    противоречил замыслу проекта — версии неразличимы намеренно (D-27). @status:spec/done
14. @fact:open-14 **Псевдоистория версий** (D-27): (а) хранить снимки поверхности в
    пакете документации под `maintenance/surface/` (рекомендация: да, это
    данные разработчиков документации, сайт их не рендерит) или в зоне
    кампании хоста; (б) разрешить ли внутренний `vibe doc diff <версия> now`
    как подсказку полной сверке внутри версии (рекомендация: да, с пометкой
    «кухня», без следов на страницах). @status:spec/done
15. @fact:open-15 **Судьба репозитория `vibevm-org`** после переключения домена (D-28):
    архивировать с финальным коммитом-указателем на новый дом сайта
    (рекомендация) или оставить как тонкий деплой-репозиторий. Чекаут на
    сервере в любом случае меняется на репозиторий vibevm — рендереру нужен
    `vibe` из исходников. @status:spec/done
16. @fact:open-16 **Момент переключения**: вместе с первым деплоем документации (фаза 5,
    рекомендация — один cutover, один тест паритета) или раньше, отдельным
    шагом, как только лендинг на Qwik готов. @status:spec/done
17. @fact:open-17 **Что значит «всё проверено» для старта волны C** (D-29): гейт фазы 6
    зелёный и сайт живёт месяц без красных сигналов недельной петли
    (рекомендация), или сразу после гейта. @status:spec/done
18. @fact:open-18 **Запись в репозиторий для волны A**: фаза P пишет прозу в
    `vibevm/vibepacks/org.vibevm.core/vibevm-docs/` — значит, режим «только
    чтение» этой сессии снимается для этого каталога и зоны кампании в
    новой сессии Fable. @status:spec/done
19. @fact:open-19 **Агент-исполнитель для прогона промптов** (D-30): `opus5` через тот же
    механизм, что воркеры кампании (рекомендация — он уже есть и стоит
    дёшево в сравнении с Fable), Codex, или оба по очереди для нейтральности;
    и каденция: выборка из десяти в месячной петле, все — на сверке. @status:spec/done

## 11. Журнал редакций {#changelog}

- [p229] @fact:changelog-1 **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/<sha256>/` (D-12); пороги APCA по ролям, разделители вне
  гейта, чеканка тонов `-docs`, один `--bg`, собственная реализация
  формулы вместо AGPL-библиотеки (D-21); нумерация до фильтрации `when`
  (D-22). Предсказание 10 подтверждено. Найден вероятный обход путей в
  `vibe-index` — P1 в BACKLOG. Открытые вопросы владельцу — в
  `PHASE-0-FINDINGS.md` §«Вопросы владельцу». @status:spec/done

- [p230] @fact:changelog-2 **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. @status:spec/done
- @fact:changelog-3 **2026-09-10, десятая редакция.** Слово владельца (§3): сначала вся
  документация на английском, русский — следующей волной; тексты пишет
  Fable, потом полное переключение на Opus для разработки. Добавлено D-29
  (три волны, точки возврата Fable, фикстура адаптации в волне B); §1 п. 2,
  §10 п. 5 закрыт, п. 17–18 добавлены. План: §6.0, фаза P, §12.1.
  Журнал J-019. @status:spec/done
- @fact:changelog-4 **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. @status:spec/done
- @fact:changelog-5 **2026-09-10, восьмая редакция.** Слово владельца (§3): версия —
  контракт на поведение, не набор файлов; смена номера — осознанное решение;
  разница считается только между номерами версий; механизм нужен
  разработчикам документации, чтобы алгоритмически знать, что обновлять, а
  читатели кухни не видят. D-27 переписано: псевдоистория версий — снимки
  поверхности по объявленным версиям (`vibe doc surface --record`) и
  `vibe doc diff <старая> <новая>` со списком страниц к обновлению; D-26
  получил процедуру смены версии; §1, §8.2, §9, §10 п. 14. Всё, что
  требовало истории или показывало кухню читателю, остаётся удалённым.
  Журнал J-017. @status:spec/done
- @fact:changelog-6 **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. @status:spec/done
- @fact:changelog-7 **2026-09-10, шестая редакция.** Слово владельца об amend-релизах (§3):
  версия постоянна, история переписывается, десять релизов в день под одним
  номером. Добавлено D-27 «идентичность продукта: отпечатки, не версии» с
  таблицей ключей; исправлены D-06 (постоянная ссылка `/doc/@<hash>/…`,
  версия — псевдоним), D-07 и D-16 (хост по состояниям `main` с ключом «хэш
  дерева», тегов нет — J-014), D-14 (пин цитаты несёт хэш текста факта),
  D-18 (адаптация хранит хэш исходной страницы), D-22 (номера по
  содержимому, отпечаток блока в ссылке), D-26 (метка с отпечатком
  поверхности); §8.2, §9, §10 п. 2 и 13. @status:spec/done
- @fact:changelog-8 **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). @status:spec/done
- @fact:changelog-9 **2026-09-10, пятая редакция.** Слово владельца о журнале и обновлении
  (§3). Добавлены D-26 «сопровождение», `MAINTENANCE.md` (три источника
  дрейфа, четыре петли, инструменты `vibe doc drift` и `todo`, журнал с
  законом «правило без находки — гипотеза», сигналы, дисциплина мелких
  правок с правилом пяти правок, восемь метрик, роли по ярусам, как худеет
  регламент, куда ложится норма) и `JOURNAL.md` с первыми двенадцатью
  записями этой сессии. Дополнены §1, §8.2, §9, §10. @status:spec/done
- @fact:changelog-10 **2026-09-10, дополнение к четвёртой редакции.** Слово владельца о
  разделении труда (§3): программирование — Opus 5 в режиме High по пакетам,
  всё умное и творческое — центральная сессия сама (D-25). @status:spec/done
- @fact:changelog-11 **2026-09-10, четвёртая редакция.** Слово владельца о стиле (§3):
  клаудизмы и, главное, точки притяжения сложности. Добавлены P-15
  «страница стоит одна», D-25 «язык и стиль текста» и отдельный документ
  `STYLE.md` (норма стиля на английском: читатель, контейнеры и коридоры,
  список тиков, регистр по образцам эссеистики, STE для технических мест,
  правила юмора, скелет страницы, до/после, адаптации и русские тики,
  проверки, кто пишет). Английский закреплён исходным языком, остальные —
  адаптации; проза — только сильнейшая модель центральной сессии. Дополнены
  §1, §8.2, §9, §10. @status:spec/done
- @fact:changelog-12 **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. @status:spec/done
- @fact:changelog-13 **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), ИА, сайт, риски,
  глоссарий, открытые вопросы. @status:spec/done
- @fact:changelog-14 **2026-09-09, первая редакция.** @status:spec/done

