AtomFast — retry_delay sweep (sanity)

Тестовая серия 1400–1800 мс × 4 итерации × 30 с мониторинга. Цель — валидация инфраструктуры адаптивного sweep'а перед production-прогоном.

retry_delay: 1400  ·  1500  ·  1600  ·  1700  ·  1800  ·  сигнал  ·  → анализ

Параметры серии

retry_delay диапазон
1400, 1500, 1600, 1700, 1800 мс (шаг 100)
итераций на точку
4
окно мониторинга
30 секунд / итерация (sanity; для prod — случайно 10–20 мин)
BLE-пакет дозиметра
28 байт каждые ~2.4 с (≈25 rec/min номинал)
дозиметр
AtomFast
app-сборка
com.youratom.scid.atftest (test-flavor с broadcast SET_RETRY_DELAY)
метод измерения
PC-side adb-наблюдение роста arch_* файлов в /data/data/<app>/files
дата прогона
2026-06-07 (UTC)

Stability rule

Точка retry_delay помечается UNSTABLE если выполняется хотя бы одно из условий:

Порог 17 rec/min ≈ 70 % номинала (25 rec/min). Срабатывает на систематически плохой канал, а не на разовый затяжной коннект. Бейдж «STABLE *» — точка прошла правило, но имеет отдельную шумную итерацию (одна с rec/min < 17, ИЛИ одна с sudden_disconnect, ИЛИ одна dirty-stop).

Сигнал BLE-канала (RSSI) — отдельный baseline

probe pre (60 c)

n samples (steady)
31
avg, дБм
-84.13
min, дБм
-87
max, дБм
-82

probe post (60 c)

n samples (steady)
31
avg, дБм
-84.68
min, дБм
-87
max, дБм
-83

Δ pre → post

средний сдвиг
−0.55 дБ
пауза между окнами
30 с
retry_delay в probe
1700 мс
интерпретация
в пределах шума (< 1 дБ)

Метод: app пропатчен — каждое получение BLE-пакета пишет rssi=<int> в logcat (тег AtomRssi). PC-side adb logcat -s AtomRssi:I ловит окно 60 с во время обычного подключения. Сэмпл −120 дБм в начале каждого окна — sentinel Nordic-BLE-библиотеки до первого реального чтения readRemoteRssi(), отброшен из steady-state статистики (raw n = 32, steady n = 31).

Дисклеймер: замер выполнен отдельно от sanity-серии (на момент серии RSSI-логирование ещё не было добавлено). Это baseline уровня сигнала на текущей геометрии «телефон ↔ дозиметр». Для production-прогона pre/post RSSI-probe станет частью run_sweep_adaptive.sh — окружит серию двумя окнами и зафиксирует drift сигнала, если он есть.

Уровень ~−84 дБм = средне-слабый стабильный канал. Рабочий диапазон BLE: −50 («вплотную») .. −90 («граница потерь»). Drift −0.55 дБ за 90 с (60 с + 30 с пауза + 60 с) = канал не деградирует на короткой шкале.

retry_delay = 1400 ms STABLE

retry_delay = 1400
Итерация timestamp начала Время итерации Таймаут до следующей Число плановых
подключений
Число внезапных
отключений
Число плановых
отключений
пройдено итераций
из общего числа
общий процент
выполнения
с с k / TOTAL%
12026-06-06T22:10:17.755Z36.261011/425.00
22026-06-06T22:11:02.736Z41.171012/450.00
32026-06-06T22:11:53.674Z39.971013/475.00
42026-06-06T22:12:43.359Z36.51014/4100.00
latency med / min / max, ms
4470 / 3754 / 8655
rec/min med / min
24.37 / 21.87
iter с sudden_disconnect ≥ 1
0 / 4
dirty planned-disconnect
0 / 4

retry_delay = 1500 ms STABLE *

retry_delay = 1500
Итерация timestamp начала Время итерации Таймаут до следующей Число плановых
подключений
Число внезапных
отключений
Число плановых
отключений
пройдено итераций
из общего числа
общий процент
выполнения
с с k / TOTAL%
12026-06-06T22:13:26.383Z37.591011/425.00
22026-06-06T22:14:15.726Z40.1102112/450.00
32026-06-06T22:15:08.601Z47.281013/475.00
42026-06-06T22:16:06.673Z45.61014/4100.00
latency med / min / max, ms
8029 / 5069 / 12382
rec/min med / min
20.68 / 14.95
iter с sudden_disconnect ≥ 1
1 / 4
dirty planned-disconnect
1 / 4

точка прошла, но есть отдельная шумная итерация (rec/min < 17 ИЛИ sudden ИЛИ dirty stop)

retry_delay = 1600 ms STABLE

retry_delay = 1600
Итерация timestamp начала Время итерации Таймаут до следующей Число плановых
подключений
Число внезапных
отключений
Число плановых
отключений
пройдено итераций
из общего числа
общий процент
выполнения
с с k / TOTAL%
12026-06-06T22:16:58.851Z40.0101011/425.00
22026-06-06T22:17:51.657Z41.361012/450.00
32026-06-06T22:18:41.784Z41.181013/475.00
42026-06-06T22:19:33.709Z38.51014/4100.00
latency med / min / max, ms
5668 / 3909 / 8689
rec/min med / min
22.92 / 21.79
iter с sudden_disconnect ≥ 1
0 / 4
dirty planned-disconnect
0 / 4

retry_delay = 1700 ms STABLE

retry_delay = 1700
Итерация timestamp начала Время итерации Таймаут до следующей Число плановых
подключений
Число внезапных
отключений
Число плановых
отключений
пройдено итераций
из общего числа
общий процент
выполнения
с с k / TOTAL%
12026-06-06T22:20:18.599Z37.481011/425.00
22026-06-06T22:21:06.681Z36.191012/450.00
32026-06-06T22:21:54.586Z36.381013/475.00
42026-06-06T22:22:41.742Z41.11014/4100.00
latency med / min / max, ms
4358 / 3720 / 6294
rec/min med / min
24.04 / 22.48
iter с sudden_disconnect ≥ 1
0 / 4
dirty planned-disconnect
0 / 4

retry_delay = 1800 ms STABLE

retry_delay = 1800
Итерация timestamp начала Время итерации Таймаут до следующей Число плановых
подключений
Число внезапных
отключений
Число плановых
отключений
пройдено итераций
из общего числа
общий процент
выполнения
с с k / TOTAL%
12026-06-06T22:23:29.486Z37.681011/425.00
22026-06-06T22:24:17.830Z48.171012/450.00
32026-06-06T22:25:15.699Z39.9101013/475.00
42026-06-06T22:26:08.353Z37.61014/4100.00
latency med / min / max, ms
5028 / 5012 / 13472
rec/min med / min
23.94 / 19.96
iter с sudden_disconnect ≥ 1
0 / 4
dirty planned-disconnect
0 / 4

Анализ серии

Сводная таблица

retry_delay, ms latency med, ms latency min latency max rec/min med rec/min min sudden iters dirty stops verdict
140044703754865524.3721.870 / 40 / 4STABLE
1500802950691238220.6814.951 / 41 / 4STABLE *
160056683909868922.9221.790 / 40 / 4STABLE
170043583720629424.0422.480 / 40 / 4STABLE
1800502850121347223.9419.960 / 40 / 4STABLE

График: rec/min от retry_delay

Точки — каждая отдельная итерация (4 на retry_delay). Линия — медиана по 4 итерациям. Пунктирная горизонталь — порог UNSTABLE 17 rec/min. Серая линия 25 — номинал BLE-канала дозиметра.

График: latency подключения от retry_delay

Время от am start launcher'а до первого BLE-пакета, по итерациям. Видны выбросы на rd = 1500 (iter#3 = 12.4 с) и rd = 1800 (iter#2 = 13.5 с) — это нормальная BLE-вариация на первом подключении, не failure.

Что подтвердилось инфраструктурно

Дисклеймер

Это sanity-прогон инфраструктуры, не production-исследование. N = 4 итерации на точку слишком мало для статистических выводов о «лучшем» retry_delay. Цель серии — подтвердить, что обвязка sweep'а (`smoke_sweep_v6.sh`, per-rd save, preflight broadcast, stability rule) работает на 5 разных значениях retry_delay без накопления ошибок.

Для production-прогона запланирован run_sweep_adaptive.sh prod: N = 10 итераций на точку × 10–20 минут мониторинга, старт с CENTER = 1600 мс, ход вниз и вверх с early-stop по первой точке, нарушившей stability rule. Результаты пойдут в retry_delay_optimizer.py (Tukey-fence + bootstrap-CI + Mann-Whitney U + Holm correction).