Чертёж фасада: павильон с чертёжным столом, конвейер с листами тикетов, бетонный цех с роботами-манипуляторами, на выходе катушка плёнки

Agentic
SDLC

от постановки задачи до продакшена с AI-агентами

Доклад
Agentic SDLC, версия осень 2026
Место
Almaty Python Meetup #8
Almaty Towers, офис Choco
Дата
26.09.2026, 13:00
Автор
Азамат Галимжанов
@x3gxu · azamat.ai

Азамат
Галимжанов

Начинал с бэкенда Call of Duty.
Сейчас CEO azamat.ai, компании AI-разработки.

с 2009пишу на Python

5×CTO в стартапах

2экзита

20+AI-продуктов в проде

@x3gxu · azamat.ai · Upwork Top Rated Plus, $400K+ · Codementor 5.0★, 283 отзыва

Бренд azamat.ai представлен ТОО «Logic Layer»,
участником Astana Hub
Astana Hub

Откуда опыт

  1. 2007Казкоммерцбанк, первая работа
  2. 2009Начал писать на Python
  3. 2012Бэкенд Call of Duty, Activision Blizzard
  4. 2013Техлид Santufei, ныне Kaspi Travel
  5. 2014CTO gdematerial, 300K SKU
  6. 2018CTO Biometric.vision, $50K MRR
  7. 2022LLM- и voice-агенты для US и EU

сейчасazamat.ai: Magnum, Almaty Marathon, Compass и т. д.

Руководил разработчиками.
Теперь руковожу агентами

Бренд azamat.ai представлен ТОО «Logic Layer»,
участником Astana Hub
Astana Hub

Instagram

QR-код: azamat.ai/insta

Это мой
личный опыт

Кто говорит, что точно знает, как правильно, либо врёт, либо не шарит.

Полгода с агентами

март–сентябрь 2026

40,3 млрдтокенов обработали мои агенты

1 485часов агенты работали на меня

347 тыс.команд и правок сделали агенты

3 266коммитов

16 255сообщений я написал агентам

до 16агентов одновременно на пике

Токены нарастающим итогом

млрд токенов, которые обработали мои агенты

102030400АпрМайИюнИюлАвгСен 1 млрд8 мая10 млрд19 июня20 млрд11 июля30 млрд27 августа40 млрд25 сентября

Часы работы агентов

по неделям, сумма по всем агентам

04080120160МарАпрМайИюнИюлАвгСен40 ч: рабочая неделя человека

Час агента: от первого до последнего действия сессии, пока пауза не длиннее 5 минут. Параллельные агенты и субагенты складываются. Claude Code до конца июля не учтён: его история удалена. Сентябрь по 25-е

Коммиты

по месяцам, всего 3 266

02004006008001 0001 20027Мар69Апр652Май230Июн264Июл1 088Авг936Сен*

Все мои коммиты во всех репозиториях, локальных и на GitHub, без дублей. * Сентябрь по 25-е

Сообщения агентам

по дням · линия: среднее за 7 дней

66медиана в день

106в среднем в день

с 1 мая

0100200300405349757562405333МарАпрМайИюнИюлАвгСен

Только сообщения, которые я набрал руками. Столбики выше 300 обрезаны, над ними подписано значение

Где вы сейчас?

Поднимите руку

  1. 0Пишу код без ИИ
  2. 1ИИ в IDE: Claude Code в VS Code, сайдбар в Zed
  3. 2Claude Code или Codex в терминале
  4. 3Десктопные Claude Code или Codex
  5. 4Оркестратор: AO, Conductor, Orca, cmux
  6. 5Свой харнесс: Pi и т. п.

Context
management

Context rot

Чем длиннее вход, тем хуже модель с ним работает. Даже на простых задачах, даже когда всё влезает в окно.

1 тыс.100 тыс.1 млн токенов качество

Chroma, «Context Rot», 2025: 18 моделей, точность падает с длиной входа. Схема, не замер

Lost in the middle

Начало и конец контекста модель помнит лучше, чем середину.

началосерединаконец точность тут теряется

Liu и др., «Lost in the Middle», 2023: точность по позиции нужного факта в контексте. Схема

Smart zone, dumb zone

SMART ZONE DUMB ZONE начало сессии~80–100 тыс.заполнение окна

Вся работа с контекстом дальше: как держать сессию слева от красной линии.

Смотрю на счётчик,
не жалею новых сессий

Счётчик Claude Code: Context 69.1k из 1M, 7 процентов

69.1k / 1M

  • Счётчик контекста всегда на виду
  • Задача закрыта: новая сессия, а не «ещё одно уточнение»
  • Сессия поплыла: не спорю, а начинаю заново с тикетом

Субагенты:
у каждого чистое окно

Оркестратор

раздаёт тикеты, получает итоги

Тикет 0044

Тикет 0047

Тикет 0049

Ревьюер

не видел, как писался код

Чтение кода, логи, тесты остаются у субагента. Наверх приходит короткий итог.

«Как это почти 50к токенов
сразу улетают?!»

Я, 25 июля, после сообщения «привет»

Claude Code после «привет»: 49.5k из 1M, System tools 21.6k, MCP tools 7.1k, Skills 4.5k

Урезал дефолтные
тулзы Claude Code

// ~/.claude/settings.json
"permissions": { "deny": [
  "EnterPlanMode", "ExitPlanMode", "NotebookEdit",
  "CronCreate", "CronDelete", "CronList",
  "RemoteTrigger", "ScheduleWakeup", "PushNotification",
  "SuggestSkills", "SuggestPluginInstall", "SuggestConnectors",
  "DesignSync", "ReportFindings", "propose_skills"
] },
"disableBundledSkills": true,
"disableClaudeAiConnectors": true,
"disableWorkflows": true,
"autoMemoryEnabled": false

System tools

20k→7.5k

AskUserQuestion и SendMessage оставил специально

«autoMemory: один раз ему что-то сказал, он сохраняет и постоянно так делает»
После deny: 28.8k, System tools 13.7k, MCP tools 11k

Отключите лишнее

Всё, что подключено, ещё до первого сообщения сидит в контексте каждой сессии.

скиллыdisable-model-invocation: описания скиллов не попадают в контекст, скилл вызывается явно
MCPвыключены все, кроме нужных в этом проекте
AGENTS.mdкороткий, остальное по ссылкам и по условию

Большинство AGENTS.md
не помогают

+20%

к стоимости, а успешность задач в среднем не растёт. Ни у сгенерированных, ни у написанных руками AGENTS.md

Gloaguen и др., «Evaluating AGENTS.md», arXiv 2602.11988, 2026

«Give Codex a map, not a 1,000-page instruction manual»

У OpenAI AGENTS.md около 100 строк и работает как оглавление: ссылки на docs/, где лежит остальное

OpenAI, «Harness engineering», 11.02.2026

Доки: оглавление,
а не простыня

kivuno/
├── AGENTS.md          140 строк: хаб и условия чтения
├── CONTEXT.md         домен, пользователи, инварианты
└── docs/
    ├── agents/        14 файлов, читаются по условию
    │   ├── backend.md
    │   ├── frontend.md
    │   ├── styling.md     ← после «где Tailwind?»
    │   ├── playwright.md  ← после «ничего непонятно»
    │   ├── ticket-tracker.md ← после «1–2 дня»
    │   └── testing.md …
    ├── adrs/          8 решений
    ├── tickets/
    ├── prototypes/
    └── client/        созвоны и документы клиента
«When working on server code, read docs/agents/backend.md»

AGENTS.md говорит, что читать и когда. Сам он короткий.

Правило появляется, когда ошибка повторилась. Не раньше

ADR: решения
с историей

docs/adrs/0008-pravka-utverzhdennogo-menyu-bez-chernovika.md

Статус

Принят. Заменяет часть ADR-0005

Контекст

На созвоне 21.09 клиент назвал замок утверждённого меню самым острым местом: диетолог не понимает, как поменять блюдо

Решение

Блюда правятся без возврата в черновик. Каждая правка пишется событием, директор видит список изменений

  1. 0001 стек
  2. 0002 прагматичный event sourcing
  3. 0003 SvelteKit
  4. 0004 деплой
  5. 0005 правки дня по времени и статусу
  6. 0006 Tailwind вместо классов прототипа
  7. 0007 кнопки и поля shadcn
  8. 0008 правка утверждённого меню
«If a proposed change conflicts with an existing ADR, surface the conflict explicitly rather than silently overriding the decision»из AGENTS.md

Процесс тот же.
Детали другие

ЭтапВеснаСейчас
Планирование
Тикеты
Исполнение
Проверка
Ревью
Оркестрация

Процесс тот же.
Детали другие

ЭтапВеснаСейчас
Планированиеplan mode, grill-me
Тикеты
Исполнение
Проверка
Ревью
Оркестрация

Кто пользуется
plan mode?

  1. AПостоянно
  2. BИногда
  3. CНе пользуюсь
  4. DЧто это?

Процесс тот же.
Детали другие

ЭтапВеснаСейчас
Планированиеplan mode, grill-mebatch-grill-me, прототипы
Тикеты
Исполнение
Проверка
Ревью
Оркестрация

«Хочу увидеть прототипы. Можешь прям сверстать с фейк данными. Дай несколько вариантов»

29.08. Три варианта за 10 минут, данные фейковые

Прототип A: экран «Сегодня» как плоский леджер
Прототип B: группы по срочности
Прототип C: таймлайн дня

Процесс тот же.
Детали другие

ЭтапВеснаСейчас
Планированиеplan mode, grill-mebatch-grill-me, прототипы
Тикетыmarkdown
Исполнение
Проверка
Ревью
Оркестрация

Кто даёт агенту
скриншоты?

  1. AПостоянно
  2. BИногда
  3. CТолько текст

Процесс тот же.
Детали другие

ЭтапВеснаСейчас
Планированиеplan mode, grill-mebatch-grill-me, прототипы
ТикетыmarkdownHTML, скриншоты, кадры из созвонов
Исполнение
Проверка
Ревью
Оркестрация

Из чего состоит тикет

  1. Как сейчас
  2. Зачем менять
  3. Что строим
  4. Критерии приёмки
  5. Журнал работы

Тикеты рождаются
из созвона

  1. Запись созвонаZoom, час с клиентом
  2. Транскриптwhisper с диаризацией, реплики с таймкодами
  3. Кадрыскриншоты из видео по таймкодам
  4. /to-ticketsагент режет на тикеты
  5. HTML-тикетцитаты и кадры внутри
[22:16] Speaker 1: журнал раскладок вот это вот и там вот здесь по идее можно тупо календарь
[22:27] Speaker 2: по календарю если согласен ... надо просто по дню и всё

kivuno: 13 созвонов в docs/client, только из одного созвона 21.09 нарезано 37 кадров

Claude: «I estimate this will take 1–2 weeks to complete»
Me:

Аниме-мем: рука на плече у персонажа с логотипом Claude

Агенты не оценивают.
Агенты засекают

Оценка Codex«1–2 рабочих дня вместе с тестами»
Факт13 минут
04 ч8 ч12 ч16 ч

22.08: усилить ревью в Sandcastle. «делай и коммит» в 09:01, коммит 2e62629 в 09:14, 487 тестов зелёные

Тикеты 0043–0064: от 16 минут до 2 ч 13 мин, обычно 25–60 минут.
Время пишет CLI, work start и work stop. «Never by guessing afterwards».

Процесс тот же.
Детали другие

ЭтапВеснаСейчас
Планированиеplan mode, grill-mebatch-grill-me, прототипы
ТикетыmarkdownHTML, скриншоты, кадры из созвонов
ИсполнениеTDDTDD + ponytail, property-based и мутации, browser use
Проверка
Ревью
Оркестрация

ponytail: ленивый сеньор

«You are a lazy senior developer. Lazy means efficient, not careless. The best code is the code never written»
  1. Это вообще нужно?
  2. Уже есть в кодовой базе?
  3. Есть в stdlib?
  4. Покрывает сама платформа?
  5. Решает уже установленная зависимость?
  6. Можно одной строкой?
  7. Только тогда минимальный код

DietrichGebert/ponytail, SKILL.md. Упрощения помечаются комментарием # ponytail: … с пределом и путём апгрейда

JetBrains проверили

ОбещалиНамерили
Кода−54%−15%
Стоимость−20%−10,3%
Время−27%−11%
Качествобез разницы

JetBrains AI blog, июль 2026: 80 парных задач. Первый «экономитель токенов» в их серии со статистически значимой экономией. Код сокращается там, где было куда переусложнить

Property-based testing

Функция со скрытым багом

def encode(input_string):
    count = 1
    prev = ""
    lst = []
    for character in input_string:
        if character != prev:
            if prev:
                lst.append((prev, count))
            count = 1
            prev = character
        else:
            count += 1
    lst.append((character, count))
    return lst

def decode(lst):
    return "".join(character * count for character, count in lst)

Run-length encoding: «WWWB» → [("W", 3), ("B", 1)]. Пример из документации Hypothesis

Property-based testing

Обычный тест: зелёный

def test_encode_decode():
    s = "WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWW"
    assert decode(encode(s)) == s

✓ passed

Property-based testing

Свойство: для любой строки

from hypothesis import given
from hypothesis.strategies import text

@given(text())
def test_decode_inverts_encode(s):
    assert decode(encode(s)) == s
Falsifying example: test_decode_inverts_encode(s='')
UnboundLocalError: cannot access local variable 'character'

Hypothesis перебрал строки и ужал падение до минимального примера: пустая строка. Такой тест руками обычно не пишут

Моё свойство по бизнес-логике: сумма не зависит от порядка блюд

Витамин B2 в меню дня

На главной

1,89

В отчёте и PDF

1,88

  1. Сумма float зависит от порядка слагаемых
  2. В одном месте блюда шли в одном порядке, в другом в другом
  3. 1.885 и 1.8849999999999998 округляются по-разному

Обычные тесты были зелёные: в них одно блюдо или «удобные» числа

Mutation testing

Проверяет не код, а тесты. Инструмент портит код и смотрит, заметят ли это тесты.

Код и тесты

def can_buy_alcohol(age):
    return age >= 18

def test_adult():
    assert can_buy_alcohol(30)

def test_child():
    assert not can_buy_alcohol(10)

Мутант: >= заменили на >

def can_buy_alcohol(age):
    return age > 18      # тесты всё равно зелёные

$ mutmut run
survived: can_buy_alcohol  >= → >

Мутант выжил, значит границу в 18 лет никто не проверяет. Дописываем test_exactly_18.
Mutation score: доля убитых мутантов. Coverage такое не видит: строка ведь выполнялась.

Что нашли мутанты

Код: смены для супервайзера

def shifts_for(user: User) -> list[Shift]:
    query = select(Shift).join(Employee)
    if user.role == Role.SUPERVISOR:
        query = query.where(Employee.mentor_id == user.id)
    return db.scalars(query).all()

Супервайзер должен видеть только смены своей команды

Что нашли мутанты

Тест есть, coverage 100%

def test_supervisor_sees_team_shifts(supervisor, promoter):
    make_shift(promoter, mentor=supervisor)
    assert len(shifts_for(supervisor)) == 1

Строка с фильтром выполняется, coverage зелёный

Что нашли мутанты

Мутант: строку удалили

def shifts_for(user: User) -> list[Shift]:
    query = select(Shift).join(Employee)
    if user.role == Role.SUPERVISOR:
        pass  # мутант: фильтр по команде удалён
    return db.scalars(query).all()

✓ все ~1500 тестов зелёные. Мутант выжил

В тесте есть только одна смена, и она своя. Тест не отличает «свои смены» от «все смены»

Что нашли мутанты

Что это значит

def test_supervisor_does_not_see_other_teams(supervisor, other_supervisor):
    mine = make_shift(promoter_a, mentor=supervisor)
    make_shift(promoter_b, mentor=other_supervisor)
    assert shifts_for(supervisor) == [mine]

Контроль доступа никто не проверял: можно было стереть фильтр, и супервайзер видел бы смены всех команд. Таких мест нашлось 5 из 13

Browser use

Агент сам ходит по интерфейсам, в которых я путаюсь

AWS
AWS
Google Cloud
Google Cloud
Meta Business
Meta Business
ps.kz
ps.kz

Процесс тот же.
Детали другие

ЭтапВеснаСейчас
Планированиеplan mode, grill-mebatch-grill-me, прототипы
ТикетыmarkdownHTML, скриншоты, кадры из созвонов
ИсполнениеTDDTDD + ponytail, property-based и мутации, browser use
Проверкатесты, ruff, ty+ wemake, видео Playwright
Ревью
Оркестрация

wemake-python-styleguide

Самый строгий линтер для Python. Человеку был бы ад, агенту всё равно.

WPS210слишком много локальных переменных в функции (у нас больше 9 нельзя)
WPS231когнитивная сложность функции выше 11
WPS202слишком много функций и классов в модуле (больше 20)
WPS221слишком сложная строка
WPS226одна и та же строка-литерал повторяется
WPS229слишком длинное тело try (больше 5 строк)

Рядом ruff и ty: у ty нет strict-режима, 4 правила подняты до error. type: ignore в src: 0

Что ловит wemake

WrongCorrect

WPS531if, который просто возвращает bool

def is_adult(user):
    if user.age >= 18:
        return True
    else:
        return False
def is_adult(user):
    return user.age >= 18

WPS518неявный enumerate()

for index in range(len(people)):
    ...
for index, person in enumerate(people):
    ...

WPS519неявный sum()

total = 0
for price in get_prices():
    total += price
total = sum(get_prices())

Примеры из документации wemake-python-styleguide. Автоисправления нет: линтер падает, агент переписывает

Что ловит wemake

WrongCorrect

WPS432магическое число

total = get_items_from_cart() * 3.33
price_in_euro = 3.33
total = get_items_from_cart() * (
    price_in_euro
)

WPS507сравнение длины с нулём

if len(some_array) > 0:
    ...
if some_array:
    ...

WPS110 / 111пустые и короткие имена

item = None
x = 1
html_node_item = None
x_coordinate = 1

Примеры из документации wemake-python-styleguide. Автоисправления нет: линтер падает, агент переписывает

Эксперимент: returns

# что может упасть? из сигнатуры не видно
def get_user(user_id: int) -> User: ...
# библиотека returns: ошибка стала частью типа
def get_user(user_id: int) -> Result[User, NotFound | Forbidden]: ...

get_user(42).bind(load_orders).map(render)
RustResult<T, E> и ?Goval, err := f()
JavathrowsTypeScriptEffect<A, E, R>

Плюсы

Агент не может «забыть» ошибку. Тайпчекер ловит необработанный путь. Чтобы понять функцию, хватает сигнатуры.

Минусы

Не по-питоновски. Остальные библиотеки всё равно бросают исключения. Код уродливее.

Было

Эксперимент: returns

def checkout(user_id: int, cart_id: int) -> Receipt:
    user = get_user(user_id)
    cart = get_cart(cart_id)
    payment = charge(user, cart.total)
    return make_receipt(payment)

Обычный Python. Что может упасть на каждом шаге, из кода не видно

Стало

Эксперимент: returns

def checkout(user_id: int, cart_id: int) -> Result[Receipt, CheckoutError]:
    return flow(
        get_user(user_id),
        bind(lambda user: get_cart(cart_id).map(lambda cart: (user, cart))),
        bind(lambda pair: charge(pair[0], pair[1].total)),
        map_(make_receipt),
    )

Ошибки теперь в типе. Но чтобы протащить user и cart дальше по цепочке, появились лямбды и кортежи. На это и жалуются

Код уродливее,
зато ошибки в типах.
Согласились бы?

  1. AДа
  2. BНет
  3. CСмотря кто его читает

Доказательство, что тикет выполнен

Каждый тикет агент закрывает видео

Курсор, подписи к каждому клику и что мы ожидаем увидеть. Смотрю видео, а не дифф

PostHog: агент смотрит
запись сессии

  1. Жалоба«Клик в любое место экрана открывает запись 001152»
  2. «Ты можешь посмотреть posthog»агент скачал запись сессии через API и разобрал клики скриптом
  3. Доказательство4 клика в разные точки, все попали в ссылку 50-й строки таблицы
  4. ПричинаSafari игнорирует position: relative на <tr>: «растянутые» ссылки строк легли на всю страницу
  5. 45 минутот передачи агенту до фикса на проде, плюс e2e-тест

Вчера ночью. Запись сессии с полным маскированием текста и полей. В интерфейсе PostHog запись никто не открывал

Процесс тот же.
Детали другие

ЭтапВеснаСейчас
Планированиеplan mode, grill-mebatch-grill-me, прототипы
ТикетыmarkdownHTML, скриншоты, кадры из созвонов
ИсполнениеTDDTDD + ponytail, property-based и мутации, browser use
Проверкатесты, ruff, ty+ wemake, видео Playwright
Ревьюне особо верилодин проход в чистом контексте
Оркестрация

Что находит ревью

ВажностьГдеНаходка
criticalERP, стримыПосле перепривязки стрима история подключений утекала другому клиенту
criticalERP, сверкаЗаписи с несовпадением времени пропадали из «После сверки»
majorERP, сменыПосле переназначения смены другой промоутер проходил по чужому тесту

Реальные баги находили первые проходы. Повторные превращались в спор о форме тестов

Процесс тот же.
Детали другие

ЭтапВеснаСейчас
Планированиеplan mode, grill-mebatch-grill-me, прототипы
ТикетыmarkdownHTML, скриншоты, кадры из созвонов
ИсполнениеTDDTDD + ponytail, property-based и мутации, browser use
Проверкатесты, ruff, ty+ wemake, видео Playwright
Ревьюне особо верилодин проход в чистом контексте
ОркестрацияSandcastle, worktreesсубагенты в Codex и Claude

Оркестратор больше
не отдельный софт

Весной

worktrees
+ Sandcastle
+ Playwright gates

Сейчас

Codex или Claude
+ субагенты

Кто поднимал руку за AO, Conductor, Orca, cmux?
Я с отдельного оркестратора ушёл.

Весь промпт

выполняй свободные тикеты. по мере исполнения забирай новые. используй субагентов

Мем: они даже не догадываются, какой сложный промпт сегодня я попросил написать ИИ
Codex: субагент Profile пишет Catalog, Organizer и родителю
Codex: закрыты 0001–0003, 34 теста, взяты 0004 и 0005

Весь процесс сегодня

  1. Планированиепрототипы
    batch-grill-me
  2. ТикетыHTML, скриншоты,
    кадры созвонов,
    журнал времени
  3. ИсполнениеTDD, ponytail,
    property-based,
    мутации, browser use
  4. Проверкаruff, ty, wemake,
    видео, PostHog
  5. Ревьюодин проход
    в чистом контексте
  6. Оркестрациясубагенты
    в Codex и Claude

Кто читает код,
который пишет агент?

  1. AВесь
  2. BЧастично
  3. CТолько важное
  4. DНе читаю вообще

Два режима

Одна и та же мастерская дважды: днём с чертёжным столом, ночью с горящими окнами и работающими манипуляторами

Днём: работаю с агентом

Прототипирую, спорю, режу на тикеты, смотрю видео.

Ночью: агент без меня

Очередь тикетов, субагенты. Утром разгребаю: всё готово бывает редко.

Ночная смена в цифрах

~8

тикетов за ночь, от 4 до 16

~4300

строк кода

~2300

строк тестов

Медиана по 13 ночным прогонам в двух проектах, август–сентябрь. Без сгенерированных файлов и документации

А утром это всё надо принять

Кто смотрит тред,
пока агент работает?

  1. AСмотрю всё время
  2. BПоглядываю
  3. CУхожу
  4. DОставлял на ночь

Узкое место
теперь я

Почему я

  1. Приёмка: каждый тикет кто-то должен посмотреть и принять
  2. Переключение между проектами: четыре проекта в день
  3. Удержать всё в голове: решения, клиенты, что где сломано
  4. Агенты ошибаются, и ошибки тупые. Приходится погружаться самому

Результат часто кривой

  1. Смотрювидео, скриншот, живой экран
  2. Прошу поправитьсловами, иногда со скриншотом
  3. Всё ещё кривовторой, третий заход
  4. Открываю IDEдебаг, брейкпоинты
  5. Нахожу бардаки правлю сам

Ночью агент работает без меня. Утром я разгребаю: всё готово бывает редко.
Работы всё ещё полно. Полной автоматизации нет.

Утро после ночной смены. Тесты зелёные

Мем This is fine: собака в горящей комнате

Журнал замечаний

ДатаОбъектЗамечание
07.05админка, утро после ночи«Навигация сломана. Основной функции админки, начислять поинты, нет»
13.08ERPTailwind поставили, но не подключили. Весь интерфейс без стилей, тесты зелёные
16.08ERP, форма входа«Обычный HTML form. С хера ли так вышло? Мы же чётко прописали стек. Это полный фейл»
24.08RAG-бот«Это тупой хардкод, так делать нельзя»
13.09kivunoapp.css на 1857 строк, лимиты линтера для него выключены

Из моих тредов. После первой ночи на админке пришлось заводить ещё один PRD на 7 тикетов

Подгонка под вопрос

if count.prefix == 'АФ' and {'АФ56', 'АФ69'} <= outside_codes:
    ...

Рядом регулярка заменяла любое число перед словом «магазин» на 80. Эвал зелёный, бот «умнеет».

«Это тупой код, его не должно быть. Это хардкод, подгонка»

Нашёл, когда сам полез в код. Механику удалили целиком, точечный эвал после этого упал до 4 из 11. Честная цифра

Результат мимо return

# было: тул пишет результат в deps
@search_agent.tool
def record_computation(ctx, finding: str) -> str:
    ctx.deps.computations.append(finding)
    return 'записано'

with suppress(UsageLimitExceeded):
    await search_agent.run(q, deps=deps)
# ...всё уже лежит где-то в deps
# стало: результат это output агента
class SearchFindings(BaseModel):
    document_ids: list[str] = []
    findings: list[Finding] = []

search_agent = Agent(MODEL, deps_type=Deps,
    output_type=[str, SearchFindings])

run = await search_agent.run(q, deps=deps)
return run.output
«Передавать результат как аргумент, вместо того чтобы возвращать, это ОЧЕНЬ кривой дизайн»

pydantic-ai, RAG-бот. Антипаттерн агент внёс днём, я нашёл его ночью, читая код. Три коммита и ADR

Дом на тонких сваях над туманом, фундамента не видно, рейка лежит без дела

Ещё одна
проблема

Кто мерил свой сетап
эвалами?

  1. AМерил
  2. BСобираюсь
  3. CНет

Я тоже нет.

Ещё одна проблема

Свой сетап тяжело эвалить

Про LLM-продукты я давно говорю: без эвалов вы ничего не знаете. Свой сетап я эвалами не мерил.

идеяодин тикет, один коммит, разные скиллы. Треды, разложенные по типам задач

И последний вопрос

А нужно ли это вообще?

146

минут у пяти людей в среднем

62

минуты у роя агентов, половина на проверки

15

минут внимания человека понадобилось рою

«Я не ревьюю код агентов. Я измеряю»Роберт Мартин, эксперимент John Henry: 6 агентов, 622 коммита, 13 тыс. строк, код не читал

Весь мой процесс нужен человеку, который читает код.
Но пока без человека задача до конца не доходит.

Код больше
не узкое место

Теперь это контекст и ваше внимание

Связь
@x3gxu · azamat.ai

Вопросы

Все материалы

Презентация и пример проекта

QR-код: azamat.ai/tg/almaty-python-meetup-8