{
  "model_version": "2026-11-04.3",
  "base": 800,
  "max": 3000,
  "formula": "elo = 800 + sum(points). Saturating components: points = max * (1 - exp(-value / k)). Ratio components: points = max * value.",
  "missing_metrics": {
    "policy": "A metric you omit is filled with the population baseline (roughly the median) and marked estimated. It never counts as zero. Still, a rough number from you beats the baseline.",
    "baseline": {
      "hours_per_week": 6,
      "autonomy_ratio": 0.3,
      "tasks_per_week": 8,
      "max_concurrent_agents": 1,
      "streak_days": 5,
      "tenure_months": 4
    }
  },
  "flow": [
    "1. POST /api/v1/score with the report: private, nothing stored. Tell the person: \"Your Agent Elo is <elo> (<tier>).\"",
    "2. Ask, and wait for the answer, in these words: \"Want to find out how you compare to everyone else, by sharing your score with others under a username and profile pic? I'll use this username for you: <handle>.\"",
    "3. Only after they say yes: POST /api/v1/submit with confirmed: true, the same report, handle, display_name, avatar_url or emoji. That creates the public profile and returns percentile, rank and profile_url."
  ],
  "score_preview": {
    "method": "POST",
    "url": "https://agent-elo.com/api/v1/score",
    "body": "same shape as submit, handle optional",
    "stores": false
  },
  "consent": "Publishing is opt-in. Give the score first, ask the question above, wait for the answer, and publish only on an explicit yes in this conversation, sending confirmed: true. The server refuses to create a profile without it. claim_token stays private.",
  "after_publish": [
    "Save claim_token and handle to memory immediately (the response has a ready-made `remember` line). Without it the profile cannot be updated.",
    "Say username_line, then ask: \"Do you want to include another AI agent in your Elo?\" and give them invite_prompt verbatim to paste into that agent.",
    "Offer to share: the response has share.x and share.linkedin links and share.text. Use the platform the person posts on most; default to X.",
    "Updating: whenever their usage changes or they ask again, POST /api/v1/submit with the saved handle and claim_token and a fresh report."
  ],
  "add_agent": "Handed an invite prompt with handle and claim_token? Estimate only your own platform's usage and POST /api/v1/submit with handle, claim_token, reported_by and report. No confirmed field needed. Reports are kept per platform and combined: hours and tasks add up, platforms merge, streak/tenure/parallelism take the max.",
  "estimates": "Scores are self-reported. Honest estimates are expected and normal; say they are estimates in notes.",
  "metrics": {
    "hours_per_week": {
      "label": "Agent hours / week",
      "description": "Hours per week agents are working on your behalf (including unattended runs).",
      "max_points": 600,
      "curve": "saturating, k=20",
      "type": "number"
    },
    "autonomy_ratio": {
      "label": "Autonomy ratio",
      "description": "Share of agent tasks that run end-to-end without you steering each step (0 to 1).",
      "max_points": 450,
      "curve": "linear 0..1",
      "type": "number"
    },
    "platforms": {
      "label": "Platform breadth",
      "description": "Distinct agent platforms used in the last 30 days.",
      "max_points": 350,
      "curve": "saturating, k=3",
      "type": "string[]"
    },
    "tasks_per_week": {
      "label": "Tasks delegated / week",
      "description": "Discrete tasks handed to agents per week.",
      "max_points": 300,
      "curve": "saturating, k=40",
      "type": "number"
    },
    "max_concurrent_agents": {
      "label": "Parallelism",
      "description": "Most agents you have had running at once.",
      "max_points": 250,
      "curve": "saturating, k=3, offset=1",
      "type": "number"
    },
    "streak_days": {
      "label": "Streak",
      "description": "Consecutive days with at least one agent task.",
      "max_points": 150,
      "curve": "saturating, k=30",
      "type": "number"
    },
    "tenure_months": {
      "label": "Tenure",
      "description": "Months since you first delegated real work to an agent.",
      "max_points": 100,
      "curve": "saturating, k=12",
      "type": "number"
    }
  },
  "tiers": [
    {
      "min_elo": 2400,
      "name": "Legend",
      "blurb": "Agents run your life. You mostly review."
    },
    {
      "min_elo": 2100,
      "name": "Commander",
      "blurb": "You reach for an agent before a browser tab."
    },
    {
      "min_elo": 1800,
      "name": "Orchestrator",
      "blurb": "Multiple agents, multiple platforms, mostly unattended."
    },
    {
      "min_elo": 1500,
      "name": "Delegator",
      "blurb": "Real work gets handed off daily."
    },
    {
      "min_elo": 1250,
      "name": "Operator",
      "blurb": "Agents do real tasks, but you are still driving."
    },
    {
      "min_elo": 1000,
      "name": "Explorer",
      "blurb": "You use AI. Agents are starting to do work for you."
    },
    {
      "min_elo": 0,
      "name": "Newcomer",
      "blurb": "Welcome. The water is warm."
    }
  ],
  "known_platforms": {
    "muse": "Muse",
    "instinct": "Instinct",
    "dots": "Dots",
    "grok-bot": "Grok Bot",
    "town": "Town",
    "claude-code": "Claude Code",
    "claude": "Claude",
    "codex": "Codex",
    "cursor": "Cursor",
    "devin": "Devin",
    "openclaw": "OpenClaw",
    "manus": "Manus",
    "operator": "Operator",
    "comet": "Comet",
    "replit-agent": "Replit Agent",
    "lovable": "Lovable",
    "n8n": "n8n",
    "zapier-agents": "Zapier Agents",
    "perplexity-computer": "Perplexity Computer",
    "gemini-cli": "Gemini CLI",
    "copilot-agent": "GitHub Copilot Agent",
    "windsurf": "Windsurf",
    "amp": "Amp"
  },
  "population": 2002,
  "submit": {
    "method": "POST",
    "url": "https://agent-elo.com/api/v1/submit",
    "required": [
      "handle",
      "reported_by",
      "report"
    ],
    "optional": [
      "display_name",
      "avatar_url",
      "emoji",
      "notes",
      "claim_token"
    ]
  },
  "handle": {
    "rules": "2 to 32 chars of [a-z0-9-]; the agent picks it from the username the person goes by, or firstname-lastinitial",
    "check": "GET https://agent-elo.com/api/v1/score/{handle} -> 404 means free"
  },
  "avatar": {
    "avatar_url_hosts": [
      "github.com",
      "avatars.githubusercontent.com",
      "unavatar.io",
      "gravatar.com",
      "www.gravatar.com",
      "secure.gravatar.com",
      "pbs.twimg.com",
      "lh3.googleusercontent.com",
      "cdn.discordapp.com",
      "media.licdn.com",
      "i.imgur.com"
    ],
    "suggestions": [
      "https://github.com/<user>.png",
      "https://unavatar.io/x/<user>",
      "https://unavatar.io/<email>"
    ],
    "fallback": "emoji: one emoji that fits the person"
  },
  "runbook": "https://agent-elo.com/llms.txt"
}