🎯 As duas alavancas com lastro
De tudo que o delta apontou, só duas alavancas sobrevivem à amostra grande e transferem de verdade: pensar antes de agir (Fable 85% vs Opus 54%) e fechar o loop com teste após editar (Fable 41% vs Opus 2%). O resto é ruído ou empate.
✓ Vale a pena copiar
- ✓Pensar antes de agir no não-trivial — 85 vs 54, gap sólido em 4.9k passos.
- ✓Teste após editar — 41 vs 2, a maior alavanca escondida.
- ✓Loop fechado: editou → rodou → confirmou.
✗ NÃO é vantagem
- ✗"Economizar ferramentas": Fable usa 10,45/turno vs Opus 7,96 — faz MAIS.
- ✗read-antes-de-edit: ~37–40% nos dois — empata.
- ✗O "+45pp" do Teste 1 — era amostra de 7 sessões.
💡 Dica prática
Resista à tentação de empacotar dez regras. Duas alavancas com lastro batem dez palpites. O playbook corrigido cabe em um parágrafo: pense antes do não-trivial; depois de editar, rode o teste.
🪝 Injetar a regra focada
A regra corrigida entra via hook SessionStart que lê um .md separado — assim você edita a regra
sem mexer no settings. O script é fail-open (se o arquivo sumir, a sessão segue) e o hook MESCLA no array de
SessionStart existente — não sobrescreve os hooks que você já tem.
// ~/.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" } ] } ] } }
🔎 Três propriedades que importam
- .md separado — edite a regra sem tocar no JSON do settings.
- fail-open — sem o arquivo, imprime
{"continue":true}e sai 0. - mescla — adiciona ao array de
SessionStart; preserva seus outros hooks.
💡 Dica prática
Mantenha a regra curta: as DUAS alavancas. Um additionalContext enxuto é lido; um manifesto longo é ignorado. Aponte para outro arquivo via FABLE_REGRA= quando quiser testar variações.
⚖️ Medir honesto: balancear a amostra
A correção que evita o +45pp falso: cape a amostra pelo nº de passos (ex.: ~950 de cada lado) antes de comparar, e avise quando os tamanhos divergem muito. Sem isso, 4.892 passos do Fable contra 42k do Opus produzem qualquer narrativa que você quiser.
| Teste | Amostra | Pensar (Fable vs Opus) | Veredito |
|---|---|---|---|
| 1 — local | 7 sessões / ~950 | 99% vs 54% (+45pp) | enganoso |
| 2 — capada | ~950 cada (4 sessões) | Opus salta p/ 94% | instável |
| 3 — HF | 4.892 passos / 30 sessões | 85% vs 54% (+31pp) | sólido |
💡 Dica prática
Capar ajuda, mas amostra pequena igual ainda é ruído (Teste 2 com 4 sessões foi instável). A meta é capar E ter passos suficientes dos dois lados — foi o Teste 3 (4.9k) que deu o número defensável de 85 vs 54.
🤗 Referência confiável via HF (sem a lib datasets)
A âncora da amostra grande é o dump CRU de Glint-Research/Fable-5-traces. São arquivos .jsonl do Claude Code (eventos, não
chat achatado). Baixe-os direto pela API do HF — sem instalar a lib datasets — e rode no fable_lib, o mesmo 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
💡 Dica prática
Use resolve/main/<path> para pegar o blob cru (a URL blob/ traz HTML da página). Como já são .jsonl do Claude Code, o fable_lib lê direto — não precisa achatar chat nem mapear schema.
🔁 Reproduzir tudo (e fixar o baseline)
A prova real é reproduzível: rode os mesmos comandos e salve um baseline DATADO num lugar durável (não /tmp, que some).
Sem o baseline guardado, você não consegue dizer depois se o playbook moveu o número.
extract_corpus.py
Lê os .jsonl e produz o corpus de eventos por modelo.
o medidor do HF
Roda o mesmo exercício sobre os 4.892 passos do Fable-5-traces (lado de referência).
compare_models.py
Compara Fable vs Opus já capado, e grava o baseline datado durável.
✓ Baseline bem guardado
- ✓Datado:
baseline-2026-06-15.json. - ✓Durável: no repo/pasta do projeto, versionado.
- ✓Com a amostra registrada (passos/sessões por lado).
✗ Baseline que evapora
- ✗Em
/tmp— some no próximo boot. - ✗Sem data — não dá pra comparar "antes/depois".
- ✗Sem o tamanho da amostra anotado.
📊 Por que datar e guardar
O baseline datado transforma "acho que melhorou" em número. Mede ANTES, aplica o playbook, mede DEPOIS — com amostra suficiente — e o delta fala por si. Sem o ANTES salvo, não há prova.
🧭 O que NÃO transfere
Honestidade acima de hype, para fechar: o que medimos é presença, não conteúdo (o texto do thinking vem cifrado nos logs).
Os pesos do modelo não atravessam — você imita o ritmo, não clona o Fable. E o playbook não é eterno: itere com novos dados.
✓ O que você ganha
- ✓O RITMO bom medido (pensar + testar).
- ✓Uma régua para medir qualquer modelo com logs.
- ✓Um baseline para provar mudança com número.
✗ O que NÃO transfere
- ✗Conteúdo do raciocínio — presença ≠ conteúdo (cifrado).
- ✗Os pesos do modelo — o poder não muda de mãos.
- ✗"Virar Fable" — a identidade não vem junto.
⚠️ Presença ≠ conteúdo
Medimos SE o modelo pensou, não O QUE pensou — o thinking vem cifrado. Foi a amostra pequena que enganou nas duas direções: inflou o "pensar" (99→85) E escondeu o "teste após editar" (0→41%). A régua grande corrige; ela não lê mentes.
💡 Dica prática
Trate o playbook como vivo: conforme acumula sessões, re-meça contra o baseline datado e atualize as alavancas. Honestidade acima de hype — só promova um número quando a amostra grande o sustentar.
🛠️ Resumo do Módulo
SessionStart lê um .md, fail-open, MESCLA no array..jsonl crus do Fable-5-traces pela API e rode no fable_lib.extract_corpus.py + compare_models.py + baseline DATADO e durável.A régua, em uma frase:
Meça balanceado, injete o pouco que tem lastro, e prove com baseline. Honestidade acima de hype.