Generated banner for Doca Programming Guide
Generated logo for Doca Programming Guide

Doca Programming Guide

NVIDIAOfficialCreated by NVIDIA

  • Skill
  • Guidelines
  • Software development
  • Apache-2.0
  • Medium risk

From the author

Use this skill when the user is writing their first DOCA app or asking a library-agnostic programming question — picking a shipped sample to copy and modify, wiring pkg-config + meson (or FFI from Rust / Go / Python against the public C ABI), walking the Core lifecycle (create → configure → start → connect → use → stop → destroy), or decoding a DOCA_ERROR_*. Trigger on implicit phrasing: "write my first DOCA program", "meson line for doca_rdma_*", "DOCA_ERROR_BAD_STATE on first call", "call DOCA from Rust", "built clean but nothing on the wire". Refuse install / hugepages / pkg-config (doca-setup), docs or version lookup (doca-public-knowledge-map), and library-internal API work (matching library skill).
— the description by NVIDIA

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

This skill provides a standardized approach for developers to program against NVIDIA DOCA libraries. It focuses on library-agnostic workflows, including the canonical build process using pkg-config and meson, the universal DOCA object lifecycle (create, configure, start, connect, use, stop, destroy), and cross-library error handling. It is designed for developers who have already set up their environment and are ready to write, build, or debug their own DOCA-based applications. The skill emphasizes using existing shipped samples as a foundation for new projects and provides guidance for both C/C++ developers and those using FFI/bindings from other languages.

What it does

  • Provides the canonical build pattern for DOCA applications using pkg-config and meson.
  • Defines the universal lifecycle for all DOCA objects.
  • Explains the cross-library DOCA_ERROR_* taxonomy and debugging ladder.
  • Outlines the workflow for deriving custom applications from shipped samples.
  • Offers guidance on language-neutral programming patterns for FFI and bindings.
  • Establishes a program-side safety policy and observability surface.

When to use it

  • When you are ready to write your first DOCA application after the environment is set up.
  • When you need to understand the standard lifecycle of a DOCA object.
  • When you encounter a DOCA_ERROR_* and need to debug it.
  • When you need to integrate DOCA libraries into a project using FFI or language bindings.
  • When you want to build a DOCA program using the canonical meson and pkg-config workflow.

Advantages

  • Standardizes the development workflow across different DOCA libraries.
  • Reduces development time by leveraging existing shipped samples.
  • Provides a clear, library-agnostic path for debugging and error handling.
  • Supports both native C/C++ development and FFI-based integration.
  • Ensures consistent application structure and lifecycle management.

Usage examples

“How do I write my first DOCA program?”
The agent will guide you through selecting a shipped sample, modifying it for your needs, and using the canonical build pattern to compile your application.
“What is the correct lifecycle for a DOCA object?”
The agent will explain the required sequence: create, configure, start, connect, use, stop, and destroy.
“My code returned DOCA_ERROR_BAD_STATE, what should I do?”
The agent will help you interpret the error using the cross-library taxonomy and guide you through the program-class debug ladder.
“How do I compile a program that calls doca_rdma functions?”
The agent will provide the necessary pkg-config and meson build lines required to link against the DOCA RDMA library.

Install

  1. Download the skill as a ZIP:

    https://mp-staging.autogineer.com/agent-skills/nvidia/doca-programming-guide/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip doca-programming-guide.zip -d .agents/skills

Documentation by NVIDIA

DOCA programming guide

Examples

  • "How do I write my first DOCA program?" — copy a shipped sample and follow the modify workflow, then the canonical pkg-config + meson build. Docker / NGC can compile and link; runtime needs a real BlueField or ConnectX.

  • "What's the lifecycle every DOCA object follows?" — create → configure → start → connect → use → stop → destroy. Configuration finishes before start.

Instructions

Follow Loading order below. Open the tasks companion for how-to and the capabilities companion for coverage. Do not open every companion file.

Where to start: Read ## Audience to confirm the user is consuming DOCA, not contributing to it. Then jump to the H2 that matches the verb (## modify for first-app derivation, ## build for the canonical build pattern, ## test for the test loop, ## debug for the program-class debug ladder). Docker / NGC is the build half, not the runtime half. The NGC container can compile and link. Flow pipe creation, RDMA QP ops, and any call that needs a doca_dev on a port need a real BlueField or ConnectX. Do not promise the app will work entirely inside docker.

Example questions this skill answers well

These are the CLASSES of program-class questions the skill is built to answer, each with one worked example. Library-specific overlays (Flow / DMS / Caps / …) live in the matching library skill; this skill answers the library-agnostic shape.

  • "How do I write my first DOCA program for <any library>?" — worked example: "I have docker; help me build my first DOCA Flow app." Answered by the modify-a-shipped-sample workflow in

    modify plus the canonical build

    pattern in ## build. Say that docker / NGC builds and links, but runtime needs a real NIC or DPU.

  • "What's the right build line for any DOCA library?" — worked example: "How do I compile a program that calls doca_rdma_*?" Answered by the pkg-config doca-<library> pattern in

    build (C/C++ Track 1) and the

    FFI/bindings pattern in Track 2.

  • "What's the lifecycle every DOCA object follows?" — worked example: "What's the right order of doca_flow_pipe_* calls in my program?" Answered by the Core order create → configure → start → connect → use → stop → destroy in ## Capabilities and modes (cfg-create / init implement configure and finish before start).

  • "DOCA_ERROR_* came back — what does it mean and what do I do?" — worked example: "My code got DOCA_ERROR_BAD_STATE." Answered by the cross-library doca_error_get_descr() rule in

    Error taxonomy

    • the program-class debug order in

    debug.

  • "My program built and started, but does nothing on the wire." — worked example: "My Flow program runs cleanly but no traffic is matched." Answered by the validate-before-commit rule in

    Safety policy

    and the layered program-class debug ladder in

    debug.

  • "What does <language> consumer of DOCA look like (FFI / bindings)?" — worked example: "How do I call DOCA Comch from Rust without writing C?" Answered by Track 2 of

    build (FFI against the public C

    ABI) and the language-neutral lifecycle in

    Capabilities and modes.

  • "How should I classify and build all the shipped DOCA samples and applications? What's the difference between a sample and an application?" — worked example: "I tried to build all DOCA apps and some failed — which ones are real regressions vs missing optional stacks?" Answered by the sample-vs-application model and the category / dependency / skip-vs-fail taxonomy in

    sample-and-app-categorization,

    which separates "the SDK is broken" from "the optional GPU / RMAX / MPI stack is not on this BlueField".

If the question is env-class (install / build env / hugepages / devices), route to doca-setup/SKILL.md. If it is library-specific (Flow pipe topology, RDMA QP setup, DMS service deploy), layer the matching library skill on top.

Audience

This skill serves external developers building applications that consume DOCA libraries — i.e., users whose code calls one or more doca_<library>_* symbols (directly in C/C++, or through FFI / bindings from another language). It is programming with DOCA, not programming of DOCA: it is not for NVIDIA developers contributing to DOCA itself, and it does not assume access to the DOCA source tree, internal NVIDIA tooling, or any non-public information. The only inputs it ever points the agent at are the ones any external user has: the public docs at docs.nvidia.com/doca/sdk/, the public catalog at catalog.ngc.nvidia.com, the public GitHub repos under github.com/NVIDIA / github.com/NVIDIA-DOCA, the public developer forum, and the on-disk /opt/mellanox/doca tree that the public DOCA install (or the public NGC DOCA container, nvcr.io/nvidia/doca/doca) puts on the user's host. Where to find and how to install questions are routed elsewhere — see Related skills below.

Language scope. DOCA itself is a C library family; every shipped sample in /opt/mellanox/doca/samples/ and every shipped reference application in /opt/mellanox/doca/applications/ is C. C and C++ consumers are the canonical case for every prescriptive workflow in this skill. Other-language consumers (Rust, Go, Python, …) consume the same *.so libraries through FFI or language-specific bindings against the public C ABI; the skill keeps the lifecycle, capability, error, observability, and safety guidance language-neutral, and routes the language-specific build / FFI work back to the consumer's own toolchain without authoring wrappers.

When to load this skill

Load this skill when the user has DOCA installed and the env-class preconditions are already satisfied (i.e., doca-setup/SKILL.md has produced a clean install where pkg-config doca-<library> resolves, hugepages are mounted, and devices are visible), and is now asking a question about how to actually program against DOCA in a library-agnostic way:

  • Understanding what DOCA's pieces are (libraries, apps, services, tools) and which side of the wire they run on.

  • The canonical pkg-config + meson build pattern any DOCA application follows, regardless of which library it consumes.

  • The universal derive a custom first application from a shipped sample workflow that every library skill extends with library-specific overrides — moved here from doca-setup because it is a programming verb, not an env verb.

  • The universal DOCA Core lifecycle (create → configure (including permissions and task set_conf) → start → connect → use → stop → destroy) and how it manifests across libraries. Configuration MUST finish before doca_ctx_start(). Connect is its own step after start; do not write connect/use as one token.

  • The general DOCA_ERROR_* pattern, doca_error_t, and doca_error_get_descr() — the cross-library shape, not Flow- or RDMA-specific overlays.

  • The validate-before-commit rule and the program-side safety policy that every library skill inherits.

  • Programming patterns that apply to consumers in any language (C/C++ directly, FFI / bindings for Rust / Go / Python / …) — the skill keeps the patterns language-neutral and points the agent at the public C ABI as the authoritative surface.

Do not load this skill for:

  • "Is my install healthy? Why does pkg-config not find doca-flow? How do I mount hugepages? I don't have DOCA installed yet — can I use a container?" — env-class questions belong in doca-setup/SKILL.md, which owns install verification, env preparation, env-class debugging, and the no-install → NGC container fallback path for any user on macOS, Windows, or Linux without DOCA.

  • "What is DOCA? Where is the Flow programming guide? Which package do I install?" — routing / orientation questions belong in doca-public-knowledge-map/SKILL.md.

  • "How do I construct a Flow pipe / set up an RDMA queue / use Comch to send a message?" — library-internal API questions belong in the matching library skill (e.g. doca-flow/SKILL.md).

What this skill provides

This is a thin loader. The body keeps only the orientation needed to pick the right next file. The substantive material lives in two companion files:

  • the capabilities companion — what every DOCA program looks like in the abstract: the shape of DOCA (host / DPU / switch, libraries / apps / services / tools, build flavor selection rationale), the universal program lifecycle, the unified version-compat rule that applies to any program linking DOCA, the cross-library DOCA_ERROR_* taxonomy, the program-side observability surface (DOCA logging, capability snapshots), and the program-side safety policy that every library skill inherits.

  • the tasks companion — step-by-step workflows for the six in-scope programming verbs: configure, build, modify, run, test, debug. The ## modify verb owns the universal derive a custom first app from a sample pattern that every DOCA library skill extends with library-specific overrides; the ## build verb owns the canonical pkg-config doca-<library> build pattern in two language tracks (C/C++ direct, non-C via FFI).

This skill assumes doca-setup/SKILL.md has already produced a clean install. It does not cover env preparation; that is doca-setup's job, including the no-install → NGC container (nvcr.io/nvidia/doca/doca) fallback for users on macOS, Windows, or Linux without DOCA.

What this skill deliberately does not ship

This skill is agent guidance, not a samples or templates bundle. It deliberately does not contain — and pull requests should not add:

  • Pre-written DOCA application source code, in any language. This includes C / C++ files, Rust crates, Go packages, Python modules, and wrapper code for any other language. The DOCA API surface evolves between releases and code written from documentation prose cannot be verified without compiling / linking / FFI-loading it against the live library on a real install. The verified DOCA application source code is the shipped C samples on the user's installed system; the agent's job is to route the user to that file and prescribe a minimum-diff modification on it (## modify) — for C/C++ users — or to route non-C users to the public C ABI surface that their bindings will call (## build Track 2), not to author the wrapper.

  • Standalone build manifests (meson.build, CMakeLists.txt, Cargo.toml, setup.py, go.mod, …) parked inside the skill. The agent constructs the build manifest in the user's project directory against the user's installed DOCA, where pkg-config --modversion doca-<library> is the source of truth.

  • A samples/, bindings/, or reference/ subtree of any kind. A mock or incomplete artifact in this skill's tree, even one labeled "reference", is misleading: users will read it as buildable.

Loading order

  1. Read this skill first to confirm the user's question is a programming-class question (not env, not routing, not library-API).

  2. For the DOCA shape, the universal lifecycle, the cross-library error taxonomy, the program-side observability surface, and the safety policy that every library skill inherits, see the capabilities companion.

  3. For step-by-step programming workflows — configure, build, modify, run, test, debug — see the tasks companion.

If the user is asking for a first app in a specific library, walk through ## modify for the universal copy-and-edit pattern, then hand off to the library skill (e.g. doca-flow/SKILL.md) for the library-specific values to swap.

  • doca-public-knowledge-map/SKILL.md — public DOCA documentation routing and the on-disk layout of an installed DOCA package. This skill defers all "where is X documented", "where on disk is Y", and "how do I check the installed version" questions to the knowledge-map.

  • doca-setup/SKILL.md — env preparation, install verification, env-class debugging, and the I have no install yet procedure with the NGC container (nvcr.io/nvidia/doca/doca) as the universal Stage-1 fallback for any user on macOS, Windows, or Linux without DOCA. This skill assumes doca-setup's preconditions are already satisfied.

  • doca-flow/SKILL.md — DOCA Flow on BlueField. Extends this skill's ## modify (universal first-app derivation) with the Flow-specific list of fields to swap.

  • doca-container-deployment/SKILL.md — shipping an application that already builds: container manifests, rollout, and service-readiness verification. This skill ends once the program compiles and runs locally; it does not cover deploying it.

Files

TASKS.md

DOCA programming guide workflows

Where to start: Read ## configure → ## modify for the first-app path, or ## debug for an in-flight program-class problem. The two cross-cutting reads every prescriptive section assumes are the lifecycle table in CAPABILITIES.md ## Capabilities and modes and the modify-schema in ## modify below.

Read this file when the loader sent you here from SKILL.md. For the underlying surface — the shape of DOCA, the universal lifecycle, the cross-library version-compat rule, the DOCA_ERROR_* taxonomy, the program-side observability surface, and the program-side safety policy — see CAPABILITIES.md. For env-class workflows (install verification, pkg-config wiring, hugepages, the I have no install yet procedure with the NGC container fallback), see doca-setup/SKILL.md. For routing, docs URLs, the on-disk install layout, and how to check the installed DOCA version, see doca-public-knowledge-map/SKILL.md.

Each verb describes the shape of the workflow, not a copy-paste recipe. Library-specific overrides (which sample to start from, which fields to swap, which capabilities to check, which errors to expect) live in the matching library skill — never here.

configure

Goal: get the program itself into the right starting state — the right version, the right build flavor, the right capability picture — after the env-class precondition (a clean pkg-config doca-<library> on the user's host) is already satisfied.

  1. Confirm the env precondition. This skill assumes doca-setup ## configure (doca-setup/TASKS.md#configure) has already run and pkg-config --modversion doca-<library> returns a version. If it doesn't, stop and route the user to doca-setup ## no-install (doca-setup/TASKS.md#no-install) (the NGC container fallback is the universal first option there) or doca-setup ## debug (doca-setup/TASKS.md#debug) (if the env is broken in a recoverable way). Do not work around an env failure with a code change.

  2. Quote the installed DOCA version. Use the procedure in doca-public-knowledge-map/SKILL.md. API names, sample filenames, and capability-matrix answers all depend on this — the version the user has on disk is the only honest source.

  3. Pick the build flavor. Trace flavor (doca-<library>-trace) for first-app development; release flavor (doca-<library>) for performance work. Rationale and selection criteria are in CAPABILITIES.md ## Capabilities and modes; env-side mechanics (where the trace *.so lives, LD_LIBRARY_PATH) are in doca-setup ## configure (doca-setup/TASKS.md#configure).

  4. Discover the library's capabilities on this host. Run doca_caps, plus the library's own capability-query API (Flow has one, RDMA has one, Comch has one) — the library skill names the call. Record the active mode, the supported features, and the budgets before designing the program; designing for features-not-on-this-hardware is the most common cause of "the spec validates but won't program".

  5. Restate the user's intent in library-neutral terms. Confirm what runs where (host or DPU), which devices / queues / pipes / channels are involved, what the success criterion is. If any of these is unclear, stop and ask. The library skill takes over from here for the library-specific configuration.

build

Goal: produce a buildable artifact from DOCA application source — yours or a copy of a shipped sample — using the canonical pkg-config + meson pattern that any DOCA program follows.

This verb has two tracks because DOCA is a C ABI consumed from many languages. Pick the right one before issuing any command.

Track 1 — C / C++ consumers (canonical)

The shipped DOCA samples and reference applications are C, built with meson. Your custom application uses the same shape.

  1. Stage the build out-of-tree. Never build into /opt/mellanox/doca/. Standard pattern:

    meson /tmp/build-<project>
    ninja -C /tmp/build-<project>
  2. Declare the DOCA dependency in meson.build via pkg-config. Use the library's own pkg-config module name (doca-flow, doca-rdma, doca-comch, …) — not a hand-typed -l... flag list. The pkg-config module is the source of truth for include paths and link flags; hard-coded paths drift across releases.

  3. Honor the build flavor decision from ## configure step 3. Trace flavor links against the doca-<library>-trace module; release flavor links against doca-<library>.

  4. Map any build-time error to the env taxonomy first. If meson reports a missing dependency or ninja reports an undefined symbol, the symptom is almost always env-class (wrong install profile, wrong PKG_CONFIG_PATH, wrong build flavor) — route to doca-setup ## debug (doca-setup/TASKS.md#debug) before touching the source.

Track 2 — Other languages (Rust, Go, Python, …)

DOCA does not ship official bindings in non-C languages inside this repository. The consumption path is FFI / language-specific bindings against the same *.so libraries the C samples link against.

  1. Confirm the install host gives you the C ABI surface. pkg-config --cflags --libs doca-<library> returns the include path and link flags; the headers under $(pkg-config --variable=includedir doca-common) are the authoritative symbol declarations; the *.so files under /opt/mellanox/doca/lib/<arch>-linux-gnu/ are what your binding loads at runtime. Verify all three are present before any binding-side work. If any of those checks fails, route to doca-setup ## debug (doca-setup/TASKS.md#debug).

  2. Pick the binding strategy honestly. If a community or user-built binding for the user's language exists, point at its repository (the agent must verify it exists by fetching its repo or package registry — never invent a binding name). Otherwise the user is doing direct FFI: bindgen for Rust, cgo for Go, cffi / ctypes for Python, equivalents for other languages.

  3. Generate or write the binding in the user's own toolchain. This skill does not author wrappers. The agent describes the C-side surface (header path, *.so filename, lifecycle order, error pattern) and lets the user's binding tooling do its job. The library skill (e.g. doca-flow/SKILL.md) supplies the API-surface guidance the wrapper has to honor.

  4. Read the C samples even if you're not writing C. The order of API calls in /opt/mellanox/doca/samples/doca_<library>/<sample>/ is the same regardless of the calling language. The wrapper translates the shape; it does not invent a different shape.

modify

Goal: take a working shipped sample and derive a custom first application for the user, by editing a verbatim copy of the sample on the user's own DOCA-installed Linux host (bare-metal, VM, or NGC container). The NGC / docker path is build-and-link only; runtime (Flow pipes, RDMA QPs, doca_dev on a port) needs a real BlueField or ConnectX — do not claim the app runs entirely inside the container. The substance of the modified file is NVIDIA's BSD-3 sample (verified, compiled, shipped) with a small, named set of user-domain values swapped. The agent does not author DOCA library source code from scratch.

Language scope of this verb. The shipped DOCA samples are written in C; this is the only application source code NVIDIA ships in this repository. The modify-a-sample workflow below is therefore the C / C++ first-app track. For consumers writing their first DOCA application in another language (Rust, Go, Python, …), this verb is not the right path — those users should still build a shipped sample (Track 1 of ## build) to verify their install is healthy, and then use Track 2 of ## build plus the matching library skill's bindings / FFI guidance for the wrapper-side work the user does in their own toolchain. The agent must not pretend the modify-a-sample workflow produces a Rust crate, a Go module, or a Python package; the workflow's output is a modified copy of NVIDIA's C sample.

The generic pattern below is library-agnostic across DOCA libraries (Flow, RDMA, Comch, …) but C-specific within a library. Library-specific values (which sample, which fields the user must change, which actions to keep) live in the matching library skill — for Flow, see doca-flow ## build (doca-flow/TASKS.md#build).

Precondition

This verb requires all of:

PreconditionCheck
Linux environment the agent can reach (the user's machine, an SSH session, a Cursor remote, or a running NGC DOCA container — any environment where the agent can ls the install tree)shell available
DOCA installedls /opt/mellanox/doca returns a populated tree
The source sample is presentls /opt/mellanox/doca/samples/<library>/<sample_name>/ lists meson.build and the source files
pkg-config knows DOCApkg-config --modversion doca-<library> returns a version string

If any precondition fails, do not proceed and do not invent a substitute. Route to doca-setup ## no-install (doca-setup/TASKS.md#no-install); that section is what the agent does instead, and its Path 0 (NGC DOCA container, nvcr.io/nvidia/doca/doca) is the universal way to satisfy these preconditions on macOS, Windows, or Linux without DOCA. Authoring application source code in any language (C, C++, Rust, Go, Python, …) from documentation prose to "fill the gap" is the failure mode this verb is here to prevent — it violates bundle AGENTS.md ground rule #3 and would ship code that has never been compiled / linked / FFI-loaded against the live DOCA library.

Modify-from-sample schema (the mental model)

Before any of the steps below, the agent fills in a modify-schema for the user — a small table that names what is being changed and why. The schema is the load-bearing artifact of this verb; the file edits are the mechanical consequence of the schema. Without the schema, the agent ends up swapping arbitrary fields and the result is a broken hybrid of "what the user wanted" and "what the sample happened to be"; with the schema, every edit is traceable.

The schema has FIVE slots. Every modify-from-sample run fills all five — in this order — before issuing any sed/edit command. Library skills overlay library-specific values for each slot; this skill prescribes the slots themselves.

SlotWhat goes hereClass of valueWhere it comes from
1. Source sampleIdentifier of the shipped sample being copied from (path under /opt/mellanox/doca/samples/<library>/)filesystem pathThe library skill's ## build overlay (it names the smallest viable sample for each shape).
2. Sample contract (what it already does)One-sentence summary of the sample's behavior verbatim from its source / READMEtextualReading the sample's meson.build and *.c files in the user's install.
3. Deltas from user intentThe minimum set of user-domain values that differ between the sample and what the user asked for. Each row: field name, what the sample has, what the user wants, where the user-side value comes from.enumeratedThe library skill's modify overlay (it lists which fields are typically the deltas for each sample shape); the user supplies the new values.
4. Boundaries (what stays verbatim)The init / teardown / validate / error-handling calls and any DOCA-API call sequences kept untouched from the sampleenumeratedAlways: every DOCA library call sequence. The library skill names which additional library-specific helpers are also "boundaries".
5. Verification planThe validate-before-commit calls + the smallest meaningful runtime probe that proves the modification is correct on this hardwareprocedure## test below + library-specific overlay.

The agent fills slots 1, 2, 4, 5 from the skill content (this skill + the library skill); slot 3 comes from the conversation with the user. If slot 3 is empty after the conversation, the user has not actually asked for a custom app — they want to run the shipped sample, which is ## run below, not ## modify.

The schema is also the artifact the agent writes into the README at step 8 below (the "Modified fields:" line is literally slot 3 serialized). Library skills reference this schema by slot number when their modify overlays prescribe which values are typically in slot 3 for a given sample shape.

Steps (preconditions met)
  1. Identify the source sample. Use the smallest shipped sample that already does something close to what the user asked for. Confirm it builds clean (## build above) and runs clean (## run below) before any modification. The library skill names the right starting sample for common shapes; do not pick from memory.

  2. Read the actual contents of the sample. Before describing the file, list it (ls) and read the meson.build plus each .c/.h. The shape of the sample on the user's installed version is the truth, not what an older release looked like or what a docs page describes.

  3. Copy the sample out of /opt/mellanox/doca/ into a writable location.

    cp -r /opt/mellanox/doca/samples/<library>/<sample_name>/ ~/dev/my-first-<library>-app/
    cd ~/dev/my-first-<library>-app/

    Never edit the install tree itself (doca-setup CAPABILITIES.md ## Safety policy (doca-setup/CAPABILITIES.md#safety-policy) item 1). The copy is the user's source code from this point forward. Inside an NGC container, mount a host directory at cp time (e.g. docker run -v $HOME/dev:/work …) so the modified copy persists when the container exits.

  4. Identify the minimum set of values to change in the copy. Library-specific list lives in the library skill. For every library the recipe is the same shape: keep all init / teardown boilerplate; keep the validation calls; keep the error handling; only swap the small set of user-domain values. Every byte not changed is a byte not debugged.

  5. Apply the swap as a minimum-diff edit on the copied file. Where the user has given you a real value, substitute the literal. Where the user has not yet given you a value but the build would otherwise fail to compile, leave a /* TODO: replace with your <thing>; see <how-to-find-it> */ comment around a syntactically-valid placeholder constant. The placeholder rule is only for values that block compilation if absent (constants, #defines the rest of the file references); it is not a license to leave function bodies or DOCA API call sequences unfilled. The init / teardown / validation / error-handling calls all stay verbatim from the upstream sample.

    A runtime-affecting placeholder is a hard gate. A syntactically valid placeholder may permit build-only verification, but it does not represent a runnable configuration. Until every placeholder that can change device selection, queue / port identity, addressing, traffic matching, buffer sizing, or another runtime effect is replaced with a source-verified user value, stop after the build: do not run the program, enter a hardware commit / start / program path, or declare the change ready to commit.

    Example placeholders (note: the surrounding code is the upstream sample's, untouched):

    /* TODO: replace with your destination MAC. Use `ip link show <iface>` on
     * the originating host to obtain the real value. */
    uint8_t target_mac[6] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 };
    
    /* TODO: replace REPRESENTOR_PORT_ID with the port_id reported by the
     * sample's enumeration printout for your representor. */
    #define REPRESENTOR_PORT_ID 1
  6. Update the build manifest minimally. The simplest correct change to the sample's meson.build is to rename the executable; do not refactor build options. If the original sample required -D enable_<flag>=true, keep that option in your build invocation. If the user's project must build standalone (outside the DOCA samples meson tree), the standalone meson.build depends on doca-<library> via pkg-config (## build Track 1 step 2). The agent constructs that manifest in the user's project directory, not from a template pinned in this skill.

  7. Build and run staged. Build with ## build. Before running, scan the modified source for the TODO markers introduced in step 5 and resolve every runtime-affecting placeholder from its named source. If any remains, record build-only verified and stop: run and commit are blocked. Once none remains, run with ## run against the smallest possible scope (one representor, one queue, one channel — whatever the library's unit of damage is per CAPABILITIES.md ## Safety policy item 2). Read the output. Only after the staged run succeeds may the user widen the scope. NGC-container caveat: the build half of this step works inside the container; the actual hardware-runtime half does not — the container has no access to a real NIC / DPU. For runtime, the user has to graduate from Path 0 (container) to Path A or Path C in doca-setup ## no-install (doca-setup/TASKS.md#no-install).

  8. Document what was changed. A two-line README next to the modified sample saying "Derived from <source-sample> on <date> against DOCA <version>. Modified fields: <list>." lets the user re-derive against the next DOCA release without having to re-read the agent's chat history.

run

Goal: launch a built DOCA program (shipped sample or derived custom app) and read its output meaningfully.

  1. Pre-run checklist. Refuse to run a derived sample while any runtime-affecting placeholder from ## modify step 5 remains; a clean compile is only build evidence. Then re-verify the env preconditions via doca-setup ## test (doca-setup/TASKS.md#test) (hugepages mounted, devices visible, representors enumerated). A failed pre-run check is faster to diagnose than a runtime error. Inside an NGC container, several of these checks are vacuously satisfied (no real NIC) — that's expected; runs that need real hardware will fail at start, and the right move is to graduate the user to a hardware path per doca-setup ## no-install (doca-setup/TASKS.md#no-install).

  2. Use the program's own CLI flags. Each shipped sample documents its -h flags. The agent must use those, not invent new ones — the most common runtime error is a flag rename across DOCA versions.

  3. Run with verbose logging the first time. Add --sdk-log-level 70 (DOCA LOG_TRACE) on the first run of any new code path. Re-running with reduced verbosity once the path is known to work is a deliberate later step; see CAPABILITIES.md ## Observability.

  4. Where logs go. DOCA libraries log to stderr by default. Some long-running services log via journald or a configured log directory; check /var/log/doca* or the service's own README before assuming output is missing.

  5. Map runtime failures to the right layer. Startup failures of the form "cannot find any working PCI driver", "no free 2048 kB hugepages", "representor X not found" are env-class and route to doca-setup ## debug (doca-setup/TASKS.md#debug). Failures of the form DOCA_ERROR_* returned from a library API call are program-class and route to ## debug below (with the library-specific overlay in the matching library skill).

test

Goal: validate the program — and the system context around it — before committing to hardware / runtime side-effects.

Program-class ## test is an iterative loop, not a one-shot check. The agent runs the smallest meaningful validation, reads its output, picks the next narrowest probe based on what's revealed, and only declares the program "ready to commit" when every loop iteration is observed clean against the current spec. A snapshot proves nothing about a spec that changes between runs; the loop is what makes the validate-before-commit guarantee real.

The loop, library-agnostic:

   .--> 1. Spec validate (library's validate call against current spec)
   |
   |    2. Capability cross-check (does the hardware/version accept it?)
   |
   |    3. Known-good smoke (one shipped sample builds + runs clean)
   |
   |    4. Negative test (one deliberately wrong input rejected with the right DOCA_ERROR_*)
   |
   |    5. Read symptoms; classify:
   '----- spec changed since (1)?         -> back to (1) with the new spec
          env regression detected?        -> route to doca-setup ## test loop
          program-class fault remains?    -> route to ## debug below
          all four iterations clean?      -> declare program ready to commit

The four-step variant of the loop, in detail:

  1. Validate the spec / configuration before commit. Every DOCA library that programs hardware (Flow in particular) exposes a validate call separate from the commit / start / program call. Use validate first; never enter a commit path with an un-validated spec. This is the cross-library validate-before-commit rule from CAPABILITIES.md ## Safety policy. Library skills extend it with library-specific what to validate. Loop: if validate rejects, fix the spec and re-run this step; do not move to step 2 with a failing validate.

    Before validation, scan for unresolved runtime-affecting placeholders from ## modify step 5. Their presence limits this loop to build-only verification and blocks validation as a readiness signal, runtime, hardware commit / start / program, and source commit until the real values are supplied and verified.

  2. Capability cross-check. Re-confirm that every feature your program intends to use is supported by the active mode and version on this host. Validation answers "is the spec internally consistent"; capability cross-check answers "will this hardware / library actually accept it". Loop: if a capability is missing, do not code around it — back up to ## configure step 4 (or to doca-setup/SKILL.md if firmware / version is the gap) and re-enter the loop only after the capability is present or the program intent has changed to accommodate.

  3. Smoke-test by building and running one shipped sample first. A known-good sample built and run cleanly is the cheapest end-to-end check that the install + your build env + your runtime preconditions are all healthy. Pick the smallest sample that exists for the library family the user cares about — the library skill names it. Inside an NGC container the build half is the meaningful check; the runtime half is reserved for a hardware path. Loop: if the shipped sample fails, the failure is almost certainly env-class — route to doca-setup ## test (doca-setup/TASKS.md#test); do not assume the library is broken until the canonical sample for that library runs cleanly.

  4. Negative test. Construct one deliberately failing input and confirm the library rejects it with the expected DOCA_ERROR_*. This is the cheapest way to detect a stale or wrong-version library before going live. Loop: if the negative test is accepted (library returns success on a known-bad input), that is a library-version / install bug — re-run version detection (CAPABILITIES.md ## Version compatibility) before believing any successful positive test from this session.

The loop terminates when one of:

  • All four iterations are clean in the same session against the same spec ⇒ declare the program ready to commit; record the validate/capability/sample/negative outputs as evidence.

  • An env regression is detected at any iteration ⇒ hand off to doca-setup ## test (doca-setup/TASKS.md#test); restart this loop from the iteration that broke after the env is clean again.

  • A program-class fault remains after the env is ruled clean ⇒ route to ## debug with the captured iteration outputs.

debug

Goal: when a DOCA program fails after the env is known healthy, walk the layered diagnosis tree top-down so the agent does not jump to library-internal code-fix recommendations against a symptom it can explain at a higher layer. This anchor is the program-class half of the layered debug ladder. The complementary env-class half lives in doca-setup ## debug (doca-setup/TASKS.md#debug). The cross-cutting reference both halves escalate to — the canonical layered ladder spanning install / version / build / link / runtime / program / driver, plus cross-cutting tooling (gdb, valgrind, ldd, --sdk-log-level, the doca-<lib>-trace build flavor, container introspection, core dumps) and the Where to ask for help escalation to the public Developer Forum — lives in doca-debug ## debug (doca-debug/TASKS.md#debug). Use this anchor for program-side specifics (lifecycle, DOCA_ERROR_*, doca_error_get_descr()); use doca-debug ## debug for the cross-cutting ladder shape and tooling.

Investigation order — always:

  1. Env layer (sanity check, then move on). Re-run the env-class checks via doca-setup ## debug (doca-setup/TASKS.md#debug) layers 1–4 (install / version / build / runtime). Only continue here if those are clean; an env-class failure is not a programming bug.

  2. Version layer (program-side). pkg-config --modversion doca-<library> against the runtime doca_caps --version. Mismatch ⇒ partial upgrade or stale build env; reinstall consistently before code changes (CAPABILITIES.md ## Version compatibility).

  3. Lifecycle order layer. Did the program call the library's APIs in the Core order create → configure → start → connect → use → stop → destroy (cfg-create / init implement configure and finish before start)? Out-of-order calls produce DOCA_ERROR_BAD_STATE. The library skill names which specific calls map to which lifecycle phase.

  4. Capability layer. Did the program ask for a feature the active mode does not support? Re-run capability discovery from ## configure step 4 and cross-check; an unsupported feature returns DOCA_ERROR_NOT_SUPPORTED. Code-side workarounds for NOT_SUPPORTED are almost always wrong — change intent, switch hardware/mode, or escalate.

  5. Error-description layer. For any returned doca_error_t, call doca_error_get_descr() and quote what it actually says — do not paraphrase from memory. The cross-library error meanings are in CAPABILITIES.md ## Error taxonomy; the library-specific overlay is in the matching library skill (Flow's DOCA_ERROR_* decision tree, for example, lives in doca-flow ## debug (doca-flow/TASKS.md#debug)).

  6. Library layer. Only after (1)–(5) are clean: route the conversation to the library skill for library-internal API semantics.

If the agent finds itself recommending a library-internal code change before completing (1)–(5), it is jumping layers — back up.

sample-and-app-categorization

The cross-library build-sweep model the agent uses when the user asks "build all DOCA samples" / "build all DOCA apps" / "which DOCA samples work on my hardware". The honest answer is "that depends on which category you mean, which dependency stack you have, and which target shape you are on" — and treating all DOCA samples or all DOCA applications as a single bucket is the load-bearing failure mode to avoid (a build sweep that returns "most built, some failed" hides the fact that the misses are mostly env not present (GPUNetIO needs nvcc, RMAX needs doca-rmax), not the DOCA SDK is broken).

This anchor is the agent's reasoning model, not a script: the bundle does NOT ship a build-sweep.sh, a categorization JSON manifest, or a dependency-resolver. It teaches the agent the classification, the evidence each tag is derived from, and the report shape a build sweep should produce so two operators reading the same sweep output reach the same triage step.

Samples vs applications

The two artifact shapes ship from different trees, are written for different audiences, and answer different questions. The agent makes the distinction before it picks a sweep strategy.

  • Samples live under /opt/mellanox/doca/samples/<library>/ on an installed host (and under samples/ in the public NVIDIA-DOCA/doca-samples repo). A sample is a library-level build probe — it answers the question "can this installed SDK compile code against this library's headers and link against its shipped .so?". A sample build pass is evidence for the install + the build env + that one library; a sample build pass is not evidence for application-level integration. Samples are the right target for the first ## test step of every library skill.

  • Applications live under /opt/mellanox/doca/applications/ on an installed host (and under applications/ in the public NVIDIA-DOCA/doca-samples repo — the public samples repo carries both samples/ and applications/ trees). An application is an integrated reference workload — it typically pulls in multiple DOCA libraries (Flow + Eth + Common; RDMA + DMA; etc.), often requires external packages (DPDK, SPDK, CUDA toolkit, MPI, the RMAX SDK, OpenMPI, UCX), often needs runtime topology to exercise (a peer host, a specific BlueField mode, a specific firmware capability, GPU + GPUDirect RDMA wiring), and sometimes needs a host ↔ DPU pair to run end-to-end. An application build pass is evidence for the full integration stack underneath it. An application build fail therefore has many more legitimate causes than a sample fail; classify before declaring.

Do not recommend "build all apps" until the subset is explicit: all samples (cheap, library-level), all top-level applications (heavier, integration-level), all optional-stack apps (per-category), or build-only vs runnable on this target (whether the sweep is just a compile check or an end-to-end run). The clarification is one sentence to the user, not a guess.

Category taxonomy

A canonical category labels every sample / app by the DOCA stack shape it exercises. The agent applies categories from the artifact's meson.build, its README, and the parent directory it ships from — NOT from inferring the name. Categories the bundle treats as first-class:

CategoryStack shapeRepresentative artifacts
securityDOCA App Shield, DOCA IPsec, packet inspection, file integrity, secure-channel patternsapp_shield_agent, ipsec_security_gw, psp_gateway, secure_channel, yara_inspection, APSH samples, file-integrity samples
storageNVMe emulation, virtio-fs, storage path samples, NVMe-oF integrationnvme_emulation, storage/*, virtiofs, STA/NVMe-oF related samples
networkingDOCA Flow, DOCA Eth, DOCA RDMA, DOCA Comch — line-rate or control-plane packet/RDMA patheth_l2_fwd, simple_fwd_vnf, switch, upf_accel, ip_frag, Flow samples, RDMA samples, Comch samples
accelerationDOCA DMA, AES-GCM, SHA, Compress, Erasure Coding — offloading specific compute kernelsDMA samples, AES-GCM samples, SHA samples, Compress samples, Erasure Coding samples
dpa-hpcDOCA DPA programs (DPACC build, FlexIO DEV) plus the PCC / UROM / RDMO HPC piecesdpa_all_to_all, pcc, urom_rdmo, DPA samples, UROM samples
gpu-mediaDOCA GPUNetIO, NVIDIA Rivermax integration, RMAX-class media samplesgpu_packet_processing, GPUNetIO samples, RMAX / Rivermax-shaped samples
telemetryDOCA Telemetry library + DOCA Telemetry Exporter — counter readers and per-process counter publishers (the on-host DOCA Telemetry Service as-deployed binary is externally productized and out of bundle scope per AGENTS.md ## Non-goals (bundle AGENTS.md))Telemetry samples, telemetry-exporter samples, in-bundle telemetry-shaped diagnostics

The agent does NOT add a sample / app to a category without evidence (its meson target, its README's "what this does" paragraph, the libraries it depends on per pkg-config). When evidence is ambiguous, the agent reports the artifact uncategorized rather than guessing — uncategorized is honest, mis-categorized is the kind of drift that breaks operator trust.

Dependency tags

Categories say which DOCA stack shape; dependency tags say which non-trivial dependencies the artifact needs at build / run time. A dependency tag is derived from the artifact's meson.build (dependency('libdpdk'), dependency('cuda'), etc.), its build log, its README, or — where authoritative information is missing — from a known-good documented quirk (see below). The agent applies the union of all that evidence; tags do not stand on "probably-needs-this" guesses.

TagEvidenceMeaning
needs_cudanvcc, dependency('cuda') in meson, <cuda.h> includeBuild requires CUDA Toolkit; runtime requires NVIDIA GPU driver loaded.
needs_rmaxdependency('doca-rmax'), rmax/ include path, doca-rmax pkg-configBuild requires the NVIDIA Rivermax SDK (separate license + install).
needs_mpimpicc / mpic++ / mpirun references, dependency('mpi')Build requires an MPI implementation (OpenMPI, MPICH, …). On BlueField the MPI install can live at non-standard prefixes (e.g. /usr/mpi/gcc/openmpi-<ver>/bin/) — see doca-setup TASKS.md ## configure (doca-setup/TASKS.md#configure).
needs_dpdkdependency('libdpdk') in meson, rte_* symbolsBuild requires a matched DPDK install pulled in via pkg-config libdpdk.
needs_spdkdependency('spdk') in meson, spdk_* symbolsBuild requires the SPDK install (typically /opt/mellanox/spdk/).
needs_dpaDPACC + FlexIO DEV build path, dependency('doca-dpa')Build requires DOCA DPA + the DPACC compiler; runs only on BlueField.
needs_host_peerREADME requires a peer-host process, *_host vs *_dpu splitRuntime requires a paired peer (the sample is incomplete without the other side).
needs_lz4dependency('liblz4') in meson, <lz4.h> includeBuild requires liblz4-dev (Ubuntu) / lz4-devel (RHEL). One known quirk lives at ### known-sample-build-quirks.

The agent records the tag set for every artifact it sweeps. Missing evidence is reported as "tag unknown" — never as "tag absent", because the agent has no way to prove absence without reading the artifact end-to-end.

Skip vs fail (build-sweep classification)

The single most expensive classification error a build sweep can make is conflating "skipped because dependency absent" with "failed because the SDK is broken". The agent NEVER reports a single passed / failed ratio without separating the two:

Result classMeaningOperator action
builtBuild succeeded against this target's full required stack.Move to runtime check (if the operator wanted runtime evidence).
skipped-env-absentBuild was attempted but a tagged dependency is not installed on this target (e.g. needs_cuda and nvcc is missing; needs_rmax and doca-rmax is not installed; needs_dpa and the operator is on host x86, not BlueField).Report which dependency is missing, route the operator to install it (or accept that this artifact is not in scope for this target shape).
built-with-known-quirkBuild succeeded but only after applying a documented workaround listed in ### known-sample-build-quirks.Report the quirk verbatim from the sweep output; do NOT silently suppress it.
fail-sdk-classBuild attempt reached the DOCA SDK headers / libs and a documented DOCA symbol / API surface was missing or wrong — this points at a partial install, a version-skew, or a real DOCA SDK bug.Route to doca-debug ## debug (doca-debug/TASKS.md#debug) layer 3 (link) or layer 4 (runtime); do NOT close the sweep as "DOCA broken" without the layer 1-2 evidence in hand.
fail-unknownBuild failed and the failure does not match any of the patterns above.Capture the build log, surface it verbatim to the operator, do NOT classify as SDK fail until evidence narrows it.

A sweep report MUST present these as separate counters. The canonical report shape:

sweep summary (target = <host shape>, DOCA = <observed pkg-config doca-common>):

  category          built  skipped-env-absent  built-with-known-quirk  fail-sdk-class  fail-unknown  total
  --------          -----  ------------------  ----------------------  --------------  ------------  -----
  security          N      0                   0                       0               0             N
  storage           N      0                   1 (lz4 quirk on X)      0               0             N+1
  networking        N      0                   0                       0               0             N
  acceleration      N      0                   0                       0               0             N
  dpa-hpc           0      M (needs_dpa)       0                       0               0             M
  gpu-media         0      P (needs_cuda)      0                       0               0             P
  telemetry         N      0                   0                       0               0             N
  uncategorized     -      -                   -                       -               -             -
  --------          -----  ------------------  ----------------------  --------------  ------------  -----
  total             ...    ...                 ...                     ...             ...           ...

dependency-tag inventory on this target (from probe, not from memory):
  needs_cuda: present? <yes/no/unknown>
  needs_rmax: present? <yes/no/unknown>
  needs_mpi:  present? <yes/no/unknown> (binary path: <mpicc path or "not on PATH">)
  needs_dpdk: present? <yes/no/unknown>
  needs_spdk: present? <yes/no/unknown>
  needs_dpa:  applicable? <yes if BlueField Arm, no if host x86, unknown if not detected>
  needs_lz4:  present? <yes/no/unknown>

per-fail evidence (only for fail-sdk-class + fail-unknown — never for skipped-env-absent):
  <artifact>: <one-line classification>  <log path on host or BF>

The point of this shape is that an external developer reading it can: (a) tell at a glance which categories are usable on this target right now; (b) tell which categories need a missing dependency (and what the dependency is); (c) see the per-fail evidence ONLY for real failures, not for missing-env skips that are out of scope for this target.

known-sample-build-quirks

A short, evidence-tagged list of build quirks the agent has seen in shipped DOCA samples / applications. Each row is reported AS A QUIRK in any sweep that hits it — the row exists so the agent does not classify a documented quirk as fail-sdk-class and lose operator trust by mis-reporting a workaround as an SDK fault.

QuirkEvidenceDocumented workaround
doca_storage_gga_offload_sbc_generator needs -llz4 at link timeThe application's link step fails on lz4_* symbols (undefined reference to LZ4_compress_*) even though its meson target does not explicitly declare a liblz4 dependency in some shipped versions; the linker needs -llz4 added (or the meson dependency added back).Either pass LDFLAGS="$(pkg-config --libs liblz4)" for the build invocation, OR (if the operator is modifying the sample, per ## modify) add dependency('liblz4') to the meson target. Mark the result as built-with-known-quirk (rationale = "DOCA storage sample expected lz4 dependency was not declared by the meson target in some shipped versions; explicit -llz4 closes the gap"). Do NOT classify the original failure as fail-sdk-class; this is a sample-build-script quirk, not a DOCA SDK bug. The agent surfaces the workaround verbatim, does NOT bake the workaround into a script, and does not silently suppress the original error.

The list is intentionally small: the agent only adds a row when the quirk is documented evidence in a real build log AND the workaround has been applied successfully. The bundle does not fabricate quirks from memory; an unfamiliar build failure is reported as fail-unknown and surfaced verbatim, not silently mapped to a fabricated "quirk".

Command appendix

The commands the verbs above expect the agent to issue, grouped by class so the agent reaches for the right family without searching prose. Library-specific commands (Flow's per-pipe APIs, RDMA's QP APIs, …) overlay in the matching library skill; this appendix lists only the library-agnostic ones.

ClassCommandOwning verb / anchorReads as healthy when …
Detect program versionpkg-config --modversion doca-<library>## configure step 2Returns a version string identical to doca_caps --version.
Detect program versionpkg-config --modversion doca-common## configure step 2Returns the unified DOCA version; quote this for API-availability answers.
Wire build (C/C++ Track 1)pkg-config --cflags doca-<library>## build Track 1 step 2Returns -I flags rooted at /opt/mellanox/doca/infrastructure/include.
Wire build (C/C++ Track 1)pkg-config --libs doca-<library>## build Track 1 step 2Returns -L /opt/mellanox/doca/lib/<arch>-linux-gnu -ldoca_<library> (plus deps).
Wire build (Track 2 FFI)pkg-config --cflags --libs doca-<library>## build Track 2 step 1Same as above; binding tooling consumes both.
Find samples on diskls /opt/mellanox/doca/samples/<library>/## modify precondition tableLists meson.build plus the sample subdirectories.
Copy a samplecp -r /opt/mellanox/doca/samples/<library>/<sample>/ <writable>/## modify step 3Yields a writable copy outside the install tree.
Build the copymeson /tmp/build-<project> && ninja -C /tmp/build-<project>## build Track 1 step 1Build succeeds; binary lives in /tmp/build-<project>/.
Discover program flags./<built-binary> -h## run step 2Lists the program's own CLI flags.
Run the program./<built-binary> --sdk-log-level 70 <actual-args>## run step 3Runs the intended workload with trace logging in stderr.
Inspect DOCA_ERROR_*doca_error_get_descr(<rc>) (called from program code)## debug step 5Returns a string description; quote it verbatim.

Two cross-cutting rules:

  • Never invent a pkg-config module name or a CLI flag. Every command above comes from a public source (the DOCA SDK index in doca-public-knowledge-map/SKILL.md, the library's own --help, or the sample's README). Agent-invented flags are the failure mode the AGENTS.md ## Ground rules (bundle AGENTS.md#ground-rules-every-agent-must-follow) anti-hallucination clause forbids; they break trust in every other command in the same answer.

  • Cite the version the user is on, not "latest". Every command whose output is version-dependent (the API surface, the available pipe types, the supported capability bits) is answered against the observed pkg-config --modversion doca-common, not against an assumed release.

Deferred task verbs

  • install. Installing DOCA on a fresh host, or reaching an install from a no-install host (NGC container fallback at nvcr.io/nvidia/doca/doca for macOS / Windows / Linux without DOCA, lab box, cloud Linux without NIC, hardware path) — env scope. Defer to doca-setup ## no-install (doca-setup/TASKS.md#no-install) and the Installation Guide via doca-public-knowledge-map/SKILL.md.

  • Env preparation. PKG_CONFIG_PATH, hugepages, devlink, representor enumeration — env scope. Defer to doca-setup ## configure (doca-setup/TASKS.md#configure).

  • Library API specifics. Constructing a Flow pipe, RDMA queue setup, Comch channel construction, etc. — library scope. After this skill's verbs have produced a buildable, runnable program shape, hand off to the matching library skill (e.g. doca-flow/SKILL.md) for API-level guidance.

  • deploy / rollback at fleet scale. Provisioning multiple BlueFields, coordinated firmware / BFB updates across a fleet, or staged rollback is fleet-orchestration scope, externally owned and out of this bundle's SDK scope. Do not hand-roll per-host deployment logic at that scale. Route to the orchestration entry-point in doca-public-knowledge-map ## Deploying DOCA services at scale (doca-public-knowledge-map/references/services.md#deploying-doca-services-at-scale--orchestration-entry-point-personascale-routing) (DOCA Platform Framework / NVIDIA Network Operator / Kubernetes Launch Kit, with authoritative links). Single-host / handful-of-DPUs PoC deployment stays in-bundle via doca-setup ## recognize (doca-setup/TASKS.md#recognize).

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

The author says: No DOCA install required to read this skill (it is an overlay loaded against any DOCA artifact skill); the validation steps within DO require a live DOCA install at /opt/mellanox/doca.

Security

What our scanner noticed· Medium risk

  • Large base64-encoded blobs

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Created by
NVIDIA
Publisher
NVIDIA (Official)
Source
NVIDIA/skills · skills/doca-programming-guide · commit fce3cca
Licence
Apache License 2.0 (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE-APACHE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by NVIDIA.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download doca-programming-guide.zip