Skip to content

Ствол краснел не потому, что мак не даёт чисел, а потому что сторож искал их не на том языке - #5

Merged
the-homeless-god merged 1 commit into
masterfrom
a/8179-macos-snapshot
Sep 5, 2026
Merged

the-homeless-god merged 1 commit into
masterfrom
a/8179-macos-snapshot

Conversation

@the-homeless-god

Copy link
Copy Markdown
Member

Задача 8179. Ствол красен на каждом коммите минимум с 2 сентября — падают оба маковских задания «снимок снимается по-настоящему» с «НЕТ ЧИСЛА: сколько процессов работает» и двумя десятками.

Числа на маке снимались всегда

Ни одно из трёх не рвётся в коде — цепочка целая на всём протяжении:

число как берётся
сколько работает sysctl kern.proc.all → ParseProcs + ProcTaskInfo, счёт по потокам в rank(), а не по букве состояния (p_stat зовёт «runnable» каждый живой процесс)
десятка по памяти proc_pidinfo(PROC_PIDTASKINFO) через internal/libsystem — без cgo, той же дверью, что взят Mach
десятка по процессору два чтения pti_total_user + pti_total_system за окно замера; не прожил окно — обнуляется и причина названа

В журнале падавшего прогона снимок напечатан строкой ниже жалобы: PROCESSES total 559, threads 946, running 14 и обе десятки с величинами. То есть жаловался сторож на числа, которые стоят прямо под ним.

Где рвалось на самом деле

Образцы завели коммитом 680b0e5, когда вывод был только русским и печатал долю как %.1f%%. Следующий коммит 22885a2 научил инструмент двум языкам: слова поехали через словарь, разделитель дробной части — через l.Pct. Образец занято ЦП [0-9]+\.[0-9]% с тех пор не совпадал ни с одним языком: по-английски другие слова, по-русски запятая. На бегунке LANG не задан, умолчание — английский.

Шаг не зеленел ни разу за всё существование: до прогона 33636268145 маковское задание до него не доходило, а начиная с него падало всеми десятью образцами, а не тремя.

Что стало

Язык снимка задаётся --lang, спрашиваются обе редакции. Образцов 28 вместо 10: 24 «строка обязана нести число» и 4 «строка обязана назвать словом непокрытое» (заблокированные процессы, показания датчиков). Заголовок десятки больше не считается числом — рядом стоят образцы на саму строку с размером и на строку с долей: десятка из прочерков прежний образец устраивала. Убрана труба | tee, прятавшая падение снимка за кодом возврата tee.

Отрицательный контроль внутри шага: сторож сперва натравливается на пустой снимок, и заругаться обязан каждый из 28, а не хотя бы один.

Против повторного молчаливого расхождения — host/snapshot_numbers_test.go: читает сам check.yml (файл вне модуля, как main_test.go читает страницу руководства), печатает маковский снимок и валится, если образец оттуда не нашёлся. Копия образцов в тест не переписана — она разошлась бы так же. Четыре теста, все зелёные при приёмке; три отрицательных контроля проверены возвратом прежней беды.

Ничего не заглушено: проверок стало больше, и каждая доказанно умеет упасть.

Что осталось непроверенным — честно

  • digitdisk status на маке не запускался: мака нет. Что прогон позеленеет, утверждать нельзя — можно показать основания.
  • Английская половина замерена: все 14 образцов сверены с настоящим выводом обоих бегунков, слово в слово из журнала прогона 33967026504 (Apple Silicon и Intel — разные версии, разные величины).
  • Русская половина на маке не замерена: сверена с печатью на Linux и тестом на маковском снимке. Что мак напечатает её так же, следует из того, что язык выбирается до печати, а сбор от языка не зависит, — но это рассуждение, а не замер.
  • Шаг «В выводе нет инженерного дневника» ни разу не исполнялся (падал предыдущий); его сторож прогнан по обоим настоящим снимкам — чисто.

go test -count=1 во всех трёх сочетаниях признаков зелен, обе маковские цели кросс-собираются с CGO_ENABLED=0.

…сегда

Ствол красен на каждом коммите с 2 сентября — четырнадцать прогонов подряд,
включая выпуски 0.7.0, 0.8.0, 0.9.0 и 0.9.1. Оба маковских задания падали на
шаге «Снимок содержит числа», докладывая, что чисел нет.

ЧИСЛА БЫЛИ. Тот же прогон, шагом выше, зеленел `TestProcessesAreMeasured` на
живой машине, а сам снимок печатался в журнал строкой ниже жалобы:

  macos-latest     PROCESSES total 559, threads 946, running 14, measured over 315
  macos-15-intel   PROCESSES total 472, threads 741, running  1, measured over 249

и обе десятки под ней — с размерами и долями. Падал не снимок, а сторож.

ЧТО СЛОМАЛОСЬ. Образцы завели коммитом `680b0e5`, когда вывод был только
русским и печатал долю как `%.1f%%`. Следующим коммитом, `22885a2`, инструмент
заговорил на двух языках: слова поехали через словарь, а разделитель дробной
части — через `l.Pct`. С тех пор образец `занято ЦП     [0-9]+\.[0-9]%` не
совпадал НИ С ОДНИМ языком: по-английски другие слова, по-русски запятая. На
бегунке `LANG` не задан, `lang.Default` — английский, и сторож искал русские
слова в английском снимке. Шаг не зеленел ни разу за всё своё существование:
до `33636268145` маковское задание не доходило до него, а начиная с него
падало все три раза, каждый — всеми десятью образцами, а не тремя.

ЧТО СТАЛО. Язык снимка ЗАДАЁТСЯ ключом `--lang`, а не наследуется от бегунка,
и спрашиваются обе редакции: дерево обещает полный перевод, и снимок, полный
по-русски и пустой по-английски, — сломанный снимок. Образцов стало 28 вместо
10: 24 `need` (строка обязана нести ЧИСЛО) и 4 `named` (строка обязана НАЗВАТЬ
словом то, чего на маке взять нечем, — заблокированные процессы и показания
датчиков; непокрытое называется, а не выдаётся за поломку). Заголовок десятки
больше не считается числом: рядом с ним стоит образец на саму строку с
размером и на строку с долей, потому что десятка из прочерков прежний образец
устраивала.

ОТРИЦАТЕЛЬНЫЙ КОНТРОЛЬ — в самом шаге, потому что беда была ровно такая:
сторож, который не умеет упасть, трое суток выглядел работающим. Тот же сторож
сначала натравливается на заведомо пустой снимок, и заругаться обязан КАЖДЫЙ
из 28 образцов, а не хотя бы один: образец, срабатывающий на пустоте, проверяет
не число, а собственную формулировку. Смолчал хоть один — шаг падает до
приговора по настоящему снимку.

ЧТОБЫ ОБРАЗЕЦ И ПЕЧАТЬ НЕ РАЗОШЛИСЬ МОЛЧА ЕЩЁ РАЗ, заведён
`host/snapshot_numbers_test.go`. Он читает `.github/workflows/check.yml` —
файл вне модуля, как `main_test.go` читает страницу руководства, — печатает
снимок, собранный маком, и валится, если хоть один образец оттуда в нём не
находится. Копию образцов сюда не переписывали: копия разошлась бы так же.
Три его отрицательных контроля проверены возвратом прежней беды: образец с
английской точкой в русской строке роняет тест; `need`, сходящийся на
незамеренном снимке, роняет; `named`, сходящийся на полном, роняет.

ЧТО ЗАМЕРЕНО, А ЧТО НЕТ. Мака нет, `digitdisk status` на маке не запускался.
Английская половина — все 14 образцов — сверена с НАСТОЯЩИМ выводом обоих
бегунков, слово в слово вынутым из журнала прогона `33967026504`: сходятся все,
на обеих машинах. Русская половина сверена с печатью на Linux и тестом выше;
что мак напечатает её так же, следует из того, что язык выбирается до печати, а
сбор от языка не зависит, — но НЕ ЗАМЕРЕНО.

Не прогонялись `make -C core` и `tools/sverka-ui.sh`: ни `core/`, ни `ui/` не
тронуты. Лицензионный сторож прогнан имеющимся `flang 0.6.2`, а не
закреплённым `v0.7.10`: бед 0, и он же роняет прогон, если у нового файла снять
заголовок SPDX.
@the-homeless-god
the-homeless-god merged commit 983e2a5 into master Sep 5, 2026
6 checks passed
@the-homeless-god
the-homeless-god deleted the a/8179-macos-snapshot branch September 5, 2026 13:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant