Contrato de salida · agentic-qa-boilerplate
Tres capas gobiernan cada respuesta en el chat, y hasta hoy dos de ellas se contradecían. Esta página muestra el reparto nuevo y una sesión ficticia de QA renderizada en los dos estilos, para que la diferencia se vea en lugar de leerse.
Cada capa manda sobre una sola dimensión. Cuando dos capas reclaman la misma, se contradicen, y gana la que se reinyecta más veces por turno, no la que tiene razón. Ese era el problema de fondo.
| Capa | Dimensión | Dónde vive | Frecuencia |
|---|---|---|---|
| caveman | cuántas palabras | caveman@caveman (plugin global, nivel full) |
cada turno, vía hook |
| AGENTS.md §2manda | qué se dice, granularidad y registro | Butler + PM Voice + Visual Mapping | cada turno, vía hook nuevo |
| OUTPUT STYLE | cómo se ve y qué textura tiene | ~/.claude/CLAUDE.md |
al arrancar sesión |
backticks, tablas, espaciado) y la textura de las frases
(sin guión largo, longitud variable, sin recap final). Si una regla de ahí cambiara
qué se dice, la regla está mal puesta y pertenece a §2.
Ticket ficticio UPEX-482, login con 2FA. Mismo trabajo, misma información,
misma longitud aproximada. Solo cambia cómo llega.
Nueve acciones, todas aplicadas y verificadas con bun run repo:check. Las dos
últimas tocan ficheros que registran ejecución de código, así que necesitaron aprobación
explícita antes de ejecutarse.
De 71 líneas a 46, y de cuatro listas negras a tres bloques (dos de ellos positivos).
Caen BANNED VOCABULARY, BANNED PHRASES y
BANNED RHETORICAL PATTERNS. Queda una micro-lista de diez palabras con excepción
de uso técnico literal, que es lo que faltaba para poder escribir API key sin esquivarlo.
El formato canónico pasa de topic — fragment a topic: fragment.
La instrucción mandaba usar guión largo mientras la regla global lo prohibía, así que
ninguna corrección iba a funcionar mientras el ejemplo dijera lo contrario.
119 en AGENTS.md y 54 en docs/ai-personality.md. El modelo imita
la densidad tipográfica que ve en sus propias instrucciones, y veía 185 guiones largos contra
una línea que los prohibía. Ahora quedan cero.
La regla obligaba a abrir cada respuesta con una frase de enganche distinta cada vez. Teatro fabricado, y contradecía el rasgo anti-theatre de la propia personalidad. La pregunta de orientación del menú se queda: esa sí navega.
aplicadoCinco puntos de deriva: rutas inexistentes de caveman y de los hooks, 6-component
contra 7-COMPONENT, skills /sdd-* que no se instalan, y una descripción
del fichero global que listaba cosas que ese fichero nunca tuvo. Se añade la sección 3.7
documentando la capa nueva.
.agents/hooks/personality-reinject.mjs guarda el texto una sola vez y tres
adaptadores finos lo registran como UserPromptSubmit:
.claude/settings.json, .opencode/plugins/personality-reinject.js y
.codex/hooks.json. Sin él, PM Voice y Butler se leen una vez y se diluyen mientras
caveman se reinyecta cada turno: la asimetría era mecánica, no editorial. Cuesta unos 30
tokens por turno.
Estaba instalado dos veces. El one-liner oficial corre en modo --all, que
instala el plugin caveman@caveman y además escribe una segunda copia de
los mismos dos hooks en ~/.claude/settings.json. Bloque manual eliminado, plugin
intacto.
La causa raíz no era una instalación mal hecha: el one-liner que este repo recomendaba corre
en modo --all por defecto, y --all instala el plugin y encima
registra hooks propios. cli/install.ts e INSTALLER.md ahora recomiendan
--no-hooks, que conserva el plugin, la cobertura multi-agente que este repo necesita
para OpenCode, y el proxy MCP caveman-shrink.
~/.claude/settings.json. Cualquiera que copiase el comando de
INSTALLER.md acababa con la doble inyección por turno.
# Antes (modo --all implícito): plugin + hooks duplicados curl -fsSL https://raw.githubusercontent.com/.../install.sh | bash # Ahora: mismo alcance, sin el registro duplicado curl -fsSL https://raw.githubusercontent.com/.../install.sh | bash -s -- --no-hooks # Windows: irm | iex no acepta flags (caveman #565), se llama al instalador Node directo npx -y github:JuliusBrussee/caveman --no-hooks