profiles: tool_developer folds into developer
The profile was a duplicate on every axis we could measure. 22 of its 26
native tools were already developer's; the four it alone held —
reload_tools, create_mcp_server, test_mcp_tool, mcp_status — are 2.9 KB of
schema. Its model chain was the same seven models. Of its 14 KB prompt,
about 8 KB was copied verbatim from developer's (the whole `## Orchestration
model` block and everything from `## Editing policy` down), and most of the
remainder restated manuals/create_mcp_server.md, which already carried the
same ten-step workflow in more detail. It was not a specialisation, it was a
snapshot: `git log -S '"reload_tools"'` shows the tool lived in developer
until 61fa370 rewrote that profile around MCP and cut it off.

What kept it alive was a premise that no longer holds — that Navi's own
capabilities would be written as in-repo tools. They are MCP servers now,
and an MCP server is not a file in this repository with a life of its own:
it is an isolated process registered from mcp_servers.d/. So there is no
reason left for a profile whose only distinct feature is a toolset a general
developer profile can hold, and every reason to stop maintaining a second
prompt that drifts against the first.

- developer: + reload_tools, create_mcp_server, test_mcp_tool, mcp_status
  (24 → 28 native). Its sub-agent gains tool_manual, which is what it
  actually needed to reach the manual while writing a server — the previous
  tool_developer sub-agent had it, developer's did not.
- server_admin: + reload_tools only (24 → 25). Adding a third-party MCP
  server is something this profile does as often as developer does.
  Deliberately not to its sub-agent: reconnecting the MCP manager is a
  process-wide operation belonging to the main agent.
- The prompt and the manual took on what the deleted profile knew and
  create_mcp_server.md did not: reload_tools before the first test_mcp_tool
  (a freshly registered server is not connected, so the test fails and the
  iteration is wasted), the smoke test read by exit code — 124 means timeout
  killed a server still running, 0 means it exited on its own, usually a
  main() without parentheses — absolute command/cwd, mcp_status as discovery
  only, and the steps that stay inline instead of going to a sub-agent.

mcp_status and test_mcp_tool were built without an MCP manager, and their
fallback did `from navi.api.deps import _mcp_manager` — a name that does not
exist, so a live call raised ImportError rather than the intended "MCP
manager not available". The tools always passed a manager in tests, which is
why nothing caught it. Both now receive the manager at construction and fall
back to the live one lazily.

Sessions and profile_overrides are reassigned before the restart: agent.py
resolves the session's profile without a guard, so a deleted profile turns
every session that referenced it into an uncaught ProfileNotFound. Nothing
in the test suite pins the profile inventory, and profiles are read once at
import time — reload_tools does not re-read them — so this ships as a
restart, and the restart is also what makes it take effect.
1 parent 9612581 commit 947a7175bc8bed3ff5e0c732457a1c887767e1a7
@Eugene Sukhodolskiy Eugene Sukhodolskiy authored 2 hours ago
Showing 27 changed files
View
README.md
View
docs/profiles.md
View
docs/tools.md
View
manuals/create_mcp_server.md
View
manuals/spawn_agent.md
View
navi/core/agent.py
View
navi/core/registry.py
View
navi/profiles/developer/config.json
View
navi/profiles/developer/subagent_system_prompt.txt
View
navi/profiles/developer/system_prompt.txt
View
navi/profiles/navi_code/system_prompt.txt
View
navi/profiles/server_admin/config.json
View
navi/profiles/tool_developer/config.json 100644 → 0
View
navi/profiles/tool_developer/subagent_system_prompt.txt 100644 → 0
View
navi/profiles/tool_developer/system_prompt.txt 100644 → 0
View
navi/tools/mcp_status.py
View
navi/tools/spawn_agent.py
View
navi/tools/test_mcp_tool.py
View
tests/unit/tools/test_switch_profile.py
View
webclient/CLAUDE.md
View
webclient/dist/assets/index-BvJF4tGW.js 0 → 100644
Not supported
View
webclient/dist/assets/index-C-QKQYrg.css 100644 → 0
View
webclient/dist/assets/index-DFVBxFCm.css 0 → 100644
View
webclient/dist/assets/index-Df_9A-RF.js 100644 → 0
Not supported
View
webclient/dist/index.html
View
webclient/dist/sw.js
View
webclient/src/components/ui/WelcomeScreen.vue