2회차실습 835–55분

막힘과 의존성

“LP-03이 늦어진다”는 보고만으로는 무엇을 해야 하는지 정할 수 없다. 원인이 정책 미확정이면 PM이, 인력 부족이면 팀장이, 외부 승인 대기이면 승인 담당자가 움직여야 한다. 이 실습은 막힌 업무를 원인, 해결 담당자, 다음 확인일과 함께 기록하고, 먼저 끝나야 하는 업무와 의존성(dependency)으로 연결한다.

진행
설명 5분, 실습 15분
결과
LP-01에 막힌 LP-03, blocked 라벨, 막힘 기록 댓글
명령
gh issue edit --add-blocked-by, gh issue view --json blockedBy
cd ~/gh-pm-lab
source pm-lab/env.sh

1업무 키로 이슈 주소 찾기

상황: LP-03(신청 처리) 담당자가 “같은 이메일로 다시 신청하면 어떻게 처리할지 정해지지 않아 저장 로직을 확정할 수 없다”고 보고했다. LP-03은 LP-01(정책 확정)에 막혀 있다.

LP-03의 이슈 번호를 추측하지 않는다. 업무 키 LP-03과 GitHub 이슈 번호 #3은 같다는 보장이 없다. 실습 5에서 만든 대응표에서 찾는다.

PM_FORM_URL=$(awk -F'\t' '$1=="LP-03" {print $3}' pm-lab/backlog-map.tsv)
echo "$PM_FORM_URL"
echo "PM_FORM_URL=\"$PM_FORM_URL\"" >> pm-lab/env.sh
https://github.com/gildong/launchpad-pm-lab/issues/3

awk -F'\t'는 탭으로 나뉜 열을 읽는다. $1=="LP-03"은 첫 열이 LP-03인 줄을 고르고, print $3은 그 줄의 셋째 열(URL)을 출력한다. 대응표가 없다면 제목으로 검색한다.

gh issue list -R "$PM_REPO" --state all --search 'LP-03 in:title' --json number,title,url

2의존성과 blocked 라벨 붙이기

gh issue edit "$PM_FORM_URL" \
  --add-blocked-by "$PM_POLICY_URL" \
  --add-label blocked
https://github.com/gildong/launchpad-pm-lab/issues/3

이슈 주소를 쓰면 -R을 생략할 수 있다. 웹에서 LP-03을 열면 오른쪽 Relationships 영역에 “Blocked by #1”이 보이고, LP-01에는 “Blocking #3”이 보인다.

기록무엇을 나타내는가언제 바꾸는가
의존성 Blocked by순서의 제약. LP-01이 먼저 끝나야 LP-03을 끝낼 수 있다.관계가 잘못 연결되었을 때만 지운다. 해결된 뒤에도 추적 근거로 남긴다.
blocked 라벨지금 진행이 멈춘 상태막힘이 풀리면 지운다.

두 기록은 따로 움직인다. LP-01이 닫혀도 LP-03의 blocked 라벨은 자동으로 지워지지 않는다. 라벨이 남아 있으면 회의 전 조회에서 이미 풀린 막힘이 계속 나타난다.

3막힘 기록 댓글

라벨은 막혔다는 사실만 보여 준다. 원인, 해결 담당자, 다음 확인일, 영향을 댓글로 남긴다. 네 항목의 순서를 팀에서 고정하면 회의 전에 읽기 쉽다.

gh issue comment "$PM_FORM_URL" --body-file - <<'EOF'
**막힘 기록**
- 원인: 같은 이메일의 재신청 처리 방식이 정해지지 않았다 (LP-01).
- 해결 담당: PM이 10월 14일까지 재신청 처리 기준을 결정한다.
- 다음 확인일: 2026-10-14
- 영향: 결정이 10월 16일을 넘기면 LP-03 목표일(10월 23일)을 지키기 어렵다.
EOF

--body-file -는 본문을 파일 대신 바로 아래에 붙인 내용에서 읽는다. 여러 줄 댓글을 쓸 때 쓴다.

4기록 확인

gh issue view "$PM_FORM_URL" --json title,labels,blockedBy \
  --jq '{title, labels: [.labels[].name], blockedBy: [.blockedBy.nodes[] | "#\(.number) \(.title)"]}'
bash pm-lab/precheck.sh "Sprint 1"
{"blockedBy":["#1 [LP-01] 사전신청 정책을 확정한다"],"labels":["kind:task","area:engineering","blocked"],"title":"[LP-03] 방문자가 이메일로 사전신청을 완료한다"}

blockedBy는 nodes 목록 안에 선행 이슈를 담는다. 실습 7에서 만든 회의 전 조회의 “3. 막힌 일”에도 LP-03이 나타난다.

5막힘이 풀렸을 때

아래 명령은 LP-01의 결정이 나왔을 때 실행한다. 지금 실행하지 않는다. 라벨을 지우고, 무엇으로 풀렸는지 댓글로 남긴다.

# 결정이 나온 뒤에 실행한다
gh issue edit "$PM_FORM_URL" --remove-label blocked
gh issue comment "$PM_FORM_URL" \
  --body "막힘 해소: 재신청 시 기존 신청을 유지하고 안내 문구만 보여 주기로 결정했다. 근거는 LP-01의 결정 댓글이다."
  • 웹에서 LP-03에 “Blocked by #1”이, LP-01에 “Blocking #3”이 보인다.
  • LP-03에 blocked 라벨과 막힘 기록 댓글(원인, 해결 담당, 다음 확인일, 영향)이 있다.
  • 회의 전 조회의 “3. 막힌 일”에 LP-03이 나온다.
  • 의존성과 blocked 라벨이 각각 언제 지워지는지 말할 수 있다.
막히면
증상확인과 해결
unknown flag: --add-blocked-bygh가 2.94.0보다 낮다. 업그레이드한다. 당장 업그레이드할 수 없으면 웹의 LP-03 화면 Relationships에서 Blocked by를 추가한다.
echo "$PM_FORM_URL"이 빈 줄pm-lab/backlog-map.tsv가 없거나 키가 다르다. cat pm-lab/backlog-map.tsv로 확인하거나 제목 검색 명령을 쓴다.
Unknown JSON field: "blockedBy"gh 버전이 낮다. 웹 화면에서 관계를 확인한다.
댓글이 한 줄로 붙음--body-file -와 <<'EOF' 사이에 다른 글자가 들어갔다. 블록 전체를 다시 붙여넣는다.

마치며...

LP-03이 LP-01에 막혀 있다는 사실이 의존성, 라벨, 막힘 기록 댓글 세 가지로 남았다. 실습 9에서는 LP-01의 결과물을 PR로 만들고, PM이 PR과 커밋에서 진행 상황을 읽는 방법을 다룬다.