Skip to content

feat: skill simplicio-autoresearch — loop evolutivo de otimização por métrica (Karpathy autoresearch), com guardrails yool, eval composto anti-Goodhart e receipt de savings por run #95

Description

@wesleysimplicio

Contexto

Adotar o padrão autoresearch do Karpathy (referência: https://github.com/balukosuri/Andrej-Karpathy-s-Autoresearch-As-a-Universal-Skill e o autoresearch-agent do bundle ECC) como skill de primeira classe do ecossistema: mutar um alvo → avaliar contra critérios fixos → manter se o score melhora (commit) → reverter se não (git reset) → repetir, com plateau-break após N runs estagnados.

Por que aqui: este repo já hospeda as skills do ecossistema (.claude/skills/), a infra de paridade (scripts/sync_plugin.py + claims_audit.py) e o gate local (scripts/check.py). A skill vira a 7ª do pacote.

Por que agora: o programa de benchmark/telemetria em andamento (mapper#148, runtime#2775, dev-cli#88, loop#92) cria exatamente as funções-objetivo que este otimizador consome. Cada harness deixa de ser só "prova" e vira eval — o ecossistema passa de medir economia para otimizá-la automaticamente.

NÃO instalar a skill upstream crua — adaptações obrigatórias

A versão upstream conflita com regras deste ecossistema. A nossa skill DEVE incorporar:

1. Guardrails yool §11 (MANDATÓRIO — regra do Victor Genaro)

O "roda indefinidamente" upstream viola a spec. Registrar como agent com:

- yool_id: `agent.dev.autoresearch`
- authority: dev
- lane: background
- agent_terms:
    cpu_quota_pct: 60
    disk_quota_mb: 100
    timeout_s: <cap por run>
    max_iterations: <cap>
    max_token_budget: <cap>

Loop sem cap de iteração/orçamento = bloqueado no review.

2. Isolamento git + disciplina de commit

  • Roda sempre em branch de trabalho isolado (ex.: autoresearch/<alvo>-<data>), nunca em main.
  • O eval inclui o gate do repo alvo (lint + testes) — o loop nunca commita vermelho (regra "commit com vermelho" + hooks pre-commit).
  • Ao final: squash num commit conventional único; o run inteiro é UMA task para o DoD (o diff final + o log de scores é a evidência), não N micro-tasks.
  • hooks/action_gate.py continua ativo dentro do loop (mutação é edição de arquivo alvo, nunca op destrutiva).

3. Eval composto anti-Goodhart (a regra central)

Score nunca é métrica única. Estrutura obrigatória:

  1. Gate binário de correção PRIMEIRO — round-trip lossless, fixtures de conformidade (mapper#149), suíte de testes do alvo. Falhou o gate → score = rejeitado, independente da métrica.
  2. Score DEPOIS — a métrica de otimização (tokens, pass-rate, latência), medida com tokenizador rotulado (política do runtime#2775). Hill-climbing sobre os 5 estimadores divergentes atuais (~30% de desacordo) é passeio aleatório — métrica sem rótulo é inválida.
  3. Critérios binários fixos + validation set fixo (3–5 itens), como no upstream; melhoria só é aceita acima de margem de confiança.

4. Mutação barata (economia primeiro)

O passo de mutação deve preferir o ladder local do simplicio-runtime (qwen 64→600); modelo remoto pago só como stage 5 explícito (--remote + evidência de escalação). Um otimizador que queima tokens frontier indefinidamente contradiz a tese do ecossistema.

5. Receipt por run (dogfooding da telemetria)

Cada run emite um simplicio.savings-event/v1 (runtime#2775): source=autoresearch, baseline = score/tokens do estado inicial, actual = do vencedor, proof.kind + tokenizer id. O log de iterações (score por tentativa, mutações rejeitadas, plateau-breaks) é artefato de evidência em .orchestrator/autoresearch/<run>/.

Entregáveis

  • .claude/skills/simplicio-autoresearch/SKILL.md com o contrato acima (inputs: alvo, comando de eval, critérios binários, validation set, caps)
  • Worker scripts/autoresearch.py (mutate/eval/keep-revert/plateau) com selftest, registrado em claims_audit.py SELFTEST_SCRIPTS e tests/
  • Plateau-break (rewrite completo após 5 runs estagnados) e health-check de critérios (~run 10), como no upstream
  • sync_plugin.py rodado; paridade plugin/ verde no check.py
  • Documentação: quando usar / quando NÃO usar (fit baixo: otimizar código contra pytest = gaming; agent só offline por causa do cache sagrado; copy de marketing só com judge fixo e critérios binários)

Pilotos (issues-irmãs)

  1. mapper — heurísticas do encoder TOON como primeiro alvo (eval = fixtures round-trip + tokens medidos nos artefatos reais)
  2. dev-cli — template de prompt contra o bench A/B
  3. runtime — ladder local como motor de mutação
  4. Fase 2: prompt (textos/few-shot) e marketing (copy compliance-gated)

Fora de escopo por fit baixo: sprint (eval seria pytest → gaming), agent em produção (cache-is-sacred).

Refs: mapper#148, mapper#149, dev-cli#88, runtime#2774, runtime#2775, loop#92, loop#93.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    Status
    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions