Skip to content

chore: v2.0.0-alpha.15 — agent loop v2 (desfecho, health/rewind/notify, /qa) - #34

Merged
elberrd merged 14 commits into
mainfrom
feat/agent-loop-v2
Aug 17, 2026
Merged

chore: v2.0.0-alpha.15 — agent loop v2 (desfecho, health/rewind/notify, /qa)#34
elberrd merged 14 commits into
mainfrom
feat/agent-loop-v2

Conversation

@elberrd

@elberrd elberrd commented Aug 17, 2026

Copy link
Copy Markdown
Owner

Summary

Empacota o agent loop v2 e deixa a main pronta para npm publish em 2.0.0-alpha.15.

  • Desfecho tipado do run, condições de parada e continuação limitada ("não ficou bom, roda de novo")
  • Wiki mantida, varredura de segurança L1 e diagrama obrigatório no spec
  • imp health, imp rewind, imp notify, imp settings e detecção única do runtime no instalador
  • Superfícies de observação com desfecho + aceite explícito no decision log
  • /qa no browser (Playwright e2e + design audit) e contratos de interação auditados no kit, no UI gate e no /qa

Test plan

  • npm test — 1103 pass, 0 fail
  • npm run lint — limpo
  • Depois do merge: npm publish na main (2.0.0-alpha.15)

Made with Cursor

elberrd and others added 14 commits August 17, 2026 16:17
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>
@elberrd
elberrd merged commit 5928c49 into main Aug 17, 2026
7 checks passed
@elberrd
elberrd deleted the feat/agent-loop-v2 branch August 17, 2026 23:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant