Created
March 14, 2026 12:40
-
-
Save jpatel3/b287dfc7ceed1eb2532bcaac51f0eaae to your computer and use it in GitHub Desktop.
Tuva Analytics System — Visual Plan (March 2026)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <style> | |
| body { font-family: Helvetica, Arial, sans-serif; font-size: 11px; color: #333; margin: 30px; line-height: 1.5; } | |
| h1 { font-size: 24px; color: #004445; text-align: center; margin-bottom: 4px; } | |
| .subtitle { text-align: center; color: #888; font-size: 12px; margin-bottom: 30px; } | |
| h2 { font-size: 16px; color: #004445; border-bottom: 2px solid #004445; padding-bottom: 4px; margin-top: 35px; } | |
| h3 { font-size: 13px; color: #2a2a2a; margin-top: 20px; } | |
| /* Visual boxes */ | |
| .box { border: 2px solid #004445; border-radius: 6px; padding: 12px 16px; margin: 8px 0; background: #f8fffe; } | |
| .box-dark { border: 2px solid #004445; border-radius: 6px; padding: 12px 16px; margin: 8px 0; background: #004445; color: white; } | |
| .box-accent { border: 2px solid #E8A735; border-radius: 6px; padding: 12px 16px; margin: 8px 0; background: #FFF8E7; } | |
| .box-light { border: 1px solid #ccc; border-radius: 6px; padding: 10px 14px; margin: 6px 0; background: #fafafa; } | |
| .box-red { border: 2px solid #c0392b; border-radius: 6px; padding: 12px 16px; margin: 8px 0; background: #fdf2f2; } | |
| .box-green { border: 2px solid #27ae60; border-radius: 6px; padding: 12px 16px; margin: 8px 0; background: #f2fdf6; } | |
| .box-blue { border: 2px solid #2980b9; border-radius: 6px; padding: 12px 16px; margin: 8px 0; background: #f2f8fd; } | |
| .box-title { font-weight: bold; font-size: 12px; margin-bottom: 6px; } | |
| .box-dark .box-title { color: #E8A735; } | |
| /* Flow arrows */ | |
| .arrow-down { text-align: center; font-size: 20px; color: #004445; margin: 4px 0; letter-spacing: 2px; } | |
| .arrow-right { color: #004445; font-size: 16px; } | |
| /* Tables */ | |
| table { border-collapse: collapse; width: 100%; margin: 10px 0; } | |
| th { background: #004445; color: white; padding: 8px 10px; text-align: left; font-size: 10px; font-weight: bold; border: 1px solid #004445; } | |
| td { padding: 8px 10px; text-align: left; font-size: 10px; border: 1px solid #ddd; } | |
| tr:nth-child(even) td { background: #f9f9f9; } | |
| /* Timeline */ | |
| .timeline-row { display: table; width: 100%; margin: 6px 0; } | |
| .timeline-phase { display: table-cell; padding: 10px; text-align: center; vertical-align: top; border-radius: 4px; } | |
| /* Grid layouts */ | |
| .two-col { display: table; width: 100%; margin: 10px 0; } | |
| .two-col .col { display: table-cell; width: 48%; vertical-align: top; padding: 0 8px; } | |
| .two-col .col-divider { display: table-cell; width: 4%; vertical-align: top; } | |
| .three-col { display: table; width: 100%; margin: 10px 0; } | |
| .three-col .col { display: table-cell; width: 31%; vertical-align: top; padding: 0 6px; } | |
| .three-col .col-gap { display: table-cell; width: 3%; } | |
| /* Tags */ | |
| .tag { display: inline-block; padding: 2px 8px; border-radius: 3px; font-size: 9px; font-weight: bold; margin: 2px; } | |
| .tag-p0 { background: #c0392b; color: white; } | |
| .tag-p1 { background: #E8A735; color: white; } | |
| .tag-p2 { background: #7f8c8d; color: white; } | |
| .tag-new { background: #27ae60; color: white; } | |
| .tag-exists { background: #2980b9; color: white; } | |
| .small { font-size: 9px; color: #888; } | |
| .bold { font-weight: bold; } | |
| .center { text-align: center; } | |
| .highlight { background: #FFF3CD; padding: 2px 4px; } | |
| hr { border: none; border-top: 1px solid #ddd; margin: 25px 0; } | |
| .page-break { page-break-before: always; } | |
| </style> | |
| </head> | |
| <body> | |
| <!-- PAGE 1: Title + Overview --> | |
| <h1>Tuva Analytics System</h1> | |
| <p class="subtitle">System Design Plan | March 2026 | Confidential</p> | |
| <div class="box-dark"> | |
| <div class="box-title">THE GOAL</div> | |
| Capture how students interact with Tuva Data Tools — map actions to learning outcomes, surface engagement signals to teachers, and provide interaction intelligence to partners. Two tracks: Internal (content + learning analytics) and Partner (interaction telemetry). | |
| </div> | |
| <h2>1. System Overview</h2> | |
| <!-- Architecture diagram using nested boxes --> | |
| <div class="box" style="background: #e8f4f8; padding: 20px;"> | |
| <div class="center bold" style="font-size: 14px; margin-bottom: 15px;">Architecture</div> | |
| <!-- Student layer --> | |
| <div class="box" style="background: white;"> | |
| <div class="box-title">CAPTURE LAYER (data-exploration)</div> | |
| Student interacts with Tuva Data Tools (direct or via partner iframe)<br> | |
| EventEmitter batches actions every 5 seconds, sends to analytics endpoint | |
| </div> | |
| <div class="arrow-down">▼</div> | |
| <div class="box" style="background: white;"> | |
| <div class="box-title">STORAGE LAYER (tuvalabs backend)</div> | |
| POST /api/analytics/events/ → ToolEvent table (raw event stream per session) | |
| </div> | |
| <div class="arrow-down">▼</div> | |
| <!-- Two tracks side by side --> | |
| <div class="two-col"> | |
| <div class="col"> | |
| <div class="box-green"> | |
| <div class="box-title">TRACK 1: Internal Analytics</div> | |
| <strong>Action Matching:</strong> Compare student actions vs. staff baseline ("genie student")<br><br> | |
| <strong>Engagement Signals:</strong> Time on task, perseverance, exploration depth<br><br> | |
| <strong>Surfaces to:</strong> Teacher Dashboard, District Dashboard | |
| </div> | |
| </div> | |
| <div class="col-divider"></div> | |
| <div class="col"> | |
| <div class="box-blue"> | |
| <div class="box-title">TRACK 2: Partner Analytics</div> | |
| <strong>Usage Reports:</strong> Loads, session duration, peak times<br><br> | |
| <strong>Interaction Heat Maps:</strong> Click density, plot types, attribute usage<br><br> | |
| <strong>Surfaces to:</strong> Partner Dashboard, Monthly PDF Reports | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <hr> | |
| <!-- PAGE 2: The Core Concept --> | |
| <h2>2. Core Concept: Action Matching</h2> | |
| <div class="box-accent"> | |
| <div class="box-title">THE "GENIE STUDENT" APPROACH</div> | |
| Tuva staff (Rachna/Jocelyn) completes an activity as the ideal student. This becomes the reference baseline. Every student's action sequence is compared against it. | |
| </div> | |
| <div class="two-col" style="margin-top: 15px;"> | |
| <div class="col"> | |
| <div class="box-green"> | |
| <div class="box-title">BASELINE (Staff Records)</div> | |
| <table> | |
| <tr><th>Step</th><th>Expected Action</th><th>Micro-Skill</th></tr> | |
| <tr><td>1</td><td>Drag "Weight" to X axis</td><td>Create dot plot</td></tr> | |
| <tr><td>2</td><td>Answer Q1 about measures of center</td><td>Interpret distribution</td></tr> | |
| <tr><td>3</td><td>Drag "Breed Category" to Y axis</td><td>Create parallel dot plots</td></tr> | |
| <tr><td>4</td><td>Answer Q2 comparing distributions</td><td>Compare groups</td></tr> | |
| </table> | |
| </div> | |
| </div> | |
| <div class="col-divider"><div class="center" style="padding-top: 60px; font-size: 20px;">vs.</div></div> | |
| <div class="col"> | |
| <div class="box-blue"> | |
| <div class="box-title">STUDENT A (Actual Actions)</div> | |
| <table> | |
| <tr><th>Step</th><th>Actual Action</th><th>Match?</th></tr> | |
| <tr><td>1-3</td><td>Clicks around, explores data table</td><td style="color:#888;">-</td></tr> | |
| <tr><td>4</td><td>Drags "Name" to X axis</td><td style="color:#c0392b;">NO</td></tr> | |
| <tr><td>5</td><td>Removes "Name", drags "Weight" to X</td><td style="color:#27ae60;">YES (step 5)</td></tr> | |
| <tr><td>6</td><td>Answers Q1: "The mean is about 40 lbs"</td><td style="color:#27ae60;">YES</td></tr> | |
| <tr><td>7-11</td><td>Tries pie chart, bar chart, explores</td><td style="color:#888;">-</td></tr> | |
| <tr><td>12</td><td>Drags "Breed Category" to Y axis</td><td style="color:#27ae60;">YES (step 12)</td></tr> | |
| <tr><td>13</td><td>Answers Q2</td><td style="color:#E8A735;">PARTIAL</td></tr> | |
| </table> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="box-light" style="margin-top: 10px;"> | |
| <div class="box-title">WHAT THE TEACHER SEES</div> | |
| <strong>Student A:</strong> Completed both required visualizations. Took 5 steps to create dot plot (expected: 1). Took 12 steps to create parallel dot plots (expected: 1). Showed exploration and perseverance. Q1 correct. Q2 partially correct. Total time: 14 minutes.<br> | |
| <strong>Insight:</strong> Student explored extensively before finding the right approach — engaged but may need guidance on reading instructions. | |
| </div> | |
| <hr> | |
| <!-- PAGE 3: What We Capture --> | |
| <div class="page-break"></div> | |
| <h2>3. Events to Capture</h2> | |
| <p>Capture everything. Filter in analysis, not at collection time.</p> | |
| <div class="three-col"> | |
| <div class="col"> | |
| <div class="box" style="border-color: #c0392b;"> | |
| <div class="box-title" style="color: #c0392b;">P0 — MUST HAVE (Week 1-2)</div> | |
| <strong>session_start / session_end</strong><br> | |
| <span class="small">Time on tool, session duration</span><br><br> | |
| <strong>attribute_drag</strong><br> | |
| <span class="small">What variable, to which axis (x/y/legend)</span><br><br> | |
| <strong>plot_type_change</strong><br> | |
| <span class="small">dot/histogram/scatter/box/bar/pie/line/map</span><br><br> | |
| <strong>plot_state_snapshot</strong><br> | |
| <span class="small">Full state on step transition or question answer</span> | |
| </div> | |
| </div> | |
| <div class="col-gap"></div> | |
| <div class="col"> | |
| <div class="box" style="border-color: #E8A735;"> | |
| <div class="box-title" style="color: #E8A735;">P1 — IMPORTANT (Week 2-3)</div> | |
| <strong>menu_click</strong><br> | |
| <span class="small">Toolbar items (mean, median, reference lines)</span><br><br> | |
| <strong>filter_apply / remove</strong><br> | |
| <span class="small">Data subsetting behavior</span><br><br> | |
| <strong>context_menu_action</strong><br> | |
| <span class="small">Right-click / attribute menu usage</span><br><br> | |
| <strong>accessibility_toggle</strong><br> | |
| <span class="small">Theme, font size, animation, sonification</span> | |
| </div> | |
| </div> | |
| <div class="col-gap"></div> | |
| <div class="col"> | |
| <div class="box" style="border-color: #7f8c8d;"> | |
| <div class="box-title" style="color: #7f8c8d;">P2 — NICE TO HAVE (Week 3+)</div> | |
| <strong>keyboard_shortcut_used</strong><br> | |
| <span class="small">Which shortcuts are adopted</span><br><br> | |
| <strong>undo / redo</strong><br> | |
| <span class="small">Trial-and-error behavior</span><br><br> | |
| <strong>zoom / pan</strong><br> | |
| <span class="small">Engagement with specific data regions</span><br><br> | |
| <strong>y2_axis / reference_lines</strong><br> | |
| <span class="small">Advanced feature discovery</span> | |
| </div> | |
| </div> | |
| </div> | |
| <hr> | |
| <h2>4. Engagement Signals (Beyond Correctness)</h2> | |
| <p>As discussed: "A student that normally brushes everything off spending 30 minutes on a lesson — a teacher would be happy to know that."</p> | |
| <table> | |
| <tr> | |
| <th style="width: 20%;">Signal</th> | |
| <th style="width: 35%;">How We Derive It</th> | |
| <th style="width: 45%;">What It Means for Teachers</th> | |
| </tr> | |
| <tr> | |
| <td><strong>Time on Task</strong></td> | |
| <td>session_start to session_end per step</td> | |
| <td>"Student spent 10 min on Q3" — deep engagement or stuck? Context from action stream tells which.</td> | |
| </tr> | |
| <tr> | |
| <td><strong>Perseverance</strong></td> | |
| <td>Count of actions before reaching expected action</td> | |
| <td>"Tried 15 things before getting the scatter plot" — math practice: persevere in problem solving.</td> | |
| </tr> | |
| <tr> | |
| <td><strong>Exploration Depth</strong></td> | |
| <td>Unique plot types + attributes explored per session</td> | |
| <td>"Explored 5 different visualizations" — intellectual curiosity signal.</td> | |
| </tr> | |
| <tr> | |
| <td><strong>Feature Discovery</strong></td> | |
| <td>Usage of advanced features (Y2, reference lines, filters)</td> | |
| <td>"Student used measures of center on their own" — advanced statistical thinking.</td> | |
| </tr> | |
| <tr> | |
| <td><strong>Disengagement</strong></td> | |
| <td>Long gaps between events, early session_end</td> | |
| <td>"Left at step 2 without attempting" — may need different approach or support.</td> | |
| </tr> | |
| <tr> | |
| <td><strong>Re-engagement</strong></td> | |
| <td>Multiple sessions on same activity</td> | |
| <td>"Came back 3 times to finish" — persistence across sessions.</td> | |
| </tr> | |
| </table> | |
| <!-- PAGE 4: Partner Analytics --> | |
| <div class="page-break"></div> | |
| <h2>5. Partner Analytics — From Black Box to Intelligence</h2> | |
| <div class="two-col"> | |
| <div class="col"> | |
| <div class="box-red"> | |
| <div class="box-title">TODAY: Black Box</div> | |
| Partner embeds Tuva tools via iframe.<br> | |
| Students interact with data.<br> | |
| <strong>Zero data captured by Tuva.</strong><br> | |
| <strong>Zero insight for the partner.</strong><br> | |
| Partner knows: "student opened the page."<br> | |
| Partner does NOT know: what they did with the data. | |
| </div> | |
| </div> | |
| <div class="col-divider"><div class="center" style="padding-top: 40px; font-size: 24px;">→</div></div> | |
| <div class="col"> | |
| <div class="box-green"> | |
| <div class="box-title">FUTURE: Intelligence Engine</div> | |
| Same iframe. Same partner code. Zero partner changes.<br> | |
| Tuva adds event capture inside the tools.<br> | |
| <strong>Every interaction logged.</strong><br> | |
| <strong>Aggregated into partner reports.</strong><br> | |
| Partner knows: how students explore their data, which datasets engage, where students get stuck. | |
| </div> | |
| </div> | |
| </div> | |
| <h3>Three Levels of Partner Intelligence</h3> | |
| <div class="three-col"> | |
| <div class="col"> | |
| <div class="box" style="border-color: #27ae60; border-width: 3px;"> | |
| <div class="box-title" style="color: #27ae60;">LEVEL 1: Usage Analytics</div> | |
| <span class="tag tag-new">BUILD FIRST</span><br><br> | |
| <strong>What:</strong> Dataset load counts, session duration, peak times, usage trends<br><br> | |
| <strong>Source:</strong> Server-side logs + session events<br><br> | |
| <strong>Effort:</strong> 1-2 weeks<br><br> | |
| <strong>Example:</strong> "Your Ocean Temperature dataset had 12,400 loads this quarter, up 23%." | |
| </div> | |
| </div> | |
| <div class="col-gap"></div> | |
| <div class="col"> | |
| <div class="box" style="border-color: #2980b9; border-width: 3px;"> | |
| <div class="box-title" style="color: #2980b9;">LEVEL 2: Interaction Telemetry</div> | |
| <span class="tag tag-p1">PHASE 4</span><br><br> | |
| <strong>What:</strong> Heat maps, plot type distribution, attribute usage, exploration sequences<br><br> | |
| <strong>Source:</strong> Client-side event capture<br><br> | |
| <strong>Effort:</strong> 2-3 weeks<br><br> | |
| <strong>Example:</strong> "Climate Change dataset: 4.2 min avg, 3 plot types per session. Earthquake dataset: 45 sec avg — needs scaffolding." | |
| </div> | |
| </div> | |
| <div class="col-gap"></div> | |
| <div class="col"> | |
| <div class="box" style="border-color: #8e44ad; border-width: 3px;"> | |
| <div class="box-title" style="color: #8e44ad;">LEVEL 3: Pedagogical Intelligence</div> | |
| <span class="tag tag-p2">FUTURE</span><br><br> | |
| <strong>What:</strong> AI-analyzed patterns, content effectiveness, cross-partner benchmarks<br><br> | |
| <strong>Source:</strong> Aggregated telemetry + AI<br><br> | |
| <strong>Effort:</strong> 4-6 weeks<br><br> | |
| <strong>Example:</strong> "This dataset teaches correlation effectively but students struggle with causation." | |
| </div> | |
| </div> | |
| </div> | |
| <div class="box-accent" style="margin-top: 15px;"> | |
| <div class="box-title">THE PENDA EXAMPLE (from the meeting)</div> | |
| Penda's "Life Cycle of Stars" lesson has 1,300 visits. Today we have no idea what students do inside that iframe. With interaction telemetry, we can show: heat map of clicks on the plot area, most-used plot types, which attributes students explore, average time spent. This becomes intelligence Penda cannot get from building their own tools. | |
| </div> | |
| <!-- PAGE 5: Implementation Timeline --> | |
| <div class="page-break"></div> | |
| <h2>6. Implementation Phases</h2> | |
| <!-- Phase 1 --> | |
| <div class="box" style="border-left: 6px solid #c0392b;"> | |
| <div class="two-col"> | |
| <div class="col" style="width: 20%;"> | |
| <div class="bold" style="font-size: 14px; color: #c0392b;">PHASE 1</div> | |
| <div style="font-size: 10px; color: #888;">2-3 weeks</div> | |
| <div class="bold">Target: April 1</div> | |
| </div> | |
| <div class="col" style="width: 80%;"> | |
| <div class="bold">Event Capture Infrastructure — "Start Recording"</div> | |
| <ul> | |
| <li>Create EventEmitter module in data-exploration (batches events, non-blocking)</li> | |
| <li>Instrument P0 events: session start/end, attribute drag, plot type change, plot state snapshot</li> | |
| <li>New analytics endpoint in tuvalabs: POST /api/analytics/events/</li> | |
| <li>New ToolEvent model (raw event storage, partitioned by month)</li> | |
| <li>Context injection: activity/lesson/step IDs, partner ID from iframe URL params</li> | |
| </ul> | |
| <strong>Outcome:</strong> Data starts flowing. Every interaction captured. Nothing surfaced yet. | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Phase 2 --> | |
| <div class="box" style="border-left: 6px solid #E8A735;"> | |
| <div class="two-col"> | |
| <div class="col" style="width: 20%;"> | |
| <div class="bold" style="font-size: 14px; color: #E8A735;">PHASE 2</div> | |
| <div style="font-size: 10px; color: #888;">2-3 weeks</div> | |
| <div class="bold">Target: Mid-April</div> | |
| </div> | |
| <div class="col" style="width: 80%;"> | |
| <div class="bold">Baseline Recording + Replay — "The Genie Student"</div> | |
| <ul> | |
| <li>Split-screen interface: activity on left, action log on right (build in tuva-tools-viewer)</li> | |
| <li>"Record Baseline" mode: staff completes activity, each action logged with order + annotation</li> | |
| <li>"Replay" mode: watch any recorded session step by step (leverage existing record feature)</li> | |
| <li>New model: ActivityBaseline (expected action sequence per activity/step)</li> | |
| <li>Content team starts recording baselines for first 50 activities</li> | |
| </ul> | |
| <strong>Outcome:</strong> Staff can record ideal paths. Can replay any student session. | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Phase 3 --> | |
| <div class="box" style="border-left: 6px solid #27ae60;"> | |
| <div class="two-col"> | |
| <div class="col" style="width: 20%;"> | |
| <div class="bold" style="font-size: 14px; color: #27ae60;">PHASE 3</div> | |
| <div style="font-size: 10px; color: #888;">3-4 weeks</div> | |
| <div class="bold">Target: Mid-May</div> | |
| </div> | |
| <div class="col" style="width: 80%;"> | |
| <div class="bold">Action Matching + Teacher Dashboard — "Show the Learning"</div> | |
| <ul> | |
| <li>Matching engine: walk student event stream, check expected actions from baseline</li> | |
| <li>Record per action: matched (yes/no), step number when matched, time elapsed</li> | |
| <li>AI comparison for fuzzy matching (compare plot state JSONs)</li> | |
| <li>Teacher view: activity summary, per-student detail, engagement signals, attention flags</li> | |
| </ul> | |
| <strong>Outcome:</strong> Teachers see "8/10 students created the expected dot plot. Student A took 5 steps. Student B never did it." | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Phase 4 --> | |
| <div class="box" style="border-left: 6px solid #2980b9;"> | |
| <div class="two-col"> | |
| <div class="col" style="width: 20%;"> | |
| <div class="bold" style="font-size: 14px; color: #2980b9;">PHASE 4</div> | |
| <div style="font-size: 10px; color: #888;">2-3 weeks</div> | |
| <div class="bold">Parallel with Phase 3</div> | |
| </div> | |
| <div class="col" style="width: 80%;"> | |
| <div class="bold">Partner Analytics Dashboard — "Turn the Black Box Transparent"</div> | |
| <ul> | |
| <li>Aggregate events where source = partner, grouped by partner_id + dataset_id</li> | |
| <li>Partner dashboard in partners app: usage, session duration, plot type distribution</li> | |
| <li>Heat map: overlay click coordinates on representative plot</li> | |
| <li>Monthly PDF export for partner review</li> | |
| <li>No student PII — anonymized, aggregate only</li> | |
| </ul> | |
| <strong>Outcome:</strong> Partners get usage + interaction intelligence for their embedded datasets. | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Phase 5 --> | |
| <div class="box" style="border-left: 6px solid #8e44ad;"> | |
| <div class="two-col"> | |
| <div class="col" style="width: 20%;"> | |
| <div class="bold" style="font-size: 14px; color: #8e44ad;">PHASE 5</div> | |
| <div style="font-size: 10px; color: #888;">4-6 weeks</div> | |
| <div class="bold">Target: July+</div> | |
| </div> | |
| <div class="col" style="width: 80%;"> | |
| <div class="bold">District Intelligence Layer — "Prove the Outcomes"</div> | |
| <ul> | |
| <li>Cross-reference action match results with standards metadata (from content tagging)</li> | |
| <li>Standards coverage heatmap by school, grade, teacher</li> | |
| <li>Student mastery by micro-skill across the district</li> | |
| <li>Teacher adoption metrics and effectiveness signals</li> | |
| <li>Board-ready exportable reports</li> | |
| </ul> | |
| <strong>Outcome:</strong> Curriculum directors see district-wide data literacy outcomes. Justifies $2-4/student pricing. | |
| </div> | |
| </div> | |
| </div> | |
| <!-- PAGE 6: Content Team Work --> | |
| <div class="page-break"></div> | |
| <h2>7. Parallel Workstream: Content Team</h2> | |
| <p>Engineering builds the system. Content team prepares the data that makes it meaningful.</p> | |
| <div class="box-accent"> | |
| <div class="box-title">WHO: Rachna + Jocelyn + Harshel</div> | |
| This work runs independently of engineering and must start immediately. | |
| </div> | |
| <table style="margin-top: 15px;"> | |
| <tr> | |
| <th style="width: 8%;">#</th> | |
| <th style="width: 30%;">Task</th> | |
| <th style="width: 40%;">Detail</th> | |
| <th style="width: 22%;">When</th> | |
| </tr> | |
| <tr> | |
| <td>1</td> | |
| <td><strong>Define micro-skill taxonomy</strong></td> | |
| <td>Categories: data representation, statistical analysis, data collection, data interpretation. Sub-skills: interpreting dot plots, comparing distributions, identifying correlation, etc. Map to NGSS practices.</td> | |
| <td>Now → April 1</td> | |
| </tr> | |
| <tr> | |
| <td>2</td> | |
| <td><strong>Select initial 50 activities</strong></td> | |
| <td>25 foundational math + 25 foundational science. Must be simple, specific, one-right-way activities. NOT data stories or open-ended explorations.</td> | |
| <td>Now → April 1</td> | |
| </tr> | |
| <tr> | |
| <td>3</td> | |
| <td><strong>Tag activities with micro-skills</strong></td> | |
| <td>Per step: what micro-skill is being assessed, what action is expected, what correct response looks like.</td> | |
| <td>April 1 → April 15</td> | |
| </tr> | |
| <tr> | |
| <td>4</td> | |
| <td><strong>Record baselines ("genie student")</strong></td> | |
| <td>Using the recording tool (Phase 2), walk through each of the 50 activities as the ideal student. Annotate key steps.</td> | |
| <td>Mid-April → May</td> | |
| </tr> | |
| <tr> | |
| <td>5</td> | |
| <td><strong>Define engagement criteria</strong></td> | |
| <td>What time-on-task thresholds are meaningful? What constitutes "engaged" vs "disengaged"? What do teachers want to see?</td> | |
| <td>April → May</td> | |
| </tr> | |
| </table> | |
| <hr> | |
| <h2>8. Data Flow</h2> | |
| <div class="box" style="background: #e8f4f8; padding: 20px;"> | |
| <!-- Row 1: Student --> | |
| <div class="box" style="background: white;"> | |
| <div class="center bold">Student interacts with Tuva Data Tools</div> | |
| <div class="center small">(direct on tuvalabs.com OR via partner iframe)</div> | |
| </div> | |
| <div class="arrow-down">▼</div> | |
| <!-- Row 2: EventEmitter --> | |
| <div class="box" style="background: #FFF8E7; border-color: #E8A735;"> | |
| <div class="center bold">EventEmitter (data-exploration JS)</div> | |
| <div class="center small">Batches events every 5 seconds | sendBeacon on session_end | Non-blocking, silent failure</div> | |
| </div> | |
| <div class="arrow-down">▼</div> | |
| <!-- Row 3: API --> | |
| <div class="box" style="background: white;"> | |
| <div class="center bold">POST /api/analytics/events/</div> | |
| <div class="center small">Tuvalabs Django backend | Minimal validation, maximum throughput</div> | |
| </div> | |
| <div class="arrow-down">▼</div> | |
| <!-- Row 4: Storage --> | |
| <div class="box-dark"> | |
| <div class="center box-title">ToolEvent Table (Raw Event Stream)</div> | |
| <div class="center" style="font-size: 10px;">Indexed on: session_id, timestamp, activity_id, partner_id | Partitioned by month</div> | |
| </div> | |
| <div class="arrow-down">▼</div> | |
| <!-- Row 5: Two outputs --> | |
| <div class="two-col"> | |
| <div class="col"> | |
| <div class="box-green"> | |
| <div class="center bold">Internal Analytics Pipeline</div> | |
| <div class="arrow-down" style="font-size: 14px;">▼</div> | |
| <div class="center small">Action Matching Engine</div> | |
| <div class="center small">(compare vs. baseline)</div> | |
| <div class="arrow-down" style="font-size: 14px;">▼</div> | |
| <div class="center small">ActionMatchResult Table</div> | |
| <div class="arrow-down" style="font-size: 14px;">▼</div> | |
| <div class="center"><strong>Teacher Dashboard</strong></div> | |
| <div class="center"><strong>District Dashboard</strong></div> | |
| </div> | |
| </div> | |
| <div class="col-divider"></div> | |
| <div class="col"> | |
| <div class="box-blue"> | |
| <div class="center bold">Partner Analytics Pipeline</div> | |
| <div class="arrow-down" style="font-size: 14px;">▼</div> | |
| <div class="center small">Nightly Aggregation</div> | |
| <div class="center small">(Celery batch job)</div> | |
| <div class="arrow-down" style="font-size: 14px;">▼</div> | |
| <div class="center small">PartnerAnalytics Table</div> | |
| <div class="arrow-down" style="font-size: 14px;">▼</div> | |
| <div class="center"><strong>Partner Dashboard</strong></div> | |
| <div class="center"><strong>Monthly PDF Reports</strong></div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- PAGE 7: POC + Scope --> | |
| <div class="page-break"></div> | |
| <h2>9. POC Definition — What Success Looks Like</h2> | |
| <div class="box-green"> | |
| <div class="box-title">POC IS SUCCESSFUL IF:</div> | |
| <table> | |
| <tr><th style="width: 5%;"></th><th style="width: 65%;">Criteria</th><th style="width: 30%;">Target</th></tr> | |
| <tr><td>1</td><td>We can record a baseline for a simple 2-step activity (dot plot, then parallel dot plots)</td><td>Mid-April</td></tr> | |
| <tr><td>2</td><td>We can capture the action stream of 10 students doing the same activity</td><td>Late April</td></tr> | |
| <tr><td>3</td><td>We can replay any student's session step by step</td><td>Late April</td></tr> | |
| <tr><td>4</td><td>We can show: "Student A did the expected action at step 5. Student B never did it."</td><td>Mid-May</td></tr> | |
| <tr><td>5</td><td>We can show time-on-task per student per step</td><td>Mid-May</td></tr> | |
| <tr><td>6</td><td>For partners: we can show a usage report for one dataset instance</td><td>May</td></tr> | |
| </table> | |
| </div> | |
| <h2>10. Scope Boundaries — What We Are NOT Building</h2> | |
| <div class="box-red"> | |
| <div class="box-title">OUT OF SCOPE FOR POC</div> | |
| <table> | |
| <tr><th>Excluded</th><th>Reason</th></tr> | |
| <tr><td>Analytics for Data Stories</td><td>Open-ended, exploratory — no single right path to match against</td></tr> | |
| <tr><td>Analytics for Open Science tasks</td><td>Different value proposition for OpenSciEd — not action matching</td></tr> | |
| <tr><td>Screen recordings or video capture</td><td>Event streams are sufficient and much lighter weight</td></tr> | |
| <tr><td>Pre/post assessment analytics</td><td>Opt-in, separate workstream — not part of tool-level capture</td></tr> | |
| <tr><td>Semantic analysis of free-text responses</td><td>Future AI work — compare against sample responses later</td></tr> | |
| <tr><td>Real-time teacher monitoring</td><td>Nice-to-have but not POC scope. Batch processing first.</td></tr> | |
| <tr><td>Filtering events at capture time</td><td>"Capture everything, discriminate later." Storage is cheap.</td></tr> | |
| </table> | |
| </div> | |
| <hr> | |
| <h2>11. Key Milestone: June 30</h2> | |
| <div class="box-dark" style="text-align: center; padding: 20px;"> | |
| <div style="font-size: 16px; color: #E8A735; font-weight: bold; margin-bottom: 10px;">BY JUNE 30, 2026</div> | |
| <div style="font-size: 12px; margin-bottom: 15px;">After capturing data from April 1 through June 30 (full school quarter)</div> | |
| <div class="two-col"> | |
| <div class="col"> | |
| <div style="border: 1px solid #E8A735; border-radius: 6px; padding: 12px; margin: 4px;"> | |
| <div style="color: #E8A735; font-weight: bold; margin-bottom: 6px;">FOR TEACHERS</div> | |
| Action matching reports for 50 foundational activities.<br> | |
| "Here is what your students did vs. what they were supposed to do."<br> | |
| Engagement and perseverance signals per student. | |
| </div> | |
| </div> | |
| <div class="col-divider"></div> | |
| <div class="col"> | |
| <div style="border: 1px solid #E8A735; border-radius: 6px; padding: 12px; margin: 4px;"> | |
| <div style="color: #E8A735; font-weight: bold; margin-bottom: 6px;">FOR PARTNERS</div> | |
| Usage reports for all partner dataset instances.<br> | |
| "Your top dataset had 12,400 loads. Students averaged 4 min."<br> | |
| Interaction heat maps showing where students click and explore. | |
| </div> | |
| </div> | |
| </div> | |
| <div style="margin-top: 15px; font-size: 11px;"> | |
| This data becomes the foundation for the District Intelligence Dashboard (Phase 5)<br> | |
| and the differentiator that makes Tuva irreplaceable. | |
| </div> | |
| </div> | |
| </body> | |
| </html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment