상태를 보여주는 패널을 만들었더니, 무엇을 안 보여줄지가 일이 됐다

hugh0703·2026년 8월 23일

AI와 일하는 방식

목록 보기
2/3

세션을 여러 개 띄워서 작업을 진행하다 보니 새 문제가 생겼다. 지금 어디까지 와 있는지가 안 보인다.

대화가 길어지면 앞에서 정한 것들이 위로 밀려 올라간다. 아까 받은 링크, 지금 손대고 있는 파일, 다음에 할 일. 다 대화창 어딘가에 있긴 한데 스크롤을 한참 올려야 나온다. 여러 세션을 오가면 그게 세션 수만큼 늘어난다.

그래서 화면 아래에 작은 패널을 하나 붙였다. 지금 세션의 할 일, 참조 중인 링크, 다뤘던 파일을 실시간으로 보여주는 것이다. 대충 이렇게 생겼다.

CONTEXT  할 일 2  핀 3 · 파일 2 · a3f21c8e · 17:33:09
── 할 일 ─────────────────────────────────────────
☐ 배포 반영 확인 — 8/18 까지 안 들어가면 재검증 불가
☐ 값 체계 결정 — 문서 담당 협의 선행
── 핀 ────────────────────────────────────────────
▸ #1114 로거가 트래픽 방향을 반대로 기록함   https://tracker.example.com/tasks/1114
▸ #1120 캐시가 안 갱신돼 값이 어긋남         https://tracker.example.com/tasks/1120
▸ 초안 #1114 회신 댓글   /tmp/scratch/draft-1114-comment.md
── 파일 ──────────────────────────────────────────
✎ collector/receiver.py
✎ tests/test_receiver.py

세 칸이다. 위에는 내가 확인해야 할 일, 가운데는 붙들고 있는 링크, 아래는 손댄 파일. 10초마다 갱신되고 터미널 아래쪽 몇 줄만 차지한다.

다만 이건 지금 모습이다. 처음엔 칸 구성도 이름도 달랐고, 여기 오기까지 몇 번을 뒤집었다.

쓰면서 확실해진 건 하나였다. 링크와 파일은 눌러서 바로 연다 — 대화를 거슬러 올라가 주소를 찾을 필요가 없다. 다른 세션에 갔다 돌아왔을 때 여기만 보면 어디까지 했는지 바로 붙는다.

만들 때 생각한 문제는 "무엇을 보여줄까"였다. 실제로 시간을 쓴 건 전부 무엇을 안 보여줄까였다.


패널이 비었는데, 원인이 세 가지였다

어제까지 링크 세 개와 할 일 두 개가 떠 있던 자리다. 오늘 열었더니 이렇다.

CONTEXT  a3f21c8e · 17:33:09
(기록된 것 없음)

적어둔 게 없어졌다는 뜻으로 읽힌다. 처음엔 그렇게 읽고 패널 버그를 의심했다. 몇 번 겪고 나서야 알았는데, 같은 화면이 서로 다른 세 가지 상황을 뜻하고 있었다.

하나. 데이터는 멀쩡한데 보는 쪽이 딴 데를 보고 있다. 패널은 "이 창이 어느 세션 것인지"를 따로 기억하는데, 그 연결이 끊어질 때가 있다. 적어둔 것은 그대로 살아 있고 패널만 엉뚱한 곳을 뒤지는 상태다. 이건 진짜 고장이다.

둘. 비어 있는 게 정답이다. 할 일을 전부 끝내면 목록이 비고, 화면도 따라 빈다. 고장이 아니라 일을 다 한 것이다. 그런데 화면만 봐서는 첫 번째와 구분이 안 된다.

셋. 사실 안 사라졌고, 눌러보면 틀린 데로 간다. 항목이 보이긴 하는데 링크가 깨져 엉뚱한 페이지로 가는 경우다. 이건 성격이 좀 달라서 다음 절에서 따로 다룬다.

같은 증상에 원인이 셋이고, 그중 하나는 고장이 아니다

셋 다 화면은 똑같다. 하나는 고장이고, 하나는 정상이고, 하나는 화면이 아니라 링크의 문제다.

그래서 지금은 순서를 정해뒀다. 화면을 의심하기 전에 적어둔 목록이 실제로 있는지부터 본다. 목록에 있는데 화면에 없으면 그리는 쪽 문제고, 목록까지 비어 있으면 그때 연결을 의심한다.

"안 보인다"는 증상일 뿐이다. 비어 있는 화면을 보고 제일 먼저 물어야 할 것은 "왜 사라졌지"가 아니라 "이게 사라진 게 맞나" 였다.


자르면 안 되는 걸 잘랐다

패널은 좁다. 화면 아래 몇 줄이 전부라 긴 문자열이 다 안 들어간다. 그래서 폭이 모자라면 뒤를 잘라 을 붙이게 해뒀다.

이슈 링크를 핀 칸에 넣어두고 클릭해서 이동하는 식으로 쓰는데, 어느 날부터 클릭하면 엉뚱한 목록 페이지로 갔다.

원인은 줄이는 코드였다. 폭이 아주 부족하면 제목뿐 아니라 URL까지 잘랐다. 링크 끝자리가 날아가니 식별자가 깨지고, 서버는 깨진 식별자를 받으면 에러 대신 기본 목록으로 넘겨버린다.

그래서 이렇게 보인다.

  • 클릭은 된다
  • 페이지도 열린다
  • 에러도 없다
  • 다만 다른 페이지다

⚠️ 게다가 패널 폭이 일정 크기 아래일 때만 재현됐다. 창을 좌우로 나눠 쓸 때만 나타나니, 평소 쓰던 배치에서는 멀쩡했다.

고치고 나서 규칙 하나를 세웠다. 줄일 때는 버려도 되는 것만 버린다. 제목은 잘려도 사람이 읽을 수 있지만 링크는 한 글자만 없어도 다른 곳을 가리킨다. 이제 자리가 정 없으면 제목을 통째로 버리고 링크만 남긴다.


다 보여줬더니 아무것도 안 보였다

패널을 만들면서 제일 오래 붙든 건 파일 목록이다. 세션에서 다룬 파일을 띄우고 클릭으로 열 수 있게 하고 싶었다.

세 번 왕복했다.

1차 — 파일을 쓰거나 고친 기록만 모았다. 그랬더니 명령어로 복사해 만든 파일이 빠졌다. 정작 그날의 결과물이었는데.

2차 — 그래서 "대화에 나온 경로를 전부"로 넓혔다. 이번엔 반대가 됐다. 임시 파일, 설정 파일, 도구 스크립트, 중간에 참고한 문서까지 쏟아졌다. 여덟 줄 남짓한 자리에 정작 봐야 할 게 밀려났다.

3차 — 기준을 다시 잡았다. "나를 위해 만들어진 것만." 작업하느라 거쳐 간 것과 결과로 남은 것은 다르다.

이 기준이 말로는 명확한데 코드로 옮기기가 어려웠다. 파일 시스템에는 "누구를 위해 만들어졌는가"가 안 적혀 있다.

파일 생성 시각으로 판별하려다 실패했다

처음 떠올린 방법은 생성 시각이었다. 이번 작업 중에 생긴 파일이면 결과물이고, 원래 있던 걸 고친 거면 아니다. 깔끔해 보였다.

안 됐다. 필터를 넣었는데 전부 통과했다.

이유는 파일을 안전하게 쓰는 방식에 있었다. 대부분의 도구는 원본을 직접 고치지 않는다. 임시 파일을 새로 만들어 내용을 다 쓴 다음, 그걸 원래 이름으로 바꿔치기한다. 쓰다가 죽어도 반쯤 망가진 파일이 안 남게 하려는 것이다.

그런데 이러면 파일의 정체가 매번 새것이 된다. 경로만 그대로일 뿐 내부적으로는 새로 만들어진 파일이고, 생성 시각도 방금이다. 내용만 고쳐도 "방금 만들어짐"이 된다.

이 실패가 좀 고약했던 건 아무 에러도 안 났다는 점이다. 조건이 항상 참이 되니 필터가 있으나 마나였다. 코드에는 필터가 멀쩡히 적혀 있어서 눈으로 봐서는 문제를 못 찾는다.

결국 판별을 포기하고 어림잡았다

다른 방법으로 갔다. 명령을 뜯어봐서 무언가를 만들거나 옮기는 명령에 등장한 경로만 모으기로 했다.

이건 "만든 것"이 아니라 "만들었을 법한 명령에 나온 것"이다. 둘은 다르다. 지금 내 패널에는 글 세 편이 결과물로 올라와 있는데, 정작 그 셋이 목록에 오른 이유는 파일 이름을 바꾼 뒤 패널에 다시 띄우려고 손댔기 때문이다. 만든 게 아니라 등록하려고 건드린 것이다.

반대쪽으로도 샌다. 셸로 파일 내용을 직접 고치는 명령은 목록에 없어서, 진짜 수정인데도 안 잡힌다.

결국 "누구를 위해 만들어졌는가"는 지금도 판별하지 못한다. 대신 틀리는 방향만 정했다 — 놓치는 쪽보다 조금 더 담는 쪽으로.


고쳤다고 생각한 게 안 고쳐져 있었다

그렇게 정리했다고 생각하고 며칠 뒤 화면을 봤더니, 설정 파일과 실행 파일이 여전히 올라와 있었다. 파고들었더니 틀린 데가 세 군데 더 있었다.

하나. 필터를 만들어놓고 연결을 안 했다.

판별하는 부분을 새로 짰는데, 정작 그걸 호출하는 자리에 넣지 않았다. 조건문 하나가 통째로 빠진 셈이다. 코드에는 필터가 멀쩡히 적혀 있으니 읽어봐도 문제가 안 보인다. 에러도 당연히 안 난다.

둘. 에러 버리는 걸 파일 쓰기로 봤다.

"화살표 뒤에 경로가 오면 파일에 쓰는 것"이라고 판별했는데, 2>/dev/null이 그 모양이다. 에러 출력을 버린다는 뜻이지 뭘 만드는 게 아니다. 그런데 이건 거의 모든 명령 끝에 붙는 관용구다. 사실상 모든 명령이 쓰기로 통과했다.

셋. 지시문에 적힌 명령 예시를 실행된 명령으로 봤다.

다른 에이전트에게 일을 넘길 때 "이런 식으로 하면 된다"고 명령 예시를 적어 보낸다. 그건 설명이지 실행이 아니다. 그런데 그 안의 인용 기호가 리다이렉션 문법과 모양이 같아서 걸렸다.

지시문은 코드가 아니라 글이다. 여기에 셸 문법 해석을 적용하면 안 된다. 지금은 지시문을 받는 도구는 인자를 아예 안 본다.

셋 다 같은 모양이다. 코드는 멀쩡해 보이고, 에러도 안 나고, 화면만 조금 이상하다. 고쳤다고 믿었던 건 고친 걸 확인하지 않았기 때문이었다.


패널을 놓을 자리를 두 번 잘못 골랐다

패널을 처음엔 화면 위쪽에 붙이려고 했다. 그런데 쓰는 터미널 앱에 위쪽으로 나누는 기능이 없어서, 새 탭을 만들고 이름을 바꾸는 식으로 우회했다.

이름을 바꾸는 명령이 탭 이름을 바꿨다. 원래 그 자리에는 세션 이름이 자동으로 표시되고 있었는데 그게 덮여버렸다. 되돌릴 방법도 없었다.

패널 하나 보려다 세션을 구분하는 정보를 잃은 셈이다. 결국 위쪽 배치는 통째로 버리고 아래로 통일했다.

도구에 없는 기능을 우회로 메우면 대개 다른 걸 내준다. 위쪽 분할이 없어서 새 탭으로 돌아갔고, 그 대가로 탭 이름을 잃었다.

그래서 지금은 우회 대신 요청하는 쪽도 같이 한다. 패널은 화면 높이의 15%면 충분한데 창을 나누는 명령에 비율을 지정할 방법이 없어서, 띄울 때마다 손으로 경계선을 끌어야 한다. 끌어둔 비율이 저장되긴 하는데 창을 닫았다 다시 만들면 사라진다 — 스크립트로 띄우는 패널은 자기 크기를 영영 기억하지 못한다는 뜻이다. 비율 옵션을 만들어달라고 이슈를 올려뒀다.

자리 문제는 자동화하면서 한 번 더 나왔다. 세션을 시작할 때 패널이 알아서 뜨도록 훅을 걸었는데, 그대로 두면 세션을 다시 시작할 때마다 창이 하나씩 늘어난다. 그래서 훅은 "패널을 띄워라"가 아니라 "패널이 없으면 띄워라" 로 만들었다. 이미 있는 걸 확인하는 한 줄이, 띄우는 코드 전체보다 중요했다.


칸 하나를 뺐다가, 다시 넣었다

처음에도 칸은 셋이었다. 다만 가운데가 지금과 달랐다 — 이번 세션의 할 일을 에이전트가 자동으로 채워 넣는 칸이었다. 제일 쓸모 있다고 생각했는데, 며칠 쓰다 보니 어딘가 익숙했다. 에이전트가 이미 화면 위쪽에 같은 걸 그리고 있었다.

두 곳에 같은 게 있으니 어느 쪽을 볼지 매번 잠깐 헷갈렸고, 그 잠깐이 쌓였다. 그래서 뺐다. 몇 줄짜리 화면에서 세 칸 중 하나를 통째로. (남은 게 링크와 파일뿐이라 "할 일 패널"이라는 이름도 그때 바꿨다.)

그런데 며칠 만에 비슷한 게 다시 생겼다. 링크를 꽂는 칸에 나도 모르게 할 일을 적고 있었다. "이건 나중에 확인", "이 판단은 보류" 같은 것들이다. 링크와 메모가 섞이니 다시 구분이 안 돼서, 그 칸에서 할 일만 골라 별도 칸으로 뺐다. 맨 위에 보여준 화면이 그 결과다.

한 바퀴 돌아 제자리로 온 것 같지만, 들어온 것은 나갔던 것과 다른 물건이었다.

뺀 것다시 넣은 것
누가 채우나에이전트가 자동으로내가 손으로
내용지금 실행 중인 단계내가 아직 결정 못 한 것
다른 데 있나있다 (대화창)없다

이름이 같아서 같은 정보인 줄 알았는데 아니었다. 자동으로 채워진 할 일은 중복이었고, 손으로 적은 할 일은 어디에도 없는 정보였다. 전자는 에이전트가 무엇을 하고 있는지고, 후자는 내가 무엇을 정해야 하는지다.

그리고 며칠 뒤, 할 일 칸이 비어 있었다. 남은 일이 없어서가 아니라 적어 넣는 걸 잊어서였다. 자동으로 채워지던 때는 신경 쓸 일이 아니었는데, 손으로 적기로 바꾸면서 할 일이 하나 늘었고 그 습관이 아직 안 붙은 것이다.

빼는 데에도 비용이 있다. 자동으로 되던 걸 끄면 그 자리는 사람이 메워야 하고, 사람은 잊는다. 그래도 되돌리지 않았다. 잊어서 비는 건 습관으로 고칠 수 있고, 봐도 눈에 안 들어오는 건 고치기 어렵다.


남은 생각

보여주는 도구를 만들었는데, 정작 일의 대부분은 안 보여줄 것을 고르는 데 들어갔다.

돌아보면 당연한 것 같기도 하다. 다 보여주면 그건 그냥 로그다. 로그는 이미 있었고, 그게 안 읽혀서 패널을 만든 거였다.


코드는 github.com/hcpak/dev-tools 에 올려뒀다.
Claude Code 세션 구조에만 의존하니 터미널은 아무거나 써도 된다. 위에 적은 실패들이 어떻게 코드로 남았는지는 거기서 볼 수 있다.

profile
어제보다 조금 더 깊이. 배운 것을 기록하는 중. 아는 것을 꺼내 쌓아갑니다. 삽질도 기록하면 자산이 된다고 믿는 사람.

0개의 댓글