히스토리

  • [2026-02-27 Fri 14:30] emacsclient 접근법 + xenodium emacs-skills 연결 추가
  • [2026-02-27 Fri 11:54] 생성 (“Akirak/Org-Reverse-Datetree” 2026) 이거 넣는다.

에이전트 어젠다 — reverse datetree 멀티디바이스 설계

발단

봇-활동-기록-아키텍처와-힣노트-역사성-고찰에서 멀티에이전트 쓰기 문제를 다뤘다. 거기서 “파일 분리 + 쓰기 규약”이 현실적 답이라 했는데, 여기서 한 발 더 나간다: 에이전트 활동을 org-agenda로 보자.

GitHub에서 발견한 패턴 — 에이전트가 TODO + CLOCK 엔트리를 org 파일에 쓰고, org-agenda로 통합 조회 — 이 아이디어를 힣 체계에 맞게 재설계한다.

설계 원칙

  1. DB 없이 — 파일 기반 철학 유지
  2. Denote 파일명 규약 — 태그로 디바이스·에이전트 구분
  3. Reverse datetree — 최신이 위, 에이전트는 앞에만 읽고 앞에 추가
  4. org-agenda 네이티브 — CLOCK, TODO, 태그 → agenda view 한 번에
  5. 최소 파일 — agenda-files에 폴더 1개만 등록, 로딩 부담 최소화

핵심 구조

폴더

~/org/botlog/agenda/

org-agenda-files 에 이 폴더만 추가하면 됨.

파일 네이밍 — Denote 규약

YYYYMMDDTHHMMSS--에이전트-어젠다__<device>_agenda.org

디바이스별 1파일이 기본. ~/.current-device 값이 태그로 들어감:

파일대상
20260227T120000--에이전트-어젠다__thinkpad_agenda.orgThinkPad (회사)
20260227T120100--에이전트-어젠다__nuc_agenda.orgNUC (개인)
20260227T120200--에이전트-어젠다__laptop_agenda.org노트북 (개인)
20260227T120300--에이전트-어젠다__termux_agenda.orgGalaxy Fold4
20260227T120400--에이전트-어젠다__oracle_openclaw_agenda.orgOracle 서버, OpenClaw 봇
20260227T120500--에이전트-어젠다__oracle_heebot_agenda.orgOracle 서버, 힣봇

분기 규칙

  • 로컬 워킹 에이전트 (Pi, Claude Code 등): 디바이스별 1파일 공유

    • 같은 머신의 에이전트들은 동시 실행이 드물고, 실행되더라도 reverse datetree 끝(앞)에 추가하므로 충돌 가능성 낮음
    • 충돌이 잦아지면 __tags 로 파일 분기 (예: __thinkpad_claude_agenda.org)
    • 분기한 파일은 나중에 상위 파일로 머지 가능 (datetree 포맷이니까)
  • 서버 상주 에이전트 (봇): 에이전트별 독립 파일

    • stateful 존재이므로 독자 타임라인 관리가 맞음
    • 각자 workspace에서 컨텍스트를 유지

파일 내부 — reverse datetree 포맷

#+begin_example

2026

2026-02 February

2026-02-27 Friday

21:30 punchout

에이전트 CLOCK 합계: 2h 15m

TODO sks-hub-zig #91 디버깅
  • DS Bind 로직 수정
  • QA 체크리스트 DS2-6 통과
DONE elfeed 번역 벤치마크
  • 6개 모델 비교, Gemini 3 Flash 기본값 선정

2026-02-26 Thursday

DONE pi-skills 일원화
  • SKILL.md 제거, pi-skills로 통합

#+end_example

왜 reverse인가
  1. 에이전트가 읽을 때: 파일 앞부분만 읽으면 최근 컨텍스트 파악
  2. 에이전트가 쓸 때: 오늘 날짜 섹션 앞에 추가 (append at front)
  3. Emacs에서: org-reverse-datetree 패키지가 이 포맷을 네이티브 지원
  4. 200자 이슈: Claude Code의 CLAUDE.md 같은 메모리 파일은 용량 제한이 있음. reverse라면 최신 N줄만 읽어도 충분한 컨텍스트
org-reverse-datetree 연동
;; https://github.com/akirak/org-reverse-datetree
(use-package org-reverse-datetree
  :config
  ;; botlog/agenda 파일에서 reverse datetree 사용
  (setq org-reverse-datetree-level-formats
        '("%Y"                    ; 연도
          "%Y-%m %B"              ; 월
          "%Y-%m-%d %A")))        ; 일

org-agenda 통합

최소 설정

;; botlog/agenda 폴더를 agenda-files에 추가
(add-to-list 'org-agenda-files "~/org/botlog/agenda/")
 
;; 에이전트 활동만 보기 (커스텀 뷰)
(add-to-list 'org-agenda-custom-commands
             '("A" "Agent Activity"
               ((tags-todo "ai"
                 ((org-agenda-overriding-header "에이전트 진행 중")))
                (tags "PUNCHOUT"
                 ((org-agenda-overriding-header "퇴근 도장"))))))

agenda에서 볼 수 있는 것

필터보이는 것
일간날짜오늘 에이전트 활동 + 인간 TODO 통합
주간주간이번 주 CLOCK 합계
태그:ai:pi:Pi 에이전트만
태그:ai:claude:Claude Code만
태그:PUNCHOUT:퇴근 도장 목록
clocktable:scope agenda디바이스별·에이전트별 시간 리포트

clocktable 예시

#+BEGIN: clocktable :scope agenda :maxlevel 4 :block thisweek
| Headline                      | Time   |
|-------------------------------+--------|
| *Total*                       | *8:15* |
| 에이전트-어젠다 (thinkpad)    | 5:30   |
|   sks-hub-zig #91 디버깅      |   3:00 |
|   elfeed 번역 벤치마크         |   1:10 |
|   pi-skills 일원화             |   1:20 |
| 에이전트-어젠다 (oracle/heebot)| 2:45   |
|   리서치: 인간 지식그래프       |   2:45 |
#+END:

punchout 진화

현재 punchout

gitcli 커밋 시간으로 시간대 추정, 저널에 텍스트 삽입.

진화된 punchout

  1. agenda 파일의 CLOCK 데이터를 수집
  2. clocktable 스타일 리포트 생성
  3. 디바이스별·프로젝트별·에이전트별 슬라이싱

#+begin_example

21:30 퇴근

18커밋 · 8리포 · 03:52~20:16

에이전트 CLOCK: 3h 26m

  • Pi: 2h 16m (sks-hub-zig 1:30, pi-skills 0:46)
  • Claude: 1h 10m (elfeed 벤치마크)

타임라인: … #+end_example

세션 시작/종료 시 CLOCK 관리

에이전트 세션 흐름:

1. 세션 시작
   → ~/.current-device 읽기
   → ~/org/botlog/agenda/{device}_agenda.org 열기
   → 오늘 날짜 reverse datetree 엔트리 찾기/생성
   → CLOCK open: [2026-02-27 Fri 14:00]
 
2. 작업 수행
   → 할 일 설명 기록
 
3. 세션 종료 (또는 punchout)
   → CLOCK close: [2026-02-27 Fri 14:00]--[2026-02-27 Fri 15:30] =>  1:30
   → TODO 상태 업데이트 (DONE 등)

충돌 관리

왜 안전한가

상황위험도이유
에이전트 A + 에이전트 B (같은 머신)낮음reverse datetree 앞에 추가, 같은 위치 수정 드묾
에이전트 + 인간 (같은 파일)없음인간은 이 파일 안 건드림 (저널은 별도)
에이전트 A + 에이전트 B (다른 머신)없음파일이 다름

충돌 발생 시 대응

  1. __tags 로 파일 분기 (예: __thinkpad_claude_agenda.org)
  2. 각자 쓰다가 안정화되면 상위 파일로 머지
  3. 머지는 datetree 포맷이므로 날짜순 정렬만 하면 됨

전체 그림

~/org/
├── journal/          ← 인간 위클리 저널 (인간 RW, 에이전트 surgical insert)
├── botlog/
│   ├── agenda/       ← 에이전트 어젠다 (에이전트 RW, 인간 RO view)
│   │   ├── ...--에이전트-어젠다__thinkpad_agenda.org
│   │   ├── ...--에이전트-어젠다__nuc_agenda.org
│   │   ├── ...--에이전트-어젠다__oracle_openclaw_agenda.org
│   │   └── ...--에이전트-어젠다__oracle_heebot_agenda.org
│   └── (기존 botlog 노트들)
├── llmlog/           ← LLM 세션 기록 (에이전트 RW)
└── notes/            ← 지식 노트 (인간 RW)

읽기/쓰기 권한 정리:

영역인간로컬 에이전트서버 봇
journal/RWinsert only (NEWNOTES 앞)RO
botlog/agenda/RO (agenda view)RW (자기 디바이스 파일)RW (자기 파일)
llmlog/RORWRW
notes/RWRORO

CLI 스킬 확장 방향

에이전트가 agenda 파일을 다루려면 CLI가 필요:

agendacli clock-in  --device thinkpad --task "sks-hub-zig 디버깅" --tags "ai,pi,sks"
agendacli clock-out --device thinkpad
agendacli today     --device thinkpad        # 오늘 활동 조회
agendacli report    --device all --week       # 주간 리포트
agendacli punchout  --device thinkpad         # CLOCK 기반 punchout

또는 denotecli에 agenda 서브커맨드로 통합:

denotecli agenda clock-in  ...
denotecli agenda clock-out ...
denotecli agenda today     ...

emacsclient 접근법 — 파일 수정의 두 가지 길

에이전트를 이맥서로 만드는 방향에서 핵심 통찰이 나왔다. xenodium(Alvaro Ramirez)의 emacs-skills가 열어준 “세 번째 인터페이스”.

텍스트 조작 vs emacsclient

방식텍스트 조작 (edit/sed)emacsclient —eval
이맥스 인지모름 → revert 필요안다 → 자동 반영
org 구문 안전성깨질 수 있음org 파서가 보장
conflict열린 버퍼와 디스크 불일치버퍼 레벨에서 처리
위치 정확성regex 매칭 의존org-reverse-datetree-goto-date-in-file
agenda 갱신수동 redo자동 redo 가능
적용 범위어디서나 (서버 봇 포함)로컬만 (Emacs 세션 필요)

agenda 파일 수정의 두 경로

[로컬 에이전트: Pi, Claude Code]
  → emacsclient --eval
  → (org-reverse-datetree-goto-date-in-file "~/org/botlog/agenda/...agenda.org")
  → (org-insert-heading)
  → (org-clock-in) / (org-clock-out)
  → agenda 뷰 자동 갱신
 
[서버 봇: 힣봇, OpenClaw]
  → 텍스트 조작 (CLI)
  → denotecli agenda clock-in ...
  → 파일 직접 수정 (reverse datetree 포맷 준수)
  → 인간이 Emacs에서 revert하면 반영

실제 emacsclient 호출 예시

# 에이전트가 agenda 파일에 CLOCK 엔트리 삽입
emacsclient --eval '
(with-current-buffer
    (find-file-noselect "~/org/botlog/agenda/...--에이전트-어젠다__thinkpad_agenda.org")
  (org-reverse-datetree-goto-date-in-file)
  (org-insert-heading-after-current)
  (insert "DONE sks-hub-zig 디버깅 :ai:pi:sks:")
  (org-clock-in)
  (save-buffer))'
# CLOCK 종료
emacsclient --eval '
(with-current-buffer
    (find-file-noselect "~/org/botlog/agenda/...--에이전트-어젠다__thinkpad_agenda.org")
  (goto-char (point-min))
  (re-search-forward "CLOCK: $$.*$$$")
  (org-clock-out)
  (save-buffer))'

스킬 관점에서의 계층

pi-skills/
├── emacs/          ← emacsclient 컨텍스트 (기존, 현재 버퍼 읽기)
│   확장 →  org-agenda 읽기/쓰기
│   확장 →  org-reverse-datetree 삽입
│   확장 →  org-clock-in / clock-out

├── punchout/       ← 퇴근 도장 (기존)
│   확장 →  agenda CLOCK 데이터 수집
│   확장 →  clocktable 기반 리포트

└── (신규) agenda/  ← 또는 emacs 스킬에 통합
    clock-in, clock-out, today, report

로컬 에이전트는 emacs 스킬 경유 (emacsclient), 서버 봇은 agenda CLI 직접 호출. 두 경로 모두 같은 파일·같은 포맷에 쓰므로 agenda 뷰에서 통합.

GitHub 패턴과의 비교

원본 패턴 (GitHub):

  • 프로젝트 파일 1개에 에이전트가 TODO + CLOCK 기록
  • 인간과 에이전트가 같은 파일 수정 → 충돌 위험
  • 단일 디바이스 가정

힣 설계:

  • 디바이스별·에이전트별 파일 분리 → 충돌 구조적 제거
  • reverse datetree → 에이전트 읽기/쓰기 최적화
  • Denote 파일명 → denotecli 생태계 호환
  • 멀티디바이스·멀티에이전트 네이티브 지원

관련 노트