Чужие пакеты надо хранить: из трёх укладов два — это один в два слоя, а третий не про наше десятилетие
Прямой ответ на вопрос «как поступать с написанными другими кодерами пакетами». Укладов предлагалось три, и первое, что с ними надо сделать, — перестать считать их тремя.
Хранилище по содержимому и реестр имён — не выбор из двух, а два слоя одного решения. Хеш отвечает на вопрос «что считать одним и тем же»; имя с версией отвечает на вопрос «как об этом говорить и что ставить». Ни один из двух не закрывает вопрос другого: у хеша нет способа сказать «дай посвежее», у имени нет способа сказать «ровно этот код». Ровно так устроены Go (имена и версии снаружи, хеши в go.sum), Nix и, если снять лозунг, сам Unison Share — адреса внутри, @автор/проект/releases/7.19.2 снаружи. Это уже принятое решение (hash-inside-names-outside), и новые замеры его не пошатнули, а укрепили.
Вывод по спецификации отпадает, и отпадает по счёту, а не по вкусу. Три числа подряд, каждое со своим замером:
| довод | число | где |
|---|---|---|
| из хеша код не восстановить | 540 бит тела против 256 бит адреса | code-cannot-be-derived-from-its-hash |
| спецификация не называет функцию | однозначна в 36,5 % случаев | a-signature-does-not-determine-a-function |
| экономить нечем | вся stdlib — 370 КиБ, весь flang в дереве — 3,4 МиБ | там же |
Третий довод убивает замысел раньше первых двух и по другой причине. Даже если бы синтез работал безупречно, он экономил бы мегабайты места, платя машино-часами вывода. Место уже измерено и признано не проблемой (unison-measured: кодовая база Unison со стандартной библиотекой — 16,7 МиБ, вчетверо меньше обычного node_modules инструментария TypeScript). Оптимизируется ресурс, которого не жалко.
Что от замысла остаётся живым. Не «не хранить», а не искать по имени: законы как указатель поверх хранилища (zakony-kak-ukazatel) — это тот же замысел, но с выполнимой постановкой. Он не отменяет хранилище, он делает его пригодным для поиска.
Рекомендация с ценой — та же, что в docs/modulnost-i-pakety.md, раздел 9, и я её подтверждаю, а не переоткрываю:
- Хеш нормализованного определения. ~1000 строк с тестами, около недели. Окупается не пакетами, а кешом доказательств: сегодня тотальность, постусловия и теоремы пересчитываются на каждом прогоне.
- Манифест, замок, хранилище
~/.flang/store. ~1370 строк, из них 500 — тесты, около двух недель. Синтаксис языка не меняется, меняется только чтение строки виз "...". - Публичный индекс — не сейчас. Пока публикует один человек, реестр пуст.
- Заодно и обязательно: теоремы должны переезжать через импорт. Сегодня связывание берёт
theoremsтолько у входного файла — раздаётся код без доказательств, то есть без того, ради чего язык есть (names-not-hashes).
Чем подтверждено. Замеры 2026-08-18 на ветке work/packages-research, описанные в трёх связанных заметках; числа про Unison и место — прогоны 2026-08-15, ucm release/1.3.0 (unison-measured); цены шагов — разбор по файлам в docs/modulnost-i-pakety.md, раздел 9.
Чем ограничено.
- Горизонт синтеза теперь назван числом снаружи, а не оценён. Рекорд дедуктивного синтеза за десять лет — 75 узлов дерева для одной рекурсивной функции, и медианное тело нашей библиотеки стоит ровно там же (synthesis-from-a-spec-hits-75-tree-nodes). Опровергнуть можно одним наблюдением: синтезатор, собравший из объявленных законов и подписей модуль уровня
flang/stdlib/strings.flang(30 функций), без правки руками. - Но замысел отвергнут не целиком, и это важнее отказа. Две его части выполнимы и обе кладутся поверх хранилища, а не вместо него: перевод данных между спеками, где вывод из спецификации у других стоит в проде (derivation-works-where-the-domain-was-narrowed-on-purpose); и теорема-храповик, под которой агент переписывает уже написанный код (a-ratchet-instead-of-derivation).
- Про сравнение с чужими системами тут нет свежих замеров. Числа по Unison — от 2026-08-15; разбор внешних источников 2026-08-18 их уточнил (unison-pull-brings-all-the-code-not-references, the-unison-diamond-breaks-on-a-type-edit-not-a-version-bump), но не отменил.
- Довод «не копировать целиком» получил ещё одну опору, и её надо назвать честно, потому что она не техническая. Unison 1.0 вышел 2025-11-25, релизы идут (1.3.0 — 2026-05-20), Share и облако живы. Но темп падает: коммитов за 2024 — 3051, за 2025 — 1887, за 2026 к августу — 626, а в июле и августе — 1 и
- В феврале 2026 Unison Computing открыла консалтинг «in a variety of languages, including Scala, Haskell, Rust, Elm, and of course Unison» с целью «cash flow positive … in the next 12 months» (блог) — и это последняя запись в блоге. Прод-пользователей, кроме них самих, найти не удалось. Ставить свою экосистему на чужую инфраструктуру с такой динамикой — отдельный риск сверх 15–25 тысяч строк.
- Решение опровергается тем же наблюдением, что и раньше: две независимые библиотеки разных авторов, обе нужные в одной программе, обе тянущие несовместимые версии третьей. Тогда подъём до одной версии перестаёт быть выходом, и придётся делать квалифицированные имена — парсер, связывание и восемь печатников (14 287 строк).
Связано: hash-inside-names-outside, code-cannot-be-derived-from-its-hash, a-signature-does-not-determine-a-function, zakony-kak-ukazatel, synthesis-from-a-spec-hits-75-tree-nodes, derivation-works-where-the-domain-was-narrowed-on-purpose, a-ratchet-instead-of-derivation, unison-measured, unison-pull-brings-all-the-code-not-references, the-unison-diamond-breaks-on-a-type-edit-not-a-version-bump, names-not-hashes, owner-decisions