Achado triando o PR #662 (@IanCouto).
O grafo corrompido atravessa a validação
lib/followup/graph-schema.ts:421-424 — flowGraphSchema não tem refine de integridade. Medido, com controle positivo (ele rejeita campo desconhecido, então a sonda está viva):
| entrada |
safeParse |
| aresta apontando para nó inexistente |
success: true |
| dois nós com o mesmo id |
success: true |
| duas arestas com o mesmo id |
success: true |
| campo desconhecido |
success: false ✅ |
O segundo caso é exatamente o defeito da issue #586 — os contadores de id reiniciam a cada montagem do canvas, e o fluxo salvo passa a ter ids repetidos. A porta de saída não o barra.
Por que isto é catraca, e não conserto imediato
Um refine que rejeita fecha duas classes de uma vez: a da #586 e a da cascata de exclusão (aresta órfã). É o conserto certo.
Mas ele tranca quem já tem rascunho corrompido. Alguém com um fluxo salvo com ids repetidos deixaria de conseguir salvar — e a mensagem seria sobre validação, não sobre o que fazer. Isso é decisão de produto, não reconciliação mecânica, e por isso não foi patchado na triagem.
Os caminhos, e o que cada um custa
refine que rejeita, com migração de dados antes — varre os rascunhos, renumera ids duplicados, e só então liga a guarda. Mais caro, e é o único que não deixa ninguém trancado.
refine que rejeita, sem migração — barato, e quem estiver corrompido descobre pela porta fechada.
- Avisar em vez de rejeitar — registra a incoerência (log, aviso na Central) e deixa salvar. Não resolve, mas para de piorar em silêncio.
O #586 continua aberto e é a causa; esta issue é a rede que o teria pego.
Achado triando o PR #662 (@IanCouto).
O grafo corrompido atravessa a validação
lib/followup/graph-schema.ts:421-424—flowGraphSchemanão temrefinede integridade. Medido, com controle positivo (ele rejeita campo desconhecido, então a sonda está viva):safeParsesuccess: truesuccess: truesuccess: truesuccess: false✅O segundo caso é exatamente o defeito da issue #586 — os contadores de id reiniciam a cada montagem do canvas, e o fluxo salvo passa a ter ids repetidos. A porta de saída não o barra.
Por que isto é catraca, e não conserto imediato
Um
refineque rejeita fecha duas classes de uma vez: a da #586 e a da cascata de exclusão (aresta órfã). É o conserto certo.Mas ele tranca quem já tem rascunho corrompido. Alguém com um fluxo salvo com ids repetidos deixaria de conseguir salvar — e a mensagem seria sobre validação, não sobre o que fazer. Isso é decisão de produto, não reconciliação mecânica, e por isso não foi patchado na triagem.
Os caminhos, e o que cada um custa
refineque rejeita, com migração de dados antes — varre os rascunhos, renumera ids duplicados, e só então liga a guarda. Mais caro, e é o único que não deixa ninguém trancado.refineque rejeita, sem migração — barato, e quem estiver corrompido descobre pela porta fechada.O #586 continua aberto e é a causa; esta issue é a rede que o teria pego.