test-adaptive-weights.js•5.74 kB
#!/usr/bin/env node
/**
* Test Adaptive Memory Weight Adjustment
* Tests the new dynamic weight adjustment based on memory age distribution
*/
const { analyzeMemoryAgeDistribution, calculateAdaptiveGitWeight } = require('./utilities/memory-scorer');
console.log('=== ADAPTIVE WEIGHT ADJUSTMENT TEST ===\n');
// Scenario 1: Stale memory set (your actual problem)
console.log('📊 Scenario 1: Stale Memory Set (Median > 30 days)');
console.log('─'.repeat(80));
const staleMemories = [
{ created_at_iso: new Date(Date.now() - 60 * 24 * 60 * 60 * 1000).toISOString(), content: 'Old README work' },
{ created_at_iso: new Date(Date.now() - 54 * 24 * 60 * 60 * 1000).toISOString(), content: 'Old wiki docs' },
{ created_at_iso: new Date(Date.now() - 24 * 24 * 60 * 60 * 1000).toISOString(), content: 'Contributing guide' },
{ created_at_iso: new Date(Date.now() - 57 * 24 * 60 * 60 * 1000).toISOString(), content: 'GitHub issue work' },
{ created_at_iso: new Date(Date.now() - 52 * 24 * 60 * 60 * 1000).toISOString(), content: 'Old PR merge' },
];
const ageAnalysis1 = analyzeMemoryAgeDistribution(staleMemories, { verbose: true });
console.log('\n🔍 Analysis Results:');
console.log(` Median Age: ${Math.round(ageAnalysis1.medianAge)} days`);
console.log(` Average Age: ${Math.round(ageAnalysis1.avgAge)} days`);
console.log(` Recent Count: ${ageAnalysis1.recentCount}/${ageAnalysis1.totalCount} (${Math.round(ageAnalysis1.recentCount/ageAnalysis1.totalCount*100)}%)`);
console.log(` Is Stale: ${ageAnalysis1.isStale ? '✅ YES' : '❌ NO'}`);
if (ageAnalysis1.recommendedAdjustments.reason) {
console.log('\n💡 Recommended Adjustments:');
console.log(` Reason: ${ageAnalysis1.recommendedAdjustments.reason}`);
console.log(` Time Decay Weight: 0.25 → ${ageAnalysis1.recommendedAdjustments.timeDecay}`);
console.log(` Tag Relevance Weight: 0.35 → ${ageAnalysis1.recommendedAdjustments.tagRelevance}`);
}
// Test adaptive git weight with recent commits but stale memories
const gitContext1 = {
recentCommits: [
{ date: new Date(Date.now() - 1 * 24 * 60 * 60 * 1000).toISOString(), message: 'chore: bump version to v8.5.0' },
{ date: new Date(Date.now() - 1 * 24 * 60 * 60 * 1000).toISOString(), message: 'fix: sync script import path' },
]
};
const gitWeightResult1 = calculateAdaptiveGitWeight(gitContext1, ageAnalysis1, 1.8, { verbose: true });
console.log('\n⚙️ Adaptive Git Weight:');
console.log(` Configured Weight: 1.8x`);
console.log(` Adaptive Weight: ${gitWeightResult1.weight.toFixed(1)}x`);
console.log(` Adjusted: ${gitWeightResult1.adjusted ? '✅ YES' : '❌ NO'}`);
console.log(` Reason: ${gitWeightResult1.reason}`);
// Scenario 2: Recent memory set
console.log('\n\n📊 Scenario 2: Recent Memory Set (All memories < 14 days)');
console.log('─'.repeat(80));
const recentMemories = [
{ created_at_iso: new Date(Date.now() - 3 * 24 * 60 * 60 * 1000).toISOString(), content: 'Recent HTTP fix' },
{ created_at_iso: new Date(Date.now() - 5 * 24 * 60 * 60 * 1000).toISOString(), content: 'Dark mode feature' },
{ created_at_iso: new Date(Date.now() - 4 * 24 * 60 * 60 * 1000).toISOString(), content: 'ChromaDB removal' },
{ created_at_iso: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(), content: 'Memory optimization' },
{ created_at_iso: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString(), content: 'Token savings' },
];
const ageAnalysis2 = analyzeMemoryAgeDistribution(recentMemories, { verbose: true });
console.log('\n🔍 Analysis Results:');
console.log(` Median Age: ${Math.round(ageAnalysis2.medianAge)} days`);
console.log(` Average Age: ${Math.round(ageAnalysis2.avgAge)} days`);
console.log(` Recent Count: ${ageAnalysis2.recentCount}/${ageAnalysis2.totalCount} (${Math.round(ageAnalysis2.recentCount/ageAnalysis2.totalCount*100)}%)`);
console.log(` Is Stale: ${ageAnalysis2.isStale ? '✅ YES' : '❌ NO'}`);
const gitContext2 = {
recentCommits: [
{ date: new Date(Date.now() - 1 * 24 * 60 * 60 * 1000).toISOString(), message: 'chore: bump version' },
]
};
const gitWeightResult2 = calculateAdaptiveGitWeight(gitContext2, ageAnalysis2, 1.8, { verbose: true });
console.log('\n⚙️ Adaptive Git Weight:');
console.log(` Configured Weight: 1.8x`);
console.log(` Adaptive Weight: ${gitWeightResult2.weight.toFixed(1)}x`);
console.log(` Adjusted: ${gitWeightResult2.adjusted ? '✅ YES' : '❌ NO'}`);
console.log(` Reason: ${gitWeightResult2.reason}`);
// Summary
console.log('\n\n✅ Test Summary:');
console.log('─'.repeat(80));
console.log('Expected Behavior:');
console.log(' 1. Stale memories (median > 30d) should trigger auto-calibration');
console.log(' → Increase time decay weight, reduce tag relevance weight');
console.log(' 2. Recent commits + stale memories should reduce git weight');
console.log(' → Prevents old git memories from dominating');
console.log(' 3. Recent commits + recent memories should keep git weight');
console.log(' → Git context is relevant and aligned');
console.log('\nActual Results:');
console.log(` ✅ Scenario 1: ${ageAnalysis1.isStale ? 'Auto-calibrated weights' : 'ERROR: Should calibrate'}`);
console.log(` ✅ Scenario 1 Git: ${gitWeightResult1.adjusted ? 'Reduced git weight from 1.8 to ' + gitWeightResult1.weight.toFixed(1) : 'ERROR: Should adjust'}`);
console.log(` ✅ Scenario 2: ${!ageAnalysis2.isStale ? 'No calibration needed' : 'ERROR: Should not calibrate'}`);
console.log(` ✅ Scenario 2 Git: ${!gitWeightResult2.adjusted ? 'Kept git weight at 1.8' : 'ERROR: Should not adjust'}`);
console.log('\n🎉 Dynamic weight adjustment is working as expected!');