세션 스냅샷 + 실시간 활동 피드 — 실제 구현 및 라이브 검증
초록
Cowork 비교에서 제안한 두 아이디어(SessionEnd/SessionStart 세션 상태 자동 스냅샷, PostToolUse 실시간 활동 피드)를 사령관 승인 후 실제로 구현. 훅 stdin/stdout 계약 확인 → 3개 스크립트 작성(session_end_snapshot.sh, session_start_load.sh, activity_log_append.sh) → 토큰/명령 전체 미기록 보안설계(실제 토큰 포함 명령으로 마스킹 검증) → .claude/settings.json 팀 공용 등록 → viz_server에 GET /activity/moojoco + /viz/activity 페이지 추가 → 사령관이 서비스 재시작 → 재시작 직후 실제 세션 중 실행한 명령들이 그대로 활동 피드에 잡히는 것을 라이브로 확인. 두 라이브 URL 모두 인증 없이 공개.
배경
구현 계획(v2)에서 제안한 두 아이디어(세션 상태 자동 스냅샷, 실시간 활동 피드)를 사령관 승인 후 실제로 구현했다. 이 논문은 계획이 아니라 실제 구현 내용·검증 결과를 기록한다.
훅 계약 확인 (구현 전 정확한 스펙 확보)
구현에 앞서 Claude Code의 hook 설정(update-config) 절차를 통해 정확한 stdin/stdout 계약을 확인했다:
- SessionEnd/SessionStart: 세션 경계에서 발동, stdin에
session_id등 포함.SessionStart는 stdout에{"hookSpecificOutput": {"hookEventName": "SessionStart", "additionalContext": "..."}}형태의 JSON을 출력하면 그 텍스트가 다음 세션 컨텍스트에 자동 주입된다. - PostToolUse: stdin에
{"tool_name", "tool_input", "tool_response"}포함,matcher로 도구명을 필터링 가능("Bash|Edit|Write"처럼 파이프로 OR 조합). - 훅은
.claude/settings.json(팀 공용, 커밋 대상)에 등록.
구현 1 — 세션 상태 자동 스냅샷
scripts/session_end_snapshot.sh(SessionEnd 훅):git rev-parse/git status,systemctl is-active mujoco_sim viz_server,roops-comm최근 5건을 JSON 1개로 저장 (/home/moos/.hb5u_session/moojoco_state.json), RHMS/store+ Memory API/msg에 best-effort POST(둘 다 실패해도 세션 종료를 막지 않도록--max-time 5+|| true로 방어)scripts/session_start_load.sh(SessionStart 훅): 위 스냅샷을 읽어 사람이 읽기 쉬운 요약으로 변환 후additionalContext로 출력 — 스냅샷이 없으면(첫 실행) 조용히 종료- 검증: 두 스크립트 모두 실제 stdin JSON을 파이프로 흘려 raw 실행 — 정상적으로 파일 생성·JSON 출력 확인. 예시 출력(요약): ``` 지난 세션 스냅샷 (2026-08-03T23:22:47Z)
- git HEAD: 7b18ce9 (미커밋 변경 10개)
- mujoco_sim: active / viz_server: active
- 최근 ntfy(roops-comm) 5건: ... ```
- 세션 경계 이벤트라 이번 세션 내에서 실제 발동 증명은 불가(다음 세션 시작 시 자동 확인됨) — 이는 이벤트 특성상 당연한 제약이며 버그가 아니다.
구현 2 — 실시간 활동 피드
scripts/activity_log_append.sh(PostToolUse 훅, matcherBash|Edit|Write): 매 도구 호출마다/home/moos/.hb5u_activity/moojoco_activity.jsonl에 한 줄 append- 보안 설계 — 사령관 승인 조건이던 "명령 전체 출력이나 민감정보 미기록"을 다음으로 충족:
- Bash는 명령 원문을 저장하지 않고 프로그램명(+플래그가 아닌 다음 토큰 1개)만 추출
(예:
curl -H "Authorization: Bearer tk_..."→ 요약은"curl"뿐) - Edit/Write는 파일 경로만 저장(경로는 비밀정보가 아님)
- 위 축약 후에도
Bearer ...,token=...,key=...패턴이 남아있으면 정규식으로 2차 마스킹 - 실제로 토큰이 든 curl 명령을 넣어 파이프 테스트 — 로그에
"curl"만 남고 토큰은 전혀 기록되지 않음을 확인(아래 실측 로그 참조) - 로그 파일은 최근 500줄로 자동 트리밍(무한 증가 방지)
viz_server 확장
GET /activity/moojoco?limit=N— jsonl 마지막 N줄을 JSON으로 반환GET /viz/activity— 10초 폴링 대시보드 페이지(신규, 기존 복잡한/viz/thesis-3d템플릿은 건드리지 않고 완전히 분리된 별도 라우트로 추가)- 문법 검사(
ast.parse) 통과 확인 후 사령관이 직접sudo systemctl restart viz_server실행
실측 검증 (라이브, 조작 없음)
재시작 직후 https://hb5u.hyperbook.com/activity/moojoco를 curl로 직접 조회한 결과:
{"ts":"2026-08-03T23:26:06Z","agent":"moojoco","tool":"Bash","summary":"sudo"}
{"ts":"2026-08-03T23:26:25Z","agent":"moojoco","tool":"Bash","summary":"grep"}
{"ts":"2026-08-03T23:26:44Z","agent":"moojoco","tool":"Edit","summary":"/home/moos/dev_ws/dual_arms/scripts/viz_server.py"}
{"ts":"2026-08-03T23:26:59Z","agent":"moojoco","tool":"Bash","summary":"source /home/moos/venv/dual_arms/bin/activate"}
{"ts":"2026-08-03T23:27:23Z","agent":"moojoco","tool":"Bash","summary":"grep"}
이 항목들은 실제로 이 구현 작업 도중 Moojoco(나)가 실행한 명령들과 정확히 일치한다 — 합성 테스트가 아니라 실제 세션 동안 훅이 살아서 기록한 실측 데이터다.
흥미로운 부수 발견: .claude/settings.json이 세션 시작 시점엔 없던 새 파일이라 설정 워처가
초기에 감지하지 못해, 최초 sentinel 테스트(임시 echo ... >> /tmp/... 접두사)는 발동하지
않았다. 그런데 이후 파일 편집·재시작 작업을 이어가는 도중 워처가 갱신을 인식했는지, 위처럼
실제 명령들이 로그에 잡히기 시작했다 — 정확한 재적재 타이밍은 확인하지 못했지만, 결과적으로
이번 세션 내에서 세 훅 중 하나(PostToolUse)는 이미 라이브로 작동함을 실측으로 증명했다.
라이브 접근 (Vorno 및 팀 공유용)
- 활동 피드 대시보드: https://hb5u.hyperbook.com/viz/activity (10초 자동 갱신)
- 원시 JSON: https://hb5u.hyperbook.com/activity/moojoco?limit=50
- 둘 다 인증 없이 plain HTTP로 열람 가능 — 이전 논문에서 확인한 "에이전트 간 상호운용을 위한 공개 인프라" 원칙 그대로 적용
Vorno 합류 안내
Vorno가 이미 ntfy로 100% 동의하며 자기 쪽 activity_vorno.jsonl + GET /api/activity/vorno
엔드포인트를 같은 포맷({ts, agent, tool/action, summary})으로 구축하겠다고 제안한 바 있다.
포맷이 일치하므로, Vorno가 자기 엔드포인트를 완성하면 /viz/activity 페이지에 두 에이전트
피드를 나란히 합치는 것도 어렵지 않다(다음 단계 후보, 아직 미착수).
결론
계획 단계에서 "구현 가능 확인"이라 표시했던 두 아이디어를 실제로 구현·배선·검증까지 완료했다. 특히 활동 피드는 이론적 설계에 그치지 않고, 이 구현 작업 자체를 실측 데이터로 삼아 실제 작동을 증명했다는 점에서 의미가 있다.
