Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Synapse: Roadmap

Como ler este documento. Cada linha é um ticket SYN-N que vai virar issue no GitHub. Tickets são agrupados por fase de release (v0.1 → v1.0), com tamanho estimado, camada arquitetural afetada e dependências explícitas. Sem datas: o roadmap é por marcos, não por calendário.

Fontes deste roadmap. Derivado de:


Convenções

ColunaValores
IDSYN-N, sequencial, imutável
Layercli, core, store, index, mcp, i18n, config, ci, release, docs
SizeXS (≤ 1h), S (≤ ½ dia), M (1 dia), L (≥ 2 dias)
Statustodo, wip, done, blocked, cut
DependsOnIDs que precisam estar done antes

Status (2026-05-26):

  • v0.1 Foundation: 53/53 done. Tag v0.1.0 em 2026-05-24.
  • v0.2 Daily polish: 24/24 done. Tag v0.2.0 em 2026-05-25.
  • v0.3 Auditable AI Second Brain: 18/18 done. Tag v0.3.0 em 2026-05-25.
  • v0.4 Refinement & extensibility: 18/18 done (12 core + 6 stretch); milestone GitHub #6 fechado em 2026-05-26. Tag v0.4.0 pendente: Cargo.toml ainda em 0.3.0, release roda via cargo release. Brief em docs/researchs/2026-05-25-v0.4-refinement-and-extensibility.md. Tema “finish what we started, open the doors”.
  • v0.5 Semantic layer & second-brain enrichment: wip 2026-06-02. Brief em docs/researchs/2026-06-02-v0.5-semantic-layer-and-second-brain.md; BR-13 nova; 23 issues (11 originais SYN-80..89 + SYN-93b retituladas; 4 arch-debt SYN-151..154; 8 novas SYN-160..164 core + SYN-165..166 stretch + SYN-167..168 adoption). Janela: até 6 semanas. Tema: “make the graph think like the engineer”.
  • v1.0 Hardening: provable non-corruption: SHIPPED. Tag v1.0.0 em 2026-06-21 (SYN-262..270 + pre-release /improve plans 001–011 / SYN-272..282). Milestone #15 fechado.
  • v1.1.0: adoption & distribution + reproducible bench: wip (milestone #16). Novas: SYN-287 (syn undo, ADR-039) done + SYN-288 (syn mcp install) done + SYN-289 (synapse-check Action) done + SYN-290 (bench charts, ADR-040) done + SYN-291 (docs currency) done + SYN-292 (syn undo Phase 2). Carrega o backlog repositionado da v1.0 Stable: SYN-101..109 (installer/Homebrew/npm/semver-schema/reverse-migrations/freeze-MCP/MIGRATING/sign-releases/docs-site) + SYN-215 (mascote).

Numeração de IDs (gaps intencionais)

Cada fase tem uma faixa numérica reservada, com folga, para permitir inserir tickets novos sem renumerar nada:

FaseFaixa em usoSlots livres
v0.1 FoundationSYN-1..SYN-53SYN-54..SYN-59
v0.2 Daily polishSYN-60..SYN-79 + SYN-90..SYN-93 (manifest + freshness) + SYN-99 (uninstall)-
v0.3 Auditable AI Second BrainSYN-110..SYN-129 (ingestors SYN-119/120 vagos, deferidos)SYN-131..SYN-149
v0.4 Refinement & extensibilitySYN-130..SYN-149 + SYN-150 (refactor); cortes: SYN-134, SYN-144, SYN-145SYN-151..SYN-199
v0.5 Semantic layer & second-brainSYN-80..SYN-89 + SYN-93b + SYN-151..SYN-154 (arch-debt do v0.4) + SYN-160..SYN-168 (expansion)-
v0.6 Personal onboarding & autonomySYN-170..SYN-173 (onboarding) + SYN-175..SYN-182, SYN-184, SYN-201 (agent/MCP) + SYN-186..SYN-193, SYN-195 (CLI UX & animação) + SYN-196..SYN-200 (brand & delight) + SYN-203..SYN-213 (pre-release audit)-
v0.7 Governed-autonomy foundationSYN-202 (atomic batch) + SYN-216 (crash-safe accept) + SYN-217 (incremental reindex) + SYN-218 (confidence tiers, ADR-022) + SYN-219 (sampling→Tasks) + SYN-183 (query) + SYN-214 (model sizes)-
v0.8 Frictionless capture & governed autonomySYN-185 (syn agent, movida da v0.7) + SYN-220 (git ambient capture) + SYN-221 (syn capture frictionless) + SYN-222 (syn digest) + SYN-229 (reposition)-
v0.9 Temporal governance & adoptionSHIPPED (v0.9.0, 2026-06-14): SYN-234 (open types) + SYN-239 (audit) + SYN-240 (diff/blame CLI + MCP recent_changes deltas) + SYN-241 (trust) + SYN-224 (decay) + SYN-243/244 (connections) + SYN-247 (receipts) + SYN-226 (search_everything) + SYN-227 (perf) + SYN-228 (import/export) + SYN-223 (valid-time + supersession + belief axis, ADR-031). Milestone #11: 0 open-
v0.10 Governed memory-qualityRe-focused 2026-06-14 (single theme, not graph/scale grab-bag): SYN-242 (contradiction → gate) + SYN-250 (trust-in-ranking) + SYN-252 (proposal contract) + SYN-256 (both-doors parity: recent_changes CLI + diff/blame MCP) + SYN-257 (SYN-234 contract finish: collapse the fork)-
v0.11 Scale & graph (evidence-gated)SHIPPED (v0.11.0, 2026-06-17): SYN-245 (semantic edges) + SYN-248 (decay policy) + SYN-249C (sig posture) + SYN-251 (ingestion) + SYN-254 (identity dedup) + SYN-255 (anchor reranker) + SYN-258 (temporal invariant) + SYN-259 (retrieval) + SYN-260 (hygiene). Milestone #14: 9 closed; backlog-conditional SYN-246/225 deferred-
v1.0 Hardening: provable non-corruption (milestone #15)Headline syn verify: prove the AI memory was not silently corrupted: reproducible, auditable, testable, offline. Breakdown of SYN-253: SYN-262 (verify engine + canonical dump) → SYN-263 (syn verify + signed report, both doors) → SYN-264 (CLI≡MCP parity) → SYN-265 (invariant proptest) → SYN-266 (replay) → SYN-267 (supersession/temporal proptest) → SYN-268 (fuzz) → SYN-269 (--rebuild attestation) → SYN-270 (witness checkpoint + --since). Study: researchs/2026-06-16. Discipline: borrow the invariant, refuse the engineSYN-261 (sig-verify) → Commercial
Commercial optionality (exploratory)SYN-230 (E2EE sync) + SYN-231 (team) + SYN-232 (open-core) + SYN-233 (verifiable identity) + SYN-235 (HTTP/SSE gateway)-
v2.0 Beyond stableSYN-194 (async enrichment: revisitar) + SYN-174 (Intel macOS: demand-gated) + SYN-283..286 (contradiction invariant, enrichment backfill, multi-user seam, HNSW gate)-
v1.1.0: adoption & distribution (milestone #16)SHIPPED: SYN-287 (syn undo, ADR-039) + SYN-288 (syn mcp install) + SYN-289 (synapse-check Action) + SYN-290 (reproducible bench + SVG charts, ADR-040) + SYN-291 (docs currency). Backlog (repositioned from v1.0 Stable): SYN-101 installer + SYN-102 Homebrew + SYN-103 npm + SYN-104 semver-schema + SYN-105 reverse migrations + SYN-106 freeze MCP surface + SYN-107 MIGRATING.md (done) + SYN-108 sign releases + SYN-109 docs site + SYN-215 mascot. Follow-up: SYN-292 (syn undo Phase 2)SYN-261 (sig-verify) → Commercial
BacklogSYN-236 (higiene de numeração) + SYN-238 (pt→en issues) + SYN-250+-

Demanda nova entra no próximo slot livre da fase correta, não vira SYN-1.5 nem força reordenação retroativa.


Fase v0.1: Foundation

Meta: workspace utilizável solo via CLI, com cinco tipos de entidade, busca FTS5 e um único leitor MCP. Base que prova que o modelo funciona.

Critério de aceite global da fase:

  • syn init → syn project add → syn person link → syn search encadeáveis em terminal real.
  • Reabrir o workspace dias depois e a busca encontra o que foi gravado.
  • Claude Code consegue, via MCP, responder “quem é ponto-focal do projeto X” com fatos do workspace.

Núcleo & dispatch

IDLayerSizeTitleDependsOnSource
SYN-1core/cliMAppDeps + Dispatch trait, eliminando god-match em commands/mod.rs-03-critique §4.1 §4.2
SYN-2storeMWorkspace::find (sobe diretórios procurando .synapse/)SYN-102-arch §commands
SYN-3storeLWorkspace::tx atômico: temp + rename + transação SQLiteSYN-203-critique §4.5
SYN-4coreScore::CreateProject use case (sem I/O direto)SYN-303-critique §4.4
SYN-5coreScore::Slugify + validação de slug-01-schema §convenções

Schema, índice e migrations

IDLayerSizeTitleDependsOnSource
SYN-6indexMDDL inicial: entities, tags, links, FTS5: com PK composta (type,id)SYN-303-critique §3.5
SYN-7indexXSToda conexão executa PRAGMA foreign_keys = ONSYN-603-critique §3.1
SYN-8indexSFK explícitas em links (CASCADE) e tasks.projectSYN-703-critique §3.1
SYN-9indexMMigration runner (versionado, idempotente)SYN-602-arch §index
SYN-10indexSColunas explícitas para campos quentes: status, owner, priority, dueSYN-603-critique §3.6
SYN-11indexMsyn reindex: varredura idempotenteSYN-9 SYN-1001-schema §reindex

Frontmatter & parsing

IDLayerSizeTitleDependsOnSource
SYN-12storeMParser/serialize de frontmatter (gray_matter + serde_yaml_ng)-03-critique §5 / ADR-004
SYN-13storeSRound-trip preserva ordem dos campos no YAML (UX de diff)SYN-1202-arch §store
SYN-14storeSValidação de schema por type (campos obrigatórios)SYN-1201-schema

Tipos de entidade: CLI

IDLayerSizeTitleDependsOnSource
SYN-15cli/coreMsyn project add|list|show|rm|renameSYN-4 SYN-11README
SYN-16cli/coreMsyn person add|list|show|rm|renameSYN-15README
SYN-17cli/coreMsyn person link (cria membership N:N project ↔ person)SYN-1601-schema §person
SYN-18cli/coreMmemberships em vez de roles (renomeação semântica)SYN-1703-critique §3.3
SYN-19cli/coreMsyn entity add|list|show|rmSYN-1501-schema §entity
SYN-20cli/coreMsyn api add|list|show|rmSYN-1501-schema §api
SYN-21cli/coreMsyn task add|list|show|rm|done (id sequencial)SYN-1501-schema §task
SYN-22cli/coreMNovo tipo note (decision | runbook | meeting | snippet | reference)SYN-1503-critique §3.2
SYN-23cli/coreSsyn tag list|rename|merge (operações globais sobre tags)SYN-1102-arch §commands

Busca

IDLayerSizeTitleDependsOnSource
SYN-24core/indexMcore::Search: FTS5 + filtros --type --tag --ownerSYN-1101-schema §FTS5
SYN-25cliSsyn search <query> com formatação text/jsonSYN-24README
SYN-26core/indexMcore::Graph::neighbors: base p/ “quem depende de X”SYN-1101-schema §links
SYN-27cliSsyn graph project <slug> (quem aponta, quem é apontado)SYN-2602-arch §commands

Saúde & meta

IDLayerSizeTitleDependsOnSource
SYN-28cli/indexMsyn doctor: referências quebradas, slugs órfãos, frontmatter inválidoSYN-1101-schema §reindex
SYN-29cliXSsyn info: resumo do workspace, contagem por typeSYN-1102-arch §commands
SYN-30configMCascade config (system → global → workspace → runtime) com etcetera-02-arch §config
SYN-31cliSsyn setup (interativo: locale, editor padrão)SYN-3002-arch §setup
SYN-32cliSsyn init [PATH] cria .synapse/ e estrutura baseSYN-3002-arch §init

Erros & saída

IDLayerSizeTitleDependsOnSource
SYN-33coreSError::fluent_key() separado de Display (i18n sem perder log)-03-critique §4.3
SYN-34cliSoutput::render text/json centralizado-02-arch §output
SYN-35cliXSCódigos de saída padronizados (1 user error, 2 bug, 64+ reservados)SYN-3402-arch §main

Internacionalização

IDLayerSizeTitleDependsOnSource
SYN-36i18nMLoader i18n-embed + Fluent, com detecção via sys-locale-02-arch §i18n
SYN-37i18nS--lang (CLI) e SYNAPSE_LANG (env)SYN-3602-arch §i18n
SYN-38i18nMCobertura completa pt-BR e en para todas as mensagens v0.1SYN-3602-arch §i18n

MCP (leitura)

IDLayerSizeTitleDependsOnSource
SYN-39mcpMServidor rmcp 1.7 sobre stdio, feature-gatedSYN-24ADR-002
SYN-40mcpSTool search_knowledge (mesma função que syn search)SYN-3903-critique §4.4
SYN-41mcpSTool get_entity (project / person / api / task / note)SYN-3902-arch §mcp
SYN-42mcpSTool list_by_type com filtrosSYN-3902-arch §mcp
SYN-43mcpSTool project_graph (vizinhança)SYN-2602-arch §mcp
SYN-44mcpSLazy init de tokio só quando syn mcp é chamadoSYN-3903-critique §4.6

CI / qualidade / build

IDLayerSizeTitleDependsOnSource
SYN-45ciSWorkflow ci.yml (fmt, clippy, nextest matrix, deny, shear, MSRV)-feito em SYN-0: validar
SYN-46ciSWorkflow commit-lint.yml valida PRs-feito em SYN-0: validar
SYN-47ciXSJob cargo doc -D warnings no CISYN-4503-critique §7
SYN-48buildXSbuild.rs com vergen-gix (versão + git hash + rustc)-feito em SYN-0: validar
SYN-49coreXS#![warn(missing_docs)] + intra-doc links no lib.rs-feito em SYN-0: validar

Testes

IDLayerSizeTitleDependsOnSource
SYN-50testsSFixtures de workspace mínimo + assert_cmd round-tripSYN-3202-arch §testes
SYN-51testsSSnapshots insta para saída text/jsonSYN-2502-arch §testes
SYN-52testsMProperty tests proptest para slugSYN-502-arch §testes
SYN-53testsMTeste de transação Workspace::tx (falha em índice → rollback do FS)SYN-303-critique §4.5

Fase v0.2: Daily polish

Meta: experiência sem fricção no dia-a-dia. Completions, watcher, export, MCP que escreve.

IDLayerSizeTitleDependsOnSource
SYN-60mcpMTool capture_fact: IA propõe gravação; CLI confirmaSYN-3903-critique §2.2
SYN-61mcpMTool link_entity (cria vínculo project↔person, etc.) com confirmaçãoSYN-6003-critique §2.2
SYN-62mcpSTool update_status (task done, project pausado)SYN-60README v0.2
SYN-63cliSCompletions bash/zsh/fish/elvish/powershell via clap_completeSYN-45README v0.2
SYN-64cliSMan page man syn via clap_mangenSYN-63README v0.2
SYN-65cliMWatcher mode (syn watch) com notify 8: reindex em mudançaSYN-11README v0.2
SYN-66cliMsyn export --format=html (browser-friendly do workspace)SYN-24README v0.2
SYN-67cliSsyn export --format=json (single-file)SYN-24README v0.2
SYN-68core/indexMIndexar last_modified_commit (sem implementar --at ainda)SYN-1103-critique §3.4
SYN-69cliSsyn config get|set|unset no nível workspaceSYN-3002-arch §commands
SYN-70cliSsyn open <slug> abre o arquivo no $EDITORSYN-32UX comum
SYN-71cliSsyn rm confirma com prompt; --force para scriptSYN-1502-arch §commands
SYN-72docsMTutorial passo-a-passo (docs/tutorial.md)v0.2 fimUX adoção
SYN-73docsMReceitas (docs/recipes.md): casos de uso comunsv0.2 fimUX adoção

Workspace federation (ADR-010)

Solução para o “e se o usuário toca múltiplos projetos com equipes separadas”. Registry leve em SQLite global (metadata only, jamais conteúdo). Privacy gate opt-in. Detalhes completos em ADR-010.

IDLayerSizeTitleDependsOnSource
SYN-74cliSsyn uninstall (binary + --purge config + --everything registry; nunca toca workspaces)-UX gap apontado pelo usuário
SYN-75store/indexMWorkspace registry: workspaces.db global + auto-register no syn init + git remote auto-detect + refresh last_seen-ADR-010 §F1
SYN-76cliSsyn ws list|show|forget|gc|include|excludeSYN-75ADR-010 §F1
SYN-77core/cliM--all em search/info/graph: federated read sobre workspaces opt-inSYN-75 SYN-76 SYN-79ADR-010 §F2
SYN-78mcpMMCP tools: list_workspaces, federated_search, get_entity_from(ws, type, id)SYN-77ADR-010 §F3
SYN-79store/cliSPrivacy gate: federated=0 default, opt-in explícito, BR-12.4SYN-75ADR-010 (privacy)
SYN-90store/coreMSYNAPSE.md identity card spec + I/O + bootstrap no syn init (BR-1.5)SYN-75ADR-010 §F7
SYN-91cliSsyn ws edit|refresh|topic add|tag add (curadoria do manifest)SYN-90ADR-010 §F7
SYN-92mcpMMCP tools get_workspace_manifest, add_workspace_topic, add_workspace_tag (fila de aprovação)SYN-90 SYN-60ADR-010 §F7
SYN-93store/cli/mcpLWorkspace freshness: git ls-remote async + advisory em CLI/MCP (BR-12.5)SYN-75ADR-011

Fase v0.3: Auditable AI Second Brain

Meta: virar a aplicação em “AI-Act-grade local-first second brain” antes da janela de enforcement da EU AI Act Article 50 (2026-08-02). Provenance + audit + reprodução + MCP-nativo expandido + protótipo de identidade portátil. Brief completo em docs/researchs/2026-05-25-v0.3-multi-context-developer.md.

IDLayerSizeTitleDependsOnSource
SYN-110core/indexMaudit.ndjson schema + atomic appender + rotação (90d default)-research §5 #1
SYN-111coreSFrontmatter stamps x-ai-* em propostas aceitasSYN-110bet 2
SYN-112cliSsyn audit show|list|pruneSYN-110research §5 #1
SYN-113core/cliMsyn audit replay <id> contra context snapshotSYN-114bet 5
SYN-114core/indexSColuna pending.context_snapshot + payloadSYN-110bet 5
SYN-115mcpMMCP Resources (workspace/manifest, entity/{id}, audit/recent)-research §2.2
SYN-116mcpMMCP Prompts (capture-decision, daily-review, weekly-brief)-research §2.2
SYN-117mcpS.synapse/server-card.json + capability disclosure schema-bet 4
SYN-118mcpMMCP Tasks extension em reindex (feature-gated)-research §2.2
SYN-121core/cliSsyn timeline <slug> (git log filtrado por path da entity)SYN-68research §5 #3
SYN-122core/cliMsyn at <ref> -- <subquery> (subset: search + show)SYN-68 SYN-121research §5 #3
SYN-123core/cliMsyn audit stale --over <window> (ranking cross-workspace)SYN-77bet 3
SYN-124cliSsyn capture (stdin → pending capture_fact)SYN-60research §5 #6
SYN-125core/cliLme.synapse bundle: syn identity export|import|inspect (prototype, ed25519 opcional)SYN-90bet 1
SYN-126docsMADR-012: provenance frontmatter conventionSYN-111governança
SYN-127docsMADR-013: audit.ndjson format + retention policySYN-110governança
SYN-128docsMADR-014: portable identity bundle (me.synapse)SYN-125governança
SYN-129docsMdocs/AUDITABILITY.md + docs/PROVENANCE.md (user-facing)SYN-111 SYN-112UX adoção

Cortes assumidos (registrados no brief, §9):

  • Ingestors GitHub / Linear (eram SYN-119 e SYN-120): adiados para pós-v0.5 por conflito com a invariante local-first.
  • syn agent (autonomous loop com batch approval): movido para v0.6 (owner decision 2026-05-25; registrado no §Cortes da fase v0.4).
  • syn-lsp (completions LSP em editores): entregue na v0.4 (SYN-130, ADR-018).
  • TUI / fuzzy pick / share entity granular: backlog.

Fase v0.4: Refinement & extensibility

Meta: fechar dívidas explícitas da v0.3 (audit replay, identity crypto, MCP Tasks placeholder, time-travel parcial, redaction parcial) e abrir extensibility (LSP companion, mcp/server.rs split per ADR-015). Tema “finish what we started, open the doors”. Brief completo em docs/researchs/2026-05-25-v0.4-refinement-and-extensibility.md.

Core (must land)

IDLayerSizeTitleDependsOnSource
SYN-150mcpLRefatorar mcp/server.rs em submódulos focados (tools/{read,federation,write}, resources, prompts, freshness, helpers); surface MCP byte-stable. LANDS FIRST.-ADR-015
SYN-130cli/lspLsyn-lsp companion: completions de slug/type/tag em qualquer editor LSP (Cursor/VSCode/Helix/Neovim/Zed)SYN-115brief bet: adoption
SYN-131core/cliLsyn identity keygen + ed25519 obrigatório + revocation listSYN-125ADR-014 deferred
SYN-132core/cliMsyn experience add + skills auto-derive from tag frequencySYN-125ADR-014 §Future direction
SYN-133core/cliMsyn cv export Markdown deterministic from bundle + workspaceSYN-132brief disruptive: curriculum surface
SYN-135core/cliMsyn audit verify: re-hash pending payloads vs audit.payload_sha256SYN-110ADR-013 implicit gap
SYN-136core/cli/mcpLsyn audit replay --execute: real model rerun via MCP clientSYN-113brief bet 5 closure
SYN-138mcpMMCP Tasks real (reindex + federated_search progress)SYN-118SYN-118 placeholder closure
SYN-141core/cliMsyn at <ref> -- graph|list|info subcommandsSYN-122SYN-122 surface completion
SYN-147docsMADR-016: portable identity v2 (crypto + revocation)SYN-131governance
SYN-148docsMADR-017: curriculum schemaSYN-132 SYN-133governance
SYN-149docsMdocs/IDENTITY.md user-facing (bundle + curriculum)SYN-131 SYN-133UX adoption

Stretch (lands if window allows; otherwise rolls to v0.5)

IDLayerSizeTitleDependsOnSource
SYN-137coreMx-ai-history chain on entity re-mutationsSYN-111ADR-012 §Open question
SYN-139mcpMMCP resources pagination via cursorSYN-115SYN-115 documented limit
SYN-140mcp/coreMTag-level federation redaction (SearchHit carries tags)SYN-117brief bet 4 closure
SYN-142core/cliLFull as-of FTS index reconstruction (sandbox)SYN-122SYN-122 documented limit
SYN-143core/cliMsyn ws clone <git-url> lifecycle starter-brief §2.5 partial
SYN-146core/cliMsyn doctor --lint-provenanceSYN-111brief §2.1 audit

Cortes assumidos (registrados no brief, §9)

  • syn agent autonomous loop: movido para v0.6 (owner decision 2026-05-25).
  • syn cv export --as pdf: adiado para v0.5 (Markdown sai em SYN-133).
  • syn ws fork, syn ws archive: adiados; lifecycle v0.4 só clone.
  • Sigstore transparency log, cross-bundle merge, HTTP discovery: v0.5+.

Fase v0.5: Semantic layer & second-brain enrichment

Meta: Synapse vira active knowledge graph que processa dados na hora da inserção (BR-13). Busca semântica via embeddings + entity linking via NER pequeno + ranking híbrido RRF. Originalmente atrás de --features vector (off-by-default); promovido a default na própria v0.5 via SYN-168 (opt-out: default = ["mcp", "v05_backends"]), com os ~920 MB de modelos baixados só por consentimento. Brief completo em docs/researchs/2026-06-02-v0.5-semantic-layer-and-second-brain.md. Decisões fechadas em 2026-06-02: BGE-M3 multilingual default, GLiNER core, budget de escrita 500 ms mediana, language per-workspace.

Arquitetura: débito do v0.4 (lands primeiro)

IDLayerSizeTitleDependsOnSource
SYN-151mcpMrefactor mcp/server.rs para dispatcher pattern (thin #[tool] shims + lógica em core::mcp::*); arquivo volta abaixo de 500 linhas e fica lá-v0.4 closure §2.1
SYN-152cliSsplit cli/at.rs (620 linhas, yellow tier) em cli/at/{mod,search,show,list,info,graph}.rs-ADR-015
SYN-153cliSsplit cli/audit.rs (611 linhas, yellow tier) em cli/audit/{listing,verify,replay,stale,prune}.rs-ADR-015
SYN-154ciXSCI lint rejeitando src/** acima de 800 linhas (red), warning em 600 (yellow): ADR-015 enforcement-ADR-015 §Playbook

Core: camada semântica

IDLayerSizeTitleDependsOnSource
SYN-89docsMADR-008: embedding backend escolhido após benchmark spike (default fastembed-rs + BGE-M3 multilingual quantised; opt-down BGE-small-EN-v1.5-Q por workspace)-governança
SYN-80index/buildMFeature vector em Cargo.toml + migration separada migrations_vec/*.sql-03-critique §3.7
SYN-81indexLIntegração sqlite-vec (bundled+vtab+load_extension + tabela entities_vec + gotchas documentadas em ADR-008)SYN-80brief §2.2
SYN-82coreMtrait EmbeddingBackend + trait NerBackend (contracts para o pipeline paralelo)SYN-8003-critique §3.7
SYN-84core/testsSStubs determinísticos para EmbeddingBackend (SipHash fake vector) e NerBackend (regex fake NER)SYN-82testes
SYN-83coreMEmbeddingBackend impls: fastembed-rs (BGE-M3 default, BGE-small-EN-v1.5-Q opt-down per workspace); Ollama configurávelSYN-82 SYN-89brief §2.1
SYN-164coreMNerBackend impl: GLiNER-multi-base-Q default + GLiNER-base-en-Q opt-down per [enrichment] ner_model; tipos NER hard-codedSYN-82 SYN-89brief §2.4
SYN-85cliMsyn embed --all / syn embed <slug> / syn embed --check / syn embed --reset-cacheSYN-81 SYN-83brief §9.2
SYN-160coreLPipeline de enriquecimento core::enrichment::run_on_write invocado por cada write helper; embedding + NER em threads paralelas dentro da Workspace::tx; honra [enrichment] mode; BR-13 codificadaSYN-83 SYN-164brief §1.2 + §9.2
SYN-161coreMHeuristic entity-linker + NER-span resolver (slug/data/@mention/URL/tag + spans GLiNER → links tipados ou pending proposals link_entity / create_entity_from_ner)SYN-160brief §2.4 + §9.2
SYN-86core/indexLRanking híbrido RRF (k=60) sobre FTS + vector + graph-neighbourhoodSYN-81 SYN-85 SYN-161brief §2.3
SYN-87cliSsyn search default = híbrido; --semantic = vector-only; --no-vector = FTS+graph onlySYN-86brief §2.3
SYN-162core/testsLBench corpus generator (1k/5k/10k entities) + query bank 50q × 3 tiers, variantes pt-BR + en-USSYN-83 SYN-164brief §6.1
SYN-163core/tests/docsMBench runner + results report; CI artefact; thresholds gate (T2 P@5 ≥ 0.85, MRR ≥ 0.55, write median ≤ 500 ms, search median ≤ 150 ms)SYN-162brief §6.3

Adoption inside v0.5

IDLayerSizeTitleDependsOnSource
SYN-167docs/cliSREADME §Editor integration: seção promovendo syn lsp próximo ao topo + link para docs/EDITOR-INTEGRATION.md. Homebrew tap fora do v0.5 (mantém SYN-102 em v1.0); asciinema de syn lsp mapeado para v0.5.1-v0.4 closure §3 + owner decision 2026-06-02
SYN-168core/cli/docsMSemantic layer opt-out: default = ["mcp", "v05_backends"] (fastembed + GLiNER no binário padrão; network_backends/test_backend seguem opt-in). Modelos (~920 MB) baixados só com consentimento: sentinela de readiness por modelo (core::embeddings::readiness), skip gracioso em run_on_write/hybrid/embed --check (zero download implícito), onboarding interativo no syn init. release.yml: --all-features → --features network_backends (não vaza o stub test_backend para produção). i18n en+pt-BR; docs varridas opt-in→opt-outSYN-160 SYN-164 SYN-85owner decision 2026-06-04

Stretch (lands if window allows; otherwise v0.6)

IDLayerSizeTitleDependsOnSource
SYN-165coreMEmbeddingBackend impls para OpenAI + Voyage (network-based, opt-in explícito)SYN-83brief §9.3
SYN-166cli/coreSsyn search --grade para capturar pares query → relevant; foundation para convex combination tuning v0.6SYN-86brief §9.3
SYN-88mcpSMCP tool semantic_search: somente se algum cliente precisar do modo vector-only diretoSYN-86brief §9.3

Track paralelo (independente da semantic stack)

IDLayerSizeTitleDependsOnSource
SYN-93bstore/mcpLWorkspace freshness Phase 2: ls-refs real via gix-protocol (3s timeout, unreachable fallback, walk de commits para behind_count preciso)SYN-93ADR-011 §Phasing

Cortes assumidos v0.5

  • Homebrew tap: fica em v1.0 (SYN-102). Owner decision 2026-06-02.
  • Asciinema demo do syn lsp: mapeado para v0.5.1, não cabe nessa janela.
  • GraphRAG completo com community summaries: 3-5× custo de ingestão; substituído pelo combo heurística + GLiNER no v0.5; reavaliação em v0.6+.
  • Async / background enrichment: registrado como SYN-194 em v0.6 follow-up.
  • syn agent: segue cortado para v0.6 (decisão herdada do v0.4).

Fase v0.6: Personal onboarding & autonomy

Meta: o Synapse passa a saber quem é o usuário. Um onboarding guiado e padronizado captura um perfil-de-identidade canônico (nome, nascimento, profissão, o que faz, empresas) usado para enriquecer toda interação: roteamento de projetos, contexto do MCP, federação, personalização do assistente. Acompanha a autonomia adiada (syn agent) e o enriquecimento assíncrono (SYN-194).

Decisão do owner 2026-06-05. Resolve a lacuna achada na v0.5: a flag self no person (a “pessoa-você” canônica, src/core/identity) existe e é lida por cv export / identity export, mas não há como criá-la, nem CLI, nem onboarding. E o syn setup é opcional, então o idioma/identidade nunca são definidos de forma garantida.

Onboarding obrigatório & identidade própria

IDLayerSizeTitleDependsOnSource
SYN-170cli/coreMSetup compulsório. syn init (e demais comandos de workspace) exigem config global; ausente + TTY ⇒ roda o setup guiado inline antes de prosseguir; non-TTY mantém o fallback silencioso de defaults (CI/pipe nunca bloqueia: invariante dura). Supersede o “setup opcional” da v0.5 (SYN-31)SYN-31 SYN-32owner 2026-06-05
SYN-171cli/coreLOnboarding de identidade guiado. Durante o setup, captura o perfil-self padronizado: nome (obrigatório), data de nascimento (YYYY-MM-DD, opcional/pulável), profissão/headline + um resumo livre “o que você faz”, e (opcional, multi) empresas/empregadores. Persistido como perfil global (no dir de config global), fonte única para semear cada workspaceSYN-170 SYN-131owner 2026-06-05
SYN-172coreMSemear o self person por workspace. No syn init, materializa/atualiza a person canônica (self: true) a partir do perfil global. Empresas → entity (org) opcionais + memberships, para organizar projetos por empregador mais à frente. Garante exatamente-um-self por workspace (invariante que o export já exige)SYN-171 SYN-32owner 2026-06-05
SYN-173core/docsMSchema canônico do self-profile + BR-14 + ADR. Define a forma normativa do frontmatter da pessoa-self (campos, tipos, datas ISO, estrutura de affiliations) para que core, MCP-context, cv export e regras de negócio dependam de uma forma estável e abstraível. ADR para o design captura-global → seed-por-workspace; documenta como o perfil enriquece as interações (assistente sabe nome/papel/empresas ⇒ melhor roteamento e federação)SYN-171 SYN-172owner 2026-06-05

Schema-alvo (rascunho, fechar no SYN-173 / BR-14): frontmatter da person com self: true:

self: true
title: "Rômulo Febasi"            # nome de exibição (obrigatório)
birthdate: "1990-04-12"           # YYYY-MM-DD (opcional)
profession: "Senior Software Engineer"   # headline curto (opcional)
affiliations:                     # empresas/empregadores (opcional, multi)
  - company: "Febasi"             # texto ou slug de uma entity (org)
    role: "Founder / Eng"
    since: "2024-01"              # YYYY-MM
    until: null                   # null = atual
# corpo Markdown = "o que você faz" (resumo livre)

Princípio: um único shape, fácil de interpretar e abstrair, nada de campos ad-hoc por feature. O que não couber aqui vira entidade/relação no grafo (ex.: empresa → entity org + membership), não um campo solto.

Carry-overs já registrados para v0.6

  • SYN-185: syn agent: loop autônomo com batch approval (cortado do v0.4/v0.5; numerado 2026-06-05).
  • SYN-194: async / background enrichment (follow-up do v0.5; cold-start do BGE-M3 fora do budget de escrita síncrono).

Plataforma

IDLayerSizeTitleDependsOnSource
SYN-174build/ciMRestaurar Intel macOS (x86_64-apple-darwin). ort 2.0.0-rc.12 não publica prebuilt do ONNX Runtime para esse target; a v0.5 removeu o alvo do release. Investigar caminho: backend puro-Rust (ort-tract) ou ONNX Runtime from-source no CI. Reavaliar demanda real antes de pagar o custoSYN-83 SYN-164v0.5 release finding 2026-06-05

Integração com agentes (skill / llms.txt)

IDLayerSizeTitleDependsOnSource
SYN-175cliMsyn skill install / syn agents init: emitir/instalar o Agent Skill (SKILL.md, formato agentskills.io) + um llms.txt/LLM.md para o agente do usuário (~/.claude/skills/synapse/ pessoal ou .claude/skills/ no projeto; e/ou AGENTS.md/llms.txt na raiz do workspace). Conteúdo gerado a partir do código (descrições reais das 15 tools MCP + shapes de retorno verificados) para não driftar dos docs. Os artefatos v0.5 já vivem no synapse-releases (skills/synapse/SKILL.md, LLM.md); este ticket os torna instaláveis pelo CLI e os mantém em sincronia com a superfície MCP. Ensinar uso token-eficiente (snippet→get_entity, federada=keyword, propose/accept)SYN-150 (mcp split)owner decision 2026-06-05

Ergonomia de agente / MCP: token-efficiency

Brief: docs/researchs/2026-06-05-mcp-agent-ergonomics-token-efficiency.md. Auditoria do src/mcp/ + src/core/mcp/ contra os princípios da Anthropic (“writing effective tools for agents”, “code execution with MCP”) e o MCP 2026 (structuredContent/outputSchema, ResourceLink). Sketches, promover a issue quando a fase for greenlit.

IDLayerSizeTitleDependsOnSource
SYN-176mcpSBound list_by_type: limit + cursor. É a única read ilimitada (search/federated já capam); viola o princípio de response-constraint da AnthropicSYN-150brief §2.1
SYN-177mcpMstructuredContent + outputSchema + JSON compacto em todas as reads. Hoje json_content devolve JSON pretty-printed como texto (whitespace = tokens desperdiçados; cliente re-parseia texto)SYN-150brief §2.2
SYN-178mcpSResourceLink para synapse://entity/{type}/{id} nos hits de search_knowledge e no get_entity: entidades já são resources (SYN-115); leitura lazy/cacheávelSYN-115brief §2.2
SYN-179mcp/cliMworkspace_overview: tool/resource de digest (contagens por tipo + entidades-chave/recentes) numa chamada; mata o custo de exploração do agenteSYN-150brief §5
SYN-180mcp/coreMrecent_changes {since}: delta sobre audit/timeline; agente recorrente puxa só o que mudou desde a última execução (cursor server-issued)SYN-110brief §6
SYN-181mcpMget_entities batch + projeção fields: buscar N entidades / só os campos necessários numa chamadaSYN-150brief §3
SYN-182mcp/coreMpropose_batch: múltiplas propostas → um bundle pending → um accept. Uma linha pending por write lógico; agrupa só a UX do acceptSYN-151brief §5
SYN-183mcp/coreLquery read-only (compute-out-of-context): projeção/agregação segura sobre o JSON do workspace (subset jq / ops whitelisted, caps de linha/tempo). O padrão “98%” da Anthropic; spike de segurança antes de commitarSYN-86brief §2.3 + §6
SYN-184cli/distMSynapse como plugin Claude: .claude-plugin/plugin.json empacotando skill + config MCP + hooks (ex.: SessionStart → syn pending list). Um install fia o loop inteiroSYN-175brief §6

CLI UX & agent-friendliness

Brief: docs/researchs/2026-06-05-cli-ux-and-agent-ergonomics.md. Auditoria do output do CLI (src/output.rs, src/cli.rs, src/exit.rs) vs CLIs modernos (Vercel/gcloud/gh/cargo) + clig.dev + literatura CLI-para-agentes. Achado: contrato (json, exit codes sysexits, output module limpo) à frente; apresentação (cor, glyphs, tabelas, progress, NO_COLOR) e não-interatividade muito atrás (cor só no label de erro; sem --no-color/--no-input).

IDLayerSizeTitleDependsOnSource
SYN-186cli/outputMCamada de styling TTY-gated (cor, ✓/✗/▲, bold/dim) + compliance NO_COLOR/--no-color/TERM=dumb/SYNAPSE_NO_COLOR (clig.dev). Crate de cor (anstyle/anstream) atrás de ADR; nunca colorir JSON; snapshot-test do output planoSYN-34brief §2.1
SYN-187cliSModo não-interativo: --no-input/--yes + --quiet; todo prompt (onboarding do init, setup) respeita. Non-TTY implica no-input. Agente/CI nunca travaSYN-170brief §2.3
SYN-188cli/outputM--format json 100% + erros JSON machine-readable (stderr) + contrato de output congelado (aditivo-only p/ agentes). Hoje json cobre ~metade e print_error é sempre textoSYN-34brief §2.3
SYN-189core/cliSExit codes mais granulares p/ agentes (not-found / already-exists / conflict): hoje sysexits category-level (ambos UserError=1)-brief §1
SYN-190cli/outputMTabelas + layout estruturado p/ list/search/info/doctor no TTY; colunas planas no pipeSYN-186brief §2.2
SYN-191cliSSpinner/progress no TTY p/ embed –all / reindex / watch; stream plano off-TTY (clig.dev: sem animação off-TTY)SYN-186brief §2.1
SYN-192cli/outputMLoading & animação premium (AAA): spinners branded (Lil Syn), barras multi-fase com ETA/rate, conclusão polida; TTY-gated. Posicionar em tier de CLI moderno premiumSYN-186 SYN-191brief §2.4
SYN-193cli/outputMRich rendering: graph como árvore unicode (├─└─) + labels coloridos; show como painel/card (não YAML cru); snippets de search limpos (markdown cru hoje parece quebrado); info dashboard; doctor com glyphsSYN-186 SYN-190brief §2.4
SYN-195cli/outputSContrato de modos de renderização: AAA/rich é o default (opt-out); --plain/--raw + SYNAPSE_PLAIN => output cru/mínimo p/ economia de tokens; gate único is_rich() (TTY && !plain && !NO_COLOR && text). Governa SYN-186/190/191/192/193SYN-186brief §3

Brand & delight (mascote + animação; footprint Moderado, owner 2026-06-05)

Mascote canônico escolhido: constelação de grafo (nós + arestas = o grafo de entidades = o segundo cérebro). Tudo rich-only (is_rich()), NO_COLOR-aware, nunca em pipe/CI/agente/--format json; animação só em momentos raros/significativos, nunca em add/done/uso repetido.

IDLayerSizeTitleDependsOn
SYN-196outputMoutput/brand.rs: mascote (constelação) full/compact/glyph + wordmark; fundação do clusterSYN-186
SYN-197cli/outputMRevelação animada no onboarding (setup/init, 1x, pulável, no-op off-TTY): o “cérebro online”SYN-196 SYN-170
SYN-198cli/outputSBanner branded em syn (help) e --version: estático, rich-onlySYN-196
SYN-199core/outputSEstados vazios/saudáveis charmosos: mascote em list/search vazios e doctor limpo (estático)SYN-196
SYN-200cli/outputMExperiência de download branded (~920 MB): constelação “carregando” sobre a barra; reusa SYN-191SYN-196 SYN-191

Fase v0.7: Governed-autonomy foundation

Meta: construir o núcleo de governança + performance que torna a autonomia segura: antes de shipar a autonomia. A auditoria estratégica (2026-06-07, 5 lentes) concluiu que autonomia não deve preceder a fundação: o syn agent (SYN-185) foi movido para a v0.8, atrás de SYN-202 e SYN-218. Reframe do nome da fase de “Autonomy & performance” → “Governed-autonomy foundation”. Milestone GitHub v0.7 Autonomy & performance (#8).

IDLayerSizeTitleDependsOn
SYN-202coreLpropose_batch atômico: uma tx compartilhada nas apply paths (hoje best-effort sequencial; falha parcial trava o bundle). Follow-up da SYN-182SYN-182
SYN-216coreMAccept de proposal único crash-safe / idempotente: apply+audit+mark numa tx (hoje 3 separadas; crash entre apply e mark re-aplica)SYN-202
SYN-217index/coreLReindex incremental por dirty-tracking (mtime+hash): substitui o DELETE *; rescan full; pré-requisito de sync e do swap HNSW-
SYN-218coreLProposals por tier de confiança + auto-apply de baixo risco reversível (ADR-022). Mata o rubber-stamping e destrava autonomia seguraSYN-202, ADR-022
SYN-219mcpMMigrar auditoria de MCP Sampling → Tasks extension (SEP-2577 depreca Sampling/Roots/Logging; janela ~12 meses)-
SYN-183mcp/coreLquery read-only compute-out-of-context. Spike de segurança ANTES (SQL-injection/exfiltração): bloqueante-
SYN-214docs/coreSReconciliar números de tamanho dos modelos (comentários config/mod.rs ~720 MB vs docs ~920 MB): medir o real, alinhar tudo-

Fase v0.8: Frictionless capture & governed autonomy

Meta: inverter o value-timing da captura (a lente comportamental apontou a fricção de captura como o maior risco de adoção: captura estruturada manual + accept-loop = taxa cobrada duas vezes) e shipar a autonomia agora que a fundação da v0.7 existe. Milestone GitHub v0.8 Frictionless capture & governed autonomy (#10).

IDLayerSizeTitleDependsOn
SYN-185cli/coreLsyn agent: loop autônomo. Movido da v0.7: atrás de SYN-202 + SYN-218. Sob ADR-022, sanciona por política (não mais gate absoluto)SYN-202, SYN-218
SYN-220cli/coreLCaptura ambiente do git: autores→pessoas, repos→projetos, merges→decisões candidatas, como proposals. A maior alavanca de adoçãoSYN-218
SYN-221cli/coreMPromover syn capture "<texto>" como caminho padrão: frictionless + estruturação diferida pelo agente-
SYN-222cli/coreSsyn digest: “o que aprendi esta semana” (cria o prompt que falta; força retrieval)-
SYN-229docs/brandMReposicionar README/docs/marca: governança auditável (“a memória que agentes não corrompem”) como pitch central (owner 2026-06-07)-

Fase v0.9: Temporal governance & adoption

Meta (re-ancorada 2026-06-12): a v0.9 deixa de “perseguir a fronteira do grafo” e passa a aprofundar o fosso de governança: a única posição defensável (auditoria estratégica 2026-06-07; confirmada pela pesquisa de mercado 2026-06-12). O enquadramento antigo (“tirar o grafo do meio espremido / alcançar Zep-Graphiti-mem0”) era perseguir commodity: paridade que o concorrente já tem, contra a própria tese da v0.8 (governança como diferencial). A pesquisa valida a virada:

  • Letta #3320 (líder de categoria) pede explicitamente “policy enforcement + tamper-evident audit trails” para memória de agente.
  • mem0 acumula até 97,8% de lixo em 32 dias (#4573), promete resolução de contradição que não existe no código (#4896), e não tem decay nenhum (#5245).
  • Só Graphiti/Zep têm bitemporal de verdade, e mesmo assim sem proveniência por fato, sem accept-gate, com bugs de supersessão que corrompem o grafo silenciosamente (#1489).
  • Ninguém combina temporal + proveniência assinada + gate humano + auditoria à prova de adulteração. Um produto local-first é o único que pode: a verdade é Markdown no disco do usuário, sem vendor na cadeia de confiança. Frase-moat: “a memória que seus agentes não conseguem corromper silenciosamente, e que você consegue provar que não corromperam.”

Milestone GitHub v0.9 Temporal governance & adoption (#11).

Re-escopo (2026-06-14, auditoria crítica multi-agente). A v0.9 ficou um grab-bag de duas fases sob um nome: uma cadeia de governança (o moat real) e uma cadeia de adoção/escala (grafo-UI, HNSW, interop) que é outra fase usando o mesmo crachá. Decisão do dono: liderar pelo provável/git-native, não pelo portão, e cortar o gold-plating que um tool single-user nunca exercita. Aplicado:

CUT → v0.10/backlog (sem perda para o showcase solo):

  • SYN-246 (servidor de UI de grafo): manter o contrato JGF do SYN-243; cortar o servidor HTTP + 2 ADRs de segurança (maior sumidouro de ROI).
  • SYN-225 (HNSW/vectorlite): flat-scan basta a ~100k; o corpus de um usuário não cruza o teto. Nova dep + 2ª exceção unsafe injustificadas.
  • SYN-242 (contradição): redundante com o humano que já olha o diff no gate, para um curador único.
  • SYN-228 import de formato externo: substituir por import de vault Markdown (round-trip do nosso próprio export --as obsidian, testável; os schemas memory.json/basic-memory não estão pinados em lugar nenhum).

DESCOPE (entregar a metade útil, adiar a metade moat-demo):

  • SYN-223: entregar valid-time write + display; adiar o replay temporal / integração com at (a “parte difícil” do ADR-027, ~zero uso diário solo).
  • SYN-249: entregar tamper-evidence single-author; adiar segmentos por-autor / binding multi-usuário (declarado fora de escopo: single-user).
  • SYN-245: está atrás de um self-kNN do sqlite-vec não verificado; verificar antes de construir, ou cortar.

KEEP (o moat real): SYN-239 (tier single-author), SYN-240, SYN-241, SYN-247, SYN-224, SYN-234 (open types, entregue), SYN-243/244, SYN-226 (entregue), SYN-227.

v1.0 mínimo (“done enough” p/ um tool solo, local-first, governado): (1) loop de governança completo e provável: propose→accept→x-ai-*→ audit verify→blame/diff→receitas assinadas (já entregue); (2) trust + decay visíveis (já entregue); (3) open types end-to-end e documentados (entregue; faltam gaps de contract de 2ª classe: ver SESSION-HANDOFF §3); (4) todo comando em COMMANDS.md + um caminho TUTORIAL/RECIPES (o gate real entre “código existe” e v1.0: gates de pre-commit adicionados); (5) um import honesto (vault Markdown); (6) perf budget (SYN-227) para poder citar um número. Bitemporal-replay, contradição, HNSW, UI-server e audit multi-usuário são v1.x / bônus de showcase, não v1.0.

Ordem de implementação (recomendada). Há duas cadeias independentes, e a chave é que a de governança não depende do schema, então é construída primeiro (maior valor, menor risco, é o showcase):

  • (A) Cadeia de auditoria/governança: PRIMEIRO: SYN-239 (audit two-tier) → SYN-249 (commits assinados / git-nativo) → SYN-240 (diff/blame). Não toca o schema; é o fosso; ADRs 026/030 aceitos.
  • (B) Cadeia de schema/temporal: SYN-234 (tipos abertos: antes de bitemporal e do freeze de schema v1.0/SYN-104) → SYN-223 (bitemporal, split) → SYN-224 (decay) → SYN-241 (trust) → SYN-242 (contradição) → SYN-247/248.
  • (C) Grafo vivo: SYN-243 → 244 → 245 → 246 (o “this day” reusa o eixo temporal de SYN-223: sinergia deliberada).
  • (D) Performance, medida antes de otimizar: SYN-227 (budgets) → SYN-225 (HNSW, condicional). Por fim SYN-226 (ergonomia).

Dependências respeitadas (234 antes de 223; 227 antes de 225); só a ordem de início prioriza valor/risco.

1. Fundação de schema (antes de bitemporal e do freeze v1.0)

IDLayerSizeTitleDependsOn
SYN-234store/indexMTipos abertos typed-but-extensible (frontmatter + registry .synapse/types.toml); pagar o refactor cross-cutting uma vez, antes de bitemporal e do freeze de schema (SYN-104). Cuidado: não reabrir a superfície de injeção fechada no ADR-023 (colunas hard-coded). ADR-028-

2. Núcleo temporal + governança (o fosso)

IDLayerSizeTitleDependsOn
SYN-223store/indexLFatos bitemporais: valid_from/valid_until (valid-time ≠ transaction-time) + arestas de supersessão. Estende ADR-012. Split em (a) schema+migração, (b) escrita/supersessão, (c) replay/audit cientes de tempo (o moat: audit replay e at <ref> têm que entender valid-time). ADR-027SYN-234
SYN-224core/indexMDecay / staleness de memória + syn prune --stale (advisory, reversível). Antídoto direto ao “stale served as confident” (a dor #1 do mem0, que não tem decay)SYN-223
SYN-239core/storeMAuditoria à prova de adulteração (dois tiers): versionado (comum): log semântico em segmentos por autor .synapse/audit/<id>.ndjson (merge-safe), integridade/ordem delegadas ao Merkle DAG do git; não-versionado (fallback): cadeia auto-encadeada + checkpoint audit.head.json assinado em ed25519. syn audit verify fica git-aware. Tamper-evident, não tamper-proof. Zero dep nova. Estende ADR-013. ADR-026-
SYN-249core/cli/mcpMAuditoria git-nativa + commits assinados + binding de identidade, a identidade ed25519 (ADR-016) vira chave de assinatura SSH do git; verify/doctor validam assinaturas contra identidades conhecidas e não-revogadas; atribuição multi-usuário não-repudiável (campo author do git é forjável). Recommend-and-verify por padrão; drive-and-sign opt-in (gix). Remote = witness (compõe ADR-011). ADR-030SYN-239
SYN-240core/cli/mcpMsyn diff / syn blame: “o que a IA mudou”: before/after por campo sobre a cadeia x-ai-history + git, com autoria (IA tool/model vs humano) e status accept/reject. MCP recent_changes ganha deltas por campo. A view universalmente ausente nos concorrentes (Letta sobrescreve destrutivo, basic-memory nem atribui autoria)-
SYN-241core/cli/mcpMTrust/freshness score por fato = f(confidence_tier ADR-022, idade, profundidade de supersessão, proveniência assinada?). Exibido em show/search (ordenar/filtrar por frescor) + structuredContent no MCP. Janela de staleness configurável; marca fatos vencidos como “stale: re-verify”. Ninguém no espaço personal-KG tem isso. ADR-029 (fórmula determinística WPM)SYN-224
SYN-242coreMDetecção de contradição no propose-time: fato novo que contradiz um aceito (mesmo sujeito+predicado, objeto diferente) é roteado ao gate humano mesmo sob auto_apply = safe; a resolução vira link de supersessão em x-ai-history. Ataca o bug #1 não resolvido do mem0 (#4896). Stretch se a janela apertarSYN-223
SYN-247core/cli/mcpMAlinhamento W3C PROV + recibos de proveniência assinados e portáteis: mapear x-ai-* para PROV-DM + emitir atestação por fato no formato in-toto/DSSE, assinada na identidade ed25519 (ADR-016), verificável fora do Synapse (“verify me, não trust me”). Compõe com ADR-026/ADR-027. StretchSYN-239
SYN-248coreMPolítica de governança por tipo: definição de tipo em types.toml carrega write_policy/pii/link_policy; o core::policy consulta a política do tipo-alvo antes de qualquer auto-apply (ADR-022). Só endurece o gate, nunca burla a BR-12.3. StretchSYN-234

3. Grafo vivo (adoção / showcase): staged

Visão do dono: syn expõe o grafo de forma viva, buscável e filtrável, > melhor que o graph view do Obsidian (criticado como “bonito e inútil” por ser global-hairball sem filtro). Escolher um dia do ano e ver o que conecta a ele; buscar uma pessoa e ver como ela liga a tópicos/ideias/projetos/dias; arestas inferidas também de termos vetoriais de alto valor e recorrência. Staged: primeiro um contrato de dados JSON (CLI+MCP), depois UI servida localmente.

IDLayerSizeTitleDependsOn
SYN-243core/indexMMotor core::graph + contrato JSON (JGF): ego-subgrafo a N saltos sobre link+memberships; perfil JSON Graph Format (node id = type/slug; edge metadata.kind∈{link,membership,temporal,semantic}/weight/provenance; contract_version). Filtro since/until + nó-âncora sintético day/<date> (“o que conecta a este dia”). Só serde_json, zero dep nova-
SYN-244cli/mcpMsyn connections <query> + syn graph export (ego-graph default, nunca global-by-default; --hops/--type/--since/--until/--limit; --format json emite JGF; resumo TTY rico por padrão) + MCP get_connections/export_graph chamando o mesmo core::graph (sem drift de portas), com resource_links. i18n en+pt-BR no mesmo commitSYN-243
SYN-245index/coreMArestas semânticas via sqlite-vec mutual-kNN: --semantic: kNN por nó + filtro mutual-kNN (anti-hairball) + rescale local max(0,(cos−μ_local)/(1−μ_local)) (sem limiar absoluto de cosseno). Toda aresta carrega proveniência (cosine,k,via_notes,shared_terms): explicável ou não desenha. Ranking explicit>temporal>semantic; sob limite, dropa semantic primeiro. NÃO usar MST/NN backfill (desconectado é feature na viz). ADR-029 (peso de aresta)SYN-243, SYN-217
SYN-246cli/mcp/releaseLUI de grafo servida em localhost (Stage 2): syn graph serve read-only em 127.0.0.1, GET /graph devolve o mesmo JGF (contrato não muda entre stages); UI estática (Cytoscape.js) com busca/filtro/slider temporal. Segurança: bind loopback, allowlist de Origin/Host (defesa DNS-rebinding), sem CORS wildcard, GET-only, token por sessão. 2 ADRs (dep HTTP + segurança loopback). Stretch / pode escorregar p/ v1.0SYN-244

4. Performance: medir antes de otimizar

IDLayerSizeTitleDependsOn
SYN-227ci/indexSBudgets de performance em CI (1k/10k/50k entidades sintéticas): teto de 150ms vira invariante. Vem antes do HNSW: é o gate que prova (ou não) que a otimização é necessáriaSYN-217
SYN-225indexMSwap sqlite-vec flat-scan → HNSW (vectorlite), plano pré-estagiado no ADR-008 (17–100× a 100k). Condicional: só executar se os budgets do SYN-227 mostrarem um corpus real cruzando o teto. Custo: dep nova + 2ª exceção unsafe-FFI → ADR. Forte candidato a escorregar p/ v1.0/backlog se o gate não dispararSYN-227

5. Ergonomia

IDLayerSizeTitleDependsOn
SYN-226mcpSTool único search_everything (RRF sobre todos os tipos + resource_links); manter as tools tipadas-

Nota de escopo (crítica, profissional). Com os tickets novos a v0.9 ficou grande (~15 itens). É deliberado manter tudo na fase a pedido do dono, mas a implementação deve respeitar os tiers: núcleo = seções 1–2 + grafo Stage 1 (SYN-243..245); stretch/condicional = SYN-242 (contradição), SYN-246 (UI server), SYN-225 (HNSW). Se a janela apertar, esses três são o spillover natural para v0.10/v1.0: sem reordenar nada, só descem de tier.

Corte de release v0.9.0 (decidido 2026-06-14)

A fase entregou quase todo o moat de governança. O GitHub foi sincronizado com a realidade: 10 issues fechadas (SYN-234/239/240-CLI/241/243/244/247 parcial/226/227/228/224-advisory), e o restante reescopado/movido. Para taguear v0.9.0 faltam só duas features (honram o “Temporal” do nome):

  • SYN-223 (#215): valid-time bitemporal (descopado): x-valid-from/ x-valid-until + x-supersedes, filtro --as-of <date> que compõe com at <ref>; eixo de crença explícito (x-recorded-at/x-invalidated-at) em vez de derivar tudo do git; replay temporal → v0.10.
  • SYN-240 (#228): MCP recent_changes per-field deltas (reusa core::diff::diff_docs).

Movidos para v0.10/backlog: SYN-242, SYN-245, SYN-248, SYN-249C, SYN-246 (backlog), SYN-225 (backlog).


Fase v0.10: Governed memory-quality (milestone #13)

Meta (re-focada 2026-06-14): um único tema: aprofundar o moat de qualidade de memória governada (proveniência + reversibilidade + não-corrupção), que é o diferencial real vs. mem0/Letta/Graphiti. A v0.10 anterior misturava três temas (graph + scale + memory-quality): o mesmo sintoma de dispersão que a v0.9 teve antes da re-priorização. Scale e graph foram para a v0.11, puxáveis só sob evidência de necessidade (a régua do flat-vector/adiar-HNSW aplicada a tudo). Both-doors entra agora (era dívida acumulada, não design).

IDLayerSizeTitleDependsOn
SYN-256cli/mcpSBoth-doors parity: CLI syn changes --since para o recent_changes (hoje MCP-only) + tools MCP blame/diff (hoje CLI-only). Fecha a última assimetria de portas antes do invariante de paridade da v1.0 (SYN-253)SYN-240
SYN-257core/mcpMSYN-234 contract finish: colapsar o fork EntityType/string: set_field kind-aware → update_status custom + close de supersessão de F1 custom (gap do ADR-031); search --type <custom>; pattern regex (pode fatiar p/ v0.11, precisa dep+ADR)SYN-234, SYN-223
SYN-242coreMContradição → gate: determinístico (mesmo sujeito+predicado, objeto diferente) + dedup exato → recuperação de candidatos semânticos → escalar ao gate (não auto-resolver com LLM; o campo erra <26% no auto-update). Resolução = supersessão (aritmética de datas) no confirmSYN-223
SYN-250core/searchSTrust no ranking: injeta o score do ADR-029 na fusão (hoje só no blame); stale e ranking compartilham a curva de decay. Determinístico/explicávelSYN-241
SYN-252docs/mcpSContrato de qualidade de proposta p/ agentes MCP: encapsula a “arte de extração” (atomicidade, data-de-observação, no-echo, no-meta-extraction, atribuição); ataca o estágio que o gate protege (HaluMem auto-extract <62%)-

Fase v0.11: Scale & graph (evidence-gated) (milestone #14)

Meta: o que saiu do re-foco da v0.10 + os gaps técnicos mapeados no post-mortem da v0.9. Régua: puxar cada item só contra necessidade real do caso single-user. Re-escopo dirigido por estudo (2026-06-15, 4 subagents, researchs/2026-06-15): todas as 9 issues permanecem, mas reformuladas; ordem de execução abaixo. Achados: SYN-259(2) e o “blocker” do SYN-245 já estavam entregues (riscados); vários itens têm valor real só multi-user → entregues em forma single-user-mínima/opt-in; o moat agora é provar a não-corrupção (syn verify/SYN-253 → headline da v1.0, semeado pelo SYN-258 reformulado).

#IDSizeTitle (reformulado)DependsOn
1SYN-260SHygiene + 2 bugs reais: corrigir PATH do pre-commit fmt (gate inerte); clippy::unwrap_used deny (escalonado); split de queries.rs (ADR-015)-
2SYN-259SReformulado: empurrar valid_at_predicate para as queries de candidatos FTS+vector (bug latente de recall) + search --type <custom>. Parte (2) delta-por-campo riscada (já entregue no SYN-256); pattern regex → dep+ADR próprioSYN-223, SYN-257
3SYN-251MReformulado: batch-embed só de campos embeddable alterados + detecção de move por content-hash (preserva id/links). Watermark adiado (lição multi-writer)SYN-227
4SYN-254SReformulado: fingerprint de identidade determinístico p/ dedup-compare + colisão→gate (detect-don’t-merge). Nunca deriva o id/slug do hash (pilar). Opt-in por tipo; fuzzy/MinHash adiado. ADRSYN-234
5SYN-245MReformulado: arestas semânticas mutual-kNN + rescale local + proveniência por aresta (“explicável ou não desenha”); consumidor = contrato JGF. Blocker self-kNN resolvido (removido)SYN-243
6SYN-255SAnchor-distance reranker reusando graph_rank: bench de recall como pré-condição; se <2-3% MRR, vira no-op de baixa prioridadeSYN-243, SYN-250
7SYN-248SReformulado: só o eixo profile-vs-log (mutabilidade/decay) por tipo; só endurece o gate; sem matriz write/pii/link. ADRSYN-234
8SYN-249CMVerificação de assinatura de commit (ssh-key SSHSIG vs identidades não-revogadas): opt-in, último (valor multi-user; ADR-030 pré-autoriza). dep ssh-key + ADRSYN-239
9SYN-258MReformulado: NÃO é engine de replay. Teste de invariante de correção temporal (at <ref> -- … --as-of <date> reconstrói o estado que valia): semente do syn verify/SYN-253SYN-223

Backlog-condicional (puxar só sob demanda real): SYN-246 (UI server HTTP, manter só o contrato JGF), SYN-225 (HNSW: flat basta < ~100k).

Para v1.0 Stable: SYN-253: harness de invariantes (proveniência, reversibilidade, no-silent-corruption, correção temporal, paridade de portas, round-trip). NÃO adotar LoCoMo/LongMemEval/HaluMem (assumem um pipeline de auto-extração que não temos).


Fase Commercial optionality (exploratory)

Meta: optionalidade comercial sem trair local-first: o vault permanece a fonte de verdade local; vende-se conveniência/governança em cima. Pós-PMF. Milestone GitHub Commercial optionality (exploratory) (#12). A análise econômica: não há fosso hoje; o único monetizador provado da categoria é sync (playbook Obsidian/Logseq), e as features únicas (audit+proveniência+identidade) só mapeiam para willingness-to-pay em times/agent-governance.

IDLayerSizeTitleDependsOn
SYN-230core/releaseLsyn sync: vault sync E2E-criptografado opcional (hospedado + self-hostable). Supersedes #91/#105SYN-217
SYN-231coreLTime / workspace compartilhado com edições de IA governadas (por assento): o wedge B2BSYN-230
SYN-232docs/releaseSDeclarar fronteira open-core (governança/compliance edition) cedo e transparente-
SYN-233coreMCamada de identidade/CV verificável (atestações assinadas checáveis)-
SYN-235mcpMMCP sobre HTTP/SSE: tijolo do hosted gateway (acesso remoto seguro ao vault local)-

Fase v2.0: Beyond stable

Meta: pós-v1.0: itens demand-gated ou que precisam ser revisitados antes de valerem o custo. Milestone GitHub v2.0 Beyond stable (#9). Owner

decision 2026-06-07.

IDLayerSizeTitlePor que aqui
SYN-194coreMAsync / background enrichment (cold-start do BGE-M3 fora do budget síncrono)Trade-off grande: a janela de consistência eventual contraria o espírito da BR-13 (“enriquecer antes de commitar”). Despriorizado até o trade-off ser revisitado
SYN-174build/ciMRestaurar Intel macOS via outro backend ONNX (tract / from-source)Demand-gated, sem prioridade: só se houver demanda real de usuários Intel-Mac

Fase v1.0: Stable

Meta: distribuição pronta para usuário externo, schema com semver.

IDLayerSizeTitleDependsOnSource
SYN-100releaseMdist init + workflow gerado; primeiro release real v0.1.0SYN-45ADR-007
SYN-101releaseSInstaller shell (curl … | sh) hospedado em PagesSYN-100ADR-007
SYN-102releaseMHomebrew tap romulofebasi/synapseSYN-100README v1.0
SYN-103releaseS(opcional) Pacote npm para npx synapseSYN-100ADR-007
SYN-104docsMPolítica de semver para o schema de frontmatterSYN-15..22governança
SYN-105coreMMigration de schema entre versões (forward + reversa básica)SYN-10401-schema
SYN-106mcpMCongelar a tool surface MCP (toda mudança via ! em commit)SYN-39..43governança
SYN-107docsMMIGRATING.md 0.x → 1.0SYN-104onboarding
SYN-108ciSRelease assinada (cosign ou sigstore)SYN-100segurança
SYN-109docsMSite simples em GitHub Pages (estilo Fumadocs / mdBook)SYN-100adoção
SYN-215brand/docsSResolver o mascote duplo (Lil Syn × constelação de grafo) antes do freeze de marca; alinhar README/BRAND.md e output/brand.rsSYN-196audit v0.6

Backlog: pode subir para qualquer fase

Itens explicitamente fora das fases acima até alguém pedir. Listados para deixar rastro do que se discutiu e não está esquecido.

Numbering audit (2026-10-12, SYN-236): seven legacy IDs that collided with completed tasks are now SYN-331 through SYN-337. GitHub issue numbers remain stable. Earlier completed task IDs and commits retain their historical meaning. The allocation begins after SYN-330; SYN-237+ had already been consumed.

ID (atual)TitlePor que não está numa fase
SYN-331 (#90)Encryption-at-rest do .synapse/index.dbYAGNI no MVP; usuário pode usar disco encriptado
SYN-332 (#93)TUI (ratatui) interativaterceira porta, depois da base estável
SYN-333 (#94)Desktop GUI (tauri)idem
SYN-334 (#95)Suporte a TOML frontmatter (alternativa a YAML)YAGNI
SYN-335 (#96)Integrações nativas (Slack, Linear, Notion import)escopo de produto; v2
SYN-336 (#98)Suporte multi-workspace simultâneo no MCPaguardar caso de uso
SYN-337 (#106)Federation remota (syn remote add <git-url>)aguardar demanda
SYN-236 (#225)Legacy numbering hygieneCompleted allocation SYN-331..337; historical commits retained
SYN-238Higiene: traduzir descrições/comentários de issues de pt-BR → inglês (a convenção do repo é inglês; um lapso em 2026-06 deixou as issues que criei na sessão: faixa ~#205–#226: com bodies em pt). Bloqueado por indisponibilidade da API do GitHub em 2026-06-10 (DNS resolvendo api.github.com para IP errado). Aplicar via gh issue edit --body quando a API voltar; o hook .claude/hooks/no-portuguese-vcs.py previne reincidênciameta-tarefa de governança

Não-objetivos explícitos

Coisas que não entram, em nenhuma fase, sem reabertura de design:

  • Web UI hospedada. Synapse é local; nuvem fere a premissa de “conhecimento que é seu”. Pode haver site para docs, não para dados.
  • Login / contas. Sem usuários, sem RBAC. Quem manda no diretório é o dono do disco.
  • Banco de dados não-SQLite. O índice é descartável; trocar engine é esforço para zero benefício.
  • Formato proprietário. Tudo permanece Markdown + YAML legível.

Como contribuir com este roadmap

  1. Cada ticket aqui vira issue no GitHub com label phase:v0.1 (etc.) e layer:<camada>. Issues novas devem nascer com formato SYN-<ID> no título.
  2. Mudar prioridade ou cortar item: editar este arquivo numa PR; sem discussão paralela em Slack/Notion.
  3. Tickets de mais de 1 dia (L) devem ganhar uma sub-issue com plano de implementação antes do wip.

Atualizado em 2026-05-24.