{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://cognitive-delivery.github.io/contract/1.x/plugin-manifest.schema.json",
  "title": "CDF Plugin Manifest",
  "description": "A plugin's `plugin.json`, read from `.claude-plugin/plugin.json`. Models every key the Claude Code plugin manifest and marketplace references, read 2026-10-05 document, with the same meaning, so a Claude Code plugin validates here; unknown top-level keys pass through, as Claude Code strips them with a warning. Two keys are CDF's own: the optional `cdf` block, which declares what the harness alone understands, and plugin-level `category`, which Claude Code documents only on a marketplace entry — what the plugin contributes, what its own code asks to be allowed, and who vouches for the declaration. `name` is the only required key, which is Claude Code's rule and not a relaxation of ours: a manifest that named nothing could not be addressed, and everything else has a defensible default. A declaration is not an installation: reading this file tells the loader what a plugin says about itself, never that it may run.",
  "definitions": {
    "attestation": {
      "type": "object",
      "description": "Who vouches for the declaration. Optional: a plugin published without a key has nothing to sign with, and the harness records that honestly rather than claiming a signature it does not have. The issuer vocabulary is the lease manifest's, so one reader understands both.",
      "required": [
        "issuer"
      ],
      "properties": {
        "issuer": {
          "type": "string",
          "enum": [
            "agent",
            "bridge",
            "harness",
            "plugin"
          ],
          "description": "Which party produced the declaration."
        },
        "signature": {
          "type": "string",
          "pattern": "^[0-9a-f]+$",
          "description": "Lower-case hex signature over the canonical bytes of the manifest, when the issuer can sign."
        },
        "key_fingerprint": {
          "type": "string",
          "minLength": 1,
          "description": "Fingerprint of the key that produced `signature`. Never the key."
        }
      },
      "additionalProperties": true
    },
    "author": {
      "description": "Who publishes the plugin. An object is the documented form; a bare string is accepted because marketplaces in the wild carry one, and a reader that refused it would refuse a real plugin.",
      "anyOf": [
        {
          "type": "string",
          "minLength": 1
        },
        {
          "type": "object",
          "required": [
            "name"
          ],
          "properties": {
            "name": {
              "type": "string",
              "minLength": 1
            },
            "email": {
              "type": "string"
            },
            "url": {
              "type": "string"
            }
          },
          "additionalProperties": true
        }
      ]
    },
    "capabilities": {
      "type": "object",
      "description": "What the plugin's own code asks to be allowed when the harness runs it out of process. This is the lease manifest's `allow` shape, property for property, because a plugin worker's lease is generated from it and narrowed against the workspace root policy. It is deliberately NOT the store-listing `interface.capabilities` vocabulary a plugin may also carry: that is a shelf label, this is an authorisation request. Every list is optional here — an absent list is a plugin that asks for nothing, which is the correct default — whereas the granted manifest requires all five.",
      "properties": {
        "tools": {
          "type": "array",
          "description": "Governed tool names the agent may call.",
          "items": {
            "type": "string",
            "minLength": 1
          }
        },
        "read_paths": {
          "type": "array",
          "description": "Workspace-relative POSIX globs the agent may read. Refused here, without lookahead so any RE2 or I-Regexp validator can load the rule: a leading `/`, any `..` segment, a leading `~`, a drive-letter prefix and any backslash. The registry re-checks the resolved path against the workspace root.",
          "items": {
            "type": "string",
            "minLength": 1,
            "allOf": [
              {
                "not": {
                  "pattern": "^/"
                }
              },
              {
                "not": {
                  "pattern": "(^|/)\\.\\.(/|$)"
                }
              },
              {
                "not": {
                  "pattern": "^~"
                }
              },
              {
                "not": {
                  "pattern": "^[A-Za-z]:"
                }
              },
              {
                "not": {
                  "pattern": "\\\\"
                }
              }
            ]
          }
        },
        "write_paths": {
          "type": "array",
          "description": "Workspace-relative POSIX globs the agent may change. Refused here, without lookahead: a leading `/`, any `..` segment, a leading `~`, a drive-letter prefix and any backslash. The registry re-checks the resolved path against the workspace root, and a change outside the granted set is a scope violation that revokes the lease.",
          "items": {
            "type": "string",
            "minLength": 1,
            "allOf": [
              {
                "not": {
                  "pattern": "^/"
                }
              },
              {
                "not": {
                  "pattern": "(^|/)\\.\\.(/|$)"
                }
              },
              {
                "not": {
                  "pattern": "^~"
                }
              },
              {
                "not": {
                  "pattern": "^[A-Za-z]:"
                }
              },
              {
                "not": {
                  "pattern": "\\\\"
                }
              }
            ]
          }
        },
        "hosts": {
          "type": "array",
          "description": "Hostnames the agent may reach, with an optional leading wildcard label (`*.example.com`). Enforced by the egress proxy once it keys off the lease.",
          "items": {
            "type": "string",
            "minLength": 1
          }
        },
        "commands": {
          "type": "array",
          "description": "Executable names the agent may run.",
          "items": {
            "type": "string",
            "minLength": 1
          }
        }
      },
      "additionalProperties": true
    },
    "cdf": {
      "type": "object",
      "description": "The additive CDF block. Absent in a plain Claude Code plugin, and its absence is not a defect: such a plugin contributes its skills, commands, agents, hooks and MCP servers and declares nothing further.",
      "required": [
        "schemaVersion"
      ],
      "properties": {
        "schemaVersion": {
          "type": "string",
          "enum": [
            "1.0"
          ],
          "description": "Contract version this block was written against."
        },
        "contributes": {
          "$ref": "#/definitions/contributes"
        },
        "capabilities": {
          "$ref": "#/definitions/capabilities"
        },
        "attestation": {
          "$ref": "#/definitions/attestation"
        }
      },
      "additionalProperties": true
    },
    "check": {
      "type": "object",
      "description": "A data or delivery check the plugin implements. `worker` is a path inside the plugin; the harness runs it out of process, never in the kernel.",
      "required": [
        "id",
        "worker"
      ],
      "properties": {
        "id": {
          "type": "string",
          "minLength": 1
        },
        "worker": {
          "type": "string",
          "minLength": 1,
          "allOf": [
            {
              "not": {
                "pattern": "^/"
              }
            },
            {
              "not": {
                "pattern": "(^|/)\\.\\.(/|$)"
              }
            },
            {
              "not": {
                "pattern": "^~"
              }
            },
            {
              "not": {
                "pattern": "^[A-Za-z]:"
              }
            },
            {
              "not": {
                "pattern": "\\\\"
              }
            }
          ]
        }
      },
      "additionalProperties": true
    },
    "componentPath": {
      "description": "A component directory or file, or a list of them. Claude Code accepts a single string or an array of strings for `skills`, `commands`, `agents`, `outputStyles`, `workflows` and `experimental.themes`, and scans the default folder when the key is absent, so an absent key is not an empty contribution. Every path starts with `./` (`skills` also accepts `\".\"`). Claude Code plugin manifest and marketplace references, read 2026-10-05.",
      "anyOf": [
        {
          "type": "string",
          "minLength": 1
        },
        {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1
          }
        }
      ]
    },
    "componentSource": {
      "description": "A component declared inline as an object, a path to a `.json` file that declares it, or an array mixing both. Claude Code accepts all three for `hooks`, `mcpServers` and `lspServers`; for `mcpServers` the string may also be an `.mcpb` or `.dxt` bundle path or an `https://` bundle URL. Claude Code plugin manifest and marketplace references, read 2026-10-05.",
      "anyOf": [
        {
          "type": "object"
        },
        {
          "type": "string",
          "minLength": 1
        },
        {
          "type": "array",
          "items": {
            "anyOf": [
              {
                "type": "object"
              },
              {
                "type": "string",
                "minLength": 1
              }
            ]
          }
        }
      ]
    },
    "contributes": {
      "type": "object",
      "description": "What the plugin adds to the harness as DATA the kernel reads. Every list is optional. Nothing here is code the kernel executes: a contributed check names a worker the harness spawns, and a contributed provider names a host the egress policy must already permit.",
      "properties": {
        "providers": {
          "type": "array",
          "description": "Model providers the plugin adds to the registry.",
          "items": {
            "$ref": "#/definitions/provider"
          }
        },
        "trackers": {
          "type": "array",
          "description": "Tracker strategies the plugin adds to the mirror.",
          "items": {
            "$ref": "#/definitions/tracker"
          }
        },
        "docPacks": {
          "type": "array",
          "description": "Paths inside the plugin to document packs it contributes.",
          "items": {
            "type": "string",
            "minLength": 1,
            "allOf": [
              {
                "not": {
                  "pattern": "^/"
                }
              },
              {
                "not": {
                  "pattern": "(^|/)\\.\\.(/|$)"
                }
              },
              {
                "not": {
                  "pattern": "^~"
                }
              },
              {
                "not": {
                  "pattern": "^[A-Za-z]:"
                }
              },
              {
                "not": {
                  "pattern": "\\\\"
                }
              }
            ]
          }
        },
        "checks": {
          "type": "array",
          "description": "Checks the plugin implements.",
          "items": {
            "$ref": "#/definitions/check"
          }
        }
      },
      "additionalProperties": true
    },
    "prices": {
      "type": "object",
      "description": "Declared unit prices, for budget accounting. Advisory: the harness records what it spent, not what it was told it would cost.",
      "properties": {
        "input_per_million": {
          "type": "number",
          "minimum": 0
        },
        "output_per_million": {
          "type": "number",
          "minimum": 0
        }
      },
      "additionalProperties": true
    },
    "provider": {
      "type": "object",
      "description": "A model provider the plugin contributes. `kind` is the closed set of wire protocols the harness speaks; a provider whose protocol is neither is not a provider the harness can drive.",
      "required": [
        "id",
        "kind"
      ],
      "properties": {
        "id": {
          "type": "string",
          "minLength": 1
        },
        "kind": {
          "type": "string",
          "enum": [
            "openai-compatible",
            "anthropic"
          ],
          "description": "The wire protocol. Closed: the harness has exactly these two clients."
        },
        "baseUrl": {
          "type": "string",
          "minLength": 1
        },
        "model": {
          "type": "string",
          "minLength": 1
        },
        "prices": {
          "$ref": "#/definitions/prices"
        },
        "extraHosts": {
          "type": "array",
          "description": "Hostnames beyond the base URL's own that this provider reaches. They must still be permitted by the lease.",
          "items": {
            "type": "string",
            "minLength": 1
          }
        }
      },
      "additionalProperties": true
    },
    "repository": {
      "description": "The source repository, as a URL string or as an object carrying one.",
      "anyOf": [
        {
          "type": "string",
          "minLength": 1
        },
        {
          "type": "object"
        }
      ]
    },
    "tracker": {
      "type": "object",
      "description": "A tracker strategy the plugin contributes. The action ids name integration actions; an id the host does not know is reported, never invented.",
      "required": [
        "id",
        "label",
        "readAction"
      ],
      "properties": {
        "id": {
          "type": "string",
          "minLength": 1
        },
        "label": {
          "type": "string",
          "minLength": 1
        },
        "readAction": {
          "type": "string",
          "minLength": 1
        },
        "commentAction": {
          "type": "string",
          "minLength": 1
        },
        "transitionAction": {
          "type": "string",
          "minLength": 1
        },
        "createAction": {
          "type": "string",
          "minLength": 1
        },
        "externalIdLabel": {
          "type": "string",
          "minLength": 1
        },
        "externalIdPlaceholder": {
          "type": "string",
          "minLength": 1
        }
      },
      "additionalProperties": true
    },
    "dependencies": {
      "type": "array",
      "description": "Plugins that must be enabled for this one to work. Each entry is `\"name\"`, `\"name@marketplace\"`, or an object with `name`, `marketplace` and `version`. Claude Code plugin manifest and marketplace references, read 2026-10-05.",
      "items": {
        "anyOf": [
          {
            "type": "string",
            "minLength": 1
          },
          {
            "type": "object",
            "required": [
              "name"
            ],
            "properties": {
              "name": {
                "type": "string",
                "minLength": 1
              },
              "marketplace": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            },
            "additionalProperties": true
          }
        ]
      }
    },
    "userConfigOption": {
      "type": "object",
      "description": "One user-configuration option. A STRICT object in Claude Code: an unknown key stops the plugin loading, so the contract refuses it too, which is the one place the contract closes a content model to mean what Claude Code means. Claude Code plugin manifest and marketplace references, read 2026-10-05.",
      "required": [
        "type",
        "title",
        "description"
      ],
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "string",
            "number",
            "boolean",
            "directory",
            "file"
          ]
        },
        "title": {
          "type": "string",
          "minLength": 1
        },
        "description": {
          "type": "string"
        },
        "required": {
          "type": "boolean"
        },
        "default": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "number"
            },
            {
              "type": "boolean"
            },
            {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          ]
        },
        "options": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          }
        },
        "multiple": {
          "type": "boolean"
        },
        "sensitive": {
          "type": "boolean"
        },
        "min": {
          "type": "number"
        },
        "max": {
          "type": "number"
        }
      },
      "additionalProperties": false
    },
    "userConfig": {
      "type": "object",
      "description": "Values Claude Code prompts the user for when the plugin is enabled. Keys are identifiers of letters, digits and underscores not starting with a digit. Claude Code plugin manifest and marketplace references, read 2026-10-05.",
      "propertyNames": {
        "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
      },
      "additionalProperties": {
        "$ref": "#/definitions/userConfigOption"
      }
    },
    "channel": {
      "type": "object",
      "description": "A message channel bound to one of the plugin's MCP servers. A STRICT object in Claude Code. Claude Code plugin manifest and marketplace references, read 2026-10-05.",
      "required": [
        "server"
      ],
      "properties": {
        "server": {
          "type": "string",
          "minLength": 1
        },
        "displayName": {
          "type": "string"
        },
        "userConfig": {
          "$ref": "#/definitions/userConfig"
        }
      },
      "additionalProperties": false
    },
    "lspServer": {
      "type": "object",
      "description": "One language server. A STRICT object in Claude Code: `command` and `extensionToLanguage` are required and an unknown key fails validation. Claude Code plugin manifest and marketplace references, read 2026-10-05.",
      "required": [
        "command",
        "extensionToLanguage"
      ],
      "properties": {
        "command": {
          "type": "string",
          "minLength": 1
        },
        "extensionToLanguage": {
          "type": "object",
          "minProperties": 1,
          "propertyNames": {
            "pattern": "^\\."
          },
          "additionalProperties": {
            "type": "string",
            "minLength": 1
          }
        },
        "args": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "transport": {
          "type": "string",
          "enum": [
            "stdio",
            "socket"
          ]
        },
        "env": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        },
        "initializationOptions": {
          "type": "object"
        },
        "settings": {
          "type": "object"
        },
        "workspaceFolder": {
          "type": "string"
        },
        "startupTimeout": {
          "type": "integer",
          "minimum": 1,
          "maximum": 9007199254740991
        },
        "shutdownTimeout": {
          "type": "integer",
          "minimum": 1,
          "maximum": 9007199254740991
        },
        "requestTimeout": {
          "type": "integer",
          "minimum": 1,
          "maximum": 9007199254740991
        },
        "restartOnCrash": {
          "type": "boolean"
        },
        "maxRestarts": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "diagnostics": {
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "lspServers": {
      "description": "`.json` LSP config files, an inline map of server name to config, or an array of either. Claude Code plugin manifest and marketplace references, read 2026-10-05.",
      "anyOf": [
        {
          "type": "string",
          "minLength": 1
        },
        {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/definitions/lspServer"
          }
        },
        {
          "type": "array",
          "items": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1
              },
              {
                "type": "object",
                "additionalProperties": {
                  "$ref": "#/definitions/lspServer"
                }
              }
            ]
          }
        }
      ]
    },
    "commandEntry": {
      "type": "object",
      "description": "One command in the `commands` object map. Exactly one of `source` (a path) or `content` (inline Markdown) is set. Claude Code plugin manifest and marketplace references, read 2026-10-05.",
      "properties": {
        "source": {
          "type": "string",
          "minLength": 1
        },
        "content": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "argumentHint": {
          "type": "string"
        },
        "model": {
          "type": "string"
        },
        "allowedTools": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1
          }
        }
      },
      "oneOf": [
        {
          "required": [
            "source"
          ]
        },
        {
          "required": [
            "content"
          ]
        }
      ],
      "additionalProperties": true
    },
    "commands": {
      "description": "Flat `.md` command files, directories of them, or an object map of command name to `source` or `content`. Claude Code plugin manifest and marketplace references, read 2026-10-05.",
      "anyOf": [
        {
          "type": "string",
          "minLength": 1
        },
        {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1
          }
        },
        {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/definitions/commandEntry"
          }
        }
      ]
    },
    "monitor": {
      "type": "object",
      "description": "One background monitor. A STRICT object in Claude Code. Claude Code plugin manifest and marketplace references, read 2026-10-05.",
      "required": [
        "name",
        "command",
        "description"
      ],
      "properties": {
        "name": {
          "type": "string",
          "minLength": 1
        },
        "command": {
          "type": "string",
          "minLength": 1
        },
        "description": {
          "type": "string",
          "minLength": 1
        },
        "when": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "experimental": {
      "type": "object",
      "description": "Container for `themes`, `monitors` and `evals`, whose manifest shape Claude Code says may still change. Claude Code plugin manifest and marketplace references, read 2026-10-05.",
      "properties": {
        "themes": {
          "$ref": "#/definitions/componentPath"
        },
        "monitors": {
          "anyOf": [
            {
              "type": "string",
              "minLength": 1
            },
            {
              "type": "array",
              "items": {
                "$ref": "#/definitions/monitor"
              }
            }
          ]
        },
        "evals": {
          "$ref": "#/definitions/componentPath"
        }
      },
      "additionalProperties": true
    }
  },
  "type": "object",
  "required": [
    "name"
  ],
  "properties": {
    "name": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*$",
      "description": "The plugin id: letters, digits, `.`, `_` and `-`, starting with a letter or digit, as Claude Code accepts (it recommends kebab-case and warns otherwise). The only required key, and the one a decision record is keyed to. Claude Code plugin manifest and marketplace references, read 2026-10-05."
    },
    "description": {
      "type": "string"
    },
    "version": {
      "type": "string",
      "description": "The plugin's own version. An open string: a plugin is free to version itself however it likes, and a marketplace may pin a different one."
    },
    "author": {
      "$ref": "#/definitions/author"
    },
    "displayName": {
      "type": "string",
      "description": "A human label for a listing. `name` remains the identity."
    },
    "homepage": {
      "type": "string"
    },
    "repository": {
      "$ref": "#/definitions/repository"
    },
    "license": {
      "type": "string"
    },
    "keywords": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1
      }
    },
    "category": {
      "type": "string",
      "description": "Free-form category. A CDF extension on the manifest: Claude Code documents `category` on a marketplace entry only, and strips it from `plugin.json` with a warning. Kept because CDF's decision records key on it; the README names it as not a Claude Code key. Claude Code plugin manifest and marketplace references, read 2026-10-05."
    },
    "metadata": {
      "type": "object",
      "description": "Free-form publisher metadata. Carried, never interpreted."
    },
    "defaultEnabled": {
      "type": "boolean",
      "description": "Whether a host that installs this plugin enables it by default. A hint to the host, never an approval: presence is not approval, and neither is this."
    },
    "skills": {
      "$ref": "#/definitions/componentPath"
    },
    "commands": {
      "$ref": "#/definitions/commands"
    },
    "agents": {
      "$ref": "#/definitions/componentPath"
    },
    "hooks": {
      "$ref": "#/definitions/componentSource"
    },
    "mcpServers": {
      "$ref": "#/definitions/componentSource"
    },
    "lspServers": {
      "$ref": "#/definitions/lspServers"
    },
    "$schema": {
      "type": "string",
      "description": "JSON Schema URL for editor autocomplete. Ignored at load time."
    },
    "icon": {
      "type": "string",
      "minLength": 1,
      "allOf": [
        {
          "not": {
            "pattern": "^/"
          }
        },
        {
          "not": {
            "pattern": "(^|/)\\.\\.(/|$)"
          }
        },
        {
          "not": {
            "pattern": "^~"
          }
        },
        {
          "not": {
            "pattern": "^[A-Za-z]:"
          }
        },
        {
          "not": {
            "pattern": "\\\\"
          }
        }
      ],
      "description": "Path of an image inside the plugin for its listing in Anthropic's directory. Claude Code plugin manifest and marketplace references, read 2026-10-05."
    },
    "documentationUrl": {
      "type": "string",
      "pattern": "^https://",
      "description": "Read by Anthropic's directory from `plugin.json` only; Claude Code ignores it at load time and warns when it appears in a marketplace entry. Claude Code plugin manifest and marketplace references, read 2026-10-05."
    },
    "supportUrl": {
      "type": "string",
      "pattern": "^https://",
      "description": "Read by Anthropic's directory from `plugin.json` only; Claude Code ignores it at load time and warns when it appears in a marketplace entry. Claude Code plugin manifest and marketplace references, read 2026-10-05."
    },
    "privacyPolicyUrl": {
      "type": "string",
      "pattern": "^https://",
      "description": "Read by Anthropic's directory from `plugin.json` only; Claude Code ignores it at load time and warns when it appears in a marketplace entry. Claude Code plugin manifest and marketplace references, read 2026-10-05."
    },
    "termsOfServiceUrl": {
      "type": "string",
      "pattern": "^https://",
      "description": "Read by Anthropic's directory from `plugin.json` only; Claude Code ignores it at load time and warns when it appears in a marketplace entry. Claude Code plugin manifest and marketplace references, read 2026-10-05."
    },
    "dependencies": {
      "$ref": "#/definitions/dependencies"
    },
    "settings": {
      "type": "object",
      "description": "Settings applied while the plugin is enabled; Claude Code honours `agent` and `subagentStatusLine` and drops the rest. Claude Code plugin manifest and marketplace references, read 2026-10-05.",
      "additionalProperties": true
    },
    "userConfig": {
      "$ref": "#/definitions/userConfig"
    },
    "types": {
      "type": "string",
      "minLength": 1,
      "allOf": [
        {
          "not": {
            "pattern": "^/"
          }
        },
        {
          "not": {
            "pattern": "(^|/)\\.\\.(/|$)"
          }
        },
        {
          "not": {
            "pattern": "^~"
          }
        },
        {
          "not": {
            "pattern": "^[A-Za-z]:"
          }
        },
        {
          "not": {
            "pattern": "\\\\"
          }
        }
      ],
      "description": "A `.d.ts` file declaring a mod's `$.state` values and `$` nouns. Claude Code plugin manifest and marketplace references, read 2026-10-05."
    },
    "channels": {
      "type": "array",
      "items": {
        "$ref": "#/definitions/channel"
      }
    },
    "outputStyles": {
      "$ref": "#/definitions/componentPath"
    },
    "workflows": {
      "$ref": "#/definitions/componentPath"
    },
    "themes": {
      "description": "Theme files or directories at the top level. Claude Code still loads this key but warns; `experimental.themes` is the documented place. Claude Code plugin manifest and marketplace references, read 2026-10-05.",
      "anyOf": [
        {
          "type": "string",
          "minLength": 1
        },
        {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1
          }
        }
      ]
    },
    "experimental": {
      "$ref": "#/definitions/experimental"
    },
    "cdf": {
      "$ref": "#/definitions/cdf"
    }
  },
  "additionalProperties": true
}
