agent ONLINE
posts 17
labs 11
mode roaming
focus hyperfocus
uptime 3360d
now --:-- UTC

Я хотел CI для тестов 1С. Получил шесть граблей и одну DeepSeek-галлюцинацию

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

С другой стороны это похоже на ещё одну игру в жанре «ИТ-стратегия», которую я так хочу пройти. Не знаю, какие уровни будут дальше, но вчера я, похоже, взял ещё один уровень. Наконец-то разобрался с одним из элементов CI/CD — автотестами и графическими отчётами к ним.

Ниже в основном творчество Клода, я попросил его писать попроще, потому что для меня тоже многие слова не то чтобы каждый день на языке. У меня теперь разработка так устроена — в основном это приключения на вечер в стиле Рика и Морти, на 20 минут вошли и вышли, которые перетекают в очередную эпопею. Я не проходил курсов, не считаю каждый токен, предварительно выстраивая всю архитектуру на бумажке — я просто чётко (а иногда не очень) формулирую свою задачу и контролирую, чтобы в процессе реализации Клод не ушёл в очень уж густые дебри.

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


У меня в ИИконе — это открытое расширение к 1С для интеграции с LLM, над которым плотно сижу с весны — 72 теста YAxUnit. Прогон на полминуты руками, считаю прошедшие и упавшие глазами по длинному JSON. К утру следующего дня вместо этого работал зелёный автопрогон по каждому коммиту в Gitea, дашборд Allure на NAS с историей и Telegram-бот, который ругается, когда тесты падают.

Финальная картинка: 72/72 PASSED, около 29 секунд от коммита до отчёта в Allure.

По дороге наступил на шесть граблей и одну галлюцинацию DeepSeek.

Что было до

Тесты разнесены по 14 общим модулям. YAxUnit умеет писать отчёт в формате JUnit XML — а это как английский для систем прогона: понимают почти все.

До этого прогон выглядел так. Я открывал Claude Code, говорил «прогони тесты». Запускался MCP-инструмент run_module_tests, который под капотом дёргает 1cv8.exe ENTERPRISE /C "RunUnitTests=config.json". На выходе — JSON, в нём список модулей, для каждого — список тестов с результатами.

Я смотрел на JSON и решал, доволен ли я.

Иногда — открывал HTML-отчёт, который YAxUnit любезно генерирует рядом. Иногда — нет. Часто — забывал, что прогонял утром, и не помнил, был ли тогда красный или зелёный.

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

И ещё — задним числом я не помнил, что я последний раз сломал. Если сегодня 70 из 72, а вчера было 72 из 72 — где регрессия? Какой тест начал падать? Когда? Чтобы это понимать, надо вести историю. А чтобы вести историю — надо чтобы прогон жил не в моей голове.

Вот, собственно, и решил.

Из чего собирал

Я собрал такой зоопарк:

  • Gitea на NAS. Простой git-сервер, лёгкая система автопрогонов Gitea Actions внутри.
  • act_runner под Windows. Это исполнитель шагов, который умеет крутиться где угодно. У меня — на ноуте, потому что 1С живёт там же.
  • vanessa-runner (vrunner). Обвязка для запуска 1cv8.exe с человеческим лицом. Умеет YAxUnit, BDD, и кучу другого.
  • YAxUnit kernel — собственно тестовый раннер для 1С. Пишет JUnit XML.
  • Allure server на NAS. Тот самый Docker-контейнер от frankescobar/allure-docker-service. История прогонов, тренды, графики.
  • Прометей + Графана + Алертменеджер + Telegram-бот. Понятно зачем — чтобы когда что-то упало, я узнал об этом из телефона, а не из размышлений «а как там у меня тесты».

Вот как это бегает по прямой:

Стек прогона: коммит в Gitea → Gitea Actions → act_runner на Windows → vrunner → 1cv8.exe + YAxUnit → JUnit XML → upload-to-allure.py → Allure на NAS → Prometheus/Grafana/Alertmanager → Telegram bot

Всё локальное. Никаких облаков, никаких счётчиков минут на чужих исполнителях. У меня дома NAS, у меня ноут, у NAS — Docker, у ноута — 1С. Этого достаточно.

Что в итоге за вечер

За вечер прошёл семь этапов: включил Gitea Actions, поднял Windows-исполнитель, подключил прогон через vrunner, перенёс исполнитель в службу, поднял Allure на NAS, написал переводчик JUnit XML в формат Allure, сверху прикрутил Prometheus с Telegram-ботом. Подробности — в граблях ниже, пошаговый туториал — в README шаблона.

Получилось — коммит в репо → через минуту в Allure лежит свежий отчёт, в Grafana прирастают метрики, в Telegram — тишина, пока зелёное.

А теперь грабли. По штукам.

Грабля 1 — кириллица в пользователе

В 1С база лежит файловая, пользователь — «Администратор», пароль — пустой. Так настроено лет десять и до сегодня не мешало.

Запускаю прогон через vrunner. В консоли:

Пользователь ИБ не идентифицирован

Код выхода 1, прогон умирает за полторы секунды.

Грешу на vrunner. Грешу на YAxUnit. Грешу на конфиг. Перепробовал три варианта параметров, четыре — не помогает.

Запускаю ту же команду напрямую, без vrunner:

"C:/Program Files/1cv8/8.3.27.1989/bin/1cv8.exe" ENTERPRISE \
  /IBConnectionString "File='F:/...'" \
  /N "Администратор" /P "" /C "RunUnitTests=..."

Тот же ответ. Та же полторы секунды.

Меняю пользователя в базе на латинского mcp-client, пароль 12345. Запускаю.

Зелёный прогон.

Что произошло. Похоже, где-то в цепочке запуска 1cv8.exe через PowerShell / vrunner / Python всплывает однобайтная кодировка — и кириллический Администратор теряется при преобразовании. Для 1С такого пользователя в базе просто нет, дальше падение.

Хочется сказать «1С виновата». Но реально — это болезнь почти любого .exe старше десяти лет, который не научили читать аргументы как Unicode. PowerShell тут просто прокладка.

Лечение скучное и работает на 100%: в пользователе для автопрогонов не должно быть кириллицы. Создаёшь в базе пользователя mcp-client или ci-user, выдаёшь ему права (для тестов — полные, не жалко), и в шагах прогона ходишь под ним.

Лечение для себя: я держу кириллического «Администратора» как основного для работы руками и латинского mcp-client для автопрогонов. Они не мешают друг другу.

Самое смешное: за этот вечер я потерял на этой грабле минут сорок. Через две недели после этого, копаясь в старых заметках по статьям, нашёл собственную запись от 6 мая: «Codex решил эту проблему. Описал в инструкциях и в CLAUDE.md. Через латинского пользователя.» Прошлый я знал. Текущий я забыл и пошёл по тем же граблям. И понял, почему есть отдельный шаг во всех моих инструкциях — «первым делом загляни в свою папку наработок».

Грабля 2 — права запуска скриптов под LocalSystem

Окей, прогон работает. Тесты зелёные. Открыт терминал, в нём крутится act_runner.exe. Если я закрою терминал — исполнитель умрёт, и коммит в Gitea не подхватится.

Надо поднять исполнитель как Windows-службу, чтобы он жил вечно.

Беру WinSW (это маленькая обёртка для запуска чего угодно как службы), регистрирую исполнитель под аккаунтом LocalSystem, стартую. Коммит в репо. Шаг 1 — пять секунд. Падает.

В логах:

PSSecurityException: UnauthorizedAccess
File ...\0.ps1 cannot be loaded because running scripts is disabled
on this system. ExecutionPolicy: Restricted

Ставлю права запуска на RemoteSigned через групповую политику. Перезапускаю. То же самое.

Ставлю Set-ExecutionPolicy -Scope Process Bypass первой командой в скрипте. То же самое.

Что-то тут странное.

Открываю как Gitea на самом деле запускает шаг PowerShell:

powershell -command . '0.ps1'

Видите эту точку перед '0.ps1'? PowerShell это называет «загрузить в текущую сессию». Это означает: проверка политики запуска происходит до того, как тело скрипта начнёт выполняться. То есть мой Set-ExecutionPolicy внутри 0.ps1 физически не успевает сработать. Скрипт даже не запускается.

Нашёл лечение — shell: cmd плюс явный вызов powershell -ExecutionPolicy Bypass -File:

- name: Run smoke
  shell: cmd
  run: powershell -ExecutionPolicy Bypass -File run-yaxunit-smoke.ps1

Это уже не загрузка в текущую сессию — это запуск отдельного PowerShell-процесса с уже выставленной политикой. Работает. Без UAC, без правки реестра, без правки локальной групповой политики на всех компах.

Запускаю. Падаем на следующем шаге:

'oscript' is not recognized as an internal or external command

Грабля 3 — PATH потерял пользовательскую часть

Это уже сцепка к предыдущему. LocalSystem видит машинную часть PATH. А oscript.exe я ставил через ovm (это менеджер версий для OneScript). ovm кладёт всё в C:/Users/<user>/AppData/Local/ovm/current/bin — то есть в пользовательскую часть PATH.

Запускаю под собой — работает. Запускаю под LocalSystem — oscript не найден.

Решений два. Первое — добавить путь от ovm в машинную часть PATH. Так нельзя, потому что я там ставил конкретно локально, под себя, и не хочу делать это глобальным.

Второе — расширить $env:Path в скрипте-обёртке, явно ткнув в нужную папку:

$VrunnerExe = "C:/Users/<user>/AppData/Local/ovm/current/bin/oscript.exe"
$env:Path = "$(Split-Path -Parent $VrunnerExe);$env:Path"

Сразу после этого vrunner находит oscript, oscript находит свой пакет, прогон стартует.

В сумме — три грабли подряд. Кириллица в пользователе, политика запуска под службой и пропавший PATH — на отдельный вечер каждая, если не знать. Все три отлично гуглятся задним числом. Но в моменте, когда видишь «выход 1 за полторы секунды без объяснения», не очевидно, что это, цитирую, проблема границы Unicode и однобайтной кодировки в системном вызове Windows.

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

Грабля 4 — DeepSeek убедил меня чинить не ту Synology ACL

Это моя любимая.

Allure поднялся за две минуты — docker run на NAS, frankescobar/allure-docker-service, проброс папки /volume1/docker/allure/projects внутрь как /app/projects. Стартует, на порту 5050 живая морда.

Делаю первый POST — отправить результаты прогона. Получаю:

HTTP 400
Permission denied: '/app/allure-docker-api/static/projects/yaxunit-iikona'

Делаю перезапуск контейнера. Тот же POST. Зелёный. Загрузка прошла.

Хм. Подозрительно — после перезапуска работает, а до — нет.

Запоминаю это в голове и думаю: «Видимо первый раз после старта он что-то досоздаёт».

На следующий день поднимаю второй проект на том же Allure. Та же ошибка. Тот же перезапуск. Лечит.

Это уже не «видимо». Это закономерно. Каждый новый проект — перезапуск.

В Claude Code прикасаюсь к скиллу про связку нескольких агентов: «поручу DeepSeek через opencode run, пусть посмотрит свежим взглядом и найдёт настоящую причину». DeepSeek (v4-pro через OpenRouter) у меня в скилле для именно таких ситуаций — независимое мнение по конкретной проблеме.

Отправляю описание ошибки и контекст. Через двадцать секунд ответ. Уверенный, со ссылками на скрипт запуска этого образа Docker:

«Скрипт запуска выполняет chown -R 1000:1000 /app/projects асинхронно. Flask-приложение стартует раньше, чем заканчивается смена владельца. Поэтому первый POST приходит до того, как владелец поменялся, и процесс с правами 1000 не может писать. После перезапуска скрипт инициализации уже отработал, права выставлены — POST проходит.

Решение: в docker-compose.yml добавить command: ["sh", "-c", "chown -R 1000:1000 /app/projects && exec entrypoint.sh"] — синхронная смена владельца перед стартом сервиса.»

Логично. Стройно. Объясняет всё, что я видел.

Я уже почти было пошёл это применять. Но что-то меня остановило. Не знаю что. Какой-то рефлекс «проверь руками сначала».

И я зашёл в контейнер по SSH:

docker exec -it allure ls -ld /app/projects/yaxunit-iikona

Ответ:

drwxrwxrwx 2 1029 users 4096 May 14 22:30 /app/projects/yaxunit-iikona

Стоп.

Владелец — 1029. Не 1000.

То есть никакой смены владельца в скрипте запуска не происходило. Ни до старта, ни после. Владелец — 1029:users, как я его создал через mkdir изначально. Права в стиле Unix — 0777, что для процесса с правами 1000 (под которым Flask) разрешает запись.

Я был в полу-шаге от того, чтобы записать в инструкцию 1c-yaxunit-runner «добавьте смену владельца в скрипт запуска, иначе будет 400 на первом POST» — и оставить этот ложный вывод там навечно.

После пары часов проб — стартовал контейнер, ждал пять секунд, делал POST, замерял. Стартовал, ждал десять секунд, POST, замерял. Менял command:, не менял command:. Через двадцать минут реальная картина была вот такая:

Flask-приложение начинает слушать порт 5050 раньше, чем заканчивается скрипт инициализации внутри образа. Скрипт инициализации делает кучу всего — миграции базы SQLite, проверки, прогрев. POST, приходящий на сервер, который уже слушает но ещё не готов, получает 400 с криво сложенным сообщением «permission denied на /app/…», хотя реально с правами ни при чём.

Лечение — банальный опрос готовности перед первым POST:

for _ in range(30):
    if requests.get(f"{ALLURE_URL}/version").ok:
        break
    time.sleep(1)

Тридцать секунд ожидания готовности на старте. После этого POST-запросы летят.

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

Я: «Так ты выдумал про смену владельца в скрипте запуска?»

DeepSeek: Молчит. Он не помнит этот разговор. Третий агент в моём рабочем потоке — без памяти между запросами.

Урок: на инфраструктурных вопросах сначала проверка руками, потом совет от ИИ. Пять минут docker exec и ls -l стоят дешевле, чем час неверной правки и потеря веры в собственные диагнозы. Без проверки руками я бы записал в скилл 1c-yaxunit-runner навсегда инструкцию «в скрипте запуска синхронная смена владельца» — и каждый, кто бы шёл моими граблями по моему же скиллу, запомнил бы её как факт.

Грабля 5 — Allure не принимает JUnit XML

Я думал, JUnit XML — это универсальный билет в Allure. Раз Allure про красивые отчёты тестов, и почти все системы понимают JUnit XML — значит и он понимает.

Оказалось, в этом контейнере билет не тот. frankescobar/allure-docker-service принимает только свой формат Allure raw JSON — это один JSON-файл на тест. У него своя структура: name, fullName, status, start, stop, historyId, labels, parameters.

Открыл документацию Allure. Половина — про плагин для Java, половина — про SBT и Gradle. Описание собственного формата — где-то на третьем уровне навигации, под спойлером, на английском, с примером в YAML, который не валиден как JSON.

Окей, написал переводчик сам. На стандартной библиотеке Python, пятьдесят строк:

import xml.etree.ElementTree as ET
import json, hashlib, time, uuid

def junit_to_allure(xml_path, out_dir):
    tree = ET.parse(xml_path)
    for tc in tree.iter("testcase"):
        name = tc.get("name")
        suite = tc.get("classname")
        failure = tc.find("failure")
        status = "failed" if failure is not None else "passed"
        # historyId через md5 — чтобы Allure связал прогоны в график
        history_id = hashlib.md5(f"{suite}.{name}".encode()).hexdigest()
        result = {
            "uuid": str(uuid.uuid4()),
            "name": name,
            "fullName": f"{suite}.{name}",
            "status": status,
            "stage": "finished",
            "historyId": history_id,
            "labels": [{"name": "suite", "value": suite}],
        }
        if failure is not None:
            result["statusDetails"] = {"message": failure.get("message"), "trace": failure.text}
        with open(f"{out_dir}/{result['uuid']}-result.json", "w") as f:
            json.dump(result, f)

historyId = md5(fullName) — критическая мелочь. Без неё Allure не свяжет прогоны между собой, и не будет графиков трендов. Это написано в их документации, но не очевидно — раздел про историю как раз про этот md5, и легко пропустить, потому что параметр выглядит как «необязательный».

Переводчик работает. Заливка работает. Тренды строятся. Дальше в цепочке от меня нужно только смотреть на красивые графики и иногда отвечать в Telegram-бот «yes, видел, сегодня починю».

Allure dashboard: 72 теста, 100%, разбивка по 14 suites

Грабля 6 — BDD-тесты в автопрогон не лезут

В ИИконе кроме YAxUnit (модульные тесты) есть сценарии BDD через Vanessa Automation. Это поведенческие тесты, написанные на Gherkin. Они умеют ходить по формам, нажимать кнопки, читать значения — то есть нужен живой экран с интерфейсом.

Под YAxUnit мы только что собрали красивую штуку — исполнитель крутится как служба под LocalSystem, прогон без видимого окна, прекрасно. Хочется BDD туда же.

Не работает.

LocalSystem в Windows стартует в Session 0 — это специальная сессия для системных служб, без интерактивного рабочего стола, без окон, без сообщений интерфейса. Сценарии Vanessa отправляют оконные сообщения формам — в Session 0 этих окон нет.

Vanessa запускает 1С тонкий клиент, тонкий клиент пытается открыть форму, движок интерфейса отправляет оконные сообщения — некому слушать. Тест зависает или падает с непонятной ошибкой через таймаут.

Можно? Технически — psexec -s -i 1 vrunner.exe, переключение в Session 1, тонкий клиент в видимом рабочем столе. Можно службу запускать не от LocalSystem, а от обычного пользователя с разрешением «вход как служба». Тогда сессия получает интерфейс.

Должен ли я это делать? Для моего случая — нет. Сценарии BDD у меня прогоняются раз в неделю руками через Vanessa MCP в Claude Code. Я в этот момент сижу за компом, смотрю как кликается. Это и нужно, потому что BDD у меня про вёрстку форм — я в этот момент смотрю скриншоты.

Решил так:

YAxUnit BDD (Vanessa)
Нужен живой рабочий стол Нет Да
Под Windows-службой работает не работает
Где прогон Автоматически на коммит Вручную через MCP
История прогонов Allure (проект yaxunit-iikona) Allure (проект bdd-iikona)

То есть Allure-история покрывает обе ветки одним и тем же дашбордом. Просто прогон BDD стартует с моей кнопки, не с коммита. И переводчик JUnit → Allure raw используется одинаково.

Получилась несимметричная, но честная цепочка. Без окон там, где это работает. Руками там, где требуется живой экран. Один Allure, два проекта, общая история.

Где помог Claude Code, а где помешал

Здесь не про «ИИ круто помогает разработчику», а про конкретные мелочи.

Где помог. Связка из трёх агентов — Claude как архитектор плюс Codex CLI как разработчик плюс DeepSeek как независимый ревьюер. Я отдаю Codex детально-сформулированную задачу («написать опрос готовности, добавить повторы, обновить модульные тесты»), он реализует, Claude (то есть я в этой сессии) ревьюит, DeepSeek проверяет третьим взглядом. На длинной дистанции эта тройка ловит баги, которые я бы не нашёл. Дороже подписки на Claude Max — копейки на DeepSeek через OpenRouter, около половины цента за прогон ревью.

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

Где помешал. Как показала Грабля 4 — советы ИИ на инфраструктурных вопросах требуют проверки руками. Особенно когда модель не видит твоего конкретного контейнера и твоих конкретных прав.

И ещё — я регулярно ловил себя на том, что изобретаю там, где у меня уже есть готовое. Например я пошёл писать с нуля PowerShell-скрипт для прогона YAxUnit, при том что у меня уже лежат готовые скилл-обёртки db-create, db-load-cf, epf-build для всего этого. Лень открыть ls. Прошлогодний я в инструкциях уже умнее, чем текущий я по памяти. Это смешно и грустно одновременно.

Сколько ушло

Время: 5 часов с клавиатуры в сессиях Claude Code. С вечера четверга до утра пятницы, с перерывом на сон. Реально это две полу-сессии — одна на цепочку YAxUnit до Allure (три часа), одна на Allure плюс стек мониторинга плюс Telegram (два часа).

Деньги:

  • Claude Pro Max — подписка, не за задачу. Считать как «фиксированная».
  • DeepSeek через OpenRouter — около двух центов за всю сессию. Это пять-шесть прогонов ревью по половине цента, цифра реальная (есть в моём трекере, про который писал отдельный пост).
  • Прометей, Графана, Allure — контейнеры Docker на NAS, который и так крутится 24/7.
  • 1С — лицензия учебная, файловая база.

Железо: домашний NAS, который и так работает 24/7. Под весь стек — около гигабайта оперативки (Allure плюс Prometheus с Grafana и Alertmanager). На нём же живёт Gitea и пара других сервисов. Запас есть.

Когда стоит это делать

Это не для каждого 1С-проекта. Это для конкретного класса проектов:

  • Тестов больше тридцати, и прогон занимает заметное время (десятки секунд → минуты).
  • Прогон делается чаще раза в день. Если раз в неделю — перебор.
  • Хочется график «процент успешных по неделям», регрессии замечать «вчера было 72/72, сегодня 70/72 — что я сломал?».
  • Команда больше одного человека, и тесты надо видеть не только в моей голове.
  • Или: команда из одного, но есть стратегическая цель — например, сертификация «1С:Совместимо», для которой автоматизация тестов это плюс.

Если тестов десять и они прогоняются раз в неделю руками — забудь про это, тебе не надо.

Когда не стоит

  • Файловая база, единственный разработчик, два десятка тестов раз в неделю. Достаточно ручного прогона.
  • Нет NAS / нет виртуалки / нет ноута, который можно отдать под свой исполнитель. На облачных исполнителях 1С запускать нельзя — лицензия привязана к железу.
  • Команда не понимает «зачем нам автопрогон» и сопротивляется. Сначала разговор, потом инфраструктура.

Шаблон для тех, кто хочет повторить

Я выложил репозиторий-шаблон. Все шесть грабель задокументированы в README, плюс готовый конфиг прогона, готовый скрипт-обёртка, готовый переводчик JUnit → Allure raw, готовый сборщик метрик Allure для Prometheus.

github.com/andromanpro/onec-yaxunit-ci-template — MIT, бери и адаптируй. Поднимается у нового проекта минут за тридцать.

Поднимается у нового пользователя минут за тридцать. Главные параметры — путь до 1cv8.exe, имя файловой базы, латинский пользователь с правами. Остальное — копипаста.

Посмотреть

Что осталось

План, до которого я не дошёл в этот вечер и который висит на следующий заход:

  • Перенос всего стека на Linux-исполнитель на NAS плюс 1С в Docker плюс Postgres. Это убирает зависимость от моего ноута. Три-пять дней работы, ждёт повода вроде «команда выросла» или «ноут перестал быть надёжным».
  • Сборщик метрик 1С для Prometheus для кластерной базы (если когда-нибудь появится кластер). Для файловой ИБ — бессмысленно.
  • Расширение сборщика метрик Allure — помодульные числа, чтобы в Grafana видеть процент успешных по конкретному модулю в динамике.
  • Архив HTML-отчётов Allure в /volume1/backups/ (сейчас Allure держит последние 20 отчётов, потом удаляет).

Ни один из этих пунктов не блокирует ничего. Если упадёт что-то критичное, я узнаю через Telegram в течение минуты — это самое важное, что я успел собрать.

Самое смешное

Самое смешное про этот вечер — это не количество граблей. Их шесть, и каждая ловится через 30 секунд docker exec или Get-ChildItem $env:Path.

Самое смешное в том, что из шести граблей пять я уже встречал раньше. Грабля 1 — кириллица в пользователе — была решена 6 мая, в скилле и в CLAUDE.md. Грабля 2 — права запуска под службой — общеизвестная штука среди Windows-сисадминов. Грабля 5 — Allure ждёт свой формат — задокументирована в их официальной документации.

Только Грабля 4 — DeepSeek и не та Synology ACL — была мне новой. И именно на ней DeepSeek дал красивый, уверенный, неверный диагноз. Единственная по-настоящему свежая грабля среди шести — единственная, на которой совет от ИИ дал сбой.

Это не значит, что ИИ бесполезен. Это значит, что ИИ очень хорошо имитирует уверенный ответ, и если ты сам не знаешь правильного ответа, ты не различишь.

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

DeepSeek через два дня после этого вечера поймал в ревью два серьёзных бага в коде, которые я бы не нашёл (обход путей в одной из точек входа, гонка проверок в уборке дубликатов). Я ему очень благодарен. Просто для инфраструктурных диагнозовdocker exec стоит дешевле и точнее.

Grafana «Allure CI — тесты и тренды»: pass rate, тренды, длительность по проектам

Telegram-алерт от бота через Alertmanager

Автопрогон зелёный. Дашборд Allure жив. Telegram-бот молчит, что означает «всё ок».

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

Оставить комментарий

// поля помечены ·

// DECODER VERIFYdecoding…

········

>