tester(ET): auto-commit from tester run_id=530
This commit is contained in:
92
docs/work-items/ORCH-095/13-test-report.md
Normal file
92
docs/work-items/ORCH-095/13-test-report.md
Normal file
@@ -0,0 +1,92 @@
|
||||
---
|
||||
result: PASS # PASS | FAIL — машинный вердикт, UPPERCASE
|
||||
work_item: ORCH-095
|
||||
stage: testing
|
||||
author_agent: tester
|
||||
status: pass
|
||||
created_at: 2026-06-10
|
||||
model_used: claude-opus-4-8
|
||||
type: test-report
|
||||
work_item_id: 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-095 `testing`, `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`.
|
||||
Reference in New Issue
Block a user