Skip to content

agent-dispatch: reglas coherentes, instalación probada, ejemplos de decisión y CI - #1

Merged
Octonove merged 13 commits into
mainfrom
claude/intelligent-ritchie-7ujiza
Oct 15, 2026
Merged

Octonove merged 13 commits into
mainfrom
claude/intelligent-ritchie-7ujiza

Conversation

@Octonove

@Octonove Octonove commented Oct 15, 2026 •

Copy link
Copy Markdown
Owner

Revisión de agent-dispatch hecha como la haría un usuario nuevo, con los arreglos y una comprobación automática en CI. Antes de fusionar pasó además una revisión adversarial con varios agentes. Licencia y bloque de donación sin tocar (comprobado con diff en los dos README).

Qué he encontrado, ordenado por gravedad

# Gravedad Problema Dónde Arreglo
1 Alta La descripción dice «Always-on rule», pero en Claude Code una skill no está siempre activa. Solo la descripción está siempre en contexto, y el cuerpo carga cuando la descripción encaja con la petición. Además, la descripción empezaba por la lista de clientes y no por cuándo usarla, que es lo que decide si se activa. SKILL.md:3, es/SKILL.md:3 La descripción se reescribe en torno a los disparadores: antes de lanzar un subagente, agentes en paralelo, un flujo o un bucle. El README dice que no está siempre activa y da la línea de CLAUDE.md que lo consigue.
2 Alta El ejemplo principal contradice la regla 0. Delega el diseño y el código, que son una cadena secuencial y no partes paralelas; la justificación, «porque el usuario quiere medir», no es ninguno de los dos criterios. También delega la pasada de lint y tests, que es un comando, y la regla dice que eso «nunca es razón para delegar». El README, el GIF y los PNG repiten ese reparto de 9 agentes. SKILL («Worked example»), examples/chrome-extension*.md, README, docs/* Pasa a 5 agentes (1 medio y 4 pequeños). Diseño, código, lint con tests y revisión final se hacen en línea. Imágenes regeneradas.
3 Alta La salvaguarda 5 exige que el tope vaya en la línea del despacho, pero ninguna línea de ejemplo lo llevaba. SKILL §4, README, ejemplos, GIF Todas las líneas llevan cap: … / tope: ….
4 Alta La salvaguarda 2 («no se reintenta en el mismo modelo») choca con la 5 («un reintento del mismo enfoque»): no queda claro dónde va el reintento. SKILL §3 El único reintento de un agente pequeño o medio va un nivel más arriba. En el nivel de la sesión, el trabajo vuelve a hacerse en línea.
5 Media «El de abajo más una verificación del de arriba sale más barato» es una afirmación de coste que nadie ha medido. Además choca con «ningún agente cuyo único trabajo sea recomprobar». SKILL §2 Se elige el nivel de abajo y lo comprueba la revisión final.
6 Media No decía cómo aplicarlo en Claude Code. La herramienta Agent acepta model (haiku, sonnet…) y effort en cada llamada (2.1.292+); sin eso, el agente no sabe qué parámetro tocar. SKILL §2 Nueva columna «Llamada a Agent en Claude Code».
7 Media Faltaba una regla para cuando la sesión ya corre el modelo medio (no hay nivel por encima) y para escalar desde el nivel de la sesión. SKILL §2–3 «Nunca por encima del modelo de la sesión»; desde arriba del todo, el trabajo vuelve en línea.
8 Media Pedía reportar el gasto «separando pequeños y grandes» cuando hay tres niveles, y no decía de dónde sale la cifra. SKILL §4 Gasto por nivel. En Claude Code, el recuento de tokens que devuelve cada subagente, o /usage.
9 Media Los encargos del ejemplo no llevaban los seis campos de la salvaguarda 4: esa salvaguarda se añadió en 6d47a42 y los ejemplos no se actualizaron. examples/chrome-extension*.md Cada encargo lleva objetivo, contexto, restricciones, foco de revisión, salida (con veredicto) y criterio de terminado.
10 Media «Ejecutar scripts» aparecía como trabajo mecánico delegable (en la descripción, la tabla y el README), en contra de la regla 0. Frontmatter y §1 del SKILL, README Sustituido por «recortar un log largo a sus errores».
11 Media Cifras sin fuente verificable: «Sin la skill: 9 agentes en el modelo de la sesión» es un contrafactual que nadie ha medido, y «55 cartas, 9 gratis» de Invokard no se puede comprobar desde aquí. README EN/ES Eliminadas.
12 Media Instalación incompleta. No había plugin ni marketplace, ni forma de comprobar que la skill había cargado. Para Cursor faltaba el frontmatter de la regla y la opción de instalarla como skill, y el README en español mandaba copiar el SKILL.md en inglés. README EN/ES Instalación por cliente, con comandos probados donde ha sido posible (ver abajo).
13 Media Longitud: el cuerpo incluía el ejemplo trabajado completo y un párrafo promocional que no da ninguna instrucción al agente. SKILL EN/ES Ejemplo resumido con enlace; la promoción queda solo en el README.
14 Baja «Antigravity» en la descripción: no he podido confirmar que permita elegir modelo por subagente (su documentación se contradice). Descripción Quitado; la skill habla de cualquier cliente.
15 Baja «Claude Code le pasa a cada subagente el modelo de la sesión»: según la documentación es cierto salvo que la llamada, la definición del subagente o CLAUDE_CODE_SUBAGENT_MODEL fijen otro. README Frase matizada, con enlace a la documentación.
16 Baja Numeración «0, 0b, 1…5», títulos distintos en EN y ES, y los anglicismos «briefeado» y «briefing» frente a «encargo». SKILL EN/ES Secciones 1–7 con el mismo título en los dos idiomas y «encargo» en ES.
17 Baja «The five guardrails the skill enforces»: un prompt no puede imponer nada. README Ahora dice «tells the agent to keep».
18 Baja No había CI ni nada que comprobara que EN y ES siguen iguales; el historial muestra commits gemelos hechos a mano. Repo scripts/check.py y un workflow.

Secretos: he buscado patrones habituales (claves, tokens, sk-, ghp_, AKIA, claves privadas) en todo el historial y no he encontrado ninguno. El correo de PayPal y las direcciones USDC son datos de donación públicos.

Qué he cambiado y por qué

Trece commits pequeños, cada uno revisable por separado. Primera tanda:

  1. skill: SKILL.md y es/SKILL.md. Corrige los puntos 1, 3–8, 10 y 13–16 manteniendo las 7 reglas y las 5 salvaguardas.

  2. examples: El ejemplo de la extensión de Chrome pasa a cumplir las reglas (puntos 2 y 9). Además hay un nuevo examples/decisions{,.es}.md con 10 casos:

    • tres sin delegar: renombrar, una segunda opinión, CI en rojo;
    • dos con un agente: mapear un módulo y recortar un log enorme;
    • dos con varias parcelas: una migración en tres paquetes y la petición de «tres revisores», que se convierte en uno con checklist;
    • un agente pequeño que falla;
    • una sesión que ya corre en Sonnet;
    • la extensión de Chrome.

    El fichero termina con la tabla de nombres de modelo por cliente.

  3. plugin: El repositorio pasa a ser su propio marketplace, con dos plugins: agent-dispatch (el SKILL.md de la raíz) y agent-dispatch-es (es/). No hay copias de la skill porque Claude Code carga como skill el SKILL.md de la raíz de un plugin. No lleva version a propósito: así se usa el SHA del commit y cada cambio llega con claude plugin update, sin tener que subir la versión a mano.

  4. readme: Instalación probada (punto 12), afirmaciones precisas (puntos 11, 15 y 17) y el ejemplo nuevo.

  5. ci: scripts/check.py y .github/workflows/checks.yml.

  6. docs: GIF y PNG regenerados con el reparto correcto, el tope en la línea del despacho y sin el «9/9 done · review: pass» inventado. El texto alternativo del GIF lo marca como ilustración.

Segunda tanda, salida de la revisión previa a la fusión (siguiente apartado): 7 commits (skill:, readme:, examples:, dos ci:, docs: y chore:).

Coste del SKILL.md estimado por claude plugin details, antes y después:

Versión Siempre en contexto Al invocarse
EN de ~200 a ~170 tokens de ~2,5k a ~2,2k tokens
ES de ~270 a ~250 tokens de ~3,3k a ~3k tokens

La rebaja es moderada porque también se ha añadido precisión: la correspondencia con Claude Code, la regla de la sesión en el modelo medio, la línea «0 agentes» y la herencia del nivel de juicio.

Revisión previa a la fusión

Primera ronda. Un flujo de 31 agentes: 5 revisores, uno por dimensión (significado EN/ES, coherencia de reglas, instalación y plugin, script de CI y afirmaciones), y un escéptico por hallazgo que intentaba refutarlo. Salieron 26 hallazgos: 11 confirmados y 15 descartados. Los descartados eran preexistentes, hipotéticos o de estilo.

Arreglados:

  • Nivel de juicio. Un effort: "high" fijo podía dejar a un revisor final delegado por debajo del esfuerzo de la sesión, en contra de la salvaguarda 1. Ahora el juicio no pasa ni model ni effort y hereda los dos. Se avisa de que solo hereda con un tipo de subagente cuya definición no fije ninguno, y de que con CLAUDE_CODE_SUBAGENT_MODEL fijado hay que pasar el alias de la sesión. Es un cambio de regla que conviene que revises.
  • La salvaguarda 5 citaba «regla 2»; ahora cita «salvaguarda 2».
  • Los encargos de ejemplo piden un veredicto, como exige la salvaguarda 4.
  • /reload-skills también hace falta cuando la carpeta .claude/skills del proyecto se crea a mitad de sesión.
  • Un plugin instalado o actualizado desde la terminal necesita /reload-plugins. Comprobé que el comando existe en el CLI.
  • El comando de la regla de Cursor creaba una regla vacía y salía con 0 si fallaba la descarga. Ahora no crea nada y devuelve el error de curl (probado en bash y dash).
  • La línea «Qué te da» en ES dice «tope: 1 ronda de corrección».
  • El apartado Contribuir describe bien cuándo corre la CI.
  • check.py comprueba los enlaces dentro de títulos y las cifras dentro de bloques de código del SKILL.md.

Segunda ronda. Dos verificadores sobre esos arreglos encontraron 4 huecos más, ya corregidos:

  • la definición del subagente también puede fijar model o effort;
  • la misma salvedad faltaba en el README y en la tabla por cliente;
  • las cifras de tokens del README se habían quedado viejas;
  • check.py dejaba que un cambio de cifra en la prosa se anulara con otro en un bloque de código.

Despacho de todo el trabajo, siguiendo la propia skill. Gasto según el recuento de cada herramienta; la sesión principal no está medida aquí.

Fase Agentes Tokens
Documentación 2 medios (Sonnet) 397 486
Revisión previa a la fusión 31, modelo de la sesión 2 898 936
Verificación de los arreglos 2, modelo de la sesión 304 209

Tope: 2 rondas. Después de la segunda no se abrió otra; solo se pasaron las comprobaciones.

Cómo lo he verificado

Línea base, antes de cambiar nada

  • El repositorio no tiene tests, lint, comprobación de tipos ni build. No había nada que ejecutar.
  • claude plugin validate . (Claude Code 2.1.300) fallaba con No manifest found in directory.
  • python3 scripts/check.py contra el estado original daba 3 errores: SKILL.md: 1400 words, es/SKILL.md: 1424 words y la falta de marketplace.

Estado final (b96da36)

  • python3 scripts/check.py termina con All checks passed.:

    parity       4 EN/ES pairs: SKILL.md, README.md, examples/chrome-extension.md, examples/decisions.md
    links        52 links checked in 8 Markdown files
    length       SKILL.md: 1174 words (limit 1300)
    length       es/SKILL.md: 1277 words (limit 1300)
    plugins      2 plugins in .claude-plugin/marketplace.json
    
  • claude plugin validate . y claude plugin validate es pasan, con avisos solo por la falta de version.

El comprobador detecta los fallos de verdad. Cada copia rota a propósito falla con el error esperado y la copia intacta pasa:

  • una salvaguarda borrada;
  • una cifra cambiada;
  • YAML inválido;
  • un name en mayúsculas;
  • un ancla rota;
  • una URL de curl rota;
  • un enlace relativo roto;
  • una carpeta skills/ que tapa el SKILL.md de la raíz;
  • un SKILL demasiado largo;
  • código en línea distinto entre EN y ES;
  • falta del gemelo en español;
  • un enlace y una imagen rotos dentro de un título;
  • la línea de despacho cambiada solo en el bloque de código;
  • un cambio en la prosa compensado con otro en el código.

Instalación en Claude Code, en un CLAUDE_CONFIG_DIR o HOME aislado:

  • claude plugin marketplace add, install y details muestran una skill por plugin.
  • La instalación desde GitHub con Octonove/agent-dispatch#claude/intelligent-ritchie-7ujiza funciona.
  • Los curl del README descargan bien, y claude plugin validate ~/.claude/skills pasa.

CI en verde en b96da36 (ejecución 4): los dos jobs pasan.

Qué no he podido verificar aquí

  • Sesión interactiva de Claude Code. No he podido comprobar /skills, /agent-dispatch ni la activación automática por la descripción: haría falta una sesión que consume API. Esos detalles salen de la documentación oficial.
  • Cursor, Codex, Gemini CLI, GitHub Copilot y OpenCode. No están instalados aquí; sus datos salen de la documentación de cada fabricante, leída a través de resúmenes de búsqueda. La tabla por cliente los marca como «sin probar».
  • Enlaces externos. invokard.web.app, img.shields.io y Octonove/crbro-memory están fuera del alcance de esta sesión, y tampoco he podido comprobar la «sección 1G de El Orquestador».

Pendiente para Antonio

  • Revisar el cambio de regla del nivel de juicio: pasa de esfuerzo «alto» a «el de la sesión».
  • Cifras de Invokard. Si quieres recuperar «55 cartas, 9 gratis», vuelve a ponerlas con un enlace donde se puedan comprobar.
  • version en plugin.json. Ahora no lo lleva y las actualizaciones siguen al SHA del commit. Si lo añades, tendrás que subirlo en cada cambio.
  • Nombre del marketplace. Se llama agent-dispatch; renómbralo si quieres uno común de Octonove.
  • Mantenimiento de la CI. Fija @anthropic-ai/claude-code@2.1.300 (actualízalo de vez en cuando) y avisa de que actions/checkout@v4 y actions/setup-python@v5 siguen en Node 20.
  • Margen de longitud. es/SKILL.md está a 1277 de 1300 palabras: cualquier frase nueva obligará a recortar otra.
  • Después de fusionar. Prueba en una sesión real con /plugin marketplace add Octonove/agent-dispatch y /plugin install agent-dispatch@agent-dispatch, y la instalación en Cursor.
  • Despliegue. No he publicado releases, etiquetas ni despliegues.
  • Rotación de claves. No he encontrado secretos, así que no hay nada que rotar.

🤖 Generated with Claude Code

claude added 13 commits October 15, 2026 16:14
- Description: lead with when to use it (before any subagent, parallel
  agents, workflow or loop) instead of "always-on", which a skill is not:
  only the description is always in context.
- Section 4 maps each tier to the Claude Code Agent call (model, effort)
  and says what to do when the session already runs the mid model.
- Guardrail 2 and 5 no longer contradict each other: the one retry of a
  small or mid agent goes one tier up.
- "Lower tier plus a verification by the upper one is cheaper" was an
  unmeasured claim and clashed with "no agent that only re-checks": the
  final review checks it instead.
- The dispatch line now carries the loop cap, as guardrail 5 requires.
- Measure per tier (three tiers, not "small and large") and say where
  Claude Code reports it.
- The worked example no longer delegates design, code or the lint/test
  run, which section 1 forbids; the long version moves to examples/.
- Sections numbered 1-7, same headings in both languages; the promo
  paragraph moves out of the skill (it stays in the README).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QqAvEGjgdsAP9PQfC2SUoc
…/ES)

chrome-extension: design, code and the lint/test run stay inline, as
section 1 asks (they are a chain and a command, not parallel work); the
tests (mid) and four translations (small) are the five delegated agents.
Briefs carry the six fields of guardrail 4, the dispatch line carries
the loop cap, and the spend line covers the three tiers.

decisions: ten short cases (no delegation, one agent, several slices,
escalation, a session already on the mid model) and the model names per
client. Only the Claude Code row is tested here; the others are marked
as checked against vendor docs, untested.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QqAvEGjgdsAP9PQfC2SUoc
The repository is its own marketplace with two plugins: agent-dispatch
(root SKILL.md) and agent-dispatch-es (es/SKILL.md). Claude Code loads a
plugin with SKILL.md at its root, no skills/ folder and no "skills" key
as a single skill, so no copies of the skill are needed.

No "version" on purpose: Claude Code then uses the commit SHA, so users
get every change with `claude plugin update` without manual bumps.

Tested: `claude plugin validate .` and `es` pass (warnings only for the
missing version); `claude plugin marketplace add <path>`, `install` and
`details` load one skill per plugin.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QqAvEGjgdsAP9PQfC2SUoc
…s (EN/ES)

- Install: Claude Code personal skill, project skill and plugin (with
  the one-step command, updates and how to check it loaded), Cursor as a
  skill or as an always-applied rule (frontmatter included), and the
  .agents/skills/ path that other Agent Skills clients read.
- Say plainly that a skill is not always on and give the one CLAUDE.md
  line that makes it fire whenever delegation comes up.
- The default-model claim now matches the Claude Code docs (a model set
  on the call or in the subagent definition wins).
- Worked example follows the skill's own rules: 5 delegated agents, not
  9; design, code, lint/tests and the final review stay inline.
- Removed the "without the skill: 9 agents on the session's model"
  counterfactual (never measured) and the Invokard card counts (not
  verifiable from here).
- Mechanical examples no longer include running a script, which rule 1
  says is never a reason to delegate.
- Donation block untouched (checked with diff).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QqAvEGjgdsAP9PQfC2SUoc
scripts/check.py (Python + PyYAML) fails when:
- SKILL.md or es/SKILL.md has invalid YAML frontmatter, a name outside
  the Agent Skills rules, or a description over 1024 characters;
- an English doc has no Spanish twin, or the twins differ in headings,
  tables, lists, images or code blocks; for SKILL.md also in inline code
  and numbers per section, so a rule changed in one language fails;
- a relative link, anchor, image or URL into this repository (the curl
  install lines included) points to nothing;
- either SKILL.md passes 1300 words (the old ones had 1400 and 1424);
- the marketplace or plugin manifests are invalid or would hide the
  root SKILL.md.

`claude plugin validate` does not catch broken skill frontmatter (tried
here), so it runs as a second job, pinned to the tested version.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QqAvEGjgdsAP9PQfC2SUoc
The demo GIF and both example cards showed 9 agents (design, code and
the lint/test run delegated), which the skill's first rule forbids. They
now show 5 agents (1 mid, 4 small) with design, code, checks and review
inline, the loop cap on the dispatch line, and a spend line that says
"as the tool reports it, or not measured" instead of a made-up
"9/9 done, review: pass". The README alt text marks the GIF as an
illustration, not a recorded run. Same sizes, palette and fonts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QqAvEGjgdsAP9PQfC2SUoc
Pre-merge review findings:
- A fixed effort "high" on judgment-tier calls could run a delegated
  final reviewer below the session's effort, which guardrail 1 forbids.
  Judgment now passes neither model nor effort, so both are inherited.
- Omitting model only inherits the session's model when
  CLAUDE_CODE_SUBAGENT_MODEL is unset; say so and what to pass instead.
- Guardrail 5 pointed at "rule 2"; the retry rule is guardrail 2.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QqAvEGjgdsAP9PQfC2SUoc
…/ES)

Pre-merge review findings:
- Judgment tier: the session's effort, not "high"; mention
  CLAUDE_CODE_SUBAGENT_MODEL in the default-model sentence.
- /reload-skills also applies to a project .claude/skills created
  mid-session; plugins installed or updated from the shell need
  /reload-plugins in an open session.
- The Cursor rule command wrote an always-applied rule with no body and
  exited 0 when the download failed; it now downloads first and creates
  no file on failure (tested in bash and dash).
- Spanish "Qué te da" line: "tope: 1 ronda de corrección", as elsewhere.
- Contributing: CI runs on pull requests and pushes to main, and also
  runs claude plugin validate.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QqAvEGjgdsAP9PQfC2SUoc
Guardrail 4's return contract asks for a verdict; the three example
briefs now do. The Claude Code row of the client table matches the
skill: no model and no effort for judgment, unless
CLAUDE_CODE_SUBAGENT_MODEL is set.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QqAvEGjgdsAP9PQfC2SUoc
Two false negatives found in the pre-merge review: links and images in
a heading were never checked, and the EN/ES number parity ignored code
blocks, so the dispatch line and its cap could drift between languages.
Both now fail; the clean repository still passes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QqAvEGjgdsAP9PQfC2SUoc
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QqAvEGjgdsAP9PQfC2SUoc
…r (EN/ES)

Second-pass review: a subagent definition can also set model or effort,
so the judgment tier inherits the session's only through a type whose
definition sets neither; with CLAUDE_CODE_SUBAGENT_MODEL set, pass the
session's alias. Same caveat in the README tier paragraph and the client
table. README token figures re-measured with `claude plugin details`
(~2,200 EN, ~3,000 ES on invoke).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QqAvEGjgdsAP9PQfC2SUoc
Pooling them let a prose change cancel an opposite change in a code
block (e.g. "0 agents" -> "1" plus "cap: 1" -> "0"), which the old check
caught. Each source is now compared on its own.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QqAvEGjgdsAP9PQfC2SUoc
@Octonove
Octonove merged commit 7390815 into main Oct 15, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants