конвенции: убрать из CLAUDE.md пересказ механизированных правил
Одно и то же жило в трёх местах: docs/conventions, openspec/config.yaml и CLAUDE.md, который читается каждую сессию. Механизируемое теперь одной строкой со ссылкой на гейт, прозой — только то, что правилом не выражается. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -137,20 +137,19 @@ Module path — `git.vakhrushev.me/av/jellybit`. Go 1.26, `CGO_ENABLED=0`.
|
|||||||
|
|
||||||
- Раскладка: `cmd/jellybit` (точка входа) + `internal/<пакет>` по
|
- Раскладка: `cmd/jellybit` (точка входа) + `internal/<пакет>` по
|
||||||
компонентам из [architecture.md](docs/specs/architecture.md).
|
компонентам из [architecture.md](docs/specs/architecture.md).
|
||||||
- Ошибки — stdlib, обёртка с контекстом (`fmt.Errorf("...: %w", err)`),
|
- Механизируемое проверяет `task gate` (`.golangci.yml` + `internal/archrules`):
|
||||||
проверка через `errors.Is`/`errors.As`, трансляция на внешней границе:
|
форма ошибок и логов, конфиг мимо env, время мимо `store.Now()`, AUTOINCREMENT
|
||||||
[docs/conventions/errors.md](docs/conventions/errors.md).
|
в миграциях, направление зависимостей ядро↔транспорты. Пересказывать эти
|
||||||
- Логирование только через `slog`, без `fmt.Println` — уровни, обязательные
|
правила не нужно — гейт скажет точнее.
|
||||||
поля и что не логировать см. [docs/conventions/logging.md](docs/conventions/logging.md).
|
- Прозой остаётся то, что правилом не выражается, и читается в источнике:
|
||||||
- Конфигурация — только TOML; секреты рендерит деплой (Ansible+Vault) в
|
[ошибки](docs/conventions/errors.md) (трансляция доменной ошибки на внешней
|
||||||
файл (`config.toml` не коммитится, `0600`), не в env; валидация на старте:
|
границе, sentinel против типизированной),
|
||||||
[docs/conventions/config.md](docs/conventions/config.md).
|
[логи](docs/conventions/logging.md) (уровень по адресату, единственный
|
||||||
- Время — храним в UTC, RFC 3339 с суффиксом `Z`; генерирует только приложение
|
логирующий чокпоинт, `ext.*`, что не логируем),
|
||||||
(`store.Now()`), таймзона отображения — конфиг `[general].timezone`:
|
[конфиг](docs/conventions/config.md) (секреты рендерит деплой в файл `0600`,
|
||||||
[docs/conventions/database.md](docs/conventions/database.md).
|
самодокументируемый `config.example.toml`, валидация на старте),
|
||||||
- Идентификаторы — TEXT ULID (lowercase) через `internal/ident`, без числовых
|
[БД](docs/conventions/database.md) (время в UTC RFC 3339, TEXT ULID через
|
||||||
AUTOINCREMENT; внешние id валидируются `ident.Parse` на границе:
|
`internal/ident`, `ident.Parse` на входной границе).
|
||||||
[docs/conventions/database.md](docs/conventions/database.md).
|
|
||||||
- Миграции БД (goose, `internal/store/migrations`; SQL для DDL, Go — когда
|
- Миграции БД (goose, `internal/store/migrations`; SQL для DDL, Go — когда
|
||||||
нужен код) — при изменении структуры (таблица/столбец/индекс/связь) в том же
|
нужен код) — при изменении структуры (таблица/столбец/индекс/связь) в том же
|
||||||
change обновляем ER-схему [docs/specs/database.md](docs/specs/database.md).
|
change обновляем ER-схему [docs/specs/database.md](docs/specs/database.md).
|
||||||
|
|||||||
@@ -46,10 +46,9 @@
|
|||||||
лексикографическую сортировку TEXT = хронологию (`ORDER BY created_at`).
|
лексикографическую сортировку TEXT = хронологию (`ORDER BY created_at`).
|
||||||
Единая точка генерации — приложение: `store.Now()` + `store.FormatTime`/
|
Единая точка генерации — приложение: `store.Now()` + `store.FormatTime`/
|
||||||
`ParseTime` (аналогично `ident.NewID` для id), а не дефолт в схеме — так
|
`ParseTime` (аналогично `ident.NewID` для id), а не дефолт в схеме — так
|
||||||
забытая вставка падает громко (`NOT NULL` без дефолта). Измерение
|
забытая вставка падает громко. Измерение длительности — не метка времени: у
|
||||||
длительности — не метка времени: для внешних вызовов его засекает
|
внешних вызовов его засекает `logging.StartCall`. Таймзона отображения в
|
||||||
`logging.StartCall`. Зона хранения всегда UTC; таймзона отображения в UI — конфиг
|
UI — конфиг `[general].timezone`.
|
||||||
`[general].timezone`.
|
|
||||||
- Миграции — goose (`internal/store/migrations`): SQL-файлы для DDL;
|
- Миграции — goose (`internal/store/migrations`): SQL-файлы для DDL;
|
||||||
Go-миграции (`goose.AddMigrationContext`) — когда нужен код (генерация
|
Go-миграции (`goose.AddMigrationContext`) — когда нужен код (генерация
|
||||||
id, backfill). При изменении структуры обновляем ER-схему
|
id, backfill). При изменении структуры обновляем ER-схему
|
||||||
|
|||||||
Reference in New Issue
Block a user