What a Synthetic Stand-In Hid: Decomposing an Inflated Eye-Tracking Benchmark of Cognitive LoadWilliam Garrow, Boston University, Boston, MA · Georgia Institute of Technology, Atlanta, GA

On the same pipeline, the synthetic stand-in scored a third higher than the real corpus.

The stand-in erased the participant correlation, so a leakage audit run on synthetic data passes whether or not the real data leaks.

Recorded gaze, liveParticipant 5 · rated hardest · TLX 83.3 · 2×
t00.00 s
norm_pos_x0.4796
norm_pos_y0.6175
diameter34.11 px
These samples move the eye and size its pupil; nothing is smoothed. The jumps are saccades. Tap or click the eye to switch task.
02The question

A synthetic stand-in is usually validated by showing that its descriptive statistics match the source.

In 2025 I could not open the COLET corpus, so my paper said the stand-in preserved those statistics, and nobody, including me, could compare the two. Privacy rules and scarce recordings put many studies in the same spot. Once the corpus was open, I compared them.

03What I did

So I wrote the decoder

In 2025 I built the proof of concept, a classifier trained on a synthetic stand-in because the corpus ships as MATLAB v7.3 tables that no standard Python reader could decode. This year I wrote the decoder (mat73-reader, on PyPI) and opened the real recordings. Then I ran that pipeline, unchanged, on the stand-in and on the real corpus, with ungrouped and with participant-grouped 5-fold cross-validation. That is the 2×2 on the result slide.

The header and bytes are read from data_v3.mat (3.78 GB), the internals are the decoder's, and the rows are the first four of participant 5's task 2 gaze table, four of its 21 columns.
data_v3.matRaw bytes
MATLAB 7.3 MAT-file, Platform: PCWIN64, Created on: Fri Mar 24 12:03:47 2023 HDF5 schema 1.00 .
00000200 89 48 44 46 0d 0a 1a 0a .HDF...
00000210 04 00 10 00 00 00 00 00 .......
00000220 ff ff ff ff ff ff ff ff .......
00000230 ff ff ff ff ff ff ff ff .......
00000240 60 00 00 00 00 00 00 00 `......
00000250 88 00 00 00 00 00 00 00 .......
00000260 01 00 01 00 01 00 00 00 .......
00000270 11 00 10 00 00 00 00 00 .......
00000280 a8 02 00 00 00 00 00 00 .......
00000290 ff ff ff ff ff ff ff ff .......
000002a0 00 00 00 00 00 00 00 00 .......
000002b0 08 00 00 00 00 00 00 00 .......
000002c0 00 00 00 00 00 00 00 00 .......
000002d0 00 00 00 00 00 00 00 00 .......
000002e0 00 00 00 00 00 00 00 00 .......
000002f0 00 00 00 00 00 00 00 00 .......
04The corpus

47 participants in four visual-search conditions, 188 labeled task instances.

Each task ended with a raw NASA-TLX[2] (RTLX, the unweighted mean of six subscales), and my primary label is the top tertile of that mean. The 2×2 keeps the proof of concept's ten features: gaze dispersion, pupil diameter[4, 5], gaze velocity, and the fixation and saccade rates. The honest protocol adds two blink features, twelve in all, z-scored within each participant.

One of the search screens: a playroom cut into a 3 by 3 grid under a Greek instruction asking for the squares with pouffes

COLET[1], Ktistakis et al. 2022. One of its 21 search screens, as a participant saw it: “Select the squares in which pouffes are visible.” Five screens per condition, one rating after each block of five.

The COLET experiment →

Screens: COLET, Ktistakis et al. 2022, Computer Methods and Programs in Biomedicine; Zenodo 7766785, CC BY 4.0. Photographs: Quattoni and Torralba 2009, MIT Indoor Scenes. The COLET authors added the grid and the instructions.

05The result

On the same pipeline, the synthetic stand-in scored a third higher than the real corpus.

Grouping the folds by participant moves each row by less than 0.01.
UngroupedParticipant-groupedSynthetic stand-in
0.834(0.020)
0.829(0.046)
Real corpus, tertile label
0.626(0.121)
0.623(0.089)

Amber is the synthetic stand-in, blue the real corpus with the tertile label.

Every cell is macro F1, mean (SD) across five folds, on the same pipeline and features. The proof of concept replicated exactly on its own split first: positive-class F1 0.897, macro 0.916.

06Where the 0.897 came from

Where the 0.897 came from

0.916macro F1, synthetic stand-in

The proof of concept on its own split: macro F1 0.916. The dashed line is the reported 0.897, the same split in positive-class F1.

The two metrics differ by 0.02 to 0.15 across these cells. The axis starts at 0.5.

0.50.60.70.80.91.00.9162025split−0.082fivefolds−0.005Grouped−0.206Realcorpus0.623Real,grouped
Step 1 of 5
07Real recorded data

Participant 5, thirty seconds in each task

Thirty seconds of participant 5's gaze in each task, with nothing simulated. Dot size is pupil diameter at the last sample. Colors match the poster panel.

Rated easiestTLX 14.2
Rated hardestTLX 83.3
08The stand-in, measured

The stand-in, measured

Real corpusStand-in
Participant ICC, mean pupil diameter0.8480.008
|r| with the label, ten features0.085 to 0.3610.455 to 0.675
SD of the label, mean TLX19.479.45

The 2025 generator drew every feature and subscale from one hand-set difficulty term, with no participant term and no corpus statistic behind it. A stand-in fitted to the real means, SDs and correlations scored 0.555 (0.048, 25 draws), below the corpus's 0.623 on the same pipeline, so the moments carry none of the inflation.

Each block is one participant, one eye per condition: search only, then with time pressure, then counting, then both. Pupil size is that block's mean pupil diameter, from the corpus and from the archived 2025 stand-in, sorted by each person's average.

Participant ICC, mean pupil diameter0.848
09The honest protocol

The model, running right here

The 2×2 kept the 2025 pipeline as it was. Here I z-scored each feature within the participant, added two blink features, ran five participant-grouped folds over five seeds, and reported macro F1 with its SD. A twelve-coefficient logistic regression matched or beat three tree ensembles. It runs in this page.

42%Not high load
+0.0σ
+0.0σ
+0.0σ
+0.0σ
+0.0σ
+0.0σ
+0.0σ
+0.0σ
+0.0σ
+0.0σ
+0.0σ
+0.0σ
Logistic regression
0.783 (0.046)
Random forest
0.775 (0.055)
Extra trees
0.747 (0.050)
Gradient boosting
0.731 (0.046)

Probability of high load from the frozen winner's twelve coefficients, fitted on all 188 rows for this demo; 0.783 is its cross-validated score. Sliders are standard deviations from your own calm baseline; the two profiles are the corpus's class means. Arrow keys move a focused slider; Escape releases it. The gauge's pupil follows the mean pupil slider.

10Six subscales and the label sweep

Six subscales, one negative control

Mental demand scores highest, with effort within one SD of it. Physical demand sits at chance, as a model of cognitive load[3] should.

Mental demand
0.786 (0.060)
Effort
0.749 (0.051)
Frustration
0.705 (0.045)
Performance
0.647 (0.062)
Temporal demand
0.634 (0.086)
Physical (control)
0.501 (0.054)
The tick marks 0.5, chance for two classes. Macro F1, mean (SD), the honest protocol.

The label sweep

The score moves with where TLX is cut into high and low, so I fixed the top tertile before running the sweep.

0.783(0.046)

Top tertile, primary: the positive class is 36% of instances. Same model, same twelve features, same 25 participant-grouped folds. Only the labeling changes.

11Correction, 2026-08-30

The same audit, pointed at my own decoder

0.762Headline macro F1 in the accepted abstract

The accepted abstract reports 0.762. My decoder, mat73-reader, turned every empty blink table into two phantom rows and contaminated the blink features in 40 of 188 instances. An independent decoder disagreed on those tables and no others. I fixed the decoder and rebuilt the features with the protocol unchanged. Every cell without blink features reproduced, and 0.762 became 0.783. The audit of the stand-in needed the same audit on my own decoder.

Each square is one labeled instance, grouped by participant as on the measured slide. The 40 lit squares are the instances whose blink tables were empty, read from the contaminated and the corrected feature files.

Empty blink table read as two phantom rowsClean instance
12What I found

What I found

  1. 1

    Most of the inflation was structure the generator fabricated, some was the luck of one split, and almost none was leakage.

  2. 2

    The checks that caught it are standard and need no new data: grouped validation, a label sweep, and a negative control, all run on the real data.[6, 7]

  3. 3

    With one corpus and one generator, n = 188, I have shown that this can happen and have not measured how often it does.

The corpus →The COLET experiment: one task, four conditions, the 21 screens, the recording.The record →The A0 as a PDF, the protocol, the numbers ledger, the correction, the references.Contact →Email, the site, LinkedIn, GitHub, and mat73-reader.The A0 as a PDF ↗Opens the printed sheet in a new tab; save it from there.

What a Synthetic Stand-In Hid: Decomposing an Inflated Eye-Tracking Benchmark of Cognitive Load. William Garrow, Boston University, Boston, MA · Georgia Institute of Technology, Atlanta, GA. Thanks to the COLET authors for releasing the corpus.