architect(ET): auto-commit from architect run_id=739
All checks were successful
CI / test (push) Successful in 1m7s

This commit is contained in:
2026-06-16 02:41:50 +03:00
parent 50c48c2c03
commit 04f9b9cbce
5 changed files with 756 additions and 0 deletions

View File

@@ -0,0 +1,54 @@
---
work_item: ORCH-116
stage: architecture
author_agent: architect
status: proposed
created_at: 2026-06-16
model_used: claude-opus-4-8
---
# 08 — Требования к данным: ORCH-116 — детерминированный test-раннер
Work Item: **ORCH-116** · Repo: **orchestrator** · Стадия: architecture
## 1. Изменения схемы БД — НЕТ (NFR-1)
Новых таблиц / колонок / индексов / миграций **нет**. Раннер использует **существующие** структуры:
| Структура | Использование | Запись? |
|-----------|---------------|---------|
| `tasks` (`stage`, `branch`, `work_item_id`) | резолв полей задачи по `task_id`; гард стадии `testing` в `should_intercept`; продвижение/откат — через **существующий** `advance_stage` (он же пишет стадию под transition-lease ORCH-114) | раннер сам стадию **не** пишет — только через `advance_stage` |
| `jobs` (`status`, `task_content`) | `mark_job(done\|failed)` для строки джоба (через `_run_test_runner_job`); restart-safe счётчик tool-error DEFER — `COUNT(*)` по маркеру `test-runner infra-retry` в `task_content` re-queued джоба | да (`mark_job`, `enqueue_job` — существующие API) |
| `agent_runs` | **НЕ создаётся** — детерминированный раннер не спавнит LLM (happy-path без `_spawn`) | нет |
| `transition_lease` (ORCH-114) | берётся/освобождается **внутри** `advance_stage` на side-effectful переходе | раннер **не трогает** |
## 2. Restart-safe счётчик DEFER — без колонки (зеркало ORCH-115/110)
Бюджет tool-error DEFER (D5) считается **из persisted очереди `jobs`** подсчётом маркера
`test-runner infra-retry` в `task_content` re-queued джоба (зеркало
`staging_runner._infra_retry_count` / `stage_engine._merge_infra_retry_count`). Это переживает
рестарт сервиса **без** новой колонки/таблицы — намеренно, ради NFR-1 (схема БД байт-в-байт).
## 3. Артефакт `13-test-report.md` — контракт frontmatter неизменен (AC-2)
Раннер пишет тот же файл с тем же machine-key, что читает гейт:
- `result: PASS|FAIL` (UPPERCASE) — канонический ключ `_parse_tests_verdict` (`src/qg/checks.py:265`);
имя/регистр/токены **не меняются**.
- Обязательная 52c-схема: `work_item` / `stage: testing` / `author_agent: test-runner` /
`status: success|failed` / `created_at` / `model_used: n/a`.
- **Инвариант D6.1 (данные):** `status:` **читается** тем же парсером (`verdict:`/`status:`/`result:`,
negative-token-priority) → значение `status:` **обязано** быть выровнено по вердикту
(`success`↔PASS, `failed`↔FAIL); иначе негативный токен в `status:` при `result: PASS` исказит
вердикт. Это требование к **значению данных**, не к схеме.
## 4. Счётчики наблюдаемости — in-process, не БД
Блок `test_runner` в `GET /queue` питается **in-process** счётчиками `_TEST_RUNNER_COUNTERS`
(`runs`/`pass`/`fail`/`tool_error`/`deferred`) — паттерн `_STAGING_RUNNER_COUNTERS`/
`_MERGE_GATE_COUNTERS`. В БД **не** персистятся (обнуляются при рестарте — приемлемо для
оперативной наблюдаемости).
## 5. Вывод
Требований к изменению данных/схемы **нет**. Совместимость с общей БД (self-hosting + enduro-trails)
сохранена: аддитивных объектов не вводится, существующие read/write идут через существующие API.