Referência de action codes¶
Contrato¶
O inteiro s não tem significado isolado: o agente selecionado pelo estado define a tabela. s=4 significa fora do portfólio na Triagem, handoff na Qualificação e confirmação cadastral na Coleta. Fontes: src/core/domain/codes.py, src/core/application/action_mapping.py e src/core/application/process_message_use_case.py.
O dispatcher devolve ActionResult e não faz writes. Os efeitos abaixo são aplicados pelo Orchestrator após guards. Persistir sessão com CRM habilitado também pode criar intenção de projeção comercial, mesmo em uma ação sem chamada HTTP síncrona explícita.
Triagem — TriagemCode¶
| s / enum | Significado | Campos / exemplo mínimo | Efeito e próximo estado |
|---|---|---|---|
1 NEED_MORE_INFO |
Falta contexto inicial | {"s":1} |
Resposta, TRIAGE |
2 SEGMENT_INTENT_OK |
Classificação conhecida | {"s":2,"segment":"PESQUISA","intent":"servico"} |
Guarda segmento/intenção; QUALIFYING e próximo agente no mesmo turno para servico; outros intents permanecem TRIAGE |
3 HANDOFF |
Humano necessário | {"s":3,"handoff_reason":"pedido_cliente","intent":"humano"} |
Resumo, notificação após persistência, HANDOFF_PENDING |
4 OUT_OF_PORTFOLIO |
Serviço não oferecido | {"s":4,"out_of_scope_service":"serviço fictício fora do catálogo"} |
Registra demanda e OUT_OF_SCOPE |
5 GENERAL_QUESTION_ANSWERED |
Dúvida respondida | {"s":5} |
Resposta, TRIAGE |
97 SUBJECT_CHANGE_CONFIRMATION |
Confirmar novo assunto | {"s":97} |
Guarda texto pendente, mantém estado |
98 SUBJECT_CHANGE |
Troca de assunto | {"s":98,"subject_change_confirmed":true} |
Fecha e abre outra sessão após guard |
99 CONTEXT_NEEDED |
Enriquecer contexto | {"s":99,"context_needed":"COMPANY_INFO"} |
Carrega package, reinvoca, mantém estado |
s=2 exige Segment/Intent válidos. s=3 preserva segment, intent e empresa_detectada quando presentes e válidos, mas não exige todos os campos que o prompt recomenda. Razão inválida cai no default pedido_cliente.
Qualificação — QualificacaoCode¶
| s / enum | Significado | Campos / exemplo mínimo | Efeito e próximo estado |
|---|---|---|---|
1 QUALIFYING |
Coleta técnica | {"s":1,"qualification_data":{"tipo_amostra":"amostra sintética"}} |
Merge e QUALIFYING |
2 SERVICE_IDENTIFIED |
Serviço completo | {"s":2,"servico":"Metagenoma_Shotgun","tipo_amostra":"amostra sintética"} |
Serviço conhecido+campos completos: DATA_COLLECT e Coleta no mesmo turno; incompleto: QUALIFYING; desconhecido: HANDOFF_PENDING |
3 QUESTION_ANSWERED |
Dúvida respondida | {"s":3} |
Resposta, QUALIFYING; não faz merge técnico |
4 HANDOFF |
Especialista necessário | {"s":4,"handoff_reason":"kit_externo"} |
Resumo/handoff, HANDOFF_PENDING |
5 AMBIGUOUS_OPTIONS |
Mais de uma opção | {"s":5,"opcoes_apresentadas":["Sanger","Genoma_Completo"]} |
Resposta, QUALIFYING; opções não são validadas como catálogo |
97 SUBJECT_CHANGE_CONFIRMATION |
Confirmar novo assunto | {"s":97} |
Mantém estado e salva texto pendente |
98 SUBJECT_CHANGE |
Troca confirmada | {"s":98,"subject_change_confirmed":true} |
CLOSED na anterior; nova TRIAGE |
99 CONTEXT_NEEDED |
Enriquecer contexto | {"s":99,"context_needed":"TARGETS_QPCR"} |
Reinvoca dentro do orçamento |
qualification_data aninhado tem precedência sobre forma plana. Completude significa presença, não validação científica de todos os valores. Falta de campos não incrementa um contador de três tentativas neste caminho.
Coleta — ColetaCode¶
| s / enum | Significado | Campos / exemplo mínimo | Efeito e próximo estado |
|---|---|---|---|
1 COLLECTING |
Cadastro parcial | {"s":1,"nome":"Pessoa Exemplo"} |
Merge, DATA_COLLECT |
2 SUMMARY_PRESENTED |
Resumo para aceite | {"s":2,"descricao_solicitacao":"Solicitação fictícia"} |
Merge, CONFIRM; exemplo é estrutural, não cadastro completo |
3 CORRECTION |
Campo corrigido | {"s":3,"email":"teste@example.invalid"} |
Merge e DATA_COLLECT |
4 CONFIRMATION_OK |
Cliente confirmou | {"s":4} com cadastro já na sessão |
Valida; sucesso/erro terminal vai HANDOFF_PENDING; erro de validação antes do terceiro mantém estado |
5 HANDOFF |
Recusa/incerteza/humano | {"s":5,"handoff_reason":"pedido_cliente"} |
HANDOFF_PENDING |
6 QUESTION_ANSWERED |
Responde e retoma cadastro | {"s":6} |
DATA_COLLECT, inclusive vindo de CONFIRM; sem merge |
97 SUBJECT_CHANGE_CONFIRMATION |
Confirmar novo assunto | {"s":97} |
Mantém estado e salva texto pendente |
98 SUBJECT_CHANGE |
Troca confirmada | {"s":98,"subject_change_confirmed":true} |
Fecha e cria nova sessão |
99 CONTEXT_NEEDED |
Enriquecer contexto | {"s":99,"context_needed":"CLICKSIGN_PROCESS"} |
Reinvoca no estado atual |
s=4 é uma ação composta: valida nove campos, prepara resumo/payloads, passa pelo guard, atualiza contato CRM e cliente eGestor, guarda intenção de deal e notifica depois da persistência. O prompt orienta usar esse código em CONFIRM; o dispatcher não faz um teste explícito session.state == CONFIRM antes de executar a ação. Não trate essa precondição de prompt como verificação programática adicional.
Códigos globais e falhas¶
- 97: escreve
pending_subject_change_text=original_text, responde pedindo confirmação. Uma resposta comum posterior limpa o pending e continua o fluxo. - 98: aceita
subject_change_confirmed is Trueou pending já existente. Sem ambos, vira pedido de confirmação com mensagem fixa. Em troca efetiva, gera resumo, fecha sessão, abre nova com vínculo e reproduz a solicitação original; não apenas a palavra de confirmação. - 99: exige package resolvível e ativo. Inexistente/sem conteúdo →
incerteza. Contador por inbound, default 2; terceira solicitação excede. Não envia o texto posterior ao JSON.
Código fora do enum dispara InvalidAgentCodeError, mapeado para handoff llm_invalid_json no caso de uso. Código válido com transição incompatível ainda pode lançar erro de domínio; validação de código e legalidade de estado são camadas distintas.
Motivos de handoff reais¶
HandoffReason, em src/core/domain/values.py, aceita: empresa_grande, reclamacao, cancelamento, pos_venda, recusa_texto, incerteza, pedido_cliente, llm_invalid_json, llm_timeout, api_failure, kit_externo, timeout. Alguns são produzidos por fallback/fluxos operacionais e não por exemplos de prompt. No handoff voluntário, motivo desconhecido usa default Triagem=pedido_cliente, Qualificação/Coleta=incerteza.
Verificação e alteração¶
tests/unit/domain/test_codes.py verifica membership; tests/unit/application/test_action_mapping.py cobre cada dispatcher; test_process_message_use_case.py cobre efeitos reais em repositories; test_confirm_action.py cobre a composição de s=4. Para novo código, atualize enum, dispatcher, prompt, erro, fixture e documentação. Nunca reaproveite um valor sem revisar os três agentes.
Veja parser, máquina de estados e serviços.