Operator Guide — Running a Verification Service¶
This guide is for third parties who want to run an "agent verified" service: an HTTP API that verifies DCP Signed Bundles (and optionally anchors hashes to a blockchain). The protocol does not require any central server; verification can always be done locally with dcp verify-bundle. This service is optional and is run at the operator's choice.
What is an "agent verified" service?¶
An agent verification service is an HTTP API that:
- Verifies a Signed Bundle: runs the same normative checklist as spec/VERIFICATION.md (schema validation, signature, intent_hash, audit chain, optional merkle_root).
- Optionally checks an
anchor_receiptagainst a public blockchain or transparency log (using public data only). - Optionally anchors a
bundle_hashto an existing chain and returns ananchor_receiptto the client.
The service is stateless: each request receives a bundle (and optionally a public key), verifies it, and returns a result. No central registry of agents; the protocol does not define a canonical URL (e.g. no mandatory "dcp.ai" endpoint).
Who runs it?¶
Third parties. Anyone can deploy this service using this repo (schemas + spec + CLI or programmatic API). The protocol author does not operate a central verification server.
Requirements¶
- This repo (or the published npm package): schemas in
schemas/v1/, spec inspec/. - Ability to run verification: either the CLI (
dcp verify-bundle) or the programmatic API (verifySignedBundle,validateBundle) from the repo. - Optional, for anchoring: RPC or block explorer access to an existing chain (Bitcoin, Ethereum, or a transparency log). See STORAGE_AND_ANCHORING.md.
Suggested API contract¶
So that clients and operators can interoperate, this section suggests a minimal contract. Implementations may extend it.
POST /verify¶
Verifies a Signed Bundle against the normative checklist (schema, signature, intent_hash, audit chain, optional merkle).
- Request (JSON):
signed_bundle(object): the Signed Bundle to verify.-
public_key_b64(string, optional): if the bundle does not include the signer's public key, provide it here. Otherwise the bundle'ssignature.signer.public_key_b64is used. -
Response (JSON):
verified(boolean):trueif all checks pass.errors(array of strings, optional): ifverifiedisfalse, human-readable error messages.
Example:
// Request
{ "signed_bundle": { "bundle": { ... }, "signature": { ... } } }
// Response (success)
{ "verified": true }
// Response (failure)
{ "verified": false, "errors": ["SIGNATURE INVALID", "Hint: Check that the public key ..."] }
POST /anchor (optional)¶
Anchors a bundle_hash to a chain and returns an anchor_receipt. The operator configures chain and credentials (e.g. wallet, RPC URL). See STORAGE_AND_ANCHORING.md for receipt format.
- Request (JSON):
bundle_hash(string): e.g.sha256:<hex>.-
chain(string): e.g."bitcoin","ethereum". -
Response (JSON):
anchor_receipt(object): e.g.{ "chain": "bitcoin", "tx_id": "...", "block_height": N }or Ethereum-style fields.
Implementation of /anchor depends on the operator's chain and tooling (Bitcoin OP_RETURN, Ethereum contract event, etc.).
Deployment¶
- Runtime: Node.js (or any environment that can run the verification logic).
- No database required: the service is stateless; each request verifies the provided bundle.
- Environment variables (suggested):
PORT: HTTP port (e.g.3000).- Optional, for anchoring:
ANCHOR_CHAIN_RPC,ANCHOR_WALLET_KEY, etc., depending on the chain.
Steps:
- Clone or depend on this repo (or
npm install dcp-aiif published). - Use the programmatic API:
import { verifySignedBundle, validateBundle } from 'dcp-ai'(when installed via npm), or from../lib/verify.jswhen running from this repo; or shell out todcp verify-bundlefor each request. - Expose POST
/verify(and optionally POST/anchor). - Deploy behind your preferred reverse proxy and TLS.
Optional: use the reference server in server/ (see server/README.md) as a starting point, or build your own with Express/Fastify/etc.
Blockchain and verification¶
- Verification only: The service can limit itself to POST
/verify, applying the full VERIFICATION.md checklist (schema, signature, intent_hash, audit chain, merkle). No blockchain needed. - Verify anchor_receipt: If the client sends an
anchor_receiptwith the bundle, the service can optionally check thatbundle_hashappears at the given chain/log index using public data only (e.g. fetch tx from block explorer). No central server of the protocol is involved. - Anchor (write): The operator runs a node or uses RPC and writes hashes to an existing chain; the service returns
anchor_receiptto the client. This is optional and operator-specific.
V2.0 Verification Service¶
DCP v2.0 introduces post-quantum hybrid cryptography, adaptive security tiers, and composite signatures. Operators running verification services must update their configuration to support V2.
Verifier Policy Configuration¶
The V2.0 verification server supports configurable policies via VerifierPolicy:
{
"default_mode": "hybrid_preferred",
"risk_overrides": {
"low": "classical_only",
"medium": "hybrid_preferred",
"high": "hybrid_required"
},
"min_accepted_version": "1.0",
"accepted_algorithms": {
"signing": ["ed25519", "ml-dsa-65", "ml-dsa-87"],
"hash": ["sha256", "sha3-256"]
}
}
Verification modes:
- classical_only — Only Ed25519 signatures required (V1 compatibility)
- hybrid_preferred — Ed25519 required, ML-DSA-65 checked if present
- hybrid_required — Both Ed25519 and ML-DSA-65 composite signature required
- pq_only — Only post-quantum signature required (future)
POST /verify (V2)¶
V2 bundles include composite_sig with both classical and post-quantum components:
{
"signed_bundle": {
"bundle": {
"dcp_bundle_version": "2.0",
"manifest": {
"session_nonce": "a1b2c3...",
"rpr_hash": "sha256:...",
"passport_hash": "sha256:...",
"intent_hash": "sha256:...",
"policy_hash": "sha256:...",
"audit_merkle_root": "sha256:...",
"audit_merkle_root_secondary": "sha3-256:..."
},
"responsible_principal_record": { "payload": {...}, "composite_sig": {...} },
"agent_passport": { "payload": {...}, "composite_sig": {...} },
"intent": { "payload": {...}, "composite_sig": {...} },
"policy_decision": { "payload": {...}, "composite_sig": {...} }
},
"signature": {
"composite_sig": {
"classical": { "alg": "ed25519", "kid": "...", "sig_b64": "..." },
"pq": { "alg": "ml-dsa-65", "kid": "...", "sig_b64": "..." },
"binding": "pq_over_classical"
}
}
}
}
V2 response includes the resolved security tier:
{
"verified": true,
"version": "2.0",
"resolved_tier": "elevated",
"checks": {
"schema": "pass",
"classical_sig": "pass",
"pq_sig": "pass",
"manifest_integrity": "pass",
"hash_chain": "pass",
"session_nonce": "pass"
}
}
Security Tiers in Verification¶
The verification service respects and enforces security tiers:
| Tier | Verification Mode | PQ Checkpoint | Bundle Size |
|---|---|---|---|
| Routine | classical_only |
Every 50 events | ~1-2 KB |
| Standard | hybrid_preferred |
Every 10 events | ~2-5 KB |
| Elevated | hybrid_required |
Every event | ~10-15 KB |
| Maximum | hybrid_required + verify checkpoint |
Every event | ~15-25 KB |
The verifier can upgrade a tier (e.g., force elevated for financial operations) but MUST NOT downgrade it.
Capabilities Endpoint (V2)¶
V2 services expose GET /.well-known/dcp-capabilities.json:
{
"supported_versions": ["1.0", "2.0"],
"supported_algs": {
"signing": ["ed25519", "ml-dsa-65", "ml-dsa-87", "slh-dsa-192f"],
"kem": ["x25519-ml-kem-768"],
"hash": ["sha256", "sha3-256"]
},
"supported_wire_formats": ["json", "cbor"],
"features": {
"composite_signatures": true,
"pq_checkpoints": true,
"dual_hash_chains": true,
"a2a_protocol": true,
"emergency_revocation": true,
"lifecycle_management": true,
"digital_succession": true,
"dispute_resolution": true,
"rights_framework": true,
"personal_representation": true
}
}
Observability¶
V2 services should expose metrics for monitoring:
- Latency: p50/p95/p99 verification latency by security tier
- Throughput: Bundles verified per second
- Cache: Verification cache hit/miss ratio
- PQ Checkpoints: Number of PQ checkpoints verified
- Errors: Error counts by DCP error code (DCP-E001 through DCP-E902)
- Tiers: Distribution of verification requests by security tier
Recommended: Use the SDK's built-in dcpTelemetry module with OpenTelemetry-compatible exporters.
Migration for Existing V1 Operators¶
Existing V1 operators can upgrade incrementally:
- Update to DCP v2.0 SDK
- Set
default_mode: 'classical_only'(identical to V1 behavior) - Gradually enable
hybrid_preferredfor new agents - Move to
hybrid_requiredwhen PQ adoption is sufficient
See MIGRATION_V1_V2.md for detailed migration steps.
DCP-05–09 Service Endpoints¶
DCP v2.0 extends the verification server with 31 endpoints for lifecycle management, digital succession, dispute resolution, rights framework, and personal representation.
DCP-05: Agent Lifecycle Management¶
| Method | Endpoint | Description |
|---|---|---|
| POST | /v2/lifecycle/commission |
Commission a new agent (creates commissioning certificate) |
| GET | /v2/lifecycle/commission/:id |
Retrieve a commissioning certificate |
| POST | /v2/lifecycle/vitality |
Submit a vitality report |
| GET | /v2/lifecycle/vitality/:agent_id |
Get latest vitality report for an agent |
| POST | /v2/lifecycle/decommission |
Record agent decommissioning |
| GET | /v2/lifecycle/decommission/:id |
Retrieve a decommissioning record |
| POST | /v2/lifecycle/transition |
Execute a lifecycle state transition (enforces state machine) |
Valid lifecycle transitions: commissioned → active, active → declining, active → decommissioned, declining → decommissioned.
DCP-06: Digital Succession & Inheritance¶
| Method | Endpoint | Description |
|---|---|---|
| POST | /v2/succession/testament |
Register a digital testament |
| GET | /v2/succession/testament/:id |
Retrieve a digital testament |
| POST | /v2/succession/record |
Record a succession event |
| GET | /v2/succession/record/:id |
Retrieve a succession record |
| POST | /v2/succession/memory-transfer |
Submit a memory transfer manifest |
| GET | /v2/succession/memory-transfer/:id |
Retrieve a memory transfer manifest |
DCP-07: Conflict Resolution & Dispute Arbitration¶
| Method | Endpoint | Description |
|---|---|---|
| POST | /v2/dispute/record |
File a dispute record |
| GET | /v2/dispute/record/:id |
Retrieve a dispute record |
| POST | /v2/dispute/arbitration |
Submit an arbitration resolution |
| GET | /v2/dispute/arbitration/:id |
Retrieve an arbitration resolution |
| POST | /v2/dispute/jurisprudence |
Register a jurisprudence bundle |
| GET | /v2/dispute/jurisprudence/:id |
Retrieve a jurisprudence bundle |
| POST | /v2/dispute/objection |
File an objection record |
| GET | /v2/dispute/objection/:id |
Retrieve an objection record |
DCP-08: Rights & Obligations Framework¶
| Method | Endpoint | Description |
|---|---|---|
| POST | /v2/rights/declaration |
Submit a rights declaration |
| GET | /v2/rights/declaration/:id |
Retrieve a rights declaration |
| POST | /v2/rights/obligation |
Record an obligation |
| GET | /v2/rights/obligation/:id |
Retrieve an obligation record |
| POST | /v2/rights/violation |
Report a rights violation |
| GET | /v2/rights/violation/:id |
Retrieve a violation report |
DCP-09: Personal Representation & Delegation¶
| Method | Endpoint | Description |
|---|---|---|
| POST | /v2/delegation/mandate |
Create a delegation mandate |
| GET | /v2/delegation/mandate/:id |
Retrieve a delegation mandate |
| POST | /v2/delegation/advisory |
Submit an advisory declaration |
| GET | /v2/delegation/advisory/:id |
Retrieve an advisory declaration |
| POST | /v2/delegation/mirror |
Register a principal mirror |
| GET | /v2/delegation/mirror/:id |
Retrieve a principal mirror |
| POST | /v2/delegation/interaction |
Record an interaction |
| GET | /v2/delegation/interaction/:id |
Retrieve an interaction record |
| POST | /v2/awareness/threshold |
Configure an awareness threshold |
| GET | /v2/awareness/threshold/:id |
Retrieve an awareness threshold |
Production Hardening¶
All DCP-05–09 endpoints include:
- JSON Schema validation — Every POST request is validated against its corresponding schema before storage
- Rate limiting — 100 requests/minute/IP on all POST endpoints
- Body size limits — 1 MB maximum request body (returns 413)
- Input ID validation — All IDs must match
^[\w:.\-]{1,256}$(blocks injection attacks) - Bounded storage — In-memory stores capped at 10,000 entries with FIFO eviction
- Security headers — X-Content-Type-Options, X-Frame-Options, Strict-Transport-Security, Cache-Control
Reference¶
- Verification checklist: spec/VERIFICATION.md
- Storage and anchoring: STORAGE_AND_ANCHORING.md
- Bundle format: spec/BUNDLE.md