GitHub Actions & CI¶
GitHub Actions and the CI workflow of this repository: two composite actions in .github/actions/, and the ci.yml workflow.
The actions are not exercised by this repository's workflows (25/10/2026), and they were not tested from another repository. Both run code from a checkout of this repository:
verify-bundleloadslib/verify.js, which needs the workspace SDK (sdks/typescript) built, andconformance-testrunstools/conformance.jsfrom the workspace, so it only works in a checkout of this repository. To verify bundles in your own pipeline, see Verifying bundles in your project.
Available Actions¶
verify-bundle¶
Verifies a DCP Signed Bundle in a GitHub Actions workflow, using the reference verifier (lib/verify.js). V1 bundles get schema, Ed25519 signature, audit-chain and Merkle checks. Normative V2 bundles (schemas/v2/signed_bundle.schema.json) are schema-validated and then verified by @dcp-ai/sdk: manifest, composite Ed25519 + ML-DSA-65 signature, session binding and audit chain.
It installs the root package of the checkout it runs from (npm install --production, with install errors ignored) and does not build the workspace SDK, so build sdks/typescript in an earlier step. It verifies under the default policy: there is no policy input.
Use only trusted, literal path inputs: the action interpolates them into shell and JavaScript evaluated with eval, rather than passing them as data. Quotes or shell syntax in a path can change the command. Do not derive these inputs from an untrusted pull request, issue or artifact name. The reference CLI example below passes the path as an argument instead.
- uses: ./.github/actions/verify-bundle
with:
bundle-path: "path/to/signed_bundle.json"
public-key-path: "keys/public_key.txt" # Optional
fail-on-invalid: "true"
node-version: "20"
Inputs¶
| Input | Required | Default | Description |
|---|---|---|---|
bundle-path |
Yes | — | Path to the signed bundle JSON file |
public-key-path |
No | — | Path to the expected Ed25519 public key. V1: verify against it (otherwise the key embedded in the bundle is used). V2: pins the bundle's classical signer |
fail-on-invalid |
No | "true" |
Fail the step if the bundle is invalid |
node-version |
No | "20" |
Node.js version |
Outputs¶
| Output | Description |
|---|---|
verified |
"true" or "false" |
errors |
Verification errors (if any) |
Usage Example¶
A sketch for a checkout of this repository (not run for this page): the action and lib/verify.js come from the
checkout, and agent/citizenship_bundle.signed.json and agent/public_key.txt stand for files the operator provides.
name: Verify Agent Bundle
on: [push]
jobs:
verify:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: "20"
- name: Build the workspace SDK (the action does not)
run: (cd sdks/typescript && npm ci && npm run build)
- name: Verify DCP Bundle
id: verify
uses: ./.github/actions/verify-bundle
with:
bundle-path: "agent/citizenship_bundle.signed.json"
public-key-path: "agent/public_key.txt"
- name: Check result
run: echo "Verified: ${{ steps.verify.outputs.verified }}"
conformance-test¶
Runs node tools/conformance.js in the workspace: the repository's V1 + V2 conformance suite, on its own examples. It works only in a checkout of this repository, and its test-dir input is not used.
- uses: ./.github/actions/conformance-test
with:
node-version: "20"
test-dir: "tests/conformance/examples"
Inputs¶
| Input | Required | Default | Description |
|---|---|---|---|
node-version |
No | "20" |
Node.js version |
test-dir |
No | "tests/conformance/examples" |
Not used by the action |
Outputs¶
| Output | Description |
|---|---|
passed |
Whether all tests passed |
summary |
Test summary |
Usage Example¶
A sketch for a checkout of this repository (not run for this page). tools/conformance.js imports @dcp-ai/sdk, so
the workspace SDK is built first:
name: DCP Conformance
on: [push]
jobs:
conformance:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: "20"
- name: Build the workspace SDK (the action does not)
run: (cd sdks/typescript && npm ci && npm run build)
- name: Run Conformance Tests
id: conform
uses: ./.github/actions/conformance-test
- name: Results
run: echo "${{ steps.conform.outputs.summary }}"
CI Workflow¶
The ci.yml workflow runs on pushes to main and on pull requests against any base branch. A changes job detects which parts changed (dorny/paths-filter), and the jobs below run for those parts:
| Job | What it runs |
|---|---|
conformance |
Node.js 20 and 22: npm install, npm run conformance, the S-range tests of tools/crypto.js and the playground, npm run examples:generate:v2, dcp verify-bundle on the V1 and V2 examples (V2 under hybrid_required), and dcp integrity |
typescript-sdk |
sdks/typescript: npm install, npx tsc --noEmit, npm run build, npm run test, coverage |
integrations |
anthropic-mcp, express, google-a2a, openclaw: build the workspace SDK, npm ci, build, vitest run |
cli |
Node.js 20 and 22: build the workspace SDK, install it into cli/, the CLI tests and their negative control, and a check of the packed files |
python-sdk |
Python 3.12: pip install -e ".[dev]", pytest with coverage |
go-sdk |
Go from sdks/go/go.mod: go build ./..., go test with coverage |
rust-sdk |
Rust stable: cargo build, cargo build --features otlp, coverage, cargo test --all-features, a wasm32-unknown-unknown build of the tests |
wasm-sdk |
Rust stable and wasm-pack: npm run build:wasm, npm test in sdks/wasm |
Other workflows cover the canonicalization candidate matrix and lab, the contracts, differential fuzzing, the interop matrix, labels, and publishing (npm, PyPI, Docker images, integrations, templates). Two cover the documentation, and neither translates anything automatically: i18n-sync.yml ("Documentation and i18n") checks, on pull requests and on pushes to main that touch Markdown or the documentation tooling, the coverage, reviewed hashes, structure and links of the five languages, runs the positive and negative controls of that gate and builds the site in the five languages; docs.yml builds the same site on main and deploys it to GitHub Pages.
To run the same documentation checks locally, see Documentation and translations in CONTRIBUTING.md:
pip install 'mkdocs==1.6.*' 'mkdocs-material==9.5.*' 'pymdown-extensions==10.*'
python3 scripts/docs_i18n.py check
python3 -m unittest discover -s scripts -p 'test_docs*.py' -v
bash scripts/build-docs-site.sh
Verifying bundles in your project¶
A sketch that verifies a bundle with the reference CLI of a pinned checkout (not run for this page). dcp verify-bundle exits 0 when the bundle verifies and non-zero otherwise, and reads files only under the current directory:
# .github/workflows/dcp.yml
name: DCP Verification
on: [push, pull_request]
jobs:
verify:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v4
with:
repository: dcp-ai-protocol/dcp-ai
ref: <full commit SHA you have reviewed>
path: dcp-ai
- uses: actions/setup-node@v4
with:
node-version: "22"
- name: Build the reference verifier
run: |
(cd dcp-ai/sdks/typescript && npm ci && npm run build)
(cd dcp-ai && npm install)
- name: Verify the agent's bundle
run: node dcp-ai/bin/dcp.js verify-bundle --policy hybrid_required my-agent/bundle.signed.json
A verified bundle is intact and signed by the keys it names; to accept bundles only from principals you trust, use admission (dcp admit-bundle, see docs/ADMISSION.md).
License¶
Apache-2.0