dougladmo/graph-eng
v1.0.0
Planeja e executa tarefas complexas como grafos pequenos com checks verificáveis e evidências locais.
Changelog
1.0.0 — 2026-10-21
A 1.0 troca o motor 0.1 por uma orquestração bidirecional adaptativa. O plano é executado como grafo, e o feedback dos revisores volta por ele com quatro decisões, todas com evidência:
FIX_LOCAL: reparo dentro do nó afetado.REPLAN: replanejamento, no máximo 2 por run.BLOCK: parada com motivo legível.DONE: só com checks reais aprovados, critic aprovado e identidade de contrato atual.
Novo
- Cinco comandos num runner só:
plan,clarify,tasks,implementeeinit.- Cada repositório tem um slot de plano e um de tarefas (a feature corrente).
- O reuso de artefato é conferido; quando é recusado, o motivo fica no journal.
- Esforço só
--effort low|medium|max. O orçamento é contado por papel (bin/budget-policy.mjs). - Papéis e modelos fixos por host, sem flag pública:
- Claude: Opus para planner, plan/design reviewer e critic; Haiku para executor, verifier e synth.
- Codex:
gpt-6.1-solnos papéis fortes,gpt-6-lunanos operacionais.
- Contratos do motor:
- a retomada não dá crédito de orçamento;
- os contadores nunca diminuem;
- o replan tem teto 2;
- o DONE é negado sem checks reais, critic e identidade atual.
- Checks confiáveis:
- só
node --test, com seleção porinputs,outputsefilesaprovados; - a suíte completa roda no gate final, com concorrência 2.
- só
- Manifestos de nó validados:
- os caminhos precisam ser relativos ao repositório;
- um input externo precisa existir e ter fingerprint (
external_inputs_unfingerprintable); - um output precisa estar dentro de
files.
- Janela de proveniência com causa:
provenance_unsealed_window:<id> (causa: …). - Integridade da runDir, lock de workspace e memória entre runs, com seleção por nó e contrato.
- Host Claude isolado:
--strict-mcp-config,--disable-slash-commands,--setting-sources project,locale--permission-mode dontAsk;- escrita só no cwd (
Edit(./**)); - cwd sob
.claudeé recusado comCWD_PROTECTED_PATH; - as negações de permissão voltam no resultado.
- Smoke real com prova de escrita (
write-probe.txtcom nonce). Ele detecta executor que não consegue gravar. - Benchmark real (
bin/graph-benchmark.mjs):- compara a lógica v1 normalizada com a adaptativa;
- avalia com testes de aceitação externos;
- mede custo e tokens por chamada.
- Plugin portátil para Claude Code (
.claude-plugin/) e Codex (.codex-plugin/).
Corrigido
- O executor Claude não gravava nada: o
dontAsksemallowedToolsnegava toda escrita. - O smoke dava falso PASS com worker só de leitura.
- O contexto vazava do ambiente do usuário para cada chamada (cerca de 75k tokens por turno). Com o isolamento caiu para cerca de 6,5k, e o benchmark passou de US$ 88 para cerca de US$ 1.
APPROVEcomaffectedNodespreenchido era rejeitado: o schema agora declara a regra.- Pesquisa sem shell ficava
partialpara sempre: o aceite de pesquisa e de design não exige mais rodar comandos. - Texto livre nos manifestos virava "input mudou" (
provenance_unsealed_window). - Erro do Claude sem
result(is_error) perdia o motivo e o custo. Agora o erro guarda subtype, mensagens, uso e modelo, e o benchmark registra tudo. - No polish, uma área reprovada sem selo deixava a próxima mascarar o motivo real. Agora as áreas seguintes param com o motivo da primeira.
- O planner podia devolver um esforço diferente do pedido (
plan_effort_mismatch). O schema só aceita o esforço do usuário. - O nó refeito por
FIX_LOCALdo critic não recebia o motivo do critic. Agora recebe no prompt. - Sem acesso à web, o aceite de pesquisa podia exigir URL externa e ficar
partialpara sempre. A capabilityagentWebtira essa exigência do planner e do worker. - A correção e o replan do plano podiam reescrever o
doneWhen(original_plan_criteria_changed). OdoneWhenagora é travado no prompt e no schema em todos os caminhos, e a mesma lista em outra ordem é aceita. - O critic podia aprovar (
DONE) respondendo só parte dos critérios (critic_done_evidence_invalid). O schema agora exige um item por critério, com o texto travado. - O verificador do nó reprovava por falta de evidência de
npm test, que só roda no gate final. Agora o prompt diz que a suíte inteira fica para o gate final e que o nó é julgado pelos checks locais. - Um implement reprovado deixava a janela sem selo, e o polish das outras áreas mascarava o motivo com
provenance_frontier_changed_before_window. Agora o polish não roda e mostra qual nó não concluiu. - No polish de uma área com mais de um nó, cada nó era conferido contra o diff da área inteira, e o arquivo do vizinho contava como fora do grant. Agora a janela é conferida contra o grant da área, e cada nó só pelos arquivos dele.
- Um dependente fora da área, revalidado no polish, herdava o selo da janela antiga e o registro dele vencia no fim (
node_record_stale_at_completion). Agora a revalidação descarta o selo herdado e sela a janela nova.
Removido
- Fluxo 0.1 de
effort × ceiling:manual,auto,high,maxAgentseeconomy. - CLI
graph-confige CLIgraph-resume. - Fila de ações do painel: pedidos, sessão ouvindo e as rotas
POST /api/requests*. O painel agora é só visualização ao vivo.- Saíram
bin/requests.mjs,bin/ui/actions.mjs,bin/ui/commands.mjs,GET /api/listenerse o consumo de pedidos nograph-watch. A parada da run passa a ser só por silêncio, eeventssai logo depois do TERMINADO. - A gaveta de artefatos continua, só leitura (
bin/ui/artifacts.mjs).
- Saíram
- Skill e comando antigos
graph-eng:graph-enge/graph-eng:painel. Useinit.
Benchmark
- Rodada real f366 (Claude):
DONEcom aceite externo 10/10 e sem falso DONE, em 21 chamadas, por US$ 0,80. O modelo forte responde por cerca de 95% do custo. Detalhe emdocs/validation/graph-eng-2-benchmark.md.
Limites conhecidos
- O host Codex real (smoke e benchmark) ainda não foi validado. Só o Claude tem evidência real.
0.1.0
Primeira versão: motor 0.1 com painel web.