Cuando la tarea necesita un workflow propio
La ejecución estándar de Kadu corre la skill en un runner con Node, jq y
Python. Una tarea que depende de una herramienta que el runner no trae, de una
IP de salida conocida o de un runner propio necesita un workflow de GitHub
Actions en el propio repositorio.
El caso de Kobana es el workspace security: el security-scan.yml instala la
suite de pentest, programa el scan semanal y el mensual y corre en un runner
con IP de salida fija. El modelo para copiar es el wh-run-skill.yml del mismo
repositorio: checkout del Playbook, instalación de Claude Code, un stub de
los helpers en /tmp/agent_state.sh, claude -p "/<plugin>:<skill>" --plugin-dir
y set +e alrededor del pipeline.
Dos caminos de ejecución
La tarea pasa a tener dos caminos, y lo que cambia entre ellos no aparece en ningún lugar si no se escribe:
| Lanzamiento por Kadu | Workflow propio | |
|---|---|---|
| Runner | el de Kadu, sin las herramientas | el del workflow, con las herramientas instaladas |
| Variables | solo lo que está en required_secrets | solo lo que el bloque env: del paso mapea desde secrets.*/vars.* |
| Instrumentación | la consola de verdad | el stub, que solo hace eco en el log del run |
| Archivos de salida | $OUTPUT_FILES_DIR, publicado por Kadu | upload-artifact del propio workflow |
Dos consecuencias:
- Toda variable de configuración entra en los dos lugares: en
required_secrets, para Kadu, y en elenv:del workflow, para la agenda. Olvidar un lado hace que la configuración valga en un camino y caiga al valor predeterminado en el otro. - Una herramienta ausente se convierte en pendiente, y no en error. El lanzamiento desde la consola llega sin las herramientas: la skill registra lo que faltó y sigue. Quien necesita la ejecución completa es el workflow.
Un workflow que genera tráfico nace cerrado
Un workflow que genera tráfico contra terceros o contra producción nace
fail-closed: sin la variable de autorización (vars.SECURITY_SCAN_AUTORIZADO=true,
en el caso de Kobana), el job termina en verde con un ::notice y no hace
nada. Un cron en rojo cada semana por falta de configuración se convierte en
ruido que nadie lee.