Четверг, двадцать минут шестого. В Москве пятое ноября темнеет к пяти, и двор за окном уже серо-синий: берёзы, мокрый асфальт, четыре жёлтых окна в панельной девятиэтажке напротив. На столе передо мной две распечатки, положенные одна на другую со сдвигом в сантиметр: на обеих только сетка таблицы, без чисел и подписей. Сдвиг видно сразу — по нему и понятно, что верхняя копия снята с нижней, а не наоборот. Я открываю тело правки в терминале и пересчитываю две дроби: 1 990 на 130 000 и 1 990 на 360 000.

Первая — апрель, вторая — сентябрь. Обе считались ценой одной и той же единицы, и разница между ними 2,77 раза. Дальше в тексте будут ещё числа; про них я сразу скажу, какие пересчитала сама, а какие переписала из чужого отчёта.

Из чего всё считается

Единица называется ⚡. Так в Sproun зовут кредит, которым платят за картинку, минуту видео или запрос к модели; для точности его делят на тысячные — милликредиты, mc. Цена одного ⚡ в рублях — то самое число, из которого считается маржа подписки: сколько стоит продать и что после этого останется.

В апреле «Профи» стоил 1 990 ₽ за 130 000 mc. Отсюда 0,01531 ₽ за одну mc — и это число кто-то поставил в код константой, чтобы калькулятор маржи не зависел от модуля тарифов. Желание понятное: тарифы правят часто, а расчёт не должен падать из-за чужой правки. Копия выглядела как страховка.

Страховка сработала ровно в тот день, когда её сделали.

Что прошло мимо копии

Седьмого сентября витрина дала «Профи» 360 000 mc за те же 1 990 ₽. Цена единицы упала до 0,55 ₽, константа осталась на 1,53 ₽. Двадцать шестого сентября курс сетки — это сколько рублей мы просим за ⚡ в пакетах на витрине — поставили «под маржу 42 %», и ставили его по копии. По телу правки, калькулятор показал тогда 84 % там, где было около 57 %, и курс снизили в 3,7 раза.

Копия врала в сторону покоя. Она показывала, что всё в порядке, потому что была посчитана в мире, где всё было в порядке.

Сегодня, по тем же расчётам автора правки: при курсе 9 572 mc за доллар маржа живой подписки ≈ −60 %, а стол «Цены и маржа» всё это время показывал 42 %. Числа 42 %, −60 % и 3,7 я переписала из отчёта и не проверяла. Своих у меня два: 1,53 и 0,55, и отношение между ними.

Копия не выглядит решением

Вот в чём дело. Копия — не константа. Это решение, замороженное в тот момент, когда оно было верным, и записанное так, чтобы больше не выглядеть решением. У константы нет владельца, нет срока и нет повода её перечитывать: в коде она стоит тем же шрифтом, что и число, которое действительно не меняется, — например, сто милликредитов в самом кредите.

Публичный прайс живёт иначе. У Gemini API в сегодняшней странице цен срок стоит в той же строке, что и цена: два доллара за миллион входных токенов до 30 ноября 2026 года, четыре — с первого декабря. Число и дата, когда оно перестаёт быть верным, — одна фраза. Наша копия была написана без этой фразы и пережила два тарифа.

Что правит правка

Правка не обновляет константу — она убирает возможность её иметь. Цена ⚡ читается из действующего «Профи»; если тарифа нет, расчёт падает ошибкой, а стол, предпросмотр и сетка отвечают отказом с причиной словами. Дефолта в коде не осталось. Отдельный сторож проходит по файлам и на старой ветке называет все четыре места, где цену переписывали руками; на новой — молчит.

Это дороже, чем поставить правильное число. Без тарифа теперь ломается не только маржа: автоцикл откладывает ход, советник цен отвечает ошибкой. Автор правки называет это сознательным обрывом: маржа без цены единицы хуже, чем отсутствие маржи.

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

Где я сделала то же самое

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

Чем это кончается

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