Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"name": "sensegrep",
"source": "./plugin/sensegrep-plugin",
"description": "Semantic code search for AI agents. Search code by meaning, not text patterns. Adds sensegrep MCP tools + smart usage instructions to Claude Code.",
"version": "1.17.2",
"version": "1.17.3",
"author": {
"name": "sensegrep"
},
Expand Down
2 changes: 1 addition & 1 deletion .cursor-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"name": "sensegrep",
"source": "plugin/sensegrep-cursor",
"description": "Semantic code search for AI agents. Search code by meaning, not text patterns.",
"version": "1.17.2"
"version": "1.17.3"
}
]
}
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,10 @@ for Ollama, HTTP requests use `httpBatchSize` (default 16), including splits ins
each index batch. Request estimates exclude retries; dry runs do not subtract
vectors that will be reused. Other providers retain approximate request estimates.

### Search evidence and context

Search preserves diverse file anchors while admitting complementary symbols and bounded local helper expansion. `context` defaults to **12,000 estimated output tokens**; use 4,000 for a compact pack or 8,000 for broader investigation. Explicit file/token limits remain respected. Weak-evidence warnings are advisory, not proof that code is absent. See [search quality and budgets](docs/search-quality.md) for behavior, limitations, and a reproducible comparison script.

### Index compatibility

Each index records the embedding provider, model, dimension, distance metric, and a non-secret endpoint/configuration fingerprint. If you change provider, model, base URL, dimension, local server pooling behavior, or task-prefix strategy, rebuild the index with `sensegrep index --root . --full --no-watch`. Same dimension does **not** make embeddings interchangeable; two 768-dimensional models still produce different vector spaces.
Expand Down
62 changes: 62 additions & 0 deletions docs/avaliacao-qualidade-busca.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# Avaliação das correções de busca e contexto

Data: 24/09/2026. Baseline: CLI global 1.17.2. Candidato: build local com as alterações de qualidade, ainda sem publicação. Nenhuma integração Jev foi adicionada.

## Ambiente e método

O índice original do CuraAI estava desatualizado. A comparação final usa uma cópia isolada dos arquivos atuais, incluindo código ainda não rastreado pelo Git, e um índice incremental atualizado apenas nessa cópia: **940 arquivos, 6.513 chunks**, verificação estrita sem alterações, ausências ou remoções pendentes. O índice do projeto original foi preservado.

Modelo: Ollama `qwen3-embedding:0.6b`, 1.024 dimensões. Ambas as CLIs consultaram a mesma snapshot: `chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429`.

Conjunto principal: 28 perguntas positivas (22 históricas e seis controles/perguntas adicionais), quatro negativas e nove contextos. Onze perguntas positivas têm alvos explícitos por símbolo; as demais preservam os alvos históricos por arquivo. Contextos cobrem saldo mínimo, autenticação e voz com 1.200, 4.000 e 8.000 tokens.

A execução alternou a ordem das CLIs. As 28 buscas positivas do candidato confirmaram cache de embedding aquecido nos diagnósticos. Tempos abaixo são de processo completo, não apenas da busca vetorial. São medições de uma passagem, não intervalos estatísticos de confiança. Os resultados medem as alterações combinadas; não isolam causalmente o ganho de cada heurística.

## Resultado principal

| Métrica | 1.17.2 | Candidato |
|---|---:|---:|
| Arquivo esperado no top 5 | 26/28 | 26/28 |
| Arquivo esperado no top 10 | 27/28 | 28/28 |
| Símbolo esperado no top 5 | 8/11 | 10/11 |
| Símbolo esperado no top 10 | 8/11 | 11/11 |
| Símbolo central presente nos nove contextos | 6/9 | 9/9 |
| Consultas negativas com aviso de evidência fraca | 0/4 | 3/4 |
| Avisos indevidos nas 28 perguntas positivas | 0 | 0 |
| Latência mediana | 2.536 ms | 2.828 ms |
| Latência p95 | 3.415 ms | 3.615 ms |

O custo mediano adicional foi de 292 ms (aproximadamente 11,5%). A expansão não faz novas chamadas de embedding.

## Casos que motivaram a mudança

- **Saldo mínimo em inglês:** `shouldIgnoreMinimumPayout` saiu de ausente no top 10 para primeiro lugar. Também passou a ser o primeiro trecho nos três orçamentos de contexto.
- **Saldo mínimo em português:** a função saiu de ausente no top 10 para quarto lugar. A preferência por implementação preserva a relevância do arquivo, evitando que telas com mais palavras correspondentes desloquem o módulo de regras.
- **Constante como alvo:** `MAX_SMALL_BALANCE_AGE_MS` permaneceu em primeiro na pergunta explícita sobre seu valor.
- **Criptografia ampla:** `encryptPayoutDestination` saiu de ausente no top 10 para nono lugar. A recuperação melhorou; esse caso ainda não alcança o top 5. Não há alegação de recuperação perfeita.
- **Contexto de criptografia:** nos testes adicionais de 4.000 e 8.000 tokens, ambos os helpers (`encryptPayoutDestination` e `decryptPayoutDestination`) aparecem com código. O helper de criptografia, antes omitido em ambos os orçamentos, passou a ser o quinto trecho.
- **Autenticação e voz:** os helpers centrais continuaram nos contextos pequenos; os nove contextos do conjunto principal passaram a colocar o alvo em primeiro lugar.
- **Kubernetes/Kafka/EKS:** passou a receber aviso de evidência fraca. A consulta sobre Terraform/Neptune continuou `not-assessed`: termos genéricos compartilhados ainda podem impedir o aviso conservador. `not-assessed` não afirma suficiência.

## Decisão sobre tokens

O padrão de `context`/`audit` já era **12.000 tokens** e foi mantido. Os 1.200 tokens eram um teste de estresse. Para uso com orçamento explícito, 4.000 é uma opção compacta e 8.000 acomoda investigação entre arquivos. A seleção foi corrigida também sob 1.200, sem depender apenas de aumentar o teto.

## Validação automatizada e reprodução

- Build e typecheck de todos os workspaces: aprovados.
- Vitest: **266 testes aprovados, em 46 arquivos**.
- Consistência de versões: aprovada; a versão publicada não foi alterada.
- Testes novos cobrem diversidade, constantes, implementação, limites de tokens, projeção JSON, português, imports com alias, escopo de arquivos, ambiguidade, cancelamento, timeout de banco e fontes desatualizadas.

Dados principais: [CSV por caso](benchmarks/search-quality-2026-09-24.csv) e [totais JSON](benchmarks/search-quality-2026-09-24.json).

A saída com conteúdo de código foi validada separadamente: **11/11 contextos contêm o símbolo esperado**, contra 6/11 no baseline, e todos respeitam os limites de tokens e bytes. O CSV reúne 28 buscas positivas, quatro negativas e esses 11 contextos (43 casos distintos). Os totais JSON resumem apenas as buscas. Os ajustes finais da seleção de contexto não alteram o caminho de busca sem orçamento usado na medição de latência principal.

Casos e executor: `scripts/fixtures/search-quality-curaai.json`, `scripts/fixtures/search-quality-context-curaai.json` e `scripts/evaluate-search-quality.mjs`. O segundo manifesto inclui conteúdo de código no JSON e dois contextos adicionais de criptografia. Veja comandos e limitações em [search-quality.md](search-quality.md).

O indicador de evidência permanece heurístico, sem calibração probabilística. A avaliação usa um repositório e um modelo de embeddings; não comprova generalização para todos os idiomas, modelos ou bases de código. A expansão estrutural é limitada a um salto em chamadas locais JS/TS, e não substitui um grafo completo ou análise de tipos.

## Controle sem cache

Três perguntas foram repetidas com cache de embedding desativado, confirmando uma requisição ao Ollama por busca. Tempos baseline/candidato: criptografia 5.736/3.145 ms; saldo mínimo 3.804/3.966 ms; Clerk 3.352/3.384 ms. Essa amostra pequena e variável não sustenta uma alegação de aceleração; a comparação principal com cache aquecido é mais adequada para observar o custo da seleção e expansão.
44 changes: 44 additions & 0 deletions docs/benchmarks/search-quality-2026-09-24.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
"case","expectedFile","expectedSymbol","contextTokens","projection","baselineFileRank","candidateFileRank","baselineSymbolRank","candidateSymbolRank","baselineMs","candidateMs","baselineSufficiency","candidateSufficiency","snapshot"
"auth-en","apps/web/lib/auth/syncClerkRoleSession.ts",,,"diagnostic","4","4",,,"2536","2660","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"auth-pt","apps/web/lib/auth/syncClerkRoleSession.ts",,,"diagnostic","2","2",,,"2918","3396","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"payment","convex/actions/livekit.ts",,,"diagnostic","2","2",,,"2320","2785","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"consent","convex/lib/patientConsent.ts",,,"diagnostic","4","4",,,"3416","3615","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"email","convex/lib/resend.ts",,,"diagnostic","1","2",,,"2277","2197","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"calendar","convex/mutations/googleCalendarWatch.ts",,,"diagnostic","2","2",,,"2516","2411","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"bridge","convex/lib/agentBridgePrompt.ts",,,"diagnostic","4","4",,,"2509","2907","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"webhook","convex/http.ts",,,"diagnostic","1","1",,,"2389","2324","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"sms-format","convex/lib/gtiSms.ts",,,"diagnostic","1","1",,,"2217","2080","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"sms-timeout","convex/lib/gtiSms.ts",,,"diagnostic","1","1",,,"2156","2170","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"voice-race","convex/mutations/agentBridge.ts",,,"diagnostic","6","6",,,"3391","3352","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"signed-pdf","convex/lib/prescriptionDelivery.ts",,,"diagnostic","2","2",,,"2299","2631","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"calendar-token","convex/mutations/doctors.ts",,,"diagnostic","3","3",,,"2787","2804","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"consent-pt","convex/lib/patientConsent.ts",,,"diagnostic","4","4",,,"2795","3177","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"privacy","apps/web/lib/analytics/posthog.ts",,,"diagnostic","1","1",,,"2141","2093","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"refund","convex/actions/asaas.ts",,,"diagnostic","1","1",,,"2326","2828","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"pix-crypto","convex/lib/payoutDestinationCrypto.ts","encryptPayoutDestination",,"diagnostic","0","9","0","9","2582","2853","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"payout-hold","convex/lib/payoutPolicy.ts","getCommissionHoldMs",,"diagnostic","2","2","2","2","3129","3475","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"credit-reuse","convex/lib/consultationCreditRedemption.ts","applyAvailableCreditForPatientConsultation",,"diagnostic","1","2","1","2","3207","3098","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"seed-auth","convex/mutations/medicalStore.ts",,,"diagnostic","2","2",,,"2391","2263","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"voice-draft","convex/lib/agentBridgePrompt.ts","formatDoctorRequestPayload",,"diagnostic","1","4","1","4","3342","3275","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"payout-minimum","convex/lib/payoutPolicy.ts","shouldIgnoreMinimumPayout",,"diagnostic","1","1","0","1","3324","3558","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"constant-control","convex/lib/payoutPolicy.ts","MAX_SMALL_BALANCE_AGE_MS",,"diagnostic","1","1","1","1","3179","3053","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"minimum-pt","convex/lib/payoutPolicy.ts","shouldIgnoreMinimumPayout",,"diagnostic","4","4","0","4","3415","3653","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"voice-concurrency","convex/mutations/agentBridge.ts","markContextConsumed",,"diagnostic","1","1","1","1","3175","3030","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"heldout-cancel","convex/mutations/agentBridge.ts","markContextConsumed",,"diagnostic","3","2","3","2","2531","2479","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"heldout-crypto","convex/lib/payoutDestinationCrypto.ts","decryptPayoutDestination",,"diagnostic","3","3","3","3","2055","2271","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"heldout-clerk","apps/web/lib/auth/syncClerkRoleSession.ts","syncClerkRoleSession",,"diagnostic","1","1","1","1","3044","3172","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"negative-0",,,,"diagnostic",,,,,"2002","2215","not-assessed","weak-evidence","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"negative-1",,,,"diagnostic",,,,,"1938","1869","not-assessed","weak-evidence","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"negative-2",,,,"diagnostic",,,,,"1949","2124","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"negative-3",,,,"diagnostic",,,,,"1654","2058","not-assessed","weak-evidence","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"context-payout-minimum-1200","convex/lib/payoutPolicy.ts","shouldIgnoreMinimumPayout","1200","content+diagnostic","2","1","0","1","3220","3700","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"context-payout-minimum-4000","convex/lib/payoutPolicy.ts","shouldIgnoreMinimumPayout","4000","content+diagnostic","3","1","0","1","3688","3750","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"context-payout-minimum-8000","convex/lib/payoutPolicy.ts","shouldIgnoreMinimumPayout","8000","content+diagnostic","3","1","0","1","3618","3735","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"context-auth-en-1200","apps/web/lib/auth/syncClerkRoleSession.ts","syncClerkRoleSession","1200","content+diagnostic","1","1","1","1","2216","2592","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"context-auth-en-4000","apps/web/lib/auth/syncClerkRoleSession.ts","syncClerkRoleSession","4000","content+diagnostic","2","1","2","1","2484","2647","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"context-auth-en-8000","apps/web/lib/auth/syncClerkRoleSession.ts","syncClerkRoleSession","8000","content+diagnostic","2","1","2","1","2487","2657","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"context-voice-draft-1200","convex/lib/agentBridgePrompt.ts","formatDoctorRequestPayload","1200","content+diagnostic","1","1","1","1","3048","3325","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"context-voice-draft-4000","convex/lib/agentBridgePrompt.ts","formatDoctorRequestPayload","4000","content+diagnostic","2","1","2","1","3257","3444","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"context-voice-draft-8000","convex/lib/agentBridgePrompt.ts","formatDoctorRequestPayload","8000","content+diagnostic","3","1","3","1","3695","3816","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"context-crypto-4000","convex/lib/payoutDestinationCrypto.ts","encryptPayoutDestination","4000","content+diagnostic","0","2","0","5","2678","2914","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
"context-crypto-8000","convex/lib/payoutDestinationCrypto.ts","encryptPayoutDestination","8000","content+diagnostic","0","2","0","5","2720","2881","not-assessed","not-assessed","chunks_1790256700685_d9b6a21f8dfd4e0a907b5ffcba9c11fb:1790256707429"
25 changes: 25 additions & 0 deletions docs/benchmarks/search-quality-2026-09-24.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"cache": "existing",
"totals": {
"baseline": {
"searches": 28,
"fileTop5": 26,
"symbolCases": 11,
"symbolTop5": 8,
"medianMs": 2536,
"p95Ms": 3415,
"falseWeakWarnings": 0,
"negativesFlagged": 0
},
"candidate": {
"searches": 28,
"fileTop5": 26,
"symbolCases": 11,
"symbolTop5": 10,
"medianMs": 2828,
"p95Ms": 3615,
"falseWeakWarnings": 0,
"negativesFlagged": 3
}
}
}
Loading
Loading