feat(eval): a mutação cara passa pela guarda — EVAL_MUTATE através do mutate.sh - #108
Merged
Conversation
…a suíte antes do primeiro minuto de modelo Último item da #89. Provar que um caso de eval morde é mutar a cópia instalada da skill e rodar o modelo contra ela — e até aqui isso era feito à mão: copiar o repositório inteiro, editar com `perl -0pi`, conferir por `grep`, rodar a cópia. Dois modos de falha, os dois já observados neste repositório. A expressão que não casa faz a run acontecer contra o texto ORIGINAL e volta verde, que se lê como "o caso não morde" ao preço de uma run paga. E rodar uma cópia do `eval.sh` a partir de /tmp resolve `SKILL_ROOT` para `/`, que é o incidente pelo qual a guarda dentro do `fixture()` existe. `EVAL_MUTATE='<expr>'` tira a cópia e o hábito do caminho. A expressão é aplicada à cópia INSTALADA dentro de cada fixture, nunca a este repositório, e passa pelo `scripts/mutate.sh` — a única coisa aqui que compara checksum e aborta. Três decisões que o desenho força, e cada uma nasceu de um defeito: O aborto mora no PREFLIGHT, não no `fixture()`. O `fixture` roda dentro de uma substituição de comando, então um `exit` lá mata o subshell e a suíte segue com um caminho vazio. O preflight roda no processo da suíte, contra uma cópia descartável do arquivo, e sai 2 antes de qualquer fixture existir — 2 e não 1, porque isto é a suíte se recusando a medir, que é resposta diferente de um grader vermelho. A mutação sai em stderr. O `fixture` imprime no stdout o diretório que construiu e os chamadores capturam isso: uma linha de conversa no stdout vira parte do caminho. E o `run_arm` passou a recusar braço sem fixture. Medido, não temido: `( cd "" && pwd )` imprime o diretório atual e sai 0 — ou seja, a falha de qualquer fixture apontaria o modelo para o diretório de onde a suíte foi chamada, que é este repositório. Sete pisos novos (104 no total), e eles cobrem as duas direções: expressão que não casa PARA a suíte; expressão que casa passa (preflight que sempre aborta não é preflight); a edição chega à cópia que o braço lê; o braço mutado ainda começa com árvore limpa; e o `SKILL.md` deste repositório fica byte a byte igual depois de tudo. Quatro invariantes (504 no total) prendem a rota: o `eval.sh` tem de chamar o `mutate.sh`, não pode ter um caminho `perl -0pi` próprio ao lado, e os dois READMEs têm de nomear o interruptor — mecanismo que nenhum README nomeia é mecanismo que a próxima pessoa substitui por uma cópia editada à mão. Os três primeiros foram provados com mutação no próprio `mutate.sh`, num tar descartável: cada um reprova 503/504 quando a rota some.
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
3 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fecha o último item aberto da #89 — o que ficou de fora de propósito porque o
eval.shestava sendo trabalhado em paralelo nas #70 e #83, agora mergeadas.O que muda
EVAL_MUTATE='<expr>' bash scripts/eval.sh yellow-runaplica a expressão à cópia instalada dentro do fixture, através doscripts/mutate.sh. O procedimento antigo era à mão — copiar o repositório inteiro, editar comperl -0pi, conferir porgrep, rodar a cópia — e carregava os dois modos de falha que este repositório já mediu: a edição que não aplica (a run acontece contra o texto original e o verde se lê como "o caso não morde") e oSKILL_ROOTda cópia resolvendo para/.Três decisões, cada uma nascida de um defeito
O aborto mora no preflight. O
fixture()roda dentro de uma substituição de comando: umexitali mata o subshell e a suíte segue com um caminho vazio. O preflight roda no processo da suíte, contra uma cópia descartável do arquivo, e sai 2 antes de existir qualquer fixture — 2 e não 1, porque é a suíte se recusando a medir, resposta diferente de um grader vermelho.A mutação sai em stderr. O
fixtureimprime no stdout o diretório que construiu, e os chamadores capturam isso; uma linha de conversa no stdout viraria parte do caminho.O
run_armrecusa braço sem fixture. Medido, não temido:( cd "" && pwd )imprime o diretório atual e sai 0 — a falha de qualquer fixture apontaria o modelo para o diretório de onde a suíte foi chamada, que é este repositório.Provas
SKILL.mddeste repositório fica byte a byte igual depois de tudo.mutate.sh, a ausência de umperl -0piparalelo, e os dois READMEs nomeando o interruptor.mutate.sh: cada um reprova 503/504 quando a rota some.scripts/test.shverde: 145 gate, 47 guard, 5 rollback, 37 metrics, 504 invariantes, 14/14 mutações.