yizhiyanhua-ai/fireworks-tech-graph · ★ 9,571 · 포크 801 · 언어 Python · MIT · 2026-04-10 생성 → 3.5개월 만에 v1.2.0 · 검증기·생성기 스크립트만 약 1.2만 줄 · 12개 비주얼 스타일 · UML 14종 포함 다이어그램 타입 · TrendShift 트렌딩)
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 에이전트)가 도면 초안(다이어그램 JSON)을 그린다. 하지만 이 사무소는 초안을 그대로 납품하는 법이 없다. 구조계산 프로그램(기하 검증기)이 "벽이 겹치는가, 복도 폭이 규정 미달인가"를 숫자로 검사하고, 용도별 건축법(의미 계약 — 병원 도면엔 수술실이 있어야 한다처럼 C4 도면엔 추상화 레벨이 딱 하나여야 한다)을 대조하고, 마지막으로 감리(비주얼 리뷰)가 완성 사진(PNG)을 눈으로 본다.
불합격이면 반려 — 그것도 수정 기회는 최대 2번으로 못박아 놨다(무한 자기수정 루프 방지). 이 레포가 "AI 그림 도구" 수백 개와 갈라지는 지점이 정확히 여기다: 완료를 AI의 주장이 아니라 검사기의 증거로 판정한다.
SKILL.md에 작업 순서·규칙을 적고, 상세 자료(references/)와 실행 스크립트(scripts/)를 같은 폴더에 동봉한다. 에이전트는 관련 요청이 오면 스킬을 자동으로 펼쳐 읽고, 동봉된 스크립트를 실제로 실행한다. 즉 스킬 = 지침(프롬프트) + 도구(코드)의 패키지.동작 흐름을 압축하면 이렇다:
타이밍부터 보자. 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개가 다 안 그려져 있으면" 부문 규정 위반으로 탈락. 참가자가 아무리 "잘 그렸다"고 주장해도 소용없다. 채점표가 코드니까.
| 항목 | Mermaid | draw.io | 생 LLM에게 SVG 시키기 | 이 레포 |
|---|---|---|---|---|
| 입력 | 전용 DSL 문법 | 마우스 수작업 | 자연어 | 자연어 (영어·중국어) |
| 레이아웃 품질 | 자동이지만 통제 어려움 | 사람 실력만큼 | 복불복 (겹침·관통 빈발) | 숫자 예산으로 강제 |
| 품질 검증 | 렌더 성공 = 끝 | 없음 (눈) | 없음 | 기하+의미+시각 3단 검사 |
| 스타일 | 테마 제한적 | 수동 | 매번 제각각 | 12종 내장, 토큰 문서화 |
| AI/에이전트 도메인 | 없음 | 없음 | 지식은 있으나 불안정 | RAG·Mem0·멀티에이전트 패턴 내장 |
| 출력 | SVG/PNG | 수동 내보내기 | SVG | SVG + 1920px PNG + GIF + 오프라인 HTML |
세 번째 이유는 "Loop Engineering"이라는 이름의 운영 철학이다. README가 다섯 원칙을 명시한다: ① 평가하라, 주장하지 말라(evaluate, don't assert) ② 결정적 검사 먼저 ③ 지각적 검증(PNG 읽기)은 그다음 ④ 수정은 진단된 부분만 겨냥 ⑤ 수렴은 유한하게(시각 리뷰 후 수정 최대 2회). 에이전트 워크플로를 설계해 본 사람이라면 이게 다이어그램만의 얘기가 아니라 "AI에게 일 시키고 결과를 믿을 수 있게 만드는 일반 패턴"임을 알아본다 — 트렌딩의 상당 지분이 이 각도다. 이미지 리더가 없는 런타임이면 visual_review: skipped (image reader unavailable)라고 정직하게 보고하게 한 디테일까지.
README에 저자가 직접 밝혀 놨다: 이 레포는 개인 빌더(bradzhang.dev)의 컨설팅 실증용 "proof surface"이기도 하다. 그래서 README가 제품 광고처럼 화려하고("user-approved", "geometry-safe" 같은 자체 용어 반복), 조직 계정처럼 보이지만 사실상 1인 운영으로 추정된다(org명 yizhiyanhua = 一枝烟花, "한 줄기 불꽃"). 스타 9.5k 대비 오픈 이슈 0개는 깨끗하다기보다 커뮤니티 활동이 아직 얇다는 신호로 읽는 게 안전하다.
기술적 한계도 있다: 최종 품질은 여전히 에이전트가 설계 JSON을 얼마나 잘 쓰느냐에 달려 있고(검증기는 나쁜 걸 걸러낼 뿐 좋은 걸 만들어 주진 않는다), GIF 경로는 Chromium+FFmpeg+puppeteer를 요구해 무겁고, 12스타일 밖의 자유로운 커스텀 미학은 스킬 구조상 제한적이다. 배울 건 많지만 "만능 다이어그램 AI"로 오해하진 말 것.
핵심 스택은 의외로 보수적이다. 생성기·검증기·기하 엔진 전부가 파이썬 표준 라이브러리만으로 짜여 있다(fireworks_geometry.py 주석에 이유가 적혀 있다: "갓 설치한 스킬에서도, CI에서도, 사후 검사기에서도 같은 라우팅 계약을 강제하기 위해"). 외부 의존성은 출력 단계에만 붙는다.
fireworks.py (220줄) — doctor / validate / render / check / inspect / export-html / animate / examples 8개 서브커맨드의 통합 CLI. 모든 출력이 JSON이라 에이전트가 파싱하기 좋다.generate-from-template.py (3,369줄) — 실제 SVG 생성기. 스타일 토큰 주입, 직교 라우팅, 포트 배정, 레전드 재배치까지 담당하는 최대 모듈.diagram_ir.py (201줄) — 입력 JSON을 스키마 v1로 정규화하는 타입 경계.semantic_contracts.py (694줄) — 스타일 카탈로그 + 엔지니어링 4종(스타일 9–12)의 도메인 검증.composition_quality.py (271줄) — 구도 품질 예산(교차·굽힘·간격) 판정.validate_svg.py (961줄) — 완성된 SVG의 XML·마커·기하·충돌 검사.motion.py (2,371줄) — SVG→GIF 모션 계획·검증·인코딩·원자적 설치.interactive_html.py (356줄) — SVG를 소독(sanitize)해 오프라인 뷰어 HTML로 포장.| 렌더러 | 품질 | 설치 비용 | 언제 |
|---|---|---|---|
| cairosvg | 좋음 (CSS 지원 우수) | pip install cairosvg 한 줄 | 기본 권장 |
| rsvg-convert | 보통 (CSS·foreignObject 일부 탈락) | OS 패키지 | 파이썬 못 쓰는 환경의 폴백 |
| Puppeteer(Chromium) | 최상 (브라우저 동일) | Node 18+ + Chromium | D3·픽셀 퍼펙트·GIF 모션 |
svg2gif.js (2,887줄) — puppeteer-core@25.3.0으로 Chromium을 띄워 타임라인 프레임을 캡처하는 워커. FFmpeg/FFprobe로 인코딩·검증.unittest로 커버. CI + 태그 릴리스 워크플로에서 실제 Chromium으로 12스타일 × 852개 프레임 비교 회귀까지 돈다.npx skills add(권장) ② git clone ③ npm 패키지(@yizhiyanhua-ai/fireworks-tech-graph). npm tgz와 GitHub 릴리스 zip이 같은 페이로드인지 파일 해시로 CI가 대조한다(tools/distribution.py --check).이 레포의 아키텍처를 한 문장으로 요약하면 "비결정층과 결정층의 분리"다. 창의성이 필요한 일(요청 해석, 무엇을 어디에 놓을지)은 LLM이 하고, 정확성이 필요한 일(라우팅 계산, 규칙 검사, 인코딩)은 전부 파이썬이 같은 입력이면 항상 같은 출력이 나오게 처리한다. 층과 층 사이의 인터페이스가 바로 다이어그램 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로 다시"라고 하면 구조는 그대로 두고 시각층만 갈아끼울 수 있다.
모든 입력은 렌더링 코드에 닿기 전에 normalize_diagram()을 통과한다. 여기서 잡는 것: 중복 ID(노드끼리는 물론 노드↔컨테이너 간에도), 존재하지 않는 노드를 가리키는 화살표, NaN·Infinity 좌표, 잘못된 waypoint 형식, 미지원 스키마 버전. 옛 형식(legacy JSON)도 받아 주되 v1로 정규화해서 넘긴다 — 하위 호환과 엄격함을 동시에 가져가는 전형적인 "versioned IR" 패턴이다.
스타일 9–12는 단순 테마가 아니라 도메인 규칙이 붙은 문서 양식이다. 각 스타일이 기본 의미 프로파일을 데려온다:
| 스타일 | 프로파일 | fail-closed로 강제하는 것 |
|---|---|---|
| 9 · C4 Review Canvas | c4-review | C4 추상화 레벨은 딱 하나, 요소마다 책임·기술 명시, 관계엔 프로토콜 |
| 10 · Cloud Fabric | cloud-fabric | 배포 경계(Region/VPC)가 비순환, 워크로드 소유권 명시, 경계 통과엔 이름 있는 메커니즘 |
| 11 · Event Transit | event-transit | 토픽 레일 순서, 선언된 분기점, 컨슈머 그룹, 실존하는 DLQ 타깃 |
| 12 · Ops Pulse | ops-pulse | 골든 시그널 정확히 4개(지연·트래픽·에러·포화), 끊기지 않는 크리티컬 패스 1개, 유효한 트레이스 트리 |
공문서 양식 검사. 보통의 "테마"는 편지지 색만 바꾼다. 이 레포의 엔지니어링 스타일은 양식이 정해진 공문서에 가깝다 — 사업자등록 신청서에 대표자란이 비어 있으면 접수 자체가 거부되듯, "SRE 리뷰 다이어그램인데 골든 시그널이 3개뿐"이면 그리기 전에 반려된다. 덕분에 이 스타일로 나온 그림은 예쁜 그림이 아니라 검토 가능한 문서가 된다.
재미있는 디테일: 프로파일·스타일 별칭 사전에 "事件地铁图"(이벤트 지하철도), "可靠性脉冲"(신뢰성 펄스) 같은 중국어 표현이 영어와 나란히 등록돼 있다. 중국어권 사용자를 처음부터 1급 시민으로 설계한 것 — README도 영·중 이중이다.
기하적으로 "합법"인 다이어그램과 "보기 좋은" 다이어그램은 다르다. 이 모듈은 후자를 숫자로 정의한다. 프로파일 두 개가 내장:
| 예산 항목 | standard | showcase (공식 쇼케이스 기준) |
|---|---|---|
| 엣지당 굽힘(bend) | ≤ 12 | ≤ 2 |
| 전체 굽힘 합 | ≤ 100 | ≤ 8 |
| 우회율(route stretch) | ≤ 5.0배 | ≤ 1.35배 (직선 대비) |
| 브리지(교차) 허용 | ≤ 8 | 0 |
| 노드 간 최소 간격 | 0 | ≥ 40px |
| 컨테이너 안 여백(gutter) | 0 | ≥ 20px |
| 라벨 이격 / 최소 선분 | 2px / 0 | 4px / 16px (자잘한 꺾임 금지) |
판정 결과는 점수로도 나온다: 100 − (위반 × 12 + 브리지 × 8 + 초과 굽힘 × 2). 위반마다 NODE_GAP, EDGE_ROUTE_STRETCH 같은 코드와 실측값·한계값이 붙어 나오므로, 에이전트는 "어디를 얼마나 고쳐야 하는지"를 기계가 알려주는 피드백으로 받는다. 수정 루프가 감으로 돌지 않는 이유다.
화살표는 전부 직각(orthogonal)으로만 꺾인다. 생성기가 노드·헤더·레전드·타이틀을 장애물로 놓고 경로를 계산하며, 같은 변에 여러 화살표가 몰리면 포트를 결정적으로 분산 배정한다. 에이전트가 개입하고 싶으면 IR에 힌트를 얹는다: corridor_x/y(이 복도로 지나가라 — 부드러운 선호), route_points(정확한 경유지 — 단 위험한 지점은 거부됨), source_port/target_port(출입 변 지정). 도저히 피할 수 없는 교차엔 점프 아크(bridge)를 그려 "선이 겹친 게 아니라 넘어간 것"임을 시각적으로 못박고, 같은 선분끼리의 공선 겹침은 치명 오류로 처리한다.
v1.2의 야심작. "이 다이어그램 움직이게 해줘(生成 GIF)"라고 하면 motion.py가 생성된 SVG를 받아 GIF로 굽는데, 여기도 자유 애니메이션이 아니라 12개 스타일별 모션 계약이 있다:
motion_stage)대로 그려지고, 38–109는 데이터가 흐르는 "정착 상태", 110–114에서 리셋 후 무한 루프.intentional_reset_boundary_repeat이라는 이름으로 분류해 둔다.<이름>.motion.json 리포트가 따라붙고, FFprobe로 해상도·프레임 수·루프를 재검증한 뒤 임시파일 → os.replace의 원자적 설치로만 최종 파일을 놓는다.export-html은 SVG 하나를 팬/줌/라이트·다크 테마/소스 복사/1–4× PNG·JPEG·WebP 내보내기가 되는 단일 오프라인 HTML로 포장한다. 포장 전에 sanitize_svg가 스크립트·이벤트 핸들러·외부 참조·foreignObject·외부 CSS를 전부 거부한다 — 생성물이 어디로 공유될지 모르니 뷰어 자체를 공격 표면으로 만들지 않겠다는 방어다.
가장 특이한 지점은 마지막 줄이다. 레포 안에 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줄로 억제된 것도 의도다 — 상세 내용은 참조 문서로 밀어 두고 에이전트가 필요한 순간에만 펼쳐 읽게 하는 "프로그레시브 디스클로저"로, 컨텍스트 창을 아낀다.
스킬 = 프롬프트 몇 장이라는 통념을 깨는 표본이다. 입구는 얇게(SKILL.md), 지식은 참조 문서로(필요할 때만 로드), 실행은 동봉 스크립트로, 품질은 픽스처+테스트로. 특히 SKILL_ROOT를 매 명령 블록이 스스로 해석하게 한 규칙(셸 변수가 다음 호출까지 살아 있다고 가정하지 말 것), Codex·Claude Code 양쪽 디스커버리 경로를 하나의 체크아웃에 심볼릭 링크로 잇는 설치 안내 같은 멀티 런타임 호환 디테일은 스킬을 만들 사람이라면 그대로 베껴도 된다.
"이상하면 경고하고 계속" 대신 "이상하면 그 자리에서 멈춘다". 스키마 정규화(1차) → 도메인 계약(2차) → 구도 예산(3차) → 사후 SVG 검사(4차)로 관문을 겹겹이 세우고, 각 관문이 위반 코드·실측값·한계값을 구조화해 돌려준다. LLM 산출물을 받아 쓰는 어떤 시스템에도 이식 가능한 뼈대다 — 다이어그램 대신 SQL, 설정 파일, API 호출을 넣어도 같은 그림이 성립한다.
직교 라우팅, 장애물 회피, 포트 분산 배정, 교차 최소화와 브리지, 우회율(stretch) 개념, 레전드·라벨의 충돌 회피 — 교과서의 그래프 레이아웃 이론이 960×600 viewBox 위에서 어떻게 실무 코드가 되는지를 fireworks_geometry.py(345줄, stdlib only)라는 부담 없는 크기로 읽을 수 있다.
"평가하라, 주장하지 말라(evaluate, don't assert)"가 슬로건이라면, 실행은 절제다: 결정적 검사를 먼저, 지각적 검증(PNG 읽기)을 나중에, 수정은 진단된 곳만, 그리고 루프는 최대 2회로 강제 종료. 이미지 리더가 없으면 검증했다고 거짓말하는 대신 visual_review: skipped로 보고한다. 에이전트 워크플로에서 흔한 "무한 자기수정 + 근거 없는 완료 선언" 두 병폐를 동시에 자르는 패턴이다.
npm tgz ↔ GitHub 릴리스 zip은 해시 대조, 레포 루트 ↔ 중첩 미러는 일관성 스크립트, 쇼케이스 GIF 13개는 SHA-256 매니페스트, 설치는 격리 환경 카나리로 재현 확인. "같아야 하는 두 사본"이 존재하는 모든 프로젝트에 통하는 규율이다.
| 구성요소 | 요구 | 비고 |
|---|---|---|
| Python | 3.9+ | 코어는 표준 라이브러리만 사용 |
| PNG 렌더러 | cairosvg 권장 | pip install cairosvg / 폴백 rsvg-convert(librsvg) |
| GIF 모션(선택) | Node 18+ · Chromium · FFmpeg/FFprobe | puppeteer-core@25.3.0을 스킬 사본마다 설치(호출자 폴더의 모듈을 일부러 안 읽음) |
| 에이전트 런타임 | Claude Code 또는 Codex | 스킬 없이 CLI만 단독 사용도 가능 |
| OS | macOS·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)
| 커맨드 | 하는 일 |
|---|---|
doctor | Python·cairosvg·node·ffmpeg·모션 런타임 가용성 JSON 보고 |
validate | IR JSON 정규화 + 의미 계약 검사 (렌더 없이 합격 여부만) |
render | IR JSON → SVG (+ --report로 레이아웃 리포트) |
check | 완성 SVG의 xml·markers·geometry·composition 검사 |
inspect | SVG에 박힌 시맨틱 메타데이터(스타일·프로파일·역할 수) 출력 |
export-html | 오프라인 인터랙티브 뷰어 HTML 생성 |
animate | 시맨틱 SVG → 검증된 GIF + .motion.json |
examples | 동봉 픽스처 목록 |
git clone 후 python3 scripts/fireworks.py doctor로 환경 점검, pip install cairosvg, 그리고 render architecture fixtures/api-flow-style7.json out.svg --report layout.json. 나온 SVG를 브라우저로 열고 layout.json에서 라우팅 리포트를 구경해 보자.
fixtures/ops-pulse-style12.json을 복사해 한 서비스의 골든 시그널을 4개→3개로 지우고 validate를 돌려 보자. 그다음 노드 두 개를 40px 미만으로 붙여 놓고 check의 NODE_GAP 위반 리포트를 확인. 에러 메시지가 얼마나 "고칠 수 있게" 쓰였는지가 관전 포인트다.
지금 하고 있는 프로젝트의 구조를 schema_version: 1 IR로 손으로 작성해 render까지. flow(data/control/write/read)와 kind(cylinder/hexagon/double_rect)를 의미에 맞게 고르는 연습이 핵심 — 다이어그램을 "그림"이 아니라 "데이터"로 다루는 감각이 생긴다.
위 설치 명령으로 스킬을 넣고 "우리 서비스 아키텍처 그려줘, 블루프린트 스타일" 같은 요청을 던져 보자. 에이전트가 SKILL.md의 12단계 워크플로를 따라가며 validate→render→check→PNG 리뷰를 수행하는 로그를 관찰하면, 스킬이 에이전트의 행동을 어떻게 구조화하는지가 보인다. 스타일만 바꿔 재요청하면 구조 재사용도 확인 가능.
Node 18+·FFmpeg·puppeteer-core를 갖추고 animate로 GIF + .motion.json을 뽑아 리포트의 프레임 유니크니스 판정을 읽어 보자. 마지막 단계: 이 레포의 관문 설계(정규화→계약→예산→사후검사→시각리뷰)를 자기가 만들 스킬 하나에 축소 이식해 보기. 그게 이 레포를 "쓰는" 것에서 "배우는" 것으로 넘어가는 지점이다.
| 주차 | 주제 | 구체적으로 |
|---|---|---|
| 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 팔레트 최적화, "애니메이션을 검증한다"는 문제 설정 자체 |
os.replace로 교체 — 도중에 죽어도 반쪽짜리 GIF/리포트가 남지 않게 하는 파일 쓰기 규율.SKILL.md(워크플로 전체) · docs/CAPABILITIES.md(능력 계약서) · scripts/composition_quality.py(예산 숫자 원본) · fixtures/*.json(IR 실물)