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-by | gh가 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과 커밋에서 진행 상황을 읽는 방법을 다룬다.