f409f8746b
Портальная половина шва построена 06.08.2026, а на роботной стороне не было никого: приёмника заданий не существовало. Теперь есть. Что построено - bots/lena-golos/priyomnik.py — три ручки pozvonit, sostoyanie, ostanovit; память опознавательных знаков на сутки по решению владельца Р124; проверка тайного ключа; набор номера вынесен сменной деталью. - bots/lena-golos/proba-priyomnika.py — проба без звонка, 81 проверка. Подставной набор номеров не набирает, а считает, сколько раз его позвали: "человеку позвонили дважды" выглядит здесь как "набор позвали два раза". - bots/lena-golos/lena-priyomnik.service — эталон службы. На сервере его нет. - bots/lena-golos/README.md — свой раздел: устройство, кто кого зовёт, цена по Р84, порядок выката, открытые хвосты. - docs/superpowers/priyomka/stroyka-6/otchyot-pomoshchnika-z-0-6-priyomnik-2026-08-07.md Главное, ради чего всё это Портал читает 4xx как "звонка не было" и вправе повторить. Значит 4xx после начала набора стоит второго звонка живому человеку. В приёмнике каждый 4xx на ручке звонка стоит строго до обращения к набору; единственное исключение — когда сам набор отдельным полем поклялся, что не начинался. Память знаков лежит файлом на диске и переживает перезапуск робота, и не в /tmp: эта папка вычищается целиком при каждой перезагрузке машины, и защита умирала бы молча именно в день перезагрузки. Два одинаковых знака почти одновременно: знак резервируется до набора одной неделимой записью, проигравший не набирает и получает 5xx. Ни 4xx, ни выдуманный номер звонка — оба были бы ложью. Память знаков применяется только к ручке звонка. Портал шлёт Idempotency-Key на всех трёх ручках, но на двух других кладёт туда номер звонка, а не знак задания. Прими мы его за ключ памяти везде — второй вопрос о состоянии отдавал бы запомненный ответ, и разговор вечно числился бы идущим. Приёмник сегодня звонить не умеет и говорит об этом честно Набора номера нет ни в первой половине З-0.6, ни во второй — это третий кусок, и в плане он не назван. Пока его нет, на ручке звонка стоит NabornikNeNastroen, и приёмник отвечает 4xx "набор не настроен", то есть говорит порталу правду: звонка не было. Ответить "принял", не имея чем звонить, значило бы наполнить отчёты звонками, которых нет. Р84 замерено, а не оценено на глаз Сторонних библиотек ноль — только http.server, sqlite3, hmac, json, threading из самого Python. Пик памяти на 200 заданиях подряд 0,17 МБ, обращений к базе на задание 7, один процесс, потолок 8 одновременных запросов, тело не длиннее 64 КБ. Служба понижена Nice=10 и IOSchedulingClass=idle. Личные данные В журнал не попадает ни телефон, ни имя, ни текст скрипта, ни тайный ключ — тела запроса там нет вовсе. Журнал идёт в journald, а не в свой файл: свой файл стал бы пятым местом текстового следа без срока и без уборки. Сторож показан красным пять раз Ронялки: приёмник забыл знак — 13 красных; 4xx при гонке вместо 5xx — 2 красных; обычное равенство вместо hmac.compare_digest — 1 красный; телефон в журнал — 2 красных; память в /tmp — 1 красный. Две самые важные повторены на итоговом слепке файла. Моя ошибка, называю первой: первая редакция сторожа постоянного времени искала слово compare_digest по ТЕКСТУ файла и нашла его в моём же комментарии — проба осталась зелёной на сломанном коде. Починено: смотрю в co_names скомпилированной функции. На машину робота не ходил, ничего там не менял, в app/ не менял ничего. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>