Issue Linker 디렉터스 컷. 흩어진 이슈를 한 화면에서 보고, 내 PC에서 고친다.

Sentry부터 Grafana까지 6곳의 이슈를 한 화면에 모으고, 내 PC의 Claude Code로 이슈별 코드 수정 → 로컬 커밋 → push·MR 초안까지. 머지는 사람이 한다. 2026년 9월 3일부터 10월 14일까지, 6주의 제작기입니다.

  • Night Shift
  • 니가해라 코드수정
  • Issue assemble
  • Issue Linker

LOGLINE · 한눈에 보기

한눈에 보기

Sentry · GitLab · WorxBoard · Notion · Jira · Grafana의 이슈를 한 화면에서 보고, 내 PC의 Claude Code로 코드 수정 → 로컬 커밋 → push·MR 초안까지. 머지는 사람이 한다.

  • 사내 웹은 조회 전용. 쓰기는 PC 로컬에서만, 서비스 토큰은 Keychain에만 둔다.
  • 실행 엔진은 Claude Code CLI 하나. 터미널 CLI와 같은 설정·플러그인·MCP로 돈다.
  • 사람이 승인하는 단계는 모두 버튼. 커밋·push·MR은 각각 확인 화면을 거친다.
  • 타겟 동기화는 머지 커밋으로. rebase·reset·강제 push는 하지 않는다.
아직: 야간 자동 실행 미연결 · 정량 효과 측정 전 → 09장

숫자 2026-10-14 기준

6주09·03 → 10·14
40커밋머지 제외 · 머지 1건 별도
6서비스연동 서비스
686테스트 전부 통과 · 96파일
+35,939추가된 줄 · 파일 687
−3,099삭제된 줄
9월8
10월32

필름 스트립 날짜를 누르면 그 장면으로

CHAPTER 01 · PROLOGUE · 09·03

이슈는 여섯 군데에 흩어져 있었다

에러는 Sentry에, 업무는 WorxBoard에, 검수는 Jira에, 로그는 Grafana에, 표는 Notion에, 이슈와 MR은 GitLab에. 화면도 토큰도 필터도 제각각이고, 정작 고치는 곳은 또 따로인 내 PC의 저장소였다. 9월 3일, 첫 커밋.

연출 · 점의 개수와 위치는 실제 이슈 수가 아닙니다
흩어진 상태 · 6개 서비스, 6개의 화면
  • Sentry에러 · 다중 프로젝트
  • GitLab이슈 · MR
  • WorxBoard업무 목록 · 상세
  • NotionDB · 상태 필터
  • Jira검수 · 부작업
  • Grafana로그 · 대시보드

CHAPTER 02 · NIGHT SHIFT · 09·07–09·09

야간 러너를 꺼내 PC에 연결하다

시작은 한 업무 저장소 안에 있던 무인 야간 러너였다. 9월 7일, 이를 저장소와 무관한 코어로 일반화하고 — 모든 상수는 config.mjs 한 곳 — 사내 웹과 PC 로컬 서비스를 pairing으로 잇는 구조를 세웠다. 같은 날 pnpm으로 옮겼다. 커밋 하나에 57파일, +5,996줄.

사내 웹 조회 전용

정적 작업함. 서버·로그·URL·localStorage 어디에도 서비스 토큰을 두지 않는다. 임의 셸 명령 API도 없다.

PC 로컬 서비스 쓰기는 여기서만

loopback(127.0.0.1)에만 바인딩된 Node 서비스. 기본 모듈만 쓴다.

Keychain · 서비스 토큰 보관
조회 API · Sentry / GitLab / WorxBoard / Notion / Jira / Grafana
이슈별 수동 코드 수정 · → 로컬 커밋 → push·MR
ONE-TIME PAIRING CODE ••• ••• 05:00 코드 값은 이 문서에 남기지 않습니다.
  1. 일회용 코드5분 안에만 유효한 pairing 코드ISSUED
  2. loopback 바인딩PC 밖에서는 닿지 않는 127.0.0.1BOUND
  3. Origin · Host 검사CORS만으로 인증을 대신하지 않는다CHECKED
  4. 8시간 세션토큰 원문은 Keychain 밖으로 나오지 않는다PAIRED

09·08 연결 슬롯 3 → 5

1SLOT
2SLOT
3SLOT
4SLOTNEW
5SLOTNEW

저장소 폴더와 서비스 토큰 묶음을 슬롯 단위로 저장한다. 같은 날 Sentry 다중 프로젝트, WorxBoard 목록·상세·필터, Notion 상태 필터, 현재 브랜치 수동 수정이 붙었다(49파일, +4,042줄).

09·09 고칠 때 필요한 맥락

  • ⌘V이미지 첨부 — 스크린샷을 붙여 넣어 수정 요청에 함께 보낸다
  • RUN실행 상태 표시 — 수정이 어디까지 왔는지 화면에서 본다
  • WHO담당자 이름 가져오기 — ID만 보이던 목록에 이름을
  • CHIPNotion 상태 칩 — 원본과 같은 색으로
DIRECTOR'S NOTE · 설계 판단 01 · 02

웹은 조회 전용, 쓰기는 PC 로컬에서만. 토큰은 Keychain에만 둔다. 그리고 판단은 스킬(LLM)에게, 결정론적인 것 — 큐 순서·브랜치·락 — 은 코드가 확정한다. 상수는 config.mjs 한 곳.

INTERMISSION · 09·08 그날, 제목이 두 번 바뀌었다

PRODISSUE ?
TAKE1
DATE09·03 ~
STATUSWORKING

Night Shift

야간 러너에서 온 이름. 낮에도 쓰는 도구가 되면서 어색해진다.

CHAPTER 03 · DIALOGUE · 09·16–09·17

고치고, 이어 말하고, 버튼으로 올린다

이슈 하나에 수정 한 번으로 끝나지 않는다. 작업 대화를 보관·복원하고, 커밋이나 브랜치가 바뀐 뒤에도 같은 대화에서 후속 수정을 이어 간다. 커밋과 MR 문구는 저장소의 스킬 규칙을 따르고, 올리는 순간은 사람이 버튼으로 정한다.

재연 · 9월 당시 실행 엔진은 Codex였고, 아래 CRT 셸은 10월의 화면 스타일입니다

        
STEP 1

미커밋 diff와 커밋 메시지를 보여 준 뒤

COMMITTED
STEP 2

타겟과 포함 커밋을 보여 준 뒤. 담당자는 올린 사람, 리뷰어는 지정하지 않는다

MR DRAFT
STEP 3

자동 머지는 없다. 최종 승인과 머지는 GitLab에서 사람이 한다

HUMAN
09·16작업 대화 영속 보관·복원서버를 다시 켜도 대화가 돌아온다
09·16같은 저장소 병렬 수정별도 코드 수정을 동시에 돌린다
09·17서비스 탭별 대화 분리그 탭에서 시작한 대화는 그 탭에만
09·17MR 관계 그래프변경 파일의 관계와 최신 타겟 수신, 완료 후 PR 확인 링크
DIRECTOR'S NOTE · 설계 판단 03

사람이 승인하는 단계는 버튼으로. 로컬 커밋, push·MR 각각 확인 화면과 버튼을 둔다. 동의 체크박스는 두지 않는다(2026-10-14). 자동 머지는 없다.

CHAPTER 04 · EXPANSION · 09·17 → 10·14

Jira, Grafana, Notion — 캐스트가 늘어난다

9월 중순, 조회 대상이 셋 더 붙었다. 서비스마다 저장을 따로 하게 바꾸고, 각자의 화면을 원문에 들어가지 않아도 될 만큼 채웠다. 탭을 눌러 서비스별 장면을 보세요.

JIRA

검수 목록에서 코드 수정까지
  • 09·18검수 URL·토큰 연결, 조회와 부작업 전체 목록
  • 10·07부모 요약 카드 · 부작업 행 · 이미지 첨부, 그리고 Jira 이슈에서도 코드 수정 허용 (75파일, +6,096줄)
  • 10·14검수 목록 전체 이어 받기(부모 1,000건) · 상태/담당자/제목 필터
  • 10·14상태 전환 · 담당자 변경 · 댓글 등록 — PC 로컬에서만
Jira 상태·댓글 등록의 실서버 반영은 일부 미확인

CHAPTER 05 · THE SWITCH · 10·12–10·13

엔진을 갈아 끼운다: Claude Code

전사 표준이 Claude로 바뀌었다. Codex 경로를 남기지 않고 실행 엔진을 Claude Code CLI 하나로 바꾸는 일을 별도 브랜치 feat/claude-only-migration에서 설계 문서부터 단계별로 진행한 뒤 master에 머지했다.

Codex는 안 쓴다, 전부 Claude 전용으로 — 사용자 요청 · 2026-10-13 작업 기록
master feat/claude-only-migration 1 2 3 4 5 6 MERGE
  1. 전환 설계 문서 (10·12)
  2. PC 인증 상태를 Claude Code 기준으로
  3. 스트림 이벤트 → 작업 대화 기록
  4. 이슈 코드 수정 실행기 교체
  5. 커밋·MR 초안 작성 교체
  6. dry-run 사전 검사 + 분석 모드 샌드박스
master → 브랜치 → master

10·13 터미널 CLI와 같아야 한다

안전경계 필요없어, CLI에서 쓰는 것은 똑같이 쓸 수 있어야 해 — 사용자 결정 · 작업 대화에서 Figma가 안 읽히던 날

그래서 이슈 수정 실행기를 터미널 CLI와 같은 설정·플러그인·MCP로 실행한다. Figma MCP도 그대로 쓴다. 입력창에서 /를 치면 저장소·PC 공통·플러그인 스킬과 CLI 내장 명령이 자동완성된다. 10월 14일에는 앱이 Git·브랜치·MR·스킬을 따로 막지 않는다는 원칙과 함께, MR 최종 승인은 사람이 한다는 결정이 계약에 들어갔다.

권한 매트릭스 누가 무엇을 할 수 있나

DIRECTOR'S NOTE · 설계 판단 04

실행 엔진은 Claude Code CLI 하나. 터미널 CLI와 동치(설정·플러그인·MCP·스킬·훅). 분석 모드만 샌드박스로 저장소 쓰기와 셸 네트워크를 막고, 커밋·MR 문구를 쓰는 초안 Claude에는 commit/push/MR 권한을 주지 않는다.

CHAPTER 06 · PLOT TWIST · 10·13

문이 닫히면, 공식 문으로

외부 서비스의 인증 방식은 우리 일정과 상관없이 바뀐다. WorxBoard는 9월 28일 개인 PAT의 통합 API 접근을 끝냈고, 목록은 403을 돌려줬다. Notion도 같은 날 커넥터를 다시 짰다. 두 곳 모두 공식 OAuth MCP로 옮겼다.

CASE FILE · WORXBOARD

개인 토큰의 종료

개인 PAT · 통합 API→회사 계정 OAuth MCP
  • 09·28개인 PAT 통합 API 접근 종료 (WorxBoard 측 변경)
  • 10·13회사 계정 로그인 OAuth MCP로 전환. 읽기 도구 tasks.list · tasks.get만 허용
OAuth 로그인 실서버 반영은 일부 미확인
CASE FILE · NOTION

커넥터를 직접 쓰다

Codex MCP 로그인→자체 MCP 클라이언트 + PKCE
  • 10·13MCP Streamable HTTP 클라이언트를 직접 구현, OAuth(PKCE) 로그인과 토큰 보관
  • FIXSSE 응답 즉시 처리 · 토큰 갱신 single-flight (동시에 여러 번 갱신하지 않도록)
  • UX실패 화면의 재인증 버튼이 로그인 → 승인 창 → 목록 재조회까지 한 번에

재인증 시퀀스 두 서비스가 공유하는 흐름

  1. 01로그인 버튼설정 또는 실패 화면에서
  2. 02승인 창회사 계정으로 승인
  3. 03PKCE 교환코드 + verifier로 토큰
  4. 04Keychain토큰은 PC에만
  5. 05갱신 1회refresh는 single-flight
  6. 06읽기 도구만허용한 도구만 호출
DIRECTOR'S NOTE · 설계 판단 06

외부 인증이 바뀌면 우회하지 않고 공식 길로. 403을 만나도 재시도나 권한 우회는 하지 않았다. Notion·WorxBoard 모두 공식 OAuth MCP(PKCE, refresh 1회, 읽기 도구만 허용)로 옮겼다.

CHAPTER 07 · MOTION LAB · 10·13

밝은 작업함, 호박색 터미널

같은 날 화면 전체를 Motion Lab · Light로 바꿨고, 서비스 이름은 Issue Linker로 확정됐다. 업무 화면은 밝게, 작업 대화만 호박색 CRT 셸로. 아래는 그 모션 문법을 재연한 작은 랩입니다. 직접 눌러 보세요.

재연 · 실제 앱 화면이 아니며 카드 내용은 예시입니다모션 줄이기 설정이면 모든 효과가 꺼집니다
ISSUE LINKER / INBOX

내 작업함

TESTS 686
  • MONO KICKER · GRID모노 키커와 그리드 배경으로 화면의 뼈대를 보여 준다
  • DECODE · COUNT-UP실제 글자는 바꾸지 않고 덮개(data-fx)로만 → 테스트·스크린리더 안전
  • SPOTLIGHT카드 위 포인터를 따라 빛이 움직인다 (카드에 마우스를 올려 보세요)
  • CRT SHELL스캔라인·비네트·you@issue-linker:~$. 어디서든 ‘현재 페이지’ 대화
DIRECTOR'S NOTE · 설계 판단 07

모션은 접근성 안전하게. 디코드·카운트업은 실제 텍스트 위의 덮개로만 그리고, prefers-reduced-motion이면 전부 끈다. 이 문서의 챕터 디코드와 숫자 카운트업도 같은 방식으로 만들었다.

CHAPTER 08 · THE MERGE · 10·14

역사를 다시 쓰지 않고 합친다

PR을 올리기 전 선택한 타겟을 매번 fetch해 비교한다. 받아야 하면 저장소마다 다른 스킬을 따르지 않고 모든 저장소 공통으로 merge --no-ff 머지 커밋을 만든다. 충돌은 해소 Claude가 공통 기준으로 충돌 파일만 고치고, 앱이 검사한 뒤에야 커밋한다.

실제 업무 저장소에서 검증용 동기화는 실행하지 않음 · 임시 저장소에서 충돌 1건 해소 확인
타겟 내 브랜치 A B Ssquash N새 변경 앞서 있음 → 수신 필요 충돌 해소 Claude M push → MR
STEP 0 / 8 준비

내 브랜치에 로컬 커밋 A, B가 있다.

해소 Claude의 공통 기준 충돌 유형을 골라 보세요

앱의 검사 통과해야 머지 커밋

  • HEAD와 MERGE_HEAD가 그대로인가
  • 충돌 파일 밖의 index·작업트리·미추적 파일이 그대로인가
  • 충돌 표시가 남아 있지 않은가
  • 통과하면 충돌 파일만 staging해 머지 커밋, push는 결과 화면의 버튼으로

충돌이 너무 많거나 바이너리·심볼릭 링크·서브모듈이면 해소를 시도하지 않고 merge --abort. 커밋 100개·파일 500개 같은 크기 제한은 없앴다.

하지 않는 것 미커밋·stale·다른 Git 작업·불명확한 실패는 중단

git rebasegit resetgit push --force
DIRECTOR'S NOTE · 설계 판단 05

타겟 동기화는 머지 커밋으로. 공개된 커밋을 다시 쓰는 rebase는 협업 중 충돌과 유실을 만든다. 충돌은 AI가 해소하되, 범위와 결과는 앱이 검사한다.

CHAPTER 09 · EPILOGUE · TO BE CONTINUED

아직 찍지 않은 장면들

원래 이름은 Night Shift였지만, 정작 밤에 혼자 도는 장면은 아직 없다. 지금의 Issue Linker는 사람이 눌러야 움직이는 도구다. 정직하게 남은 것들.

  • 미연결
    야간 자동 실행 · 예약웹과 서비스에서 야간 실행을 트리거하지 않는다. 자동 시작 등록도 사용자 요청 없이는 하지 않는다.
  • 미이관
    Sentry 자동 트리아지조회는 되지만 자동 분류는 아직 옮겨 오지 않았다.
  • 미구현
    서명된 배포 설치기지금의 로컬 설치는 개발용이다.
  • 일부 미확인
    Jira 상태·댓글 등록, WorxBoard OAuth 로그인의 실서버 반영기능은 들어갔지만 실제 서버에서 끝까지 확인하지 못한 부분이 있다.
  • 측정 전
    정량 효과처리한 이슈 건수, 줄어든 시간 같은 숫자는 아직 재지 않았다. 이 문서에도 없는 숫자는 쓰지 않았다.

감독 코멘터리 6주 동안 지킨 여덟 가지

  1. 웹은 조회 전용, 쓰기는 PC에서만토큰은 Keychain에. 임의 셸 명령 API 없음. pairing + 세션.
    → 02장
  2. 판단은 스킬, 결정은 스크립트큐 순서·브랜치·락은 코드가 확정. 상수는 config.mjs 한 곳.
    → 02장
  3. 승인은 버튼으로커밋, push·MR 각각 확인 화면. 담당자=올린 사람, 자동 머지 없음.
    → 03장
  4. 엔진은 Claude Code CLI 하나터미널 CLI와 동치. 분석 모드만 샌드박스.
    → 05장
  5. 동기화는 머지 커밋rebase 없이. 충돌은 AI가, 검사는 앱이.
    → 08장
  6. 인증 변화엔 공식 OAuth MCPPKCE, refresh 1회, 읽기 도구만.
    → 06장
  7. 모션은 접근성 안전하게덮개로만 그리고, 모션 줄이기면 전부 끈다.
    → 07장
  8. 세션 간 인계는 문서로AGENTS.md · summary · 날짜별 기록 · items.yaml(바뀐 사실은 삭제 대신 superseded). 테스트 먼저.

크레딧 가운데 띠를 지날 때만 해독됩니다