{
  "schemas": [
    {
      "coverage_example": "schema_version: 2\nproject:\n  name: coverage_app\ntarget:\n  board: apollo510_evb\ntargets:\n  default: apollo510_evb\n  supported:\n    - apollo510_evb\ntoolchain: arm-none-eabi-gcc\nchannel: stable\nmodules:\n  - name: nsx-uart\n    project: nsx-core\n    revision: v1.0.0\n    boards: [apollo510_evb]\n    local: false\n    source: { git: 'https://example.invalid/r.git', rev: main }\nmodule_registry:\n  projects:\n    nsx-core:\n      url: 'https://example.invalid/c.git'\n      revision: main\n      path: modules/nsx-core\n      local_path: /tmp/nsx-core\n  modules:\n    nsx-uart:\n      project: nsx-core\n      revision: v1.0.0\n      metadata: nsx-module.yaml\ntooling:\n  cmake: {}\nfeatures: {}\nprofile: minimal\nprofile_status: stable\nbaseline: none\n",
      "error": "NSXConfigError",
      "example": "schema_version: 2\nproject:\n  name: hello_world\ntargets:\n  default: apollo510_evb\n  supported:\n    - apollo510_evb\n    - apollo4p_blue_kxr_evb\ntoolchain: arm-none-eabi-gcc\nchannel: stable\nfeatures: {}\n",
      "fields": [
        {
          "description": "Manifest schema version. NSX refuses a manifest it does not recognize.",
          "path": "schema_version",
          "required": true,
          "type": "int",
          "values": "2"
        },
        {
          "description": "App name. Used for the CMake project and the default build directory.",
          "path": "project.name",
          "required": true,
          "type": "string"
        },
        {
          "description": "Board built when --board is not given.",
          "path": "targets.default",
          "required": false,
          "type": "string"
        },
        {
          "description": "Boards this app may be built for. The map form accepts per-board soc, profile and toolchain overrides.",
          "path": "targets.supported",
          "required": false,
          "type": "list of string, or map of board to overrides"
        },
        {
          "description": "Single-board shorthand, superseded by targets.",
          "path": "target.board",
          "required": false,
          "type": "string"
        },
        {
          "default": "arm-none-eabi-gcc",
          "description": "Default toolchain for every board unless a board overrides it.",
          "path": "toolchain",
          "required": false,
          "type": "string"
        },
        {
          "description": "Registry channel the app tracks.",
          "path": "channel",
          "required": false,
          "type": "string"
        },
        {
          "description": "Direct dependencies. A string is shorthand for a map with only name set.",
          "path": "modules",
          "required": false,
          "type": "list of module entries"
        },
        {
          "description": "Module name as it appears in the registry.",
          "path": "modules[].name",
          "required": true,
          "type": "string"
        },
        {
          "description": "Registry project that provides the module, when it is ambiguous.",
          "path": "modules[].project",
          "required": false,
          "type": "string"
        },
        {
          "description": "Tag, branch or commit constraint for this module.",
          "path": "modules[].revision",
          "required": false,
          "type": "string"
        },
        {
          "description": "Restrict the dependency to a subset of targets.supported.",
          "path": "modules[].boards",
          "required": false,
          "type": "list of string"
        },
        {
          "description": "Mirror the module from an external path on every sync.",
          "path": "modules[].local",
          "required": false,
          "type": "bool"
        },
        {
          "description": "Exactly one of path (external directory), vendored (true, committed in this repo) or git (URL, with optional rev).",
          "path": "modules[].source",
          "required": false,
          "type": "map"
        },
        {
          "description": "App-local project overrides keyed by project name, each with url, revision, path or local_path.",
          "path": "module_registry.projects",
          "required": false,
          "type": "map"
        },
        {
          "description": "App-local module overrides keyed by module name, each with project, revision and optional metadata.",
          "path": "module_registry.modules",
          "required": false,
          "type": "map"
        },
        {
          "description": "Tool settings passed through to the generated build. Keys are preserved as written.",
          "path": "tooling",
          "required": false,
          "type": "map"
        },
        {
          "description": "Feature flags passed through to the generated build.",
          "path": "features",
          "required": false,
          "type": "map"
        },
        {
          "description": "Starter profile the app was created from.",
          "path": "profile",
          "required": false,
          "type": "string"
        },
        {
          "description": "Maturity recorded for the starter profile.",
          "path": "profile_status",
          "required": false,
          "type": "string"
        },
        {
          "description": "Set to none to skip the board's baseline module set.",
          "path": "baseline",
          "required": false,
          "type": "string",
          "values": "none"
        }
      ],
      "file": "nsx.yml",
      "id": "nsx-yml",
      "loader": "neuralspotx.project_config.load_project_config",
      "model": "neuralspotx.models.NsxProject",
      "schema_version": 2,
      "schema_version_constant": "neuralspotx.models._loader.SUPPORTED_SCHEMA_VERSION",
      "summary": "The app manifest. Names the app, the boards it supports, the toolchain and the modules it depends on directly.",
      "title": "nsx.yml",
      "unknown_keys": "Kept. Unrecognized top-level keys are preserved rather than rejected, so a newer NSX can read a manifest an older one wrote."
    },
    {
      "coverage_example": "schema_version: 1\nmodule:\n  name: nsx-coverage\n  type: algorithm\n  version: \"0.1.0\"\n  category: dsp\n  provider: Ambiq\nsupport:\n  ambiqsuite: true\n  zephyr: true\nbuild:\n  cmake:\n    package: nsx_coverage\n    targets:\n      - nsx::coverage\ndepends:\n  required:\n    - nsx-core\n  optional:\n    - nsx-uart\ncompatibility:\n  boards:\n    - apollo510_evb\n  socs:\n    - apollo510\n  toolchains:\n    - arm-none-eabi-gcc\nintegrations:\n  zephyr:\n    path: zephyr\n    module_yml: zephyr/module.yml\n    kconfig: zephyr/Kconfig\nconstraints:\n  required_sdk_provider: nsx-ambiqsuite\nsummary: Coverage module.\ncapabilities: [dsp]\nuse_cases: [filtering]\nanti_use_cases: [inference]\nagent_keywords: [fir]\nexample_refs: [examples/hello_world]\ncomposition_hints: [nsx-pdm]\n",
      "error": "ValueError",
      "example": "schema_version: 1\nmodule:\n  name: nsx-board-apollo510-evb\n  type: board\n  version: \"0.1.0\"\nsupport:\n  ambiqsuite: true\n  zephyr: false\nbuild:\n  cmake:\n    package: nsx_board_apollo510_evb\n    targets:\n      - nsx::board_apollo510_evb\ndepends:\n  required:\n    - nsx-ambiq-hal\n  optional: []\ncompatibility:\n  boards:\n    - apollo510_evb\n  socs:\n    - apollo510\n  toolchains:\n    - arm-none-eabi-gcc\n",
      "fields": [
        {
          "description": "Module metadata schema version.",
          "path": "schema_version",
          "required": true,
          "type": "int",
          "values": "1"
        },
        {
          "description": "Module name. Must match the name used in the registry and in nsx.yml.",
          "path": "module.name",
          "required": true,
          "type": "string"
        },
        {
          "description": "What kind of module this is. Drives resolution order and compatibility rules.",
          "path": "module.type",
          "required": true,
          "type": "string",
          "values": "sdk_provider, soc, board, runtime, portable_api, algorithm, tooling, backend_specific"
        },
        {
          "description": "Module version string.",
          "path": "module.version",
          "required": true,
          "type": "string"
        },
        {
          "description": "Grouping used by the module catalog.",
          "path": "module.category",
          "required": false,
          "type": "string"
        },
        {
          "description": "Organization or project that supplies the module.",
          "path": "module.provider",
          "required": false,
          "type": "string"
        },
        {
          "description": "Whether the module builds against AmbiqSuite. NSX requires true.",
          "path": "support.ambiqsuite",
          "required": true,
          "type": "bool",
          "values": "true"
        },
        {
          "description": "Whether the module ships a Zephyr integration. When true, integrations.zephyr becomes required.",
          "path": "support.zephyr",
          "required": true,
          "type": "bool"
        },
        {
          "description": "CMake package name the module exports.",
          "path": "build.cmake.package",
          "required": true,
          "type": "string"
        },
        {
          "description": "CMake targets the module exports. Must be non-empty.",
          "path": "build.cmake.targets",
          "required": true,
          "type": "list of string"
        },
        {
          "description": "Modules that must be present. May be empty.",
          "path": "depends.required",
          "required": true,
          "type": "list of string"
        },
        {
          "description": "Modules used when present. May be empty.",
          "path": "depends.optional",
          "required": true,
          "type": "list of string"
        },
        {
          "description": "Boards the module supports. Must be non-empty.",
          "path": "compatibility.boards",
          "required": true,
          "type": "list of string"
        },
        {
          "description": "SoCs the module supports. Must be non-empty.",
          "path": "compatibility.socs",
          "required": true,
          "type": "list of string"
        },
        {
          "description": "Toolchains the module supports. Must be non-empty.",
          "path": "compatibility.toolchains",
          "required": true,
          "type": "list of string"
        },
        {
          "description": "Zephyr module directory. Required when support.zephyr is true.",
          "path": "integrations.zephyr.path",
          "required": true,
          "required_when": "support.zephyr is true",
          "type": "string"
        },
        {
          "description": "Path to the Zephyr module.yml. Required when support.zephyr is true.",
          "path": "integrations.zephyr.module_yml",
          "required": true,
          "required_when": "support.zephyr is true",
          "type": "string"
        },
        {
          "description": "Path to the module's Kconfig. Required when support.zephyr is true.",
          "path": "integrations.zephyr.kconfig",
          "required": true,
          "required_when": "support.zephyr is true",
          "type": "string"
        },
        {
          "description": "SDK provider module this module must be built against.",
          "path": "constraints.required_sdk_provider",
          "required": false,
          "type": "string"
        },
        {
          "description": "One-line description shown in the module catalog.",
          "path": "summary",
          "required": false,
          "type": "string"
        },
        {
          "description": "What the module provides, for search and agent discovery.",
          "path": "capabilities",
          "required": false,
          "type": "list of string"
        },
        {
          "description": "Situations the module suits.",
          "path": "use_cases",
          "required": false,
          "type": "list of string"
        },
        {
          "description": "Situations the module does not suit.",
          "path": "anti_use_cases",
          "required": false,
          "type": "list of string"
        },
        {
          "description": "Extra search terms for agent tooling.",
          "path": "agent_keywords",
          "required": false,
          "type": "list of string"
        },
        {
          "description": "Examples that use the module.",
          "path": "example_refs",
          "required": false,
          "type": "list of string"
        },
        {
          "description": "Modules this one is usually combined with.",
          "path": "composition_hints",
          "required": false,
          "type": "list of string"
        }
      ],
      "file": "nsx-module.yaml",
      "id": "nsx-module-yaml",
      "loader": "neuralspotx.metadata.validate_nsx_module_metadata",
      "schema_version": 1,
      "summary": "Module metadata. Declares what a module is, what it builds, what it needs and what it is compatible with.",
      "title": "nsx-module.yaml",
      "unknown_keys": "Kept. The validator checks the keys it knows and ignores the rest."
    },
    {
      "coverage_example": "schema_version: 1\ninherits: apollo510_evb\nboard:\n  name: coverage_evb\n  tier: custom\n  soc: apollo510\n  registered: true\nsdk_provider: ambiqsuite\ncpu:\n  core: cortex-m55\n  float_abi: hard\n  abi: thumbv8.1m-fpv5-hard\ntoolchains:\n  - arm-none-eabi-gcc\noverrides:\n  toolchains:\n    - -armclang\n---\nschema_version: 1\nboard:\n  name: standalone_evb\n  tier: evb\n  soc: apollo510\n  registered: true\nsdk_provider: ambiqsuite\ncpu:\n  core: cortex-m55\n  float_abi: hard\n  abi: thumbv8.1m-fpv5-hard\ntoolchains:\n  - arm-none-eabi-gcc\n",
      "error": "BoardDescriptorError",
      "example": "schema_version: 1\nboard:\n  name: apollo510_evb\n  tier: evb\n  soc: apollo510\n  registered: true\nsdk_provider: ambiqsuite\ncpu:\n  core: cortex-m55\n  float_abi: hard\n  abi: thumbv8.1m-fpv5-hard\ntoolchains:\n  - arm-none-eabi-gcc\n  - armclang\n",
      "fields": [
        {
          "description": "Board descriptor schema version.",
          "path": "schema_version",
          "required": true,
          "type": "int",
          "values": "1"
        },
        {
          "description": "Board name as used by --board and by targets.supported.",
          "model_field": "name",
          "path": "board.name",
          "required": true,
          "required_when": "inherits is not set",
          "type": "string"
        },
        {
          "description": "SoC this board carries.",
          "model_field": "soc",
          "path": "board.soc",
          "required": true,
          "required_when": "inherits is not set",
          "type": "string"
        },
        {
          "default": "evb",
          "description": "Board tier. Custom boards created from an EVB baseline record their own tier.",
          "model_field": "tier",
          "path": "board.tier",
          "required": false,
          "type": "string"
        },
        {
          "default": "true",
          "description": "Whether the board appears in nsx board list.",
          "model_field": "registered",
          "path": "board.registered",
          "required": false,
          "type": "bool"
        },
        {
          "description": "SDK provider module the board builds against.",
          "model_field": "sdk_provider",
          "path": "sdk_provider",
          "required": true,
          "required_when": "inherits is not set",
          "type": "string"
        },
        {
          "description": "Arm core name, for example cortex-m55.",
          "model_field": "cpu.core",
          "path": "cpu.core",
          "required": true,
          "type": "string"
        },
        {
          "description": "Floating-point ABI passed to the toolchain.",
          "model_field": "cpu.float_abi",
          "path": "cpu.float_abi",
          "required": true,
          "type": "string"
        },
        {
          "description": "Full ABI triple used to select toolchain flags.",
          "model_field": "cpu.abi",
          "path": "cpu.abi",
          "required": true,
          "type": "string"
        },
        {
          "description": "Toolchains the board supports.",
          "model_field": "toolchains",
          "path": "toolchains",
          "required": false,
          "type": "list of string"
        },
        {
          "description": "Board this descriptor inherits from. Only custom boards set it.",
          "path": "inherits",
          "required": false,
          "type": "string"
        },
        {
          "description": "Delta applied to the inherited toolchain list, using +name to add and -name to remove. Only valid with inherits.",
          "path": "overrides.toolchains",
          "required": false,
          "type": "list of string"
        }
      ],
      "file": "board.yaml",
      "id": "board-yaml",
      "loader": "neuralspotx.board_descriptors.load_board_descriptor_file",
      "model": "neuralspotx.board_descriptors.BoardDescriptor",
      "schema_version": 1,
      "schema_version_constant": "neuralspotx.board_descriptors.SCHEMA_VERSION",
      "summary": "Board descriptor. Describes the SoC, the CPU ABI and the toolchains a board can be built with. A board may inherit from another and apply deltas.",
      "title": "board.yaml",
      "unknown_keys": "Kept. Unrecognized keys are ignored by the parser."
    },
    {
      "coverage_example": "schema_version: 4\ntargets:\n  apollo510_evb:\n    generated_at: '2026-09-03T23:02:17+00:00'\n    nsx_tool:\n      version: 0.7.17\n    manifest:\n      path: nsx.yml\n      hash: sha256:1c975664f58e7a6ee643a0bc37c90d8535543812703c6d3502595cc5f9992cef\n    target:\n      board: apollo510_evb\n      soc: apollo510\n      toolchain: arm-none-eabi-gcc\n    modules:\n      nsx-ambiqsuite:\n        project: nsx-ambiq-sdk\n        kind: git\n        constraint: v5.2.26\n        resolved:\n          url: https://github.com/AmbiqAI/nsx-ambiq-sdk.git\n          tag: v5.2.26\n          commit: ba0621638d57b71a7b0d4f76ddccf0706745ad77\n          tool_version: 0.8.1\n          vendored_at: modules/nsx-ambiq-sdk\n          content_hash: sha256:da17c45a3cf02797d1703f3c55beea770078cb2cb8829c7211413877089a559e\n          acquired_at: '2026-08-04T04:01:24+00:00'\n",
      "error": "NSXLockError",
      "example": "schema_version: 4\ntargets:\n  apollo510_evb:\n    generated_at: '2026-09-03T23:02:17+00:00'\n    nsx_tool:\n      version: 0.7.17\n    manifest:\n      path: nsx.yml\n      hash: sha256:1c975664f58e7a6ee643a0bc37c90d8535543812703c6d3502595cc5f9992cef\n    target:\n      board: apollo510_evb\n      soc: apollo510\n      toolchain: arm-none-eabi-gcc\n    modules:\n      nsx-ambiqsuite:\n        project: nsx-ambiq-sdk\n        kind: git\n        constraint: v5.2.26\n        resolved:\n          url: https://github.com/AmbiqAI/nsx-ambiq-sdk.git\n          tag: v5.2.26\n          commit: ba0621638d57b71a7b0d4f76ddccf0706745ad77\n          vendored_at: modules/nsx-ambiq-sdk\n          content_hash: sha256:da17c45a3cf02797d1703f3c55beea770078cb2cb8829c7211413877089a559e\n          acquired_at: '2026-08-04T04:01:24+00:00'\n",
      "fields": [
        {
          "default": "4",
          "description": "Lock schema version. NSX writes it on every lock; a lock that declares an older one is regenerated, and a lock missing it is read as the current version.",
          "path": "schema_version",
          "required": false,
          "type": "int",
          "values": "4"
        },
        {
          "description": "One resolution per board, so an app can be locked for several boards at once.",
          "path": "targets",
          "required": true,
          "type": "map of board to lock section"
        },
        {
          "description": "When this section was resolved.",
          "path": "targets.<board>.generated_at",
          "required": true,
          "type": "string (ISO 8601)"
        },
        {
          "description": "neuralspotx version that produced the section.",
          "path": "targets.<board>.nsx_tool.version",
          "required": false,
          "type": "string"
        },
        {
          "default": "nsx.yml",
          "description": "Manifest the section was resolved from.",
          "path": "targets.<board>.manifest.path",
          "required": true,
          "type": "string"
        },
        {
          "description": "Content hash of that manifest. A mismatch is the drift --frozen rejects.",
          "path": "targets.<board>.manifest.hash",
          "required": true,
          "type": "string"
        },
        {
          "description": "Board this section resolves.",
          "path": "targets.<board>.target.board",
          "required": true,
          "type": "string"
        },
        {
          "description": "SoC of that board.",
          "path": "targets.<board>.target.soc",
          "required": true,
          "type": "string"
        },
        {
          "description": "Toolchain the section was resolved for.",
          "path": "targets.<board>.target.toolchain",
          "required": true,
          "type": "string"
        },
        {
          "description": "The full resolved closure, not just the direct dependencies.",
          "path": "targets.<board>.modules",
          "required": true,
          "type": "map of module name to entry"
        },
        {
          "description": "Registry project that provides the module.",
          "model_field": "project",
          "path": "modules.<name>.project",
          "required": true,
          "type": "string"
        },
        {
          "default": "git",
          "description": "How the module was resolved, which decides what the resolved block carries.",
          "model_field": "kind",
          "path": "modules.<name>.kind",
          "required": true,
          "type": "string",
          "values": "git, packaged, local, vendored, unresolved"
        },
        {
          "description": "Constraint the resolution satisfied.",
          "model_field": "constraint",
          "path": "modules.<name>.constraint",
          "required": true,
          "type": "string"
        },
        {
          "description": "Upstream repository. Present for git and unresolved kinds.",
          "model_field": "url",
          "path": "modules.<name>.resolved.url",
          "required": false,
          "type": "string"
        },
        {
          "description": "Tag the commit carries, when the constraint matched one.",
          "model_field": "tag",
          "path": "modules.<name>.resolved.tag",
          "required": false,
          "type": "string"
        },
        {
          "description": "Exact commit vendored. Present for git and unresolved kinds.",
          "model_field": "commit",
          "path": "modules.<name>.resolved.commit",
          "required": false,
          "type": "string"
        },
        {
          "description": "neuralspotx version that supplied a packaged module.",
          "model_field": "tool_version",
          "path": "modules.<name>.resolved.tool_version",
          "required": false,
          "type": "string"
        },
        {
          "description": "Path under the app where the module is materialized.",
          "model_field": "vendored_at",
          "path": "modules.<name>.resolved.vendored_at",
          "required": true,
          "type": "string"
        },
        {
          "description": "SHA-256 of the vendored tree. The SBOM reports this and sync verifies it.",
          "model_field": "content_hash",
          "path": "modules.<name>.resolved.content_hash",
          "required": true,
          "type": "string"
        },
        {
          "description": "When the module was fetched.",
          "model_field": "acquired_at",
          "path": "modules.<name>.resolved.acquired_at",
          "required": true,
          "type": "string (ISO 8601)"
        }
      ],
      "file": "nsx.lock",
      "id": "nsx-lock",
      "loader": "neuralspotx.nsx_lock.read_lock_file",
      "missing_required_behavior": "regenerate",
      "model": "neuralspotx.nsx_lock.ResolvedModule",
      "schema_version": 4,
      "schema_version_constant": "neuralspotx.nsx_lock._constants.LOCK_SCHEMA_VERSION",
      "summary": "The resolution lock. Records, per board, the exact commit and content hash of every module an nsx sync would materialize. NSX writes it; you do not edit it by hand.",
      "title": "nsx.lock",
      "unknown_keys": "Rejected in effect. The lock is read into frozen dataclasses, so only the keys below survive a round trip."
    }
  ]
}
