--- title: sched admin-client openapi — F&F раунд 2026-08-18 type: concept tags: [sched, ff, openapi, admin-api, python, codegen, f&f-round] related: [[openapi-generator-3-1-spec-gotchas]], [[sched-fnf-r8-verification-stand]] updated: 2026-08-18 --- # sched admin-client openapi — F&F раунд Живая проверка claim'а sched openapi-spec: **«клиент на любом ЯП одной командой»**. Вердикт: **claim подтверждён с оговорками** — генерация одной командой работает, но 3.1-спека до «любого ЯП без правок» не дотягивает (8 операций требуют raw-обхода). ## Что делал / ожидал / получил | | | |---|---| | Что | Python-клиент из опубликованной спеки `@sched/admin-api/openapi.json` 0.1.2 (verdaccio subpath-export, идентична репо), `openapi-generator` 7.24.0 (`-g python`, JDK 25) | | Ожидал | типизированная десериализация всех ответов, зелёный сьют, зелёный smoke | | Получил | сьют **24/24** (3 прогона), smoke **19/19**, все 15 путей/21 операция живые — НО клиент в сыром виде падает на 8 операциях (pydantic ValidationError) из-за пробелов спеки; обход — `raw_ops.py` (сгенерированный пакет не тронут) | ## Deliverables - **Код**: `sched/examples/admin-client-python/` — коммит `e89e868` (запушен): `openapi.json` (пин 0.1.2), `generate.ps1` (одна команда), `sched_admin_client/` (сгенерированный, checked-in), `tests/` (TDD 24/24), `smoke.py` (19/19), `raw_ops.py` (обход), `README.md` (F&F-таблица по всем путям). - **Репорт**: `sched/.agents/inbox/2026-08-18T19-15-43Z-admin-fnf-openapi-client-report.md` (F&F-формат: что→ожидал→получил→дока+гладкое). - **Таска**: `[sched-admin-client-openapi]` 🟢 закрыта 2026-08-18. ## Находки (в репорт, спеку НЕ чинил — импл sched, TDD) - **F-1** `/health`: спека `security: []`, daemon с ключом 401-ит даже health (письменный стенд :8080 непригоден для безключевых клиентов). - **F-2 (главный)** mutation-ответы `{}` вместо `{task/run/schedule:…}` → генераторы врут; объявить схемы ответов. - **F-3** `const: true` → строковый enum `('true')` ломает boolean. - **F-4** oneOf+discriminator `Schedule` → `actual_instance=None`, контент только через raw JSON. - **F-5** top-level `dedupKey` в POST /schedules молча игнорится (ключ — внутри `schedule`). - Механика генераторных граблей — [[openapi-generator-3-1-spec-gotchas]]. ## Как повторить ```powershell cd sched/examples/admin-client-python $env:JAVA_HOME = "C:\Program Files\Eclipse Adoptium\jdk-25.0.2.10-hotspot" .\generate.ps1 pip install -r requirements.txt pytest SCHED_ADMIN_URL=http://127.0.0.1:8127/api python -m pytest tests/ -v python smoke.py --url http://127.0.0.1:8127/api ``` Стенд раунда: published `@sched/daemon` 0.3.4, `--admin-port 8127`, NO AUTH, scratch sqlite (`/tmp/sched-acpy-stand/acpy.db`). Письменный `:8080` — под ключом (`SCHED_ADMIN_KEY=dev-key`), `:8123` — стейл-билд (health 0.1.8, нет POST /tasks).