# 볼 베어링(ball-bearing) 설계서 — 구현자용

설계·검증: Claude (coordinator). 구현: 이 문서를 받은 worker. 정한 것은 그대로 따르고, 바꿔야 하면 바꾸지 말고 `orca orchestration ask`로 묻는다. 숫자를 조정했으면 worker_done에 적는다.

일꾼 규칙(요약): 설계를 새로 하지 말고 이 문서를 코드로 옮긴다. 막히면 preamble의 `ask`. 스크린샷과 확대 크롭을 직접 보고 확인한다(이 모델은 이미지를 볼 수 있다). 브라우저 시험은 `.agents/skills/anatomy/scripts/drive.mjs`(playwright는 없다). 줄·관은 `kit/tube.mjs`, 둥근 부품은 `kit/lathe.mjs`, 공은 `G.sphereOf`. `G.ringBand`로 얇은 링을 그릴 때는 `hole: [0, 안쪽 반지름]`(기본은 안을 채운다). 진행 보고는 첫 preview 성공 때 한 번, 끝나기 전에 `check`, `worker_done`의 바꾼 파일은 `git status`로. 이 저장소 밖의 파일(특히 `~/.claude/`)은 읽지 않는다.

## 0. 먼저 읽기
`docs/concept.md`, `.agents/skills/isowiki-entry/SKILL.md`, `docs/knowhow.md`("그림 안 라벨", "휴대폰", "판과 모서리 문구", "축이 엇갈리는 기계"), 코드 본보기 `pages/differential/figure/{model.mjs,scene.mjs,index.mjs,live.js}`, kit 참조 `.agents/skills/anatomy/references/kit.md` §10.

## 1. 한 문장
같은 플라이휠을 돌려 놓으면, 축이 미끄럼 베어링(청동 부시)에 얹혀 있을 때는 12초 만에 서고 볼 베어링에 얹혀 있을 때는 13분 넘게 돈다 — 미끄러지는 대신 굴러가기 때문이다.

독자가 하는 일: 베어링 종류 버튼(볼 베어링 / 미끄럼 베어링)을 고르고, "돌리기"를 누르거나 플라이휠을 손가락으로 튕긴다. 볼과 케이지가 축보다 느리게 도는 것이 보이고, 판독값이 회전수와 멈출 때까지 남은 시간을 보인다. 손대지 않으면 투어가 두 베어링을 번갈아 돌린다.

## 2. 파일
`pages/ball-bearing/figure/{model.mjs, scene.mjs, live.js, index.mjs}` — differential과 같은 구성. 1단계에서는 index.md·build.mjs를 건드리지 않는다.

## 3. 모형 (model.mjs) — m, kg, N, s (그림 좌표는 mm)
```js
// A 6204 deep groove ball bearing (NSK 6204: d 20, D 47, B 14 mm, 8 balls of 7.938 mm) or a bronze bush of the
// same size carries a steel flywheel on a 20 mm shaft. Friction torque M = mu * F * d / 2 slows the flywheel.
export const BEARING = { d: 20, D: 47, B: 14, balls: 8, Dw: 7.938, dm: 33.5 }; // mm
export const MU = { ball: 0.0015, plain: 0.1 };   // rolling (deep groove ball) vs a bronze bush running nearly dry
export const FLY = { r: 0.09, t: 0.024, rho: 7850 }; // steel flywheel disc, m
export const FLY_MASS = FLY.rho * Math.PI * FLY.r ** 2 * FLY.t;     // 4.79 kg
export const INERTIA = 0.5 * FLY_MASS * FLY.r ** 2;                  // 0.0194 kg·m²
export const LOAD = (FLY_MASS + 0.4) * 9.81;                          // 51 N on the bearing (flywheel + shaft)
export const torque = (kind) => MU[kind] * LOAD * (BEARING.d / 1000) / 2; // ball 0.00076, plain 0.051 N·m
export const SPIN_RPM = 300;                                          // what "돌리기" gives the flywheel
export const toRad = (rpm) => (rpm * 2 * Math.PI) / 60;
export const stopTime = (kind, rpm) => (INERTIA * toRad(rpm)) / torque(kind); // ball 798 s, plain 12.0 s from 300 rpm
// Kinematics of the ball set (outer ring fixed, inner ring with the shaft): the cage turns at 0.382 of the shaft
// speed, and each ball spins about its own axis 1.99 times per shaft turn (NSK/SNR 6204 data: FTF 0.382, BSF 1.99).
export const CAGE = 0.5 * (1 - BEARING.Dw / BEARING.dm);                       // 0.382
export const BALL_SPIN = (BEARING.dm / (2 * BEARING.Dw)) * (1 - (BEARING.Dw / BEARING.dm) ** 2); // 1.99
```
설계자 검산: 플라이휠 4.79 kg, I 0.0194, F 51.0 N, 마찰 토크 볼 0.00076·미끄럼 0.051 N·m, 300 rpm에서 멈추기까지 볼 798 s(13분 18초)·미끄럼 12.0 s.
- 감속: dω/dt = −M/I(일정). 공기 저항과 실(seal)의 마찰은 뺀다.
- 화면의 회전은 실제의 1/10 빠르기로 그린다(300 rpm → 30 rpm, 볼이 보이게). 판독값과 남은 시간은 실제 값.

## 4. 세계와 카메라
- 1 단위 = 1 mm, x 오른쪽, y 앞(관찰자 쪽), z 위. **축은 y축**(앞뒤)이다: 베어링의 앞면이 관찰자를 본다.
- 카드 600 × 420. `k.fitProjection(points, 600, 420, { pad: 30, azimuth: 66, elevation: 20 })` — 방위각 66°라 y에 수직인 면(베어링 앞면)이 크게 보인다. points: 판 꼭짓점, 받침대 위 끝, 플라이휠 테두리 위·아래, 축 앞 끝.
- 축 중심 높이 AXLE_Z = 140.

### 고정 부품
| 부품 | 형상 |
|---|---|
| 받침판 | `basePlate(P, {x:-150,y:-120,w:300,d:220,r:8}, { label, strip })` |
| 베어링 받침(하우징) | 주철 받침대: 바닥 발판 140(x)×50(y)×14(z) 슬래브(볼트 4개, 모서리 나사 점), 그 위 몸통 — 앞에서 보면 아래가 넓은 사다리꼴(바닥 폭 100, 위 폭 70)이고 위는 축 중심 둘레 r 46의 반원. y 0…40 (앞면 y = 40). 축 중심 (0, *, 140). 앞면에 베어링 자리 구멍 r 23.5. 윗면에 기름 구멍 나사(r 4). 몸통은 `G.prismOf`(y축 프레임, 볼록 다각형 둘: 사다리꼴과 반원 부분을 나눠). |
| 축 | y축 원기둥 r 10, y −70…41 (뒤로 플라이휠까지, 베어링 앞면에서 1 mm만 나옴). 축 끝면에 흰 표시선 하나와 센터 구멍 점(r 1.5). 너트·와셔는 없다(1단계 질문: 방위각 66°에서 볼을 가렸다). 내륜은 뒤쪽 축 어깨(r 12, y 20…26)에 기댄다 |
| 플라이휠 | 강철 원판: 바퀴통 r 22·y −74…−54, 원판 r 90·두께 24(y −78…−54)의 테두리(r 82–90)를 두껍게, 안쪽은 얇게(웹 두께 8, y −70…−62) + 덜어낸 구멍 4개(r 16, 중심 반지름 52). 테두리 옆면에 흰 표시 하나. `G.lathe`(y축 프레임) |

### 베어링 (앞면이 보이게, 앞 실드를 뺀 모습)
- 외륜: `G.ringBand` 또는 lathe, r 20.0–23.5, y 26…40(폭 14, 앞면이 하우징 앞면과 같은 면). 정지.
- 내륜: r 10.0–13.6, y 26…40. 축과 함께 돈다(표시점 하나).
- 볼 8개: `G.sphereOf`, 반지름 3.97, 중심은 y 33(폭 가운데), 반지름 16.75 원 위. 케이지와 함께 공전(CAGE × 축 각), 각자 자전(BALL_SPIN × 축 각) — 자전은 볼 위 작은 점 하나로 보인다(점은 볼의 보이는 쪽에 있을 때만).
- 케이지: 볼 사이 반지름 16.75 위의 얇은 띠(앞에서 보면 볼 사이를 잇는 물결 띠) + 볼 사이마다 리벳 점 하나. 볼과 함께 공전.
- 링 앞면의 립(테)이 볼 가장자리를 조금 가린다(링 사이 틈 6.9 mm < 볼 7.94 mm). 실제 홈은 볼보다 반지름이 4%만 크다(그림도 틈을 과장하지 않는다).

### 미끄럼 베어링 모드(버튼으로 바꿈)
- 볼·케이지·내륜·외륜 대신 청동 부시 하나: 링 r 10.0–23.5, y 26…40, 놋쇠색(lit과 다른 따뜻한 색, differential의 color-mix 계열). 앞면에 기름 홈(반지름 17 원호 하나)과 기름 구멍 점. 축은 부시 안에서 그냥 돈다.

## 5. 그리는 순서 (뒤 → 앞)
방위각 66°에서 y가 큰 것이 앞, x가 큰 것도 조금 앞.
1. 받침판
2. 플라이휠(뒤), 축의 뒤쪽 부분(y −70…0)
3. 하우징 발판, 몸통
4. 베어링 자리 안쪽 어둠(구멍 r 23.5 안을 어둡게 칠함)
5. 볼 베어링 모드: 외륜 안쪽 면 → 볼(앞뒤가 없으니 `depthOf` 순) → 케이지 → 내륜 → 외륜 앞면 테. 미끄럼 모드: 부시
6. 축 앞 끝, 표시선
7. 라벨

## 6. 판(plate)
- title "볼 베어링". hint "끌어서 돌리기 · 버튼으로 베어링".
- readout 예: "볼 · 287 rpm · 12분 뒤 멈춤"(25자 안쪽). 미끄럼: "미끄럼 · 210 rpm · 8초 뒤 멈춤". 멈춰 있으면 "볼 · 멈춤".
- keys: [{ mark: "lit", label: "볼: 미끄러지지 않고 구른다" }] — 볼을 lit.
- caption: 모형값(6204 베어링, 강철 플라이휠 4.8 kg, 마찰 계수 볼 0.0015·미끄럼 0.1, 300 rpm에서 시작, 회전은 1/10로 느리게 그림, 공기·실 마찰 뺌).
- controls: 그룹 "베어링" 버튼 "볼 베어링"/"미끄럼 베어링", 그룹 "손" 버튼 "돌리기"/"멈추기".
- 그림 안 라벨: 외륜 · 내륜 · 볼 · 케이지 · 축 · 플라이휠 · (미끄럼 모드에서는 볼·케이지·내륜·외륜 대신) 부시.

## 7. 움직임(2단계; 1단계는 START = { kind: "ball", rpm: 300, shaft: 0.6 } 한 장면 — shaft는 그림상 축 각(라디안))
- 상태 kind, rpm, 각(축·케이지·볼). 매 프레임 rpm -= (M/I)·dt를 rpm으로 환산, 각은 실제의 1/10.
- "돌리기" = rpm 300(0.4 s에 걸쳐 올림). 플라이휠 위의 투명 그립(data-grip, 플라이휠 테두리 영역, touch-action: none)에서 끌면 끈 속도만큼 rpm(최대 300). 무대는 touch-action: pan-y(도르래에서 실측한 충돌 때문). 베어링 바꾸기: rpm > 0이면 "멈추기"(1 s에 0) 후 바꾼다.
- 투어: 볼 돌리기 → 6 s 보기 → 멈추기 → 미끄럼 → 돌리기 → 멈출 때까지(12 s) → 볼 …

## 8. 본문(4단계)
절: 왜 필요한가 / 어떻게 움직이나 / 미끄러질 때와 구를 때 / 왜 이렇게 생겼나 / 쓰이는 곳 / 이 그림에 대하여. 사실은 §9에서만.

## 9. 사실표 (출처는 싣지 않는다)
1. 구름 베어링은 궤도륜(내륜·외륜), 전동체(볼), 케이지로 되어 있다. 케이지는 볼 사이를 띄워 볼끼리 닿지 않게 하고 부드럽게 구르게 돕는다. 하중은 받지 않는다.
2. 미끄럼 베어링은 미끄럼 마찰만으로, 구름 베어링은 구름 마찰로 축을 받친다.
3. 마찰 계수: 깊은 홈 볼 베어링 0.0010–0.0015. 미끄럼 베어링은 보통 0.01–0.02, 윤활이 모자라면 0.1–0.2, 마른 금속끼리는 0.2–0.4. 기름막이 충분한 미끄럼 베어링은 0.001 아래로 볼 베어링만큼 작아질 수도 있다 → 비교할 때는 미끄럼 베어링의 윤활 상태를 꼭 말한다(이 그림은 "기름이 거의 마른 부시").
4. 손으로 따라 할 셈: 20 mm 축이 1000 N을 받을 때 마찰 토크는 볼 베어링 0.015 N·m, 마른 미끄럼 베어링(0.1) 1.0 N·m — 약 67배.
5. 6204: 안지름 20, 바깥지름 47, 폭 14 mm, 볼 8개(지름 7.938 mm = 5/16인치), 강철 0.107 kg, 견딜 수 있는 하중(동정격) 약 14 kN.
6. 608: 8 × 22 × 7 mm, 볼 7개. 스케이트보드 바퀴 하나에 두 개씩 들어간다.
7. 바깥 바퀴(외륜)를 고정하면 케이지는 축 빠르기의 약 38%로 돌고, 볼은 축이 한 바퀴 돌 때 스스로 약 두 바퀴 돈다.
8. 깊은 홈: 홈의 곡률 반지름이 볼 반지름보다 4%쯤만 크다. 깊은 홈 덕에 축 방향(옆으로 미는) 하중도 양쪽으로 받는다.
9. 실드(금속 덮개)와 실(고무 씰)은 먼지를 막고 평생 쓸 그리스를 가둔다. 고무 실은 더 잘 막지만 마찰이 늘어 최고 회전수가 낮다.
10. 궤도륜과 볼은 베어링강(SUJ2, SAE 52100)을 담금질해 약 60 HRC로 단단하게 한다.
11. 원통 롤러 베어링: 선 접촉이라 큰 하중, 주로 반지름 방향(공작기계 주축). 테이퍼 롤러 베어링: 반지름·축 방향을 함께, 트럭 같은 무거운 차의 바퀴. 니들 베어링: 바깥 링이 가장 얇아 좁은 곳(변속기, 자재이음). 스러스트 볼 베어링: 축 방향 하중.
12. 승용차 바퀴는 대개 복렬 앵귤러 볼 베어링을 쓴 허브 유닛이다. 자전거 허브는 컵과 콘 사이에 낱알 볼을 넣는다. 전동기에 깊은 홈 볼 베어링을 쓴다. 하드 디스크는 요즘 거의 유체 베어링이다(볼 베어링보다 조용함) — "하드 디스크에 볼 베어링"이라고 쓰지 않는다.
13. 낱말: 내륜, 외륜, 볼(전동체), 케이지, 궤도, 실·실드. "보지기", "리테이너"는 쓰지 않는다(케이지로 통일).
14. 이 그림에 대하여 재료: 실제 베어링은 실이 볼과 케이지를 가린다(앞 실드를 뺐다). 내부 틈새와 예압은 그리지 않았다. 마찰 계수는 표준값이고 공기·실의 마찰은 뺐다.

## 10. 받아들임 기준(1단계)
1. `npm run preview -- ball-bearing`, `CHROME_PATH=/usr/bin/google-chrome-stable npm run check -- ball-bearing` 두 테마 line ends 0, `npm run build`
2. 스크린샷을 직접 보고: 볼 8개와 케이지가 링 사이에 보이고(4배 크롭), 판독값이 START에서 "볼 · 300 rpm · 13분 뒤 멈춤"
3. 버튼으로 미끄럼 모드 정지 장면을 그려(애니메이션 없이 즉시) 부시가 보이는지
4. worker_done: 바꾼 파일(git status), 설계서와 다르게 한 점, 설계에 대한 관찰(`out/ball-bearing/report.md`, `--report-path`)

## 11. 1b 고침 (1단계 검증에서, 조정자)
1단계 결과는 맞게 그려졌지만, 주인공인 베어링이 카드 폭의 10%도 안 되고 플라이휠이 그림을 차지하며 라벨 다섯이 좁은 곳에 몰린다. 원인은 설계의 비율이다(6204 실물 크기 vs 지름 180 mm 플라이휠). knowhow "작은 핵심부는 키운다"(차동 장치)를 따른다.
1. **베어링과 축을 2배로 그린다.** 그림 치수만 바꾸고 모형(§3: 마찰 토크는 d 20 mm, 케이지·볼 회전비)은 그대로. 그림용 상수 `DRAW = 2`를 scene에 두고: 외륜 r 40…47, 내륜 r 20…27.2, 볼 반지름 7.94·중심 반지름 33.5, 폭 y 12…40(B 28), 축 r 20(y −70…41), 축 어깨 r 24, 베어링 자리 구멍 r 47.
2. **받침대 머리를 키운다.** 몸통 위 반원 r 46 → r 70(베어링 둘레 23 남김), 사다리꼴 위 폭 70 → 120, 바닥 폭 100 → 150. 발판 140×50 → 200×60. 축 중심 높이 AXLE_Z 140 → 150.
3. **플라이휠은 실물 그대로**(r 90, 모형의 관성이 이것), 다만 받침대 뒤로 y −110…−86으로 물려 베어링 앞면과 겹쳐 보이는 일을 줄인다(축 뒤 끝 y −110).
4. **카메라와 받침판**: 받침판 260×200(x −130…130, y −140…60)으로 줄이고, fit points에 플라이휠 테두리와 받침대 머리만 넣어 베어링이 카드 폭의 20% 이상이 되게. 방위각 66°·고도 20°는 그대로.
5. **라벨**: 외륜·내륜·볼·케이지는 베어링 둘레 네 방향으로 나눠 단다(왼쪽 위 외륜, 왼쪽 아래 케이지, 오른쪽 위 볼, 오른쪽 아래 내륜), 축과 플라이휠은 그 밖. 지시선이 베어링 앞면을 가로지르지 않게.
6. "이 그림에 대하여" 재료(4단계용, 사실표 14에 덧붙임): 베어링과 축은 잘 보이게 실제의 두 배로 그렸다. 판독값은 실제 6204 크기로 계산한다.
