max-model: 아이디어 -> 검증된 출력 가능한 부품
요청: 사용자가 /max-model 뒤에 입력한 내용 (또는 설명한 것).
FORGE = 이 스킬의 디렉토리 (예: ~/.claude/skills/max-model); 아래 모든 경로는 이 디렉토리를 기준으로 합니다. 하나의 CLI 명령어: $FORGE/bin/forge <cmd> (목록은 하단 참조).
환경 (README 참조): CAD 가상 환경 $FORGE/.venv-cad (build123d, trimesh, manifold3d, usd-core, opencv, sdf; FORGE_CAD_PY로 재정의 가능), 선택적 AI 가상 환경 $FORGE/.venv-ai (torch, diffusers, CLIP; FORGE_AI_PY로 재정의 가능)은 text3d 및 looks에 사용됩니다.
프린터: knowledge/printer.json (베드, 노즐, 레이어; 예제는 knowledge/printers/에 있음). 슬라이싱은 사용자가 선택한 슬라이서로 진행됩니다: forge는 검증된 STL과 사전 비행 결과(지지대 켜기/끄기)를 제공하는 것으로 끝납니다. 선택적 slicer_cmd 훅을 통해 forge가 출력 시간과 그램을 보고할 수 있습니다.
2026-10-17 벤치마크 결과 (knowledge/benchmark-2026-10-17.md): 완전한 사양의 부품은 실제 STEP 파일 대비 0.96 복셀 IoU를 달성했지만, 세부 사항을 추측한 경우 0.41-0.82에 그쳤습니다. 프린트-인-플레이스 메커니즘은 첫 번째 빌드에서 융합된 간극 없이 동작 스윕을 통과했습니다 (저자의 실제 프린터 출력으로 아직 검증되지 않음). 상징적/유기적인 것들의 LOOKS는 수작업으로 모델링할 때 취약점입니다 (수작업 헬멧이 계란처럼 나옴). text3d / looks / remix 파이프라인은 의지력 대신 도구로 그 취약점을 커버하기 위해 존재합니다: 참조 패스 + Looks Score, 유기적 피규어를 위한 로컬 텍스트->3D, 조각 위에 플렉시파이, 상징적 소품을 위한 찾기 및 리믹스.
절대 변하지 않는 규칙
- 숫자가 먼저, 그림은 그 다음. 도구의 출력(verify/selftest/preflight/grade JSON)이나 이번 반복에서 읽은 렌더링에서 나오지 않은 형상에 대한 주장은 하지 마십시오. 절대 기억에 의존하여 STL을 설명하지 마십시오.
- 맞춤 부품은 모델보다 사양 우선:
spec.md+ 숫자 기반 성공 기준이 포함된spec.json을 먼저 작성하십시오. - 반복당 하나의 변경, 모든
iter_NN/디렉토리를 유지하고, 단계당 최대 6개까지, 이후 재계획하십시오. - 움직이는 모든 것은 통과하는 자체 테스트와 함께 제공 (스윕 클리어 + 반드시 걸림 제어 + 측정된 간극). 예외 없음; 이것이 이 스킬의 강점인 메커니즘의 이유입니다.
- 모든 출력물은 슬라이싱 전에
forge preflight를 거쳐야 하며, 그 결과가 지지대를 결정합니다. NO-GO = 먼저 형상/방향 수정. 프린트-인-플레이스 / 멀티바디 부품은forge export <stl>로 내보내고 STL이 아닌 3MF를 전달하십시오: 슬라이서의 자동 지지대가 간극을 채우고 부품을 용접합니다 (CYCLO-11의 첫 번째 출력물이 그렇게 망가짐). STL은 "지지대 끄기" 정보를 전달할 수 없습니다. - 환경: Blender, OpenSCAD 및 GPU torch (text3d, looks)는 GPU를 숨기는 일부 에이전트 샌드박스 내에서 충돌할 수 있습니다 (Blender는 139로 종료). 단계가 세그폴트로 실패하면 샌드박스 외부에서 실행하십시오. 순수 파이썬 (build123d, manifold3d, trimesh)은 어디서나 실행됩니다.
- 중요 지점을 간략히 보고 (선택된 경로, 첫 번째 렌더링, 출력 준비 완료(시간/그램/결과), 차단 요소): 각각 한 줄씩, 사용자가 결정해야 할 사항을 말하십시오. 채널에서 파일을 지원할 때 핵심 이미지(sheet.png, poster.png)와 AR 파일을 보내십시오.
- 사용자의 명시적 동의 없이 절대 출력을 시작하거나 비용을 지출하지 마십시오. 다운로드한 모델: 라이선스를 존중하십시오 (CC BY-NC = 판매 금지).
세션 시작 (30초)
ls $FORGE/knowledge/; cat $FORGE/knowledge/{fit-log.md,lessons.md,printer.json}; $FORGE/bin/forge fit show
$FORGE/bin/forge doctor # 빨간 줄 -> 수정하거나 모델링 전에 보고
forge fit show에서 pip_gap이 여전히 [R] (연구용 기본값, 이 프린터에서 측정되지 않음)이라고 표시되면: Fit Card (forge mech build fitcard, 약 1시간, ~16 g)가 모든 움직이는 부품을 보정한다고 한 번 언급하고 출력해 보겠다고 제안하십시오.
단계 0 — 경로 (망치가 아닌 파이프라인 선택)
첫 번째 일치가 승리합니다. 경로를 한 줄로 사용자에게 알려주십시오.
| 사용자 요청 | 경로 | 도구 |
|---|---|---|
| 다운로드한 파일 수정: 이름/텍스트, 키체인 고리, 자석, 벽 두껍게, 머리 크기 조정, 평평한 바닥, 미러 | REMIX (다운로드 후 업그레이드) | `forge remix text |
| 사용자 숫자 기반 실용적인 물건: 상자 (슬라이드/누름 뚜껑), 이름 키체인, 사인, 폰 거치대, 물건 홀더, 리소파네 | MAKE (생성기; fit.json의 여유 공간 적용; 상자는 동작 검사됨) | `forge make box |
| 한 번에 여러 복사본 / 전체 프로젝트 (판매용) | PLATE (베드 패킹, 항목당 비용) | `forge plate <stl...> --fill |
| 유명한 기존 물건 (영화 헬멧, 소품, 인기 장난감, 인기 기기 케이스) | FIND (Printerables/Thingiverse 같은 모델 사이트를 직접 검색), 이후 REMIX (크기 조정, 분할, 자석, 맞춤) | 웹 검색, forge split, forge preflight --orient |
| 독창적인 착용 가능 헬멧 ("아무도 안 가진 헬멧") | TEXT3D --helmet: 목 부분 절단, 사용자가 지정한 머리 크기 (기본 160x190 + 패드), 3mm 쉘, 페이스플레이트 + 자석 보스 4개, 이음새 방향 아래로 분할 | forge text3d "<스타일> helmet" --helmet |
| 움직이는 것 (피젯, 힌지, 기어, 자이로, 발리송, 패스스루, 클리커) | MECHKIT (모듈이 맞는 경우), 그렇지 않으면 Mech API로 모델링 | forge mech list/build, lib/mechkit/core.py |
| 플렉시 동물 | SDF 바디 디자인 (lib/sculpt.py) 또는 조각 (모델 사이트/text3d) -> FLEXIFY | forge flexify, forge sculpt |
| 피규어 / 마스코트 / 생물 / 조각상 | TEXT3D (로컬, 무료, ~3.5분) 또는 찾기; 둘 다 제안 | forge text3d "<아이디어>" [--base NAME] |
| 사용자 물건을 위한 맞춤형 기능 부품 (마운트, 홀더, 어댑터, 케이스) | MODEL (1-6단계) | build123d 방식, forge run, forge parts-find |
| 서랍 정리 / 물건을 위한 인서트 | GRIDFINITY (+ 정확한 포켓을 위한 PHOTOFIT) | forge gridfinity, forge photofit |
| 베드보다 너무 큼 | 핀 + 이음새 라벨로 SPLIT | forge split |
| "이거 출력 가능? / 왜 실패했지?" | PREFLIGHT (+ 히트맵) | forge preflight, forge heat |
| 자랑 / 판매 | SHOWCASE + AR | forge showcase, forge ar |
경로 선택을 위한 정직한 품질 노트 (저자 측정, 2026-10-17): text3d 피규어는 명확하게 읽힙니다 (악어, 용, 유령 마스코트, 상어) 하지만 60mm에서 미세한 디테일이 부드럽고 지지대가 필요합니다; 텍스트로 만든 플렉시는 울퉁불퉁합니다 (얇은 다리가 합쳐짐) -> 플렉시에는 SDF 디자인 바디나 사람이 조각한 형태를 선호하십시오; 수작업 유기적 형태는 여전히 덩어리처럼 보입니다 -> 헬멧/캐릭터는 절대 수작업으로 모델링하지 말고 FIND+REMIX 또는 TEXT3D를 사용하십시오.
단계 1 — 개요 (맞춤 부품): 숫자가 있는 사양
- 사용자가 이미 정확한 물건 (기기 모델, 측정값, 사진)에 대해 알려준 모든 것. 1b. 이름이 있는 모든 것에 대한 참조 패스: 실제 물건의 참조 이미지 / 최고 평점 디자인 6-9개를 검색하고, LOOKS; spec.md에 "## 형태"를 작성하십시오 (비율, 2-3개의 특징적인 특징, 변형). 이를 건너뛰면 벤치 발리송이 평평한 막대기가 되고 나선형 피젯이 잘못된 장난감이 되었습니다.
- 치수: 조회하고, 절대 기억하지 마십시오 (벤치: 풀리 0.41 IoU로 회상).
forge parts-find "<부품>" [--download]+forge step2stl; 데이터시트는 웹 페치로; 참조 이미지는 웹 검색으로. 출처를 spec.md에 명시하십시오. 사용자가 소유하고 조회할 수 없는 물건의 경우: PHOTOFIT (forge photofit mat-> Calibration Mat을 100%로 출력 -> 사진 -> ~0.3mm 이내의 윤곽선)이 캘리퍼스 숫자를 묻는 것보다 낫습니다. - 찾을 수 없는 것만 사용자에게 물어보십시오: 하나의 메시지, <= 4개의 질문, 각각 기본값 포함.
out/<name>/spec.md+spec.json(템플릿/) 작성. 적합 인터페이스의 추정치는estimate로 표시됩니다.- "사양 준비: <한 줄> -- 빌드해도 될까요?" 게시; 위험이 낮은 침묵에는 명시된 기본값으로 진행하십시오.
단계 2 — 방식 + 계획
| 방식 | 사용처 |
|---|---|
| b123d (기본) | 기능/치수/적합 중요 부품, 인클로저, MechKit 모듈 |
| scad | 간단한 부품 또는 하나의 BOSL2 프리미티브 (나사산) |
sdf (lib/sculpt.py) | 직접 디자인하는 유기적 바디: 부드러운 합집합, 평평한 베이스, 항상 수밀 (게코 레시피) |
mesh (lib/meshkit.py, manifold3d) | 다운로드/AI 메시 편집, 큰 불리언, 플렉시파이, 분할 (OCC는 100k 삼각형 조각에서 질식함) |
| bpy | 렌더링, 복셀 리메시, 텍스트가 많은 아트 |
부품 파일 상단의 주석에 계획: 함수로서의 특징, mm 단위의 파라미터 블록, fit.get("pip_gap"/"slide_gap"/...)의 여유 공간 (절대 0.3 하드코딩 금지), Z=0에서 바닥 중앙 원점, 출력 방향 설계 (가장 큰 평평한 면이 아래로, 오버행 <= 45, 브리지 < 18, 벽 >= 2.0), 빌드 순서, assert 목록. |
단계 3 — 작은 단계로 빌드
반복당: 하나의 변경 -> forge run part.py --lane <방식> --spec spec.json --name <이름> -> verify.json/REPORT.md 읽기 (볼륨/바운딩 박스가 변경으로 인해 예상되는 대로 변경되었는지? 변경 없음 = 드롭된 불리언) -> sheet.png를 한 번 읽기 -> 비판 -> 다음 변경.
- 움직이는 부품 = Mech API (
lib/mechkit/core.py):Mech(이름, 부품, 고정, [Motion(이름, 드라이브, [Move...], 제어=[...])])->selftest()는 모든 포즈를 스윕하고, 전체 경로를 따라 반드시 걸림 제어를 실행하며, 간극을 정확히 측정합니다. 충돌 방지 설계가 확인보다 낫습니다: 피벗을 중심으로 한 호/구는 간극을 일정하게 유지합니다 (자이로, 플렉시 조인트); 각 이동체의 스윕 볼륨을 평면의 한쪽에 유지하십시오 (발리송 피벗). 기어:lib/gears.py. 선언된 것이 아닌 측정된:forge mech ratio <이름> [--motion M --driven PART --driver PART]는 메커니즘을 배치하고, 출력을 해제하고 접촉 없는 간격을 이분법으로 찾습니다 -> 측정된 비율 + 백래시 (ratio.json, 선언된 비율과 일치하지 않으면 종료 코드 3). 사이클로이드 감속기:forge mech build cyclo11(lib/cycloid.py정확한 프로파일 + 언더컷 검사). 스튜디오 렌더링:forge showcase <dir> --style studio --still hero|cutaway|exploded,--ghost,--annotate. - 루프 내 사전 비행 오버행이 있는 모든 것:
forge preflight out/<이름>/<이름>.stl. - 명명된 객체: 기계적 통과 후 Looks Score:
forge looks out/<이름>/<이름>.stl --target "<물건>"(깨끗한 렌더링에 대한 CLIP; 검증됨: human > v2 > v1 발리송 순위). < 30% = FORM(비율, 특징적인 특징) 반복, 기계적 측면이 아님. 추측 대신 v1과 v2를 비교하는 데 사용하십시오. - 엄격한 규칙: 단일 뷰에서 판단하지 마십시오; 오버랩 커터 0.05mm (동일 평면 면은 두께가 0인 스킨을 남겨 핀을 WELD: 측정된 간극 0.0 대신 0.3); 동일한 실패가 두 번 발생하면 하위 부품 번호를 출력하고 재진단하십시오; 6회 반복 후 재계획하거나 FIND로 경로 변경. verify가 모든 사양 키를 통과하고, selftest가 통과하고(이동체), preflight가 GO/GO+SUPPORTS이고, 시각적 체크리스트가 모두 예일 때 완료합니다.
단계 4 — 핏
- 보정 우선: 프린트-인-플레이스 간극은
fit.json에서 비롯됩니다. pip_gap이 [V]가 될 때까지, 모든 PIP 디자인은 사전 비행 주의(CAUTION)를 수반합니다. Fit Card는 하나의 출력물에서 pip_gap (스피너 .15-.40)과 pip_vgap (힌지 .25-.45)을 측정합니다: 출력 후, "단단히 비틀었을 때 가장 작은 숫자가 자유롭게 회전합니까?"라고 물으십시오 ->forge fit set pip_gap <n> --from "fitcard <날짜>"(및 pip_vgap). 모든 MechKit/flexify/gridfinity 빌드가 자동으로 읽습니다. - 결합 부품 / 사용자 물건 주변 부품: 조립된 포즈 확인
bin/verify --assembly a.stl b.stl --clearance <핏> --move-b=x,y,z; photofit/parts-find의 물건 더미. - Fit Card가 다루지 않는 인터페이스 유형 (나사산, 스냅핏, 압입) 또는 추정 치수에만 쿠폰: <= 10분, 3가지 변형, 올라간 라벨.
단계 5 — 출력 준비 + 전달
forge preflight <stl> [--slice]-> 결과 + 지지대 결정. 유기적/기울어진 부품:forge preflight <stl> --orient(기울기 시도; 하나의 헬멧은 ~20도를 원함).forge heat <stl>는 빨간색/노란색 지지대 히트맵을 만들어 보여줍니다.- 지지대 = preflight의 결정: GO -> 끄기; GO+SUPPORTS -> 켜기/자동; NO-GO -> 먼저 수정 (칼날 접촉, 융합된 간극, 맞지 않음 ->
forge split). "SUPPORTS: OFF (필수)" = 자동 지지대 함정 (수평에서 30도 미만의 평평한 밑면이 다른 본체 위 2mm 미만에 위치; 프린터 프로파일의support_angle/support_trap_gap): 지지대는 반드시 OFF 상태로 유지되어야 합니다. 그렇지 않으면 간극을 용접합니다. 2b. 항상, 프린트-인-플레이스 / 멀티바디 파일을 사용자에게 전달하기 전에:forge preflight <stl>그런 다음forge export <stl>(자동으로 결과를 따름; 이름은_SUPPORTS-OFF.3mf/_SUPPORTS-ON.3mf로 끝남). 3MF를 제공하고 말하십시오: 이 파일을 열고, Support 상자가 파일 이름과 일치하는지 확인하고, 다른 것은 변경하지 마십시오. preflight가 지지대가 필요하기 때문에 NO-GO이고 지지대가 용접되는 경우, 내보내기 전에 형상을 수정하십시오 (평평한 밑면을 45도로 모따기, 재정렬). - 내보낸 3MF (또는 단일 본체 부품의 경우 STL)를 2단계의 지지대 결정과 일반 프로필을 사용하여 선택한 슬라이서에서 슬라이싱하십시오. forge는 3MF를 통해 지지대 체크박스만 설정합니다. (선택 사항:
knowledge/printer.json에slicer_cmd를 설정하여preflight --slice/plate --slice가 시간과 그램을 보고하도록 할 수 있습니다.) - 사용자에게 보여주십시오: 시트 또는 쇼케이스 포스터 + 시간/그램 (훅이 설정된 경우) + 결과 + 한 줄 레시피. 크기/적합이 문제일 때
forge ar <stl>(USDZ: iPhone/Vision Pro에서 실물 크기 미리보기로 열림; GLB는 Quest용)을 제공하십시오. - 사용자의 동의 없이 출력을 시작하지 마십시오: "베드 비었습니까? <이름> 시작, ~<시간>, g."
- "<이름> 출력 준비 완료: <시간>, g, <결과>." 판매?
forge showcase <dir>는 mp4/gif + listing.md (비용, 제안 가격, 라이선스 알림)를 작성합니다.
단계 6 — 피드백 + 학습
- 출력 후 한 줄: "무엇이 잘못되었습니까? (적합성 / 외관 / 강도 / 출력 품질 / 없음)". 사진이 있으면 읽으십시오.
- 간극 ->
forge fit set ...(+ fit-log.md에 행 추가). 다른 숫자 -> fit-log.md / print-tolerances.md [V]. knowledge/lessons.md에 1-3줄 (날짜 · 프로젝트 · 교훈 · 단계). 새로운 기술 ->knowledge/<주제>.md(<= 40줄, 실행 가능한 스니펫).part.py+ spec을 재실행 가능하게 남겨두십시오. 시작하지 않고 인접한 아이디어 하나를 제안하십시오 (shop brain).- 모든 스킬/도구 변경 ->
tests/run_suite.sh(알려진 답 확인) 및 기능 주장의 경우 벤치 (forge grade,forge looks) -- 개선되었음을 증명하십시오.