Пределы и лимиты
Все числа, которые где-то упираются. Эта страница — их единственный владелец: если число изменилось в коде, править надо здесь.
Что видит пользователь
| Что | Предел | Откуда он взялся |
|---|---|---|
| Приоритетов | от 1 до 10, по умолчанию 7 | Десять — прежний размер палитры: цвет должен доставаться каждому. Палитра с тех пор выросла до шестнадцати, предел остался прежним. Один — минимум, при котором приложению есть что показывать |
| Приоритетов в архиве | последние 40 | Дальше архив перестаёт быть полезным списком |
| Название приоритета | 24 знака | Длиннее не помещается в строку списка |
| Навыков | 12 | Объём прежнего хранилища, а не вкус: при шестнадцати месяц не влезал в 4096 байт. Предел пережил хранилище — двенадцать направлений мастерства человек и так не ведёт |
| Навыков в архиве | 12 | То же |
| Название навыка | 24 знака | То же, что у приоритета |
| Стартовые часы навыка | от 0 до 100 000 | Верхняя граница — защита от опечатки, а не оценка человеческих возможностей |
| Цена одного клика | 15, 20, 25, 30, 45, 60 минут | Произвольное число превратило бы клик в ручной ввод времени |
| Лента пропущенных дней | 14 дней назад | Дальше уже не вспомнить, что было. Одна и та же лента у блоков и у отметок заряда |
| Глубина хранения | не ограничена | Предел в 13 месяцев жил ради прежнего хранилища и ушёл вместе с ним. См. «Данные и синхронизация» |
| Достижений | 75 | Фиксированный реестр |
| Наблюдений на экране | 3 | Больше трёх подряд читать перестают |
Технические пределы
| Что | Значение | Зачем |
|---|---|---|
| Операций в одной отправке | 500 | Пачка идёт одной транзакцией, а суточная квота D1 на записанные строки общая на аккаунт |
| Операций в одном ответе сервера | 1000 | Клиент дочитает следующим запросом по курсору |
| Страниц за один заход | 20 | Дальше движок отдаёт управление приложению |
| Размер документа (настройки, каталог навыков) | 64 КБ | Они едут целиком, а не операциями |
| Возраст, младше которого не сворачиваем | 14 дней | Выигрыш ничтожен, а поводов ошибиться много |
| Молчание устройства, после которого оно не держит свёртку | 90 дней | Иначе один заброшенный телефон заморозил бы свёртку навсегда |
| Расхождение чужих часов, за которым перестаём тянуться | 24 часа | Устройство с датой в 2099 году задрало бы метку всем, и вернуть её было бы нечем |
| Ожидание всей загрузки при старте | 9 секунд | Дальше показывается то, что есть, а не спиннер |
| Задержка записи | 0,7 секунды | Пять тапов подряд — одна запись, а не пять |
| Повтор после неудачной записи | от 0,7 до 30 секунд | Нарастающая пауза |
| Проверка достижений | 0,7 секунды после изменения | Та же пауза, что у записи: чаще проверять незачем |
| Удержание строки | 480 мс, допуск 10 px | Чтобы прокрутка не считалась удержанием |
| Задержка кнопки «Пропустить» | 3 секунды | См. «Заряд» |
| Показ уведомления о достижении | 4,2 секунды | |
| Проверка ярлыка на главном экране | 2,5 секунды | Некоторые клиенты объявляют метод и не зовут колбэк |
Пределы прежнего хранилища
Значение в Telegram CloudStorage не могло превышать 4096 байт, ключи читались порциями по 8, ожидание одного запроса — 4 секунды. Отсюда взялись нарезка истории по месяцам, двухсимвольные идентификаторы приоритетов и потолок в двенадцать навыков. Записи туда больше нет; числа оставлены, потому что объясняют форму данных, которая переехала в журнал как есть. См. «Как переехали старые данные».
Пороги, ниже которых приложение молчит
Часть выводов нельзя делать на маленьких числах — они будут арифметически верными и бессмысленными. Приложение в таких случаях не показывает ничего, а не показывает уверенную глупость.
| Что молчит | Пока не набрано |
|---|---|
| Достижения группы «Баланс» | 20 блоков за окно |
| Наблюдение о концентрации | 20 блоков |
| Наблюдение «будни против выходных» | 5 будних и 2 выходных дня |
| Наблюдение о времени разряда | 5 дней с отметками |
| Наблюдение «неделя против прошлой» | 10 блоков в прошлой неделе |
| Разбор дня в статистике | ничего — пустой день так и подписан |
Палитра
Шестнадцать неоновых цветов, двумя рядами по восемь. Новый приоритет получает первый свободный, так что до предела цвета всегда хватает и повторов не бывает.
Первые десять — исходная палитра, ровно под максимум приоритетов. Шесть добавленных встают между ними по тону, а не рядом: лайм между жёлтым и зелёным, индиго между синим и фиолетовым. Порядок менять нельзя — цвет хранится номером, и перестановка перекрасила бы уже созданные списки.
Навыки берут цвета из той же палитры. Их двенадцать против шестнадцати цветов, так что повторов нет и у них.
Минимальная заливка
Приоритет с ненулевым временем всегда рисует полосу хотя бы в 4 % ширины. Иначе один блок на фоне лидера выглядел бы как ноль, и разница между «мало» и «ничего» пропала бы.
Рядом
Данные и синхронизация · Наблюдения · Лестница навыков · Настройки
Где эти числа объявлены
| Константа | Файл |
|---|---|
MAX_PRIORITIES, MIN_PRIORITIES, DEFAULT_PRIORITY_COUNT, BLOCK_OPTIONS, DEFAULT_BLOCK_MINUTES | src/domain/types.ts |
MAX_ARCHIVED | src/domain/settings.ts |
RETENTION_MONTHS | src/store/legacy/persistence.ts |
MAX_SKILLS, MAX_ARCHIVED_SKILLS, MAX_SKILL_TITLE | src/skills/types.ts |
VALUE_LIMIT, GET_BATCH, CLOUD_TIMEOUT_MS | src/telegram/cloudStorage.ts |
FLUSH_DELAY_MS, FLUSH_RETRY_MAX_MS, HYDRATE_DEADLINE_MS | src/store/useStore.tsx |
MIN_FILL | src/domain/stats.ts |
BALANCE_MIN_BLOCKS | src/achievements/registry.ts |
CONCENTRATION_MIN_BLOCKS, LOW_ONSET_MIN_DAYS | src/achievements/derive.ts |
MAX_INSIGHTS и пороги наблюдений | src/domain/insights.ts |
NEON_PALETTE | src/domain/palette.ts |
BACK_DAYS | src/components/DayPicker.tsx |
SKIP_DELAY_SECONDS | src/components/DrainSheet.tsx |
CHECK_DELAY_MS | src/achievements/Watcher.tsx |
VISIBLE_MS | src/achievements/AchievementToast.tsx |
Пределы хранилища проверяются src/store/legacy/persistence.test.ts: тест собирает худший месяц для каждого вида ключа и убеждается, что он влезает в 4096 байт. Именно этот тест и задал потолок в двенадцать навыков.