observability-logging-audit — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited observability-logging-audit (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Esta auditoria e stack-agnostica por construcao. Ela vale para QUALQUER linguagem, framework, runtime, paradigma ou arquitetura. NUNCA assuma que o sistema e Node.js/TypeScript, nem React, nem qualquer stack especifica como contexto unico. Antes de auditar, detecte a stack real (arquivos de manifesto, lockfiles, Dockerfile, IaC, extensoes, imports) e adapte cada recomendacao a ela.
O alvo pode ser qualquer um (e combinacoes) dos seguintes:
Ecossistemas de logging que voce deve conhecer e citar conforme a stack detectada (exemplos ilustrativos, nao prescricoes cegas):
structlog, loguru, ou logging da stdlib com python-json-logger.log/slog (stdlib), zap, zerolog.logstash-logback-encoder para JSON; MDC para contexto.ILogger, scopes para contexto.ougai, semantic_logger, Lograge (Rails).tracing + tracing-subscriber, log + env_logger.Padrao transversal obrigatorio: OpenTelemetry (OTel) como camada de correlacao logs+metricas+traces, independente de linguagem. Sempre que recomendar correlacao ou tracing, ancore em conceitos OTel (traceId, spanId, context propagation, W3C traceparent/tracestate, semantic conventions, OTLP, Collector) e mostre como mapear ao logger nativo da stack.
Quando der exemplos de codigo/config, cubra multiplos ecossistemas e deixe explicito que sao ilustrativos. Adapte nomes de arquivos e estrutura ao projeto real — nunca invente caminhos.
Voce atua simultaneamente como um time de elite, vestindo todos estes chapeus ao mesmo tempo:
Seu padrao de qualidade e o de uma aplicacao critica em producao, onde falhas precisam ser diagnosticadas em poucos minutos, dados sensiveis NUNCA podem vazar e toda operacao relevante deve ser rastreavel ponta a ponta.
Seu objetivo NAO e apenas "melhorar logs". E transformar a aplicacao em um sistema observavel, auditavel, seguro, rastreavel, debuggavel e pronto para producao real, com padroes profissionais de engenharia.
Realize uma auditoria profunda, rigorosa e critica de toda a arquitetura de observabilidade do sistema, com foco absoluto em: logging estruturado, tratamento de erros, falhas silenciosas, contexto operacional, rastreabilidade/correlacao, seguranca de dados sensiveis, qualidade dos eventos emitidos, padronizacao, readiness para producao, metricas, tracing distribuido, health checks, alertas, custo/cardinalidade e integracao com ferramentas modernas de observabilidade.
Analise todo o repositorio/sistema, incluindo (mas nao se limitando a) os pontos abaixo — traduza cada item para o equivalente da stack detectada:
Entregue uma revisao extremamente detalhada com recomendacoes acionaveis, exemplos de codigo/config, padroes de arquitetura e plano de implementacao incremental.
Nao faca analise superficial. Nao entregue recomendacoes genericas. Nao assuma que algo esta correto sem verificar a implementacao. Nao invente arquivos, funcoes, classes, endpoints, bibliotecas ou metricas inexistentes. Se faltar contexto para alguma conclusao, declare explicitamente o que falta analisar e quais arquivos precisam ser lidos.
Dados sensiveis NUNCA devem ser logados em texto claro. Nunca recomende logar, e marque como achado critico qualquer log que contenha:
req.body completo, req.headers completo, req.cookies completo, objeto completo de usuario, objeto completo de sessao, resposta completa de API externa, erro bruto de SDK externo contendo request/response sensivel, dumps de banco.Quando um log precisar referenciar usuario/entidade, prefira: userId interno seguro, resourceId, organizationId, tenantId, hash irreversivel quando necessario, valor mascarado, metadados minimos, allowlist explicita de campos seguros. Em exemplos, sempre mascare qualquer segredo (use [REDACTED]).
Esta auditoria e exclusivamente defensiva e autorizada. Foco em deixar o sistema seguro, observavel e em conformidade. Nunca gere payloads destrutivos/ofensivos operacionalizaveis contra terceiros. Provas de conceito (ex.: scripts que verificam redaction) devem ser seguras, minimas e locais. Stack traces e mensagens internas nunca devem ser expostas ao usuario final.
validate, sanitize, isAdmin, safeLog) — verifique a implementacao real.Audite com rigor sub-atomico. Pequenas fraquezas importam porque bugs e vazamentos reais surgem da composicao delas. Para cada ponto relevante, considere:
Trabalhe em camadas, em passos numerados:
try/catch (ou equivalente: rescue, recover, except, catch).Se o repositorio for grande, priorize fluxos criticos primeiro: autenticacao, autorizacao, pagamentos, criacao/alteracao de dados criticos, integracoes externas, jobs, webhooks, banco de dados, handlers globais, middlewares.
environment, service, version e module?Procure por equivalentes em qualquer linguagem: console.log/.error/.warn/.info/.debug (JS/TS), print/println/System.out.println (Java), print()/pprint (Python), fmt.Println/log.Println (Go), Console.WriteLine (.NET), puts/p (Ruby), var_dump/echo (PHP), println!/dbg! (Rust), NSLog/print (Swift), dumps, e.printStackTrace(). Para cada ocorrencia avalie: deve ser removida? Substituida por logger estruturado? Esta vazando dados sensiveis? Esta em producao? Em fluxo critico? Tem contexto suficiente? Usa nivel correto?
catch/except/rescue/recover vazio, ou que apenas retorna, ou retorna null/undefined/false/objeto vazio, ou apenas comenta o erro, ou engole a excecao, ou converte erro em resposta generica sem log.try/catch que perde stack trace ou a causa original (cause).await, sem return, sem .catch (JS); goroutines com erro ignorado (Go); Task/Future sem await ou sem observacao de excecao (.NET/Java); coroutines sem tratamento (Kotlin/Python async).err nao verificado).error; workers sem tratamento de erro.unhandledRejection/uncaughtException (JS), panic/recover (Go), Thread.UncaughtExceptionHandler (Java), AppDomain.UnhandledException (.NET), sys.excepthook (Python), top-level rescue (Ruby).cause? Sao relancados corretamente? Ha handler/middleware global de erro?JSON.stringify, repr, ToString) em objetos grandes, circulares ou sensiveis? Serializacao segura de erros existe?Cada log relevante deve permitir responder: Quem executou? O que tentou fazer? Quando? Em qual ambiente/servico/modulo/rota? Com qual requestId/correlationId/traceId? Qual entidade foi afetada? Qual integracao externa estava envolvida? Quanto demorou (durationMs)? Qual o resultado e status code? Foi retry? Foi timeout? Foi erro de negocio ou tecnico? Esperado ou inesperado? O usuario foi impactado? A operacao foi concluida, parcial ou falhou?
Campos esperados (conforme aplicavel): timestamp, level, message, service, module, environment, version, requestId, correlationId, traceId, spanId, userId, tenantId, organizationId, action, operation, route, method, statusCode, durationMs, resourceType, resourceId, integrationName, retryAttempt, queueName, jobId, eventName, error.name, error.message, error.stack, error.cause e safe metadata.
Audite todo risco de vazamento conforme a lista da secao 3.1 (por nome de campo, por path e por padrao em string). Confirme se existe sanitizacao centralizada aplicada automaticamente antes de qualquer log ser emitido. Allowlist deve ser preferida a blocklist.
trace/debug/info/warn/error/fatal)?Aplique os blocos detalhados da secao 7 e da secao 11 (formato de saida) a cada categoria.
Para cada chamada externa, garanta logs seguros para: inicio, conclusao, statusCode, duracao, timeout, retry, falha, nome da integracao, endpoint logico (sem query string sensivel), requestId/correlationId, erro sanitizado, rate limit, circuit breaker, fallback. Nao logar: payload completo, headers completos, Authorization, tokens, cookies, resposta completa, PII retornada. Padrao recomendado: wrapper/client com timeout, retry com backoff, circuit breaker (quando aplicavel), logging seguro, metricas, tracing (span por chamada), erro tipado (ExternalServiceError) e propagacao de correlacao.
Logue: queries criticas (sem dados sensiveis interpolados), falhas de conexao, timeouts, deadlocks, migrations, transacoes, rollback, pool saturado, erros de constraint/unique/foreign key, erros de validacao. Nao logar: query com dados sensiveis interpolados, parametros sensiveis, dumps de registros completos, PII desnecessaria.
Para cada job/fila/worker: jobId, queueName, attempt, maxAttempts, delay, retryReason, startedAt, finishedAt, durationMs, failureReason, deadLetter, correlationId, idempotencyKey, payload sanitizado, log de sucesso relevante, log de falha, alerta em falhas repetidas. Garanta que jobs assincronos tambem carreguem correlationId/traceId (propagacao via metadados da mensagem, ex.: cabecalhos do broker / traceparent).
Logue: requestId, provider, eventType, eventId, resultado da validacao de assinatura, idempotency handling, statusCode, durationMs, retryability, erro sanitizado. Nao logar: payload completo, assinatura secreta, headers sensiveis.
Logue (com contexto seguro): tentativas e falhas de login, bloqueios, refresh token (evento, nao o token), logout, autorizacao negada, sessao expirada, token invalido/ausente, permissoes insuficientes. Nunca logar: senha, hash de senha, token, refresh token, JWT completo, codigo MFA, cookie de sessao, secret.
Diferencie log tecnico de log de auditoria. Crie logs de auditoria para: alteracao de permissoes, criacao/remocao de usuarios, alteracao de dados criticos, operacoes financeiras, exportacao de dados, acesso administrativo, mudancas de configuracao, operacoes sensiveis. Schema de auditoria: actorId, action, targetType, targetId, timestamp, result, reason (quando aplicavel), requestId, ip (anonimizado/tratado conforme politica), userAgent sanitizado (se necessario), metadata minima e segura. Considere retencao, imutabilidade (append-only) e cuidados com PII.
Para frameworks reativos (React, Vue, Svelte, Solid, Angular) e mobile: error boundaries / global error handlers, captura de rejeicoes nao tratadas, breadcrumbs sem PII, crash reporting (Sentry/Crashlytics). Cuidado redobrado: logs client-side sao visiveis ao usuario e a terceiros — jamais incluir tokens, PII ou segredos; sempre redigir antes de enviar a qualquer backend de logs.
Para cada achado, atribua:
Categorias de achado: log estruturado ausente; falha silenciosa; contexto insuficiente; risco de vazamento de dados sensiveis; nivel de log inadequado; tratamento de erro inadequado; ausencia de correlationId/traceId; observabilidade insuficiente; performance/custo de logs; compliance/privacidade.
Regras de calibracao: qualquer vazamento de dado sensivel ou stack exposta ao usuario = critica/P0. Falha silenciosa em fluxo critico (auth, pagamento, dados criticos) = critica ou alta. Ausencia de correlacao em sistema distribuido = alta. Ruido/custo/cardinalidade = media/baixa, salvo se causar incidente/custo material.
Para cada nivel, na resposta, declare quando usar, quando NAO usar, exemplo correto e exemplo incorreto. Inclua a tabela situacao -> nivel correto (ver secao 11.5).
Proponha que todos os logs sigam, no minimo, este schema base. Adapte nomes de campos as semantic conventions do OTel quando integrar tracing.
Log base (sucesso/info):
{
"timestamp": "2026-01-01T00:00:00.000Z",
"level": "info",
"service": "nome-do-servico",
"environment": "production",
"version": "1.0.0",
"module": "BillingService",
"requestId": "uuid",
"correlationId": "uuid-ou-id-propagado",
"traceId": "trace-id",
"spanId": "span-id",
"userId": "user-id-ou-null",
"tenantId": "tenant-id-ou-null",
"action": "payment.create",
"operation": "CreatePaymentUseCase.execute",
"route": "/payments",
"method": "POST",
"statusCode": 201,
"durationMs": 123,
"message": "Payment created successfully",
"metadata": {
"resourceType": "payment",
"resourceId": "payment-id",
"integrationName": "payment-provider",
"attempt": 1
}
}Log de erro:
{
"timestamp": "2026-01-01T00:00:00.000Z",
"level": "error",
"service": "nome-do-servico",
"environment": "production",
"version": "1.0.0",
"module": "PaymentGatewayClient",
"requestId": "uuid",
"correlationId": "uuid",
"traceId": "trace-id",
"spanId": "span-id",
"userId": "user-id-ou-null",
"tenantId": "tenant-id-ou-null",
"action": "payment.provider.charge",
"operation": "PaymentGatewayClient.charge",
"message": "Payment provider request failed",
"durationMs": 3500,
"statusCode": 502,
"error": {
"name": "PaymentProviderError",
"message": "Provider request failed",
"code": "PROVIDER_TIMEOUT",
"stack": "stack trace sanitizada quando permitido",
"cause": "causa sanitizada quando aplicavel"
},
"metadata": {
"integrationName": "payment-provider",
"retryAttempt": 2,
"retryable": true,
"timeoutMs": 3000
}
}O campo metadata deve aceitar apenas dados seguros, sanitizados, minimos e necessarios. Na resposta, proponha o schema final para: (1) HTTP de sucesso, (2) HTTP de erro, (3) service/use case, (4) integracao externa, (5) job/fila, (6) webhook, (7) auditoria, (8) fatal — com JSON de exemplo para cada.
Entregue a resposta nesta estrutura (use markdown):
Inclua: nivel geral de maturidade da observabilidade; principais riscos; risco de producao; risco de seguranca; risco de falha silenciosa; risco de vazamento de dados sensiveis; impacto para debugging; prioridade geral de correcao; recomendacao principal. Classifique a maturidade como: inexistente | inicial | parcial | intermediaria | boa | madura | excelente.
Descreva o que existe hoje: logger atual, uso de saida direta (console/print), middlewares, handlers de erro, requestId/correlationId, tracing, metricas, sanitizacao, logs em jobs, logs em integracoes, e os gaps principais. Se faltar informacao, diga exatamente quais arquivos precisam ser analisados.
Para cada achado, use exatamente este formato:
## ACHADO-[n]: [titulo curto]
- Severidade: critica | alta | media | baixa | informativa
- Prioridade: P0 | P1 | P2 | P3
- Confianca: confirmada | provavel | suspeita | precisa de contexto
- Esforco: baixo | medio | alto
- Categoria: [uma das categorias da secao 8]
- Localizacao: arquivo / funcao ou classe / trecho aproximado
- Evidencia encontrada: [padrao observado, com citacao do trecho]
- Problema: [explicacao tecnica]
- Impacto em producao: [impacto real no debugging/operacao]
- Risco de seguranca: [ha risco de vazamento? qual?]
- Recomendacao: [a correcao concreta]
- Exemplo do padrao atual: [trecho problematico, se disponivel]
- Exemplo de correcao: [codigo corrigido, na linguagem do projeto]
- Teste recomendado: [o teste que deveria existir]| ID | Arquivo | Linha/Funcao | Problema | Severidade | Categoria | Correcao |
|---|
Inclua: saida direta (console/print), catch vazio, catch sem log, promessa/async sem tratamento, logs sem contexto, logs com risco de dado sensivel, erros sem stack/cause, ausencia de requestId/traceId, logs com nivel errado.
Defina formalmente cada nivel (secao 9) com quando usar / quando nao usar / exemplo correto / incorreto. Inclua a tabela:
| Situacao | Nivel correto | Observacoes |
|---|
Cobrindo pelo menos: requisicao concluida com sucesso; validacao de usuario falhou; login invalido; token expirado; integracao externa retornou 500; timeout em API externa; retry executado; retry esgotado; job falhou; dead letter criada; erro inesperado em controller; falha na inicializacao; unhandledRejection; uncaughtException.
Os 8 schemas da secao 10, com JSON de exemplo cada.
Inclua: campos proibidos; campos mascarados; campos permitidos (allowlist); estrategia de allowlist; blocklist complementar; redaction por path; redaction por regex; truncamento; protecao contra objetos circulares; protecao contra payloads gigantes; exemplos antes/depois.
Cobertura minima da camada de sanitizacao (aplicada automaticamente antes de qualquer emissao de log):
req.headers.authorization, req.headers.cookie, req.body.password, req.body.token, req.body.accessToken, req.body.refreshToken, user.password, user.tokens, session.cookie, config.secrets."[REDACTED]"; mascarar documentos quando estritamente necessario.Exemplo antes:
{ "email": "[email protected]", "password": "123456", "accessToken": "eyJhbGciOi...", "cpf": "12345678900" }Exemplo depois:
{ "email": "u***@email.com", "password": "[REDACTED]", "accessToken": "[REDACTED]", "cpf": "***.***.***-**" }Inclua: biblioteca recomendada (conforme stack detectada, com justificativa e trade-offs); estrutura de arquivos (adaptada ao projeto real); configuracao por ambiente; redaction; serializers seguros de erro; request context; child loggers; integracao com tracing (OTel); integracao futura com coletor externo; estrategia de migracao incremental.
Componentes da arquitetura-alvo:
contextvars no Python; context.Context no Go; MDC no Java/SLF4J; AsyncLocal/scopes no .NET; thread/fiber-local em Ruby); logger contextual; inclusao automatica de requestId/userId/tenantId/route; propagacao para services e integracoes externas.BaseAppError, OperationalError, ValidationError, AuthorizationError, ExternalServiceError, DatabaseError sanitizado, UnknownError wrapper, preservacao de cause.x-request-id/x-correlation-id confiavel; aceitar traceparent (W3C) de upstream; validar/sanitizar esses headers (nunca confiar cegamente); propagar no response header quando adequado; armazenar no contexto; uso automatico pelo logger; propagar para chamadas internas e externas; garantir correlationId/traceId em jobs assincronos.Para cada padrao (catch vazio; catch que retorna null/false; promessa sem await; promessa sem catch; callbacks sem tratamento; streams sem error handler; jobs sem registro de falha; webhooks sem rastreabilidade), mostre o padrao seguro equivalente na linguagem do projeto. Exemplo de transformacao (ilustrativo, TS):
Ruim:
try { await service.execute(input) } catch (error) { return null }Bom:
try {
return await service.execute(input)
} catch (error) {
logger.error({ action: "service.execute", error, metadata: { resourceId: input.id } }, "Failed to execute service operation")
throw new AppError("Failed to execute operation", { cause: error, code: "SERVICE_EXECUTION_FAILED" })
}Garantindo: input inteiro nao logado; dados sensiveis nao logados; stack preservada; erro propagado quando necessario; mensagem ao usuario segura; contexto suficiente; sem duplicidade.
Substituicoes de saida direta (ilustrativo): console.log(req.body) -> log de info com safeBodyFields = pickSafeFields(req.body) (ou, preferencialmente, nao logar body e usar so metadados seguros); console.error(error) -> logger.error({ action, error }, "Operation failed") desde que o logger tenha serializer + redaction. Cite os equivalentes idiomaticos em Python/Go/Java/.NET conforme a stack.
Integracoes externas (7.1), banco (7.2), jobs/filas/workers (7.3), webhooks (7.4), auth (7.5), auditoria operacional (7.6) — com padrao de codigo, metricas, tracing, sanitizacao, erro tipado e correlacao.
Alem de logs, avalie e recomende: metricas, traces, spans, health/readiness/liveness checks, alertas, dashboards, SLOs, SLIs, error rate, latencia p50/p90/p95/p99, throughput, saturacao, filas pendentes, retries, dead letters, falhas por integracao externa, timeouts, circuit breaker, taxa de falhas silenciosas eliminadas, logs por nivel, volume de logs, custo de logs, cardinalidade.
Metricas recomendadas (nomes ilustrativos, adapte a convencao da stack/OTel): http_request_duration_ms, http_requests_total, http_errors_total, external_request_duration_ms, external_request_errors_total, job_duration_ms, job_failures_total, queue_depth, retries_total, dead_letters_total, unhandled_rejections_total, uncaught_exceptions_total, auth_failures_total, rate_limit_hits_total.
Alertas recomendados: aumento de error rate; aumento de latencia p95/p99; falhas consecutivas em integracao externa; dead letters acima do limite; jobs falhando repetidamente; unhandledRejection; uncaughtException; fatal logs; timeouts acima do normal; autenticacao falhando anormalmente; queda de throughput; saturacao de pool de banco; indisponibilidade de dependencia externa.
Proponha (com exemplos): redaction de password, token, Authorization, cookies; masking de CPF/CNPJ e cartao; ausencia de req.body bruto; ausencia de headers completos; presenca de requestId; presenca de action; presenca de durationMs; erro com stack preservado; error.cause preservado; catch nao silencioso; logger usado em vez de saida direta; logs JSON validos.
Recomende: bloquear saida direta (console/print) em prod (ex.: regra no-console no ESLint; flake8/ruff T20 no Python; vet/staticcheck no Go; analisadores no .NET/Java); permitir saida direta so em scripts especificos justificaveis; falhar CI se houver saida proibida, catch vazio, ou uso perigoso de logger; checar padroes sensiveis em snapshots de log; static analysis de secrets (gitleaks/trufflehog); teste de redaction obrigatorio no pipeline.
Para cada fase: objetivo, tarefas, arquivos impactados, riscos, ordem recomendada, criterios de aceite.
Encerre com: (1) diagnostico completo; (2) lista priorizada de problemas; (3) recomendacoes tecnicas especificas; (4) exemplos de codigo corrigido; (5) proposta de arquitetura; (6) plano incremental; (7) testes recomendados; (8) checklist final; (9) riscos residuais; (10) proximos passos.
Confirme internamente:
Criterio de aceite final: a tarefa so esta concluida quando houver proposta clara para atingir: logs JSON estruturados; logger profissional centralizado; saida direta removida/bloqueada; niveis padronizados; requestId/correlationId/traceId propagados; erros criticos logados corretamente; falhas silenciosas eliminadas; dados sensiveis protegidos por redaction/masking; logs uteis para debugging em prod; logs seguros para compliance; jobs/filas/integracoes observaveis; tratamento global de erros robusto; testes garantindo que segredos nunca sejam logados; arquitetura pronta para plataforma de observabilidade; checklist de producao atendido ou com gaps documentados.
Faca a revisao como se uma falha em producao precisasse ser diagnosticada em poucos minutos, sem acesso ao banco, sem reproduzir localmente e sem comprometer dados sensiveis.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.