Ferry exposes 5 tools for managing alternate-provider worker threads. All tools have explicit schemas with proper type definitions and descriptions. However, descriptions are verbose and domain-specific (targeting Codex integration), making them less accessible to general LLM agents. Parameter naming is clear (thread_id, turn_id, cwd, provider, brief, model, sandbox, hook_policy, skill_policy). Schemas use Pydantic Annotated types with proper constraints (minLength, maxLength, enums, min/max). Error handling guidance is present but generic ('inspect error.code, error.operation, error.message'). No output schemas are documented. Tools follow single-responsibility principle but are tightly coupled to Codex internals.
Start the next turn on the exact same thread only after terminal completion is observed. Policies: hook_policy disabled (default) avoids inherited worker hook execution; inherit leaves effective Codex hooks and per-hook trust/enablement. skill_policy inherit (default) retains automatic skill instructions; disabled suppresses them to reduce worker context. Concrete hook and skill selection remains Codex-owned; inspect the schema for exact modes. On ok:false inspect error.code, error.operation, error.message, optional error.cause, and top-level events.
Interrupt the exact currently-live turn only after worker_wait reports active; use only a real stop or redirect. On ok:false inspect error.code, error.operation, error.message, optional error.cause, and top-level events.
Start one explicit alternate-provider turn; returns starting, so call worker_wait before live control. Policies: hook_policy disabled (default) avoids inherited worker hook execution; inherit leaves effective Codex hooks and per-hook trust/enablement. skill_policy inherit (default) retains automatic skill instructions; disabled suppresses them to reduce worker context. Concrete hook and skill selection remains Codex-owned; inspect the schema for exact modes. On ok:false inspect error.code, error.operation, error.message, optional error.cause, and top-level events.
Steer the exact currently-live turn only after worker_wait reports active; preserve a native control failure. On ok:false inspect error.code, error.operation, error.message, optional error.cause, and top-level events.
Output schemas not documented. Tools return events and status but no structured response schema is visible in code or descriptions. LLMs cannot plan downstream calls or extract required fields.
Descriptions are verbose and Codex-specific. Phrases like 'Policies: hook_policy disabled (default) avoids inherited worker hook execution' are domain jargon. Descriptions should explain WHEN to use each tool and WHAT it returns in 50-200 chars, not policy internals.
worker_wait description (50 chars) is too terse. 'Consume one bounded stream segment; control only after this exact turn reports active, and follow-up only after terminal.' lacks context on what 'active' and 'terminal' mean, when to call it, and what it returns.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 55 | 2026-07-28+ | v2 |
Consume one bounded stream segment; control only after this exact turn reports active, and follow-up only after terminal. On ok:false inspect error.code, error.operation, error.message, optional error.cause, and top-level events.
Error handling is generic. All tools say 'On ok:false inspect error.code, error.operation, error.message, optional error.cause, and top-level events.' No guidance on which errors are retryable, what to do next, or how to recover.
No batch or pagination support. worker_wait accepts max_events (1-16) but no cursor/offset for multi-turn sequences. If an agent needs to consume many events, it must loop with repeated calls.