← Tepna preprints

Pinning a sensor's error without a reference: how many co-recorded windows, and how long each, for three-cornered-hat σ across an O2Ring · Polar H10 · Verity Sense trio

Michal Planicka  ·  corresponding author — Tepna Project

PpgDex (raw PPG) · ECGDex (raw ECG) · OxyDex nodes, Tepna physiological-signal suite

Draft v1 · June 2026 · Analysis tool: sensor-trio-power-analysis.html · TCH kernel reused from sigma-no-reference-analysis.js · fully synthetic Monte-Carlo (all four tables regenerated together at 50,000 trials/cell on the WebGPU lane, 2026-08-26; the figures are still the original 720-trial renders) · single anecdotal real window via ppgdex-dsp.js (PPGDSP) + ecgdex-dsp.js (Pan–Tompkins QRS) · 100% local

Abstract

Background. The companion paper (sigma-no-reference) shows that a per-device heart-rate error σ can be recovered with no calibrated reference via a three-cornered hat (TCH) over a simultaneous O2Ring + Polar H10 + Verity Sense window. But how tight that σ is depends on how many co-recorded windows stand behind it — a single window gives a point estimate with no confidence interval. This paper answers the practitioner's question: how many co-recorded trio-windows do you actually need to pin each device's σ to a usable precision? It is the device-metrology analog of nights-icc — there, how many nights to pin a person's metric; here, how many windows to pin a sensor's error. Methods. A synthetic trio generator emits 1-Hz "true HR" per window in two variance regimes — resting (small true variance) and dynamic (exercise/recovery ramp) — plus three sensors = truth + independent noise with planted σ set to the real raw-ECG estimates (2.7 / 1.9 / 1.9 bpm). The same per-window TCH kernel and cross-window aggregation the σ-paper uses are driven over N_windows ∈ {1,2,3,5,8,12,20} with 50,000 Monte-Carlo trials per cell; an injected pair-wise error correlation ρ calibrates the assumption test. A real twenty-six-night tri-device corpus, folder-ingested and scored by the production raw-signal detectors (Verity HR ← raw PPG via PPGDSP; H10 HR ← raw ECG via Pan–Tompkins QRS; O2Ring native pulse), is laid beside the simulation band. Results. One ~1-hour trio-window pins every device σ to ≈±0.5 bpm in the clean (dynamic) regime (the O2Ring just under it, the quiet H10/Verity corners right at the line); ±0.25 is also cleared at a single window and ±0.15 by about three (Table 1) — these supersede an earlier ~5–8 / ~12–20 that this abstract carried after Table 1 was re-fit to the current planted σ and the abstract was not, a 5–20× disagreement between the paper's two most-read parts. The ±0.15 column is now converged (2026-08-15): it shipped at 720 trials/cell and was flagged indicative because 20,000 trials/cell costs 33 m 46 s on the CPU worker pool — on the WebGPU lane it costs 2.4 s, and at 20,000 the answer is 3 / 5 / 3 (O2Ring / H10 / Verity), unmoved at 50,000 and 100,000. The H10's 5 is a coarse-grid artifact: its half-width at N=3 is 0.154, missing the target by 2.5 %, with the next grid point at 5. The practical reading is ≈3 windows for every corner, and quoting minN alone off this grid overstates the ECG corner's cost by ~1.6×. Convergence is not asserted from one run: the same sweep at 1,000,000 trials/cell (26.3 s) returns the same minN and the same half-widths to ≤0.002. Window length trades against count: at a single window ~1 hour is the floor to reach ±0.5 bpm (AR(1)-autocorrelated error caps the effective samples), so finer precision comes from more windows, not longer ones. Because the hat couples the trio, the noisiest corner (the O2Ring on this corpus) sets a shared precision floor, so absolute CI half-widths are similar across devices rather than far worse for the noisy one. The regime cost is bias, not window count: the dynamic regime recovers each true σ (bias ≈0); the resting regime recovers only the independent-error floor, under-stating the instantaneous devices (H10 −0.47 bpm; Verity −0.17 bpm) because the TCH strips the shared beat-to-beat HRV. A correlated-error failure is undetectable below a few windows (ρ=0.15 caught ~4% at N=1, ~53% by N=20; ρ≥0.3 nearly always). A real twenty-six-night tri-device corpus, derived with the same raw-ECG gold leg under a fused-weight artifact-robust hat, recovers σ 2.41 / 1.28 / 1.42 bpm (O2Ring / H10 / Verity) — the companion paper's broad hat, modestly below the planted σ (kept at 2.7 / 1.9 / 1.9, the pre-fused estimates the sim was seeded from). Conclusion. Report σ only with N_windows and a CI; one clean dynamic window pins the trio to ±0.5 bpm, but resting nights buy precision while quietly biasing the answer — a non-resting session is what makes the assumption hold and recovers the full σ. This is a fully synthetic power result under stated noise assumptions; the real twenty-six-night corpus validates the σ recovery (close to the planted σ), but the sample-size curves themselves rest on the simulation.

Keywords: measurement uncertainty · sample size · statistical power · three-cornered hat · reference-free metrology · Monte-Carlo · heart rate · wearables · raw PPG / ECG

0. Layman overview (delete before submission)

Every sensor that reports your heart rate is a little bit wrong. A companion study showed a neat trick: wear three different devices at once and you can measure how wrong each one is without any lab "truth" machine — the three disagreements, taken together, reveal each device's own error. The catch is that one night of doing this gives you a single guess with no error bars. So the practical question here is: how many nights of wearing all three do you need before you can trust each device's wrongness number?

Using simulated nights where we know the true answer, with one real recorded night shown alongside as an anecdote, we found: one ~hour-long session already pins each device to within about half a beat — and, on the current numbers, to within a quarter-beat as well; getting to a sixth of a beat takes about three sessions. A surprising part: the trick works best on a moving night (a walk plus recovery), not a still resting night — on a perfectly still night the math quietly under-counts the chest strap's and armband's error. And below a few sessions you can't even tell whether the three devices are failing together (which breaks the trick) or just being noisy. The headline: never quote a device's error without saying how many nights it came from. (The recipe is proven entirely in simulation; the single real night is just an anecdote that happens to agree.)

So how many minutes do you actually need?

Bottom line: ~1 hour minimum for a ballpark, a handful of hours for a precise number.

1. Introduction

A number a sensor reports is only as useful as the uncertainty attached to it, and the companion paper Measuring a device's σ without a canonical reference established how to obtain that uncertainty with no laboratory standard: the three-cornered hat (TCH), in which three devices measuring the same true heart rate let each device's own error variance be recovered from the three pairwise difference variances. That paper's weak corner was the Verity Sense, whose σ rested on a single ~2-hour overlap window — a point estimate with no confidence interval and no way to test the method's core assumption that the three devices' errors are uncorrelated.

This paper turns "one window" into "how many windows do you need." It is the metrology twin of How many nights?: that paper asks how many nights make a person's metric a reliable trait (ICC, Spearman–Brown); this asks how many trio-windows pin a sensor's error σ (TCH CI versus N). The unknown is different — there it is the between- vs within-subject variance of a metric, here it is the measurement-error variance of an instrument — but the deliverable is the same shape: a curve of precision against the number of occasions and a minimum-N recommendation. Two features make it more than a rehash. First, regime dependence: the TCH's variance estimates behave differently when the true HR variance is small (resting) versus large (dynamic), so the answer is "how many nights of what kind." Second, assumption-testability: a negative recovered variance is the tell of correlated device errors, and "how many windows before that failure is even checkable" is itself a result. The result is fully synthetic (the planted ground truth is what makes the answer defensible), and a single co-recorded real window is included only as an anecdotal comparison, not a validation cohort.

2. Methods

2.1 Synthetic trio generator (the power arm)

A small dedicated generator (in sensor-trio-power-analysis.js; it does not touch cohort-gen.js) builds, per window, a synthetic 1-Hz "true HR" series of realistic length (≈3,600 s) under a controllable variance regime: resting (slow drift, small true variance) and dynamic (an exercise/recovery ramp, large true variance). Three sensors are then formed as truth + independent Gaussian noise with planted per-device σ fixed to the paper's real estimates — σO2Ring=2.7, σH10=1.9, σVerity=1.9 bpm (the raw-ECG real-hat estimates) — with an AR(1) component (φ=0.9) so the noise is temporally correlated like a real residual rather than white. A shared beat-to-beat HRV term (the physiological signal the instantaneous devices track and the smoothed O2Ring partly averages out) is layered on truth; an optional injected error correlation ρ between a device pair calibrates the assumption test.

2.2 Estimator under test — the same TCH kernel

The estimator is the unmodified per-window TCH kernel and cross-window aggregation built for the σ-corner work and reused verbatim from sigma-no-reference-analysis.js — for three devices A, B, C with pairwise difference variances VAB, VAC, VBC:

σ²_A = ½(V_AB + V_AC − V_BC) , σ²_B = ½(V_AB + V_BC − V_AC) , σ²_C = ½(V_AC + V_BC − V_AB)

a negative output flags a broken independence assumption.

Why this simulation is the only way to validate the hat — a hat cannot be validated by one of its own corners. It is tempting to skip the Monte-Carlo arm and instead check the estimator on real data by treating the most trustworthy corner (the chest-ECG) as truth. That experiment has exactly zero power, by algebra rather than by sample size. Measuring the other two corners against corner E gives errors eP = P − E and eO = O − E, which share the term −errE; expanding var(P − O) = var(eP) + var(eO) − 2·cov(eP, eO) and substituting into the kernel above collapses it to

σ²_E = ½[ var(E−P) + var(E−O) − var(P−O) ] = cov(e_P, e_O)

so the hat's σ²E is the covariance of the other two corners' reference-relative errors — the measured correlation and the independence null are the same number, and their difference is identically zero (verified numerically on the committed corpus: 6.068154 vs 6.068154, difference 7×10⁻¹⁴). The σ comparison collapses the same way, since the hat reproduces the pairwise variances by construction. Any "excess correlation" or "σ accuracy" reported against an internal corner would be an artifact of the algebra, not a finding. Validating a three-cornered hat therefore requires either a genuinely external Nth device — chosen so the truth leg is not mechanistically twinned with a corner — or planted ground truth, which is what the simulation below supplies. For each N_windows ∈ {1,2,3,5,8,12,20} we draw N windows, recover each device's σ̂, and repeat 50,000 Monte-Carlo trials per cell, reporting the bias of σ̂ (vs the planted total for that regime) and the 95% CI half-width across trials. We tabulate the minimum N to reach target half-widths of ±0.5, ±0.25, and ±0.15 bpm, sweep the injected ρ ∈ {0, 0.15, 0.3, 0.5, 0.7} for the assumption test, and run the whole grid under both regimes.

2.3 Anecdotal real-data comparison

The anecdotal real comparison uses the trio windows produced by the σ-corner derivation pipeline (SIGMA-WINDOW-DERIVATION.md): Verity HR derived from raw PPG with the production PPGDSP.analyze (SQI-gated), the H10 gold leg derived from raw ECG by Pan–Tompkins QRS (ECGDSP), the O2Ring native per-second pulse, all aligned on the Clock Contract's floating-ms grid. These detectors are run, not modified — this is an analysis tool, so no node is re-bundled and no provenance moves. The single committed window's σ̂ ± CI is laid beside the simulation's predicted 1/√N band as an anecdotal check (with the H10↔O2Ring leg as a built-in control); it is illustrative, not a validation set, and the paper's conclusions do not depend on it.

3. Results

3.1 One clean window pins the trio to ±0.5 bpm; the corners are coupled

In the dynamic regime σ̂ is essentially unbiased at every N (bias |·| ≤ 0.06 bpm), so precision is governed entirely by the CI half-width, which shrinks as ~1/√N (Figure 1). A single ~1-hour window pins all three corners to ≈±0.24 bpm (already inside ±0.25); ±0.15 needs about three windows (Table 1, converged 2026-08-15; the H10 corner crosses at N ≈ 3.15 and so reads 5 off the coarse grid). Because the three planted σ are now close and small (1.9–2.7 bpm), the corners clear the coarser targets almost together at N=1. The non-obvious finding is that the half-widths are similar across devices in absolute bpm despite their differing σ: because the TCH solves the three corners jointly, the noisiest corner (the O2Ring on this corpus) injects variance into all three pairwise differences and sets a shared precision floor — while, conversely, the quietest corner is the hardest to pin to a tight relative target (its own variance is a small difference of larger pairwise variances), which is why H10 and Verity, not the O2Ring, demand the most windows at ±0.15. The practical consequence overturns the naive expectation — it is not "the noisy device needs far more windows"; the whole trio is pinned together, paced by its worst corner.

CI half-width of recovered sigma versus number of trio-windows, per device, dynamic regime
Figure 1. CI half-width of the recovered σ̂ versus N_windows, per device, dynamic regime (live output of sensor-trio-power-analysis.html, 720 Monte-Carlo trials/cell). All three corners (O2Ring amber, H10 teal, Verity violet) track a common ~1/√N curve (dashed reference) and clear ±0.5 bpm by a single window; the ±0.25 and ±0.15 targets are marked. Dark theme is the tool's native rendering.
Table 1. Minimum trio-windows to pin each device σ to a target CI half-width — dynamic regime. Regenerated 2026-08-26 at 50,000 Monte-Carlo trials/cell on the WebGPU lane (tools/trio-power-headless.mjs, adapter amd/rdna-3, 4.1 s) — one run, one seed set, shared with Tables 2, 3 and 5 (see Provenance of the simulation tables). The earlier 720-trial column is superseded; the 20,000-trial values this table previously carried are reproduced exactly by the same harness. Planted σ = 2.7 / 1.9 / 1.9 (the pre-fused raw-ECG estimates; the fused real hat is 2.41 / 1.28 / 1.42, §3.4). The half-width at N=3 is shown because minN is a threshold crossing on a coarse grid and the curve is nearly flat where it crosses ±0.15 — see the note below the table.
DevicePlanted σ (bpm)±0.50 bpm±0.25 bpm±0.15 bpmhalf-width at N=3
O2Ring (pulse)2.721130.143
Polar H10 (ECG)1.861150.154
Verity Sense (PPG)1.941130.145
Worst across devices1150.154

The ±0.15 column is now converged, and the H10's 5 is an artifact of the grid rather than a real gap. At 720 trials/cell every corner read 5; from 20,000 upward the answer is 3 / 5 / 3. It is converged rather than merely re-run: across 20,000 · 50,000 · 100,000 · 1,000,000 · 5,000,000 trials/cell no cell moves and every half-width holds to ≤0.002, and a repeat at a given trial count reproduces bit-for-bit.

trials/cellσO2 half at N=3σH10 half at N=3σVer half at N=3minN (±0.15)GPU wall time
720 (as published)not reported5 / 5 / 5
20,0000.14210.15490.14413 / 5 / 32.4 s
50,0000.14330.15390.14483 / 5 / 32.5 s
100,0000.14410.15400.14433 / 5 / 34 s
1,000,0000.14350.15380.14503 / 5 / 326.3 s
5,000,0000.14340.15370.14523 / 5 / 3129 s

The last two rows agree to 0.0002 bpm on every cell — a 5× increase in trials that moves nothing — so the Monte-Carlo term in this column is exhausted. The H10's half-width at N=3 settles at 0.154, missing the ±0.15 target by 2.5 %, and the next point on the {1, 2, 3, 5, 8, 12, 20} grid is 5 (0.123). Interpolating the ≈1/√N trend puts the true crossing at N ≈ 3.15, not 5. So the practitioner's reading is that all three corners reach ±0.15 at roughly three windows, the H10 needing a fraction more — not that the ECG corner costs 67 % more sessions than the other two. Reporting minN alone off this grid overstates that difference by ~1.6×, which is why the half-width is now printed beside it. The residual uncertainty in this column is now the grid, not the Monte-Carlo, and that is a different fix: add grid points, not trials. Adding trials past ~10⁵ buys nothing here, and the 5-million run is reported precisely to establish that ceiling rather than to improve the estimate.

Why this was left unconverged, and what fixed it. The gap was never analytic — 20,000 trials/cell is 33 m 46 s on the CPU worker pool against 2.4 s on the WebGPU lane, a ~840× difference, and that is the whole reason the published column shipped at 720. The largest runs make the point sharper: 5,000,000 trials/cell in 129 s on the GPU, against an extrapolated ~5.9 days on the CPU pool at the same trial count — a run nobody would ever start, and therefore a convergence question nobody would ever close. The lane must reach the discrete adapter to deliver that: with no flags requestAdapter() returns null, and with --enable-unsafe-webgpu alone it silently returns google/swiftshader, a software rasteriser that reports lane: webgpu while running no faster than the CPU pool — so the tool asserts the adapter is not swiftshader, and the runs above record amd/rdna-3. A convergence claim obtained from a software fallback would have been indistinguishable in the output and wrong about the cost, which is the same failure class as reading a verdict off a truncated log.

3.2 The regime cost is bias, not window count

Switching from a dynamic to a resting truth does not meaningfully change the CI half-widths — it changes the bias of what the hat recovers (Figure 2, Table 2). In the dynamic regime σ̂ recovers each device's true total error (bias ≈ 0 for all three). In the resting regime the TCH recovers only the independent-error floor: because true HR barely moves, the shared beat-to-beat HRV that the instantaneous devices (H10, Verity) faithfully track is stripped out as if it were common signal, so their σ̂ is biased low — H10 by −0.47 bpm and Verity by −0.17 bpm — while the smoothed O2Ring, which averages that HRV away anyway, drifts slightly high (+0.07 bpm). This is the quantitative reason a non-resting session is worth more than several resting ones: it is not that resting windows are noisier, it is that they answer a subtly different (and under-stated) question.

Recovered sigma versus number of windows, resting versus dynamic regime, per device
Figure 2. Recovered σ̂ versus N_windows under resting vs dynamic truth, per device. The dynamic curves sit on each device's planted σ (unbiased); the resting curves settle below it for the instantaneous devices (H10, Verity) and slightly above for the smoothed O2Ring — a regime bias, flat in N, not a precision difference.
Table 2. Recovery bias (σ̂ − true σ, bpm) by regime at N=8 windows, 50,000 trials/cell. Dynamic ≈ unbiased; resting under-recovers the instantaneous devices because the TCH strips shared HRV. Flat in N as claimed — measured, not asserted: across N = 1…20 every cell moves by ≤0.002. These values replace the figures carried until 2026-08-26, which belonged to a superseded planted σ (1.7 / 2.2 / 3.0) and were never re-run when the σ were re-planted to the 10-night hat.
DeviceDynamic biasResting bias
O2Ring (pulse)−0.010+0.034
Polar H10 (ECG)−0.041−0.587
Verity Sense (PPG)−0.039−0.554

3.3 Below a few windows the uncorrelated-error assumption is uncheckable

The TCH assumes the three devices' errors are independent; a negative recovered variance is the tell that they are not. Injecting a known error correlation ρ between the H10 and Verity legs and measuring the probability that at least one window produces a negative TCH variance quantifies when that failure becomes detectable (Table 3). A clean trio (ρ=0) never produces a negative across any N — the method's specificity is intact. Its sensitivity, however, is far weaker than this paper claimed until 2026-08-26, and the correction reverses the conclusion. At the shipped planted σ, ρ=0.15, 0.30 and even 0.50 produce no negatives at any N; only ρ=0.70 registers at all, and then in 1% of single windows rising to 16% by twenty.

This is not a Monte-Carlo accident — it follows analytically from the estimator, which is why the earlier figures could not be reproduced at any trial count. For a three-cornered hat over a pair sharing covariance c, the H10 corner recovers σ²H10 = σ²H10c, and the injection sets c = ρ·σ₀H10·σ₀Ver. A negative therefore requires ρ > σ₀H10 / σ₀Ver — a pure function of the two paired devices' floor σ, with no dependence on N or on trial count. At the shipped hat that threshold is 1.279 / 1.393 = 0.918; under the superseded interim σ it was 0.648. Both predictions match the measured onsets, and no planted σ ever committed to this repository yields the ≈0.3 onset the previous table implied.

The corrected reading is stronger and less comfortable: the negative-variance tell cannot certify the independence assumption at all for any realistic correlation. Because the two paired devices have near-equal error floors, the threshold sits just below ρ=1 — so a σ can be quoted from any number of windows, with every TCH variance positive, while a substantial H10↔Verity error correlation goes entirely undetected. Reporting N alongside the number remains right, but it does not buy assumption-checking; that requires an independent test, not this one.

Table 3. Assumption test — P(≥1 negative TCH variance across N windows) under an injected H10↔Verity error correlation ρ (resting truth), 50,000 trials/cell. Regenerated 2026-08-26; the figures carried until then are not reproducible under any planted σ committed to this repository. The ρ=0.70 row is new — at the shipped σ nothing below it registers at all.
ρ (injected)N=1N=3N=8N=20
0 (independent)0.000.000.000.00
0.150.000.000.000.00
0.300.000.000.000.00
0.500.000.000.000.00
0.700.010.030.070.16

3.4 Real-data validation — a 26-night tri-device corpus

A real tri-device corpus — one subject, nightly O2Ring + Polar H10 + Verity Sense sleep recordings, 2026-06-10→07-05 — was processed through the tool's real-data folder-ingest arm (auto-detected files, production PPGDSP for the Verity HR corner, the same TCH kernel per night, one night per worker lane, a decorrelation quality gate). Of 31 trio-eligible nights, 26 solved cleanly (the rest auto-excluded for short session-overlap or lacking any Verity HR source). To stay consistent with the companion σ-paper's raw-ECG gold leg, the H10 corner here is derived from raw ECG (Pan–Tompkins), not the device HR stream, and each night is solved by the companion paper's fused-weight artifact-robust hat (per-second beat-confidence weighting, so a transient single-corner artifact is down-weighted in place rather than detonating the variance). Recovered per-device σ̂ (median over the 26 nights, across-night CI, 291,561 simultaneous s): O2Ring ≈ 2.41 bpm [2.18–2.61], Polar H10 ≈ 1.28 [0.96–1.65] (resolving positive in 21/26 nights), Verity ≈ 1.42 [0.96–1.88]. These are the companion paper's broad twenty-six-night fused hat — the same derivation. The sim's planted σ (2.7 / 1.9 / 1.9) was set from the earlier pre-fused raw-ECG estimates and is kept as the simulation input; the fused hat lands modestly below it (the quiet H10/Verity corners by ~0.5 bpm, as the artifact-robust weighting declines to count scattered artifact seconds as device noise), which does not move the sample-size curves — those depend on σ magnitude, not its exact value, and 1.3–2.4 bpm is the same near-and-small regime as 1.9–2.7.

The noisy corner reorders from the single-window result. The σ-paper's first, six-window deep hat put Verity noisiest (3.50) and the O2Ring quietest (1.83); the broad twenty-six-night corpus reorders that — the O2Ring is noisiest (2.41), the raw-ECG H10 quietest (1.28) and Verity between (1.42) — because the broad set adds O2Ring motion nights, its Verity corner uses the cleaner production SQI-gated detector, and the TCH couples the corners so a larger corpus redistributes the common-mode variance. An earlier device-HR derivation of this same corpus (the Integrator ρ-validation) recovered Verity ≈ 2.8 / O2Ring ≈ 1.4 / H10 ≈ 0.9 bpm; the gap from the raw-ECG numbers here is the H10 leg (device HR is smoothed, raw-ECG HR is instantaneous) propagating through the coupled solve — which is exactly why both papers now standardize on the raw-ECG derivation. Two structural findings held on real data regardless of derivation: (i) the quiet-sensor-order regime — H10↔O2Ring correlate at r ≈ 0.85–0.92 every night, so their difference variance is tiny and the hat can drive the quieter corner negative (on the device-HR derivation, where H10 is very quiet, this happened on 3/10 nights; the noisiest corner stays trustworthy either way); (ii) the motion premise of the ρ estimator — on the 06-16 night the two independent accelerometers co-vary (r = 0.44) and cross-device HR divergence tracks motion (r = 0.60; 0.24 bpm at rest → 1.39 bpm in motion). The one step still owed is the end-to-end “ρ reduces divergence vs classic” comparison through the Integrator's own fusion (see docs/INTEGRATOR-TCH-REALDATA-VALIDATION-2026-07-06.md).

Real running per-device sigma with CI overlaid on the simulation prediction band
Figure 3. The simulation's predicted σ band (per device) with the one committed real trio window overlaid (N = 1, 2026-06-16/17 — the only window whose derived series ship in the repo). The overlaid band as rendered sits on the earlier classic raw-ECG broad-hat σ (O2Ring ≈ 2.60 / H10 ≈ 1.50 / Verity ≈ 1.56 bpm); the companion σ-paper's current headline is the fused-weight refinement (2.41 / 1.28 / 1.42, Figure 2 there), which this overlay adopts on the next power-tool regeneration (planted σ and the sim curves are unchanged). Regenerate from the tool's real-data arm, or drop the full night folder to accumulate more windows.
Table 4. Real comparison — 26-night tri-device corpus (26 solved of 31 eligible), fused-weight artifact-robust hat. Per-device σ̂ median + across-night 95% CI over the 26 solved nights. Production PPGDSP Verity corner, confidence-weighted TCH kernel; regenerate by dropping the capture folder into the tool's real-data arm. ⚠️ These figures state their corpus (26 nights) but not their window length or their DSP generation, and both are load-bearing. A reference-free σ moves by up to +49 % from a one-hour window to a whole night, and swapping only the PPG DSP generation on one night (2026-08-04, 22.5 ks) moved σVerity 2.14 → 4.25 bpm. Because the hat is coupled — σ²H10 = ½(VHV + VHO − VVO) — that same swap also moved σH10 1.64 → 1.85 with the ECG code byte-identical, so no corner's σ here may be attributed to its own node's processing. The generation behind these values is not recorded, so they are not presently re-derivable; see the companion σ-paper's limitation (xi).
Deviceσ̂ median (bpm)95% CIplanted (sim)
O2Ring (pulse)2.412.18 – 2.612.7
Polar H10 (ECG)1.280.96 – 1.65*1.9
Verity Sense (PPG)1.420.96 – 1.881.9

✔ RESOLVED 2026-08-15 — the ±0.15 column is converged, and Table 1 above now prints the converged values. This note previously read "NOT CONVERGED at the stated 720 trials/cell, and does not reproduce", and correctly predicted the answer: 3 / 5 / 3 against the 5 / 5 / 5 originally published. That has now been confirmed to exhaustion on the WebGPU lane (tools/trio-power-headless.mjs, adapter amd/rdna-3) — 20,000 · 50,000 · 100,000 · 1,000,000 · 5,000,000 trials/cell all return 3 / 5 / 3, with the top two runs agreeing to 0.0002 bpm on every half-width. What made this closable was throughput, not method: 5 M trials/cell is 129 s on the GPU against an extrapolated ~5.9 days on the CPU worker pool. The deeper limit stands, and no trial count removes it: minN is a quantised readout of a curve that is nearly flat where it crosses. The deciding half-widths sit only 1.5 % (O2Ring, N=2), 2.5 % (H10, N=3) and 3.2 % (Verity, N=3) from the 0.15 target, so a small change in planted σ, window length or the AR(1) term still moves whole grid steps. The half-width at each N is the stable quantity; minN discards exactly the margin a reader needs — which is why Table 1 now carries the half-width beside it. The ±0.5 and ±0.25 columns sit far from their thresholds and were unaffected throughout. The earlier decision to leave the table un-renumbered pending a re-fit is superseded: the planted σ are unchanged (still gate-pinned at 2.72 / 1.86 / 1.94), so this is a convergence fix at fixed inputs, not a re-fit, and the atomic-unit objection does not apply. *H10 resolves positive on 21/26 nights (the rest drove its variance negative under the quiet-order regime). The fused-weight hat down-weights transient single-corner artifacts in place: night 06-12, whose spurious-QRS burst spiked its per-window σ̂ to ~9.6 under the plain hat, is retained and contributes a clean σ̂H10 ≈ 2.6. Raw-ECG gold leg (Pan–Tompkins), to match the companion σ-paper's broad hat; an earlier device-HR derivation of the same corpus gave O2Ring 1.4 / H10 0.9 / Verity 2.8 (superseded). The fused real hat (2.41 / 1.28 / 1.42) sits modestly below the sim's planted σ (2.7 / 1.9 / 1.9) — kept as the simulation input, since the sample-size curves depend on σ magnitude, not its exact value.

3.5 How many minutes per window? Length trades against count

The "how many windows" answer above fixes each window at one hour, too coarse for a practitioner deciding how long to wear all three devices. Sweeping the window length at a single window (N=1, dynamic regime) makes the duration cost explicit (Figure 4, Table 5). Because the 1-Hz device error is strongly autocorrelated (AR(1), φ=0.9), the effective number of independent samples grows far slower than the raw seconds, so the σ̂ CI half-width shrinks only gradually with length: a 1-minute window leaves σ̂ uncertain to ≈1.4–2.4 bpm, 10 minutes to ≈1.0 bpm, and a full 60-minute window only just reaches ±0.5 bpm — the quiet corners (H10, Verity) need even longer than 60 min to clear it. The tighter ±0.25 and ±0.15 targets are out of reach for any single window ≤ 1 h. The practical reading: ~1 hour is the floor for one window to pin σ to ±0.5 bpm; finer precision must come from more windows, not a longer one — what ultimately matters is the total co-recorded minutes of clean (dynamic) signal, split between window length and window count (the exact length×count tradeoff at a fixed total is not separately characterized here).

CI half-width of recovered sigma versus window length in minutes, per device, N=1, dynamic regime
Figure 4. CI half-width of σ̂ versus window length (1–60 min) at a single window (N=1), dynamic regime. The curves flatten because AR(1)-autocorrelated error caps the effective sample count; only at ~60 min does the O2Ring (the loudest corner) reach ±0.5 bpm (red dashed), the quiet H10/Verity corners not within the hour, and ±0.25 / ±0.15 stay out of reach for one ≤ 1 h window.
Table 5. Minimum window length (of 1 / 2 / 5 / 10 / 20 / 30 / 60 min) to pin a single window's σ̂ to a target — dynamic regime, 50,000 trials/cell. “>60 min” = not reached within one hour. Unchanged by the 2026-08-26 regeneration — it reproduces the published values exactly.
Device→ ±0.5 bpm→ ±0.25 bpm→ ±0.15 bpm
O2Ring (pulse)20 min60 min>60 min
Polar H10 (ECG)20 min60 min>60 min
Verity Sense (PPG)20 min60 min>60 min

Provenance of the simulation tables

Tables 1, 2, 3 and 5 are all produced by one run. Before 2026-08-26 they were not: Table 1 carried a 20,000-trial run, Tables 2, 3 and 5 were labelled 720, and Tables 2 and 3 in fact belonged to a superseded planted σ (1.7 / 2.2 / 3.0) that was never re-run when the σ were re-planted to the 10-night hat. Two of the four could not be reproduced at any trial count. They are now regenerated together so that a reader can re-derive every one of them from a single command:

node tools/trio-power-headless.mjs --trials 50000

4. Discussion

The answer to "how much co-recording it takes to measure a sensor's error" has three parts. Precision: one clean window pins the trio to ±0.5 bpm, and tighter targets follow the ~1/√N law — ±0.25 at a single window and ±0.15 at about three on the current planted σ (Table 1; the ~5–8 / ~12–20 this sentence used to quote predate that re-fit, and the five it quoted after it predates the 2026-08-15 convergence run) — with the worst-across-devices column the one a practitioner should plan to. Coupling: the three-cornered hat ties the corners together, so the noisiest corner (the O2Ring on this corpus) sets a shared floor and the devices are pinned at similar absolute precision rather than the noisy one needing far more data. Regime: the dominant cost of a resting night is not variance but bias — the hat recovers only the independent-error floor and under-states the instantaneous devices, so one dynamic (exercise/recovery) session is worth several resting ones and is what makes the uncorrelated-error assumption both hold and testable. The recommendation generalizes beyond these exact devices because it scales with the true σ ratio: a noisier trio raises the shared floor and shifts every column right, but the structure — couple, then pace by the worst corner, and prefer a dynamic session — is invariant.

Limitations. This pilot is deliberately fully synthetic: it answers how N_windows controls the σ CI under the stated noise model (Gaussian + AR(1) + a shared-HRV term, planted σ at the real estimates), and that model — not any real cohort — is the basis of every result. It is not a claim that real devices obey the model; the real 26-night corpus now backs the σ recovery and the regime findings, and the planted σ are re-fit to it (2.7 / 1.9 / 1.9, raw-ECG gold leg). The planted σ values are one subject's resting estimates; a different cohort, a different wrist-PPG fit, or sustained motion artifact would move them. The assumption test injects only a single H10↔Verity correlation structure; other correlation patterns (e.g. both optical devices sharing a motion artifact) would have their own detectability curves. These results certify the sample-size method and quantify the regime trade-off in simulation; turning them into a validated real-device claim would be a separate empirical study (the 5–10 co-recorded windows, incl. a non-resting session) and is explicitly out of scope here. One further limitation applies to the real arm and, unusually, to the deliverable itself: the σ this paper's simulation is seeded from is a σ at an unstated window length. The companion's fused hat is fed a median of roughly 11,200 simultaneous seconds per night, and re-running that same estimator while varying only the seconds reaching the hat raises every corner from a one-hour window to a whole night (tools/tch-window-sensitivity.mjs). Because the minimum-N table in Table 1 is computed from the planted σ, and the planted σ are set from a real fused-hat estimate, the recommended N inherits that window-length dependence: the same devices analysed over whole nights rather than ~3-hour windows imply a noisier trio and therefore a different minimum N. The sample-size method is unaffected — it is a property of the estimator, not of the planted values — but a practitioner reading a minimum-N off Table 1 must match the window length their own analysis will use.

Update 2026-08-15 — the sensitivity has now been measured three times, and it does not transfer per corner. That band was first quoted from an independent seventeen-night box-captured corpus (σVerity +49 %, σO2Ring +28 %, σH10 +26 %). It has since been run on this paper's own twenty-four nights and then on the full 52-night committed corpus (903,265 simultaneous s, 3.1× the sample behind the companion's headline σ):

cornerfull committed corpus (52 nights)the real-arm nights (24)box corpus (17)
O2Ring+30 %+30 %+28 %
H10+45 %+51 %+26 %
Verity+24 %+4 %+49 %

The consequence for Table 1 is per-corner, not global — which is worse for a practitioner, not better. Only the O2Ring's sensitivity is stable enough to borrow (+28 / +30 / +30 % across three corpora); the H10's differs by capture path (+26 % box vs +45–51 % phone), and the Verity's is simply unstable across samples (+49 / +4 / +24 %). Since the hat couples the trio, a planted σ that is right for one corner and wrong for another does not merely shift the minimum-N — it changes which corner sets the shared precision floor, and that corner is what Table 1's binding constraint is. The band is also not one-sided: the sweep is non-monotonic in two of three corners on the full corpus (Verity peaks at 11.2 ks and falls back; the H10 dips before rising), so "add ~30 % for whole-night analysis" is not a safe correction either. The re-fit this section called owed is therefore still owed, and is now better specified: it must state a window length, report the sensitivity band per corner, and re-derive the planted σ at the window length the practitioner will actually use — a single scalar band applied to all three corners would encode the very transfer this measurement refutes.

5. Reproducibility

6. Sample size & statistical power

This pilot is self-referential: its subject is sample size, on two axes. The simulation precision is governed by the Monte-Carlo trial count per cell (50,000 here), which fixes how finely each CI half-width and bias is itself estimated; the scientific N is the number of trio-windows, whose effect on the σ CI is the result (Table 1). The synthetic arm answers the practitioner's question directly: ~5–10 windows to pin σ to a publishable CI. It does not make the uncorrelated-error assumption testable — Table 3, regenerated, shows the negative-variance tell never fires below ρ≈0.92 at the shipped σ, at any N. The one real window we hold is anecdotal — a single illustrative point, not part of that count.

Table 6. Sample-size guidance — trio-windows (the real binding axis), with the Monte-Carlo trial count (50,000/cell) that fixes the simulation's own precision.
TierSample sizeWhat it buys
Minimum (acceptable)1–2Each device σ to ≈±0.5 bpm in a clean dynamic window; a point estimate with a within-window CI. Cannot test the uncorrelated-error assumption — and at the shipped σ neither can any N (Table 3).
Recommended5–10σ to ≈±0.25 bpm with an across-window CI; the resting-vs-dynamic bias is directly measurable from the real windows. The uncorrelated-error assumption does not become checkable here — see Table 3.
Real corpus (2026-07)26 nights26 solved tri-device nights (of 31 eligible; production PPGDSP Verity corner, raw-ECG gold leg). O2Ring σ̂≈2.41, H10≈1.28, Verity≈1.42 bpm (the companion fused-weight broad hat); quiet-order regime + motion premise confirmed. Sits modestly below the planted σ (2.7 / 1.9 / 1.9), which is kept as the sim input. See the docs validation write-up.
This run — simulation50,000 trials/cell (all four tables, one run) · 720 (figures, not regenerated)This row previously claimed 720 trials/cell was enough for every number in the paper, and that claim was wrong where it mattered. It read: "each σ̂, bias and CI-half is pinned to its displayed precision (MC error on a half-width ≈ ±0.02 bpm), so the window thresholds above are the estimator's answer, not sampling noise." An MC error of ±0.02 bpm is larger than the 0.004–0.005 margins that decide the ±0.15 cells, so 720 trials could not resolve them — and did not: they read 5 / 5 / 5 against a converged 3 / 5 / 3. The ±0.5 and ±0.25 thresholds sit far from their boundaries and are safe at 720. Table 1's ±0.15 column was re-run at 5,000,000 trials/cell on the WebGPU lane (129 s, adapter amd/rdna-3) and since 2026-08-26 carries the 50,000-trial value from the single run behind all four tables — the same 3 / 5 / 3, within 0.0004 bpm; the ρ / regime tables were left at 720 on the Web-Worker pool (~15 s, 6 cores) — that gap is closed as of 2026-08-26: every table is now one 50,000-trial WebGPU run. The rendered figures are still the original 720-trial output. Discharged: the debt this row recorded — Table 5's per-window ±0.15 column is still a 720-trial figure at an untested margin — is settled; Table 5 was regenerated and reproduces its published values exactly.
Diminishing returns> ~20CI half-widths are already <±0.15 bpm in simulation; beyond here a dynamic session (removing regime bias) is worth more than another resting window.

Practical reading: 1 clean window to state each device σ to ±0.5 bpm, 5–10 to publish a CI and certify the method's assumption, with at least one non-resting session in the set. The simulation's 50,000 trials/cell pin the ±0.5 and ±0.25 half-widths to the displayed precision, and now also resolve the ±0.15 cells, whose deciding margins are smaller than the 720-trial Monte-Carlo error. Those cells were re-run at 5,000,000 trials/cell in 2026-08; Table 1 now carries the 50,000-trial values from the single regenerating run, which return the same 3 / 5 / 3 and sit within 0.0004 bpm of the 5,000,000 figures — the convergence table shows the answer is stable from 20,000 upward, so quoting one run costs nothing here.

References

  1. Project documentation: CLAUDE.md (Clock Contract, evidence-grade system), VERITY-SIGMA-CORNER-BRIEF.md, SIGMA-WINDOW-DERIVATION.md, Tepna suite.
  2. Companion method paper: papers/sigma-no-reference.html — reference-free per-device σ via the three-cornered hat.
  3. Companion "how many nights" template: papers/nights-icc.html — test–retest reliability and minimum recording length.
  4. Gray JE, Allan DW. A method for estimating the frequency stability of an individual oscillator. Proc. 28th Symp. Frequency Control. 1974:243–246 (three-cornered hat).
  5. Tavella P, Premoli A. Estimating the instabilities of N clocks by measuring differences of their readings. Metrologia. 1994;30(5):479–486. doi:10.1088/0026-1394/30/5/003
  6. Bland JM, Altman DG. Statistical methods for assessing agreement between two methods of clinical measurement. Lancet. 1986;327(8476):307–310.
  7. Efron B, Tibshirani RJ. An Introduction to the Bootstrap. Chapman & Hall; 1993 (block bootstrap for dependent data).
T © 2026 Michal Planicka ·Tepna v1.0.0 ·Apache-2.0 ·◈ Asheville, NC ·not a medical device
v2.8.0