diff --git a/README.md b/README.md
index b2e9d79..c5dbe04 100644
--- a/README.md
+++ b/README.md
@@ -123,7 +123,7 @@ Monorepo with Git submodules. Each submodule has its own Go module (except `el`
- **Sandboxed execution** — every tool call and every `shell` command runs inside a Landlock sandbox with per-profile filesystem access rules. Promoted tools are not exempt — they execute through the same sandbox path as inline shell commands.
- **Extensible tools** — tools are executable scripts with header metadata; add one by dropping a file in a directory
-- **Lazy-loading tool registry** — all tools are discoverable; only loaded tools are callable. Write a tool name to `s/{sid}/tools` to promote it to a native callable function — no MCP server, no SDK, no protocol boilerplate
+- **Dynamic tool registry** — tools are discoverable and hot-reloadable; add, modify, or remove tool scripts at any time without restarting the server. Only loaded tools are callable. Write a tool name to `s/{sid}/tools` to promote it to a native callable function — no MCP server, no SDK, no protocol boilerplate
- **Elevation** — commands that need to escape the sandbox can request elevation through a streaming protocol (frame-based, over unix socket)
### Agents
@@ -200,7 +200,7 @@ graph TB
SM[Session Manager]
CORE[Core Library
agent loop · compaction
prompt templates]
ROUTE[Router
complete · generate · route]
- TOOLS[Tool Registry
lazy-load · dispatch]
+ TOOLS[Tool Registry
dynamic · lazy-load · dispatch]
SB[Landlock Sandbox]
end
@@ -390,12 +390,12 @@ The D-Bus interface is what makes native desktop integration possible:
All of these talk to `org.ollie.SessionManager` over D-Bus using Qt's native bindings — no IPC glue code, no subprocess management.
-### Tool registry: lazy-loading native tools
+### Tool registry: dynamic native tools
-Tools are scripts in `~/.config/ollie/tools/`. Write one, add a JSON schema header, and it's **discoverable** immediately. But it's only **callable** when you promote it into your session.
+Tools are scripts in `~/.config/ollie/tools/`. Write one, add a JSON schema header, and it's **discoverable** immediately — no server restart needed. Add, modify, or remove tools at any time; the registry re-reads from disk on every `tool_list` and `tool_load`. A tool is only **callable** when you promote it into your session.
```bash
-# Discover all available tools
+# Discover all available tools (always reflects current directory contents)
cat s/{sid}/tools
# Load one into your session — it becomes a native callable function
diff --git a/doc/EVOLUTION.md b/doc/EVOLUTION.md
index b73b1fc..25792cf 100644
--- a/doc/EVOLUTION.md
+++ b/doc/EVOLUTION.md
@@ -78,7 +78,7 @@ Tools evolved through several incarnations:
2. **Shell/Python scripts** in `~/.config/ollie/tools/` — lightweight, sandboxed
3. **execute_code** as the single built-in tool — all scripts invoked through it
4. **call_tool/pipe** — named tool dispatch and cross-tool pipelines
-5. **Tool registry** (final form) — lazy-loading via `tool_list`/`tool_load`/`tool_active`; `execute_code` renamed to `shell`
+5. **Tool registry** (final form) — dynamic lazy-loading via `tool_list`/`tool_load`/`tool_active`; `execute_code` renamed to `shell`; tools hot-reloadable without server restart
The file tools (`file_read`, `file_write`, `file_edit`, `file_grep`, `file_glob`)
were extracted into standalone Python scripts. Memory (`memory_remember`,
diff --git a/doc/OBSERVATIONS.md b/doc/OBSERVATIONS.md
index b13fc84..ae9060a 100644
--- a/doc/OBSERVATIONS.md
+++ b/doc/OBSERVATIONS.md
@@ -6,7 +6,7 @@
**Crash resiliency** — Memory (`m/`) is written to persistent storage outside the session. If a session crashes or is killed mid-task, it is not lost — a fresh session picks up where the previous one left off.
-**Lazy tool loading** — After transitioning from `execute_code`/`call_tool`/`pipe` to a unified `shell` primitive, ollie adopted a lazy loading architecture. The system has 7 primitives: `shell` (sandboxed), `tool_load`/`tool_list`/`tool_active`, `skill_load`/`skill_list`/`skill_active`, plus associated 9P filesystem endpoints. Tools are executable scripts discovered from `OLLIE_TOOLS_PATH`; skills are `SKILL.md` directories discovered from `OLLIE_SKILLS_PATH`. Both use session-scoped registries with per-session load tracking. The agent autonomously loads tools and skills as needed — no explicit user permission required.
+**Dynamic tool loading** — After transitioning from `execute_code`/`call_tool`/`pipe` to a unified `shell` primitive, ollie adopted a dynamic lazy-loading architecture. The system has 7 primitives: `shell` (sandboxed), `tool_load`/`tool_list`/`tool_active`, `skill_load`/`skill_list`/`skill_active`, plus associated 9P filesystem endpoints. Tools are executable scripts discovered from `OLLIE_TOOLS_PATH`; skills are `SKILL.md` directories discovered from `OLLIE_SKILLS_PATH`. Both use session-scoped registries with per-session load tracking and dynamic discovery — tools and skills can be added, modified, or removed at any time without restarting the server. The agent autonomously loads tools and skills as needed — no explicit user permission required.
**Both shell and tools are sandboxed** — Promoted tools are not exempt from sandboxing. They execute through the same `executeWithStdin` path as inline `shell` commands, running inside a Landlock sandbox with the same per-profile filesystem access rules. The sandbox applies to every code path that touches user data — there is no bypass by loading a tool.