Analysis Reference
Complete reference for every metric in the SessionAnalysis object returned by getAnalysis(). See Analysis for usage examples and indicator descriptions.
SessionAnalysis
Section titled “SessionAnalysis”Top-level fields on the analysis result object.
| Metric | Type | Description |
|---|---|---|
version | string | Schema version of the analysis output (e.g. “1.0.0”). |
locale | string | Browser locale at time of analysis (e.g. “en-US”). Empty in Node.js. |
analyzedAt | number | Unix timestamp (ms) when the analysis was performed. |
sufficientData | boolean | Whether enough data was captured for meaningful analysis (30+ keydowns, 5+ seconds). |
keydownCount | number | Total keydown events recorded during the session. |
integrity | IntegrityProof | SHA-256 hash chain over raw events for tamper detection. |
sessionTimeline | SessionSegment[] | Classified timeline segments (typing, paste, pause, tabAway, autocomplete, navigating). |
initialTextLength | number | Character count of any pre-existing text when tracking started. |
initialTextHash | string | SHA-256 hash of the initial text content. |
finalTextLength | number | Character count of the text when tracking stopped. |
finalTextHash | string | SHA-256 hash of the final text content. |
activeTime | ActiveTimeResult | Active vs idle time breakdown for the entire session. |
outputSignature | string | Hex-encoded DER signature over the analysis output for tamper verification. |
signedPayload | string | The exact JSON bytes that were signed, for cross-language verification. (optional) |
Content Origin
Section titled “Content Origin”Access via analysis.contentOrigin. Where the text came from: typed, pasted, or autocompleted. Has two indicators: a primary indicator for overall content source and a pasteReworkIndicator for paste editing behavior.
Each category has an indicator (IndicatorOutput) with a machine-readable code and numeric params.
Metrics
Section titled “Metrics”| Metric | Type | Description |
|---|---|---|
charactersByOrigin.typed | number | Ratio of characters typed directly (0-1, sums to 1.0 with other fields) |
charactersByOrigin.pasted | number | Ratio of characters pasted (0-1, sums to 1.0 with other fields) |
charactersByOrigin.autocompleted | number | Ratio of characters from autocomplete (0-1, sums to 1.0 with other fields) |
pasteEvents | object[] | Individual paste events with timing, source, and rework details. |
pasteEvents[].timestamp | number | Milliseconds from session start when the paste occurred. |
pasteEvents[].characterCount | number | Number of characters in the pasted content. |
pasteEvents[].source | 'internal' | 'external' | 'unknown' | Whether the paste came from within the document, outside it, or is unknown. |
pasteEvents[].precedingTabAwayDuration | number | Milliseconds the user was away (tab-away) immediately before this paste. (optional) |
pasteEvents[].contentMatchedDocument | boolean | Whether the pasted content matched existing document text (internal restructuring). |
pasteEvents[].editsInRegion | number | Number of keydowns within the paste region within 60 seconds. |
pasteEvents[].firstEditDelayMs | number | Milliseconds from paste to first edit within the paste region. (optional) |
pasteEvents[].reworkRatio | number | Ratio of edits to pasted chars (0.0 = untouched). |
pasteEvents[].priorClipboardOp | 'copy' | 'cut' | The clipboard operation that preceded this paste (“copy” or “cut”), if known. (optional) |
pasteClassification.internalPasteRatio | number | Ratio of chars from internal paste (cut-paste restructuring) to total chars (0-1) |
pasteClassification.externalPasteRatio | number | Ratio of chars from external paste (outside content) to total chars (0-1) |
pasteClassification.unknownPasteRatio | number | Ratio of chars from unknown-source paste to total chars (0-1) |
pasteEditSummary.pasteRetentionRate | number | Fraction of pastes with zero edits in their region within 60 seconds (0-1) |
pasteEditSummary.meanModificationDelayMs | number | Average delay (ms) from paste to first edit, across pastes that were edited |
pasteEditSummary.pasteToTypeRatio | number | Ratio of pasted characters to typed characters |
pasteEditSummary.meanReworkRatio | number | Average rework ratio across all pastes |
pasteEditSummary.pasteLengthMean | number | Mean paste length in characters |
pasteEditSummary.pasteLengthStd | number | Standard deviation of paste lengths |
pasteEditSummary.pasteLengthMin | number | Minimum paste length in characters |
pasteEditSummary.pasteLengthMax | number | Maximum paste length in characters |
contentTimeline | MultiTimeSeries | Character origin ratios (typed/pasted/autocompleted) over time. |
Timing & Rhythm
Section titled “Timing & Rhythm”Access via analysis.timingAuthenticity. Whether keystroke timing looks human or mechanical. Measures dwell time, flight time distributions, periodicity, and entropy.
Each category has an indicator (IndicatorOutput) with a machine-readable code and numeric params.
Metrics
Section titled “Metrics”| Metric | Type | Description |
|---|---|---|
dwellTimeDistribution.mean | number | Mean key hold duration in milliseconds. |
dwellTimeDistribution.cv | number | Variability of dwell times relative to the mean (standard deviation / mean). Higher values indicate more variation. |
dwellTimeDistribution.histogram | BinnedData[] | Histogram bins for dwell time distribution. |
flightTimeDistribution.mean | number | Mean inter-key interval in milliseconds. |
flightTimeDistribution.cv | number | Variability of flight times relative to the mean (standard deviation / mean). Higher values indicate more variation. |
flightTimeDistribution.histogram | BinnedData[] | Histogram bins for flight time distribution. |
periodicityScore | number | How periodic the keystroke rhythm is (0-1, higher = more periodic/mechanical). |
entropy | number | Shannon entropy of timing intervals. Higher entropy = more human-like variability. |
timingOverTime | MultiTimeSeries | Timing metrics (dwell, flight) tracked across the session. |
Revision Behavior
Section titled “Revision Behavior”Access via analysis.revisionBehavior. How the author corrected and revised their work. Measures correction rate, edit patterns, revision depth, and insertion/deletion balance.
Each category has an indicator (IndicatorOutput) with a machine-readable code and numeric params.
Metrics
Section titled “Metrics”| Metric | Type | Description |
|---|---|---|
correctionRate | number | Ratio of correction keystrokes (Backspace/Delete) to total keystrokes (0-1). |
correctionCount | number | Total number of correction keystrokes (Backspace/Delete). |
navigationCount | number | Number of arrow key navigation events. |
undoRedoCount | number | Number of undo/redo operations (Ctrl+Z / Ctrl+Y). |
editPatterns | object[] | Categorized edit sequences with counts for each pattern type. |
editPatterns[].type | | 'select-delete-type' | 'select-paste' | 'paste-only' | 'select-edit' | 'multi-step' | The type of edit sequence observed. |
editPatterns[].count | number | Number of times this edit pattern was observed. |
correctionTimeline | TimeSeries | Correction rate plotted over time. |
revisionDepth.maxDepth | number | Maximum number of times any single text region was revised. |
revisionDepth.avgDepth | number | Average revision depth across all edited regions. |
revisionDepth.regionsRevisedMultipleTimes | number | Number of distinct text regions edited more than once. |
proportionBehindFrontier | number | Proportion of keydowns occurring behind the text frontier (high water mark). Higher = more revision. |
substitutedWordsCount | number | Count of word-level select-then-replace events (Deane 2026). |
jumpToEditFrequency | number | Ratio of non-local cursor jumps that precede an edit action (Deane 2026). |
jumpDistanceSd | number | Standard deviation of cursor travel distances during non-local jumps (Deane 2026 + Conijn 2019). |
revisionAtPriorRatio | number | Ratio of corrections occurring at a prior position (behind the frontier). |
revisionAtFrontierRatio | number | Ratio of corrections occurring at the point of inscription (at the frontier). |
insertionDeletion.insertionCount | number | Total number of insertion operations. |
insertionDeletion.totalInsertionChars | number | Total characters inserted across all insertions. |
insertionDeletion.insertionLengthMean | number | Mean characters per insertion. |
insertionDeletion.insertionLengthMedian | number | Median characters per insertion. |
insertionDeletion.deletionCount | number | Total number of deletion operations. |
insertionDeletion.totalDeletionChars | number | Total characters deleted across all deletions. |
insertionDeletion.deletionLengthMean | number | Mean characters per deletion. |
insertionDeletion.appendToInsertionRatio | number | Ratio of appends (insertions at end) to all insertions (0-1). High = linear writing; low = revision-heavy. |
productProcessRatio | number | Ratio of final text length to total characters typed. Low values indicate heavy revision; 1.0 = no deletions. |
pauseLocation.beforeSentence | object | Pauses occurring before sentence boundaries. |
pauseLocation.beforeSentence.count | number | Number of pauses at this location. |
pauseLocation.beforeSentence.meanDuration | number | Mean pause duration in milliseconds. |
pauseLocation.beforeWord | object | Pauses occurring before word boundaries. |
pauseLocation.beforeWord.count | number | Number of pauses at this location. |
pauseLocation.beforeWord.meanDuration | number | Mean pause duration in milliseconds. |
pauseLocation.withinWord | object | Pauses occurring within words (mid-word hesitation). |
pauseLocation.withinWord.count | number | Number of pauses at this location. |
pauseLocation.withinWord.meanDuration | number | Mean pause duration in milliseconds. |
pauseLocation.afterWord | object | Pauses occurring after word boundaries. |
pauseLocation.afterWord.count | number | Number of pauses at this location. |
pauseLocation.afterWord.meanDuration | number | Mean pause duration in milliseconds. |
pauseLocation.betweenWords | object | Pauses occurring between words (inter-word gaps). |
pauseLocation.betweenWords.count | number | Number of pauses at this location. |
pauseLocation.betweenWords.meanDuration | number | Mean pause duration in milliseconds. |
proportionEventsAfterLastChar | number | Proportion of keydown events where cursor position >= current text length (at the forward edge). |
proportionCharsInMultiWordInsert | number | Proportion of total characters entered via multi-word paste events (2+ words). |
Session Continuity
Section titled “Session Continuity”Access via analysis.sessionContinuity. Behavioral consistency throughout the session — detects abrupt rhythm shifts and tab-away patterns.
Each category has an indicator (IndicatorOutput) with a machine-readable code and numeric params.
Metrics
Section titled “Metrics”| Metric | Type | Description |
|---|---|---|
changePoints | object[] | Points where typing behavior shifted abruptly during the session. |
changePoints[].timestamp | number | Milliseconds from session start when the change occurred. |
changePoints[].metric | string | Which behavioral metric changed (e.g. “flightTimeMean”). |
changePoints[].valueBefore | number | Metric value before the change point. |
changePoints[].valueAfter | number | Metric value after the change point. |
changePoints[].magnitude | number | Absolute magnitude of the change. |
tabAwayEvents | object[] | Periods when the user navigated away from the tab. |
tabAwayEvents[].leftAt | number | Milliseconds from session start when the user left the tab. |
tabAwayEvents[].returnedAt | number | Milliseconds from session start when the user returned. |
tabAwayEvents[].duration | number | Duration of the tab-away in milliseconds. |
tabAwayEvents[].activityAfterReturn | 'typing' | 'paste' | 'idle' | What the user did upon returning to the tab. |
segmentComparison | MultiTimeSeries | Behavioral metrics compared across session segments over time. |
activeTime | ActiveTimeResult | Active vs idle time model for this session’s continuity analysis. |
Physical Plausibility
Section titled “Physical Plausibility”Access via analysis.physicalPlausibility. Whether the events could have been produced by a physical keyboard. Checks event timing, modifier key usage, and input method consistency.
Each category has an indicator (IndicatorOutput) with a machine-readable code and numeric params.
Metrics
Section titled “Metrics”| Metric | Type | Description |
|---|---|---|
impossibleSequences.count | number | Number of keystroke pairs faster than humanly possible. |
impossibleSequences.timeline | TimeSeries | Timeline of impossible sequence occurrences. |
impossibleSequences.samples | object[] | Individual impossible sequence occurrences with timestamps and durations. |
impossibleSequences.samples[].timestamp | number | Milliseconds from session start when the impossible sequence occurred. |
impossibleSequences.samples[].durationMs | number | Observed inter-key duration in milliseconds (below human minimum). |
syntheticEventRatio | number | Ratio of events with isTrusted: false (0-1). |
mouseActivityDuringTyping.periodsWithMouseActivity | number | Ratio of typing periods with recent mouse activity (0-1). |
mouseActivityDuringTyping.longestGapWithoutMouse | number | Longest gap (ms) between mouse events during typing. |
zeroLatencyEventCount | number | Events with zero milliseconds between them. |
unmatchedKeydownCount | number | Keydown events without a corresponding keyup. |
bulkInsertCharCount | number | Characters inserted in bulk rather than individual keystrokes. |
modifierEventCount | number | Total shift keydown events observed. |
uncoveredCaseCount | number | Uppercase characters produced without a preceding shift keydown. |
modifierLateralBalance | number | Proportion of shift events that are ShiftLeft (0-1, -1 = no shifts). |
modifierCoverage | number | Ratio of shift events to uppercase characters. |
modifierSustainCount | number | Times shift was held across 2+ character keydowns. |
nonStandardKeys | object[] | Keys not found on standard keyboard layouts, with occurrence counts. |
nonStandardKeys[].key | string | The key value that is not on standard layouts. |
nonStandardKeys[].count | number | Number of times this non-standard key was pressed. |
Temporal Patterns
Section titled “Temporal Patterns”Access via analysis.temporalPatterns. Typing speed changes, fatigue, warmup, burst patterns, and pause characteristics over the session.
Each category has an indicator (IndicatorOutput) with a machine-readable code and numeric params.
Metrics
Section titled “Metrics”| Metric | Type | Description |
|---|---|---|
sessionDurationMs | number | Total session length in milliseconds. |
speedTimeline | TimeSeries | Typing speed (characters per minute) plotted over time. |
fatigueRatio | number | Ratio of late-session speed to early-session speed. Values < 1 indicate fatigue (slowing down). |
warmupRatio | number | Ratio of initial typing speed to overall speed. Values < 1 indicate warmup (started slow). |
pauseDistribution.histogram | BinnedData[] | Histogram bins for pause duration distribution. |
pauseDistribution.count | number | Total number of pauses detected. |
pauseDistribution.meanDuration | number | Mean pause duration in milliseconds. |
burstPattern.avgBurstLength | number | Average number of keystrokes per typing burst. |
burstPattern.avgBurstSpeed | number | Average typing speed (characters per minute) within bursts. |
burstPattern.burstToTotalRatio | number | Ratio of keystrokes occurring within bursts to total keystrokes (0-1). |
burstPattern.burstDurationSd | number | Standard deviation of burst durations (ms). High = varied composition; low = uniform transcription. |
burstPattern.burstDurationCv | number | Variability of burst durations relative to the mean (standard deviation / mean). |
pause200ms | object | Short pauses (>200ms). Micro-pauses reflect word-level planning. |
pause200ms.count | number | Number of pauses exceeding 200ms. |
pause200ms.meanDuration | number | Mean duration of 200ms+ pauses in milliseconds. |
pause200ms.sdDuration | number | Standard deviation of 200ms+ pause durations. |
pause200ms.pauseRate | number | Pauses per keydown (count / total keydowns). |
pause2000ms | object | Long pauses (>2000ms). Cognitive pauses reflect sentence/paragraph-level planning. |
pause2000ms.count | number | Number of pauses exceeding 2000ms. |
pause2000ms.meanDuration | number | Mean duration of 2000ms+ pauses in milliseconds. |
pause2000ms.sdDuration | number | Standard deviation of 2000ms+ pause durations. |
pause2000ms.pauseRate | number | Pauses per keydown (count / total keydowns). |
shortToLongPauseRatio | number | Ratio of short pauses (200ms+) to long pauses (2000ms+). Higher = more fluent typing. |
fluencySd5seg | number | Standard deviation of typing speed across 5-second segments. Measures fluency variability. |
fluencySd10seg | number | Standard deviation of typing speed across 10-second segments. Measures fluency variability at coarser granularity. |
burstClassification.pBurstCount | number | Number of P-bursts (pause-bounded bursts between pauses >200ms). |
burstClassification.pBurstMedianDuration | number | Median duration of P-bursts in milliseconds. |
burstClassification.rBurstCount | number | Number of R-bursts (revision-bounded bursts between corrections). |
burstClassification.rBurstMedianDuration | number | Median duration of R-bursts in milliseconds. |
burstClassification.pToRRatio | number | Ratio of P-bursts to R-bursts. Reflects composition strategy. |
Writing Process
Section titled “Writing Process”Access via analysis.writingProcess. Classifies session windows into planning, drafting, and revision phases based on behavioral features.
Each category has an indicator (IndicatorOutput) with a machine-readable code and numeric params.
Metrics
Section titled “Metrics”| Metric | Type | Description |
|---|---|---|
segments | WritingProcessSegment[] | Classified segments (one per temporal window). |
transitions | PhaseTransition[] | Phase transition counts and probabilities (for flow graph). |
timeInPhase | object | Aggregate time-in-phase fractions. |
timeInPhase.planning | number | Fraction of session time in planning (0-1). |
timeInPhase.drafting | number | Fraction of session time in drafting (0-1). |
timeInPhase.revision | number | Fraction of session time in revision (0-1). |
phaseChangeCount | number | Number of phase changes during the session. |
windowDurationMs | number | Temporal window duration used for segmentation (ms). |
phaseTimeline | TimeSeries | Phase timeline: timestamps + phase index (0=planning, 1=drafting, 2=revision). |
Shared Types
Section titled “Shared Types”IndicatorOutput
Section titled “IndicatorOutput”Machine-readable indicator with WT-NNN code and numeric params.
| Metric | Type | Description |
|---|---|---|
code | string | Indicator code (e.g. “WT-100”, “WT-205”). |
params | Record<string, number> | Numeric parameters specific to this indicator (e.g. pastedRatio: 0.62). |
TimeSeries
Section titled “TimeSeries”Parallel arrays. All timestamps in ms from session start.
| Metric | Type | Description |
|---|---|---|
timestamps | number[] | Timestamps in milliseconds from session start. |
values | number[] | Values corresponding to each timestamp. |
MultiTimeSeries
Section titled “MultiTimeSeries”Multiple named series sharing the same timestamp axis.
| Metric | Type | Description |
|---|---|---|
timestamps | number[] | Timestamps in milliseconds from session start. |
series | Record<string, number[]> | Named data series, each an array of values aligned with timestamps. |
BinnedData
Section titled “BinnedData”A single bin in a histogram.
| Metric | Type | Description |
|---|---|---|
binStart | number | Lower bound of the bin (inclusive), in the metric’s unit. |
binEnd | number | Upper bound of the bin (exclusive), in the metric’s unit. |
count | number | Number of observations falling in this bin. |
SessionSegment
Section titled “SessionSegment”A classified time segment within the session.
| Metric | Type | Description |
|---|---|---|
startTime | number | Milliseconds from session start when this segment begins. |
endTime | number | Milliseconds from session start when this segment ends. |
type | | 'typing' | 'paste' | 'pause' | 'tabAway' | 'autocomplete' | 'navigating' | The activity type during this segment. |
IntegrityProof
Section titled “IntegrityProof”SHA-256 hash chain over raw events for tamper detection.
| Metric | Type | Description |
|---|---|---|
algorithm | 'SHA-256' | The hashing algorithm used. |
checkpoints | object[] | — |
checkpoints[].index | number | Checkpoint index (sequential from 0). |
checkpoints[].hash | string | SHA-256 hash at this checkpoint. |
checkpoints[].eventCount | number | Cumulative event count at this checkpoint. |
checkpoints[].timestamp | number | Timestamp (ms from session start) of this checkpoint. |
finalDigest | string | Final SHA-256 digest covering all events. |
eventCount | number | Total number of events in the hash chain. |
ActiveTimeWindow
Section titled “ActiveTimeWindow”A contiguous window of active writing time (no idle gaps).
| Metric | Type | Description |
|---|---|---|
startMs | number | Start of the active window in milliseconds from session start. |
endMs | number | End of the active window in milliseconds from session start. |
ActiveTimeResult
Section titled “ActiveTimeResult”Active vs idle time breakdown using 3-tier gap classification (typing pause, thinking pause, idle break).
| Metric | Type | Description |
|---|---|---|
activeDurationMs | number | Total active writing time in milliseconds (excludes idle gaps). |
idleDurationMs | number | Total idle time in milliseconds (thinking pauses + idle breaks). |
activeWindows | ActiveTimeWindow[] | Contiguous windows of active writing, gaps between windows are idle time. |
thinkingPauseCount | number | Number of thinking pauses detected (medium-length gaps). |
idleBreakCount | number | Number of idle breaks detected (long gaps). |
WindowFeatures
Section titled “WindowFeatures”Per-window behavioral features used for writing process classification.
| Metric | Type | Description |
|---|---|---|
cognitivePauseRate | number | Cognitive pauses (>2000ms) per keydown in this window. |
burstRatio | number | Fraction of keydown time spent in bursts (flight <200ms). |
correctionRate | number | Corrections / keydowns in this window. |
forwardEdgeRatio | number | Fraction of keydowns at or beyond the text frontier. |
cpm | number | Characters per minute in this window. |
WritingProcessSegment
Section titled “WritingProcessSegment”A classified writing process segment spanning one temporal window.
| Metric | Type | Description |
|---|---|---|
startTime | number | ms from session start. |
endTime | number | ms from session start. |
phase | 'planning' | 'drafting' | 'revision' | ”planning”, “drafting”, or “revision”. |
confidence | number | Classification confidence (0-1). |
features | WindowFeatures | Per-window features that drove the classification. |
PhaseTransition
Section titled “PhaseTransition”| Metric | Type | Description |
|---|---|---|
from | 'planning' | 'drafting' | 'revision' | The phase being transitioned from. |
to | 'planning' | 'drafting' | 'revision' | The phase being transitioned to. |
count | number | Number of consecutive-window transitions from → to. |
probability | number | Probability of this transition given from (0-1). |