PTENES
MÓDULO 3.2

🎯 Skills en Codex y el sidecar openai.yaml

La particularidad del openai.yaml, el límite oculto de description, la ausencia de backtick-bang y por qué el $skill en lugar de /skill.

7
Temas
35
Minutos
Inter.
Nivel
Práctico
Tipo

🎯Lo que obtienes aquí

Entender exactamente qué cambia en una skill al migrarla de Claude a Codex: dónde queda, qué hay que adaptar y cómo el sidecar openai.yaml resuelve el problema de las dependencias MCP + branding.

Contenido detallado

1

📦 Skill en Codex — .agents/skills/ no .codex/skills/

Esto es lo primero que confunde. Quien viene de Claude piensa: «.claude/skills/ en Claude → .codex/skills/ en Codex». Incorrecto. La skill está en .agents/skills/.

Por qué .agents/ y no .codex/

.agents/ es la convención de la spec abierta Agent Skills (agentskills.io). Cualquier tool que respete la spec lee desde ahí. Codex simplemente sigue la convención, en vez de inventar su propia ruta.

Resultado: tu skill en .agents/skills/ funciona hoy en Codex y mañana en Cursor/Gemini/cualquier herramienta compatible, sin mover archivos.

Paths correctos

~/.agents/skills/<nome>/             ← global (suas skills)
./.agents/skills/<nome>/             ← projeto (skills do repo)

# NÃO existe:
.codex/skills/                       ← Codex não enxerga
.codex/agents/skills/                ← idem

⚠️Síntoma del error

"Instalé la skill, pero $minha-skill no se activa." → Primero verifica el PATH. Probablemente esté en .codex/skills/. Muévelo a .agents/skills/, actualiza Codex y vuelve a funcionar.

Conceptos clave

.agents/skills/
Path obligatorio
Especificación abierta
agentskills.io
Portabilidad
Otras tools leen
Actualización manual
Plugins → recargar
2

📝 SKILL.md — casi idéntico al de Claude

El archivo SKILL.md en sí es prácticamente lo mismo. Por eso funciona la spec: frontmatter YAML con name e description, cuerpo en Markdown. Estas son las 4 cosas que siempre coinciden.

SKILL.md en Codex

---
name: revisar-pr
description: Use when the user asks to review a PR or diff.
---

# Revisar PR

## Passo a passo

1. Identifica a PR
2. Lê diff completo
3. Verifica bugs/edge cases/security
4. Retorna findings categorizados

✓ Lo que SIEMPRE funciona

  • • Frontmatter name + description
  • • Body en markdown estándar
  • • Carpetas scripts/, references/, assets/
  • • Referencias relativas (./references/x.md)
  • • Encabezados, listas, bloques de código

✗ Lo que NO se puede portar

  • • allowed-tools en el frontmatter (se ignora)
  • • disable-model-invocation (ignorado)
  • • Backtick-bang `!cmd` (se convierte en texto)
  • • Description > 8KB (truncada silenciosamente)
  • • model: opus en el frontmatter (no se respeta)

💡Los 4 pilares portables

La spec Agent Skills define exactamente 4 cosas en común: nombre del archivo (SKILL.md), los campos name y description, cuerpo markdown, convención de carpetas. Mantén tu skill en estos 4 pilares y pasará al otro runtime sin problemas.

Conceptos clave

4 pilares
Especificación común
Markdown puro
Sin extensión personalizada
Convención de directorios
scripts/refs/assets
Sin extras
Que se convierten en sidecar
3

📎 El sidecar agents/openai.yaml

Aquí está el detalle que más distingue a Codex: todo lo que es específico del runtime (branding para la UI, dependencias del MCP server, flags de comportamiento) va en un archivo separado — agents/openai.yaml dentro de la carpeta de la skill.

Estructura completa con sidecar

.agents/skills/minha-skill/
├── SKILL.md                ← obrigatório (spec)
├── agents/
│   └── openai.yaml         ← SIDECAR do Codex
├── scripts/
├── references/
└── assets/

Ejemplo de openai.yaml

# Branding pra UI do Codex
branding:
  display_name: "Revisar PR"
  icon: "🔍"
  category: "code-review"

# MCP servers requeridos pela skill
mcp_servers:
  - name: github
    command: npx
    args: ["-y", "@modelcontextprotocol/server-github"]
    env:
      GITHUB_TOKEN: "${GITHUB_TOKEN}"

# Flags de comportamento
hidden: false
require_confirmation: true
🎨

Branding

Nombre para mostrar, ícono, categoría. Aparece en la UI. Sin esto, queda genérico.

🔌

Dependencias de MCP

La skill declara los MCP que necesita. La instalación queda lista para usar.

🎛️

Flags

Hidden, require_confirmation, etc. Comportamiento por skill.

Es opcional

Sin openai.yaml la skill funciona. Solo pierdes algunos refinamientos: no hay ícono en la UI, el branding es genérico y las dependencias de MCP deben instalarse a mano, fuera de la skill. Con el sidecar, la experiencia queda pulida.

Conceptos clave

Patrón Sidecar
Metadatos separados
Opt-in
Skill se ejecuta sin
MCP listo para usar
Declara la dependencia
Branding de la UI
Ícono, nombre
4

📏 El límite oculto de description (~8K)

Codex tiene un límite no documentado de unos 8.000 caracteres para la description cuando se indexa en el catálogo. Por encima de eso, la description se trunca, y tu skill pierde los triggers que están al final.

🚨El escenario peligroso

  1. Creas una skill en Claude con una description extensa (15KB): funciona bien allí
  2. Puerta directa a Codex
  3. Codex trunca en ~8K. Los triggers del final desaparecen.
  4. La skill parece funcionar (todavía se activa con algunos prompts), pero pierde casos
  5. Nunca te das cuenta porque no aparece ningún error: es silencioso

Técnica de front-loading

Coloca los triggers y ejemplos más importantes en los primeros 1-2KB. El resto puede venir después (y puedes quitarlo sin problema).

// CERTO — triggers no topo
description: |
  Use when reviewing PRs.
  Triggers: "revisa PR", "review pull request", "code review".
  Examples: "revisa PR #123", "review da branch atual".

  More context (pode ser truncado): ...

// ERRADO — triggers no fim
description: |
  This skill specializes in deep technical code review with focus on
  correctness, security, and edge cases. It analyzes pull requests
  by reading the full diff and ... [muito mais texto] ...
  Triggers: "revisa PR" ← truncado, nunca alcança

🦜Polyskill anticipa

El adapter Codex de polyskill aplica automáticamente front-loading: toma los triggers de la description portable y los mueve al principio al generarla para Codex. No tienes que pensar en eso.

Conceptos clave

~8K límite
No documentado
Truncamiento silencioso
Sin errores
Carga inicial
Activadores al principio
Auto polyskill
Resuelve en el build
5

🚫 Sin backtick-bang nativo — cómo resolverlo

Codex no interpreta `!cmd` (backtick-bang) como ejecución de shell previa al prompt. La skill que dependa de esto para inyectar contexto dinámico (estado de git, registro actual, branch) necesita una adaptación.

🔷 Claude (original)

Branch: `!git branch --show-current`

Último commit:
`!git log -1 --oneline`

Com base no acima, sugira...

El comando se EJECUTA. El resultado ya aparece en el prompt.

🟣 Codex (prosa de respaldo)

Antes de empezar, ejecuta:
- `git branch --show-current`
- `git log -1 --oneline`

Con base en los resultados, sugiere...

El agente EJECUTA los comandos cuando lee la skill.

Alternativa: script delegado

Si necesitas una salida idempotente y estructurada, pon la lógica en un script:

# scripts/context.sh
#!/bin/bash
echo "Branch: $(git branch --show-current)"
echo "Commit: $(git log -1 --oneline)"

# SKILL.md
Antes de começar, rode `./scripts/context.sh` e leia o output.

🦜Polyskill al momento de portar

Cuando importas una skill de Claude con backtick-bang, el adapter de Codex de polyskill reescribe automáticamente como prosa de respaldo. No es magia: es simple y funciona. Pierdes un poco de elegancia a cambio de portabilidad.

Conceptos clave

Sin inyección en tiempo de compilación
Codex no tiene
Prosa de respaldo
"Ejecuta X y analiza"
Script delegado
Lógica en sh
Polyskill reescribe
Automático en la importación
6

🔌 MCP servers en Codex

La misma especificación de MCP. Se ejecuta el mismo server. Solo cambia la declaración — TOML en lugar de JSON, dentro del config.toml o en el sidecar openai.yaml de la skill (cuando MCP es una dependencia específica).

🔷 Claude (.mcp.json)

{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": ["-y", "@mcp/github"],
      "env": {
        "TOKEN": "$GH_TOKEN"
      }
    }
  }
}

🟣 Codex (config.toml)

[mcp_servers.github]
command = "npx"
args = ["-y", "@mcp/github"]

[mcp_servers.github.env]
TOKEN = "${GH_TOKEN}"

Dónde declarar — config.toml × sidecar

🌍
config.toml (global o del proyecto): MCP que sirve para TODAS las skills/agents. GitHub, base de datos, etc.
📦
openai.yaml (sidecar de la skill): MCP que SOLO necesita esa skill. Mantiene la skill autocontenida: se instala junto con ella.

Conceptos clave

La misma especificación de MCP
Server compartido
JSON → TOML
Solo cambia la sintaxis
Global vs. skill
config.toml × sidecar
Autocontenido
Sidecar instala MCP
7

$ Invocación $skill — no es /skill

Codex usa el signo de dólar para invocar una skill explícitamente y reservar slash para los comandos integrados. $nome-skill en lugar de /nome-skill. Un pequeño detalle que te afecta desde el primer día.

🔷 Claude Code

/review             ← skill OU slash command
/plan               ← built-in
/output-style x     ← built-in

Todo es slash. Sin separación.

🟣 Codex

$review            ← skill
/help              ← built-in (Codex)
/model             ← built-in (Codex)

Separación: $ para skill, / para built-in.

💡La ayuda de autocompletar

Escribe $ y Codex sugiere las skills disponibles. Aunque olvides que es un signo de dólar y no una barra, el autocompletado lo corrige rápido.

Conceptos clave

$ = skill
Sigilo de invocación
/ = integrado
Reservado
kebab-case
Nombre de la skill
Autocompletar
Lista de skills

🎯Resumen del módulo

✓
Skill en .agents/skills/ — no .codex/skills/. Convención de la spec abierta.
✓
SKILL.md prácticamente igual que en Claude — 4 pilares comunes, los extras se convierten en sidecar.
✓
openai.yaml = branding + MCP + flags — opt-in, pero marca la diferencia en la experiencia.
✓
Límite oculto de ~8K en la description — front-loading manual o polyskill lo resuelve.
✓
Sin backtick-bang — usar prosa de respaldo o un script delegado.
✓
MCP en TOML — global en config.toml, por skill en openai.yaml.
✓
$skill, no /skill — / queda para las funciones integradas de Codex.

Siguiente ruta:

T4 — Convierte tu proyecto (prompt-template + checklist + 5 trampas)