{
 "schema_version": 3,
 "note": "Record format for public/atlas/data/agents/systems/<id>.json (one file per system). index.json is generated from those files and is what the page loads first. Human-readable version: docs/atlas-agents-schema.md. Enforced by tools/check_agents.py.",
 "values": {
  "yes": "Meets the feature's definition, according to the text of a fetched page.",
  "partial": "Meets the feature's 'partial' note, according to the text of a fetched page.",
  "no": "A fetched page states, or directly shows, that the product does not do this. The stronger kind of absence.",
  "not_found": "The maker's documentation was searched for this specific feature, as the search rule below defines, and nothing was found. Weaker than no: the product may still do it. Carries the pages checked.",
  "unknown": "Nobody has searched for this feature yet, or the documentation could not be read. Not an absence of any kind."
 },
 "categories": [
  {
   "id": "coding-agent",
   "label": "Coding agent",
   "definition": "A product whose agent reads and changes a code base: terminal agents, editor agents and cloud coding agents."
  },
  {
   "id": "computer-use-agent",
   "label": "Computer-use agent",
   "definition": "A product whose agent operates a browser or desktop through its graphical interface."
  },
  {
   "id": "framework",
   "label": "Framework or SDK",
   "definition": "A library or toolkit that developers use to build their own agents."
  },
  {
   "id": "workflow-automation",
   "label": "Workflow automation",
   "definition": "A product for building automations that connect business applications, with agent steps."
  },
  {
   "id": "research-agent",
   "label": "Research agent",
   "definition": "A product whose agent searches and reads many sources and returns a cited report."
  },
  {
   "id": "general-assistant",
   "label": "General assistant with agency",
   "definition": "A general-purpose assistant that carries out multi-step tasks across tools on a user's behalf."
  },
  {
   "id": "robotics",
   "label": "Robotics",
   "definition": "A system whose agent controls a physical robot."
  }
 ],
 "groups": [
  {
   "id": "autonomy",
   "label": "Autonomy"
  },
  {
   "id": "tools",
   "label": "Tools and environment"
  },
  {
   "id": "orchestration",
   "label": "Orchestration"
  },
  {
   "id": "memory",
   "label": "Memory and context"
  },
  {
   "id": "models",
   "label": "Models"
  },
  {
   "id": "safety",
   "label": "Safety and control"
  },
  {
   "id": "interfaces",
   "label": "Interfaces"
  },
  {
   "id": "deployment",
   "label": "Collaboration and deployment"
  }
 ],
 "features": [
  {
   "id": "plan_mode",
   "group": "autonomy",
   "short": "Plan step",
   "label": "Plan before acting",
   "definition": "The product documents a distinct planning step or mode in which the agent writes out a multi-step plan that the user (or calling code) can read before the agent makes changes.",
   "partial": "The agent keeps a visible task or to-do list while it works, but there is no separate plan that can be reviewed before execution starts."
  },
  {
   "id": "unattended_run",
   "group": "autonomy",
   "short": "Unattended",
   "label": "Runs unattended",
   "definition": "The product documents a non-interactive way to start a task that runs to completion with no person answering prompts: a headless flag, a CI mode, or a job started by API. For a library: an agent loop that runs to completion from one call.",
   "partial": "Possible only by switching off approvals inside an otherwise interactive session; no documented headless or programmatic entry point."
  },
  {
   "id": "background_tasks",
   "group": "autonomy",
   "short": "Background",
   "label": "Background tasks that outlive the client",
   "definition": "A task keeps running after the user closes the client or disconnects (for example a cloud or remote agent), and its result can be collected later.",
   "partial": "Tasks can run in the background only while the client session stays open."
  },
  {
   "id": "self_verification",
   "group": "autonomy",
   "short": "Self-check",
   "label": "Checks its own work",
   "definition": "The vendor documents that the agent, by default, runs tests, builds, linters or its own review of the result and iterates on failures before reporting completion.",
   "partial": "Happens only when the user configures a test or lint command or asks for it; or is a documented optional evaluator or reflection component in a framework."
  },
  {
   "id": "checkpoints",
   "group": "autonomy",
   "short": "Undo",
   "label": "Checkpoints or rollback",
   "definition": "A built-in way to return the workspace or the agent's state to an earlier point in a run (checkpoints, rewind, snapshots, time travel).",
   "partial": "Relies on ordinary git commits the agent makes, with a documented undo command, rather than its own checkpoints."
  },
  {
   "id": "shell_exec",
   "group": "tools",
   "short": "Shell",
   "label": "Runs shell commands",
   "definition": "The agent can execute arbitrary shell or terminal commands in the user's machine or in an environment it is given, as a built-in capability.",
   "partial": "Shell execution exists only as an optional add-on tool that the developer must supply or enable from a contributed package."
  },
  {
   "id": "file_edit",
   "group": "tools",
   "short": "Files",
   "label": "Reads and edits files",
   "definition": "The agent can read and write files in a workspace or file system directly, as a built-in capability.",
   "partial": "Only as an optional add-on tool the developer must supply or enable; or it can read files but not write them."
  },
  {
   "id": "sandbox",
   "group": "tools",
   "short": "Sandbox",
   "label": "Sandboxed execution",
   "definition": "The product itself provides an isolated place for the agent's commands or code to run (an operating-system sandbox, a container, a virtual machine or a hosted sandbox), on by default or as a first-party option.",
   "partial": "Sandboxing is documented but depends on the user providing and configuring the container or a third-party sandbox service."
  },
  {
   "id": "browser_control",
   "group": "tools",
   "short": "Browser",
   "label": "Controls a web browser",
   "definition": "The agent can drive a web browser as a first-party capability: open pages, click, type and read the result.",
   "partial": "Only through a third-party or community tool or MCP server that the vendor's documentation points to; or it can fetch pages but not interact with them."
  },
  {
   "id": "desktop_control",
   "group": "tools",
   "short": "Desktop",
   "label": "Controls a desktop",
   "definition": "The agent can operate a graphical desktop outside the browser by looking at the screen and sending mouse and keyboard input, as a first-party capability.",
   "partial": "Restricted to a single application or an experimental preview flagged as such; or only through a third-party tool the documentation points to."
  },
  {
   "id": "web_search",
   "group": "tools",
   "short": "Web search",
   "label": "Built-in web search",
   "definition": "A web search tool is built in and available without the user writing or installing a tool.",
   "partial": "Fetching a known URL is built in but searching is not; or search needs a separately supplied search-API key or contributed package."
  },
  {
   "id": "mcp_client",
   "group": "tools",
   "short": "MCP",
   "label": "Connects to MCP servers",
   "definition": "The product can connect, as a client, to Model Context Protocol servers and use their tools, with first-party documentation.",
   "partial": "Only through a separate adapter package or a community extension rather than the core product."
  },
  {
   "id": "custom_tools",
   "group": "tools",
   "short": "Custom tools",
   "label": "User-defined tools",
   "definition": "Users can define their own tools or functions for the agent to call, by a documented mechanism other than MCP (function tools, custom commands, plugins written in code, custom API actions).",
   "partial": "Only prompt-level custom commands or templates; no way to add a new callable tool except through MCP."
  },
  {
   "id": "extensions",
   "group": "tools",
   "short": "Skills/plugins",
   "label": "Packaged skills or plugins",
   "definition": "A documented packaging format for reusable bundles of instructions or capabilities that can be installed or shared (skills, plugins, extensions, a marketplace or hub).",
   "partial": "Reusable prompts or rules can be shared as files, but there is no install or packaging mechanism."
  },
  {
   "id": "subagents",
   "group": "orchestration",
   "short": "Sub-agents",
   "label": "Delegates to sub-agents",
   "definition": "An agent can hand part of a task to another agent instance that has its own context or instructions, and receive the result (sub-agents, handoffs, crews, agent-as-tool).",
   "partial": "Multiple agent personas or modes can be switched between by the user, but one agent cannot delegate to another during a run."
  },
  {
   "id": "parallel_agents",
   "group": "orchestration",
   "short": "Parallel",
   "label": "Agents run in parallel",
   "definition": "The product documents running more than one agent or sub-agent at the same time on separate work.",
   "partial": "The user can open several independent sessions side by side, but the product does not coordinate them."
  },
  {
   "id": "a2a_protocol",
   "group": "orchestration",
   "short": "A2A",
   "label": "Open agent-to-agent protocol",
   "definition": "The product implements the Agent2Agent (A2A) protocol, so its agents can call or be called by agents built with other products.",
   "partial": "Support is labelled experimental or preview, or comes from a separate adapter package. Editor-to-agent protocols such as the Agent Client Protocol do not count."
  },
  {
   "id": "scheduling",
   "group": "orchestration",
   "short": "Schedule",
   "label": "Scheduled or recurring runs",
   "definition": "A built-in way to run an agent task at a set time or on a recurring schedule.",
   "partial": "The vendor documents scheduling only by way of an external scheduler (cron, a CI workflow) calling the headless mode."
  },
  {
   "id": "event_triggers",
   "group": "orchestration",
   "short": "Triggers",
   "label": "Starts from external events",
   "definition": "An agent run can be started by an external event without a person opening the product: a webhook, a new issue or pull request, a chat mention, an incoming email.",
   "partial": "Only through a vendor-supplied CI action or integration that the user must wire up themselves in another system."
  },
  {
   "id": "workflow_graph",
   "group": "orchestration",
   "short": "Workflow graph",
   "label": "Developer-defined workflow graph",
   "definition": "The builder can lay out the control flow explicitly as a graph, state machine or fixed sequence of steps, with the model deciding only inside steps.",
   "partial": "Fixed sequential or hierarchical process options only, with no general branching or graph definition."
  },
  {
   "id": "persistent_memory",
   "group": "memory",
   "short": "Memory",
   "label": "Memory across sessions",
   "definition": "The agent itself stores information during one session and has it available in later sessions (automatic memories, a memory tool, a long-term store), as a first-party feature.",
   "partial": "Persistence exists only as files the user writes by hand, or as a storage interface the developer must back with their own database."
  },
  {
   "id": "instruction_files",
   "group": "memory",
   "short": "Instruction files",
   "label": "Project instruction files",
   "definition": "The agent automatically loads standing instructions from a file kept with the project or the user's configuration (AGENTS.md, CLAUDE.md, rules files).",
   "partial": "Standing instructions can be set only in a settings field or system-prompt parameter, not a file that travels with the project."
  },
  {
   "id": "context_compaction",
   "group": "memory",
   "short": "Compaction",
   "label": "Compacts long context",
   "definition": "The product automatically summarises, compacts or trims the conversation when it approaches the model's context limit, so a long task can continue.",
   "partial": "Compaction is available only as a manual command, or as an optional component the developer must add."
  },
  {
   "id": "retrieval_index",
   "group": "memory",
   "short": "Index",
   "label": "Indexes a codebase or documents",
   "definition": "The product builds and queries its own index of a codebase or document collection (embeddings, a repository map, a knowledge base) to find relevant material.",
   "partial": "Retrieval is offered as components the developer must assemble and host; or the vendor states that it searches on demand without an index."
  },
  {
   "id": "multi_provider",
   "group": "models",
   "short": "Multi-provider",
   "label": "Models from several providers",
   "definition": "The user can choose models from more than one model provider within the product.",
   "partial": "Other providers work only through an OpenAI-compatible endpoint setting or a third-party gateway, without first-party support."
  },
  {
   "id": "byo_key",
   "group": "models",
   "short": "Own key",
   "label": "Bring your own API key",
   "definition": "The user can supply their own model-provider API key (or cloud-provider credentials) and be billed by that provider directly.",
   "partial": "Allowed only on some plans or for some of the product's features."
  },
  {
   "id": "local_models",
   "group": "models",
   "short": "Local models",
   "label": "Runs on local models",
   "definition": "The vendor documents using a model served on the user's own machine (Ollama, llama.cpp, LM Studio, a local OpenAI-compatible server).",
   "partial": "Possible through a generic custom-endpoint setting, without the vendor documenting a local setup."
  },
  {
   "id": "human_approval",
   "group": "safety",
   "short": "Approval",
   "label": "Asks before acting",
   "definition": "The agent can pause and wait for a person to approve a specific action before carrying it out (permission prompts, approval steps, interrupts).",
   "partial": "Approval is possible only by reviewing the finished result (for example a pull request or diff) rather than individual actions."
  },
  {
   "id": "permission_rules",
   "group": "safety",
   "short": "Rules",
   "label": "Configurable permission rules",
   "definition": "The user or an administrator can set standing rules for what the agent may do without asking: allow and deny lists for tools, commands, paths or domains, or selectable autonomy levels.",
   "partial": "A single on/off switch for auto-approval, with no finer rules."
  },
  {
   "id": "action_log",
   "group": "safety",
   "short": "Log",
   "label": "Trace or audit log of actions",
   "definition": "The product keeps a record of each agent action that can be inspected after the run: tracing, an audit log, or stored session transcripts with tool calls.",
   "partial": "Requires connecting a separate observability service that is not part of the product."
  },
  {
   "id": "hooks",
   "group": "safety",
   "short": "Hooks",
   "label": "Lifecycle hooks or guardrails",
   "definition": "The user can attach their own code or checks that run at defined points in the agent's loop and can block or change what happens (hooks, guardrails, middleware, callbacks).",
   "partial": "Callbacks can observe events but cannot block or alter an action."
  },
  {
   "id": "cli",
   "group": "interfaces",
   "short": "CLI",
   "label": "Command-line interface",
   "definition": "The product ships a command-line program through which a person gives the agent tasks.",
   "partial": "A command-line program exists only for scaffolding, deployment or administration, not for giving the agent tasks."
  },
  {
   "id": "ide",
   "group": "interfaces",
   "short": "IDE",
   "label": "Works inside a code editor",
   "definition": "The product is, or ships a first-party integration for, a code editor or IDE.",
   "partial": "Editor support only through a community extension or a generic protocol bridge the vendor does not maintain."
  },
  {
   "id": "web_or_desktop_app",
   "group": "interfaces",
   "short": "App",
   "label": "Web or desktop app",
   "definition": "The vendor provides a graphical application (web, desktop or mobile) through which a person gives the agent tasks.",
   "partial": "A graphical interface exists only for inspecting or debugging runs, not for giving the agent tasks."
  },
  {
   "id": "chat_integration",
   "group": "interfaces",
   "short": "Chat apps",
   "label": "Works from chat apps",
   "definition": "A person can give the agent tasks from a third-party messaging product (Slack, Microsoft Teams, Discord, Telegram, WhatsApp) through a first-party integration.",
   "partial": "Only notifications are sent to chat; or the integration is a community project."
  },
  {
   "id": "api_sdk",
   "group": "interfaces",
   "short": "API/SDK",
   "label": "Programmable by API or SDK",
   "definition": "The vendor documents an API or SDK through which other software can start and control the agent.",
   "partial": "Only a headless command-line mode with machine-readable output; no API or library."
  },
  {
   "id": "voice",
   "group": "interfaces",
   "short": "Voice",
   "label": "Voice input or output",
   "definition": "The product accepts spoken instructions or runs real-time voice agents as a first-party feature.",
   "partial": "Voice is offered only on some platforms, or through a separate optional package."
  },
  {
   "id": "git_pr",
   "group": "interfaces",
   "short": "Pull requests",
   "label": "Opens pull requests",
   "definition": "The agent can itself create a branch and open a pull or merge request on a code-hosting service as a first-party feature.",
   "partial": "It can commit locally, or open a pull request only by calling a separate command-line tool that the user has installed."
  },
  {
   "id": "team_admin",
   "group": "deployment",
   "short": "Team admin",
   "label": "Team and admin controls",
   "definition": "The vendor offers organisation-level features: shared workspaces or seats with central administration, policy or usage controls.",
   "partial": "Team sharing of sessions or configuration exists, but there are no central administrative controls."
  },
  {
   "id": "self_host",
   "group": "deployment",
   "short": "Self-host",
   "label": "Self-hostable",
   "definition": "The whole product, apart from the model, can be run on infrastructure the user controls. A local-only tool or an open-source library counts.",
   "partial": "A client runs locally but depends on the vendor's cloud service for core functions; or self-hosting is offered only under an enterprise contract."
  }
 ],
 "record": {
  "required": [
   "id",
   "name",
   "former_names",
   "maker",
   "category",
   "status",
   "first_release",
   "latest_version",
   "licence",
   "runs",
   "pricing",
   "primary_url",
   "different",
   "ideal_use",
   "timeline",
   "atlas_ids",
   "last_reviewed",
   "features"
  ],
  "id": "lowercase letters, digits and hyphens; never changes once published",
  "status": [
   "active",
   "superseded",
   "discontinued",
   "unknown"
  ],
  "first_release": {
   "date": "YYYY, YYYY-MM or YYYY-MM-DD",
   "precision": [
    "day",
    "month",
    "year"
   ],
   "what": "short phrase saying what was released",
   "source_url": "https URL"
  },
  "latest_version": {
   "version": "string or 'unknown'",
   "date": "date or 'unknown'",
   "precision": [
    "day",
    "month",
    "year",
    "unknown"
   ],
   "source_url": "https URL, or empty when unknown"
  },
  "licence": {
   "type": [
    "open-source",
    "source-available",
    "proprietary",
    "mixed",
    "unknown"
   ],
   "name": "licence name, e.g. Apache-2.0; empty for proprietary",
   "source_url": "https URL, or empty when unknown"
  },
  "runs": [
   "local",
   "cloud",
   "both",
   "unknown"
  ],
  "pricing": "one to four words",
  "different": {
   "text": "one sentence",
   "source_url": "https URL"
  },
  "ideal_use": {
   "text": "one sentence",
   "source_url": "https URL"
  },
  "features": "object with exactly one entry per feature id. yes, partial, no: {value, source_url, as_of, note} plus optional verification and archive_url. not_found: {value, source_url: '', as_of, note, checked_urls}. unknown: {value, source_url: '', as_of: '', note} where note is empty or a short reason.",
  "atlas_ids": "ids of the matching items in public/atlas/data/combined.json, possibly empty",
  "last_reviewed": "YYYY-MM-DD (UTC) on which the whole record was last checked against its sources",
  "name": "The current name, or the most recent name if the product no longer exists. No '(formerly ...)'.",
  "former_names": "Earlier public names of the same product, oldest first; empty if none.",
  "timeline": "See 'timeline'."
 },
 "limits": {
  "name": 60,
  "maker": 60,
  "pricing": 40,
  "sentence_min": 30,
  "sentence_max": 260,
  "note_max": 200,
  "what_max": 80,
  "version_max": 40,
  "checked_urls_min": 2,
  "checked_urls_max": 8,
  "timeline_max": 12,
  "timeline_text_max": 220
 },
 "not_found_search": {
  "rule": "A cell may be not_found only after all of the following that exist for the product were read as page text (not as a summary) and searched for the feature's terms and their usual synonyms, and none of them describes the feature.",
  "places": [
   "the documentation's index or full-text bundle (llms.txt, llms-full.txt, a sitemap, the table of contents, or the documentation site's own search)",
   "the features or reference page where the feature would be described if it existed (for example the tools reference for a tool, the settings reference for a permission rule)",
   "the changelog or release notes",
   "for an open-source project, the repository README"
  ],
  "record": "checked_urls lists the pages actually fetched (at least two, at most eight); as_of is the UTC day of the search; note names the terms searched for.",
  "not_enough": "One page; a summary of a page produced by a tool; a search engine's results; pages about a different product from the same maker. If the documentation cannot be read (an HTTP 403, a login wall, a page that needs JavaScript), the cell stays unknown and the note says why."
 },
 "verification": {
  "verified": "Read from the maker's own text: documentation, release notes, changelog, repository, official blog or announcement. An archived copy of an official page counts, when the record gives both the original address (source_url) and the capture that was read (archive_url). This is the default and is not written out.",
  "secondary": "Read from named third-party reporting that quotes or closely reports the maker, because the maker's own page could not be read.",
  "unverified": "Thinner than that: a forum thread, a single user's report. Included so that it is on record, and shown as 'unverified, pending source confirmation'.",
  "applies_to": "Any sourced fact: first_release, latest_version, licence, different, ideal_use, each timeline entry and each yes, partial or no cell. not_found needs none (it is a search of the maker's own documentation) and unknown makes no claim."
 },
 "timeline_kinds": [
  "announced",
  "preview",
  "general-availability",
  "version",
  "feature",
  "renamed",
  "ownership",
  "superseded",
  "discontinued",
  "archived",
  "pricing",
  "licence"
 ],
 "history_kinds": [
  "renamed",
  "ownership",
  "superseded",
  "discontinued",
  "archived"
 ],
 "timeline": {
  "entry": "{date, precision (day, month or year), kind, text (one neutral sentence, 20 to 220 characters), source_url} plus optional verification and archive_url. Oldest first, at most twelve.",
  "history": "The entries whose kind is renamed, ownership, superseded, discontinued or archived are the record's history. The page shows them beside the name; index.json carries them as 'history'.",
  "rules": "Every former name needs a renamed entry. A status of superseded or discontinued needs an entry saying so. Entries are not removed once recorded."
 }
}