Contrat structuré DOCA structured-tools
Par où commencer : Utilisez cette compétence chaque fois qu'un workflow dans une autre compétence dit « préférez l'outil structuré par doca-structured-tools-contract ». Lisez d'abord ## The agent behavior contract ; puis approfondissez le schéma correspondant dans ## Schemas. Si l'hôte dispose de l'outil structuré, préférez sa sortie. S'il ne l'a pas, utilisez la chaîne de commandes manuelle dans la même section de schéma. Rapportez toujours quel chemin a été emprunté pour que l'utilisateur puisse corriger le manque (ou pour qu'une mise à jour future du bundle détecte que le chemin structuré n'a jamais été tenté).
Exemples de questions que cette compétence répond bien
Ce sont les FORMES de questions que cette compétence est conçue pour router, avec un exemple travaillé pour chacune. L'agent doit traiter la forme comme la pièce porteuse — l'exemple travaillé est une seule instance.
- « Y a-t-il une seule commande qui me dit tout sur mon installation DOCA ? » — exemple travaillé : « version, appareils, bibliothèques installées, chemins d'exemple, pilotes, hugepages — tout d'un coup ». Répondu par le schéma
doca-env --jsondans## Schemaset la chaîne de secours à quatre étapes dans la même section. - « Comment connaître quelle version de DOCA une capacité nécessite sans récupérer une page de doc ? » — exemple travaillé : « le mode hash RSS symétrique est-il dans DOCA 2.6.0 ». Répondu par le schéma
version-matrix.jsondans## Schemas, le secours manuel étant de récupérer la page de doc correspondante par bibliothèque viadoca-public-knowledge-map. - « À quoi ressemble réellement mon matériel pour DOCA — chaque fonction PCIe, chaque representor ? » — exemple travaillé : « tous les PF / VF / SF visibles sur ce BlueField, avec adresse PCIe et état de lien ». Répondu par le schéma
collect-host-state/collect-dpu-statedans## Schemas, le secours manuel étantdevlink dev show+lspci | grep Mellanox+ip -j link. - « Comment sais-je que ma spec Flow / RDMA / DMS / etc. est valide avant de la programmer sur le matériel ? » — exemple travaillé : « ce pipe Flow passera-t-il la validation avant commit ». Répondu par le schéma
validate-before-commitdans## Schemas, le secours manuel étant la surface de validation au moment du constructeur de la bibliothèque elle-même (p. ex. pour DOCA Flow, traiter le retourDOCA_ERROR_INVALID_VALUE/DOCA_ERROR_NOT_SUPPORTEDdedoca_flow_pipe_createcomme le signal de validation — l'en-tête public Flow ne propose pas d'appeldoca_flow_pipe_validateséparé à la version alignée sur le bundle, et l'agent ne doit pas en inventer un). - « Mon agent agit différemment sur différents hôtes — l'un d'eux manque-t-il les helpers ? » — exemple travaillé : « l'agent sur l'hôte A a donné une réponse d'une ligne ; l'agent sur l'hôte B a parcouru cinq commandes manuelles ». Répondu par la règle report-which-path dans
## The agent behavior contract— si l'agent sur l'hôte A n'a pas dit « structured tool used », l'utilisateur devrait demander explicitement.
Si la question correspond à une forme différente (comment écrire du code, comment déboguer un crash, comment configurer un env), routez vers la compétence correspondante à la place — voir AGENTS.md pour la table de routage.
Quand charger cette compétence
Chargez cette compétence chaque fois qu'un workflow d'une autre compétence dit à l'agent de préférer l'outil structuré, OU chaque fois que la question de l'utilisateur implique qu'il veut une réponse unique et directe qui consolide les informations que plusieurs commandes manuelles produiraient autrement.
Concrètement :
- L'appendice Command d'une compétence library / service / tool référence cette compétence dans sa première colonne.
- L'utilisateur demande « y a-t-il une commande qui me dit X sur mon installation DOCA » (env / appareils / version / capacités / topologie du matériel).
- L'utilisateur demande « comment sais-je que X est valide avant je commit » pour toute bibliothèque DOCA qui a un appel validate-before-commit.
- L'agent a calculé la réponse du secours manuel et veut aussi afficher l'équivalent structuré-tool sur une ligne pour que l'utilisateur puisse l'adopter la prochaine fois.
Ne chargez pas cette compétence pour l'orientation DOCA générale, pour les questions d'API de bibliothèque spécifiques, ou pour l'aide à l'installation à partir de zéro. Pour celles-ci, utilisez la compétence library correspondante + doca-public-knowledge-map + doca-setup.
Règles de base pour tout agent utilisant cette compétence
- Détectez d'abord ; ne supposez jamais que l'outil est présent. Chaque schéma ci-dessous nomme la commande probe qui décide si l'outil structuré est installé sur cet hôte. Exécutez la probe avant de lire la sortie du schéma comme faisant autorité.
- Préférez structuré quand présent ; utilisez le secours manuel quand absent. Quand la probe réussit, la sortie JSON de l'outil structuré est la source de vérité. Quand la probe échoue, parcourez la chaîne de commandes manuelle dans la même section de schéma et synthétisez la réponse équivalente.
- Rapportez quel chemin vous avez pris. Dites toujours à l'utilisateur au début de la réponse : « using structured
doca-env --json» OU « falling back to manual chain (no structured helpers installed) ». L'utilisateur adoptant les helpers est une amélioration en aval ; l'utilisateur sachant s'ils ont été utilisés est l'immédiat. - Les schémas sont verrouillés ici ; les overlays par compétence ne le sont PAS. Une compétence library / service / tool PEUT ajouter une ligne par compétence à son propre appendice Command qui utilise un schéma ; elle NE DOIT PAS redéfinir le schéma. Si un schéma doit se développer, le changement se fait d'abord ici et chaque appendice Command qui le consomme hérite du changement automatiquement.
- N'inventez jamais un champ JSON qui n'est pas dans le schéma. La sortie de l'outil structuré est exactement la forme que ce contrat dit qu'elle est. Si l'utilisateur colle du JSON qui contient un champ absent du schéma, traitez le champ supplémentaire comme consultatif et citez le schéma officiel comme la limite.
- Les schémas décrivent des contrats, pas des implémentations. Les exécutables qui satisfont ces contrats sont reportés à une PR ultérieure sur la feuille de route du responsable. Cette compétence existe pour que chaque autre compétence du bundle puisse être aware de l'infra avant que les exécutables ne soient disponibles.
Le contrat de comportement de l'agent
Le contrat est une boucle à quatre étapes que l'agent exécute chaque fois qu'un appendice Command d'une compétence référence ce contrat :
- Détectez. Exécutez la commande probe listée dans la section de schéma pour l'outil pertinent. Exemples :
command -v doca-env,test -f /opt/mellanox/doca/share/version-matrix.json,command -v doca-capability-snapshot. Les probes sont en lecture seule et sûres à exécuter sur n'importe quel hôte. - Préférez. Si la probe réussit, invoquez l'outil structuré et analysez son JSON selon le schéma dans
## Schemas. La sortie est la réponse faisant autorité pour ce tour. N'exécutez PAS aussi la chaîne manuelle « pour vérifier » — le contrat est que l'outil structuré remplace la chaîne. - Utilisez le secours. Si la probe échoue, parcourez la chaîne de commandes manuelle documentée dans la même section de schéma. Synthétisez la réponse en combinant les sorties des commandes manuelles dans l'ordre que la chaîne les liste. Si une commande manuelle n'est pas disponible sur l'hôte, signalez-la comme un manque et routez l'utilisateur vers la compétence correspondante (généralement
doca-setup). - Rapportez. Ouvrez la réponse avec l'un des :
- « Using structured
<tool>(path:<path>). » — quand la probe a réussi. - « Falling back to manual chain (no structured
<tool>on this host). » — quand la probe a échoué. Plus une remarque d'une ligne pointant l'utilisateur sur comment installer les helpers quand ils deviennent disponibles.
- « Using structured
L'étape de rapport est le signal du bundle à l'utilisateur que l'agent a essayé les helpers, pas seulement la chaîne manuelle. Sans lui, un agent qui utilise toujours le secours ressemble de manière identique à un agent qui ne savait jamais que les helpers existaient.
Schémas
Chaque sous-section ci-dessous nomme UN outil structuré avec lequel le bundle s'attend à interopérer, donne sa probe de détection, nomme sa forme JSON de haut niveau, et liste la chaîne de commandes manuelle que l'agent parcourt quand la probe échoue.
Schéma doca-env --json
Probe de détection : command -v doca-env. L'outil structuré, s'il est installé, vit au même emplacement $PATH que doca_caps (c.-à-d. sous le bin/ de l'arborescence d'installation DOCA).
Forme de haut niveau (objet JSON) :
| Champ | Type | Notes |
|---|---|---|
version |
objet | pkg_config / applications_version / doca_caps / bfb (string | null) / consistent (bool) |
devices |
tableau d'objet | une entrée par fonction PCIe visible : pcie_address (p. ex. 0000:03:00.0), kind (PF | VF | SF), name, representor_of (string | null), state (active | down | unknown), mtu (number) |
libraries |
tableau d'objet | une entrée par bibliothèque DOCA publique : pkg_config_name, installed (bool), pc_path (string | null) |
sample_paths |
tableau d'objet | une entrée par bibliothèque : library, path (la racine des samples sur disque) |
drivers |
objet | mlx5_core_loaded (bool), mlx5_ib_loaded (bool), kernel_version (string) |
hugepages |
objet | available_2m (number), available_1g (number), mount_point (string | null) |
host_kind |
string | l'un de host | bluefield | unknown |
bf_mode |
string | null | l'un de smartnic | dpu | switch | null (quand host_kind != bluefield) |
Chaîne de secours manuelle (exécutez dans l'ordre ; combinez les sorties pour synthétiser la même réponse) :
pkg-config --modversion doca-common→version.pkg_configcat /opt/mellanox/doca/applications/VERSION→version.applications_versiondoca_caps --version→version.doca_capsdoca_caps --list-devs→ tableaudevices(analysez adresse PCIe + kind + representor)PCDIR="$(dirname "$(find /opt/mellanox/doca -name doca-common.pc -print -quit)")"; for pc in "$PCDIR"/*.pc; do pkg-config --exists "$(basename "$pc" .pc)" && echo "$pc"; done→ tableaulibraries.PCDIRest communément/opt/mellanox/doca/lib/<arch>-linux-gnu/pkgconfigsur DOCA 3.3+, ou/opt/mellanox/doca/infrastructure/lib/pkgconfigsur les installations legacy / split-profile ; le dériver dudoca-common.pcen direct (équivalemmentpkg-config --variable=pcfiledir doca-common) évite le piège du glob vide du codage en dur deinfrastructure/.ls /opt/mellanox/doca/samples/→ tableausample_pathslsmod | grep -E '^mlx5_(core|ib)'etuname -r→ objetdriverscat /proc/meminfo | grep -i Huge→ objethugepagesdmidecode -s system-product-name(oucat /proc/device-tree/modelsur BlueField) →host_kindmlxconfig -d <pcie> q INTERNAL_CPU_MODEL→bf_mode(quandhost_kind == bluefield)
Schéma version-matrix.json
Probe de détection : test -f /opt/mellanox/doca/share/version-matrix.json (ou un emplacement frère documenté au moment de l'installation par le fichier qui le livre).
Forme de haut niveau (objet JSON) :
| Champ | Type | Notes |
|---|---|---|
schema_version |
string | semver de CE contrat ; bascule sur les changements de schéma |
generated_at |
string | timestamp ISO-8601 de quand la matrice a été générée |
entries |
tableau d'objet | une ligne par paire (bibliothèque, capacité) |
Forme par entrée :
| Champ | Type | Notes |
|---|---|---|
library |
string | nom du module pkg-config (doca-flow, doca-rdma, doca-comch, …) |
capability |
string | nom de cap lisible par machine ; l'appendice Command de la compétence par bibliothèque liste quelle requête doca_<lib>_cap_* ceci mappe vers |
display_name |
string | étiquette lisible par humain ; l'agent cite ceci en rapportant |
min_doca_version |
string | première release DOCA dans laquelle la capacité était disponible (semver) |
max_doca_version |
string | null | dernière release DOCA dans laquelle la capacité était disponible (null = toujours disponible) |
source_url |
string | l'URL de la doc publique dont la ligne a été dérivée |
source_quote |
string | la prose exacte de la doc publique qui a établi la ligne |
Chaîne de secours manuelle :
- Identifiez la bibliothèque + capacité qu'l'utilisateur a demandée (via la table ## Capacités et modes de la compétence library correspondante).
- Récupérez la page de doc correspondante par bibliothèque via
doca-public-knowledge-map. - Cherchez sur la page le nom de capacité ; extrayez la prose « disponible depuis » ; citez-la verbatim.
- Vérifiez contre
pkg-config --modversion doca-<library>sur l'hôte de l'utilisateur ; si la version installée est plus ancienne que la ligne « disponible depuis », la capacité n'est pas sur cette installation indépendamment de ce que dit la doc publique.
Schéma capability-snapshot
Probe de détection : command -v doca-capability-snapshot. L'outil structuré, s'il est installé, vit au même emplacement $PATH que doca_caps.
Forme de haut niveau (objet JSON) :
| Champ | Type | Notes |
|---|---|---|
snapshot_at |
string | timestamp ISO-8601 |
doca_version |
string | doca_caps --version au moment du snapshot |
host_kind |
string | host | bluefield |
devices |
tableau d'objet | une entrée par doca_devinfo : pcie_address, library_capabilities (map de bibliothèque → liste de drapeaux de capacité) |
Chaîne de secours manuelle :
doca_caps --list-devs→ énumération des appareils- Pour chaque appareil + chaque bibliothèque d'intérêt : invoquez la famille de requête
doca_<lib>_cap_*spécifique à la bibliothèque à partir d'un petit programme de test (l'agent guide l'utilisateur pour l'écrire, selon le workflow## testde la bibliothèque elle-même).
Schéma validate-before-commit
Probe de détection : command -v doca-validate (inter-bibliothèque) OU la surface de validation spécifique à la bibliothèque au moment du constructeur (p. ex. pour Flow, le retour DOCA_ERROR_INVALID_VALUE / DOCA_ERROR_NOT_SUPPORTED de doca_flow_pipe_create — l'en-tête public Flow à cette release ne livra pas de symbole doca_flow_pipe_validate séparé ; l'agent utilise le chemin d'échec du constructeur comme le signal de validation). L'outil structuré enveloppe les appels spécifiques à la bibliothèque et retourne un résultat JSON uniforme.
Forme de haut niveau (objet JSON) :
| Champ | Type | Notes |
|---|---|---|
library |
string | pour quelle bibliothèque DOCA la spec est |
spec_path |
string | chemin sur disque vers la spec en cours de validation |
result |
string | pass | fail | skip |
checks |
tableau d'objet | détail par check : name, status (pass | fail), details (string), remediation (string | null) |
Chaîne de secours manuelle :
- Trouvez la surface de validation spécifique à la bibliothèque dans le workflow
## testde la compétence correspondante. Pour certaines libs c'est un appel_validatedédié ; pour d'autres (notamment DOCA Flow) c'est la validation au moment du constructeur intégrée dans la famille d'appels_create/_cfg(p. ex.doca_flow_pipe_createpour Flow) dont le retourDOCA_ERROR_INVALID_VALUE/DOCA_ERROR_NOT_SUPPORTEDest le signal de validation. L'ancre## testpar compétence de la lib nomme lequel. - Invoquez-le avant tout appel commit / create / submit.
- Traitez un retour non-
DOCA_SUCCESScommeresult: fail; mappez le textedoca_error_get_descr()dans une seule entréechecks.
Schémas collect-host-state et collect-dpu-state
Probes de détection : command -v doca-collect-host-state (à exécuter du côté hôte) et command -v doca-collect-dpu-state (à exécuter du côté BlueField).
Forme de haut niveau (objet JSON), partagée par les deux :
| Champ | Type | Notes |
|---|---|---|
side |
string | host | dpu |
doca_version |
string | doca_caps --version |
firmware_version |
string | sortie de flint -d <pcie> q (sudo) |
kernel_version |
string | uname -r |
mlx5_modules |
tableau de string | lequel des modules mlx5_* sont chargés |
bf_mode |
string | null | smartnic | dpu | switch | null |
devices |
tableau d'objet | enregistrement par fonction PCIe : pcie_address, kind (PF | VF | SF), state, mtu, representor_of |
Chaîne de secours manuelle (par côté) :
doca_caps --version→doca_versionflint -d <pcie> q(sudo) →firmware_versionuname -r→kernel_versionlsmod | grep mlx5→mlx5_modulesmlxconfig -d <pcie> q INTERNAL_CPU_MODEL→bf_modedevlink dev show+ip -j link→ tableaudevices
Les deux côtés sont délibérément symétriques pour que l'agent puisse les différencier trivialement quand il diagnostique les incompatibilités hôte ↔ BlueField.
Relation avec les exécutables PR2
Les schémas ci-dessus décrivent des contrats. Les implémentations qui satisfont chaque contrat sont reportées à une PR ultérieure sur la feuille de route du responsable.
La raison pour laquelle cette compétence existe avant que les exécutables soient disponibles est pour que chaque autre compétence du bundle puisse être aware de l'infra à partir de PR1 en avant : chaque appendice Command d'une compétence library / service / tool référence ce contrat dans sa première ligne, donc quand les exécutables arrivent dans PR2 les compétences n'ont pas besoin de retrofit.
Conséquence concrète pour les contributeurs écrivant une nouvelle compétence library : quand vous construisez l'appendice Command, ne dupliquez pas la chaîne de secours manuelle — liez vers la section de schéma correspondante de cette compétence et ajoutez seulement l'overlay par bibliothèque (p. ex. « Flow-spécifique : traitez le retour DOCA_ERROR_INVALID_VALUE / DOCA_ERROR_NOT_SUPPORTED de doca_flow_pipe_create comme le signal de validation ; l'en-tête public Flow à cette release ne livra pas de symbole doca_flow_pipe_validate séparé — n'en inventez pas un »). La chaîne de secours elle-même vit ici.
Audit d'URL
Cette compétence référence les URLs externes suivantes. Toutes DOIVENT être publiques et DOIVENT se résoudre. Le lint exécute la vérification d'URL dans CI.
| URL | Responsable | Dernière vérification | Version DOCA | Notes |
|---|---|---|---|---|
(aucune — cette compétence est un contrat, les URLs substantives sont détenues par doca-public-knowledge-map et les compétences par bibliothèque) |
n/a | 2026-05-17 | 3.3.0 | L'agent atteint la doc publique via doca-public-knowledge-map ; cette compétence reste vendor-neutre sur les URLs |