<?xml version="1.0" encoding="UTF-8"?>
<spec xmlns="https://vibevm.org/spec/1">
  <title id="root">Стартовая полоса: как агент читает проект</title>
  <status stage="doc" state="work" audience="user,author,agent"/>
  <p p="1">Когда агент стартует, он читает короткий упорядоченный список файлов, который vibe вычислил из всего, от чего зависит проект. В списке есть фиксированный первый файл, читаемый целиком, и перечень остальных. Одни записи читаются всегда, другие — только когда выполняется условие, и ничего в списке не написано руками.</p>
  <example ref="tree" p="2"/>
  <section id="the-order" title="Порядок чтения">
    <p p="3">[Сессия агента](../glossary/index.xml#agent-session) начинается с файла инструкций, который читает его производитель: `CLAUDE.md`, `AGENTS.md` или `GEMINI.md`. В конце этого файла стоит короткий блок, который поддерживает vibe, и блок говорит: сначала прочитай `vibevm/vibespecs/boot/STATIC.md` целиком, потом открой `vibevm/vibespecs/boot/INDEX.md` и прочитай каждый файл, который он называет, по порядку. Вот и весь старт: три шага, и все — чтение.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-009#SESSION-START-ORDER" p="4"/>
    <p p="5">`STATIC.md` — приоритетная полоса. В ней текст, который должен оказаться перед агентом раньше всего остального; он собран из пакетов, попросивших читать себя именно так, текст каждого пакета ровно один раз. Файл существует, только когда какой-то пакет об этом попросил; у проекта, все пакеты которого читаются по требованию, приоритетной полосы нет, и `vibe tree` печатает `STATIC.md: (none)`, как выше. Проект, который держит свои стартовые файлы в XML-диалекте, получает вместо него `STATIC.xml` с тем же содержимым. Он меняется, только когда меняется набор пакетов или их версии, и этим дёшев: хост агента может держать его в кэше между сессиями.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-048#STATIC-ROLE" p="6"/>
    <p p="7">`INDEX.md` — [манифест](../glossary/index.xml#manifest), а не содержимое. Каждая запись называет файл и говорит, *статический* ли он, то есть читается напрямую, или *динамический* — включение, которое агент разрешает по ходу. Запись может нести условие; тогда агент читает её, только когда условие выполняется для текущей сессии, например для одной операционной системы.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-009#ARTIFACT-INDEX-MD" p="8"/>
  </section>
  <section id="where-it-comes-from" title="Откуда берётся список">
    <p p="9">Каждый пакет может внести один [стартовый фрагмент](../glossary/index.xml#boot-snippet): короткий текст, который читается при каждом старте сессии. Пакет объявляет его в своём манифесте с категорией, а манифест проекта решает, как фрагмент связан: вкомпилирован в приоритетную полосу или перечислен в `INDEX.md` и читается по требованию. Выбор проекта сильнее предложения пакета.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-009#INCLUSION-TYPES" p="10"/>
    <p p="11">`link = "dynamic"` — умолчание: [вклад](../glossary/index.xml#contribution) становится путём в `INDEX.md`, читается по требованию и ограничен условием `when`, если фрагмент его объявляет. `link = "static"` вкомпилирует текст в приоритетную полосу, читаемую первой и целиком; им пользуются скупо, потому что он дублирует текст на диске.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-009#LINK-DYNAMIC" p="12"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-009#LINK-STATIC" p="13"/>
    <p p="14">[Тип связи](../glossary/index.xml#link-type) принадлежит ребру: его объявляет потребитель, и он никогда не впечатан в пакет. Голый `static` — это `static-soft`: пакет, статически связанный несколькими потребителями, компилируется один раз в общее место, и каждый на него ссылается. `static-hard` вкомпилирует его в собственную полосу каждого потребителя. `static-transitive` делает статическими пакет и всё его поддерево, перекрывая динамические рёбра внутри. Каждый пакет в дереве зависимостей несёт собственные стартовые файлы: то, что в него вкомпилировано, и то, на что он ссылается динамически; корень проекта — один такой пакет среди многих.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-038#EDGE-IS-INSTRUCTION" p="15"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-038#MODE-STATIC-SOFT" p="16"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-038#MODE-STATIC-HARD" p="17"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-038#EDGE-STATIC-TRANSITIVE" p="18"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-038#UNIT-PER-PACKAGE" p="19"/>
    <p p="20">vibe вычисляет последовательность для каждого проекта из разрешённого графа зависимостей: основа, которую объявляет сам проект, затем его собственный стартовый текст, затем фрагменты его зависимостей, причём зависимость идёт раньше того, что от неё зависит. Авторы не нумеруют свои фрагменты, и два пакета не могут драться за позицию, потому что порядок выводится, а не объявляется.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-009#CATEGORY-ORDER" p="21"/>
  </section>
  <section id="cost" title="Почему она короткая">
    <p p="22">За каждое слово в полосе платят при каждом старте сессии, каждым агентом, который открывает проект. Поэтому полоса держит инструкции, а не объяснения: что делать, где правила, какие адреса цитировать. Всё, что агенту нужно лишь иногда, включая это руководство, остаётся вне полосы и берётся по адресу, когда возникает вопрос. Текст стартового фрагмента нарочно пишется под этот бюджет.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-048#THE-LAYER-LAW" p="23"/>
    <p p="24">Один и тот же префикс служит каждому агенту: когда босс и его воркеры загружают одну побайтно одинаковую полосу, кэш, который прогрел один из них, служит всем остальным. Вот почему в неё не может попасть ничего посессионного или поагентного: ни имён, ни идентификаторов, ни меток времени.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-048#STATIC-PREFIX-SHARING" p="25"/>
  </section>
  <section id="edge-cases" title="Особые случаи и правила">
    <p p="26">Фрагмент, объявляющий условие, всегда остаётся динамической записью, какой бы [тип связи](../glossary/index.xml#link-type) ни просил проект: условие нельзя вычислить заранее, а значит, текст нельзя вкомпилировать в приоритетную полосу.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-009#WHEN-FORCES-DYNAMIC" p="27"/>
    <p p="28">Цикл среди требований — жёсткая ошибка при генерации полосы, с указанием виновного пути; полоса никогда не записывается связанной наполовину.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-034#STEP-REJECT-CYCLES" p="29"/>
    <p p="30">Сгенерированная полоса никогда не бывает целью цитаты. Правила цитируют по адресу их исходного документа, никогда по их месту в `STATIC.md`, потому что полоса — вывод компилятора и меняется всякий раз, когда меняется набор зависимостей.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-009#COMPILED-LANE-IS-NOT-A-CITATION-TARGET" p="31"/>
    <p p="32">Документация в полосу не попадает никогда. У пакета документации по определению нет стартового фрагмента; агент добирается до этого руководства через [навык](../glossary/index.xml#skill) или по адресу, когда оно ему нужно.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#INV-DOC-NEVER-BOOTS" p="33"/>
  </section>
</spec>
