O PID é um serviço projetado para avaliar políticas de decisão descritas em grafos (DOT). Ele processa um grafo de estados, aplica os inputs fornecidos e retorna o nó de destino alcançado com seus respectivos atributos.
O serviço é executado como uma AWS Lambda em arquitetura arm64.

A comunicação ocorre via API HTTP (Lambda Function URL). Endpoints:
POST /infer— recebe o grafo e o input e retorna o output da inferência (contrato do desafio).GET /ping— retornapong(health check).
policy_dot: O grafo no formato DOT (ex:digraph { start -> ok [cond="age>=18"]; }).input: Um mapa de variáveis para validação (ex:{"age": 20}).
Resposta: Um JSON contendo o output do nó atingido após a avaliação das condições nas arestas.
Documentação Postman com as requisições disponíveis para a Lambda: Postman — Policy Inference Decider.
Utilizei o Makefile na raiz do projeto para padronizar o fluxo de trabalho:
| Comando | Descrição |
|---|---|
make test |
Executa a suíte de testes unitários. |
make coverage |
Valida a cobertura de testes (falha se for < 90%). |
make build-lambda |
Compila o binário bootstrap e gera o .zip para deploy (linux/arm64). |
make format |
Executa gofmt, gofumpt e go mod tidy. |
make sort-imports |
Organiza os imports (requer make install-tools). |
make run-all |
Executa formatação, ordenação e testes (ideal para pre-commit). |
- Deployment: Localizado em
us-east-1. - Logs: Centralizados no CloudWatch Logs via
slog, integrados ao log group da função.
- Continuous Deployment (
deploy.yml): Disparado em todo push namain. Realiza o build em Go, gera o artefato e atualiza a Lambda viaupdate-function-codeutilizando secrets do ambiente de prod.
- Quality Gate (
coverage.yml): Disparado em PRs paramainoudevelop. Bloqueia o merge caso a cobertura de código seja inferior a 90%.
As branches main e develop possuem regras de proteção ativas:
- Pull Requests obrigatórios (proibido push direto).
- Status checks de Coverage obrigatórios para merge.
O projeto utiliza o Artillery com execução distribuída via AWS Lambda.
Pré-requisitos: Artillery instalado globalmente e credenciais AWS configuradas.
# Instalação
npm install -g artillery
# Execução
./loadtest/run-lambda.sh "https://SUA_LAMBDA_URL" [arquivo.yaml]
Sugestões de cenários em ./loadtest: test-50rps.yaml, test-100rps-mixed.yaml.
main.go: Ponto de entrada da Lambda e configuração do handler.internal/handler: Tradução de eventos HTTP/Lambda e binding de dados.internal/policy: Core engine (parsing de DOT e avaliação de expressões comgovaluate).internal/apierror: Padronização de erros e códigos de retorno.loadtest/: Manifestos e scripts de teste de performance.
- Custom Metrics: Finalizar branch
feature/add-metricspara dashboards no CloudWatch. - Observabilidade: Configurar alarmes de taxa de erro (>1% por 5min) e latência.
- Automação de Testes: Integrar os testes de carga diretamente no workflow do GitHub Actions.
- Multi-environment: Implementar segregação de ambientes (Staging/Prod) via variáveis de ambiente no CI/CD.