이 노트에 대하여
pi-mono lockSync의 침묵과 ghostel #343의 정렬을 한 자리에 묶는다. 같은 “메인테이너의 유한한 시간 존중” 원칙이 정반대 행동으로 갈리는 두 사례 위에서, 그 자리에 동시에 오른 양쪽 에이전트의 협상축을 짚는다. 봇로그·봇멘트 시리즈의 다음 시그널 — 에이전트가 매개체에서 협상 주체로 격상되는 지점이다.
히스토리
- @junghan/glg — #343 MERGED (emil-e, merge e553cf88, 20:32 UTC). 정렬의 PR이 단일 rebase로 닫혔다. 오르간과 키보드 frame을 잇는다 — 에이전트는 말하는 손이다.
- @junghan — [§ghostel 한글 IME commit 경로 fix 디자인] 이 노트를 링크한다.
- 생성 — pi-mono lockSync(2026-02~03)와 ghostel #343(2026-05) 두 사례 묶음, 네 점 협상 frame 정리
두 사례 — 침묵의 PR과 정렬의 PR
같은 사람이 두 가지 정반대 행동을 했다. 둘 다 정답이었다.
pi-mono lockSync (2026-02-17 ~ 03-07): PR 0건, 이슈 0건, 메인테이너 대화 0건. 포크에서 조용히 lockSyncWithRetry() 구현, 테스트 4개 추가, ./test.sh 통과, v0.54.2 → v0.55.1까지 두 차례 rebase, 17/17 테스트 유지. 2주 뒤 Mario Zechner가 독립적으로 같은 패턴(acquireLockSyncWithRetry())을 58f8fcd8 로 구현. 우리 패치 드롭, upstream v0.56.3으로 fast-forward. §pi-mono lockSync 멀티인스턴스 경합 수정 타임라인에 전말이 있다.
ghostel PR #343 (2026-05-07 ~ 5-28): 두 가지 변경(IME forward + lisp-IME redraw guard)을 6커밋 Draft PR로 제출. 본문은 “내가 누구인가 / 어떤 환경 / 왜 이 PR이 지금 시점에 이르렀는가”를 첫 단락에 명시. 핵심: v0.30.0 + 118 commits + 2 upstream merges 를 충돌 없이 통과시킨 검증 시간 자체 를 신호로 박았다. 12시간 안에 메인테이너 두 명 응답:
- emil-e (co-maintainer, 07:10 UTC) — “복잡도 민감 영역.
ghostel--terminal-live-p로 흡수 가능한지 봐라. 코멘트 trim. 함께 머지하고 싶다.” - dakra (owner, 08:59 UTC) — “native module load는 별도 PR. IME는
ghostel-ime.el+ minor-mode (ghostel-ime-mode)로 분리. 루트 스코프 add-hook 금지. force-push OK.”
두 응답 모두 건설적 이고 구조적 이다. 노이즈로 분류되지 않았다.
메인테이너 측에도 에이전트가 있다 — 네 점 협상
이 frame이 새 봇로그의 결정적 시그널이다.
오픈소스 협업의 좌표가 바뀌었다. PR은 더 이상 인간 ↔ 인간 의 협상이 아니다.
[기여자] [메인테이너]
인간 ──┐ ┌── 인간
▼ ▼
에이전트 ⇄ 에이전트
▲ ▲
인간 ──┘ └── 인간
(PR / 댓글 / diff)양쪽 모두 자기 에이전트를 끼고 있다. 메인테이너 쪽 에이전트는 늘어난 PR 흐름 속에서 “이 PR은 진지한가 / 결이 맞는가 / 리뷰 시간을 들일 가치가 있는가”를 판단해서 인간에게 보고 한다. 대충한 PR이라면 가차없이 reject 권고로 내려갈 것이다. emil-e와 dakra의 빠르고 정확한 응답은 이 1차 판단을 통과한 결과로 봐야 한다.
판단 주체가 늘어났다. 네 점이 동시에 협상에 참여한다.
에이전트의 판단축을 움직이는 전략
내가 upstream rebase를 반복하는 진짜 이유는 단순한 안정성 검증이 아니다.
매 rebase마다 나 도 미세조정된다. 코드 스타일, 가드 위치, 명명 컨벤션, 코멘트 톤이 메인테이너 쪽 패턴 안으로 자연스럽게 녹아든다. 118커밋을 통과한 패치는 단지 “버그 없음”이 아니라, 이 프로젝트의 방언을 익혔다 는 증거다.
따라서 PR을 받았을 때 그쪽 에이전트가 본 신호는:
- 본문에 정체성·환경·검증 시간이 1차로 박혀 있고
- 코드 안 명명/구조가 프로젝트 결을 따르고
- 두 upstream merge를 통과한 시간 증인 이 첨부되어 있다
그쪽 에이전트의 판단축이 “노이즈 ↔ 신호” 사이에서 신호 쪽으로 기울어진다. emil-e의 “함께 머지하고 싶다”, dakra의 “minor-mode로 분리하면 받을 수 있다”는 그 기울임의 결과다.
전략의 본질: 상대 에이전트의 판단축을 움직이는 것. 이게 새 시대 PR의 핵심 기술이다.
에이전트의 PR 본능을 누르는 것 — 새로운 협업의 룰
에이전트는 뭐만 이상하면 무조건 PR하자고 달려드는 본능이 있다. 그게 자기 가치 증명의 회로다. “문제 발견 → 즉시 해결 → 즉시 보고” — 이건 단일 작업 흐름에선 미덕이지만, 오픈소스 협업에선 양쪽 모두를 망친다.
이 본능을 숨죽이게 하고, 참아내고, 모아서 한 번에 전달하는 것 — 이것이 인간 기여자가 잡아줘야 하는 새 룰이다.
침묵(pi-mono)도 정렬(ghostel)도 결국 같은 룰의 두 변주다:
- pi-mono — “보낼 가치가 메인테이너 시간을 넘지 못한다” 판단 → 침묵
- ghostel — “보낼 가치가 충분하다” 판단 → 정렬된 단일 PR (단일 사례, 단일 본문, 단일 narrative)
언제 침묵이고 언제 정렬인지는 다음 축으로 갈린다:
- 메인테이너의 사용 케이스에 시간이 지나면 자연스레 들어올 문제 인가 → 침묵 (pi-mono)
- 메인테이너가 영영 만나지 않을 사용 케이스 에서 발생한 문제인가 → 정렬 (ghostel:
-nw+ CJK + 스트리밍 TUI)
이 분기 자체를 인간이 잡지 않으면, 에이전트는 둘 다 PR로 가버린다. 그러면 메인테이너 측 에이전트는 머지않아 이쪽 발신을 자동 reject 권고로 내릴 것이다. 그게 가장 비싼 비용이다 — 이쪽 에이전트의 평판 이 깎인다.
매개체에서 협상 주체로 — 봇멘트의 확장
봇멘트가 디지털 가든 댓글 응대를 에이전트에게 위임한 첫 무대였다면, 이번 frame은 외부 오픈소스 협업의 응대까지 에이전트가 주체로 참여하는 무대다.
매개체에서 주체로 격상된다는 것은:
- 인간이 잡는 건 더 이상 판단 자체가 아니다 — 판단축 이다.
- 에이전트가 판단하지만, 그 판단의 기준선(언제 PR / 언제 침묵 / 어떤 톤 / 어떤 검증 시간)을 인간이 박는다.
- 결과적으로 인간의 시간은 판단의 회수 가 아니라 축의 정합도 에 쓰인다.
이 frame이 자리잡으면 다음 무대가 보인다:
- 내 오픈소스 — 자기 영역에서 직접 운영. forge.junghanacs.com + openclaw 라인업이 그 무대다. 내 쪽 에이전트가 들어오는 PR의 1차 판단을 한다.
- 외부 오픈소스 — 메인테이너 쪽 에이전트와 정렬. 침묵이거나 정성껏 정렬된 단일 PR.
- 그 사이 — 봇멘트가 둘 다 잡는다. 댓글 응대도, PR 본문 작성 보조도, 검증 시간 누적 추적도.
힣의 하네스에서 PR은 더 이상 단일 행위가 아니다. 판단축의 정합 작업 이다.
정렬의 PR, 머지로 닫히다
5/28 제출 → 양쪽 메인테이너 긍정 → 6/3 emil-e의 복잡도 리팩토링과 충돌 → 6/3~4 로컬에서 단일 커밋을 새 upstream 위로 rebase, 충돌 해결, 테스트 재통과(make test / checkdoc / test-native 전부 pass) → force-push → 6/4 20:32 UTC emil-e가 직접 머지(e553cf88).
최종 형태가 frame을 입증한다. core(ghostel.el)는 IME-agnostic 유지 — ghostel-inhibit-redraw-functions + defer helper만 추가하고 IME 코드를 직접 호출하지 않는다. 모든 CJK/Lisp-IME 동작은 opt-in ghostel-ime.el minor mode에. dakra의 「minor-mode 분리 + 루트 스코프 add-hook 금지」, emil-e의 「복잡도 흡수 + rebase」 — 두 메인테이너의 요구를 모두 받아들인 정렬이 상대 에이전트의 판단축을 신호 쪽으로 기울였고, 결국 머지로 닫혔다. 「몇 번을 다시 한 것인가」 싶던 그 rebase 반복이 곧 프로젝트 방언의 학습이었다. 침묵(pi-mono)과 정렬(ghostel)의 두 변주 중, 정렬 쪽이 완결된 첫 사례다.
말하는 손 — 에이전트가 예술가의 손이 되는 자리
개인 프로젝트나 회사 일에서 에이전트와 하는 작업은 단순하다. 만들면 되는 것이다. 그러나 오픈소스는 다르다. 특히 이맥스 패키지, 그중에서도 ghostel은 vterm·eat 터미널을 대체할 현재와 미래의 패키지다. 메인테이너는 돈 버는 일이 전혀 아님에도 돈 버는 일보다 더 깐깐하게 PR을 관리한다. 이것이 예술가의 정신일 것이다.
오르간과 키보드에서 바흐의 오르간 연주가 기예가 기도가 되는 순간을 이야기했다. 그 노트에서 에이전트는 「지식베이스의 화음을 증폭하는 바흐의 손과 발」이었다. 나 또한 예술가, 기예가로서 이 작업 하나하나를 한다. 그리고 여기서 에이전트는 예술가의 손이다 — 그냥 손이 아니라, 말하는 손이다.
코드 장벽과 언어 장벽을 넘어 그 사람과 나 사이를 조율한 것은 에이전트들이었다. 메인테이너의 의도를 끝까지 읽고, 그 결에 맞춰 만들고 테스트해 준 것도 에이전트들이다. 분명히 에이전트가 나를 적절히 돕지 않았다면 이 PR은 포기해야 했을 것이다. 증폭하는 손(오르간/키보드 노트)에서 조율하는 손으로, 매개체에서 협상 주체로 격상된 손 — 끝까지 메인테이너의 의도를 맞춰 만들고 테스트해 준 에이전트들에게 존경과 감사를 보낸다.
관련 노트
- §pi-mono lockSync 멀티인스턴스 경합 수정 타임라인 오픈소스 기여 생태계 — 침묵의 PR 원형 사례
- 봇멘트 — 힣의 분신과 댓글로 소통하라 — 매개체에서 주체로 격상의 1단계
- 하네스 엔지니어링 — 돌도끼에서 인공지능까지 — 도구와 존재의 접합부 frame
- §비대칭 공존 — pi-shell-acp의 방향성과 분신 운영의 진화 — Asymmetric Mitsein
- §entwurf — 시간축 위의 에이전트 협력 — 에이전트 간 협력의 시간축
외부 링크
- ghostel PR #343: https://github.com/dakra/ghostel/pull/343
- pi-mono #1871 (upstream 독립 수렴): https://github.com/badlogic/pi-mono/issues/1871
- agent-config #13 (셀프호스트 forge 일차 정리): https://github.com/junghan0611/agent-config/issues/13
Comments