chore: v2.0.0-alpha.15 — agent loop v2 (desfecho, health/rewind/notify, /qa) - #34
Merged
Conversation
O run sabia o que fez, mas não sabia dizer COMO terminou: "falhou" era um bit. Agora existe vocabulário fechado de 10 desfechos (goal_met, verification_failed, attempt_cap, no_progress, budget_exhausted, breadth_exceeded, blocked_by_gate, engine_exhausted, aborted, failed), gravado em sessions.outcome/outcome_reason. - Migração guardada por PRAGMA table_info + ALTER, e todo leitor sonda a coluna antes de nomeá-la — projeto antigo responde "desconhecido", não estoura. - sessionStart limpa o desfecho no resume: run reaberto não herda o veredito da tentativa anterior. - Run#settle() é first-writer-wins, então o primeiro desfecho a chegar é o que vale, e o painel de fim imprime as rotas de recuperação (fda_id, --resume e a linha do veredito) só quando o desfecho é limitável. - stop.mjs: attempt_cap, no_progress_window, budget_minutes e breadth_ceiling, todos com default em código porque imp/fia.config.yaml é do aluno. - O detector de "sem progresso" é endereçado por conteúdo (path:size,sha1). A primeira versão comparava nome de check e lista de caminhos: um reparo que consertava 11 de 12 falhas assinava igual e cortava o teto de 3 para 1. - Fase de reparo replayada num --resume não conta rodada (repairExecuted). Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Um run que fechou sem cumprir o objetivo deixou no disco tudo o que conseguiu, e o --resume já replaya as fases que passaram. O que ele não sabe é o que um humano considera faltando — então o resume cego ou repete trabalho aceito ou para na mesma parede. O veredito é esse julgamento, escrito: node imp/scripts/verdict.mjs set <fda_id> --missing "…" [--redo <fase>] node imp/fda_sdlc.mjs --fda-id <fda_id> --resume - O resume apaga o resultado salvo das fases nomeadas e a regra normal de replay faz o resto: o preditor do runner não ganhou caso especial (é a parte menos segura de complicar). - Toda fase de agente recebe o escopo no prompt de usuário — o prefixo de sistema segue byte-estável para não quebrar o cache. - One-shot: consumido pelo run que limita, senão limitaria todo resume futuro. - `set` recusa fase que aquele run nunca salvou e imprime a lista: o vocabulário é por FDA (review existe no fda_sdlc, não no fda_plan_build_test) e repetição vem com sufixo (test_1, fix_1). Nome não conferido não derruba nada — a fase seria replayada do disco enquanto o run diria que a re-executou. - O evento bounded_continuation separa redo (aplicado), redo_requested e redo_skipped: pedido não é aplicado, e o registro passa a dizer isso. - Veredito é recusado enquanto AQUELE run segura o lock — veredito sobre run em andamento é chute. Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…no spec Três checagens determinísticas (zero token) e os gates que as cobram no launch. WIKI (wiki-check.mjs) — uma página por subsistema em ai-docs/wiki/, cada uma declarando no frontmatter os caminhos que descreve. O digest do conteúdo declarado, comparado com o carimbado, diz fresh / stale / unverifiable — e distingue as DUAS causas de unverifiable: página que nunca foi ligada (sem `sources:`) e página cujos caminhos sumiram (descreve código que não existe mais). A segunda é drift e reprova; a primeira é lacuna do /absorb. `--stamp` grava digest e data e não toca em mais nada do arquivo (bloco `human` intacto). SEGURANÇA (security-scan.mjs) — 10 regras, saída SARIF e --fail-on. Calibrada contra os dois templates até dar zero falso positivo: NEXT_PUBLIC_* com sufixo _KEY legítimo (POSTHOG) saía como HIGH enquanto SIGNING_KEY tem que sair mesmo. SPEC — `## Flow` com um diagrama mermaid entra no Definition Gate (specHasDiagram/checkSpecDiagram + o gate spec_diagrams). O gate wiki_fresh do launch-check reprova nas TRÊS condições — stale, sources_gone e "nada verificável" —, com remédio diferente para cada uma: contar só o que falha ativamente transformava "não verificado" em "aprovado" (0 fresh · 0 stale · 4 unverifiable imprimia o check verde). Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Três ferramentas de terminal para o que faltava depois do run: medir, desfazer
e avisar.
imp health — nota do loop de trabalho do projeto em cinco dimensões, tirada da
evidência que já está no disco (trace, specs, decisões, wiki, gates). Cada
achado nomeia O COMANDO que conserta; --html escreve um relatório autocontido e
--strict serve para CI.
imp rewind — desfaz um run. Lista os checkpoints, PREVÊ o impacto exato em
arquivos e só restaura com --yes; restore-only, nunca dá reset e nunca reescreve
história. O recorte é baseline..runTip, não baseline..worktree: a primeira
versão teria apagado commits do próprio aluno feitos depois do run, rotulando-os
como "criados pelo run". Run sem commit é recusado, e o que entrou depois é
avisado.
imp notify — ping de fim de run (webhook, Slack, Discord, Telegram), desligado
até o engenheiro ligar; --test manda uma prova. A URL é tratada como segredo
(só o host aparece). O envio é aguardado antes de todo process.exit — um
process.on('exit') nunca terminaria um POST.
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…cos de update DETECÇÃO ÚNICA (src/lib/runtime-health.js). O imp doctor dizia verde com 57 arquivos do runtime faltando e o imp fix respondia "nothing to fix": cada um sondava caminhos diferentes. Agora existe uma regra só, com três consumidores — doctor, fix e o hint do bin/imp.js quando um comando carimbado morre —, e um teste trava que runtimeTrees() não divirja de templateTrees(). Regra geral: quando existe comando de reparo, o detector tem que enxergar exatamente a condição que ele conserta. --UPDATE-RUNTIME NÃO DEIXA MAIS ÁRVORE QUE NÃO CARREGA. O runtime importa a si mesmo; manter UM módulo editado no meio de um runtime novo dá "SyntaxError: does not provide an export named" antes de qualquer linha rodar. Código de runtime agora sempre atualiza (nunca fica atrás de consentimento) e é reportado no resumo; a pergunta por arquivo continua valendo para prompt e config. BLOCO DO HARNESS NO AGENTS.md DESCONGELADO. mergeAgentsMd respondia "skipped" por presença de marcador, e AGENTS.md está de fora do --agent-files replace de propósito — resultado: regra nova no harness só chegava em instalação nova. Agora a resposta é por conteúdo (current / stale / updated / malformed); só o instalador com --agent-files replace reescreve, o imp fix segue restore-only, e bloco sem marcador de fim nunca é reescrito (o limite é desconhecido). imp settings — de onde vem cada configuração (config da máquina, roster do projeto, env), read-only e com segredo redigido. `imp config` sombrearia o `pi config`, daí o nome. ~/.impactus-cli/config.json com dir 0700 / arquivo 0600. Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
… no decision log TUI, viewer e fia-query passam a carregar o desfecho do run: a linha de fechamento (run_end) ganhou classe própria e anda nos filtros Phases (é o último fato de ciclo de vida) e Errors (é a primeira coisa que se procura ao caçar falha) — tipo de evento novo que não entra em evClass E em algum filtro nasce invisível, só aparecendo no "All". decision-log ganha --accepted: a pergunta nomeia a recomendação primeiro e marca (Recommended), e o aluno pode aceitar. O registro vira "- Answer: <recomendação> (accepted)" em vez de ecoar a recomendação no --a, para um leitor futuro distinguir escolha deliberada de default aceito no atacado. --accepted exige --rec e recusa --a junto. Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Comando novo tem que aparecer em todo lugar onde os irmãos aparecem, senão existe só para quem leu o código: - SKILL.md da fia: quatro linhas de verbo imp (health, rewind, notify, settings) na tabela de Routing, mais as linhas de roteamento por pedido. - Cookbooks: run_fda (veredito e o vocabulário de fases por FDA), observability (imp health, imp notify, wiki:check), specs (## Flow), decision-log (--accepted). - Prompts Pi: /absorb constrói e carimba a wiki e explica as duas causas de unverifiable; /spec e /feature escrevem o diagrama de fluxo. - Prompts do scout e do planner: leia a página fresh da wiki em vez de reler o subsistema; stale/unverifiable é pista, nunca resposta. - DOCS.md e README.md: as nove entregas, com o contrato de cada comando novo. Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…linhado aos arquivos A extensão Pi grava /map, /stack, /idea… em imp/data/telemetry (tokens in/out, fases, docs). A TUI ganha a tab 6 Pi (live, histórico, checklist) e o Plan deixa de marcar ?/0/6 quando o artefato já existe no disco. Co-authored-by: Cursor <cursoragent@cursor.com>
Um leftover em :4600 de pasta movida mostrava "No runs yet" enquanto o TUI via o FDA; o badge do run comia as tabs e o clique usava a linha sem truncar. Co-authored-by: Cursor <cursoragent@cursor.com>
…e2e + design audit) Novo FDA verify-only que abre Chromium em 3 viewports (375/768/1280), executa testes e2e derivados das condições de saída do milestone ou spec, audita screenshots contra registry/patterns/tokens e grava relatório durável em ai-docs/qa/. Vídeo opcional (retain-on-failure por padrão). Registrado em todas as superfícies: prompt, SKILL, cookbook, goal, feature, launch, finish, README, DOCS, launch-check (qa_evidence warn). Co-authored-by: Cursor <cursoragent@cursor.com>
O catálogo canônico (pointer cursor, highlight amarelo, overlay = trigger, calendário mês/ano, chrome do DataTable, um componente por card) deixa de viver só no harness e passa a ser apontado pelos prompts, pelo cookbook e pelo teste de tripwire. Co-authored-by: Cursor <cursoragent@cursor.com>
…y, /qa) Empacota o loop do agente: desfecho tipado e condições de parada, continuação limitada, wiki + scan L1, imp health/rewind/notify/settings, /qa no browser e contratos de interação. Pronto para npm publish. Co-authored-by: Cursor <cursoragent@cursor.com>
path.join vazava backslash no relatório (ai-docs\\qa\\…) e quebrava o CI windows-latest. Relativos que entram em markdown seguem o mesmo slash() do wiki-check. Co-authored-by: Cursor <cursoragent@cursor.com>
Primeira falha recuperável do FDA (e breach 100% revertido) tenta de novo uma vez; a segunda é que pergunta. Hidden cycle no sequencer auto-split uma vez. .DS_Store e lixo de OS entram em benign_paths. Co-authored-by: Cursor <cursoragent@cursor.com>
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.
Summary
Empacota o agent loop v2 e deixa a main pronta para
npm publishem2.0.0-alpha.15.imp health,imp rewind,imp notify,imp settingse detecção única do runtime no instalador/qano browser (Playwright e2e + design audit) e contratos de interação auditados no kit, no UI gate e no/qaTest plan
npm test— 1103 pass, 0 failnpm run lint— limponpm publishna main (2.0.0-alpha.15)Made with Cursor