Operator journey
Butler's project-scoped Assistant settings already save provider reasoning effort. During a scheduled or event-driven recovery, Butler should send the saved effort with every provider request, including each continuation after tool results.
Root cause and change
ButlerRecoveryAgent.run reads chat_assistant_config but omitted reasoning_effort when it constructed provider ModelRequest objects. Provider adapters already translate the field when present. Pass the saved value into each request. A multi-round recovery regression asserts that every provider request carries xhigh.
Validation
- Focused selection receipt:
.github/test-selection.json, one Python test, digest bound to the diff againstorigin/main. poetry run pytest -q tests/v3/test_butler_recovery.py::test_act_switches_worker_to_provider_and_queues_only_the_parent: 1 passed locally on Python 3.11.poetry run ruff check src/nebula/v3/butler_recovery.py tests/v3/test_butler_recovery.py: passed.poetry run ruff format --check src/nebula/v3/butler_recovery.py tests/v3/test_butler_recovery.py: passed.python3 scripts/test_selection.py --baseline origin/main --candidate HEAD: valid.- Disposable LAN Core at
http://192.168.1.155:18743from this worktree, bearer authentication enabled, isolated synthetic data: created a synthetic project, local provider profile, and Butler session; after seeding a synthetic verified-tool fixture, authenticated Assistant-config PATCH/read-back returnedxhighat revision 2 and the active Butler session matched. Core health was OK. Stopped the test process and removed its temporary data.
Deployment and limitations
The live simulation Core is at d7b74221109139917890901b81fa4dc569ef9594, the PR base. Its Butler session is configured for DeepSeek V4.1 Flash 1017 at xhigh, but this source fix has not been deployed, so scheduled recovery requests on that Core still omit effort. The disposable LAN smoke proved the saved-settings path, while the focused regression proved recovery-request construction; it did not send a synthetic provider recovery request through HTTP. The live deployment gate currently reports one active Work agent. Keep this PR unmerged until live pause coordination and promotion can be verified. No live provider turn was sent as part of this PR.