2259f7c847
Барьер, обязанный ДОКАЗАТЬ отсутствие асинхронного исполнителя, в трёх местах принимал за доказательство отсутствие наблюдения. - отказ `systemctl` больше не выдаётся за отсутствие guard: вместо `return []` введён единый наблюдатель inspectRollbackGuard с исходами quiescent/pending/ unknown и отдельным типом отказа GuardStateUnknownError; - покой перечисляется белым списком (inactive, failed): maintenance, refreshing и любое незнакомое состояние systemd блокируют операцию; - у транзиентного таймера явно заданы AccuracySec=1s (умолчание 1min превращало обещанные 45 секунд в 45-105) и RemainAfterElapse=no; барьер дополнительно опознаёт SubState=elapsed у *.timer как покой; - команда взведения строится чистой buildArmGuardArgv и выполняется новым runMutatingArgv без shell, поэтому её контракт проверяется значением, а не грепом по исходнику; - status перестал листить guard-юниты своей копией кода: без --plain, с `|| true` и с трактовкой failed как «вооружён» отчёт вечно противоречил барьеру. Добавлены rollback_guard_state и firewall_state=guard_unknown; - purge-v0.sh пропускал failed-юниты из-за маркера в первой колонке. Барьер покрыт поведенческими тестами через подставляемый SystemdUnitProbe: прежние проверки грепом по тексту функции пережили инверсию смысла - строка `return [];` была на месте, а решение стало неверным. Документация (README, docs/07, 11, 12, 13, 14, CHANGELOG) приведена к реальному окну 45-46 секунд и к новому тексту отказа. Отдельно исправлен комментарий PNPM_AUDIT_LEVEL в versions.env: гейт давно проверяет весь lock-граф.
102 lines
6.6 KiB
Bash
102 lines
6.6 KiB
Bash
# HY2XS: единственный источник истины для контракта
|
||
# «продукт / платформа / toolchain».
|
||
#
|
||
# Что здесь ЕСТЬ:
|
||
# версия продукта, линия релиза, схема конфигурации, целевая платформа,
|
||
# версии и контрольные суммы build-toolchain, политика выбора Hysteria.
|
||
#
|
||
# Чего здесь НЕТ и быть не должно:
|
||
# 1. Прикладные зависимости (Vue, Gin, GORM, npm/Go модули). У них уже есть
|
||
# канонические lock-механизмы: apps/frontend/pnpm-lock.yaml,
|
||
# orchestrator/bun.lock, apps/go.sum. Второй слой неизбежно разъедется
|
||
# с настоящим графом зависимостей.
|
||
# 2. Конкретная версия Hysteria. Здесь живёт только ПОЛИТИКА выбора
|
||
# (HYSTERIA_CHANNEL). Результат резолва конкретной сборки замораживается
|
||
# в tools/build/hysteria-lock.env. Пин версии здесь вернул бы ручное
|
||
# обновление, от которого мы ушли.
|
||
#
|
||
# Файл читается сборкой (tools/build/lib/versions.sh) и проверяется шагом
|
||
# verify_versions_contract: рассинхрон с package.json / profile.ts /
|
||
# hy2xs.env / go.mod роняет сборку до создания tarball.
|
||
#
|
||
# Синтаксис — POSIX shell: файл должен безопасно подключаться через `.`
|
||
# без jq, Node и Python.
|
||
|
||
# ------------------------------------------------------------- продукт ---
|
||
|
||
HY2XS_VERSION=1.0.0
|
||
HY2XS_RELEASE_LINE=1
|
||
HY2XS_CONFIG_SCHEMA_VERSION=2
|
||
|
||
# ------------------------------------------------------------ платформа ---
|
||
|
||
HY2XS_BUILD_OS=debian
|
||
HY2XS_BUILD_OS_VERSION=13
|
||
HY2XS_BUILD_ARCH=amd64
|
||
|
||
HY2XS_TARGET_OS=debian
|
||
HY2XS_TARGET_OS_VERSION=13
|
||
HY2XS_TARGET_ARCH=amd64
|
||
|
||
# ------------------------------------------------------------ toolchain ---
|
||
|
||
# Go входит в production-артефакт, а не только в сборку: им компилируется
|
||
# hy2xs-admin, и его stdlib целиком попадает в бинарь. Поэтому версия здесь
|
||
# выбирается по политике поддержки Go (major поддерживается, пока не вышли две
|
||
# более новые), а не по удобству.
|
||
#
|
||
# Было 1.21.13 — линия вне поддержки. На ней `govulncheck ./...` находил 21
|
||
# ВЫЗЫВАЕМУЮ уязвимость, из них 17 в stdlib. На 1.26.7 — ноль.
|
||
GO_VERSION=1.26.7
|
||
GO_LINUX_AMD64_SHA256=ffb5f8de10c62550dfddab66b36b57030721e0a44a3218e9e1181d7b59f121ca
|
||
|
||
# Bun выбирает артефакт по наличию AVX2, поэтому одной контрольной суммы
|
||
# архитектурно недостаточно: обе должны быть зафиксированы заранее.
|
||
#
|
||
# 1.3.13 оставлена сознательно, хотя 1.4 уже вышел. Оркестратор собирается
|
||
# через `bun build --compile`, то есть Bun runtime физически входит в
|
||
# исполняемый файл, а 1.4 — крупное внутреннее обновление рантайма. Такой
|
||
# переход стоит отдельного контролируемого прохода по всей матрице
|
||
# `bun test → tsc → compile → Debian acceptance`, а не строки в общем патче.
|
||
BUN_VERSION=1.3.13
|
||
BUN_LINUX_X64_SHA256=79c0771fa8b92c33aae41e15a0e0d307ea99d0e2f00317c71c6c53237a78e25a
|
||
BUN_LINUX_X64_BASELINE_SHA256=9d8a24292a7068090205daac0a5a223f5f69736f5287e37bf88d3b4031edc750
|
||
|
||
# Node живёт только на build-хосте (сборка frontend-ассетов) и в runtime-артефакт
|
||
# не попадает. Но 20.x достигла EOL, то есть перестала получать в том числе
|
||
# security-обновления, а собирает она код, который уезжает в production.
|
||
# 24.20.0 — текущая LTS-линия.
|
||
NODE_VERSION=24.20.0
|
||
NODE_LINUX_X64_SHA256=2f2c0da162318f0de47665410c7c8c2ed3d36c8f3105de4bbc61176c70a7cbf2
|
||
|
||
# pnpm ставится через corepack, отдельного архива с контрольной суммой нет.
|
||
#
|
||
# Линия 9 оставлена вместе с apps/frontend/pnpm-lock.yaml: переход на 10 меняет
|
||
# формат lock-файла, то есть затрагивает воспроизводимость сборки frontend, и
|
||
# относится к обновлению его зависимостей, а не toolchain.
|
||
PNPM_VERSION=9.15.9
|
||
|
||
# ------------------------------------------------ проверка зависимостей ---
|
||
|
||
# Версия govulncheck пиньтся здесь, а не берётся @latest: инструмент, которым
|
||
# проверяется релиз, сам обязан быть частью контракта сборки. Иначе один и тот
|
||
# же коммит проверяется разными анализаторами в разные дни.
|
||
#
|
||
# База уязвимостей при этом ЖИВАЯ и подтягивается на каждом запуске — это и
|
||
# нужно: пин версии инструмента не должен превращаться в пин знаний о мире.
|
||
GOVULNCHECK_VERSION=v1.7.0
|
||
|
||
# Порог pnpm audit по ВСЕМУ lock-графу frontend, а не только по production-
|
||
# зависимостям. `--prod` здесь стоял с обоснованием «devDependencies в артефакт
|
||
# не попадают», и для frontend build tooling это обоснование неверно: vite и
|
||
# rollup формируют production-бандл, который уезжает в артефакт, поэтому
|
||
# уязвимость в них — уязвимость в том, что мы выпускаем.
|
||
# Значения: low | moderate | high | critical.
|
||
PNPM_AUDIT_LEVEL=high
|
||
|
||
# ------------------------------------------------ политика выбора Hysteria ---
|
||
|
||
# stable — резолвить последний стабильный upstream-релиз на build-машине;
|
||
# pinned — использовать закоммиченный tools/build/hysteria-lock.env офлайн.
|
||
HYSTERIA_CHANNEL=stable
|