<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="https://androman.pro/wp-content/themes/androman/assets/feed.xsl?ver=0.9.4" type="text/xsl"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>vibe-coding &#8212; ANDROMAN.PRO</title>
	<atom:link href="https://androman.pro/tag/vibe-coding/feed/" rel="self" type="application/rss+xml" />
	<link>https://androman.pro</link>
	<description>Независимый 1С-архитектор и AI-автоматизация корпоративных процессов: аудит, PoC на реальных данных, проверка качества и внедрение. · build 0.9.4</description>
	<lastBuildDate>Tue, 30 Jun 2026 21:00:00 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>Светофор вайбкодинга</title>
		<link>https://androman.pro/2026/07/01/svetofor-vaibkodinga/</link>
					<comments>https://androman.pro/2026/07/01/svetofor-vaibkodinga/#respond</comments>
		
		<dc:creator><![CDATA[Androman.pro]]></dc:creator>
		<pubDate>Tue, 30 Jun 2026 21:00:00 +0000</pubDate>
				<category><![CDATA[дев-лог]]></category>
		<category><![CDATA[ИИ-разработка]]></category>
		<category><![CDATA[Claude]]></category>
		<category><![CDATA[GyverLamp]]></category>
		<category><![CDATA[vibe-coding]]></category>
		<category><![CDATA[WLED]]></category>
		<category><![CDATA[хард-дебаг]]></category>
		<guid isPermaLink="false">https://androman.pro/2026/07/01/svetofor-vaibkodinga/</guid>

					<description><![CDATA[Жёлтый — значит клод упёрся и ждёт меня. Можно отвести взгляд от терминала: лампа сама позовёт, когда я нужен.]]></description>
										<content:encoded><![CDATA[<p>Накопилось много чего для публикации. Но я всё откладывал, потому что подозреваю, что публика ждёт от меня проектов на 1С, например новый релиз ИИконы, поэтому хотел закончить её. Но от 1С меня уже тошнит, хватает задач и на работе, поэтому отвлекаюсь прокрастинацией, то есть побочными проектами для души. Недавно посмотрел, как чувак сделал реальный светофор сбоку экрана, который показывает текущий статус работы ИИ. Подумал — чем я хуже, полезная же вещь, тем более у меня завалялась лампа Гайвера — прикольная штука, если её включать) Но я её больше года не включал — в общем, решил приобщить её к своей работе&hellip;</p>
<h2>Главный цвет — тот, который зовёт</h2>
<p>На словах проект звучит почти глупо: лампа меняет цвет, когда клод-код что-то делает. Ну да, ещё одна мигалка на столе, спасибо, очень не хватало.</p>
<p>Но смысл оказался не в том, что синий означает работу.</p>
<p>Смысл в <strong>жёлтом</strong>.</p>
<p>Жёлтый — это когда я нужен. Клод просит разрешение на команду или задаёт вопрос и стоит. Не просто красиво светится — буквально зовёт меня обратно.</p>
<p>Для меня это важнее, чем кажется. Я могу отвернуться от терминала, залезть в другую задачу, провалиться в свой 1С-шный колодец, и лампа боковым зрением скажет: Роман, подойди, без тебя дальше не поедем.</p>
<p>Раскладка получилась такая: синий — агент копает, жёлтый — ждёт меня, зелёный — затих и можно не смотреть, красный — что-то умерло.</p>
<p><img decoding="async" alt="Лампа в работе: синий → жёлтый → зелёный" src="https://androman.pro/wp-content/uploads/2026/07/lampa-status-colors.gif"></p>
<p>Технически там вообще без магии. Клод-код умеет дёргать хуки на событиях. Хук запускает маленький Python-скрипт, тот отправляет один HTTP-запрос в лампу и заканчивает работу.</p>
<p>Никакой вечной службы рядом я не держал. Хватило команды, которая просыпается на секунду.</p>
<h2>Мне нужен был светофор, а не дискотека</h2>
<p>Сначала я полез смотреть, что вообще можно залить в лампу Гайвера.</p>
<p>Родные и околородные прошивки там бодрые: эффекты, будильники, рассветы, огоньки, вся эта красота для нормальных людей. Проблема в том, что мне не нужна красота. Мне нужен тупой цвет по сети.</p>
<p>В гайверовских форках я не нашёл удобного способа командовать ровным цветом снаружи. Может, он там где-то и был, но после нескольких заходов я понял, что опять иду чинить не свою задачу.</p>
<p>Взял WLED.</p>
<p>Он шьётся из браузера, умеет пресеты, нормально принимает команды по HTTP и не делает вид, что лампа обязательно должна изображать северное сияние. Для моего светофора этого хватало.</p>
<p>Дальше началась возня с кабелями.</p>
<h2>Micro-USB как проверка характера</h2>
<p>Я воткнул лампу в компьютер. COM-порт не появился.</p>
<p>И тут была не одна причина, а сразу две. Очень удобно, когда железо не просто ломается, а устраивает тебе маленький квест.</p>
<p>Первая — кабели. Воткнул один, поменял на второй — оба «только зарядка»: с виду нормальные micro-USB, а внутри нет линий данных. Подошёл только третий. Таких кабелей у меня хватает, чтобы убить вечер, но недостаточно, чтобы сразу понять подвох.</p>
<p>Вторая — мост CP2102. Windows сама драйвер не поставила, поэтому даже с рабочим кабелем счастья сразу не случилось. Поставил руками — порт появился.</p>
<p>Вот так и выглядит хард-дебаг без романтики: пара врущих кабелей и не вставший драйвер. Прошивка в этот момент вообще ни при чём.</p>
<h2>Роутер был слишком умный</h2>
<p>WLED прошился. Лампа подняла свою точку доступа. Я скормил ей домашний WiFi — и она не вошла в сеть.</p>
<p>Клод бодро начал копать в сторону «ты, наверное, выбрал не ту сеть». А у меня где-то в памяти чесалось другое.</p>
<blockquote>
<p>вроде бы я читал что лучше разделить, по-моему именно в этом ошибка</p>
</blockquote>
<p>И да, тут я оказался прав.</p>
<p>ESP8266 умеет только 2.4 ГГц <code>b/g/n</code>. А Redmi у меня держал 2.4 ГГц в Wi-Fi 6, то есть <code>ax</code>, плюс 2.4 и 5 ГГц жили под одним именем через band-steering. Для современных устройств удобно. Для старого чипа — каша, в которой он просто молчит.</p>
<p>Разделил диапазоны. Включил у Xiaomi «режим совместимости Wi-Fi 5» — по факту он гасит <code>ax</code>. После этого 2.4 стала обычной <code>802.11n</code>, и лампа зашла в сеть с первого раза.</p>
<p>Я угадал, а клод копал не туда. Не удержался, потребовал признания:</p>
<blockquote>
<p>ну вот скажи мне «ты как всегда прав»))) а я тебе же говорил)</p>
</blockquote>
<h2>Пины не надо угадывать</h2>
<p>После WLED всплыла сенсорная кнопка на макушке. Лампа физически её имела, но прошивка не знала, где она висит.</p>
<p>Можно было тыкать пины наугад или лезть смотреть на самой плате, куда идёт провод. Но проще оказалось открыть исходник Гайвера на гитхабе и прочитать.</p>
<p>Там лежало <code>BTN_PIN D2</code>. Заодно там же нашлись параметры матрицы: 16×16, GRB, зигзаг.</p>
<h2>Зелёный оказался болтуном</h2>
<p>Когда лампа уже светилась, я повесил хуки клод-кода на пресеты и решил, что дело почти закрыто.</p>
<p>Потом запустил агента на фоновую работу: клод думает, а лампа зелёная.</p>
<blockquote>
<p>вот ты сейчас думаешь, а лампа зелёная — что-то не так работает</p>
</blockquote>
<p>Вот тут стало ясно, что цветом по событию не отделаешься.</p>
<p>Я сначала повесил зелёный на <code>Stop</code>. Звучит логично: ход закончился, значит можно зеленеть. Только у клод-кода <code>Stop</code> — это не «всё готово». Это конец текущего хода. Агент мог отдать работу в фон, сам вернуться в ожидание, а лампа уже сообщала мне: расслабься, всё спокойно.</p>
<p>Враньё.</p>
<p>Я убрал <code>Stop</code> из зелёного сценария. Теперь зелёный приходит от простоя: отдельное событие срабатывает примерно после минуты тишины, когда сессия реально не дёргается и не ждёт моего ответа.</p>
<p>Да, зелёный стал не мгновенным. Зато он начал означать нормальную вещь: можно не смотреть — сессия затихла и меня не дёргает.</p>
<h2>Одна лампа, много желающих</h2>
<p>Потом я сам себе усложнил жизнь, потому что гоняю несколько сессий клод-кода одновременно.</p>
<p>Одна сессия ждёт моего разрешения и просит жёлтый. Вторая в этот момент работает и ставит синий. Если просто слать цвета в лампу, побеждает последний запрос. А последний запрос — не всегда самый важный.</p>
<p>Пропустить синий не страшно. Пропустить жёлтый — это весь смысл проекта выбросить.</p>
<p>Я сделал арбитра. Лампа больше не верит каждой сессии по отдельности, а смотрит на общее состояние. Если хоть одна сессия ждёт меня, жёлтый залипает, пока я её не разблокирую. Синий или зелёный из другой вкладки его не перекрасят.</p>
<p>Поймал это почти сразу, вживую. Смотрю на лампу, внутренне уже начинаю ругаться, потом сам себя останавливаю:</p>
<blockquote>
<p>а не, я вижу, есть активная сессия</p>
</blockquote>
<p>И да, лампа была права. Во второй сессии клод ещё работал.</p>
<p>Обидно: железка следит за сессиями внимательнее меня.</p>
<h2>Аудит ударил туда, где смешнее всего</h2>
<p>Когда репозиторий был уже более-менее собран, я отдал его на ИИ-аудит. Пять агентов под разными углами: код, безопасность, документация — каждый своё.</p>
<p>И четыре из пяти независимо ткнули в одно и то же.</p>
<p>В публичном репозитории лежал ровно тот баг, который я у себя уже починил: <code>Stop → зелёный</code>.</p>
<p>То самое ложное «готово». То самое место, где лампа врала, пока клод ещё работал. У меня на столе это уже было исправлено, а в README и примерах конфига — нет.</p>
<p>Чинил живой экземпляр, а публиковал по памяти. Тупо.</p>
<p>Теперь перед публикацией просто сверяю репо с тем, что реально крутится у меня на столе.</p>
<p>Заодно аудит поймал более тихую мину. <code>.gitignore</code> в публичном репо не закрывал мой локальный файл с реальным IP и заметками. До утечки не дошло, но шёл я к этому уверенно: ещё один ленивый <code>git add</code>, и привет.</p>
<p>Исправил. Хорошо, что аудит это поймал.</p>
<h2>Кто кого тут заменил</h2>
<p>Код и инструкция лежат тут: <a href="https://github.com/andromanpro/claude-code-status-lamp">github.com/andromanpro/claude-code-status-lamp</a>.</p>
<p>На столе теперь стоит лампа, которая знает, когда я нужен. Маленький антигиперфокусный прибор: можно отвести взгляд от терминала и не бояться, что агент тихо ждёт разрешения уже двадцать минут.</p>
<p>Кода я не написал ни строчки — уже полгода за меня это делает ИИ. Да и всю отладку разрулила машина, от драйвера до ложного зелёного.</p>
<p>Мне осталось перебрать три кабеля руками и держать одну чёткую цель, пока лампа не заработает так, как я задумал.</p>
<p>Кто кого заменил — каждый решит сам.</p>
<p>P.S. И да, этот пост он тоже написал сам. Я только вычёркивал строчки, где текст звучал слишком по-ИИшному)</p>


<p style="margin-top:1em;font-family:monospace;font-size:0.9em;">→ <a href="https://androman.pro/2026/07/01/svetofor-vaibkodinga/">открыть на androman.pro</a></p>]]></content:encoded>
					
					<wfw:commentRss>https://androman.pro/2026/07/01/svetofor-vaibkodinga/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Я построил трекер для ИИ. Через час он показал почти пять миллионов рублей</title>
		<link>https://androman.pro/2026/05/09/ai-tracker-60k/</link>
					<comments>https://androman.pro/2026/05/09/ai-tracker-60k/#respond</comments>
		
		<dc:creator><![CDATA[Androman.pro]]></dc:creator>
		<pubDate>Wed, 13 May 2026 06:31:43 +0000</pubDate>
				<category><![CDATA[дев-лог]]></category>
		<category><![CDATA[ИИ-разработка]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Claude]]></category>
		<category><![CDATA[neon-legion]]></category>
		<category><![CDATA[vibe-coding]]></category>
		<category><![CDATA[метрики]]></category>
		<guid isPermaLink="false">https://androman.pro/?p=287</guid>

					<description><![CDATA[Субботний трекер посчитал, что мои два месяца работы с Claude по API-тарифам стоили бы почти пять миллионов рублей. А подписка стоила тридцать две тысячи.]]></description>
										<content:encoded><![CDATA[<p>Суббота. 9 мая 2026 года. Час дня или около того.</p>
<p>Я решил сделать маленький трекер для собственного использования ИИ: сколько токенов, сколько денег, сколько времени я реально экономлю, и не обманываю ли я себя красивым ощущением разгона.</p>
<p>Через час он показал <strong>почти пять миллионов рублей</strong> — точнее, <strong>4 824 000</strong> в эквиваленте API при курсе 80 рублей за доллар.</p>
<p>Я посмотрел на цифру и сказал примерно так:</p>
<blockquote>
<p>«Я столько за год не зарабатываю».</p>
</blockquote>
<p>Потом выдохнул и поправил себя. Нет, я не <strong>потратил</strong> пять миллионов. Это важная разница. Столько стоили бы мои Claude Code сессии за два месяца, если бы я платил за них по API-тарифам. Реально я заплатил за Max-подписку: <strong>16 тысяч в месяц</strong>, то есть <strong>32 тысячи за два месяца</strong>.</p>
<p>Получилось не «я потратил пять миллионов».</p>
<p>Получилось хуже и смешнее.</p>
<p>Получилось: я <strong>не потратил</strong> примерно <strong>4,79 миллиона рублей</strong>, потому что подписка окупилась почти в <strong>150 раз</strong>.</p>
<p>И самое странное — это посчитал трекер, который в этот момент сам ещё строился.</p>
<h2>Сначала надо было признаться, что я не считаю</h2>
<p>У меня давно было ощущение, что ИИ экономит мне время. В апреле я уже считал часы: <strong>147 часов</strong> активного общения с моделью за месяц, десятки сессий, куча артефактов, блог, pet-проекты, клиентские задачи, инфраструктура, вся эта прекрасная каша.</p>
<p>Но часы — штука скользкая. Сегодня кажется, что без модели я бы делал задачу неделю. Завтра кажется, что преувеличил. Послезавтра уже не помнишь, что именно было трудно: код, вход в предметную область, проверка результата или просто нежелание начинать.</p>
<p>Деньги в этом смысле грубее.</p>
<p>Есть подписка. <strong>16 тысяч в месяц</strong>. Есть фактическое потребление моделей. Есть тарифы API. Можно посчитать, сколько стоил бы тот же объём, если бы всё шло не через Max, а через прямую оплату токенов.</p>
<p>Не как бухгалтерскую истину. Как личный датчик масштаба.</p>
<p>Мне нужен был не корпоративный BI, не «панель эффективности цифровой трансформации», прости господи, а простой локальный счётчик: вот сессия, вот модель, вот токены, вот примерная стоимость, вот день, вот сумма.</p>
<p>Ну и, конечно, я не стал делать это один.</p>
<h2>Два агента, один NAS и нормальный взрослый процесс</h2>
<p>Схема у меня уже сложилась: <strong>Claude Code</strong> работает архитектором, <strong>Codex CLI</strong> работает разработчиком, а Gitea на NAS держит всё в виде задач, PR и слияний. Человек посередине иногда делает вид, что руководит процессом.</p>
<p>Роли простые:</p>
<ol>
<li><strong>Claude</strong> формулирует фазу, режет задачу, ревьюит результат.</li>
<li><strong>Codex</strong> лезет в репозиторий, пишет код, чинит тесты, приносит PR.</li>
<li><strong>Gitea</strong> не даёт этой каше превратиться в «я тут что-то правил в папке».</li>
<li><strong>Я</strong> смотрю на цифры и периодически говорю: «алло, это точно не взорвётся?»</li>
</ol>
<p>За один длинный сеанс пролетели несколько фаз.</p>
<p><strong>Phase 1.0</strong> — хук окончания сессии для Claude Code. Когда сессия заканчивается, хук читает данные, находит последнее событие ассистента с расходом токенов, считает примерную стоимость и пишет событие в локальный JSONL.</p>
<p><strong>Phase 1.3</strong> — хук на старте сессии и оценка сложности через <code>claude -p --bare</code>. Идея: на старте новой сессии найти предыдущие сессии без оценки и в фоне попросить Claude прикинуть, сколько часов такая задача заняла бы без ИИ.</p>
<p><strong>Phase 1.0.1</strong> — обратная загрузка истории из <code>~/.claude/projects/*/*.jsonl</code>. Это и стало большим взрывом цифр: не только новые события, а весь хвост за два месяца.</p>
<p><strong>Phase 1.0.2</strong> — срочная правка, потому что внезапно выяснилось, что у нас есть не только данные, но и способы ими случайно замучить собственную подписку: ограничитель частоты, пропуск синтетических сессий, уточнение цен, правильный разворот формулы экономии.</p>
<p>Каждая фаза шла через задачу → реализацию Codex&rsquo;ом → ревью Claude → PR → слияние. К вечеру в локальной Gitea уже лежали PR #3, #5, #7, плюс добивки вокруг 1.0.2.</p>
<p>Звучит почти прилично.</p>
<p>На практике приличие началось не сразу.</p>
<p>Сначала я создал Gitea-репозиторий с <code>auto_init: True</code>, получил unrelated histories и потом восстанавливал нормальную историю через cherry-pick из reflog&rsquo;а. Да, взрослый процесс. Да, с ударом лбом о дверной косяк на входе.</p>
<p>Потом первая попытка Codex&rsquo;а упала на строгой схеме OpenAI: у каждого объекта в схеме должен быть <code>additionalProperties: false</code>. Не «желательно». Не «потом добавим». HTTP 400 и иди думай.</p>
<p>А ещё в <code>working_dir</code> всплыли кракозябры из-за cp1251→utf8. Не смертельно, но привет из мира Windows, где кириллица всегда ждёт в тёмном углу и улыбается.</p>
<h2>Трекер смотрит на того, кто его строит</h2>
<p>Самый красивый момент случился почти незаметно.</p>
<p>Я тестировал хук окончания сессии. Claude завершал сессию. Хук писал событие в <code>tracker/claude-events.jsonl</code>. Потом мы правили хук. Потом снова завершали сессию. Потом снова писалось событие.</p>
<p>И в какой-то момент я понял: <strong>трекер уже трекает собственную постройку</strong>.</p>
<p>То есть я смотрю на файл, в котором лежит история создания файла, который записывает историю создания файла.</p>
<p>Нормальная такая рекурсия выходного дня.</p>
<blockquote>
<p><strong>Я:</strong> «Подожди, он сейчас считает эту же сессию?»</p>
<p><strong>Claude:</strong> «Да. Хук окончания сессии глобальный».</p>
<p><strong>Я:</strong> «То есть он видит не только этот проект?»</p>
<p><strong>Claude:</strong> «Он видит все Claude Code сессии».</p>
</blockquote>
<p>И вот тут маленький локальный счётчик превратился в <strong>observatorium</strong>.</p>
<p>Хук был зарегистрирован глобально в <code>~/.claude/settings.json</code>. Значит он ловил не только multi-agent, но и параллельные сессии в WMSTnext, и субагентов, и всё, что проходило через Claude Code на этой машине. Не потому что мы так хитро задумали. Просто хук глобальный.</p>
<p>С одной стороны — прекрасно. Полная картина использования.</p>
<p>С другой — приватность и нагрузка сразу перестают быть «потом подумаем». Если Phase 4 когда-нибудь покажет публичные метрики на сайте, сырые транскрипты туда не поедут никогда. Только агрегаты, короткие хэши, обезличенные пути, без содержимого запросов. Иначе это не дашборд, а добровольная публикация собственного чердака.</p>
<p>Второй сюрприз был злее.</p>
<p>Хук на старте сессии для оценки сложности должен запускать <code>claude -p --bare</code>. Флаг <code>--bare</code> тут не декоративный. Он нужен, чтобы оценочная сессия не тащила за собой обычное окружение и не запускала собственные хуки в петлю.</p>
<p>Потому что если каждая оценка запускает новую сессию, а каждая новая сессия запускает оценку, то это уже не автоматизация. Это маленький финансовый чёрный квадрат.</p>
<p>После обратной загрузки у нас оказалось <strong>247 файлов транскриптов</strong>. Если на следующем старте сессии хук бодро запустит 247 дочерних процессов оценки сложности — будет не продуктивность, а ад из лимитов запросов. И это поймали до того, как я открыл следующую нормальную сессию.</p>
<p>Вот зачем нужен второй агент на ревью.</p>
<p>Codex хорошо прошёлся по ширине: нашёл места, где может бахнуть, проверил схемы, краевые случаи, обратную загрузку, дедупликацию. Claude лучше собрал смысл: что это значит для архитектуры, где граница приватности, почему <code>--bare</code> не мелочь, почему формула экономии сначала была перевёрнута не туда.</p>
<p>Эмпирическое правило дня: <strong>Codex лучше ищет по ширине, Claude лучше собирает смысл</strong>.</p>
<p>Не абсолютный закон природы. Просто в этот день так работало.</p>
<h2>Что я нашёл в шестидесяти тысячах</h2>
<p>После обратной загрузки история выглядела так:</p>
<ul>
<li><strong>79,716 событий</strong> за период с <strong>2026-03-09</strong> по <strong>2026-05-09</strong>.</li>
<li><strong>247 файлов транскриптов</strong>.</li>
<li>JSONL после обратной загрузки — около <strong>30 MB</strong>.</li>
<li>Пиковый день — <strong>31 марта</strong>, <strong>1,113 calls</strong>.</li>
<li>По моделям: <strong>Opus 4.7 — 53,854 calls</strong>, <strong>Opus 4.6 — 9,418</strong>, <strong>Sonnet 4.6 — 16,275</strong>.</li>
</ul>
<p>Итоговая сумма по API-тарифам: <strong>4 824 000 рублей</strong>.</p>
<p>Сразу оговорка, жирная и скучная: это пока <strong>завышение на 10-15%</strong>. Старые записи с Opus 4.6 считаются по ценам 4.7, потому что история моделей не идеальна. После пересчёта цен будет точнее. Реалистичнее ожидать <strong>4-4,4 миллиона</strong>, а не ровно 4,82.</p>
<p>Но даже если это не пять миллионов, а четыре — порядок не меняется.</p>
<p>Я заплатил <strong>32 тысячи</strong> за два месяца Max-подписки.</p>
<p>Если бы платил по API-тарифам — было бы около <strong>4,8 миллиона</strong> в текущей грубой оценке.</p>
<p>Экономия относительно API-варианта — <strong>4,79 миллиона</strong> по первому расчёту. Даже после уточнения цен останутся миллионы.</p>
<p>И вот тут мозг делает смешную вещь. Он одновременно понимает, что это не настоящие «заработанные деньги», потому что я бы просто не стал так использовать API за прямые деньги, и одновременно не может игнорировать факт: объём вычислений, который я реально прогнал за два месяца, стоит на открытом тарифе как хорошая машина.</p>
<p>Это не бизнес-кейс для презентации.</p>
<p>Это личная фотография масштаба.</p>
<blockquote>
<p><strong>Я:</strong> «То есть Max за 16 тысяч в месяц — это не дорого?»</p>
<p><strong>Трекер:</strong> «Смотря с чем сравнивать».</p>
<p><strong>Я:</strong> «С API».</p>
<p><strong>Трекер:</strong> «Тогда это почти неприлично дёшево».</p>
</blockquote>
<p>Я раньше писал про разгон как про ощущение: больше задач, больше артефактов, больше связей между проектами. Теперь к этому ощущению прирос счётчик.</p>
<p>Не идеальный. Не финальный. Но уже достаточно честный, чтобы стало слегка не по себе.</p>
<h2>Что я унёс с собой</h2>
<p>Глобальный хук — это власть. Он видит всё, и значит дизайн надо начинать не с красивого дашборда, а с границы приватности. Что пишем, куда пишем, что никогда не публикуем, как обезличиваем путь — это первое решение, не последнее.</p>
<p>Автоматизация должна иметь тормоза. Обратная загрузка на 247 сессий плюс дочерний процесс на старте сессии — почти готовый способ самому себе устроить ад из лимитов запросов. Ограничитель частоты — не украшение, а предохранитель.</p>
<p>И самое неудобное: про деньги надо говорить аккуратно. Я не потратил $60k. Я использовал подписку так, что эквивалентный счёт по API был бы около $60k. Разница принципиальная. Иначе это превращается в инфоцыганскую картинку, от которой самому стыдно.</p>
<h2>А теперь хочется ещё хуже</h2>
<p>Текущий трекер считает деньги. Следующий слой — время.</p>
<p>Phase 1.3 должен научиться оценивать сложность задачи: сколько часов это заняло бы без ИИ, сколько заняло по реальным часам, какой получился множитель. Не «истина в последней инстанции», а личная шкала. Если задача без ИИ была бы на 8 часов, а с агентами заняла 50 минут — это уже не просто красивое ощущение.</p>
<p>Потом хочется отслеживать настроение.</p>
<p>Не только «сколько токенов», но и <strong>сколько раз я матерился</strong>. Счётчик раздражения. Благодарности. Моменты, где я пишу «ёбать» не потому что всё сломалось, а потому что трекер показал $60k.</p>
<p>Потом дашборд. Конечно, киберпанк. Графики, крупные числа, локальный HUD, виджет «сколько осталось до лимита», карточки для блога, которые можно публиковать без сырых данных. Тот самый случай, когда эстетика не мешает инженерии, потому что счётчик должен быть видимым. Если он спрятан в JSONL, мозг его быстро перестаёт чувствовать.</p>
<p>Дальше публичная статистика на androman.pro. Только агрегаты. Никаких транскриптов. Никаких приватных путей. Никаких клиентских имён. Просто «за месяц модель сэкономила N часов / N долларов эквивалента / N дней жизни, которые я всё равно потратил на новые задачи».</p>
<p>А где-то в дальнем углу планов лежит AR-оверлей через Xreal: маленький HUD в углу зрения, агент в сети, PR готов, расходы за сегодня, голосовая команда «merge PR».</p>
<p>Звучит как фантастика.</p>
<p>Но сегодня утром у меня не было трекера. К вечеру он уже нашёл пятьдесят с лишним тысяч долларов не-потраченных денег.</p>
<p>Так что я теперь осторожнее со словом «фантастика».</p>
<h2>Самое смешное</h2>
<p>Самое смешное не в сумме.</p>
<p>Сумма — это просто неоновая вывеска, на которую удобно смотреть с открытым ртом.</p>
<p>Самое смешное в том, что я строил инструмент для измерения собственного ИИ-разгона, а он сразу стал частью этого разгона. Он писал JSONL о сессиях, в которых его писали. Он ловил параллельные ветки. Он обнаружил угрозу собственных оценочных дочерних процессов. Он заставил переписать формулу экономии, потому что первая версия думала не туда.</p>
<p>Счётчик оказался не прибором снаружи системы.</p>
<p>Он оказался ещё одним участником системы.</p>
<p>Подписка окупилась примерно в <strong>150 раз</strong>. Трекер это посчитал сам. А я теперь сижу и думаю, сколько ещё вещей вокруг меня уже пора начать считать.</p>
<p>Потому что ощущение — врёт красиво.</p>
<p>JSONL врёт скучнее.</p>
<hr>
<h2>Через три дня</h2>
<p>Я открыл черновик утром, хотел внести «пару правок перед публикацией».</p>
<p>Через четыре часа переписываю заново.</p>
<h3>Откуда вообще трекер</h3>
<p>Если совсем честно — трекер был <strong>побочным продуктом</strong>.</p>
<p>Изначальная задача звучала по-другому: настроить совместную работу трёх ИИ-агентов. <strong>Claude</strong> разбивает задачу на куски и проверяет результат — архитектор. <strong>Codex</strong> реализует — разработчик. <strong>OpenClaw</strong> — мост через Telegram, чтобы давать команды с телефона из бара. Три модели, три API, три разных протокола. Хотелось чтобы они передавали друг другу задачи и не ругались по поводу того кто из них что испортил.</p>
<p>Чтобы этот конвейер не превратился в чёрный ящик, нужно было видеть кто из агентов что сделал, за сколько токенов и времени. То есть нужен был учёт. А значит — трекер.</p>
<p>Учёт оказался первой готовой частью и пожрал внимание. Заголовок про пять миллионов — оттуда. А мульти-агент тем временем тихо собирался в фоне.</p>
<p>К 12 мая он работает. Я пишу боту в Telegram «обнови README в репо», OpenClaw принимает, Claude составляет план, Codex реализует, DeepSeek (третий ревьюер, появился за эти три дня) проверяет. Я только апрувлю. Это уже не «один человек с одним трекером». Это маленький конвейер из трёх ИИ и одного меня.</p>
<p><img decoding="async" alt="Конвейер neon-legion: Telegram → OpenClaw → Claude → Codex → DeepSeek → approve, события каждого шага оседают в трекер" src="https://androman.pro/wp-content/uploads/2026/05/neon-legion-flow.png"></p>
<p>В репозитории за три дня прирос не только трекер. Прирос мульти-агент, ради которого его и затевали. И заодно — имя <a href="https://github.com/andromanpro/neon-legion"><code>neon-legion</code></a> (вместо служебного <code>multi-agent</code>) и слоган, в котором счётчик ругательств вынесен прямо в название: <em>«Твоя личная армия. Почти без ебать-колотить. Да, мы считаем маты»</em>. Маты считаются не для красоты. У каждой Claude-сессии в дашборде есть поле <code>profanity_count</code>, заполненное по факту. Шутка — это фича.</p>
<h3>Где деньги, Лебовски</h3>
<p>Тут хочется разобраться с одной неудобной вещью.</p>
<p>На 9 мая трекер показывал 4,8 миллиона. Сейчас, пока пишу эту главу, уже <strong>5,77 миллиона</strong> — за три дня плотной работы с моделями цифра прибавила ещё <strong>почти миллион</strong>. Трекер тикает прямо сейчас. На статье тоже.</p>
<p>Подписка нарастающим итогом — <strong>48 тысяч</strong> за два с половиной месяца. Экономия относительно API-варианта — <strong>5,72 миллиона</strong>.</p>
<p>Хочется носить эту цифру на бейдже.</p>
<p>Только в кошельке у меня не прибавилось пяти миллионов. Где же деньги, Лебовски?</p>
<p>Их нет, потому что я бы не потратил эти пять миллионов. Если бы подписки не было, я бы не оплатил все эти запросы по API. Я бы просто <strong>сделал в десять раз меньше</strong>. Экономия — это сравнение с ситуацией, в которой я бы вообще так не работал. Бенчмарк, а не выручка. Цифра на бейдже была бы враньём.</p>
<p>Но интересно другое.</p>
<p>ИИ даёт мне условные <strong>10x</strong> к производительности. Не маркетинговая цифра — субъективная оценка, подтверждённая таблицей часов: без ИИ я делал бы в десять раз меньше за те же часы. Допустим, мой месячный оборот по задачам — <strong>2,5 миллиона</strong>. Тогда один «ИИ-работник» делает работы примерно на <strong>250 тысяч в месяц</strong>.</p>
<p>250 тысяч — это зарплата нормального мидла в РФ. Не сеньора, не лида. Но мидла-с-опытом точно.</p>
<p>Подписка стоит <strong>16 тысяч в месяц</strong> на двоих, Claude Max + ChatGPT Pro. На неё работает <strong>четыре</strong> таких ИИ-мидла одновременно: Claude думает, Codex пишет, DeepSeek ревьюит, OpenClaw таскает между ними сообщения.</p>
<p>Вот где деньги: на каждой ИИ-подписке я не получаю +250 в карман. Я <strong>не плачу</strong> 250 тысяч зарплаты человеку, которого иначе пришлось бы взять. Дельта — невидимая экономия. Её нельзя положить на стол. Но именно она позволяет мне делать в десять раз больше за те же часы.</p>
<p>В кошельке прибавилось не пяти миллионов. Прибавилось <strong>возможности</strong>.</p>
<p>Возможность — паршивая единица отчётности. На неё хорошо ложится подписка и плохо ложится ипотека.</p>
<h3>Что в итоге</h3>
<blockquote>
<p><strong>Я:</strong> «Так ты считаешь свою собственную статью прямо сейчас?»</p>
<p><strong>Трекер:</strong> «Конечно. Я глобальный».</p>
</blockquote>
<p>Реальный сегодняшний счёт после догона: <strong>67 тысяч рублей</strong> в эквиваленте API за один день.</p>
<p>За три дня в репозиторий приехало много мелочи: тесты, сканер приватности перед публикацией, демо за минуту, починка кракозябр, конфиг в одном файле, плюс одна красивая штука — Hindsight Replay, когда вторая модель пишет критику работы первой. Подробности — в коммитах между 9 и 12 мая.</p>
<p>Главная функция трекера — не показать сколько ты сэкономил.</p>
<p>Главная функция трекера — показать насколько ты эффективен и сколько примерно стоит твой труд, <strong>если его будут делать ИИ</strong>.</p>
<p>Пока они дороже тебя — будь спокоен.</p>
<p>Если они начнут выполнять ту же работу что и ты, без ошибок и дешевле — ты станешь не нужен.</p>
<p>Трекер посчитает и это.</p>
<hr>
<p><strong>Посмотреть:</strong></p>
<ul>
<li><a href="/neon-legion/">Живой дашборд</a> — что трекер показывает прямо сейчас: множитель, сэкономлено, активные часы, разбивка по моделям</li>
<li><a href="https://github.com/andromanpro/neon-legion">github.com/andromanpro/neon-legion</a> — open-source, MIT, stdlib-only Python, локальный pipeline без внешних обращений</li>
</ul>


<p style="margin-top:1em;font-family:monospace;font-size:0.9em;">→ <a href="https://androman.pro/2026/05/09/ai-tracker-60k/">открыть на androman.pro</a></p>]]></content:encoded>
					
					<wfw:commentRss>https://androman.pro/2026/05/09/ai-tracker-60k/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cyberpunk reveal-анимации — полный тур по эффектам</title>
		<link>https://androman.pro/2026/04/30/cyberpunk-anim-demo/</link>
					<comments>https://androman.pro/2026/04/30/cyberpunk-anim-demo/#respond</comments>
		
		<dc:creator><![CDATA[Androman.pro]]></dc:creator>
		<pubDate>Wed, 29 Apr 2026 21:00:00 +0000</pubDate>
				<category><![CDATA[дев-лог]]></category>
		<category><![CDATA[лаборатория]]></category>
		<category><![CDATA[creative-code]]></category>
		<category><![CDATA[GSAP]]></category>
		<category><![CDATA[ScrollTrigger]]></category>
		<category><![CDATA[vibe-coding]]></category>
		<category><![CDATA[киберпанк]]></category>
		<guid isPermaLink="false">https://androman.pro/2026/04/30/cyberpunk-anim-demo/</guid>

					<description><![CDATA[Шесть scroll-анимаций для постов блога — decoder, glitch, scanline, CRT power-on, stutter, pin. Собрал всё в одном тест-посте чтобы посмотреть как живёт на реальном длинном контенте.]]></description>
										<content:encoded><![CDATA[<p>Пока делал блог, написал шесть анимаций для постов. Захотел посмотреть как они все вместе смотрятся на реальном длинном тексте — специально под это сделал этот пост. Ничего особенного, просто скролли вниз.</p>
<p>Шесть эффектов: символьный дешифратор на главном заголовке, цветовые помехи на подзаголовках, сканирующая линия на блоках кода, включение ЭЛТ-монитора на картинках, прерывистое появление параграфов и прилипающие заголовки при прокрутке. Почти каждый раздел ниже показывает что-то новое.</p>
<h2>01 / Установка соединения</h2>
<p><img decoding="async" alt="lava-orb WebGL preview" src="https://androman.pro/wp-content/themes/androman/assets/lab-previews/lava-orb.png"></p>
<p>Когда страница загружается, главный заголовок делает ту же штуку что и на главной <code>androman.pro</code> — символы из мусорной кучи (<code>█▓▒░#@$%&amp;*+=!?&gt;</code>) по одному встают на свои места, и каждый зафиксированный символ на мгновение вспыхивает голубым. Через ~1.5 секунды заголовок устаканивается с лёгким свечением.</p>
<p>Мета-строка сверху (дата, тег, время чтения) при загрузке расширяется по расстоянию между буквами — как на печатной машинке, не плавное появление. Потом обложка (если есть) делает включение старого ЭЛТ-монитора: сжатая в полоску картинка за 1.6 секунды разворачивается в полный размер с вспышкой яркости.</p>
<h3>1.1 Что под капотом</h3>
<p>Сами эффекты — связка из двух частей: GSAP ScrollTrigger (библиотека анимаций + модуль отслеживания прокрутки) следит когда элемент въезжает в видимую область страницы, и навешивает CSS-класс. А CSS-анимации с <code>steps()</code> делают саму картинку. Анимации выполняются на видеокарте и не подвисают при нагрузке на страницу.</p>
<pre class="highlight"><code class="language-javascript">// Helper: trigger CSS class on scroll-into-view
function triggerOnScroll(selector, className, opts){
  gsap.utils.toArray(selector).forEach(function(el){
    ScrollTrigger.create({
      trigger: el,
      start: opts.start || 'top 88%',
      once: opts.once !== false,
      onEnter: function(){
        el.classList.remove(className);
        void el.offsetWidth;  // reflow gimmick
        el.classList.add(className);
      }
    });
  });
}

// h2/h3 — RGB glitch shift
triggerOnScroll('.post-content &gt; h2, .post-content &gt; h3', 'cyber-glitch');

// Code blocks — scanline reveal
triggerOnScroll('.post-content &gt; pre', 'cyber-scan');
</code></pre>
<p>Ключевой трюк — <code>steps(N)</code> в CSS-анимации. Обычное плавное движение (<code>ease-out</code>) даёт современный мягкий переход, а <code>steps(5)</code> или <code>steps(10)</code> — прерывистое, покадровое. Как анимация в старом мультике, не как iOS.</p>
<h2>02 / Киберпанк-приёмы</h2>
<p>Если разобрать что отделяет «киберпанк» от «современная анимация в блоге», то приёмы вполне конкретные. Не один универсальный, а набор:</p>
<ul>
<li><strong>RGB shift</strong> — красный, зелёный и синий каналы текста чуть съезжают в разные стороны, как помехи на плохом сигнале</li>
<li><strong>Scanline</strong> — горизонтальная светящаяся линия проходит сверху вниз и «открывает» элемент</li>
<li><strong>Decoder</strong> — символы из мусорной кучи по одному встают на свои места, каждый вспыхивает при фиксации</li>
<li><strong>CRT power-on</strong> — как включается старый ЭЛТ-монитор: сначала тонкая полоска, потом резкое разворачивание с вспышкой яркости</li>
<li><strong>Stutter</strong> — покадровое, прерывистое движение вместо плавного</li>
<li><strong>Flicker</strong> — прозрачность дёргается 0 → 0.4 → 0 → 0.7 → 1, имитация плохого сигнала</li>
</ul>
<p>Те же приёмы я уже использовал в своих WebGL-экспериментах (<a href="https://andromanpro.github.io/lava-orb/">lava-orb</a>, <a href="https://andromanpro.github.io/orb-2048/">orb-2048</a>, <a href="https://andromanpro.github.io/fire-particle-editor/">fire-particle-editor</a>) — теперь перенёс в посты блога.</p>
<h3>2.1 Прилипающий заголовок раздела</h3>
<p>Самый полезный трюк для длинных постов — когда подзаголовок доезжает до верха страницы, он там «прилипает» и остаётся на виду пока читаешь раздел. Как только следующий подзаголовок подъезжает снизу — предыдущий отпускается. Всегда видно в каком разделе находишься.</p>
<pre class="highlight"><code class="language-javascript">gsap.utils.toArray('.post-content &gt; h2').forEach(function(h2, idx, arr){
  var nextH2 = arr[idx + 1] || null;
  ScrollTrigger.create({
    trigger: h2,
    start: 'top 60px',
    endTrigger: nextH2 || '.post-content',
    end: 'top 60px',
    pin: h2,
    pinSpacing: false,
    pinType: 'fixed'
  });
});
</code></pre>
<p>Работает только если подзаголовки идут один за другим — что норма для длинного поста. На короткой странице с одним подзаголовком просто ничего не происходит.</p>
<h2>03 / Анимации, привязанные к прокрутке</h2>
<p><img decoding="async" alt="fire-particle-editor preview" src="https://androman.pro/wp-content/themes/androman/assets/lab-previews/fire-particle-editor.png"></p>
<p>Помимо «запустить при появлении» есть второй режим — привязка к прокрутке. Эффект не запускается резко, а плавно следует за позицией скролла. Медленно скроллишь — медленный эффект. Быстро — быстрый.</p>
<p>Обложка поста на этом сайте работает в этом режиме: лёгкий параллакс (картинка движется чуть медленнее текста) и нарастающее свечение при уходе из видимой области. Едва заметно, но убирает ощущение статичной вставки.</p>
<blockquote>
<p>Чем сильнее привязка к прокрутке, тем тоньше должен быть эффект. Резкие изменения цвета или позиции при быстром скролле — укачивает. Лучше: прозрачность, тени, смещение на 5-15px. Большие движения — только для разовых эффектов при появлении.</p>
</blockquote>
<h3>3.1 Когда этот режим не подходит</h3>
<p>Привязка к прокрутке не работает для:</p>
<ol>
<li>Текстовых эффектов (дешифратор, печатная машинка) — дёргается когда скроллишь туда-сюда</li>
<li>Блоков кода с подсветкой синтаксиса — библиотека подсветки расставляет теги при инициализации и конфликтует с анимацией появления</li>
<li>Полей ввода — анимация смещения сбивает фокус</li>
</ol>
<p>Для всего этого — разовый запуск при появлении: <code>toggleActions: 'play none none reverse'</code> или <code>once: true</code>.</p>
<h2>04 / Производительность</h2>
<p>GSAP вместе с модулем прокрутки весит ~30 КБ в сжатом виде и загружается с внешнего CDN — сети серверов по всему миру, откуда файлы отдаются быстро и кэшируются в браузере. Для повторного посетителя загрузка нулевая: файл уже лежит в кэше с прошлого раза.</p>
<p>На остальных страницах (главная, архив, лаборатория) GSAP <strong>не подгружается вообще</strong> — в теме стоит проверка, что библиотека нужна только на страницах отдельных постов. Поэтому показатели скорости главной страницы не страдают.</p>
<pre class="highlight"><code class="language-php">if ( is_singular( 'post' ) ) {
    wp_enqueue_style( 'androman-single-cyber', /* ... */ );
    wp_enqueue_script( 'gsap-core',          /* CDN */ );
    wp_enqueue_script( 'gsap-scrolltrigger', /* CDN */ );
    wp_enqueue_script( 'androman-single-anim', /* local */ );
}
</code></pre>
<h3>4.1 Режим без анимаций</h3>
<p>В Windows, macOS и Android есть системная настройка «уменьшить анимации» — для людей, которым мигание и движение на экране некомфортно. В эффектах это учтено. В CSS прописан override для этого режима:</p>
<pre class="highlight"><code class="language-css">@media (prefers-reduced-motion: reduce) {
  .cyber-glitch, .cyber-scan, .cyber-crt,
  .cyber-stutter-p, .cyber-stutter-x,
  .cyber-meta-in, .cyber-flicker {
    animation: none !important;
    opacity: 1 !important;
    transform: none !important;
    clip-path: none !important;
    filter: none !important;
  }
}
</code></pre>
<p>И в JavaScript: если включён этот режим, скрипт анимаций сразу завершает работу не запуская ничего. Все элементы которые должны были «появляться» — сразу видны. Контент доступен, анимаций нет.</p>
<h2>05 / Что дальше</h2>
<p>Тестовый пост — для разовой проверки. Пожил на длинном тексте, выглядит как надо.</p>
<p>Следующее что хочу попробовать — звук: короткий клик когда символ дешифратора встаёт на место, тихий гул при CRT-включении. Плюс пасхалка: <code>↑↑↓↓←→←→BA</code> включает «режим старого ЭЛТ» на всём сайте — полосы сканирования, насыщенность +40%, чуть больше контраста. Ещё есть идея с магнитным курсором (~30 строк) и 3D-наклоном карточек лаборатории при наведении. Каждое — на час. Пока в списке, не в расписании.</p>
<h2>06 / Сравнение CRT vs default</h2>
<p>Слева — картинка <strong>без эффекта</strong> (помечена <code>class="no-anim"</code>). Справа — <strong>с CRT power-on</strong>: scaleY 0.02→1 (как ЭЛТ-монитор включается из тонкой линии), brightness peak 2.2, saturate 0→1.2→1, hue-rotate 20°→0, blur 2px→0. Длительность <strong>1.6s</strong>.</p>
<p>Кликни <strong>«▷ REPLAY»</strong> чтобы пересмотреть эффект на правой картинке.</p>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin: 24px 0; align-items: start;">
<figure style="margin: 0;">
    <img decoding="async" class="no-anim" src="https://androman.pro/wp-content/themes/androman/assets/lab-previews/orb-2048.png" alt="Без эффекта" style="width:100%; height:auto; border-radius:8px; display:block;"><figcaption style="margin-top: 8px; font-family: 'JetBrains Mono', monospace; font-size: 11px; color: var(--text-muted); letter-spacing: 0.1em; text-align: center;">// БЕЗ ЭФФЕКТА</figcaption></figure>
<figure style="margin: 0;">
    <img decoding="async" id="crt-demo-img" src="https://androman.pro/wp-content/themes/androman/assets/lab-previews/orb-2048.png" alt="С CRT power-on" style="width:100%; height:auto; border-radius:8px; display:block;"><figcaption style="margin-top: 8px; font-family: 'JetBrains Mono', monospace; font-size: 11px; color: var(--cyan); letter-spacing: 0.1em; text-align: center;">// CRT POWER-ON</figcaption><div style="text-align: center; margin-top: 6px;">
      <button type="button" class="cyber-crt-replay" data-target="#crt-demo-img">▷ REPLAY</button>
    </div>
</figure>
</div>
<p><em>// END OF TRANSMISSION · скролл назад оставит тебя на текущей секции</em></p>
<p>Работает как надо — живёт в теме. Большую часть времени потратил не на написание, а на подбор тайминга: на коротком тексте эти вещи не видны, а на длинном сразу понятно где слишком резко, а где не хватает. Этот пост и был для этого.</p>


<p style="margin-top:1em;font-family:monospace;font-size:0.9em;">→ <a href="https://androman.pro/2026/04/30/cyberpunk-anim-demo/">открыть на androman.pro</a></p>]]></content:encoded>
					
					<wfw:commentRss>https://androman.pro/2026/04/30/cyberpunk-anim-demo/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Когда заниматься 1С становится скучно</title>
		<link>https://androman.pro/2026/04/28/1c-stalo-skuchno/</link>
					<comments>https://androman.pro/2026/04/28/1c-stalo-skuchno/#respond</comments>
		
		<dc:creator><![CDATA[Androman.pro]]></dc:creator>
		<pubDate>Sun, 26 Apr 2026 21:00:00 +0000</pubDate>
				<category><![CDATA[дев-лог]]></category>
		<category><![CDATA[лаборатория]]></category>
		<category><![CDATA[1С]]></category>
		<category><![CDATA[Canvas]]></category>
		<category><![CDATA[creative-code]]></category>
		<category><![CDATA[npm]]></category>
		<category><![CDATA[vibe-coding]]></category>
		<category><![CDATA[WebGL]]></category>
		<guid isPermaLink="false">https://androman.pro/2026/04/27/1c-stalo-skuchno/</guid>

					<description><![CDATA[1С-разработчик, не знающий что такое display:flex, выкатил 7 WebGL/Canvas проектов за 5 недель. Потому что заскучал на ползунке опросника.]]></description>
										<content:encoded><![CDATA[<style>
.lava-orb-demo input[type="range"] {
  -webkit-appearance: none;
  appearance: none;
  height: 12px;
  background: linear-gradient(to right, #3b82f6 0%, #06b6d4 25%, #fbbf24 60%, #ef4444 100%);
  border-radius: 6px;
  border: 1px solid rgba(0, 212, 255, 0.35);
  box-shadow: 0 0 12px rgba(0, 212, 255, 0.2);
  outline: none;
  cursor: pointer;
}
.lava-orb-demo input[type="range"]::-webkit-slider-thumb {
  -webkit-appearance: none;
  appearance: none;
  width: 60px;
  height: 60px;
  border-radius: 50%;
  background: transparent;
  opacity: 0;
  cursor: grab;
}
.lava-orb-demo input[type="range"]::-moz-range-thumb {
  width: 60px;
  height: 60px;
  border-radius: 50%;
  background: transparent;
  border: 0;
  opacity: 0;
  cursor: grab;
}
</style>
<div class="lava-orb-demo" style="text-align:center;padding:36px 24px;background:rgba(8,20,36,0.6);border:1px solid var(--border);border-radius:12px;margin:32px 0;">
<div style="font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--text-muted);letter-spacing:0.25em;margin-bottom:6px;">// LIVE DEMO · ДВА ОРБА</div>
<div style="font-family:'JetBrains Mono',monospace;font-size:12px;color:var(--text-dim);letter-spacing:0.05em;margin-bottom:24px;">дёрни резко — оторвутся от ползунка → сведи вместе — взорвутся</div>
<div style="max-width:480px;margin:0 auto 48px;padding:0 40px;">
    <input type="range" min="0" max="10" value="3" step="1" id="lo-demo-slider-1" style="width:100%;"></p>
<div style="text-align:center;margin-top:14px;font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:0.2em;"><span id="lo-demo-label-1">холодный</span> · <span id="lo-demo-val-1" style="font-size:18px;">3</span></div>
</p></div>
<div style="max-width:480px;margin:0 auto;padding:0 40px;">
    <input type="range" min="0" max="10" value="7" step="1" id="lo-demo-slider-2" style="width:100%;"></p>
<div style="text-align:center;margin-top:14px;font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:0.2em;"><span id="lo-demo-label-2">тёплый</span> · <span id="lo-demo-val-2" style="font-size:18px;">7</span></div>
</p></div>
</div>
<script src="https://unpkg.com/@andromanpro/lava-orb@latest/dist/lava-orb.js"></script>
<script>
(function(){
  // value (0-10) → { label, color, glow }
  function temp(v){
    var n = +v;
    if (n <= 1)  return { label: 'мороз',       color: '#3b82f6', glow: 'rgba(59,130,246,0.5)' };
    if (n <= 3)  return { label: 'холодный',    color: '#06b6d4', glow: 'rgba(6,182,212,0.5)'  };
    if (n <= 5)  return { label: 'прохладный',  color: '#84cc16', glow: 'rgba(132,204,22,0.5)' };
    if (n <= 7)  return { label: 'тёплый',      color: '#fbbf24', glow: 'rgba(251,191,36,0.5)' };
    if (n <= 9)  return { label: 'горячий',     color: '#f97316', glow: 'rgba(249,115,22,0.5)' };
    return         { label: 'огонь',         color: '#ef4444', glow: 'rgba(239,68,68,0.5)'  };
  }
  function update(v, labelEl, valEl){
    var t = temp(v);
    valEl.textContent = v;
    labelEl.textContent = t.label;
    labelEl.style.color = t.color;
    valEl.style.color = t.color;
    valEl.style.textShadow = '0 0 12px ' + t.glow;
  }
  function init(){
    var i1 = document.getElementById('lo-demo-slider-1');
    var v1 = document.getElementById('lo-demo-val-1');
    var l1 = document.getElementById('lo-demo-label-1');
    var i2 = document.getElementById('lo-demo-slider-2');
    var v2 = document.getElementById('lo-demo-val-2');
    var l2 = document.getElementById('lo-demo-label-2');
    if (!i1 || !i2 || !window.LavaOrb) { setTimeout(init, 200); return; }
    var group = (typeof LavaOrb.createGroup === 'function')
      ? LavaOrb.createGroup({ name: 'demo' })
      : undefined;
    LavaOrb.attach(i1, { size: 60, group: group, detach: true, onChange: function(v){ update(v, l1, v1); } });
    LavaOrb.attach(i2, { size: 60, group: group, detach: true, onChange: function(v){ update(v, l2, v2); } });
    update(i1.value, l1, v1);
    update(i2.value, l2, v2);
  }
  init();
})();
</script>
<hr>
<p>В общем делаю автоматический воркфлоу по анализу бизнес-процессов в 1С для обследования предприятий. Добавил генерацию опросника — можно выбрать роль или должность, протыкать варианты ответов на вопросы, которые были выявлены ранее на основе анализа конфигурации и документации, и выгрузить всё в JSON. Не нужно тратить время на многочасовые интервью.</p>
<p>Но дело не в этом.</p>
<p>Посмотрел я, с какой скоростью с ИИ получится сделать опросник. Добавил тёмную тему на выбор, контроль неотвеченных вопросов, даже салют при завершении. Всё, можно закрывать.</p>
<p>А потом мой взгляд упал на скучные ползунки выбора приоритетов.</p>
<p>Тут-то всё и заверте…</p>
<hr>
<p>Наступили выходные, а ощущение незавершённости не отпускало. Обычный ползунок от 1 до 10 — это же просто цифра, не показательно.</p>
<p>Пришлось развивать — прототип, другой, третий. Покрутил настройки частиц. Узнал что есть Canvas 2D и WebGL 2 (ну как узнал — просто что они существуют). Добавил DOOM-fire (прям как из культовой игры, ну вы поняли) режим как альтернативный движок пламени. Попробовал сделать взрывы, физику воды, отрывающиеся от ползунка орбы, которые улетают по дуге.</p>
<p>Задача была в том числе — проверить, получится ли через ИИ сделать что-то в незнакомой области. Без глубокого погружения в шейдеры и прочие термины которые я впервые увидел на прошлой неделе.</p>
<p>Получилось.</p>
<p>Я думал — сделаю пару эффектов на ползунок и пойду обратно к опроснику.</p>
<p><strong>Что выросло за 5 недель параллельной работы:</strong></p>
<ul>
<li><strong>npm-библиотека <code>@andromanpro/lava-orb</code></strong> — привязывается к любому <code>&lt;input type="range"&gt;</code> одной строкой. От мороза до огня, взрывов и молний.</li>
<li><strong>2 одностраничные игры</strong> — ORB 2048 (жидкие сливающиеся сферы с процедурной музыкой) и ORB ARKANOID (арканоид где блоки — орбы с физикой волн). Оба работают офлайн одним HTML-файлом.</li>
<li><strong>2 интерактивных редактора</strong> — для тонкой настройки жидкости и огня в реальном времени. С экспортом пресетов.</li>
<li><strong>Библиотека из 7 WebGL2-фонов</strong> — drop-in для любой страницы.</li>
</ul>
<p>Всё это — MIT, на GitHub.</p>
<p><img decoding="async" alt="От холода к огню — один и тот же ползунок, разные значения" src="https://raw.githubusercontent.com/andromanpro/lava-orb/main/article/gifs/02-cold-to-hot.gif"></p>
<p>Ни одного профильного курса по веб-разработке я не проходил. Я вообще не знаю, что такое <code>box-sizing</code> и <code>display: flex</code>)))</p>
<hr>
<p>Помните 2048? Ту простую головоломку с плитками, которая в 2014-м разошлась по всем сторам за несколько недель. Сделал свою версию — с жидкими светящимися сферами вместо цифровых плиток. И залип.</p>
<p><strong>Геймплей:</strong><br />
&#8212; Классическая сетка 4×4, свайпы / стрелки / WASD<br />
&#8212; Ячейки — жидкие metaballs через marching squares, сливаются как капли ртути<br />
&#8212; На высоких значениях — процедурный огонь частицами с glow и затуханием<br />
&#8212; При 2048 — <strong>supernova</strong>: space warp, chromatic aberration, 250 частиц, тряска камеры<br />
&#8212; Игра продолжается — 4096, 8192, логотип подхватывает</p>
<p><strong>Звук:</strong><br />
8 процедурных треков через Web Audio API, никаких mp3. Oscillator + filter + reverb синтезируются в браузере. Адаптивный темп — чем больше ячеек, тем быстрее.</p>
<p><strong>Рендеринг:</strong><br />
WebGL2 с Canvas2D fallback. 4 фона на выбор (Cyberpunk / Space / Dark / Synthwave). RU/EN локализация.</p>
<p><strong>Бот / Autoplay</strong> — запускаешь, смотришь как играет сам. Максимум набирает <strong>65 536</strong> (16 слияний — дальше на сетке 4×4 места нет, но есть настройка для большей сетки!).</p>
<p>Для СДВГ-шников — идеальная сенсорная подкормка. Запускаешь на втором мониторе или в углу экрана, свернул — периферическое зрение ловит постоянное мельтешение жидких сфер, мозгу хорошо, на основной задаче сидишь ровнее.</p>
<p>Режим отладки оставил прямо в сборке — FPS, хитбоксы, статистика. Не стал прятать от прода, пусть смотрит кто хочет.</p>
<p>Один файл <code>Orb-2048.html</code> ~330 KB. Скачал на телефон в самолёт — играешь офлайн.</p>
<div class="game-embed" data-src="https://andromanpro.github.io/orb-2048/" data-label="ЗАПУСТИТЬ ORB 2048" style="position:relative;cursor:pointer;border:1px solid var(--border);border-radius:8px;overflow:hidden;background:#030712;margin:24px 0;">
  <img decoding="async" src="https://raw.githubusercontent.com/andromanpro/orb-2048/main/media/gameplay1.gif" alt="ORB 2048 gameplay" style="display:block;width:100%;height:auto;"></p>
<div class="game-embed-overlay" style="position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(3,7,18,0.55);transition:background 0.2s;">
    <button type="button" style="background:var(--cyan);color:#030712;border:none;padding:14px 28px;font-family:'JetBrains Mono',monospace;font-size:13px;font-weight:600;border-radius:4px;cursor:pointer;letter-spacing:0.15em;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/25b6.png" alt="▶" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ЗАПУСТИТЬ ORB 2048</button>
  </div>
</div>
<p><strong>Live:</strong> <a href="https://andromanpro.github.io/orb-2048/">andromanpro.github.io/orb-2048</a></p>
<hr>
<p>Если 2048 — про «плавное слияние», то арканоид — про «разрушение». Идея: блоки — это не кубики, а светящиеся орбы-капсулы с жидкостью. Она реагирует на удар волной, а при разрушении выливается вниз, передавая волну соседям.</p>
<p>Так и сделал.</p>
<p><strong>Геймплей:</strong><br />
&#8212; 15 уровней, каждый со своей темой, музыкой и фоном<br />
&#8212; 9 типов орбов — Fire, Ice, Water, Earth, Lava, Steel, Gold, TNT, Rainbow (у каждого своя физика и звук удара)<br />
&#8212; 8 power-up — расширение/сужение платформы, огненный шар, мультишар, прилипание, лазерные турели, жизнь, замедление времени<br />
&#8212; Комбо-система и локальная таблица рекордов</p>
<p><strong>Технологии:</strong><br />
&#8212; WebGL2 SDF-шейдер для орбов — круглый SDF, 2 слоя жидкости с Catmull-Rom интерполяцией, спекулярный блик<br />
&#8212; Verlet 6-колоночная пружинная симуляция волн<br />
&#8212; Процедурная музыка на каждый уровень</p>
<p><strong>Тюнинг шарика:</strong><br />
Тип хвоста (FIRE / LAVA / PLASMA / ICE), длина S/M/L, размер S/M/L. Превью шарика в настройках — живая анимация на весь экран, клик для запуска.</p>
<p><strong>Бот</strong> со скоростью ×2.5. Прицеливается в конкретные орбы, проходит уровни сам. Можно включить и бесконечный режим — уровни продолжают генерироваться сверх 15 штук, бот разбивает бесконечно. Играет лучше меня.</p>
<p>Запустил бота в бесконечном режиме, свернул окно в угол — и пока работаешь в основном, боковым зрением ловишь как шарик дробит орбы, жидкость выливается, комбо растут.</p>
<p>Режим отладки тоже оставил в сборке — FPS, хитбоксы, прыжки между уровнями через <code>[</code> и <code>]</code>. Dev-инструменты не прятал.</p>
<p><strong>97 unit-тестов</strong> встроенных в <code>game.js</code>. Я сам не представлял, что в браузерной игре буду их писать. Но если разрабатывать <strong>с</strong> ИИ — приходится проверять каждый шаг.</p>
<p>Один файл ~225 KB, работает офлайн.</p>
<div class="game-embed" data-src="https://andromanpro.github.io/orb-arkanoid/" data-label="ЗАПУСТИТЬ ORB ARKANOID" style="position:relative;cursor:pointer;border:1px solid var(--border);border-radius:8px;overflow:hidden;background:#030712;margin:24px 0;">
  <img decoding="async" src="https://raw.githubusercontent.com/andromanpro/orb-arkanoid/main/media/gameplay.gif" alt="ORB ARKANOID gameplay" style="display:block;width:100%;height:auto;"></p>
<div class="game-embed-overlay" style="position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(3,7,18,0.55);transition:background 0.2s;">
    <button type="button" style="background:var(--cyan);color:#030712;border:none;padding:14px 28px;font-family:'JetBrains Mono',monospace;font-size:13px;font-weight:600;border-radius:4px;cursor:pointer;letter-spacing:0.15em;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/25b6.png" alt="▶" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ЗАПУСТИТЬ ORB ARKANOID</button>
  </div>
</div>
<p><strong>Live:</strong> <a href="https://andromanpro.github.io/orb-arkanoid/">andromanpro.github.io/orb-arkanoid</a></p>
<p><strong>Важный юридический момент.</strong> Arkanoid — зарегистрированная торговая марка Taito с 1986 года (легендарная японская компания, сейчас в составе Square Enix). Моя игра называется ORB ARKANOID чисто как дань уважения жанру — пока это open-source прикол, никто не придёт.</p>
<p>Но если я начну рубить с этого капусту — Taito быстро найдёт меня через юристов. Код можно форкать (MIT разрешает), но имя «Arkanoid» — не моё чтобы его дарить. Для коммерческого форка придётся переименовать в что-то нейтральное вроде <strong>ORB BREAKOUT</strong> (слово «breakout» — общий жанр, не товарный знак), поменять логотип — и тогда можно идти в сторы.</p>
<p>Это к вопросу «а можно я возьму и продам» — в принципе можно, но с переименованием.</p>
<hr>
<p>Решил посчитать — сколько я реально на это потратил.</p>
<p>Прошёлся по логам сессий Claude Code — там у каждого сообщения timestamp. Если между сообщениями меньше 2 минут — это активная работа. Больше 2 минут — отошёл или задумался без ИИ.</p>
<p><strong>Итог: 41 час активного общения. На 7 артефактов, 40 981 строку кода.</strong></p>
<p>Для сравнения, 1С-разработчику без веб-опыта (это я) без ИИ на это ушло бы:<br />
&#8212; 3 месяца на изучение стека (HTML / CSS / JS / Canvas2D / WebGL2 / WebAudio)<br />
&#8212; Ещё ~6 месяцев на реализацию</p>
<p>Грубая оценка — около 8 месяцев full-time вместо 5 недель коротких периодических сессий. Не научная цифра, просто мой внутренний «сколько бы я на это убил, если бы шёл один».</p>
<p>Ускорение не в «ИИ пишет код за тебя». Оно в том, что ИИ убирает <strong>барьер незнания</strong>. Можешь формулировать задачу словами и сразу получать рабочий прототип — вместо того чтобы тонуть в документации к шейдерам, которая предполагает, что ты уже знаешь что такое SDF, metaballs и Verlet integration.</p>
<p>Для меня это самая сильная зона ИИ: незнакомые специализированные домены, где сначала нужно месяцами накапливать словарь, а только потом начинать делать.</p>
<script>
(function(){
  document.querySelectorAll('.game-embed').forEach(function(el){
    var overlay = el.querySelector('.game-embed-overlay');
    if (overlay) {
      el.addEventListener('mouseenter', function(){ overlay.style.background = 'rgba(3,7,18,0.25)'; });
      el.addEventListener('mouseleave', function(){ overlay.style.background = 'rgba(3,7,18,0.55)'; });
    }
    el.addEventListener('click', function(){
      var src = el.dataset.src;
      if (!src) return;
      var iframe = document.createElement('iframe');
      iframe.src = src;
      iframe.setAttribute('allow', 'autoplay; fullscreen');
      iframe.setAttribute('loading', 'lazy');
      iframe.style.cssText = 'display:block;width:100%;height:700px;border:none;';
      el.innerHTML = '';
      el.appendChild(iframe);
      el.style.cursor = 'default';
    });
  });
})();
</script>


<p style="margin-top:1em;font-family:monospace;font-size:0.9em;">→ <a href="https://androman.pro/2026/04/28/1c-stalo-skuchno/">открыть на androman.pro</a></p>]]></content:encoded>
					
					<wfw:commentRss>https://androman.pro/2026/04/28/1c-stalo-skuchno/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Я это сделал!</title>
		<link>https://androman.pro/2026/04/27/ya-eto-sdelal/</link>
					<comments>https://androman.pro/2026/04/27/ya-eto-sdelal/#respond</comments>
		
		<dc:creator><![CDATA[]]></dc:creator>
		<pubDate>Mon, 27 Apr 2026 06:17:15 +0000</pubDate>
				<category><![CDATA[дев-лог]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[creative-code]]></category>
		<category><![CDATA[vibe-coding]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://androman.pro/?p=249</guid>

					<description><![CDATA[Дев-лог о перезапуске сайта на собственной WordPress-теме. 15 итераций дизайна, парадокс растущего бэклога, открытия про безопасность CMS.]]></description>
										<content:encoded><![CDATA[<p>Кайфую от веб-разработки — точнее, от вайб-кодинга в ней. Это прямо наслаждение, когда от задумки до результата проходит минимальное количество времени.</p>
<h2>1С vs веб через ИИ — два разных мира</h2>
<p>В 1С не так. Там огромный контекст, галлюцинации модели и загрязнённый контекст: контекст одного проекта просачивается в выводы по другому, имена путаются, факты выдумываются. Платформа сопротивляется.</p>
<p>В вебе — свобода. Сформулировал хотелку, пусть даже криво, и через минуту уже есть что потрогать. Не нужно неделю входить во фреймворк, читать документацию к новому инструменту и вспоминать, почему CSS опять делает вид что всё нормально. ИИ быстро накидывает варианты, а я уже выбираю, что похоже на меня.</p>
<h2>Цифры одного дизайна</h2>
<p>На эту тему ушло 5 итераций по 3 варианта в каждой. Итого <strong>15 разных тем</strong>, каждая собиралась на основе того, что понравилось в предыдущих. В итоге получилась не «идеальная тема», а тема, которую я наконец не хочу немедленно снести.</p>
<p>Главное что вышло:</p>
<ul>
<li><strong>Декодер-заголовок</strong> — <code>androman.pro</code> на главной печатается через шумовые символы <code>█▓▒░</code>, потом «защёлкивается» в текст и морфит между <code>androman.pro → .1С → .ai → .dev</code>. Glitch — короткий RGB-бурст 2.5 секунды.</li>
<li><strong>HUD-углы</strong> — <code>agent ONLINE</code>, <code>build v0.6.x</code>, <code>mode roaming</code>, <code>focus hyperfocus</code>. Левый верхний кликается — открывается changelog проекта (RU/EN, версии с alpha до текущей).</li>
<li><strong>Страница <code>/сейчас</code></strong> — кроме обычного описания фокуса, terminal-блок со 150 случайными dev-фразами в киберпанк-стиле. Клик — мгновенный реролл.</li>
<li><strong>Команд-палитра</strong> — нажми <code>/</code> (на любой раскладке клавиатуры — работает на ЙЦУКЕН тоже), всплывает терминал команд.</li>
<li><strong>Визуальная лаборатория</strong> — 7 моих open-source WebGL/Canvas-проектов собраны в одной странице. У одной из карточек — hover-preview живой 3D-сцены через lazy-load.</li>
</ul>
<p>Шрифты — все 74 woff2 self-hosted. Никаких Google Fonts CDN, сайт работает без внешних соединений.</p>
<h2>Парадокс роста</h2>
<p>Заметил парадокс: <strong>чем больше разрабатываешь с ИИ, тем сильнее растёт бэклог задач</strong>. Раньше идея «было бы круто» оставалась идеей. Сейчас — становится таском в течение часа. Скорость реализации опережает способность приоритизировать.</p>
<p>И ещё — перфекционизм. Если уходишь в него, тратишь неимоверно больше времени, чем если довольствуешься средним вариантом. Но это везде так, <strong>принцип Парето</strong> — 80% результата за 20% времени, остальные 20% — за всю оставшуюся жизнь.</p>
<h2>Workflow получился взрослый</h2>
<p>Заодно собрался нормальный workflow разработки сайта: <strong>тестовый и прод-контуры</strong>, возможность обкатать фичи до выхода в прод. Всё через git, версионирование, автодеплой по rsync через SSH. Бэкап БД и файлов — до любого изменения.</p>
<p>В общем — я доволен. Так и должен выглядеть собственный сайт. Хотя в наше время это уже похоже на ретроградство — социальные сети поглотили личные блоги. Но мне так нравится.</p>
<h2>Открытие про безопасность</h2>
<p>ИИ заодно проаудировал сайт и подсветил то, чего я не знал: <strong>пароли от БД у CMS традиционно хранятся в открытом виде</strong> в конфиге. Это касается всех — WordPress, Joomla, Drupal, Magento, любого PHP-стека. Защита идёт не криптографией, а правами файла + правильной настройкой веб-сервера.</p>
<p>Закрыли всё что обычно светится: XMLRPC отключён, REST <code>/users</code> скрыт от анонимов (admin slug больше не виден), <code>?author=N</code> редиректит на главную, <code>readme.html</code> и <code>license.txt</code> удалены, security-headers через PHP + <code>.htaccess</code>.</p>
<h2>Что дальше</h2>
<p>Сайт работает. Версия <code>0.6.x</code> — pre-release, до публикации <code>1.0</code> хочу наполнить блог постами и быть уверенным в каждой странице.</p>
<p>Ближайшие планы — <strong>перенесу статьи с инфостарта</strong>, плюс буду публиковать <strong>эксклюзивы</strong> здесь. Радар на сайте уже ждёт blip’ов.</p>


<p style="margin-top:1em;font-family:monospace;font-size:0.9em;">→ <a href="https://androman.pro/2026/04/27/ya-eto-sdelal/">открыть на androman.pro</a></p>]]></content:encoded>
					
					<wfw:commentRss>https://androman.pro/2026/04/27/ya-eto-sdelal/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
