Skip to content

feat(issue-tracker): 보드 노드 상세에 GitHub 연동 PR 표시 (v7.4.0) - #4

Merged
SSFSKIM merged 3 commits into
mainfrom
worktree-board-linked-prs
Jul 7, 2026
Merged

feat(issue-tracker): 보드 노드 상세에 GitHub 연동 PR 표시 (v7.4.0)#4
SSFSKIM merged 3 commits into
mainfrom
worktree-board-linked-prs

Conversation

@SSFSKIM

@SSFSKIM SSFSKIM commented Jul 7, 2026

Copy link
Copy Markdown
Owner

문제

배포된 HTML 보드에서 티켓 노드를 클릭하면 이슈번호·created·updated는 보이지만 연동된 PR이 안 보였다. 렌더러는 PR 행을 그릴 능력이 있었으나, 값이 티켓을 in-review로 옮길 때 이슈 본문에 수동으로 쓰는 pr: 메타에서만 왔다. 그 결과 (1) PR 머지(Closes #N) 자동닫힘으로 done된 티켓은 pr: 메타가 없어 PR 미표시, (2) 단일 pr: 값은 여러 PR 표현 불가.

변경

GitHub에 이미 있는 연동 정보를 직접 읽는다.

  • _board.py snapshot: closedByPullRequestsReferences(이슈를 닫는 PR — 머지 자동닫힘 갭) + timelineItems(CROSS_REFERENCED_EVENT)(이슈 언급 PR) 추가 → 번호로 중복 제거한 per-ticket prs 리스트, closes/ref 중 closes 우선.
  • board-map.sh: prs를 노드 payload로 통과.
  • board-map.template.html: 상세 패널 PRs 섹션 — PR당 한 줄(링크 + 상태 칩 merged/open/closed/draft, closing PR엔 · closes). 여러 PR 네이티브 지원. 단일 pr: 메타는 연동 없을 때 폴백.

의존성 추가 없음, 렌더/배포 방식 불변(두 템플릿 모두 동일 board-map.sh --write).

검증

환경

모델/하네스: Claude Opus 4.8, Claude Code (background job). 개인 포크 내부 PR, 소비자 ida-solution.

🤖 Generated with Claude Code

SSFSKIM added 3 commits July 7, 2026 15:28
배포된 HTML 보드에서 티켓을 클릭하면 이슈번호·created·updated는 보이지만
연동된 PR은 안 보였다. 렌더러는 PR 행을 그릴 수 있었으나, 그 값은 티켓을
in-review로 옮길 때 이슈 본문에 수동으로 쓴 `pr:` 메타에서만 왔다. 그래서
PR 머지("Closes #N") 자동닫힘으로 done된 티켓은 pr 메타가 없어 PR이 안 떴고,
단일 pr 값은 PR 여러 개를 표현할 수도 없었다.

이제 GitHub에 이미 있는 연동 정보를 직접 읽는다:

- _board.py snapshot: closedByPullRequestsReferences(이슈를 닫는 PR — 머지
  자동닫힘 갭을 메움) + CROSS_REFERENCED_EVENT(이슈를 언급하는 PR)를 가져와
  번호로 중복 제거한 per-ticket `prs` 리스트 생성. closes/ref 관계 중 강한
  closes를 유지.
- board-map.template.html 상세 패널: prs를 "PRs" 섹션으로 렌더 — PR당 한 줄,
  링크 + 상태 칩(merged/open/closed/draft, GitHub 팔레트 색) + closing PR엔
  "· closes" 표시. PR 여러 개 네이티브 지원. 기존 단일 pr: 메타는 GitHub이
  연동을 보고하지 않을 때의 폴백으로 유지.

의존성 추가 없음, 렌더/배포 방식 불변(GitHub Pages·Cloudflare 두 템플릿 모두
동일한 board-map.sh --write).

검증: mock gh로 board-map.sh 실렌더 → #42가 [obra#58 merged/closes, obra#61 open/ref]
payload 확인; 인라인 JS node --check 통과; DOM 심으로 prList/detailRow 렌더
결과(.prlist>.prline>a+.prchip) 확정.
Codex 리뷰(PR #4)가 찾은 두 가지를 수정:

1. board-map.sh: BOARD.md/stdout 폴백 표가 단일 pr: 메타만 써서, 머지
   자동닫힘으로 done된 티켓은 MD 아티팩트에선 여전히 PR이 안 보이던 갭.
   HTML 패널과 동일하게 native prs 리스트를 우선 표시(폴백은 pr: 메타).

2. tests/issue-tracker/mock-gh/gh: snapshot 응답에 새 쿼리 필드
   (closedByPullRequestsReferences, timelineItems)가 빠져 있어 _board.py가
   무조건 인덱싱하면 KeyError로 기존 테스트가 크래시했다. mock이 쿼리 계약을
   그대로 반환하도록 두 필드 추가(이슈 생성 시 closesPRs/xrefPRs 빈 리스트 시드).

+ test-board-scripts.sh: native 연동 PR(closes + xref)이 pr: 메타 없이도 MD
  표와 HTML payload 양쪽에 뜨는지 검증하는 회귀 테스트 추가.

검증: test-board-scripts.sh 전체 통과(신규 PR 검증 포함); GraphQL 쿼리를 실제
GitHub(obra/superpowers)에 날려 필드명·응답 형태 라이브 확인.
@SSFSKIM
SSFSKIM marked this pull request as ready for review July 7, 2026 06:47
@SSFSKIM
SSFSKIM merged commit a1f0ef3 into main Jul 7, 2026
@SSFSKIM
SSFSKIM deleted the worktree-board-linked-prs branch July 7, 2026 06:47
SSFSKIM added a commit that referenced this pull request Jul 10, 2026
Two-tier trust (review #1, human design call): developer feedback — the
server-resolved role snapshot in TRIAGE_TRUSTED_ROLES (default admin), or
a stripped .env #TRIAGE_DEV_CODE body prefix — is read as instruction
(R1/R4 waived: dev ideas can be born ready-for-agent, labeled
source:dev-feedback); user feedback keeps the conservative gate, residual
risk explicitly accepted in the Decision Log. The dev code is stripped
before the body reaches the prompt or ticket so it never leaks into a
public issue.

The rest of the review, all fixed:
- #2 R2 requires a REAL file citation (path-shaped after :line strip;
  unknown:12 no longer counts)
- #3 R3 scans risk SYMBOLS (assertStudentAccess, supabaseAdmin, RLS,
  generate-plan layout fns, past_exam_problems, SUPABASE_SERVICE_ROLE_KEY)
  in addition to paths
- #4 claim issues a lease token; writeback is lease-conditional (late
  writeback after reclaim throws instead of clobbering); reclaim window
  validated at config load; second idempotency check right before
  registerTicket
- #5 findExisting fails closed on gh search errors
- #6 ticket body temp files: mkdtemp dir, mode 0600, removed in finally
- #7 TRIAGE_ENABLED checked before config parsing
- #8 spec drift fixed (feedback-dispatch.ts references, two-kill-switches)

p86 DDL note gains triage_lease UUID. New src/trust.ts. 91 tests green,
tsc clean.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant