Skip to content

orchestrate: loop-gate misidentifies the coordinator as a managed worker via cwd match, and blocks protocol-mandated wait phases (plan_ready/impl_done) #127

Description

@choiyounggi

증상 (stickygap1 런, 2026-08-21, dev-loop 1.8.3 실측)

두 가지 별개 증상이 같은 게이트에서 나온다:

A. 코디네이터 세션이 차단됨. Phase 4 리뷰 절차대로 워커 워크트리에서 검증을 돌린 직후(cd .worktrees/task-t1-sticky-gap && uv run pytest), 코디네이터가 "워커 완료 대기 중" 요약으로 턴을 끝내려 하자 loop-gate가 verification loop incomplete (phase=impl_done)로 stop을 거부했다. 이후 머지 단계에서 cd가 메인 루트로 돌아오자 그다음 stop은 통과 — 차단 조건이 세션의 역할이 아니라 현재 cwd였다는 증거.

B. 워커의 규약상 대기도 차단됨. session-prompt §1은 "run status-update plan_ready and wait for an approval message"라고 지시하는데, loop-gate의 terminal 허용 집합은 done|approved|merged|failed|"" 뿐이라(hooks/loop-gate.sh:55) plan_ready/impl_done에서 턴을 끝내려는 워커가 정확히 규약을 따르다 차단된다. designv2 런에서는 이 차단이 워커의 "승인하고 진행해도 되나" 불필요 질문(ask-coordinator 레코드)으로 이어졌다. 현재는 stop_hook_active=true 재진입(loop-gate.sh:30)으로 두 번째 stop이 풀리지만, 매 phase마다 워커 턴 1회 + 노이즈가 낭비된다.

원인

hooks/loop-gate.sh:46-59 — "이 세션이 관리 대상인가"를 status 엔트리의 .worktree == 세션 cwd 로 판정한다. 그런데:

  • 코디네이터는 Phase 4(리뷰), test-floor 등에서 워커 워크트리로 cd하는 것이 스킬이 지시하는 정상 동작이라, cwd 일치가 역할 판정으로 성립하지 않는다.
  • terminal 집합이 session-prompt가 명시적으로 "stop하고 기다려라"고 지시하는 phase(plan_ready, impl_done)를 포함하지 않아, 게이트와 프로토콜이 서로 모순된다.

제안

  1. 세션 식별을 cwd 우연 일치가 아니라 세션 정체성으로. launch-session.sh가 이미 status에 session(tmux 세션명)을 pre-seed한다. 훅에서 $TMUX가 설정돼 있고 tmux display-message -p '#S'가 매칭된 status 엔트리의 .session과 같을 때만 차단하도록. tmux 밖(또는 다른 세션)에서 실행 중인 코디네이터는 자동 면제된다. .session이 없는 레코드에 한해 기존 cwd 매칭을 fallback으로 유지.
  2. 프로토콜상 대기 phase를 허용 집합에 추가. §1/§2가 "wait"를 지시하는 plan_ready|impl_done을 stop 허용으로. 게이트가 잡아야 할 것은 mid-loop 이탈(pending, rework)이지, 규약이 명령한 대기가 아니다. (참고: 게이트 주석의 design.md §8.4 의도 — "quietly stop mid-loop" 방지 — 와도 정합적)

둘 중 1만으로 A는 해결되지만 B의 낭비 턴은 남으므로, 둘 다 적용을 제안.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions