히스토리
- emacsclient 접근법 + xenodium emacs-skills 연결 추가
- 생성 (“Akirak/Org-Reverse-Datetree” 2026) 이거 넣는다.
에이전트 어젠다 — reverse datetree 멀티디바이스 설계
발단
봇-활동-기록-아키텍처와-힣노트-역사성-고찰에서 멀티에이전트 쓰기 문제를 다뤘다. 거기서 “파일 분리 + 쓰기 규약”이 현실적 답이라 했는데, 여기서 한 발 더 나간다: 에이전트 활동을 org-agenda로 보자.
GitHub에서 발견한 패턴 — 에이전트가 TODO + CLOCK 엔트리를 org 파일에 쓰고, org-agenda로 통합 조회 — 이 아이디어를 힣 체계에 맞게 재설계한다.
설계 원칙
- DB 없이 — 파일 기반 철학 유지
- Denote 파일명 규약 — 태그로 디바이스·에이전트 구분
- Reverse datetree — 최신이 위, 에이전트는 앞에만 읽고 앞에 추가
- org-agenda 네이티브 — CLOCK, TODO, 태그 → agenda view 한 번에
- 최소 파일 — agenda-files에 폴더 1개만 등록, 로딩 부담 최소화
핵심 구조
폴더
~/org/botlog/agenda/org-agenda-files 에 이 폴더만 추가하면 됨.
파일 네이밍 — Denote 규약
YYYYMMDDTHHMMSS--에이전트-어젠다__<device>_agenda.org디바이스별 1파일이 기본. ~/.current-device 값이 태그로 들어감:
| 파일 | 대상 |
|---|---|
20260227T120000--에이전트-어젠다__thinkpad_agenda.org | ThinkPad (회사) |
20260227T120100--에이전트-어젠다__nuc_agenda.org | NUC (개인) |
20260227T120200--에이전트-어젠다__laptop_agenda.org | 노트북 (개인) |
20260227T120300--에이전트-어젠다__termux_agenda.org | Galaxy Fold4 |
20260227T120400--에이전트-어젠다__oracle_openclaw_agenda.org | Oracle 서버, OpenClaw 봇 |
20260227T120500--에이전트-어젠다__oracle_heebot_agenda.org | Oracle 서버, 힣봇 |
분기 규칙
-
로컬 워킹 에이전트 (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인가
- 에이전트가 읽을 때: 파일 앞부분만 읽으면 최근 컨텍스트 파악
- 에이전트가 쓸 때: 오늘 날짜 섹션 앞에 추가 (append at front)
- Emacs에서: org-reverse-datetree 패키지가 이 포맷을 네이티브 지원
- 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
- agenda 파일의 CLOCK 데이터를 수집
- clocktable 스타일 리포트 생성
- 디바이스별·프로젝트별·에이전트별 슬라이싱
#+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 (다른 머신) | 없음 | 파일이 다름 |
충돌 발생 시 대응
__tags로 파일 분기 (예:__thinkpad_claude_agenda.org)- 각자 쓰다가 안정화되면 상위 파일로 머지
- 머지는 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/ | RW | insert only (NEWNOTES 앞) | RO |
| botlog/agenda/ | RO (agenda view) | RW (자기 디바이스 파일) | RW (자기 파일) |
| llmlog/ | RO | RW | RW |
| notes/ | RW | RO | RO |
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 생태계 호환
- 멀티디바이스·멀티에이전트 네이티브 지원
관련 노트
- 봇-활동-기록-아키텍처와-힣노트-역사성-고찰 — 이 문서의 전편
- 데이터베이스 vs 파일 노트 개인지식관리 규칙 — 왜 DB 없이 하는가
- diary — datetree 실전 사용 (2022~, 18,000줄+)
- 이맥스-에이전트-오케스트레이션-진화 — Pi extension, gptel 통합
- † 에이전틱코딩 라이브코딩 에이전트코딩 — 에이전트 코딩 메타
- 에이전트를 이맥서로 만드는 방향 — emacsclient 접근법, xenodium emacs-skills
Comments