Files
houseplan-card/demo/guard
Matyshandclaude[bot] 3e98ac4dde fix(test): include late page errors in smoke teardown verdict
Count delivered page errors after awaited browser close. Exercise the public
harness lifecycle with deterministic negative subprocess cases and retain the
unchanged Chromium probes for the real transport. Move the premature-snapshot
mutation witness to the deterministic Node suite.

Issue: #776
User-Visible: no
2026-10-06 14:06:44 +00:00
..

Пробы гарда исключений (#404)

Здесь лежат фикстуры, которые должны падать: каждая проверяет, что гард «uncaught exception внутри карточки» умеет краснеть, а не только объявлен.

Три причины, по которым это отдельный каталог, а не demo/smoke_* и не demo/fixtures/:

  1. Не smoke_* — иначе шарды CI будут гонять заведомо красный файл и покрасят себя.
  2. Не demo/fixtures/ — этот каталог входит в корпус sourceFingerprint (scripts/source-fingerprint.mjs), то есть каждый новый .mjs там объявляет устаревшими закоммиченный бандл, скриншот-индекс документации и golden-индекс. Пробы гарда ни одного пикселя не касаются, платить пересъёмкой за них нечем.
  3. Каталог, а не файл — проб несколько, и они читаются как набор.

Запускает их verify-guard.mjs; он же вызывается из job «Смоки в браузере» и служит guard'ом мутантов в scripts/mutation-gate.mjs.

Граница вердикта (#776)

finish() сначала делает round-trip по открытым страницам, затем дожидается browser.close() и только после этого считает доставленные pageerror. Round-trip не опустошает все очереди браузера: хвостовое отклонение промиса может прийти во время закрытия. Снимок счётчика до close() давал EXC, затем ложный OK и exit 0. Теперь любое событие, доставленное до итогового вердикта, входит в единую диагностику и exit 1; произвольные будущие таймеры не ожидаются. reportPageErrors() сохраняет отдельный контракт: round-trip без закрытия браузера, итог по событиям, доставленным к возврату этого вызова.

node --test test/smoke-harness-lifecycle.test.mjs детерминированно исполняет публичные watchPage/finish/reportPageErrors с управляемой доставкой событий, в том числе внутри асинхронного закрытия. Он не требует Chromium и проверяет реальный код выхода дочернего процесса и отсутствие ложного OK. Исходные браузерные пробы остаются без задержек и подавления ошибок: они проверяют настоящий канал Playwright, а не подменяют его Node-свидетелем.

Одна проба живёт не здесь: --guard-probe у demo/benchmark_backdrop_decode.mjs (#430). Benchmark нельзя переселить в этот каталог — его запускают руками при рекалибровке порогов, — поэтому verify-guard.mjs умеет запускать файл выше каталога и с аргументами. Режим --guard-probe пропускает все замеры, бросает одно исключение внутри страницы и обязан выйти с кодом 1.

Новый benchmark, открывающий страницу Playwright, обязан получить такой же режим и запись в verify-guard.mjs (file: '../<имя>.mjs', args: ['--guard-probe']): этого требует test/smoke-harness-contract.test.mjs, и требует статически — потому что динамическое доказательство возможно только там, где есть браузер. Этот README записи не заменяет.