Constraints
Visao geral
Seção intitulada “Visao geral”Constraints sao como o cliente coloca uma coleira na otimizacao da Floopy. Sao declarativos — voce os define em codigo via PUT /v1/constraints ou no dashboard em /routing/constraints. Sao non-LLM — toda checagem e uma comparacao numerica ou booleana, sem chamadas extras a provedores no caminho quente. E sao auditaveis — toda mudanca e registrada com hash SHA-256 de before e after no log de auditoria.
No v2 o conjunto e de nove campos, agrupados em tres secoes: limites de qualidade, limites de custo e portoes de promocao.
Quando um candidato viola um constraint, ele e filtrado com um motivo tipado que aparece em filtered[].reason no audit row e tambem no texto de explicacao. Nao ha override silencioso.
Os nove campos, por secao
Seção intitulada “Os nove campos, por secao”Limites de qualidade
Seção intitulada “Limites de qualidade”Limitam o custo de qualidade que o router esta disposto a pagar por um candidato mais barato ou de maior confianca.
| Campo | Faixa | O que limita |
|---|---|---|
max_regression | value [0, 0.5], window ∈ rolling_24h / rolling_7d | A queda rolante de qualidade composta vs. baseline que o router tolera. |
max_outcome_variance | (0.0, 1.0] | A variancia de resultados que o router tolera em um candidato antes de recusar rota-lo. |
max_outcome_variance e novo no v2. Estritamente maior que zero — definir exatamente 0.0 e rejeitado com 400 out_of_range_max_outcome_variance porque e inalcancavel na pratica e quase certamente uma configuracao errada.
Limites de custo
Seção intitulada “Limites de custo”Limitam quanto o router pode mover em custo sem forcar validacao extra.
| Campo | Faixa | O que limita |
|---|---|---|
max_cost_increase | value [0, 5.0], window ∈ rolling_24h / rolling_7d | O aumento rolante de custo vs. baseline que o router tolera. |
max_cost_drop_without_validation | (0.0, 1.0] | Uma queda fracionaria de custo acima desse tamanho e tratada como suspeita — o router se recusa a promover o candidato ate que a validacao em shadow tenha aprovado. |
max_cost_drop_without_validation e novo no v2. A intuicao: um candidato que de repente parece 90 % mais barato que a baseline e mais provavel de ser uma queda de qualidade do que um almoco gratis. Definir max_cost_drop_without_validation = 0.5 significa “se a historia de economia ultrapassa 50 %, prove em shadow primeiro.”
Portoes de promocao
Seção intitulada “Portoes de promocao”Limitam quando o router pode promover um candidato acima do trafego baseline.
| Campo | Faixa | O que limita |
|---|---|---|
confidence_threshold | [0.0, 1.0] | A confidence minima para o router se afastar da baseline. null ou 0.0 desativa o portao. |
min_samples_before_promotion | [1, 100_000] | O numero minimo de amostras historicas em um candidato para que ele possa vencer. Definir 0 e rejeitado. |
require_shadow_before_live | boolean | Quando true, nenhum candidato pode ser promovido a trafego live em uma rota ate que aquele (provider, model) tenha pelo menos um experimento shadow concluido na janela de validade (default 30 dias). |
min_samples_before_promotion, max_outcome_variance, max_cost_drop_without_validation e require_shadow_before_live sao os quatro novos campos lancados no v2.
A janela de validade para require_shadow_before_live tem default de 30 dias e e configuravel por workspace — fale com o suporte para ajustar.
Filtered reasons (o formato no wire)
Seção intitulada “Filtered reasons (o formato no wire)”Quando o router rejeita um candidato por violacao de constraint, filtered[].reason no audit row carrega um motivo tipado. O enum fechado e:
| Reason | Constraint |
|---|---|
constraint_max_regression | max_regression |
constraint_max_cost_increase | max_cost_increase |
constraint_confidence_below_threshold | confidence_threshold |
constraint_min_samples | min_samples_before_promotion |
constraint_high_variance | max_outcome_variance |
constraint_cost_drop_requires_validation | max_cost_drop_without_validation |
constraint_shadow_required | require_shadow_before_live |
A ordem em que os constraints sao avaliados e fixa — quando mais de um teria rejeitado o candidato, a auditoria mostra o primeiro que disparou. A ordem e: max_cost_increase, max_regression, confidence_threshold, min_samples_before_promotion, max_outcome_variance, max_cost_drop_without_validation, require_shadow_before_live.
Exemplos
Seção intitulada “Exemplos””Quero limitar regressoes de qualidade em 2 %, sem excecoes.”
Seção intitulada “”Quero limitar regressoes de qualidade em 2 %, sem excecoes.””{ "max_regression": { "value": 0.02, "window": "rolling_24h" }}Qualquer candidato cuja queda rolante de 24 h em qualidade composta vs. baseline ultrapasse 2 pontos percentuais e filtrado com reason: "constraint_max_regression". Todo o resto e com o router.
”Quero pelo menos 50 amostras historicas antes do candidato vencer.”
Seção intitulada “”Quero pelo menos 50 amostras historicas antes do candidato vencer.””{ "min_samples_before_promotion": 50}Um candidato com n_samples < 50 e filtrado com reason: "constraint_min_samples". O painel lateral de decisao no dashboard renderiza a contagem samples de evidence para o cliente verificar o portao.
”Recuso trocar por algo que parece 80 % mais barato sem antes um experimento shadow.”
Seção intitulada “”Recuso trocar por algo que parece 80 % mais barato sem antes um experimento shadow.””{ "max_cost_drop_without_validation": 0.8, "require_shadow_before_live": true}Qualquer candidato cuja queda fracionaria esperada de custo vs. baseline ultrapasse 0.8 e filtrado com reason: "constraint_cost_drop_requires_validation" a menos que tenha um experimento shadow aprovado na janela de validade. Os dois constraints funcionam juntos: require_shadow_before_live exige que toda promocao passe por shadow; max_cost_drop_without_validation exige que especificamente o caminho de economia suspeita passe por shadow mesmo que o operador nao tenha ligado o portao geral.
”Nao escolha um modelo cujos resultados recentes estejam por todo lado.”
Seção intitulada “”Nao escolha um modelo cujos resultados recentes estejam por todo lado.””{ "max_outcome_variance": 0.4}Um candidato cuja variancia rolante de resultados ultrapasse 0.4 e filtrado com reason: "constraint_high_variance". Util em rotas onde consistencia importa mais que uma resposta perfeita ocasional.
”Nunca rotear para fora da baseline abaixo de 70 % de confianca.”
Seção intitulada “”Nunca rotear para fora da baseline abaixo de 70 % de confianca.””{ "confidence_threshold": 0.7}O router cai para a baseline sempre que confidence < 0.7 e emite reason: "constraint_confidence_below_threshold" para todos os outros candidatos. Veja Metodologia de Confianca para o que confidence mede.
”Tudo isso, ao mesmo tempo.”
Seção intitulada “”Tudo isso, ao mesmo tempo.””{ "max_regression": { "value": 0.02, "window": "rolling_24h" }, "max_cost_increase": { "value": 0.10, "window": "rolling_24h" }, "confidence_threshold": 0.7, "min_samples_before_promotion": 50, "max_outcome_variance": 0.4, "max_cost_drop_without_validation": 0.8, "require_shadow_before_live": true}Constraints compoem. O router roda todo portao em todo candidato; a primeira rejeicao vence.
Regras de validacao
Seção intitulada “Regras de validacao”Todo constraint numerico passa por is_finite() — NaN, +Inf e -Inf sao rejeitados com 400 out_of_range_<field>. Os dois campos no intervalo unitario aberto a esquerda (max_outcome_variance, max_cost_drop_without_validation) sao estritamente maior que zero. min_samples_before_promotion e rejeitado fora de [1, 100_000]. O cap de body em PUT /v1/constraints e 4 KiB.
Esses limites tambem vivem como CHECK constraints na tabela organization_constraints, entao uma linha mal-configurada nao chega ao banco.
Trilha de auditoria
Seção intitulada “Trilha de auditoria”Todo PUT bem-sucedido grava uma linha em constraint_changes com o snapshot before, o snapshot after, o actor_api_key_id e o timestamp. O metadata do evento de auditoria carrega hashes SHA-256 de before e after, entao o log de auditoria nao duplica os valores brutos dos constraints.
Plan gating
Seção intitulada “Plan gating”Todos os nove campos estao apenas no plano Pro. Em planos Free a pagina /routing/constraints e renderizada ausente (nao como aba travada) e a API retorna 403 plan_required.
Veja tambem
Seção intitulada “Veja tambem”- GET /v1/constraints — le o conjunto atual.
- PUT /v1/constraints — escreve um novo conjunto.
- POST /v1/routing/explain — dry-run de uma requisicao candidato contra os constraints atuais.
- Explicacao de Decisao — como rejeicoes de constraint aparecem na prosa legivel.
- Metodologia de Confianca — contra o que
confidence_thresholdcompara.