Files
HY2XS_flamy/docs/acceptance/README.md
T
founder 8dcb50a07c fix(admin): дать отзыву доступа вторую попытку, а лимиту устройств — порядок снимков
Предыдущий проход сделал правильным порядок «сначала долговременная запись,
потом разрыв сессии» и правильно запретил откат при неудаче разрыва. Способа
прийти к согласованному состоянию ПОТОМ он не дал: у двух операций повтор не
работал вовсе.

Импорт, заменивший auth_id: после неудавшегося /kick старое значение не
хранится нигде, повтор того же файла читает из базы уже новое и рвёт его, а
cron пропускал незнакомый authID молча — dao.ListPeer просто не возвращала
строку. Живая сессия оставалась навсегда.

Снижение maxDevices: повтор формы даёт 1 < 1 -> false, разрыва больше нет.
Лимит устройств в политику доступа не входит и входить не должен — это
свойство сессий, — поэтому механизма схождения у него не было.

enforcePeerAccess стал сверкой живых сессий: обход идёт по каждому authID из
/online. Нет строки в базе -> kick; peerAccessDenied -> kick; непригодный
maxDevices -> kick; устройств больше разрешённого -> kick. Отказ базы при этом
не рвёт ничего. Ни таблицы отложенных операций, ни очереди retry: список живых
сессий уже есть, и это /online.

Отдельно закрыт второй TOCTOU лимита устройств. Учёт выданных разрешений
закрыл сравнение двух одинаковых снимков, но сетевой запрос выполнялся вне
блокировки, поэтому снимки приходили в резервацию в произвольном порядке и
устаревший откатывал lastOnline назад, возвращая уже занятое место. Это не
data race — память защищена мьютексом, и -race здесь молчит принципиально.
Последовательность «прочитать /online -> занять место» выполняется под замком
по authId; глобальный замок не годится, внутри идёт сетевой запрос.

Учёт разрешений больше не растёт бесконечно: запись снималась только на ветке
отказа, поэтому в карте копились удалённые пиры и переписанные импортом
идентификаторы. Уборка идёт по фактической картине подключений.

Гейты приёмки доращены под все три инварианта и проверены в обе стороны.
Go 1.26.7 -> 1.26.8. Документация приведена в соответствие в двух местах,
где описывала снятую архитектуру.

Разбор: docs/acceptance/2026-09-02-v1.0.0-rc3-preflight-findings.md
2026-09-02 07:15:43 +05:00

3.1 KiB
Raw Blame History

Реестр прогонов приёмки

Здесь лежат отчёты о ФАКТИЧЕСКИХ прогонах приёмки: какая сборка, на каком хосте, что прошло и что нет. Описание самих проверок — в docs/testing/.

Разделение намеренное. Документ проверок переживает релизы и правится по мере развития продукта; отчёт о прогоне относится к одному артефакту и одному хосту и после публикации релиза не редактируется — иначе он перестаёт быть свидетельством.

Правила ведения

  1. Один прогон — один файл ГГГГ-ММ-ДД-<версия>-<вид>.md.
  2. Отчёт фиксирует только то, что действительно выполнялось. Отложенная проверка отмечается как DEFERRED с причиной, а не опускается.
  3. Реальные секреты, ключи и клиентские ссылки в отчёт не переносятся. Публичные IP-адреса тестовых хостов обезличиваются; доменное имя и номер порта SSH остаются, потому что без них шаги прогона невоспроизводимы.
  4. Найденные дефекты живут в отдельном файле рядом с отчётом и закрываются ссылками на коммиты, а не правкой самого отчёта.

Прогоны

Дата Версия Коммит источника Вид Вердикт
2026-09-01 1.0.0-rc1 a1f0db22 build + host acceptance, Debian 13 RC ACCEPTED WITH RELEASE-REQUIRED UX FIXES

Открытые дефекты приёмки

Прогон Дефекты
2026-09-01, 1.0.0-rc1 UX-01…UX-05 и найденное сверх отчёта

Разборы кода между прогонами

Отдельно от отчётов о прогонах: дефекты, найденные чтением дерева и сверкой с официальной документацией, а не наблюдением на хосте. Провенанс у них другой, и приписывать их хостовому прогону нельзя — он их не показывал.

Дата Основание Находки
2026-09-01 коммит c0a43ae9, сверка с Hysteria 2 и Element Plus UX-06…UX-10, LOG-01…LOG-05, AUTH-01/02, CORE-01/02, TYPE-01
2026-09-02 коммит 6d1686b8, повторная сверка с Hysteria 2 ADMIT-04/05, RECON-01/02, GATE-02, DOC-02, VER-01