Skip to content

Instantly share code, notes, and snippets.

@jpatel3
Created March 14, 2026 12:40
Show Gist options
  • Select an option

  • Save jpatel3/b287dfc7ceed1eb2532bcaac51f0eaae to your computer and use it in GitHub Desktop.

Select an option

Save jpatel3/b287dfc7ceed1eb2532bcaac51f0eaae to your computer and use it in GitHub Desktop.
Tuva Analytics System — Visual Plan (March 2026)
<!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">&#9660;</div>
<div class="box" style="background: white;">
<div class="box-title">STORAGE LAYER (tuvalabs backend)</div>
POST /api/analytics/events/ &rarr; ToolEvent table (raw event stream per session)
</div>
<div class="arrow-down">&#9660;</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;">&rarr;</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 &rarr; 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 &rarr; 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 &rarr; 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 &rarr; 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 &rarr; 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">&#9660;</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">&#9660;</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">&#9660;</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">&#9660;</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;">&#9660;</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;">&#9660;</div>
<div class="center small">ActionMatchResult Table</div>
<div class="arrow-down" style="font-size: 14px;">&#9660;</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;">&#9660;</div>
<div class="center small">Nightly Aggregation</div>
<div class="center small">(Celery batch job)</div>
<div class="arrow-down" style="font-size: 14px;">&#9660;</div>
<div class="center small">PartnerAnalytics Table</div>
<div class="arrow-down" style="font-size: 14px;">&#9660;</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