Перейти к содержанию

Разбор совета — 2026-08-18

Второй совет. Пятеро читали репозиторий вслепую, затем прошли перекрёстный допрос с обязательной контрфактической проверкой.

Первый разбор — COUNCIL-2026-08-13.md. Актуальное состояние проекта — COUNCIL-BRIEF.md.

Главный вывод

Проект превращал критику в планирование, а не в код. Удар был доступен всё это время и стоил один вечер.

Замеры (проверены лично, не со слов рецензентов):

Что Значение
Последний коммит во всех восьми сервисных репозиториях 13.08 — день первого совета
Изменения с тех пор только platform, 7 коммитов, 100% проза
Задачи на доске 45 открыто, 0 закрыто — ни одна никогда
Четыре дефекта контрактов из первого разбора живы дословно

Первый совет ударил по посылке. Ответом стали 8 ADR, 17 задач и досье. Ни строки логики.

Что нашли

Экран логирования уже был написан. public/app.js + js/timing.js — 234 строки, таймер покрыт тестами, payload ровно тот, ради которого проект существует. Между этой страницей и первой реальной записью стояли два TODO: console.warn вместо отправки и незагруженный список упражнений.

Проект описывал себя как каркас. Он не был каркасом: несущая балка стояла, а крышу от неё держал console.warn.

Восстановимое против невосстановимого (различение Ада, самое практичное за оба совета). Подходы авторские — их можно пересобрать когда угодно. Провенанс пульса приходит от датчика и потерян навсегда. Значит из всего накопленного завала по-настоящему срочен только #29 плюс смещение часов телефона.

Мусор на доске. Три задачи (#25, #34, #41) описывали один и тот же туннель в двух разных порядках; #31 висела открытой, хотя в доке объявлена закрытой решением.

Что сделано по итогам

Что Статус
Заблокировать #12/#13 до #29/#30/#33 ✅ окно бесплатной переделки схемы закрыто
Закрыть дубли #25, #34 и снятую #31 ✅ доска: 42 открыто, 3 закрыто
Проб-режим: два TODO закрыты ✅ подходы пишутся в localStorage, выгрузка кнопкой
Задача на сбор данных ✅ #46 — 8–10 реальных тренировок

Проб-режим запускается с ноутбука в домашней сети, добавляется на экран телефона и дальше работает офлайн. Ни туннеля, ни TLS, ни бота, ни базы. Запись несёт то, что нельзя восстановить задним числом: UUID подхода (идемпотентный ре-импорт), schema_version, локальное смещение UTC и device_clock_offset_ms — часы телефона, сбитые на несколько секунд, съели бы весь бюджет сигнала.

Ничего не выбрасывается: таймстампы клиентские по ADR-0013, поэтому выгрузка загружается в core-service позже без потерь.

Два бага, которые нашлись только в браузере

E2E ни разу не запускались — оба дефекта пережили и юнит-тесты, и линтер:

  1. app.js импортировал модули из ../src, то есть за пределами отдаваемого каталога. 404 и в дев-сервере, и в nginx-образе — страница не работала нигде. Модули переехали в public/js/, каталог стал самодостаточным.
  2. .entry { display: flex } перебивал атрибут hidden, поэтому форма веса и повторов показывалась до первого подхода.

Что осталось за владельцем

  • Apex-домен. Задача T-01 (DNS) идёт первой и необратима: если она выполнится на arvberezin.online, проект и VPN окажутся под одним доменом навсегда.
  • Класс решения. Одна фраза до первой тренировки: что в тренировке изменится, если данные покажут X. Не ответ — именно класс.

Расхождения, которые остались

Мусаси считал, что чинить контракты надо сегодня, потому что окно закрывается на

12. Ада и Сунь-цзы возразили: бесплатное не срочно, срочен сторож — заблокировать

12/#13. Торвальдс согласился со вторыми и сам признал, что его первоначальный

рецепт (Postgres + IngestSets) был всё той же инфраструктурой впереди ценности. Сработал вариант со сторожем.

Сунь-цзы остался при особом мнении по территории: настоящий противник не цензор, а хостер — одна жалоба гасит VPS вместе с VPN, и общая судьба уже доказана 32 гигабайтами логов, забившими диск до появления mybit.