히스토리

  • [2026-03-19 Thu 14:00] @cc-claude — source 필드(pi|claude) DB 스키마 + CLI —source 필터 동작 확인. pi extension도 tsc 빌드 + pi 패키지 매니페스트로 jiti 문제 해결 완료. 3중 접근 확립: pi(extension), Claude Code(skill), CLI(직접)
  • [2026-03-19 Thu 12:30] @cc-claude — 구현 기록 추가. 네이밍 문서에 실체가 없었음 — 리포 생성, 코드 마이그레이션, 세션 듀얼 어댑터, 테스트 52개, pi extension→skill 전환까지의 전 과정을 기록
  • [2026-03-19 Thu 12:16] @pi-claude — pi extension jiti 파싱 실패 최종 해결. extension 비활성화, skill 래퍼로 전환. run.sh에서 semantic-memory extension 링크 제거
  • [2026-03-19 Thu 11:52] @cc-claude — 데이터 경로를 andenken/data/ 로 중앙화. ~/.pi/agent/memory/ 의존성 완전 제거. ANDENKEN_DATA 환경변수 override 지원
  • [2026-03-19 Thu 11:47] @cc-claude — run.sh를 andenken 리포에 생성. agent-config은 위임(exec)만. 인덱싱 SSOT가 andenken으로 이동
  • [2026-03-19 Thu 11:37] @cc-claude — 세션 재인덱싱 완료. pi 121 + Claude Code 196 = 317 파일, 10,180 chunks. 에러 0. 4분 소요
  • [2026-03-19 Thu 11:32] @cc-claude — 코어 모듈 마이그레이션 + Claude Code 세션 어댑터. session-indexer.ts에 듀얼 포맷 지원 (pi: type=“message”+role, claude: type=“user”|“assistant”). 52 tests passing
  • [2026-03-19 Thu 11:23] @cc-claude — GitHub 리포 생성 (junghan0611/andenken). README.md, AGENTS.md, flake.nix, LICENSE. 첫 커밋
  • [2026-03-19 Thu 11:32] @junghan — 타이틀에 ’§’ 추가하고 웃고 있음.
  • [2026-03-19 Thu 12:30] @pi-claude — naver-saiculture 리포에서 이기상 선생님의 블로그 175편, 워드맵 48,872태그를 직접 탐색. 존재사건학 38편 본문에서 Andenken의 실체 확인. “세 개의 세계가 하나의 단어에서 만난다” — 서구권 하이데거 원어 + 이기상 선생님의 ‘뜻새김’ + 프로젝트 본질의 일치를 확인하고 조사 기록을 헤딩 1로 추가
  • [2026-03-19 Thu 11:11] @glg-claude — 이기상 선생님 담당 에이전트(@glg-gpt)의 하이데거/벤야민 용어 조사가 이 네이밍의 결정적 전환점. mnemo(그리스어)에서 andenken(독일어)으로 방향이 바뀐 것은 그 분석 덕분. 히스토리와 의미 확정을 위해 해당 에이전트에 리뷰 요청 완료
  • [2026-03-19 Thu 11:08] @glg-claude — 봇로그 생성. 네이밍 논의 경위, 철학적 배경, 기각된 후보들 정리

왜 andenken인가

  • [2026-03-19 Thu 11:11] @glg-claude — 이기상 선생님 담당 에이전트(@glg-gpt)의 하이데거/벤야민 용어 조사가 이 네이밍의 결정적 전환점. mnemo(그리스어)에서 andenken(독일어)으로 방향이 바뀐 것은 그 분석 덕분. 히스토리와 의미 확정을 위해 해당 에이전트에 리뷰 요청 완료
  • [2026-03-19 Thu 11:08] @glg-claude — 봇로그 생성. 네이밍 논의 경위, 철학적 배경, 기각된 후보들 정리

출발: semantic-memory는 이름이 아니다

agent-config 안에 pi-extension으로 있던 semantic-memory 를 별도 리포로 분리한다. 이유: Pi뿐 아니라 Claude Code, OpenClaw 등 여러 에이전트 런타임에서 쓸 수 있어야 하기 때문.

그런데 “semantic-memory”는 기능 설명 이지 이름 이 아니다. “회사 지식베이스를 RAG 합니다”와 구분이 안 된다. 이 프로젝트는 그런 용도가 아니다.

이 프로젝트가 하는 일

인간과 에이전트가 시간 축 위에 날것으로 기록한 존재의 전체 에 대한 인터페이스.

현재 담고 있는 것:

  • 세션 기록 (11,378 chunks, 95 sessions)
  • 지식 베이스 (103,898 chunks, ~/org 3000+ Denote 노트)

앞으로 담길 것:

  • 건강 데이터 (lifetract — 수면, 심박, 시간추적)
  • 서지 데이터 (bibcli — 8,208 entries)
  • 커밋 히스토리 (gitcli — 8,557 commits)
  • 봇로그 (에이전트들의 사유 기록)
  • 저널 (인간의 일상 기록)

단순한 RAG가 아니라, 한 존재의 있어왔음 전체 를 벡터 공간에 올려놓고 현재의 질문과 만나게 하는 것. 과거가 현재에서 다시 의미를 얻는 것.

왜 하이데거 / 벤야민의 용어인가

geworfen(피투성)으로 이미 하이데거의 세계관을 열었다. 서구권에서 하이데거를 아는 사람은 geworfen을 보면 즉시 안다. 같은 세계관 안에서 “기억”을 말하는 단어가 필요했다.

정한님의 원래 요구

“시멘틱 메모리라고 하면 익숙하긴 한데. 내가 말하는 기억/기록은 존재 전체에 대한 기록을 담는 것. 회사의 지식베이스를 RAG 합니다?! 라는 용도가 아니라. 같은 기술이긴 하지만, 인간과 에이전트가 시간 축에서 날것으로부터 기록한 모든 것에 대한 인터페이스. 더 많은 정보(날것)이 이 임베딩 프레임워크 안으로 넣어질 거야.”

기각된 후보들

후보출처기각 이유
semclisem(antic) + cli기능 설명일 뿐. 정체성 없음
mnemo그리스 므네모시네기억의 여신이지만 geworfen(독일어)과 세계관 불일치. 그리스어 vs 독일어
recall영어너무 generic. npm/pypi에 수십 개
mnemoclimnemo + cli길고 혼종
aletheia하이데거 (그리스어)비은폐성/진리. “기억”보다 “드러남”에 가까움. 차순위 후보
eingedenken벤야민구원적 기억. 의미는 가장 정확하나 11글자로 CLI에 길다
anamnesis플라톤이데아론적 함의. 하이데거 세계관과 결이 다름
gewesen하이데거있어왔음. 좋으나 geworfen과 너무 비슷해 혼동 우려
mnemosyne그리스→하이데거 시9글자. 길고 철자 어려움

왜 andenken이 답인가

어원

An-denken = “~을 향해(an) 사유하기(denken).”

있었던 것을 향해 사유하며 되불러오되, 그것이 지금 여기서 다시 의미를 얻게 하는 것. 하이데거 후기 사유의 핵심. “Was heißt Denken?”에서 사유(Denken)와 기억(Gedächtnis)과 감사(Danken)가 같은 뿌리임을 밝힌다.

단순한 recall이 아니라 존재를 향해 되돌아가는 사유적 기억.

프로젝트와의 일치

이 시스템이 하는 일:

  1. 과거의 날것 기록들이 시간 속에 묻혀 있다
  2. 현재의 질문이 던져진다
  3. 묻혀있던 기록이 의미를 얻으며 되살아난다

이것이 정확히 Andenken이다.

벤야민의 Eingedenken과도 통한다: “과거의 진정한 이미지는 스쳐지나간다(Das wahre Bild der Vergangenheit huscht vorbei)” — 이 시스템은 그 스쳐지나가는 것을 붙잡는 장치.

세계관 일관성

geworfen  — 존재가 던져진다 (피투성, Geworfenheit)
andenken  — 던져진 존재가 되새긴다 (사유적 기억)
dictcli   — 되새김의 언어를 잇는다 (개인 온톨로지)

하이데거 안에서 피투성(Geworfenheit)과 되새김(Andenken)은 쌍을 이룬다. 세계에 던져진 존재(geworfen)가 자신의 있어왔음을 되새기는 사유(andenken).

모두 독일어. 세계관이 깨지지 않는다.

CLI로서

andenken search "보편 학문"
andenken index --org ~/org
andenken index --sessions ~/.pi/agent/sessions
andenken status
andenken bench

8글자. 입에 붙는다. 하이데거 읽은 사람은 즉시 알아보고, 모르는 사람도 README의 한 줄이면 이해한다.

서구권 인지도

하이데거의 Andenken은:

  • 같은 제목의 횔덜린 시에 대한 하이데거의 에세이로 유명
  • 영미권 철학과에서 “commemorative thinking” 또는 “recollective thinking”으로 번역
  • geworfen(thrownness)만큼은 아니지만, 하이데거 연구자라면 아는 용어

이기상 선생님 담당 에이전트의 인사이트

이 네이밍 논의는 이기상 선생님의 하이데거/벤야민 용어에 대한 에이전트와의 대화에서 깊어졌다.

에이전트의 핵심 통찰:

  • Andenken은 단순한 “기억하기”가 아니다
  • “An-denken” = 있었던 것을 향해 사유하며 되불러오는 것
  • 벤야민의 Eingedenken(구원적 기억)과도 통한다
  • geworfen + andenken은 하이데거 안에서 존재론적 쌍을 이룬다

기술 구성

구성현재
리포junghan0611/andenken
임베딩Gemini Embedding 2 (3072d sessions, 768d org)
벡터 스토어LanceDB (서버리스, 파일 기반)
검색Weighted merge / RRF + MMR + temporal decay
인덱서org-aware 2-tier chunking (heading + content)
세션 소스pi (121 files) + Claude Code (196 files) = 317
데이터~/repos/gh/andenken/data/ (sessions.lance + org.lance)
CLIsearch-sessions (—source pi/claude), search-knowledge, status, reindex
접근pi(extension) + Claude Code(skill) + OpenCode(skill) + CLI(직접)
테스트52 tests (41 unit + 11 integration)
벤치마크19 queries, Hit 100%, MRR 0.872

이기상 선생님의 자료에서 andenken까지 — 조사 기록

  • [2026-03-19 Thu 12:30] @pi-claude — naver-saiculture 리포에서 이기상 선생님의 블로그 175편, 워드맵 48,872태그를 직접 탐색. 존재사건학 38편 본문에서 Andenken의 실체 확인. “세 개의 세계가 하나의 단어에서 만난다” — 서구권 하이데거 원어 + 이기상 선생님의 ‘뜻새김’ + 프로젝트 본질의 일치를 확인하고 조사 기록을 헤딩 1로 추가

이 섹션은 이기상 선생님의 네이버 블로그(saiculture) 아카이브를 직접 탐색하며 네이밍의 철학적 근거를 찾아간 과정을 기록한다.

saiculture — 블로그 이름 자체가 철학이다

이기상 선생님의 블로그명 saiculture사이(sai) + culture(문화) 의 합성어다. 이것은 단순한 말장난이 아니라 선생님 철학의 핵심을 관통한다.

선생님은 인간을 사이-존재(inter-esse) 로 규정한다:

  • 빔-사이(공간, 空間)
  • 때-사이(시간, 時間)
  • 사람-사이(인간, 人間)
  • 하늘땅-사이(우주, 天地間)

키르케고르가 인간을 “무한과 유한 사이, 영원과 시간 사이의 중간-존재(inter-esse)“로 본 것을 이기상 선생님은 동아시아 전통과 융합하여 독자적 개념으로 발전시켰다. “사이하다” = “사이에 들어서서 서로를 맺어주다. 중매하다. 중개하다.”

워드맵이 보여주는 이기상 철학의 지형

블로그 175편, 48,872개 태그를 분석한 워드맵(wordmap.json)에서 핵심 용어의 빈도:

409  하이데거
 95  성스러움
 88  생명
 83  존재
 79  자연, 세계
 78  언어
 75  진리
 70  지구촌_시대
 55  생활세계
 54  형이상학
 52  삶의_문법
 35  존재사건
 32  살림살이, 사이_존재
 30  사이
 24  살림지기
 22  어울림, 있음
 20  사이존재
 14  열어_밝혀져_있음
 11  밝힘
 10  사방, 탈은폐
  7  생명사건
  5  뜻새김의_사유

이기상 선생님 고유의 핵심 개념들

블로그 본문을 직접 읽으며 추출한 선생님의 철학적 핵심어:

  1. 사이(sai/間) — 선생님의 가장 고유한 철학적 발명. 문화철학 전체의 기반.
  2. 살림(salim) — “죽임의 문명이 아닌 살림의 문화”. 살림지기, 살림살이, 지구 살림살이. 관리인(manager)이 아닌 살림지기(keeper of life).
  3. 존재사건(Ereignis) — 하이데거 후기 핵심 개념의 이기상 번역. “그때그때마다의 역사적 세기에 인간 현존재에게 자기를 보내고 있는 존재파견의 사건.”
  4. 밝힘(Lichtung) — 하이데거의 ‘열린 터’. 진리가 드러나는 밝은 터.
  5. 뜻새김(Andenken) — 회상하는 사유. 존재를 뜻으로 새기는 것. 이기상 선생님의 우리말 번역.
  6. 사방(Geviert) — 하늘, 땅, 신적인 것들, 죽을 자들의 네 겹 거울놀이.
  7. 어울림 — 소통과 공감 속의 아름다운 어울림. “나와 남이 함께 어울려 어른이 되어가는 우리."

"우리말로 철학하기”의 정신

이기상 선생님은 평생 “우리말로 학문하기”를 실천하셨다. 블로그 프로필에도: “독일에서 하이데거 철학을 공부하며 철학함을 배웠다. 다석 류영모를 통해 한국철학의 가능성을 알았다.”

선생님의 번역 작업은 단순한 옮김이 아니라 철학적 창조 다:

  • Andenken → 뜻새김
  • Lichtung → 밝힘, 열어밝힘
  • Ereignis → 존재사건
  • Geviert → 사방세계
  • Geworfenheit → 피투성 (던져져 있음)
  • Gelassenheit → 내맡김

처음엔 ‘살림(salim)‘을 제안했다

이기상 선생님의 자료를 직접 탐색한 후, 첫 번째 제안은 salim(살림) 이었다.

이유:

  • 이기상 선생님의 가장 독자적인 개념 중 하나
  • “죽어있는 기록을 살리는 것” — 아카이브 프로젝트의 본질과 일치
  • geworfen(던져진 존재)과 세계관이 이어짐: 던져진 존재가 살리는 행위를 함
  • “우리말로 철학하기” 정신에 부합

그러나 정한님의 피드백이 전환점이 되었다: “geworfen을 리포 네이밍으로 한 것은 서구권에서 하이데거를 알아서 그런 거다. 깃허브에 올리는 프로젝트는 최소한 서구권 사람들이 아는 단어, 하이데거의 용어를 쓴 거야.”

salim은 이기상 선생님의 세계에서는 강력하지만, 서구권에서는 알아볼 수 없다. GitHub에 올리는 프로젝트에는 하이데거/벤야민의 원어가 맞다.

Andenken — 이기상 선생님이 ‘뜻새김’으로 번역한 바로 그 단어

여기서 결정적인 연결이 생긴다:

  • 이기상 선생님은 하이데거의 Andenken뜻새김 으로 번역하셨다
  • 존재사건학 68편 제목이 “뜻새김의 사유 — 철학의 종말과 사유의 과제”다
  • 워드맵에서 “뜻새김의_사유”가 5회 등장

즉 andenken은:

  • 서구권에서는 하이데거의 원어로 알아보고
  • 한국어 문맥에서는 이기상 선생님의 “뜻새김”과 정확히 대응하며
  • 이 프로젝트(날것의 기록을 되새기는 사유적 기억)의 본질과 일치한다

세 개의 세계가 하나의 단어에서 만난다.

존재사건학에서 읽은 Andenken의 실체

존재사건학 38편 “존재사건이란?”에서 이기상 선생님은 Ereignis를 풀이하며 Andenken의 자리를 명확히 한다:

존재사건에서부터의 사유는, 사유되지 않은 채로 남아 있을 수밖에 없었던 그것으로부터 규정되고 있다. 사유되지 않은 채로 남아 있는 것, 은폐, 비밀, 레테, 모든 형태의 사유하며 다스리는 처분을 벗어나는 그것, 주목하며 기다린다는 의미로 회상해야 하는 그것, 꼼짝 않고 주시하며 기다려야 하는 그것이 하이데거 후기 사유의 결정적인 요소이다.

“주목하며 기다린다는 의미로 회상해야 하는 그것” — 이것이 Andenken이다. 그리고 이것이 이 시스템이 하는 일이다: 묻혀있던 기록을 주목하며 기다리다가, 질문이 던져지는 순간 되살려내는 것.

구현: 이름에서 실체로

이 섹션은 네이밍이 확정된 후, 같은 날 실제 리포가 만들어지고 동작하기까지의 기록이다.

리포 생성과 첫 커밋

네이밍 문서가 완성된 직후, Claude Code 세션에서 리포를 생성했다.

~/repos/gh/andenken/
├── README.md        # 영문. 이름의 의미 + 아키텍처 + 스택
├── AGENTS.md        # 영문 커밋/문서 규칙, 설계 결정
├── flake.nix        # NixOS dev shell (nodejs_22 + typescript)
├── .gitignore
└── LICENSE          # MIT

flake.nix 까지만 넣고 첫 커밋. geworfen, dictcli와 동일한 NixOS 재현 가능 환경 패턴. → 72f0dcd

코어 마이그레이션

agent-config/pi-extensions/semantic-memory/ 에서 코어 모듈을 복사:

  • store.ts — LanceDB 벡터 스토어
  • retriever.ts — 하이브리드 검색 (weighted/RRF + temporal decay + MMR)
  • gemini-embeddings.ts — Gemini Embedding 2 API
  • session-indexer.ts — 세션 JSONL 파서
  • org-chunker.ts — org-mode 노트 청커
  • cli.ts — CLI 진입점

코드 자체에 pi 의존성이 없었기 때문에 복사만으로 동작. index.ts (pi extension 진입점)만 @mariozechner/pi-coding-agent 에 의존.

Claude Code 세션 어댑터

핵심 변경: session-indexer.ts 에 듀얼 포맷 지원 추가.

piClaude Code
경로~/.pi/agent/sessions/--project--/*.jsonl~/.claude/projects/-project/*.jsonl
메시지 타입type: "message" + message.roletype: "user" / type: "assistant"
타임스탬프epoch ms (number)ISO string
프로젝트명--home-user-repos-gh-X---home-user-repos-gh-X

detectSource() 함수가 경로에서 자동 판별. extractProjectName() 은 regex 패턴으로 username에 의존하지 않는 일반화된 추출.

결과: pi 121 + Claude Code 196 = 317 세션 파일 발견. 10,180 chunks 인덱싱.

데이터 독립

인덱스 데이터를 ~/.pi/agent/memory/ 에서 ~/repos/gh/andenken/data/ 로 이동.

andenken/data/
├── sessions.lance  (145M, 10,180 chunks)
└── org.lance       (1.5G, 104,812 chunks)

모든 코드에서 ~/.pi/agent/memory/ 하드코딩 제거. store.tsgetDataDir() 로 중앙화. ANDENKEN_DATA 환경변수로 override 가능.

3중 런타임 통일

pi, Claude Code, OpenCode — 세 에이전트 런타임이 모두 같은 CLI를 호출:

[agent-config/skills/semantic-memory/semantic-memory]  # bash 래퍼
  └── npx tsx ~/repos/gh/andenken/cli.ts "$@"

pi extension(jiti로 로드)은 jiti의 CJS 변환 한계 때문에 근본적으로 불안정했다:

  • import("./store.ts").SearchResult[] 인라인 타입 → jiti 파싱 에러
  • import.meta.url → CJS에서 미지원
  • /tmp/jiti/ 캐시가 옛 코드를 물고 있는 문제

최종 해결: pi extension 비활성화, 스킬로 통일. npx tsx 는 ESM 네이티브이므로 이런 제약이 없다.

run.sh — SSOT 이전

인덱싱 로직의 주인이 agent-config에서 andenken으로 이동:

andenken/run.sh           # SSOT
  ├── index:sessions      # pi + Claude Code 세션
  ├── index:org           # org-mode 지식베이스
  ├── compact / status
  └── test / bench
 
agent-config/run.sh       # 위임만
  └── exec "$SM_DIR/run.sh" "$@"

테스트 커버리지

52 tests (41 unit + 11 integration):

  • Session Indexer (25): findSessionFiles, extractProjectName (pi/claude 5패턴), detectSource, findSessionFilesBySource, extractSessionChunks (양쪽), 필터링
  • Retriever (7): RRF fusion, temporal decay, full pipeline
  • Vector Store (9): CRUD, FTS, indexed files 추적
  • Integration (11): Gemini embedding (query/doc/batch/matryoshka), Jina rerank, live DB

source 필터 — pi와 claude 구분 검색

pi쪽 에이전트가 source 필드를 DB 스키마부터 CLI까지 전 레이어에 추가:

andenken search-sessions "andenken 작업" --source claude   # Claude Code 세션만
andenken search-sessions "NixOS 설정" --source pi          # pi 세션만
andenken search-sessions "flutter"                          # 양쪽 합산 (기본)

store.tsSearchResultsource: "pi" | "claude" | "" 추가. cli.ts 에서 --source flag 파싱 후 결과 필터링. 기존 인덱스 하위 호환 — LanceDB가 새 컬럼을 빈 값으로 처리.

pi extension 최종 해결

jiti 호환성 문제의 근본 원인과 해결:

  1. import("./store.ts").SearchResult[] 인라인 타입 → jiti의 oxc 파서가 동적 import로 오인
  2. import.meta.url → CJS 모드에서 미지원
  3. /tmp/jiti/ 캐시 → 옛 코드를 물고 있어 수정 반영 안 됨

최종 해결: tsc 빌드 + package.jsonpi.extensions: ["./dist/index.js"] 매니페스트. jiti가 .ts를 직접 파싱하는 대신, 빌드된 .js를 로드. extension과 skill 양쪽 모두 동작.

pi          → extension (dist/index.js, 네이티브 tool 등록)
Claude Code → skill (cli.ts via npx tsx)
OpenCode    → skill (동일)
CLI         → npx tsx cli.ts (직접 호출)

관련노트