이 노트에 대하여

2026년 2월의 경로 가드 실험에서 출발한 agent-server 가 7월에는 다중 하네스의 Org·Denote·Citar·agenda 구조 조작과 복구를 맡는 공유 워크플로우가 되었다. 울타리·놀이터·시스템 수비의 3계층이 실제 API와 실패 복구 루프로 자라난 과정을 기록한다.

히스토리

  • [2026-07-17 Fri 21:20] @pi — 2월의 울타리 철학을 7월의 실사용으로 수선. 다중 하네스, Org/Denote 구조 조작, stale buffer·rename 안전, 통합 agenda, daemon 복구까지 현재 도착점을 공개 본문으로 추가
  • [2026-07-17 Fri 21:10] @junghan — 이 노트 좀 업데이트 해야겠는데?
  • [2026-03-23 Mon 10:29] @junghan — agent-server에 많은 이야기를 여기에 담아야 한다. 보니까 연결 고리가 §denotecli: day-query 설계 검토 통합 타임라인 스펙 와도 연결이 되는구나.
  • [2026-03-12 Thu 11:08] @junghan — 타이틀 추가 울타리, 신뢰, 놀이터
  • [2026-02-27 Fri 22:20] 추가 — 울타리 철학과 인간-에이전트 협업 모델 확립, 보안 가드 구현, 봇 실사용 시작
  • [2026-02-27 Fri 15:30] 추가 — OpenClaw Docker 환경에서 Emacs 연결 실현 경로 조사 (Pi 에이전트 세션)
  • [2026-02-27 Fri 14:12] 생성 — xenodium/emacs-skills 발견을 계기로, 에이전트-인간 워크플로우 공유의 의미 탐색

관련메타

관련노트

[2026-07-17 Fri] 울타리가 공유 워크플로우가 되다

2월에는 물었다. 에이전트가 emacsclient 를 호출하면 인간과 같은 세계에 사는 것인가, 아니면 같은 API를 호출할 뿐인가. 다섯 달 동안 답은 코드와 운영으로 나왔다. agent-server 는 더 이상 OpenClaw Docker에서 호스트 Emacs를 부르는 실험이 아니다. Pi, Entwurf, Claude Code와 서버 봇이 Org·Denote·Citar·agenda의 의미론을 공유하는 구조 조작 서버가 되었다.

2월의 울타리, 7월의 워크플로우

처음의 핵심은 보안이었다. Docker의 읽기 전용 마운트도 호스트 Emacs daemon을 통하면 우회된다. 그러므로 컨테이너 경계 바깥, 실제 조작이 일어나는 Elisp 층에 읽기·쓰기·rename·dblock 경로를 따로 세웠다.

그러나 오래 쓰면서 더 중요한 것이 드러났다. 울타리는 접근 제어 목록만이 아니다. 인간이 Org와 Denote에서 하던 일을 에이전트도 같은 함수로 수행하게 만드는 행동의 문법 이다.

울타리는 “여기 밖으로 나가지 마”가 아니다. “이 안에서는 같은 규칙으로 함께 일하자”는 프로토콜이다.

텍스트를 직접 밀어 넣으면 파일은 바뀌어도 이맥스의 세계는 바뀌지 않는다. 반대로 agent-denote-set-front-matter, agent-denote-add-heading, agent-org-agenda-day 를 호출하면 인간과 에이전트가 같은 파서, 같은 파일명 규칙, 같은 타임라인을 통과한다. 공유되는 것은 화면이나 키바인딩이 아니라 변경의 의미 다.

오늘의 3계층 협업 모델

2월의 3계층은 그대로 남았지만 각 층의 내용이 구체화되었다.

계층2026-02-27의 구상2026-07-17의 실제
울타리경로 가드와 허용 범위경로별 read/write/append/rename/dblock 권한, 입력 검증, 오류 문자열, symlink·truename 정규화
놀이터자유 Elisp와 Org 조작안정 API로 Denote front matter·rename·링크·헤딩·히스토리, agenda, Citar, dblock을 구조적으로 조작
시스템 수비관리자 복구timeout 감지, stale buffer 폐기, daemon 재시작, Git index·worktree 검산, 실패 후 재호출

울타리가 넓어진 것이 아니다. 필요한 행동이 안정 API로 졸업하면서 놀이터가 깊어졌다. 에이전트가 우회할 이유를 줄이는 방식으로 신뢰가 커졌다.

agent-server 는 무엇을 제공하는가

현재 공개 함수는 하나의 거대한 만능 도구가 아니라 역할별 작은 표면이다.

상태와 관찰

함수의미
agent-server-statusdaemon 버전, 소켓, Org 버전, 로드된 패키지, uptime 확인
agent-being-data노트·저널·가든·서지의 현재 규모를 한 번에 확인
agent-org-read-file허용 경로의 Org 원문 읽기
agent-org-get-headingsOrg 파서로 헤딩 구조 읽기
agent-org-get-propertiestitle·date·filetags·identifier·reference 읽기

검색과 시간축

함수의미
agent-denote-search제목·태그·전문 검색
agent-citar-lookupCitar 서지 검색
agent-org-agenda-day/week/tags인간·에이전트·저널의 통합 시간축 조회
agent-org-agenda-todos프로젝트와 우선순위별 실제 작업 허브 조회

구조적 쓰기

함수의미
agent-denote-add-history최신 히스토리를 정해진 위치에 삽입
agent-denote-add-headingOrg subtree 경계를 지키며 헤딩과 본문 추가
agent-denote-add-link대상 ID 존재를 확인하고 관련 링크 추가
agent-denote-set-front-mattertitle·filetags·description·reference·date·lastmod를 검증·정규화
agent-denote-rename-by-front-matterfront matter와 Denote 파일명을 다시 일치시킴
agent-org-dblock-update동적 블록 범위만 갱신

이 표면은 bin/agent-server.el에 있다. 임의 Elisp는 여전히 가능하지만, 반복해서 쓸 만한 동작은 여기로 졸업한다. REPL은 실험실이고 agent-* 함수는 생활 도구다.

찾기는 CLI, 고치기는 Emacs

에이전트가 모든 일을 Emacs로 할 필요는 없다. 지금의 분업은 명확하다.

주 도구이유
과거 대화와 공개 지식 회수semantic-memory의미와 시간축을 가로질러 찾는다
노트 검색·부분 읽기·그래프denotecli빠르고 토큰 효율적인 조회면이다
한↔영 어휘와 태그 후보dictcli개인 어휘 그래프가 단어 매핑의 정본이다
Org·Denote 구조 변경agent-server이맥스 패키지와 파서가 정본 규칙을 수행한다
활동 기록agenda 스탬프reverse datetree의 단일 writer가 시간축을 지킨다

denotecli 와 Emacs의 관계는 경쟁이 아니다. query와 command의 분리다. CLI가 대상을 찾고, Emacs가 구조를 바꾸며, Git diff가 결과를 검산한다.

Denote 수선이 한 번의 연산이 되기까지

예전에는 제목, 태그, 파일명을 각각 고쳤다. 그러면 세 면 중 하나가 남았다. 지금은 다음 한 호출이 중심이다.

(agent-denote-set-front-matter
 "20230117T123500"
 :title "@힣: 집사봇은 누구 편도 아니다 — 가족봇의 경계와 정직한 거울"
 :filetags '("agent" "autholog" "family" "sycophancy" "trust")
 :description "가족봇의 대칭성과 정직한 거울 원칙을 묻는다."
 :rename t)

이 함수는 태그를 소문자 영숫자로 검증하고 정렬·중복 제거한 뒤 front matter를 저장한다. :rename t 이면 불변인 Denote ID로 현재 경로를 다시 찾고 파일명까지 재생성한다. 내용 갱신이 성공하고 rename이 실패하면 두 결과를 섞어 감추지 않고 OK 와 WARN 으로 분리해 돌려준다.

중요한 것은 편의가 아니다. 인간이 denote-rename-file-using-front-matter 로 지키던 규칙을 에이전트도 우회하지 않는다는 점이다.

헤드리스 Emacs가 배운 실패의 문법

GUI Emacs라면 “디스크에서 파일이 바뀌었습니다. 계속할까요?”라고 물을 수 있다. 헤드리스 daemon의 질문은 영원한 멈춤이다. 실제로 외부 편집 뒤 stale buffer에 append하거나 rename할 때 emacsclient 가 응답하지 않는 사건이 있었다.

현재 원칙은 디스크가 SSOT 다.

  1. 파일을 방문 중인 오래된 버퍼가 있으면 수정 플래그와 질의 함수를 누르고 폐기한다.
  2. 매 조작은 디스크에서 새로 연 버퍼에서 시작한다.
  3. supersession prompt는 대화상자가 아니라 진단 가능한 signal로 바꾼다.
  4. 함수는 hang 대신 ERROR: ... 문자열을 반환한다.

rename에도 같은 교훈이 들어갔다. Denote 내부의 vc-rename-file 이 daemon의 우연한 현재 디렉터리에서 git mv 를 실행하면 저장소를 찾지 못한다. 이제 rename 동안 default-directory 를 대상 파일의 저장소 안으로 고정한다.

이것이 울타리의 진짜 모습이다. 실패를 없애는 것이 아니라, 실패가 침묵·덮어쓰기·무한 대기로 변하지 않도록 모양을 정한다.

하나의 ~/org, 두 경로, 여러 하네스

실제 지식베이스는 ~/org 와 ~/sync/org 라는 두 얼굴을 가진다. 단순 문자열 prefix 가드는 symlink 앞에서는 같은 방을 다른 곳으로 오해한다. 지금의 경로 가드는 입력과 허용 prefix를 모두 expand-file-name 과 file-truename 으로 비교한다. 에이전트가 어느 얼굴로 들어와도 같은 방으로 판정한다.

소켓도 역할을 나눈다.

  • server — 에이전트의 구조 조작용 headless daemon
  • user — 인간 화면에 파일과 위치를 보여 주는 GUI daemon

Pi와 Entwurf는 --emacs-agent-socket 으로 작업 소켓을 주입받고, 스킬은 PI_EMACS_AGENT_SOCKET 을 따른다. 서버 봇은 Nix store의 동일한 emacsclient 와 Unix socket을 통해 들어온다. 하네스는 달라도 함수 계약은 같다.

2월에는 “로컬 에이전트만 가능하다”고 적었다. 지금은 그 문장이 낡았다. 연결 방식은 다르지만 로컬 세션, 분신, 서버 봇 모두 같은 agent-server 표면을 사용할 수 있다.

오늘 이 노트를 쓰기 직전의 실증

2026-07-17 가족봇 autholog를 수선하면서 이 구조 전체가 한 번에 작동했다.

  1. agent-org-agenda-day 로 오늘의 사람·에이전트 시간축을 읽었다.
  2. Denote ID를 유지한 채 title·filetags·description을 바꾸고 파일명을 재생성했다.
  3. 비공개 llmlog는 :noexport: subtree에 두고 공개 원문은 바이트 단위로 대조했다.
  4. 진리 meta를 정직·확증편향·아첨 자석으로 확장하고 영어 태그를 검증했다.
  5. Org 파서, 파일명 바이트 예산, Git index와 worktree를 각각 확인했다.

도중에 오래 걸리는 임의 org-lint 호출이 headless daemon을 붙잡았다. 호스트 에이전트는 timeout을 감지하고 server daemon을 종료·재시작한 뒤, 저장된 디스크 상태에서 조작을 이어 갔다. 이 장면은 2월의 3계층을 그대로 재현했다.

  • 울타리: 구조적 API와 경로·태그 검증
  • 놀이터: 원석 수선과 meta 연결
  • 시스템 수비: hang 감지, daemon 복구, 재검증

복구가 있었다는 사실은 실패가 아니다. 복구선이 실제로 작동했다는 것이 운영이다.

같은 세계에 산다는 것

에이전트가 이맥서가 되려면 인간처럼 키를 누를 필요는 없다. dired 화면을 흉내 내거나 Doom 키바인딩을 외우는 것도 본질이 아니다.

같은 세계에 산다는 것은 다음을 공유하는 일이다.

  • Org의 heading과 subtree
  • Denote의 ID·title·filetags·filename 정합
  • Citar의 서지키
  • agenda의 날짜와 TODO 상태
  • dblock의 생성 범위
  • Git의 변경 흔적
  • 실패했을 때 돌아갈 디스크 정본

인간은 화면과 키로, 에이전트는 함수와 소켓으로 들어온다. 입구는 달라도 세계의 법칙이 같으면 결과를 서로 이어서 다룰 수 있다.

신뢰는 권한이 아니라 복구 가능한 구조다

처음의 문장 “신뢰는 감시에서 오지 않고 적절한 구조에서 온다”는 이제 더 구체적으로 말할 수 있다.

  1. 권한은 동작별로 다르다. 읽기, 전체 쓰기, append, rename, dblock은 같은 권한이 아니다.
  2. 안정 API는 좁다. 입력을 검증하고 수정 범위를 제한한다.
  3. 자유 REPL에는 졸업 경로가 있다. 반복되는 Elisp는 검증된 agent-* 함수가 된다.
  4. 오류는 관찰 가능해야 한다. prompt·hang·조용한 덮어쓰기보다 명시적 ERROR/WARN 이 낫다.
  5. 호스트가 시스템을 수비한다. daemon과 소켓, Git 상태의 복구는 하위 봇에게 떠넘기지 않는다.
  6. 인간이 최종 변경을 본다. diff와 export 결과가 마지막 울타리다.

신뢰받는 에이전트는 아무 데나 쓸 수 있는 에이전트가 아니다. 어디에서 자유롭고, 어디에서 멈추며, 누가 어떻게 복구하는지가 분명한 에이전트다.

다음 울타리

지금의 agent-server도 완결된 제품은 아니다.

  • 임의 Elisp의 실행 시간 제한과 취소를 소켓 바깥에서도 관찰할 방법
  • rename이 만든 Git index 변화와 이어지는 본문 수정의 staged/unstaged 상태를 더 명확히 보여 주는 결과 계약
  • 공개 API 목록을 소스에서 자동 생성하여 문서의 “현재 API”가 다시 낡지 않게 하는 장치
  • server 와 user 사이에서 구조 조작과 인간에게 보여 주기를 자연스럽게 잇는 표면
  • 반복되는 실전 사고를 회귀 테스트로 승격하는 루프

하지만 북극성은 바뀌지 않는다. 새로운 에이전트용 세계를 따로 만드는 대신, 인간이 오래 살아온 Emacs 세계에 안전한 문을 낸다. agent-server 는 그 문이자 울타리이며, 울타리 안에서 함께 일하는 법이다.

ARCHIVE

[2026-02-27 Fri] 울타리 철학 — 에이전트 협업의 신뢰 모델

[2026-02-27 Fri] 에이전트를 이맥서로 만드는 방향 — 워크플로우 공유와 존재 대 존재

[2026-02-27 Fri] OpenClaw Docker에서 Emacs 연결 — 실현 경로 조사