---
work_item: ORCH-113
stage: architecture
author_agent: architect
status: proposed
created_at: 2026-06-15
model_used: claude-opus-4-8
---

# 08 — Требования к данным: ORCH-113 — reaper finalizer-liveness ownership

Work Item: **ORCH-113** · Repo: **orchestrator** · Стадия: architecture

> When-applicable / информационный (гейтом не парсится).

## Изменения схемы БД

**N/A — нулевое изменение схемы.** Сознательное архитектурное решение (ADR-001 / adr-0043): сигнал
владения финализацией — **in-memory** (leaf `src/finalizer_liveness.py`), а не durable-колонка. Ни
новых таблиц, ни новых колонок, ни индексов; `init_db()` / `_ensure_column` не трогаются. Схема
существующих таблиц (`jobs`, `agent_runs`, `tasks`, …) и их семантика — **байт-в-байт** (NFR-2/AC-5).

## Новые/изменённые сущности

**Процесс-локальный реестр владения** (не БД): `finalizer_liveness` хранит
`{job_id: {"run_id", "stage", "started_ts"}}` под `threading.Lock`. Запись/снятие — живой
монитор-поток (`launcher._monitor_agent`); чтение — reaper-поток (`job_reaper`). Ключ — `jobs.id`
(существующая сущность). Никаких новых персистентных данных.

## Совместимость данных / миграции

- **Миграций нет** — нечего мигрировать (нет схемных изменений); общая прод-БД (self-hosting +
  enduro-trails) не затрагивается.
- **Restart-safe без durable (NFR-5):** in-memory реестр сбрасывается при рестарте процесса, что
  **безопасно** по существующему контракту: `main.lifespan` вызывает `requeue_running_jobs()`
  (`running → queued`, `main.py:59`) **до** старта reaper (`main.py:144`). После рестарта нет ни одного
  `running`-job, ссылающегося на потерянный маркер → отсутствие маркера корректно (нет живых
  finalizer'ов). Гибель **потока** монитора (не процесса) покрыта `try/finally`-снятием маркера; гибель
  **процесса** → рестарт → requeue.
- **Авторитетность in-memory** опирается на одно-процессную модель (один uvicorn-воркер, общая
  SQLite-БД; проверено: CMD без `--workers`). Условие задокументировано как инвариант сопровождения —
  при вводе `--workers>1` сигнал должен стать durable (см. `10-tech-risks.md` TR-3).
</content>
