Repository navigation
Closed
Labels
apitarefa que diz respeito à API em Java Spring Boottarefa que diz respeito à API em Java Spring Boot
Milestone
Description
T-301 - Gravar na trilha o resultado sobre o qual a etapa agiu
- Componente:
api, com a documentação do banco emdocs/database/. - Depende de: T-300 no
develop. - Data máxima: 05/11/2026
- Estimativa: 3 pontos (Fibonacci)
Entregável
- Migration
032-adiciona-resultado-em-trilhas-auditoria.sqlcom a colunaresultado_id, a chave estrangeira e o índice. -
NoConcluidoDtocom o camporesultado_id. - Gravação de
resultado_idemJobRepository.inserirTrilhaNo. -
modelo-dados.dbmlemodelo-dados.mdatualizados. - Testes da migration, do consumidor e da busca da meta.
Descrição
O evento no-concluido passa a trazer resultado_id, o resultado sobre o qual a etapa agiu. A tabela trilhas_auditoria não tem coluna para ele, e o consumidor da API ignora o campo. Esta tarefa cria a coluna e faz o consumidor gravá-la. A API precisa estar implantada antes de o codegen publicar o campo (T-302).
Contexto e decisões tomadas
- O consumidor está em
ConsumidoresJob.receber(filano-concluido), que chamaJobEventosService.registrarNoConcluido, que chamaJobRepository.inserirTrilhaNo. A deduplicação é pelo índice único deevento_idcomON CONFLICT (evento_id) DO NOTHING. - A coluna é opcional e sem backfill. As linhas existentes ficam com o valor nulo.
- A chave estrangeira aponta para
resultados_simulacao (id), como as que já existem na tabela parasimulacoes,prompts,codigos_geradoseexplicacoes. O resultado é gravado pelo worker antes de o codegen recebê-lo, então a referência existe quando o evento chega. - A permissão da API em
trilhas_auditoriaé de tabela (GRANT SELECT, INSERTem013-cria-trilhas-auditoria.sql) e cobre a coluna nova. Codegen e worker não acessam a tabela. A migration não temGRANT. simulacao_idnão substitui a coluna nova, porque as execuções candidatas da busca da meta não têm linha emsimulacoese o aceite da meta troca o resultado para o qualsimulacoes.resultado_idaponta.- A API não preenche
simulacao_idnas linhas novas. Quem lê a trilha chega à simulação pelo código do resultado, que é único emsimulacoes. Preencher na gravação dependeria da ordem entre consumidores, porque a linha desimulacoespode ainda não existir quando a decisão chega. buscaMetaEmCursolê oencaminhamentoda decisão e a existência de uma decisão posterior da mesma versão. A T-302 mantém o nomedecisaona linha que encerra a busca, e esta tarefa não muda essa consulta.
Escopo
Dentro do escopo
- Migration nova,
NoConcluidoDtoemMensagensRecebidasJob.java,inserirTrilhaNoemJobRepository.javae os testes afetados. docs/database/modelo-dados.dbmle a seçãotrilhas_auditoriadedocs/database/modelo-dados.md.
Fora do escopo
- Rota ou leitura da trilha para o auditor.
- Preenchimento de
simulacao_idfora da geração. - Linhas
confirmacaogravadas porTrilhaDaConfirmacao, que não têm resultado. - Publicação do campo pelo codegen.
Requisitos
Migration
- Criar
api/src/main/resources/db/changelog/changesets/032-adiciona-resultado-em-trilhas-auditoria.sql, seguindo a skill migrations (api/.agents/skills/migrations/SKILL.md) e o padrão de031-preserva-resultado-anterior-ao-aceite-da-meta.sql. O changeset adicionaresultado_id uuid, a constraintfk_trilhas_auditoria_resultado_idpararesultados_simulacao (id)e o índiceidx_trilhas_auditoria_resultado_id. O rollback éALTER TABLE trilhas_auditoria DROP COLUMN resultado_id;. Conferir antes que 032 é o próximo número livre.
Consumo
- Acrescentar
@Nullable UUID resultado_idaNoConcluidoDto. - Em
inserirTrilhaNo, incluirresultado_idna lista de colunas e noVALUES, com o valor do evento. - A violação da chave estrangeira não recebe tratamento próprio. Ela propaga como as das demais referências e volta para a fila, conforme a skill consumidores (
api/.agents/skills/consumidores/SKILL.md).
Documentação do banco
- Em
modelo-dados.dbml, acrescentar à tabelatrilhas_auditoriaa colunaresultado_id uuid [ref: > resultados_simulacao.id], com nota que explica o que ela aponta em cada etapa (a mesma descrição do campo emno-concluido.schema.json, definida na T-300), quando fica nula e por que não substituisimulacao_id. Acrescentar o índice(resultado_id). - Na nota de
evento_id, registrar que a API gera a chave das linhasconfirmacaoe que a linha que encerra a busca da meta usa chave própria, derivada do job e da versão. - Na nota de
simulacao_id, trocar "null p/ nos 1-2" por um texto que diga que só a linha degeracao_codigoo traz e que as demais chegam à simulação pelo código do resultado. - Na seção
trilhas_auditoriademodelo-dados.md, trocar "Uma linha por nó do grafo concluído" por "uma linha por etapa concluída", incluir a colunaresultado_identre as referências e acrescentar o exemplo da conclusão da linha que encerra a busca. No parágrafo da chave de idempotência, registrar as duas exceções do requisito 6.
Observabilidade
- Nenhuma métrica nova. Os logs atuais do consumidor continuam sendo emitidos e não passam a incluir conteúdo da conclusão.
Contexto técnico
- Entradas: evento
no-concluidocomresultado_idopcional. - Saídas: linha de
trilhas_auditoriacomresultado_idquando o evento o traz. - Componentes afetados:
MensagensRecebidasJob.java,JobRepository.java, a migration nova,modelo-dados.dbmlemodelo-dados.md. - Restrições: changeset publicado é imutável; nenhum
GRANT; sem backfill; um serviço por PR. - Referências: migrations (
api/.agents/skills/migrations/SKILL.md), consumidores (api/.agents/skills/consumidores/SKILL.md), logging (api/.agents/skills/logging/SKILL.md),api/src/main/resources/db/changelog/changesets/013-cria-trilhas-auditoria.sql,NoConcluidoConsumidorTests(api/src/test/java/synapse/api/job/NoConcluidoConsumidorTests.java),BuscaMetaAnunciadaTests(api/src/test/java/synapse/api/job/BuscaMetaAnunciadaTests.java),MigrationTests(api/src/test/java/synapse/api/core/persistence/MigrationTests.java),PermissoesDeBancoTests(api/src/test/java/synapse/api/core/persistence/PermissoesDeBancoTests.java).
Critérios de aceitação
- A migration aplica sobre um banco com linhas na trilha e o rollback remove só a coluna.
- Um evento com
resultado_idgrava a linha com a referência. - Um evento sem
resultado_idgrava a linha com a coluna nula, como hoje. - A reentrega do mesmo
evento_idcomresultado_idnão grava segunda linha. - A busca da meta continua aberta pela decisão com
encaminhamentode busca e encerrada pela decisão posterior da mesma versão, com e semresultado_idnas duas linhas. -
PermissoesDeBancoTestscontinua passando sem permissão nova para codegen e worker.
Definição de concluído (DoD)
make checknaapisem falha.- Teste do consumidor exercitando
ConsumidoresJob.recebercom evento real serializado, conferindo a linha gravada e os logs serializados sem conteúdo. modelo-dados.dbmle a migration descrevem a mesma coluna, a mesma chave estrangeira e o mesmo índice.
Observações
- Uma violação da chave estrangeira volta para a fila indefinidamente, como já acontece com as referências existentes. Isso não ocorre no fluxo atual, porque o resultado é gravado antes de qualquer etapa citá-lo.
Metadata
Metadata
Assignees
Labels
apitarefa que diz respeito à API em Java Spring Boottarefa que diz respeito à API em Java Spring Boot
Activity