에이전트에게 규칙을 써주는 건 쉽다. 문제는 그 규칙이 실제로 지켜지게 만드는 것이다. 지켜야 하는 규칙을 만질 수 있는 존재가, 바로 그 규칙을 고칠 수 있다면 그건 규칙이 아니라 희망사항이다.

앞서 ‘에이전트의 뇌를 7개 레이어로 쌓은 방법’에서 이야기했듯, p-layers는 기억을 P0부터 P6까지 7개 레이어로 나눈다. 각 레이어는 명확한 직함과 권한이 있다. P0(규칙)은 오직 시스템만 만질 수 있고, 어떤 주체가 어느 레이어에 쓰려는지는 매번 쓰기 시점에 검사된다. 권한이 없으면 쓰기는 거부되고, 그 거부조차 감사 로그에 남는다.

0.7.0은 두 가지를 더했다: P0 승인 게이트와 드리프트 리포트

P0 게이트 — 규칙의 변경은 제안과 승인을 거친다

규칙을 바꾸고 싶으면 먼저 제안(propose)한다. 사람이 승인(approve)해야만 적용(apply)할 수 있고, 승인 전에 적용을 시도하면 시스템이 거부한다. 코드에는 이게 ‘human gate’라는 이름으로 박혀 있다.

흐름은 단순하다: propose → approve → apply. 승인 전 apply 시도는 거부된다. 그리고 apply는 멱등이다. 이미 적용된 규칙은 다시 실행해도 중복으로 들어가지 않는다. “승인된 규칙을 두 번 쓴다”는 실수 자체가 설계에서 사라졌다.

drift-report — 기억의 건강검진

메모리는 감춰져서 문제다. 쌓이고 있는지, 줄어들고 있는지, 죽어 있는지 모른다. drift-report는 매주 지식·에피소드·엔티티·관계·규칙 수와 P0 게이트 상태를 baseline과 비교해 리포트를 쓴다. 변화 없음(no change)과 실패(failure)를 구분한다. 아무 일도 없다는 것과, 죽었다는 것은 다르다.

검색 품질 = 토큰 효율

기억의 가치는 회상(recall)에서 나온다. 필요한 지식 조각만 컨텍스트로 로딩하는 것 — 이것이 에이전트 토큰 효율의 정수다. 전체 덤프는 기억이 아니라 지출이다. p-layers는 FTS5와 시맨틱 검색을 RRF로 융합하고, 대체된(superseded) 항목을 제외한 뒤 신뢰도×신선도로 랭킹한다.

2분 안에

pip install p-layers
export P_LAYER_DB=~/.p_layer/memory.db
p-layer remember "PortOne v2로 결제를 바꿨다" --type decision

MCP 설정도 블록 하나면 끝이다. Claude든 Cursor든, 그 뒤로 에이전트는 ‘쓰여만 있는’ 규칙이 아니라 ‘지켜지는’ 규칙과 함께 살아간다.