6.5 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-095 | testing | tester | pass | 2026-06-10 | claude-opus-4-8 | test-report | ORCH-095 |
Test Report — ORCH-095
Фикс HTML-инъекции «<1м» в live-карточке трекера (render_task_tracker). Прогон полного
регресса + профильной сюиты, smoke read-only API. Review-вердикт — APPROVED (12-review.md).
Окружение
- Python: 3.12.13
- pytest: 8.3.3
- Дата: 2026-06-10
- Worktree:
/repos/_wt/orchestrator/feature_ORCH-095-bug-html-1-render-task-tracker(веткаfeature/ORCH-095-bug-html-1-render-task-tracker— код именно этой задачи, не общий чекаут)
Smoke API (read-only, прод-контейнер не трогается)
GET /health→{"status":"ok","service":"orchestrator"}✓GET /status→ активная задача ORCH-095 (id=80) на стадииtesting, agent_running=null ✓GET /queue→ блокserial_gateприсутствует (ORCH-088):enabled=true, репоorchestrator— active_task ORCH-095testing,frozen=false, waiting пуст; блокauto_labelsприсутствует (ORCH-089). Регресса смока нет. ✓
Результаты
Полный регресс
cd <worktree> && pytest tests/ -v --tb=short → 1437 passed, 1 warning in 46.89s.
Единственное предупреждение — PydanticDeprecatedSince20 (унаследованное, не относится к задаче).
Профильная сюита (ORCH-095)
pytest tests/test_tracker_html_escape.py -v → 24 passed (новый файл, TC-01…TC-11).
Регресс существующих тестов трекера (TC-12)
pytest tests/test_telegram_tracker.py tests/test_tracker_issue_link.py tests/test_tracker_status_line.py tests/test_notifications_orphans.py tests/test_notify_issue_links.py -q → 91 passed.
Сопоставление с тест-планом (04-test-plan.yaml)
| TC ID | Описание | Тест-функция | Результат |
|---|---|---|---|
| TC-01 | _fmt_minutes(<60с) → HTML-безопасно, без сырого <1м |
test_tc01_sub_minute_duration_escaped_at_boundary |
PASS |
| TC-02 | _fmt_minutes граничные входы (0/None/нечисло/60/большое/-5/59/61) — never-raise + безопасно |
test_tc02_fmt_minutes_never_raise_and_safe[*] (9 кейсов) |
PASS |
| TC-03 | render_task_tracker со стадией < 1 мин — нет неэкранированного < из длительности |
test_tc03_render_sub_minute_stage_is_safe |
PASS |
| TC-04 | Заголовок со спецсимволами < > & — только экранированно, без двойного экранирования |
test_tc04_title_special_chars_escaped_no_double |
PASS |
| TC-05 | Статус-лейбл / имя модели / эффорт экранированы (defence-in-depth) | test_tc05_status_label_escaped, test_tc05_model_escaped, test_tc05_effort_escaped |
PASS |
| TC-06 | Токены/стоимость ($, числа) HTML-безопасны |
test_tc06_token_cost_metrics_safe |
PASS |
| TC-07 | Регресс намеренной разметки: <a href> номер задачи остаётся кликабельным, не задвоен |
test_tc07_issue_number_stays_clickable |
PASS |
| TC-08 | Регресс _done_link: строка 🔗 PR #n · 📦 Внедрено валидна, не экранирована |
test_tc08_done_link_markup_preserved |
PASS |
| TC-09 | update_task_tracker (edit) — payload text не содержит сырого <1м-триггера |
test_tc09_edit_payload_is_parse_safe |
PASS |
| TC-10 | Возобновление застрявшей карточки + анти-дубль ORCH-087 на транзиентном фейле | test_tc10_valid_render_edits_in_place_no_new_card, test_tc10_transient_fail_does_not_duplicate |
PASS |
| TC-11 | never-raise на битых входах (нет задачи / None-заголовок / битые timestamps / _esc) |
test_tc11_never_raise_missing_task, test_tc11_never_raise_none_title_and_bad_timestamps, test_tc11_esc_never_raises |
PASS |
| TC-12 | Полный регресс существующих тестов трекера остаётся зелёным | suite (91 passed) + полный регресс (1437 passed) | PASS |
Все 12 TC выполнены и сопоставлены.
Сопоставление с критериями приёмки (03-acceptance-criteria.md)
| AC | Содержание | Покрытие | Результат |
|---|---|---|---|
| AC-1 | Стадия < 1 мин не ломает парсер Telegram (<1м) |
TC-01, TC-03, TC-09 | PASS |
| AC-2 | Все динамические поля HTML-безопасны, без двойного экранирования | TC-02, TC-04, TC-05, TC-06 | PASS |
| AC-3 | Регресс намеренной разметки (<a href> номер, _done_link, форматирование) |
TC-07, TC-08, TC-12 | PASS |
| AC-4 | Застрявшая карточка возобновляет обновления; анти-дубль ORCH-087 цел | TC-10 | PASS |
| AC-5 | never-raise, зелёный регресс, CHANGELOG, машина стадий/гейты/схема БД не тронуты | TC-11, TC-12, полный регресс 1437 passed | PASS |
Вывод pytest
======================= 1437 passed, 1 warning in 46.89s =======================
Профильная сюита:
======================== 24 passed, 1 warning in 1.31s =========================
Регресс трекера (TC-12):
91 passed, 1 warning in 4.32s
Итог
PASS — полный регресс зелёный (1437 passed), профильная сюита ORCH-095 зелёная (24 passed),
каждый TC из тест-плана выполнен и сопоставлен с критериями приёмки, smoke API read-only
(/health, /status, /queue с блоками serial_gate + auto_labels) без регресса.
Обоснованных FAIL/смок-сбоев нет → result: PASS → задача переходит на deploy-staging.