Orchestrata Ultimate › Plans › spec-audit › I-tools

Cluster I — Tools suite (greenfield tools 063–072)

Source: plans/spec-audit/I-tools.md at 8a2cb42ad · last changed 2026-07-27 · first committed 2026-07-04 · 345 lines.

Prose pending.

Plan text

Cluster I — Tools suite (greenfield tools 063–072)

Investigation agent report. READ-ONLY audit of src/orchestrata_ultimate/ against specs 063–072. Method: plans/spec-audit/_METHOD.md. Evidence-based; requirements-checklist boxes ignored.

Headline finding

All 10 tool classes are entirely ABSENT (GAP). Not one of the spec'd tool classes exists in the target package — and none exist in the frozen source monorepo either, so these are pure greenfield specs, never implemented anywhere (nothing to "port"). SPEC-062 (cheetahclaws-tools-gap) is the parent gap-analysis/roadmap that enumerates these same 14 missing tools; 063–072 are the per-tool specs it spawned. The prior register note ("Greenfield tool suite (063–072) + unified registry/ToolSearch = PENDING") is CONFIRMED.

The real architectural gap: no tool framework to build on

There is no BaseTool / AbstractTool interface anywhere (searched target + monorepo, 0 hits). Tools today are two incompatible ad-hoc patterns, neither of which is a registry:

  1. agents/tool_registry.py — the one volks actually invoke. Module-level dict literals (READ_FILE_TOOL, … 8 total) collected in ALL_TOOLS, an AGENT_TOOLS: dict[alias→[names]] allow-map, and a ToolExecutor (tool_registry.py:285) that dispatches by a hardcoded if/elif chain in .execute() (tool_registry.py:329-352). Wiring point: agents/volks/base.py:255-290 (_call_llm_with_tools) calls get_agent_tools(alias) + ToolExecutor.execute(). Adding a tool here = write a dict, append to ALL_TOOLS, add to each AGENT_TOOLS list, add an elif + _handler method. No dynamic registration, no discovery, no metadata index.
  2. session/mcp_tools.py:SessionMCPTools / session/fireflies_tools.py:FirefliesMCPTools — a different pattern: a class exposing tool_definitions() -> list[dict] + handle_tool_call(name, args). Not connected to tool_registry.ALL_TOOLS; used only in the session subsystem.

Consequence: every tool in this cluster needs a home, and SPEC-072 (ToolSearch) cannot exist until a real registry with per-tool metadata exists to index. So the cluster has one dominant shared prerequisite: build src/orchestrata_ultimate/tools/base.py (a BaseTool protocol/ABC + ToolMetadata) and tools/registry.py (a ToolRegistry with register/discover/list), then refactor ToolExecutor to dispatch through it. SPEC-062 already defines the ToolMetadata schema + category taxonomy (file/shell/search/web/task/memory/planning/agent/config/mcp/utility) to model this on. The src/orchestrata_ultimate/tools/ package exists but today holds only AST helpers (ast_query.py, ast_pipeline.py) — it is the natural target dir.

Reusable primitives found (building blocks, not the tools themselves):

Missing declared deps (none in pyproject.toml): croniter (068), an LSP client e.g. pygls (065), mcp SDK (071), rapidfuzz + optional numpy/sentence-transformers (072). Already present and reusable: httpx>=0.28 (067), redis>=5 (068/069 locks), fastapi+websockets (063 API/WS). Per the project rule, all must be declared (optional/lazy features under [project.optional-dependencies]) and pass check-deps.


SPEC-063 REPLTool — GAP

SPEC-064 Git Worktree Tools (Enter/Exit) — GAP

SPEC-065 LSPTool — GAP

SPEC-066 PowerShellTool — GAP

SPEC-067 RemoteTriggerTool — GAP

SPEC-068 ScheduleCronTool — GAP

SPEC-069 Task Management Tools (TaskStop + TaskOutput) — GAP

SPEC-070 Team Tools — GAP

SPEC-071 MCP Resource Tools (List/Read) — GAP

SPEC-072 ToolSearchTool — GAP (capstone / registry-blocked)


Shared dependencies / sequencing (critical for parallelism)

  1. Unified tool framework (prerequisite for the whole cluster; hard-blocks 072). New src/orchestrata_ultimate/tools/base.py (BaseTool + ToolMetadata, model on SPEC-062's schema
    • category taxonomy) and tools/registry.py (ToolRegistry: register/discover/list/get), then refactor agents/tool_registry.py:ToolExecutor (line 285) to dispatch through it and have get_agent_tools derive from registered metadata. Build this first; then 063–071 land in parallel; 072 lands last. Effort of the framework itself: M.
  2. SPEC-062 cheetahclaws-tools-gap is the parent roadmap/governance-mapping + tool taxonomy for this entire cluster (not a code dependency, but the source of truth for categories, governance predicates, and agent-distribution). Treat 062 as the umbrella.
  3. Governance ResourceAccessController (governance/resource_access.py:78, PAM++/Prolog) — authz for 063 (tool:execute), 069 (stop authz), 070 (RBAC), 071 (resource access).
  4. SPEC-023 goal-system is NOT a dependency of the cron (068) or task (069) tools — those are job/process runtimes, distinct from GoalRegistry (the session backlog). Corrects the register's implied coupling. 069 instead couples to the task runtime (TaskExecutor, agents/task_executor.py:99) — a scope decision (reuse vs build).
  5. New declared deps (per project rule, check-deps-gated; optional/lazy under [project.optional-dependencies]): croniter(+aiosqlite) 068 · LSP client e.g. pygls/ lsprotocol 065 · mcp SDK 071 · rapidfuzz(+optional numpy/sentence-transformers) 072 · ptyprocess 063 (if PTY) · paramiko 067 (only if SSH variant chosen). Already present: httpx, redis, fastapi, websockets, pydantic.
  6. Absent-subsystem blockers: SPEC-070 depends on an auth/JWT identity source and SPEC-060 Resource Management, both absent → most likely to need a scope decision/deferral.

Cluster summary table

Spec Class(es) Class Effort Hard deps
SPEC-063 REPLTool GAP L unified registry; core/isolation; governance
SPEC-064 EnterWorktreeTool,ExitWorktreeTool GAP M unified registry; session CWD state; harness/isolation git plumbing
SPEC-065 LSPTool GAP L unified registry; pygls/LSP servers (new dep)
SPEC-066 PowerShellTool GAP M unified registry; pwsh binary (untestable on Linux infra)
SPEC-067 RemoteTriggerTool GAP M unified registry; httpx(present); 062↔067 SSH-vs-HTTP divergence
SPEC-068 ScheduleCronTool GAP L unified registry; croniter/aiosqlite(new); redis. NOT SPEC-023
SPEC-069 TaskStopTool,TaskOutputTool GAP M–L unified registry; task runtime (TaskExecutor); governance; redis. NOT SPEC-023
SPEC-070 TeamCreateTool,TeamDeleteTool,TeamUpdateTool GAP L unified registry; auth/JWT (absent); SPEC-060 (absent); governance RBAC
SPEC-071 ListMcpResourcesTool,ReadMcpResourceTool GAP M–L unified registry; mcp SDK (new); governance; vault
SPEC-072 ToolSearchTool GAP M–L HARD: unified ToolRegistry must exist first; rapidfuzz(new)

Evidence log (commands run + results)