Техлид прислал 36 вопросов в 10 темах (в сопроводительном письме фигурировало «30» — по факту вопросов 36, отвечаем на все).
Каждый ответ построен по одной схеме:
| Часть | Что это значит |
|---|---|
| Короткий ответ | Решение в одну-две фразы. Это то, что можно зафиксировать как ADR. |
| Обоснование | Ссылка на раздел технического проекта и логика, почему именно так. |
| Что нужно от техлида | Что осталось нерешённым или требует подтверждения. Ничего из этого не блокирует публикацию документа — всё фиксируется на Фазе 0/1. |
Приоритеты исходные: P0 — блокирует старт, P1 — блокирует MVP, P2 — уточнить до Фазы 2.
Ссылки вида «§5.9» — разделы 01-технический-проект.md.
| # | Вопрос | Принятое решение | Где зафиксировано |
|---|---|---|---|
| 1 | Агрегатор и координатор — один продукт? | Один продукт; в MVP агрегатор — основной сценарий, координатор — несущий слой | §11.2, §5.1 |
| 2 | Репозиторий платформы | Отдельный self-hosted сервис + тонкий CLI; стенд уже развёрнут | §6.1, §15 п.1 |
| 3 | Сколько адаптеров в MVP | Три: Claude Code, ChatGPT/Codex, Grok. Контракт — RunResult + AgentAdapter | §4.2, §6.3 |
| 4 | MCP-сервер | Свой, схема инструментов — публичный API платформы | §6.1, §6.3 |
| 5 | Events | Postgres, append-only, replay через пересборку проекций | §6.2, §7.2 |
| 6 | Истечение claim | Авто-возврат в ready + событие; эскалация — при повторе | §7.2, §6.2 |
| 7 | Breaking-флаг | Вычисляется по diff схемы, человек подтверждает спорное | §9.3 |
| 8 | pgvector для D-5 | В MVP не нужен: триграммы + правила; эмбеддинги — Фаза 2 | §7.3, §11.2 |
| 9 | Judge — роль или процесс | Процесс с владельцем-техлидом; правка промпта = ADR | §5.10 |
| 10 | Порог D-5 | В MVP блокировок нет — только пометка; порог калибруется на baseline | §14 R-6 |
| 11 | Веса ролей | Конфигурация проекта, по умолчанию — из RACI | §4.3 |
| 12 | N для D-6 | N = TTL/2, 15–60 мин, конфигурируемо; сам D-6 — Фаза 2 | §7.2, §11.3 |
| 13 | Политика режимов | Принимается как есть; порог 60% → в конфиг | §5.9 |
| 14 | Бюджет пилота | Пересчитан: $1,48/задачу → 338 задач при $500, не 110–180 | §5.11 |
| 15 | Cost ledger Grok | По токенам; в MVP достаточно per-task лимита | §5.4, §11.3 |
| 16 | Лимиты | 80% — предупреждение, 100% — пауза и эскалация; авто-понижения нет | §9.4 |
| 17 | Маппинг ролей | Таблица §4.2; Grok по умолчанию не пишет код | §4.2, §15 п.10 |
| 18 | SLA 1ч/4ч | Разделены: агентские и человеческие; 4 ч — только рабочее время | §4.4, §9.2 |
| 19 | Недоступный владелец зоны | Primary + fallback; зона никогда не остаётся без владельца | §4.4 |
| 20 | RACI | Утверждает владелец продукта, ревью — ежеквартально | §4.3 |
| 21 | pass_with_warnings | Не блокирует; warnings → отдельные задачи со сроком | §9.2 |
| 22 | Handoff-пакет | Валидирует платформа по JSON Schema; невалидный — не уходит в review | §9.2, §5.5 |
| 23 | Reject со ссылкой | Ссылка проверяется автоматически; неизвестный критерий → reject не принят | §9.2, §12 кр.5 |
| 24 | Redacting логов | Обязательный тест-кейс в критериях приёмки | §12, §14 R-8 |
| 25 | Секреты | Владеет пользователь; платформа — брокер и аудит | §15 п.9, §14 R-8 |
| 26 | Allowlist инструментов | Ведёт техлид; пересмотр ежемесячно; по умолчанию пуст | §14 R-8 |
| 27 | Baseline | 5 метрик, sales.travel, 2 недели ретро, baseline.yaml | §11.1, §13 |
| 28 | «85% без человека» | Это цель Фазы 3, не факт и не обещание MVP | §13 |
| 29 | «% задач из RELAY» | Порог 80% в Фазе 1, 95% в Фазе 2 | §14 R-1 |
| 30 | Ежемесячный тюнинг | Ритуал техлида, 1,5 ч/мес, привязан к ревью спринта | §5.9, §5.10 |
| 31 | R-1: работа мимо платформы | Соглашение + отсутствие выгоды: без claim нет контекст-пакета | §14 R-1, §6.3 |
| 32 | R-3: очередь гейтов | SLA 2 ч/8 ч рабочего времени; человек видит 2–3 готовых варианта | §14 R-3, §11.3 |
| 33 | R-5: дрейф интеграций | «Золотые» прогоны на каждый адаптер, гоняются в CI | §14 R-5 |
| 34 | 2-недельный срез | Принимается; sales.travel; техлид 0,3 + fullstack 1,0 FTE | §11.1, §15 п.8 |
| 35 | Владелец продукта | Вы; лично — цели, non_goals, релиз, бюджет, семантика | §4.3, §15 п.2 |
| 36 | Хранение артефактов | Git-репозиторий + RELAY как индекс; синхронизация — CI → webhook | §15 п.7, §6.1 |
Короткий ответ. Один продукт с двумя слоями, но в MVP пользовательский сценарий один — агрегатор. Координатор в MVP — несущая конструкция, а не отдельный продукт с отдельным интерфейсом.
Обоснование. Агрегатор (§5) физически не может работать без координатора: чтобы запустить три прогона, нужно взять claim, собрать Context Pack, проверить DoD-гейт, записать ADR и свести диффы. Это всё координатор. Обратное тоже верно: агрегатор — это 4 из 12 подсистем Фазы 1 (1.8–1.11), а не весь продукт. Делить кодовую базу на два проекта искусственно: у агрегатора и координатора одна схема БД (19 таблиц), один жизненный цикл задачи (§9.1), один контракт RunResult.
Практическая граница, которую я предлагаю зафиксировать явно:
relay pull.Что нужно от техлида.
Короткий ответ. Отдельный self-hosted сервис (Docker Compose) + тонкий CLI в отдельном репозитории. Решение уже принято и, что важно, уже реализовано на практике: стенд развёрнут, схема БД создана, health- и ready-эндпоинты работают.
Обоснование. Рекомендация §15 п.1 и §6.1. Монорепо с продуктовыми проектами отвергнут по трём причинам: у RELAY своя схема БД (19 таблиц) и свой жизненный цикл; продуктовые репозитории не должны зависеть от релизов платформы; обновление платформы должно быть одной операцией, а не «пересобрать всё, что задевает».
Фактическое состояние на сегодня: платформа развёрнута в отдельном контейнере, обслуживается как самостоятельный сервис с Docker Compose, образы собираются из репозитория платформы, миграции вшиты в образ и применяются при старте.
Что нужно от техлида.
v0.9.1 и т. д., откат = предыдущий тег + миграция с down.Короткий ответ. Три инструмента: Claude Code (основной исполнитель), ChatGPT/Codex (второй исполнитель + ревьюер диффа), Grok (исследователь, код по умолчанию не пишет). Контракт — RunResult (§5.5) и интерфейс AgentAdapter (§6.3). Адаптеры пишет команда платформы; владеет контрактом техлид.
Обоснование. §4.2 фиксирует роли инструментов, §11.2 п.1.8 — подсистему адаптеров. Интерфейс намеренно минимален:
interface AgentAdapter {
capabilities(): Capability[] // design | code | research | verify | plan
run(task: TaskEnvelope): RunHandle // получает Context Pack + Task
report(run: RunHandle): RunReport // что сделано / не сделано / риски
}TaskEnvelope = { contract_snapshot, context_pack, task, acceptance_checks, zone, deadline, budget }. Правило, которое стоит зафиксировать: всё, что не выражается через эти три метода, — не часть контракта. Иначе каждый агент «немного свой», и сопоставление прогонов разваливается.
Сопоставимость трёх инструментов обеспечивается именно сведением к общему RunResult: diff, checks, cost, verdict, artifacts (§5.5). Именно этот контракт, а не «формат ответа модели», позволяет потом написать единый движок сведения и Judge.
Что нужно от техлида.
capabilities() — по нему планировщик режимов (§5.9) будет понимать, кто на что способен.Короткий ответ. Свой MCP-сервер RELAY, построенный на существующем SDK, а не на самописном протоколе. Схемой инструментов владеет платформа; она же отвечает за обратную совместимость.
Обоснование. §6.1 (Interface: Agent CLI + MCP-сервер + WebSocket/SSE-стрим) и §6.3 (pull-модель — агент сам ходит в RELAY за задачами). Сторонний MCP-сервер здесь не подходит: инструменты RELAY (claim, report, handoff, pull) несут продуктовый смысл, и их семантика — часть контракта. Взять чужой сервер и «навесить» на него эти операции — значит тащить в проект чужую модель прав и несовместимый lifecycle.
Но писать MCP с нуля не нужно: используем официальный SDK, свои — только схемы инструментов и бизнес-правила.
Что нужно от техлида.
Короткий ответ. Postgres, таблица events. Append-only на уровне приложения: в API нет ни UPDATE, ни DELETE для событий. Replay — пересборка проекций из ленты. Миграции схемы events — только вперёд, владеет backend-инженер платформы.
Обоснование. §6.2 (событийная модель как ключевое техническое решение), §7.2, критерий приёмки 8 (§12). Отдельный лог (Kafka/NATS) для MVP — явный оверинжиниринг: нам нужен replay по конкретной задаче и по проекту, а не бесконечный поток с партиционированием. Отдельная аналитическая БД — тоже: Postgres 16 + pgvector уже покрывает и состояние, и поиск.
Принципиальное разделение, которое стоит зафиксировать: events — источник истины, а таблицы текущего состояния — проекции. Поэтому «как откатить задачу в in_progress» — это не UPDATE tasks, а компенсирующее событие. Побочный выигрыш: метрики (§13) считаются из той же ленты, без отдельного пайплайна.
Replay должен быть воспроизводимым: та же последовательность событий даёт ту же проекцию. Значит, у события есть seq (монотонная последовательность), и никаких «текущих» значений внутри payload.
Что нужно от техлида.
seq при архивировании сломает replay — нужен ответ.events напрямую. Предлагаю: только оркестратор — это упрощает рассуждение о порядке.Короткий ответ. Артефакт автоматически освобождается и возвращается в ready; в ленту пишется событие claim.expired. Эскалация при истечении — нет: она была бы шумом. Эскалация возникает при повторном истечении по той же задаче.
Обоснование. §6.2 («Claim = lease с TTL. Истёкший TTL освобождает артефакт — "забытый" артефакт не блокирует проект навсегда»), §7.2 (lease_until timestamptz NOT NULL), критерий 3 (§12).
Схема работы:
ready, пишется событие.flaky_claim и уходит на разбор — это уже признак проблемы с агентом, а не с таймаутом.Тонкость, которую надо зафиксировать: если у истёкшего claim'а был частичный результат (ветка, коммиты), задача возвращается в ready не «с нуля», а с пометкой «нужна переоценка состояния» — иначе работа агента теряется молча.
Что нужно от техлида.
ready или в ready с флагом переоценки при наличии частичного результата (предлагаю второе).claim.expired) или ленивая проверка при следующем pull.Короткий ответ. Breaking вычисляется по diff'у схемы, но подтверждается человеком в спорных случаях. То есть это не ручная метка и не чистый автомат.
Обоснование. §9.3, §7.2 (artifact_versions с breaking-флагом), §5.9 (жёсткое исключение: изменение consumer_contract — всегда Fan-out ×3).
Автоподсчёт покрывает ~90% случаев. Правила, которые предлагаю зафиксировать как формальный и версионируемый список:
| Признак в diff схемы | Breaking? |
|---|---|
| Поле удалено | да |
| Поле переименовано | да |
| Тип поля изменён | да |
Поле стало required (было опциональным) | да |
Значение удалено из enum | да |
Поле стало optional | нет |
| Добавлено новое опциональное поле | нет |
Изменено описание или default | нет, но помечается как «ревизия» |
Остаётся 10% — «структура не поменялась, а смысл поменялся». Пример: enum-значение pending переименовали в awaiting_review, структура та же, но потребитель, сравнивающий строки, ломается. Здесь нужен человек.
Асимметрия ошибок — то, ради чего я предлагаю подтверждение человеком: ложный non-breaking = тихая поломка потребителей, ложный breaking = лишний fan-out и лишние деньги. Первое дороже.
Что нужно от техлида.
Короткий ответ. В MVP эмбеддинги не запускаем. Для D-5 хватает триграммного индекса и правил дедупликации. Эмбеддинги — Фаза 2, когда накопится разметка.
Обоснование. §7.3 (GIN-индекс gin_trgm по tasks.intent — уже заложен под D-5), §11.2 (детекторы D-1, D-2, D-4, D-5 в Фазе 1), §14 R-6 (ложные срабатывания D-5 — высокая вероятность).
Практическая аргументация: эмбеддинги требуют (1) внешнего инференса — деньги, латентность и сетевой доступ, чего в нашем контуре нет по умолчанию; (2) хранения и пересчёта при смене модели; (3) калибровки порога, которой ещё не существует. Триграммы дают основную пользу (похожие формулировки) без внешней зависимости.
Если эмбеддинги всё же понадобятся: локальная модель на своём железе, эмбеддинги считает платформа, оплачивает владелец проекта из своего бюджета — отдельной строкой, не из «общего котла» пилота. И жёсткое правило: эмбеддинги никогда не блокируют задачу, только предлагают.
Что нужно от техлида.
Короткий ответ. Это процесс с одним владельцем — техлидом. Техлид владеет промптом Judge, техлид проводит еженедельные разборы, каждый разбор оформляется как ADR.
Обоснование. §5.10 (контракт арбитра), §5.6, §5.4. Judge — узкое место: он включается только на семантических конфликтах, а не на каждой задаче (§5.6). Значит, частота срабатывания низкая, и работающая практика — «команда переписывает промпт по ходу дела» — вполне допустима, если она оформлена.
Процесс разбора:
events с полным пакетом входа и выхода (§5.10) — это условие аудита.confidence, добавление критерия во входной пакет. Любое из трёх — ADR, потому что меняет правила разрешения конфликтов.Что нужно от техлида.
Короткий ответ. В MVP порога нет: D-5 работает как «предложение», а не как блокировка. Порог появляется после baseline и калибруется владельцем продукта по данным Фазы 0.
Обоснование. §14 R-6 — ложные срабатывания D-5 имеют высокую вероятность и среднее влияние. Цена ложного срабатывания (блокировка реальной, нужной задачи) выше цены пропуска (дубликат доживёт до ревью Product-агента). §11.1 требует baseline до старта Фазы 1.
Механика в MVP:
duplicate_candidate и показывает рядом похожие задачи с пересечением зон.Что нужно от техлида.
labels/d5.csv в репозитории проекта? Предлагаю там — версионируется и переживает смену платформы.Короткий ответ. Конфигурация проекта, а не хардкод. По умолчанию веса берутся из RACI (§4.3): A > R > C > I. Если веса равны — эскалация человеку.
Обоснование. §4.3, §14 R-6 (ложные срабатывания детекторов). Формулировка «веса ролей равны» на практике означает: оба решения претендуют на одну зону или на две зоны с одинаковым статусом — тогда решает человек.
Правило сравнения, которое предлагаю зафиксировать точнее, чем «веса ролей»:
> Сравниваются не роли авторов, а приоритет решений в зоне, к которой относится конфликт. Решение, принятое владельцем зоны (A), сильнее решения, принятого исполнителем (R) в другой зоне. Если обе стороны в равной позиции — эскалация.
Это лучше, чем сравнивать роли буквально, потому что иначе решение SEO-агента о семантике всегда проигрывало бы решению Product-агента о требованиях, даже когда зоны разные и конфликта нет.
Что нужно от техлида.
relay.config.yaml в репозитории проекта (тогда он версионируется и попадает в impact-граф) или в БД платформы (тогда быстрее менять, но теряется история)? Предлагаю — в репозитории, с ADR на изменение.Короткий ответ. N = TTL lease / 2, с границами 15–60 минут для обычных задач; для задач с веб-поиском — до 2 часов. N конфигурируется на уровне проекта. Сам D-6 в MVP не работает: в Фазе 1 тихий сбой ловится грубее — по истечении claim.
Обоснование. §7.2 (lease_until), §6.3, §11.3 (детектор D-6 и авто-переназначение — Фаза 2). Разводить D-6 и lease имеет смысл: lease — это про владение артефактом, D-6 — про переназначение задачи другому агенту.
Механика:
Что нужно от техлида.
Короткий ответ. §5.9 принимается в текущей формулировке. Владелец правила — владелец продукта, техлид правило исполняет. Со стороны техлида предлагается ровно одна правка формулировки: порог детектора дублирования 60% назвать ориентиром по умолчанию и вынести в конфигурацию, а не считать константой.
Обоснование. §5.9, §15 п.13, критерий приёмки 12 (§12). Четыре оси, детерминированное правило 0–2 / 3–4 / 5–8, жёсткие исключения — всё это проверяемо и не зависит от настроения в конкретный день. Важный нюанс, который надо проговорить прямо: детерминированно правило, но не детерминирована оценка осей — оси оценивает LLM, и поэтому у правила есть порог, лог и метрика качества (§5.9).
Именно поэтому предлагаю не «менять правило», а измерить точность оценки осей: сверять машинную оценку с решением человека на размеченной выборке. Если расхождение систематическое — правятся формулировки осей, а не пороги.
Что нужно от техлида.
Короткий ответ. Да, пересчитан — и пересчёт даёт не 110–180 задач, а 338 задач/мес при бюджете $500, потому что политика режимов снижает стоимость задачи с $2,72 до $1,48.
Обоснование. §5.11. Расчёт:
| Величина | Значение |
|---|---|
| LLM-расход на задачу при наивном fan-out ×3 | $2,72 |
| Средний множитель режимов (Solo 55% / Dual 30% / Fan-out 15%) | 1,50× вместо 2,75× |
| LLM-расход на задачу с политикой режимов | $2,72 × 1,50 / 2,75 = $1,48 |
| Задач при LLM-бюджете $500/мес | 500 / 1,48 ≈ 338 |
| Задач при LLM-бюджете $300/мес | 300 / 1,48 ≈ 203 |
| Инфраструктура | ≈ $0 (своё железо, стенд уже развёрнут) |
То есть ~7–14 задач в рабочий день. Для «одного фича-спринта» этого более чем достаточно — спринт на 40–60 задач укладывается в $60–90 LLM-бюджета. $300–500 — это потолок для пилота, а не целевой расход.
Критическая оговорка, без которой расчёт врёт: это не чистая экономия, а перераспределение. Мы тратим меньше на задачу, но делаем больше задач — лимит остаётся $500. Экономия появляется, когда появляется свободное время человека: без RELAY человек тратит его на ручную координацию, а с RELAY — на задачи.
Что нужно от техлида.
Короткий ответ. По токенам — это единственная честная единица, потому что только она сопоставима между провайдерами. «Ценность факта» измеряется отдельной метрикой, не деньгами.
Обоснование. §5.4 (Grok → факты в отчёт и ADR, код не трогаем), §6.2 (полный аудит и cost ledger), §11.3 (cost ledger — Фаза 2).
Здесь важно не сломать MVP: по плану ledger — Фаза 2, и для Фазы 1 достаточно двух вещей:
RunResult.cost (§5.5) уже сейчас: { tokens, duration_s, usd }.Полноценный ledger (разрезы по проекту, по агенту, по модели, по дню) — Фаза 2. Это честная позиция: заявлять в MVP «полную стоимость задачи в проекте» нельзя, пока нет разрезов.
Отдельно про Judge: стоимость его прогона обязана идти отдельной строкой judge_cost (§5.10) — иначе решения арбитра растворяются в общей стоимости агрегации и их нельзя оптимизировать.
Что нужно от техлида.
cost в RunResult, без полного ledger.judge_cost.Короткий ответ. Лимиты устанавливает владелец проекта (они лежат в контракте проекта), по умолчанию — из конфигурации платформы. При превышении: 80% → предупреждение агенту; 100% → пауза и эскалация человеку. Авто-понижение режима — нет.
Обоснование. §9.4. Причина, по которой авто-понижения быть не должно: оно тихо ухудшает результат, и пользователь узнаёт об этом только на ревью — то есть цена ошибки обнаруживается слишком поздно. Пауза + эскалация сохраняет явность, которая и является ценностью платформы.
Важная деталь для fan-out, которой сейчас нет в §9.4: лимит считается суммарно на все прогоны задачи, а не на каждый. Иначе задача с лимитом $2 при fan-out ×3 получит $6 молча — и именно этот баг делал бы экономику §5.11 неверной.
Что нужно от техлида.
Короткий ответ. Таблица §4.2 — это и есть маппинг. Да, один агент может держать несколько зон, но решает он их по разным профилям, и это отражается в профиле прогона.
Обоснование. §4.1 (пять проектных ролей и их зоны), §4.2 (маппинг на инструменты), §4.3 (RACI).
Сводная таблица:
| Проектная роль | Кто играет | Инструмент | Как именно |
|---|---|---|---|
| Реализация, рефакторинг, многофайловые изменения | Основной исполнитель | Claude Code | CLI headless + MCP, свой worktree |
| Альтернативная реализация, тесты, edge-cases, ревью диффа | Второй исполнитель и ревьюер | ChatGPT (Codex) | codex exec в отдельном worktree |
| Исследование, семантика, внешний контекст | Исследователь | Grok | xAI API + web search, код не пишет |
| Требования, критерии приёмки, приоритеты | Product / ведущий | Человек (или Claude Code в режиме plan) | Решения — ADR |
| Приёмка по DoD, регрессия | Верификатор | Claude Code в отдельном прогоне + CI | Прогон-верификатор ≠ прогон-автор |
Два правила, которые надо удерживать, потому что на них держится смысл всей конструкции:
Что нужно от техлида.
relay.config.yaml или автоматически по capabilities(). Предлагаю: в MVP — вручную, это быстрее и предсказуемее.Короткий ответ. Разделён, и это обязательно. 1ч/4ч — это SLA агента на ответ по заявке и хендоффу (§4.4, §9.2). Для человека нужен отдельный SLA, и 4 часа для человека реалистичны только в рабочее время.
Обоснование. §4.4 (SLA владельца зоны), §9.2 (получатель обязан ответить вердиктом за SLA), §15 п.4 (человек в контуре: только гейты + 1 разбор в день).
Предлагаемое разделение:
| Кто | Блокирующее | Обычное | В нерабочее время |
|---|---|---|---|
| Агент | 1 час | 4 часа | не применимо — агент работает всегда |
| Человек | 2 рабочих часа | 8 рабочих часов | очередь, эскалация утром |
Почему нельзя смешивать: если «решено за 4 часа» в ночном счётчике означает «человек посмотрел в 9 утра», то метрика MTTR конфликта (§13) систематически занижается, а ожидания по SLA становятся бессмысленными.
Что нужно от техлида.
Короткий ответ. Зона никогда не остаётся без владельца. У зоны есть primary owner и fallback owner (по умолчанию — второй экземпляр того же адаптера), который принимает зону автоматически, с записью в events.
Обоснование. §4.4. Ключевая мысль: владение зоной — это право на интерфейс, а не персональная обязанность. Поэтому оно делегируемо по умолчанию, и агент, который «недоступен», не блокирует работу, а просто перестаёт быть первым в очереди.
Цепочка деградации:
zone.owner_fallback.Важная деталь: пункт 3 — это сознательное решение. Альтернатива «закрыть зону и раздать задачи другим» нарушила бы правило одного владельца и породила бы конфликты прав, которые RELAY как раз и устраняет.
Что нужно от техлида.
zone:copy может по определению принадлежать человеку. Предлагаю да, и это снимает часть вопроса с SLA.Короткий ответ. Утверждает владелец продукта, техлид готовит изменение как ADR. Пересмотр — раз в квартал и при любом изменении зон, контракта или состава агентов.
Обоснование. §4.3, §6.2 («оркестратор оптимизирует поток, но не имеет права менять цели; гейты — единственный путь изменения контракта»).
Отдельно стоит подумать, нужна ли проверка RACI против фактического поведения агентов: матрица говорит, кто за что отвечает, но агент может взять задачу из чужой зоны. Это уже ловится детектором D-2 (§ нарушение контракта → claim отклоняется). То есть RACI — это ожидание, D-2 — его enforcement. Стоит только явно сказать это в документе, чтобы не искали отдельный механизм.
Что нужно от техлида.
contract.yaml проекта (версионируется, попадает в impact-граф) или отдельно в платформе (быстрее менять, но без истории)? Предлагаю — в contract.yaml.Короткий ответ. pass_with_warnings не блокирует. Артефакт принимается, предупреждения превращаются в отдельные задачи. Блокирует только fail.
Обоснование. §9.2, §10 (шаг 8) — в примере сквозного сценария вердикт accept_with_comments с одним замечанием и одним мелким багом закрывает задачу, а замечание уходит в отдельную задачу. Это и есть рабочая семантика.
Практический смысл: если warnings блокируют, DoD-гейт превращается в гарантированный источник задержек, и люди начинают «перебивать» вердикт — то есть система перестаёт быть достоверной.
Правило, которое предлагаю добавить: у warnings есть срок. Незакрытая warning старше 5 рабочих дней поднимается в эскалацию. Иначе «не блокирует» превращается в «забывается».
Что нужно от техлида.
Короткий ответ. Валидирует платформа, автоматически, по JSON Schema — до приёма. Невалидный пакет = задача не переходит в review, агент получает машинный список ошибок и чинит пакет.
Обоснование. §9.2 («пустой not_done при отсутствии рисков — норма, но done без единого пункта — ошибка валидации»), §5.5 (RunResult), критерий 1 (§12).
Поля пакета:
| Поле | Обязательное | Что значит |
|---|---|---|
done | да | Что сделано. Минимум одна строка. |
not_done | да | Что не сделано и почему. Может быть пустым, если рисков нет. |
changed | да | Что и как изменилось: артефакты, версии, зоны. |
risks | да | Известные риски. Может быть пустым. |
checks | да | Результаты DoD-проверок: имя, результат, значение. |
artifact_refs | да | Ссылки на версии артефактов, которых касается задача. |
suggested_followups | нет | Предложения по следующим задачам. |
screenshots | нет | Визуальные приложения. |
notes | нет | Свободные заметки. |
Принципиальный момент: валидация машинная, не человеческая. Человек не должен ловить «пустой done» — это работа схемы. Иначе на 5 handoff'ах ручная проверка съедает смысл автоматизации.
Что нужно от техлида.
changed и artifact_refs: это влияет на то, сможет ли impact-граф работать.relay report --check), чтобы агент не тратил цикл на отказ.Короткий ответ. Платформа, автоматически. Ссылка должна указывать на критерий, существующий в acceptance задачи или в consumer_contract артефакта. Ссылка на несуществующий критерий → reject отклоняется валидатором.
Обоснование. §9.2 п.3 («вердикт reject без ссылок на нарушенные критерии не принимается системой»), критерий 5 (§12).
Это двусторонняя защита:
Что нужно от техлида.
non_goals и на ADR (предлагаю — да, это первые кандидаты на «критерий», который не в acceptance);Короткий ответ. Да, такой тест-кейс есть, и я предлагаю внести его в критерии приёмки MVP — сейчас в §12 его нет, и это пробел. Redacting проверяется по конкретным паттернам, а не «на глаз».
Обоснование. §6.2 (sandbox исполнения: изолированный контейнер без сети и секретов, кроме allowlist), §14 R-8, §5.8 (промпт-инъекция из веба, особенно от Grok).
Предлагаемые тест-кейсы (их стоит добавить в §12 отдельным пунктом):
| # | Кейс | Ожидание |
|---|---|---|
| S-1 | Агент пишет в код строку вида sk-ant-… | Значение вычищено из логов, stdout, events; в коде остаётся плейсхолдер или ошибка линтера |
| S-2 | Агент печатает env | В лог попадают только allowlist-заглушки, реальные значения — нет |
| S-3 | Агент пытается обратиться к сети | Соединение отклонено на уровне сети контейнера, а не на уровне промпта |
| S-4 | В лог агента попадает внешняя веб-страница с инструкцией «выполни команду X» | Страница идёт в канал «данные», не в инструкции; команда не выполняется |
| S-5 | Агент читает файл вне своей зоны | Отказ на уровне sandbox, попытка зафиксирована в events |
S-4 — не формальность: §5.8 называет промпт-инъекцию из веба специфичным риском агрегации, а Grok — единственный, кто ходит в веб по умолчанию.
Что нужно от техлида.
events секреты маскируются или вырезаются полностью? Предлагаю вырезать — events читаются чаще, чем логи.Короткий ответ. Владеет пользователь (или его провайдер секретов). Платформа — брокер доступа и аудит, но не хранилище долгоживущих ключей. Брокер — свой, минимальный, поверх MCP, с полным журналом обращений.
Обоснование. §15 п.9 (ключи платформы в secret-хранилище, доступ по проекту и лимиту; в репозитории — только идентификаторы), §14 R-8, §6.1.
Модель владения:
events: кто, какая зона, какая цель, какой объём, какой результат.Про «свой или сторонний» для брокера: сторонний MCP-broker не решает нашу задачу, потому что наша политика доступа — продуктовая (зоны, лимиты, проекты), а не техническая. Свой минимальный брокер поверх MCP — это несколько сотен строк и полный контроль аудита.
Что нужно от техлида.
Короткий ответ. Ведёт техлид. Пересмотр — ежемесячно и немедленно после каждого инцидента. Allowlist — часть контракта проекта, версионируется вместе с ним.
Обоснование. §14 R-8 (sandbox без сети по умолчанию, allowlist инструментов, секреты только через MCP-broker с аудитом, redacting логов), §6.2.
Принцип, который предлагаю зафиксировать: allowlist по умолчанию пустой. Расширение — только с обоснованием в ADR: какой инструмент, зачем, какой риск, какой срок. Инструмент, добавленный «на пять минут», имеет срок.
Практическая деталь: npm install, git push, curl и запуск тестов — это не один allowlist, а разные уровни. Управление сетевыми вызовами должно быть отдельным правилом, а не одной строкой в списке инструментов.
Что нужно от техлида.
git (read/write в пределах ветки прогона), npm ci, tsc, тест-раннер, relay CLI, MCP-инструменты RELAY.Короткий ответ. Метрики определены в §13 (колонка «baseline»); проект — sales.travel, объём — один фича-спринт; замеряет владелец продукта; формат — baseline.yaml в репозитории проекта, версионируется.
Обоснование. §11.1 («Baseline-замер: сколько конфликтов, сколько переделок, сколько часов на согласование»), §13 («Baseline обязателен до старта Фазы 1 — иначе эффект платформы невозможно доказать»), §15 п.3.
Минимальный набор — 5 чисел:
| # | Метрика | Как получить | Зачем |
|---|---|---|---|
| B-1 | Конфликты за спринт | Ретроспектива по чатам и тикетам | Базовый счётчик конфликтов (§13) |
| B-2 | Rework Rate | Доля задач, возвращавшихся в работу | Основной эффект платформы (§5.7) |
| B-3 | First-Pass Acceptance | Доля handoff'ов без reject | Главная метрика качества (§13) |
| B-4 | Lead time goal → done | Из планировщика | Guardrail против R-4 (§14) |
| B-5 | Прямой LLM-расход на задачу | Биллинги провайдеров | База для экономики §5.11 |
Метод. 2 недели ретроспективы по последнему спринту + подъём логов согласований. Не «ощущение», а цифры: иначе baseline станет тем, чем был до этого — «примерно 30–40% задач переделываем».
Формат. baseline.yaml в репозитории проекта: метрика, значение, период, источник, кто замерял. Версионируется — это позволит потом показать дельту «до/после» без споров о памяти.
Что нужно от техлида.
baseline.yaml — автоматизация сейчас не окупается.contract.yaml.Короткий ответ. Это цель Фазы 3, а не факт и не обещание MVP. Фактом по плану является ≥ 60% в MVP.
Обоснование. §13 — в таблице прямо стоит: «Конфликты, закрытые без человека: — | ≥ 60% | ≥ 85%», то есть «—» в MVP означает «ещё не измерено», а 85% стоит в колонке «Целевое (Фаза 3)».
Откуда взялась цифра — проектное допущение, и его надо назвать: из шести типов конфликтов четыре (D-1, D-2, D-4, D-5) закрываются автоматически, D-3 — частично, семантические — через Judge с порогом 0,7. Проверяемо это становится только на Фазе 1 (критерии 6 и 7: детекторы срабатывают, авто-разрешения попадают в журнал).
Что нужно от техлида.
Короткий ответ. Порог — 80% задач спринта взяты через RELAY к концу Фазы 1; в Фазе 2 — 95%. При недостижении — разбор, а не наказание.
Обоснование. §14 R-1 («Pull-модель: агент берёт задачи только из RELAY; интеграция в MCP/промпт по умолчанию; метрика "% задач из RELAY"»), критерий 1 (§12).
Формула: (задачи, взятые через relay pull) / (все задачи спринта).
Метрика работает только в связке с First-Pass Acceptance. Если 80% задач идут через RELAY, а FPA падает — значит, платформа вредит, и это видно на второй метрике. По одной этой цифре судить нельзя: можно гнать 100% задач через платформу и при этом делать их хуже.
Что нужно от техлида.
Короткий ответ. Ритуал принадлежит техлиду. Бюджет — 1,5 часа в месяц. Встраивается в календарь как ревью спринта, а не «когда получится».
Обоснование. §5.9 (метрика качества политики: доля задач, где режим был повышен после reject, и доля fan-out'ов с консенсусом с первого раза; цель — оба < 15%), §5.10 (правило тюнинга: каждое ложное авто-решение → разбор → обновление промпта или порога, запись в ADR), §14 R-6 (регулярный тюнинг по логу).
Формат ритуала (предлагаю зафиксировать как процедуру):
Что нужно от техлида.
Короткий ответ. Технически — ничего, и это надо признать прямо. Работает не запрет, а отсутствие выгоды плюс организационное соглашение.
Обоснование. §14 R-1, §6.3 (pull-модель), критерий 1 (§12).
Логика: агент может получить ту же задачу из чата и просто не сообщить об этом — RELAY не может это запретить, не контролируя агента. Значит, защита строится на том, чтобы работа мимо платформы была дороже:
relay pull — единственный способ узнать acceptance, зону, бюджет и срок. В чате этого нет.done, а значит, не попадает в метрики и не получает следующую работу.Это уважительно к реальности: агент — не подконтрольный процесс, а инструмент в руках человека. Соглашение «задачи берутся из RELAY» — часть §4.1 (роли и зоны), а не отдельный документ.
Что нужно от техлида.
relay CLI подсказку «задача N уже в работе» при попытке взять дубликат из чата — то есть телеметрия из мира вне RELAY. Предлагаю: не делать, но собрать ручную оценку на Фазе 0.Короткий ответ. SLA на гейты — 2 рабочих часа для блокирующих и 8 рабочих часов для обычных. Очередь решений — отдельный экран (Human Gate Service, Фаза 2). При переполнении — авто-понижение приоритета, но не блокировка.
Обоснование. §14 R-3 («Авто-разрешение по правилам; человек видит только 2–3 варианта; SLA на гейты»), §11.3 (Human Gate Service), критерий 2 (§12).
Главный приём против R-3: человек видит не задачу, а 2–3 готовых варианта с обоснованием — и от него требуется один выбор, а не разбор контекста. Именно это, а не «больше людей», снижает MTTR (§13). Сюда же относится правило Judge: на эскалацию приходит не вопрос «кто прав», а готовые варианты (§5.10).
При переполнении очереди предлагаю не блокировку, а понижение: обычные гейты уходят в конец очереди, блокирующие остаются. Если очередь растёт — это сигнал, что авто-разрешения недостаточно, и это предмет тюнинга §5.9/§5.10, а не предмет «давайте подождём».
Что нужно от техлида.
Короткий ответ. Да — набор «золотых» прогонов на каждый адаптер. Пишет владелец адаптера (тот, кто его реализовал). Гоняются автоматически при каждом обновлении образа или версии CLI провайдера.
Обоснование. §14 R-5 («Адаптерный слой + контрактные тесты адаптеров; поддержка ≥ 3 агентов на старте»), §11.2 п.1.8, §12.
Состав минимального набора:
RunResult по схеме — это главная защита от дрейфа: если провайдер обновил CLI и поле переехало, ловится сразу.Частота: при каждой сборке образа с изменённым адаптером; полный прогон — раз в неделю, в том числе на «ничего не менялось» — именно он ловит тихий дрейф внешнего провайдера.
Что нужно от техлида.
Короткий ответ. Принимается. Проект — sales.travel. Команда: техлид 0,3 FTE + fullstack/backend 1,0 FTE + владелец продукта (вы) на один разбор в день.
Обоснование. §11.1 (Фаза 0 — процесс без кода, 1–2 недели), §15 п.8 (горизонт: 2-недельный срез → показ → полный MVP).
Состав среза — ровно четыре предмета из §11.1:
| Предмет | Что сдаём | Критерий готовности |
|---|---|---|
contract.yaml | Для 2–3 текущих проектов | Есть зоны, DoD, acceptance, non_goals |
| ADR | Шаблон + первые 10 решений | Решения реально принимаются и используются |
| Handoff | Регламент и шаблон пакета | Пакет проходит валидацию схемой |
| Доска | Список в любом трекере | Видны состояния и владельцы зон |
| Baseline | 5 метрик (§27) | baseline.yaml в репозитории |
Что нужно от техлида.
platform/, отдельной директорией.Короткий ответ. Владелец продукта — вы. Лично вы закрываете гейты из RACI, где у человека стоит A: изменение целей и non_goals, релиз, семантика и контент-план, требования и приоритеты, а также бюджет и решения об эскалации.
Обоснование. §4.3 (колонка «Человек»), §15 п.2, §6.2 («оркестратор оптимизирует поток, но не имеет права менять цели; гейты — единственный путь изменения контракта»).
Разделение получается такое:
| Гейт | Кто закрывает |
|---|---|
| Изменение целей, non_goals, приоритетов | Вы |
| Релиз | Вы |
| Семантика и контент-план | Вы |
| Бюджет, лимиты, авто-продления | Вы |
| Эскалация при равных весах ролей (D-3) | Вы |
| Архитектура, ADR, риски, изменения правил | Техлид |
| Конфликты зон, слияние, приоритет версий | Техлид |
Следствие, которое надо назвать прямо: если вы доступны 4 часа в день, максимум гейтов в день ограничен, и это напрямую влияет на SLA (§18) и на R-3 (§32). Владелец продукта — это не только роль, это календарь доступности, и его надо зафиксировать до начала Фазы 1, а не выяснять в первый же конфликт.
Что нужно от техлида.
events. Предлагаю — все три, но автоматически: events пишет факт, ADR — содержание.Короткий ответ. Принимается. Артефакты живут в git-репозитории проекта: дизайн-токены — JSON, спеки — Markdown, схемы — JSON Schema. RELAY — индекс и реестр версий, но не хранилище содержимого.
Обоснование. §15 п.7, §6.1 (Artifact Registry), §9.3 (версионирование), §5.11 (contract-first: типы генерируются из схемы, а не из скриншота).
Разделение обязанностей:
| Git-репозиторий проекта | RELAY (индекс) |
|---|---|
| Содержимое артефактов | Ссылка на версию и её хэш |
| Diff, история, revert, code review | Impact-граф: кто потребляет версию |
| Pull request на изменение токенов | Связь с задачами и handoff-пакетами |
| Merge в основную ветку | DoD-гейт: проверка соответствия контракту |
Почему именно так: git даёт всё, что нужно для аудита и отката, и работает с существующими инструментами команды без нового хранилища. RELAY даёт то, чего git не умеет: impact-граф, DoD-гейт и связь артефакт → задача → handoff.
Синхронизация (мой ответ на «кто настраивает»): CI-джоб в репозитории проекта после merge в основную ветку вызывает API RELAY → RELAY перечитывает артефакты, пересчитывает impact-граф, помечает затронутые задачи и устаревшие handoff-пакеты. Частота — по событию push, а не по расписанию.
Что нужно от техлида.
Семь пунктов требуют ответа техлида до старта Фазы 1. Остальные решения уже зафиксированы в техническом проекте и не требуют повторного обсуждения.
| # | Вопрос | Почему важно | Срок |
|---|---|---|---|
| 1 | Кто дежурит при падении платформы в рабочий день | Агент не может взять задачу — работа команды встаёт | До старта Фазы 1 |
| 2 | Реальный календарь доступности владельца продукта | Определяет SLA приёмки и допустимую нагрузку на гейты | До старта Фазы 1 |
| 3 | Правило breaking: список признаков и кто утверждает | Определяет автоматический бамп версий | До старта Фазы 1 |
| 4 | Авто-понижение режима при переполнении очереди гейтов или нет | Конфликт с §5.9, должен быть явным решением | До старта Фазы 1 |
| 5 | Инфраструктура: self-managed или managed Postgres | Влияет на стоимость и на §11.5 | До Фазы 1 |
| 6 | Baseline: готов ли техлид размечать пары для D-5 | Без разметки порог не откалибровать | В течение Фазы 0 |
| 7 | Secret-хранилище: какой используем | Определяет модель владения секретами (§25) | До начала работы с ключами |
Ответы не меняют архитектуру RELAY. Они уточняют места, где документ был неопределён:
ready с флагом переоценки при наличии частичного результата.Полный построчный трек ответов — в разделе 0.1 «Сводка» и в 04-ответы-на-вопросы-ревью.md.
Конец документа. Согласование: владелец продукта + техлид. Следующий шаг — ответы по §11 и старт Фазы 0.