Contrato de salida · agentic-qa-boilerplate

Cómo escribe la IA a partir de ahora

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.

AGENTS.md §2 ~/.claude/CLAUDE.md → OUTPUT STYLE caveman@caveman · full 2026-08-17

01El reparto de capas

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.

CapaDimensiónDónde viveFrecuencia
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
Regla
§2 gana siempre sobre contenido. OUTPUT STYLE solo decide el render (títulos, anclas en negrita, 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.

02La misma sesión, los dos estilos

Ticket ficticio UPEX-482, login con 2FA. Mismo trabajo, misma información, misma longitud aproximada. Solo cambia cómo llega.

Pulsa para alternar, o usa
claude · ~/projects/agentic-qa-boilerplate estilo anterior

03Qué se tocó

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.

01 · 02

WRITING STYLE pasa a OUTPUT STYLE

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.

aplicado
03

Viñeta Butler sin guión largo

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.

aplicado
04

Barrido de 173 guiones largos

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.

aplicado
05

Fuera el headline punch

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.

aplicado
08

ai-personality.md resincronizado

Cinco 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.

aplicado
06

Hook de reinyección del contrato

.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.

aplicado
07

Deduplicar caveman

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.

aplicado
09

El instalador deja de propagar el duplicado

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.

aplicado
Causa raíz
El duplicado de caveman no lo provocó una instalación descuidada. El one-liner oficial se describe a sí mismo como "Plugin + hooks + statusline + MCP shrink", o sea que instala el plugin y luego registra una segunda copia de los mismos dos hooks en ~/.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