--- 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--.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, не коммитить.