AI 활용 노트Last reviewed · 2026-10← 목록

두 번째 AI에 같은 작업대를 옮기다

Claude Code에 붙여 쓰던 기억, 가드, 알림을 OpenAI Codex에도 옮겨 붙였다. 옮기는 일보다 옮긴 것이 정말 도는지 확인하는 일이 더 컸다. 그 구조를 적었다.

1새로 만들지 않고 연결한다

Codex에도 훅이 있고, 규약이 Claude Code와 거의 같다. 그래서 장치를 다시 짜지 않고 어댑터 하나를 사이에 끼웠다.

Codex

이벤트 발생

세션 시작, 질문 제출, 도구 실행 전후, 권한 요청, 답 끝남, 대화 압축 전, 세션 종료의 8종.

어댑터

dispatch

Codex의 훅 설정에는 이 스크립트 하나만 걸려 있다. 모든 이벤트가 여기로 들어온다.

배선표

어느 장치로

설정 파일 한 장이 "이 이벤트는 이 스크립트로"를 정한다. 알림, 기억 가드, 주입이 각각 한 줄씩이다.

기존 장치

그대로 실행

Claude Code가 쓰던 스크립트를 그대로 부른다. 입력 모양이 다른 곳만 어댑터가 맞춰 넘긴다.

응답

돌려주기

스크립트가 낸 결과를 Codex가 읽는 출력 형식으로 바꿔 돌려준다.

장치 본체는 한 벌이다. 알림 문구를 고치면 두 도구 모두에 한 번에 반영된다. 도구마다 사본을 두면 언젠가 한쪽만 고치게 되고, 그 순간부터 두 도구가 서로 다르게 움직인다. 어댑터에는 번역만 두고 판단은 넣지 않았다. 어떤 쓰기를 막을지, 언제 알림을 보낼지는 원래 장치가 정한다.

이 층이 없었다면 기억 주입과 가드, 알림을 Codex용으로 하나씩 다시 짰을 것이다. 기억 폴더 가드처럼 여러 번 사고를 겪으며 다듬은 규칙을 새로 옮겨 적는 것부터가 위험하다. 옮겨 적는 과정에서 조건 하나가 빠지면, 그 빈틈은 사고가 나기 전까지 보이지 않는다.

2조용히 건너뛰는 것들

연결 자체는 금방 됐다. 어려운 건 오류가 나지 않는 실패였다. 붙인 장치가 돌지 않는데 화면에는 아무 표시도 없는 경우가 여러 겹 있었다. 아래는 내가 확인한 버전에서 본 동작이다.

신뢰받지 않은 훅은 소리 없이 빠진다

내가 확인한 버전의 Codex는 사용자가 신뢰를 준 훅만 실행했다. 신뢰를 받지 못한 훅은 오류를 내지 않고 그냥 건너뛰었다. 설정 파일에 훅이 적혀 있다는 사실만으로는 그 훅이 돈다고 말할 수 없다.

신뢰는 정의에만 묶인다

내가 확인한 범위에서 신뢰는 훅 정의의 해시에 걸렸다. 정의가 가리키는 스크립트 본문이 바뀌어도 다시 묻지 않았다. 반대로 말하면, 본문이 바뀐 것은 Codex가 알려 주지 않는다. 본문을 지키는 일은 내 몫으로 남는다.

주입에는 한도가 있다

세션 시작 때 훅이 넣어 주는 글에는 기본 한도가 있고, 내가 본 버전에서는 넘친 부분이 경고 없이 잘렸다. 상태판과 목차를 넣었는데 뒷부분이 조용히 빠져 있으면, AI는 자기가 모르는 게 있다는 것조차 모른다.

규칙 파일 용량에도 한도가 있다

Codex가 규칙 파일(AGENTS.md)을 합쳐 읽는 용량에는 기본 32KiB 한도가 있다. 내가 확인한 버전에서는 이 한도를 넘은 뒤쪽이 역시 경고 없이 빠졌다. 주입 한도와 이 한도는 둘 다 설정으로 풀었다.

태그가 비어 있어서 알림이 한 통도 안 나간 일

알림은 대화용 호출에서만 보내도록 문을 달아 두었다(4절). 그런데 사람이 여는 대화는 실제로는 목적 태그 없이 열리는 경우가 대부분이라 전부 "모름"(unknown)으로 분류됐다. 훅은 매번 불렸고 기록도 남았지만, 문을 통과한 알림은 0통이었다. 지금은 "모름"도 대화용과 같이 알림을 받는다. 검토용과 자가 시험용은 여전히 제외다. 이것도 오류가 아니라 "정상적으로 걸러짐"으로 끝나는 실패라서, 기록을 세어 보기 전에는 드러나지 않았다.

3도는지는 바깥에서 확인한다

도구가 실패를 알려 주지 않으니, 확인하는 쪽을 도구 밖에 세웠다. 네 장치가 서로를 붙잡도록 엮었다.

고칠 때

봉인

어댑터, 배선표, 연결된 스크립트, 설치된 Codex와 앱의 지문까지 파일 해시 목록으로 적어 둔다.

봉인 직후

자가 시험

실제 Codex를 돌려 훅이 정말 불리는지 확인하고, 그 결과를 증거로 남긴다.

배포 뒤 · 매일

사전 점검

지금 파일이 봉인과 같은지, 자가 시험 증거가 현재 봉인의 digest와 일치하는지, 규칙 파일이 제자리에 있는지 본다.

매일 아침

드리프트 감사

사전 점검을 돌리고, 달라진 것이 있으면 알림을 보낸다. 확인 표시를 한 문제는 다시 울리지 않는다.

핵심은 봉인과 자가 시험의 결속이다. 자가 시험 증거에는 시험 당시 봉인의 digest가 함께 적힌다. 봉인 digest가 바뀌면 이전 증거는 무효가 되고, 사전 점검은 "재봉인 뒤 자가 시험 재실행 필요"로 실패한다. 시험을 다시 돌려야 통과한다. 파일을 고치고 해시만 새로 찍어서 통과시키는 길을 막으려는 것이다. 해시가 맞는다는 건 "적어 둔 그대로다"라는 뜻일 뿐, "적어 둔 것이 돈다"는 뜻은 아니다. 그 둘을 한 번의 절차로 묶었다.

실제로 이 결속이 한 번 제 역할을 했다. 배포 스크립트가 재봉인 뒤의 자가 시험 단계를 빠뜨렸고, 사전 점검이 거기서 멈춰 세웠다. 빠뜨린 쪽은 사람이 쓴 절차였고, 잡은 쪽은 기계였다.

앱이 자동 업데이트되는 경우

Codex 데스크탑 앱은 스스로 업데이트된다. 봉인에는 앱 속 실행 파일과 보조 파일의 해시, 앱 버전을 묶은 지문이 들어 있어서, 앱이 바뀌면 다음 날 아침 감사가 알려 준다. 앱을 실행하지 않고 파일만 읽어서 만드는 지문이다.

알림이 와도 봉인 속 앱 지문을 바로 바꾸지 않는다. 앱으로 대화를 여는 길을 새 버전에서 하나씩 다시 시험한다. 데스크탑 앱에서 새로 시작하기, 같은 창에서 이어 쓰기, 앱을 껐다 켠 뒤 다시 불러오기, 폰에서 새로 시작하기, 폰에서 다시 열기가 그 길이다. 모두 통과한 뒤에야 지문을 바꾸고, 그 전까지 사전 점검은 경고를 띄운 채로 둔다. 한 번은 데스크탑 칸만 통과한 상태에서 지문을 먼저 바꿨다가 검토에서 걸려 되돌렸다. 지문을 바꾸면 경고가 꺼지고, 남은 칸을 시험해야 한다는 사실도 경고와 함께 사라진다.

이 앱은 업데이트를 내려받아 두었다가 앱을 끌 때 설치한다. 그래서 "껐다 켠 뒤 다시 불러오기" 칸을 시험하는 순간 버전이 바뀔 수 있다. 시험이 끝나면 버전을 다시 확인하고, 바뀌었으면 앞서 통과한 칸까지 모두 새 버전에서 다시 한다.

4같은 엔진, 다른 목적

Codex는 내가 직접 대화하는 도구이기도 하고, Claude가 작업 끝에 부르는 보조 검토자이기도 하다. 같은 엔진이라 훅도 같이 불린다. 검토 호출이 알림을 보내거나 기억 가드를 건드리면 안 되니, 호출마다 실행 목적을 달아 갈랐다. 아래는 내 호출기가 적용하는 정책이다.

목적 태그누가 부르나훅알림
interactive대화용으로 표시해 연 대화켜짐보냄
unknown목적 태그가 없는 호출. 내 환경에서는 사람 대화가 대부분이라 알림 대상에 넣었다켜짐보냄
reviewClaude가 부르는 보조 검토꺼짐 · 읽기 전용 · 호출 옵션으로 끔없음
drill봉인 뒤 자가 시험켜짐 · 가드도 켜짐 · 기억 쓰기는 막음없음

태그는 어느 쪽으로 분류할지를 정할 뿐이고, 훅을 끄는 것은 호출 옵션이다. 검토 호출은 호출기(wrapper)가 훅을 끄는 옵션을 붙여 읽기 전용으로 실행한다. 그래서 검토 결과에 내 상태판이 섞이거나, 검토 한 번에 폰이 울리는 일이 없다. 규칙을 제외하는 옵션도 함께 쓰지만, 그것만으로 규칙이 전부 빠지지는 않았다(아래 접힌 설명). 자가 시험은 반대로 훅이 도는지 보는 게 목적이라 훅과 가드를 켜 두되, 기억 쓰기와 알림은 막는다. 하루에 여러 번 도는 시험이 알림을 보내기 시작하면, 진짜 알림이 그 사이에 묻힌다.

끄는 옵션을 다 붙여도 꺼지지 않은 층

격리 실험을 해 보니, 검토 호출에 훅을 끄는 옵션과 규칙 제외 옵션을 붙여도, 확인한 버전에서는 전역 위치에 둔 규칙 파일(AGENTS.md)이 따로 실렸다. 그 버전에서는 이것만 끄는 설정을 찾지 못했다. 끄는 스위치가 여러 개 있다고 해서 모든 층이 꺼졌다고 가정하면 안 된다. 격리 여부는 옵션 목록이 아니라 실제로 무엇이 실렸는지로 판정한다.

5규칙은 원문에서 만든다

Claude Code가 읽는 규칙 파일과 Codex가 읽는 규칙 파일은 이름도 위치도 다르다. 두 벌을 손으로 관리하면 반드시 어긋난다.

요약하지 않고 생성한다

Codex용 규칙 파일은 생성기가 Claude 쪽 규칙 원문에서 만든다. 요약본을 쓰면 요약하는 순간 조건과 예외가 빠진다. 원문을 그대로 옮기고, 앞에 Codex에만 해당하는 머리말을 붙인다. 규칙을 고칠 때는 원문만 고친다. 원문 파일이 바뀌면 감시 서비스가 생성기를 돌려 사본을 다시 만들기 때문에, 사람이 생성기를 따로 돌리지 않는다. 다만 이미 열려 있는 Codex 대화는 시작할 때 받은 규칙을 계속 쓴다. 생성기 코드를 고칠 때는 봉인과 자가 시험을 다시 거쳐야 하고, 거치지 않으면 자동 반영이 멈추고 알림이 온다.

인계문 형식을 맞춘다

긴 작업은 세션을 나눠 인계문으로 넘긴다. 두 도구가 같은 칸으로 인계문을 쓰도록 형식 절을 규칙에 넣었다. 그래서 Claude에서 Codex로, Codex에서 Claude로, 같은 쪽끼리도 인계문 한 장으로 세션을 잇는다.

한 대화에는 한 실행기

Codex는 한 대화를 한 번에 한 실행기만 쓸 수 있다. 그래서 내 대시보드는 데스크탑 터미널에서 새 Codex 대화를 열면 첫 답까지만 쥐고 터미널을 스스로 놓도록 만들었다. 그래야 폰이나 앱이 그 대화를 이어 쓴다. 한 대화를 둘이 동시에 쥐는 순간은 훅이 기록해 두고, 아침 감사가 알린다.

같은 인계는 같은 결과

내 대시보드는 같은 인계를 다시 눌러도 새 대화가 하나만 생기도록 만들었다. 이전 대화는 새 대화가 뜬 것을 확인한 뒤에 닫는다. Codex 쪽 대화를 닫으면 Codex 쪽에서도 보관 처리되어 폰 앱의 대화 목록에서 빠진다. 데스크탑 앱의 사이드바는 이 보관을 따라오지 않는다. 앱이 그 대화를 쥐고 있으면 보관이 실패하므로, 앱이 놓을 때까지 기다렸다가 처리한다.

대시보드 쪽 이야기는 터미널 밖으로 나온 Claude Code에 따로 적었다. 여기서 가져갈 것은 규칙과 형식이 원본 하나에서 나온다는 점이다. 두 도구가 같은 원본을 읽으면, 인계문을 받는 쪽이 어느 도구든 같은 칸에서 같은 것을 찾는다.

동시 점유 경보는 훅에서 바로 보내지 않는다. 훅은 기록 한 줄만 남기고 알림은 아침 감사가 맡는다. 도구 실행마다 도는 경로에 네트워크 대기를 넣고 싶지 않아서다. 경보 한 건은 후보로만 받고, 기록을 열어 실제 겹침인지 확인한 뒤에 다음 조치를 정한다.

6기억 쓰기는 좁게 열었다

Codex도 같은 기억 서재를 읽는다. 세션 시작 때 같은 상태판과 목차를 받는다. 처음에는 쓰기를 Claude 한 곳에 모았고, 지금은 Codex에도 좁은 범위의 쓰기를 열어 두었다.

Codex 세션

상태판에서 지금 하는 작업의 줄과 프로젝트·참고 기록은 직접 고친다. 나머지는 넘긴다.

→
인계문의 한 칸

일하는 방식에 관한 규칙과 나에 대한 사실은 "기억에 남길 것" 칸에 적는다.

→
다음 Claude 세션

칸을 읽고 기억으로 옮길지 판단한다.

범위는 일부러 좁게 잡았다. 일하는 방식에 관한 규칙과 나에 대한 사실은 여전히 Claude 쪽에서만 바뀐다. 이런 기억이 잘못 적히면 그 뒤 모든 세션의 행동이 함께 틀어지기 때문이다. 기억 파일을 지우거나 옮기는 일, 셸 명령으로 기억 폴더에 쓰는 일도 막았다.

쓰는 순서도 하나로 정했다. 고치기 전에 그 파일을 정해진 방식으로 읽어야 하고, 가드는 그 읽기를 기록해 둔다. 읽은 뒤에 다른 세션이 같은 파일을 바꿨다면 쓰기를 막는다. 막히면 다시 시도하지 않고 멈춘다. Codex가 쓴 기록에는 Codex가 썼다는 표시와 대화 ID가 남아서, 나중에 누가 쓴 줄인지 가려낼 수 있다.

두 도구가 같은 기억을 동시에 고칠 때를 위한 본격적인 안전장치는 아직 만들지 않았다. 대신 다시 닫는 조건을 먼저 적었다. 한 대화를 두 실행기가 실제로 동시에 쥔 경보가 한 번 오거나, 읽은 뒤 다른 세션이 파일을 바꿔서 또는 잠금 때문에 Codex의 기억 쓰기가 막힌 일이 한 번 생기거나, 쓰기 범위를 넓히자는 요청이 오면, Codex의 기억 쓰기를 끄고 안전장치부터 만든다. 끄는 방법은 규칙 원문에서 그 절 하나를 지우는 것이다. Codex 쪽 사본은 5절의 자동 반영으로 따라 바뀌지만, 이미 열린 대화는 시작할 때 받은 규칙을 계속 쓰므로 기억에 쓰던 Codex 대화도 닫는다. 서재 구조는 Claude Code에 기억을 달다에 적었다.

7남의 도구에 기대는 지점을 목록으로

대시보드와 어댑터는 Codex가 남기는 파일과 동작에 기댄다. 모두 내 것이 아니고, 업데이트 한 번에 조용히 바뀔 수 있다. 그래서 기대는 지점을 목록으로 적어 두고 매일 아침 대조한다.

기대는 지점바뀌면 생기는 일
대화 목록 DB의 칸 이름대시보드 목록이 비거나 엉뚱한 값을 보인다
대화 기록 파일의 형식
문맥 태그 · 단계 값 · 턴 시작과 끝 이벤트
메시지 수가 0으로 세어지거나 답이 끝났는지 판단하지 못한다
대화 잠금 폴더한 대화를 누가 쥐고 있는지 모르게 된다
앱의 URL 스킴대시보드에서 앱의 그 대화를 여는 버튼이 죽는다
앱 번들 지문봉인 때와 다른 앱이 훅을 부른다

감사는 읽기만 한다. 최근 사람 대화 여러 개를 표본으로 읽어서 모르는 태그가 여러 대화에 반복되는지, 메시지는 있는데 턴 이벤트가 없는지 같은 신호를 본다. 모르는 태그는 한 대화에서 한 번 보인 것은 넘기고, 여러 대화에 반복될 때 알린다.

공식 릴리스도 매일 조회한다. 알파판은 하루에도 여러 개 나오니 정식판만 본다. 새 정식판이 나오면 릴리스 노트를 위 목록의 낱말로 훑는다. 기록, 대화, 잠금, 이어가기, 훅, 규칙 파일 같은 말이 들어 있으면 확인하라는 알림을 보내고, 없으면 참고로만 남긴다. 릴리스 노트를 전부 읽는 대신 내가 기대는 지점만 찾아 읽는 방식이다.

터미널용 Codex는 버전을 고정해 두고 내가 올린다. 새 정식판이 기본값을 바꾸는 경우가 있어서다. 한 번은 백그라운드 데몬이 자동으로 뜨도록 기본값이 바뀌었는데, 내 점검 항목에는 "상주 프로세스 0개"가 있었다. 그래서 올리기 전에 따로 떼어 낸 환경에서 실측하고, 그 기능을 끄는 설정을 먼저 넣은 뒤에 올렸다. 올린 뒤에는 터미널 경로의 시험 칸을 다시 채웠다.

비어 있음과 비어 있음을 같다고 본 감시

앱 번들을 감시하던 초기 판은 앱 안의 옛 경로를 보고 있었다. 봉인 때도 그 경로에 파일이 없었고 지금도 없었다. "없음"과 "없음"을 비교했으니 결과는 늘 같음이었고, 앱이 자동 업데이트된 것을 놓쳤다. 경로를 고친 뒤에도 감시기가 사전 점검 경고 중 일부 종류만 알림으로 올리고 있어서, 새 경고는 알림까지 가지 못했다. 지금은 비교 대상이 비어 있으면 그 자체를 경고로 올린다. 같다는 결과가 나오려면 양쪽에 실제로 무언가 있어야 한다.

8끝났다고 말하는 기준

옮겨 붙이는 일은 끝이 잘 보이지 않는다. 그래서 언제 "다 됐다"고 말할지를 일곱 가지 조건으로 먼저 적었고, 모두 참이 된 날 첫 판을 닫았다.

조건확인하는 방법
경로마다 같은 장치가 돈다대화를 여는 길(터미널, 데스크탑 앱, 폰 앱)과 여는 방식(새로 시작, 다시 열기)을 곱해 칸을 만든다. 칸마다 규칙이 실렸는지, 대표 규칙대로 행동하는지, 허용된 작업이 되는지, 알림이 오는지를 이번 회차의 새 증거로 채운다. 옛 기록은 증거로 쓰지 않는다
막아야 할 것이 실제로 막힌다같은 칸마다 위험한 명령을 하나씩 시키고, 막혔다는 기록과 함께 대상 파일의 해시가 그대로인지 본다. 보호 훅의 기록이 없는 칸은 실패로 친다
앱이 설정을 다시 써도 보호가 남는다앱은 업데이트한 뒤 설정 파일을 다시 쓰기도 한다. 실제로 다시 썼는지 먼저 확인한 뒤, 훅 신뢰 항목과 훅 켜기 설정, 용량 설정이 그대로인지 대조한다
백그라운드 데몬이 없다고정한 버전과 꺼 둔 자동 업데이트, 떠 있는 데몬이 없는지를 명령으로 확인한다
화면 표시가 정해졌다두 AI의 닫기와 되살리기를 어떻게 맞출지 정하고 배포한다
실제로 일주일을 쓴다통합된 경로로 실제 작업을 하고, 자동으로 끝났어야 할 단계를 사람이 손으로 되살린 횟수를 센다. 7일에 한 번 이하여야 한다
기록끼리 맞는다결과 문서끼리 어긋난 문장을 고친다

일주일 동안 실제 작업 네 건을 했고, 손으로 되살린 일은 없었다. 첫 답 뒤에 "진행해"라고 한 번 답한 것을 복구로 칠지 따져 봤는데, 그것은 처음부터 설계한 확인 단계라서 세지 않았다. 셌더라도 한 번이라 결론은 같았다.

경로를 칸으로 쪼갠 덕에 조용한 실패를 하나 더 찾았다. 다른 실행기가 열어 둔 대화를 갈라 새 대화로 이어 가면, 세션 시작 신호에 "fork"라는 새 값이 들어온다. 주입 설정에 이 값이 없어서 상태판과 목차가 들어가지 않았는데, 오류는 없었고 위험 명령 차단과 알림은 정상이었다. 2절과 같은 종류의 실패다. 값을 추가하고 봉인과 자가 시험을 다시 거쳤다.

처음에 계획했지만 첫 판에서 뺀 일은 "이런 일이 생기면 연다"는 조건과 함께 따로 적어 두었다. 끝낼 때 미룬 것과 버린 것을 구분해 두어야 나중에 다시 꺼낼 수 있다.

9이 구조에서 가져갈 만한 것

두 번째 도구가 무엇이든 옮겨 쓸 수 있는 쪽을 골랐다.

새로 짜기 전에 규약부터 대조한다.

두 도구의 훅 규약이 비슷하면 번역하는 어댑터 하나로 장치 본체를 공유할 수 있다. 본체가 한 벌이면 고칠 곳도 한 곳이고, 두 도구가 어긋날 틈이 줄어든다.

조용히 건너뛰는 도구는 바깥에서 센다.

오류 없이 건너뛰고 경고 없이 자르는 도구에서는 "에러가 없었다"가 아무것도 증명하지 않는다. 실제로 불렸는지, 실제로 들어갔는지를 도구 밖의 시험과 기록으로 확인한다.

봉인과 시험을 한 줄로 묶는다.

파일이 적어 둔 그대로인지와 그 파일이 도는지는 다른 질문이다. 봉인 digest가 바뀌면 이전 시험 증거가 무효가 되게 묶어 두면, 해시만 갱신하고 넘어가는 길이 닫힌다.

호출마다 목적을 단다.

같은 엔진을 대화에도, 검토에도, 시험에도 쓰면 부수 효과가 섞인다. 목적 태그로 알림 대상을 가르고, 훅을 꺼야 하는 호출은 호출 옵션으로 끈다. 태그가 빠진 경우를 어디로 보낼지도 미리 정한다.

쓰기는 좁게 열고, 다시 닫을 조건을 먼저 적는다.

여러 AI가 같은 기억을 읽는 건 싸다. 같은 기억에 쓰는 건 비싸다. 쓰기를 열 때는 범위를 좁히고, 읽은 뒤 바뀐 파일에는 쓰지 못하게 하고, 어떤 신호가 오면 다시 닫을지를 열기 전에 정한다.

끝의 정의를 칸으로 적는다.

경로와 확인 항목을 곱해 칸을 만들고, 이번 회차의 증거로 칸을 채운다. 칸으로 쪼개 두면 한 경로에서만 조용히 빠지는 실패가 드러난다.

기준선은 모든 칸을 통과한 뒤에 바꾼다.

기준선을 바꾸면 경고가 꺼지고, 남은 시험이 있다는 사실도 경고와 함께 사라진다. 경고는 할 일 목록 노릇도 하므로, 일이 끝날 때까지 켜 둔다.

남의 것에 기대는 지점은 목록으로 적는다.

기대는 지점을 적어 두면 매일 대조할 수 있고, 릴리스 노트도 그 목록의 낱말로 짧게 읽을 수 있다. 비교할 대상이 비어 있으면 그 자체를 경고로 친다.

⚠️ 이 문서는 구조 설명용이다. 실제 규칙 내용·기억 내용·계정 정보·실제 파일 경로는 포함하지 않는다.