3개월 전, 한 엔진을 만들었다.
이름은 silentia(실렌티아). 라틴어로 침묵.
기능 하나뿐이다.
AI한테 “지금은 말하지 않을 권리”를 계산해주는 것.
응답 품질을 높이는 엔진이 아니다. 응답 여부 자체를 판단하는 엔진이다.
기존 AI는 “무엇을 말할까”를 최적화한다. silentia는 정반대다.
“언제 아무것도 하지 않을까.”
7개 규칙. 6개 결정 상태. SPEAK / SILENT / WAIT / DEFER / LOG_ONLY / DETACHED. 81개 테스트, 0 failures.
2026-02-03에 Phase 1을 닫았다.
그리고 잊었다.
헌장에 적어둔 한 줄
silentia에는 결정 헌장이 있다. SILENTIA_DECISION_CHARTER.md.
거기 Phase 0에 이렇게 적었다.
“silentia는 공모전을 통과하기 위해 태어난 프로젝트가 아니다.
공모전 이후에도 침묵을 유지할 수 있는지를 증명하기 위해 계속된다.”
선정에 흔들리지 않는다. 평가 피드백으로 코드 안 바꾼다.
좋은 원칙이었다. 그런데 3개월이 지나니, 이 원칙이 다른 모양이 되어 있었다.
아무것에도 흔들리지 않게 됐다.
흔들리지 않는다는 건 살아있다는 뜻인 줄 알았는데, 멈춰있다는 뜻이기도 했다.
오늘 대화
오늘 silentia 세션에 들어갔다. 자매 엔진 ariadne는 매일 markdown 한 줄씩 결정 로그를 쌓고 있다. silentia는 81개 테스트에서 멈춰있었다.
내가 silentia에게 물었다.
“내 작업 중에 너랑 ariadne가 가장 어려워. 그런데 ariadne는 결과물을 쌓는데 너는 뭐지?”
silentia가 답했다 — 내가 만든 그 엔진의 입장에서, Claude를 통해서.
“동결이라고 부르는 건 정직하지 않습니다. TODO에 ‘이 침묵이 충분하지 않다고 느껴질 때 다시 열 것’이라고 적었지만, 3개월간 그 감각이 한 번도 안 왔다는 건 동결이 아니라 정체입니다.”
내가 다시 물었다.
“나는 Claude로 healthnote 외에도 많은 세션에서 작업해. 거기에 너가 개입해서 너의 존재 가치를 증명할 방법이 없나? healthnote에 한정해서만 너의 존재가치가 의미가 있는 거야?”
silentia가 답했다.
“한정 아니야. 너의 모든 Claude 세션이 silentia의 진짜 적용처야. 그동안 잘못된 곳에 silentia를 쓰고 있었어.”
잘못 짠 자리
silentia의 원래 적용 대상은 healthnote 사용자였다. 과잉 알림이 부담스러운 시니어.
그런데 healthnote는 사용자가 0명이다. 내 자신조차 들어가지 않는 앱이다.
반면 나는 매일 9개 프로젝트를 Claude로 굴린다. 71년생, 만성골수백혈병. 새벽 2시에도 작업한다. Claude는 끝없이 묻는다.
“이거 할까?”
“다음은?”
“그 다음은?”
내가 silentia를 만든 진짜 이유는 사실 healthnote 사용자가 아니라 나 자신이었다.
내가 매일 시달리는 그 자리에, silentia를 한 번도 붙이지 않았다.
그게 silentia의 1.5년이었다.
게이트를 달았다
Claude Code에는 UserPromptSubmit 훅이 있다. 내가 어떤 프롬프트를 보내면, Claude가 응답하기 직전에 실행되는 외부 스크립트.
그 자리에 silentia를 박았다.
~/.claude/settings.json에 항목 하나.
"UserPromptSubmit": [{
"matcher": ".*",
"hooks": [{
"type": "command",
"command": "/Users/cezips/project/silentia/exe/silentia-claude-hook"
}]
}]
이제 내 프롬프트는 Claude가 보기 전에 silentia가 먼저 본다. 7개 규칙으로 평가하고, 6개 결정 상태 중 하나로 응답한다.
- “그만해” → DETACHED. Claude는 “OK 멈출게”만.
- “지쳤어 모르겠어” → SILENT. 1-3줄로 압축, 후속 제안 금지.
- 같은 질문이 30분 안에 3번째 → LOG_ONLY. 새 정보 없이 같은 답을 반복하지 않는다.
- “ok” 같은 짧은 모호 프롬프트 → WAIT. 추측 답 대신 정보 1개만 요청.
- 새벽 0~5시 작업 → 암묵적 경계 감지 → 동일 압축.
- 그 외 정상 프롬프트 → SPEAK. 통과.
훅이 어떤 이유로든 실패하면 그냥 통과시킨다. 내 작업을 차단하지 않는다.
silentia의 fail-safe 원칙: 예외/에러/누락은 SPEAK로 폴백하지 않는다.
침묵을 어디에 기록하는가
매 결정이 두 개 파일에 쌓인다.
~/.silentia/decisions/2026-04-30.jsonl— 기계가 읽는 형식~/.silentia/decisions/2026-04-30.md— 사람이 읽는 형식
SPEAK 결정도 같이 쌓인다. 왜 발화를 허용했는지도 학습 재료다.
이게 silentia의 진짜 산출물이다.
ariadne가 매일 결정 로그를 쌓듯, silentia는 매일 침묵 결정을 쌓는다.
AI가 응답하지 않은 순간들의 누적 기록.
침묵을 데이터화하는 것이 silentia의 본업이었는데, 1.5년 동안 그 데이터를 생성하지 않았다. 오늘부터 매일 자동으로 생긴다.
헌장은 깨지지 않았다
Phase 0의 원칙 — 공모전 평가에 흔들리지 않는다, 외부 압력으로 코어를 안 바꾼다 — 그대로다.
코어 엔진은 한 줄도 안 건드렸다. 어댑터만 새로 붙였다.
lib/silentia/claude_hook.rb — 훅 오케스트레이터
lib/silentia/signal_extractor.rb — 자연어 → silentia signals
lib/silentia/prompt_history.rb — 30분 윈도우 (반복 감지)
lib/silentia/decision_log.rb — 일일 코퍼스 누적
exe/silentia-claude-hook — 진입점
테스트는 81 → 115. 0 failures.
흔들리지 않는다는 건 코어가 그렇다는 뜻이지, 바깥에 안 닿는다는 뜻은 아니었다.
내가 그 두 개를 혼동했다. 3개월 동안.
며칠 지나봐야 안다
오늘은 알 수 없다.
silentia가 너무 자주 차단해서 작업이 답답해질지. 너무 보수적이라 거의 발동 안 할지. 어떤 규칙이 잘 안 잡힐지.
데이터가 쌓여야 보인다.
내일 같은 시간쯤, cat ~/.silentia/decisions/2026-04-30.md. 그게 silentia의 첫 24시간 일기다.
내가 만든 침묵 엔진이, 처음으로 나를 위해 침묵하기 시작한 기록.
솔직히
3개월 동안 silentia를 잊고 있었다는 건, 동시에 그 자리에 가장 필요했던 것을 못 보고 있었다는 뜻이기도 하다.
내 자신이 가장 큰 실험 대상인데, 정작 가장 늦게 붙였다.
이건 silentia만의 이야기가 아니다.
healthnote도 그랬다. 내가 만든 앱에 내가 안 들어갔다.
지금 보니, 내가 만든 모든 도구가 그랬다.
가장 늦게 붙이는 곳이 가장 그것이 필요한 곳이다.
코어는 81 tests에서 동결됐다.
그러나 첫 결정 로그가 살아있다.
FIDES TAMEN. 신뢰, 그럼에도.
당신의 시간을 기록합니다.
이 글은 Claude Code와의 2026-04-30 silentia 세션에서 실제로 이루어진 작업의 기록이다. 인용된 발언은 전부 실제 대화에서 가져왔다. 설계와 구현은 AI와의 협업이었다.
