Manifest v2 is the contract
Every blueprint carries an ai-automation/nemu.manifest.json file plus workflow and step documents. The manifest names the blueprint, declares inputs, lists services, orders agent steps, and states the final verification command.
Nemu Blueprint Manifest v2
Rendered from the same MANIFEST_SCHEMA_V2 export used by the validator.
Required manifest fields
schema_versionblueprintprovenanceinputsservicesstepsverify_e2e
Top-level properties
schema_versionblueprintprovenanceinputsdeclared_hostsservicesstepsverify_e2e
Raw MANIFEST_SCHEMA_V2 JSON
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://nemu.ae/schemas/manifest-v2.json",
"title": "Nemu Blueprint Manifest v2",
"type": "object",
"additionalProperties": false,
"required": [
"schema_version",
"blueprint",
"provenance",
"inputs",
"services",
"steps",
"verify_e2e"
],
"properties": {
"schema_version": {
"const": "2"
},
"blueprint": {
"type": "object",
"additionalProperties": false,
"required": [
"slug",
"name",
"category",
"tags",
"description",
"license"
],
"properties": {
"slug": {
"type": "string",
"pattern": "^[a-z0-9]+(?:[-_][a-z0-9]+)*$"
},
"name": {
"type": "string",
"minLength": 1,
"pattern": "\\S"
},
"category": {
"type": "string",
"minLength": 1,
"pattern": "\\S"
},
"tags": {
"type": "array",
"uniqueItems": true,
"items": {
"type": "string",
"minLength": 1,
"pattern": "\\S"
}
},
"description": {
"type": "string",
"minLength": 1,
"pattern": "\\S"
},
"license": {
"type": "string",
"minLength": 1,
"pattern": "\\S"
}
}
},
"provenance": {
"type": "object",
"additionalProperties": false,
"required": [
"source_repo",
"author"
],
"properties": {
"source_repo": {
"type": "string",
"minLength": 1,
"pattern": "\\S"
},
"author": {
"type": "string",
"minLength": 1,
"pattern": "\\S"
},
"skeletonizer": {
"type": "string",
"minLength": 1,
"pattern": "\\S"
}
}
},
"inputs": {
"allOf": [
{
"$ref": "#/definitions/inputSchema"
},
{
"type": "object",
"required": [
"type",
"properties",
"additionalProperties"
],
"properties": {
"type": {
"const": "object"
},
"properties": {
"type": "object"
},
"additionalProperties": {
"const": false
}
}
}
]
},
"declared_hosts": {
"type": "array",
"uniqueItems": true,
"items": {
"type": "string",
"pattern": "^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)(?:\\.(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?))*$"
}
},
"services": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"id",
"role",
"workflow_doc"
],
"properties": {
"id": {
"type": "string",
"pattern": "^[a-z0-9]+(?:[-_][a-z0-9]+)*$"
},
"role": {
"type": "string",
"minLength": 1,
"pattern": "\\S"
},
"workflow_doc": {
"type": "string",
"pattern": "^(?!/)(?![A-Za-z]:)(?!.*\\\\)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*(?:^|/)\\.(?:/|$))(?!.*//)[A-Za-z0-9._/-]+$"
}
}
}
},
"steps": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"id",
"file"
],
"properties": {
"id": {
"type": "string",
"pattern": "^[a-z0-9]+(?:[-_][a-z0-9]+)*$"
},
"file": {
"type": "string",
"pattern": "^(?!/)(?![A-Za-z]:)(?!.*\\\\)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*(?:^|/)\\.(?:/|$))(?!.*//)[A-Za-z0-9._/-]+$"
}
}
}
},
"verify_e2e": {
"type": "object",
"additionalProperties": false,
"required": [
"command",
"expect"
],
"properties": {
"command": {
"type": "string",
"minLength": 1,
"pattern": "\\S"
},
"expect": {
"type": "string",
"minLength": 1,
"pattern": "\\S"
}
}
}
},
"definitions": {
"inputSchema": {
"type": "object",
"additionalProperties": false,
"required": [
"type"
],
"properties": {
"type": {
"enum": [
"string",
"number",
"integer",
"boolean",
"null",
"array",
"object"
]
},
"title": {
"type": "string",
"minLength": 1,
"pattern": "\\S"
},
"description": {
"type": "string",
"minLength": 1,
"pattern": "\\S"
},
"properties": {
"type": "object",
"propertyNames": {
"pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
},
"additionalProperties": {
"$ref": "#/definitions/inputSchema"
}
},
"required": {
"type": "array",
"uniqueItems": true,
"items": {
"type": "string",
"pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
}
},
"additionalProperties": {
"const": false
},
"items": {
"$ref": "#/definitions/inputSchema"
},
"enum": {
"type": "array",
"minItems": 1,
"items": {}
},
"const": {},
"default": {},
"examples": {
"type": "array",
"items": {}
},
"minLength": {
"type": "integer",
"minimum": 0
},
"maxLength": {
"type": "integer",
"minimum": 0
},
"pattern": {
"type": "string"
},
"format": {
"type": "string",
"minLength": 1
},
"minimum": {
"type": "number"
},
"maximum": {
"type": "number"
},
"exclusiveMinimum": {
"type": "number"
},
"exclusiveMaximum": {
"type": "number"
},
"minItems": {
"type": "integer",
"minimum": 0
},
"maxItems": {
"type": "integer",
"minimum": 0
},
"uniqueItems": {
"type": "boolean"
},
"minProperties": {
"type": "integer",
"minimum": 0
},
"maxProperties": {
"type": "integer",
"minimum": 0
}
}
}
}
}Why this matters
- Codex and Claude Code can execute the same recipe without model-specific lock-in.
- The registry can reject malformed or incomplete blueprints before users see them.
- Docs stay aligned with the validator because the schema below is imported from packages/manifest.