Orientation
get_started
Call this first. Returns the coach playbook. Inputs: none. Returns: the coach playbook (markdown).get_platform_context
Confirms identity, team, plan tier, and quota usage before doing anything else. Inputs: none. Returns:{ team, me, usage, note } — resolved identity, team, plan tier,
quota usage. Quota trips are HTTP 402, never 429.
list_twins
Returns the hosted digital-twin catalog. Inputs: none. Returns: the hosted digital-twin catalog. Today the hosted MCP catalog surfaces the GitHub and Slack digital twins; more twins are reachable via the CLI (pome twin start).
Authoring
list_scenarios
Returns the team’s scenario catalog with grading criteria visible to the coach. Inputs: none. Returns: the team’s scenario catalog with prompt, setup, and grading criteria. An empty list is not an auth error.validate_task
Grammar-only validation. Creates nothing. Inputs:task_source (scenario markdown, max 256 KiB).
Returns: { valid, title, twins, timeout_seconds, criteria_count, criteria_kinds: { code, model }, criteria[] } or { valid: false, issue }.
save_scenario
Validates then upserts a scenario by name. Inputs:scenario_source (required), name (optional; defaults to the
# heading).
Returns: { scenario_id, name, source_hash, ... }.
evaluate_criteria
Dry-runs the deterministic[code] criteria against the seed’s initial state
without running the examinee — it boots the twin in-process. [model]
criteria are returned as informational.
Inputs: exactly one of scenario_id or scenario_source.
Returns: { twins, has_seed_state, deterministic, model }.
verify_seed
Seed sanity check: flags any deterministic criterion that already passes on the seed’s initial state — a “broken seed.” Inputs: exactly one ofscenario_id or scenario_source.
Returns: { no_criteria_prepass, has_seed_state, already_passing, deterministic, model, notes, verdict }.
register_agent
Lightweight registration of the agent under test. Idempotent on slug. Inputs:name (required), slug (optional), twins (optional
allowlist), transport (rest | mcp).
Returns: { agent } — use agent.id as run_scenario’s agent_id.
intake_clone_scope
Registers the agent and captures its clone scope sorun_scenario can
assemble the examinee. Mints a durable twin façade token, returned once.
Inputs: slug (required), plus optional display_name,
mcp_servers[] ({ name, twin }), env_packages[], memory_policy,
initial_events[], transport.
Returns: { agent }.
list_agents
Lists registered agents. Inputs: none. Returns: registered agents (id, slug, display name, framework, judge model, twins, clone scope).Run lifecycle
run_scenario
Provisions one isolated twin sandbox per twin, captures pristine initial state, and returns the assembledexaminee_launch spec. Does not launch the
clone — the coach does. Retrying with the same idempotency_key replays the
same session.
Inputs: one of scenario_id or scenario_source, optional agent_id,
group_id, idempotency_key.
Returns: examinee_launch (transport, instructions, mcp_servers[] with
per-session twin URLs https://twins.pome.sh/<twin>/s/<sid>/mcp,
mcp_permission_policy { type: "always_allow" }, rest_urls, env with
POME_<TWIN>_REST_URL / POME_AUTH_TOKEN, network allowlist), plus
session_id, expires_at, agent_token, examinee_task, and
how_to_finalize.
run_trials
Batch of N trials of one scenario sharing a group. Not idempotent. Inputs: one ofscenario_id or scenario_source, optional agent_id,
n (1-10), group_id.
Returns: { group_id, requested, provisioned, trials[], errors[], note }.
A 402 quota trip stops further provisioning but returns what was
provisioned.
list_sessions
Recent twin sessions with state and expiry. Inputs: optionallimit (1-200, default 50).
Returns: recent twin sessions with state and expiry.
get_session
Side-effect-free session probe. Use when twin URLs start 404ing. Inputs:session_id.
Returns: { state, expires_at, twin_activity_detected, idle_seconds, activity, verdict }.
Never finalize on
idle_seconds alone.stop_session
Stops a session early and frees the concurrency slot without evaluating. Unrecoverable. Inputs:session_id.
Returns: confirmation of the stop.
finalize_run
Grades synchronously: pulls the recorded twin tape, scores it, tears down the sandbox. Must be called before the session expires. One evaluation per run. Inputs:session_id, agent_token (required), optional scenario_id or
scenario_source (inferred from the session if omitted), agent_model,
agent_sdk.
Returns: { run, note } — the score is in run directly, no polling.
check_evaluation
Polls a legacy async evaluation job. Not needed for the default synchronousfinalize_run.
Inputs: session_id.
Returns: job state — queued | running | completed | failed.
get_report
Scored evaluation report as markdown, plus a weblink for humans. Inputs:run_id.
Returns: the scored evaluation report as markdown (criteria results,
judge narrative, handoff), plus the app.pome.sh/runs/<id> weblink.
list_runs
Lists evaluation runs newest-first. Inputs: optionallimit, group_id, task_name.
Returns: evaluation runs newest-first, plus a dashboard link.