Вынос текстов проектов из памяти цепи.
Описание и приглашение проекта теперь хранятся в базе контроллера, а в цепи остаётся их sha256 (см. lib/core/text_digest.hpp). Старые строки держат полный текст — на восходе это 345 КБ из 406 КБ таблицы проектов. Шаг заменяет текст его хешем прямо в цепи: хеш считается от тех же байтов, которые лежат в строке, поэтому совпадает с тем, что посчитает контроллер от своей копии текста. Контроллер при такой дельте текст в базе не трогает и сверяет его хеш с цепью.
Работа идёт порциями: за вызов переводится не больше kDigestBytesPerCall байт текста. Все 61 проект восхода за один вызов заняли 203 мс CPU при лимите транзакции 290 мс (замер 23.09.2026) — впритык. Если осталось ещё, вызов пишет «бюджет исчерпан», и раскатка повторяет migrate.
Идемпотентно: строка, где уже лежит хеш или пусто, не переписывается.