flang компилятор доказывает, что программа не зациклится 0.6.2 GitHub

Прогон в общем каталоге теряется молча: чужой процесс пишет в файл с тем же именем

Долгий прогон, чей вывод перенаправлен в файл с предсказуемым именем (/home/b/tmp-flang/selfboot.log), в общем каталоге не переживает соседа. Второй агент запускает то же самое, берёт то же имя — и в файле оказывается ЧУЖОЙ вывод, без единого признака подмены.

Отличить это от собственного результата можно только по путям в трассировке стека: node печатает file:///srv/flang-rabota/<дерево>/..., и дерево там чужое.

Чем подтверждено. 18 августа 2026: прогон self-bootstrap.test.mjs, запущенный в /srv/flang-rabota/vetki, дал в логе трассировки из /srv/flang-rabota/vyhod — четыре штуки, ни одной своей. Вдобавок файл был склеен из двух прогонов: итог сообщал «tests 29, pass 29, fail 0», а выше по тексту лежали два падения с AssertionError. Прогон пришлось повторить целиком — пятнадцать минут впустую.

Правило. Имя файла вывода делать неповторимым в момент запуска: L=/home/b/tmp-flang/<что>-$$-$(date +%s).log. $$ — номер оболочки, время — защита от повторного запуска той же оболочкой.

Это тот же класс, что и «останавливать прогоны по маске имени нельзя»: общий каталог и общая машина делают любое предсказуемое имя чужим тоже. Признак класса — имя, которое может выбрать не только ты.

Дополнение 19 августа 2026: подменяется не только лог, но и ЗАМЕР. В том же общем каталоге лежала выгрузка ствола (/home/b/tmp-flang/stvol), заведённая как основа сравнения «что краснело до правки». Чужой прогон выполнил в ней ./ярлык числа, переписав docs/site/numbers.json, — и сравнение стало показывать беды там, где их не было: сторож чисел сайта на «стволе» давал 10 расхождений одного рода, а на моём дереве 14 другого. Разница объяснялась не правкой, а чужой записью. Проверилось это одной командой: свежая выгрузка того же коммита в СВОЙ подкаталог дала ровно те же 14, что и рабочее дерево.

Правило шире. Неповторимым обязано быть не только имя файла вывода, но и каталог, в котором лежит основа сравнения: mkdir -p /home/b/tmp-flang/<моя-ветка>/ и всё своё — внутрь. Основа сравнения, которую может переписать сосед, — это не основа. И сравнивать красное с красным следует ПОЛНЫМИ списками через diff, а не по числу бед: числа 10 и 14 выглядят близкими, а списки не пересекались вовсе.

Чем ограничено. Проверять по путям в трассировке можно только когда прогон УПАЛ: у зелёного прогона трассировок нет, и подмену видно лишь по времени файла и по числу проверок.

Связано: silent-merge-conflicts