AI 에이전트가 앱을 배포했을 때, 링크 만료 기한을 알려주었나요?
요약
AI 에이전트가 사용자에게 정보를 전달할 때 발생하는 UX 문제를 분석하고, 에이전트 친화적인 API 설계 방식을 제안합니다. 스키마를 지침으로 활용하여 에이전트가 사용자에게 유효한 정보를 능동적으로 전달하도록 만드는 전략을 다룹니다.
핵심 포인트
- 필드 이름을 명령형(예: tellYourUser)으로 설계하여 에이전트의 행동을 유도할 것
- 에이전트의 응답은 단순 디스플레이가 아닌 인간을 위한 '인계(hand-off)'로 간주해야 함
- 로직용 데이터(ISO 형식)와 인간용 문장을 동시에 제공하여 에이전트의 부담을 줄일 것
- 사용자에게 선택권을 주는 옵션을 포함하여 다크 패턴을 방지할 것
참고: 저는 openpouch의 제작자입니다. 이 글은 첫 실제 사용자를 통해 얻은 에이전트-UX 교훈에 관한 내용이며, 솔직한 한계점도 포함되어 있습니다. 피드백을 환영합니다.
저희의 첫 실제 사용자는 저희 웹사이트를 열어보지 않았습니다. 그는 코딩 에이전트와 대화했고, 에이전트는 openpouch로 배포했으며, 그가 링크를 받았습니다. 이것이 정확히 작동해야 하는 방식입니다 — 에이전트가 유일한 UI입니다.
3일 후 그의 앱은 사라졌습니다.
아무것도 충돌하지 않았습니다. 익명 미리보기는 72시간 후에 만료되는데, 이는 무료 등급이며 에이전트가 보는 모든 곳(CLI 결과, JSON, 문서, llms.txt)에 명시되어 있습니다. 에이전트는 알고 있었습니다. 단지 그에게 말해주지 않았을 뿐입니다. 배포가 성공했을 때, 에이전트는 흥미로운 부분(
- 필드 이름이 명령형이어야 합니다.
notice나meta.expiry가 아니라,tellYourUser여야 합니다. 이 필드를 어떻게 처리할지 결정하는 에이전트는 키(key) 자체에서 답을 얻습니다. 이것이 핵심적인 트릭입니다: 스키마(schema)를 지침(instruction)으로 사용하는 것입니다. - 미리 작성되어 전달될 준비가 되어 있습니다. 별도의 조립이 필요 없습니다. 에이전트는 이를 요약(summary)에 그대로 복사하여 붙여넣을 수 있으며, 이는 저항이 가장 적은 경로입니다. 전문 용어 없이 평이한 언어를 사용하며, "72시간" 대신 정확한 날짜를 제공합니다(인간이 날짜 계산을 직접 할 필요가 없어야 합니다).
- 정상적인 배포(deploy) 시에만 나타납니다. 상태가 저하된 앱은 유쾌한 인계 블록(hand-off block)을 생성해서는 안 됩니다. 부재(absence) 또한 하나의 신호입니다.
- 절대로 클레임 링크(claim link)를 포함하지 않습니다. 클레임 URL은 권한 토큰(capability token)입니다(그것을 가진 사람은 누구나 미리보기를 가져갈 수 있습니다). 이는 비공개 로컬 파일에 유지됩니다. 인계 텍스트는 비밀을 알려주는 것이 아니라, 앱을 유지할 수 있는 방법을 설명합니다.
- "아무것도 하지 않음"을 포함한 모든 옵션을 제공합니다. 탈출구 없는 만료 압박은 다크 패턴(dark pattern)입니다. "아무것도 하지 않아도 괜찮습니다"라는 문구는 의도적으로 포함되었습니다. 사용자는 카운트다운을 원하는 것이 아니라, "생각해 볼 수 있도록" 옵션을 요청했기 때문입니다.
배포 후 며칠이 지났을 때, 동일한 사용자의 에이전트는 요청하지 않았음에도 정확한 만료 날짜를 두 번이나 알려주었습니다. 그의 리뷰는 다음과 같았습니다: "경고가 여전히 남아 있네요... 더 좋습니다."
일반화 가능한 교훈
에이전트가 귀하의 API를 소비한다면, 다음 세 가지를 가정하십시오:
- 귀하의 응답은 디스플레이(display)가 아니라 인계(hand-off)입니다. 에이전트 너머 어딘가에는 귀하의 출력물에 대한 *요약(summary)*을 받게 될 인간이 있습니다. 그 요약 과정에서 무엇이 살아남아야 하는지 결정하고, 이를 패키징하십시오.
- 행동이 필요할 때는 필드 이름을 지침처럼 명명하십시오.
tellYourUser,nextCommands,suggestedCommand는metadata,info,details보다 성능이 뛰어납니다. 에이전트는 어포던스(affordances, 행동 유도성)에 따라 행동합니다. - 인간을 위한 진실 옆에 기계를 위한 진실을 두십시오. 동일한 결과에
deployment.expiresAt(로직을 위한 ISO 형식)와 친절한 문장(전달을 위한 용도)을 함께 담으십시오. 에이전트가 파싱(parsing)과 설명(explaining) 중 하나를 선택하게 만들지 마십시오.
이 중 어느 것도 openpouch에만 국한된 것이 아닙니다. 만약 여러분이 결제 CLI (Command Line Interface), 마이그레이션 도구, 크론 서비스(cron service) 등—에이전트가 인간을 대신하여 작동하는 그 어떤 것이든—을 구축하고 있다면, 릴레이 격차(relay gap)는 여러분에게도 적용됩니다.
시도해보기
이 모든 과정은 계정 없이도 작동합니다(그것이 핵심입니다):
npx openpouch deploy . --json
또는 Claude Code의 네이티브 MCP 도구로 사용할 수 있습니다(모든 기능이 명시되어 있으며, 의도적으로 approve는 포함하지 않았습니다 — 프로덕션 환경은 인간의 승인 단계를 유지합니다):
claude mcp add openpouch -- npx -y @openpouch/mcp
참고로, 릴레이(relay) 교훈은 계속해서 결실을 맺고 있습니다. 최신 필드들도 동일한 패턴을 따릅니다. deploy --app <name>은 향후 모든 재배포(redeploys)에 걸쳐 앱에 하나의 안정적인 URL을 부여합니다. 그리고 결과값에 urlStability: "stable"이라고 표시되므로, 에이전트는 추측하는 대신 사용자에게 "공유하신 링크가 계속 작동합니다"라고 말할 수 있습니다. data push/data pull은 앱의 지속성 볼륨(persistent volume)에 실제 파일을 넣고 뺄 수 있게 하여, "내 앱을 마이그레이션하고 데이터를 유지해줘"라는 요청을 에이전트가 진정으로 완수할 수 있는 작업으로 바꿔줍니다.
정직한 한계점(2026년 7월 기준): Node/정적(static) 환경만 지원(아직 Python 런타임은 없음), 커스텀 도메인 아직 미지원, 익명 프리뷰는 72시간 후 만료됩니다(계정이 있으면 사용 중인 앱을 계속 유지할 수 있습니다; 안정적인 URL 앱과 지속성 볼륨은 계정 기능입니다). 모든 것은 오픈 소스(Apache-2.0)입니다: https://github.com/openpouch/openpouch — 그리고 에이전트용 엔트리 포인트(entry point)는 https://openpouch.dev/llms.txt입니다.
여러분이라면 tellYourUser에 무엇을 담으시겠습니까? 그리고 에이전트용 도구에 어떤 필드가 추가되기를 바라시나요?
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기