Second realised slice of the determinization-roadmap (ORCH-118 A5, needs-hybrid-fallback): on the `testing` stage for the self-hosting `orchestrator` repo the LLM `tester` agent is replaced by a deterministic test-runner (src/test_runner.py), intercepted in launch_job BEFORE _spawn (deploy-finalizer / post-deploy-monitor / staging-runner precedent). It runs the regression `python -m pytest <target>` in the task worktree via proc_group (tree-kill) + an optional read-only smoke (/health, /status, /queue + serial_gate), maps the exit-code -> result: PASS|FAIL via the existing self_deploy.map_exit_code_to_status contract, writes 13-test-report.md and initiates the EXISTING check_tests_passed gate exactly as a finished LLM-tester. Invariant (NFR-1): only the *producer* changes — the artifact contract (13-test-report.md / result:), the gate check_tests_passed / _parse_tests_verdict, STAGE_TRANSITIONS and the DB schema are byte-for-byte UNCHANGED. Additive, under a kill-switch (test_runner_enabled), never-raise, fail-closed, self-hosting scope, two-level outcome (tool-error DEFER, anti ORCH-110), hybrid (LLM strictly off-control-path). 52c-`status:` is aligned with the verdict (D6.1) so the three-field _parse_tests_verdict never false-negatives a PASS. Docs (ORCH-118 NFR-6, atomic with code): llm-call-sites.md (A5 implemented), llm-determinization-roadmap.md (rank 2 implemented), llm-usage-policy.md, README/internals/overview, tester.md, CLAUDE.md, CHANGELOG.md. Coverage: tests/test_orch116_test_runner.py (TC-01..TC-14); LLM anti-drift tests green. Full suite: 2137 passed. Refs: ORCH-116 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
6.2 KiB
Блок 3. Агенты: 6 ролей конвейера
Промпты ролей лежат в
.openclaw/agents/*.md(по одному файлу на роль). Канон манифеста «документ → агент → стадия → гейт → machine-key» — PIPELINE_DOCS §2; машинный контракт передачи между стадиями — HANDOFF_PROTOCOL.
Паспорта ролей
| Роль | Стадия | Вход | Выходные артефакты | Machine-verdict ключ |
|---|---|---|---|---|
analyst |
analysis | бизнес-запрос (00-business-request.md) |
01-brd.md, 02-trz.md, 03-acceptance-criteria.md, 04-test-plan.yaml |
— (гейт проверяет полноту пакета + одобрение человека) |
architect |
architecture | пакет аналитики | 06-adr/ADR-NNN-*.md, when-applicable 07-infra-requirements.md / 08-data-requirements.md, 10-tech-risks.md |
— (гейт проверяет наличие ADR) |
developer |
development | ТЗ + ADR | код в src/, тесты в tests/, обновлённые доки, CHANGELOG.md, PR в Gitea |
— (гейт — зелёный CI ветки) |
reviewer |
review | PR diff + ТЗ/ADR | 12-review.md |
verdict: (APPROVED | REQUEST_CHANGES) |
tester |
testing | ветка задачи + тест-план | 13-test-report.md |
result: (PASS | FAIL | BLOCKED) |
deployer |
deploy-staging / deploy | прошедшая гейты ветка | 15-staging-log.md, 14-deploy-log.md |
staging_status: / deploy_status: (SUCCESS | FAILED) |
Machine-verdict ключи читаются гейтами только из YAML-frontmatter артефакта (никогда из прозы) и неизменны байт-в-байт — подробнее в блоке качества.
Модель и эффорт
Модель и эффорт каждой роли резолвятся только из конфига (не из промпта); текущие дефолты конфига:
| Роль | Модель | Эффорт |
|---|---|---|
analyst |
claude-opus-4-8 |
high |
architect |
claude-opus-4-8 |
high |
developer |
claude-opus-4-8 |
xhigh |
reviewer |
claude-opus-4-8 |
high |
tester |
claude-opus-4-8 |
medium |
deployer |
claude-opus-4-8 |
medium |
Разработчику — максимальный эффорт (он пишет код); тестировщику и деплойеру хватает среднего
(их работа процедурная). Таблица сверяется с class-default'ами src/config.py структурным
тестом — дрейф рвёт CI.
Канон промптов
Все промпты следуют единому канону (Anthropic XML, эпик 52): пять обязательных секций в
нормативном порядке <context> → <task> → <deliverables> → <constraints> →
<output_format>, запреты в формате «❌ X → ✅ Y», секция эскалации у решающих ролей. Каждый
агент эмитит единую frontmatter-схему в своих документах (work item, стадия, автор, статус,
дата, модель). Промпт читается из worktree в момент запуска — обновление промптов вступает в
силу со следующей задачи, без рестарта прода.
Особенность: промпт deployer сознательно на английском (самый safety-critical — несёт
запреты self-hosting в видной рамке); остальные пять — на русском.
Особенность (ORCH-115): на стадии deploy-staging для self-hosting orchestrator LLM-deployer
заменён детерминированным staging-раннером (src/staging_runner.py) — его работа была чисто
механической (запуск staging-сюиты + маппинг exit-кода). LLM-промпт deployer остаётся fallback'ом
под выключенным флагом / для не-self репо и продолжает вести прод-стадию deploy. Подробнее —
конвейер и карта LLM-консультаций.
Особенность (ORCH-116): на стадии testing для self-hosting orchestrator LLM-tester заменён
детерминированным test-раннером (src/test_runner.py) — его PASS/FAIL-ядро деривируемо (exit-код
pytest в worktree + read-only smoke), вердикт result: производит детерминированный код. Это
гибрид (needs-hybrid-fallback): LLM-промпт tester остаётся fallback'ом под выключенным флагом / для
репо без тест-контракта, а будущий off-control-path триаж падений не выносит и не переопределяет
result:. Подробнее — конвейер и
карта LLM-консультаций.
Человек как седьмая роль
Человек не пишет артефакты конвейера, но принимает два решения, которые не делегированы
агентам: одобрение постановки (после analyst) и подтверждение прод-выкладки (перед финалом
работы deployer). Подробнее — человеческие гейты.
Структуры документов, которые сдаёт каждая роль, — PIPELINE_DOCS;
скелеты — docs/_templates/.