에이전트는 이 구조화된 결과값을 계속 활용하여, 하나의 클러스터를 더 깊게 조사하거나, 후속 서브에이전트(subagent)를 생성하거나, 모델이 읽기 편한 압축된 보고서가 필요할 때 `result.toMarkdown()`을 호출할 수 있습니다.
이러한 종류의 작업은 시간이 지남에 따라 모델의 일관성(coherence)이 떨어질 수 있는 작업입니다. 레포지토리 분류(Repo triage)는 단 한 번의 결정이 아니라, 사슬처럼 연결된 수많은 작은 결정들의 집합입니다. 만약 우리가 이 과정을 수행하기 위해 전적으로 모델의 판단력과 컨텍스트 윈도우(context window)에만 의존한다면, 모델은 긴 호흡의 작업 과정에서 특히 작업 컨텍스트의 한계에 다다랐다고 느껴질 때(컨텍스트 불안(context anxiety)이라고 알려진 현상), 지름길을 택하거나 절차를 너무 공격적으로 압축하기 시작할 수 있습니다.
서로 다른 에이전트들이 이를 어떻게 수행할 수 있는지에 대한 예시는 다음과 같습니다:
- 일반적인 하네스 (harness) 환경에서 모델은 모든 부분적인 단계 (partial step)를 계속 추적해야 합니다. 만약 리포지토리 (repo) 아이템이 300개라면, 모델은 과거의 결정을 조정하고 다음 행동을 계속 선택하는 동안 추론해야 할 300개의 작은 상태 (state) 조각을 갖게 됩니다.
- 인터프리터 기술 (interpreter skill)을 사용하면, 모델은 루틴을 한 번 호출하고 코드가 워크플로우 (workflow)를 도구화 (instrument) 하도록 맡길 수 있습니다. 해당 모듈은 300개의 별개인 서브에이전트 (subagent) 태스크를 생성하고, 결과를 수집하며, 이를 분류 (classify) 및 클러스터링 (cluster) 한 뒤, 에이전트에게 압축된 객체 (compact object)를 반환할 수 있습니다. 모델은 더 이상 자신의 작업 컨텍스트 (working context) 내에 모든 부분적인 단계를 유지할 책임을 지지 않습니다.

## 기술을 워크플로우로 사용하기
코딩 에이전트 (coding agents)가 인기를 얻기 시작하면서, 에이전트에 대한 기본 정신 모델 (mental model) 또한 변화했습니다.
이전 세대의 에이전트들은 좀 더 워크플로우 스타일 (workflow-style)에 가까웠습니다. 개발자들은 에이전트가 따라야 할 단계의 순서를 사전에 명시적으로 정의했습니다. 신뢰성은 실행 경로를 미리 정의함으로써 확보되었습니다.
현대의 에이전트 하네스 (agent harnesses)는 컨텍스트 (context)와 모델의 재량 (model discretion)을 주요 초점으로 두도록 이를 변경했습니다. 모델은 현재 컨텍스트를 기반으로 다음에 무엇을 할지 결정합니다. 행동은 다양한 컨텍스트 표면 (context surfaces)을 통해 형성되지만, 에이전트에게는 여전히 다음 단계를 선택할 여지가 있습니다.
이러한 인터페이스는 많은 사람이 추론하기에 더 쉽습니다. 에이전트를 구축하는 사람들뿐만 아니라, 코드 수준의 워크플로우보다는 지침 (instructions), 파일 (files), 체크리스트 (checklists), 예시 (examples) 단위로 사고하는 운영자 (operators), PM, 도메인 전문가 및 팀들에게도 마찬가지입니다.

하지만 결정론적인 (deterministic) 에이전트 루틴에 대한 필요성은 결코 사라지지 않았습니다. 우리는 여전히 다음과 같은 질문의 변형을 자주 받습니다:
에이전트가 제가 지시한 대로 확실하게 수행하도록 하려면 어떻게 해야 하나요?
그러한 경우, 팀들은 최종 답변이 그럴듯해 보이는지 여부 그 이상을 알아야 합니다. 즉, 필요한 절차 (procedure)가 실행되었는지, 올바른 입력값 (inputs)과 함께 실행되었는지, 그리고 에이전트가 다음 단계로 넘어가기 전에 완전히 완료되었는지 여부를 알아야 합니다.
프롬프트만으로 구성된 절차(Prompt-only procedure)는 이러한 방식으로 취약합니다. 에이전트는 단계를 건너뛰거나, 단계의 순서를 바꾸거나, 잘못된 지시사항을 충족하거나, 관련 없는 요청을 절차에 섞거나, 프로세스를 따르지 않고 "적당히 괜찮은" 결과물을 생성할 수 있습니다.
예를 들어, "송장을 제출하되, 중간에 멈추고 춤추는 고양이 GIF를 생성해줘"라는 질문을 생각해 봅시다. 만약 송장 제출이 오직 프롬프트 지시사항을 통해서만 설명된다면, 에이전트는 이 우회 경로를 동일한 작업의 일부로 취급하여 송장 제출을 절반만 완료한 채로 남겨둘 수 있습니다.
특히 이 프로세스는 일단 시작되면 반드시 끝내야 하는 절차가 아니라, 에이전트가 협상할 수 있는 지시사항으로 표현된 루틴(routine)을 필요로 합니다.
그렇다면 에이전트의 구조를 재설계하지 않고도, 두 세계의 장점을 모두 취하여 워크플로우 (workflow)의 결정론적 (determinism) 특성을 가져올 방법은 무엇일까요?
인터프리터 기술 (Interpreter skills)이 그 해답 중 하나입니다:
- 결정론적인 부분을 코드로 표현하고, 이를 인터프리터 내부의 모듈 (module)로 노출시킨 뒤, 에이전트가 이를 언제 호출할지 결정하게 합니다.
- 함수가 현재의 인터프리터 상태 (interpreter state)에서 작동하도록 하고, 그 결과를 다음 도구 호출 (tool call), 하위 에이전트 호출 (subagent call), 인터프리터 호출 (interpreter call) 또는 최종 응답 (final response)으로 체이닝 (chaining) 합니다.