Skip to content

Analysis Reference

Complete reference for every metric in the SessionAnalysis object returned by getAnalysis(). See Analysis for usage examples and indicator descriptions.

Top-level fields on the analysis result object.

MetricTypeDescription
versionstringSchema version of the analysis output (e.g. “1.0.0”).
localestringBrowser locale at time of analysis (e.g. “en-US”). Empty in Node.js.
analyzedAtnumberUnix timestamp (ms) when the analysis was performed.
sufficientDatabooleanWhether enough data was captured for meaningful analysis (30+ keydowns, 5+ seconds).
keydownCountnumberTotal keydown events recorded during the session.
integrityIntegrityProofSHA-256 hash chain over raw events for tamper detection.
sessionTimelineSessionSegment[]Classified timeline segments (typing, paste, pause, tabAway, autocomplete, navigating).
initialTextLengthnumberCharacter count of any pre-existing text when tracking started.
initialTextHashstringSHA-256 hash of the initial text content.
finalTextLengthnumberCharacter count of the text when tracking stopped.
finalTextHashstringSHA-256 hash of the final text content.
activeTimeActiveTimeResultActive vs idle time breakdown for the entire session.
outputSignaturestringHex-encoded DER signature over the analysis output for tamper verification.
signedPayloadstringThe exact JSON bytes that were signed, for cross-language verification. (optional)

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.

MetricTypeDescription
charactersByOrigin.typednumberRatio of characters typed directly (0-1, sums to 1.0 with other fields)
charactersByOrigin.pastednumberRatio of characters pasted (0-1, sums to 1.0 with other fields)
charactersByOrigin.autocompletednumberRatio of characters from autocomplete (0-1, sums to 1.0 with other fields)
pasteEventsobject[]Individual paste events with timing, source, and rework details.
pasteEvents[].timestampnumberMilliseconds from session start when the paste occurred.
pasteEvents[].characterCountnumberNumber 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[].precedingTabAwayDurationnumberMilliseconds the user was away (tab-away) immediately before this paste. (optional)
pasteEvents[].contentMatchedDocumentbooleanWhether the pasted content matched existing document text (internal restructuring).
pasteEvents[].editsInRegionnumberNumber of keydowns within the paste region within 60 seconds.
pasteEvents[].firstEditDelayMsnumberMilliseconds from paste to first edit within the paste region. (optional)
pasteEvents[].reworkRationumberRatio 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.internalPasteRationumberRatio of chars from internal paste (cut-paste restructuring) to total chars (0-1)
pasteClassification.externalPasteRationumberRatio of chars from external paste (outside content) to total chars (0-1)
pasteClassification.unknownPasteRationumberRatio of chars from unknown-source paste to total chars (0-1)
pasteEditSummary.pasteRetentionRatenumberFraction of pastes with zero edits in their region within 60 seconds (0-1)
pasteEditSummary.meanModificationDelayMsnumberAverage delay (ms) from paste to first edit, across pastes that were edited
pasteEditSummary.pasteToTypeRationumberRatio of pasted characters to typed characters
pasteEditSummary.meanReworkRationumberAverage rework ratio across all pastes
pasteEditSummary.pasteLengthMeannumberMean paste length in characters
pasteEditSummary.pasteLengthStdnumberStandard deviation of paste lengths
pasteEditSummary.pasteLengthMinnumberMinimum paste length in characters
pasteEditSummary.pasteLengthMaxnumberMaximum paste length in characters
contentTimelineMultiTimeSeriesCharacter origin ratios (typed/pasted/autocompleted) over time.

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.

MetricTypeDescription
dwellTimeDistribution.meannumberMean key hold duration in milliseconds.
dwellTimeDistribution.cvnumberVariability of dwell times relative to the mean (standard deviation / mean). Higher values indicate more variation.
dwellTimeDistribution.histogramBinnedData[]Histogram bins for dwell time distribution.
flightTimeDistribution.meannumberMean inter-key interval in milliseconds.
flightTimeDistribution.cvnumberVariability of flight times relative to the mean (standard deviation / mean). Higher values indicate more variation.
flightTimeDistribution.histogramBinnedData[]Histogram bins for flight time distribution.
periodicityScorenumberHow periodic the keystroke rhythm is (0-1, higher = more periodic/mechanical).
entropynumberShannon entropy of timing intervals. Higher entropy = more human-like variability.
timingOverTimeMultiTimeSeriesTiming metrics (dwell, flight) tracked across the session.

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.

MetricTypeDescription
correctionRatenumberRatio of correction keystrokes (Backspace/Delete) to total keystrokes (0-1).
correctionCountnumberTotal number of correction keystrokes (Backspace/Delete).
navigationCountnumberNumber of arrow key navigation events.
undoRedoCountnumberNumber of undo/redo operations (Ctrl+Z / Ctrl+Y).
editPatternsobject[]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[].countnumberNumber of times this edit pattern was observed.
correctionTimelineTimeSeriesCorrection rate plotted over time.
revisionDepth.maxDepthnumberMaximum number of times any single text region was revised.
revisionDepth.avgDepthnumberAverage revision depth across all edited regions.
revisionDepth.regionsRevisedMultipleTimesnumberNumber of distinct text regions edited more than once.
proportionBehindFrontiernumberProportion of keydowns occurring behind the text frontier (high water mark). Higher = more revision.
substitutedWordsCountnumberCount of word-level select-then-replace events (Deane 2026).
jumpToEditFrequencynumberRatio of non-local cursor jumps that precede an edit action (Deane 2026).
jumpDistanceSdnumberStandard deviation of cursor travel distances during non-local jumps (Deane 2026 + Conijn 2019).
revisionAtPriorRationumberRatio of corrections occurring at a prior position (behind the frontier).
revisionAtFrontierRationumberRatio of corrections occurring at the point of inscription (at the frontier).
insertionDeletion.insertionCountnumberTotal number of insertion operations.
insertionDeletion.totalInsertionCharsnumberTotal characters inserted across all insertions.
insertionDeletion.insertionLengthMeannumberMean characters per insertion.
insertionDeletion.insertionLengthMediannumberMedian characters per insertion.
insertionDeletion.deletionCountnumberTotal number of deletion operations.
insertionDeletion.totalDeletionCharsnumberTotal characters deleted across all deletions.
insertionDeletion.deletionLengthMeannumberMean characters per deletion.
insertionDeletion.appendToInsertionRationumberRatio of appends (insertions at end) to all insertions (0-1). High = linear writing; low = revision-heavy.
productProcessRationumberRatio of final text length to total characters typed. Low values indicate heavy revision; 1.0 = no deletions.
pauseLocation.beforeSentenceobjectPauses occurring before sentence boundaries.
pauseLocation.beforeSentence.countnumberNumber of pauses at this location.
pauseLocation.beforeSentence.meanDurationnumberMean pause duration in milliseconds.
pauseLocation.beforeWordobjectPauses occurring before word boundaries.
pauseLocation.beforeWord.countnumberNumber of pauses at this location.
pauseLocation.beforeWord.meanDurationnumberMean pause duration in milliseconds.
pauseLocation.withinWordobjectPauses occurring within words (mid-word hesitation).
pauseLocation.withinWord.countnumberNumber of pauses at this location.
pauseLocation.withinWord.meanDurationnumberMean pause duration in milliseconds.
pauseLocation.afterWordobjectPauses occurring after word boundaries.
pauseLocation.afterWord.countnumberNumber of pauses at this location.
pauseLocation.afterWord.meanDurationnumberMean pause duration in milliseconds.
pauseLocation.betweenWordsobjectPauses occurring between words (inter-word gaps).
pauseLocation.betweenWords.countnumberNumber of pauses at this location.
pauseLocation.betweenWords.meanDurationnumberMean pause duration in milliseconds.
proportionEventsAfterLastCharnumberProportion of keydown events where cursor position >= current text length (at the forward edge).
proportionCharsInMultiWordInsertnumberProportion of total characters entered via multi-word paste events (2+ words).

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.

MetricTypeDescription
changePointsobject[]Points where typing behavior shifted abruptly during the session.
changePoints[].timestampnumberMilliseconds from session start when the change occurred.
changePoints[].metricstringWhich behavioral metric changed (e.g. “flightTimeMean”).
changePoints[].valueBeforenumberMetric value before the change point.
changePoints[].valueAfternumberMetric value after the change point.
changePoints[].magnitudenumberAbsolute magnitude of the change.
tabAwayEventsobject[]Periods when the user navigated away from the tab.
tabAwayEvents[].leftAtnumberMilliseconds from session start when the user left the tab.
tabAwayEvents[].returnedAtnumberMilliseconds from session start when the user returned.
tabAwayEvents[].durationnumberDuration of the tab-away in milliseconds.
tabAwayEvents[].activityAfterReturn'typing' | 'paste' | 'idle'What the user did upon returning to the tab.
segmentComparisonMultiTimeSeriesBehavioral metrics compared across session segments over time.
activeTimeActiveTimeResultActive vs idle time model for this session’s continuity analysis.

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.

MetricTypeDescription
impossibleSequences.countnumberNumber of keystroke pairs faster than humanly possible.
impossibleSequences.timelineTimeSeriesTimeline of impossible sequence occurrences.
impossibleSequences.samplesobject[]Individual impossible sequence occurrences with timestamps and durations.
impossibleSequences.samples[].timestampnumberMilliseconds from session start when the impossible sequence occurred.
impossibleSequences.samples[].durationMsnumberObserved inter-key duration in milliseconds (below human minimum).
syntheticEventRationumberRatio of events with isTrusted: false (0-1).
mouseActivityDuringTyping.periodsWithMouseActivitynumberRatio of typing periods with recent mouse activity (0-1).
mouseActivityDuringTyping.longestGapWithoutMousenumberLongest gap (ms) between mouse events during typing.
zeroLatencyEventCountnumberEvents with zero milliseconds between them.
unmatchedKeydownCountnumberKeydown events without a corresponding keyup.
bulkInsertCharCountnumberCharacters inserted in bulk rather than individual keystrokes.
modifierEventCountnumberTotal shift keydown events observed.
uncoveredCaseCountnumberUppercase characters produced without a preceding shift keydown.
modifierLateralBalancenumberProportion of shift events that are ShiftLeft (0-1, -1 = no shifts).
modifierCoveragenumberRatio of shift events to uppercase characters.
modifierSustainCountnumberTimes shift was held across 2+ character keydowns.
nonStandardKeysobject[]Keys not found on standard keyboard layouts, with occurrence counts.
nonStandardKeys[].keystringThe key value that is not on standard layouts.
nonStandardKeys[].countnumberNumber of times this non-standard key was pressed.

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.

MetricTypeDescription
sessionDurationMsnumberTotal session length in milliseconds.
speedTimelineTimeSeriesTyping speed (characters per minute) plotted over time.
fatigueRationumberRatio of late-session speed to early-session speed. Values < 1 indicate fatigue (slowing down).
warmupRationumberRatio of initial typing speed to overall speed. Values < 1 indicate warmup (started slow).
pauseDistribution.histogramBinnedData[]Histogram bins for pause duration distribution.
pauseDistribution.countnumberTotal number of pauses detected.
pauseDistribution.meanDurationnumberMean pause duration in milliseconds.
burstPattern.avgBurstLengthnumberAverage number of keystrokes per typing burst.
burstPattern.avgBurstSpeednumberAverage typing speed (characters per minute) within bursts.
burstPattern.burstToTotalRationumberRatio of keystrokes occurring within bursts to total keystrokes (0-1).
burstPattern.burstDurationSdnumberStandard deviation of burst durations (ms). High = varied composition; low = uniform transcription.
burstPattern.burstDurationCvnumberVariability of burst durations relative to the mean (standard deviation / mean).
pause200msobjectShort pauses (>200ms). Micro-pauses reflect word-level planning.
pause200ms.countnumberNumber of pauses exceeding 200ms.
pause200ms.meanDurationnumberMean duration of 200ms+ pauses in milliseconds.
pause200ms.sdDurationnumberStandard deviation of 200ms+ pause durations.
pause200ms.pauseRatenumberPauses per keydown (count / total keydowns).
pause2000msobjectLong pauses (>2000ms). Cognitive pauses reflect sentence/paragraph-level planning.
pause2000ms.countnumberNumber of pauses exceeding 2000ms.
pause2000ms.meanDurationnumberMean duration of 2000ms+ pauses in milliseconds.
pause2000ms.sdDurationnumberStandard deviation of 2000ms+ pause durations.
pause2000ms.pauseRatenumberPauses per keydown (count / total keydowns).
shortToLongPauseRationumberRatio of short pauses (200ms+) to long pauses (2000ms+). Higher = more fluent typing.
fluencySd5segnumberStandard deviation of typing speed across 5-second segments. Measures fluency variability.
fluencySd10segnumberStandard deviation of typing speed across 10-second segments. Measures fluency variability at coarser granularity.
burstClassification.pBurstCountnumberNumber of P-bursts (pause-bounded bursts between pauses >200ms).
burstClassification.pBurstMedianDurationnumberMedian duration of P-bursts in milliseconds.
burstClassification.rBurstCountnumberNumber of R-bursts (revision-bounded bursts between corrections).
burstClassification.rBurstMedianDurationnumberMedian duration of R-bursts in milliseconds.
burstClassification.pToRRationumberRatio of P-bursts to R-bursts. Reflects composition strategy.

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.

MetricTypeDescription
segmentsWritingProcessSegment[]Classified segments (one per temporal window).
transitionsPhaseTransition[]Phase transition counts and probabilities (for flow graph).
timeInPhaseobjectAggregate time-in-phase fractions.
timeInPhase.planningnumberFraction of session time in planning (0-1).
timeInPhase.draftingnumberFraction of session time in drafting (0-1).
timeInPhase.revisionnumberFraction of session time in revision (0-1).
phaseChangeCountnumberNumber of phase changes during the session.
windowDurationMsnumberTemporal window duration used for segmentation (ms).
phaseTimelineTimeSeriesPhase timeline: timestamps + phase index (0=planning, 1=drafting, 2=revision).

Machine-readable indicator with WT-NNN code and numeric params.

MetricTypeDescription
codestringIndicator code (e.g. “WT-100”, “WT-205”).
paramsRecord<string, number>Numeric parameters specific to this indicator (e.g. pastedRatio: 0.62).

Parallel arrays. All timestamps in ms from session start.

MetricTypeDescription
timestampsnumber[]Timestamps in milliseconds from session start.
valuesnumber[]Values corresponding to each timestamp.

Multiple named series sharing the same timestamp axis.

MetricTypeDescription
timestampsnumber[]Timestamps in milliseconds from session start.
seriesRecord<string, number[]>Named data series, each an array of values aligned with timestamps.

A single bin in a histogram.

MetricTypeDescription
binStartnumberLower bound of the bin (inclusive), in the metric’s unit.
binEndnumberUpper bound of the bin (exclusive), in the metric’s unit.
countnumberNumber of observations falling in this bin.

A classified time segment within the session.

MetricTypeDescription
startTimenumberMilliseconds from session start when this segment begins.
endTimenumberMilliseconds from session start when this segment ends.
type| 'typing' | 'paste' | 'pause' | 'tabAway' | 'autocomplete' | 'navigating'The activity type during this segment.

SHA-256 hash chain over raw events for tamper detection.

MetricTypeDescription
algorithm'SHA-256'The hashing algorithm used.
checkpointsobject[]
checkpoints[].indexnumberCheckpoint index (sequential from 0).
checkpoints[].hashstringSHA-256 hash at this checkpoint.
checkpoints[].eventCountnumberCumulative event count at this checkpoint.
checkpoints[].timestampnumberTimestamp (ms from session start) of this checkpoint.
finalDigeststringFinal SHA-256 digest covering all events.
eventCountnumberTotal number of events in the hash chain.

A contiguous window of active writing time (no idle gaps).

MetricTypeDescription
startMsnumberStart of the active window in milliseconds from session start.
endMsnumberEnd of the active window in milliseconds from session start.

Active vs idle time breakdown using 3-tier gap classification (typing pause, thinking pause, idle break).

MetricTypeDescription
activeDurationMsnumberTotal active writing time in milliseconds (excludes idle gaps).
idleDurationMsnumberTotal idle time in milliseconds (thinking pauses + idle breaks).
activeWindowsActiveTimeWindow[]Contiguous windows of active writing, gaps between windows are idle time.
thinkingPauseCountnumberNumber of thinking pauses detected (medium-length gaps).
idleBreakCountnumberNumber of idle breaks detected (long gaps).

Per-window behavioral features used for writing process classification.

MetricTypeDescription
cognitivePauseRatenumberCognitive pauses (>2000ms) per keydown in this window.
burstRationumberFraction of keydown time spent in bursts (flight <200ms).
correctionRatenumberCorrections / keydowns in this window.
forwardEdgeRationumberFraction of keydowns at or beyond the text frontier.
cpmnumberCharacters per minute in this window.

A classified writing process segment spanning one temporal window.

MetricTypeDescription
startTimenumberms from session start.
endTimenumberms from session start.
phase'planning' | 'drafting' | 'revision'”planning”, “drafting”, or “revision”.
confidencenumberClassification confidence (0-1).
featuresWindowFeaturesPer-window features that drove the classification.
MetricTypeDescription
from'planning' | 'drafting' | 'revision'The phase being transitioned from.
to'planning' | 'drafting' | 'revision'The phase being transitioned to.
countnumberNumber of consecutive-window transitions from → to.
probabilitynumberProbability of this transition given from (0-1).