section = floor(max(0,cursor) / granularity)distFromStart = currSection - startSectionelapsed = (currTime - startTime) / 1000baseScore = distFromStart / elapsedoverlap = max(0, min(right, maxReachedSection) - left + 1)penalty = revisitPenaltyWeight * (overlap / elapsed)stepScore = baseScore - penaltyleft=min(prevSection,currSection) and right=max(prevSection,currSection).12 → 64 → 230 → 160.granularity=25, section mapping is:12→0, 64→2, 230→9, 160→6.startSection = 0 (from first cursor=12),230→160: prevSection=9, currSection=6.0 → 2 → 9, so before processing step 9→6, maxReachedSection=9.max(9,6)=9.12 → 64 → 230 → 160:granularity=25: sections are 0,2,9,6.granularity=50: sections are 0,1,4,3.startSection, prevSection, currSection, and maxReachedSection are all derived from the same cursor path but at different section resolution.startSection=0, current step moves prevSection=9 → currSection=6, and maxReachedSection=12.left=6, right=9, so:overlap = min(9,12)-6+1 = 4 sections.currTime-startTime=20s, then:distFromStart = 6-0 = 6, baseScore = 6/20 = 0.3000.revisitPenaltyWeight=1.5:penalty = 1.5*(4/20)=0.3000, so stepScore = 0.3000-0.3000=0.0000.revisitPenaltyWeight=2.0 (same step):penalty = 2.0*(4/20)=0.4000, so stepScore = 0.3000-0.4000=-0.1000.| Action | Count | Percentage |
|---|---|---|
| key:navi:[right] | 121 | 21.08% |
| mouse:down | 119 | 20.73% |
| mouse:up | 115 | 20.03% |
| key:ime | 67 | 11.67% |
| key:delete | 52 | 9.06% |
| key:insert | 52 | 9.06% |
| key:navi:[left] | 46 | 8.01% |
| system:start | 1 | 0.17% |
| system:stop | 1 | 0.17% |
Reading Speed Heat
cursor_timeline, segment_detail_vicinity, time_trend).window_index.vicinity_adaptive.duration_ms.count: number of rows in the group. Example: 12 rows → result 12.sum: arithmetic sum of numeric values. Example: 2.5, 1.0, 3.5 → 7.0.avg: mean of numeric values. Example: (2.5+1.0+3.5)/3 = 2.3333.min: smallest numeric value in the group. Example: min(2.5,1.0,3.5)=1.0.max: largest numeric value in the group. Example: max(2.5,1.0,3.5)=3.5.count is safest and most interpretable.cursor_timeline, segment_detail_vicinity.replace, insert, delete.gap_ms >= pause_threshold_ms.duration_seconds is total segment/window span duration.pause_seconds is accumulated long-gap time inside that span, where each gap satisfies gap_ms >= pause_threshold_ms.pause_threshold_ms is user-configurable via Pause long-gap threshold (ms) slider in Data Export.raw_xml event times (not broad vicinity activity fallback when raw exists).pause_ratio_pct = (pause_seconds / duration_seconds) × 100.duration_seconds=23 and pause_seconds=7, then pause_ratio_pct=30.43%; active editing time is 23-7=16s.cursor_timelinewindow_index, Column = (none), Value = backward_chars, Agg = sumtime_trendminute_in_session, Column = (none), Value = edit_intensity, Agg = avgreplay_eventsevent_type, Column = tag, Value = time_ms, Agg = countmt_heat_map or pe_heat_mapaction, Column = (none), Value = value, Agg = sumsegment_metatype, Column = (none), Value = id, Agg = countcursor_timelinepause_seconds, Column = (none), Value = backward_chars, Agg = avg, Chart = scattersegment_detail_vicinityspan_len, Column = (none), Value = duration_ms, Agg = avg, Chart = scattercursor_timelinewindow_index, Value = forward_chars, Agg = sum.cursor_timelinewindow_index, Value = pause_seconds, Agg = sum.cursor_timelinewindow_index, Value = focus_loss_count, Agg = sum.segment_metatype, Value = duration_ms, Agg = avg.segment_detail_vicinitysegment_id, Value = pause_ratio_pct, Agg = avg, Chart = bar.pause_ratio_pct = (pause_seconds / duration_seconds) × 100.pause_ratio_pct = (7/23)×100 = 30.43%.segment_detail_vicinitysegment_type, Column = vicinity_adaptive, Value = duration_ms, Agg = avg.mt_heat_map + pe_heat_mapaction, Column = dataset, Value = value, Agg = sum.cursor_timelinepause_seconds, Value = focus_loss_count, Agg = avg, Chart = scatter.replay_eventstime_ms, Value = cursor, Agg = avg, Chart = scatter.paragraph_markersparagraph_index, Value = elapsed_sec, Agg = max.target_char_mapx, Value = y, Agg = avg, Chart = scatter.segment_detail_vicinity is reactive to Vicinity Before, Vicinity After, and Adaptive toggle in the Full Compiled Text panel.Time=1203, Cursor=0 to Time=117687, Cursor=48, net movement is forward from 0 to 48 over that elapsed period.