PRD-001 — Agentic Architecture
Arquitetura da Camada Agentic sobre a HAG existente
Versão: 1.0 Status: Proposta para desenvolvimento Dependências: ADR-000 Próximo documento: PRD-002 — Agent Context Engine
1. Objetivo
Implementar a camada Agentic sobre a infraestrutura de conhecimento já existente, sem reconstruir a HAG, o Docusaurus, o Obsidian ou a documentação existente.
A camada deverá transformar a aplicação em um sistema capaz de:
entender → pesquisar → decidir → navegar → executar → verificar
utilizando linguagem natural.
O agente deverá funcionar tanto como:
- Assistente de conhecimento, respondendo perguntas;
- Assistente contextual, entendendo onde o usuário está;
- Assistente de navegação, levando o usuário ao local correto;
- Agente operacional, executando ações autorizadas;
- Orquestrador, combinando múltiplas operações em uma única solicitação.
2. Escopo
Este PRD define somente a arquitetura de integração.
Não implementa ainda:
- BM25;
- Context Engine;
- Capability Registry;
- Intent Engine;
- Planner;
- Execution Engine;
- Navigation Engine.
Esses componentes serão especificados nos PRDs seguintes.
Aqui definiremos como eles se encaixarão.
3. Arquitetura conceitual
A arquitetura proposta:
┌──────────────────────┐
│ Usuário │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ Agent UI / Chat │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ Context Engine │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ Agent Gateway │
└──────────┬───────────┘
│
┌───────────────┼───────────────┐
│ │ │
▼ ▼ ▼
Knowledge Router Intent Engine Capability
│ │ Registry
│ ▼
│ Planner
│ │
└───────┬───────┘
▼
Policy Engine
│
┌──────────┴──────────┐
│ │
▼ ▼
Navigation Engine Execution Engine
│ │
▼ ▼
React UI Hono API
│
▼
Sistema
4. Agent Gateway
O Agent Gateway será o ponto único de entrada.
Exemplo:
POST /api/agent
Request:
interface AgentRequest {
message: string;
conversationId?: string;
context: AgentContext;
}
Response:
interface AgentResponse {
type:
| "answer"
| "navigation"
| "confirmation"
| "execution"
| "error";
message: string;
citations?: KnowledgeReference[];
actions?: AgentAction[];
navigation?: NavigationInstruction;
confirmation?: ConfirmationRequest;
}
5. Por que um Gateway?
O frontend nunca deverá conversar diretamente com:
- Vectorize;
- D1;
- KV;
- R2;
- LLM;
- Execution Engine.
Tudo deverá passar pelo Gateway.
Isso fornece:
- autenticação;
- autorização;
- rate limiting;
- observabilidade;
- controle de contexto;
- versionamento;
- segurança;
- políticas centralizadas.
6. Context Engine
O frontend React fornecerá um contexto estruturado.
Exemplo:
interface AgentContext {
applicationId: string;
route: string;
page: {
id: string;
title?: string;
};
tab?: {
id: string;
title?: string;
};
focus?: {
componentId?: string;
elementId?: string;
fieldName?: string;
label?: string;
};
selection?: {
entityType?: string;
entityId?: string;
};
visibleArea?: {
componentIds: string[];
};
}
O Context Engine será detalhado no PRD-002.
7. Knowledge Router
O Knowledge Router será responsável por decidir:
Onde procurar a resposta?
Ele combinará:
Exact Match
+
Keywords
+
BM25
+
Wikilinks
+
Metadata
+
Contextual Ranking
+
Vector Search
A consulta não será enviada indiscriminadamente para todo o conhecimento.
8. Knowledge Sources
A camada Agentic deverá enxergar a HAG existente como uma fonte versionada.
Knowledge Package
│
┌──────────────┼──────────────┐
▼ ▼ ▼
Markdown Metadata Graph
│ │ │
▼ ▼ ▼
R2/D1 D1/KV D1/KV
│
├───────────────► BM25
│
└───────────────► Vectorize
A arquitetura não deverá exigir que o Markdown seja abandonado.
9. Knowledge Reference
Todo resultado de conhecimento deverá possuir identidade própria.
interface KnowledgeReference {
id: string;
type:
| "document"
| "section"
| "component"
| "function"
| "entity"
| "keyword";
title: string;
source: string;
version: string;
score?: number;
}
Isso permitirá ao agente dizer:
"Segundo a documentação de Permissão de Trabalho..."
e fornecer a referência correspondente.
10. Intent Engine
Depois do contexto e da recuperação inicial, o sistema determinará a intenção.
Exemplo:
"Explique este campo"
↓
{
"type": "EXPLAIN",
"target": {
"source": "ui-context"
}
}
Outro exemplo:
"Altere a validade para 30 dias"
↓
{
"type": "UPDATE",
"entity": "workPermit",
"field": "validity",
"value": 30
}
O Intent Engine será especificado no PRD-005.
11. Capability Registry
A intenção não chama uma API diretamente.
Exemplo:
Intent
│
▼
workPermit.update
│
▼
Capability Registry
│
▼
API contract
Capability:
interface Capability {
id: string;
description: string;
inputSchema: JSONSchema;
outputSchema: JSONSchema;
riskLevel:
| "read"
| "low"
| "medium"
| "high"
| "critical";
requiredPermissions: string[];
endpoint: string;
httpMethod: string;
}
12. Planner
Para operações simples:
Intent → Capability → Execute
Para operações complexas:
Intent
↓
Planner
↓
Step 1
↓
Step 2
↓
Step 3
↓
Validation
↓
Execution
Exemplo:
"Crie uma nova permissão copiando os dados desta e altere a validade para 30 dias."
Plano:
1. READ current work permit
2. CREATE new work permit
3. UPDATE validity
4. VERIFY created record
5. NAVIGATE to new record
13. Policy Engine
Antes de executar:
Plan
↓
Policy Engine
O Policy Engine verifica:
- usuário;
- tenant;
- roles;
- permissões;
- registro;
- operação;
- risco;
- estado atual;
- necessidade de confirmação.
Somente após aprovação:
Policy = ALLOW
o Execution Engine poderá continuar.
14. Execution Engine
O Execution Engine será o único componente autorizado a executar operações de negócio.
Agent
↓
Execution Engine
↓
Capability
↓
Authorization
↓
API
O agente nunca receberá:
database credentials
nem:
direct database access
15. Navigation Engine
A navegação será tratada como uma capacidade formal.
Exemplo:
{
"action": "NAVIGATE",
"route": "/work-permits/123",
"tab": "components",
"focus": "components-table"
}
O React recebe essa instrução e executa:
agent.navigate({
route: "/work-permits/123",
tab: "components",
focus: "components-table"
});
16. Fluxo de pergunta
Usuário:
"O que significa isso?"
Pipeline:
User
│
▼
React
│
UI Context
│
▼
Agent Gateway
│
▼
Knowledge Router
│
┌────────────┼────────────┐
▼ ▼ ▼
BM25 Wikilinks Vectorize
│ │ │
└────────────┼────────────┘
▼
Re-ranking
│
▼
Context Builder
│
▼
LLM
│
▼
Answer
17. Fluxo de execução
Usuário:
"Altere a validade para 30 dias."
User
│
▼
Context Engine
│
▼
Agent Gateway
│
▼
Intent Engine
│
▼
Intent
│
▼
Capability Registry
│
▼
Policy Engine
│
├── DENY
│
├── CONFIRM
│
└── ALLOW
│
▼
Execution Engine
│
▼
Hono API
│
▼
Database
│
▼
Verification
│
▼
Agent Response
18. Fluxo de confirmação
Exemplo:
"Exclua este registro."
O agente deverá responder:
Esta operação excluirá permanentemente o registro PT-12345. Deseja continuar?
Somente:
CONFIRM
permitirá continuar.
A confirmação deverá estar vinculada ao:
requestId
+
planHash
+
user
+
resource
Isso impede que uma confirmação antiga seja reutilizada.
19. Cloudflare
A infraestrutura poderá ser distribuída da seguinte forma:
Cloudflare
│
├── Workers
│ ├── Agent Gateway
│ ├── Knowledge Router
│ ├── Intent/Orchestration
│ └── Execution Gateway
│
├── D1
│ ├── Knowledge metadata
│ ├── capabilities
│ ├── relationships
│ ├── agent state
│ └── audit
│
├── R2
│ ├── Markdown
│ ├── Knowledge packages
│ └── generated artifacts
│
├── Vectorize
│ └── semantic embeddings
│
├── KV
│ ├── active version
│ ├── hot cache
│ └── configuration
│
└── Queues
└── asynchronous operations
A utilização exata de cada serviço será detalhada nos PRDs específicos.
20. Fast Path / Slow Path
Esse conceito será central.
Fast Path
Pergunta simples:
Query
↓
Context
↓
Exact/Keyword
↓
BM25
↓
Cached Knowledge
↓
Response
Objetivo:
dezenas de milissegundos, quando possível.
Slow Path
Pergunta complexa:
Query
↓
Context
↓
Hybrid Retrieval
↓
Intent
↓
Planning
↓
LLM Reasoning
↓
Policy
↓
Execution
↓
Verification
O usuário perceberá o sistema como rápido porque perguntas simples não precisarão atravessar todo o pipeline.
21. Streaming
Respostas longas deverão utilizar streaming.
Agent Gateway
│
▼
SSE/Stream
│
▼
React Chat
O usuário poderá começar a ler enquanto a resposta ainda está sendo produzida.
Para operações:
"Estou consultando..."
"Registro encontrado."
"Validando..."
"Operação concluída."
Isso melhora significativamente a percepção de velocidade.
22. Estado do agente
O estado deverá ser separado da conversa.
interface AgentState {
conversationId: string;
contextVersion: string;
currentIntent?: Intent;
currentPlan?: Plan;
pendingConfirmation?: Confirmation;
execution?: ExecutionState;
}
Não armazenar indiscriminadamente toda a conversa em cada request.
23. Idempotência
Toda operação de escrita deverá possuir:
idempotencyKey
Exemplo:
agent:{conversationId}:{requestId}
Isso evita duplicação caso:
- o usuário recarregue;
- a rede falhe;
- o cliente repita a requisição;
- o Worker seja reexecutado.
24. Observabilidade
Toda requisição deverá receber:
traceId
requestId
conversationId
tenantId
userId
knowledgeVersion
agentVersion
O tracing deverá permitir reconstruir:
Pergunta
↓
Contexto
↓
Documentos recuperados
↓
Intent
↓
Plan
↓
Policy
↓
API
↓
Resultado
25. Segurança
A segurança será defense in depth.
Authentication
↓
Tenant isolation
↓
Authorization
↓
Capability authorization
↓
Input validation
↓
Policy
↓
Execution
↓
Audit
O LLM nunca será uma autoridade de segurança.
26. Multi-tenant
Se o sistema possuir múltiplos clientes/organizações, o contexto deverá carregar:
tenantId: string;
A recuperação deverá ser tenant-aware.
Nunca permitir:
Tenant A
↓
Knowledge
↓
Tenant B
nem através de:
- D1;
- Vectorize;
- KV;
- cache;
- memória;
- embeddings.
O tenantId deverá participar da chave de todos os objetos sensíveis.
27. Versionamento do Agent
Além da versão do conhecimento:
knowledgeVersion
teremos:
agentVersion
Exemplo:
Agent: 1.4.2
Knowledge: 2026.09.01.153
Isso permite reproduzir exatamente o comportamento.
28. Contrato entre módulos
Todos os módulos deverão possuir contratos TypeScript compartilhados.
Recomendação:
packages/
└── agent-contracts/
├── context.ts
├── intent.ts
├── capability.ts
├── plan.ts
├── execution.ts
├── navigation.ts
├── knowledge.ts
└── response.ts
Isso será especialmente importante porque frontend e backend compartilharão os mesmos conceitos.
29. Critérios de aceite do PRD-001
Evidência de implementação e produção — 2026-09-05
Os contratos compartilhados de identidade e contexto, o Context Engine, o Capability Registry, o Intent Engine, o Policy Engine e o preview determinístico de Work Permit estão implementados. O fluxo exercitado liga contexto confiável a intent, autorização, policy, plano, confirmação e navegação sem conceder autoridade ao LLM; capabilities carregam semântica de idempotência e o runtime de plano mantém confirmações e transições explícitas. Os testes focados de contratos, contexto, registry, intent, policy, preview e runtime aprovaram 43 casos em 7 arquivos em 2026-09-04.
Em 2026-09-05, a cadeia foi recertificada pelos gates de Context Engine, Knowledge Router, Capability Registry, Intent, Planner, Context Bridge e Policy, além de canários autenticados de índice e despacho em produção. Os contratos comprovam contexto confiável, versões de knowledge/agent, descoberta e execução exclusiva por capabilities registradas no vertical certificado, confirmação/idempotência/requestId e ausência de autoridade do LLM. Uma auditoria transversal ainda é necessária para provar, literalmente, que nenhum agente ou toda operação futura do produto não possa contornar os gates.
Na mesma data, o Gateway de Integrações Externas recebeu um limite adicional de execução: cada autorização gera, no servidor, um receipt ALLOW de Policy com vida de cinco minutos, gravado imutavelmente na migração remota 0141_external_execution_policy_receipts.sql junto da operação. Referências de Policy fornecidas pelo cliente são ignoradas. Antes de obter credencial ou alcançar o provider, o executor revalida exatamente tenant, operação, ator, integração e versão, binding, capability e versão, hash canônico do input, aprovação e expiração; receipt ausente, expirado ou divergente falha fechada. A gravação de receipt e operação é condicional e atômica, evitando receipt órfão em admissão recusada.
O Worker e95ef1e1-3ca4-4053-8632-2ac8e04f97ef foi publicado a 100% no Cloudflare após a migração. O canário tenant-isolado de LMS confirmou receipt emitido pelo servidor nas autorizações síncrona e enfileirada, execução e despacho assíncronos, verificação de provider, enforcement de delegação e zero linhas residuais no PostgreSQL; receipts D1 imutáveis são retidos como trilha de auditoria. Os canários transversais de intent audit e control plane/release continuaram aprovados. Isto certifica o ponto de egress desse Gateway, não os demais despachantes: plano, intervenções, workflows e novas operações ainda exigem auditoria e migração explícitas.
Também em 2026-09-05, a migração remota 0142_intervention_execution_policy_receipts.sql passou a proteger a execução de intervenções. A autorização exige papel servidor e revisão humana, gera UUID de decisão no servidor e ignora referências de Policy fornecidas pelo cliente. A admissão resolve permissões no Capability Registry e RBAC servidor e vincula receipt imutável a intervenção, ator, approval_ref, binding, capability e hash do input. O Workflow valida o receipt e a identidade/input persistidos antes de RUNNING, antes de acessar Secrets Store e novamente antes de cada egress; expiração entre a leitura de credencial e a chamada ao provider também falha fechada. O Worker 024fdbfc-eee6-4581-acb4-986eeedc387e foi publicado a 100%; o canário sintético confirmou ambas as decisões server-side, rejeição de referências forjadas, provider limitado alcançado e zero linhas residuais no PostgreSQL. Uma tentativa remota controlada de atualizar o receipt foi abortada pelo trigger INTERVENTION_EXECUTION_POLICY_RECEIPT_IMMUTABLE; os receipts D1 da execução são deliberadamente retidos como trilha imutável e não contam como limpeza pendente.
Ainda em 2026-09-05, as confirmações sintéticas de action order de renovação e manutenção receberam o mesmo fence antes do segundo egress ao provider. Ambas carregam o receipt 0142 pelo tenant, intervenção, execução e decisão, e revalidam ator original, empresa persistida na execução, receiver com role server-side daquela empresa, Registry/binding/capability, input canônico, aprovação e expiração antes de Secrets Store e novamente antes do LMS_SANDBOX.fetch. Empresa forjada, receipt ausente, expirado ou divergente falham fechadas. O Worker 538970bc-294c-4bfc-99d6-f110a7f305c3 foi publicado a 100%; o canário confirmou negação de empresa forjada, confirmação limitada válida e limpeza PostgreSQL zero. Uma tentativa remota controlada de alteração do receipt sintético foi novamente abortada pelo trigger INTERVENTION_EXECUTION_POLICY_RECEIPT_IMMUTABLE; o receipt D1 retido é trilha de auditoria imutável.
Também em 2026-09-05, a migração remota 0143_plan_dispatch_policy_receipts.sql passou a proteger o dispatcher de planos confirmados. A confirmação gera UUID de decisão no servidor, ignora referência de Policy enviada pelo cliente e grava receipt ALLOW imutável, tenant-scoped, vinculado ao owner, plano, empresa persistida, binding do Registry, capability, hash do input e hash da aprovação. A revisão independente encontrou e a versão final corrigiu o risco de usar permissões de outra empresa: cabeçalho de empresa divergente agora falha, e a ausência de cabeçalho calcula roles exclusivamente da empresa gravada no snapshot. O Workflow relê e revalida receipt, snapshot, owner, empresa, adapter, capability, input, confirmação e expiração antes de RUNNING e imediatamente antes do único AGENT_API.fetch; divergência, ausência ou expiração falham fechadas. O Worker a1141136-dfdc-4d25-85e5-69067e13d297 foi publicado a 100% após os gates; o canário sintético confirmou recibo server-side, rejeição da referência forjada, vínculo persistido e caminho interno limitado, com limpeza do PostgreSQL e D1 mutável. A tentativa remota controlada de alterar o receipt sintético foi abortada pelo trigger PLAN_DISPATCH_POLICY_RECEIPT_IMMUTABLE; o único receipt D1 retido é a trilha de auditoria imutável.
Isto certifica o fluxo de execução de intervenções, o Gateway de Integrações Externas e o dispatcher de planos confirmados. Os demais workflows e novas rotas de operação continuam pendentes; os três critérios transversais abaixo permanecem deliberadamente abertos até a auditoria completa.
Também em 2026-09-05, as migrações remotas 0144_attention_notification_policy_receipts.sql e 0145_attention_notification_created_by.sql certificaram o egress de e-mail do Attention Center. A capability attention.notification.deliverEmail@1 é um contrato interno não descobrível por UI/modelo: continua governada pelo Registry e exige aprovação técnica e de negócio independentes para ativação, mas não aceita uma permissão ou confirmação fornecida pelo solicitante. O publisher grava, na mesma transação D1, um receipt ALLOW imutável e tenant-scoped com ator criador, delivery, integração/binding/capability pinados, destinatário, template, canal e hash canônico do payload. O gateway reconstrói a autoridade somente desse estado persistido e revalida os pins, o ator, a expiração e o Registry ativo imediatamente antes do envio.
O Worker 84f4eaca-a959-4915-b669-24c9674bb816 foi publicado a 100% após 53 arquivos e 446 testes. O canário sintético publicado confirmou: duas aprovações independentes; um receipt de policy e um receipt de entrega persistidos; rejeição pelo trigger de atualização do receipt; capability desativada bloqueando a criação antes de persistir notification, delivery ou receipt (0/0/0); 23 ocorrências agregadas, escore 80, ciclo OPEN → ACKNOWLEDGED → IN_PROGRESS → ESCALATED → RESOLVED → CLOSED, isolamento de tenant e endpoint sem autenticação bloqueado. providerReceiptRecorded=true registra somente o receipt de provider aceito pela rota; providerCallObserved=false, portanto esta certificação não afirma observação externa de envio pelo provedor. A limpeza PostgreSQL terminou com zero linhas; receipts D1 imutáveis permanecem deliberadamente como trilha de auditoria. O canário anterior no Worker sem a capability falhou como FEATURE_ABSENT, conforme esperado.
Esta certificação cobre exclusivamente o egress de e-mail do Attention Center. Ela não fecha os critérios globais deste PRD nem substitui a auditoria dos demais despachantes, workflows e novas rotas de operação.
A arquitetura será considerada aprovada quando:
- nenhum agente possuir acesso direto ao banco;
- todas as ações passarem pelo Capability Registry;
- todas as operações passarem por Policy;
- o contexto da UI puder ser transmitido ao Agent Gateway;
- o Knowledge Router puder receber contexto;
- o sistema suportar Fast Path e Slow Path;
- ações puderem exigir confirmação;
- operações possuírem idempotência;
- toda execução possuir
requestId; - conhecimento possuir versão;
- agente possuir versão;
- tenant isolation estiver definida;
- frontend e backend compartilharem contratos TypeScript;
- navegação for tratada como capacidade;
- execução e navegação forem separadas;
- LLM não possuir autoridade de segurança.
30. Ordem de implementação
Não implementar tudo simultaneamente.
A sequência recomendada é:
PRD-001
Architecture
│
▼
PRD-002
Context Engine
│
▼
PRD-003
Knowledge Router + BM25
│
▼
PRD-004
Capability Registry
│
▼
PRD-005
Intent Engine
│
▼
PRD-006
Planner
│
├──────────────┐
▼ ▼
PRD-007 PRD-008
Execution Navigation
│ │
└──────┬───────┘
▼
PRD-009
Security
│
▼
PRD-010
Agent State
│
▼
PRD-011
Observability
│
▼
PRD-012
Performance
│
▼
PRD-013
Agent SDK
│
▼
PRD-014
Testing
│
▼
PRD-015
Production
31. Resultado esperado
Ao final dessa arquitetura, a aplicação deixará de possuir simplesmente um:
Chatbot com RAG
e passará a possuir uma camada:
Agentic Application Intelligence Layer
capaz de compreender:
quem
+
onde
+
o quê
+
sobre qual registro
+
sobre qual componente
+
qual intenção
+
qual ação
+
se possui autorização
+
qual resultado esperado
e então:
RESPONDER
NAVEGAR
OU
EXECUTAR
de forma controlada.
Próximo documento — PRD-002
O próximo será PRD-002 — Agent Context Engine.
Esse é particularmente importante para o que você descreveu, porque vamos especificar exatamente como o React informará ao agente a página atual, rota, aba ativa, componente em foco, campo sob o cursor, registro selecionado, elementos visíveis e estado relevante da UI, sem mandar o DOM inteiro nem gerar uma carga enorme de dados.
Também vamos definir o mecanismo para o agente interpretar comandos extremamente curtos como:
"Explique."
"Faça isso."
"Altere para 30."
"Abra o outro."
usando o contexto da interface como parte da semântica da linguagem, que é uma das partes mais interessantes dessa arquitetura.