Contexto
O lib-license-go chama shutdownManager.Terminate(...) quando a validação de licença falha, mas o handler default do lib-commons/v5 hoje é fail-open: ele registra ASSERTION FAILED: LICENSE VALIDATION FAILED e não encerra o processo.
Isso permite que serviços subam mesmo após falha de licença, especialmente quando o modo global depende da validação de startup e não revalida licença por request.
Evidência
- Commit que introduziu o comportamento no
lib-commons: 1e12ac1a (feat: unify lib-uncommons baseline into lib-commons v4 (#336))
- O
DefaultHandler deixou de chamar os.Exit(1) e passou a usar apenas assert.Never(...)
- O
lib-license-go herdou o comportamento ao consumir lib-commons/v5 v5.0.2
- Em runtime, o log mostra falha de licença, mas o processo continua executando
Problema
O contrato esperado de fail-closed não está sendo cumprido. WithFailClosed() também é ambíguo/perigoso nesse estado, porque o nome sugere encerramento ou bloqueio efetivo, mas o comportamento atual apenas loga/asserta.
Ajuste esperado
- Garantir que falha de validação de licença em modo fail-closed encerre o processo ou retorne erro fatal para o bootstrap
- Não depender do handler default de
Terminate() para enforcement crítico
- Em modo
global, não liberar requests se a validação de startup falhou
- Revisar o contrato/nome de
WithFailClosed() para refletir comportamento real
- Adicionar teste cobrindo falha de licença sem handler customizado, garantindo que o comportamento default não seja fail-open
Requested by: Marcelo Rangel (Slack)
Contexto
O
lib-license-gochamashutdownManager.Terminate(...)quando a validação de licença falha, mas o handler default dolib-commons/v5hoje é fail-open: ele registraASSERTION FAILED: LICENSE VALIDATION FAILEDe não encerra o processo.Isso permite que serviços subam mesmo após falha de licença, especialmente quando o modo
globaldepende da validação de startup e não revalida licença por request.Evidência
lib-commons:1e12ac1a(feat: unify lib-uncommons baseline into lib-commons v4 (#336))DefaultHandlerdeixou de chamaros.Exit(1)e passou a usar apenasassert.Never(...)lib-license-goherdou o comportamento ao consumirlib-commons/v5 v5.0.2Problema
O contrato esperado de fail-closed não está sendo cumprido.
WithFailClosed()também é ambíguo/perigoso nesse estado, porque o nome sugere encerramento ou bloqueio efetivo, mas o comportamento atual apenas loga/asserta.Ajuste esperado
Terminate()para enforcement críticoglobal, não liberar requests se a validação de startup falhouWithFailClosed()para refletir comportamento realRequested by: Marcelo Rangel (Slack)