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