alyah@decisionpath: ~/docs — zsh
context graph · alpha v0.3
$ cat README.md

DecisionPath

> Every decision leaves a trace. Make it searchable.

Um framework de Context Graph para capturar, traçar e reutilizar o conhecimento de decisões tomadas por humanos, agentes de IA e sistemas híbridos — transformando raciocínio efêmero em precedente estruturado. Se o OpenTelemetry padronizou a captura de execução e o Git a captura de mudanças de código, o DecisionPath padroniza a captura de decisões.

decisionpath — query
alyah@prod:~/decisionpath (main)$ dpath query --context "cliente solicitou reembolso" --mode hybrid
Buscando traces no Context Graph... (modo: semantic + structural + temporal)
847 candidatos analisados em 143ms
3 decision packets retornados (2 humanos, 1 agente)
PATH-001 score: 0.94 [humano] base: human
├─ contexto: "reembolso por produto com defeito"
├─ decisão: aprovar → crédito imediato
├─ política: RefundPolicy v2.1
└─ resultado: NPS +12, retenção 98%
PATH-002 score: 0.87 [agente] base: agent
├─ contexto: "reembolso após prazo de garantia"
├─ decisão: negar → oferecer desconto 30%
├─ precedente: CITES PATH-0a7f
└─ resultado: NPS +3, retenção 74%
PATH-003 score: 0.81 [híbrido] base: hybrid
├─ contexto: "reembolso recorrente mesmo cliente"
├─ decisão: escalar → análise antifraude
├─ override: humano sobrescreveu agente
└─ resultado: fraude detectada, saving R$12.4k
Recomendação: Seguir PATH-001 (maior score + melhor outcome)

O raciocínio que conecta dados
a ações nunca foi tratado como dado.

CRMs, ERPs e bancos de dados armazenam estado: o negócio foi fechado, o ticket foi escalado. Eles não armazenam por que aquele estado foi alcançado. A lógica de exceção vive em cabeças humanas, conversas de Slack e reuniões de aprovação. Quando um agente de IA precisa decidir, ele começa do zero.

P1 sem-rastro

Decisões sem rastro

Decisões humanas morrem em Slack, e-mails e cabeças — sem estrutura persistente. O melhor atendente se aposenta e leva 15 anos de intuição. Agentes não têm precedente e humanos repetem os mesmos erros.

P2 logs ≠ decisão

Logs técnicos, não raciocínio

Decisões de agentes são capturadas como logs de execução — latência, tokens, custo — não como raciocínio semântico. Soluções como LangSmith e Langfuse capturam o que o agente fez, não por que ele decidiu.

P3 híbrido

Fluxos sem modelo unificado

Decisões híbridas (humano + agente) não têm um modelo que atribua responsabilidade. Quem propôs? Quem aprovou? Quem sobrescreveu? Sem essa cadeia, conformidade e auditoria são impossíveis.

  ┌─────────────────────────────────────────────────────────────────────┐
  │  every decision is a path. every path is knowledge.                 │
  │  every decision leaves a trace. make it searchable.                 │
  └─────────────────────────────────────────────────────────────────────┘

Captura → Grafo → Busca → Decisão

DecisionPath modela cada decisão como um nó em um Context Graph — um grafo direcionado acíclico (DAG) conectando problema, atores, raciocínio, alternativas, políticas e outcome. O schema é agnóstico a domínio, framework e tipo de decisor.

01

Captura do Decision Trace

Cada decisão — humana, de agente ou híbrida — é interceptada no exato momento em que é tomada (commit-time capture). O trace contém problema, opção escolhida, alternativas consideradas, políticas aplicadas, precedentes citados e metadados temporais. Três modos de ingestão: stream via SDK/OTel, batch retroativo (CSV, JSON Lines, OTLP) e captura humana (formulário, voice-to-trace, extração de Slack).

02

Enriquecimento & Context Graph

O LLM Enricher extrai entidades, políticas e alternativas do texto livre. Dois embeddings são gerados: Reasoning Embedding (similaridade semântica via HNSW) e FastRP Embedding (similaridade topológica no grafo). PII é detectado e anonimizado antes da persistência. O trace é persistido como nós e arestas no Context Graph (Neo4j).

03

Busca Híbrida em 4 modos

Busca semântica encontra raciocínios similares via vector search. Busca estrutural navega a cadeia causal no grafo (quem decidiu, o que causou). Busca híbrida combina vector + graph traversal + re-ranking por FastRP. Busca temporal detecta padrões, regressões e anomalias ao longo do tempo. P95 < 300ms para top_k=10.

04

Decision Packet & Serving

O resultado é um Decision Packet padronizado: decisão, contexto completo, evidence path, proveniência e score. Servido via REST API, SDK Python/TypeScript, CLI ou MCP Server para agentes. O agente recebe precedentes reais e toma decisões fundamentadas em conhecimento acumulado — não em adivinhação.

Interface para humanos e agentes

API unificada para registrar decisões e consultar caminhos. Compatível com LangGraph, Agno, AutoGen, OpenAI SDK e CrewAI. Funciona via SDK, CLI ou MCP Server.

trace.py
query.py
mcp_server.py
search_api.sh
1from decisionpath import Client, DecisionTrace
2
3client = Client(tenant="acme-corp", knowledge_base="hybrid")
4
5trace = DecisionTrace(
6 problem="cliente pediu cancelamento de assinatura premium",
7 actor_type="hybrid",
8 proposed_by="agent:retention-v3",
9 approved_by="human:gerente-cx",
10 decision="aprovar parcial — desconto 25%",
11 alternatives=["negar", "upgrade de plano", "desconto 15%"],
12 rationale="cliente com LTV alto, política ChurnPrevention v3.2",
13 confidence=0.91,
14 outcome={"nps": 9, "retained": True, "renewal_months": 12},
15)
16
17client.record(trace)
18# ✓ Trace PATH-4f2a registrado no Context Graph (143ms)
1# Buscar decisões similares para informar um agente
2packets = client.search(
3 query="cliente churn pedindo desconto acima do limite",
4 mode="hybrid", # semantic + structural + temporal
5 knowledge_base=["human", "hybrid"],
6 top_k=5,
7 filters={
8 "outcome.retained": True,
9 "domain_tags": ["customer_service"],
10 },
11 include_evidence_path=True,
12)
13
14for p in packets.results:
15 print(f"{p.decision_id} score:{p.similarity_score:.2f} {p.chosen_option}")
16
17# PATH-4f2a score:0.94 → aprovar parcial — desconto 25%
18# PATH-8b1c score:0.88 → oferecer upgrade de plano
19# PATH-2e9d score:0.71 → reter com desconto 15%
20# meta: 847 candidates | 143ms | mode: hybrid
1# Expor DecisionPath como MCP Server para agentes
2from decisionpath.mcp import DecisionPathServer
3
4server = DecisionPathServer(
5 name="decisionpath",
6 tenant="acme-corp",
7 tools=[
8 "search_precedents", # buscar decisões similares para um problema
9 "record_decision", # persistir decisão com contexto completo
10 "get_causal_chain", # cadeia causal de uma decisão
11 "get_applicable_policies",# políticas para um contexto
12 "find_similar_outcomes", # outcomes similares por entidade
13 ],
14)
15
16server.serve(transport="stdio")
17# MCP Server rodando — pronto para LangGraph, Agno, Claude, etc.
1# Search API — busca híbrida via REST
2curl -X POST https://api.decisionpath.dev/v1/search \
3 -H "Authorization: Bearer $DPATH_TOKEN" \
4 -d '{
5 "query": "cliente churn pedindo desconto acima do limite",
6 "mode": "hybrid",
7 "knowledge_base": ["human", "hybrid"],
8 "tenant_id": "acme-corp",
9 "filters": {
10 "domain_tags": ["customer_service"],
11 "outcome_quality": "positive"
12 },
13 "top_k": 5,
14 "include_evidence_path": true
15 }'

Quatro camadas, um grafo.
Agnóstico por design.

Agnóstico a domínio, framework de agentes e tipo de decisor. Ontologia emergente: o schema não é definido upfront, mas aprendido a partir dos próprios traces acumulados.

Captura

Stream, Batch & Human Capture

Stream Collector (OTel/SDK) para agentes em tempo real. Batch Importer para bases legadas (CSV, JSON Lines, OTLP, JDBC). Human Capture Interface para decisões humanas via formulário, voice-to-trace e extração inferida de Slack/email.

OTel Adapter Path SDK Kafka Slack Bot Voice STT
Processamento

Normalizer, Enricher & Embedder

Normalização para schema canônico. LLM Enricher extrai entidades, políticas e alternativas. Embedding Pipeline gera Reasoning Embedding (semântico) e FastRP Embedding (estrutural). PII Redactor anonimiza dados sensíveis antes da persistência.

LLM Enricher HNSW FastRP PII Redactor
Persistência

Context Graph, Vectors & Object Store

Neo4j como Context Graph Store (nós, arestas, propriedades). Vector Index HNSW para embeddings semânticos e estruturais. Redis para cache de sessões ativas. S3/MinIO para payloads brutos e PII criptografado. ClickHouse opcional para analytics.

Neo4j HNSW Index Redis S3 / MinIO ClickHouse
Serving

Query API, Search, MCP Server & GraphRAG

Search API com 4 modos (semântica, estrutural, híbrida, temporal). MCP Server expõe 5 tools para agentes. GraphRAG Interface para RAG com proveniência explicável. SDK Python/TypeScript e CLI para integração direta.

REST API MCP Server GraphRAG SDK CLI

Construído para escala,
explicabilidade e compliance

24 features planejadas em 4 fases. Cada componente projetado para produção com milhões de traces, busca sub-segundo e rastreabilidade completa. LGPD/GDPR by design.

core

Context Graph

Grafo de 12 tipos de nós universais (Problem, Actor, Decision, Alternative, Policy, Outcome, Entity...) com 13 tipos de arestas. Traces imutáveis — correções criam nós com aresta SUPERSEDES, preservando histórico completo.

search

Busca Híbrida em 4 modos

Semântica (HNSW k-NN), estrutural (Cypher traversal), híbrida (vector + graph + re-ranking FastRP) e temporal (padrões e anomalias). Decision Packets com evidence path e proveniência. P95 < 300ms.

interface

MCP Server

5 tools via protocolo MCP: search_precedents, record_decision, get_causal_chain, get_applicable_policies e find_similar_outcomes. Qualquer agente LangGraph, Agno ou Claude consome no momento da decisão.

multi-tenant

Isolamento & LGPD

Namespace isolado por tenant com ACL no Neo4j. Buscas cross-tenant proibidas por padrão. PII Redactor obrigatório (CPF, CNPJ, nome, email). Payload original criptografado AES-256 com ACL restrita. Direito ao esquecimento built-in.

knowledge bases

3 Bases de Conhecimento

Humana (formulários, voice, Slack/email), de agentes (SDK, OTel spans, chain-of-thought) e híbrida (propõe → aprova → executa). Modelo de responsabilidade: proposed_by, approved_by, override. Co-existem no mesmo grafo.

learning

Feedback Loop & Overrides

Outcomes retroalimentam scores de confiança. Override Tracker registra quando humanos sobrescrevem agentes. Precedent Linker detecta automaticamente decisões similares. Pattern Alerts notificam loops e override rates anômalos.

Quem gera traces.
Quem consome o grafo.

DecisionPath é uma ponte entre quem decide e quem precisa entender a decisão. Seis tipos de atores interagem com o grafo — como fontes e como consumidores.

fonte + consumidor

Agente de IA

Emite spans via SDK durante execução. Busca precedentes antes de decidir. Recebe Decision Packets via MCP Server.

fonte

Humano Decisor

Captura decisões via formulário, voice-to-trace ou extração de Slack/email. O conhecimento tácito vira precedente durável.

consumidor

Auditor / Compliance

Consulta cadeia causal completa. Rastreia quem decidiu, quando, por quê e qual resultado. Export em formatos regulatórios.

consumidor

Engenheiro de IA

Debugging de comportamentos de agentes. Decision Replay reproduz o contexto original. Compara alternativas e valida resultados.

De atendimento a compliance.
Agnóstico a domínio.

O schema define primitivos universais (Problem, Actor, Decision, Policy, Outcome). O significado semântico é propriedade livre, não imposta pelo framework. Adapta-se a qualquer domínio onde decisões importam.

$
dpath search --domain atendimento --mode hybrid
Agentes consultam precedentes de retenção antes de resolver tickets de churn
$
dpath search --domain juridico --base human
Pareceres jurídicos com base em precedentes de decisões humanas anteriores
$
dpath search --domain credito --filters outcome.approved
Análise de crédito informada por outcomes de aprovações passadas & políticas aplicadas
$
dpath audit --domain compliance --chain full
Cadeia causal completa: quem propôs, quem aprovou, quem sobrescreveu, qual resultado
$
dpath search --domain medico --mode temporal
Protocolos clínicos baseados em outcomes de casos similares ao longo do tempo
$
dpath search --domain vendas --base hybrid
Negociações informadas por precedentes de desconto com outcomes positivos

Every decision leaves a trace.
Make it searchable.

$ pip install decisionpath