Некоторый технический долг объявляет о себе сам. Упавший тест, выброшенное исключение, число, которое неверно — и неверно очевидным образом. Другой долг невидим: он не падает, он просто отсутствует или тихо выдаёт неправильный результат. В этом спринте закрыты три позиции второго рода.
Три типа работы: восстановление, автоматизация, очистка.
compactionEnricher определяет, какие сущности появляются вместе в сжатых представлениях графа — компактных видах, которые система строит, когда граф слишком велик для полного отображения. У него был TypeScript-исходник. К моменту, когда кто-то пришёл за ним, в репозитории остались только скомпилированный JavaScript, карта исходников и декларации типов. Сам файл .ts исчез.
Это восстановимая ситуация. Карта исходников фиксирует соответствие между скомпилированным выводом и оригинальным источником: номера строк, имена переменных, структура. В сочетании с декларациями типов исходный TypeScript можно восстановить с приемлемой точностью. Восстановление было выполнено. Исходный файл вернулся в реестр.
.js, карта исходников .js.map, декларации типов .d.tscompactionEnricher.tsВ процессе восстановления обнаружился существующий баг. Enricher наполняет массив hiddenIds через вызов findByType() — запрос к базе данных, порядок результатов которого зависит от внутреннего состояния движка и не гарантирован между запусками. Массив никогда не сортировался перед обработкой. Это означало, что выбор primaryVia — первого скрытого идентификатора для каждой пары записывающий→читающий — мог давать разные результаты при разных прогонах на одном и том же графе.
hiddenIds.sort() — стабильная лексикографическая сортировка, применяемая после сбора всех идентификаторов узлов. Без неё порядок возврата findByType() зависит от внутреннего состояния движка и меняется между запусками. С ней выбор primaryVia детерминирован.
Conductor — мост передачи сообщений, маршрутизирующий вывод агентов в Telegram — работал как ручной процесс. Запуск системы требовал открыть терминал и запустить процесс вручную. При перезагрузке машины conductor останавливался — до тех пор, пока кто-то не замечал и не запускал его снова. Если процесс падал, он оставался остановленным. Система была настолько надёжной, насколько внимателен оператор.
Правильно управляемый фоновый процесс — это служба. conductor.service описывает процесс для systemd: рабочую директорию, команду запуска, политику перезапуска, зависимости. Регистрируется один раз. После этого система управляет им сама.
systemctl enable --now conductor — conductor запускается при загрузке и перезапускается при сбое. deploy/README.md документирует полную процедуру установки: требования к среде, файл юнита, ожидаемое поведение. Следующий оператор, настраивающий систему, не будет восстанавливать процедуру по памяти.
MODULE_CONTAINERS — набор типов узлов, которые compaction enricher учитывает при определении того, какие узлы входят в сжатый вид модуля. В этом наборе был INTERFACE. INTERFACE перестал быть размещаемым в системе layout в апреле 2026 года. Ему не было места в списке типов, которые система способна рендерить и компрессировать.
Последствия были тихими. Enricher включал узлы INTERFACE в сжатые виды — молча производя структурно некорректный вывод для любого графа, содержащего интерфейсы. Ошибок не выбрасывалось. Вывод был просто неверным — в том смысле, который виден лишь тому, кто знает, каким должен быть правильный результат.
INTERFACE удалён из MODULE_CONTAINERS. Compaction enricher больше не включает узлы INTERFACE в сжатые виды. Набор теперь отражает фактическое состояние системы layout.
Спринт закрыл три разных типа долга. compactionEnricher: исходный файл, выпавший из реестра, — восстановлен из того, что осталось, и исправлен попутно обнаруженный баг. Служба conductor: инфраструктура, зависевшая от ручного вмешательства, — теперь управляется операционной системой. Запись MODULE_CONTAINERS: структура данных, описывавшая реальность, которая изменилась, — обновлена в соответствие с ней.
Ни одна из этих задач не требовала новых функций. Все три требовали, чтобы кто-то заметил: что-то не так — и это не объявит о себе само.
Три типа работы: восстановление, автоматизация, очистка. Реестр обновлён.
Валентина Архиповна Протоколова закрыла три позиции реестра. Она уже приступила к поиску следующего пробела.