# Убрать VibeVM из проекта {#root}

@status:doc/work @audience:user

[p01] Когда проект закончен и должен уйти без следа инструмента, который помогал его строить, одна операция удаляет каждый файл и каждое упоминание vibe, сохраняя продукт и его сборку нетронутыми.

[p02]
```prompt
Покажи мне план зачистки для проекта VibeVM в текущей папке, затем экспортируй зачищенную копию в новую папку product-clean рядом с проектом и докажи, что копия собирается без vibe.
```

- needs: навык vibevm, установленный у вашего агента; проект с `vibe.toml` и контрактом зачистки, подогнанным под него: `vibe scrape contract init` пишет консервативный вариант по умолчанию, который отказывается удалять файлы, чью неизменность не может доказать, и проверяет здоровье через `cargo`; родной инструмент сборки проекта в `PATH`

outcome: `../product-clean` существует, не содержит ни папки `vibevm/`, ни `vibe.toml`, ни `vibe.lock`, ни управляемого блока в файлах инструкций для агентов, а её родная сборка и тесты проходят

- assert: `test ! -e ../product-clean/vibe.toml`
- assert: `test ! -e ../product-clean/vibevm`

## Что происходит {#what-happens}

[p03] Агент создаёт контракт командой `vibe scrape contract init`, если у проекта его нет, и подгоняет: для собственных деревьев vibe, которые вы никогда не правили, он ставит `modified = "delete"` и оставляет проверку здоровья, подходящую проекту. Он выполняет `vibe scrape --plan`: команда читает контракт, классифицирует каждый файл, который инструмент когда-либо писал или помечал, и печатает полный план, ничего не записывая: что удаляется, что переписывается, что остаётся под нейтральным именем. Затем он выполняет `vibe scrape --output` с абсолютным путём новой папки: команда создаёт зачищенную копию и прогоняет на ней проверки здоровья проекта; оригинал не тронут. Копия — обычный проект своего языка: без [манифеста](../glossary/index.xml#manifest), без [лок-файла](../glossary/index.xml#lock-file), без дерева зависимостей, без стартовых файлов, без [управляемого блока](../glossary/index.xml#managed-block), без аннотаций в исходниках, которые указывали на [спецификации](../glossary/index.xml#specification).

> [p04] A scraped tree is a project
>       tree for which every contract-selected Vibe path, dependency, managed
>       marker, source annotation, tool script and environment reference is absent
>       or explicitly retained under a neutral identity, and whose required
>       native health panel is accepted after scraping under the declared strict
>       or no-regression baseline policy. A retained non-pass verdict is never
>       described as an unconditional pass.
>
> <spec://org.vibevm.core/vibevm/common/PROP-056#SCRAPED-TREE>

## Руками {#by-hand}

[p05] 1. Создайте контракт. Вариант по умолчанию консервативен: он называет деревья vibe, отказывается от всего, чью неизменность не может доказать, и проверяет здоровье через `cargo`:

[p06] Example `scrape-contract` is copied from the source page at projection time.

[p07] 2. Подгоните его. У свежего проекта нет базовой отметки изменений для файлов vibe, поэтому два правила `[[classify]]` отвергают их как неизвестные. Если вы никогда не правили эти деревья, поставьте `modified = "delete"` в обоих. Замените `[[healthcheck]]`, если проект не рабочее пространство Rust. Затем проверьте: `vibe scrape contract check --path hello-vibe`.

[p08] 3. Посмотрите план:

[p09] Example `scrape-plan` is copied from the source page at projection time.

[p10] 4. Экспортируйте в новую папку, которой ещё не должно существовать и в имени которой нет `..`:

[p11] Example `scrape-output` is copied from the source page at projection time.

[p12] 5. Или [зачистите](../glossary/index.xml#scrape) на месте: это восстановимая транзакция, и ей нужно явное разрешение: `vibe scrape --in-place --assume-yes`. Если её прервали, `vibe scrape --recover --path <root>` доводит незавершённую транзакцию до конца.

> [p13] `vibe scrape --recover
>       --path <project>` settles the one pending user-local transaction.
>       Recovery reads the journaled contract and plan, never the possibly removed
>       project contract. A new scrape refuses while recovery is pending.
>
> <spec://org.vibevm.core/vibevm/common/PROP-056#SCRAPE-RECOVER-COMMAND>

[p14] Команды в одном месте. `vibe scrape contract init` пишет консервативный вариант по умолчанию, только когда контракта ещё нет, а `contract check` разбирает его и планирует, ничего не записывая. `vibe scrape --plan` только читает и без указания режима планирует форму «на месте», больший риск. `--output` создаёт экспорт в папке, которой не должно существовать, и никогда не меняет исходное дерево. `--in-place` выполняет журналируемую транзакцию, в интерактивном режиме показывает перепись изменённых и удаляемых файлов, а без присмотра требует `--assume-yes` после зелёного плана. Планирование и проверка работают везде; в эту первую эпоху изменяющие режимы работают только на Windows, где механика безопасности доказана.

> [p15] `vibe scrape contract
>       init` writes a conservative default contract only when absent;
>       `vibe scrape contract check` parses and plans it read-only. Existing
>       contracts are never silently refreshed by install or a language
>       discipline.
>
> <spec://org.vibevm.core/vibevm/common/PROP-056#SCRAPE-CONTRACT-COMMANDS>

> [p16] `vibe scrape --plan
>       [--contract <path>] [--output <dir> | --in-place]` is read-only.
>       With neither execution mode, it plans the in-place form because that is the
>       larger risk surface; it writes no project, journal, quarantine or report
>       file.
>
> <spec://org.vibevm.core/vibevm/common/PROP-056#SCRAPE-PLAN-COMMAND>

> [p17] `vibe scrape --output
>       <absent-dir> [--contract <path>]` creates a scraped export and
>       never changes the source tree. The destination must be absent; adoption of
>       an existing directory is forbidden.
>
> <spec://org.vibevm.core/vibevm/common/PROP-056#SCRAPE-EXPORT-COMMAND>

> [p18] `vibe scrape --in-place
>       [--contract <path>]` executes the journaled in-place transaction.
>       Interactive use shows the exact modified-file and deletion census;
>       unattended use requires `--assume-yes` after a green plan.
>
> <spec://org.vibevm.core/vibevm/common/PROP-056#SCRAPE-INPLACE-COMMAND>

> [p19] Epoch-1 contract
>     parsing, planning and contract checking are portable. Mutating
>     `--output`, `--in-place` and `--recover` execution is enabled only
>     on Windows, where the implementation proves handle-relative exclusive
>     directory creation, no-replace publication, write/delete-denying namespace
>     seals and restartable cleanup. Linux, macOS and other hosts return the typed
>       blocker `scrape-platform-unsupported` before journal creation or project
>       mutation. Their wire/state-machine shape remains portable, but the product
>       does not claim a weaker check-then-rename implementation as support.
>
> <spec://org.vibevm.core/vibevm/common/PROP-056#SCRAPE-EXECUTION-PLATFORM-E1>

## Контракт {#the-contract}

[p20] Что считается принадлежащим vibe, а что вашим, не угадывается по именам файлов; это говорит контракт. Контракт живёт в проекте по пути `vibevm/scrape/contract.toml`: `vibe scrape contract init` пишет консервативный вариант по умолчанию, `vibe scrape contract check` проверяет существующий, а `--contract <file>` читает другой. Контракт внутри дерева удаляется последним, так что план можно перечитывать до самого конца.

> [p21] The default is the project-root
>     literal `vibevm/scrape/contract.toml`. Every operand inside it is
>     project-root-relative regardless of where an alternate contract lives.
>     Contract location never changes mutation authority.
>
> <spec://org.vibevm.core/vibevm/common/PROP-056#DEFAULT-CONTRACT>

[p22] Зачистка никогда не удаляет путь вслепую: скрипт сборки, который вызывает инструмент vibe, сгенерированные исходники продукта, лежащие рядом с одноразовым сгенерированным состоянием, написанная автором спецификация, делящая дерево со сгенерированным выводом стартовой полосы, — всё это получает решение по контракту, а нетронутые файлы остаются побайтно теми же.

> [p23] Product preservation means:
>       all untouched files are byte-identical; every authored source rewrite is
>       metadata erasure-equivalent; every declared relocation preserves exact
>       bytes and mode; native manifests and lockfiles describe the scraped
>       dependency graph; the health oracle accepts the result.
>
> <spec://org.vibevm.core/vibevm/common/PROP-056#PRODUCT-PRESERVATION>

[p24] Контракт строг: неизвестные таблицы и значения отвергаются, `schema` равна 1, каждый идентификатор уникален. Файлы, которые вы написали под `vibevm/vibespecs`, никогда не считаются сгенерированными из-за папки; контракт, который хочет нулевого остатка, сам называет их для удаления или переноса. Сгенерированный код, тесты и модели, которые проект принял, — продукт, и они остаются, пока строка не назовёт их. Глобы только выбирают; байты меняются только через типизированные адаптеры, никогда через регулярное выражение или переписывание в оболочке. Нулевой остаток означает ноль зарегистрированных идентичностей, путей и маркеров, а не слово «vibe» в вашей прозе.

> [p25] The TOML schema rejects unknown
>       tables, fields, tagged kinds and enum values. `schema` must equal 1;
>       every id is a unique portable token across classification, rewrite,
>       relocation, assertion and health rows.
>
> <spec://org.vibevm.core/vibevm/common/PROP-056#CONTRACT-STRICTNESS>

> [p26] Authored files under
>         `vibevm/vibespecs` are not generated merely because of their
>         directory. A full zero-residue contract must explicitly delete them or
>         relocate them to a neutral home. No built-in policy silently decides
>         their value.
>
> <spec://org.vibevm.core/vibevm/common/PROP-056#AUTHORED-SPECS>

> [p27] Generated cells, seams,
>         tests, models and other useful application source are authored product
>         once accepted into the project. They remain unless an exact contract
>         relocation or deletion row names them. Origin in a discipline is not
>         deletion authority.
>
> <spec://org.vibevm.core/vibevm/common/PROP-056#PRODUCT-CODE-SURVIVES>

> [p28] Globs select candidates; they never
>     rewrite bytes. Authored source and structural manifests are changed only by a
>     closed typed adapter. Generic regex replacement, shell rewrite hooks,
>     implicit format conversion and whole-document reserialization are
>     forbidden.
>
> <spec://org.vibevm.core/vibevm/common/PROP-056#TYPED-ONLY>

> [p29] Zero residue means zero
>       registered Vibe identities, paths and markers selected by this contract.
>       It does not mean deleting an ordinary word such as “vibe” from prose, nor
>       undoing architectural choices learned while using a discipline.
>
> <spec://org.vibevm.core/vibevm/common/PROP-056#ZERO-RESIDUAL-SCOPE>

[p30] Вы задаёте политику, движок даёт механику и вердикты. Всё, что запечатанный контракт и наблюдаемое дерево не могут решить, — блокер, а не догадка. Инструмент не переписывает историю git, не публикует и не удаляет то, что выложено на вашу машину; это остаётся отдельными явными операциями.

> [p31] The owner supplies policy:
>       delete, keep, relocate, strip, retain, required checks and acceptable
>       baseline mode. The engine supplies all mechanics and verdicts. Any state
>       not decidable from the sealed contract and observed tree is a blocker,
>       never a guess or best-effort success.
>
> <spec://org.vibevm.core/vibevm/common/PROP-056#ALGORITHMIC-BOUNDARY>

> [p32] Schema 1 does not reverse the historical
>     influence of VibeVM on product architecture, infer replacements for arbitrary
>     runtime libraries, mutate Git history, publish artifacts, or silently remove
>     user-global deployments. Schema 1 does not discover, report or remove
>     receipt-owned user-global deployments; the operator runs the existing
>     explicit undeploy operation separately when external removal is
>     desired.
>
> <spec://org.vibevm.core/vibevm/common/PROP-056#NON-GOALS>

## Особые случаи и правила {#edge-cases}

[p33] Зачистка — не очистка. `vibe clean` удаляет то, что vibe может сгенерировать заново, и сохраняет связь; зачистка удаляет саму связь, и потому ей нужны контракт, доказательство здоровья и восстановимая фиксация.

> [p34] PROP-053 `vibe clean` removes
>       regenerable dependency and boot products while retaining authored project
>       state and `vibe.lock`. Scrape is not clean: it removes the Vibe
>       relationship itself and therefore requires a contract, native health
>       proof and recoverable commit.
>
> <spec://org.vibevm.core/vibevm/common/PROP-056#RELATED-CLEAN>

[p35] `--output` и `--in-place` взаимно исключают друг друга; план доступен всегда, до любого из них.

> [p36] `--output` and
>       `--in-place` are mutually exclusive. `--recover` accepts neither
>       mode nor contract because the durable journal already fixes both.
>
> <spec://org.vibevm.core/vibevm/common/PROP-056#SCRAPE-MODE-EXCLUSIVITY>

[p37] Слова «attach» и «detach» зарезервированы для будущей связи с живым инструментом, например подключения отладчика; зачистка никогда не синоним для них.

> [p38] Scrape
>     is the terminal cleaning operation defined here: it removes the selected
>     VibeVM repository layer while preserving the native product. The command
>     vocabulary deliberately reserves attach and
>     detach for a future live-tool relationship such as connecting
>     and disconnecting a debugger. Scrape is never an alias for that future
>     runtime operation, and no detach spelling is accepted by this command.
>
> <spec://org.vibevm.core/vibevm/common/PROP-056#SCRAPE-TERM-BOUNDARY>

