Vercel에서 에이전트에게 제품 디자인 가르치기
TMThttps://vercel.com/blog/teaching-agents-product-design-at-vercel
코딩 에이전트는 동작하는 UI를 빠르게 만들어낼 수 있습니다. 하지만 정작 어려운 건 다른 종류의 문제입니다. 에이전트는 여러분 제품의 스타일을 흉내 내고, 패턴을 맞추고, 컨벤션을 따르려 시도할 수 있습니다. 정작 하지 못하는 건 그 패턴이 왜 존재하는지를 이해하는 일입니다. 코드는 무엇이 출시되었는지를 보여줄 뿐, 왜 특정 컴포넌트나 문구, 인터랙션이 표준으로 자리 잡았는지는 알려주지 않습니다. 그 이유는 디자인 리뷰와 PR 코멘트, 슬랙 스레드, 그리고 그 자리에 있었던 사람들의 머릿속에 남아 있습니다. 에이전트에게는 코드베이스에 없는 맥락은 존재하지 않는 것이나 마찬가지입니다.
Vercel은 에이전트 네이티브 팀입니다. 우리는 확정된 제품 의사결정을 코드처럼 다룹니다. 저장소에 보관하고, 변경 사항을 그 기준에 비추어 리뷰하며, 그곳에서 일하는 모든 에이전트가 활용할 수 있게 합니다.
우리가 이를 실현하는 방법은 product-design입니다. 세 부분으로 이루어진 시스템입니다:
- 제품이나 코드베이스에 대한 판단이 필요한 의사결정의 배경 맥락을 코딩 에이전트에게 제공하는 에이전트 스킬.
- 명확한 규칙을 자동으로 강제하는 린터.
- 슬랙과 Figma, GitHub에서 근거를 수집한 뒤, 리뷰를 위한 가이드라인 업데이트를 준비하는 리뷰 루프.
어떤 팀이든 자기만의 표준을 중심으로 동일한 구조를 만들 수 있습니다.
product-design 스킬 내부
이 스킬은 자신이 관장하는 코드와 함께 저장소 안에 자리합니다. 구조를 간략히 살펴보면 다음과 같습니다:
repository/
├── AGENTS.md
├── .agents/
│ └── skills/
│ └── product-design/
│ ├── AGENTS.md
│ ├── SKILL.md
│ ├── references/
│ │ ├── product-judgment.md
│ │ ├── interface-quality.md
│ │ ├── resilience.md
│ │ ├── surfaces.md
│ │ ├── surfaces-{surface}.md
│ │ ├── copy.md
│ │ ├── rules.md
│ │ ├── glossary.md
│ │ ├── patterns.md
│ │ └── coverage-gaps.md
│ └── exemplars/
│ └── pr-{name}.md
└── tooling/
└── scripts/
└── evals/
├── fixtures.json
├── rules-checklist.json
└── <fixture>/
├── before/
└── after/저장소 안의 product-design 스킬 구조.
- 저장소의
AGENTS.md는 코딩 에이전트에게 언제 스킬을 불러올지 알려줍니다. 스킬 내부의AGENTS.md는 로드 순서와 검증, 거버넌스를 정의합니다.SKILL.md는 런타임 워크플로를 담당합니다. references/에는 제품 판단, 인터페이스 품질, 복원력, 카피, 표준 제품 명칭, 인터랙션 패턴, 그리고 화면별 의사결정이 담겨 있습니다.exemplars/는 출시된 PR에서 반복할 만한 의사결정과 피해야 할 실수를 함께 기록합니다.coverage-gaps.md는 아직 표준이 없는 영역을 정리해 둡니다.copywriting-eval/은 카피와 인터페이스 언어의 동작을 테스트합니다. product-design 워크플로 전반을 평가하지는 않습니다.
스킬이 라우팅하는 방식
SKILL.md는 먼저 요청 모드를 판별합니다. shape, implement, review, copy, harden 중 하나입니다. 덕분에 점검(audit)이 수정으로 번지거나 카피 작업이 재설계로 확장되는 일을 막습니다. 백엔드 전용 작업, 텔레메트리, 콘솔 오류, 생성된 파일, 그리고 출시 UI에 영향이 없는 테스트는 건너뜁니다.
스킬은 내용을 복제하는 대신 표준 출처로 라우팅합니다. 컴포넌트 API, 디자인 시스템 규칙, 접근성 기준, 인터랙션 가이드는 각각의 소유자에게 그대로 남습니다.
라우팅은 작업과 화면 양쪽에 맞춰 구체화됩니다. 중대한 변경은 제품 판단과 인터페이스 품질 자료를 먼저 불러옵니다. 카피, 컴포넌트, 레이아웃, 인터랙션, 접근성, 복원력 작업은 각각 해당하는 집중 레퍼런스로 라우팅됩니다. 모달은 파괴적 동작 패턴과 표준 동사를 불러옵니다. 설정 폼은 라벨, 검증, 점진적 노출, 접근 가능한 이름(accessible-name) 가이드를 불러옵니다.
이 간소화된 구조를 출발점으로 삼아, 경로와 표준을 여러분의 것으로 바꿔 쓸 수 있습니다:
---
name: product-design
description: >-
apps/vercel-site에서 제품 디자인과 사용자 대면 제품 구현을 위한 단일 진입점.
사용자가 보고, 이해하고, 선택하고, 행동하는 것을 바꾸는 모든 작업에서 사용한다:
요구사항과 플로우 설계; 페이지와 컴포넌트의 신규 구축 또는 재설계; URL, 스크린샷,
diff, Vercel Agent 발견 사항 리뷰; 제품 카피, 정보 구조, 컴포넌트 선택, Geist 준수,
위계, 레이아웃, 인터랙션, 접근성, 반응형 동작, 그리고 로딩·빈 상태·오류·권한·결제·파괴적
상태의 개선. design, UX, UI, 사용성, 플로우, 온보딩, 설정, 대시보드, build, improve,
fix, audit, review, polish, simplify, production-ready 요청에서 트리거된다. 백엔드
동작이 사용자에게 보이는 결과를 바꿀 때도 사용한다. 사용자에게 보이는 효과가 없는 백엔드
전용 작업, 출시 UI에 영향이 없는 테스트, 텔레메트리 전용 작업, 문서, 마케팅 콘텐츠에는
사용하지 않는다.
---
# Vercel 제품 디자인
사용자와 제품, 그리고 Vercel 모두에게 올바른 인터페이스를 만든다. 동작하는 코드만으로는 충분하지 않다: 올바른 인터랙션을 고르고, 범위와 결과를 명확히 하며, 정상 경로(happy path) 너머의 현실까지 다루고, 렌더링된 결과를 검증한다.
## 운영 원칙(Operating Contract)
- **픽셀이 아니라 할 일에서 시작한다.** 누가 행동하는지, 무엇을 달성하려 하는지, 관련된 제품 객체가 무엇인지, 시스템이 무엇을 바꿀지를 파악한다.
- **산출물보다 결과를 먼저 정의한다.** 화면이나 컴포넌트를 고르기 전에 현재 사용자 문제, 원하는 동작, 성공 신호, 그리고 비목표(non-goals)를 확정한다.
- **취향이 아니라 근거를 사용한다.** 의사결정을 제품 동작, 표준 저장소 가이드, 확정된 디자인 결정, 또는 검증된 인접 패턴에 근거를 두고 추적한다.
- **사실과 결정을 분리한다.** 가정과 아직 결정되지 않은 제품 선택을 명시적으로 표시한다. 구현 세부사항 안에 숨기지 않는다.
- **출시된 코드는 자동적인 선례가 아니라 근거로 다룬다.** 무엇이 존재하는지는 증명하지만, 왜 그것이 옳은지는 증명하지 않는다. 현재 컴포넌트, 제품 동작, 명시적 가이드에 비추어 확인한다.
- **가장 작고 일관된 개입을 선택한다.** UI를 추가하기 전에 더 나은 기본값, 동작, 또는 재사용을 먼저 고려한다. 하나의 일을 해결하려고 관련 없는 설정이나 추상화를 만들지 않는다.
- **꾸미기 전에 결정한다.** 스타일링이나 카피 수정에 앞서 정보 구조, 컴포넌트 의미, 인터랙션, 상태 동작을 먼저 정한다.
- **도달 가능한 모든 상태를 설계한다.** 제품이 실제로 진입할 수 있는 상태만 포함하되, 데이터가 채워진 성공 케이스에서 멈추지 않는다.
- **실제 화면을 검증한다.** 소스 점검은 동작을 확인해 주고, 렌더링된 인터페이스는 시각적·인터랙션 품질을 확인해 준다. 코드만으로 시각적 검증을 했다고 주장하지 않는다.
`product-design`
## 요청 모드(Request Modes)
행동하기 전에 사용자의 동사와 산출물로부터 모드를 판별한다.
| 모드 | 일반적 요청 | 요구되는 행동 |
| --------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Shape | "이 플로우를 디자인해줘", "이건 어떻게 동작해야 해?", UI가 확정되지 않은 기능 브리프 | 문제와 근거를 정리하고, 중대한 대안들을 비교한 뒤, 플로우·상태·수용 기준·위험·미해결 결정을 정의한다. 요청받지 않는 한 수정하지 않는다. |
| Implement | "구축", "수정", "개선", "규정 준수", 또는 "전체에 product-design 적용" | 중대한 제품 의사결정을 정리한 뒤, 범위 내에서 가장 작고 일관된 종단 간(end-to-end) 변경을 구현한다. 관련 없는 리뷰 발견 사항을 끌어들이지 않는다. |
| Review | "점검", "비평", "뭐가 문제야?", 코드 리뷰 | 소스와 렌더링된 근거를 점검한 뒤, 우선순위가 매겨진 발견 사항을 보고한다. 요청받지 않는 한 수정하지 않는다. |
| Copy | "카피 수정해줘", "이 오류 메시지 다시 써줘" | 사용자 대면 문구, 접근 가능한 이름, 그리고 직접적으로 필요한 JSX만 수정한다. 구조적 장애물은 조용히 범위를 넓히지 말고 보고한다. |
| Harden | "다듬기", "프로덕션 준비", "엣지 케이스 처리" | 확정된 제품 방향을 유지하면서 상태, 복원력, 반응형, 접근성, 마감 결함을 수정한다. |
의도가 모호할 때는 동사가 뒷받침하는 가장 좁은 모드를 사용한다. URL, 스크린샷, 라우트, 컴포넌트는 범위를 특정해 줄 뿐, 그 자체로 수정을 허가하지는 않는다.
중대한 결정이란 사용자의 작업, 기본값, 범위, 결과, 내비게이션, 인터랙션 화면, 또는 도달 가능한 상태를 바꾸는 것이다. 카피의 기계적 처리, 토큰 치환, 확립된 컴포넌트 교체는 대개 중대하지 않다.
## 결정 권한(Decision Authority)
충돌은 다음 순서로 해소한다:
1. 사용자의 명시적 목표와 제약.
2. 검증된 사용자/제품 근거와 시스템의 사실.
`AGENTS.md`
4. 안정적인 근거를 갖춘, 확정된 제품/디자인 결정과 예시(exemplar).
5. 동일 제품 영역에서 검증된, 출시된 인접 패턴.
6. 일반적인 인터페이스 휴리스틱.
## 워크플로(Workflow)
### 1. 범위와 모드 설정
작업 계획이나 리뷰 노트에 대상 화면과 요청 모드를 명시한다.
### 2. 제품 맥락 로드
`AGENTS.md`
### 3. 제품 의사결정 모델링
`product-judgment.md`
### 4. 화면과 상태 매핑
진입점, 보이는 영역, 오버레이, 전환, 종료 경로, 복귀 경로를 목록화한다. 로딩, 빈 상태, 희소(sparse), 채워진 상태, 검증, 오류, 권한, 비활성, 낙관적(optimistic), 오래된(stale), 파괴적, 반응형 변형을 포함해 도달 가능한 상태만 매핑한다.
### 5. 라우팅된 레퍼런스 로드
| 필요 | 로드 |
| ---- | ---- |
`product-judgment.md`
`interface-quality.md`
`copy.md`
`design-guidelines`
`web-interface-guidelines`
`resilience.md`
### 6. 결정한 뒤 구현
기계적이지 않은 변경마다 다음에 답할 수 있어야 한다: 이것은 어떤 사용자 문제를 해결하는가, 왜 이 컴포넌트가 적절한가, 인터페이스가 전달해야 할 결과는 무엇인가, 어떤 근거가 이 결정을 뒷받침하는가, 그리고 가장 작고 일관된 변경은 무엇인가?
### 7. 검증
1. 주요 작업과 수용 기준을 확인한다.
2. 저장소 린트 검사를 실행한다.
3. 관련된 좁은 뷰포트와 넓은 뷰포트를 점검한다.
4. 중대하게 변경된 도달 가능한 상태를 모두 실행해 본다.
5. 키보드 순서, 포커스 이동, 로딩 동작, 포인터/터치 타깃을 검증한다.
6. 긴 콘텐츠, 큰 값, 제한된 너비, 그리고 현지화/RTL 위험을 테스트한다.
`review-design-system`
## 제품 디자인 표준(Product Design Standards)
- 사용자의 주요 작업과 주요 동작을 명확하게 만든다.
- 검증된 문제를 해결하는 경우가 아니라면 사용자의 멘탈 모델과 현재 맥락을 유지한다.
- 중요한 동작의 정확한 대상, 범위, 결과를 명시한다.
- 내비게이션에는 내비게이션 컴포넌트를, 동작에는 동작 컴포넌트를 사용한다.
- 중요도에 맞춰 화면의 지속성(persistence)을 선택한다.
- 모달을 추가하기 전에 인라인 노출을 우선한다.
- 기본 경로가 그 복잡성을 떠안지 않도록 하면서, 필요할 때 고급 컨트롤을 노출한다.
- 사용자가 배우고 관리해야 하는 설정을 추가하기보다, 강력한 기본값과 직접적인 동작을 우선한다.
- 커스텀 HTML이나 스타일링에 앞서 의미론적 Geist 컴포넌트와 그 API를 사용한다.
- 컨테이너를 추가하기 전에 위계, 간격, 정렬을 활용한다.
- 검증과 복구 가능한 오류 상황에서도 사용자 입력을 보존한다.
- 로딩 중 컨트롤 라벨을 그대로 유지하고, 컴포넌트의 로딩/바쁨(busy) 어포던스를 사용한다.
- 파괴적 동작은 그 영향에 비례하게 만들고, 시스템이 정직하게 지원할 수 있을 때 실행 취소(undo)를 제공한다.
- 구조, 상태, 브랜드 의도를 명확히 하는 경우가 아니라면 장식적인 새로움, 모션, 카피를 추가하지 않는다.
## 리뷰 산출물(Review Output)
사용자 영향 순으로 정렬한 발견 사항을 먼저 제시한다:
- **P0:** 주요 작업을 가로막거나, 심각한 접근성 실패를 일으키거나, 복구 불가능한 사용자 피해를 초래할 수 있음.
- **P1:** 작업 실패 가능성이 높거나, 결과를 오도하거나, 중요한 상태가 누락되었거나, 중대한 반응형/접근성 결함.
- **P2:** 의미 있는 마찰, 비일관성, 약한 위계, 또는 복구 가능성 문제.
- **P3:** 사소한 완성도나 일관성 개선.
각 발견 사항에는 다음을 포함한다: 파일/라인 또는 렌더링된 위치, 검증 상태, 표준 출처, 사용자에게 미치는 결과, 그리고 가장 작고 구체적인 수정안.
## 스킬 무결성(Skill Integrity)
- 규칙은 최신 출처 검증과 사람의 승인을 거친 뒤에만 추가하거나 변경한다.
- 범위, 근거, 증거, 예외, 그리고 나쁜/좋은 예시를 기록한다.
- 가장 좁은 대상을 우선한다: 표준 출처, 라우팅된 레퍼런스, 예시, 린트/eval 검사, 또는 커버리지 갭.
- 결정론적 검사는 기계적으로 유지한다. 판단은 그 근거와 자유도와 함께 산문으로 남긴다.
- 스크린샷 하나, 출시된 파일 하나, 리뷰어 코멘트 하나만으로 그것을 보편적 규칙으로 격상하지 않는다.product-design의 SKILL.md. 라우팅 모드, 운영 원칙, 거버넌스.
라우팅은 이 스킬을 유용하게 만드는 일부일 뿐입니다. 나머지 절반은 스킬이 발견 사항을 만들어낸 뒤에도 그것이 어떻게 추적 가능하게 유지되는가입니다.
발견 사항을 추적 가능하게 만들기
카피 규칙에는 안정적인 ID가 있고, 각자의 표준 출처를 가리킵니다:
rule/destructive-names-action
출처: copy.md > Actionable; verbs.md
규칙: 파괴적 CTA는 동사 + 명사 형식을 따른다.
Confirm, OK, 또는 단독 동사를 절대 쓰지 않는다.안정적인 ID와 표준 출처를 갖춘 규칙 형식 예시.
Vercel Agent가 패치를 제안할 때는, 제안을 게시하기 전에 안전한 Vercel Sandbox에서 저장소의 빌드, 테스트, 린터로 변경 사항을 검증합니다.
더 빠른 피드백을 위해 린터를 사용하기
린터가 규칙을 안정적으로 강제할 수 있을 때는 결정론적 검사를 선호합니다. 린터는 실행이 빠르고 비용이 적게 들기 때문에, 개발자와 코딩 에이전트는 나중의 리뷰를 기다릴 필요 없이 작업하는 도중에 피드백을 받습니다.
코드는 두세 개의 정적 옵션을 셀 수 있으므로, 린터가 라디오 버튼을 추천할 수 있습니다. 파괴적 동작에 대해 올바른 대상과 결과를 명명하는 일은 제품 맥락이 필요하므로, 이는 스킬이 담당합니다.
코드베이스에 있는 예시에는 다음과 같은 규칙들이 있습니다:
- 포커스 관리, 키보드 내비게이션, 레이어링을 망가뜨리는 중첩 모달을 막습니다.
- 두세 개의 정적 옵션에는 select 대신 라디오 버튼을 추천해, 모든 선택지가 보이도록 합니다.
- 아이콘 버튼과 폼 컨트롤에 접근 가능한 이름을 요구하고, 공유 포커스 토큰을 우회하는 커스텀 포커스 링을 거부합니다.
- 레이아웃 클래스는 허용하면서도,
className이 디자인 시스템 컴포넌트의 색상, 반경(radius), 그림자를 덮어쓰지 못하게 막습니다. - 긴 콘텐츠가 제대로 스크롤되고 헤더와 푸터가 고정(sticky) 상태를 유지할 수 있도록
Modal.Body를 요구합니다. - 원시 그림자(raw shadow)를 테마를 인식하는 Material 클래스로 교체하고, Material에 내장된 처리와 중복되는 테두리를 거부합니다.
- 4px 그리드에서 벗어난 임의의 간격을 표시하고, 해당하는 표준 유틸리티가 있으면 제안합니다.
각 규칙은 그 패턴이 왜 문제인지 설명하고 구체적인 수정안을 제안합니다. 일부 규칙은 더 이상 사용되지 않는 Tailwind 유틸리티 이름을 교체하는 것처럼 안전한 마이그레이션을 자동으로 수정합니다.
확정된 의사결정은 여러 형태를 띨 수 있습니다:
- Checkbox 모범 사례처럼, 관련 Geist 컴포넌트 옆에 두는 사람이 읽을 수 있는 가이드.
product-design스킬 안의 에이전트 가이드.- 코드가 안정적으로 검사할 수 있을 때의 린트 규칙.
아래 린트 규칙은 하나의 제품 가이드라인이 결정론적 검사로 어떻게 인코딩되는지 보여줍니다:
/** @type {import('eslint').Rule.RuleModule} */
module.exports = {
meta: {
type: 'suggestion',
docs: {
description: 'Suggest Radio buttons when Select has 2-3 static options',
category: 'Design System',
recommended: true,
},
schema: [],
messages: {
preferRadio:
'Select with {{ count }} static options. Consider using Radio buttons — they show all options at once without requiring a click to open.',
},
},
create(context) {
return {
JSXElement(node) {
const opening = node.openingElement;
if (opening.name.type !== 'JSXIdentifier') return;
if (opening.name.name !== 'Select') return;
const hasDynamic = node.children.some(
(child) =>
child.type === 'JSXExpressionContainer' &&
child.expression.type === 'CallExpression',
);
if (hasDynamic) return;
const optionChildren = node.children.filter(
(child) =>
child.type === 'JSXElement' &&
child.openingElement.name.type === 'JSXIdentifier' &&
child.openingElement.name.name === 'option',
);
if (optionChildren.length < 2 || optionChildren.length > 3) return;
context.report({
node: opening,
messageId: 'preferRadio',
data: { count: String(optionChildren.length) },
});
},
};
},
};정적 옵션이 2~3개인 select보다 라디오 버튼을 추천하는 린트 규칙.
이들 각각은 한 부류의 실수를 자동으로 잡아내어, 코드 리뷰가 실제로 판단이 필요한 의사결정에 집중할 수 있게 해줍니다.
eval로 가이드를 테스트하는 방법
린트 규칙은 결정론적이지만 에이전트의 행동은 달라질 수 있습니다. 그래서 우리는 스킬이 한 번도 본 적 없는 인터페이스에서 스킬을 테스트합니다.
에이전트가 '이전(before)' 상태를 수정하면, 판정자(judge)가 그 결과를 루브릭에 비추어 검사합니다.
eval은 스킬에 문서화된, 출시된 예시에서 나옵니다. 홀드아웃(holdout)은 기대되는 수정 결과를 감춰서 가이드가 일반화되는지를 테스트합니다. 또한 스킬 없이 픽스처를 실행해, 스킬이 에이전트의 행동을 바꿨는지를 측정합니다.
우리는 규칙의 정확성을, 출시된 결과와의 유사도와 분리해서 채점합니다. 출시된 코드에는 에이전트가 그대로 재현하기보다 개선해야 할 결함이 들어 있을 수 있기 때문입니다.
가이드를 최신 상태로 유지하기
제품 표준은 컴포넌트, 이름, 워크플로, 실패 상태가 바뀜에 따라 함께 변하며, 모든 업데이트에는 근거와 사람의 리뷰가 필요합니다.
우리의 주간 근거 수집(evidence-intake) 워크플로는 product-design을 개선할 수 있는 디자인 피드백을 모읍니다. 슬랙 대화를 검색하고 Figma 파일, PR, 리뷰 코멘트, 프리뷰로 이어지는 링크를 근거로 보존합니다. 근거가 불완전할 때는 검증에 필요한 코드나 커밋을 기록합니다.
이 워크플로는 수집과 판단을 분리합니다:
- 수집자(collector)는 규칙을 제안하지 않고 메시지, 링크, 주변 맥락을 모읍니다.
- 별도의 판정자(judge)는 근거를 묶고, 출처를 검증하며, 미해결 질문을 기록합니다.
- 이 작업은 후보, 기각된 주제, 후속 요청, 커버리지 갭을 담은 리뷰 패킷을 만듭니다.
모든 후보는 출처로 연결되며 보류(pending) 상태로 남습니다. 경험 많은 리뷰어의 코멘트가 우선순위를 높일 수는 있지만, 그래도 모든 후보에는 근거가 필요합니다.
자동화는 리뷰 패킷에서 끝납니다. 후보가 에이전트 가이드, 린트 규칙, 예시, eval이 될지, 아니면 아무 변경도 하지 않을지는 사람이 결정합니다. 확정된 변경은 가장 좁은 관련 파일에 들어가고, 머지 전에 관련 검사를 통과합니다.
여러분의 코드베이스에 product-design 구축하기
우리의 구성은 Vercel의 제품, 컴포넌트, 리뷰 이력을 반영하지만, 다른 팀도 이 구조를 자기만의 표준에 맞게 적용할 수 있습니다.
1. 반복되는 의사결정에서 시작하라
같은 리뷰 코멘트가 계속 등장하는 제품 화면 하나를 고르세요: 파괴적 동작, 오류 상태, 설정 폼, 빈 상태, 또는 내비게이션. 출시된 코드와 실제 리뷰에서 예시를 모으고, 그 결정과 그것이 왜 중요한지, 예외, 그리고 출처를 적어 두세요.
clear, polished, intuitive 같은 막연한 형용사로 시작하지 마세요. 에이전트에게는 관찰 가능한 의사결정이 필요합니다. 파괴적 동작은 동사 + 명사를 사용한다는 쓸 수 있습니다. 버튼은 명확해야 한다는 그렇지 않습니다.
# 의사결정: {name}
상태: proposed | accepted | rejected
범위:
결정:
근거:
증거:
예외:
나쁜 예시:
좋은 예시:
가정:
미해결 결정:의사결정 기록 템플릿.
다른 화면으로 확장하기 전에, 여러분의 화면에 해당하는 필드를 채우세요.
2. 명시적 트리거와 확고한 경계를 추가하라
지속적인 저장소 지침에서 에이전트에게 언제 스킬을 불러올지 알려주고, 스킬이 다루는 파일과 화면을 건너뛰어야 할 영역과 함께 정의하세요. 별도의 Next.js eval에서, 에이전트는 사용 가능한 스킬을 호출하지 못한 경우가 56%에 달했습니다. 트리거를 가이드와 분리해서 테스트하세요. 스킬을 불러오지 못하는 것과 규칙을 따르지 못하는 것은 서로 다른 문제이기 때문입니다.
사용자 대면 UI를 설계, 수정, 또는 리뷰할 때는
.agents/skills/product-design/SKILL.md를 불러온다.
적용 대상:
- 사용자 대면 페이지와 컴포넌트
- 카피, 인터랙션, 접근성, 반응형 동작, 그리고 상태
건너뛸 것:
- 사용자에게 보이는 효과가 없는 백엔드 전용 작업
- 텔레메트리, 생성된 파일, 문서, 그리고 마케팅product-design 스킬을 위한 AGENTS.md 트리거와 범위 경계.
에이전트에게 어떤 화면과 레퍼런스를 불러왔는지 보고하게 한 뒤, 발견 사항이 그 출처를 인용하는지 검증하세요.
3. 라우팅, 규칙, 근거를 분리하라
짧은 진입점을 사용해 화면을 식별하고 집중된 레퍼런스를 불러오세요. 세부 내용은 리뷰어들이 이미 논의하는 화면과 의사결정을 중심으로 정리하세요: 폼, 모달, 내비게이션, 제품 어휘, 워크플로 상태, 그리고 화면 간(cross-surface) 패턴.
규칙에 안정적인 ID를 부여하고 예시 및 출처와 연결하세요. 출시된 예시를 유용한 의사결정과 알려진 결함 양쪽 모두와 함께 기록하고, 누락된 가이드는 커버리지 갭 목록에 드러나게 유지하세요.
# {화면}
로드 시점:
표준 소유자:
## rule/{stable-id}
범위:
규칙:
이유:
예외:
출처:
## 예시
나쁨:
좋음:
## 커버리지 갭
- {누락된 의사결정 또는 근거}안정적인 ID, 예시, 커버리지 갭을 갖춘 규칙 레퍼런스 템플릿.
커버리지 갭 목록은 누락된 가이드를 명시적으로 드러냅니다.
4. 명확한 규칙에는 코드를 사용하라
린터가 문제를 안정적으로 식별할 수 있다면, 거기서 규칙을 강제하세요. 의사결정에 제품이나 코드베이스 맥락이 필요할 때는 에이전트 가이드를 사용하세요. 새로운 표준, 정책 선택, 미해결 제품 결정은 사람의 손에 남겨 두세요.
문서화된 예시로는 학습 픽스처를, 기대되는 수정 결과가 스킬에 나타나지 않는 인터페이스로는 홀드아웃을 만드세요. 검색(retrieval)과 적용을 따로 테스트하세요. 에이전트가 스킬을 불러왔는지와 규칙을 따랐는지는 서로 다른 질문이기 때문입니다.
렌더링 없이 코드가 그 실패를 식별할 수 있는가?
- 아니오: 에이전트 가이드를 사용한다.
- 예: 그 규칙이 발생하기 쉬운 거짓 양성(false positive)을 피할 수 있는가?
- 아니오: 에이전트 가이드를 사용한다.
- 예: 위반에 구체적인 수정안이 있는가?
- 예: 린터를 사용한다.
- 아니오: 경고 또는 에이전트 가이드를 사용한다.
제품이나 코드베이스 맥락이 필요함: 에이전트 가이드를 사용한다.
새로운 표준이나 제품 정책을 수립함: 사람의 결정을 요구한다.
어느 경로든, 회귀를 잡아낼 수 있는 예시나 eval을 추가한다.린터와 에이전트 가이드 중에서 고르기 위한 의사결정 트리.
어떤 규칙이 많은 예외 없이는 안정적으로 유지될 수 없다면, 그 규칙을 다시 에이전트 가이드로 옮기세요.
5. 소유권과 업데이트 루프를 지정하라
새로운 근거를 정기적으로 리뷰하되, 가이드나 검사를 바꾸기 전에 사람의 승인을 요구하세요. 무엇이, 왜 바뀌었고 어떤 출처가 그것을 뒷받침했는지 기록하는 의사결정 로그를 유지하세요. 새 규칙을 제품 변경처럼 다루어 하나하나 리뷰하고 테스트하며, 더 이상 도움이 되지 않는 규칙은 제거하세요.
수집자 프롬프트
당신은 수집자다. 메시지, 링크, 파일, 주변 맥락을 모은다.
원시 자료만 작성한다. 후보를 채점하거나 규칙을 제안하지 않는다.
판정자 프롬프트
당신은 판정자다. 관련 근거를 묶기 전에 커버리지를 검증한다.
검증된 사실, 추론, 미해결 질문을 분리한다.
모든 후보를 보류 상태로 유지한다. 가이드를 수정하지 않는다.
사람 리뷰
선택한다: 규칙, 레퍼런스, 예시, 린트 규칙, eval, 커버리지 갭, 또는 변경 없음.
안정적인 근거, 명시적 범위와 예외, 그리고 승인자를 요구한다.수집자, 판정자, 사람 리뷰를 위한 근거 검토 프롬프트.
한 가지 화면과, 여러분 팀이 이미 반복하는 의사결정에서 시작하세요. 그 의사결정을 코드를 작성하고 리뷰하는 곳에 두고, 무엇이 표준이 될지는 사람이 책임지게 하세요.
직접 만들어 보기
가장 어려운 부분은 첫 번째 화면을 고르는 일입니다. 모든 팀에는 명문화할 가치가 있는 의사결정이 있습니다. 문제는 그것이 누군가의 머릿속에 있느냐, 아니면 에이전트가 찾을 수 있는 곳에 있느냐입니다. 이 패턴을 사용해 무언가를 만들거나 우리가 어떻게 구성했는지 궁금한 점이 있다면, 알려주세요.