Что это за задача
Список копируемых путей в составном образе заменяется контрактом слоя: выделенная стадия собирает /opt/agent-layer/ в dev-agent, Dockerfile.agent сводится к одному COPY, HCL ссылается на стабильный тег. Правило распространяется на спека-агента и ревьюера.
Зависит от: -
Задача из листа «Задачи» проекта (DP-6-RS-6.1, ДОЛГ, приоритет P0). Срез DP-6-RS-6.1: статус — готово.
Тесткейсы
Кейсы, привязанные к этой задаче в листе «Тесткейсы» (колонка «Единица бэклога»):
| TC-ID | Дано | Когда | Тогда |
|---|---|---|---|
TC-DP-6-RS-6.1.1-a | образ роли nikell28/dev-agent собран из Dockerfile с выделенной стадией сборки слоя | в запущенном образе перечисляется содержимое /opt/agent-layer/ и целевых путей корня | в /opt/agent-layer/ присутствуют usr/local/lib/dev-agent/, usr/local/bin/agent-entrypoint.sh, usr/local/bin/goose, root/.config/goose/config.yaml, workspace/.goosehints; те же файлы присутствуют в корне образа по путям /usr/local/lib/dev-agent/, /usr/local/bin/agent-entrypoint.sh, /usr/local/bin/goose, /root/.config/goose/config.yaml, /workspace/.goosehints |
TC-DP-6-RS-6.1.1-b | образ роли dev-agent собран из Dockerfile с выделенной стадией сборки слоя | в образе выполняется /usr/local/bin/goose --version по абсолютному пути | команда завершается кодом возврата 0 и печатает версию. Разрешение имени goose по PATH — свойство составного образа, покрыто TC-DP-6-RS-6.1.3-a (отсутствие ENV PATH), -b (бинарь в /usr/local/bin) и -c (запуск Goose достигнут) |
TC-DP-6-RS-6.1.1-c | в исходники репозитория dev-agent добавлен новый файл в lib/; Dockerfile не правился | образ роли пересобирается | файл присутствует и в /opt/agent-layer/usr/local/lib/dev-agent/, и в /usr/local/lib/dev-agent/ корня образа; перечень путей раскладки встречается в Dockerfile один раз |
TC-DP-6-RS-6.1.1-d | репозиторий dev-agent на HEAD задачи | читается docs/agent-layer-contract.md | документ перечисляет состав слоя (пять путей) с целевой раскладкой и называет требование бинарной совместимости базы потребителя с базой образа роли |
TC-DP-6-RS-6.1.2-a | рабочее дерево dev-agent на коммите C, registry доступен; прогон помечен явным признаком публикации (маркер pytest либо отдельная цель); наличия REGISTRY_ADDR для запуска недостаточно | выполняется цель Makefile push-dev-agent | в registry разрешаются обе координаты — dev-agent:v0.1.0 и dev-agent:<SHA коммита C>; обе дают один digest |
TC-DP-6-RS-6.1.2-b | тот же прогон цели пуша завершён; прогон помечен явным признаком публикации (маркер pytest либо отдельная цель); наличия REGISTRY_ADDR для запуска недостаточно | тег коммита опубликованного образа сравнивается с git rev-parse HEAD репозитория dev-agent | значения совпадают |
TC-DP-6-RS-6.1.3-a | docker/Dockerfile.agent в nikell28/mr_meeseeks на HEAD задачи | файл читается | содержит ровно один COPY --from=agent с источником /opt/agent-layer/ и целью /; директивы ENV PATH нет; build-arg'и DEV_ENV_IMAGE, AGENT_IMAGE и ENTRYPOINT на месте |
TC-DP-6-RS-6.1.3-b | составной образ dev-agent-repo собран поверх образа роли со слоем | перечисляется содержимое собранного образа | присутствуют /usr/local/lib/dev-agent/task_result.py и /usr/local/bin/goose |
TC-DP-6-RS-6.1.3-d | тот же составной образ (регрессия решений 2026-07-31 о сборке идентичности и explicit-списке расширений) | читаются /workspace/.goosehints и /root/.config/goose/config.yaml | .goosehints завершается CORE-разделом; config.yaml — поимённый список расширений, extensionmanager выключен |
TC-DP-6-RS-6.1.4-a | рабочее дерево mr_meeseeks на коммите C, образ роли опубликован | выполняется цель Makefile push-agent-repo | в registry разрешаются dev-agent-repo:<стабильный тег> и dev-agent-repo:<SHA коммита C>; обе координаты дают один digest |
TC-DP-6-RS-6.1.4-b | nomad/dev-agent.nomad.hcl на HEAD задачи | файл читается | config.image указывает стабильный тег составного образа; подстроки dev-agent-repo:latest в файле нет. Координаты образов, собираемых вне скоупа задачи (repo-fetch, temporal-signal-cli), кейсом не покрываются — решение 2026-08-05, задача DP-9-RS-6.1 |
TC-DP-6-RS-6.1.4-c | составной образ опубликован под стабильным тегом, джоба отрендерена | выполняется nomad job run на отрендеренной джобе | джоба регистрируется, ошибки разрешения образа нет |
TC-DP-6-RS-6.1.4-D1 | рабочее дерево mr_meeseeks, в котором git rev-parse HEAD не отдаёт SHA (каталог .git отсутствует либо git недоступен); REGISTRY задан | выполняется цель Makefile push-agent-repo либо push-all | цель завершается ненулевым кодом на разборе Makefile, до выполнения рецепта; ни одна команда docker не вызывается; сообщение называет неопределённый тег коммита. Цели build-agent-repo, build-dev-env и rmi-agent-repo в том же дереве отрабатывают. Цель push-signal-cli из перечня негейтованных исключена: задачей DP-9-RS-6.1 она заводится под тот же гейт, её поведение на этом входе проверяет TC-DP-9-RS-6.1.1-d. |
TC-DP-6-RS-6.1.6-a | составной образ, собранный по контракту слоя, опубликован под стабильным тегом; джоба dev-agent зарегистрирована | диспатчится шаг дев-пайплайна | main-таск агента стартует, preflight не отдаёт код возврата 2, аллокация доходит до записи результата |
TC-DP-6-RS-6.1.6-b | тот же прогон; агент записал task_result.json со status = success и заполненными commit_sha, commit_message, mr_title, mr_description | воркер принимает сигнал agent_done | result.json содержит exit_code, status, output, commit_sha, commit_message, mr_title, mr_description |
TC-DP-6-RS-6.1.6-c | в lib/ репозитория dev-agent добавлен файл, образ роли переиздан под тем же стабильным тегом; в mr_meeseeks правок нет | составной образ пересобирается и диспатчится | файл присутствует в /usr/local/lib/dev-agent/ диспатченного образа |