# Модуль m01-server-db — план разработки > План по алгоритму d-dev (`std1\_rules\d\d-dev.md`); отметки статусов > актуализируются при завершении каждого шага (d-dev-6). Требования — > [module_reqs.md](module_reqs.md). | Шаг d-dev | Состав | Статус | |---|---|---| | 0. Персистентная подготовка | module_reqs.md, readme.md, SKILL.md | ✅ | | 1. Доменные объекты | `Dal\{Src,Ref}\Domain\{Сущность}.cs` (c-dm) | ✅ утверждено (2026-10-17) | | 1.3. Утверждение домена | — | **Пользователь!** ✅ | | 2. Список функций к реализации | статусы `DEV` в 2-db\{src,ref}\functions.md | ✅ | | 2.3. Утверждение списка | — | **Пользователь!** ✅ (шаг 6) | | 3. Спецификации функций | `func_specs\` (d-db-5, d-db-9) — все 38 | ✅ | | 3.4. Утверждение спецификаций | — | **Пользователь!** ✅ (группы 1–4, 2026-10-17) | | 4. Код функций и тесты | миграции 001–002, `2-db\{src,ref}\functions\` (38), `tests\` (38 файлов) | ✅ | | 4.4. Утверждение реализации функций | — | **Пользователь!** ✅ (2026-10-17; прогон 122/122 PASS, docker `watchbody-pg`; функции `DONE`) | | 5. Спецификации тестов репозиториев | `repository_tests\` (d-tst) — **11 файлов** на 13 репозиториев (тесты ProgramVersion и ExerciseReplacement — внутри файлов `ProgramRepository.md` / `ExerciseRepository.md`), 38 функций | ✅ утверждено (2026-10-18, ревью сверкой) | | 5.3. Утверждение | — | **Пользователь!** ✅ | | 6. Репозитории DAL + тесты | `Server.WatchBody.Core` (13 репозиториев + 7 фильтров, Kit.Helpers fluent), `Server.WatchBody.Core.Tests` (56 тестов) | ✅ код написан; сборка 0 ошибок; тесты 56/56 PASS (числа после З-35) | | 6.4. Утверждение репозиториев | — | **Пользователь!** ✅ (2026-10-18, после ревью `agent_recommendations.md`) | | 7. Завершение | статусы функций `DONE`; сборка и тесты зелёные | ✅ (2026-10-18: 38/38 функций `DONE`; тесты 56/56 PASS, psql-прогон 123/123 на docker `watchbody-pg` — числа после З-35) | **Модуль завершён** (2026-10-18). Следующий по плану этапа 7 — m02-rest-api. Примечания: - Разработка поштучно, группы по сущностям (принятый порядок): migration → ref → athlete/athlete_profile → exercise/replacement → program/program_version → workout/workout_set → command_log → daily_log → workout_metrics → breaks. - Спецификации тестов репозиториев живут в модуле (`1-docs\4-modules\m01-server-db\repository_tests\`) — адаптация пути `1-docs\3-core\…` из d-tst-1 к структуре репозитория (модульных документов). - Errata (2026-10-18, вскрыто интеграцией m02): jsonb-параметры функций принимают `text` с кастой в теле (Npgsql передаёт строку как `text`, неявного cast'а text→jsonb в PG нет) — `program_version_insert.p_body`, `workout_update.p_facts_json`, `command_log_insert.p_semantics`, `workout_metrics_upsert` (4 параметра); `program_version_insert` дополнен идемпотентностью по `p_id` (🛡, как `workout_insert`). psql-тесты затронутых функций перегнаны — PASS; спецификации обновлены. - Errata (2026-10-18, вскрыто интеграцией m04): Npgsql возвращает колонки `date` как `DateOnly` (не `DateTime`) — `DailyLogRepository` переведён на `AsDate()`; ключи агрегата `workout_select` — snake_case, `ParseSets` дополнен `JsonNamingPolicy.SnakeCaseLower` (иначе поля `WorkoutSet`, включая `in_plan`, молча не заполнялись). - Прогон psql-тестов — PostgreSQL 17 в docker-контейнере `watchbody-pg` (порт 5433, БД `watchbody`), ручное воспроизведение — pgAdmin (db-tst-1). - З-35 (2026-10-18, ревью этапа 7): З-31 (`src.program.external_id`) не был доведён до SQL/DAL-артефактов — исправлено: миграция `003_program_external_id.sql` (идемпотентная), `program_insert.psql` rev. 2 (`p_external_id` + DROP прежней сигнатуры: два оверлода с DEFAULT делают 2-аргументный вызов неоднозначным), spec, домен `Program.ExternalId`, `ProgramRepository.Insert`; тесты: psql-кейс #3 (повтор `external_id` → UNIQUE), Core-тест `Insert_2СExternalId`.