---
pr: 69
title: feat(agents): increase step limit to 150
---

## Что сделано
Повышен лимит шагов subagent-ов со 100 до 150 для всех 4 настроенных агентов (reviewer, docs-reviewer, memory-syncer, general). Обновлены 4 конфига + 2 тест-файла (5 правок в test_agent_frontmatter.py + 1 в test_permissions.py). Создан ADR-029 (docs/decisions/029-pr-69-agent-steps-150.md).

Конкретно:
- .opencode/agents/reviewer.md:5, docs-reviewer.md:5, memory-syncer.md:5 — frontmatter `steps: 100` → `steps: 150`
- .opencode/opencode.json:319 — `agent.general.steps: 100` → `150`
- tests/test_agent_frontmatter.py — module docstring, section comment, rename `test_steps_100_present` → `test_steps_150_present`, docstring, assertion `fm["steps"] == "150"` (string)
- tests/test_permissions.py:119 — assertion `general.steps == 150` (int, JSON)
- docs/project-map/README.md — теги PR#68 на 5 строках (3 agent .md, opencode.json, 2 test-файла)

## Почему
PR#67 reviewer упёрся в `MAXIMUM STEPS REACHED` (hard stop с бинарника 2026-07-24, реализует `failUnsettledTools` при `iteration_count >= agent.steps` → tools disabled), не успел вызвать `post-review` — оркестратор делал 1 retry вручную. 100 оказалось тесно для reviewer на PR с 6+ файлами diff.

Memory `technical/opencode-log-subagent-stumbles-analysis.md` (2026-07-20) утверждала «`steps:` НЕ хард-лимит — hint, не enforcement» — устарело: бинарник 2026-07-24 уже hard stop. Подтверждено на PR#67. ADR-029 фиксирует обновление и trade-off (+50% budget → +50% doom-loop risk, но guard сохранён).

## Pending
- memory update `opencode-log-subagent-stumbles-analysis.md` (soft hint → hard stop) — на фазе MEMORY через memory-syncer subagent
- Рефакторинг (вынос explore-фазы reviewer'а в отдельный `explore` subagent с ∞ steps) — отложено в отдельный PR если 150 снова станет тесно

## Watch out
- global copy `/root/.config/opencode/agents/*.md` — bind-mount, лимит 150 вступит в силу после `git pull` + container restart. В текущем контейнере лимит остаётся 100 до рестарта.
- scaffold-handoff.sh нумерация ADR по `ls docs/decisions | wc -l + 1` — если ADR создан вручную ДО scaffold, scaffold найдёт существующий файл по `*-pr-<N>-<slug>.md` паттерну и не создаст дубликат (как в этом PR). Если создать вручную с placeholder в имени (029-pr-PR-NUMBER-...), нужно переименовать ДО запуска scaffold, иначе scaffold не найдёт и создаст дубликат 030.
- `test_permissions.py:119` проверяет int `150` (JSON, json parser → int), `test_agent_frontmatter.py:154` — строку `"150"` (frontmatter parser возвращает строки, не int). Не путать типы.
- package-lock.json untracked в репо — не относится к этому PR, не коммитить.
