From b87b1be84867d4b3e463bcb2ed0d446d88128130 Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Sat, 1 Aug 2026 21:45:57 +0300 Subject: [PATCH] =?UTF-8?q?openspec:=20=D0=B8=D0=B7=20=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D1=82=D0=B5=D0=BA=D1=81=D1=82=D0=B0=20=D1=83=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=B2=D1=81=D1=91,=20=D1=87=D1=82=D0=BE=20?= =?UTF-8?q?=D1=83=D1=81=D1=82=D0=B0=D1=80=D0=B5=D0=B2=D0=B0=D0=B5=D1=82=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=85=D0=BE=D0=B4=D1=83=20=D0=B7=D0=B0=D0=B4?= =?UTF-8?q?=D0=B0=D1=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - числа находок и сценариев заменены общим описанием - перечни линтеров, шагов гейта и конвенций свёрнуты в ссылку на источник: они дописываются, а копия молча отстаёт --- openspec/config.yaml | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/openspec/config.yaml b/openspec/config.yaml index bde3e43..6dcd884 100644 --- a/openspec/config.yaml +++ b/openspec/config.yaml @@ -29,36 +29,33 @@ context: | - Тривиальная задача — достаточно одного прохода (код). Конвенции кода (соблюдать при apply): - - Механизируемое проверяет `task gate` (.golangci.yml: sloglint, forbidigo, - errorlint, depguard; плюс сборка, тесты, race, покрытие изменённых строк, - миграции, образцы конфига). Пересказывать его здесь не нужно — гейт скажет - точнее. - - Прозой остаётся то, что правилом не выражается, и это читаем в источнике: - docs/conventions.md — уровень лога по адресату, единственный логирующий - чекпоинт на доменной границе, трансляция доменной ошибки на внешней - границе, самодокументируемый config.example.toml, время в БД в UTC - RFC 3339 через store.Now(), ULID через internal/ident. + - Механизируемое проверяет `task gate` (линтер, сборка, тесты, race, + покрытие изменённых строк, миграции, образцы конфига, секреты и данные о + здоровье в индексе). Состав шагов и правил здесь не пересказываем — он + растёт, а гейт скажет точнее и всегда актуальнее. + - Прозой остаётся то, что правилом не выражается: docs/conventions.md. + Читаем в источнике, а не отсюда — конвенции дописываются по ходу задач. - Безопасность: данные о здоровье чувствительнее токенов. Ни тела запросов, ни значения точек не попадают в логи выше DEBUG; ничего из ./data не - попадает под контроль версий (гейт проверяет шагом no-health-data). + попадает под контроль версий — это проверяет гейт. Что это за проект: - docs/passport.md — паспорт: цель проекта и её граница (чем он НЕ является), - восемь типовых сценариев работы и референсы. ЧИТАЙ ПЕРЕД ПРЕДЛОЖЕНИЕМ: там - же правило «развилка или блокер — сперва prior art». Проект не уникален, - и прежде чем проектировать своё, смотрим готовые решения в перечисленных + типовые сценарии работы, референсы. ЧИТАЙ ПЕРЕД ПРЕДЛОЖЕНИЕМ: там же + правило «развилка или блокер — сперва prior art». Проект не уникален, и + прежде чем проектировать своё, смотрим готовые решения в перечисленных проектах; отвергаем — с названной причиной, причина идёт в architecture.md. - healthlog — хранилище данных Apple Health, а не аналитика: принять, дедуплицировать, сохранить, отдать. Агрегат считается только в ответе на запрос и только там, где род метрики измерен сверкой слоёв. - Источников два: поток Health Auto Export (непрерывный и молчаливый) и - родной экспорт Apple раз в 2–3 месяца. Вместе они образуют журнал событий: + родной экспорт Apple, снимаемый изредка. Вместе они образуют журнал событий: состояние = import(снапшот экспорта) + replay(доставки по received_at). Отсюда требование детерминированной свёртки. - Инварианты целиком — в CLAUDE.md, архитектура — в docs/architecture.md. Разведка уже проведена, догадки о формате не нужны: - - docs/local-research.md — 50 находок на живом потоке, половина расходится с + - docs/local-research.md — находки на живом потоке, во многом расходящиеся с документацией Health Auto Export. ПРОВЕРЬ ТАМ, прежде чем строить предположение о формате входа: скорее всего вопрос закрыт измерением. - Тесты на разбор формата держим на реальных пакетах (testdata), а не на