--- 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: **«клиент на любом ЯП одной командой»**. Вердикт round 1: **claim подтверждён с оговорками** (8 операций требуют raw-обхода). Вердикт round 2 (0.2.0/0.3.5): **claim подтверждён полностью** — все находки F-1..F-5 закрыты, raw-обход удалён, клиент типизированный end-to-end. ## Round 2 — ретест фиксов (0.2.0 / daemon 0.3.5), 2026-08-18 | | | |---|---| | Что | `generate.ps1` заново против `@sched/admin-api@0.2.0` (tarball spec byte-identical pinned), сьют+smoke против `@sched/daemon@0.3.5` (:8127, no auth) | | Ожидал | все 5 находок закрыты, `raw_ops.py` не нужен | | Получил | **все 5 закрыты**; сьют **24/24** (3 прогона), smoke **19/19** — **полностью через типизированный клиент, 0 операций на обходе**; `raw_ops.py` **удалён**; F-1/F-5 подтверждены живьём на keyed-инстансе (:8128): health 200 open, /tasks 401 без ключа, 400 на неизвестные поля schedule body/patch | Deliverables round 2: коммит sched `d658ff0` (пример обновлён: openapi.json 0.2.0, tests/smoke typed-only, raw_ops удалён, README+generate.ps1); репорт `sched/.agents/inbox/2026-08-18T22-55-00Z-admin-openapi-fixes-round2-retest.md`. Механика фиксов и генераторные грабли — [[openapi-generator-3-1-spec-gotchas]]. ## Round 1 — 2026-08-18 (0.1.2 / daemon 0.3.4) | | | |---|---| | Что | 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" $env:Path = "$env:JAVA_HOME\bin;" + $env:Path # генератор спавнит java из PATH, не из JAVA_HOME .\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 ``` Стенд round 2: published `@sched/daemon` 0.3.5, `--admin-port 8127`, NO AUTH, scratch sqlite (`/tmp/sched-acpy-stand/acpy.db`). Round 1 стоял на 0.3.4. Письменный `:8080` — под ключом (`SCHED_ADMIN_KEY=dev-key`), `:8123` — стейл-билд (health 0.1.8, нет POST /tasks).