Pular para o conteúdo
MÓDULO 4.2

🛠️ As Soluções Aplicáveis

Vista a armadilha da amostra, o que sobra de verdade? Aqui estão as duas alavancas com lastro, o playbook corrigido, e como medir honesto, injetar a regra e reproduzir o experimento — incluindo baixar a referência crua do Hugging Face e fixar um baseline datado.

6
Tópicos
~28
Minutos
Aplicado
Nível
Prática
Tipo
① medir honestoamostra balanceada ② injetar a regrahook SessionStart ③ reproduzir baseline datado novos logs realimentam — re-meça contra o baseline
1

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

2

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

3

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

4

🤗 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 HFsem 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
Fonte

Fable-5-traces (HF)

Formato

.jsonl de eventos

Sem

lib datasets

Roda em

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.

5

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

1

extract_corpus.py

Lê os .jsonl e produz o corpus de eventos por modelo.

2

o medidor do HF

Roda o mesmo exercício sobre os 4.892 passos do Fable-5-traces (lado de referência).

3

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.

6

🧭 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

Duas alavancas com lastro — pensar (85 vs 54) + teste após editar (41 vs 2). Só essas transferem.
Injetar a regra focada — hook SessionStart lê um .md, fail-open, MESCLA no array.
Medir honesto — cape a amostra (~950) e avise quando os tamanhos divergem; foi o que matou o +45pp falso.
Referência via HF sem datasets — baixe os .jsonl crus do Fable-5-traces pela API e rode no fable_lib.
Reproduzir tudoextract_corpus.py + compare_models.py + baseline DATADO e durável.
O que NÃO transfere — presença ≠ conteúdo; pesos não atravessam; itere com novos dados.

A régua, em uma frase:

Meça balanceado, injete o pouco que tem lastro, e prove com baseline. Honestidade acima de hype.