Перейти к основному содержимому

ADR 0174 — Автономный бинарник runner перестаёт обещать Mac Intel

Статус​

Accepted. Решено сопровождающим 2026-09-27 (AT-065, HS-035). Ссылается на ADR 0112 (автономный бинарник через bun build --compile, рождённый с пятью целями), ADR 0106 (пакет npm, который становится путём для Mac Intel) и ADR 0149 (подписанный checksums.txt, покрывающий бинарники). Не редактирует ни один из трёх.

Контекст​

ADR 0112 обещал пять целей — linux-x64, linux-arm64, darwin-x64, darwin-arm64, win32-x64, — каждая собирается на своём нативном runner. darwin-x64 никогда не публиковался, и причина измерена на двух уровнях:

  1. Нет пригодного Intel runner. Метка macos-13 указывает на образ, который GitHub вывел из эксплуатации (changelog от 2025-09-19, конец в дек/2025). На трёх существующих тегах (v4.0.0, v4.0.1, v5.0.0) job провёл 24h00m01s в очереди и был отменён пределом Actions — ОДНО И ТО ЖЕ число на всех трёх, то есть он ни разу не был запланирован. В репетиции через workflow_dispatch (2026-09-13, run 34769280227) он провёл 30 мин в очереди, снова без runner.
  2. Замена планируется, собирает и проваливается. Intel-метка, которую GitHub предлагает взамен, macos-15-intel, планируется за 3–22 с (пять прогонов) и СОБИРАЕТ бинарник, но проваливается на --self-test-pty: под Bun onData node-pty никогда не отдаёт вывод дочернего процесса — открытая ошибка runtime, oven-sh/bun#25822, без релиза с исправлением. ТО ЖЕ доказательство проходит под Node на том же runner (run 34770476634).

Второе измерение изменило природу ожидающего пункта: блокировкой перестал быть runner (оплата Intel runner не решила бы) и стал Bun. Оставалось два выхода — ждать исправления Bun и затем сменить метку, или убрать платформу, — и CLAUDE.md фиксировал это как решение владельца.

Тем временем обещание пяти целей обходилось в четырёх местах: матрица ставила в очередь job, который никогда не выполнялся; ALVOS_ESPERADOS заставлял каждый checksums.txt вечно объявлять отсутствие цели, о которой уже было известно, что она не придёт (RN-565); прокси GET /runner-releases/binary принимал darwin-x64 лишь чтобы ответить 502 plataforma_nao_publicada; а install.sh запрашивал у GitHub ассет, дающий 404, — с тем же выходом "Release не публикует", неотличимым от неполного Release.

Решение​

Платформа уходит. Автономный бинарник начинает обещать ЧЕТЫРЕ цели, а Mac Intel остаётся с путём через npm — npm install -g @brabo/runner, который работает под Node, где доказательство node-pty проходит.

  • build-runner-binaries.yml убирает darwin-x64 из матрицы и из ALVOS_ESPERADOS. checksums.txt начинает объявлять отсутствие только того, что является настоящим сбоем.
  • Прокси GET /runner-releases/binary принимает четыре цели и отвергает darwin-x64 собственным 400 — а не общим "plataforma inválida", — называя этот ADR и команду npm, не обращаясь к GitHub.
  • install.sh на darwin-amd64 не пытается скачать: говорит текстом, что у Mac Intel нет бинарника, что остальная установка поднята и какова команда npm, и оставляет RUNNER_BIN пустым — тот же сигнал, по которому завершение (RN-547) уже сообщало об ожидании ключа и сервиса. Сама установка по-прежнему поддерживается на Mac Intel (закреплённый для darwin-amd64 cosign остаётся), уходит лишь бинарник локального агента.
  • Браузер продолжает обнаруживать darwin-x64 — обнаружение Mac Intel — правда, и именно оно позволяет назвать правильный путь, — но шаг бинарника не запрашивает загрузку: он заранее падает и переходит к тому же best-effort (falhaDoBinario → команда npm), что RN-473.
  • scripts/ci/alvos-do-runner.spec.ts связывает четыре места, перечисляющих цели, на трёх языках: матрицу, список api, case установщика и список браузера. Убрать (или вернуть) цель в одном и забыть другое — провал.

Рассмотренные альтернативы​

  • Ждать Bun и сменить метку на macos-15-intel. Сохраняет обещание без срока, а одна лишь смена метки не заставляет цель публиковаться — лишь меняет 24 ч очереди на красный job на каждом теге. Это остаётся путём назад (ниже), а не сегодняшним решением.
  • Собирать darwin-x64 кросс-компиляцией из darwin-arm64. ADR 0112 отверг кросс-компиляцию нативного аддона, а self-test-pty не выполнялся бы на целевой архитектуре — был бы опубликован бинарник, который никто не доказал.
  • Платить за Intel runner. Измерение показало, что блокировка — runtime, а не машина: тот же хостируемый macos-15-intel собирает и проваливается.

Последствия​

  • Обещание автономного бинарника — четыре цели, а Release продолжает получать две (linux-x64, linux-arm64), пока тег не задействует исправления win32-x64 и darwin-arm64, которые уже в dev. Это решение этого не касается.
  • Пользователю Mac Intel нужен установленный Node, чтобы иметь локального агента. install.sh и панель браузера говорят это текстом; ни один из них не устанавливает Node сам.
  • Не измерено, и объявлено: issue Bun был открыт на darwin ARM64. Вероятно, darwin-arm64 наткнётся на тот же дефект после исправления spawn-helper. Если это случится, этот ADR — прецедент, а не автоматический ответ — решение по darwin-arm64 — другое решение.
  • Путь назад: когда Bun исправит onData node-pty в каком-либо релизе, повторное включение цели — новый ADR, который сменит метку на macos-15-intel, прогонит репетицию через workflow_dispatch с пустым tag и вернёт darwin-x64 в четыре места, связываемые spec.