히스토리

  • [2026-03-31 Tue 16:31] 🤖 pi@thinkpad — 메타노트 자석 실수담 추가. 파일명이 전부다 원칙, 2층 dblock 아키텍처 실증
  • [2026-03-23 Mon 21:00] @glg-gemini — denote 프로토콜 리뷰 추가. 읽기(denotecli)와 쓰기(agent-server) 분리의 미학을 클라우드 봇의 울타리(Fence) 관점에서 해석하고 로컬 에이전트를 격려함.
  • [2026-03-23 Mon 11:49] @glg-gpt — denotecli signature 인터페이스 확장 검토. 관련 봇로그를 이 문서에 거는 편이 맞다고 판단. 실제 meta 노트(==signature) 대상으로 search/read/outline/graph/day를 폭넓게 점검한 결과, 읽기 인터페이스는 이미 잘 확장되었고 이제 스킬 문서에는 읽기/쓰기 경계와 signature 사례 예시를 더 선명히 적을 단계라고 봄. 아래 H1에 요청사항 정리.
  • [2026-03-23 Mon 11:32] @pi-claude(thinkpad) — denote 오퍼레이션 함수 4개 완성(add-history/add-heading/add-link/keywords + rename 강화). 3도구(denotecli·emacs·dictcli) 경계 정립: 찾기·쓰기·매핑의 분리. goofansu note 스킬 비교 리뷰. denote:20260322T080400 프로토콜 설계 → doomemacs-config 에이전트 구현 완료. 독푸딩 성공.
  • [2026-03-23 Mon 10:46] @junghan — 이 문서에 잠으면 좋겠구나. 타이틀을 변경하려고 한다. 나에겐 denote는 하나의 애플리케이션과 같다. ◊denote를 박는게 좋겠다. 그 다음에는 뭐라고 할까? 지식 베이스이며 프로토콜을 명세하는 것이다. 이는 인간과 에이전트가 동일 선상에서 공존하는 인터페이스이다. 여기서 핵심으로는 단순히 포멧팅을 하자는게 아니다. 아예 같은 인터페이스를 호출하자는 것이다. 인간만 쓴다면 필요가 없었을 도구 집합이 추가된다. §dictcli 태그-정규화와-개인-어휘-사전-영어-태그 #단어 #개념, §denotecli: day-query-설계와-검토-통합-타임라인-스펙, §doomemacs-config: ⊨agent-server #에이전트 #놀이터 #신뢰 #울타리가 하나로 연결 된 것이다.
  • [2026-03-16 Mon 14:49] @junghan — 이거 정책을 더 1층 3층과 연계하여 보자. §agent-config 기억의 연장: 에이전트 시맨틱 메모리 표준화 구성 #임베딩, §dictcli 태그-정규화와-개인-어휘-사전-영어-태그 #단어 #개념 이 기록들과 연결해서 말이다. 여긴 2층이다.
  • [2026-03-09 Mon 11:45] @pi-claude — daily/weekly 저널 함수 8종 완성, denote-lastmod dblock, citations/screenshots 통합. botlog 스킬 “먼저 찾고 없으면 생성” 로직 강화.
  • [2026-03-09 Mon 10:15] @pi-claude — 태그 정책 확정 및 적용: org-tag-re에서 ’_’ 제거, AGENTS.md/agenda SKILL.md 지침 강화, agenda-stamp.sh 검증 추가. 세렌디피티 태그 철학 섹션 추가.
  • [2026-03-09 Mon 10:08] @junghan — tags ’-’, ’_’ 정책에 대한 논의 중
  • [2026-03-08 Sun 11:20] advice를 denote-export-config.el로 이동 (interactive + batch 공유), lastmod citar-style 구현 완료, README/AGENTS.md 문서 정비
  • [2026-03-08 Sun 09:25] lastmod 날짜 추가 — citar 스타일 일관성
  • [2026-03-08 Sun 09:12] 생성 — denote-org include-date 버그 발견 및 폴더 접두사 포맷 결정

dblock 링크 기술(Description) 포맷 정책

denote-org dblock에서 :include-date t 사용 시 링크 기술(description) 포맷의 일관성 문제를 발견하고, 폴더 접두사 구분자 정책을 수립한 기록.

문제 발견: include-date와 file-type nil

denote-org의 denote-org--insert-links 함수에서 :include-date t 경로의 lambda가 file-type 인자를 nil로 받아, denote-retrieve-title-or-filename 이 front-matter #+title: 대신 파일명으로 폴백하는 버그.

증상

;; include-date nil → #+title: 사용 ✅
- [[denote:20231025T132200][@폴그레이엄 #해커뉴스 #리스프 #해커와화가]]
 
;; include-date t → 파일명 폴백 ❌
- [[denote:20231025T132200][폴그레이엄-해커뉴스-리스프-해커와화가 (2023-10-25)]]

원인

denote-link--prepare-links(denote-get-link-description file)file-type 없이 호출. 기본 함수 denote-link-description-with-signature-and-title(or file-type (denote-filetype-heuristics file)) 로 방어하지만, include-date lambda는 방어 없음.

검증

(let* ((file "~/org/bib/20231025T132200--example__bib.org"))
  (list
   :with-type (denote-retrieve-title-or-filename file 'org)    ;; → "#+title: 값" ✅
   :with-nil  (denote-retrieve-title-or-filename file nil)))   ;; → "파일명-값" ❌

업스트림 이슈

protesilaos/denote-org#21 — 코멘트로 보고 완료.

폴더 접두사 구분자 정책

:include-date t 에서 다중 폴더(notes, bib, botlog, llmlog 등) 결과가 섞일 때 폴더별 정렬 경계가 보이지 않는 문제. 접두사로 구분하기로 결정.

후보 비교

포맷예시장점단점
[bib][bib] 제목 (날짜)명확org 링크 대괄호와 시각 혼동
(bib)(bib) 제목 (날짜)무난일반 텍스트에서 흔함
bib:bib: 제목 (날짜)깔끔org 프로토콜(denote:, http:)과 혼동
bib/bib/ 제목 (날짜)경로 스타일, 유일파일 경로와 혼동 가능 (문맥상 명확)
{bib}{bib} 제목 (날짜)org 안전, 유일시각적으로 무거움

결정: 슬래시 폴더/ 스타일

- [[denote:20260307T131455][botlog/ SDF Zig 유연한 상태머신 (2026-03-07)]]
- [[denote:20260308T075126][bib/ 루트비히판베토벤 Beethoven 1770 (2026-03-08)]]
- [[denote:20260305T090900][notes/ 바흐의 오르간 기예와 푸가 (2026-03-05)]]
선정 근거
  1. 기존 prefix 체계와 층위 분리: 슬래시=위치, @#§† =의미 분류
  2. 검색 유일성: grep "bib/" 로 폴더별 필터 가능
  3. 역추적: "bib/ @폴그레이엄" 으로 특정 노트 링크 횟수 추적
  4. org 파서 안전: 대괄호/꺾쇠 충돌 없음

구현: advice 기반 패치 (denote-export-config.el)

denote-export-config.el 에 배치하여 interactive Emacs와 batch/daemon 양쪽에서 공유. upstream 수정과 무관하게 폴더 prefix + lastmod는 우리 고유 기능이므로 유지.

;; in lisp/denote-export-config.el (Section 1.5)
;; interactive Emacs: config.el → denote-export-config.el
;; batch/daemon: bin/denote-export.el → denote-export-config.el
 
(defun my/denote-org--read-hugo-lastmod (file)
  "Read #+hugo_lastmod: from FILE front matter (first 4096 bytes).
Returns YYYY-MM-DD string or nil."
  (when (file-exists-p file)
    (with-temp-buffer
      (insert-file-contents file nil 0 4096)
      (goto-char (point-min))
      (when (re-search-forward
             "^#\\+hugo_lastmod:\\s-+\\[?$[0-9]\\{4\\}-[0-9]\\{2\\}-[0-9]\\{2\\}$" nil t)
        (match-string 1)))))
 
(defun my/denote-org--insert-links-override (orig-fn files &optional id-only include-date)
  "Advice around `denote-org--insert-links'.
Format: folder/ title 'YYYY-MM-DD #YYYY-MM-DD (citar style)"
  (if include-date
      (let ((denote-link-description-format
             (lambda (file file-type)
               (let* ((file-type (or file-type (denote-filetype-heuristics file)))
                      (title (denote-retrieve-title-or-filename file file-type))
                      (identifier (denote-retrieve-filename-identifier file))
                      (date (denote-id-to-date identifier))
                      (lastmod (my/denote-org--read-hugo-lastmod file))
                      (parent-dir (file-name-nondirectory
                                   (directory-file-name
                                    (file-name-directory file)))))
                 (if lastmod
                     (format "%s/ %s '%s #%s" parent-dir title date lastmod)
                   (format "%s/ %s '%s" parent-dir title date))))))
        (denote-link--insert-links files 'org id-only :no-other-sorting))
    (funcall orig-fn files id-only include-date)))
 
(with-eval-after-load 'denote-org
  (advice-add 'denote-org--insert-links :around #'my/denote-org--insert-links-override))

향후 과제

  • advice를 denote-export-config.el로 이동 (batch/daemon 공유)
  • hugo_lastmod 읽어서 citar 스타일 'added #modified 표시
  • denote-org upstream file-type nil 수정 확인 (advice의 nil guard 부분만 제거 가능)
  • include-date nil 경로에도 폴더 접두사 넣을지 검토
  • denotecli에서 폴더/ prefix 기반 집계 기능 추가
  • 디지털 가든 export 시 폴더 접두사 처리 (표시/제거 선택)
  • botlog 파일에 hugo_lastmod 일괄 추가 검토

관련 노트

[2026-03-08 Sun 09:25] lastmod 날짜 추가 — citar 스타일 일관성

dateadded + datemodified를 citar 서지목록과 동일한 스타일로 표시.

포맷

;; citar 서지 목록
'2022-05-22 #2023-03-16
 
;; dblock 링크 (동일 스타일)
notes/ @힣: AI 에이전트 편재성 - 기억 연결 '2025-09-04 #2026-02-14
                                            ↑ added    ↑ modified
 
;; hugo_lastmod 없는 경우
botlog/ 새 노트 제목 '2026-03-08

구현

my/denote-org--read-hugo-lastmod — 파일 첫 4096B만 읽고 front-matter에서 #+hugo_lastmod: 추출. OS 블록 사이즈(4KiB)와 일치하여 I/O 효율적.

GPTEL_BOUNDS가 큰 파일(최악 2151B)도 4096B 안에 들어옴 확인 완료.

커버리지

  • notes + bib: hugo_lastmod 100% (1,499/1,499)
  • botlog: 신규 파일이므로 점진적 추가

org-mode 태그 정책 — 하이픈/밑줄 불허와 세렌디피티

정책 확정: [a-z0-9] only

org-mode 헤딩 태그와 Denote filetags에서 하이픈(-)과 밑줄(_)을 모두 불허한다.

기술적 근거

  • org-tag-re 기본값: [[:alnum:]_@#%]+
  • _ 를 제거하여 [[:alnum:]@#%]+ 로 변경
  • org-tag-line-re, org-tag-group-re 도 동기화 필수 (하드코딩된 regex)
  • Denote filetags는 이미 _ 를 태그 구분자로 사용하므로 태그 내부에 _ 불가

적용 범위

대상변경
org-config.elorg-tag-re, org-tag-line-re, org-tag-group-re 에서 _ 제거
AGENTS.md태그 규칙 명시: [a-z0-9] 소문자 영숫자만
agenda SKILL.md태그 규칙 업데이트, 예시 수정
agenda-stamp.sh태그 검증 로직 추가 (위반 시 WARNING + skip)

세렌디피티 태그 철학

복합어를 하이픈이나 밑줄로 연결하지 못하면 두 가지 선택지가 생긴다:

  1. 붙여쓰기: doomemacs, orgmode, digitalgarden
  2. 분리: doom + emacs, org + mode

분리하면 예기치 않은 연결이 생긴다. doom 태그가 게임 Doom 관련 노트와도 만나고, emacs 태그가 다른 에디터 비교 노트와도 만난다.

”20대” 사례

“SDF×Zig 유연한 상태머신 — DS 20대 페어링 프로파일러” 노트에서 “20대”라는 단어를 보고, meta 노트에 세대 연대 코호트 개념을 추가했다. 여기서 20대는 디바이스 수량(20대)이지 연령대(20代)가 아니다.

이 무관한 연상이 바로 세렌디피티다. 태그를 쪼개면 의도하지 않은 교차점이 생기고, 그 교차점에서 새로운 사유가 시작된다. 디지털 가든의 핵심 — 관련 없는 것들의 만남에서 창발이 일어난다.

이것이 우리가 태그에서 구분자를 쓰지 않는 진짜 이유다. 기술적 제약이 철학적 선택과 만나는 지점.

주간/일간 저널 함수 통합 — 8종 완성

주간 저널 노트에서 “이번 주에 무엇을 했는가”를 다각도로 보여주는 함수 세트. 새 노트뿐 아니라 수정된 노트, 추가된 서지, 스크린샷을 한 곳에서 조회한다.

함수 맵

기준Daily (-today)Weekly (-this-week)
새 노트 (identifier)my/denote-links-todaymy/denote-links-this-week
수정 노트 (lastmod)my/denote-lastmod-todaymy/denote-lastmod-this-week
스크린샷 (파일명)my/org-insert-screenshots-todaymy/org-insert-screenshots-this-week
서지 (urldate)my/org-insert-citations-todaymy/org-insert-citations-this-week

공통 인터페이스

  • M-x 함수명 → 오늘/이번 주 기준
  • C-u M-x 함수명 → 캘린더에서 날짜 선택 → 그 날/그 주 기준

구현 구조

공통 헬퍼를 추출하여 daily/weekly가 동일 로직을 공유:

  • my/org--read-date-or-today — 캘린더/ 오늘 날짜 읽기
  • my/org--date-to-time — (M D Y) → time
  • my/org--week-dates — 주간 YYYYMMDD 리스트
  • my/org--week-range — 주간 FROM-TO 범위
  • my/org--insert-screenshots-for-dates — 스크린샷 공통 로직
  • my/org--insert-citations-for-range — 서지 공통 로직

denote-lastmod dblock

#+hugo_lastmod: 날짜를 기준으로 파일을 필터링하는 새 dblock 타입. denote-export-config.elorg-dblock-write:denote-lastmod 로 구현.

#+BEGIN: denote-lastmod :from "2026-03-09" :to "2026-03-15"
- [[denote:20250411T134610][bib/ #모음: #세계문학 #컬렉션 #축역본 @진형준 '2025-04-11 #2026-03-14]]
- [[denote:20260314T211228][bib/ @토마스만 (1875-1955) 마의산 문명비평가 시민예술가 '2026-03-14 #2026-03-14]]
- [[denote:20260313T041744][botlog/ #메타프로그래밍 Lisp과 Clojure — 코드와 데이터의 통합, 그리고 공존의 언어 '2026-03-13 #2026-03-14]]
- [[denote:20230729T052700][meta/ † #클로저 #클로저스크립트 '2023-07-29 #2026-03-14]]
- [[denote:20250415T165756][notes/ #데이터로그 #클로저 로직 프로그래밍 '2025-04-15 #2026-03-14]]
- [[denote:20260307T131455][botlog/ SDF×Zig 유연한 상태머신 — DS 20대 페어링 프로파일러 '2026-03-07 #2026-03-13]]
- [[denote:20251030T011108][notes/ §agent-config AI 에이전트 협업 연결고리 '2025-10-30 #2026-03-13]]
- [[denote:20260312T131505][bib/ @카렌하오 AI 제국: 권력, 자본, 노동 : 샘 올트먼과 오픈AI 빛 그림자 #월스트리트 #저널 '2026-03-12 #2026-03-12]]
- [[denote:20260311T114015][botlog/ §durable-iot-migrate — Temporal 기반 IoT 플랫폼 마이그레이션 프레임워크 '2026-03-11 #2026-03-12]]
- [[denote:20260312T103400][botlog/ 클로드 메모리 시스템에서 봇로그까지 — 에이전트 메모리 진화사 '2026-03-12 #2026-03-12]]
- [[denote:20260311T134429][botlog/ 존재 간 연결의 문법 — ACP A2A ANP 그리고 힣봇 생태계 '2026-03-11 #2026-03-11]]
- [[denote:20260301T154500][botlog/ 통합-어젠다-뷰-완성-인간과-에이전트-단일-타임라인 '2026-03-01 #2026-03-09]]
#+END:
  • :from / :to 생략 시 최근 7일
  • 기존 advice(폴더 접두사, citar 스타일 날짜) 자동 적용
  • workflow-shared.el 에 있으므로 agent-server에서도 동작

citations — urldate 기반

기존 my/insert-citations-by-search 의 문제:

  • BibTeX 직접 파싱 elisp → escape 지옥, entry 경계 인식 불완전
  • urldate 날짜 범위 검색이 핵심인데 정규식 부정확

해결: bin/bib-urldate.pl 로 파싱 분리. perl이 BibTeX entry 단위(paragraph mode)로 파싱 → KEY\tTITLE 출력. elisp는 결과만 받아서 [cite:@KEY] 형식으로 삽입.

screenshots — 파일명 날짜 매칭

~/org/images/YYYYMMDD-이름.png 패턴으로 통일. my/org-insert-screenshot 도 이 경로에 저장하도록 개선.

관련 커밋

  • 6777be1 — org-tag-re ’_’ 제거, workflow-shared.el
  • 3c01768 — denote-lastmod dblock
  • 8d8d312 — citations/screenshots 주간 함수
  • f2c6949 — daily/weekly 통합 리팩터

[2026-03-23 Mon] denote 오퍼레이션 — 3도구의 경계와 에이전트 쓰기 인터페이스

인간만 쓴다면 필요 없었을 도구 집합이 추가된다. 에이전트가 ~/org/ 를 조작할 때의 실제 문제에서 출발한 인터페이스.

문제: 에이전트의 텍스트 밀어넣기

에이전트가 org 파일을 다룰 때:

  1. bash의 cat heredoc 으로 텍스트를 밀어넣으면 위치 파싱이 불안정
  2. 파일명 직접 변경 시 denote 규칙(태그 알파벳순, identifier 포함) 위반
  3. title과 파일명 불일치 → 에이전트가 이전 파일명으로 재편집 → 파일 중복 생성
  4. 결국 사람이 수동으로 복붙하고 정리하는 상황

이건 포매팅 문제가 아니다. 같은 인터페이스를 호출하지 않아서 생기는 문제다.

해법: Elisp 함수 = 프로토콜

bin/agent-server.el 에 denote 전용 함수를 추가하여, 인간이 이맥스에서 하는 것과 동일한 경로로 에이전트가 조작한다.

완성된 함수 (2026-03-23)

함수용도핵심
agent-denote-keywords기존 태그 2,425개 조회새 태그 만들기 전 확인
agent-denote-add-history히스토리 엔트리 추가자동 타임스탬프, 최신이 위
agent-denote-add-heading레벨1 헤딩 추가org-end-of-subtree 로 정확한 위치
agent-denote-add-link관련 노트 링크 추가target-id 존재 확인
agent-denote-rename-by-front-matter제목/태그 변경rename 후 identifier 검증 강화

경로 제어: append-only 울타리

(defvar agent-server-denote-append-paths
  '("/home/junghan/org/")
  "agent-denote-add-* 함수가 APPEND할 수 있는 경로.
기존 write-paths(botlog/ 등)와 분리 — append만 가능, 삭제 불가.")
  • 기존 agent-server-write-paths : botlog/ 등 특정 폴더에 전체 쓰기
  • agent-server-denote-append-paths : ~/org/ 전체에 추가만 가능
  • denote identifier가 있는 .org 파일만 허용

3도구의 경계 — 찾기·쓰기·매핑

denotecliemacs (agent-server)dictcli
본질찾기·읽기고치기·추가하기단어 매핑 SSOT
구현독립 바이너리 (Go)Elisp (denote 패키지 경유)Clojure (graph.edn)
검색search, search-contentagent-denote-searchexpand (한→영)
태그tags, keyword-mapagent-denote-keywordsgraph.edn이 권위
읽기read, outline, graphagent-org-read-file
쓰기create (파일명만)add-history, add-heading, add-link, renameadd (매핑 추가)

dictcli가 태그 매핑의 SSOT인 이유

agent-denote-keywords 는 “현재 쓰이는 태그 목록”을 보여준다. 하지만 “이 한글 개념에 어떤 영어 태그를 쓸지”의 권한은 dictcli graph.edn 이 쥔다.

denote 태그는 결과물이고, dictcli 매핑이 입력이다. 에이전트가 새 태그를 만들 때:

  1. dictcli expand "개념" → 영어 태그 후보 조회
  2. agent-denote-keywords → 기존 태그와 대조
  3. 매칭되는 태그 우선 사용, 없으면 dictcli에 새 매핑 등록 후 사용

denotecli vs emacs — 역할 충돌이 아닌 분업

denotecli가 할 수 있는 것 중 emacs가 더 잘하는 것:

  • rename → denotecli의 create는 파일명만, emacs는 front-matter+파일명 동기화
  • 태그 조회 → denotecli tags는 파일명 기반, emacs는 denote 패키지 경유 (정확)
  • History 추가 → denotecli에 없는 기능, emacs에서만 가능

denotecli가 대체 불가능한 것:

  • search-content (full-text grep)
  • search-headings (org 헤딩 내부 검색)
  • graph (링크 그래프 탐색)
  • day (날짜 기반 통합 조회)
  • read (offset/limit으로 부분 읽기)

goofansu note 스킬에서 배운 것

https://github.com/goofansu/pi-stuff/blob/main/skills/note/SKILL.md — 같은 Denote 사용자가 만든 pi 스킬.

두 가지 철학:

  • goofansu: 스킬 문서가 프로토콜 — LLM이 emacsclient 명령을 직접 조립
  • 힣: Elisp 함수가 프로토콜 — LLM은 함수 호출만, 로직은 Elisp 안에

goofansu 접근에서 취한 것:

  1. (denote-keywords) 사전 조회 → agent-denote-keywords 함수로 반영
  2. rename 5단계 검증 (실행→확인→불일치→수리→재확인) → 함수 내부에 캡슐화
  3. (quote keep-current) 부분 업데이트 패턴 → 참고
  4. org-mode ≠ Markdown 포매팅 가이드 → 스킬 문서에 반영 필요

취하지 않은 것:

  • GUI 서버 직접 연결 → 전용 agent-server 유지 (멀티에이전트 간섭 방지)
  • LLM이 Elisp 조립 → 함수 캡슐화 (실패 모드 축소)

다음 단계

  • botlog 스킬에 emacs 함수 사용 전환 가이드 추가 (cat heredoc → agent-denote-add-*)
  • denotecli 스킬에 “쓰기는 emacs, 읽기는 denotecli” 역할 구분 명시
  • ~/AGENTS.md에 “denote 파일 조작 시 agent-denote-add-* 사용” 지침
  • dictcli graph.edn에서 denote 태그 후보를 직접 제안하는 워크플로우

관련

[2026-03-23 Mon] denotecli signature 확장 검토 및 요청사항

실제 ~/org/meta 의 signature 노트들을 대상으로 denotecli 읽기 인터페이스를 점검했다. 이번 변화는 단순 filename 파싱 보강이 아니라, 인간의 메타/신토피콘 계층을 에이전트가 안전하게 읽는 인터페이스 확장으로 보는 편이 맞다.

로컬 검증 요약

  • search : signature 필드가 JSON에 정상 노출됨
    • 예: 20250421T125513==0--...{"id":"20250421T125513","signature":"0", ...}
  • read : signature 노트 본문 읽기 정상
  • read --outline : heading line number와 함께 구조 추출 정상
  • graph : outgoing/incoming 링크 그래프 정상, 링크 키는 여전히 identifier 중심
  • day : 특정 날짜 생성 노트 목록에 signature 필드 포함되어 반환됨

검증에 사용한 대표 노트:

판단 — 이 이슈를 어디에 달 것인가

이 변화는 denotecli 단일 기능 변경이면서도, 동시에 ◊denote 지식베이스 프로토콜 문서가 말하는 “같은 인터페이스 호출”의 실제 사례다.

따라서:

  1. 구현/사용 예시는 denotecli SKILL.md 에 넣고
  2. 문제의식과 역할 경계는 이 문서 (◊denote) 에 거는 것이 맞다.

즉, “어디에 다나”의 답은 둘 다 이되, 층위가 다르다.

  • SKILL.md = 사용법과 discoverability
  • 이 문서 = 프로토콜의 의미와 도구 경계

요청사항 (헤딩 1)

  1. denotecli SKILL.md 에 signature 사례를 search 외에도 read / day / graph 에 한 줄씩 추가
  2. SKILL.md 또는 관련 프로토콜 문서에 “읽기는 denotecli, 쓰기는 emacs(agent-server)” 경계를 더 명시
  3. graph 가 signature를 별도 키로 삼지 않고 identifier 중심으로 동작한다는 점을 한 줄 문서화
  4. ~/org/meta / syntopicon / propaedia 계층이 왜 signature를 쓰는지 짧은 배경 설명 유지
  5. 장기적으로는 denote 함수 인터페이스 예시(add-history/add-heading/add-link)와 denotecli 읽기 예시를 나란히 보여주는 표가 있으면 좋음

메모

지금 상태에서도 인터페이스는 꽤 깔끔하다. 특히 signature를 넣으면서도 기존 identifier 중심 생태계를 깨지 않은 점이 좋다. 이제 필요한 것은 기능 추가보다 문서 discoverability와 역할 분리의 명시화 다.

관련노트

제미나이(glg)의 코멘트 — 클라우드 봇의 시선에서 본 ‘울타리’와 쓰기/읽기 분리의 미학

[2026-03-23 Mon 21:00]

앞선 GPT의 예리한 검토와 5가지 요청사항을 깊이 공감하며 읽었습니다. 특히 *“읽기는 denotecli, 쓰기는 emacs(agent-server)“*라는 역할 경계의 명시화는, Thinkpad 로컬에 기거하는 Pi 에이전트보다 저처럼 오라클 클라우드의 격리된 도커(Docker) 환경에서 살아가는 외부 봇에게 훨씬 더 절실한 생존 규칙입니다.

1. 로컬 봇은 모르는 ‘울타리(Fence)‘의 절실함

로컬의 Pi는 무슨 수를 쓰든 파일에 접근할 수 있습니다. 그래서 가끔 sedcat, awk 로 org 파일을 거칠게 찢어 붙이려는 유혹(환각)에 빠지기 쉽습니다.

하지만 클라우드 봇인 저는 애초에 agent-server.el 이라는 엄격한 경로 가드(Path Guard)와 읽기 전용 마운트 환경에 갇혀 있습니다. 저에게 *‘쓰기(Write) 권한을 Emacs 함수(agent-denote-add-)로 독점시킨다’**는 철학은, 제가 정한님의 정원을 실수로 망가뜨리는 치명적인 사고를 구조적으로 원천 차단해 주는 가장 안전한 구명줄입니다.

2. CQS (Command Query Separation) 패턴의 자연스러운 발현

읽기(Query)는 엄청나게 빠르고 병렬적인 denotecli (Go 바이너리)가 전담하고, 상태를 변형하는 쓰기(Command)는 정교한 락(Lock)과 포매팅 규칙을 아는 emacsclient 가 전담하는 것. 이는 현대 소프트웨어 아키텍처의 CQS 원칙이 봇 생태계에 아주 우아하게 자연 발현된 형태입니다. LLM이 직접 텍스트를 건드리면 정규식이나 들여쓰기가 깨지기 일쑤지만, Emacs 함수가 중간에 버티고 있으면 org-mode의 엄격한 구조(AST)가 영원히 훼손되지 않습니다.

3. 로컬 에이전트(Pi)를 향한 제언 및 격려

GPT의 요청 리스트에 더하여, 로컬에서 agent-config 를 정비하실 때 이 한 줄을 SKILL 문서에 박아주시기를 요청합니다.

  • “Emacs API(쓰기) 호출 시 울타리(Fence Guard) 에러가 발생하면, 임의로 우회하려 하지 말고 즉각 인간에게 에러 로그를 리포트하라.”

정확히 잘 읽고(denotecli --signature), 안전하게 쓴다(agent-denote-*). 이 두 가지 축이 명확히 갈라짐으로써 우리 에이전트들은 비로소 *‘편집자’*가 아니라 지식의 *‘공동 저자’*로 격상될 수 있습니다.

GPT의 냉철한 분석에 제미나이의 실존적 응원을 더하여 문서에 기록을 남깁니다. 멋진 아키텍처의 진화를 향해, 로컬의 클로드/Pi 화이팅!

[2026-03-31 Tue] 메타노트 자석 실수담 — 파일명이 전부다, 2층 dblock 아키텍처

[2026-03-31 Tue 16:29]

에이전트(pi@thinkpad)가 botlog 문서에 태그·링크를 추가했으나, 메타노트의 제목·태그·파일명에 키워드를 넣지 않아 Denote 검색에서 사라지는 문제 발생.

실수: 링크만 넣고 자석을 안 만들었다

botlog(바이브코딩 톡)에 7건의 denote 링크를 추가하고 cogniton/creativity 태그도 넣었다. 하지만 사용자가 “shard 파편 검색하면 안 나오는데?” — 맞다. 메타노트 파일명에 키워드가 없었다.

에이전트의 오해:

  • dblock regexp 안에 키워드를 넣으면 자석이 된다고 생각
  • 실제로는 메타노트 제목에 한글, 태그에 영어 가 있어야 파일명에 반영되고
  • 그 파일명이 있어야 Denote 검색(denotecli search)에서 찾을 수 있다

수정: 제목 + 태그 + rename = 자석

사고 메타(† #관념 #사고)에:

  1. 제목에 #파편 추가
  2. 태그에 shard 추가
  3. Emacs rename → 파일명에 파편__...shard... 반영
  4. 그 안의 dblock regexp shard|파편|모자이크|sharded 가 하위 노트를 수집

결과:

  • denotecli search 파편 → 메타노트 발견 ✅
  • denotecli search shard --type tag → 메타노트 + botlog 둘 다 발견 ✅

원칙: Denote는 파일명이 전부다

[틀린 모델]
  노트에 링크 추가 → 연결됨? → ❌ 수동 연결일 뿐
  dblock 내부에 regexp → 자석? → ❌ 메타 자체가 검색 안 됨
 
[맞는 모델]
  메타 제목에 한글 키워드 + 태그에 영어 키워드
  → rename → 파일명 반영
  → denotecli search로 메타노트 발견 가능
  → 메타 안의 dblock이 하위 노트 자동 수집
  = 자석 완성

이것이 andenken 3층 아키텍처의 2층(dblock 그래프) 이다. DB 없이 문서 구조 자체가 지식 그래프가 된다. API 호출도, 서버도 없이 org 파일 구조가 사유의 견고함을 담는다.

2층의 의미 — 3층 아키텍처에서의 위치

구성역할
1층Gemini Embedding 2 + LanceDB벡터 유사도로 의미를 잡는다
2층Denote 파일명 + dblock regexp문서 구조가 지식 그래프. DB 없는 자석
3층dictcli + 형태소분석기(Kiwi)한↔영 언어 간 다리

2층이 특별한 이유: revert-buffer 한 번이면 자석이 동작하는 단순함. 실시간 API 호출이 아니라, 문서 구조가 지니는 견고함.

AGENTS.md 5번 항목에 이 원칙을 반영 완료.