Skip to content

Manifests Reference — For Suite Authors

This page is for people who maintain the conformance suite: writing protocol manifests, case manifests, semantic vector recipe files, and understanding the generated vector format. If you are an NNRP SDK developer integrating the suite into your own project, see SDK Integration Guide instead.

The conformance suite is built around five JSON document types. Each type has a canonical JSON Schema located in schemas/ inside the nnrp-conformance repository. This page documents every field, its valid values, and its semantics.

1. Protocol Manifest

Schema: schemas/protocol-manifest.schema.json
Example: protocol/nnrp-1-preview2/manifest.json

The protocol manifest is the root entry point for one versioned baseline. The runner loads this file first and uses it to locate all other artifacts for that baseline.

Field Reference

FieldTypeRequiredValid valuesDescription
$schemastringnoany URIJSON Schema reference for IDE validation. Omit if not needed.
protocol_versionstringyesnon-empty stringIdentifies the protocol version line, e.g. nnrp-1-preview2, nnrp-1-preview3. Must match the protocol_version in every referenced case manifest and in every capability manifest used against it. Version mismatch causes an immediate runner error.
suite_versionstringyesnon-empty stringVersion of the conformance baseline itself (semver recommended, e.g. 0.1.0). Bumped when a baseline changes its mandatory case set.
statusstringyesdraft | frozen | deprecatedLifecycle state. draft baselines are under active development. frozen baselines accept no new mandatory cases. deprecated baselines are retained for reference only and should not be used in active CI.
case_manifestsarray of stringyesrelative paths (≥1 item)Paths to case manifest files relative to the directory containing this manifest. The runner loads all listed manifests. At least one entry is required.
vector_recipe_manifestsarray of stringnorelative pathsPaths to semantic vector recipe files. These are human-authored source files used to generate canonical wire vectors deterministically. An empty array [] means no recipe-based generation is set up.
vector_manifestsarray of stringyesrelative pathsPaths to pre-generated golden vector manifests. May be an empty array if all vectors are produced from vector_recipe_manifests.
report_schemastringyesrelative pathPath to the JSON Schema file that describes the report output format for this baseline.

Example

json
{
  "$schema": "../../schemas/protocol-manifest.schema.json",
  "protocol_version": "nnrp-1-preview2",
  "suite_version": "0.1.0",
  "status": "draft",
  "case_manifests": [
    "cases/l0-wire-vectors.json",
    "cases/l1-control-plane.json",
    "cases/l1-data-plane.json",
    "cases/l3-transport-smoke.json"
  ],
  "vector_recipe_manifests": [
    "vectors/semantic-vectors.json"
  ],
  "vector_manifests": [],
  "report_schema": "../../schemas/report.schema.json"
}

On vector_recipe_manifests vs vector_manifests

vector_recipe_manifests points to semantic recipe files that the runner can generate vectors from on demand. vector_manifests points to pre-generated artifacts. For preview2, all vectors are generated from recipes. For a frozen production baseline, you might pre-generate and check in the artifacts, leaving vector_recipe_manifests empty.


2. Case Manifest

Schema: schemas/case-manifest.schema.json
Examples: protocol/nnrp-1-preview2/cases/l0-wire-vectors.json, l1-control-plane.json, etc.

A case manifest groups a set of conformance cases that belong to the same layer or feature area. One baseline may reference multiple case manifests. Each must declare the same protocol_version as the protocol manifest.

Top-level Fields

FieldTypeRequiredValid valuesDescription
$schemastringnoany URIJSON Schema reference.
protocol_versionstringyesnon-empty stringMust exactly match the protocol_version in the parent protocol manifest.
manifest_namestringyesnon-empty stringA short identifier for this case group, e.g. l0-wire-vectors. Used in runner output to label which case file a case came from.
casesarray of objectyes≥0 itemsThe list of conformance case definitions.

Case Object Fields

Each element of cases defines one conformance test.

FieldTypeRequiredValid valuesDescription
idstringyesnon-empty, stable stringA globally unique, stable identifier for this case, e.g. l0.header.fixed_shape.golden. IDs must not change after a baseline is published. Convention: <layer>.<feature>.<variant>.
layerstringyesL0 | L1 | L2 | L3 | L4Protocol layer this case validates. L0 = wire encoding; L1 = control/data plane semantics; L2 = session semantics; L3 = transport semantics; L4 = full end-to-end flows.
statusstringyesmandatory | optional | experimental | deprecatedCase lifecycle status. mandatory cases are hard-gated in CI for any implementation that claims the required capabilities. optional cases are selected when capabilities are claimed but do not block CI on failure. experimental and deprecated cases appear in informational output only.
featurestringyesnon-empty stringThe public capability label this case represents, e.g. header.fixed_shape, control.client_hello. Serves as the human-readable grouping label in reports.
required_capabilitiesarray of stringyescapability strings (may be empty)The capability tokens an implementation must claim in its capability manifest before this case enters the selected execution set. An empty array [] means the case always runs, regardless of capability declarations.
descriptionstringyesnon-empty stringA human-readable description of what this case validates. Written from the perspective of a reader who has not seen the implementation.

Example

json
{
  "$schema": "../../../schemas/case-manifest.schema.json",
  "protocol_version": "nnrp-1-preview2",
  "manifest_name": "l0-wire-vectors",
  "cases": [
    {
      "id": "l0.header.fixed_shape.golden",
      "layer": "L0",
      "status": "mandatory",
      "feature": "header.fixed_shape",
      "required_capabilities": [],
      "description": "Parse and re-emit the fixed 40-byte Preview2 common header without changing any frozen fields."
    },
    {
      "id": "l0.control.client_hello.golden",
      "layer": "L0",
      "status": "mandatory",
      "feature": "control.client_hello",
      "required_capabilities": ["control.client_hello"],
      "description": "Pack and parse the Preview2 CLIENT_HELLO fixed metadata golden vector."
    },
    {
      "id": "l0.result_push.metadata.golden",
      "layer": "L0",
      "status": "mandatory",
      "feature": "result_push.partial_stale",
      "required_capabilities": [
        "result_push.partial",
        "result_push.stale_reuse",
        "payload.tensor"
      ],
      "description": "Encode and decode the Preview2 RESULT_PUSH metadata golden vector for partial stale-reuse results."
    }
  ]
}

On required_capabilities and case selection

A case with required_capabilities: [] is selected for every implementation regardless of what it declares. Use this only for universal wire-format cases (e.g. the common header), never for feature-specific cases. If a capability is required to parse the payload, list it explicitly.


3. Semantic Vector Recipe Manifest

Schema: schemas/semantic-vector-recipes.schema.json
Example: protocol/nnrp-1-preview2/vectors/semantic-vectors.json

The semantic vector recipe manifest is a human-authored source file that describes how to generate canonical wire vectors deterministically. The runner reads this file and produces a vector-manifest.json artifact. The generated artifact is then consumed by SDK tests.

This design means no binary or hex payloads are checked in to the repository. The source of truth is the human-readable recipe.

Top-level Fields

FieldTypeRequiredValid valuesDescription
$schemastringnoany URIJSON Schema reference.
protocol_versionstringyesnon-empty stringProtocol line targeted by this recipe. It must align with the protocol manifest that references it, but the schema itself is no longer tied to a single preview.
vectorsarray of objectyes≥1 itemsList of vector recipe entries.

Recipe Object Fields

Each vector recipe entry describes how to build one canonical wire sample. Fields vary by recipe_type; the three mandatory fields are common to all types.

FieldTypeRequiredDescription
recipe_typestringyesSelects the builder function. Valid values and the additional fields they require are documented below.
namestringyesThe stable name used to identify this vector in reports and SDK test assertions. Convention: <scope>.<category>.<identifier>.
descriptionstringyesHuman-readable description of what this vector represents.

recipe_type: "header"

Builds a standalone common header golden vector.

Additional fieldTypeDescription
version_majorintegerversion_major byte value. Currently 1.
wire_formatintegerwire_format byte value. Currently 0.
message_typestringMessage type name, e.g. frame_submit, result_push.
flagsarray of stringFlag names to set, e.g. ["ack_required", "keyframe"].
meta_lenintegerDeclared metadata length in bytes.
body_lenintegerDeclared body length in bytes.
session_idinteger (u32)Session identifier.
frame_idinteger (u32)Frame identifier.
view_idinteger (u16)View / lane identifier.
route_idinteger (u16)Route identifier.
trace_idinteger (u64)Trace identifier.

recipe_type: "client_hello_metadata"

Builds the CLIENT_HELLO fixed-metadata golden vector.

Additional fieldTypeDescription
min_version_major / max_version_majorintegerVersion negotiation range.
supported_wire_format_bitmapintegerBitmap of supported wire formats.
supported_profile_bitmapintegerBitmap of supported payload profiles.
supported_payload_kind_bitmaparray of stringSupported payload kind names, e.g. ["tensor"].
supported_codec_bitmapintegerCodec support bitmap.
supported_compression_bitmapintegerCompression support bitmap.
supported_dtype_bitmapintegerDtype support bitmap.
supported_layout_bitmapintegerMemory layout support bitmap.
cache_digest_bitmapintegerCache digest algorithm bitmap.
cache_object_bitmapintegerSupported cache object types bitmap.
cache_namespace_countintegerDeclared number of cache namespaces.
max_lane_countintegerMaximum concurrent lane count.
max_cache_entriesintegerMaximum cache entry count.
max_cache_bytesintegerMaximum total cache size in bytes.
target_cadence_x100integerTarget frame cadence × 100, e.g. 6000 = 60 fps.
latency_budget_msintegerLatency budget in milliseconds.
quality_tierintegerRequested quality tier.
degrade_policyintegerDegradation policy selector.
requested_session_idintegerRequested session ID (0 = server-assigned).
auth_bytesintegerAuthentication payload length in bytes.
control_extension_bytesintegerControl extension payload length in bytes.

Example (excerpt)

json
{
  "$schema": "../../../schemas/semantic-vector-recipes.schema.json",
  "protocol_version": "nnrp-1-preview2",
  "vectors": [
    {
      "recipe_type": "header",
      "name": "current.header.frame_submit_ack_required_keyframe",
      "description": "Preview2 common header golden vector for a FRAME_SUBMIT keyframe with ACK_REQUIRED.",
      "version_major": 1,
      "wire_format": 0,
      "message_type": "frame_submit",
      "flags": ["ack_required", "keyframe"],
      "meta_len": 48,
      "body_len": 4096,
      "session_id": 7,
      "frame_id": 11,
      "view_id": 2,
      "route_id": 0,
      "trace_id": 123456789
    },
    {
      "recipe_type": "client_hello_metadata",
      "name": "current.metadata.client_hello",
      "description": "Preview2 CLIENT_HELLO fixed metadata golden vector.",
      "min_version_major": 1,
      "max_version_major": 1,
      "supported_wire_format_bitmap": 1,
      "supported_profile_bitmap": 1,
      "supported_payload_kind_bitmap": ["tensor"],
      "supported_codec_bitmap": 7,
      "supported_compression_bitmap": 3,
      "supported_dtype_bitmap": 31,
      "supported_layout_bitmap": 3,
      "cache_digest_bitmap": 1,
      "cache_object_bitmap": 7,
      "cache_namespace_count": 4,
      "max_lane_count": 2,
      "max_cache_entries": 256,
      "max_cache_bytes": 8388608,
      "target_cadence_x100": 6000,
      "latency_budget_ms": 100,
      "quality_tier": 2,
      "degrade_policy": 2,
      "requested_session_id": 0,
      "auth_bytes": 96,
      "control_extension_bytes": 0
    }
  ]
}

4. Generated Vector Manifest

Schema: schemas/vector-manifest.schema.json
Produced by: nnrp-conformance-runner generate-vectors

This is the output artifact produced by the runner from a semantic recipe manifest. It contains the actual hex-encoded wire bytes. SDK tests consume this file. Suite authors do not write it manually.

Top-level Fields

FieldTypeRequiredValid valuesDescription
$schemastringnoany URIJSON Schema reference.
protocol_versionstringyesnon-empty stringMatches the recipe's protocol_version.
generatorstringnostringIdentifies the tool that produced this file, e.g. nnrp-conformance semantic vector generator.
generated_fromstringnostringNames the source recipe file, e.g. vectors/semantic-vectors.json.
vectorsarray of objectyes≥1 itemsThe generated wire vectors.

Vector Object Fields

FieldTypeRequiredDescription
namestringyesThe stable name matching the name in the source recipe. Used by SDK tests for assertion mapping.
kindstringyesVector category, e.g. header, client_hello_metadata. Corresponds to recipe_type in the source recipe.
hexstringyesLower-case hex encoding of the canonical wire bytes, no separators.
bytesintegeryesByte length of the canonical wire encoding, must equal len(hex) / 2.
descriptionstringyesCopied from the source recipe.

Example (excerpt)

json
{
  "protocol_version": "nnrp-1-preview2",
  "generator": "nnrp-conformance semantic vector generator",
  "generated_from": "vectors/semantic-vectors.json",
  "vectors": [
    {
      "name": "current.header.frame_submit_ack_required_keyframe",
      "kind": "header",
      "hex": "4e4e5250010003280000003000001000000000070000000b000200007b000000000000000000000000000000",
      "bytes": 40,
      "description": "Preview2 common header golden vector for a FRAME_SUBMIT keyframe with ACK_REQUIRED."
    }
  ]
}

5. Conformance Report

Schema: schemas/report.schema.json
Produced by: nnrp-conformance-runner summary

The report is the machine-readable output of one conformance execution. Suite authors use it to understand coverage; CI uses it to gate mandatory cases.

A report is not a capability manifest

The capability manifest is implementation-authored input with fields such as implementation_name, protocol_version, and supports. The report is runner-produced output derived from the protocol manifest, case manifests, and capability manifest, so it must never be named or treated like example-capabilities.json.

Top-level Fields

FieldTypeRequiredDescription
protocol_versionstringyesMatches the protocol manifest's protocol_version.
implementation_namestringyesCopied from the capability manifest.
summaryobjectyesAggregate counts (see below).
casesarray of objectyesPer-case selection results.

Summary Fields

FieldTypeDescription
selected_casesinteger ≥ 0Cases that entered the execution set (implementation claimed all required capabilities). These are hard-gated in CI.
not_claimed_casesinteger ≥ 0Cases where at least one required capability was not claimed. These are never counted as failures.
informational_casesinteger ≥ 0Cases with experimental or deprecated status. Output only; not gated.

Case Result Fields

FieldTypeValid valuesDescription
idstringThe case identifier from the case manifest.
featurestringOptional public capability label for grouping and readability.
statusstringmandatory | optional | experimental | deprecatedOptional echo of the case lifecycle status.
selectionstringselected | not_claimed | informationalHow the runner classified this case for the given capability manifest.

What the runner does not freeze

The JSON boundary described on this page is what is frozen publicly. The following are intentionally not frozen:

  1. Internal Rust type layouts in nnrp-conformance-fixtures or nnrp-conformance-runner.
  2. Internal Python or C# object trees inside SDK adapters.
  3. Intermediate in-memory state during runner execution.

Schema field semantics may only change on a new protocol version line or a new suite_version.

NNRP Documentation