스킬(skill)은 AI에게 절차를 알려주는 문서입니다. 그런데 이 문서에는 어떤 모델을 쓸지 적는 칸이 없고, 대화창 안에서 그대로 실행돼 탐색 기록이 대화를 밀어냅니다. 그래서 18개에 별도 에이전트(agent)를 붙였습니다. 처음엔 반쪽이었습니다 — 옮긴 것이 절차가 아니라 실행할 자리뿐이었거든요. 그걸 확인하고 세 번에 걸쳐 메운 기록입니다.
스킬은 절차를 적은 문서입니다. AI가 그 문서를 읽고 대화창 안에서 그대로 실행합니다. 여기서 문제가 둘 나옵니다. 첫째, 실행 중 나온 탐색 기록과 긴 출력이 전부 대화에 쌓입니다. 대화에 담을 수 있는 양(컨텍스트 윈도우)은 정해져 있으니, 정작 중요한 앞부분이 밀려납니다. 둘째, 스킬 문서에는 모델을 지정하는 칸이 없습니다. 무거운 분석이든 가벼운 변환이든 같은 모델로 돌아갑니다.
에이전트 18개가 새로 생겼습니다. 다만 옮긴 것은 일하는 방법이 아니라 일할 자리였습니다. 얻은 것은 딱 세 가지 — 대화창이 안 더러워지고, 역할마다 모델을 정할 수 있고, 쓸 수 있는 도구를 미리 좁힐 수 있습니다.
에이전트는 자기 대화창에서 돌고, 돌아오는 것은 판정과 파일 경로뿐입니다. 판정하는 쪽은 격리가 본질이기도 합니다 — 만든 사람의 설명을 안 듣고 산출물만 봐야 자기채점이 안 됩니다.
판정·분석하는 8개는 상위 등급, 정해진 절차를 많이 돌리는 10개는 중간 등급. 스킬 문서에는 이 칸이 아예 없습니다 — 무거운 분석이든 가벼운 변환이든 같은 모델로 돌아갑니다.
에이전트마다 쓸 수 있는 도구를 미리 정해뒀습니다. 18개 전부 목록이 붙어 있고, 판정만 하는 에이전트는 읽기 전용입니다. 외부 지식을 모으는 에이전트는 이 기록 이후에 쓰기와 실행을 떼어내 읽기와 검색만 남겼습니다 — 믿을 수 없는 외부 내용을 다루는 역할이라서.
돌려주는 형식도 계약으로 못 박았습니다. 이 계약 14줄이 에이전트 18개 파일에 들어간 내용의 사실상 전부입니다 — 그게 다음 절의 문제입니다.
이 기록을 쓰면서 실제 파일을 세어 봤습니다. 에이전트 18개의 본문은 16개가 서로 완전히 똑같았습니다. 위의 계약 14줄이 전부이고, 원래 스킬이 갖고 있던 절차는 한 줄도 넘어가지 않았습니다.
| 원래 스킬 | 절차 분량 (메움① 직전) | 에이전트에 옮겨진 양 | 에이전트 본문의 정체 |
|---|---|---|---|
| 외부 지식 수집 | 1,678 | 0 | 공통 계약 14줄 + 나중에 붙은 보안 문구 23줄 |
| 테스트 시나리오 작성 | 937 | 0 | 공통 계약 14줄 — 고유 내용 없음 |
| 스킬 채점 | 770 | 0 | 공통 계약 14줄 — 고유 내용 없음 |
| 자가개선 분석 | 543 | 0 | 공통 계약 14줄 — 고유 내용 없음 |
| 나머지 14개 | 각 수백 줄 | 0 | 18개 중 승격 직후 16개가 고유 줄 0줄 — 글자까지 동일 |
"스킬을 에이전트로 바꿨다"기보다 "스킬 앞에 실행용 봉투를 씌웠다"가 정확합니다. 규칙과 절차는 스킬에 그대로 있고, 에이전트가 새로 가진 것은 어떤 모델로 돌지·어떤 도구를 쓸지·무엇을 돌려줄지 세 가지뿐입니다. 이게 나쁜 설계는 아닙니다 — 다만 그 봉투에 절차서로 가는 길이 빠져 있었습니다.
절차가 스킬에 남은 것 자체는 괜찮습니다. 정본이 하나여야 어긋나지 않으니까요. 문제는 에이전트 18개 어디에도 "그 스킬을 읽어라"는 말이 없었다는 것입니다. 스킬이 일을 넘길 때 쓰는 예시 문장도 빈칸이었습니다. 그 상태로 부르면 에이전트는 자기가 무슨 순서로 일해야 하는지 모릅니다.
스킬이 "이 구간은 에이전트에게 넘겨라"라며 에이전트를 부릅니다. 넘기는 문장은 예시 그대로 빈칸이었습니다 — 무엇을 어떤 순서로 하라는 내용이 없습니다.
에이전트 파일에는 "결과를 어떻게 돌려줄지"만 적혀 있습니다. 무슨 일을 어떻게 하는지는 없습니다. 그러면 남는 선택지는 하나 — 알아서 지어내는 것입니다.
에이전트 18개에 "네 절차서는 이 파일이다. 시작할 때 먼저 읽어라. 못 읽으면 짐작으로 하지 말고 그 사실을 돌려줘라"를 넣었습니다. 절차를 복사하지는 않았습니다 — 두 벌이 되면 반드시 어긋나기 때문입니다.
채점 기준을 한 마디도 알려주지 않고 채점을 시켰습니다. 에이전트는 자기 절차서를 가장 먼저 읽었고, 그 문서가 정해둔 8개 축·120점 만점 형식 그대로 결과를 냈습니다. 제가 준 지시에는 그 형식이 없었으니, 스스로 읽었다는 증거입니다.
이 구멍은 이 페이지를 쓰다가 발견했습니다. 처음 이 글은 "무거운 실행 구간 18개를 떼어냈다"고 적혀 있었는데, 그게 사실인지 파일을 세어 보다가 절차가 한 줄도 안 옮겨졌다는 걸 알았습니다. 기록을 쓰는 일이 기록 대상을 고치게 만든 셈입니다. 다만 여기까지는 "읽어라"라는 문장일 뿐이었습니다 — 안 읽고 지어내도 아무것도 막지 않았습니다. 그 다음 두 번이 그걸 메웁니다.
"절차서를 읽어라"는 에이전트 파일에 적힌 글일 뿐이라, 안 읽고 지어내도 아무 일도 일어나지 않았습니다. 그래서 에이전트가 일을 마치는 순간에 걸리는 훅(hook)을 걸었습니다. 종료 직전에 검사하는 검문소인 셈입니다. 자기 절차서를 읽은 기록이 없으면 그 자리에서 종료를 막고, 읽어야 할 파일 경로를 알려줍니다.
에이전트가 종료를 선언하는 순간 그 에이전트의 작업 기록을 훑습니다. 자기 절차서를 읽은 흔적이 없으면 종료를 거부합니다. 시작을 막는 게 아니라 끝을 막습니다 — 읽을 기회를 주고 나서 확인하는 것입니다.
어떤 에이전트를 검사할지 목록으로 박아두면 시간이 지나며 반드시 어긋납니다. 그래서 에이전트 파일에 절차서 표시가 붙어 있는지를 그때그때 훑어 대상을 정합니다. 새 에이전트가 늘어도 목록을 고칠 필요가 없습니다.
같은 에이전트를 계속 막으면 영원히 못 끝내는 무한 루프가 됩니다. 그래서 한 에이전트당 한 번만 막고, 그 뒤에도 안 지키면 경고만 남기고 통과시킵니다. 기록을 읽을 수 없는 상황(파일 없음·해석 실패)도 전부 통과입니다 — 확실한 위반만 막습니다.
등록 이후 지금까지 11번 작동해 1번 막고 10번 통과시켰습니다(7월 28일 실측, 계속 늘어납니다). 문장이던 규칙이 처음으로 실제 동작이 된 지점입니다.
검문소까지 세워도 한 가지가 남습니다. 스킬 파일 안에 절차 전문이 그대로 있으니, 그 스킬을 부르는 것만으로 수백 줄이 대화창에 쏟아집니다. 그래서 절차를 별도 파일로 꺼냈습니다(PROCEDURE.md). 스킬 파일에는 "무엇을 누구에게 시킬지"만 남고, 절차 전문은 에이전트만 읽습니다.
| 스킬 | 전 (메움③ 직전) | 후 | 꺼낸 절차 |
|---|---|---|---|
| 외부 지식 수집 | 1,681 | 50 | 1,642 |
| 테스트 시나리오 작성 | 940 | 31 | 920 |
| 스킬 채점 | 773 | 30 | 753 |
| 자가개선 분석 | 546 | 32 | 525 |
| 18개 합계 | 8,709 | 606 | 8,300줄이 밖으로 — 93% 감소 |
앞의 "안 한 일" 표와 숫자가 3줄씩 다른 것은 재는 시점이 달라서입니다. 그 표는 메움① 직전, 이 표는 메움③ 직전을 잽니다. 그 사이에 메움①이 스킬마다 "이 파일이 절차서다"라는 3줄을 넣었습니다.
①과 ②는 "읽어라"를 지시하고 검사하는 방식이었습니다. ③은 다릅니다 — 대화창에서 그냥 실행하는 것이 아예 불가능해집니다. 절차가 그 파일에 없으니 읽을 것이 없기 때문입니다. 규칙을 지키게 만드는 대신, 어길 방법을 없앤 쪽입니다.
다른 모델(GPT)에게 이 변경을 8라운드에 걸쳐 반박시켰습니다. 그중 하나는 제가 만든 구멍이었습니다. 자동 반영이 건드릴 수 있는 폴더 목록에 스킬 폴더를 넣어둔 것입니다.
외부에서 수집한 내용을 규칙으로 반영하는 자동 경로가 있습니다. 그 경로가 쓸 수 있는 폴더에 스킬 폴더가 들어 있었습니다. 즉 수집한 웹 문서가 기존 스킬 문서 끝에 문장을 붙일 수 있었습니다.
스킬은 절차서입니다. 그 문서를 읽은 에이전트는 적힌 대로 행동합니다. 그러니 덧붙은 문장은 설명이 아니라 명령이 됩니다. 웹에서 주워온 글이 하네스를 조종할 수 있는 길이 열려 있었던 셈입니다.
자동 반영이 손댈 수 있는 곳을 지식 폴더와 규칙 폴더 둘로 줄이고, 스킬 변경은 자동 반영 대상에서 뺐습니다. 스킬을 고치려면 사람이 검토해야 합니다.
위에서 세운 검문소는 "절차서를 읽었는가"만 봤습니다. 그래서 파일을 열되 맨 첫 줄만 읽어도 통과됐습니다. 절차를 하나도 못 봤는데 읽은 것으로 집계된 것입니다. 이제는 분량 제한 없이 읽거나 최소 200줄 이상 읽어야 인정합니다.
구조 검사기가 잘못된 경로를 보면 "검사한 스킬 0개, 문제 없음"으로 초록불이 떴습니다. 아무것도 안 봤는데 합격입니다. 이제는 검사 대상이 0개면 측정 실패로 간주해 멈춥니다 — 못 재는 것과 문제 없는 것은 다릅니다.
같은 리뷰에서 되돌리기 범위도 고쳤습니다. 여러 제안을 한꺼번에 되돌리던 것을 제안 하나 단위로 바꿨습니다. 그러지 않으면 뒤 제안이 실패했을 때 앞서 성공한 변경까지 사라져, 기록에는 성공이 남고 실제 파일은 되돌아간 상태가 됩니다.
전부 해결했다고 쓰면 그게 거짓 보고입니다. 구조적으로 남은 것과 아직 확인하지 못한 것을 나눠 적습니다.
| 항목 | 상태 | 내용 |
|---|---|---|
| 파일 바꿔치기 | 잔존 | 경로가 안전한지 확인한 직후에 그 경로를 다른 곳으로 바꿔치기하면 검사를 통과합니다. 셸 스크립트로는 확인과 사용을 한 동작으로 묶을 수 없어 원리적으로 남습니다. 대신 그 자동 경로 자체를 기본 차단으로 돌렸습니다. |
| 위임 지시의 강제력 | 닫음 | 문장이던 위임 지시가 검문소와 구조 두 겹으로 바뀌었습니다. 절차서를 안 읽으면 종료가 막히고, 절차 자체가 스킬 파일 밖으로 나가 대화창에서 그냥 실행하는 것이 불가능해졌습니다. |
| 효과 측정 | 부분 | 스킬을 부를 때 들어오는 양은 잽니다 — 8,709줄 → 606줄. 다만 이건 파일 크기이지 실제 작업 품질이 아닙니다. 같은 일을 승격 전후로 돌려 비교한 적은 아직 없습니다. |
| 맥락 전달 비용 | 상충 | 에이전트는 지금까지의 대화를 모릅니다. 필요한 경로·수치를 일일이 넘겨줘야 합니다. 넘기는 걸 빠뜨리면 에이전트가 처음부터 헤매고, 그 비용이 격리로 얻은 이득을 깎습니다. |
| 목록 미등록 | 남음 | 공유용 미리보기 이미지는 이번에 만들었습니다. 다만 아직 첫 화면 목록에 올리지 않아, 주소를 직접 알아야 들어올 수 있습니다. |
| 절차서 연결 | 닫음 | 에이전트가 자기 절차서를 읽으라는 말이 없던 문제는 이 글을 쓰다가 발견해 메웠습니다. 지금은 에이전트마다 자기 절차서 경로를 갖고 있어, 위 표의 "고유 0줄"은 승격 직후의 값이지 현재 상태가 아닙니다. 안 읽고 지어내는 것을 막는 장치는 메움 ②와 ③에서 붙였습니다. |
옮긴 것은 절차가 아니라 실행할 자리였습니다. 처음엔 그게 반쪽인 줄도 몰랐고, 파일을 세어 보고서야 절차가 한 줄도 안 옮겨진 걸 알았습니다. 그래서 세 번에 걸쳐 메웠습니다 — 길을 적어 넣고, 안 읽으면 못 끝내게 막고, 끝내 절차를 파일 밖으로 꺼내 대화창에서 읽을 수 없게 했습니다. 마지막 것만이 규칙이 아니라 구조입니다.