VibeVM
Contents
On this page
ru
Publisher
org.vibevm.core
Version
1.0.0latest
Adapts
org.vibevm.core/vibevm-docs
Audiences
user
Reading time
12 min
Rendered
Read aloud
never

Собрать Hello VibeVM на AI-Native Rust

01Эта страница превращает калькулятор со страницы Создать первый проект в программу на Rust. Заодно она связывает каждое записанное правило калькулятора с кодом, который его соблюдает, и с тестом, который это доказывает. Связь даёт AI-Native Rust — дисциплина, которую вы добавляете в проект так же, как добавили redbook. Код остаётся обычным Rust. Строгость уходит вокруг него: в типы, в ошибки, которые называют нарушенное правило, и в проверки, которые выполняет машина. Заложите около часа; на долю агента придётся меньше десяти минут.

Что понадобится

02
Что Зачем Где взять
проект hello-vibevm с его спецификацией по ней эта страница собирает программу Создать первый проект
Rust и cargo-nextest компилирует программу и прогоняет проверки дисциплины шаг 1 ниже
агент-кодер пишет программу вместе с вами тот же, что на первой странице
около 3 ГБ свободного места на диске для инструментов Rust и инструментов дисциплины

Шаг 1: установить Rust

03Если терминал уже отвечает на cargo --version, переходите к последней части этого шага. Иначе поставьте Rust через rustup, официальный установщик. Он кладёт в домашнюю папку компилятор, сборщик cargo, форматтер и линтер.

В Windows

041. Скачайте rustup-init.exe с rustup.rs, сборку для x64 или для ARM64, и запустите его.

052. Если он сообщит, что нет инструментов сборки C++ из Visual Studio, разрешите ему их поставить. Rust в Windows пользуется их компоновщиком.

063. Согласитесь на установку по умолчанию, затем откройте новый терминал.

В macOS

071. Поставьте инструменты командной строки Apple, в которых есть компоновщик:

08xcode-select --install

092. Поставьте Rust и согласитесь на установку по умолчанию:

10curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

113. Откройте новый терминал.

В Linux

121. Поставьте компилятор C пакетным менеджером вашего дистрибутива: sudo apt install build-essential в Debian и Ubuntu, sudo dnf install gcc в Fedora.

132. Поставьте Rust той же командой, что и в macOS, и согласитесь на установку по умолчанию:

14curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

153. Откройте новый терминал.

Проверить и добавить один инструмент

161. Убедитесь, что обе команды печатают версию:

17rustc --version
cargo --version

182. Поставьте cargo-nextest, программу запуска тестов, которую вызывает последняя проверка дисциплины. Она собирается из исходников, это займёт несколько минут:

19cargo install cargo-nextest --locked

20Форматтер rustfmt и линтер clippy пришли вместе с установкой по умолчанию. Позже всё это обновляет rustup update.

Шаг 2: добавить AI-Native Rust в проект

21AI-Native Rust — семейство из трёх пакетов, и оно приводит с собой четвёртый. Ставите вы бандл, rust-ai-native. Его языковой пакет держит руководство по Rust в этой дисциплине и инструменты, которые её проверяют. Его MCP-сервер открывает эти инструменты агентам. Четвёртый пакет, core-ai-native, содержит ядро дисциплины, одно для всех языков.

22Две фразы ядра объясняют остальное. Первая говорит, куда уходит строгость: вокруг кода, а не в его синтаксис.

23 цитата из спецификации
spec://org.vibevm.ai-native/core-ai-native/00-MANIFESTO#CENTRAL-LAW

24Вторая говорит, что считается строгостью. Правило, которое могло бы стать проверкой, тестом или типом, но записано фразой, ещё не существует.

25 цитата из спецификации
spec://org.vibevm.ai-native/core-ai-native/00-MANIFESTO#PROSE-IS-A-WISH

26Дальше работайте внутри папки проекта.

271. Поставьте семейство:

28cd hello-vibevm
vibe install org.vibevm.ai-native/rust-ai-native --assume-yes

292. Соберите его инструменты. Пакеты несут исходный код, и vibe компилирует программы на вашей машине, внутри папок самих пакетов:

30vibe bin build --assume-yes

31Первая сборка идёт от полуминуты до нескольких минут. Она оставляет в этих папках около 370 мегабайт результатов сборки, и Git их не отслеживает.

323. Посмотрите, что пришло. vibe tree показывает семейство рядом с redbook. vibe tools перечисляет шесть инструментов: пять программ и сервер. Вызывать вы будете один из них, rust-ai-native. Он настраивает проект, строит карту прослеживаемости от правил к коду и запускает все проверки разом. Вызывайте его через vibe, который находит сборку, принадлежащую этому проекту: vibe bin exec rust-ai-native -- <команда>.

334. Закоммитьте:

34git add -A
git commit -m "chore: add AI-Native Rust"

35Стартовая полоса теперь называет ещё два текста, и агент читает их в начале каждой сессии. Они повторяют две фразы выше и добавляют постоянные правила для Rust. Значение, которое пересекает границу, получает собственный тип. У каждого слоя один тип ошибки, и его сообщения ссылаются на правило, которое он охраняет. Логика программы не вызывает unwrap. Каждая публичная точка входа несёт скомпилированный пример использования.

Шаг 3: сделать спецификацию прослеживаемой

36Дисциплина строит свою карту, читая вашу спецификацию. О каждом правиле ей нужно знать две вещи: какого оно вида и какая его ревизия текущая. Обе помещаются в одну короткую пометку, строку вида. Ставьте её отдельной строкой, первой под заголовком правила:

37## Деление на ноль {#division-by-zero}

`req r1`

Деление на ноль считается ошибкой. Программа печатает
`error: division by zero` в поток ошибок и выходит с кодом 1.

381. Откройте vibevm/vibespecs/modules/calculator/PROP-001.md. Под заголовком каждого правила поставьте `req r1` : ввод, числа, операторы, результат, деление на ноль и неверный ввод.

392. Под заголовком каждого из двух решений поставьте `design r1` .

403. В FEAT-001.md поставьте `design r1` под заголовком границ и `req r1` под заголовком приёмки. Между строкой вида и таблицей оставьте пустую строку.

414. Не меняйте ни одного якоря. Когда на следующем шаге дисциплина будет настроена, её инструменты будут находить каждое правило по адресу. Адрес складывается из имени проекта, пути документа под vibevm/vibespecs/ и якоря: spec://hello-vibevm/modules/calculator/PROP-001#division-by-zero.

425. Закоммитьте:

43git add vibevm/vibespecs/modules
git commit -m "docs(calculator): mark the rules and their revisions"

44Ревизия понадобится вам в конце страницы. Когда смысл правила меняется, вы поднимаете её номер. Тогда каждый кусок кода и каждый тест, который ссылался на старую ревизию, становится подозрительным, пока кто-нибудь его не перечитает.

45 цитата из спецификации
spec://org.vibevm.ai-native/core-ai-native/mechanisms/PROP-014#INVALIDATION-SPEC-BUMP-MAKES-EDGES-SUSPECT

Шаг 4: попросить агента собрать программу

46Запустите агента в hello-vibevm, как на первой странице, и дайте ему этот запрос:

47
Собери Hello VibeVM по его спецификации как AI-Native Rust, следуя руководству, которое установил этот проект: библиотека с тонким бинарником, правила спецификации в виде типов, ошибки со ссылкой на нарушенное правило, doctest на каждом публичном элементе и таблица приёмки как одна объявленная матрица тестов. Привяжи каждый элемент к его правилу и закончи зелёным rust-ai-native floor.

сессия агента, запущенная в hello-vibevm после установки AI-Native Rust; Rust с cargo-nextest

библиотека с тонким бинарником; cargo run -q -- "7 / 2" печатает 3.5; у каждого публичного элемента есть doctest и привязка к его правилу; rust-ai-native floor показывает все проверки зелёными

  • test "$(cargo run -q -- "7 / 2")" = "3.5"
  • cargo test --quiet
  • vibe bin exec rust-ai-native -- floor

48Запрос называет суть нарочно. Проверки дисциплины читают форму кода. Маленькая аккуратная программа проходит их раньше, чем хоть одно правило спецификации поселится в её типах.

49В первый раз эту страницу проверяли запросом, который просил только зелёных проверок. Агент написал правильный Rust и привязал каждую функцию к её правилу. Но оператор остался строкой, а числом считалось любое значение с плавающей точкой. Руководство это запрещает, но ни одна проверка пока не следит за этим правилом:

50 цитата из спецификации
spec://org.vibevm.ai-native/rust-ai-native-lang/rust/GUIDE-AI-NATIVE-RUST#BAN-STRINGLY-TYPED-SURFACES

51Поэтому запрос просит того, чего машина не выведет сама: где проходят границы программы и какие правила должны стать типами.

52Будьте готовы, что агент сначала читает, а потом пишет. В проверочном прогоне его первые пятьдесят действий были чтением. Он прочитал стартовую полосу, руководство дисциплины и три её карточки. Он прочитал даже исходники инструментов, которые собирался запускать.

53Потом он написал крейт за один заход и настроил дисциплину командой rust-ai-native init. Он сразу поставил крейт под все проверки, а не освободил от них. Шаг занял около семи минут и закончился двумя коммитами: сначала калькулятор, затем настройки дисциплины и карта. Агент может заново собрать инструменты; вреда от этого нет.

54Прочитайте последнее сообщение агента. В проверочном прогоне он перечислил решения, которые принял там, где спецификация молчит. Ещё он назвал то, что оставил вам, например лицензию проекта.

Шаг 5: прочитать, что он собрал

55Зелёные проверки говорят, что ничего не сломано. Они не говорят, что спецификация стала кодом. Вместо них посмотрите на пять вещей.

561. Прогоните программу по таблице приёмки и за её пределами. cargo run -q -- "7 / 2" печатает 3.5. cargo run -q -- "1 / 0" печатает error: division by zero и выходит с кодом 1. Теперь попробуйте "nan + 1", ввод, которого в таблице нет. Программа печатает error: `nan` is not a number и выходит с кодом 2, потому что по спецификации число записывается десятичной дробью.

572. Найдите типы. Агент написал пять небольших модулей вокруг одной мысли: значение, которое нарушает правило, не может существовать. Число можно получить только из текста, который подходит под грамматику спецификации, поэтому NaN и бесконечность внутрь не попадут. Оператор стал типом ровно с четырьмя значениями, так что «и никаких других» теперь проверяет компилятор. Выражение можно получить только разбором. Даже коды выхода стали типом с тремя значениями, теми тремя, что разрешает спецификация.

583. Найдите тип ошибки. У него два лица. Для вас это короткое описание проблемы, которое программа печатает после error: теми словами, какими его задаёт спецификация. Для агента это полная диагностика, которая называет нарушенное правило и место, где его чинить:

59violates REQ spec://hello-vibevm/modules/calculator/PROP-001#division-by-zero: division by zero; fix surface: divide by a number other than zero
60 цитата из спецификации
spec://org.vibevm.ai-native/rust-ai-native-lang/rust/GUIDE-AI-NATIVE-RUST#ERROR-MESSAGES-ARE-AGENT-FOOD

614. Найдите тесты. Таблица приёмки из FEAT-001.md встречается в коде один раз: списком строк, которые прогоняются против собранной программы. У каждого публичного элемента в документации есть короткий пример, и cargo test компилирует и запускает его. В проверочном прогоне таких примеров было 23 из 33 тестов.

625. Спросите карту, какой код соблюдает правило и какой тест это доказывает:

63vibe explain "spec://hello-vibevm/modules/calculator/PROP-001#division-by-zero"
64spec unit spec://hello-vibevm/modules/calculator/PROP-001#division-by-zero
  req r1 — Division by zero (vibevm/vibespecs/modules/calculator/PROP-001.md:25)
  hash sha256:b0c1fd84b983…
  edges in:
    implements ← `hello_vibevm::error::CalcError` (crates/hello-vibevm/src/error.rs:35) (pinned r1)
    implements ← `hello_vibevm::error::CalcError::exit_status` (crates/hello-vibevm/src/error.rs:194) (pinned r1)
    implements ← `hello_vibevm::operator::Operator::apply` (crates/hello-vibevm/src/operator.rs:55) (pinned r1)
    verifies ← `hello_vibevm::operator::tests::dividing_by_either_zero_is_an_error` (crates/hello-vibevm/src/operator.rs:136) (pinned r1)

65Там, где спецификация молчит, агент выбрал осторожный ответ и пометил его REVIEW в коде. В проверочном прогоне таких мест было три: ведущий +, числа вроде .5 и результат, слишком большой, чтобы его хранить. Отвечайте на них по одному, как советует первая страница. Крейт вышел примерно на 1100 строк. Большая часть из них приходится на оболочку: документацию, примеры, привязки и тесты. Сама арифметика занимает десяток строк.

Шаг 6: изменить правило и увидеть, что связь держится

661. В PROP-001.md замените сообщение о делении на ноль на error: cannot divide by zero. Поднимите строку вида этого правила до `req r2` .

672. В FEAT-001.md замените то же сообщение в таблице приёмки и поднимите ту строку вида до `req r2` . Закоммитьте оба файла.

683. Спросите карту, чего коснулась правка. Проверка падает и перечисляет каждый элемент, который ссылался на старую ревизию:

69vibe bin exec rust-ai-native -- specmap --check
70Error: `.\specmap.json` is out of date relative to the tree.
  drift: revision bump: `spec://hello-vibevm/modules/calculator/FEAT-001#acceptance` r1 → r2
  drift:   now SUSPECT: `hello_vibevm::tests::acceptance::feat_001_acceptance_table` (pinned r1) at crates/hello-vibevm/tests/acceptance.rs:88 — re-affirm after review
  drift: revision bump: `spec://hello-vibevm/modules/calculator/PROP-001#division-by-zero` r1 → r2
  drift:   now SUSPECT: `hello_vibevm::error::CalcError` (pinned r1) at crates/hello-vibevm/src/error.rs:35 — re-affirm after review
  drift:   now SUSPECT: `hello_vibevm::error::CalcError::exit_status` (pinned r1) at crates/hello-vibevm/src/error.rs:194 — re-affirm after review
  drift:   now SUSPECT: `hello_vibevm::operator::Operator::apply` (pinned r1) at crates/hello-vibevm/src/operator.rs:55 — re-affirm after review
  drift:   now SUSPECT: `hello_vibevm::operator::tests::dividing_by_either_zero_is_an_error` (pinned r1) at crates/hello-vibevm/src/operator.rs:136 — re-affirm after review
Run `rust-ai-native-specmap` (or your project's wrapper), review the drift, and commit the result.

714. Дайте агенту этот запрос:

72
Правила division-by-zero и acceptance теперь в ревизии r2. Приведи каждый элемент, который на них ссылается, в соответствие с новым текстом и подтверди их заново. Закончи зелёным rust-ai-native floor.

сессия агента из шага 4 или новая, запущенная в hello-vibevm

программа печатает новое сообщение; карта не называет ни одного подозрительного элемента; rust-ai-native floor зелёный

  • test "$(cargo run -q -- "1 / 0" 2>&1)" = "error: cannot divide by zero"
  • vibe bin exec rust-ai-native -- floor

73В проверочном прогоне агент сначала прочитал правку и список. Потом он поменял восемь строк в трёх файлах, меньше чем за минуту. Три строки несли сообщение: в коде, в примере, который его проверяет, и в строке таблицы. Остальные пять были привязками, подтверждёнными в ревизии r2. Ради этой петли дисциплина и существует. Вы поменяли фразу, и код и тесты, которые от неё зависели, нашла машина, а не чья-то память.

74Карта находит то, что привязано к правилу, и только это. В проверочном прогоне один комментарий в другом файле так и повторял старые слова, потому что его ничто не связывало с правилом. Агент его оставил: комментарий описывал ошибку, а не цитировал вывод. Привязывайте элемент к правилу везде, где иначе фразу пришлось бы помнить.

Что появилось на диске

75Рядом со спецификацией в проекте теперь лежит код на Rust. Наверху стоит Cargo.toml, а крейт лежит в crates/hello-vibevm/. Калькулятор находится в src/lib.rs и его модулях, тонкая программа в src/main.rs, тесты приёмки в tests/. Ещё агент добавил /target/ в .gitignore, чтобы результаты сборки Rust не попадали в Git.

76conform.toml и specmap.toml держат политику дисциплины и настройки карты; их правите вы. specmap.json и есть сама карта. Она сгенерирована и закоммичена, поэтому ревьюер видит в диффе, когда меняются привязки правила. conform-baseline.json и файлы в discipline/registry/ хранят записи самих проверок. Здесь они пустые, то есть никаких поблажек нет.

Особые случаи и правила

77Берите выражение в кавычки в любой оболочке. Без кавычек Git Bash в Windows превращает одинокий / в путь, а оболочка превращает * в имена файлов.

78Не приписывайте строку вида к тексту: пусть она стоит одна. Если поставить её перед списком, первый пункт списка станет обычным текстом.

79Спецификация, которую писал агент, может ссылаться на свои правила как spec://project/…. Это адрес проекта до того, как дисциплина дала ему имя; после шага 4 адреса начинаются с spec://hello-vibevm/. Замените старое начало в обоих файлах, иначе эти ссылки никуда не ведут.

80После всего, что сдвигает строки в коде, включая форматирование, пересоберите карту командой vibe bin exec rust-ai-native -- specmap и только потом запускайте floor. Карта помнит номера строк, и устаревшая карта проваливает проверку.

81Когда floor останавливается на карте и предполагает свежий проект, карта всего лишь устарела. specmap --check покажет почему. Сдвинутым строкам хватит пересборки; поднятая ревизия требует ревью из шага 6.

82В Windows Git может выписать specmap.json с окончаниями строк CRLF. Тогда проверка карты падает как устаревшая и не называет никакого дрейфа. Добавьте строку specmap.json text eol=lf в .gitattributes проекта, закоммитьте её и один раз пересоберите карту.

83Каждая сборка карты предупреждает о vibevm/vibespecs/boot/STATIC.xml. Карта читает всё под vibevm/vibespecs/, включая сгенерированную стартовую полосу. Чтобы исключить полосу, добавьте spec_exclude = ["vibevm/vibespecs/boot/**"] в specmap.toml выше первой строки [[external_specs]]. Затем пересоберите карту.

84Если floor останавливается на последнем шаге и называет cargo-nextest, значит, нет программы запуска тестов. Поставьте её, как показывает шаг 1.

For an agent

This page has a machine mirror. The citation carries the version rather than latest, so what an agent quotes does not move under it.

spec://org.vibevm.core/vibevm-docs@1.0.0/tutorials/ai-native-rust

.md.xmlllms.txt