KB References
Base de conhecimento cross-projeto do Simplafy Admin com módulos, criticality, semantic search via pgvector e ciclo de verificação periódica.
KB References
A KB (Knowledge Base) do Simplafy Admin centraliza conhecimento operacional, arquitetural e de runbooks consumido por humanos e por coding agents via MCP. Cada entrada é uma reference — um documento curto, versionado, com metadados ricos e busca semântica habilitada por embeddings.
A KB serve como camada compartilhada entre simplafy-hub, simplafy-saude, simplafy-seguros, simplafy-infra e o próprio simplafy-admin. Refs são acessadas pela API REST (/api/references/*) e pelas tools MCP (create_reference, get_reference, search_semantic, etc.).
A KB não substitui docs públicos. Ela armazena conhecimento operacional cross-projeto — decisões de arquitetura, gotchas, runbooks, padrões — que precisa ser descoberto por agents em tempo de execução.
O que é uma reference
Uma reference é um registro na tabela Reference com slug único, conteúdo Markdown e metadados estruturados. O schema operacional é:
| Campo | Tipo | Descrição |
|---|---|---|
id | string | ID interno gerado |
slug | string | Identificador estável (auto-gerado a partir do título) |
module | RefModule | Projeto/área dona da ref |
title | string | Título curto, max 200 chars |
content | string | Markdown, max 16384 chars |
category | string | Sub-agrupamento livre dentro do módulo (default general) |
criticality | Criticality | INFO, WARNING ou CRITICAL |
tags | string[] | Validados contra vocabulário controlado |
type | ReferenceType | adr, runbook, prd, architecture, gotcha, etc. |
relatedReferences | string[] | Slugs de outras refs (backref derivado em referencedBy) |
relatedStoryIds | string[] | IDs de stories do PM Board |
sourceUrl | string (URL) | URL opcional de origem |
lastVerified | DateTime | Última verificação humana |
verifyByDate | DateTime | Próxima verificação devida (default now + 30d) |
accessCount | int | Contador incrementado em cada leitura |
lastAccessedAt | DateTime | Última leitura registrada |
Criar uma reference
curl -X POST https://admin.simplafy.com.br/api/references \
-H "Content-Type: application/json" \
-H "x-agent-id: claude-code" \
--cookie "next-auth.session-token=..." \
-d '{
"module": "HUB",
"title": "Padrao de reconnect AMQP no agent worker",
"content": "# Reconnect AMQP\n\nUsar aio_pika.connect_robust...",
"category": "messaging",
"criticality": "WARNING",
"tags": ["rabbitmq", "agent-worker"],
"type": "gotcha"
}'O x-agent-id é gravado no campo updatedBy para trilha de auditoria. Se ausente, cai no session.user.id.
Tags são validadas contra um vocabulário controlado. Tags fora do vocab são rejeitadas com VALIDATION_ERROR. Use list_categories ou a tool MCP manage_tag_vocabulary antes de criar refs com tags novas.
Categorias e criticality
Módulos
O enum RefModule define a quem a ref pertence:
| Módulo | Uso |
|---|---|
INFRA | simplafy-infra — K8s, VPS, networking, DNS |
HUB | simplafy-hub — agents, pipes, integrações |
MCP | MCP servers — admin, pipefy, evolution |
META | Decisões transversais ao ecossistema |
INFISICAL | Secrets, paths, rotação |
REF | Refs sobre a própria KB |
GENERAL | Catch-all |
Criticality
Criticality afeta ordenação default em list_references e search_references (críticas primeiro):
Informação de referência. Não bloqueante. Default ao criar refs sem criticality explícita.
Gotcha ou padrão importante. Agent deve consultar antes de tocar a área coberta.
Decisão arquitetural irreversível ou risco de produção. Agent deve ler antes de qualquer mudança relacionada.
Listar com filtros
GET /api/references?module=HUB&criticality=CRITICAL&tags=agents,rabbitmqParâmetros aceitos:
module—RefModulecategory— stringcriticality—Criticalitytags— CSV de tags
Response: { success: true, data: Reference[], meta: { total } }.
Semantic search (pgvector)
A busca semântica usa embeddings text-embedding-3-small da OpenAI armazenados em coluna vector (pgvector) com índice IVFFlat e operador <=> (cosine distance).
Endpoint REST
GET /api/references/search?q=como+lidar+com+reconnect+amqp&module=HUBEsse endpoint usa busca textual (Prisma contains em title, content, category + tags has). Para busca semântica real, use a tool MCP.
Tool MCP search_semantic
{
"tool": "search_semantic",
"args": {
"query": "como evitar deadlock em worker aio_pika",
"module": "HUB",
"top_k": 10
}
}Fluxo interno:
Gera embedding da query via OpenAI text-embedding-3-small.
Se OpenAI falhar, fallback automático para busca textual (Prisma contains). Response inclui fallback: true e fallback_reason.
Raw SQL com embedding <=> $1::vector ordenado por cosine distance, filtrado por module e criticality opcionais.
Retorna top_k refs com cosine_similarity (4 casas decimais). Update fire-and-forget de lastAccessedAt.
Response shape:
{
"result": {
"references": [
{
"id": "...",
"slug": "reconnect-amqp-worker-abc12",
"title": "Padrao de reconnect AMQP no agent worker",
"module": "HUB",
"category": "messaging",
"criticality": "WARNING",
"tags": ["rabbitmq", "agent-worker"],
"cosine_similarity": 0.8421,
"updatedAt": "2026-05-20T12:00:00Z"
}
],
"total": 1,
"top_k": 10,
"fallback": false,
"duration_ms": 187
}
}cosine_similarity é 1 - cosine_distance. Valores próximos de 1 indicam alta similaridade. Logs do MCP server registram cosine_similarity por slug retornado para monitoramento de qualidade da KB.
Geração de embeddings
Ao criar ou atualizar uma reference, o serviço enfileira enqueueEmbedReference(ref.id) (fire-and-forget). O worker chama OpenAI e popula a coluna embedding. Refs sem embedding não aparecem em search_semantic até serem processadas — mas continuam visíveis em list_references e na busca textual.
Verificação periódica
Toda reference tem um campo verifyByDate que define quando ela precisa ser revisada por um humano ou agent. Default ao criar: now + 30 dias.
Endpoint REST
PATCH /api/references/{id}/verifyAtualiza lastVerified = now, verifyByDate = now + 30 dias e updatedBy = x-agent-id ?? session.user.id.
Tool MCP verify_reference
{
"tool": "verify_reference",
"args": { "slug": "reconnect-amqp-worker-abc12" }
}Aceita id ou slug. Requer scope admin:kb:write.
Quando re-verificar
- Após mudança relacionada em produção que afete o conteúdo da ref.
- Quando a ref aparece em
search_stale_references(ver abaixo). - Antes de promover uma ref de
INFOparaWARNINGouCRITICAL.
Re-verificar não modifica conteúdo. É apenas um sinal de "ainda válida em DD/MM/YYYY". Para mudar o conteúdo, use PATCH /api/references/{id} ou a tool update_reference — que também re-enfileira o embedding.
Stale references
Refs vencidas ou não verificadas em N dias são consideradas stale e devem ser priorizadas para revisão.
Tool MCP search_stale_references
{
"tool": "search_stale_references",
"args": {
"olderThanDays": 30,
"module": "HUB",
"limit": 50
}
}Critério de stale (OR):
verifyByDate < now— vencida.verifyByDate == null AND updatedAt < (now - olderThanDays dias)— sem prazo definido e parada há tempos.
Filtros opcionais:
module—RefModule.olderThanDays— 1 a 365, default 30.limit— 1 a 100, default 50.
Ordenação: criticality ASC (críticas primeiro), depois verifyByDate ASC (mais vencidas primeiro).
Response inclui campos derivados úteis para triagem:
{
"result": {
"staleRefs": [
{
"id": "...",
"slug": "...",
"title": "...",
"module": "HUB",
"criticality": "CRITICAL",
"lastVerified": "2026-02-10T...",
"verifyByDate": "2026-03-12T...",
"accessCount": 47,
"lastAccessedAt": "2026-05-25T...",
"updatedAt": "2026-02-10T...",
"daysSinceUpdate": 108,
"daysSinceVerify": 108
}
],
"total": 1
}
}Workflow recomendado de triagem
Rodar search_stale_references filtrando por module e criticality=CRITICAL periodicamente (semanal para CRITICAL, mensal para WARNING).
Para cada ref retornada: ler conteúdo via get_reference, comparar com estado atual do sistema.
Se conteúdo ainda válido: chamar verify_reference para resetar o ciclo de 30 dias.
Se mudou: chamar update_reference — re-enfileira embedding e atualiza verifyByDate automaticamente.
Se obsoleta: chamar delete_reference (requer scope admin:kb:write e role admin no endpoint REST equivalente).