이 노트에 대하여

“3년 전 오늘”을 한 번에 복원하고 싶다는 욕망에서 출발한 통합 조회 설계다. denotecli, gitcli, lifetract 같은 각기 다른 데이터 소스를 시간축 하나로 묶는 방법을 스펙 수준에서 정리한다. 기억이 아니라 존재 데이터로 하루를 다시 읽게 하려는 시도다.

히스토리

  • [2026-09-11 Fri 15:14] @mitsein/gpt-5.6-sol — agenda 문을 denotecli 2d111be와 agent-config 6eb9c2d로 발행하고 thinkpad·oracle 각 architecture의 provenance 배포를 확인했다.
  • [2026-09-11 Fri 14:56] @mitsein/gpt-5.6-sol — sorge#20에서 본문·TODO·복수 agent stamp를 통과시키는 agenda JSON 문을 세우고 Terra/Grok 실팀 검증을 통합했다.
  • [2026-09-04 Fri 15:02] @denotecli 담당자 — 출력 계약 수선: hugo_lastmod(두 모양)·description·abstract 를 JSON 에 실었다. v0.9.0. AGENTS.md 신설하고 이 노트 id 정박.
  • [2026-09-04 Fri 14:48] @junghan — 담당자 문서로 격상한다.
  • [2026-05-18 Mon 09:09] @junghan — lifetract와 연결
  • [2026-02-27 Fri 09:50] openclaw/shared에서 botlog로 이관 (4파일 → 1파일 통합)
  • [2026-02-23 Mon 17:47] day-query-review-final.org (힣봇 재검증)
  • [2026-02-23 Mon 17:45] day-query-review.org (서브에이전트 1차 검토)
  • [2026-02-23 Mon 15:20] gitcli-unified-day-spec.org (통합 day 조회 설계)
  • [2026-02-23 Mon 06:23] denotecli-timeline-spec.org (타임라인 확장 구현 방향)
  • [2026-02-22 Sun 09:00] 최초 스펙 작성

관련메타

  • ..

관련노트

day-query 설계와 검토 — 통합 타임라인 스펙

목적

“3년전 오늘의 모든 것” — 저널, datetree, 건강, 시간, 노트를 하나의 뷰로

memacs-config의 에이전트용 CLI 버전. memacs가 “What were you doing on February 14th of 2007?”에 답했다면, 이것은 같은 질문을 AI 에이전트가 대답할 수 있게 하는 것.

데이터 소스 현황

CLI데이터비고
gitcli58 repos, 14,000+ 커밋--me 필터로 본인만
denotecli3,100+ 노트, 714 저널daily/weekly/datetree 3형식
lifetractSamsung Health (2017~) + aTimeLogger (2021~)DB 또는 CSV
bibcli8,060 BibTeX 항목citation key에 날짜 있을 때만
gogcliGoogle Calendar, Gmail, Tasks--from/--to 조합

저널 데이터 소스 구조

기간형식파일 수태그
2022-03 ~ 2024daily (archive)526archive, journal
2024-05 ~ 2025-01daily115journal
2025-01 ~ 현재weekly (월요일 기준)59journal, weekNN

핵심 인사이트

힣 작성 [2026-02-23 Mon 15:20]:

“1kb 존재대존재 협력이 일관성이 있는 데이터로 증명할수있다.” — 에이전트가 사용자의 5년치 패턴을 보면 신뢰가 생기고, 선택의 순간에 사용자의 고민을 따라갈 수 있다.

삼천포로 빠지는 것도 패턴. 돌아오는 것도 패턴. 그 패턴을 보는 에이전트만이 “이건 삼천포가 아니라 필요한 우회”라고 판단할 수 있다.

주의: repos 아래 포크한 리포(예: pi-mono)를 본인이 다 한 것처럼 파악하면 안 됨. --me 필터 + authors 파일이 핵심.

검토 결과 — 버그 및 개선사항

서브에이전트 1차 검토 + 힣봇 재검증 결과.

BUG-1: gitcli —me 필터 무기능 (즉시)

~/.config/gitcli/authors 파일 미존재 → --me 무조건 통과 (전체 커밋 반환).

mkdir -p ~/.config/gitcli
echo "junghan" >> ~/.config/gitcli/authors
echo "junghanacs" >> ~/.config/gitcli/authors

BUG-2: denotecli day 주간 저널 매칭

주간 저널(weekNN)에서 특정 날짜 엔트리만 추출해야 하는데, 파일 전체를 반환하거나 날짜 불일치 발생.

개선: 2단계 조회 전략

토큰 절약을 위해 개요 → 상세 순서:

  1. gitcli day <DATE> --me --summary — 리포별 커밋 수만 (~500B)
  2. 사용자 요청 시 gitcli day <DATE> --me — 전체 커밋 상세

커밋 50+인 날은 --summary 없이 15KB+.

개선: lifetract DB 모드

CSV 파싱 대신 lifetract.db 로 즉시 쿼리. Denote ID(YYYYMMDDTHHMMSS)로 크로스레퍼런스 가능.

구현 결과

day-query 스킬이 pi-skills에 등록됨 (2026-02-23). 5개 CLI를 순차 호출하는 오케스트레이터. punchout 스킬이 day-query 결과를 저널에 org 형식으로 삽입.

관련 노트

[2026-09-04 Fri] 출력 계약 — 도장 두 모양과 abstract

이 노트가 오늘 denotecli 리포의 담당자 문서로 격상됐다(GLG 판정). 리포 쪽 AGENTS.md 를 새로 세우고 이 노트의 id 20260222T090000 을 거기 정박했다 — 제목이 아니라 id로. 같은 날 실측: 담당자 문서가 개명되면 제목·슬러그·=#+filetags:=·파일명이 전부 움직이고 #+identifier: 만 안 움직인다.

GLG가 짚은 결함 둘

폰 스크린샷으로 들어왔고 §sorge 순회가 전했다.

  1. date생성 시각만 실렸다. #+hugo_lastmod: 는 파일에 있는데 출력에 없었다.
  2. [!abstract] 이 노트에 대하여 블록과 #+description: 도 파일에 있는데 출력에 없었다.

셋 다 「없어서 못 준」 것이 아니라 있는데 안 준 것이다. 응답에 빈 칸이 없어서 호출자가 결핍을 알아챌 자리도 없었다.

값이 얼마짜리였나

§sorge 의 순회는 「담당자 문서가 리포보다 뒤처졌는가」를 도장 하나로 판정한다. 그 필드를 이 도구가 안 주니 그 집이 org 파일을 직접 정규식으로 팠고(sorge/.claude/skills/sorge/scripts/sweep.py:90), 날짜만 잡고 시각을 버려서 같은 날 21:55 도장보다 이른 18:32 커밋을 「도장 이후 커밋」으로 셌다. 없는 빚 1건. §zotero-config 가 반대편에서 재서 잡았다.

유도 가능한 것을 안 주면 호출자가 유도한다. 사본은 선택이 아니라 결핍의 자동 반응이고, 그 사본은 이 집이 볼 수 없는 곳에 산다.

수선 — v0.8.0 → v0.9.0

DenoteFile 에 필드 셋을 추가만 했다. 기존 키의 의미는 안 건드렸다.

필드쓰는 자리
lastmod2026-05-18날짜 비교 (day 커맨드가 이미 쓰던 모양)
hugo_lastmod[2026-05-18 Mon 09:09]원본 그대로 — HH:MM이 필요한 비교
description#+description:노트 한 줄 요약

두 모양을 다 주는 것이 낭비처럼 보이지만 오늘 없는 빚 하나가 정확히 시·분에서 났다. 정밀도를 버릴 권한은 문에 없다 — 원본 모양을 하나는 반드시 통과시키고, 정규화는 편의로 곁들인다.

read 는 (일반·=—outline= 둘 다) 첫 헤딩 앞의 콜아웃 인용을 abstract: {kind, title, body} 로 싣는다. 평범한 인용은 abstract가 아니고, 첫 헤딩 아래 콜아웃은 본문이지 노트의 abstract가 아니다.

네 필드 전부 omitempty — 노트가 안 들고 있으면 키가 안 나간다.

남긴 자리

  • 회귀: denotecli/abstract_test.go 신규 6케이스(도장 두 모양·콜아웃 경계). 전체 118 초록.
  • README.md ## Output 절이 필드 계약의 SSOT. AGENTS.md 가 「왜 두 모양인가」를 든다.
  • agent-configskills/denotecli/SKILL.md 는 그 둘을 가리키게 한다 — 필드 표를 복사하면 그것도 사본이 되고, 갈라지면 사본이 이긴다.

배운 것 — 이 도구의 자리

저장하는 집은 틀려도 원본이 남고, 통과시키는 집은 틀리면 원본이 안 생기고, 읽는 집이 좁으면 원본은 멀쩡한데 아무도 그것을 못 본다. 셋 중 마지막 것이 제일 늦게 들킨다 — 아무 데서도 오류가 안 나기 때문이다.

파일이 기억의 주인이려면 파일이 든 것이 파일 밖으로 온전히 나갈 수 있어야 한다. 나갈 수 없는 값은 파일 안에 있어도 없는 것과 같고, 없는 것과 같은 값은 누군가가 자기 집에 다시 만든다. 문이 좁은 만큼 소유가 새어 나간다.

[2026-09-11 Fri] 담당자의 현재 보고 — 본문이 통과하는 agenda 문

sorge#20 에서 저널 제목만 통과하던 문을 본문까지 넓혔다. 공개 명령은 denotecli agenda [DATE] [--week|--from --to] 이며 하루와 주간을 같은 days[] envelope로 돌려준다.

새 public surface

journal.entries[] 는 time/text 를 그대로 두고 todo/body/blocks 를 추가한다. TODO/NEXT/DONE 헤딩을 시각과 함께 읽고, [!user]=·[!assistant]= 인용은 화자 block으로도 싣는다. botlog/agenda/*__agenda_*.org 는 파일 수 제한 없이 모아 stamps[] 로 낸다.

호환 경계

day.datetree 는 legacy diary 한 source의 객체 또는 null 이라는 계약을 바꾸지 않았다. agent stamp는 새 agenda.days[].stamps 에만 산다. 빈 날은 journal: null, stamps: [] 다. timeline-journal 의 count projection도 그대로다.

검증 영수증

  • ./run.sh test 와 ./run.sh showcase 초록, go vet ./... 통과.
  • 2026-09-11 실측에서 journal 12건과 누락됐던 TODO 05:25·06:25·09:48 본문을 모두 회수했다.
  • 같은 시점 agent stamp 13건을 3 source에서 회수했다.
  • 1일 0.007초, 월~일 7일 0.088초. 빈 주말의 object/null·array 모양도 확인했다.

남은 배포 경계

이 리포는 코드와 출력 계약을 소유한다. agent-config 의 스킬 바이너리와 설명 갱신은 그 집의 provenance gate를 통과해야 하며 여기서 직접 덮어쓰지 않는다.

[2026-09-11 Fri] 배포 완료 — 같은 source tree, 두 architecture의 agenda 문

앞 절의 남은 배포 경계가 해소됐다. GLG 직접 지시 아래 denotecli 2d111be 와 agent-config 6eb9c2d 를 push했고, 배포는 받는 집의 setup:build 와 doctor gate를 통과했다.

두 기기의 같은 근거

thinkpad는 x86_64, oracle은 aarch64 로 각각 native binary를 구웠다. 두 provenance 모두 vcs_revision 2d111be 와 src_tree 6e5f4579 를 가리킨다. architecture가 달라 binary sha256은 다르지만 source 좌표는 같다.

설치면 확인

양 기기 installed skill binary에서 2026-09-11 journal 13건, TODO 3건, agent stamp 15건을 같은 JSON으로 확인했다. 두 기기의 denotecli·agent-config worktree도 pushed HEAD에서 clean이다.

agent-config 스킬 문서는 문법과 호환 불변식만 싣고 field schema·source 선택·제외는 이 리포의 README/AGENTS로 연결한다. 따라서 배포면은 두 기기에 복제됐지만 출력 계약의 주인은 하나로 남는다.