당근 SEED
디자인 시스템은 제 일과 무관했습니다. 값어치는 레포를 에이전트가 읽을 수 있게 정리한 방식에 있었습니다.
컴포넌트와 토큰은 제 일과 무관했고, 값어치는 전혀 다른 데 있었습니다. 이 레포가 실제로 보여준 것은 디자인 시스템이 아니라 — 사람용 문서 옆에 에이전트용 진입로를 나란히 둔 레포 운영 구조입니다. 거기서 기법 일곱을 수확이라 적었는데, 나흘 뒤 제 환경을 실측하고 다섯을 지웠습니다. 살아남은 둘은 훅 하나짜리입니다.
무엇을 뜯었나
당근의 공개 디자인 시스템이다. 토큰과 컴포넌트를 YAML로 정의하고, 거기서 CSS를 생성하고, React와 Lynx용 라이브러리로 내보낸다. Apache-2.0, 별 1,023개, 커밋 3,488건.
토큰 설계 자체는 배울 게 적었다 — 의도(color.primary)와 값(color.carrot500)을 분리해 두면 환경이 바뀔 때 스키마를 안 건드리고 값만 갈아 끼운다는 발상인데, 제 쪽에도 같은 형태가 이미 있다(규칙과 실행 기계의 분리, 좌표를 절대 픽셀이 아니라 비율로 들고 있는 것). 새로 배울 것이라기보다 이미 쓰고 있는 패턴의 이름표다.
진짜 볼 것은 그 아래층이었다.
2차 전달을 1차 출처로 검증한 결과
입구가 인스타그램 게시물이었다. 대체로 정확하다 — 대부분이 공식 문서를 그대로 옮긴 것이라 사실 오류가 없다. 그런데 한 문장이 실무자를 오해시킨다.
하나의 토큰 소스에서 React, iOS, Android, Lynx까지 여러 플랫폼에 일관된 디자인을 전달
문자 그대로 읽으면 틀린다. 레포 트리 8,100 엔트리를 전수 검색한 결과 — Swift 파일 0개, Kotlin 파일 0개, iOS·Android 디렉터리 0개. 공개 패키지 26개 중 모바일 네이티브 산출물이 없다.
원문을 찾아가 보면 iOS·Android 열거형이 이 프리셋으로부터 “생성될 수 있다”고 적혀 있다. 가능성 서술이지 산출물 제공이 아니다.
로드맵 문장을 현황으로 읽게 만드는 형태다. 게시물이 거짓말을 한 게 아니라, 원문의 조건법을 평서문으로 옮긴 것뿐인데 그것만으로 판정이 뒤집힌다.
이 레포의 신기술은 컴포넌트가 아니었다
사람용 문서 옆에 에이전트용 배선을 나란히 둔 것. 게시물은 MCP 서버 두 개만 언급했는데, 실물은 그보다 넓었다.
LLM 전용 진입로를 3단으로 판다. 루트 인덱스가 영역 목록만 주고 → 영역 인덱스가 문서 목록을 주고 → 단건 URL이 본문을 준다. 에이전트가 필요한 만큼만 내려가서 읽는다.
스킬을 단일 원천 + 링크로 둔다. 소비처가 셋인데 파일은 한 벌이고, 나머지는 전부 그 디렉터리로의 링크다. 원문이 이렇게 적어 뒀다 — “신규·수정은 이 디렉터리에서만 수행한다. 링크이므로 별도 동기화 작업은 불필요하다.” “동기화하라”를 규칙으로 쓴 게 아니라 구조로 불가능하게 만들었다.
생성 파일 수정을 훅이 막는다. 그런데 차단만 하는 게 아니라 원본 위치와 재생성 명령을 같이 출력한다. 설계 요점이 거기 있다 — 가드가 막다른 길이 아니라 안내판이다.
훅을 세 시점에 나눠 건다. 편집 전에는 생성물을 막고, 편집 후에는 고친 경로를 보고 필요한 빌드를 알아서 돌리고, 세션을 끝내려 할 때는 고친 파일들을 위험 패턴에 대조해 검증 없이 끝내려 하면 붙잡는다.
검사 전용 에이전트를 따로 둔다. 네 종 중 셋이 편집 도구를 아예 갖고 있지 않다 — 판정만 하고 고치지 않는다. 코드를 짜는 에이전트가 아니라 구조와 문서가 어긋났는지 보는 에이전트다.
게시물에 없는 것도 하나 건졌다. MCP 서버에 모드 옵션이 있는데, 문서가 이유를 이렇게 적었다 — “해당 모드에서 사용 가능한 도구만 등록하여 컨텍스트 크기를 줄일 수 있습니다.” MCP 서버를 도구 묶음이 아니라 컨텍스트 예산 단위로 설계한 사례다.
그리고 제 수확 판정이 깨졌습니다
1차에서 기법 일곱을 수확이라 적었다. 각각에 “제가 이미 겪은 사고”를 붙여 뒀으니 근거가 있어 보였다. 나흘 뒤 제 환경을 실측하고 다섯을 지웠다. 이미 갖고 있거나, 헛다리였다.
특히 한 건이 나빴다. 과거에 겪은 사고와 이 레포의 기법을 그럴듯하게 짝지어 놨는데, 인과가 맞지 않았다. 그 사고의 원인은 그 기법이 막는 것이 아니었다.
이 오류는 레포를 아무리 정독해도 안 잡힌다. 제 설정 파일을 열어야만 잡힌다. 대상 쪽 자료를 아무리 깊게 읽어도 “내 쪽 원인이 무엇이었나”는 거기 없기 때문이다.
살아남은 건 둘이고, 둘 다 훅 하나짜리다.
| 할 일 | 막는 사고 |
|---|---|
| 소스를 고치면 빌드 스크립트를 자동 실행 | 고쳐 놓고 생성물 동기화를 잊는다 |
| 세션 끝에 검증 리마인더 한 줄 | “정적으로 통과”를 작동 검증으로 착각한다 |
둘 다 차단하지 않고 경고만 하는 모드로 먼저 돌린다. 세션 끝마다 뜨는 훅이 소음이 되면 즉시 역효과다.
남는 문장
“외부 레포에서 기법을 수확했다”는 판정은, 내 환경을 실측하기 전에는 유효하지 않다.
이 페이지에서 그 판정이 7에서 2로 줄었다. 줄어든 다섯은 레포가 나빠서가 아니라 제가 제 환경을 안 보고 적었기 때문이다.