feat(serial-gate): per-repo serial gate + deferred branch cut + rollback-freeze (ORCH-088) #88
Reference in New Issue
Block a user
Delete Branch "feature/ORCH-088-orch-88-10-20"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
ORCH-088 — Per-repo serial gate (Этап 1, serial e2e)
Закрывает логический stale-анализ: ветка задачи N+1 срезалась на входе в анализ от
main, ещё не содержащего код предшественника N. Новая задача репо не входит вanalysis(analyst-job не выбирается, ветка не режется), пока в репо есть более ранняя незавершённая задача (FIFO) ИЛИ репо заморожен.Что сделано (по ADR-001)
db.claim_next_job) — leafsrc/serial_gate.py::build_claim_clause(fail-OPEN, санитизация repo-CSV). Только analyst-job, только локальная БД (offline hot-path).start_pipelineне создаёт Gitea-ветку/docs для применимого репо; релокация вlauncher._materialize_deferred_branchна момент claim analyst-job (база = свежийorigin/main).repo_freeze; post-deployDEGRADED→set_repo_freeze+ Telegram; снятие —POST /serial-gate/unfreeze?repo=….is_repo_frozenfail-CLOSED.serial_gateвGET /queue.serial_gate_enabled/serial_gate_repos(пусто = все репо) /serial_gate_freeze_enabled.⚠️ Отклонение от ADR (FIFO-уточнение, FR-2)
ADR-001 D1 фиксировал псевдо-SQL
t2.id != jobs.task_id. При!=пакет одновременно созданных свежих задач (все вanalysis) взаимно блокируется → дедлок всей serial-очереди (воспроизведено). Реализованоt2.id < jobs.task_id— допускает самую раннюю задачу и сериализует остальные (строго по одной, FIFO поjobs.id), сохраняя AC-1 и не блокируя rework-analyst (R-7). Подробности — в коде/CHANGELOG/README. ADR не правился (артефакт стадии architecture).Инварианты
STAGE_TRANSITIONS/QG_CHECKS/check_*— без изменений. Аддитивно, под kill-switch, never-raise, restart-safe; миграции идемпотентны; прод-контейнер не рестартится. При выключенном флаге — нулевая регрессия (enduro не затронут).Тесты
TC-01..TC-22:
tests/test_serial_gate.py,test_serial_gate_e2e.py,test_serial_gate_freeze.py,test_serial_gate_branch.py,test_queue_endpoint.py. Полный прогон — 1114 passed. Два пред-ORCH-088 routing-теста (test_plane_webhook,test_status_trigger) пиннуты на kill-switch-off (тестируют routing, не branch-timing).Docs
README (раздел serial gate /
/queue/ API / БД + статус-футер),CLAUDE.md,CHANGELOG.md,.env.example.Refs: ORCH-088
🤖 Generated with Claude Code
31891354c8todd4aaebe84