6.3 KiB
result, work_item, stage, author_agent, status, created_at, model_used, type, work_item_id
| result | work_item | stage | author_agent | status | created_at | model_used | type | work_item_id |
|---|---|---|---|---|---|---|---|---|
| PASS | ORCH-099 | testing | tester | pass | 2026-06-10 | claude-opus-4-8 | test-report | ORCH-099 |
Test Report — ORCH-099 — FND/F1a: лёгкий read-only GET /metrics (сырьё для sidecar F1b)
Машинный вердикт читается ТОЛЬКО из frontmatter. Канонический ключ —
result:(UPPERCASE). Любой негативный токен (FAIL/BLOCKED) авторитетен.
Окружение
- Python: 3.12.13
- pytest: 8.3.3 (pytest-cov 5.0.0, pytest-asyncio 0.23.8)
- Дата: 2026-06-10
- Worktree:
/repos/_wt/orchestrator/feature_ORCH-099-fnd-f1a-metrics-agent-liveness(веткаfeature/ORCH-099-fnd-f1a-metrics-agent-liveness) - Review verdict (
12-review.md): APPROVED — гейт пройден до тестирования.
Результаты
Полный регресс
cd <worktree> && pytest tests/ -v --tb=short → 1482 passed, 1 warning за 49.98s.
Прод-контейнер (8500) не трогался; прогон — в рабочем дереве ветки задачи.
Единственный warning — известный PydanticDeprecatedSince20 (src/config.py:8), не связан с задачей.
Профильная сюита
pytest tests/test_metrics.py -v → 14 passed за 0.96s (TC-01…TC-11; часть TC покрыта
несколькими тест-функциями). Новый код присутствует в worktree: src/metrics.py (10 538 байт),
@app.get("/metrics") в src/main.py:216 — тонкая обёртка над metrics.build_metrics().
Smoke API (read-only, прод 8500)
GET /health→{"status":"ok","service":"orchestrator"}— OK.GET /status→{"active_tasks":[...]}— контракт цел.GET /queue→ ключи на месте; блокserial_gateприсутствует (ORCH-088),auto_labelsприсутствует (ORCH-089) — регресса смока нет.GET /metricsна проде →404 Not Found— ожидаемо: новый эндпоинт ещё не задеплоен (стадия testing, доdeploy); функционал верифицирован тестами в worktree (TC-08). Не является FAIL.
Сопоставление с тест-планом (04-test-plan.yaml)
| TC ID | Описание | Тест-функция | Результат |
|---|---|---|---|
| TC-01 | Конверт FR-5: dict с schema_version/generated_at/stages/queue/agents/cost | test_tc01_envelope_has_all_sections |
PASS |
| TC-02 | stages: активные только; work_item/stage/age_in_stage_s(int)/repo; терминалы исключены | test_tc02_stages_active_only_with_fields |
PASS |
| TC-03 | queue: counts/max_concurrency/retries/breaker-снимок | test_tc03_queue_section_fields |
PASS |
| TC-04 | agents: agent/run_id/job_id/pid/runtime_s + CPU-liveness сырьё | test_tc04_agents_liveness_fields |
PASS |
| TC-05 | liveness never-raise: pid=None / нет /proc → cpu_ticks=null, ответ цел | test_tc05_dead_or_none_pid_cpu_ticks_null, test_tc05_read_cpu_ticks_helper_none_paths |
PASS |
| TC-06 | cost.aggregate: суммы cost_usd/токены; пустая таблица → нули | test_tc06_cost_aggregate_sums_and_empty_zeros |
PASS |
| TC-07 | never-raise по разделу: бросающий источник/breaker → null/дефолт | test_tc07_section_source_throws_degrades_not_500, test_tc07_breaker_unavailable_is_null |
PASS |
| TC-08 | GET /metrics → 200 + валидный JSON со всеми разделами на засеянной БД | test_tc08_endpoint_returns_full_payload, test_tc08_kill_switch_minimal_body |
PASS |
| TC-09 | read-only: снимок БД до/после идентичен; повтор не меняет состояние | test_tc09_metrics_is_read_only |
PASS |
| TC-10 | аддитивность: /health//status//queue сохраняют контракт | test_tc10_existing_endpoints_intact |
PASS |
| TC-11 | пустое состояние: stages=[]/agents=[]/cost нули/queue нули → 200 без исключений | test_tc11_empty_state_valid |
PASS |
Все 11 TC из тест-плана выполнены и сопоставлены. Расхождений с expected: PASS нет.
Сопоставление с критериями приёмки (03-acceptance-criteria.md)
| AC | Условие | Покрытие | Результат |
|---|---|---|---|
| AC-1 | 4 раздела + конверт с полями TRZ §3 | TC-01/02/03/04/06 | PASS |
| AC-2 | /health//status//queue не сломаны | TC-10 + smoke | PASS |
| AC-3 | лёгкость: только локальный SQL + in-memory, без сети/тяжёлых процессов | код src/metrics.py (нет сетевых вызовов; только read /proc), профильный прогон 0.96s |
PASS |
| AC-4 | never-raise: ошибка поля → null, не 500 | TC-05/TC-07/TC-11 | PASS |
| AC-5 | read-only; STAGE_TRANSITIONS/QG_CHECKS/check_*/схема не тронуты | TC-09 + review (дифф src/stages.py/src/qg/ пуст) |
PASS |
| AC-6 | agent-liveness: pid/runtime_s + CPU-сырьё для alive-детекта | TC-04/TC-05 | PASS |
| AC-7 | контракт в README + CHANGELOG | подтверждено review (12-review.md, §Документация) |
PASS |
| AC-8 | pytest зелёный; есть test_metrics.py | 1482 passed; 14 в test_metrics.py | PASS |
Вывод pytest
======================= 1482 passed, 1 warning in 49.98s =======================
tests/test_metrics.py ........... (14 items)
======================== 14 passed, 1 warning in 0.96s =========================
Итог
PASS — полный регресс (1482) и профильная сюита (14) зелёные; smoke read-only OK
(serial_gate + auto_labels присутствуют в /queue); каждый TC тест-плана выполнен и
сопоставлен с критериями приёмки. Задача готова к переходу на deploy-staging.