Como Usar Skills e o Agents SDK da OpenAI para Acelerar a Manutenção de Software Livre — Tutorial Completo

Como Usar Skills e o Agents SDK da OpenAI para Acelerar a Manutenção de Software Livre — Tutorial Completo
Autor: Tiago Oliveira | Fonte: OpenAI Developers Blog (Kazuhiro Sera, 09/03/2026)

Manter um projeto open source ativo é um trabalho que nunca acaba. Issues, pull requests, verificações de qualidade, releases — tudo isso se acumula rápido. A equipe da OpenAI enfrentou esse mesmo desafio nos repositórios do OpenAI Agents SDK (Python e TypeScript) e encontrou uma solução elegante: skills locais no repositório, um arquivo AGENTS.md com regras obrigatórias e GitHub Actions para rodar tudo em CI.
O resultado? Entre dezembro de 2025 e fevereiro de 2026, os dois repositórios fizeram 457 PRs mergeados, um salto de 44% em relação aos 316 PRs dos três meses anteriores.
Neste tutorial, você vai aprender a reproduzir essa configuração no seu próprio projeto open source, do início ao fim. Todos os códigos, templates e comandos estão aqui.
Índice
- O que são skills e por que elas funcionam
- Estrutura de diretórios e arquivos
- Escrevendo o AGENTS.md
- Criando sua primeira skill: SKILL.md
- Skill 1: Verificação obrigatória de código
- Skill 2: Sincronização de documentação
- Skill 3: Execução automática de exemplos
- Skill 4: Revisão de release
- Skill 5: Estratégia de implementação
- Skill 6: Validação de changesets (monorepo JS)
- Skill 7: Resumo de PR
- Skill 8: Busca de documentação atualizada da API
- Skill 9: Melhoria de cobertura de testes
- Skill 10: Atualização coordenada de toolchain (pnpm)
- Escrevendo descrições que funcionam como roteamento
- Separando o que vai no modelo e o que vai nos scripts
- Automatizando testes de integração
- Adicionando verificações de release
- Rodando workflows no CI com GitHub Actions
- Codex na revisão de PRs
- Checklist final e próximos passos
1. O que são skills e por que elas funcionam
Uma skill é um pequeno pacote de conhecimento operacional. No diretório .agents/skills/ do seu repositório, cada skill contém:
- Um arquivo
SKILL.md(manifesto obrigatório com frontmatter YAML) - Opcionalmente: diretórios
scripts/,references/eassets/
O modelo de progressive disclosure (divulgação progressiva) faz com que o Codex:
- Primeiro veja apenas os metadados (
nameedescription) de todas as skills - Carregue o
SKILL.mdcompleto somente quando a skill for selecionada - Leia referências ou execute scripts apenas quando necessário
Isso mantém o contexto do agente enxuto e focado. As skills não poluem o prompt inicial — elas entram em cena sob demanda.
O setup básico da OpenAI é simples:
- Política do repositório no
AGENTS.md - Skills locais em
.agents/skills/ - Scripts e referências opcionais dentro de cada skill
- Codex GitHub Action para rodar os mesmos workflows no CI
2. Estrutura de diretórios e arquivos
Comece criando esta estrutura na raiz do seu repositório:
seu-projeto/
├── AGENTS.md # Regras globais e gatilhos de skills
├── .agents/
│ └── skills/
│ ├── code-change-verification/
│ │ ├── SKILL.md
│ │ └── scripts/
│ │ └── verify.sh
│ ├── docs-sync/
│ │ └── SKILL.md
│ ├── examples-auto-run/
│ │ ├── SKILL.md
│ │ └── scripts/
│ │ └── run-examples.sh
│ ├── final-release-review/
│ │ ├── SKILL.md
│ │ └── scripts/
│ │ └── get-prev-tag.sh
│ ├── implementation-strategy/
│ │ └── SKILL.md
│ ├── openai-knowledge/
│ │ └── SKILL.md
│ ├── pr-draft-summary/
│ │ ├── SKILL.md
│ │ └── scripts/
│ │ └── collect-context.sh
│ ├── test-coverage-improver/
│ │ └── SKILL.md
│ ├── changeset-validation/ # (apenas para monorepo JS)
│ │ └── SKILL.md
│ └── pnpm-upgrade/ # (apenas para monorepo JS)
│ └── SKILL.md
└── .github/
└── workflows/
└── codex-ci.yml
Vamos criar cada arquivo passo a passo.
3. Escrevendo o AGENTS.md
O AGENTS.md é o arquivo de instruções que viaja com o código e é lido pelo Codex antes de qualquer trabalho começar. A recomendação oficial é mantê-lo pequeno e colocar as regras mais importantes no topo.
Crie o arquivo AGENTS.md na raiz do repositório:
# AGENTS.md
## Project overview
- Core SDK code lives under `src/agents/` or `packages/*/src/`.
- Tests live under `tests/` or `packages/*/test/`.
- Sample apps and integration surfaces live under `examples/`.
## Mandatory skill usage
- Use `$implementation-strategy` before editing runtime or API changes that may affect compatibility boundaries.
- Run `$code-change-verification` when runtime code, tests, examples, or build/test behavior changes.
- Use `$openai-knowledge` for OpenAI API or platform work.
- Use `$pr-draft-summary` when substantial code work is ready for review.
## Build and test commands
- Python: `make format`, `make lint`, `make typecheck`, `make tests`
- TypeScript: `pnpm i`, `pnpm build`, `pnpm -r build-check`, `pnpm lint`, `pnpm test`
## Compatibility rules
- Preserve positional compatibility for public constructors and dataclass fields.
- Append new optional parameters at the end when possible.
- Add compatibility tests if reordering is unavoidable.
💡 Dica da OpenAI: O
AGENTS.mdnão serve apenas para gatilhos de skills. No repositório Python, eles também registram regras de compatibilidade de API pública ali. Mantenha regras críticas de release no mesmo lugar que os gatilhos de skills.
Adicionando regras específicas para monorepo JavaScript
Se seu projeto é um monorepo JavaScript com Changesets, adicione:
## Additional mandatory skills (JavaScript monorepo)
- Run `$changeset-validation` when anything under `packages/` or `.changeset/` changes.
4. Criando sua primeira skill: SKILL.md
Toda skill começa com um arquivo SKILL.md contendo frontmatter YAML. Os campos obrigatórios são name e description.
Template mínimo:
---
name: nome-da-skill
description: Descrição clara de quando usar esta skill, quais gatilhos, e qual saída esperar.
---
# Nome da Skill
## Quando usar
- Gatilho 1: condição específica
- Gatilho 2: condição específica
## Passos
1. Primeiro passo
2. Segundo passo
3. Terceiro passo
## Scripts
- `scripts/meu-script.sh`: o que ele faz e quando usar
## Saída esperada
Descreva o formato exato da saída.
Agora vamos criar cada skill individualmente, começando pela mais importante.
5. Skill 1: Verificação obrigatória de código
Esta é a skill mais usada nos repositórios da OpenAI. Ela não roda uma stack completa de validação sempre — apenas quando código de runtime, testes, exemplos ou comportamento de build/teste foi alterado.
Para projetos Python
Arquivo: .agents/skills/code-change-verification/SKILL.md
---
name: code-change-verification
description: Run the mandatory verification stack when changes affect runtime code, tests, or build/test behavior. Format, lint, type-check, and run the test suite before marking work complete.
---
# Code Change Verification
## Trigger
Run when runtime code, tests, examples, or build/test behavior changes.
Do NOT run for docs-only changes.
## Required pass criteria
The work is NOT complete until ALL of these pass:
make format
make lint
make typecheck
make tests
## Process
1. Run `make format` and fix any formatting issues
2. Run `make lint` and resolve all lint errors
3. Run `make typecheck` and fix all type errors
4. Run `make tests` and ensure all tests pass
5. If any step fails, fix the issue and re-run from step 1
6. Report results: number of files formatted, lint violations fixed, type errors resolved, tests passed/failed
## Output
✅ Verification complete
Format: N files formatted
Lint: clean
Typecheck: clean
Tests: N passed, 0 failed
Arquivo: .agents/skills/code-change-verification/scripts/verify.sh
#!/usr/bin/env bash
set -euo pipefail
echo "=== Code Change Verification ==="
echo ""
echo "[1/4] Formatting..."
make format
echo "✅ Format complete"
echo ""
echo "[2/4] Linting..."
make lint
echo "✅ Lint complete"
echo ""
echo "[3/4] Type checking..."
make typecheck
echo "✅ Typecheck complete"
echo ""
echo "[4/4] Running tests..."
make tests
echo "✅ Tests complete"
echo ""
echo "=== ✅ Verification passed ==="
Para projetos TypeScript/JavaScript (monorepo)
A stack de verificação para JS segue esta ordem exata:
## Required pass criteria (JavaScript monorepo)
The work is NOT complete until ALL of these pass in order:
pnpm i
pnpm build
pnpm -r build-check
pnpm -r -F "@openai/*" dist:check
pnpm lint
pnpm test
A skill codifica a definição de "verificado" do repositório, e o AGENTS.md torna essa definição obrigatória. Sem ela, o Codex não considera o trabalho como concluído.
6. Skill 2: Sincronização de documentação
Esta skill audita a documentação contra o código e encontra documentação faltante, incorreta ou desatualizada. É um workflow report-first: inspeciona, prioriza e pede aprovação antes de editar.
---
name: docs-sync
description: Audit documentation against the codebase. Find missing, incorrect, or outdated docs. Prioritize findings and ask for approval before making edits.
---
# Documentation Sync
## When to use
- After adding new public API surface
- After changing existing public behavior
- When preparing a release
- When asked to review documentation quality
## Process
1. Scan the current diff or changed files
2. Map each changed public API to its documentation
3. For each mapping, check:
- Is the API documented at all?
- Are parameter types and return types correct?
- Are docstrings up to date?
- Are code examples still valid?
- Are any deprecated APIs still documented as current?
4. Prioritize findings by severity:
- 🔴 Missing: public API with no documentation
- 🟡 Incorrect: documented but wrong types/behavior
- 🔵 Stale: documented but API has changed
5. Present findings as a report and ask for approval before editing
## Important rules
- Source docstrings and comments are the source of truth for generated reference docs
- Never patch generated output by hand — fix the source instead
## Output format
Documentation Audit
🔴 Missing (N)
function_name()inpath/to/file.py— no docstring or docs page
🟡 Incorrect (N)
Class.method()— docstring saysstrbut returnsOptional[str]
🔵 Stale (N)
old_function()— still documented but deprecated in v2.0
Recommended actions
- ...
- ...
7. Skill 3: Execução automática de exemplos
Esta skill executa todos os exemplos do repositório em modo automático, coleta logs, e faz o Codex comparar cada saída com o código fonte para validar o comportamento esperado. O runner executa os exemplos; o Codex interpreta os resultados.
---
name: examples-auto-run
description: Run all examples in auto mode, collect per-example logs, and validate output against source code intent. Use when example code changes or before releases.
---
# Examples Auto-Run
## Trigger
- Example code changed
- SDK runtime code changed (examples may be affected)
- Preparing for release
- Asked to validate example behavior
## Process
1. Run the example runner in auto mode:
- Python: `uv run examples/run_examples.py --auto-mode --write-rerun --main-log /tmp/examples-main.log --logs-dir /tmp/example-logs/`
- TypeScript: `pnpm examples:start-all` (in auto mode)
2. For each example that ran successfully:
a. Read the example source code and comments
b. Infer the intended flow and expected behavior
c. Open the matching per-example log
d. Compare intended behavior with actual stdout and stderr
e. Flag any mismatch between intent and output
3. For failed examples:
a. Check the rerun file for the failure reason
b. Report the failure with the relevant log excerpt
4. Produce a summary report
## Auto-mode behavior
The runner auto-handles:
- Auto-answering common interactive prompts
- Auto-approving HITL, MCP, apply_patch, and shell actions (where supported)
- Skipping examples not suitable for automation (realtime, Next.js apps needing extra runtime)
## Output format
Examples Run Report
Summary
- Total: N
- ✅ Passed: N
- ❌ Failed: N
- ⏭️ Skipped: N
✅ Passed examples
| Example | Intent verified? | Notes |
|---|---|---|
| basic_agent | ✅ | Output matches expected flow |
| tool_use | ✅ | All tools called correctly |
❌ Failed examples
| Example | Error | Log excerpt |
|---|---|---|
| streaming | Timeout after 30s | ConnectionError: ... |
⏭️ Skipped
realtime_voice— requires realtime setup
8. Skill 4: Revisão de release
Esta skill compara a tag da release anterior com o release candidate atual e verifica se está tudo pronto para publicar.
---
name: final-release-review
description: Compare the previous release tag with the current release candidate. Check for backward compatibility, regressions, and missing migration notes. Start from "safe to release" and only block with concrete evidence.
---
# Final Release Review
## Trigger
- Preparing a new release
- Release candidate branch or tag is ready
## Process
1. Fetch the previous release tag: `scripts/get-prev-tag.sh`
2. Diff it against the current `main` (or release candidate):
```bash
git diff <prev-tag>..HEAD --stat
git diff <prev-tag>..HEAD
```
3. Inspect the diff for:
- **Backward compatibility issues** in public APIs and user-facing SDK behavior
- **Regressions**, including smaller changes in expected behavior
- **Missing migration notes** or release-note updates for changes that need them
4. Classify each finding with risk level:
- 🔴 BLOCKING: confirmed regression or breaking change without migration path
- 🟡 MODERATE: behavior change that users should know about
- 🟢 LOW: internal refactor, no user impact
5. Make overall release readiness call
## Gate decision rules
- Start from "**safe to release**"
- Switch to **blocked** ONLY when the diff shows concrete evidence of a real problem
- Every blocked call MUST include a specific unblock checklist
## Output format
Release readiness review
Release call:
🟢 GREEN LIGHT TO SHIP.
OR
🔴 BLOCKED.
Scope summary:
- N files changed (+X/-Y); key areas touched: ...
- Risk: 🔴/🟡/🟢
- Evidence:
- Action:
Unblock checklist (if blocked):
- [ ] ...
Exemplo real do repositório Python da OpenAI (PR #2480):
Release readiness review (excerpt)
Release call:
🟢 GREEN LIGHT TO SHIP. Minor-version bump includes expected breaking change
(Python 3.9 drop) with no concrete regressions found.
Scope summary:
- 38 files changed (+1450/-789); key areas touched: `src/agents/tool.py`,
`src/agents/extensions/`, `src/agents/realtime/`, `tests/`,
`pyproject.toml`, `uv.lock`.
Python 3.9 support removed
- Risk: 🟡 MODERATE. Users pinned to Python 3.9 will be unable to install the
0.9.0 release.
- Evidence: `pyproject.toml` now sets `requires-python = ">=3.10"` and drops
the Python 3.9 classifier; CI skip logic for 3.9 was removed.
- Action: Ensure release notes clearly call out the Python 3.9 drop and that
packaging metadata remains `>=3.10`.
Script auxiliar: .agents/skills/final-release-review/scripts/get-prev-tag.sh
#!/usr/bin/env bash
# Get the most recent semver tag before the current HEAD
git tag --sort=-v:refname | grep -E '^v?[0-9]+\.[0-9]+\.[0-9]+' | head -1
9. Skill 5: Estratégia de implementação
Antes de editar código de runtime ou API, o Codex deve decidir a fronteira de compatibilidade e a abordagem de implementação.
---
name: implementation-strategy
description: Decide the compatibility boundary and implementation approach before editing runtime or API changes. Use before modifying public APIs, constructors, or behavior.
---
# Implementation Strategy
## Trigger
- Before editing runtime code or public API
- Before changing constructor signatures or dataclass fields
- Before modifying behavior that users depend on
## Process
1. Identify the scope of the change:
- What public APIs are affected?
- What internal code paths are touched?
- What tests and examples will need updating?
2. Determine compatibility boundary:
- Can the change be purely additive?
- If breaking: is there a deprecation path?
- Are there positional parameter constraints?
3. Propose the implementation approach:
- Order of changes (internal first, then public)
- Migration strategy for existing users
- Test plan
4. Get confirmation before proceeding
## Compatibility rules
- Preserve positional meaning of exported constructor parameters and dataclass fields
- Append new optional ones at the end when possible
- Add compatibility tests if reordering is unavoidable
## Output format
Implementation Strategy
Scope
- Affected APIs: ...
- Affected internals: ...
- Tests to update: ...
Compatibility
- Breaking change? yes/no
- Deprecation path: ...
- Positional impact: ...
Approach
- ...
- ...
Test plan
- ...
10. Skill 6: Validação de changesets (monorepo JS)
Esta skill é específica para monorepos JavaScript que usam Changesets. Ela valida que os changesets e bump levels correspondem ao diff real dos pacotes.
---
name: changeset-validation
description: Validate that changesets and bump levels match the actual package diff. Create or update changesets when packages/ or .changeset/ changes. Enforce Conventional Commit summaries and bump-level policy.
---
# Changeset Validation
## Trigger
- Any change under `packages/`
- Any change in `.changeset/`
## Process
1. Check if a branch changeset already exists
2. If yes: update it instead of creating a new one
3. If no: create one
4. Write the changeset summary in Conventional Commit style (one line)
5. Determine the required bump level from the actual package diff
6. Validate the bump level against repo policy
## Repo-specific policy
- Keep the summary to one line in Conventional Commit style (doubles as commit title)
- Before 1.0: avoid major bumps for normal feature work
- Preview-only additions labeled explicitly: treat as patch if they don't change existing behavior
- Validate the required bump level against actual package changes
## Bump level rules
| Change type | Bump |
|------------|------|
| Bug fix | patch |
| New feature (backward compatible) | minor |
| Breaking change | major |
| Preview-only addition | patch |
| Docs only | no bump needed |
## Output format
Changeset Validation
Changeset:
- Summary:
feat: add streaming support to agent runner - Bump: minor
- Packages affected: @openai/agents-core
Validation
- ✅ Bump level matches diff
- ✅ Summary follows Conventional Commit
- ✅ No duplicate changesets
11. Skill 7: Resumo de PR
Esta skill é acionada ao final de trabalho substantivo. Ela coleta automaticamente nome do branch, status da árvore de trabalho, arquivos alterados, diff stats e commits recentes, e produz um bloco pronto para PR.
---
name: pr-draft-summary
description: Create a PR title and draft description after substantive code changes are finished. Trigger when wrapping up a moderate-or-larger change (runtime code, tests, build config, docs with behavior impact) and you need the PR-ready summary block with change summary plus PR draft text.
---
# PR Draft Summary
## Trigger
- Substantive work is finished or ready for review
- Change touched: runtime code, tests, examples, docs with behavior impact, or build/test config
- NOT for: trivial typo fixes, formatting-only changes, single-line comment updates
## Process
1. Collect context automatically:
```bash
git rev-parse --abbrev-ref HEAD # branch name
git status --short # working tree status
git diff --stat origin/main...HEAD # changed files + stats
git log origin/main..HEAD --oneline # recent commits
```
2. Analyze the collected context
3. Produce the PR draft block
## Output format (rigid)
Pull Request Draft
Branch name suggestion
git checkout -b
Title
Description
<2-4 paragraphs describing the change, rationale, and impact>
Exemplo real de saída do pr-draft-summary:
# Pull Request Draft
## Branch name suggestion
git checkout -b fix/tracing-lazy-init-fork-safety
## Title
fix: #2489 lazily initialize tracing globals to avoid import-time fork hazards
## Description
This pull request fixes import-time tracing side effects that could break fork-based process models by moving tracing bootstrap to lazy, first-use initialization.
It updates tracing setup so initialization happens once on first access while preserving the existing public tracing APIs.
It also adds regression tests for import-time behavior, one-time bootstrap, and custom provider handling.
This pull request resolves #2489.
12. Skill 8: Busca de documentação atualizada da API
Esta skill é um wrapper fino sobre o OpenAI Docs MCP oficial. Em vez de deixar o modelo responder de memória, ela instrui o Codex a buscar a documentação atualizada.
---
name: openai-knowledge
description: Pull current OpenAI API and platform documentation through the official Docs MCP. Use for any work touching OpenAI API, Responses API, tools, streaming, Realtime, or MCP integrations.
---
# OpenAI Knowledge
## Trigger
- Work touches OpenAI API or platform integrations
- Implementing or modifying API calls
- Working with Responses API, tools, streaming, Realtime, or MCP
## Process
1. Use the OpenAI Developer Documentation MCP server to look up current docs
2. Search for the relevant API surface
3. Verify parameter names, types, and behavior against current docs
4. Do NOT rely on model memory for API details
## MCP Server Setup
If the MCP server is not configured in your local Codex environment:
1. Follow the Docs MCP quickstart
2. Use the official MCP server endpoint
3. Configure in your Codex settings
## Covered surfaces
- Responses API
- Tools and function calling
- Streaming
- Realtime API
- MCP integrations
- All platform-level features
13. Skill 9: Melhoria de cobertura de testes
Esta skill é report-first: roda cobertura, encontra os maiores gaps e propõe testes de alto impacto. Não edita nada sem aprovação.
---
name: test-coverage-improver
description: Run coverage, find the biggest gaps, and propose high-impact tests. Report-first workflow: inspect coverage artifacts, prioritize what matters, and ask for approval before writing tests.
---
# Test Coverage Improver
## Trigger
- After adding new features
- Before release
- When asked to improve test coverage
## Process
1. Run coverage:
- Python: `pytest --cov=src --cov-report=term-missing`
- TypeScript: `pnpm test --coverage`
2. Parse coverage report
3. Identify the biggest gaps by:
- Lines uncovered (absolute count)
- Critical paths with no coverage
- Public API methods with 0% coverage
4. Prioritize: focus on high-impact, low-effort tests first
5. Present findings as a proposal
6. Ask for approval before writing tests
## Output format
Coverage Gap Report
Overall: XX% (was YY%)
Top gaps by impact
| File | Uncovered lines | Risk | Proposed test |
|---|---|---|---|
| src/core.py | 45 | 🔴 High | Test error path in process() |
| src/utils.py | 32 | 🟡 Medium | Test edge cases in parse() |
Proposed new tests (N)
test_process_error_handling— covers 15 lines, catches silent failurestest_parse_edge_cases— covers 12 lines, validates empty/null inputs- ...
Approval needed
Reply with which tests to implement, or "all" to proceed with all.
14. Skill 10: Atualização coordenada de toolchain (pnpm)
Skill específica para monorepos atualiza a versão do pnpm, o campo packageManager e os pins de workflow juntos, de forma coordenada.
---
name: pnpm-upgrade
description: Update the pnpm toolchain, packageManager field, and CI workflow pins in a coordinated way. Avoid broad search-and-replace.
---
# pnpm Upgrade
## Trigger
- New pnpm version available
- CI workflow needs toolchain update
## Process
1. Check current pnpm version: `pnpm --version`
2. Check latest available: `npm view pnpm version`
3. Update in coordinated order:
a. Update local pnpm: `pnpm self-update` or `npm i -g pnpm@latest`
b. Update `packageManager` field in `package.json`:
```json
"packageManager": "pnpm@X.Y.Z"
```
c. Update CI workflow pins (`.github/workflows/*.yml`):
Find and update any `pnpm/action-setup` version pins
d. Update any other toolchain references
4. Run `pnpm i` to refresh lockfile with new version
5. Verify: `pnpm --version`
## Important
- Update ALL references together — never leave one behind
- Do NOT use broad search-and-replace — update each reference explicitly
- Verify the lockfile is compatible after the upgrade
## Output
pnpm Upgrade: X.Y.Z → A.B.C
Updated
- ✅ Local pnpm: A.B.C
- ✅ package.json:
"packageManager": "pnpm@A.B.C" - ✅ CI workflow: pnpm/action-setup@vN
- ✅ Lockfile regenerated
Verification
pnpm --version→ A.B.Cpnpm i→ clean
15. Escrevendo descrições que funcionam como roteamento
O campo description no frontmatter do SKILL.md não é estilístico — é estrutural. O modelo de progressive disclosure do Codex carrega name e description de todas as skills na inicialização. O corpo completo do SKILL.md só é carregado quando a skill é ativada.
Isso faz da description um dos principais sinais de roteamento antes mesmo de o Codex ler o resto da skill.
Exemplo ruim vs. bom para code-change-verification
❌ Vago (ruim):
description: Run the mandatory verification stack in the OpenAI Agents JS monorepo.
Diz o que a skill faz, mas não diz quando aplicá-la, que tipos de mudanças devem acioná-la, nem se as verificações são opcionais.
✅ Específico (bom — a descrição real usada pela OpenAI):
description: Run the mandatory verification stack when changes affect runtime code, tests, or build/test behavior in the OpenAI Agents JS monorepo.
Exemplo ruim vs. bom para pr-draft-summary
❌ Vago:
description: Create a PR title and draft description for a pull request.
✅ Específico:
description: Create a PR title and draft description after substantive code changes are finished. Trigger when wrapping up a moderate-or-larger change (runtime code, tests, build config, docs with behavior impact) and you need the PR-ready summary block with change summary plus PR draft text.
A descrição boa funciona como metadado de roteamento. Ela diz ao Codex:
- Esta é uma skill de fim de tarefa
- É para mudanças substantivas, não para todo turno de chat
- A saída é um bloco pronto para PR, não apenas um resumo em prosa
⚠️ Lição prática da OpenAI: Se o roteamento das skills parecer não confiável, corrija os metadados antes de adicionar mais código. Gaste tempo na
description.
16. Separando o que vai no modelo e o que vai nos scripts
Uma divisão confiável entre modelo e scripts:
| Fica com o modelo (Codex) | Vai para scripts/ |
|---|---|
| Ler código fonte para inferir comportamento | Rodar comandos de verificação em ordem fixa |
| Comparar logs com comportamento esperado | Iniciar exemplos, coletar logs, gerar rerun |
| Decidir se um diff de release tem risco real | Buscar tag da release anterior |
| Produzir explicações acionáveis | Expor comandos helper (start, stop, status, logs) |
| Interpretação, comparação, report | Trabalho de shell determinístico e repetitivo |
Regra prática: Se o modelo precisa redescobrir a mesma receita de shell toda vez, essa receita deveria ser um script. Se a tarefa depende de contexto, tradeoffs ou explicação, essa parte deve ficar com o modelo.
Exemplo de script helper para examples-auto-run
#!/usr/bin/env bash
# .agents/skills/examples-auto-run/scripts/run-examples.sh
# Usage: ./run-examples.sh [--retry-failed]
set -euo pipefail
MAIN_LOG="/tmp/examples-main.log"
LOGS_DIR="/tmp/example-logs"
RERUN_FILE="/tmp/examples-rerun.txt"
mkdir -p "$LOGS_DIR"
echo "🏃 Running examples in auto mode..."
if [ "${1:-}" = "--retry-failed" ] && [ -f "$RERUN_FILE" ]; then
echo "📋 Retrying failed examples from $RERUN_FILE"
# Run only the failed examples
while IFS= read -r example; do
echo " ↳ $example"
done < "$RERUN_FILE"
else
# Full run
uv run examples/run_examples.py \
--auto-mode \
--write-rerun \
--main-log "$MAIN_LOG" \
--logs-dir "$LOGS_DIR"
fi
echo "📊 Main log: $MAIN_LOG"
echo "📁 Per-example logs: $LOGS_DIR/"
echo "🔄 Rerun file: $RERUN_FILE"
17. Automatizando testes de integração
A OpenAI implementou testes de integração em duas camadas:
Camada 1: Validação de exemplos no repositório (examples-auto-run)
Antes dessa automação, validar exemplos era parcialmente manual — você rodava os exemplos mas a última milha dependia de inspeção visual. Isso não escala.
Para automatizar, primeiro foi necessário construir o suporte para execução não-interativa de exemplos:
- Auto-resposta para prompts interativos comuns
- Auto-aprovação de ações HITL, MCP,
apply_patche shell - Lista de skip para exemplos não adequados para automação (realtime, apps Next.js)
- Logs estruturados por exemplo
- Arquivos de rerun para reexecutar apenas falhas
Comando para Python:
uv run examples/run_examples.py --auto-mode --write-rerun \
--main-log /tmp/examples-main.log \
--logs-dir /tmp/example-logs/
Comando para TypeScript:
pnpm examples:start-all
O runner executa os exemplos e preserva stdout/stderr. O Codex então interpreta os logs:
- Lê o código fonte e comentários do exemplo
- Infere o fluxo pretendido
- Abre o log correspondente
- Compara comportamento esperado com stdout/stderr real
- Faz isso para todos os exemplos bem-sucedidos, não apenas uma amostra
Camada 2: Testes de integração pós-publicação (integration-tests, apenas JS)
Este workflow publica os pacotes em um registry Verdaccio local e testa instalação e execução em múltiplos ambientes:
- Node.js
- Bun
- Deno
- Cloudflare Workers
- Vite React app
Isso pega uma classe diferente de problemas: não "o exemplo roda no repositório?" mas "o pacote se comporta corretamente depois de publicado, instalado e integrado em runtime?".
18. Adicionando verificações de release
O workflow de revisão de release em ambos os repositórios:
- Encontra a tag da release anterior
- Faz diff contra a
mainatual - Pede ao Codex para inspecionar o diff buscando:
- Problemas de compatibilidade retroativa em APIs públicas
- Regressões, incluindo mudanças sutis de comportamento
- Notas de migração ou release notes faltantes - Emite um veredito de release readiness
Regra de decisão do gate: Começa de "seguro para publicar" e só muda para bloqueado quando o diff mostra evidência concreta de um problema real. Todo bloqueio deve vir com um checklist de desbloqueio específico.
19. Rodando workflows no CI com GitHub Actions
Quando uma skill funciona bem localmente, o Codex GitHub Action facilita automatizar o mesmo workflow no CI.
Arquivo: .github/workflows/codex-ci.yml
name: Codex CI
on:
pull_request:
types: [opened, synchronize, reopened]
issue_comment:
types: [created]
jobs:
codex:
# Security: only run on trusted events or with explicit approval
if: |
github.event_name == 'pull_request' ||
(github.event_name == 'issue_comment' &&
github.event.comment.body == '/codex verify')
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v4
- name: Setup environment
run: |
# Install your project dependencies here
# Example for Python:
pip install -e ".[dev]"
# Example for TypeScript:
# corepack enable
# pnpm i
- name: Run Codex
uses: openai/codex-action@v1
with:
openai_api_key: ${{ secrets.OPENAI_API_KEY }}
prompt: |
Run $code-change-verification on the changes in this PR.
Report the results as a PR comment.
Checklist de segurança para GitHub Actions público
A documentação oficial de segurança do Codex GitHub Action recomenda:
- ✅ Limitar quem pode iniciar o workflow
- ✅ Preferir eventos confiáveis ou aprovação explícita
- ✅ Sanitizar inputs de prompt vindos de PRs, commits, issues ou comentários
- ✅ Manter
OPENAI_API_KEYprotegida com drop-sudo ou usuário não privilegiado - ✅ Rodar o Codex como último passo do job
⚠️ Se um workflow tem capacidade de escrita e recebe input público não confiável, o risco está no design do trigger, no handling de input e nos privilégios de runtime em torno da skill — não na skill em si.
20. Codex na revisão de PRs
Desde que o Codex GitHub PR auto review foi disponibilizado, o Codex se tornou um revisor útil na maioria das mudanças de código nos repositórios da OpenAI.
O que o Codex faz bem (review automatizado)
- Bugs de programação simples
- Regressões
- Testes faltantes
- Padrões de correção repetitivos
Para esses casos, depender do Codex como caminho de revisão obrigatório já é seguro na prática.
O que ainda precisa de revisão humana
- Mudanças de API ou arquitetura com múltiplos designs razoáveis
- Mudanças de comportamento que afetam expectativas de produto ou promessas de compatibilidade
- Decisões de nomenclatura, migração e comunicação de release
- Mudanças que exigem alinhamento entre maintainers ou times
O AGENTS.md pode codificar essa divisão: o repositório diz ao Codex o que conta como importante para revisão de corretude, e o Codex aplica essa orientação de forma consistente.
21. Checklist final e próximos passos
✅ Checklist de implementação
- [ ] Criar
AGENTS.mdna raiz com regras obrigatórias de skills - [ ] Criar diretório
.agents/skills/ - [ ] Implementar
code-change-verification(formatação + lint + typecheck + testes) - [ ] Implementar
implementation-strategy(antes de editar APIs públicas) - [ ] Implementar
pr-draft-summary(handoff de PR padronizado) - [ ] Implementar
docs-sync(auditoria de documentação) - [ ] Implementar
examples-auto-run(execução automática de exemplos com logs) - [ ] Implementar
final-release-review(revisão de release com diff) - [ ] Implementar
test-coverage-improver(gaps de cobertura) - [ ] (Monorepo JS) Implementar
changeset-validation - [ ] (Monorepo JS) Implementar
pnpm-upgrade - [ ] Revisar descrições de skills — são específicas o suficiente para roteamento?
- [ ] Extrair trabalho de shell determinístico para
scripts/ - [ ] Configurar Codex GitHub Action para CI
- [ ] Revisar checklist de segurança do GitHub Action
- [ ] Ativar Codex PR auto review
📊 Métricas para acompanhar
Depois de implementar as skills, monitore:
- Número de PRs mergeados por mês (antes/depois)
- Tempo médio de revisão (tempo até o primeiro review)
- Taxa de reprovação no CI (verificações que pegam problemas antes do merge)
- Cobertura de testes (tendência ao longo do tempo)
- Frequência de releases (ciclos mais curtos?)
🔗 Recursos oficiais
- OpenAI Agents SDK para Python
- OpenAI Agents SDK para JavaScript
- Skills no Codex (documentação)
- Custom instructions com AGENTS.md
- Codex GitHub Action
- Skills na API da OpenAI (cookbook)
- Especificação Agent Skills
- Skills na API da OpenAI: melhores práticas operacionais
- Codex for OSS
Resumo
O padrão que a OpenAI estabeleceu nos repositórios do Agents SDK é reproduzível por qualquer projeto open source:
AGENTS.mddiz ao Codex quais workflows são obrigatóriosdescriptionnas skills diz quando rotear para cada workflowscripts/cuida das partes determinísticas- O modelo cuida das partes contextuais
- Codex GitHub Action leva o mesmo processo para o CI
O resultado: trabalho de engenharia do dia a dia mais explícito, mais confiável e com 44% mais PRs mergeados. Comece com code-change-verification e pr-draft-summary — são as skills de maior retorno imediato — e vá expandindo conforme sua confiança no sistema cresce.