PRD-002 — Agent Context Engine
Contexto semântico da aplicação React para o Agente
Versão: 1.0 Status: Proposta para desenvolvimento Dependências: ADR-000, PRD-001 Próximo documento: PRD-003 — Knowledge Router + BM25
1. Objetivo
Criar o Agent Context Engine, responsável por informar ao agente o que o usuário está vendo, onde está, o que está selecionado e onde está sua atenção.
O objetivo não é capturar a tela inteira nem enviar o DOM ao LLM.
O objetivo é construir um modelo semântico, pequeno e determinístico da interface.
Assim, a frase:
"Explique."
poderá ser interpretada de maneira diferente dependendo do contexto.
Por exemplo:
Página: Permissão de Trabalho
Tab: Componentes
Componente em foco: Tabela de Componentes
Registro: PT-2026-004821
Campo: Tipo de Equipamento
A pergunta:
"Explique."
será semanticamente equivalente a:
"Explique o campo Tipo de Equipamento do registro PT-2026-004821, dentro da aba Componentes da Permissão de Trabalho."
2. Problema atual
Um chatbot convencional recebe:
message = "Explique isso"
e tenta inferir o significado.
Isso gera ambiguidade.
O Agent Context Engine acrescentará:
message
+
application context
+
UI context
+
semantic focus
+
selection context
produzindo uma solicitação semanticamente enriquecida.
3. Princípio fundamental
O contexto da aplicação é parte da linguagem do usuário.
Em uma aplicação complexa, palavras como:
- isso;
- este;
- aquele;
- aqui;
- acima;
- abaixo;
- o outro;
- esse campo;
- este registro;
são referências contextuais.
O agente deverá resolver essas referências antes de tentar responder.
4. O que será capturado
O contexto deverá ser dividido em níveis.
Application
│
▼
Route
│
▼
Page
│
▼
Section
│
▼
Tab
│
▼
Component
│
▼
Element
│
▼
Field
│
▼
Selection
Nem todos os níveis precisam existir em todas as telas.
5. AgentContext
Contrato inicial:
export interface AgentContext {
application: ApplicationContext;
navigation: NavigationContext;
page: PageContext;
focus?: FocusContext;
selection?: SelectionContext;
viewport?: ViewportContext;
user: UserContext;
timestamp: string;
contextVersion: number;
}
6. ApplicationContext
export interface ApplicationContext {
applicationId: string;
applicationVersion: string;
environment: "production" | "staging" | "development";
}
Exemplo:
{
"applicationId": "sst",
"applicationVersion": "8.14.2",
"environment": "production"
}
7. NavigationContext
export interface NavigationContext {
route: string;
routeName?: string;
params?: Record<string, string>;
breadcrumbs?: Breadcrumb[];
history?: NavigationEntry[];
}
Exemplo:
{
"route": "/work-permits/4821",
"routeName": "workPermit.details",
"params": {
"id": "4821"
}
}
8. PageContext
export interface PageContext {
id: string;
type: string;
title: string;
semanticId?: string;
metadata?: Record<string, unknown>;
}
O semanticId será especialmente importante para ligação com a HAG.
Exemplo:
work-permit.components
pode corresponder diretamente a documentos Markdown:
work-permit-components.md
9. Tabs
Aplicações complexas frequentemente utilizam múltiplas abas.
O contexto deverá registrar:
export interface TabContext {
id: string;
title: string;
index: number;
active: boolean;
}
A página poderá conter:
tabs: TabContext[];
activeTabId: string;
Exemplo:
{
"activeTabId": "components",
"tabs": [
{
"id": "general",
"title": "Geral",
"index": 0,
"active": false
},
{
"id": "components",
"title": "Componentes",
"index": 1,
"active": true
},
{
"id": "documents",
"title": "Documentos",
"index": 2,
"active": false
}
]
}
10. Focus Context
O foco será uma das informações mais importantes.
export interface FocusContext {
semanticId: string;
type:
| "page"
| "section"
| "tab"
| "component"
| "field"
| "button"
| "table"
| "row"
| "cell"
| "menu";
label?: string;
parentIds?: string[];
value?: unknown;
}
11. Exemplo de foco
Usuário está com o cursor em:
Validade
Context:
{
"semanticId": "workPermit.validity",
"type": "field",
"label": "Validade",
"parentIds": [
"workPermit",
"workPermit.components"
]
}
Então:
"Explique."
pode ser resolvido sem procurar o sistema inteiro.
12. Não utilizar o DOM como contexto
Uma decisão arquitetural importante:
não enviar HTML/DOM para o agente.
Errado:
DOM completo
↓
LLM
Problemas:
- enorme;
- lento;
- caro;
- contém informação irrelevante;
- pode conter dados sensíveis;
- instável entre versões.
Correto:
React Component
↓
Semantic Context
↓
Compact JSON
13. Semantic UI IDs
Os componentes relevantes deverão possuir identificadores semânticos.
Exemplo:
<ValidityField
data-agent-id="workPermit.validity"
/>
Ou, preferencialmente, através de um componente próprio:
<AgentContext
id="workPermit.validity"
type="field"
>
<ValidityField />
</AgentContext>
14. React Agent Context
Será criado um provider:
<AgentProvider>
<Application />
</AgentProvider>
Internamente:
AgentProvider
│
├── route
├── page
├── tab
├── focus
├── selection
└── user
15. Hooks
API proposta:
const agent = useAgentContext();
Exemplo:
agent.setPage({
id: "workPermit.details",
title: "Permissão de Trabalho"
});
Tab:
agent.setActiveTab("components");
Focus:
agent.setFocus({
semanticId: "workPermit.validity",
type: "field"
});
Selection:
agent.setSelection({
entityType: "workPermit",
entityId: "4821"
});
16. Não enviar cada mudança ao backend
O contexto local deverá existir no React.
UI
↓
Local Agent Context
Somente quando o usuário interagir com o agente:
User Message
+
Current Context
↓
Agent Gateway
Isso evita tráfego desnecessário.
17. Context Snapshot
Cada solicitação criará um snapshot:
interface AgentContextSnapshot {
id: string;
context: AgentContext;
createdAt: string;
}
O snapshot permite reproduzir exatamente o contexto que existia quando a pergunta foi feita.
18. Context Delta
Para otimizar conversas, o frontend poderá enviar somente mudanças.
Exemplo:
Context #100
Tab = general
↓
Context #101
Tab = components
Em vez de reenviar tudo.
O backend mantém:
Base Context
+
Delta
=
Current Context
19. Context Resolution
Antes do LLM, haverá uma etapa determinística:
"Explique isso"
│
▼
Reference Resolver
│
├── "isso" → Focus
│
├── "este" → Selection
│
└── "aqui" → Page
Isso será muito importante para reduzir o trabalho do modelo.
20. Pronoun / Reference Resolution
Exemplo:
Usuário:
"Explique isso."
Focus:
workPermit.validity
Resultado:
target = workPermit.validity
Outro:
"Altere isso para 30."
Se o foco for:
workPermit.validity
resultado:
{
"intent": "UPDATE",
"target": "workPermit.validity",
"value": 30
}
21. Contextual Hierarchy
O agente deverá conhecer a hierarquia.
WorkPermit
└── Components
└── Equipment
└── Validity
Se o foco for Validity, o sistema saberá automaticamente:
parent = Equipment
parent = Components
parent = WorkPermit
Isso permitirá contextualização sem enviar documentos inteiros.
22. Contexto + HAG
Aqui está a integração fundamental:
React Semantic ID
│
▼
workPermit.components
│
▼
Knowledge Router
│
├── exact match
├── keyword
├── BM25
├── Wikilinks
└── Vectorize
O semanticId poderá funcionar como uma espécie de ponte determinística entre UI e conhecimento.
23. Contextual Knowledge Boost
Se:
focus = workPermit.components
o Knowledge Router deverá priorizar documentos relacionados a:
workPermit.components
e seus vizinhos no grafo.
Conceitualmente:
Focus
↓
Exact semantic match
↓
Wikilinks neighbors
↓
BM25
↓
Vector search
24. Selected Record
Um dos elementos mais importantes será o registro selecionado.
Exemplo:
interface SelectionContext {
entityType: string;
entityId: string;
displayName?: string;
fields?: Record<string, unknown>;
}
Entretanto, não devemos enviar todos os campos automaticamente.
O backend deverá buscar somente os dados necessários.
25. Data minimization
Se o usuário perguntar:
"Qual é a validade?"
não será necessário enviar:
nome
CPF
endereço
telefone
salário
documentos
histórico
...
O sistema deverá buscar somente:
workPermit.validity
Isso reduz:
- tokens;
- latência;
- exposição de dados;
- risco de vazamento.
26. Hidden UI Areas
O problema das áreas escondidas será tratado explicitamente.
O contexto deverá distinguir:
visibility:
| "visible"
| "hidden"
| "collapsed"
| "inactive"
| "disabled";
Assim:
Tab = Documents
visible = false
não será considerada automaticamente como foco.
27. Viewport Context
Opcionalmente:
interface ViewportContext {
scrollContainer?: string;
visibleSemanticIds?: string[];
topVisibleElement?: string;
bottomVisibleElement?: string;
}
Isso permite compreender:
"O que é esse item aqui embaixo?"
sem capturar uma imagem da tela.
28. Mouse Cursor
O cursor físico não deve ser rastreado continuamente.
Isso seria:
- caro;
- desnecessário;
- potencialmente invasivo.
Em vez disso, o sistema deverá registrar elemento semanticamente focado/interagido.
Exemplo:
mouseenter
click
focus
selection
keyboard navigation
podem atualizar o foco sem transmitir coordenadas continuamente.
29. Teclado
O sistema deverá suportar navegação por teclado.
Exemplo:
Tab → campo A
Tab → campo B
Tab → campo C
O foco semântico muda:
field:A
↓
field:B
↓
field:C
O agente sempre recebe o foco atual.
30. Context Confidence
Nem sempre o foco será inequívoco.
Portanto:
interface ContextReference {
semanticId: string;
confidence:
| "exact"
| "high"
| "medium"
| "low";
}
Se houver ambiguidade:
"Você quer que eu explique o campo Validade ou o campo Data de Início?"
em vez de adivinhar.
31. Context Expiration
O contexto pode ficar obsoleto.
Exemplo:
Usuário pergunta
↓
registro 4821
↓
usuário muda para registro 4922
A conversa antiga não deve automaticamente operar sobre o novo registro.
Cada mensagem deverá possuir:
contextSnapshotId
32. Context Security
O frontend não é autoridade de segurança.
Um usuário malicioso poderia alterar:
{
"entityId": "another-user-record"
}
Portanto:
Client Context
↓
Backend
↓
Authorization
↓
Validated Context
O backend deverá validar se o usuário realmente pode acessar aquele recurso.
33. Context Schema Registry
Os tipos semânticos deverão ser registrados.
Exemplo:
workPermit
workPermit.components
workPermit.validity
workPermit.documents
workPermit.approval
Isso cria uma ligação direta com a HAG.
Idealmente:
UI semantic ID
↕
Knowledge semantic ID
↕
Capability semantic ID
Essa convergência será uma das maiores vantagens da arquitetura.
34. Context Graph
No futuro, poderemos representar:
Page
│
├── Tab
│ │
│ ├── Component
│ │ │
│ │ └── Field
│ │
│ └── Table
│
└── Actions
Isso forma um UI Knowledge Graph.
Ele não substitui a HAG.
Ele complementa a HAG.
35. Performance
O contexto deverá ser extremamente pequeno.
Meta inicial:
Typical context:
< 5 KB
Ideal:
1–3 KB
Não deverá conter:
- DOM;
- HTML;
- imagens;
- documentos;
- listas gigantes;
- dados completos do registro.
36. Cache
Contextos estáticos poderão ser cacheados.
Exemplo:
page schema
component metadata
semantic mappings
KV poderá ser usado posteriormente para dados quentes.
O contexto dinâmico:
current focus
current selection
active tab
permanece no cliente até a requisição.
37. Fluxo completo
React
│
┌─────────┴─────────┐
│ │
UI Events Navigation
│ │
└─────────┬─────────┘
▼
Agent Context
│
▼
Context Snapshot
│
▼
Agent Gateway
│
▼
Context Validation
│
▼
Reference Resolver
│
▼
Knowledge Router
38. Exemplo completo
Usuário está em:
Permissão de Trabalho
Na aba:
Componentes
Selecionou:
Equipamento: Andaime
Foco:
Validade
Ele digita:
"Altere isso para 30 dias."
O sistema monta:
{
"message": "Altere isso para 30 dias.",
"context": {
"page": "workPermit",
"tab": "components",
"selection": {
"entityType": "equipment",
"entityId": "equipment-827"
},
"focus": {
"semanticId": "workPermit.components.equipment.validity",
"type": "field"
}
}
}
O Intent Engine poderá produzir:
{
"intent": "UPDATE_FIELD",
"target": "workPermit.components.equipment.validity",
"value": 30,
"unit": "days"
}
O Planner encontra:
Capability:
workPermit.equipment.updateValidity
O Policy Engine verifica autorização.
O Execution Engine executa a operação.
Depois:
Verification
↓
UI refresh
↓
Agent response
"A validade do equipamento foi alterada para 30 dias."
39. Critérios de aceite
Evidência de implementação e produção — 2026-09-05
O Context Engine e o semantic-context-store do frontend registram página, rota, tab, foco, seleção e elementos visíveis sem depender do DOM. Cada mudança incrementa versão e TTL; snapshots minimizados preservam semantic IDs, redigem campos sensíveis, calculam hash e resolvem referências por prioridade determinística. As rotas de intent e orchestration validam identificadores e limite de contexto antes de usar o snapshot; contexto stale, cross-tenant ou fora do TTL é rejeitado. Os testes de engine/bridge aprovaram 8 casos e os testes de frontend/rotas aprovaram 14 casos em 2026-09-04.
Em 2026-09-05, os contratos de bridge, store semântico, atualização de UI e rotas passaram com 17 testes em 5 arquivos; os typechecks do Web e do Agent passaram. A cobertura comprova registro de contexto, snapshots/versionamento, resolução determinística, redaction, validação de backend e rejeição de contexto stale. O store mede o JSON por TextEncoder, congela o snapshot típico abaixo de 5.120 bytes e rejeita qualquer excesso com CONTEXT_SIZE_LIMIT_EXCEEDED; o chunk publicado execution-event-stream da Pages df7377f9-317a-494d-88df-d5bcd7d1c1a1 confirmou ambos os marcadores no artefato servido.
Em 2026-09-05, a versão de Worker 22b33d21-9018-4583-af20-b57025181a19 foi validada em Cloudflare por canário autenticado e tenant sintético isolado. O mesmo contrato mínimo de contexto usado pela UI de Work Permit retornou READY quando atual e retornou precisamente 409 STALE_CONTEXT_AGE quando o capturedAt tinha 310 segundos de idade, isto é, 10 segundos além do TTL de 300 segundos; o request expirado também não deixou linha em intent_audit_trail ou audit_ledger. O preview continuou não autorizador, e a trilha do preview aceito reteve somente hashes de contexto/utterance. A limpeza removeu as tabelas mutáveis de release no D1 e os dados sintéticos no PostgreSQL (remainingRows:0); os recibos imutáveis de intent_audit_trail e audit_ledger são deliberadamente retidos. Esta é uma prova Worker/API do contrato de contexto, complementada pelos testes React; não representa nem afirma E2E autenticado de navegador.
O PRD será considerado concluído quando:
- React conseguir registrar a página atual;
- React conseguir registrar a rota;
- React conseguir registrar tab ativa;
- React conseguir registrar foco semântico;
- React conseguir registrar seleção;
- contexto puder ser enviado junto à pergunta;
- contexto não depender do DOM;
- contexto possuir versionamento;
- contexto possuir snapshot;
- referências "isso", "este", "aqui" puderem ser resolvidas;
- contexto puder apontar para semantic IDs;
- semantic IDs puderem ser relacionados à HAG;
- backend validar contexto e autorização;
- dados sensíveis não sejam enviados desnecessariamente;
- contexto típico permanecer abaixo de 5 KB;
- mudança de tab atualizar o contexto;
- mudança de seleção atualizar o contexto;
- mudança de foco atualizar o contexto;
- contexto antigo não seja utilizado inadvertidamente após mudança de registro.
40. Resultado arquitetural
Ao concluir este PRD, teremos algo extremamente importante:
APLICAÇÃO
│
▼
SEMANTIC UI MODEL
│
┌─────────┼─────────┐
▼ ▼ ▼
HAG Agent APIs
Context
Ou seja, o agente deixa de receber simplesmente:
"O usuário perguntou X."
e passa a receber:
"O usuário perguntou X enquanto estava neste ponto semântico específico da aplicação."
Essa diferença será decisiva para a qualidade do sistema.
Próximo: PRD-003 — Knowledge Router + BM25
Este será provavelmente o PRD tecnicamente mais importante para atingir a velocidade que você está buscando.
Vamos especificar a camada de recuperação híbrida em detalhes:
Query
│
├── Exact Match
├── Keyword Index
├── BM25
├── Semantic ID
├── Wikilinks
├── Metadata
├── Vectorize
└── Context Boost
│
▼
Fusion/Ranking
│
▼
Knowledge Set
E, principalmente, vamos definir como evitar que uma pergunta simples percorra Vectorize + LLM + dezenas de documentos, criando um retrieval cascade com Fast Path, cache, BM25 e busca semântica somente quando realmente necessária.