{
  "schema": "aaes/capability-pack/1",
  "provider": "circleci",
  "version": "1.0.0",
  "description": "CircleCI cloud (API v2): read a project, list pipelines, workflows and jobs, trigger a pipeline, and approve a pending approval job.",
  "notes": "The registered host is circleci.com (CircleCI cloud). Self-hosted CircleCI server installations use an installer-specific host: substituting it into the endpoints, the resource locator and the egress allowlist is a pack change that requires re-review before enablement. PROJECT_SLUG, PIPELINE_ID, WORKFLOW_ID and APPROVAL_REQUEST_ID in the endpoint paths are placeholders the deployment binds to concrete values per request target (PROJECT_SLUG is the vcs-slug/org-name/repo-name triple, for example gh/example-org/example-repo); the registered paths do not change.\n\nThis pack registers only endpoints the public CircleCI API v2 documentation and its published OpenAPI specification describe: reading one project, listing a project's pipelines, listing a pipeline's workflows, listing a workflow's jobs, triggering a pipeline, and approving a pending approval job.\n\nDocumented exclusions: the newer recommended pipeline-run endpoint (which the provider documents as superseding the registered trigger), pipeline continuation, workflow rerun and cancel, job cancel, schedule and trigger management, contexts, environment variables, project settings, checkout keys, webhooks, organization administration, and every endpoint outside the registered list; each addition is a pack change and requires its own review.\n\nIntegration scope of the registered trigger: CircleCI's published OpenAPI specification states that the registered legacy trigger does not support triggering pipelines integrated with GitLab or GitHub App, and that it is superseded by a newer pipeline-run endpoint supporting pipeline definitions whose config source is github_app, github_server, github_oauth, bitbucket_dc or bitbucket_oauth — that is, all organization and pipeline types except GitLab, which neither documented trigger serves.\n\nThe registered legacy trigger therefore fits projects on the GitHub OAuth app and Bitbucket Cloud integrations, and a well-formed PROJECT_SLUG alone does not establish compatibility — confirm the project's integration type in the CircleCI web app before enabling.\n\nApproval classification: reads sit at the minimum R0 tier. pipeline.trigger is registered as deploy at the minimum R3 tier because CircleCI documents that the request body lets the caller choose the branch or tag and pass pipeline parameters, and CircleCI pipelines commonly perform deployments — deploy is one of the designated actions requiring human approval. job.approve is registered as approve at the minimum R3 tier because an approval job is the documented gate before protected continuation of a workflow, commonly a deployment, and the approval is recorded under the caller's identity — approve is one of the designated actions requiring human approval. AAES has not been certified by CircleCI; review and test this configuration; it is not a vendor guarantee.",
  "credential": {
    "secret_ref_id": "secret-ref-circleci-personal-api-token",
    "custody": "customer_vault",
    "inject": "header",
    "inject_name": "Circle-Token",
    "note": "A CircleCI personal API token, held in the client's own secret manager. The stored material must be the complete Circle-Token header value: the token itself, with no scheme prefix added. CircleCI documents the Circle-Token header as the primary API v2 authentication, and also accepts RFC 6750 bearer and HTTP Basic (token as username, blank password) forms; the query-parameter form is deprecated and must not be used.\n\nCircleCI documents that personal API tokens grant full read and write access as the owning user with no scope reduction available, and that project API tokens are not supported on API v2 — so the only least-privilege control available is a dedicated token on an account with the minimum project access, and nothing broader; review that account's permissions before enabling. CircleCI documents no token expiry: deleting the token in user settings is the revocation path and invalidates that issued token, and rotation means deleting and recreating it.\n\nRenewal ownership sits with an external deployment process: the executor injects the stored value verbatim and performs no token lifecycle itself, and it must never substitute a different credential without an approved pack change.\n\nExecutor hygiene: the value must live only in executor memory for the lifetime of a call, must never be written to logs, traces or diagnostics, and must not appear in crash dumps; a deployment that cannot meet that bar must not enable the pack."
  },
  "capabilities": [
    {
      "capability_id": "circleci.project.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "circleci.com"
      ],
      "endpoint": "https://circleci.com/api/v2/project/PROJECT_SLUG",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-circleci-personal-api-token",
      "inject": "header",
      "inject_name": "Circle-Token",
      "actions": [
        "read"
      ],
      "resource_id": "circleci-project",
      "description": "Read one project's record via GET /api/v2/project/PROJECT_SLUG. This pack does not register project listing, so this is a record read addressed by the caller-supplied slug — project settings, environment variables, and checkout keys are not registered by this pack. PROJECT_SLUG is a placeholder the deployment binds to a concrete project before enabling.",
      "requires_review": true
    },
    {
      "capability_id": "circleci.pipelines.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "pii",
      "egress_allowlist": [
        "circleci.com"
      ],
      "endpoint": "https://circleci.com/api/v2/project/PROJECT_SLUG/pipeline",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-circleci-personal-api-token",
      "inject": "header",
      "inject_name": "Circle-Token",
      "actions": [
        "read"
      ],
      "resource_id": "circleci-project",
      "description": "List pipelines for one project via GET /api/v2/project/PROJECT_SLUG/pipeline.\n\nThe registered path covers the collection read only — single pipeline records and pipeline configuration reads are not registered by this pack. PROJECT_SLUG is a placeholder the deployment binds to a concrete project before enabling.",
      "requires_review": true
    },
    {
      "capability_id": "circleci.workflows.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "circleci.com"
      ],
      "endpoint": "https://circleci.com/api/v2/pipeline/PIPELINE_ID/workflow",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-circleci-personal-api-token",
      "inject": "header",
      "inject_name": "Circle-Token",
      "actions": [
        "read"
      ],
      "resource_id": "circleci-project",
      "description": "List the workflows of one pipeline via GET /api/v2/pipeline/PIPELINE_ID/workflow.\n\nThe registered path covers the collection read only — single workflow records are not registered by this pack. PIPELINE_ID is a placeholder the deployment binds to a concrete pipeline before enabling.",
      "requires_review": true
    },
    {
      "capability_id": "circleci.jobs.read",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R0",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "circleci.com"
      ],
      "endpoint": "https://circleci.com/api/v2/workflow/WORKFLOW_ID/job",
      "method": "GET",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-circleci-personal-api-token",
      "inject": "header",
      "inject_name": "Circle-Token",
      "actions": [
        "read"
      ],
      "resource_id": "circleci-project",
      "description": "List the jobs of one workflow via GET /api/v2/workflow/WORKFLOW_ID/job.\n\nThe registered path covers the collection read only — single job records, test metadata, and artifacts are not registered by this pack. WORKFLOW_ID is a placeholder the deployment binds to a concrete workflow before enabling.",
      "requires_review": true
    },
    {
      "capability_id": "circleci.pipeline.trigger",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R3",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "circleci.com"
      ],
      "endpoint": "https://circleci.com/api/v2/project/PROJECT_SLUG/pipeline",
      "method": "POST",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-circleci-personal-api-token",
      "inject": "header",
      "inject_name": "Circle-Token",
      "actions": [
        "deploy"
      ],
      "resource_id": "circleci-project",
      "description": "Start a pipeline for one project with POST /api/v2/project/PROJECT_SLUG/pipeline. The caller selects a branch or tag and supplies pipeline parameters. Pipelines may deploy changes, consume credits, and produce effects this pack cannot undo.\n\nCompatibility: this is CircleCI’s superseded legacy trigger, for GitHub OAuth app and Bitbucket Cloud projects; the slug’s version-control component is gh or bb. It does not support GitLab or GitHub App pipelines. Confirm the project’s integration type in CircleCI before enabling; a valid slug alone is insufficient.\n\nThe newer pipeline-run endpoint is excluded. Its documented config sources are github_app, github_server, github_oauth, bitbucket_dc, and bitbucket_oauth; neither documented trigger supports GitLab.\n\nClassification: deploy, minimum R3, because a triggered pipeline can perform deployments.\n\nOn supported AAES-mediated execution paths, an authorized person must approve the action. This cannot stop observation-only or bypass calls. Bind PROJECT_SLUG before enabling.",
      "requires_review": true
    },
    {
      "capability_id": "circleci.job.approve",
      "version": "1.0.0",
      "kind": "tool",
      "risk_tier": "R3",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN",
      "data_class": "internal",
      "egress_allowlist": [
        "circleci.com"
      ],
      "endpoint": "https://circleci.com/api/v2/workflow/WORKFLOW_ID/approve/APPROVAL_REQUEST_ID",
      "method": "POST",
      "connector": "http",
      "custody": "customer_vault",
      "secret_ref_id": "secret-ref-circleci-personal-api-token",
      "inject": "header",
      "inject_name": "Circle-Token",
      "actions": [
        "approve"
      ],
      "resource_id": "circleci-project",
      "description": "Approve a pending approval job with POST /api/v2/workflow/WORKFLOW_ID/approve/APPROVAL_REQUEST_ID. This records approval under the caller’s identity and opens the gate for protected workflow continuation, commonly a deployment. No endpoint in this pack can withdraw it, so the pack makes no general reversibility claim.\n\nClassification: approve, minimum R3.\n\nOn supported AAES-mediated execution paths, an authorized person must approve the irreversible action. This cannot stop observation-only or bypass calls. Bind WORKFLOW_ID and APPROVAL_REQUEST_ID before enabling.",
      "requires_review": true
    }
  ],
  "resources": [
    {
      "resource_id": "circleci-project",
      "kind": "api",
      "locator": "https://circleci.com/api/v2/project/PROJECT_SLUG",
      "data_class": "pii",
      "owner": "REPLACE-WITH-ACCOUNTABLE-HUMAN"
    }
  ],
  "review": {
    "state": "library",
    "date": "2026-09-22",
    "sources": [
      "https://circleci.com/docs/api/v2/ (retrieved 2026-09-21)",
      "https://circleci.com/api/v2/openapi.json (retrieved 2026-09-21)",
      "https://circleci.com/docs/managing-api-tokens/ (retrieved 2026-09-21)",
      "https://circleci.com/docs/triggers-overview/ (retrieved 2026-09-21)"
    ],
    "reviewer_id": "aaes-eng"
  }
}
