|
| 1 | +const Database = require('better-sqlite3'); |
| 2 | +const db = new Database('tools/observability-hub/telemetry.db'); |
| 3 | + |
| 4 | +console.log('='.repeat(80)); |
| 5 | +console.log('PHASE 2 TUNING ANALYSIS'); |
| 6 | +console.log('='.repeat(80)); |
| 7 | + |
| 8 | +// Before tuning (Phase 2 worker baseline: old queries with gap=10) |
| 9 | +const before = db.prepare(` |
| 10 | + SELECT |
| 11 | + AVG(gap_count) as avg_gaps, |
| 12 | + MIN(gap_count) as min_gaps, |
| 13 | + MAX(gap_count) as max_gaps, |
| 14 | + AVG(quality_score) as avg_quality, |
| 15 | + COUNT(*) as count |
| 16 | + FROM telemetry |
| 17 | + WHERE id <= 21 AND pre_flight_rejected = 0 AND gap_count IS NOT NULL |
| 18 | +`).get(); |
| 19 | + |
| 20 | +// After tuning (latest queries with slice(0,3)) |
| 21 | +const after = db.prepare(` |
| 22 | + SELECT |
| 23 | + AVG(gap_count) as avg_gaps, |
| 24 | + MIN(gap_count) as min_gaps, |
| 25 | + MAX(gap_count) as max_gaps, |
| 26 | + AVG(quality_score) as avg_quality, |
| 27 | + COUNT(*) as count |
| 28 | + FROM telemetry |
| 29 | + WHERE id > 79 AND pre_flight_rejected = 0 AND gap_count IS NOT NULL |
| 30 | +`).get(); |
| 31 | + |
| 32 | +console.log('\nBEFORE TUNING (id 1-21, old algorithm):'); |
| 33 | +console.log(` Count: ${before.count}`); |
| 34 | +console.log(` Avg Gaps: ${before.avg_gaps != null ? before.avg_gaps.toFixed(2) : 'N/A'}`); |
| 35 | +console.log(` Min Gaps: ${before.min_gaps != null ? before.min_gaps : 'N/A'}`); |
| 36 | +console.log(` Max Gaps: ${before.max_gaps != null ? before.max_gaps : 'N/A'}`); |
| 37 | +console.log(` Avg Quality: ${before.avg_quality != null ? before.avg_quality.toFixed(1) : 'N/A'}`); |
| 38 | + |
| 39 | +console.log('\nAFTER TUNING (id > 79, slice(0,3) + resolution 0.7):'); |
| 40 | +console.log(` Count: ${after.count}`); |
| 41 | +console.log(` Avg Gaps: ${after.avg_gaps != null ? after.avg_gaps.toFixed(2) : 'N/A'}`); |
| 42 | +console.log(` Min Gaps: ${after.min_gaps != null ? after.min_gaps : 'N/A'}`); |
| 43 | +console.log(` Max Gaps: ${after.max_gaps != null ? after.max_gaps : 'N/A'}`); |
| 44 | +console.log(` Avg Quality: ${after.avg_quality != null ? after.avg_quality.toFixed(1) : 'N/A'}`); |
| 45 | + |
| 46 | +if (before.avg_gaps && after.avg_gaps) { |
| 47 | + const gapReduction = ((before.avg_gaps - after.avg_gaps) / before.avg_gaps * 100); |
| 48 | + const qualityChange = ((after.avg_quality - before.avg_quality) / before.avg_quality * 100); |
| 49 | + |
| 50 | + console.log('\nIMPACT:'); |
| 51 | + console.log(` Gap Reduction: ${gapReduction.toFixed(1)}% (${before.avg_gaps.toFixed(1)} → ${after.avg_gaps.toFixed(1)})`); |
| 52 | + console.log(` Quality Change: ${qualityChange >= 0 ? '+' : ''}${qualityChange.toFixed(1)}% (${before.avg_quality.toFixed(1)} → ${after.avg_quality.toFixed(1)})`); |
| 53 | + console.log(` Target Met: ${after.avg_gaps <= 3 ? '✅ YES' : '❌ NO'} (target: <3 gaps)`); |
| 54 | +} |
| 55 | + |
| 56 | +// Gap distribution after tuning |
| 57 | +const distribution = db.prepare(` |
| 58 | + SELECT |
| 59 | + gap_count, |
| 60 | + COUNT(*) as count, |
| 61 | + AVG(quality_score) as avg_quality, |
| 62 | + ROUND(COUNT(*) * 100.0 / (SELECT COUNT(*) FROM telemetry WHERE id > 79 AND pre_flight_rejected = 0 AND gap_count IS NOT NULL), 1) as percentage |
| 63 | + FROM telemetry |
| 64 | + WHERE id > 79 AND pre_flight_rejected = 0 AND gap_count IS NOT NULL |
| 65 | + GROUP BY gap_count |
| 66 | + ORDER BY gap_count |
| 67 | +`).all(); |
| 68 | + |
| 69 | +console.log('\nGAP DISTRIBUTION (After Tuning):'); |
| 70 | +console.log('Gaps | Count | % | Avg Quality'); |
| 71 | +console.log('-'.repeat(45)); |
| 72 | +distribution.forEach(row => { |
| 73 | + const quality = row.avg_quality ? row.avg_quality.toFixed(1) : 'N/A'; |
| 74 | + console.log(`${row.gap_count.toString().padStart(4)} | ${row.count.toString().padStart(5)} | ${row.percentage.toString().padStart(3)}% | ${quality}`); |
| 75 | +}); |
| 76 | + |
| 77 | +// Success criteria |
| 78 | +console.log('\n' + '='.repeat(80)); |
| 79 | +console.log('SUCCESS CRITERIA:'); |
| 80 | +console.log('='.repeat(80)); |
| 81 | + |
| 82 | +const criteria = [ |
| 83 | + { name: 'Average gap count < 3', met: after.avg_gaps <= 3, value: after.avg_gaps?.toFixed(2) }, |
| 84 | + { name: 'Gap reduction > 70%', met: before.avg_gaps && after.avg_gaps && ((before.avg_gaps - after.avg_gaps) / before.avg_gaps) >= 0.7, value: before.avg_gaps && after.avg_gaps ? `${(((before.avg_gaps - after.avg_gaps) / before.avg_gaps) * 100).toFixed(1)}%` : 'N/A' }, |
| 85 | + { name: 'Quality maintained (±10%)', met: before.avg_quality && after.avg_quality && Math.abs((after.avg_quality - before.avg_quality) / before.avg_quality) <= 0.1, value: before.avg_quality && after.avg_quality ? `${(((after.avg_quality - before.avg_quality) / before.avg_quality) * 100).toFixed(1)}%` : 'N/A' }, |
| 86 | + { name: 'Majority queries 0-3 gaps', met: distribution.filter(d => d.gap_count <= 3).reduce((sum, d) => sum + d.percentage, 0) >= 50, value: `${distribution.filter(d => d.gap_count <= 3).reduce((sum, d) => sum + d.percentage, 0).toFixed(1)}%` } |
| 87 | +]; |
| 88 | + |
| 89 | +criteria.forEach(c => { |
| 90 | + console.log(`${c.met ? '✅' : '❌'} ${c.name.padEnd(35)} ${c.value || 'N/A'}`); |
| 91 | +}); |
| 92 | + |
| 93 | +const allMet = criteria.every(c => c.met); |
| 94 | +console.log('\n' + '='.repeat(80)); |
| 95 | +console.log(`OVERALL: ${allMet ? '✅ SUCCESS' : '⚠️ PARTIAL SUCCESS'}`); |
| 96 | +console.log('='.repeat(80)); |
| 97 | + |
| 98 | +db.close(); |
0 commit comments