
Семь стрел, 429 деревьев: семилетняя ошибка именования, всплывшая за чисткой Mermaid-визуализации
mellonis 1 час назад Семь стрел, 429 деревьев: семилетняя ошибка именования, всплывшая за чисткой Mermaid-визуализации Средний 9 мин 1.8K Open source * JavaScript * Проектирование и рефакторинг * Проектирование API *...
Anthropic — What company has the best second artificial intelligence model at the end of June?
В сфере искусственного интеллекта произошло заметное событие. mellonis 1 час назад Семь стрел, 429 деревьев: семилетняя ошибка именования, всплывшая за чисткой Mermaid-визуализации Средний 9 мин 1. 8K Open source * JavaScript * Проектирование и рефакторинг * Проектирование API * Кейс Заходят как-то две машины Тьюринга в одну диаграмму… а у них имена одинаковые. Я говорю «машины», а на деле — два разных экземпляра State @turing-machine-js/machine, сконструированные по-разному, с разным поведением во время исполнения, и со строго одинаковым state.
Это происходило в библиотеке, которую я разрабатываю в качестве хобби с 2019 года, и я этого не замечал семь лет. Обнаружил случайно, начиная с задачи на чистку Mermaid-визуализации. Закончил — кардинальной переделкой того, как композиция состояний отражается в имени.
Технические детали
И узнал, что за этой переделкой прячется число . Лучник с натянутым луком думает, в какое из деревьев леса попадёт его стрелаС чего всё началосьКомпозиция в движке устроена одним примитивом: baseState. withOverrodeHaltState(overrideState).
Возвращает копию baseState, у которой halt-переходы во время исполнения уходят в overrideState вместо реального halt’а. Дальше я буду называть baseState базовым состоянием, а возвращаемую копию — обёрткой над ним. Композиция через обёртку — единственный способ собрать большую машину из маленьких подпрограмм: каждая подпрограмма в идеале заканчивается halt, и каждый withOverrodeHaltState переопределяет, куда идти после, вместо того чтобы остановиться.
Имя у получившейся обёртки в старом API формировалось так:state. withOverrodeHaltState(B) называется A>B. Просто и наглядно: читается как «A, потом B».
Отраслевые последствия
Эта строка ушла в продакшен в 2019 году и с тех пор не менялась. Она просачивается в логи, сообщения об ошибках, тесты, которые сравнивают state. name, и в любой диагностический вывод, на который смотрит пользователь.
Поводом разобраться стала Mermaid-визуализация. Тикет turing-machine-js#138 ставил задачу убрать дублирование. До v7 toMermaid рендерил обёртку как отдельный узел, на котором повторял все переходы базового состояния — визуально это выглядело так, будто у обёртки своя жизнь.
Но переходы у обёртки те же, что у базы — даже #symbolToDataMap тот же. Своё у неё другое — call-frame-семантика: на входе push override на halt-стек, на halt’е базы — pop. А по сути обёртка вносит сверх базы только одно: куда уходит halt.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





