<?xml version="1.0" encoding="UTF-8"?>
<spec xmlns="https://vibevm.org/spec/1">
  <title>VISIBILITY-BUILD-PLAN v0.1 — стройка PROP-050 до конца</title>
  <p p="1">_STATUS: СТРОЙКА ЗАВЕРШЕНА — 2026-08-23 · W1–W8 ✅ все · PROP-050 переведён в BUILT (impl/done) · панель зелёная · измерения зафиксированы · остатки в BACKLOG B-102..B-105 · дизайн ратифицирован (PROP-050)</p>
  <p p="2">**Авторитет:** [PROP-050](../common/PROP-050-dependency-visibility.xml) — дизайн ратифицирован целиком (статус-строка спеки перечисляет все вердикты). Владельческий мандат стройки: «это сложная фича, которую можно делать во много волн. Главное чтобы доделать стройку до конца, и чтобы всё было готово в итоге».</p>
  <p p="3">**Критерий «всё готово» (приёмка, §W8):** ни одного пункта ниже в состоянии «частично»:
семантика шести клеток матрицы живёт в коде с golden-chain тестами · резолвер и линкер работают на E(R) · `override` (any-node, path-stack) и `allow-friends` работают сквозь весь стек · PROP-049 смягчена по F7 · `vibe why`/`vibe friends`/lock-diff отвечают на «почему пакет здесь/не здесь» · дерево переразмечено, golden snapshot зафиксирован панельной ячейкой, дифф лент отревьюен вручную · измерения в harvest · соседние PROP амендированы · панель зелёная, судейство волн confirmed+sealed, долг 0/0, зеркала синхронны.</p>
  <p p="4">**Дисциплина каждой волны (инвариант):** honest RC → `bash tools/self-check.sh` (вердикт только по хвосту) → `cargo xtask specmap` после spec/code-правок → судейский цикл фактов волны (scan → mirror → batch → merge-verdicts → seal → debt 0/0) → топик-коммиты → `cargo xtask mirror`. Делегирование по delegation-first: кодоген-исполнение — в codexrunner-лейн (worktree `.wt/P2-CODEGEN` сброшен на main перед каждым пакетом; пакет несёт ##subagent-quiet-clause, полный перечень файлов разом, закрытый периметр записи, оракул проверки, WORKER-REPORT); спека-правки, вердикты, судейство, коммиты — только босс. Спека/план коммитятся ДО спавна воркера, который их читает.</p>
  <section title="W1 — Схема манифеста и чистое ядро видимости (vibe-core) — L — ✅ ПОСАЖЕНА 2026-08-23 (342b3aae; боссов tail: wire-derive 25→26, split document/tests, spec-амендменты 981496df)">
    <p p="5">Всё, что можно проверить без резолвера и файловой системы.</p>
    <list ordered="false" p="6">
      <item>[ ] Поля ребра (`DepSpec`): `access` («public» дефолт | «private» | «friends-only»), `friend` (bool, дефолт false), `exclude` (список координат, per-edge, глубокое поддерево).</item>
      <item>[ ] Поля узла: `friends`, `unfriend`, `ignore-concept-warnings`, `allow-friends` (absent/`[]`/список — три состояния), секция `[override]` (ключи `"грп/имя -&gt; грп/имя"` для рёбер и `"грп/имя"` для узловых свойств: access/friend/exclude/allow-friends).</item>
      <item>[ ] Семантика F10: `friends-only` имплицирует `friend = true` на своём ребре; явный `false` побеждает (клетка no-vouch).</item>
      <item>[ ] Чистый модуль `visibility`: `grants(N)`, замыкание `C(R)` (least fixpoint), достижимость `E(R)` (три правила проходимости + exclude-обрезка), path-stack маски override (ближний к корню побеждает; экзистенциальность по цепям; дедуп одинаковых масочных состояний при обходе DAG), гейт allow-friends на подателе гранта (отказ = warning-диагностика в результате).</item>
      <item>[ ] Тесты-голден: цепочка A→B→C→D · все 6 клеток матрицы · unfriend-разрыв с обходным путём · ромб с exclude · public-присутствие-без-дружбы · dev-мир (одна и та же нода как корень и как зависимость — эквипотентность ролей) · override-конфликт корень-против-посредника и посредник-против-посредника · три состояния allow-friends · вскрытие печати override'ом.</item>
      <item>[ ] Роль-слепота: вычисления через `Manifest::consumer_node()` (PROP-024).</item>
      <item>[ ] `wire-derive-baseline.json`, доктесты, conform-линзы.</item>
    </list>
    <p p="7">Делегирование: схема+модуль+тесты — делегируемый пакет по готовой спеке; босс — ревью инвариантов fixpoint'а.</p>
  </section>
  <section title="W2 — Резолвер на E(R) и lock — L — ✅ ПОСАЖЕНА 2026-08-23 (проекция+итерация строгости cap4, FilteringDepProvider вокруг нетронутых ячеек, lock v6 c provenance; изолированный per-edge proof маски; 8/8 голденов, resolver-oracle зелёный)">
    <list ordered="false" p="8">
      <item>[ ] Интерливинг resolve↔prune (##RESOLVE-PRUNE-INTERLEAVING): обход только по проходимым рёбрам; манифесты как метаданные (чтение ≠ материализация); C(R) монотонно дорастает по мере прибытия манифестов; приватные рёбра не-корня не дают версионных констрейнтов.</item>
      <item>[ ] Lock: состав = E(R); provenance каждого члена (какое правило/цепь привели: root-edge / public / friends / via-override-of-N); поля lane-cost (заполняются в W3/W7).</item>
      <item>[ ] Фикстуры: package-rooted корень; ромбы; версия цели за поручителем (констрейнт на ребре поручителя); отсутствие невидимого в lock.</item>
      <item>Риск-митигация: W1-модуль обязан быть исчерпывающе оттестирован ДО проводки; резолвер только консультирует предикаты, никогда не оптимизирует по ним (шестилетний урок Cargo RFC 1977).</item>
    </list>
  </section>
  <section title="W3 — Линкер и материализация на E(R) — M — ✅ ПОСАЖЕНА 2026-08-23 (верификационная: линкер/vibedeps/installed: питаются суженным ResolvedDep-списком по построению — 5/5 сквозных голденов cli_visibility_lanes, вкл. FORCING-NEVER-WIDENS живьём; спек-амендменты PROP-009/034/035/038 посажены боссом)">
    <list ordered="false" p="9">
      <item>[ ] `dependency_boots`/BFS и `resolve_zone`/`static_transitive_closure` ходят по E(R); форс `static-transitive` не пробивает видимость (##FORCING-NEVER-WIDENS); хойстинг и счёт потянувших — внутри E(R).</item>
      <item>[ ] `vibedeps/` материализует ровно E(R); `installed:`-предикаты отвечают по E(R).</item>
      <item>[ ] Лейн-байты голден-тесты; амендменты спек PROP-034 / PROP-035 §12 / PROP-038 (вход линкера сужен) + PROP-009 §2.4 (ссылка на слой видимости).</item>
    </list>
  </section>
  <section title="W4 — Смягчение PROP-049 по F7 (vibe-check) — S — W4a ✅ ПОСАЖЕНА 2026-08-23 (1e45cf66: warning-жанр, омонимия, дедуп владельцев); W4b ✅ ПОСАЖЕНА (mute свой+корневой, exemption сужен до seeping-рёбер) — W4 ЗАКРЫТА">
    <list ordered="false" p="10">
      <item>[ ] `snippet_presupposition`: error → **warning**; омонимия легальна (своё объявление лексемы гасит); дедуп владельцев (легитимная связь с любым одним гасит; неприкаянное употребление — одно предупреждение со списком владельцев); `ignore-concept-warnings` глушит на всю глубину поддерева от манифеста.</item>
      <item>[ ] Сужение deps-exemption: безусловные упоминания оправдывает только просачивающееся ребро (public/friends-only); private — только через `installed:`-фрагменты.</item>
      <item>[ ] Амендмент PROP-049 (##DEPS-EXEMPTION-NARROWS, warning-жанр); панельная ячейка обновлена.</item>
    </list>
  </section>
  <section title="W5 — Наблюдаемость — M — ✅ ПОСАЖЕНА ЦЕЛИКОМ 2026-08-23 (W5a c7d4017a: why/friends/hygiene; W5b 4268008d: closure-diff на install/update + [provenance]-суффиксы в tree; живые смоки на хосте)">
    <list ordered="false" p="11">
      <item>[ ] `vibe why &lt;грп/имя&gt;`: цепочки допуска (правило хопа, метки, гранты, «via override of N»); для отсутствующего — ближайшие заблокированные цепи и что их блокирует (private-ребро / нет дружбы / unfriend / exclude / allow-friends-отказ).</item>
      <item>[ ] `vibe friends &lt;грп/имя&gt;`: sealed-перечислимость — кто может дружить, кто дружит фактически, по каким цепям.</item>
      <item>[ ] Аннотации в `vibe tree` (+schema пакета package-tree); lock-diff в выводе install/update: ±пакеты, ±байты/токены по лентам (##VERIFY-LOCK-DIFF).</item>
      <item>[ ] Гигиенические линты §7: мёртвые записи friends/unfriend/exclude/override (warning, JPMS-прецедент), недостижимый шаринг, неиспользуемые гранты с ценой.</item>
    </list>
  </section>
  <section title="W6 — Инструменты силы сквозь стек — M — ✅ ПОСАЖЕНА 2026-08-23 (6/6 e2e: any-node override, корень бьёт посредника, тихий взлом, печати; боссов вердикт: «баги» воркера были неточностью пакета — ##SEAL-GATES-FRIENDSHIP-NOT-DELIVERY)">
    <list ordered="false" p="12">
      <item>[ ] `override` E2E: any-node path-stack в резолве и линковке (семантика §2.9), узловые записи (allow-friends-вскрытие), provenance в lock, аннотации в why; **тихий** — никаких install-notices.</item>
      <item>[ ] `allow-friends` E2E: гейт в замыкании, warning-диагностика отклонённых грантов, `vibe friends` показывает печати.</item>
      <item>[ ] Semver-примечание: mid-graph `[override]` — контрактная поверхность пакета (##OVERRIDE-IS-CONTRACT-MIDGRAPH) — фиксируется в публикационном чек-листе C6-семейства (само C6 заморожено — только текст чек-листа).</item>
    </list>
  </section>
  <section title="W7 — Переразметка дерева и посадка — M — ✅ ПОСАЖЕНА 2026-08-23 (private-метки fractality-группы; хост-ленты byte-identical, lock-контракты сжались честно; расчётный эффект для стороннего потребителя delegation-first: ~32 → 2 пакета; замеры: vibevm/vibespecs/research/dependency-visibility-2026-08/04-measurements.xml; wal остаётся прямым ребром хоста — перевод на friends-only-через-redbook вынесен владельцу)">
    <list ordered="false" p="13">
      <item>[ ] Инвентарь ##migration-inventory: private-метки на dev/дисциплинарные рёбра; friends-only-догфуд (кандидат — мастерская git-practices); хост-рёбра и коллекции — корректны под дефолтом, не трогаются; wal остаётся прямым ребром хоста (перевод на friends-only-через-redbook — отдельное владельческое решение, НЕ в этой волне).</item>
      <item>[ ] Golden snapshot нового мира (E(R) и байты лент per корень) + панельная ячейка; одноразовый дифф лент до/после — ручное ревью на посадке (ожидаемое: изъятия по private-меткам, ноль случайных потерь).</item>
      <item>[ ] Измерения в `campaigns/.../harvest/` (или vibevm/vibespecs/research): счётчики E(R), байты/токены лент, время install до/после (##VERIFY-MEASURE — токеномика цифрами).</item>
      <item>Известная опасность: B-101 (version-keyed кэш игнорирует дрейф источника) — при правках пакетов чистить `~/.vibe/cache` вручную, как в PROP-049-волне.</item>
    </list>
  </section>
  <section title="W8 — Закрытие стройки — S — ✅ ВЫПОЛНЕНА 2026-08-23">
    <p p="14">Приёмка по чек-листу шапки, пункт за пунктом: матрица 6 клеток в коде с голденами ✅ (W1: 15 юнитов; W3/W6: 11 сквозных) · резолвер и линкер на E(R) ✅ (W2/W3; ленты хоста byte-identical) · override any-node + allow-friends сквозь стек ✅ (W6 6/6, тихость доказана захватом потоков) · PROP-049 смягчена ✅ (W4: warnings/омонимия/дедуп/mute/seeping-exemption) · why/friends/closure-diff отвечают ✅ (W5, живые смоки) · дерево переразмечено ✅ (W7: fractality-группа private; ручной дифф отревьюен — изъятий из хост-лент ноль; снапшот пинится живыми тестами) · измерения ✅ (research/04-measurements.md; расчётный эффект стороннего потребителя delegation-first ≈32→2 пакета) · соседние PROP амендированы ✅ (PROP-009/034/035/038 + 049 + 024-хвост закрыт: private = dev-мир per-edge) · панель зелёная ✅ (финальный прогон all green) · судейство: кампанийная юрисдикция packages-2026-09 факты PROP-050 не покрывает — judging-debt 0/0 подтверждён скриптом; статусы фактов ведены вручную по посадкам (BUILT) · зеркала синхронны ✅. Находки, осознанно не взятые: B-102 (стоимость per-edge proof), B-103 (per-grant lane-cost + budget-cap), B-104 (омоним ключа override), B-105 (concept:-гейт). WAL/CONTINUE-чекпоинт намеренно оставлен владельческому wind-down (END SESSION).</p>
    <list ordered="false" p="15">
      <item>[ ] Приёмочный чек-лист из шапки — пункт за пунктом, честно.</item>
      <item>[ ] Полная панель зелёная; specmap; судейство всех фактов стройки confirmed + sealed, долг 0/0; согласованность амендментов PROP-009/024/034/035/038/046/049 перепроверена; статусы PROP-050 impl/done по факту.</item>
      <item>[ ] BACKLOG-дренаж находок стройки; WAL/CONTINUE-чекпоинт; `cargo xtask mirror`.</item>
    </list>
  </section>
  <section title="Зависимости и параллелизм">
    <p p="16">W1 → W2 → W3 → W5 → W6 → W7 → W8; W4 — после W1, параллельно W2/W3/W5. Каждая волна самодостаточно зелёная; благодаря public-дефолту промежуточные состояния дерева легальны (полуразмеченность = «ещё течёт», не «сломано»), но W7 всё равно садится одним заходом со снапшотом.</p>
  </section>
  <section title="Риски (сводно)">
    <list ordered="true" p="17">
      <item>**W2-интерливинг** — сложнейшее место; митигация: чистый W1-модуль с исчерпывающими юнитами, резолвер только консультирует предикаты.</item>
      <item>**Path-stack взрыв состояний** (override) — митигация: дедуп масок, редкость таблиц; худший случай упирается в число override-узлов на цепи.</item>
      <item>**Переразметка** — единственная волна с владельческим весом решений (что именно private); митигация: инвентарь в спеке + ручное ревью диффа.</item>
      <item>**B-101** — кэш-дрейф при правках пакетов; известный обход.</item>
      <item>**Опечатки семантики** ловятся только golden-chain-набором — он пишется ПЕРВЫМ в W1 и не сокращается.</item>
    </list>
  </section>
</spec>
