OverviewFilesCommitsIssuesDocsReleasesPeers

knowledge-ratchet commits / c026850

Add educational context to all dashboard elements
Every chart, card, table, and section now explains what it measures, which direction is good, and what it means. Show trend charts with 1+ data points instead of requiring 2+. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
c026850cdbae309425c6ce0a9d7327620cd4ceb7
by plankatron <fleeky@gmail.com> · 2026-04-07T23:40:29.000Z

Changed files (1) +15 -11

dashboard.js +15 -11
……@@ -243,7 +243,7 @@ ${liveSession && liveSession.turns > 0 ? `
243243 <div style="display: flex; gap: 32px; align-items: baseline;">
244244 <div><span class="big-number ${liveColor}">${liveScore}</span><span class="dim"> score</span></div>
245245 <div><span class="green" style="font-size:20px">${liveSession.approvals} approved</span> <span class="red" style="font-size:20px">${liveSession.corrections} corrected</span><span class="dim"> in ${liveSession.turns} turns</span></div>
246 <div><span class="dim">${liveSession.toolCalls} tools</span></div>
246 <div><span class="dim">${liveSession.toolCalls} tool calls</span></div>
247247 <div><span class="${liveTrajColor}">${liveTraj}</span></div>
248248 ${liveLearningRate !== null ? `<div><span class="${liveLearningColor}" style="font-size:18px">${liveLearningStr}</span></div>` : ''}
249249 </div>
……@@ -255,17 +255,17 @@ ${liveSession && liveSession.turns > 0 ? `
255255 <div class="card">
256256 <div class="card-title">Novel Corrections (target: &gt;90%)</div>
257257 <div class="big-number ${novelColor}">${novelRate}%${novelArrow}</div>
258 <div class="dim">old mistakes eliminated — higher is better</div>
258 <div class="dim">% of corrections that are new mistakes, not repeats. Higher = old mistakes stay fixed.</div>
259259 </div>
260260 <div class="card">
261261 <div class="card-title">Correction Density (target: &lt;15%)</div>
262262 <div class="big-number ${densityColor}">${densityPct}%${densityArrow}</div>
263 <div class="dim">corrections per turn — lower is better</div>
263 <div class="dim">How often the user has to correct Claude per turn. 20% = 1 in 5 turns. Lower = fewer mistakes.</div>
264264 </div>
265265 <div class="card">
266266 <div class="card-title">Loop Resolution (target: &lt;6 turns)</div>
267267 <div class="big-number ${resColor}">${resolution}${resArrow}</div>
268 <div class="dim">turns to fix a loop — lower is better</div>
268 <div class="dim">When Claude gets stuck in a correction loop, how many turns to escape. Lower = learns faster.</div>
269269 </div>
270270 <div class="card">
271271 <div class="card-title">Learned Rules</div>
……@@ -276,19 +276,19 @@ ${liveSession && liveSession.turns > 0 ? `
276276
277277<!-- Weekly Fused Score Trend -->
278278<div class="chart-container">
279 <div class="card-title">Weekly Fused Score Trend</div>
279 <div class="card-title">Weekly Fused Score (higher = better)</div>
280280 ${renderLineChart(weeklyData.map(w => w.score), weeklyData.map(w => w.week), { height: 140, color: '#58a6ff', label: 'Fused Score', format: 'auto' })}
281281</div>
282282
283283<!-- Weekly Correction Density -->
284284<div class="chart-container">
285 <div class="card-title">Weekly Corrections vs Approvals</div>
285 <div class="card-title">Weekly Corrections vs Approvals (green overtaking red = improving)</div>
286286 ${renderBarChart(weeklyData, { height: 120 })}
287287</div>
288288
289289<!-- Loops Over Time -->
290290<div class="chart-container">
291 <div class="card-title">Loops Per Week</div>
291 <div class="card-title">Loops Per Week (lower = better)</div>
292292 ${renderLineChart(
293293 Object.entries(loopsWeekly).sort().map(([, v]) => v.total),
294294 Object.entries(loopsWeekly).sort().map(([k]) => k),
……@@ -298,12 +298,13 @@ ${liveSession && liveSession.turns > 0 ? `
298298
299299<!-- Session Scatter -->
300300<div class="chart-container">
301 <div class="card-title">Session Scores (each dot = one session, size = turns)</div>
301 <div class="card-title">Session Scores — green dots = clean sessions, red = heavy corrections, size = session length. Higher = better.</div>
302302 ${renderScatter(sessionData, { height: 150 })}
303303</div>
304304
305305<!-- Loops by Project -->
306306<h3>Loops by Project</h3>
307<p class="dim" style="margin-bottom:8px">A loop is a correction spiral — Claude gets corrected, tries to fix it, gets corrected again. More loops = more frustration. Higher resolved % = problems eventually get fixed.</p>
307308<table>
308309 <tr><th>Project</th><th>Loops</th><th>Resolved</th><th>Avg Duration</th><th></th></tr>
309310 ${Object.entries(loopsByProject).sort((a, b) => b[1].total - a[1].total).map(([proj, data]) => {
……@@ -320,6 +321,7 @@ ${liveSession && liveSession.turns > 0 ? `
320321
321322<!-- Subsystem Danger Map -->
322323<h3>Subsystem Danger Map</h3>
324<p class="dim" style="margin-bottom:8px">Auto-discovered from code. Red = high loop count (Claude struggles here). Yellow = moderate. Green = stable. L=loops, F=files in subsystem.</p>
323325${Object.entries(dangerMap).map(([proj, subs]) => {
324326 if (subs.length === 0) return ''
325327 return `<div style="margin-bottom:12px">
……@@ -331,7 +333,8 @@ ${Object.entries(dangerMap).map(([proj, subs]) => {
331333}).join('\n')}
332334
333335<!-- Sensor Weights -->
334<h3>Sensor Weight Evolution</h3>
336<h3>Sensor Weights</h3>
337<p class="dim" style="margin-bottom:8px">The system uses 16 sensors to score each turn. Weights auto-adjust based on which sensors best predict corrections. Higher weight = more influence on the fused score.</p>
335338<table>
336339 <tr><th>Sensor</th><th>Weight</th><th>Bar</th></tr>
337340 ${fused?.sensorWeights ? Object.entries(fused.sensorWeights).sort((a, b) => b[1] - a[1]).map(([name, weight]) => {
……@@ -346,7 +349,8 @@ ${Object.entries(dangerMap).map(([proj, subs]) => {
346349
347350<!-- Ratchet Intelligence Trends -->
348351<h3>Intelligence Ratchet Trends</h3>
349${benchmarkHistory.length >= 2 ? `
352<p class="dim" style="margin-bottom:8px">These lines should trend in the right direction over time. If they don't, the ratchet isn't working.</p>
353${benchmarkHistory.length >= 1 ? `
350354<div class="grid">
351355 <div class="card">
352356 <div class="card-title">Novel Correction Rate (higher = better)</div>
……@@ -383,7 +387,7 @@ ${benchmarkHistory.length >= 2 ? `
383387</div>
384388
385389<div class="card" style="margin-top:16px">
386 <div class="card-title">Ratchet Scorecard — Is it working?</div>
390 <div class="card-title">Ratchet Scorecard — Green = target met, Yellow = working on it, Red = failing</div>
387391 <table>
388392 <tr><th>Metric</th><th>Current</th><th>Target</th><th>Status</th></tr>
389393 <tr>