목록으로 돌아가기

AI 엔지니어링 노트

레시피의 시대에 실패를 남기는 습관들

2026년 3월 26일3분 읽기

요즘 AI와 에이전트에 대한 글을 볼 때 자주 떠올리는 개념은 생존자 편향입니다.

2차 세계대전 당시, 복귀한 전투기의 피탄 흔적만 보고 “총탄 자국이 많은 부위를 더 보강해야 한다”고 판단한 사례가 있습니다. 하지만 실제로 더 치명적인 부위는 총탄 자국이 적은 곳이었습니다. 그 부위를 맞은 전투기들은 애초에 돌아오지 못했기 때문입니다. 이 이야기를 떠올릴 때마다, 요즘 AI 생산성 담론도 비슷한 착시 위에 서 있는 것처럼 보입니다.

돌아온 사례만 보면 놓치는 것

어디를 봐도 성공 사례, 레시피, 워크플로우는 넘쳐납니다. 누가 어떤 툴 조합으로 얼마나 빨리 만들었는지, 어떤 프롬프트로 품질을 끌어올렸는지, 어떤 자동화가 팀 생산성을 높였는지에 대한 글은 계속 쌓입니다. 그런 사례는 분명 도움이 됩니다. 저도 이미 검증된 방식들을 참고하고, 가져오고, 제 작업에 맞게 바꿔봅니다. 다만 결과만 계속 보다 보면 자연스럽게 빠지는 것들이 있습니다.

  • 작동하지 않았던 시도
  • 실제 재현되지 않았던 아이디어
  • 실무에서 바로 무너진 가정
  • 너무 커서 중간에 흐려진 태스크
  • 팀이나 개인의 작업 리듬 안에 유지되지 못한 워크플로우

이런 것들은 기록되지 않거나, 기록되더라도 오래 남지 않습니다. 결국 우리는 돌아온 전투기만 보게 됩니다.

그래서 남기기 시작한 것

AI와 오래 작업하다 보면 결과물보다 먼저 사라지는 것이 있습니다. 결과물은 파일로 남고, 커밋으로 남고, 문서로 남습니다.

반대로 사라지기 쉬운 것은 작업 중간의 판단입니다.

  • 어떤 요청이 모호했는지
  • 어떤 컨텍스트가 오염을 만들었는지
  • 어떤 파일을 먼저 읽혔어야 했는지
  • 어느 순간부터 모델이 다른 가정을 잡았는지
  • 실패했을 때 다음 시도에서는 무엇을 바꿔야 하는지

이걸 남기지 않으면 같은 구간을 다시 설명하게 됩니다. 토큰보다 더 아까운 것은 그 반복에 쓰는 시간입니다. 그래서 저는 성공 보다는 실패에 대한 수집을 위해 작업 환경에 몇 가지 Hooks을 두기 시작했습니다. 거창한 시스템이라기보다, 실패가 그냥 흩어져 사라지지 않게 붙잡아 두는 장치에 가깝습니다.

세션 로그는 결과물이 아니라 경로 기록

세션 로그는 최종 결과물을 저장하기 위한 파일이 아닙니다. 어떤 질문을 했고, 어떤 응답이 나왔고, 어디에서 방향이 바뀌었는지를 다시 보기 위한 기록입니다. 저는 pre-hook으로 질문과 응답 전체를 plain text로 남깁니다.

(물론 기본적으로 .claude, codex 에는 저장이 되어있지만, 빠르게 탐색하기 위한 2중 장치라고 판단하여 따로 만들었습니다)

.claude/
└── session-logs/

이 기록은 모델보다 제가 먼저 읽습니다. 제가 어떤식으로 질문을 했는지, 몇 주 전에 시도했던 방식이 왜 막혔는지, 어떤 우회가 있었는지, 어떤 판단이 반복됐는지를 확인하기 위해서입니다.

예를 들어 Claude Code에서 forkcompact를 시도했다가 원하는 흐름으로 풀리지 않았던 기록이 있으면, 다음 세션에서는 그 지점부터 다시 판단할 수 있습니다. 모델은 기억하지 못하지만, 로그는 작업 경로를 남깁니다.

lessons.md는 다음 모델이 읽는 오답노트

세션 로그만으로는 부족합니다. 로그는 길고, 다음 작업 때마다 전체를 다시 읽기 어렵습니다. 그래서 task/lessons.md를 따로 둡니다. 모델이 수행 과정에서 오류가 발생한것, 그리고 사용자의 요청을 제대로 인지 못한점들을 자동으로 남깁니다.

task/
└── lessons.md

여기에는 감상을 남기기보다, 다음 실행에 영향을 줄 수 있는 짧은 교훈을 남깁니다.

  • 태스크가 너무 커서 모델이 중간 목표를 놓쳤다
  • 구현 전에 확인해야 할 전제를 뒤늦게 발견했다
  • 파일 이름은 명확했지만 역할이 겹쳐서 모델이 헷갈렸다
  • 규칙을 설명했지만, 검증 단계가 없어서 실제 출력에는 반영되지 않았다

이런 기록은 다음 모델이 먼저 읽을 수 있습니다. 세션이 바뀌어도 같은 실수를 처음부터 다시 시작하지 않게 만드는 얇은 기억층입니다.

context.md는 출발선을 맞추기 위한 파일

lessons.md가 반복되는 실패 패턴을 남긴다면, context.md는 현재 위치를 남깁니다.

task/
└── context.md

새 세션을 열 때마다 가장 먼저 필요한 것은 많은 지식이 아닐 때가 많습니다. 오히려 더 필요한 것은 지금 작업이 어디에 있는지입니다.

  • 완료된 것
  • 진행 중인 것
  • 중단된 것
  • 다음에 이어서 해야 할 것
  • 이미 결정했기 때문에 다시 열지 않아도 되는 것

이 정보가 없으면 모델은 이미 끝난 논의를 다시 열거나, 아직 결정하지 않은 것을 결정된 것처럼 다룰 수 있습니다. 그래서 context.md는 지식 저장소라기보다 출발선을 맞추기 위한 파일에 가깝습니다.

실제 구조는 단순하게 둔다

현재 구조는 이렇게 잡고 있습니다.

project/
├── .claude/
│   └── session-logs/        # 질문과 모델 응답 전체 plain text
├── task/
│   ├── lessons.md           # 태스크별 실패/성공 패턴 누적
│   └── context.md           # 현재 상태와 다음 출발점 기록
├── CLAUDE.md                # 프로젝트 컨텍스트
└── SKILL.md                 # 재사용 가능한 작업 패턴

각 파일은 비슷해 보이지만 독자가 다릅니다.

  • session-logs는 제가 읽습니다. 과거의 접근 방식과 우회 경로를 추적합니다.

  • lessons.md는 모델이 읽습니다. 이전 태스크에서 드러난 실패 패턴을 다음 실행에 반영합니다.

  • context.md도 모델이 읽습니다. 다만 목적은 교훈이 아니라 상태 복원입니다.

  • CLAUDE.md, SKILL.md는 더 넓은 규칙입니다. 프로젝트 맥락과 반복 가능한 작업 패턴을 매번 다시 설명하지 않기 위해 둡니다.

pure function처럼 만들 수는 없지만,

AI 작업을 완전한 pure function처럼 만들 수는 없습니다. 모델은 바뀌고, 컨텍스트는 압축되고, 세션은 끊깁니다. 같은 요청을 해도 매번 완전히 같은 결과가 나온다고 보장하기 어렵습니다. 다만 입력 쪽을 덜 흔들리게 만들 수는 있다고 생각합니다.

세션 로그는 과거의 경로를 남기고, lessons.md는 반복되는 실패 패턴을 남기고, context.md는 현재 위치를 남깁니다. 이 정보들이 다음 실행의 입력으로 다시 들어가면, 모델이 매번 백지에서 시작하는 상황은 줄어듭니다.

저는 이 정도를 AI 작업에서의 느슨한 pure function 비유로 보고 있습니다. 완전한 재현성은 아니지만, 필요한 맥락을 입력 구조 안에 넣어서 흔들림을 줄이는 방식입니다.

중요한것은 좋은 결과보다 사용자 스스로에게 남는 감각

좋은 레시피를 따라가는 것은 필요합니다. 이미 잘 작동하는 방식이 있다면 가져오는 편이 낫습니다. 다만 레시피만 따라가면 내 환경에서 어떤 조건이 맞아야 하는지, 어떤 부분이 쉽게 무너지는지, 어떤 실패가 반복되는지는 잘 보이지 않습니다.

성공 사례는 방향을 보여줍니다. 하지만 실패 기록은 감각을 남깁니다.

제가 만들고 싶었던 것은 대단한 자동화 시스템이라기보다, 그 감각이 사라지지 않는 작업 리듬입니다. 세션이 끊겨도 실패가 남고, 모델이 바뀌어도 이전의 교훈이 입력으로 돌아오고, 새 작업을 시작할 때마다 같은 비용을 다시 내지 않는 구조입니다.

레시피가 넘치는 시대일수록, 돌아온 사례만 보는 태도에서 조금은 멀어질 필요가 있다고 느낍니다. 잘된 결과를 모으는 것만큼이나, 스스로 실험하고, 돌아오지 못한 실패를 붙잡아 두는 일도 작업의 일부가 되어야 한다고 생각합니다.