Написать feat или stack
01Feat говорит, что построить, не говоря как; stack говорит, как это делает технология. Эта страница пишет по одному и соединяет их через умения, которые одному нужны, а другой предоставляет.
Создай два пакета в дереве под vibevm/vibepacks/ в текущем проекте VibeVM. Первый — feat org.acme/welcome-page, который описывает страницу приветствия с критериями приёмки и требует возможность ui:page-host. Второй — stack org.acme/static-site, который предоставляет ui:page-host и объясняет, как страница собирается статическим HTML-файлом. Запусти vibe check на обоих.
навык vibevm, установленный у вашего агента; проект с vibe.toml в корне
манифест feat требует ui:page-host, манифест stack его предоставляет, у каждого есть документы спецификации под vibevm/vibespecs/, и vibe check не находит ошибок ни у одного
vibe check --path vibevm/vibepacks/org.acme/welcome-page/v0.1.0 --quietvibe check --path vibevm/vibepacks/org.acme/static-site/v0.1.0 --quiet
Что происходит
03Агент создаёт оба слота через vibe init package, задаёт их виды в манифестах, пишет спецификацию feat, критерии приёмки и требование возможности, пишет описание stack, его соглашения и возможность, которую он предоставляет, и проверяет каждый. Когда проект позже ставит feat, резолвер ищет пакет, предоставляющий ui:page-host, среди stack-пакетов проекта; stack ему подходит, и двое сопоставляются, хотя ни один не называет другого.
04[[registry]]is an array, priority-ordered.[[mirror]]is a first-class fallback layer, transparent to the lockfile.[[override]]bypasses the resolver for pins. Schema and code path support all three from day one.
Feat
05Feat описывает, что фича делает для своего пользователя, в терминах, которые может реализовать любой stack: назначение, поведение, критерии приёмки, нужные данные, что происходит, когда что-то идёт не так. Он никогда не называет фреймворк. Его манифест объявляет умения, которые ему нужны от stack, как возможности, namespace:name@constraint, и больше ничего о технологии.
| Путь | Назначение |
|---|---|
vibevm/vibespecs/feats/<name>/SPEC.md |
что фича делает, для кого и зачем |
vibevm/vibespecs/feats/<name>/acceptance.md |
наблюдаемые критерии, которым должна отвечать сборка |
vibevm/vibespecs/feats/<name>/data-model.md, api.md, ui-flows.md, failure-modes.md |
те части, что применимы, по одной теме на файл |
07В манифесте: [requires] capabilities = ["ui:page-host@^1"] и, для feat, которому вообще нужен stack, [compatibility] requires_kinds = ["stack"].
Stack
08Stack — технологический контекст: он говорит, как абстрактные умения, о которых просит feat, реализуются одним набором инструментов, и может привязать фазы сборки и тестирования жизненного цикла к этому тулчейну. Его манифест объявляет, что он предоставляет, [provides] capabilities = ["ui:page-host@1.0"], а документы спецификации описывают каждую предоставляемую возможность в отдельном файле, плюс соглашения, инструменты и выкладку.
| Путь | Назначение |
|---|---|
vibevm/vibespecs/stacks/<name>/STACK.md |
что такое этот stack и когда его выбирать |
vibevm/vibespecs/stacks/<name>/capabilities/<capability>.md |
по файлу на предоставляемое умение: как оно реализовано |
vibevm/vibespecs/stacks/<name>/conventions.md, tooling.md, deployment.md |
именование и раскладка, команды сборки и тестов, как сборка поставляется |
vibevm/vibespecs/boot/<name>.xml |
необязательный фрагмент, который показывает активный stack на старте сессии |
10Stack может также привязать в манифесте вклады жизненного цикла, чтобы vibe build и vibe test в проекте-потребителе запускали тулчейн stack без дополнительной настройки.
11 A stack package may ship its preset as a set of[[extension]]contributions in its own manifest (auto, trust-gated like everything else) — this is howrust-ai-native-langteachesvibe build/vibe testto drive cargo without vibe hardcoding cargo, the OOS-AUTODETECT posture of PROP-024 kept intact: the package declares, vibe never infers.
Возможности
12Возможность — абстрактный интерфейс: пространство имён, двоеточие, имя и, необязательно, ограничение версии. Feat требует; stack предоставляет; резолвер сопоставляет их при установке и отказывает проекту, чьим feat нужно умение, которого не предоставляет ни один установленный stack. Выбирайте имена по тому, что умение делает для фичи, а не по технологии: ui:page-host, db:relational, auth:oauth-callback.
13 Decision. A package's identity is the tuple(kind, name, version, content_hash). Thecontent_hashis a digest over the deterministically-ordered concatenation of(rel_path_bytes || 0x00 || file_bytes || 0x00)for every file in the package directory, and the value names the recipe that produced it (PROP-044 §4.7):sha256-tree/1:<hex>is recipe 1, whose exclusion list, path normalisation and traversal order are carried as data informats/hash_recipes/1.toml; the baresha256:<hex>is recipe 0, the pre-recipe form, frozen verbatim in code — not configurable, because a frozen recipe that can be edited is not frozen — so that values written before recipes were named stay readable. Two hashes are comparable only at the same recipe; comparing across recipes answers a question nobody asked, and is never done silently. PROP-024 §2.2 re-scopes this to the package's shippable tree — its source, minus build output (.git/,.vibe/,target/,node_modules/,.vibeignoreglobs) — so a code-bearing package's identity is its source, not its build state; that exclusion lands with the code that implements it. The URL used to fetch the content is informational — recorded in the lockfile for debuggability, not for identity.
Особые случаи и правила
14Слово stack называет и бандл семейства: пакет вида stack, в котором нет ничего, кроме точных пинов участников языкового семейства. В реестре и то и другое stack; различает их описание.
15<family>— the aggregator.kind = "stack", content-minimal: avibe.tomland aREADME.md, and nothing else — no code, no boot snippet, nospecmap.toml/conform.toml. Its whole job is to name the family's members at one resolved version set through exact=X.Y.Zpins in[requires]. Requiring the aggregator installs the family.
16Критерии приёмки feat — то, что агент проверяет после сборки; пишите их как наблюдаемые факты, а не как пожелания.
17Два feat, требующие одну возможность, могут быть удовлетворены одним stack; проект с несколькими stack помечает один как активный для сборки.