Changelog

Todas as mudanças notáveis do Pinky Brain. Formato baseado em Keep a Changelog; versionamento SemVer.

[Não publicado]

Nada ainda.

[0.1.5] — 2026-07-05

Adicionado

  • pinky update [--check] [--force] — auto-atualização: compara a versão local com o ponteiro VERSION do CDN (comparação numérica) e, se houver uma mais nova, roda o instalador oficial (assinatura minisign + checksum SHA-256) substituindo o binário na sua pasta atual. --check só informa; --force reinstala mesmo assim. Reusa curl/sh, sem novas dependências.
  • Release notes na web: /docs/changelog.html (4 idiomas) gerado a partir deste CHANGELOG.md, mais um badge de versão na landing que leva até lá.

Site

  • Landing com seção "memória inteligente" (conhecimento temporal, sinal de utilidade implícita, grafo Obsidian, sync, 7 tools MCP, qualidade protegida no CI), faixa de métricas medidas (binário, RAM, p95, nDCG) e aba de Documentação.
  • Correções de veracidade: a landing mostrava 3 tools MCP (são 7) e o modelo como ~100 MB (medido: ~450 MB, opcional).

[0.1.4] — 2026-07-04

Três rodadas do plano evolutivo (P5–P8, PRs #16–#47). Schema do índice: v8 (migração destrutiva das tabelas derivadas; reindexe após atualizar — os .md não são tocados).

Qualidade do retrieval

  • Eval v2: matriz de variantes (léxico/híbrido/±rerank/±decay), métricas hit@k + MRR + nDCG, e pinky eval --mine (propõe casos dourados a partir da telemetria real). Gates de CI: 0.9/0.85 com hash-embed, 0.95/0.9 com o modelo.
  • FTS multi-coluna (título/tags/texto com pesos BM25) + snippet() nativo.
  • Chunking heading-aware: o embedding carrega o contexto «título > heading»; corrige de quebra o bug de RRF cumulativo (max-passage por entrada).
  • Stemming Snowball ES/EN/IT/PT em coluna sombra.
  • Decay por antiguidade com half-life por tipo (gotcha 90d, diary 30d, decision/pattern 365d, guide isenta).
  • supersedes + search --as-of: fatos temporais; «o que sabíamos então».

Ciclo do agente

  • MCP: brain_feedback, brain_update, brain_delete (arquiva em .archive/), brain_similar, anti-duplicado em brain_save, e resources pinky://entry/….
  • Hooks: session-start com delta e top reais, pre-* registram uso com session_id, post-bash («você já pisou nessa mina»), stop extrai decisões/commits do transcript e correlaciona utilidade implícita (o que o agente de fato releu → useful=1).
  • pinky stats --value: relatório de valor (uso real, utilidade confirmada, ruído).
  • pinky new (templates por tipo), pinky review (triagem em lote), dedup v2 (centroide + MinHash léxico).

Produto e operação

  • pinky snapshot/restore: backup verificável (tar.gz + manifest SHA-256, verify-then-write, destino fora da árvore de trabalho).
  • pinky sync v2: auto-commit sem versionar brain.db, rebase com auto-resolução de conflitos de diaries e frontmatter.
  • pinky bench: benchmarks reproduzíveis (1k→8.7ms · 10k→53ms · 100k→495ms p95); veja docs/BENCHMARKS.md.
  • pinky doctor --airgap: verifica operação 100% offline (falha se algo precisaria de rede).
  • docs/VERSIONING.md + rejeição de downgrade: um binário antigo sobre um índice de schema mais novo agora falha claro em vez de operar em silêncio.
  • Config central ~/.pinky/config.toml (camada fina); pinky init --demo.
  • i18n completa (ES/EN/IT/PT) também em MCP e hooks; catálogo compartilhado.

Segurança e supply chain

  • Criptografia do índice opt-in (encrypted-index, SQLCipher + PINKY_INDEX_KEY); veja docs/SECURITY.md.
  • cargo-deny (deny.toml) no CI, binários auditáveis (`cargo auditable), **SBOM CycloneDX** por release, **actions fixadas por SHA**, publish = false`.
  • Builds reproduzíveis: rust-toolchain.toml (1.96.1) + remap-path-prefix + um job de CI que compila 2× e compara o sha256.

Interop

  • Obsidian: os [[wikilinks]] são analisados ao indexar (schema v8, tabela link); pinky search --links aplica um boost 1-hop opt-in; pinky lint reporta wikilinks quebrados como warning (tolerante).

Infra de release

  • CI de deploy do site + publicação assinada (minisign) no R2, monitoramento do CDN, e scripts/release-local.sh para cortar releases sem GitHub Actions.

[0.1.3] — 2026-07-03

Adicionado

  • pinky init integra o Claude Code de verdade: instala a regra use-pinky-brain.md em .claude/rules/ e a conecta via @import no CLAUDE.md (--global para ~/.claude/); faz merge dos hooks em .claude/settings.json (com confirmação; --hooks/--no-hooks); e baixa o modelo de embeddings durante o init para que o primeiro reindex seja instantâneo (--no-model para pular). Novas flags: --force, --global, --hooks, --no-hooks, --no-model.

Corrigido

  • pinky-hooks stop: o evento Stop do Claude Code não envia author/summary (o hook os lia e o diary sempre saía vazio/inútil). Agora lê transcript_path e extrai o resumo da última mensagem do assistente.
  • Landing: os exemplos de comandos (query do hero, linhas de resultado, exemplo de pinky search) agora mudam com o idioma escolhido (ES/EN/IT/PT).

[0.1.2] — 2026-07-03

Adicionado

  • CLI multi-idioma (ES/EN/IT/PT): pinky localiza o --help completo e todas as mensagens/erros. O idioma é resolvido por PINKY_LANG~/.config/pinky/config → locale do sistema (LANG) → es.
  • install.sh pergunta o idioma da CLI ao instalar (ou pega de PINKY_LANG) e salva em ~/.config/pinky/config.
  • Documentação web multi-idioma (pinkybrain.dev/docs, ES/EN/IT/PT) gerada a partir dos .md com make docs.

[0.1.1] — 2026-07-03

Só web/branding — o código dos binários não mudou em relação à 0.1.0.

  • Landing pública em pinkybrain.dev (Cloudflare Pages), multi-idioma (ES/EN/IT/PT) com seletor, logo próprio (grade de chunks), faixa de métricas de tokens medidas, seção de benefícios e contato contact@pinkybrain.dev.

[0.1.0] — 2026-07-03

Primeiro release. Motor de conhecimento local (Fases 0–3 + P0–P4). Veja docs/PROD-ROADMAP.md para o detalhe por fase.

Integridade de dados (P4)

  • Identidade da entrada por (scope, path) (schema v2). O id deriva de stable_id(scope, path) e há UNIQUE(scope, path): o mesmo caminho relativo em dois scopes (ex. diary/2026-06-30.md global e de projeto) já não colide nem se sobrescreve na PK. Migração v1→v2 automática (reconstrói tabelas derivadas) com aviso visível pedindo para reindexar (o brain nunca fica "vazio" em silêncio), e selo de versão só para frente (um binário antigo não degrada um índice mais novo).
  • type consistente leitura↔escrita: normalizado (trim + minúsculas) tanto ao indexar quanto ao filtrar, e no scope do brain_search um nome puro é interpretado como project:<name>. Cap absoluto de candidatos na busca.
  • Reindex incremental por (scope, path): o hash não cruza mais entre scopes (antes pulava ou sobrescrevia entradas homônimas de outro scope).
  • Limpeza de telemetria ao apagar/reescrever uma entrada (usage não deixa mais linhas órfãs que enviesam a poda).
  • Limite de tamanho de arquivo ao indexar (5 MB): um .md gigante é pulado com aviso em vez de OOM (defesa em reindex/watch/sync).

Retrieval

  • Guarda de query sem termos: uma consulta só de pontuação/símbolos agora retorna vazio em vez de ruído (o vetor zero trazia chunks arbitrários com score > 0).
  • fetch deriva do limit: pedir um limit alto não trunca mais o recall em silêncio.
  • chunk_body mede em caracteres (não bytes): chunking consistente com texto acentuado ES/IT.
  • Frontmatter YAML inválido não é mais descartado em silêncio: emite um warn (e pinky lint o pega).

DX e produto

  • --version nos três binários e em pinky doctor.
  • --json em todos os comandos com saída em stdout (reindex, eval, dedup, stale, telemetry, save, backlinks); em search também desativa a telemetria (uso programático).
  • PINKY_DB/PINKY_HASH_EMBED respeitadas pela CLI (antes as ignorava): a CLI e o agente veem a mesma base. Precedência: flag > env > default.
  • Comandos somente-leitura falham claro se o índice não existe (antes criavam um vazio e reportavam "0 entradas").
  • Erros acionáveis no primeiro uso (modelo não carregou → sugere --hash-embed).
  • Validação de type contra o conjunto canônico em save/brain_save (normaliza maiúsculas; rejeita typos que criariam entradas não filtráveis).
  • pinky completions {bash,zsh,fish} (autocompletar) e caps de input em brain_search (limit clamp 1..100), filtro scope, brain_stats enriquecido (modelo + detalhamento por tipo).
  • brain_save não deixa .md órfão se a indexação falhar; um JSON-RPC ilegível responde parse error (-32700) em vez de ser ignorado.

Hooks

  • Orçamento de tempo (800 ms) em pre-read/pre-write: degradam para no-op em vez de bloquear uma tool do Claude Code.
  • Não criam DB fantasma: se não há índice, o hook é no-op (antes sujava cada repo).
  • Diary append atômico (O_APPEND): stops concorrentes não se sobrescrevem mais.
  • Exemplo de registro versionado em hooks/settings.example.json.

Qualidade, CI e empacotamento

  • CI roda o eval como gate de relevância (falha o build ante regressão de ranking), com golden ampliado para 13 casos (ES + IT, paráfrases) e matriz de OS (Linux + macOS).
  • Release com --locked (reproduzível) + checksums SHA256 por artefato.
  • install.sh (curl | sh): detecta OS/arch, verifica checksum e instala os 3 binários.
  • Documentação de produto: README orientado a conversão, docs/INSTALL.md, docs/CONFIGURATION.md.
  • Cobertura nova: migração de schema, reindex multi-scope, validação de type, rerank.

Adicionado (core)

  • Integridade de dados (P0): versionamento de schema (`PRAGMA user_version + tabela meta); guarda do modelo de embeddings (Embedder::model_id() + reconcile_model/check_model) que evita misturar vetores de modelos diferentes; busy_timeout` para concorrência CLI + MCP + hooks.
  • Multi-projeto (P0): filtros de metadados (scope/project/type/tags) na busca, expostos em pinky search --project/--type/--tag e em brain_search.
  • Operabilidade (P1): logging com tracing em stderr (PINKY_LOG); CI no GitHub Actions (fmt + clippy -D warnings + testes + E2E reais).
  • Hooks rápidos (P1): search::lexical (BM25) para pre-read/pre-write sem carregar o modelo; FastEmbedder::new() tenta de novo ante contenção do lock do cache; telemetria de uso também de brain_search.
  • Produto (P2): pinky init (scaffolding + registro MCP relocável em .mcp.json); pinky lint (valida frontmatter, exit ≠0 ante erros); --json em search/stats/doctor; pinky doctor reforçado (schema, modelo do índice vs. ativo); caps de input no MCP; LICENSE (MIT).

Corrigido

  • brain_save indexava com o scope do server e ignorava o project do argumento (não filtrável); agora consistente com pinky save.
  • pinky stats carregava o modelo de embeddings sem precisar.
  • Contenção de save na raiz (defesa em profundidade).

Base (núcleo inicial)

Índice SQLite híbrido (FTS5 + sqlite-vec, RRF), CLI pinky, servidor MCP, hooks do Claude Code, e manutenção (dedup, staleness, backlinks, rollups, eval).