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>
75 lines
6.2 KiB
Markdown
75 lines
6.2 KiB
Markdown
# Блок 3. Агенты: 6 ролей конвейера
|
||
|
||
> Промпты ролей лежат в `.openclaw/agents/*.md` (по одному файлу на роль). Канон манифеста
|
||
> «документ → агент → стадия → гейт → machine-key» — [PIPELINE_DOCS §2](../_standards/PIPELINE_DOCS.md);
|
||
> машинный контракт передачи между стадиями — [HANDOFF_PROTOCOL](../_standards/HANDOFF_PROTOCOL.md).
|
||
|
||
## Паспорта ролей
|
||
|
||
| Роль | Стадия | Вход | Выходные артефакты | 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** артефакта (никогда из
|
||
прозы) и неизменны байт-в-байт — подробнее в [блоке качества](tech-quality-security.md).
|
||
|
||
## Модель и эффорт
|
||
|
||
Модель и эффорт каждой роли резолвятся **только из конфига** (не из промпта); текущие
|
||
дефолты конфига:
|
||
|
||
| Роль | Модель | Эффорт |
|
||
|------|--------|--------|
|
||
| `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`. Подробнее —
|
||
[конвейер](tech-pipeline.md) и [карта LLM-консультаций](../architecture/llm-call-sites.md).
|
||
|
||
Особенность (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:`. Подробнее — [конвейер](tech-pipeline.md) и
|
||
[карта LLM-консультаций](../architecture/llm-call-sites.md).
|
||
|
||
## Человек как седьмая роль
|
||
|
||
Человек не пишет артефакты конвейера, но принимает два решения, которые не делегированы
|
||
агентам: одобрение постановки (после `analyst`) и подтверждение прод-выкладки (перед финалом
|
||
работы `deployer`). Подробнее — [человеческие гейты](tech-pipeline.md).
|
||
|
||
---
|
||
|
||
*Структуры документов, которые сдаёт каждая роль, — [PIPELINE_DOCS](../_standards/PIPELINE_DOCS.md);
|
||
скелеты — `docs/_templates/`.*
|