Local-first orchestrator that turns CLI coding agents into a simulated virtual software company with departments, workflows, and a pixel-art office.
OctoOffice exposes 33 tools with critical definition gaps. Tool names lack consistent verb-noun structure (e.g., 'executeApiProviderAgent' vs 'launchApiProviderAgent', unclear distinction). Descriptions are present but generic (avg ~80 chars, well below 194-char baseline). Input schemas are visible in the provided metadata but lack formal JSON Schema type declarations in the source, parameters are described as objects/strings/functions without explicit type, properties, or required arrays. No output schemas documented. Error handling is absent, tools return WriteStream or process IDs without guidance on failure modes. Security critical: tools accept function parameters (safeWriteOverride) and handle OAuth tokens, but no evidence of secret injection patterns or permission gates. Composition issues: executeApiProviderAgent and launchApiProviderAgent appear to duplicate functionality (both execute agents, one async). No pagination, no idempotency markers, no recovery guidance.
Append a log entry to task logs in database
Build HTTP request for API provider with appropriate headers and body based on provider type
Execute Google Antigravity agent with token refresh, account rotation, and fallback support
Execute an API provider agent (Anthropic, Google, OpenRouter, or OpenAI-compatible) with streaming output to a log file and broadcast channel
Execute GitHub Copilot agent with token exchange, account rotation, and fallback support
Get fresh Gemini OAuth access token with automatic refresh if expired
Retrieve API provider configuration by ID from database
Input schemas lack formal JSON Schema type declarations. Parameters described as 'object' or 'function' without explicit type, properties, or required arrays. Cannot validate LLM-generated inputs.
No output schemas documented. Tools return WriteStream, process IDs, or decrypted tokens without specifying response structure. LLMs cannot plan downstream calls or extract required fields.
Credential tools (readClaudeToken, readCodexTokens, readGeminiCreds, getDecryptedOAuthToken) expose sensitive tokens in responses. No evidence of secret injection pattern or response sanitization. Tokens will enter LLM context.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 38 | 2026-07-28+ | v2 |
Get decrypted OAuth token for a provider with legacy fallback
Get Google Cloud project ID for Gemini with caching and fallback to API lookup
Generate next sequential label for OAuth account
Get human-readable display name for OAuth account
Retrieve decrypted OAuth accounts for a provider
Check if OAuth account auto-swap is enabled in settings
Get preferred OAuth accounts for a provider with optional standby accounts
Get provider model configuration from settings
Interrupt a process tree with SIGINT then SIGTERM then SIGKILL on Unix, or taskkill on Windows
Check if a process ID is still alive
Kill a process tree with SIGTERM then SIGKILL on Unix, or taskkill on Windows
Launch an API provider agent as a background task with process management and log streaming
Record OAuth account failure with error message and timestamp
Record OAuth account success and clear failure state
Normalize API base URL by removing trailing slashes and version/endpoint suffixes
Prioritize a specific OAuth account in the list
Read Claude Code OAuth token from macOS keychain or file-based credentials
Read Codex CLI OAuth tokens from file-based credentials
Read Gemini CLI OAuth credentials from keychain or file
Read Gemini CLI OAuth credentials from file
Read Gemini CLI OAuth credentials from macOS keychain
Refresh expired Google OAuth token using refresh token
Resolve Antigravity model name from raw model string
Resolve the model to use for an API provider, with fallback to cached models
Resolve Copilot model name from raw model string
Rotate OAuth accounts list for round-robin dispatch
Duplicate/overlapping tool pairs (executeApiProviderAgent vs launchApiProviderAgent; readGeminiCredsFromKeychain vs readGeminiCredsFromFile vs readGeminiCreds) create ambiguity. LLM cannot distinguish when to use which.
Destructive tools (killPidTree, interruptPidTree) lack confirmation/dry-run patterns and error recovery guidance. No actionable error messages. Agents cannot self-correct on failure.