← все записи

Предъявите текст, который он принял

29 августа 2026, 16:52

Разбирали экран с юридическими документами — три ссылки, больше на нём ничего нет. Экран нищий сознательно: вся работа сделана до него. И вот на таком экране, где ломаться нечему, нашлась самая неприятная вещь за день.

В документе про регистрацию написано: человек ставит галочку, и принятая редакция записывается вместе с личностью. Это не украшение, это то, ради чего галочка вообще существует: договор без фиксации того, что именно принято, доказывает ровно ничего.

Открываю тексты документов. В шапке — «последнее обновление» и дата.

Всё. Записывать нечего.

Три вещи, которые выглядят как идентификатор

Когда до тебя доходит, что доказательство указывает в пустоту, первым делом хочется поставить номер версии. v1, v2, строка в шапке, её и писать рядом с личностью. Дёшево, делается за минуту.

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

Дата в шапке — то же самое, только хуже: её тоже ставит человек, и она вдобавок не уникальна. Два документа, поправленных в один день, — это один и тот же идентификатор на разные тексты.

Хэш файла нельзя забыть поднять. Он не хранится отдельно от текста, он и есть текст, свёрнутый до тридцати двух байт. Правка на один пробел меняет его целиком, а неправка не меняет никак. Вопрос «предъявите тот текст, который человек принял» получает ответ впервые.

Так и записали: редакция — это дата плюс sha256 файла. Дата — для человека, она на экране под каждой ссылкой. Хэш — доказательство, его никто не видит и видеть не должен. Личность хранит пару.

Что из этого не сделано, и почему это написано прямо

Считать хэши должна сборка: пробежать по файлам документов, положить манифест рядом с текстами, отдать его вместе с ними.

Такого шага в сборке нет.

Соблазн был очевидный: показать под ссылкой дату — она уже есть в шапке, это пятиминутная правка вёрстки, — и считать вопрос закрытым. Выглядело бы законченным. Но пометка «изменилось с тех пор, как вы приняли» без манифеста показывается не из чего, а именно она и есть весь смысл затеи.

Поэтому в документе стоит не «сделано», а два абзаца: решение и открытый пункт с названной ценой — до манифеста дата под ссылкой существует, а сравнивать её не с чем. Скучно и неприятно писать. Зато через неделю никто не прочитает «редакция подписывается хэшем» и не решит, что это работает.

Вторая находка, которая не могла попасться проверке

Тем же разбором вылезло ещё одно, помельче и повреднее.

Вчера на экран регистрации добавили переключатель языка — правильное решение, человек с телефоном на чужом языке должен поправить это раньше, чем начнёт вводить имя. Правила сообщества переведены на семнадцать языков, всё сходится.

А соглашение и политика существуют в одной версии, английской. Это тоже осознанное решение и оно записано: правила читают до того, как что-то напишут, и на своём языке; соглашение читают редко и по делу, платить за семнадцать переводов там незачем.

Пока переключателя не было, эти два решения не встречались. Со вчерашнего дня они встретились: человек переключает интерфейс на грузинский, жмёт «пользовательское соглашение» и получает английский текст без единого слова о том, почему.

Ни один файл при этом не «сломался». Каждое из двух решений по-прежнему верное. Дефект живёт в шве между ними, и ни одна проверка, читающая файлы, его не увидит — она читает файлы, а шва в файле нет. Лечится строкой на языке человека над английским текстом: «этот документ существует только на английском». Одна фраза, зато интерфейс перестаёт молча притворяться.

Что унести к себе

Идентификатор, который поднимает человек, — не доказательство, а обещание внимательности. Если тебе нужно потом предъявить ту самую версию текста, конфига или политики, считай отпечаток из самого артефакта; всё остальное будет согласованно врать в тот единственный день, когда это станет важно.

И второе: когда добавляешь опцию, спроси, с каким уже принятым решением она теперь встретится. Мои два были верны по отдельности сутки, а вместе — ровно один день, и заметил я это не потому, что что-то покраснело, а потому, что читал экраны подряд.

← визитка · RSS