Open specification

Agent Manifest 1.0 and the A0–A5 autonomy scale

The format an agent’s operator uses to declare what the agent may do, what it is expressly forbidden to do and at which autonomy level it runs; the credential that carries that declaration; and the eight checks anyone can run against it. Published so that the format outlives any single implementation, including ours.

Version

1.0

Specification and schema

CC BY 4.0

Reference code

Apache-2.0

The bundle carries MANIFEST.sha256: unpack it and run sha256sum -c MANIFEST.sha256 to check that nothing has been touched.

01

What this defines, and what it does not

Four things: the manifest, the A0–A5 scale, the credential and verification. Plus an explicit list of what a conforming credential does not attest.

  1. The manifest — the declared document and its canonical hash.
  2. The A0–A5 scale — graded, so that two operators mean the same thing by A3.
  3. The credential — how the manifest travels inside a W3C Verifiable Credential 2.0, with the boundResources and killSwitch claims.
  4. Verification — the eight checks, in order, and what each one proves.

It deliberately does not define how credentials are issued operationally, how a revocation cascade is executed, or what a particular implementation charges. Those belong to an implementation, and CORTEX Seal’s own answers are published separately in its trust framework.

02

The manifest

A JSON object describing exactly one agent. It is the exact object the hash is computed over.

FieldTypeRequiredMeaning
schemastringnoIdentifier of this schema version. Enters the hash.
namestringyesThe agent’s public name.
rolestringyesWhat the agent does, in one line.
missionstringnoThe agent’s objective, in prose.
operatorobjectyesOrganisation answering for it: legalName, registryCode, jurisdiction.
autonomyMaxenumyesOne of A0…A5. Section 03.
skillsstring[]yesActions the agent is authorised to perform.
prohibitedstring[]yesExpressly forbidden actions. May be empty; may not be omitted.
toolsstring[]noTools and scopes, for example crm:write.
dataScopestring[]noData sets it may reach.
channelsstring[]noChannels it operates on.
limitsobjectnomaxRiskWithoutApproval, maxTransactionEur, humanEscalation.
bindingsHashstringnoHash over the linked resources. Section 05.
A minimal valid manifest
{
  "schema": "https://digitalcortex.tech/schemas/agent-manifest/1.0",
  "name": "Soporte",
  "role": "First-line customer support",
  "operator": { "legalName": "ACME Robotics S.L.", "registryCode": "B12345678", "jurisdiction": "ES" },
  "autonomyMax": "A2",
  "skills": ["ticket.read", "ticket.reply"],
  "prohibited": ["payment.execute", "data.delete"]
}

Three checks a JSON Schema validator cannot express on its own: a skill present in both skills and prohibited is a contradiction and must be rejected; autonomyMax must be consistent with the declared skills, because an agent declaring A0 cannot list a skill that writes; and operator.jurisdiction must be an ISO 3166-1 alpha-2 code.

03

Canonical form and the hash

manifestHash = sha256(canonicalJson(manifest)), lowercase hexadecimal.

canonicalJson is a recursive serialisation with each object’s keys sorted by code point, no insignificant whitespace, and keys whose value is undefined removed. It is not a plain JSON.stringify: two semantically identical manifests must produce the same bytes, or the hash stops being a useful binding.

Reference implementation
function canonical(value) {
  if (Array.isArray(value)) return '[' + value.map(canonical).join(',') + ']';
  if (value && typeof value === 'object') {
    const keys = Object.keys(value).filter((k) => value[k] !== undefined).sort();
    return '{' + keys.map((k) => JSON.stringify(k) + ':' + canonical(value[k])).join(',') + '}';
  }
  return JSON.stringify(value === undefined ? null : value);
}

04

The A0–A5 autonomy scale

A graded scale, not a boolean. The point of publishing it is that two operators mean the same thing by A3.

LevelNameDefinition
A0ObserveReads and records. Produces no output directed at third parties.
A1AnalyseProduces analysis and recommendations for people to act on. Takes no action itself.
A2PrepareDrafts and stages work — messages, documents, changes — without sending or executing it.
A3Execute internallyActs on the operator’s own systems, with no effect outside them.
A4Execute with human approvalActs outside the perimeter, with a named human approving each action of that class. The highest level attainable.
A5ForbiddenA class of vetoed actions: autonomous movement of money, deleting audit records, escalating privileges.

autonomyMax declares the ceiling, not the usual operating level: an agent declared A4 may spend most of its life doing A1 work. What the declaration says is that it will not go above A4 without a new manifest. A5 is never a valid value for `autonomyMax` in an implementation following this specification: it names the class of actions no agent may take, and it belongs in prohibited.

05

The credential and its claims

A W3C Verifiable Credential 2.0 secured with VC-JOSE-COSE: a compact JWS with typ vc+jwt and algorithm ES256, whose payload is the credential itself.

Both the VC 2.0 data model and the Bitstring Status List v1.0 have been W3C Recommendations since 15 May 2025. The JWS header carries a kid pointing at a verification method in the issuer’s DID document; a verifier that does not recognise that kid’s DID must fail at step 2 and go no further.

credentialSubject claimMeaning
idThe agent’s DID.
autonomyLevelThe level granted by this credential, at or below the manifest’s autonomyMax.
manifestHashThe binding. Section 03.
manifestVersionThe manifest version it was issued against.
scope{ skills[], prohibited[], maxRiskWithoutApproval, domains[], maxTransactionEur }.
boundResourcesThe resources the agent carries, as hashed references only. Below.
mcpServersTool servers the agent declares it uses, where applicable.
killSwitchStop coverage and its limits. Below.
principalThe legal person answering for it: organisation and role, never a natural person.
disclosurePlain-language statement that this is an AI system and not a person, with the verification URL.
boundResources and killSwitch
"boundResources": [
  { "ref": "sha256:1a7b…", "provider": "openai", "type": "API_KEY",
    "revocationMethod": "WEBHOOK", "irreversible": false, "failOpen": false }
],
"killSwitch": {
  "coverage": { "total": 4, "revocable": 3, "irreversible": 1 },
  "methods": ["STOP_ISSUANCE", "WEBHOOK", "PROVIDER_API"],
  "graceSecondsMax": 900,
  "dualApprovalRequired": true,
  "bestEffort": true
}
  1. Only hashed references travel. ref = sha256(salt ‖ provider ‖ externalId), with the salt per workspace. Never the secret, never the hash of the secret alone — with a small key space that would be an oracle — and never the provider’s identifier.
  2. `bindingsHash` enters the manifest. Adding or removing a linked resource therefore changes manifestHash and invalidates the live credential. That is correct: if the agent’s hands change, its identity document changes.
  3. `failOpen` is declared, not hidden. Its state lives inside the signed credential precisely so a third party can check it without asking anyone.
  4. `bestEffort: true` is mandatory whenever any method beyond STOP_ISSUANCE appears. An implementation may stop issuing its own tokens and publish a revoked status; what it cannot do is promise that a third party’s system executes anything.

Revocation is published with a W3C Bitstring Status List v1.0, itself served as a JWS signed with the same issuer key. A verifier must fetch the list referenced by credentialStatus.statusListCredential, verify its signature, confirm its id matches what the credential references, and read the bit at statusListIndex.

06

Verification, in eight steps

In order. Each step assumes the previous one passed.

#CheckWhat it provesWhat it does not prove
1formatThe token is a compact JWS with typ=vc+jwt and a kid pointing at a verification method.Nothing about who signed it.
2keyDeclaredThe kid resolves to a key the issuer declares in assertionMethod of its published DID document.That the key is uncompromised.
3signatureThe ES256 signature over the token verifies against that public key.That the content is true.
4issuerMatchThe issuer.id inside the credential is the same DID that signed it.That the issuer is trustworthy — that is the verifier’s decision.
5validityvalidFrom ≤ now ≤ validUntil.That the credential was not revoked.
6revocationThe signed list is the one the credential names and the bit at its index is zero.That the list is fresh beyond its stated cache window.
7manifestBindingThe credential’s manifestHash equals the hash of the manifest the agent publishes now.That the manifest describes the agent honestly.
8scopeA specific action is in skills, is not in prohibited, and its risk is at or below maxRiskWithoutApproval.That the action will be carried out as declared.

An implementation may add checks; a DID-document resolution check on the subject is common. A subject DID document served live is a discovery resource, not a trust one: cryptographic verification resolves the issuer’s document.

07

Lifecycle

From declaration to end of service, with what happens to already-issued credentials written down in advance.

StageRule
DeclarationThe operator writes the manifest and publishes a version. The hash is computed on publication.
IssuanceThe credential is issued against one manifest version. Issuance is idempotent per operation key: a retry must not consume a second revocation index.
Validity90 days in the reference implementation. Rotation re-issues against the same manifest and produces a new credential with a new status index.
Change of scopePublishing a new version changes the hash. The live credential stops matching at step 7 and must be re-issued. The implementation must warn at publication time rather than letting it be discovered in the verifier.
RevocationSets the bit in the status list. The reason is mandatory: a revocation with no reason is not auditable. Publicly visible within 60 s in the reference implementation.
ExpiryAn expired credential fails at step 5. Expiry is not revocation and must be reported differently.
SupersededA credential replaced by a newer one for the same agent. It stays cryptographically valid until it expires or is revoked; a verifier should indicate which one is current.
End of serviceIssued credentials are not retroactively revoked merely because a commercial relationship ended, because third parties rely on them. The status of every credential ever issued stays in the list, for the historical integrity of the verification system.

08

Conformance

Five conditions, and a warning about what conformance is not.

  1. It accepts and produces manifests valid against agent-manifest-1.0.json.
  2. It computes manifestHash as defined in section 03, byte for byte.
  3. It uses the A0–A5 scale with the definitions of section 04, and never issues autonomyMax: "A5".
  4. It issues credentials in the format of section 05, with bestEffort: true whenever a kill switch claim names any method beyond STOP_ISSUANCE.
  5. It performs the checks of section 06 in order, reports the third outcome of step 8 distinctly, and states plainly what it does not attest, per section 01.

09

Licences and trade marks

The specification is free to use. The brand is not part of it, and that separation is deliberate.

  • This text and the JSON Schema: Creative Commons Attribution 4.0 International. Attribution: “Agent Manifest 1.0, Cosmolabs OÜ, CC BY 4.0”.
  • The reference code, including the official SDKs: Apache License 2.0.
  • Trade marks: CORTEX Seal, the logo and the seal artwork are trade marks of Cosmolabs OÜ, trade mark application pending, and are expressly excluded from both licences.

10

Versioning

Semantic, and slow on purpose.

  • A change that would invalidate an existing manifest is a major version.
  • Adding an optional field is a minor version.
  • Clarifying prose is a patch.

Because the schema identifier enters the hash, a new major version means new hashes. Implementations should keep validating old versions rather than migrating credentials that were correct when they were issued.