Files
agent_contas/tests/docs/OUTPUT_SUPERVISOR_DECLARATIVE_POLICIES.md
2026-08-31 21:11:57 -03:00

2.3 KiB

OutputSupervisor sem taxonomia contratual hardcoded

Objetivo

O OutputSupervisor do framework trabalha somente com eventos semânticos e ações de runtime. Códigos contratuais externos/numerados pertencem exclusivamente ao ObservabilityCodeMapper configurado pelo agente/deployment.

Eventos internos

Exemplos de eventos internos:

guardrail.output_supervisor.started
guardrail.result.allow
guardrail.result.block
guardrail.result.retry
guardrail.output.<rail>.completed
guardrail.output_supervisor.completed

Se um cliente exigir códigos próprios, configure config/observability_mapping.yaml. O supervisor não conhece a taxonomia externa.

Ação quando um rail nega

O framework não decide mais a ação procurando nomes específicos de rails. A ação pode vir do próprio resultado:

metadata={"terminal_action": "retry"}

ou do YAML:

output:
  - code: MY_VALIDATION
    enabled: true
    on_deny: retry

Valores suportados são os valores de RailAction, como block, retry e handover.

Remediação por rewrite

Rewrite também é uma capacidade genérica. O rail/policy declara a remediação:

output:
  - code: MY_WORDING_POLICY
    enabled: true
    on_block:
      type: rewrite
      max_attempts: 1
      prompt_id: FALLBACK
      profile_name: grl
      component_name: guardrail.wording.rewrite

O supervisor não verifica se o código é FRASEOLOGIA ou qualquer outro nome. Um guardrail externo do agente pode usar exatamente o mesmo contrato.

Mensagens de UX

Mensagens de fallback/handover pertencem ao agente:

output_supervisor:
  max_retries: 3
  fallback_message: "..."
  handover_message: "..."

Assim o framework não precisa conhecer idioma, marca ou fraseologia do atendimento.

Contas

O Contas preserva seu comportamento atual:

  • TIM_REVPREC declara terminal_action=retry no próprio rail externo;
  • CMP está configurado com on_deny: retry;
  • TIM_FRASEOLOGIA, quando habilitado, declara remediação rewrite no agente;
  • textos de fallback/handover ficam no config/guardrails.yaml do Contas.

Compatibilidade

Rails que retornam apenas allowed=false e não declaram policy continuam em block, que é o fail-closed genérico. Não há mais inferência de ação pelo nome do rail.