Turn any coding agent into a mission orchestration system via MCP and ACP. Provides three modes: orchestrator, worker, and terminal-reviewer with disjoint tool sets.
Zenith Harness defines 9 tools with clear, domain-specific names (start_project, submit_plan, advance_project, etc.) that follow verb_noun conventions. Descriptions are detailed and contextual, explaining WHEN to call each tool and what state transitions occur. However, input schemas are partially visible in the code snippet, task_list in submit_plan is typed as TaskList (Pydantic model), but the full schema structure is not shown. Output schemas are not documented in the tool definitions. Error handling is mentioned in descriptions (e.g., 'returns mission_not_ready_to_close') but recovery guidance is minimal. Parameter descriptions are present and specific (e.g., 'Project id from start_project'), but some lack format/constraint details. The server uses Pydantic models for validation, which is good, but the MCP tool registration does not expose detailed JSON Schema for complex types like TaskList, Decision, or WorkHandoff.
Abort a project. Marks the project as aborted and preserves task history.
Drive the runtime forward. BLOCKING — may run for many minutes while workers dispatch according to runtime scheduling. Call whenever state is mission_running. Returns when attention is needed, no runnable task work remains, or `max_steps` exhausts. It does not request mission closure; call end_mission when you intend to close after task work is quiescent. If it returns still mission_running with runnable work, call it again.
Resolve all open AttentionItem(s). Every open item must be covered by exactly one Decision. Use retry only for transient node_failed attempts; use patch for changed work, missing assertions, failed validation, over-broad scope, or task-list adaptation. Patches must pass structural validation. After a valid decide, state usually returns to mission_running; call advance_project to dispatch more work.
Request runtime mission closure. Call only when state is mission_running and you believe task work is complete/quiescent. This tool does not dispatch workers. If work or gates are still runnable, returns mission_not_ready_to_close; call advance_project first. If closure passes, state becomes done. If closure finds gaps, state becomes attention_needed with a closure report.
Worker tool. Call exactly once before exiting. Configured at runtime via env: ZENITH_NODE_TYPE, ZENITH_NODE_ID, ZENITH_HANDOFF_PATH.
Complex input types (TaskList, Decision, WorkHandoff, TerminalReviewHandoff) are Pydantic models but their JSON Schema is not visible in tool registration. LLMs cannot infer the structure of nested fields like tasks[].depends_on or decision.retry_attempt.
Output schemas are not documented. Tools return dict[str, Any] with _to_payload() conversion, but the structure of returned envelopes (state, project_id, attention_items, etc.) is not declared in tool definitions.
Error handling returns ToolError objects via _to_payload() but error response structure is not documented. LLMs cannot distinguish retryable errors (node_failed) from fatal ones (validation_failed) without seeing the response schema.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | <=2025-11-25 | v2 |
Pure read of current state, full task-list view, and open attention. No state change. Use when waking with no specific tool call in mind.
Create a new long-running project rooted at the workspace. Use when the user describes a goal that needs planning and decomposition. Writes brief.md, creates harness state, returns the envelope with state=mission_planning.
Submit the current mission's contract-backed task list. Before calling, write every targeted contract/<id>.md file under the mission contract directory. Runtime validates a non-empty contract, task shape, depends_on resolution, acyclicity, coverage (each assertion has exactly one non-superseded work task). On success state becomes mission_running; call advance_project to dispatch work.
Terminal reviewer tool. Call exactly once with the structured gap list. Configured via env: ZENITH_TERMINAL_REVIEW_PATH.
Worker and terminal-reviewer tools (end_node, submit_terminal_review) have minimal descriptions and no guidance on environment variable configuration (ZENITH_NODE_TYPE, ZENITH_NODE_ID, ZENITH_HANDOFF_PATH). LLMs cannot understand how to invoke these tools.
advance_project is a blocking, long-running tool (may run for many minutes) but no timeout, cancellation, or progress reporting is documented. LLMs may not know when to expect a response or how to handle hung calls.