Skip to content

policy: merge-automation 정책·direct-first 계약 제거 — 머지는 항상 PR + 에이전트 babysitting (운영 kv에 enabled=true·direct-first 잔존) #5716

Description

@itismyfield

결정 (사용자, 2026-09-05)

  • 머지는 항상 PR을 통해서만 한다. direct-first(main 직접 push, 실패 시 PR fallback) 계약은 폐지한다.
  • 머지 자동화는 플래그로 켜고 끄는 기능이 아니다. PR 머지는 에이전트가 PR을 babysitting(CI·리뷰 통과 확인 후 머지, 실패 시 수리)해서 처리한다. 따라서 merge-automation 정책과 그 설정 표면을 제거한다.

현재 상태 (제거 근거)

  • 코드 기본값·문서는 "기본 비활성"인데 운영 kv에 merge_automation_enabled=true, merge_strategy_mode=direct-first, merge_strategy=squash, merge_allowed_authors=…가 들어가 있다. 언제 왜 켰는지 기록이 없다(사용자도 기억 없음. 자동큐 시절 잔재로 추정).
  • 카드별 오버라이드 merge_strategy_mode:card:<uuid>=direct-first 78행이 kv에 남아 있다.
  • 3일 로그에서 실제 머지 액션 0건. 대신 onTick5min이 5초 tick 예산을 매번 소진해 5분 티어 타임아웃 100%를 만든다(별도 이슈 예정).
  • merge_request kv 경로에 작성자 검사가 없다.
  • 에이전트 프롬프트에 direct-first 계약이 주입된다. prompt_builder/dispatch_contract.rs:8 DIRECT_FIRST_COMPLETION_CONTRACT가 "완료 조건은 git push origin HEAD:main 성공"이라고 지시한다. 이것이 "항상 PR" 정책과 정면으로 어긋나는 실제 경로다.

제거 범위

정책 (JS)

  • policies/merge-automation.js (2,238줄), policies/merge-automation.cap.yaml, policies/__tests__/merge-automation.test.js
  • merge-automation 전용 lib 4개: lib/github-pr-adapter.js, lib/merge-conflict-resolver.js, lib/merge-notification-dispatcher.js, lib/merge-text-utils.js (다른 정책에서 require 없음, 확인함)
  • policies/pipeline.js:89 우선순위 주석, policies/kanban-rules.js:667 "feat: 카드 done 전환 시 워크트리 커밋 자동 머지/PR 생성 #401 auto-merge는 merge-automation이 처리" 주석과 해당 분기
  • policies/review-automation.js: pr_tracking.last_error를 "merge-automation 재시도 루프가 집어가도록" 심는 계약(:394, :428, :1022, :1119, :1155, :1475, :1593, :1817). 재시도 주체를 에이전트 babysitting으로 바꾸고 주석·상태 전이를 그에 맞게 수정. pr_tracking 테이블 자체는 00-pr-tracking.js, ci-recovery.js, Rust review_automation_ops.rs/ci_recovery_ops.rs/terminal_cleanup.rs가 쓰므로 유지.

Rust

  • config.rs:2487 AutomationConfig(enabled/strategy/strategy_mode/allowed_authors) 제거
  • settings.rs:127-141, 559-560 kv 키 merge_automation_enabled, merge_strategy, merge_strategy_mode 등록 제거
  • dispatch_contract.rs: DIRECT_FIRST_COMPLETION_CONTRACT 삭제, merge_strategy_mode 분기 제거, PR_ALWAYS_COMPLETION_CONTRACT를 유일 계약으로. 문구에서 "pr-always 모드" 표현도 제거(모드가 아니라 기본 규칙)
  • github/sync.rs, routes/docs/inventory/endpoints/part_05.rs의 참조 정리

운영 데이터

  • kv_meta에서 merge_* 4행 + merge_strategy_mode:card:* 78행 삭제 (마이그레이션 또는 1회 운영 스크립트, 실행 전 dump)

문서

  • README, docs/policy-sql-guard.md, docs/generated/policy-db-inventory.md, docs/diagrams/01-module-structure.md, docs/diagrams/04-hook-chain.md, docs/agent-maintenance/multinode-*.md에서 merge-automation·direct-first 항목 제거. "머지는 PR + 에이전트 babysitting" 원칙을 docs/source-of-truth.md 또는 CONTRIBUTING에 한 줄로 명시.

순서

  1. dispatch_contract.rs에서 direct-first 계약 제거 (에이전트가 main에 직접 push하는 경로부터 끊는다. 가장 작은 PR로 먼저)
  2. kv 오버라이드 삭제 + merge-automation 정책 로드 중단 (5분 tick 타임아웃도 여기서 사라짐)
  3. 정책·lib·테스트·Rust 설정 표면 삭제
  4. review-automation 재시도 계약 수정, 문서 정리

완료 정의

  • 어떤 에이전트 프롬프트에도 git push origin HEAD:main 완료 조건이 주입되지 않음 (dispatch_contract 테스트로 고정)
  • policies/에 merge-automation·전용 lib 4개 없음, node --test policies/__tests__/*.test.js 통과
  • kv_meta에 merge_* 키 0행 (운영 실측)
  • GET /api/settings/config에 merge 관련 키 없음
  • 5분 policy tick hook timed out 0건 (24시간 로그)
  • review-automation이 terminal 상태 PR을 에이전트 babysitting 대상으로 남기며, "merge-automation이 재시도한다"는 주석·분기 0건
  • pre-push 훅 또는 브랜치 보호로 main 직접 push 차단 여부 결정 기록 (별도 이슈 가능)

관련

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions