🎯 Las dos palancas con respaldo
De todo lo que señaló el delta, solo dos palancas resisten una muestra grande y realmente se transfieren: pensar antes de actuar (Fable 85% vs. Opus 54%) e cerrar el ciclo con una prueba después de editar (Fable 41% vs. Opus 2%). El resto es ruido o empate.
✓ Vale la pena copiar
- ✓Pensar antes de actuar en lo no trivial — 85 vs 54, brecha sólida en 4.9k pasos.
- ✓Prueba después de editar — 41 vs 2, la mayor palanca oculta.
- ✓Ciclo cerrado: editó → ejecutó → confirmó.
✗ NO es una ventaja
- ✗"Ahorrar herramientas": Fable usa 10,45/turno vs Opus 7,96: hace MÁS.
- ✗read-antes-de-edit: ~37–40% en ambos — empate.
- ✗El «+45pp» de la Prueba 1: era una muestra de 7 sesiones.
💡 Consejo práctico
Resiste la tentación de empaquetar diez reglas. Dos palancas con fundamento superan diez conjeturas. El playbook corregido cabe en un párrafo: piensa antes de lo no trivial; después de editar, ejecuta la prueba.
🪝 Inyectar la regla enfocada
La regla corregida se incorpora mediante un hook SessionStart que lee un .md por separado — así editas la regla
sin modificar el settings. El script es fail-open (si el archivo desaparece, la sesión continúa) y el hook MEZCLA en el array de
SessionStart existente: no sobrescribe los hooks que ya tienes.
// ~/.claude/settings.json — MESCLE no array existente, não sobrescreva { "hooks": { "SessionStart": [ { "matcher": "startup", "hooks": [ { "type": "command", // lê regra-focada.md e devolve via additionalContext; fail-open "command": "bash ~/projetos/fablelite/hooks/inject-regra.sh" } ] } ] } }
🔎 Tres propiedades que importan
- .md separado — edita la regla sin tocar el JSON de settings.
- fail-open — si falta el archivo, imprime
{"continue":true}y sale con 0. - combina — agrega al array de
SessionStart; conserva tus otros hooks.
💡 Consejo práctico
Mantén la regla breve: las DOS palancas. Un additionalContext lo conciso se lee; un manifiesto largo se ignora. Apunta a otro archivo mediante FABLE_REGRA= cuando quieras probar variaciones.
⚖️ Medir con honestidad: equilibrar la muestra
La corrección que evita el +45pp falso: limita la muestra por el n.º de pasos (por ejemplo, ~950 de cada lado) antes de comparar, y avisa cuando los tamaños difieren mucho. Sin eso, 4.892 pasos de Fable contra 42k de Opus producen cualquier narrativa que quieras.
| Prueba | Muestra | Pensar (Fable vs Opus) | Veredicto |
|---|---|---|---|
| 1 — local | 7 sesiones / ~950 | 99% vs. 54% (+45pp) | engañoso |
| 2 — limitada | ~950 cada uno (4 sesiones) | Opus salta a 94% | inestable |
| 3 — HF | 4.892 pasos / 30 sesiones | 85% vs 54% (+31pp) | sólido |
💡 Consejo práctico
Limitar ayuda, pero una muestra pequeña igual sigue siendo ruido (La Prueba 2 con 4 sesiones fue inestable). La meta es limitar Y tener suficientes pasos de ambos lados — fue la Prueba 3 (4.9k) la que dio la cifra defendible de 85 vs 54.
🤗 Referencia confiable vía HF (sin la lib datasets)
El ancla de la muestra grande es el dump CRU de Glint-Research/Fable-5-traces. Son archivos .jsonl de Claude Code (eventos, no
chat aplanado). Descárgalos directamente mediante la API de HF — sin instalar la lib datasets — y ejecútalo en el fable_lib, el mismo medidor.
# 1. lista os .jsonl crus do repo via API do HF (nada de `pip install datasets`) REPO=Glint-Research/Fable-5-traces curl -s "https://huggingface.co/api/datasets/$REPO/tree/main?recursive=1" \ | python3 -c 'import sys,json; [print(f["path"]) for f in json.load(sys.stdin) if f["path"].endswith(".jsonl")]' \ > files.txt # 2. baixa cada arquivo cru (resolve/main = o blob, não a página) mkdir -p corpus_fable_hf while read f; do curl -sL "https://huggingface.co/datasets/$REPO/resolve/main/$f" \ -o "corpus_fable_hf/$(basename "$f")" done < files.txt # 3. roda o MESMO medidor no fable_lib sobre os .jsonl crus python3 -m fable_lib.measure --glob "corpus_fable_hf/*.jsonl" --cap-steps 950
Fable-5-traces (HF)
.jsonl de eventos
lib datasets
fable_lib
💡 Consejo práctico
Usa resolve/main/<path> para obtener el blob sin procesar (la URL blob/ trae el HTML de la página). Como ya son .jsonl de Claude Code, el fable_lib lee directamente — no hace falta aplanar el chat ni mapear el esquema.
🔁 Reproducir todo (y fijar el baseline)
La prueba real es reproducible: ejecuta los mismos comandos y guarda un baseline FECHADO en un lugar duradero (no /tmp, que desaparece).
Sin guardar la línea de base, después no puedes saber si el playbook movió el número.
extract_corpus.py
Lee los .jsonl y produce el corpus de eventos por modelo.
el medidor de HF
Ejecuta el mismo ejercicio sobre los 4.892 pasos del Fable-5-traces (lado de referencia).
compare_models.py
Compara Fable vs Opus ya recortado y guarda el baseline fechado y duradero.
✓ Baseline bien guardado
- ✓Fechado:
baseline-2026-06-15.json. - ✓Duradero: en el repo/carpeta del proyecto, con control de versiones.
- ✓Con la muestra registrada (pasos/sesiones por lado).
✗ Línea base que se evapora
- ✗En
/tmp— desaparece en el siguiente arranque. - ✗Sin fecha — no puedes comparar «antes/después».
- ✗Sin el tamaño de la muestra anotado.
📊 Por qué poner fechas y guardar
La línea de base fechada convierte «creo que mejoró» en un número. Mide ANTES, aplica el playbook y mide DESPUÉS —con una muestra suficiente—, y la diferencia habla por sí sola. Sin guardar el ANTES, no hay pruebas.
🧭 Lo que NO se transfiere
Honestidad por encima del hype, para cerrar: lo que medimos es presencia, no contenido (el texto del thinking viene cifrado en los logs).
Los los pesos del modelo no se transfieren — imitas el ritmo, no clonas Fable. Y el playbook no es eterno: itera con datos nuevos.
✓ Lo que ganas
- ✓El RITMO bueno medido (pensar + probar).
- ✓Una regla para medir cualquier modelo con logs.
- ✓Una línea de base para demostrar el cambio con cifras.
✗ Qué NO se transfiere
- ✗Contenido del razonamiento: presencia ≠ contenido (cifrado).
- ✗Los pesos del modelo — el poder no cambia de manos.
- ✗"Convertirse en Fable" — la identidad no viene incluida.
⚠️ Presencia ≠ contenido
Medimos SI el modelo pensó, no QUÉ pensó — el thinking viene cifrado. La muestra pequeña fue lo que engañó en ambas direcciones: infló el "pensar" (99→85) Y ocultó la "prueba después de editar" (0→41%). La muestra grande corrige esto; no lee mentes.
💡 Consejo práctico
Trata el playbook como algo vivo: a medida que acumules sesiones, vuelve a medirlo frente a la línea de base fechada y actualiza las palancas. Honestidad por encima de la exageración: promueve una cifra solo cuando una muestra grande la respalde.
🛠️ Resumen del módulo
SessionStart lee uno .md, fail-open, MEZCLA en el array..jsonl crudos del Fable-5-traces a través de la API y ejecútalo en el fable_lib.extract_corpus.py + compare_models.py + baseline FECHADO y duradero.La vara, en una frase:
Mide de forma equilibrada, inyecta lo poco que tiene fundamento y demuestra con un baseline. Honestidad por encima del hype.