PRD-011 — Agentic UI Intelligence & Semantic Interaction Layer
1. Objetivo
O Agentic UI Intelligence & Semantic Interaction Layer define a camada que permite ao agente compreender e operar a interface React de forma semântica, sem depender de coordenadas de tela, seletores CSS frágeis ou interpretação visual do DOM.
O objetivo é que a interface deixe de ser apenas uma apresentação visual e passe a expor uma representação operacional estruturada para o agente.
React UI
│
├── Page
├── Tab
├── Section
├── Form
├── Field
├── Table
├── Row
├── Action
└── Entity
│
▼
Semantic UI Layer
│
▼
Agent Tool Runtime
│
├── Intent Engine
├── Planner
├── Policy
└── Conversation Runtime
2. Problema
Um agente que apenas conhece as APIs consegue executar operações de negócio, mas não necessariamente consegue controlar a experiência do usuário.
Por exemplo:
“Abra a permissão 123.”
A API pode localizar a permissão, mas o usuário espera que a aplicação:
- navegue para a tela;
- abra a permissão;
- selecione o registro;
- mostre a aba correta.
Outro exemplo:
“Agora vá para os componentes.”
O agente precisa saber que existe:
workPermit.components
e que isso corresponde à aba visual:
"Componentes"
Outro:
“Explique isso.”
O agente precisa saber qual elemento está semanticamente em foco.
3. Princípio fundamental
A aplicação não deve ensinar o agente através do DOM.
O agente deve receber uma representação semântica:
DOM
↓
React Components
↓
Semantic Metadata
↓
Semantic UI Registry
↓
Agent Context
Isso torna a integração:
- estável;
- rápida;
- tipada;
- independente do layout;
- independente de CSS;
- independente da resolução da tela;
- compatível com mudanças visuais.
4. Escopo
O PRD cobre:
- Semantic UI IDs;
- registro de componentes;
- páginas;
- abas;
- seções;
- campos;
- tabelas;
- entidades;
- ações;
- navegação;
- foco semântico;
- seleção;
- formulários;
- estado visual;
- comandos de UI;
- eventos;
- descoberta contextual;
- integração com React;
- integração com Tool Runtime;
- sincronização UI ↔ Agent;
- proteção contra contexto obsoleto.
Não cobre:
- design visual;
- criação de componentes React;
- implementação do Agent Planner;
- implementação do Policy Engine;
- APIs de negócio.
5. Arquitetura
┌───────────────────┐
│ React App │
└─────────┬─────────┘
│
┌─────────▼─────────┐
│ Semantic UI Layer │
└─────────┬─────────┘
│
┌────────────────┼────────────────┐
│ │ │
▼ ▼ ▼
UI Registry Context Provider Event Bus
│ │ │
└────────────────┼────────────────┘
│
▼
Agent Tool Runtime
│
┌────────────────┼────────────────┐
▼ ▼ ▼
Context UI Commands Events
6. Semantic UI ID
Todo elemento relevante para o agente deverá possuir um identificador semântico estável.
Exemplos:
workPermit
workPermit.header
workPermit.details
workPermit.validity
workPermit.components
workPermit.components.table
workPermit.components.add
workPermit.components.item
workPermit.risks
workPermit.approvals
Esses IDs não devem depender de:
- classes CSS;
- posição;
- texto traduzido;
- índice do elemento;
- ID HTML gerado automaticamente.
7. Tipos de Semantic UI Node
O sistema deverá suportar pelo menos:
PAGE
SECTION
TAB
PANEL
FORM
FIELD
TABLE
TABLE_ROW
LIST
LIST_ITEM
BUTTON
LINK
ACTION
DIALOG
MODAL
MENU
ENTITY
ENTITY_REFERENCE
8. Semantic UI Node
interface SemanticUINode {
semanticId: string;
type: SemanticUIType;
label?: string;
description?: string;
parentId?: string;
entityType?: string;
entityId?: string;
capabilities?: string[];
actions?: string[];
state?: Record<string, unknown>;
visible: boolean;
enabled?: boolean;
interactive?: boolean;
sensitive?: boolean;
}
9. Semantic Tree
A interface deverá poder ser representada como uma árvore semântica.
Exemplo:
workPermit
│
├── workPermit.header
│
├── workPermit.details
│ ├── workPermit.number
│ ├── workPermit.status
│ └── workPermit.validity
│
├── workPermit.components
│ ├── workPermit.components.table
│ ├── workPermit.components.add
│ └── workPermit.components.item
│
├── workPermit.risks
│
└── workPermit.approvals
O agente não precisa conhecer todos os nós simultaneamente.
O Runtime poderá obter apenas o subconjunto relevante.
10. Semantic Context
A camada deverá alimentar o SemanticUIContext definido no PRD-007.
Exemplo:
interface SemanticUIContext {
applicationId: string;
route: string;
page: SemanticReference;
activeTab?: SemanticReference;
focus?: SemanticReference;
selection?: EntityReference;
visibleEntities: EntityReference[];
filters?: FilterState;
form?: FormContext;
breadcrumbs?: SemanticReference[];
contextVersion: number;
timestamp: string;
}
11. Context Provider
A aplicação deverá possuir um provider central.
Exemplo conceitual:
<AgentSemanticProvider>
<Application />
</AgentSemanticProvider>
Esse provider será responsável por:
- registrar nós;
- atualizar foco;
- registrar seleção;
- registrar páginas;
- registrar tabs;
- registrar formulários;
- emitir eventos;
- produzir snapshots;
- sincronizar com o Agent Runtime.
12. Registro de componente
Um componente poderá declarar:
<AgentSemantic
id="workPermit.validity"
type="FIELD"
entityType="workPermit"
>
...
</AgentSemantic>
Ou, preferencialmente, através de componentes semânticos específicos:
<AgentField
semanticId="workPermit.validity"
capability="workPermit.updateValidity"
>
...
</AgentField>
A implementação final deverá evitar exigir alterações excessivas nos componentes existentes.
13. Semantic Hooks
A aplicação deverá disponibilizar hooks:
useSemanticContext()
useSemanticFocus()
useSemanticSelection()
useSemanticRegister()
useSemanticAction()
useAgentNavigation()
useAgentCommand()
Exemplo:
const { setFocus } = useSemanticFocus();
setFocus("workPermit.validity");
14. Semantic Focus
O foco semântico é diferente do foco do navegador.
Browser focus:
<input>
Semantic focus:
workPermit.validity
Isso permite:
“Explique isso.”
mesmo quando o agente não precisa saber qual elemento HTML possui foco.
15. Semantic Selection
Exemplo:
selection:
entityType = workPermit
entityId = WP-123
Ou:
selection:
entityType = component
entityId = COMP-81
A seleção deve ser atualizada quando o usuário:
- clica em uma linha;
- abre um registro;
- escolhe uma entidade;
- muda a seleção em uma tabela;
- navega para outra entidade.
16. Tabelas
Tabelas são especialmente importantes em sistemas SST.
A tabela deverá expor:
semanticId
columns
rows
selectedRows
filters
sorting
pagination
availableActions
Exemplo:
workPermit.components.table
poderá informar:
{
"entityType": "component",
"rows": [
{
"id": "COMP-81",
"semanticId": "workPermit.components.item"
}
]
}
17. Não enviar todas as linhas ao agente
Uma tabela com 10.000 registros não deve ser enviada integralmente ao Runtime.
O contexto deverá informar:
totalRows = 10000
visibleRows = 25
selectedRows = 1
filters = ...
Quando necessário, o agente poderá usar uma capability de busca.
Isso preserva performance e privacidade.
18. Forms
Formulários deverão possuir contexto semântico.
interface FormContext {
formId: string;
entityType?: string;
entityId?: string;
dirty: boolean;
valid: boolean;
fields: FormFieldContext[];
submitCapabilityId?: string;
cancelCapabilityId?: string;
}
19. Form Fields
Cada campo poderá expor:
semanticId
label
value
type
required
valid
dirty
editable
visible
sensitive
capability
Exemplo:
workPermit.validity
poderá indicar:
value = 30
type = number
required = true
editable = true
20. Dados sensíveis
Campos sensíveis não deverão ser enviados integralmente.
Exemplo:
CPF
document number
salary
medical information
private contact information
poderão aparecer apenas como:
sensitive = true
ou mascarados.
A regra de exposição deverá ser controlada pelo Policy Engine.
21. UI Command Registry
O agente não deverá executar comandos arbitrários no navegador.
Deverá existir um registry.
Exemplo:
NAVIGATE
OPEN_TAB
SELECT_ENTITY
FOCUS
OPEN_DIALOG
CLOSE_DIALOG
REFRESH
EXPAND
COLLAPSE
HIGHLIGHT
SCROLL_TO
22. Navigation Capability
Exemplo:
interface NavigateCommand {
type: "NAVIGATE";
target: {
semanticId: string;
entity?: EntityReference;
};
}
O agente solicita:
NAVIGATE → workPermit.components
e a aplicação decide como chegar lá.
23. Nunca navegar por URL arbitrária
Não permitir:
navigate("https://...")
nem:
navigate("/admin/users/delete")
A navegação deverá ocorrer através de destinos registrados:
workPermit
workPermit.components
workPermit.risks
employee
employee.documents
Isso evita:
- SSRF conceitual;
- acesso indevido;
- rotas internas não autorizadas;
- URLs inventadas pelo LLM.
24. UI Actions
Ações visuais deverão possuir identidade semântica.
Exemplo:
workPermit.components.add
workPermit.components.remove
workPermit.save
workPermit.cancel
workPermit.submit
O agente não diz:
clique no botão azul.
Ele diz:
execute UI action:
workPermit.components.add
25. UI Action vs Business Capability
São conceitos diferentes.
UI Action
Manipula a interface.
OPEN_TAB
OPEN_DIALOG
FOCUS
SELECT
Business Capability
Manipula dados ou negócio.
workPermit.components.add
workPermit.updateValidity
Uma UI Action pode eventualmente iniciar uma Business Capability.
OPEN_DIALOG
↓
USER INPUT
↓
workPermit.components.add
26. Estado visual
O Semantic UI Layer deve informar estados relevantes:
visible
enabled
disabled
loading
expanded
selected
dirty
invalid
readonly
locked
Exemplo:
workPermit.components.add
enabled = false
reason = WORK_PERMIT_APPROVED
O agente poderá então responder:
Não posso adicionar componentes porque essa permissão está aprovada.
27. UI State ≠ Business State
O agente não deve confiar exclusivamente no estado visual.
Exemplo:
button.disabled = false
não significa que a operação está autorizada.
A autorização real continua sendo responsabilidade do backend/Policy Engine.
28. Event Bus
A camada semântica deverá emitir eventos.
PAGE_CHANGED
TAB_CHANGED
FOCUS_CHANGED
SELECTION_CHANGED
FORM_CHANGED
FORM_SUBMITTED
ENTITY_OPENED
ENTITY_CLOSED
UI_ACTION_STARTED
UI_ACTION_COMPLETED
UI_ERROR
Esses eventos alimentam o Conversation Runtime.
29. Context Delta
Não transmitir o contexto inteiro a cada alteração.
Exemplo:
Antes:
tab = details
Depois:
tab = components
Enviar somente:
{
"type": "TAB_CHANGED",
"previous": "workPermit.details",
"current": "workPermit.components"
}
Isso reduz tráfego e processamento.
30. Context Snapshot
Periodicamente ou em eventos importantes:
Semantic Context Snapshot
deverá ser produzido.
Isso permite recuperar o estado caso eventos sejam perdidos.
31. Context Version
Cada alteração significativa incrementa:
contextVersion
Exemplo:
101 → page change
102 → tab change
103 → selection change
104 → form change
Operações críticas podem registrar:
expectedContextVersion = 103
e detectar mudanças posteriores.
32. Agent → UI
O fluxo inverso também é necessário.
Agent
↓
Tool Runtime
↓
UI Command
↓
Semantic UI Layer
↓
React
Exemplo:
{
"command": "OPEN_TAB",
"target": "workPermit.components"
}
33. UI Command Result
A UI deverá responder:
{
"success": true,
"commandId": "cmd_123",
"newContextVersion": 105
}
ou:
{
"success": false,
"error": "TARGET_NOT_AVAILABLE"
}
O agente não deve assumir que um comando visual foi executado apenas porque o comando foi enviado.
34. Command Lifecycle
REQUESTED
↓
VALIDATING
↓
EXECUTING
↓
COMPLETED
ou:
REQUESTED
↓
FAILED
35. Contextual Tool Discovery
O Tool Runtime não deverá expor todas as ferramentas da aplicação simultaneamente.
Se o usuário está em:
workPermit.components
as capabilities mais relevantes podem ser:
workPermit.components.add
workPermit.components.remove
workPermit.components.update
workPermit.components.list
Isso reduz o espaço de decisão do agente.
36. Dynamic Capability Surface
O Runtime poderá calcular:
Available Tools =
Global Tools
+
Current Page Tools
+
Current Entity Tools
+
Current Selection Tools
+
Current Form Tools
Exemplo:
Current page:
workPermit.components
Current selection:
COMP-81
Resultado:
workPermit.components.update
workPermit.components.remove
workPermit.components.explain
37. Integração com Knowledge Graph
O Semantic UI Layer também será uma ponte para o HAG.
Exemplo:
UI:
workPermit.validity
│
├── Documentation
├── Capability
├── Policy
├── Business Rule
└── API
Assim, quando o usuário disser:
Explique isso.
o sistema poderá resolver:
UI Focus
↓
Semantic ID
↓
Knowledge Graph
↓
Documentation
sem precisar fazer uma busca semântica ampla.
38. Tradução e internacionalização
Semantic IDs não devem mudar conforme idioma.
Errado:
permissao.componentes
permiso.componentes
work-permit.components
Correto:
workPermit.components
O label pode ser traduzido.
semanticId = workPermit.components
label.pt-BR = Componentes
label.en-US = Components
39. Acessibilidade
A camada semântica deve complementar, e não substituir, acessibilidade.
Quando possível, deve haver integração com:
- ARIA;
- labels;
- roles;
- keyboard navigation;
- focus management.
Mas o agente deve consumir a camada semântica própria, não depender de acessibilidade como única fonte de contexto.
40. Compatibilidade com React
A implementação deverá ser não invasiva.
Idealmente:
<AgentSemantic
id="workPermit.components"
>
<ExistingComponents />
</AgentSemantic>
ou wrappers/hook:
const semantic = useAgentSemantic({
id: "workPermit.components"
});
O objetivo é evitar reescrever a aplicação existente.
41. Registro automático
Sempre que possível, informações deverão ser derivadas automaticamente de:
- React component metadata;
- TypeScript;
- TypeDoc;
- Semantic IDs;
- Capability Registry;
- UI Registry;
- Knowledge Graph.
Isso reduz duplicação manual.
42. Build-time Manifest
O pipeline poderá gerar:
agent-ui-manifest.json
Exemplo:
{
"version": "1.4.0",
"pages": 82,
"semanticNodes": 4217,
"actions": 638,
"forms": 143,
"tables": 97
}
Esse manifesto poderá ser usado pelo Agent Runtime para discovery rápido.
43. Runtime Registry
O frontend não precisa enviar toda a árvore semântica a cada sessão.
O Runtime pode possuir:
Static UI Manifest
+
Live UI Context
Assim:
Manifest
→ o que existe
Live Context
→ o que está acontecendo agora
Essa separação é fundamental para performance.
44. Performance
Objetivos:
Context update
P50 < 5 ms no frontend.
Semantic lookup
P50 < 5 ms.
Command dispatch
P50 < 20 ms, excluindo navegação/renderização.
Context transmission
Enviar somente deltas quando possível.
Agent discovery
Não enviar centenas de capabilities ao LLM.
45. Segurança
O Semantic UI Layer não é uma camada de autorização.
Ele informa:
o que está disponível visualmente.
O backend decide:
o que o usuário pode realmente fazer.
Portanto:
UI says ENABLED
≠
Authorization ALLOWED
A autorização sempre deverá ser recalculada no servidor.
46. Proteção contra manipulação do contexto
O cliente pode enviar:
entityId = WP-999
O servidor deve validar:
user
tenant
resource
permission
antes de executar qualquer capability.
Contexto visual é input não confiável.
47. Auditabilidade
Comandos de UI importantes devem gerar eventos:
agent.ui.navigate
agent.ui.select
agent.ui.openDialog
agent.ui.focus
Operações de negócio continuam sendo auditadas pelo mecanismo de execução/política.
48. Exemplo completo
Usuário:
Abra a permissão 123.
Agent:
NAVIGATE
target = workPermit
entity = WP-123
UI:
PAGE_CHANGED
entity = WP-123
contextVersion = 201
Usuário:
Vá para os componentes.
Agent:
OPEN_TAB
target = workPermit.components
UI:
TAB_CHANGED
current = workPermit.components
contextVersion = 202
Usuário:
Selecione o componente de trabalho em altura.
Agent:
SELECT_ENTITY
entityType = component
entityId = COMP-81
UI:
SELECTION_CHANGED
entity = COMP-81
contextVersion = 203
Usuário:
Explique isso.
Runtime:
focus/selection
↓
COMP-81
↓
Knowledge Router
↓
documentation
O LLM recebe somente o contexto necessário para produzir a explicação.
49. Exemplo de formulário
Usuário:
Edite a validade para 60 dias.
Contexto:
page = workPermit
entity = WP-123
focus = workPermit.validity
form.dirty = false
Intent Engine produz:
UPDATE
target = WP-123
field = validity
value = 60
Planner seleciona:
workPermit.updateValidity
Policy valida.
Execution ocorre.
UI recebe:
REFRESH_DATA
target = workPermit.validity
50. Critérios de aceitação
Evidência parcial de implementação — 2026-09-04
O semantic registry e o frontend expõem IDs estáveis, independentes de CSS/posição, para página, tab, foco, seleção e comandos. O semantic-context-store gera mudanças versionadas e snapshots minimizados; o dispatcher aceita somente comandos registrados e o backend continua a validar escopo, sem tratar contexto como autorização. Testes de contexto, registry, dispatcher e navegação aprovaram 17 casos em 2026-09-04, cobrindo bloqueio de destino arbitrário, estado stale e resolução determinística.
Esta evidência não demonstra instrumentação de todos os formulários, tabelas e dialogs do produto, nem um canário de acessibilidade/navegador abrangente. O critério de adoção transversal de todos os elementos importantes permanece aberto.
Semantic Layer
- elementos importantes possuem Semantic IDs;
- IDs são estáveis;
- IDs não dependem de CSS ou posição;
- páginas, tabs, forms, fields, tables e actions podem ser representados.
Context
- contexto semântico é atualizado em tempo real;
- foco semântico é suportado;
- seleção semântica é suportada;
- contexto possui versionamento;
- alterações podem ser transmitidas como deltas.
UI Commands
- navegação usa destinos registrados;
- tabs podem ser abertas pelo agente;
- entidades podem ser selecionadas;
- foco pode ser alterado;
- dialogs podem ser abertos;
- UI pode informar sucesso ou falha.
Forms
- estado dirty é identificado;
- campos obrigatórios podem ser identificados;
- campos sensíveis podem ser protegidos;
- capabilities associadas ao formulário podem ser descobertas.
Segurança
- UI context nunca é tratado como autorização;
- tenant/user são validados no backend;
- navegação arbitrária é bloqueada;
- dados sensíveis são minimizados.
Performance
- contexto não envia DOM;
- contexto não envia árvore completa desnecessariamente;
- capabilities são filtradas;
- lookup semântico é determinístico;
- operações simples não dependem de LLM.
Evidência parcial de implementação — 2026-09-04
O workspace Work Permit usa Semantic IDs estáveis para página, detalhes, campos, ações e componentes; o board associa a entidade operacional real em data-agent-entity-id. O store publica contexto versionado de página/aba/foco/seleção sem DOM scraping, e o registry mantém comandos/capabilities declarados e filtrados. Contexto de UI é minimizado e não se torna autorização.
Em 2026-09-04, a tela Work Permit passou a receber elioria:ui-command e encaminha apenas workPermit.open pelo dispatcher local registrado. O dispatcher exige página e capability declaradas, valida parâmetros, rejeita URL/comando desconhecido/contexto incompatível e só seleciona a entidade já carregada; ele não chama endpoint nem concede execução.
Em 2026-09-04, Auditorias passou a declarar seleção inicial como entidade audit, em vez de herdar o padrão workPermit; assim o primeiro snapshot já preserva tipo e ID autoritativos do dossiê. O consumo SSE finito também encerra silenciosamente AbortError esperado no unmount, removendo rejeições não tratadas sem mascarar falhas de rede reais.
Em 2026-09-05, os contratos de registry semântico, discovery de capabilities, preview de intent e orchestration passaram com 19 testes em 4 arquivos, e o typecheck do Agent passou. A prova cobre IDs estáveis sem DOM/CSS, contexto versionado e em delta, foco/seleção/formulário, descoberta filtrada, navegação registrada e bloqueio de destino arbitrário; o backend preserva tenant/usuário como fonte de autorização. Pages ef7fecaf já havia publicado /auditorias e seu chunk JavaScript. Ainda falta cobertura de telas além de Work Permit e Auditorias; portanto o critério de instrumentar todos os elementos importantes permanece aberto.
Em 2026-09-06, a regressão atual de manifest, contexto semântico, dispatcher e página Work Permit passou com 12 testes, e o typecheck/build do Web passou. A rota pública /work-permits e seu asset JavaScript responderam HTTP 200 com MIME correto. A cobertura permanece PARTIAL, pois Work Permit e Auditorias ainda não representam todos os elementos e telas importantes.
51. Resultado arquitetural
Com o PRD-011, teremos uma separação muito importante:
AGENT
│
┌─────────┴─────────┐
│ │
Business World UI World
│ │
Capabilities Semantic UI
│ │
└─────────┬─────────┘
│
Agent Runtime
O agente passa a compreender simultaneamente:
o que o sistema pode fazer
+
onde o usuário está
+
qual entidade está selecionada
+
qual parte da interface está em foco
+
quais ações estão disponíveis
+
qual conhecimento explica aquela parte da interface
Isso fecha a integração entre agente, aplicação React, conhecimento, APIs e experiência visual.
PRD-012 — Agentic Task Memory & Operational Learning
O próximo estágio deverá tratar de uma questão diferente: como o agente aprende com a operação sem transformar cada conversa em treinamento do modelo.
O PRD-012 deverá definir uma camada de memória operacional e aprendizado baseado em evidências, capaz de registrar:
o que o usuário pediu
↓
o que o agente interpretou
↓
o que foi executado
↓
o que deu errado
↓
o que o usuário corrigiu
↓
qual foi o resultado final
O objetivo não será “treinar a IA automaticamente”, mas criar um mecanismo controlado para descobrir padrões como:
- intents frequentemente ambíguas;
- capabilities frequentemente confundidas;
- referências que exigem esclarecimento;
- comandos que os usuários corrigem repetidamente;
- fluxos que deveriam virar novas capabilities;
- documentação que não está suficientemente clara;
- componentes da UI que precisam de melhor semanticização;
- operações que geram frequentemente falhas;
- pontos onde o agente está recorrendo ao LLM quando poderia existir uma resolução determinística.
Isso permitirá que o próprio sistema gere evidências para evolução da plataforma, sem permitir que o agente altere automaticamente suas próprias regras de segurança, capabilities ou políticas.