feat(labels): auto-mode by Plane labels — autoApprove + autoDeploy (ORCH-089) #89
Reference in New Issue
Block a user
Delete Branch "feature/ORCH-089-autoapprove-brd-autodeploy"
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-089 — Авто-режим по лейблам: autoApprove + autoDeploy
Снимает два человеческих гейта конвейера, тормозящих пакетный автономный прогон (эпик ORCH-088): гейт BRD (
analysis: ручнойApproved) и гейт прод-деплоя (deployPhase A: ручнойConfirm Deploy, ORCH-059). Выборочно (лейбл Plane на задаче), декларативно, обратимо, без изменения ни одной технической проверки.Что сделано
src/labels.py(never-raise):auto_approve_applies/auto_deploy_applies(scope, kill-switch проверяется ПЕРВЫМ — без сети),has_label(единственный сетевой вызов, только приapplies==True),snapshot.autoApprove→ врезка вstage_engine._handle_analysis_approved_flow(веткаfiles_ok):set_issue_approved+ лог/Telegram/Plane-коммент +advance_stage(..., finished_agent=None)— тот же путь, что человеческий Approved (approved-via-status→analysis → architecture+mark_brd_review_ended). Без дублирования переходной логики; re-entrancy безопасна.autoDeploy→ врезка вstage_engine._handle_self_deploy_phase_aпосле advance наdeploy+clear_state: лог/Telegram/Plane-коммент +_handle_self_deploy_phase_b(маркерINITIATED,Deploying, finalizer). BR-5 структурно: Phase A достигается только после зелёных под-гейтов ребра (security → merge-gate → image-freshness → staging) → autoDeploy физически не деплоит сломанное.plane_sync:fetch_issue_labels(Noneпри ошибке ≠[]),get_project_labels({normalized_name→uuid}, TTL-кэшauto_label_states_ttl_s, сентинел__AMBIGUOUS__при коллизии имён),set_issue_approved.config.py):auto_label_enabled,auto_approve_label/auto_deploy_label,auto_label_repos(пусто → self-hosting only),auto_label_states_ttl_s.auto_labelsвGET /queue.Инварианты (не тронуты)
STAGE_TRANSITIONS,QG_CHECKS,check_analysis_approved/check_deploy_status/check_staging_status, все технические под-гейты, sentinel-маркеры self-deploy, exit-коды хука, схема БД — без изменений. Fail-safe: любая ошибка/неоднозначность → ручной гейт (never-raise). Kill-switch off → нулевая регрессия (enduro не затронут).Тесты
TC-01…TC-26 в 7 модулях (
test_labels,test_plane_sync_labels,test_auto_approve_brd,test_auto_deploy,test_auto_label_combinations,test_auto_labels_integration,test_auto_labels_invariants). Полный прогон: 1157 passed.Документация (golden source, в этом же PR)
CLAUDE.md,docs/architecture/README.md,06-adr/ADR-001-auto-label-gates.md+ globaladr-0018,07-infra-requirements.md(создание лейблов в Plane ORCH),CHANGELOG.md.⚠️ Инфра-предусловие
Создать лейблы
autoApprove/autoDeployв Plane-проекте ORCH (labels API). Их отсутствие =has_labelFalse = ручной режим (fail-safe).Refs: ORCH-089
🤖 Generated with Claude Code
Lift the two HUMAN gates that block an autonomous batch run (epic ORCH-088): the BRD gate (analysis: manual Approved) and the prod-deploy gate (deploy Phase A: manual Confirm Deploy, ORCH-059). Selective (a Plane label on the issue), declarative, reversible, and WITHOUT touching a single technical check. Additive, mirroring the conditional sub-gates (ORCH-035/043/058/088): leaf src/labels.py (never-raise) + two point insertions + config flags. STAGE_TRANSITIONS / QG_CHECKS / check_* / DB schema are NOT touched. - autoApprove: врезка in _handle_analysis_approved_flow (files_ok branch) -> set_issue_approved + log/Telegram/Plane-comment + advance_stage( finished_agent=None) — the SAME path a human Approved takes (approved-via- status -> analysis->architecture + mark_brd_review_ended). No duplicated transition logic; re-entrancy safe. - autoDeploy: врезка in _handle_self_deploy_phase_a after advance to deploy + clear_state -> log/Telegram/Plane-comment + _handle_self_deploy_phase_b (INITIATED marker, Deploying, finalizer). Only the indicative human steps are skipped. BR-5 holds structurally: Phase A is reached only after the green edge sub-gates, so autoDeploy can never deploy a broken build. - plane_sync: fetch_issue_labels (None on error != []), get_project_labels ({normalized_name->uuid}, TTL cache, ambiguity sentinel), set_issue_approved. - config flags: auto_label_enabled (kill-switch), auto_approve_label/ auto_deploy_label, auto_label_repos (empty -> self-hosting only), auto_label_states_ttl_s. applies() (local) checked FIRST; has_label (network) only when applies==True -> zero network / zero regression when disabled (AC-8). - Fail-safe (never auto on doubt), transparency via log+Telegram+Plane+card, read-only auto_labels block in GET /queue. - Tests TC-01..TC-26 across 7 modules; docs (CLAUDE.md, architecture README, CHANGELOG) updated in the same PR. Refs: ORCH-089 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>542cd82f16to9b3490ceaa