GITHUB 레포 딥다이브 · 2026-07-31 · YIZHIYANHUA-AI/FIREWORKS-TECH-GRAPH · 자연어 → 기하 검증된 SVG 다이어그램을 뽑는 에이전트 스킬

fireworks-tech-graph 딥다이브
말로 시키면, 검사까지 통과한 다이어그램이 나온다

fireworks-tech-graph는 "Mem0 메모리 아키텍처 그려줘, 다크 스타일로" 같은 자연어 한 줄을 받아 SVG 기술 다이어그램 + 1920px PNG + (요청 시) GIF 애니메이션 + 오프라인 인터랙티브 HTML까지 만들어 주는 에이전트 스킬(Agent Skill)이다. Claude Code와 Codex(OpenAI) 어느 쪽에 설치해도 같은 폴더 그대로 동작한다.

겉보기엔 "AI 그림 도구"지만 진짜 정체는 다르다. 그리는 건 AI에게 맡기되, 화살표 교차 0개·굽힘 예산·최소 간격 같은 미적 기준을 전부 숫자 계약으로 바꿔 파이썬 검증기가 합격/불합격을 기계적으로 판정한다. 불합격이면 렌더링 자체를 거부한다(fail-closed). "AI가 그럴듯하게 그렸다고 우기는 것"과 "검사를 통과한 것"을 분리한 설계 — 스킬을 소프트웨어 제품처럼 만든 교과서로 주목받는 이유다.

(저장소 yizhiyanhua-ai/fireworks-tech-graph · ★ 9,571 · 포크 801 · 언어 Python · MIT · 2026-04-10 생성 → 3.5개월 만에 v1.2.0 · 검증기·생성기 스크립트만 약 1.2만 줄 · 12개 비주얼 스타일 · UML 14종 포함 다이어그램 타입 · TrendShift 트렌딩)
목차
  1. 한 줄 정체
  2. 왜 주목받는가 — "그럴듯한 그림"과 "검증된 도면"의 차이
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 — 비결정적 AI 위에 결정적 검증기를 얹는 법
  5. 디렉토리 구조 해부
  6. 학습 포인트 — 기술별 배울 것
  7. 시스템 / 실행 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 로드맵 (주차별)
  10. 핵심 키워드 사전
  11. 참고 링크

1한 줄 정체

이 프로젝트가 정확히 무엇인지 한 문장으로

fireworks-tech-graph는 "시스템을 말로 설명하면, AI가 다이어그램 설계도(JSON)를 쓰고, 파이썬 검증기가 기하·의미 규칙으로 검사한 뒤에만 SVG/PNG/GIF/HTML로 내보내 주는 Codex·Claude Code 겸용 에이전트 스킬"이다. 아키텍처·플로우차트·시퀀스 같은 기본형부터 UML 14종 전부, 그리고 RAG 파이프라인·Mem0 메모리·멀티 에이전트 같은 AI/에이전트 도메인 패턴까지 내장돼 있다. 비주얼 스타일은 12가지 — 플랫 아이콘, 다크 터미널, 블루프린트, Notion 클린, 글래스모피즘, Claude 공식풍, OpenAI 공식풍, 다크 럭셔리, 그리고 C4 리뷰·클라우드 배포·이벤트 스트림·SRE 골든 시그널용 엔지니어링 전용 4종.

한 장의 비유

"설계는 AI가, 준공 검사는 기계가 하는 건축사무소"

고객(사용자)이 말로 요구사항을 설명하면 건축사(AI 에이전트)가 도면 초안(다이어그램 JSON)을 그린다. 하지만 이 사무소는 초안을 그대로 납품하는 법이 없다. 구조계산 프로그램(기하 검증기)이 "벽이 겹치는가, 복도 폭이 규정 미달인가"를 숫자로 검사하고, 용도별 건축법(의미 계약 — 병원 도면엔 수술실이 있어야 한다처럼 C4 도면엔 추상화 레벨이 딱 하나여야 한다)을 대조하고, 마지막으로 감리(비주얼 리뷰)가 완성 사진(PNG)을 눈으로 본다.

불합격이면 반려 — 그것도 수정 기회는 최대 2번으로 못박아 놨다(무한 자기수정 루프 방지). 이 레포가 "AI 그림 도구" 수백 개와 갈라지는 지점이 정확히 여기다: 완료를 AI의 주장이 아니라 검사기의 증거로 판정한다.

용어
에이전트 스킬(Agent Skill) / SKILL.md
Claude Code·Codex 같은 코딩 에이전트에게 "이 종류의 일은 이렇게 하라"는 매뉴얼 폴더를 끼워 주는 표준. 입구 파일 SKILL.md에 작업 순서·규칙을 적고, 상세 자료(references/)와 실행 스크립트(scripts/)를 같은 폴더에 동봉한다. 에이전트는 관련 요청이 오면 스킬을 자동으로 펼쳐 읽고, 동봉된 스크립트를 실제로 실행한다. 즉 스킬 = 지침(프롬프트) + 도구(코드)의 패키지.
용어
SVG (Scalable Vector Graphics)
그림을 픽셀이 아니라 "좌표 x,y에 사각형, 여기서 저기로 선"이라는 텍스트 명령으로 저장하는 형식. 아무리 확대해도 안 깨지고, 텍스트라서 AI가 직접 써 내려갈 수 있고 프로그램이 검사할 수도 있다 — 이 레포의 모든 검증이 가능한 이유다.

동작 흐름을 압축하면 이렇다:

사용자: "Mem0 메모리 아키텍처 다이어그램, 다크 스타일로" │ ▼ ① 분류 에이전트가 스킬을 읽고 판단 → 타입: Memory Architecture, 스타일: 2 ② 설계 노드·화살표·컨테이너를 JSON(다이어그램 IR)으로 작성 ③ 검증 fireworks.py validate → ID 중복? 참조 끊김? 의미 계약 위반? 불합격 시 여기서 중단 ④ 렌더 fireworks.py render → 직교 라우팅·포트 배정·레전드 배치까지 결정적으로 계산 ⑤ 검사 fireworks.py check → XML·마커·기하·구도 예산(교차 0, 굽힘 ≤2…) 검사 ⑥ 내보내기 1920px PNG 추출 → 에이전트가 PNG를 눈으로 재검토(최대 2회 수정) ⑦ 보고 "mem0-architecture.svg / .png · validation: passed · visual_review: passed"

2왜 주목받는가 — "그럴듯한 그림"과 "검증된 도면"의 차이

3.5개월 만에 ★9,500과 트렌딩에 오른 이유

타이밍부터 보자. 2026년 상반기는 에이전트 스킬 생태계가 폭발한 시기다. Claude Code와 Codex가 나란히 스킬 규격을 지원하면서 GitHub엔 스킬 레포가 쏟아졌는데, 대부분은 마크다운 지침 몇 장짜리다. 이 레포는 정반대 극단을 보여줬다 — 2026-04-10 첫 공개 후 석 달 동안 v1.0 → v1.1(엔지니어링 스타일 4종 + 통합 CLI) → v1.2(GIF 모션)로 달리며, JSON 스키마·단위 테스트·CI·npm 배포·릴리스 노트·회귀 베이스라인을 갖춘 "제품급 스킬"을 만들었다. 스킬 하나에 파이썬·JS 코드가 1.2만 줄 붙어 있는 경우는 드물다.

두 번째 이유가 본질이다. LLM에게 다이어그램을 그리게 해 본 사람은 다 안다 — 첫눈엔 그럴듯한데 자세히 보면 화살표가 박스를 관통하고, 라벨이 선 위에 겹치고, 레전드가 노드를 덮는다. 문법(XML)은 맞는데 시각적으로 엉망인, "문법 오류 없는 헛소리"의 그림 버전이다. 이 레포의 답은 미학을 측정 가능한 예산(budget)으로 번역한 것이다: 교차 0개, 엣지당 굽힘 ≤2, 전체 굽힘 ≤8, 우회율 ≤1.35배, 노드 간격 ≥40px, 컨테이너 여백 ≥20px, 라벨 이격 ≥4px. 이 숫자들은 문서가 아니라 실행되는 코드(composition_quality.py)로 존재하고, 위반하면 위반 코드(EDGE_BEND_BUDGET 등)와 함께 빨간불이 켜진다.

비유

자동 채점기가 붙은 그림 대회. 보통의 AI 그림 도구는 "참가자(AI)가 그림을 내면 그대로 전시"한다. 이 레포는 전시장 입구에 자로 재는 심사위원을 세웠다 — 선끼리 겹치면 탈락, 여백 부족해도 탈락, 심지어 "SRE 대시보드 부문에 골든 시그널 4개가 다 안 그려져 있으면" 부문 규정 위반으로 탈락. 참가자가 아무리 "잘 그렸다"고 주장해도 소용없다. 채점표가 코드니까.

기존 도구들과 뭐가 다른가

항목Mermaiddraw.io생 LLM에게 SVG 시키기이 레포
입력전용 DSL 문법마우스 수작업자연어자연어 (영어·중국어)
레이아웃 품질자동이지만 통제 어려움사람 실력만큼복불복 (겹침·관통 빈발)숫자 예산으로 강제
품질 검증렌더 성공 = 끝없음 (눈)없음기하+의미+시각 3단 검사
스타일테마 제한적수동매번 제각각12종 내장, 토큰 문서화
AI/에이전트 도메인없음없음지식은 있으나 불안정RAG·Mem0·멀티에이전트 패턴 내장
출력SVG/PNG수동 내보내기SVGSVG + 1920px PNG + GIF + 오프라인 HTML

세 번째 이유는 "Loop Engineering"이라는 이름의 운영 철학이다. README가 다섯 원칙을 명시한다: ① 평가하라, 주장하지 말라(evaluate, don't assert) ② 결정적 검사 먼저 ③ 지각적 검증(PNG 읽기)은 그다음 ④ 수정은 진단된 부분만 겨냥 ⑤ 수렴은 유한하게(시각 리뷰 후 수정 최대 2회). 에이전트 워크플로를 설계해 본 사람이라면 이게 다이어그램만의 얘기가 아니라 "AI에게 일 시키고 결과를 믿을 수 있게 만드는 일반 패턴"임을 알아본다 — 트렌딩의 상당 지분이 이 각도다. 이미지 리더가 없는 런타임이면 visual_review: skipped (image reader unavailable)라고 정직하게 보고하게 한 디테일까지.

균형 잡기
읽기 전에 알아둘 것 — 1인 프로젝트, 그리고 마케팅 문체

README에 저자가 직접 밝혀 놨다: 이 레포는 개인 빌더(bradzhang.dev)의 컨설팅 실증용 "proof surface"이기도 하다. 그래서 README가 제품 광고처럼 화려하고("user-approved", "geometry-safe" 같은 자체 용어 반복), 조직 계정처럼 보이지만 사실상 1인 운영으로 추정된다(org명 yizhiyanhua = 一枝烟花, "한 줄기 불꽃"). 스타 9.5k 대비 오픈 이슈 0개는 깨끗하다기보다 커뮤니티 활동이 아직 얇다는 신호로 읽는 게 안전하다.

기술적 한계도 있다: 최종 품질은 여전히 에이전트가 설계 JSON을 얼마나 잘 쓰느냐에 달려 있고(검증기는 나쁜 걸 걸러낼 뿐 좋은 걸 만들어 주진 않는다), GIF 경로는 Chromium+FFmpeg+puppeteer를 요구해 무겁고, 12스타일 밖의 자유로운 커스텀 미학은 스킬 구조상 제한적이다. 배울 건 많지만 "만능 다이어그램 AI"로 오해하진 말 것.

3기술 스택 전체 지도

package.json·스크립트·문서에서 읽어낸 실제 구성

핵심 스택은 의외로 보수적이다. 생성기·검증기·기하 엔진 전부가 파이썬 표준 라이브러리만으로 짜여 있다(fireworks_geometry.py 주석에 이유가 적혀 있다: "갓 설치한 스킬에서도, CI에서도, 사후 검사기에서도 같은 라우팅 계약을 강제하기 위해"). 외부 의존성은 출력 단계에만 붙는다.

① 코어 — Python 3.9+ (stdlib only)

② 래스터화 — 렌더러 3택

렌더러품질설치 비용언제
cairosvg좋음 (CSS 지원 우수)pip install cairosvg 한 줄기본 권장
rsvg-convert보통 (CSS·foreignObject 일부 탈락)OS 패키지파이썬 못 쓰는 환경의 폴백
Puppeteer(Chromium)최상 (브라우저 동일)Node 18+ + ChromiumD3·픽셀 퍼펙트·GIF 모션

③ 모션 파이프라인 (선택 설치)

④ 지식층 — 코드가 아닌 자산

⑤ 품질·배포 인프라

4아키텍처 심화 — 비결정적 AI 위에 결정적 검증기를 얹는 법

소스를 직접 읽고 재구성한 파이프라인

이 레포의 아키텍처를 한 문장으로 요약하면 "비결정층과 결정층의 분리"다. 창의성이 필요한 일(요청 해석, 무엇을 어디에 놓을지)은 LLM이 하고, 정확성이 필요한 일(라우팅 계산, 규칙 검사, 인코딩)은 전부 파이썬이 같은 입력이면 항상 같은 출력이 나오게 처리한다. 층과 층 사이의 인터페이스가 바로 다이어그램 IR(중간 표현) JSON이다.

┌─ 비결정층 (LLM 에이전트) ──────────────────────────────────┐ │ 요청 해석 → 타입/스타일 분류 → 노드·엣지 구조 추출 │ │ → 다이어그램 IR JSON 작성 (여기까지가 "창작") │ └─────────────────────────┬──────────────────────────────────┘ ▼ ┌─ 결정층 (Python, stdlib only) ─────────────────────────────┐ │ diagram_ir.py 정규화: ID 중복·끊긴 참조·NaN 좌표 즉사 │ │ semantic_contracts 도메인 계약: C4 레벨 1개, 시그널 4개… │ │ generate-from-…py 직교 라우팅·포트 배정·레전드 이사 │ │ composition_quality 구도 예산: 교차 0·굽힘 ≤2·간격 ≥40px │ │ validate_svg.py 완성 SVG의 XML·마커·기하 재검사 │ └─────────────────────────┬──────────────────────────────────┘ ▼ ┌─ 출력층 ───────────────────────────────────────────────────┐ │ cairosvg → 1920px PNG (에이전트가 PNG를 눈으로 재검토) │ │ motion.py + svg2gif.js → 검증된 GIF + .motion.json 리포트 │ │ interactive_html.py → 소독된 오프라인 HTML 뷰어 │ └────────────────────────────────────────────────────────────┘

인터페이스가 되는 IR JSON — 실제 생김새

동봉된 회귀 픽스처 fixtures/mem0-style1.json을 줄여 보면 이렇다. 에이전트가 쓰는 건 좌표가 박힌 SVG가 아니라 이 수준의 선언적 구조다:

{
  "schema_version": 1,
  "mode": "memory",  "style": 1,  "quality_profile": "showcase",
  "title": "Mem0 Memory Architecture",
  "containers": [ { "id": "memory-core", "label": "Memory Manager", … } ],
  "nodes": [
    { "id": "llm",    "kind": "double_rect", "label": "LLM", … },
    { "id": "vector", "kind": "cylinder",    "label": "Vector Store", … }
  ],
  "arrows": [
    { "source": "manager", "target": "vector",
      "flow": "write",            ← 의미(색·점선을 스타일이 결정)
      "source_port": "bottom",    ← 어느 변에서 나갈지
      "corridor_y": [420],         ← "이 복도로 지나가라" 힌트
      "motion_role": "memory-write", "motion_stage": 5 } ← GIF 순서
  ],
  "legend": [ { "flow": "write", "label": "memory write" }, … ]
}

주목할 설계 선택: 화살표에 좌표 대신 flow: "write" 같은 의미를 적게 하고, 색·굵기·점선은 스타일 계층이 결정한다. 도형도 마찬가지 — LLM은 이중 테두리 사각형, 에이전트는 육각형, 벡터 스토어는 줄무늬 실린더라는 도형 어휘(shape vocabulary)가 12스타일 전체에서 일관된다. 덕분에 "스타일 2로 다시"라고 하면 구조는 그대로 두고 시각층만 갈아끼울 수 있다.

1차 관문: 스키마 정규화 (diagram_ir.py)

모든 입력은 렌더링 코드에 닿기 전에 normalize_diagram()을 통과한다. 여기서 잡는 것: 중복 ID(노드끼리는 물론 노드↔컨테이너 간에도), 존재하지 않는 노드를 가리키는 화살표, NaN·Infinity 좌표, 잘못된 waypoint 형식, 미지원 스키마 버전. 옛 형식(legacy JSON)도 받아 주되 v1로 정규화해서 넘긴다 — 하위 호환과 엄격함을 동시에 가져가는 전형적인 "versioned IR" 패턴이다.

2차 관문: 의미 계약 (semantic_contracts.py) — 이 레포의 가장 독창적인 부분

스타일 9–12는 단순 테마가 아니라 도메인 규칙이 붙은 문서 양식이다. 각 스타일이 기본 의미 프로파일을 데려온다:

스타일프로파일fail-closed로 강제하는 것
9 · C4 Review Canvasc4-reviewC4 추상화 레벨은 딱 하나, 요소마다 책임·기술 명시, 관계엔 프로토콜
10 · Cloud Fabriccloud-fabric배포 경계(Region/VPC)가 비순환, 워크로드 소유권 명시, 경계 통과엔 이름 있는 메커니즘
11 · Event Transitevent-transit토픽 레일 순서, 선언된 분기점, 컨슈머 그룹, 실존하는 DLQ 타깃
12 · Ops Pulseops-pulse골든 시그널 정확히 4개(지연·트래픽·에러·포화), 끊기지 않는 크리티컬 패스 1개, 유효한 트레이스 트리
비유

공문서 양식 검사. 보통의 "테마"는 편지지 색만 바꾼다. 이 레포의 엔지니어링 스타일은 양식이 정해진 공문서에 가깝다 — 사업자등록 신청서에 대표자란이 비어 있으면 접수 자체가 거부되듯, "SRE 리뷰 다이어그램인데 골든 시그널이 3개뿐"이면 그리기 전에 반려된다. 덕분에 이 스타일로 나온 그림은 예쁜 그림이 아니라 검토 가능한 문서가 된다.

재미있는 디테일: 프로파일·스타일 별칭 사전에 "事件地铁图"(이벤트 지하철도), "可靠性脉冲"(신뢰성 펄스) 같은 중국어 표현이 영어와 나란히 등록돼 있다. 중국어권 사용자를 처음부터 1급 시민으로 설계한 것 — README도 영·중 이중이다.

3차 관문: 구도 품질 예산 (composition_quality.py)

기하적으로 "합법"인 다이어그램과 "보기 좋은" 다이어그램은 다르다. 이 모듈은 후자를 숫자로 정의한다. 프로파일 두 개가 내장:

예산 항목standardshowcase (공식 쇼케이스 기준)
엣지당 굽힘(bend)≤ 12≤ 2
전체 굽힘 합≤ 100≤ 8
우회율(route stretch)≤ 5.0배≤ 1.35배 (직선 대비)
브리지(교차) 허용≤ 80
노드 간 최소 간격0≥ 40px
컨테이너 안 여백(gutter)0≥ 20px
라벨 이격 / 최소 선분2px / 04px / 16px (자잘한 꺾임 금지)

판정 결과는 점수로도 나온다: 100 − (위반 × 12 + 브리지 × 8 + 초과 굽힘 × 2). 위반마다 NODE_GAP, EDGE_ROUTE_STRETCH 같은 코드와 실측값·한계값이 붙어 나오므로, 에이전트는 "어디를 얼마나 고쳐야 하는지"를 기계가 알려주는 피드백으로 받는다. 수정 루프가 감으로 돌지 않는 이유다.

라우팅 — 결정적 직교 배선

화살표는 전부 직각(orthogonal)으로만 꺾인다. 생성기가 노드·헤더·레전드·타이틀을 장애물로 놓고 경로를 계산하며, 같은 변에 여러 화살표가 몰리면 포트를 결정적으로 분산 배정한다. 에이전트가 개입하고 싶으면 IR에 힌트를 얹는다: corridor_x/y(이 복도로 지나가라 — 부드러운 선호), route_points(정확한 경유지 — 단 위험한 지점은 거부됨), source_port/target_port(출입 변 지정). 도저히 피할 수 없는 교차엔 점프 아크(bridge)를 그려 "선이 겹친 게 아니라 넘어간 것"임을 시각적으로 못박고, 같은 선분끼리의 공선 겹침은 치명 오류로 처리한다.

모션 — GIF마저 계약으로 검증한다

v1.2의 야심작. "이 다이어그램 움직이게 해줘(生成 GIF)"라고 하면 motion.py가 생성된 SVG를 받아 GIF로 굽는데, 여기도 자유 애니메이션이 아니라 12개 스타일별 모션 계약이 있다:

오프라인 HTML 뷰어 — 소독 먼저

export-html은 SVG 하나를 팬/줌/라이트·다크 테마/소스 복사/1–4× PNG·JPEG·WebP 내보내기가 되는 단일 오프라인 HTML로 포장한다. 포장 전에 sanitize_svg가 스크립트·이벤트 핸들러·외부 참조·foreignObject·외부 CSS를 전부 거부한다 — 생성물이 어디로 공유될지 모르니 뷰어 자체를 공격 표면으로 만들지 않겠다는 방어다.

5디렉토리 구조 해부

git clone 직후 보이는 것들 (25MB, 마크다운 72 · 파이썬 40 · JSON 58)
fireworks-tech-graph/ ├── SKILL.md ★ 스킬 입구 — 워크플로 12단계·레이아웃 규칙·도형 어휘 ├── README.md / README.zh.md 영·중 이중 문서 (쇼케이스 GIF 13개 포함) ├── CHANGELOG.md / docs/releases/ 버전별 릴리스 노트 (v1.0.0~v1.2.0) ├── references/ ★ 지식층 — 스타일 12종 색 토큰, 구도 계약, │ ├── style-1…12-*.md 모션 계약, 아이콘 40+, PNG 내보내기 가이드 │ ├── composition-quality-contract.md │ ├── motion-effects.md │ └── icons.md ├── schemas/ 다이어그램 JSON Schema (v1) ├── scripts/ ★ 실행층 — 약 1.2만 줄 │ ├── fireworks.py 통합 CLI (8개 서브커맨드) │ ├── diagram_ir.py 스키마 정규화 │ ├── semantic_contracts.py 도메인 계약 (스타일 9–12) │ ├── generate-from-template.py SVG 생성기 (최대 모듈, 3,369줄) │ ├── fireworks_geometry.py 공유 기하 프리미티브 (stdlib only) │ ├── composition_quality.py 구도 예산 판정 │ ├── validate_svg.py SVG 사후 검사 │ ├── motion.py + svg2gif.js GIF 모션 (검증·Chromium 캡처) │ └── interactive_html.py 오프라인 뷰어 포장 ├── fixtures/ 스타일별 회귀 기준 IR 12세트 (+quality-baseline/) ├── templates/ 시작용 SVG 10종 (architecture, er-diagram…) ├── tests/ unittest 9파일 — 기하·IR·CLI·모션·설치 호환 ├── tools/ 배포 일관성·설치 카나리 검사 ├── assets/samples/ 쇼케이스 PNG/GIF + SHA-256 매니페스트 ├── examples/ 인터랙티브 HTML 데모 ├── agents/openai.yaml Codex 전용 UI 메타데이터 (Claude Code는 무시) └── skills/fireworks-tech-graph/ 레포 전체의 "물리적 미러" (아래 설명)

가장 특이한 지점은 마지막 줄이다. 레포 안에 skills/fireworks-tech-graph/라는 이름으로 레포 전체가 한 번 더 복제돼 들어 있다. 이유: npx skills add CLI가 저장소 루트를 설치하면 루트 SKILL.md만 집어 가는 버전이 있어서, 중첩 경로를 지정해 완전한 폴더가 설치되도록 만든 우회다. 사본이 둘이면 어긋나기 마련인데, 그래서 tools/check_project_consistency.py가 CI에서 두 트리의 동일성을 검사한다 — "복제본은 반드시 기계로 대조한다"는 이 레포다운 해법.

감상 포인트
폴더 구조 자체가 "스킬 잘 만드는 법" 답안지

지침(SKILL.md) → 참고자료(references, 필요할 때만 로드) → 실행기(scripts) → 검증 기준(fixtures/tests) → 배포 검사(tools)의 층이 또렷하다. SKILL.md가 500줄로 억제된 것도 의도다 — 상세 내용은 참조 문서로 밀어 두고 에이전트가 필요한 순간에만 펼쳐 읽게 하는 "프로그레시브 디스클로저"로, 컨텍스트 창을 아낀다.

6학습 포인트 — 기술별 배울 것

이 레포에서 뽑아 갈 수 있는 다섯 가지
배울 것 ①

에이전트 스킬을 "제품"으로 설계하는 법

스킬 = 프롬프트 몇 장이라는 통념을 깨는 표본이다. 입구는 얇게(SKILL.md), 지식은 참조 문서로(필요할 때만 로드), 실행은 동봉 스크립트로, 품질은 픽스처+테스트로. 특히 SKILL_ROOT를 매 명령 블록이 스스로 해석하게 한 규칙(셸 변수가 다음 호출까지 살아 있다고 가정하지 말 것), Codex·Claude Code 양쪽 디스커버리 경로를 하나의 체크아웃에 심볼릭 링크로 잇는 설치 안내 같은 멀티 런타임 호환 디테일은 스킬을 만들 사람이라면 그대로 베껴도 된다.

배울 것 ②

fail-closed 검증 파이프라인 설계

"이상하면 경고하고 계속" 대신 "이상하면 그 자리에서 멈춘다". 스키마 정규화(1차) → 도메인 계약(2차) → 구도 예산(3차) → 사후 SVG 검사(4차)로 관문을 겹겹이 세우고, 각 관문이 위반 코드·실측값·한계값을 구조화해 돌려준다. LLM 산출물을 받아 쓰는 어떤 시스템에도 이식 가능한 뼈대다 — 다이어그램 대신 SQL, 설정 파일, API 호출을 넣어도 같은 그림이 성립한다.

배울 것 ③

그래프 드로잉의 실전 기초

직교 라우팅, 장애물 회피, 포트 분산 배정, 교차 최소화와 브리지, 우회율(stretch) 개념, 레전드·라벨의 충돌 회피 — 교과서의 그래프 레이아웃 이론이 960×600 viewBox 위에서 어떻게 실무 코드가 되는지를 fireworks_geometry.py(345줄, stdlib only)라는 부담 없는 크기로 읽을 수 있다.

배울 것 ④

Loop Engineering — 에이전트 자기수정 루프의 절제

"평가하라, 주장하지 말라(evaluate, don't assert)"가 슬로건이라면, 실행은 절제다: 결정적 검사를 먼저, 지각적 검증(PNG 읽기)을 나중에, 수정은 진단된 곳만, 그리고 루프는 최대 2회로 강제 종료. 이미지 리더가 없으면 검증했다고 거짓말하는 대신 visual_review: skipped로 보고한다. 에이전트 워크플로에서 흔한 "무한 자기수정 + 근거 없는 완료 선언" 두 병폐를 동시에 자르는 패턴이다.

배울 것 ⑤

배포 공학 — 사본이 생기면 반드시 대조기를 붙인다

npm tgz ↔ GitHub 릴리스 zip은 해시 대조, 레포 루트 ↔ 중첩 미러는 일관성 스크립트, 쇼케이스 GIF 13개는 SHA-256 매니페스트, 설치는 격리 환경 카나리로 재현 확인. "같아야 하는 두 사본"이 존재하는 모든 프로젝트에 통하는 규율이다.

7시스템 / 실행 요구사항

README·doctor 커맨드 기준
구성요소요구비고
Python3.9+코어는 표준 라이브러리만 사용
PNG 렌더러cairosvg 권장pip install cairosvg / 폴백 rsvg-convert(librsvg)
GIF 모션(선택)Node 18+ · Chromium · FFmpeg/FFprobepuppeteer-core@25.3.0스킬 사본마다 설치(호출자 폴더의 모듈을 일부러 안 읽음)
에이전트 런타임Claude Code 또는 Codex스킬 없이 CLI만 단독 사용도 가능
OSmacOS·Linux·WSL·Git Bash네이티브 Windows는 %USERPROFILE% 경로로 치환

설치 (권장 경로)

# 중첩 경로까지 지정해야 완전한 스킬이 설치된다 (루트만 주면 SKILL.md만 집는 버전이 있음)
npx -y skills@1.5.17 add \
  yizhiyanhua-ai/fireworks-tech-graph/skills/fireworks-tech-graph \
  --agent codex claude-code -g -y --copy
# → ~/.claude/skills/fireworks-tech-graph (Claude Code)
# → ~/.agents/skills/fireworks-tech-graph (Codex)

통합 CLI 8개 서브커맨드

커맨드하는 일
doctorPython·cairosvg·node·ffmpeg·모션 런타임 가용성 JSON 보고
validateIR JSON 정규화 + 의미 계약 검사 (렌더 없이 합격 여부만)
renderIR JSON → SVG (+ --report로 레이아웃 리포트)
check완성 SVG의 xml·markers·geometry·composition 검사
inspectSVG에 박힌 시맨틱 메타데이터(스타일·프로파일·역할 수) 출력
export-html오프라인 인터랙티브 뷰어 HTML 생성
animate시맨틱 SVG → 검증된 GIF + .motion.json
examples동봉 픽스처 목록

8직접 해볼 수 있는 실습 과제

쉬운 것부터 — 전부 무료, 로컬에서 가능
과제 1 난이도 ●○○○○

클론 → doctor → 픽스처 렌더

git clonepython3 scripts/fireworks.py doctor로 환경 점검, pip install cairosvg, 그리고 render architecture fixtures/api-flow-style7.json out.svg --report layout.json. 나온 SVG를 브라우저로 열고 layout.json에서 라우팅 리포트를 구경해 보자.

과제 2 난이도 ●●○○○

일부러 계약을 깨 보기 — fail-closed 체감

fixtures/ops-pulse-style12.json을 복사해 한 서비스의 골든 시그널을 4개→3개로 지우고 validate를 돌려 보자. 그다음 노드 두 개를 40px 미만으로 붙여 놓고 checkNODE_GAP 위반 리포트를 확인. 에러 메시지가 얼마나 "고칠 수 있게" 쓰였는지가 관전 포인트다.

과제 3 난이도 ●●●○○

내 프로젝트를 IR JSON으로 직접 써 보기

지금 하고 있는 프로젝트의 구조를 schema_version: 1 IR로 손으로 작성해 render까지. flow(data/control/write/read)와 kind(cylinder/hexagon/double_rect)를 의미에 맞게 고르는 연습이 핵심 — 다이어그램을 "그림"이 아니라 "데이터"로 다루는 감각이 생긴다.

과제 4 난이도 ●●●●○

Claude Code에 스킬로 설치해 자연어 → 다이어그램

위 설치 명령으로 스킬을 넣고 "우리 서비스 아키텍처 그려줘, 블루프린트 스타일" 같은 요청을 던져 보자. 에이전트가 SKILL.md의 12단계 워크플로를 따라가며 validate→render→check→PNG 리뷰를 수행하는 로그를 관찰하면, 스킬이 에이전트의 행동을 어떻게 구조화하는지가 보인다. 스타일만 바꿔 재요청하면 구조 재사용도 확인 가능.

과제 5 난이도 ●●●●●

모션 계약 읽고 GIF 굽기 — 그리고 내 스킬에 이식

Node 18+·FFmpeg·puppeteer-core를 갖추고 animate로 GIF + .motion.json을 뽑아 리포트의 프레임 유니크니스 판정을 읽어 보자. 마지막 단계: 이 레포의 관문 설계(정규화→계약→예산→사후검사→시각리뷰)를 자기가 만들 스킬 하나에 축소 이식해 보기. 그게 이 레포를 "쓰는" 것에서 "배우는" 것으로 넘어가는 지점이다.

9관련 기술 심화 로드맵 (주차별)

이 레포를 계기로 공부 계획을 짠다면
주차주제구체적으로
1주SVG 기초viewBox 좌표계, rect/path/marker, defs와 재사용, 텍스트 배치. 이 레포 templates/의 시작용 SVG 10종을 열어 손으로 고쳐 보기
2주에이전트 스킬 규격Claude Code·Codex의 스킬 문서 정독, SKILL.md 프런트매터·트리거 문구·프로그레시브 디스클로저. 미니 스킬 하나 직접 제작
3주그래프 레이아웃 이론계층 배치(Sugiyama), 직교 라우팅, 교차 최소화가 왜 NP-hard인지, 실무 라이브러리(ELK, dagre)와 이 레포 접근의 비교
4주검증 파이프라인 공학JSON Schema, IR·정규화 패턴, fail-closed vs fail-open, 골든 파일(회귀 픽스처) 테스트, CI에서의 시각 회귀
5주(선택)모션·인코딩Puppeteer 프레임 캡처, GIF 포맷의 한계(256색·용량), FFmpeg 팔레트 최적화, "애니메이션을 검증한다"는 문제 설정 자체

10핵심 키워드 사전

이 문서에 나온 개념 압축 정리
용어
에이전트 스킬 / SKILL.md
코딩 에이전트에게 끼우는 "매뉴얼+도구" 폴더. 입구 문서(SKILL.md)와 참조 자료·스크립트를 동봉하며, Claude Code와 Codex가 나란히 지원.
용어
IR (중간 표현, Intermediate Representation)
사람 말과 최종 산출물 사이에 끼우는 구조화된 중간 형식. 여기선 노드·화살표·컨테이너를 담는 schema v1 JSON. AI는 IR까지만 쓰고, 이후는 결정적 코드가 처리.
용어
fail-closed
확신이 없으면 통과가 아니라 차단이 기본값인 설계. 계약 위반 다이어그램은 경고와 함께 그려지는 게 아니라 아예 렌더링이 거부된다.
용어
의미 계약(semantic contract)
"C4 리뷰엔 추상화 레벨 1개", "골든 시그널은 정확히 4개"처럼 도메인 규칙을 코드로 강제하는 검사. 스타일 9–12에 기본 장착.
용어
구도 예산(composition budget)
미적 품질을 숫자 한계로 바꾼 것 — 교차 0, 엣지당 굽힘 ≤2, 노드 간격 ≥40px 등. showcase/standard 두 프로파일.
용어
직교 라우팅 / 브리지
화살표를 직각으로만 꺾어 배선하는 방식. 불가피한 교차엔 작은 점프 아크(브리지)를 그려 "겹침"과 "넘어감"을 구분.
용어
우회율(route stretch)
실제 경로 길이 ÷ 직선(맨해튼) 거리. 1.0이면 최단, showcase 기준 1.35배 초과면 위반 — "빙 돌아가는 못생긴 선"의 수치화.
용어
도형 어휘(shape vocabulary)
개념→도형 고정 매핑: LLM=이중 테두리 사각형, 에이전트=육각형, 벡터 스토어=줄무늬 실린더. 12스타일 어디서나 같은 의미로 읽히게 하는 규칙.
용어
Loop Engineering / bounded convergence
첫 결과를 후보로 취급하고 검증→수정을 돌리되, 시각 리뷰 후 수정은 최대 2회로 상한을 박는 절제된 자기수정 루프.
용어
비주얼 리뷰 게이트
문법 검사로 못 잡는 겹침·클리핑을 위해 내보낸 PNG를 에이전트가 눈으로 재검토하는 마지막 관문. 불가능하면 skipped로 정직 보고.
용어
모션 계약 / 프레임 유니크니스
GIF의 타임라인(5.75s/115프레임)·그려지는 순서·스타일별 시그니처를 고정하고, 중복 프레임을 기계로 검출해 "움직이는 척"을 걸러내는 검증.
용어
원자적 설치(atomic install)
임시 파일에 쓰고 os.replace로 교체 — 도중에 죽어도 반쪽짜리 GIF/리포트가 남지 않게 하는 파일 쓰기 규율.
용어
프로그레시브 디스클로저
입구 문서는 얇게 유지하고 상세 자료는 필요한 순간에만 로드하게 하는 정보 설계. 에이전트의 컨텍스트 창 절약 기법.

11참고 링크

더 파고들 때