Skill = 트리거 키워드 + 시각·동작 DNA + 호출 규약 의 *묶음*
별칭: Skill as Trigger Bundle · 트리거 묶음으로서의 스킬 · 스킬 정의
정의
Harness Engineering 의 Skill 레이어 는 본질적으로 다음 세 갈래의 묶음:
- 트리거 키워드 (Trigger keywords) — 언제 이 스킬을 호출할지의 자연어 신호. AI 가 사용자 발화를 받아 grep 없이 매칭한다.
- 시각·동작 DNA (Visual/Behavioral DNA) — 어떻게 산출물을 빚을지의 고정 규약. 색 hex 코드 / 폰트 / 위계 / 줄간격 / 카드 형식.
- 호출 규약 (Invocation contract) — 무엇으로 산출할지의 라이브러리·MCP·외부 API. (예:
pptxgenjs,/mnt/skills/public/pptx/SKILL.md우선 로드)
이 셋이 한 frontmatter + SKILL.md 본문 에 묶여 있을 때, AI 는 맥락·컨벤션·도구 를 동시에 끌어 와 결정적 산출 을 만든다.
사례 — 5 PPT 스킬 번들
# ppt-edge-dark/SKILL.md frontmatter (의도 형태)
name: ppt-edge-dark
description: |
가장자리 색 강조 다크 카드 PPT.
트리거: "엣지 다크 PPT", "edge dark PPT", "비교/결론 슬라이드", ...
시각 DNA: bg #000, card #141820, accent cyan/gold/violet 등
호출: /mnt/skills/public/pptx/SKILL.md 먼저 → pptxgenjs
→ 사용자가 "이 위키 내용으로 비교 슬라이드 만들어줘" 만 입력하면, 위 3 갈래가 자동으로 작동:
- 트리거 "비교 슬라이드" 매칭 →
ppt-edge-dark호출 - 시각 DNA
Top Accent카드 자동 사용 - 호출 규약
pptxgenjs자동 import
왜 묶음이어야 하나
세 갈래 중 하나만 빠져도 결과가 무너진다:
| 빠진 것 | 결과 |
|---|---|
| 트리거 키워드 ❌ | 스킬이 호출되지 않음 — 사용자가 매번 명시해야 |
| 시각 DNA ❌ | 산출물이 제멋대로 — 강의 5 PPT 가 5 가지 다른 강의 로 보임 |
| 호출 규약 ❌ | 라이브러리 추측 → 환경마다 다르게 동작 |
→ Skill = 세 갈래 동시 의 기본 단위. 분리 ❌.
안티패턴 — 자주 보는 잘못된 skill 정의
| 안티패턴 | 왜 무너지는가 |
|---|---|
description 에 트리거만 적고 시각 DNA 없음 | AI 가 매번 색·폰트 를 새로 추측 → 일관성 ❌ |
| 시각 DNA 만 적고 호출 규약 없음 | pptxgenjs 인지 python-pptx 인지 모름 → 환경 의존 |
| 트리거 너무 모호 ("PPT 만들어줘") | 5 자매 스킬 중 어느 것을 부를지 모름 → 라우터 필요 |
| 트리거 너무 좁음 ("ppt-edge-dark 호출") | 사용자가 스킬명을 외워야 하면 패배 |
본 강의의 5 스킬은 위 4 안티패턴을 모두 피했다 — 그래서 자연어 한 줄 이 PPT 5 종을 자동 분기한다.
강의 활용
3 중 가드레일 강의에서 Skill 레이어 의 형태 를 보여 줄 때 본 항목을 정의로 사용. Hook / Subagent 와 대비되는 Skill 만의 정의 형태.
관련 용어
- Non-obvious Pattern — Skill 본문 에 시각 DNA 의 규약 이 적힌 자리. 코드만 봐서는 obvious 하지 않은 색·폰트 규약을 박제.
- Lazy Loading CLAUDE.md — Skill 도 같은 원리. 루트 CLAUDE.md 가 모든 스킬을 직접 알 필요 없음. 트리거 매칭 시점에 lazy 로드.