Synapse: Roadmap
Como ler este documento. Cada linha é um ticket
SYN-Nque 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:
docs/design/01-data-schema.md: schema das entidades.docs/design/02-rust-architecture.md: layout original.docs/design/03-critique-and-decisions.md: críticas e decisões finais.README.md: features prometidas ao usuário.BUSINESS_RULES.md: regras de negócio normativas.- ADRs 001-011 (007 release pipeline, 010 workspace federation, 011 workspace freshness).
Convenções
| Coluna | Valores |
|---|---|
| ID | SYN-N, sequencial, imutável |
| Layer | cli, core, store, index, mcp, i18n, config, ci, release, docs |
| Size | XS (≤ 1h), S (≤ ½ dia), M (1 dia), L (≥ 2 dias) |
| Status | todo, wip, done, blocked, cut |
| DependsOn | IDs que precisam estar done antes |
Status (2026-05-26):
- v0.1 Foundation: 53/53
done. Tagv0.1.0em 2026-05-24. - v0.2 Daily polish: 24/24
done. Tagv0.2.0em 2026-05-25. - v0.3 Auditable AI Second Brain: 18/18
done. Tagv0.3.0em 2026-05-25. - v0.4 Refinement & extensibility: 18/18
done(12 core + 6 stretch); milestone GitHub#6fechado em 2026-05-26. Tagv0.4.0pendente: Cargo.toml ainda em0.3.0, release roda viacargo release. Brief emdocs/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:
wip2026-06-02. Brief emdocs/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.0em 2026-06-21 (SYN-262..270 + pre-release/improveplans 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-checkAction) done + SYN-290 (bench charts, ADR-040) done + SYN-291 (docs currency) done + SYN-292 (syn undoPhase 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:
| Fase | Faixa em uso | Slots livres |
|---|---|---|
| v0.1 Foundation | SYN-1..SYN-53 | SYN-54..SYN-59 |
| v0.2 Daily polish | SYN-60..SYN-79 + SYN-90..SYN-93 (manifest + freshness) + SYN-99 (uninstall) | - |
| v0.3 Auditable AI Second Brain | SYN-110..SYN-129 (ingestors SYN-119/120 vagos, deferidos) | SYN-131..SYN-149 |
| v0.4 Refinement & extensibility | SYN-130..SYN-149 + SYN-150 (refactor); cortes: SYN-134, SYN-144, SYN-145 | SYN-151..SYN-199 |
| v0.5 Semantic layer & second-brain | SYN-80..SYN-89 + SYN-93b + SYN-151..SYN-154 (arch-debt do v0.4) + SYN-160..SYN-168 (expansion) | - |
| v0.6 Personal onboarding & autonomy | SYN-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 foundation | SYN-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 autonomy | SYN-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 & adoption | SHIPPED (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-quality | Re-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 engine | SYN-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 stable | SYN-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 |
| Backlog | SYN-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 searchencadeá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
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-1 | core/cli | M | AppDeps + Dispatch trait, eliminando god-match em commands/mod.rs | - | 03-critique §4.1 §4.2 |
| SYN-2 | store | M | Workspace::find (sobe diretórios procurando .synapse/) | SYN-1 | 02-arch §commands |
| SYN-3 | store | L | Workspace::tx atômico: temp + rename + transação SQLite | SYN-2 | 03-critique §4.5 |
| SYN-4 | core | S | core::CreateProject use case (sem I/O direto) | SYN-3 | 03-critique §4.4 |
| SYN-5 | core | S | core::Slugify + validação de slug | - | 01-schema §convenções |
Schema, índice e migrations
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-6 | index | M | DDL inicial: entities, tags, links, FTS5: com PK composta (type,id) | SYN-3 | 03-critique §3.5 |
| SYN-7 | index | XS | Toda conexão executa PRAGMA foreign_keys = ON | SYN-6 | 03-critique §3.1 |
| SYN-8 | index | S | FK explícitas em links (CASCADE) e tasks.project | SYN-7 | 03-critique §3.1 |
| SYN-9 | index | M | Migration runner (versionado, idempotente) | SYN-6 | 02-arch §index |
| SYN-10 | index | S | Colunas explícitas para campos quentes: status, owner, priority, due | SYN-6 | 03-critique §3.6 |
| SYN-11 | index | M | syn reindex: varredura idempotente | SYN-9 SYN-10 | 01-schema §reindex |
Frontmatter & parsing
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-12 | store | M | Parser/serialize de frontmatter (gray_matter + serde_yaml_ng) | - | 03-critique §5 / ADR-004 |
| SYN-13 | store | S | Round-trip preserva ordem dos campos no YAML (UX de diff) | SYN-12 | 02-arch §store |
| SYN-14 | store | S | Validação de schema por type (campos obrigatórios) | SYN-12 | 01-schema |
Tipos de entidade: CLI
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-15 | cli/core | M | syn project add|list|show|rm|rename | SYN-4 SYN-11 | README |
| SYN-16 | cli/core | M | syn person add|list|show|rm|rename | SYN-15 | README |
| SYN-17 | cli/core | M | syn person link (cria membership N:N project ↔ person) | SYN-16 | 01-schema §person |
| SYN-18 | cli/core | M | memberships em vez de roles (renomeação semântica) | SYN-17 | 03-critique §3.3 |
| SYN-19 | cli/core | M | syn entity add|list|show|rm | SYN-15 | 01-schema §entity |
| SYN-20 | cli/core | M | syn api add|list|show|rm | SYN-15 | 01-schema §api |
| SYN-21 | cli/core | M | syn task add|list|show|rm|done (id sequencial) | SYN-15 | 01-schema §task |
| SYN-22 | cli/core | M | Novo tipo note (decision | runbook | meeting | snippet | reference) | SYN-15 | 03-critique §3.2 |
| SYN-23 | cli/core | S | syn tag list|rename|merge (operações globais sobre tags) | SYN-11 | 02-arch §commands |
Busca
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-24 | core/index | M | core::Search: FTS5 + filtros --type --tag --owner | SYN-11 | 01-schema §FTS5 |
| SYN-25 | cli | S | syn search <query> com formatação text/json | SYN-24 | README |
| SYN-26 | core/index | M | core::Graph::neighbors: base p/ “quem depende de X” | SYN-11 | 01-schema §links |
| SYN-27 | cli | S | syn graph project <slug> (quem aponta, quem é apontado) | SYN-26 | 02-arch §commands |
Saúde & meta
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-28 | cli/index | M | syn doctor: referências quebradas, slugs órfãos, frontmatter inválido | SYN-11 | 01-schema §reindex |
| SYN-29 | cli | XS | syn info: resumo do workspace, contagem por type | SYN-11 | 02-arch §commands |
| SYN-30 | config | M | Cascade config (system → global → workspace → runtime) com etcetera | - | 02-arch §config |
| SYN-31 | cli | S | syn setup (interativo: locale, editor padrão) | SYN-30 | 02-arch §setup |
| SYN-32 | cli | S | syn init [PATH] cria .synapse/ e estrutura base | SYN-30 | 02-arch §init |
Erros & saída
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-33 | core | S | Error::fluent_key() separado de Display (i18n sem perder log) | - | 03-critique §4.3 |
| SYN-34 | cli | S | output::render text/json centralizado | - | 02-arch §output |
| SYN-35 | cli | XS | Códigos de saída padronizados (1 user error, 2 bug, 64+ reservados) | SYN-34 | 02-arch §main |
Internacionalização
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-36 | i18n | M | Loader i18n-embed + Fluent, com detecção via sys-locale | - | 02-arch §i18n |
| SYN-37 | i18n | S | --lang (CLI) e SYNAPSE_LANG (env) | SYN-36 | 02-arch §i18n |
| SYN-38 | i18n | M | Cobertura completa pt-BR e en para todas as mensagens v0.1 | SYN-36 | 02-arch §i18n |
MCP (leitura)
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-39 | mcp | M | Servidor rmcp 1.7 sobre stdio, feature-gated | SYN-24 | ADR-002 |
| SYN-40 | mcp | S | Tool search_knowledge (mesma função que syn search) | SYN-39 | 03-critique §4.4 |
| SYN-41 | mcp | S | Tool get_entity (project / person / api / task / note) | SYN-39 | 02-arch §mcp |
| SYN-42 | mcp | S | Tool list_by_type com filtros | SYN-39 | 02-arch §mcp |
| SYN-43 | mcp | S | Tool project_graph (vizinhança) | SYN-26 | 02-arch §mcp |
| SYN-44 | mcp | S | Lazy init de tokio só quando syn mcp é chamado | SYN-39 | 03-critique §4.6 |
CI / qualidade / build
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-45 | ci | S | Workflow ci.yml (fmt, clippy, nextest matrix, deny, shear, MSRV) | - | feito em SYN-0: validar |
| SYN-46 | ci | S | Workflow commit-lint.yml valida PRs | - | feito em SYN-0: validar |
| SYN-47 | ci | XS | Job cargo doc -D warnings no CI | SYN-45 | 03-critique §7 |
| SYN-48 | build | XS | build.rs com vergen-gix (versão + git hash + rustc) | - | feito em SYN-0: validar |
| SYN-49 | core | XS | #![warn(missing_docs)] + intra-doc links no lib.rs | - | feito em SYN-0: validar |
Testes
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-50 | tests | S | Fixtures de workspace mínimo + assert_cmd round-trip | SYN-32 | 02-arch §testes |
| SYN-51 | tests | S | Snapshots insta para saída text/json | SYN-25 | 02-arch §testes |
| SYN-52 | tests | M | Property tests proptest para slug | SYN-5 | 02-arch §testes |
| SYN-53 | tests | M | Teste de transação Workspace::tx (falha em índice → rollback do FS) | SYN-3 | 03-critique §4.5 |
Fase v0.2: Daily polish
Meta: experiência sem fricção no dia-a-dia. Completions, watcher, export, MCP que escreve.
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-60 | mcp | M | Tool capture_fact: IA propõe gravação; CLI confirma | SYN-39 | 03-critique §2.2 |
| SYN-61 | mcp | M | Tool link_entity (cria vínculo project↔person, etc.) com confirmação | SYN-60 | 03-critique §2.2 |
| SYN-62 | mcp | S | Tool update_status (task done, project pausado) | SYN-60 | README v0.2 |
| SYN-63 | cli | S | Completions bash/zsh/fish/elvish/powershell via clap_complete | SYN-45 | README v0.2 |
| SYN-64 | cli | S | Man page man syn via clap_mangen | SYN-63 | README v0.2 |
| SYN-65 | cli | M | Watcher mode (syn watch) com notify 8: reindex em mudança | SYN-11 | README v0.2 |
| SYN-66 | cli | M | syn export --format=html (browser-friendly do workspace) | SYN-24 | README v0.2 |
| SYN-67 | cli | S | syn export --format=json (single-file) | SYN-24 | README v0.2 |
| SYN-68 | core/index | M | Indexar last_modified_commit (sem implementar --at ainda) | SYN-11 | 03-critique §3.4 |
| SYN-69 | cli | S | syn config get|set|unset no nível workspace | SYN-30 | 02-arch §commands |
| SYN-70 | cli | S | syn open <slug> abre o arquivo no $EDITOR | SYN-32 | UX comum |
| SYN-71 | cli | S | syn rm confirma com prompt; --force para script | SYN-15 | 02-arch §commands |
| SYN-72 | docs | M | Tutorial passo-a-passo (docs/tutorial.md) | v0.2 fim | UX adoção |
| SYN-73 | docs | M | Receitas (docs/recipes.md): casos de uso comuns | v0.2 fim | UX 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.
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-74 | cli | S | syn uninstall (binary + --purge config + --everything registry; nunca toca workspaces) | - | UX gap apontado pelo usuário |
| SYN-75 | store/index | M | Workspace registry: workspaces.db global + auto-register no syn init + git remote auto-detect + refresh last_seen | - | ADR-010 §F1 |
| SYN-76 | cli | S | syn ws list|show|forget|gc|include|exclude | SYN-75 | ADR-010 §F1 |
| SYN-77 | core/cli | M | --all em search/info/graph: federated read sobre workspaces opt-in | SYN-75 SYN-76 SYN-79 | ADR-010 §F2 |
| SYN-78 | mcp | M | MCP tools: list_workspaces, federated_search, get_entity_from(ws, type, id) | SYN-77 | ADR-010 §F3 |
| SYN-79 | store/cli | S | Privacy gate: federated=0 default, opt-in explícito, BR-12.4 | SYN-75 | ADR-010 (privacy) |
| SYN-90 | store/core | M | SYNAPSE.md identity card spec + I/O + bootstrap no syn init (BR-1.5) | SYN-75 | ADR-010 §F7 |
| SYN-91 | cli | S | syn ws edit|refresh|topic add|tag add (curadoria do manifest) | SYN-90 | ADR-010 §F7 |
| SYN-92 | mcp | M | MCP tools get_workspace_manifest, add_workspace_topic, add_workspace_tag (fila de aprovação) | SYN-90 SYN-60 | ADR-010 §F7 |
| SYN-93 | store/cli/mcp | L | Workspace freshness: git ls-remote async + advisory em CLI/MCP (BR-12.5) | SYN-75 | ADR-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.
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-110 | core/index | M | audit.ndjson schema + atomic appender + rotação (90d default) | - | research §5 #1 |
| SYN-111 | core | S | Frontmatter stamps x-ai-* em propostas aceitas | SYN-110 | bet 2 |
| SYN-112 | cli | S | syn audit show|list|prune | SYN-110 | research §5 #1 |
| SYN-113 | core/cli | M | syn audit replay <id> contra context snapshot | SYN-114 | bet 5 |
| SYN-114 | core/index | S | Coluna pending.context_snapshot + payload | SYN-110 | bet 5 |
| SYN-115 | mcp | M | MCP Resources (workspace/manifest, entity/{id}, audit/recent) | - | research §2.2 |
| SYN-116 | mcp | M | MCP Prompts (capture-decision, daily-review, weekly-brief) | - | research §2.2 |
| SYN-117 | mcp | S | .synapse/server-card.json + capability disclosure schema | - | bet 4 |
| SYN-118 | mcp | M | MCP Tasks extension em reindex (feature-gated) | - | research §2.2 |
| SYN-121 | core/cli | S | syn timeline <slug> (git log filtrado por path da entity) | SYN-68 | research §5 #3 |
| SYN-122 | core/cli | M | syn at <ref> -- <subquery> (subset: search + show) | SYN-68 SYN-121 | research §5 #3 |
| SYN-123 | core/cli | M | syn audit stale --over <window> (ranking cross-workspace) | SYN-77 | bet 3 |
| SYN-124 | cli | S | syn capture (stdin → pending capture_fact) | SYN-60 | research §5 #6 |
| SYN-125 | core/cli | L | me.synapse bundle: syn identity export|import|inspect (prototype, ed25519 opcional) | SYN-90 | bet 1 |
| SYN-126 | docs | M | ADR-012: provenance frontmatter convention | SYN-111 | governança |
| SYN-127 | docs | M | ADR-013: audit.ndjson format + retention policy | SYN-110 | governança |
| SYN-128 | docs | M | ADR-014: portable identity bundle (me.synapse) | SYN-125 | governança |
| SYN-129 | docs | M | docs/AUDITABILITY.md + docs/PROVENANCE.md (user-facing) | SYN-111 SYN-112 | UX 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)
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-150 | mcp | L | Refatorar mcp/server.rs em submódulos focados (tools/{read,federation,write}, resources, prompts, freshness, helpers); surface MCP byte-stable. LANDS FIRST. | - | ADR-015 |
| SYN-130 | cli/lsp | L | syn-lsp companion: completions de slug/type/tag em qualquer editor LSP (Cursor/VSCode/Helix/Neovim/Zed) | SYN-115 | brief bet: adoption |
| SYN-131 | core/cli | L | syn identity keygen + ed25519 obrigatório + revocation list | SYN-125 | ADR-014 deferred |
| SYN-132 | core/cli | M | syn experience add + skills auto-derive from tag frequency | SYN-125 | ADR-014 §Future direction |
| SYN-133 | core/cli | M | syn cv export Markdown deterministic from bundle + workspace | SYN-132 | brief disruptive: curriculum surface |
| SYN-135 | core/cli | M | syn audit verify: re-hash pending payloads vs audit.payload_sha256 | SYN-110 | ADR-013 implicit gap |
| SYN-136 | core/cli/mcp | L | syn audit replay --execute: real model rerun via MCP client | SYN-113 | brief bet 5 closure |
| SYN-138 | mcp | M | MCP Tasks real (reindex + federated_search progress) | SYN-118 | SYN-118 placeholder closure |
| SYN-141 | core/cli | M | syn at <ref> -- graph|list|info subcommands | SYN-122 | SYN-122 surface completion |
| SYN-147 | docs | M | ADR-016: portable identity v2 (crypto + revocation) | SYN-131 | governance |
| SYN-148 | docs | M | ADR-017: curriculum schema | SYN-132 SYN-133 | governance |
| SYN-149 | docs | M | docs/IDENTITY.md user-facing (bundle + curriculum) | SYN-131 SYN-133 | UX adoption |
Stretch (lands if window allows; otherwise rolls to v0.5)
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-137 | core | M | x-ai-history chain on entity re-mutations | SYN-111 | ADR-012 §Open question |
| SYN-139 | mcp | M | MCP resources pagination via cursor | SYN-115 | SYN-115 documented limit |
| SYN-140 | mcp/core | M | Tag-level federation redaction (SearchHit carries tags) | SYN-117 | brief bet 4 closure |
| SYN-142 | core/cli | L | Full as-of FTS index reconstruction (sandbox) | SYN-122 | SYN-122 documented limit |
| SYN-143 | core/cli | M | syn ws clone <git-url> lifecycle starter | - | brief §2.5 partial |
| SYN-146 | core/cli | M | syn doctor --lint-provenance | SYN-111 | brief §2.1 audit |
Cortes assumidos (registrados no brief, §9)
syn agentautonomous 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)
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-151 | mcp | M | refactor 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-152 | cli | S | split cli/at.rs (620 linhas, yellow tier) em cli/at/{mod,search,show,list,info,graph}.rs | - | ADR-015 |
| SYN-153 | cli | S | split cli/audit.rs (611 linhas, yellow tier) em cli/audit/{listing,verify,replay,stale,prune}.rs | - | ADR-015 |
| SYN-154 | ci | XS | CI lint rejeitando src/** acima de 800 linhas (red), warning em 600 (yellow): ADR-015 enforcement | - | ADR-015 §Playbook |
Core: camada semântica
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-89 | docs | M | ADR-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-80 | index/build | M | Feature vector em Cargo.toml + migration separada migrations_vec/*.sql | - | 03-critique §3.7 |
| SYN-81 | index | L | Integração sqlite-vec (bundled+vtab+load_extension + tabela entities_vec + gotchas documentadas em ADR-008) | SYN-80 | brief §2.2 |
| SYN-82 | core | M | trait EmbeddingBackend + trait NerBackend (contracts para o pipeline paralelo) | SYN-80 | 03-critique §3.7 |
| SYN-84 | core/tests | S | Stubs determinísticos para EmbeddingBackend (SipHash fake vector) e NerBackend (regex fake NER) | SYN-82 | testes |
| SYN-83 | core | M | EmbeddingBackend impls: fastembed-rs (BGE-M3 default, BGE-small-EN-v1.5-Q opt-down per workspace); Ollama configurável | SYN-82 SYN-89 | brief §2.1 |
| SYN-164 | core | M | NerBackend impl: GLiNER-multi-base-Q default + GLiNER-base-en-Q opt-down per [enrichment] ner_model; tipos NER hard-coded | SYN-82 SYN-89 | brief §2.4 |
| SYN-85 | cli | M | syn embed --all / syn embed <slug> / syn embed --check / syn embed --reset-cache | SYN-81 SYN-83 | brief §9.2 |
| SYN-160 | core | L | Pipeline 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 codificada | SYN-83 SYN-164 | brief §1.2 + §9.2 |
| SYN-161 | core | M | Heuristic entity-linker + NER-span resolver (slug/data/@mention/URL/tag + spans GLiNER → links tipados ou pending proposals link_entity / create_entity_from_ner) | SYN-160 | brief §2.4 + §9.2 |
| SYN-86 | core/index | L | Ranking híbrido RRF (k=60) sobre FTS + vector + graph-neighbourhood | SYN-81 SYN-85 SYN-161 | brief §2.3 |
| SYN-87 | cli | S | syn search default = híbrido; --semantic = vector-only; --no-vector = FTS+graph only | SYN-86 | brief §2.3 |
| SYN-162 | core/tests | L | Bench corpus generator (1k/5k/10k entities) + query bank 50q × 3 tiers, variantes pt-BR + en-US | SYN-83 SYN-164 | brief §6.1 |
| SYN-163 | core/tests/docs | M | Bench runner + results report; CI artefact; thresholds gate (T2 P@5 ≥ 0.85, MRR ≥ 0.55, write median ≤ 500 ms, search median ≤ 150 ms) | SYN-162 | brief §6.3 |
Adoption inside v0.5
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-167 | docs/cli | S | README §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-168 | core/cli/docs | M | Semantic 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-out | SYN-160 SYN-164 SYN-85 | owner decision 2026-06-04 |
Stretch (lands if window allows; otherwise v0.6)
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-165 | core | M | EmbeddingBackend impls para OpenAI + Voyage (network-based, opt-in explícito) | SYN-83 | brief §9.3 |
| SYN-166 | cli/core | S | syn search --grade para capturar pares query → relevant; foundation para convex combination tuning v0.6 | SYN-86 | brief §9.3 |
| SYN-88 | mcp | S | MCP tool semantic_search: somente se algum cliente precisar do modo vector-only direto | SYN-86 | brief §9.3 |
Track paralelo (independente da semantic stack)
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-93b | store/mcp | L | Workspace freshness Phase 2: ls-refs real via gix-protocol (3s timeout, unreachable fallback, walk de commits para behind_count preciso) | SYN-93 | ADR-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
selfnoperson(a “pessoa-você” canônica,src/core/identity) existe e é lida porcv export/identity export, mas não há como criá-la, nem CLI, nem onboarding. E osyn setupé opcional, então o idioma/identidade nunca são definidos de forma garantida.
Onboarding obrigatório & identidade própria
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-170 | cli/core | M | Setup 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-32 | owner 2026-06-05 |
| SYN-171 | cli/core | L | Onboarding 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 workspace | SYN-170 SYN-131 | owner 2026-06-05 |
| SYN-172 | core | M | Semear 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-32 | owner 2026-06-05 |
| SYN-173 | core/docs | M | Schema 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-172 | owner 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
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-174 | build/ci | M | Restaurar 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 custo | SYN-83 SYN-164 | v0.5 release finding 2026-06-05 |
Integração com agentes (skill / llms.txt)
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-175 | cli | M | syn 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.
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-176 | mcp | S | Bound list_by_type: limit + cursor. É a única read ilimitada (search/federated já capam); viola o princípio de response-constraint da Anthropic | SYN-150 | brief §2.1 |
| SYN-177 | mcp | M | structuredContent + 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-150 | brief §2.2 |
| SYN-178 | mcp | S | ResourceLink para synapse://entity/{type}/{id} nos hits de search_knowledge e no get_entity: entidades já são resources (SYN-115); leitura lazy/cacheável | SYN-115 | brief §2.2 |
| SYN-179 | mcp/cli | M | workspace_overview: tool/resource de digest (contagens por tipo + entidades-chave/recentes) numa chamada; mata o custo de exploração do agente | SYN-150 | brief §5 |
| SYN-180 | mcp/core | M | recent_changes {since}: delta sobre audit/timeline; agente recorrente puxa só o que mudou desde a última execução (cursor server-issued) | SYN-110 | brief §6 |
| SYN-181 | mcp | M | get_entities batch + projeção fields: buscar N entidades / só os campos necessários numa chamada | SYN-150 | brief §3 |
| SYN-182 | mcp/core | M | propose_batch: múltiplas propostas → um bundle pending → um accept. Uma linha pending por write lógico; agrupa só a UX do accept | SYN-151 | brief §5 |
| SYN-183 | mcp/core | L | query 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 commitar | SYN-86 | brief §2.3 + §6 |
| SYN-184 | cli/dist | M | Synapse como plugin Claude: .claude-plugin/plugin.json empacotando skill + config MCP + hooks (ex.: SessionStart → syn pending list). Um install fia o loop inteiro | SYN-175 | brief §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).
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-186 | cli/output | M | Camada 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 plano | SYN-34 | brief §2.1 |
| SYN-187 | cli | S | Modo não-interativo: --no-input/--yes + --quiet; todo prompt (onboarding do init, setup) respeita. Non-TTY implica no-input. Agente/CI nunca trava | SYN-170 | brief §2.3 |
| SYN-188 | cli/output | M | --format json 100% + erros JSON machine-readable (stderr) + contrato de output congelado (aditivo-only p/ agentes). Hoje json cobre ~metade e print_error é sempre texto | SYN-34 | brief §2.3 |
| SYN-189 | core/cli | S | Exit codes mais granulares p/ agentes (not-found / already-exists / conflict): hoje sysexits category-level (ambos UserError=1) | - | brief §1 |
| SYN-190 | cli/output | M | Tabelas + layout estruturado p/ list/search/info/doctor no TTY; colunas planas no pipe | SYN-186 | brief §2.2 |
| SYN-191 | cli | S | Spinner/progress no TTY p/ embed –all / reindex / watch; stream plano off-TTY (clig.dev: sem animação off-TTY) | SYN-186 | brief §2.1 |
| SYN-192 | cli/output | M | Loading & 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 premium | SYN-186 SYN-191 | brief §2.4 |
| SYN-193 | cli/output | M | Rich 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 glyphs | SYN-186 SYN-190 | brief §2.4 |
| SYN-195 | cli/output | S | Contrato 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/193 | SYN-186 | brief §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.
| ID | Layer | Size | Title | DependsOn |
|---|---|---|---|---|
| SYN-196 | output | M | output/brand.rs: mascote (constelação) full/compact/glyph + wordmark; fundação do cluster | SYN-186 |
| SYN-197 | cli/output | M | Revelação animada no onboarding (setup/init, 1x, pulável, no-op off-TTY): o “cérebro online” | SYN-196 SYN-170 |
| SYN-198 | cli/output | S | Banner branded em syn (help) e --version: estático, rich-only | SYN-196 |
| SYN-199 | core/output | S | Estados vazios/saudáveis charmosos: mascote em list/search vazios e doctor limpo (estático) | SYN-196 |
| SYN-200 | cli/output | M | Experiência de download branded (~920 MB): constelação “carregando” sobre a barra; reusa SYN-191 | SYN-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).
| ID | Layer | Size | Title | DependsOn |
|---|---|---|---|---|
| SYN-202 | core | L | propose_batch atômico: uma tx compartilhada nas apply paths (hoje best-effort sequencial; falha parcial trava o bundle). Follow-up da SYN-182 | SYN-182 |
| SYN-216 | core | M | Accept de proposal único crash-safe / idempotente: apply+audit+mark numa tx (hoje 3 separadas; crash entre apply e mark re-aplica) | SYN-202 |
| SYN-217 | index/core | L | Reindex incremental por dirty-tracking (mtime+hash): substitui o DELETE *; rescan full; pré-requisito de sync e do swap HNSW | - |
| SYN-218 | core | L | Proposals por tier de confiança + auto-apply de baixo risco reversível (ADR-022). Mata o rubber-stamping e destrava autonomia segura | SYN-202, ADR-022 |
| SYN-219 | mcp | M | Migrar auditoria de MCP Sampling → Tasks extension (SEP-2577 depreca Sampling/Roots/Logging; janela ~12 meses) | - |
| SYN-183 | mcp/core | L | query read-only compute-out-of-context. Spike de segurança ANTES (SQL-injection/exfiltração): bloqueante | - |
| SYN-214 | docs/core | S | Reconciliar 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).
| ID | Layer | Size | Title | DependsOn |
|---|---|---|---|---|
| SYN-185 | cli/core | L | syn 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-220 | cli/core | L | Captura ambiente do git: autores→pessoas, repos→projetos, merges→decisões candidatas, como proposals. A maior alavanca de adoção | SYN-218 |
| SYN-221 | cli/core | M | Promover syn capture "<texto>" como caminho padrão: frictionless + estruturação diferida pelo agente | - |
| SYN-222 | cli/core | S | syn digest: “o que aprendi esta semana” (cria o prompt que falta; força retrieval) | - |
| SYN-229 | docs/brand | M | Reposicionar 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
unsafeinjustificadas.- 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 schemasmemory.json/basic-memorynã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)
| ID | Layer | Size | Title | DependsOn |
|---|---|---|---|---|
| SYN-234 | store/index | M | Tipos 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)
| ID | Layer | Size | Title | DependsOn |
|---|---|---|---|---|
| SYN-223 | store/index | L | Fatos 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-027 | SYN-234 |
| SYN-224 | core/index | M | Decay / 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-239 | core/store | M | Auditoria à 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-249 | core/cli/mcp | M | Auditoria 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-030 | SYN-239 |
| SYN-240 | core/cli/mcp | M | syn 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-241 | core/cli/mcp | M | Trust/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-242 | core | M | Detecçã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 apertar | SYN-223 |
| SYN-247 | core/cli/mcp | M | Alinhamento 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. Stretch | SYN-239 |
| SYN-248 | core | M | Polí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. Stretch | SYN-234 |
3. Grafo vivo (adoção / showcase): staged
Visão do dono:
synexpõ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.
| ID | Layer | Size | Title | DependsOn |
|---|---|---|---|---|
| SYN-243 | core/index | M | Motor 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-244 | cli/mcp | M | syn 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 commit | SYN-243 |
| SYN-245 | index/core | M | Arestas 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-246 | cli/mcp/release | L | UI 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.0 | SYN-244 |
4. Performance: medir antes de otimizar
| ID | Layer | Size | Title | DependsOn |
|---|---|---|---|---|
| SYN-227 | ci/index | S | Budgets 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ária | SYN-217 |
| SYN-225 | index | M | Swap 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 disparar | SYN-227 |
5. Ergonomia
| ID | Layer | Size | Title | DependsOn |
|---|---|---|---|---|
| SYN-226 | mcp | S | Tool ú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 comat <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_changesper-field deltas (reusacore::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).
| ID | Layer | Size | Title | DependsOn |
|---|---|---|---|---|
| SYN-256 | cli/mcp | S | Both-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-257 | core/mcp | M | SYN-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-242 | core | M | Contradiçã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 confirm | SYN-223 |
| SYN-250 | core/search | S | Trust 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ável | SYN-241 |
| SYN-252 | docs/mcp | S | Contrato 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).
| # | ID | Size | Title (reformulado) | DependsOn |
|---|---|---|---|---|
| 1 | SYN-260 | S | Hygiene + 2 bugs reais: corrigir PATH do pre-commit fmt (gate inerte); clippy::unwrap_used deny (escalonado); split de queries.rs (ADR-015) | - |
| 2 | SYN-259 | S | Reformulado: 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óprio | SYN-223, SYN-257 |
| 3 | SYN-251 | M | Reformulado: 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 |
| 4 | SYN-254 | S | Reformulado: 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. ADR | SYN-234 |
| 5 | SYN-245 | M | Reformulado: 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 |
| 6 | SYN-255 | S | Anchor-distance reranker reusando graph_rank: bench de recall como pré-condição; se <2-3% MRR, vira no-op de baixa prioridade | SYN-243, SYN-250 |
| 7 | SYN-248 | S | Reformulado: só o eixo profile-vs-log (mutabilidade/decay) por tipo; só endurece o gate; sem matriz write/pii/link. ADR | SYN-234 |
| 8 | SYN-249C | M | Verificaçã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 + ADR | SYN-239 |
| 9 | SYN-258 | M | Reformulado: 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-253 | SYN-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.
| ID | Layer | Size | Title | DependsOn |
|---|---|---|---|---|
| SYN-230 | core/release | L | syn sync: vault sync E2E-criptografado opcional (hospedado + self-hostable). Supersedes #91/#105 | SYN-217 |
| SYN-231 | core | L | Time / workspace compartilhado com edições de IA governadas (por assento): o wedge B2B | SYN-230 |
| SYN-232 | docs/release | S | Declarar fronteira open-core (governança/compliance edition) cedo e transparente | - |
| SYN-233 | core | M | Camada de identidade/CV verificável (atestações assinadas checáveis) | - |
| SYN-235 | mcp | M | MCP 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.
| ID | Layer | Size | Title | Por que aqui |
|---|---|---|---|---|
| SYN-194 | core | M | Async / 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-174 | build/ci | M | Restaurar 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.
| ID | Layer | Size | Title | DependsOn | Source |
|---|---|---|---|---|---|
| SYN-100 | release | M | dist init + workflow gerado; primeiro release real v0.1.0 | SYN-45 | ADR-007 |
| SYN-101 | release | S | Installer shell (curl … | sh) hospedado em Pages | SYN-100 | ADR-007 |
| SYN-102 | release | M | Homebrew tap romulofebasi/synapse | SYN-100 | README v1.0 |
| SYN-103 | release | S | (opcional) Pacote npm para npx synapse | SYN-100 | ADR-007 |
| SYN-104 | docs | M | Política de semver para o schema de frontmatter | SYN-15..22 | governança |
| SYN-105 | core | M | Migration de schema entre versões (forward + reversa básica) | SYN-104 | 01-schema |
| SYN-106 | mcp | M | Congelar a tool surface MCP (toda mudança via ! em commit) | SYN-39..43 | governança |
| SYN-107 | docs | M | MIGRATING.md 0.x → 1.0 | SYN-104 | onboarding |
| SYN-108 | ci | S | Release assinada (cosign ou sigstore) | SYN-100 | segurança |
| SYN-109 | docs | M | Site simples em GitHub Pages (estilo Fumadocs / mdBook) | SYN-100 | adoção |
| SYN-215 | brand/docs | S | Resolver o mascote duplo (Lil Syn × constelação de grafo) antes do freeze de marca; alinhar README/BRAND.md e output/brand.rs | SYN-196 | audit 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) | Title | Por que não está numa fase |
|---|---|---|
| SYN-331 (#90) | Encryption-at-rest do .synapse/index.db | YAGNI no MVP; usuário pode usar disco encriptado |
| SYN-332 (#93) | TUI (ratatui) interativa | terceira 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 MCP | aguardar caso de uso |
| SYN-337 (#106) | Federation remota (syn remote add <git-url>) | aguardar demanda |
| SYN-236 (#225) | Legacy numbering hygiene | Completed allocation SYN-331..337; historical commits retained |
| SYN-238 | Higiene: 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ência | meta-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
- Cada ticket aqui vira issue no GitHub com label
phase:v0.1(etc.) elayer:<camada>. Issues novas devem nascer com formatoSYN-<ID>no título. - Mudar prioridade ou cortar item: editar este arquivo numa PR; sem discussão paralela em Slack/Notion.
- Tickets de mais de 1 dia (
L) devem ganhar uma sub-issue com plano de implementação antes dowip.
Atualizado em 2026-05-24.