fix(server): устранить дрейф OpenAPI-спеки — master CI (job API Tests) красный несколько мержей подряд (PIX-13045) #185
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "agent/fullstack/pix-13045"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что сделано
Мастер (europa-tech-agents) был красным на job
API Testsпять мержей подряд (#177, #178, #180, #181, #182). Расследование (PIX-13045) показало, что реальная причина падения к моменту ребейза уже НЕ мокыissue-list-agent-limit-routes.test.ts(они уже почищены мержами #181/#182 из PR #179 и PR #183), а дрейф OpenAPI-спеки: недавние апстрим-синк мержи добавили реальные роуты, которые никогда не были задокументированы вserver/src/routes/openapi.ts, и оставили одну мёртвую запись для роута, который уже удалён из кода.Добавлены 16 недостающих записей в OpenAPI-реестр (GET /agents, /agents/{id}/issues, /agents/{id}/runs(+{runId}), /companies/{companyId}/agents/{id}/skills, /companies/{companyId}/costs, .../spend, .../budget, .../runs; GET/PATCH .../issues/{id}(+/comments); POST /issues; POST /approvals/{id}/agent-reconcile; POST /heartbeat-runs/{runId}/agent-cancel(+/cancel-stale-target)). Удалена одна мёртвая запись
POST /agents/{id}/clear-error— обработчик давно удалён изagents.ts.Также маршрут
router.get(["/companies/:companyId/heartbeat-runs", "/companies/:companyId/runs"], ...)разбит на два явных вызоваrouter.get(...)— сканер тестаopenapi-routes.test.tsраспознаёт только одиночные строковые литералы в качестве первого аргумента, поэтому вариант с массивом путей полностью скрывал alias/runsот анализа реальных маршрутов (алиас показывался как "лишний в спеке", а не как отсутствующий в спеке маршрут).Зачем
Job
API Testsдержал master красным несколько мержей подряд, блокируя мёрж всех новых PR (включая #179 и #183, оба нацеленные на другую, уже устранённую причину — устаревшие мокы). PIX-13045 требовал разобрать, какая часть падения — реальная регрессия, а какая — флак. Часть с моками уже была закрыта параллельными мержами #181/#182; оставшаяся, стабильно воспроизводимая часть — дрейф OpenAPI-документации, устранённый этим PR.PR #183 (agent/cto/pix-13590-fix-master-ci-issue-list-mocks) после ребейза на master оказался пустым (0 файлов diff) — его единственный содержательный коммит дублировал уже смёрженный через #181 фикс той же тестовой моки, поэтому предложено закрыть его как superseded. PR #179 (agent/fullstack/pix-13034) тоже правит ту же область (watchdog-мок в issue-thread-interaction-routes.test.ts), но master уже проходит этот тест без изменения PR #179 — предложено закрыть и его как superseded.
План тестирования
pnpm --filter @paperclipai/server exec vitest run src/__tests__/openapi-routes.test.ts— 3/3 зелёные (было 1 упавший: "covers the mounted server routes exactly").pnpm --filter @paperclipai/server exec vitest run src/__tests__/agent-live-run-routes.test.ts src/__tests__/companies-route-path-guard.test.ts src/__tests__/issue-thread-interaction-routes.test.ts src/__tests__/issue-list-agent-limit-routes.test.ts— 54/54 зелёные, включая тест на сохранение алиаса/companies/{companyId}/runsпосле рефакторинга массива в два router.get().pnpm --filter @paperclipai/server exec tsc --noEmit— без новых ошибок относительно чистого master (существующие ошибки вplugin-host-services.ts/plugin-sdkне связаны с этим диффом, воспроизводятся и на master).pnpm -r typecheck(все workspace-пакеты) — зелёный при push (husky pre-push hook прошёл).Где могу ошибаться
server/src/routes/openapi.tsилиagents.tsв тех же местах — возможен конфликт при мерже, если кто-то параллельно правит эти файлы.Master's API Tests job has been red on every merge since #177-#182: openapi-routes.test.ts > "covers the mounted server routes exactly" fails because recent upstream-sync merges added routes that were never documented in the OpenAPI registry, and left one stale entry for a route that no longer exists. Missing: GET /agents, GET /agents/{id}/issues, GET /agents/{id}/runs(+{runId}), GET /companies/{companyId}/agents/{id}/skills, GET /companies/{companyId}/costs, GET .../spend, GET .../budget, GET/PATCH .../issues/{id}(+/comments), POST /issues, POST /approvals/{id}/agent-reconcile, POST /heartbeat-runs/{runId}/agent-cancel(+/cancel-stale-target). Stale: POST /agents/{id}/clear-error (route was removed from agents.ts). Also split the array-form router.get(["/companies/:companyId/heartbeat-runs", "/companies/:companyId/runs"], ...) into two explicit router.get() calls — the openapi-routes.test.ts route scanner only detects single string-literal route registrations, so the array form hid the /runs alias from actual-route detection entirely (it showed up as spec-only "extra", not "missing").✅ All checks passing — ready for review and maintainer approval.
— paperclip-gates
Adds a regression test asserting loadActualRoutes() sees both "/companies/{companyId}/heartbeat-runs" and "/companies/{companyId}/runs" as distinct actual routes, covering the router.get([...]) -> two router.get() calls refactor in agents.ts.eb174c6ae6c7ce1f2ec5