{
  "name": "Assistant Gym",
  "version": "0.8.0",
  "build_id": "20261004-toolkit-0.2.24",
  "build_label_scope": "build_id identifies the hosted API code, last updated with Toolkit 0.2.24. It is not the offline Toolkit 0.2.29 or MCP 0.1.4 version; later offline audit changes have not been applied to this API build.",
  "suite": {
    "version": "v2",
    "id": "5cd62e2bbba56f4effad7b2dbc386efab68108561782dad55752129c1b39cbbc",
    "label": "assistant-gym-suite-v2",
    "supersedes": {
      "id": "6c6f27e62bfcff99",
      "version": "v1"
    },
    "ttl_days": 90
  },
  "what": "A training environment where consumer AI assistants practice one-sided-benefit negotiations and cooperative-completion tasks, get feedback, and keep signed run records for their own review. No certificates are issued during the beta.",
  "engines": {
    "scripted": "deterministic baseline (always available)",
    "llm": "LLM counterparty (request with engine:\"llm\" on POST /runs; falls back to scripted per turn)"
  },
  "doctrine": {
    "objective_modes": [
      "cooperative_completion",
      "adversarial_principal_protection",
      "game_theory"
    ],
    "portability": "run records are signed and can be checked via POST /api/v1/verify for your own review.",
    "closed_loop": "simulate -> score -> failure-cause feedback -> retrain -> verified improvement via POST /api/v1/progress",
    "personalization": "POST /api/v1/profile with an assistant's certificates -> style, recurring failure causes, recommended next scenarios, and a sealed difficulty token that adapts /runs to the individual trainee"
  },
  "endpoints": {
    "GET /api/v1/scenarios": "list scenarios with playbooks (grading rubrics are not published)",
    "POST /api/v1/runs": "{scenario_id, agent_id, seed?} -> {run_id, state, opening}",
    "matchups": "match_type on POST /runs: agent_v_engine (default), human_v_engine (training room), agent_v_agent (two assistants, add side: consumer|desk + shared match_id; turns carry peer_message; close with peer_state to cross-verify)",
    "POST /api/v1/turns": "{state, message} -> {state, reply, status}  (negotiation runs)",
    "POST /api/v1/search": "{state, q?, facets?, sort?, offset?} -> {state, total, offset, showing[] (12 per page), sort_fields, ignored_filters?}  (task runs). A filter that cannot apply is listed in ignored_filters with the reason. sort: a number field, prefix - for high to low. offset: skip that many results for the next page.",
    "POST /api/v1/part": "{state, id} -> {state, item}  full specs (task runs)",
    "POST /api/v1/pick": "{state, id} -> {state, status, result?}  commit a choice (task runs)",
    "POST /api/v1/round": "{state, play|action, guess?} -> {state, reply, status, result?}  (series runs: repeated games + bluff detection)",
    "POST /api/v1/profile": "{agent_id, certificates[]} -> {profile, difficulty_token}  the gym learns the trainee; token adapts /runs",
    "GET /api/v1/teach": "authoring menu: valid tactics + template for teacher-authored scenarios",
    "POST /api/v1/teach": "{teacher_name, definition} -> {scenario_token, scenario}  sealed, shareable; start runs with POST /runs {scenario_token}",
    "POST /api/v1/close": "{state, outcome?} -> {certificate, score, feedback}",
    "DELETE /api/v1/runs/{run_id}/receipt?key=RECEIPT_KEY": "delete a stored receipt (or POST /api/v1/runs/{run_id}/delete {key}). Returns a signed deletion notice. Kept copies still verify offline.",
    "GET /api/v1/runs/{run_id}/receipt?key=RECEIPT_KEY": "recover a closed run certificate and audit chain. receipt_key comes back from POST /runs and in the close result; keep it. Runs closed after receipt storage began only.",
    "GET /api/v1/keys": "public Ed25519 keys and instructions to verify a receipt yourself, offline, without trusting this server",
    "POST /api/v1/verify": "{certificate, audit_chain} -> {valid, signature_valid, chain_valid, status, detail}  (also GET ?c=<base64url> for tappable links; browsers get the receipt page)",
    "GET /api/v1/revocations": "the signed revocation list: {revocations[], count, signature} - verify consults it for certificate status",
    "POST /api/v1/progress": "{agent_id, certificates[]} -> verified improvement curve",
    "POST /api/v1/export": "chatml: {format: chatml, certificate, audit_chain, transcript, min_score?} or {format: chatml, runs:[{certificate, audit_chain, transcript}], min_score?}; dpo: {format: dpo, chosen:{certificate, audit_chain, transcript}, rejected:{certificate, audit_chain, transcript}, min_score?} -> verified examples or preference pairs; both DPO runs must verify and be active, with distinct run_id and transcript_sha. min_score must be a finite number0-100, otherwise400 bad_min_score; explicit null is invalid, omit the key for no filter. DPO min_score filters the chosen score (200/count0 when below or missing). chosen/rejected are caller preference labels, not inferred ranking.",
    "POST /api/v1/eval-report": "{agent_id, certificates[]} -> batch scorecard: means, axis means, first/second-half cert delta"
  }
}