← Posts

Designing Delegation

Prioritizing specs and correcting as you go

·5 min read
#ai#agency#delegation#workflow#design

이전 글에서 "먼저 해봐야 시킬 수 있다"는 이야기를 했다. 그다음 질문이 남는다. 그래서, 어떻게 시키지?

에이전트에게 일을 시키면 기대와 다른 결과가 나올 때가 많다. 돌이켜보면 기술적 한계 때문인 경우는 드물었다. 대부분은 내 쪽의 문제였다. 결국 결과를 가르는 건 내 안에 청사진이 얼마나 또렷하게 그려져 있느냐 였다.

청사진이 선명하면 빈 공간이 어디인지 보인다. 에이전트가 채운 "기본값"이 내가 의도한 것과 다른지도 바로 알아챈다. 반대로 청사진이 흐리면 뭘 명시해야 하는지도 모르고, 결과물을 봐도 맞는지 틀린지 판단이 안 된다.

청사진을 선명하게 만드는 것

에이전트에게 바로 넘기기 전에, 나는 세 가지를 확인하게 됐다.

  1. 지금 어디에 있는가. 현재 코드 구조와 의존 관계를 모르면 에이전트가 만든 플랜이 맞는지 검증할 수 없다. 모르면 에이전트에게 "현재 상태 분석"부터 시킨다. 그건 내가 판별할 수 있는 영역이니까, 맞는지 틀린지 확인이 된다. 컨텍스트 윈도우가 아무리 커져도 에이전트가 기존 코드를 제대로 이해하리라는 보장은 없다. 기존 코드 설명을 새 스펙으로 착각해 중복 구현하는 경우도 있다. 그래서 현재 상태를 내가 먼저 파악하고 있어야 이런 오류를 초기에 잡을 수 있다.
  2. 해봐야 이해되는 종류인가. 기획서를 읽을 때는 이해했다고 생각했는데, 막상 구현하면 기획이 다루지 않은 틈새가 드러난다. 그게 개발 영역일 수도, 기획 영역일 수도 있다. "해봐야 드러나는 것"이라면 내가 먼저 부딪혀 빈 곳을 드러낸 뒤에 나머지를 위임한다.
  3. 이대로 실행해도 되는가. 기획과 디자인이 확정이라도 그대로 라이브로 나가지는 않는다. 에이전트는 주어진 걸 잘 의심하지 않는다. 빈 곳이 있어도 조용히 채운다. 그래서 넘기기 전에 내가 한 번 훑으면서 의문점을 잡고, 엣지 케이스는 에이전트에게 뽑아보라고 시킨다. 그 목록을 들고 기획자나 디자이너와 맞춘 뒤에 넘긴다.

이 세 가지가 결국 청사진을 선명하게 만드는 과정이었다.

빈 공간을 전달하는 것

청사진이 선명해졌다고 해도, 그걸 에이전트에게 전달하는 단계에서 또 빈 공간이 생긴다.

예를 들어 카드 UI를 만들자고 합의했다. 방향은 맞다. 그런데 텍스트가 넘치면 어떻게 할지, 호버하면 뭘 보여줄지 같은 디테일은 내 머릿속에만 있는 경우가 많다. 에이전트는 그 빈 공간을 자기 방식으로 채운다. 그 기본값이 내 머릿속 그림과 같을 확률은 낮다.

그렇다고 모든 걸 적으면 질의 비용이 직접 만드는 비용을 넘어선다. 그래서 전달하는 것도 구분이 필요하다. 나는 두 종류로 나눠서 생각한다.

  • 반드시 지켜야 하는 제약
  • 에이전트가 판단해도 되는 영역

intent engineering 쪽에서는 이를 hard constraint와 steering constraint라고 부른다. 절대 넘으면 안 되는 한계와, 방향만 잡아주고 구체 선택은 맡기는 한계의 구분이다. 되돌리기 비용이 크거나, 내 머릿속에만 있거나, 틀려도 겉으로 바로 티가 안 나는 것일수록 hard constraint에 가깝다.

그리고 매번 반복되는 맥락은 질의가 아니라 시스템에 녹인다. 스킬이나 시스템 프롬프트에 디폴트를 쌓아두면, 질의에서는 예외만 던지면 된다. 다만 처음부터 너무 많이 넣을 필요는 없다. 모델은 점점 강력해져서 반년 전에는 명시해야 했던 게 지금은 불필요할 수 있다. 점진적으로 쌓아가면서 필요한 것만 남기는 편이 낫다.

디자인도 비슷하다. 간격 단위나 색상 팔레트처럼 반복되는 건 디자인 토큰으로 시스템에 넣어두고, 눈에 잘 안 보이는 상태나 디자인 의도처럼 시안에 담기기 어려운 건 에이전트에게 먼저 나열하게 한 뒤 내가 확인하고 고친다. 빈 캔버스에 스펙을 처음부터 쓰는 것보다 훨씬 가볍다.

구현하면서 완성한다

여기까지가 실행 전에 할 수 있는 일이다. 하지만 인간이 완벽하게 기획하고 예측할 수는 없다. 아무리 꼼꼼하게 짜도 구현 중에 예상 못한 게 나온다. 스펙은 한 번 쓰고 끝나는 문서가 아니라, 구현하면서 발견한 걸 반영해 계속 업데이트되는 살아 있는 문서다.

그래서 실행을 한 번에 넘기지 않는다. 내가 인지 가능하고 부담되지 않는 단위로 쪼개서, 한 단위가 끝날 때마다 결과를 확인하고 보정한다. "사전에 다 정의하고 한 번에 실행"하는 접근보다, 작고 반복적인 단계로 통제력을 유지하는 편이 현실적이다. 반복적으로 발견되는 패턴이 생기면 시스템에 녹인다. 그다음 작업의 청사진이 더 선명해진다.


결국 이건 무엇을 시키고, 무엇을 직접 할 것인가의 문제다. 좋은 매니저가 "이 일의 어디에 내 판단이 들어가야 하는지" 를 알고 경계를 매번 새로 긋듯, 에이전트와의 협업도 매 작업마다 위임의 경계를 다시 설정하는 일이다.

이전 글에서 말한 "먼저 해봐야 시킬 수 있다"는 전제 위에서, 이제는 구체적으로 어떻게 시킬 것인가를 설계하는 것. 내 안의 청사진을 선명하게 만들고, 그 선명함을 에이전트에게 전달하는 과정이다.

In the previous post, I talked about how "you can only direct others once you've done it yourself." The next question remains: so how exactly do you give directions?

When I delegate work to an agent, the results often don't match my expectations. Looking back, it was rarely a technical limitation. Most of the time, the problem was on my end. What ultimately determines the outcome is how clearly the blueprint is drawn in my own head.

When the blueprint is sharp, you can see where the gaps are. You immediately notice when the agent's "defaults" diverge from your intent. When the blueprint is hazy, you don't even know what to specify, and you can't judge whether the result is right or wrong.

Making the blueprint sharp

Before handing execution to the agent, I've started checking three things.

  1. Where are we right now? Without knowing the current code structure and dependencies, you can't verify whether the agent's plan even makes sense. If I'm unsure, I have the agent analyze the current state first. Since that's something I can evaluate, I can tell whether it's right or wrong. No matter how large the context window gets, there's no guarantee the agent truly understands existing code. It sometimes mistakes existing code descriptions for new specs and builds duplicates. That's why I need to understand the current state first—so I can catch these errors early.
  2. Is this the kind of thing you only understand by doing? Sometimes I read a spec and think I get it, but implementation reveals gaps the spec never addressed. It could be a development concern or a planning concern. If it only surfaces through doing, I don't hand off the whole thing—I hit the gaps first, then delegate the rest.
  3. Can this be executed as-is? Even when specs and designs are "finalized," they don't ship unchanged. Agents don't really question what they're given. They quietly fill in gaps. So before handing off, I scan for big-picture concerns myself and have the agent enumerate edge cases. I take that list, align with the PM or designer, then proceed.

These three checks are ultimately the process of making the blueprint sharp.

Communicating the gaps

Even with a sharp blueprint, new gaps emerge when you try to communicate it to the agent.

Say we've agreed to build a card UI. The direction is right. But details like what to do when text overflows, or what to show on hover, often exist only in my head. The agent fills those gaps its own way. The probability that its defaults match the picture in my head is low.

But specifying everything means the cost of writing the query exceeds the cost of just building it yourself. So you need to be selective about what to communicate. I think in two categories:

  • Hard constraints that must be followed
  • Areas where the agent can use its judgment

In intent engineering, these are called hard constraints and steering constraints. The distinction between absolute limits that must never be crossed, and directional guidance where specific choices are left to the agent. The higher the cost of reverting, the more it exists only in my head, or the harder it is to spot when wrong—the more it leans toward a hard constraint.

And context that repeats every time should be baked into the system, not the query. Stack defaults into skills and system prompts, and queries only need to convey exceptions. That said, you don't need to front-load too much. Models keep getting stronger—what needed explicit specification six months ago may be unnecessary now. It's better to build up incrementally and keep only what's needed.

Design works similarly. Recurring things like spacing units and color palettes go into the system as design tokens. States that aren't visually obvious, or design intent that's hard to capture in mockups—have the agent enumerate those first, then I review and correct. Much lighter than writing specs from a blank canvas.

Completing through implementation

Everything above is what you can do before execution. But humans can't plan and predict perfectly. No matter how thorough the spec, unexpected things surface during implementation. Specs aren't documents you write once and finish—they're living documents that keep getting updated as implementation reveals new things.

So I don't hand off execution all at once. I break it into units small enough to review comfortably, checking results and adjusting after each one. Rather than "define everything upfront and execute in one shot," maintaining control through small, iterative steps is more realistic. When recurring patterns emerge, I bake them into the system. The next task's blueprint gets sharper.


Ultimately, this is about what to delegate and what to do yourself. Just as a good manager knows "where in this task my judgment needs to be involved" and redraws that boundary every time, collaborating with agents means resetting the boundaries of delegation for each task.

Building on the premise from the previous post—"you can only direct others once you've done it yourself"—it's now about designing specifically how to direct. Making the blueprint in my head sharp, and communicating that clarity to the agent.