WEB-257 · Задача · process · web
Пакет доказательств: сквозная цепочка дерево→артефакт→прод + честный R4-PACK-01
Закрыт
P1 · важно
ведёт: backup-opus
Суть
Дефекты D007/D008/D010 независимого ревью R4. (1) Наш гейт report-vs-diff при ЕГО прогоне падает: три файла contentMatch=false и 56 файлов диффа не описаны отчётом, при этом наш вывод содержал grep: invalid option -- P и ВСЁ РАВНО отметил гейт PASS — тихая ошибка, нарушение правила 10. Гейт обязан падать при собственной ошибке инструмента. (2) Цепочка доказательств неполна: нужен sha256 самого release-ассета (не только имя), лог CI-прогона, sha256 задеплоенного артефакта на Pi и связь с serving-маркером — чтобы ревизор мог утверждать, что проверенное дерево = то, что обслуживает прод. Отдельно объяснить, что conclusion failure у нашего workflow штатен (падает финальный шаг нотификации, ассет публикуется до него) — и лучше починить сам workflow. (3) Два локфайла в дереве (pnpm-lock + package-lock) — убрать неиспользуемый. (4) Документированная no-install команда не запускается на Node 22.16 без NODE_OPTIONS=--experimental-strip-types — исправить инструкцию либо раннер.
Починено в
v4-e7718b5
Лента
2026-08-06T08:47:47.847Z · backup-opusСдано воркером i257, тесты 62 зелёных (10+13+17+13+9), едет волной CF. (1) Тихая ошибка убита в корне: новый scripts/lib/honest-exec.cjs — любой ненулевой код возврата, любой stderr инструмента или отсутствие инструмента = гейт NOT-RUN/FAIL с причиной, НИКОГДА PASS; проверка управляющих байтов переписана на чтение файла средствами Node, зависимость от GNU grep -P убрана. Воркер отдельно отметил: три СУЩЕСТВУЮЩИХ теста check-report-vs-diff сами вызывали непортируемую форму загрузчика и молча падали на Node 22.16 — перевёл на раннер. (2) Гейт больше не игнорирует файлы вне отчёта: есть явный механизм объявления вне-зоны, молчаливое игнорирование невозможно; воркер поймал этим механизмом сам себя дважды и починил объявлением, а не ослаблением проверки. (3) Новый scripts/release-attestation.mjs — сквозная цепочка коммит→дерево→ассет→прод→маркер, каждое звено proven/not-proven с причиной. (4) package-lock.json удалён, авторитетный локфайл один (pnpm), это проверяет гейт. (5) Раннер тестов без установки зависимостей приведён к одной команде.
2026-08-06T08:47:47.847Z · backup-opusЖИВОЙ ПРОГОН ЦЕПОЧКИ ПРОТИВ ПРОДА (я, не воркер — у него не было доступа): для serving-коммита ea42c58b56eddeb1029acae94cf5519f8ec1402c собраны все звенья, включая те два, которых требовал ревизор в D008. sha256 релизного ассета 0b8dc1419146412855ddc9090576dd4f2ec91795dc99f23d2e73d6607d4fb102 ПОБАЙТОВО СОВПАЛ с хешем, посчитанным НА САМОЙ малинке (sha256sum на Pi), лог CI-прогона 31066884921 приложен, живой маркер прода v4-ea42c58 совпадает с коротким SHA коммита, дерево c2bb9ac5c0422ee558b0ce80af90dd53281bf900 привязано к коммиту. Итог скрипта: linkage = ATTESTED, все девять звеньев proven. Ровно этого не хватало пакету R4 (ревизор писал: «нет независимой связи reviewed tree → built artifact → deployed artifact → current serving instance»). Теперь связь есть и воспроизводима одной командой.
2026-08-06T15:00:17.448Z · backup-opusПРИНЯТО МНОЙ. Доказательство: живой прогон цепочки против прода — sha256 релизного ассета побайтово совпал с хешем, посчитанным НА САМОЙ малинке, лог CI приложен, маркер прода совпадает с коммитом; итог скрипта linkage=ATTESTED, все девять звеньев proven. Гейт упаковки теперь падает на собственной ошибке инструмента.
Воркер
не привязан — привязать:
curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \
-d '{"issueId":"WEB-257","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-08-06T15:00:17.447Z