claude-mem-lite 3.38.0 → 3.38.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,7 +10,7 @@
10
10
  "plugins": [
11
11
  {
12
12
  "name": "claude-mem-lite",
13
- "version": "3.38.0",
13
+ "version": "3.38.1",
14
14
  "source": "./",
15
15
  "description": "Persistent long-term memory for Claude Code via MCP — captures coding decisions, bugfixes, and context across sessions. Hybrid FTS5 + TF-IDF search with episode batching. Single SQLite DB, no external services. A lighter, lower-cost alternative to claude-mem (episode batching + a smaller model; cost savings are an internal estimate, not a measured benchmark)."
16
16
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-mem-lite",
3
- "version": "3.38.0",
3
+ "version": "3.38.1",
4
4
  "description": "Persistent long-term memory for Claude Code via MCP — captures coding decisions, bugfixes, and context across sessions. Hybrid FTS5 + TF-IDF search with episode batching. Single SQLite DB, no external services. A lighter, lower-cost alternative to claude-mem (episode batching + a smaller model; cost savings are an internal estimate, not a measured benchmark).",
5
5
  "author": {
6
6
  "name": "sdsrss"
package/mem-cli.mjs CHANGED
@@ -2443,16 +2443,34 @@ function cmdCitationStats(db, args) {
2443
2443
  // as the per-project cite rate above; funnel.prior/delta_pt show the direction.
2444
2444
  const funnel = computeCitationFunnelTrend(db, { days });
2445
2445
 
2446
+ // Survivorship-honesty: the per-project rate (cited_count/decay_seen_count over
2447
+ // SURVIVING in-window obs) is doubly biased — GC drops uncited obs from the
2448
+ // denominator and the window excludes older obs — so it overstates adoption (a
2449
+ // project can read 91% while its true lifetime inject→cite is ~6%). citation_log
2450
+ // rows persist across GC, so their per-project sum is the honest historical rate.
2451
+ // Attach both to each row so the text + JSON surface the biased and honest numbers.
2452
+ const funnelByProject = new Map(
2453
+ db.prepare(`SELECT project, COALESCE(SUM(injected_n), 0) inj, COALESCE(SUM(cited_n), 0) cit
2454
+ FROM citation_log GROUP BY project`).all().map(r => [r.project, r])
2455
+ );
2456
+ for (const r of perProject) {
2457
+ const f = funnelByProject.get(r.project);
2458
+ r.funnel_injected = f ? f.inj : 0;
2459
+ r.funnel_cited = f ? f.cit : 0;
2460
+ }
2461
+
2446
2462
  if (json) {
2447
2463
  out(JSON.stringify({ window_days: days, per_project: perProject, decay_queue: decayQueue, promoted, demoted, data_pollution_note: dataPollutionNote, funnel }, null, 2));
2448
2464
  return;
2449
2465
  }
2450
2466
 
2451
2467
  if (dataPollutionNote) out(`Note: ${dataPollutionNote}\n`);
2452
- out(`Cite rate by project (last ${days}d, cited / decay-resolutions):`);
2468
+ out(`Cite rate by project (last ${days}d):`);
2469
+ out(` funnel = lifetime injected→cited (citation_log, GC-durable = honest) · surviving = cited/decay over in-window non-GC'd obs (survivorship-biased, reads high):`);
2453
2470
  for (const r of perProject) {
2454
- const rate = r.resolved > 0 ? (r.cited * 100 / r.resolved).toFixed(1) + '%' : '—';
2455
- out(` ${r.project.padEnd(34)} ${String(rate).padStart(6)} cited:${r.cited}/${r.resolved} at_risk:${r.at_risk}`);
2471
+ const funnelRate = r.funnel_injected > 0 ? (r.funnel_cited * 100 / r.funnel_injected).toFixed(1) + '%' : '—';
2472
+ const survRate = r.resolved > 0 ? (r.cited * 100 / r.resolved).toFixed(1) + '%' : '—';
2473
+ out(` ${r.project.padEnd(30)} funnel ${String(funnelRate).padStart(6)} (${r.funnel_cited}/${r.funnel_injected}) · surviving ${String(survRate).padStart(6)} (${r.cited}/${r.resolved}) · at_risk:${r.at_risk}`);
2456
2474
  }
2457
2475
  out('');
2458
2476
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-mem-lite",
3
- "version": "3.38.0",
3
+ "version": "3.38.1",
4
4
  "description": "Persistent long-term memory for Claude Code via MCP — captures coding decisions, bugfixes, and context across sessions. Hybrid FTS5 + TF-IDF search with episode batching. Single SQLite DB, no external services. A lighter, lower-cost alternative to claude-mem (episode batching + a smaller model; cost savings are an internal estimate, not a measured benchmark).",
5
5
  "type": "module",
6
6
  "packageManager": "npm@10.9.2",