Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
a80d8fb464
Этап 54: favicon вшит в index.html (data:-URI PNG). (1) Внешняя иконка в архив Яндекс Игр не доехала бы (публикуется только index.html), поэтому логотип встроен в <head> как data:image/png;base64 — работает и под file://, и в iframe площадки. Генератор tools/favicon.mjs (новый, по образцу embed-fish.mjs): чистый Node без зависимостей, идемпотентный блок между маркерами <!-- FAVICON:BEGIN/END --> сразу после <title>, самопроверка + check.mjs внутри. Собственный PNG-декодер на node:zlib (8 бит, colorType 0/2/4/6, снятие фильтров строк 0–4, не-interlaced) читает logo.png (512×512 RGB); area-average ресемпл в 64×64 (rel="icon") и 180×180 (rel="apple-touch-icon"); PNG-энкодер (colorType 2, level 9) выбирает фильтр строки эвристикой libpng (минимум суммы |signed| по 5 предикторам; 180×180 → 21 КБ против 36 КБ при всегда filter 0). Обновить иконку = заменить logo.png + node tools/favicon.mjs. (2) В <head> index.html добавлены два <link> с base64 (блок ~34 КБ). Маркеры не в исключениях минификатора — minify.mjs их снимает, в релизе остаются только <link> (data:-URI побайтово совпадают с оригиналом). (3) Проверки: check.mjs OK; tests/test.js 234/234 PASS (тесты не менялись, геймплей не задет); minify.mjs 6/6 (−34%: 577→382 КБ, gzip 208→152 КБ); pack.mjs 5/5; pack-smoke.js 6/6; обе иконки декодируются в Chromium как 64×64/180×180. (4) Доки: AGENTS.md (пункт «Favicon (Этап 54)»), README (размеры/состав файла ~577 КБ, 234 проверки), docs/DEVLOG.md (Этап 54).