fix(launcher): runs log dir from settings, not hardcoded /app (CI fix)

test_spawn_stamps_resolved_effort упал в CI с PermissionError на '/app':
launcher._spawn хардкодил output_path='/app/data/runs/{run_id}.log' и
os.makedirs('/app/data/runs'). В контейнере /app есть, на CI-хосте
(act_runner hostexecutor) — нет, makedirs бросает -> красный CI.

Фикс корня (не только теста): базовый каталог per-run логов вынесен в
Settings.runs_dir (env ORCH_RUNS_DIR, дефолт '/app/data/runs' = прод 1:1).
Новый хелпер _run_log_path(run_id) — единый источник пути, использован в
_spawn + три прежних inline-строки логов/алертов. Тест monkeypatch-ит
settings.runs_dir на tmp_path -> окружение-независим (проверено прогоном
с принудительно недоступным /app). pytest tests/ -q: 1090 passed.

STAGE_TRANSITIONS/QG_CHECKS/схема БД не тронуты. Docs: README env-таблица,
CHANGELOG.

Refs: ORCH-087
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-09 09:55:08 +03:00
committed by stream
parent a7b27f2235
commit 81fc2df8a8
5 changed files with 24 additions and 4 deletions

View File

@@ -44,6 +44,10 @@ class Settings(BaseSettings):
repos_dir: str = "/repos"
host_repos_dir: str = "/home/slin/repos"
worktrees_dir: str = "/repos/_wt" # ORCH-2 / S-4: isolated worktree per task/branch
# ORCH-087: base dir for per-run agent logs (<runs_dir>/<run_id>.log). Lifted out
# of the hardcoded '/app/data/runs' so tests (and any non-container host) can point
# it at a writable path; default preserves the container layout.
runs_dir: str = "/app/data/runs"
# DB
db_path: str = "/app/data/orchestrator.db"