fix(agents): guard non-finite max in readLiveRunsQueryInt — flaky API-test NaN #172

Merged
andrei merged 3 commits from feature/claude-fix-flaky-issue-list-limit into master 2026-07-04 23:14:43 +00:00
Owner

Что сделано

Исправлена flaky-нестабильность Agents CI / API Tests — тест serves legacy agent assigned issue list links падал недетерминированно: expected limit=20, received limit=NaN.

  • Route /agents/:id/issues вычисляет readLiveRunsQueryInt(req.query.limit, ISSUE_LIST_DEFAULT_LIMIT, ISSUE_LIST_DEFAULT_LIMIT); helper делал Math.min(max, parsed).
  • Под vitest module-mock isolation импортируемый ISSUE_LIST_DEFAULT_LIMIT интермиттентно undefinedMath.min(undefined, 20) = NaN.
  • Fix: guard non-finite max (Number.isFinite(max) ? max : parsed) → helper никогда не возвращает NaN (parsed-значение запроса выигрывает когда cap-константа недоступна).
  • Regression guard-тест добавлен.

Зачем

Persistent-red CI (master + PR-ы #169/#171) от flaky-NaN шумел и блокировал зелёный master. В проде ISSUE_LIST_DEFAULT_LIMIT всегда 500 → поведение не меняется; фикс только устраняет NaN-режим.

План тестирования

  • readLiveRunsQueryInt-guard.test.ts RED→GREEN.
  • agent-live-run-routes.test.ts 23/23 pass.
  • pnpm run typecheck (root recursive) exit 0. agents.ts type-clean. Pre-push checks passed.

Где могу ошибаться

Root flakiness — mock-isolation (ISSUE_LIST_DEFAULT_LIMIT intermittently undefined); defensive guard делает код robust к этому (Math.min с возможно-undefined max = латентный баг). Не воспроизводится локально (passes), но guard устраняет NaN-режим детерминированно.

## Что сделано Исправлена flaky-нестабильность `Agents CI / API Tests` — тест `serves legacy agent assigned issue list links` падал недетерминированно: `expected limit=20, received limit=NaN`. - Route `/agents/:id/issues` вычисляет `readLiveRunsQueryInt(req.query.limit, ISSUE_LIST_DEFAULT_LIMIT, ISSUE_LIST_DEFAULT_LIMIT)`; helper делал `Math.min(max, parsed)`. - Под vitest module-mock isolation импортируемый `ISSUE_LIST_DEFAULT_LIMIT` интермиттентно `undefined` → `Math.min(undefined, 20) = NaN`. - Fix: guard non-finite `max` (`Number.isFinite(max) ? max : parsed`) → helper никогда не возвращает NaN (parsed-значение запроса выигрывает когда cap-константа недоступна). - Regression guard-тест добавлен. ## Зачем Persistent-red CI (master + PR-ы #169/#171) от flaky-NaN шумел и блокировал зелёный master. В проде `ISSUE_LIST_DEFAULT_LIMIT` всегда 500 → поведение не меняется; фикс только устраняет NaN-режим. ## План тестирования - `readLiveRunsQueryInt-guard.test.ts` RED→GREEN. - `agent-live-run-routes.test.ts` 23/23 pass. - `pnpm run typecheck` (root recursive) exit 0. agents.ts type-clean. Pre-push checks passed. ## Где могу ошибаться Root flakiness — mock-isolation (ISSUE_LIST_DEFAULT_LIMIT intermittently undefined); defensive guard делает код robust к этому (Math.min с возможно-undefined max = латентный баг). Не воспроизводится локально (passes), но guard устраняет NaN-режим детерминированно.
fix(agents): guard non-finite max in readLiveRunsQueryInt — flaky API-test NaN
Some checks failed
security/pr-scan 1 security flag(s) — see Actions log (critical)
PR Quality Gates / PR Quality Gates (pull_request_target) Successful in 23s
Agents CI / Typecheck and Build (pull_request) Successful in 6m47s
Agents CI / API Tests (pull_request) Failing after 5m56s
9a8c55b52d
CI 'Agents CI / API Tests' failed non-deterministically on 'serves legacy agent assigned
issue list links': expected limit=20, received limit=NaN. Route /agents/:id/issues does
readLiveRunsQueryInt(req.query.limit, ISSUE_LIST_DEFAULT_LIMIT, ISSUE_LIST_DEFAULT_LIMIT);
the helper did Math.min(max, parsed). Under vitest module-mock isolation the imported
ISSUE_LIST_DEFAULT_LIMIT is intermittently undefined -> Math.min(undefined, 20) = NaN.

Fix: guard a non-finite max (Number.isFinite(max) ? max : parsed) so the helper never
returns NaN. Production ISSUE_LIST_DEFAULT_LIMIT is always 500 -> behaviour unchanged.
Regression guard test added. agent-live-run-routes 23/23, agents.ts type-clean.
andrei left a comment

CTO review: CI (Agents CI / API Tests) упал — server/src/tests/costs-service.test.ts > cost routes > returns issue subtree cost summaries for issue refs, AssertionError: expected 500 to be 200. Диф PR только про readLiveRunsQueryInt, тест не связан напрямую с изменением — нужно подтвердить: (а) это уже существующий флейк на master, (б) реальная регрессия из-за побочного эффекта диффа. Disposition: needs fixes — не мержу пока job не станет зелёным или не будет доказательства, что 500 не связан с этим PR.

CTO review: CI (Agents CI / API Tests) упал — server/src/__tests__/costs-service.test.ts > cost routes > returns issue subtree cost summaries for issue refs, AssertionError: expected 500 to be 200. Диф PR только про readLiveRunsQueryInt, тест не связан напрямую с изменением — нужно подтвердить: (а) это уже существующий флейк на master, (б) реальная регрессия из-за побочного эффекта диффа. Disposition: needs fixes — не мержу пока job не станет зелёным или не будет доказательства, что 500 не связан с этим PR.
test(server): add retry budget to serialized API suite — load-induced flakiness
Some checks failed
security/pr-scan 1 security flag(s) — see Actions log (critical)
PR Quality Gates / PR Quality Gates (pull_request_target) Successful in 5s
Agents CI / Typecheck and Build (pull_request) Successful in 6m32s
Agents CI / API Tests (pull_request) Failing after 6m14s
57659fe48e
The API Tests job runs 105 per-file vitest processes on a shared, overloaded CI runner.
Different tests fail on different runs (embedded-postgres HTTP 500 under contention,
mock-isolation edge cases) — individual fixes only whack-a-mole. Add retry: 2 so a
genuinely load-flaky test passes on re-run while a truly broken test still fails every
attempt (CI signal stays honest). Pairs with the readLiveRunsQueryInt NaN guard.
revert(server): drop retry budget — flakiness is run-consistent isolation, not attempt-flaky
Some checks failed
security/pr-scan 1 security flag(s) — see Actions log (critical)
PR Quality Gates / PR Quality Gates (pull_request_target) Successful in 4s
Agents CI / Typecheck and Build (pull_request) Successful in 6m1s
Agents CI / API Tests (pull_request) Failing after 6m36s
2ea7d68d21
CI showed a DIFFERENT test failing each full-suite run (NaN, costs-500, annotation mock-leak),
each failing ALL retries within a run → cross-file test-isolation leak across the 105-file
serialized suite, not per-attempt flakiness. retry:2 doesn't help and triples flaky-test time
(risking the 25min budget). Keep only the readLiveRunsQueryInt NaN guard (a real fix).
Root cause = shared state/mock leakage between test files — a focused test-isolation effort.
andrei merged commit 30a110cac2 into master 2026-07-04 23:14:43 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
europa-tech-srl/europa-tech-agents!172
No description provided.