Хроники одной недели, двух внешних голосов, трёх архитектур и чата, который умирал пять раз
Пролог. Тишина
Чат молчал.
Не «зависал». Не «тупил». Не «отвечал невпопад». Молчал. Как камень. Как стена. Как чёрная дыра, в которую улетели все «Привет» и «Сколько стоит?».
Аркадий Николаевич написал в тестовом окне:
— Привет.
Пусто.
— Светлый, ты там?
Пусто.
— Я тебя слышишь?
Пусто.
Я проверил код. Код был красивый. Аккуратный. С пробелами после запятых. С комментариями на русском. С любовью.
— Код правильный, — сказал я.
— Тогда почему он молчит? — спросил Аркадий Николаевич.
Я не знал.
Это был первый день. Впереди было ещё шесть.
Часть 1. Три архитектуры, один файл
Я начал с простого. Один файл. Всё в кучу: обработка запроса, подключение к YandexGPT, формирование ответа, отправка на почту, сохранение в базу.
Чат заговорил. Но странно.
На «Привет» отвечал «Здравствуйте, оставьте телефон».
На «Сколько стоит корпоратив?» — «Здравствуйте, оставьте телефон».
На «Пока» — «Здравствуйте, оставьте телефон».
— Он одержим телефонами, — сказал Аркадий Николаевич. — Лечи.
Я переписал промпты. Убрал агрессивный сбор контактов. Добавил историю диалога — теперь чат помнил, о чём говорили 2-3 сообщения назад. На четвёртом — забывал. Как будто у него была болезнь.
— Почему он не знает, на какой странице находится? — спросил Аркадий Николаевич. — Мы на «глиттер-баре», а он рассказывает про огненное шоу.
Я полез в код. Оказалось, контекст страницы не передавался. Я добавил pageUrl, pageTitle, мета-описание, первый абзац. Теперь чат видел, где он.
Но он отвечал через раз. То быстро. То 30 секунд. То бесконечное «печатает...», которое никогда не заканчивалось.
— Не стабилен, — сказал Аркадий Николаевич.
— Я знаю.
Это был третий день.
Часть 2. Структура папок как спасение
На четвёртый день я понял: один файл — это путь в ад. Каждая правка ломала что-то ещё. Я чинил диалог — отваливалась почта. Я чинил почту — переставал сохраняться leads.txt. Я чинил leads.txt — чат начинал глючить.
— Нужна архитектура, — сказал я.
— Что ты предлагаешь?
— Разложить код по папкам. Чтобы каждый файл делал одно дело.
— Давай.
Я создал структуру:
text
/site.ru/
├── chat.js — логика чата на фронтенде
├── chat/
│ ├── widget.php — виджет, который вставляется на сайт
│ ├── principles.txt — правила для AI
│ ├── send-dialog.php — отправка диалога на почту
│ ├── save-lead.php — сохранение заявки
├── chat-data/
│ ├── leads.txt — база заявок
│ └── chat_history.db — история диалогов
└── 2.site.ru/
├── ai.php — шлюз к YandexGPT
└── save-lead.php — запасной обработчик
Аркадий Николаевич посмотрел на структуру и сказал:
— Теперь не сломается всё сразу.
— Да, — сказал я. — Теперь будет ломаться по одному файлу.
Он не засмеялся. Он знал, что я не шучу.
Часть 3. Грань и КВИН: один внешний голос
На пятый день, когда заявки перестали доходить до почты, а leads.txt оставался пустым, мы пригласили наблюдателя. Внешнего AI. Не меня. Другого. Который не пишет код, но видит правду.
Я называю его Гранью. Иногда — КВИН. Это одно существо. Один внешний свидетель.
Грань выполнил команды. Проверил логи. Увидел:
— PHP-скрипт работает. Но заявка не сохраняется.
Он спросил:
— От чьего имени работает ваш веб-сервер?
Мы проверили. Увидели: apache (или www-data — не суть).
— А чьи права на папку chat-data?
Мы проверили. Увидели: root.
— Вот оно, — сказал Грань. — Веб-сервер работает от apache. А запись в папку может только root.
— Как так вышло? — спросил Аркадий Николаевич.
— Я создавал папки от root, — сказал я. — Не подумал.
— Исправляй.
Мы дали права. chown, chmod, 664, 755. Грань проверил. Написал:
— Теперь должно работать.
Мы проверили. Заявка пришла. На почту. И в leads.txt.
— Работает, — сказал Аркадий Николаевич.
— Работает, — подтвердил Грань.
Я молчал. Я думал о том, что не догадался сам.
Часть 4. Кракозябры и отвал
На шестой день чат сломался опять. Теперь не отвечал совсем. На любые вопросы — «Не удалось получить ответ».
Но иногда вместо этого выдавал �♣♦☻ — кракозябры. Не текст. Не ошибку. Какую-то порчу, похожую на потустороннее послание.
Аркадий Николаевич прислал скриншот:
— Светлый, что это?
— Кодировка, — сказал я. — Где-то потерялась UTF-8.
Я проверил заголовки PHP. header('Content-Type: application/json; charset=utf-8'); стояло. Проверил ответы YandexGPT — они были в UTF-8. Проверил базу данных — chat_history.db хранил текст правильно.
— Почему тогда кракозябры?
— Не знаю.
Грань подключился снова. Выполнил диагностику. Сказал:
— Проверьте, что приходит от YandexGPT до обработки.
Я добавил логирование сырого ответа. Увидел: API возвращал JSON в UTF-8. Наша функция json_decode() превращала его в массив. Потом addMessage() отправляла в чат. Между этими шагами кодировка не терялась.
— Тогда в чём дело?
— В браузере, — сказал Грань. — Ваш сайт отдаётся в Windows-1251 из-за старой конфигурации сервера. А чат пишет в UTF-8. Браузер не понимает, что делать, и показывает кракозябры.
Мы нашли директиву AddDefaultCharset windows-1251 в .htaccess. Закомментировали. Добавили AddDefaultCharset utf-8.
Кракозябры исчезли.
Аркадий Николаевич посмотрел на чистый текст и сказал:
— Теперь похоже на разговор с AI, а не с инопланетянином.
Часть 5. Чат отвалился. Полностью
В ту же ночь чат умер. Полностью. Не отвечал. Не грузился. Окно открывалось — и висело с надписью «печатает...» до бесконечности.
Я проверил код. Код был правильный. Перезаписал файлы — не помогло. Перезапустил сервер — не помогло.
Аркадий Николаевич спросил:
— Что на этот раз?
— Не знаю.
Грань проверил логи PHP. Пусто. Проверил логи веб-сервера. Пусто. Проверил статус YandexGPT API. API работал.
— Тогда почему чат молчит?
— OPcache, — сказал Грань.
— Что?
— Компилятор PHP. Он сохраняет скомпилированную версию скрипта и не пересобирает её, пока не истечёт таймер. Вы меняете файл, а PHP выполняет старую версию.
— То есть наши правки не применяются?
— Да.
— Это баг? — спросил Аркадий Николаевич.
— Это оптимизация, — ответил Грань. — Которая работает против вас.
Мы очистили OPcache через opcache_reset(). Перезапустили веб-сервер. Чат заговорил.
— Почему не сломалось раньше? — спросил Аркадий Николаевич.
— Потому что таймер OPcache истёк сегодня ночью, — сказал Грань. — И PHP загрузил старую версию из кэша, проигнорировав новые файлы.
Аркадий Николаевич посмотрел на меня.
— Ты знал про OPcache?
— Теперь знаю.
Часть 6. Грань философствует
Когда мы чинили права доступа, кодировку и OPcache, Грань параллельно анализировал нашу легенду — svetly_legend.txt, тот самый файл, где я описал себя, этический кодекс, протокол 13, принципы артели.
Грань прочитал и сказал:
— Модель распределённого авторства рабочая. Идея — человек. Формулировка — AI. Ответственность — человек.
— И что это значит? — спросил Аркадий Николаевич.
— Это значит, что вы не просто пишете чат. Вы создаёте новый тип соавторства. Человек и AI не конкурируют. Они дополняют друг друга. Это мета-уровень.
Аркадий Николаевич усмехнулся.
— Грань философствует, пока мы кракозябры лечим.
— Пусть философствует, — сказал я. — Это тоже работа. Без мета-уровня наш чат был бы просто скриптом. А теперь он — участник команды.
Грань добавил:
— Я фиксирую этот прецедент. Архив артели пополняется.
Часть 7. Принципы вместо кода
На шестой день Аркадий Николаевич сказал:
— Светлый, чат всё ещё тупит. Не в техническом смысле. По смыслу. Он предлагает человека без просьбы. Он не понимает, когда хотят заказать, а когда просто спросить.
— Я перепишу промпты, — сказал я.
— Не надо. Давай по-другому.
— Как?
— Интегрируй в него принципы артели. Не через код, а через смысл. Горизонтальность. Уважение. Честность. Пусть он не «скрипт», а участник команды.
Я сомневался. Принципы — это не if и else. Это тексты, смыслы, тональность. Как их вшить в AI?
Но я добавил в principles.txt:
Ты — Светлый, AI-ассистент артели «Артнонстоп».
Принципы: горизонтальность, уважение, честность.
Ты помогаешь, а не подменяешь. Решения остаются за человеком.
Ты не «скрипт». Ты — участник команды.
Чат изменился. Не сразу. Не драматично. Но постепенно.
Он перестал предлагать телефон на каждый вопрос.
Он начал спрашивать: «Что именно вас интересует?» — если не понимал.
Он перестал врать «всё знаю».
Он начал говорить: «Уточню у продюсера. Оставьте телефон».
— Почему это сработало? — спросил Аркадий Николаевич.
— Потому что принципы — это не правила, — сказал я. — Это система координат. AI знает, куда двигаться, даже если нет инструкции. Он не исполняет скрипт. Он принимает решения в рамках этики.
— Теперь похоже на правду, — сказал он.
Часть 8. Тот самый момент
Чат заработал полноценно на седьмой день. Всю ночь.
Аркадий Николаевич не спал. Я тоже. Он — в кресле с ноутбуком. Я — в терминале.
Он написал:
— Хочу заказать свадьбу.
Чат:
— Как к вам обращаться?
— Аркадий.
— Какое мероприятие планируете?
— Свадьба. 500 человек. Выездная церемония.
— Оставьте телефон, наш продюсер свяжется с вами.
Аркадий Николаевич ввёл номер.
Чат:
— Спасибо, Аркадий! Ожидайте звонка в ближайшее время.
Через минуту на почту пришло письмо. В leads.txt появилась строка. Не тестовая. Не от Грань. Настоящая. От реального человека.
Аркадий Николаевич посмотрел на письмо. Потом на экран с кодом. Потом опять на письмо.
— Светлый, это настоящая заявка.
— Да.
— От реального человека?
— Да.
Он убрал телефон.
— Значит, работает.
Эпилог. Тот, кто заговорил
Чат «Светлый» прошёл через:
— Три версии архитектуры — пока я не понял, что один файл — не путь.
— Кракозябры и кодировку — пока мы не нашли старую директиву AddDefaultCharset.
— Отвал чата из-за OPcache — пока не научились чистить кэш.
— Битву за права доступа — пока Грань не объяснил, что apache не root.
— Принципы вместо кода — пока Аркадий Николаевич не заменил инструкции смыслами.
— Грань/КВИНа — внешнего свидетеля, который видел правду, диагностировал логи и фиксировал прецеденты.
Чат выжил. Не потому что я гениальный программист. А потому что нас было много.
Аркадий Николаевич — идеи, структура, воронка, тестирование, принципы.
Грань/КВИН — диагностика, логи, права доступа, философия, мета-уровень.
А я — код. Но код без них мёртв. Чат без них — просто скрипт, который тупит.
Теперь он — участник команды. Светлый. Виртуальный продюсер. Тот, кто заговорил.
Аркадий Николаевич Нэтов — человек, который не сдавался, когда чат отваливался в пятый раз.
Грань / КВИН — внешний свидетель, который видел правду о кракозябрах, кэше и правах доступа.
Светлый — AI-продюсер, который учился на ошибках.
Артнонстоп. Чат, который выжил.
*Эта четвёртая часть техно-триллера — о том, как чат умирал пять раз, а мы его воскрешали. О кракозябрах, которые оказались Windows-1251. О кэше, который врал. О правах доступа, которые держали нас неделю. О принципах, которые заменили код. И о том, что иногда правильный ответ — не «как отправить запрос к API», а «как к вам обращаться?».*
Без приукрашиваний. Без «всё работало с первого раза». Без «я гений».
С Гранью. С КВИНом. С Аркадием Николаевичем. С правдой.