PTENES
Saltar al contenido
MÓDULO 4.2

🛠️ Las soluciones aplicables

Vista la trampa de la muestra, ¿qué queda de verdad? Aquí están las dos palancas con respaldo, el playbook corregido y cómo medir de forma honesta, inyectar la regla e reproducir el experimento, incluido descargar la referencia sin procesar de Hugging Face y fijar un baseline con fecha.

6
Temas
~28
Minutos
Aplicado
Nivel
Práctica
Tipo
① medir con honestidadmuestra equilibrada ② inyectar la reglahook SessionStart ③ reproducir baseline fechado los logs nuevos retroalimentan — vuelve a medir frente al baseline
1

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

2

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

3

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

4

🤗 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
Fuente

Fable-5-traces (HF)

Formato

.jsonl de eventos

Sin

lib datasets

Se ejecuta en

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.

5

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

1

extract_corpus.py

Lee los .jsonl y produce el corpus de eventos por modelo.

2

el medidor de HF

Ejecuta el mismo ejercicio sobre los 4.892 pasos del Fable-5-traces (lado de referencia).

3

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.

6

🧭 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

✓
Dos palancas con fundamento — pensar (85 vs 54) + prueba después de editar (41 vs 2). Solo esas se transfieren.
✓
Inyectar la regla enfocada — hook SessionStart lee uno .md, fail-open, MEZCLA en el array.
✓
Medición honesta — limita la muestra (~950) y avisa cuando los tamaños difieren; eso fue lo que acabó con el falso +45pp.
✓
Referencia vía HF sin datasets — descarga los .jsonl crudos del Fable-5-traces a través de la API y ejecútalo en el fable_lib.
✓
Reproducir todo — extract_corpus.py + compare_models.py + baseline FECHADO y duradero.
✓
Lo que NO se transfiere — presencia ≠ contenido; los pesos no se transfieren; itera con datos nuevos.

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.