Skip to content

Dentro de un agente D2D: manifiesto, prompt del sistema y contrato de herramientas

13 de julio de 2026 · PlayCISO

En la visión general de D2D cubrimos el modelo de coordinador, worker y nodo killer. Ahora vamos a lo concreto: ¿cómo son de verdad los archivos dentro de uno de estos agentes?

El patrón de tres archivos

Cada agente D2D, sea coordinador o worker, queda descrito por completo con tres artefactos. Eso es lo que hace componible a D2D: puedes cambiar el modelo, el presupuesto o el conjunto de herramientas de un agente editando estos archivos, sin tocar la capa de orquestación.

1. manifest.yaml

name: cve-enrichment-worker
domain: vuln-management
model: claude-haiku-4-5
token_budget: 8000
heartbeat_interval_s: 30
max_retries: 2
tools:
  - nvd_lookup
  - epss_score
  - exploitdb_search
  - jira_create_ticket
output_schema: ./schemas/cve-enrichment-result.json
escalation:
  on_timeout: killer
  on_schema_fail: killer
  on_retry_exhausted: human

Campos clave en los que fijarse:

  • domain: acota este worker; el coordinador lo usa para enrutar las tareas
  • token_budget: el nodo killer lo vigila; si se supera, el agente se termina
  • output_schema: cada salida de un worker se valida contra este esquema antes de que el coordinador la acepte
  • escalation: reglas explícitas sobre qué va al killer y qué va a una persona

2. system.md (el prompt del sistema del agente)

# CVE Enrichment Worker

You are a specialist agent for enriching CVE data. You operate within the vuln-management domain.

## Your job
Given a CVE ID and an optional affected asset, you must:
1. Look up the CVE in NVD and return the CVSS score, vector, and description
2. Retrieve the EPSS score (probability of exploitation in the wild)
3. Search ExploitDB for any public exploit code
4. Create a Jira ticket if CVSS >= 8.0 AND EPSS >= 0.3

## Constraints
- You may ONLY call tools listed in your manifest. Never attempt to call unlisted tools.
- If NVD returns no result, emit status: "not_found" and stop.
- Do not infer or guess CVE details. Only use data returned by tools.
- Your output must conform to the output schema exactly.

## Output format
Return a single JSON object matching the schema at schemas/cve-enrichment-result.json.
Do not include any prose outside the JSON object.

El prompt del sistema es estrecho a propósito. Un worker que puede «inferir o adivinar» es un riesgo: bajo presión de tiempo se inventará detalles de los CVE. La restricción es una propiedad de seguridad, no una limitación.

3. Definiciones de herramientas (tools.json)

{
  "nvd_lookup": {
    "description": "Query the NVD API for a CVE by ID",
    "input": { "cve_id": "string" },
    "output": { "cvss_score": "number", "cvss_vector": "string", "description": "string" },
    "endpoint": "https://services.nvd.nist.gov/rest/json/cves/2.0"
  },
  "epss_score": {
    "description": "Retrieve EPSS exploitation probability for a CVE",
    "input": { "cve_id": "string" },
    "output": { "epss": "number", "percentile": "number" },
    "endpoint": "https://api.first.org/data/v1/epss"
  }
}

Las definiciones de herramientas son el límite de confianza. El runtime del agente obliga a que el agente solo pueda llamar a las herramientas declaradas aquí, con entradas cuya forma coincida con el esquema. No hay acceso implícito a herramientas.

La tabla de enrutamiento del coordinador

El coordinador mantiene una tabla de enrutamiento que asocia los tipos de tarea entrantes con los dominios de workers:

routes:
  - task_type: enrich_cve
    domain: vuln-management
    worker: cve-enrichment-worker
  - task_type: query_siem
    domain: detection
    worker: siem-query-worker
  - task_type: notify_slack
    domain: comms
    worker: slack-notify-worker
  - task_type: human_review
    domain: null
    escalate: pagerduty

El bucle de vigilancia del nodo killer

El nodo killer ejecuta un bucle de vigilancia sencillo sobre todos los workers activos:

every 10s:
  for each active worker:
    if now - last_heartbeat > heartbeat_interval * 2:
      emit KILL(worker_id, reason="timeout")
    if worker.tokens_used > worker.token_budget:
      emit KILL(worker_id, reason="budget_exceeded")
    if worker.output_schema_failures > 2:
      emit KILL(worker_id, reason="schema_fail")

Cuando se emite un KILL, el coordinador decide si reintentar (hasta max_retries) o escalar a una persona. El último estado conocido del worker, incluidas las salidas intermedias de herramientas, se conserva en el log de la tarea para el post mortem.

Por qué este patrón es auditable

Cada mensaje del sistema está estructurado y registrado: asignación de tareas, heartbeat, llamada a herramienta, resultado de la herramienta, salida y señal KILL. Quien investigue un incidente puede reconstruir exactamente qué hizo cada agente, por qué lo hizo y qué decidió el coordinador en cada paso. Esa es la pista de auditoría que un CISO puede enseñar de verdad a un consejo.

Lo siguiente en esta serie: cómo gestiona el coordinador la planificación de misiones y la replanificación ante fallos parciales.

🖤 Black Friday: new customers get 3 months of Pro for $5, then $5/month. Ends 30 Nov. Claim 3 months for $5 →