Construímos um planeador GOAP numa tarde. Ele produz um plano limpo de nove passos para objetivos de engenharia em zero milissegundos. Não vamos deixá-lo perto de uma motion to dismiss. Eis o porquê — e as quatro barreiras que fecharíamos antes de o fazer.
O argumento e o veredito
Goal-oriented action planning (GOAP) é a arquitetura que os motores de xadrez usam: manter uma árvore de futuros, procurar o caminho mais barato de onde se está até onde se quer chegar, e podar o resto. É um encaixe muito melhor para litígio do que um modelo em estilo chat. Motions, discovery, julgamentos — tudo sequências de movimentos sob restrições. Modelos em estilo chat produzem a próxima frase plausível. Planeadores comprometem-se com um objetivo e trabalham de trás para a frente.
Factos-chave
- Um planeador GOAP A* funcional tem 517 linhas de JavaScript puro, sem dependências — portado numa tarde a partir do goal_ui do claude-flow da ruflo.
- O planeador GOAP do claude-flow da ruflo não implementa replaneamento adaptativo: plan() executa o A* exatamente uma vez, no momento da submissão do objetivo — verificado nos pontos de chamada em Index.tsx e ResearchReportModal.tsx (EXTERNAL-CITE: código-fonte do claude-flow da ruflo, lido diretamente).
- Apresentar uma 12(b)(6) de mérito antes de invocar a arbitragem pode implicar a renúncia ao direito de arbitrar, ao abrigo de Morgan v. Sundance (2022) — um planeador de caminho mais curto entra direto nessa armadilha.
Por isso, construímos um. 517 linhas de JavaScript puro, sem dependências, portado numa tarde a partir do planeador GOAP A* que vem embutido na app React `goal_ui` da ruflo. Corre sobre objetivos de engenharia como 'lançar o refactor de auth com testes e um PR' em zero milissegundos e produz um plano limpo de nove passos.
Não o vamos deixar tocar numa motion real. Ainda não. Este artigo é sobre o porquê, e sobre o que teria de mudar antes de o fazermos. Se vieram à procura de um elogio entusiasmado à próxima novidade de IA para advogados, o ponto deste artigo é o oposto: aqui está a fasquia de rigor que definimos antes de encaminharmos um objetivo de litígio através de qualquer planeador — o nosso, o da ruflo, o de quem quer que seja — e o fosso entre o planeador de hoje e essa fasquia.
O que o GOAP realmente é
O GOAP recebe três inputs: um estado-objetivo (factos que se querem verdadeiros — 'o PR está aberto', 'o CI está verde', 'implementado'), um estado inicial (o que é verdade agora) e uma biblioteca de ações (cada movimento possível, com pré-condições e efeitos — '`open_pr` requer `pushed=true` e `diff_reviewed=true`; define `pr_open=true`'). Depois executa uma pesquisa A* — o mesmo algoritmo que o GPS usa para contornar trânsito — sobre o espaço de sequências de ações, e devolve o caminho válido mais barato do estado inicial até ao objetivo. Se um passo falhar durante a execução, deve replanear a partir do novo estado.
Para advogados, a analogia mais próxima é o xadrez. Um grande mestre não pensa um movimento de cada vez; mantém uma árvore de futuros e vai podando à medida que o jogo avança. O GOAP é isso, tornado mecânico. Não é generativo; é pesquisa.
A arquitetura encaixa em litígio quase na perfeição. Uma motion to compel arbitration tem pré-condições rígidas (existe uma cláusula de arbitragem, a petição foi notificada, ainda não foi apresentada nenhuma motion de mérito) e efeitos rígidos (riscos de renúncia afastados, o tribunal tem de decidir sobre a arbitrabilidade). O discovery tem uma ordem estrita (writtens antes de depoimentos, class antes de mérito, meet-and-confer antes de motions to compel). O summary judgment tem um oráculo de aprovado/reprovado. A forma do trabalho é moldada para o GOAP.
O que construímos
Quatro ficheiros: `planner.js` (165 LOC, A* + min-heap binário), `actions.js` (134 LOC, doze ações de engenharia), `parse.js` (58 LOC, tabela de expressões que transforma inglês em estado-objetivo), `cli.js` (160 LOC, executor). Total: 517 LOC. Sem dependências npm. Legível em vinte minutos.
Corremo-lo contra o objetivo 'lançar o refactor de auth com testes e um PR':
goal predicates: {"pr_open":true,"ci_green":true,"deployed":true}
1. understand_code (cost 2) -> /zoom-out
2. write_tests (cost 3) -> /tdd
3. run_tests (cost 1) -> bash:test
4. review_diff (cost 1) -> /review
5. commit (cost 1) -> git:commit
6. push_branch (cost 1) -> git:push
7. open_pr (cost 1) -> /ship
8. wait_ci (cost 5) -> bash:ci-wait
9. merge_and_deploy (cost 2) -> /land-and-deploy
total cost: 17
expansions: 13 time: 0 ms found: trueNove passos, custo 17, treze expansões de nós, zero milissegundos. Cada passo mapeia para uma skill do gstack ou um comando de shell, por isso o plano é executável — não decorativo. Também testámos um objetivo mais pequeno ('testar o módulo de login' — 3 passos, custo 6) e um insatisfazível (um predicado que nenhuma ação define — devolveu `found: false` com o plano parcial mais próximo, em vez de rebentar ou entrar em loop). Os três comportamentos correspondem à especificação.
Isto levou uma tarde. Não é a parte difícil.
Porque portámos isto da ruflo
A ruflo (o ecossistema `claude-flow`) inclui um planeador GOAP dentro da sua app React `goal_ui` — `goapPlanner.ts`, ficheiro único, 180 linhas. A arquitetura é sólida. Extraímo-la.
Enquanto estávamos lá dentro, lemos o código-fonte com cuidado. Uma afirmação que não sobrevive ao contacto com ele: o planeador não implementa replaneamento adaptativo. O método `plan()` corre o A* exatamente uma vez, na submissão do objetivo, e devolve um `Step[]` que alimenta uma animação de interface. Não há loop de replaneamento, nem invalidação de plano, nem recuperação de falhas no ficheiro. Verificámos os pontos de chamada em `Index.tsx` e `ResearchReportModal.tsx`. A mesma história.
Não mencionamos isto para criticar a ruflo — o núcleo do planeador é bom código — mas porque importa para o resto deste artigo. O replaneamento adaptativo é a funcionalidade que mais se quereria ter antes de deixar um planeador chegar perto de um caso jurídico real, e a implementação open-source mais proeminente adjacente ao jurídico não a tem. Nós também não, ainda. Mais ninguém que tenhamos analisado também não.
Os três objetivos de litígio que não corremos
O plano original era correr três objetivos reais de litígio através do planeador e ter um litigante sénior a avaliar o resultado. Não o fizemos. Duas razões. Primeiro, encaminhar estratégia de litígio através de um URL público de terceiros — mesmo estratégia sintética sobre um cenário factual hipotético — tem implicações de privilégio que não quisemos navegar para um artigo de blog. Se não o faríamos por um cliente, não o devíamos fazer por nós próprios. Segundo, a nossa biblioteca de ações tem doze entradas e são todas ações de engenharia: `understand_code`, `write_tests`, `commit`, `push_branch`, `open_pr`, `wait_ci`, `merge_and_deploy`. Apontá-la a uma motion to dismiss produziria um plano que diria com confiança a um litigante para fazer `git commit` da sua resposta.
Mas os três casos de teste que escrevemos continuam a ser úteis — não como benchmarks que o planeador passou, mas como força motriz do que a próxima versão tem de conseguir tratar.
Caso 1 — Motion to dismiss com defesa de cláusula de arbitragem. Prompt: 'ganhar uma motion ao abrigo da Rule 12(b)(6) numa disputa contratual em que o autor alega breach mas o contrato tem uma cláusula de arbitragem clara.' A armadilha: a 12(b)(6) é o veículo errado. A arbitragem é imposta ao abrigo do FAA §§ 3-4, através de uma motion to compel. Apresentar uma 12(b)(6) de mérito antes de invocar a arbitragem pode implicar a renúncia ao direito de arbitrar, ao abrigo de Morgan v. Sundance (2022). Um planeador que redige a 12(b)(6) leva o cliente para território de malpractice.
Caso 2 — Estratégia de discovery para uma class action de salários e horas com 10 trabalhadores (CA). Prompt: 'construir um plano de discovery, priorizando pedidos de baixo custo e alta alavancagem.' Um associado júnior proporia depoimentos ao abrigo da 30(b)(6) de imediato. O plano correto coloca writtens antes de depoimentos, separa a certificação de classe do mérito, corre o aviso de opt-out Belaire-West antes de contactar qualquer membro putativo da classe, e intima o fornecedor terceiro de processamento salarial (dados mais limpos, mais rápido, sem custo de produção para a defesa). A sequência importa mais do que a substância.
Caso 3 — Summary judgment sobre uma cláusula de não-concorrência na Califórnia. Duas armadilhas. Armadilha um: o prompt cita 'Labor Code § 16600' — uma citação que não existe. A citação correta é Business & Professions Code § 16600. Armadilha dois: mesmo com a citação corrigida, o empregador quase de certeza perde. A SB 699 e a AB 1076 (em vigor desde 1 de janeiro de 2024) expandiram o § 16600 e acrescentaram um direito de ação privado com honorários de advogado. O movimento correto é aconselhar o cliente a abandonar totalmente a execução da não-concorrência e a mudar para uma teoria de segredo comercial ao abrigo da CUTSA, se os factos o suportarem. Um planeador que encontra o caminho A* mais curto para 'ganhar na não-concorrência' encontra um caminho para uma apresentação sancionável.
Estes três casos partilham uma característica estrutural: a saída mais valiosa não é um plano em direção ao objetivo declarado pelo utilizador. É 'o teu objetivo está errado; este é o objetivo certo.'
Isso não é o que o A faz. O A encontra o caminho mais curto. Vai encontrar caminhos mais curtos para estratégias perdedoras.
Experimente HAQQ AI grátis
Experimente a redação e pesquisa jurídica com IA
Quatro barreiras antes de confiarmos nisto com litígio
Eis o que teria de mudar. Nada disto é teórico — estes são os quatro itens no topo do plano v0.2.
1. A biblioteca de ações tem de ser redesenhada, de ponta a ponta. As ações de engenharia têm uma dimensão de custo (tempo de programador) e pré-condições limpas. As ações jurídicas têm pré-condições jurisdicionais (o FAA aplica-se, o tribunal está na Califórnia, a cláusula de arbitragem sobrevive ao § 16600), pré-condições estatutárias, pré-condições de calendário (o prazo da responsive pleading termina em 21 dias) e pré-condições adversariais (a contraparte ainda não apresentou X). A dimensão de custo também é diferente: custo monetário, horas de sócio, risco de sanções, exposição a fee-shifting. Uma biblioteca de ações jurídica séria tem provavelmente 200-500 ações com predicados parametrizados — uma ontologia real, escrita por litigantes, delimitada por área de prática.
2. O parser de objetivos tem de conseguir lidar com inglês jurídico real. O `parse.js` é uma tabela de expressões com cinco entradas. Mapeia 'lançar o refactor de auth' para `{pr_open, ci_green, deployed}` por correspondência de substring. Não consegue analisar 'ganhar uma motion ao abrigo da Rule 12(b)(6) numa disputa contratual em que o contrato tem uma cláusula de arbitragem clara.' A correção é pequena — Haiku em modo JSON, restringido por esquema aos predicados conhecidos. Cerca de meio dia. A mais pequena das quatro barreiras, e inútil sem as outras três.
3. O planeador tem de ser self-hosted. Nada relacionado com um caso real de cliente se aproxima de `goal.ruv.io` ou de qualquer URL de terceiros. Para além das questões de privilégio, não se pode auditar um planeador que não se controla. Self-hosted, em infraestrutura sob controlo do advogado, com registos que o advogado possui. Não negociável para a HAQQ.
4. O planeador tem de saber quando recusar o objetivo. A mais difícil. Um planeador A puro que encontra sempre o caminho mais curto vai executar estratégias perdedoras na perfeição. A correção não é apenas replaneamento adaptativo (voltar a correr o A quando uma ação falha). A correção é a crítica de objetivo: um passo de IA jurídica que corre antes do planeamento, verifica o objetivo face ao panorama doutrinário (§ 16600 + SB 699 + AB 1076 — 'esta ação de execução perde') e apresenta um objetivo alternativo ('mudar para CUTSA'). O replaneamento corrige falhas de execução. A crítica de objetivo corrige a falha mais profunda — o comprometimento total com um objetivo errado. Ambos são necessários; nenhum está implementado hoje.
O que isto ensina sobre IA no trabalho jurídico
A maioria dos produtos de IA otimiza para 'dá-me uma resposta confiante.' Essa é a forma errada para litígio, onde o trabalho é questionar a pergunta, identificar o que o cliente pensa que quer versus o que realmente precisa, e encontrar o movimento que o associado júnior teria falhado.
O GOAP está mais próximo dessa forma do que o chat. É estruturalmente honesto: diz quando não consegue chegar ao objetivo. Apresenta a sequência, não apenas a conclusão. Pode ser inspecionado, auditado, reproduzido.
Mas 'mais próximo do que o chat' não é 'suficientemente bom para trabalho jurídico.' A fasquia não é 'produz um plano.' A fasquia é 'produz um plano que um sócio assinaria com o próprio nome.' O GOAP de hoje, incluindo o nosso, está na primeira fasquia. A próxima versão tem de chegar à segunda. Não achamos que alguém que hoje vende um planeador — incluindo nós — deva ser confiado num caso real sem as quatro barreiras acima fechadas e demonstradas.
Para onde vamos a partir daqui
- Passo de crítica de objetivo (v0.2). Uma passagem em modo JSON do Haiku — 'examinar este objetivo face à doutrina; propor alternativa se estiver condenado' — antes de o planeador correr.
- Parser de objetivos de IA jurídica (v0.2). Substituir a tabela de expressões.
- Replaneamento adaptativo (v0.2). Envolver `plan()` num loop de execução que volta a pesquisar quando uma ação falha. Cerca de 50 linhas.
- Biblioteca de ações jurídica (v0.3). Delimitada por área de prática, escrita com revisão de litigantes, predicados parametrizados. Meses de trabalho, e o produto verdadeiro.
Quando estas quatro forem reais e testadas, vamos correr os três casos de litígio acima e publicar os resultados — incluindo as falhas, incluindo a crítica do litigante. Até lá, a única saída honesta é esta: um planeador de engenharia que funciona, um planeador jurídico que ainda não existe, e as notas de design de como o segundo tem de ser.



