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 ponteiroVERSIONdo 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.--checksó informa;--forcereinstala mesmo assim. Reusacurl/sh, sem novas dependências.- Release notes na web:
/docs/changelog.html(4 idiomas) gerado a partir desteCHANGELOG.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 embrain_save, e resourcespinky://entry/…. - Hooks:
session-startcom delta e top reais,pre-*registram uso comsession_id,post-bash(«você já pisou nessa mina»),stopextrai 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 syncv2: auto-commit sem versionarbrain.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); vejadocs/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); vejadocs/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, tabelalink);pinky search --linksaplica um boost 1-hop opt-in;pinky lintreporta 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.shpara cortar releases sem GitHub Actions.
[0.1.3] — 2026-07-03
Adicionado
pinky initintegra o Claude Code de verdade: instala a regrause-pinky-brain.mdem.claude/rules/e a conecta via@importnoCLAUDE.md(--globalpara~/.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 primeiroreindexseja instantâneo (--no-modelpara pular). Novas flags:--force,--global,--hooks,--no-hooks,--no-model.
Corrigido
pinky-hooks stop: o eventoStopdo Claude Code não enviaauthor/summary(o hook os lia e o diary sempre saía vazio/inútil). Agora lêtranscript_pathe 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):
pinkylocaliza o--helpcompleto e todas as mensagens/erros. O idioma é resolvido porPINKY_LANG→~/.config/pinky/config→ locale do sistema (LANG) →es. install.shpergunta o idioma da CLI ao instalar (ou pega dePINKY_LANG) e salva em~/.config/pinky/config.- Documentação web multi-idioma (
pinkybrain.dev/docs, ES/EN/IT/PT) gerada a partir dos.mdcommake 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 contatocontact@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). Oidderiva destable_id(scope, path)e háUNIQUE(scope, path): o mesmo caminho relativo em dois scopes (ex.diary/2026-06-30.mdglobal 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). typeconsistente leitura↔escrita: normalizado (trim + minúsculas) tanto ao indexar quanto ao filtrar, e no scope dobrain_searchum nome puro é interpretado comoproject:<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 (
usagenão deixa mais linhas órfãs que enviesam a poda). - Limite de tamanho de arquivo ao indexar (5 MB): um
.mdgigante é pulado com aviso em vez de OOM (defesa emreindex/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).
fetchderiva dolimit: pedir umlimitalto não trunca mais o recall em silêncio.chunk_bodymede 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(epinky linto pega).
DX e produto
--versionnos três binários e empinky doctor.--jsonem todos os comandos com saída em stdout (reindex, eval, dedup, stale, telemetry, save, backlinks); emsearchtambém desativa a telemetria (uso programático).PINKY_DB/PINKY_HASH_EMBEDrespeitadas 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
typecontra o conjunto canônico emsave/brain_save(normaliza maiúsculas; rejeita typos que criariam entradas não filtráveis). pinky completions {bash,zsh,fish}(autocompletar) e caps de input embrain_search(limitclamp 1..100), filtroscope,brain_statsenriquecido (modelo + detalhamento por tipo).brain_savenão deixa.mdórfão se a indexação falhar; um JSON-RPC ilegível respondeparse 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
+ tabelameta); 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 empinky search --project/--type/--tage embrain_search. - Operabilidade (P1): logging com
tracingem stderr (PINKY_LOG); CI no GitHub Actions (fmt + clippy-D warnings+ testes + E2E reais). - Hooks rápidos (P1):
search::lexical(BM25) parapre-read/pre-writesem carregar o modelo;FastEmbedder::new()tenta de novo ante contenção do lock do cache; telemetria de uso também debrain_search. - Produto (P2):
pinky init(scaffolding + registro MCP relocável em.mcp.json);pinky lint(valida frontmatter, exit ≠0 ante erros);--jsonemsearch/stats/doctor;pinky doctorreforçado (schema, modelo do índice vs. ativo); caps de input no MCP;LICENSE(MIT).
Corrigido
brain_saveindexava com o scope do server e ignorava oprojectdo argumento (não filtrável); agora consistente compinky save.pinky statscarregava o modelo de embeddings sem precisar.- Contenção de
savena 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).