0.167.0
Added
Семантика «0 = без лимита» для ограничений агентского цикла. Раньше верхние предохранители хода агента имели жёсткий потолок (
Min: 1), и пользователь не мог полностью отключить их для долгих автономных задач. Теперь значение0для трёх настроек означает «без лимита»:agent_max_iterations(internal/settings/defs.go,internal/agent/runner.go).0= цикл ReAct выполняется до терминального stop, ctx-cancel или нижестоящих предохранителей (stream_idle_timeout_seconds,tool_timeout_seconds,agent_turn_timeout_minutes).agent_turn_timeout_minutes(internal/agent/actor.go).0= контекст хода без deadline (context.WithCancelвместоWithTimeout); ход длится до финального ответа,/stopили отмены сессии.persistTurnTimeoutвызывается только приturnTimeout > 0.subagent_max_iterations(глобальная,internal/agent/subagent_config.go,subagent.go,spawn_tool.go).0= субагент ограничен толькоsubagent_timeout_seconds.
Остающиеся предохранители при всех 0: stream_idle_timeout_seconds (молчание LLM), tool_timeout_seconds (один инструмент), /stop, agent_idle_timeout_minutes (между ходами), квоты LLM-провайдера.
Безопасность: безлимит через self-tool (my set max_iterations=0) запрещён — LLM не может снять свой потолок mid-run (runaway-risk); безлимит задаётся только администратором. Self-tool отображает iterations_remaining: ∞ (unlimited) в безлимитном режиме.
Clamp-защита: subagentMaxIterationsCap = 50 (константа) применяется к spawn-tool params и profile overrides; безлимитное 0 не клемпится. LoadSubagentsConfig ограничивает итоговое cfg.MaxIterations к cap через defer на именованном return (покрывает все ранние return). Отрицательные значения трактуются как sign-error и сбрасываются в cfg (0 зарезервирован за осознанным безлимитом). Clamp субагента поднят с жёстко зашитого 30 до 50 (синхронизирован с Max реестра).
Per-agent JSON subagents.max_iterations=0 по-прежнему означает «наследовать глобальную настройку» (НЕ безлимит) — без изменений, без рефакторинга *int.
Тесты: TestRunner_MaxIterations_Unlimited, TestLoadTurnTimeout_Zero, TestLoadSubagentsConfig_GlobalAboveCapClamped, TestLoadSubagentsConfig_PerAgentJSONAboveCapClamped, TestClampSubagentMaxIter (7 кейсов), TestSelfTool_SetMaxIterations_Zero_Rejected, TestSelfTool_CheckMaxIterations_Unlimited, TestSelfTool_CheckIterationsRemaining_Unlimited, TestSelfTool_CheckAll_Unlimited, TestSetMaxIterations_Zero_Valid, TestFormatMaxIterations, TestFormatIterationsRemaining.