Files

533 lines
15 KiB
Markdown

# Runbook de produção — Runtime de consolidação de artigos
**Versão:** 1.0
**Data:** 23 de agosto de 2026
**Escopo:** operação do runtime; self-healing excluído
**Regra mestre:** operar e recuperar todos os requisitos de produção com procedimentos mínimos, explícitos e auditáveis, sem soluções emergenciais que aumentem a complexidade ou violem os contratos.
## 1. Objetivo
Orientar implantação, operação, diagnóstico, recuperação, reprocessamento e rollback manual do runtime.
## 2. Princípios operacionais
- Não publicar saída que falhou em grounding, ECP ou persistência.
- Não corrigir produção alterando prompt diretamente.
- Não trocar modelo sem certificação Promptfoo.
- Não recalcular `selected_extractor` no runtime.
- Não usar modelo potente para recuperar artigo.
- Não introduzir regex ou regra textual emergencial.
- Preservar entrada, estado, versões, evidências e logs antes de qualquer reprocessamento.
- Preferir recuperação idempotente a edição manual de arquivos.
## 3. Artefatos operacionais
- pacote executável versionado;
- arquivo de configuração funcional versionado;
- secrets externos ao pacote;
- prompts versionados e seus hashes;
- schemas versionados;
- SQLite de estado;
- diretório de saída;
- logs estruturados;
- configuração Langfuse;
- relatório Promptfoo da versão;
- relatório de staging e SLOs aprovados.
## 4. Responsabilidades
| Papel | Responsabilidade |
| --- | --- |
| Orquestrador | Fornecer artigo/ECP, controlar concorrência e consumir manifesto |
| Operação | Implantar, monitorar, recuperar e executar rollback |
| Engenharia | Corrigir código, prompt, schema ou integração via processo normal |
| Curadoria/Eval | Manter golden set e aprovar qualidade |
## 5. Pré-requisitos do ambiente
- versão suportada do Python definida pelo repositório;
- dependências instaladas a partir de lockfile;
- acesso de escrita ao SQLite e diretórios de saída/temporários;
- espaço em disco monitorado;
- relógio do sistema sincronizado;
- credenciais válidas para providers baratos e Langfuse;
- acesso ao classificador ECP e schema canônico;
- prompts e configuração da mesma release;
- nenhuma configuração de modelo potente nos papéis do runtime.
## 6. Configuração obrigatória
### 6.1 Funcional
- versão do contrato de artigo;
- versão do contrato de manifesto;
- versão compatível do ECP;
- versão dos prompts;
- provider/modelo de `runtime_primary`;
- provider/modelo de `runtime_fallback`;
- parâmetros de cada chamada lógica;
- timeouts e limite de retry técnico;
- política de conteúdo em traces;
- diretórios de estado e saída.
### 6.2 Secrets
- credenciais dos providers;
- credenciais Langfuse;
- demais credenciais exigidas pelo ambiente.
Secrets não podem ser passados como argumento visível de linha de comando, gravados em configuração versionada ou impressos em logs.
### 6.3 Valores definidos após staging
Antes do go-live, preencher e aprovar:
- custo máximo por artigo;
- custo máximo por Markdown aprovado;
- latência p50/p95/p99 esperada;
- timeout de cada provider;
- limite aceitável de fallback;
- limite de crescimento do SQLite;
- limites de uso de disco;
- concorrência máxima autorizada pelo orquestrador.
## 7. Checklist de release
### 7.1 Código e documentação
- PRD e arquitetura compatíveis;
- ADRs aceitas;
- schemas versionados;
- nenhuma alteração de self-healing incluída;
- nenhuma dependência não justificada;
- análise AST confirma ausência de regex no pipeline textual.
### 7.2 Testes
- unitários aprovados;
- contratos aprovados;
- integração simulada aprovada;
- regressão dos 20 casos iniciais aprovada;
- Promptfoo reduzido aprovado;
- golden set completo aprovado;
- gates críticos em zero;
- slices de idiomas, domínios e extratores dentro das metas;
- fault injection aplicável aprovado.
### 7.3 Staging
- 100 artigos por hora sem perda ou duplicação;
- custo e latência medidos;
- SLOs aprovados;
- SQLite sem corrupção ou saturação;
- filesystem sem arquivos finais parciais;
- Langfuse recebe ou recupera telemetria;
- rollback ensaiado.
### 7.4 Configuração
- primário e fallback certificados;
- prompts correspondem aos hashes aprovados;
- secrets válidos;
- permissões mínimas;
- diretórios corretos;
- retenção e backup definidos;
- ambiente marcado corretamente no Langfuse.
## 8. Implantação
1. Pausar novas execuções no orquestrador.
2. Aguardar ou encerrar de forma controlada execuções existentes.
3. Preservar backup consistente do SQLite e configuração vigente.
4. Implantar pacote, prompts e schemas da mesma release.
5. Aplicar migração de estado, quando houver, em cópia testada primeiro.
6. Executar preflight local sem artigo real.
7. Executar smoke test com fixture aprovada.
8. Confirmar manifesto, Markdown, estado e trace.
9. Liberar concorrência reduzida.
10. Verificar erros, fallback, custo e latência.
11. Liberar volume normal.
## 9. Preflight
O preflight deve validar sem chamada editorial real:
- leitura da configuração;
- existência e compatibilidade dos prompts;
- hashes esperados;
- schemas;
- acesso ao SQLite;
- escrita e rename atômico no diretório de saída;
- permissões de diretório;
- presença das credenciais;
- configuração dos providers;
- ausência de modelo potente nos papéis runtime;
- configuração Langfuse;
- acesso ao classificador/schema ECP;
- espaço mínimo de disco conforme limite aprovado.
## 10. Smoke test
Usar fixture versionada e não conteúdo de produção desconhecido.
Confirmar:
- fingerprint;
- transições de estado;
- chamada LLM esperada;
- ECP;
- manifesto;
- Markdown, quando esperado;
- trace completo;
- custo e latência dentro da faixa de staging;
- reexecução idempotente.
## 11. Operação normal
Para cada execução, o orquestrador fornece:
- caminho ou payload do artigo unitário;
- caminho ou payload do ECP;
- diretório de saída autorizado;
- configuração da release.
O retorno operacional deve distinguir:
- sucesso textual;
- rejeição ECP;
- falha de validação;
- falha de processamento;
- resultado já existente.
Rejeição ECP é resultado esperado e não incidente.
## 12. Monitoramento
### 12.1 Saúde
- recebidos, concluídos, rejeitados e falhos;
- throughput;
- latência;
- custo;
- retry e fallback;
- locks SQLite;
- disco;
- telemetria pendente.
### 12.2 Qualidade
- schema;
- grounding;
- reparos aplicados e rejeitados;
- ECP;
- enriquecimento;
- versões de prompt/modelo.
### 12.3 Sinais para análise futura
Monitorar `prompt_review_signal_total`, mas não iniciar automaticamente nenhuma mudança de prompt. Alertas específicos e self-healing pertencem ao projeto futuro.
## 13. Logs e correlação
Para investigar um artigo, usar:
1. fingerprint;
2. `run_id`;
3. trace ID;
4. estado persistido;
5. manifesto;
6. versões de prompt/modelo/ECP;
7. códigos de erro.
Não pesquisar métricas por URL ou título. Esses valores ficam em trace/log com acesso controlado.
## 14. Reprocessamento
### 14.1 Mesma configuração
Reexecutar normalmente. O fingerprint deve retornar o resultado existente ou retomar estado incompleto.
### 14.2 Configuração diferente
Mudança de prompt, modelo, ECP ou regra funcional gera fingerprint distinguível. A saída anterior não deve ser sobrescrita silenciosamente.
### 14.3 Proibição
Não editar manualmente manifesto, Markdown ou SQLite para “forçar” sucesso. Corrigir causa, implantar versão e reprocessar.
## 15. Falha de validação de entrada
### Sintomas
- `INVALID_ARTICLE_SCHEMA`;
- `INVALID_ECP_SCHEMA`;
- erro de `selected_extractor`;
- ausência de URL, título ou conteúdo textual.
### Ação
1. Confirmar versão do produtor.
2. Comparar com schema da release.
3. Verificar se o objeto é um artigo unitário, não o wrapper de lote.
4. Não chamar LLM manualmente.
5. Corrigir o produtor ou contrato por release normal.
## 16. Falha do provider primário
### Comportamento esperado
- retry apenas para falha técnica autorizada;
- fallback barato;
- trace com tentativas separadas.
### Investigação
- status HTTP categorizado;
- timeout;
- rate limit;
- latência;
- credencial;
- disponibilidade;
- taxa de fallback.
### Escalada
Se o fallback mantiver processamento dentro dos limites, acompanhar o provider primário. Se ambos falharem, pausar novas execuções quando a taxa ultrapassar o limite operacional aprovado.
Não configurar modelo potente emergencialmente.
## 17. Falha semântica ou de grounding
### Sintomas
- schema inválido;
- ID inexistente;
- URL sem origem;
- tentativa de reescrita;
- reparo inválido;
- falha após fallback.
### Ação
1. Preservar trace e entrada.
2. Confirmar prompt/modelo/hash.
3. Confirmar que o harness rejeitou a saída.
4. Não editar prompt em produção.
5. Criar caso de regressão no processo normal de engenharia.
6. Executar Promptfoo e golden set antes de nova release.
Esses eventos alimentam métricas para futura análise de self-healing, mas nenhuma ação automática ocorre.
## 18. Falha do ECP
### Comportamento esperado
- ECP inválido: falha inicial;
- classificador indisponível ou resultado inválido: falha de processamento;
- nenhum Markdown.
### Ação
1. Verificar schema e versão.
2. Verificar disponibilidade do classificador.
3. Preservar o documento intermediário conforme política.
4. Reprocessar após recuperação usando idempotência.
Não contornar o gate.
## 19. Falha de enriquecimento
Se primário e fallback falharem, nenhum Markdown deve ser emitido porque sentimento e tags são obrigatórios.
Investigar schema, grounding, provider, modelo e prompt. Não inserir sentimento ou tags manualmente no arquivo.
## 20. Falha do Langfuse
### Comportamento esperado
- artigo continua;
- evento mínimo fica em SQLite;
- log local registra `TELEMETRY_PENDING`;
- flush é tentado no encerramento.
### Recuperação
1. Confirmar disponibilidade e credenciais.
2. Executar operação de reenvio de telemetria pendente.
3. Verificar deduplicação por ID de evento.
4. Confirmar que o contador pendente voltou a zero.
Não reprocessar o artigo somente para recriar trace.
## 21. Falha do SQLite
### Sintomas
- lock excedido;
- corrupção;
- filesystem indisponível;
- migração incompatível.
### Ação para lock
1. Verificar concorrência real contra limite aprovado.
2. Identificar transação longa.
3. Reduzir concorrência no orquestrador.
4. Não aumentar timeout indefinidamente.
### Ação para corrupção
1. Pausar novas execuções.
2. Preservar arquivo para análise.
3. Restaurar último backup consistente.
4. Reconciliar manifestos/Markdown por fingerprint e hash.
5. Reprocessar apenas entradas sem estado terminal confiável.
## 22. Falha de filesystem ou disco
### Sintomas
- sem espaço;
- permissão negada;
- rename falha;
- hash divergente;
- temporário órfão.
### Ação
1. Pausar novas execuções se houver risco de perda.
2. Recuperar espaço sem apagar SQLite ou saídas confirmadas sem política aprovada.
3. Corrigir permissões.
4. Remover somente temporários identificados por fingerprint e sem estado concluído.
5. Reexecutar idempotentemente.
## 23. Custo acima do limite
1. Confirmar versão do modelo e prompt.
2. Separar aumento de volume de aumento por artigo.
3. Verificar tokens de contexto, fallback e retries.
4. Confirmar que nenhum payload bruto desnecessário entrou no contexto.
5. Pausar promoção ou reduzir concorrência se necessário.
6. Corrigir em release testada pelo Promptfoo.
Não reduzir contexto removendo evidências obrigatórias sem eval.
## 24. Latência acima do SLO
1. Identificar etapa dominante no trace.
2. Separar espera de provider, ECP, lock e filesystem.
3. Verificar taxa de fallback e timeout.
4. Comparar com baseline da mesma versão.
5. Aplicar mitigação operacional aprovada.
6. Alterações de modelo, prompt ou contexto passam por Promptfoo e staging.
## 25. Violação crítica de grounding
Qualquer texto, URL, imagem ou alteração crítica sem origem é incidente de qualidade.
1. Suspender promoção da versão.
2. Se estiver em produção, pausar novas execuções da configuração afetada.
3. Identificar outputs produzidos pela mesma versão.
4. Impedir consumo dos manifestos afetados quando possível.
5. Preservar evidências.
6. Executar rollback manual para última versão certificada.
7. Criar caso de regressão obrigatório.
## 26. Rollback manual
### Gatilhos
- violação crítica;
- regressão acima dos gates;
- falha operacional não mitigável;
- custo ou latência fora dos limites;
- incompatibilidade de contrato.
### Procedimento
1. Pausar novas execuções.
2. Identificar release, prompts, modelos e schemas afetados.
3. Restaurar pacote e configuração conhecida como saudável.
4. Restaurar schema/migração somente por procedimento compatível.
5. Executar preflight e smoke test.
6. Liberar volume reduzido.
7. Confirmar métricas.
8. Reprocessar entradas afetadas com nova identidade de configuração quando necessário.
Rollback manual de release não é self-healing.
## 27. Troca planejada de modelo ou provider
1. Criar configuração candidata no gateway.
2. Confirmar que o modelo é barato e compatível com structured output.
3. Executar contratos e Promptfoo reduzido.
4. Executar golden set completo.
5. Comparar qualidade, custo e latência.
6. Executar staging com volume acordado.
7. Aprovar limites.
8. Promover como nova versão funcional.
9. Manter configuração anterior disponível para rollback.
Não trocar somente o nome do modelo mantendo certificação antiga.
## 28. Rotação de credenciais
1. Criar nova credencial com privilégio mínimo.
2. Atualizar secret no ambiente.
3. Executar preflight e smoke test.
4. Confirmar ausência de erros e exposição.
5. Revogar credencial antiga.
6. Registrar mudança operacional sem alterar fingerprint funcional quando o comportamento permanecer igual.
## 29. Backup e retenção
Devem existir políticas aprovadas para:
- backup consistente do SQLite;
- retenção de manifestos e Markdown;
- retenção de logs;
- retenção de traces conforme privacidade;
- limpeza de temporários;
- restauração testada.
Backup do SQLite deve usar mecanismo consistente com banco ativo, não cópia bruta durante escrita.
## 30. Reconciliação
Periodicamente ou após incidente, verificar:
- estado concluído com arquivos existentes e hashes corretos;
- arquivos finais sem estado correspondente;
- temporários órfãos;
- telemetria pendente;
- fingerprints duplicados;
Reconciliação detecta e reporta. Correções usam rotinas idempotentes; não alteram conteúdo manualmente.
## 31. Encerramento controlado
Ao receber sinal de encerramento:
1. parar de aceitar nova unidade;
2. concluir ou persistir estado seguro da unidade atual;
3. fechar transações;
4. flush de arquivos;
5. tentar flush de telemetria;
6. preservar pendências;
7. encerrar com código coerente.
## 32. Critérios de prontidão operacional
- release passou todos os gates;
- SLOs de custo e latência foram aprovados;
- preflight e smoke test funcionam;
- rollback foi ensaiado;
- backup e restauração foram testados;
- reprocessamento é idempotente;
- falha de Langfuse é degradável;
- falhas de provider, ECP, SQLite e disco têm procedimento;
- nenhuma operação depende de modelo potente;
- nenhuma operação recomenda regex ou regra textual emergencial;
- nenhum componente de self-healing está implantado.