# 지렛대(lever) 설계서 — 구현자용

설계·검증: Claude (coordinator). 구현: 이 문서를 받은 worker. 정한 것은 그대로 따르고, 바꿔야 하면 바꾸지 말고 `orca orchestration ask`로 묻는다. 정하지 않은 세부는 `pages/pulley/`가 아니라 이미 병합된 페이지(`pages/differential/figure/`, `pages/hydraulic-jack/figure.mjs`)의 관례를 따른다. 숫자를 조정했으면 worker_done에 적는다.

## 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(`prismOf`, `frameOf`, `disc`).

일꾼 규칙(요약): 설계를 새로 하지 말고 이 문서를 코드로 옮긴다. 막히면 preamble의 `ask`. 스크린샷과 확대 크롭을 직접 보고 확인한다(이 모델은 이미지를 볼 수 있다). 줄·관은 선(stroke)이 아니라 `kit/tube.mjs`로, `G.ringBand`로 얇은 링을 그릴 때는 `hole: [0, 안쪽 반지름]`(기본은 안을 채운다). 진행 보고는 첫 preview 성공 때 한 번, 끝나기 전에 `check`, `worker_done`의 바꾼 파일은 `git status`로.

## 1. 한 문장
막대를 받치는 받침점을 짐(추) 쪽으로 옮길수록 같은 추를 드는 데 드는 힘은 줄고, 손이 움직여야 하는 거리는 는다.

독자가 하는 일: 받침점 위치 버튼(4곳)을 고르고, 손잡이를 끌어 내리거나 "누르기"를 누른다. 막대가 기울며 추가 올라가고, 용수철저울 눈금과 판독값이 힘을 보인다. 손대지 않으면 투어가 받침점 4곳을 차례로 눌렀다 놓는다.

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

## 3. 모형 (model.mjs) — mm, N, 라디안
```js
export const MASS = 2;                     // kg, the weight
export const GRAV = 9.81;
export const LOAD = MASS * GRAV;           // 19.62 N
export const LOAD_X = -230, EFFORT_X = 230; // where the weight hangs and where the spring scale pulls, along the bar
export const FULCRA = [-170, -110, 0, 110]; // fulcrum positions the buttons choose
export const PIN_Z = 260;                   // height of the fulcrum pin (1b: 400 → 260 so the figure fills the card)
export const SPRING = 1.0;                  // spring scale stretch, mm per N (1b: 1.5 → 1.0)
export const TILT_MAX = 0.2;                // largest tilt of the bar, rad (about 11.5°)
export const arms = (f) => ({ load: f - LOAD_X, effort: EFFORT_X - f });
export const force = (f) => (LOAD * arms(f).load) / arms(f).effort; // ideal, weightless bar, no friction
// The bar tilts by `tilt` (effort end down). Each end moves along its arc; the readout uses the vertical moves.
export const moves = (f, tilt) => ({ hand: arms(f).effort * Math.sin(tilt), weight: arms(f).load * Math.sin(tilt) });
```
받침점 4곳의 값(설계자가 셈한 것, 판독값 검사에 쓴다): 짐 쪽 팔 60·120·230·340, 손 쪽 팔 400·340·230·120 → 힘 2.9·6.9·19.6·55.6 N. 기울기 TILT_MAX에서 손 79·68·46·24 mm, 추 12·24·46·67 mm.

## 4. 세계와 카메라
- 1 단위 = 1 mm, x 오른쪽, y 앞, z 위. 카드 600 × 400. `k.fitProjection(points, 600, 400, { pad: 30, azimuth: 30, elevation: 26 })` — 방위각 30°로 긴 막대가 화면을 가로지르게. points: 판 꼭짓점, 막대 양 끝의 최고·최저 위치, 손잡이 최저점.

### 고정 부품
| 부품 | 형상 |
|---|---|
| 받침판 | `basePlate(P, {x:-280,y:-80,w:560,d:160,r:8}, { label, strip })`, label 판은 오른쪽 앞 |
| 레일 | 판 위 x −200…200, y −12…12, z 0…6 슬래브. 윗면 앞 가장자리에 눈금 10 mm마다(5번째 굵게), 받침점 4곳 자리에 짧은 굵은 눈금 |
| 저울 고리 받침 | 없음(용수철저울은 막대 끝에 매달려 손잡이로 당긴다) |

### 움직이는 부품 (상태 { f, tilt })
| 부품 | 형상 |
|---|---|
| 받침대(움직이는 받침점) | 레일 위 수레: 44×40×12 슬래브(x 중심 f), 옆에 고정 나사 노브(r 6, knurl). 수레 위 사각 기둥 20×20, z 18…PIN_Z−20. 기둥 꼭대기에 갈래(fork): 판 두 장(뒤 y −16…−12, 앞 y 12…16), 폭 x f±14, z PIN_Z−24…PIN_Z+12, 위 끝 둥글게(r 14) |
| 핀 | y축 원기둥 r 4, y −18…18, 중심 (f, *, PIN_Z). 앞뒤 너트 r 6 |
| 막대 | 강철 막대 단면 12(y) × 10(z), 길이 520(x −260…260). 받침점 핀에 걸려 돈다: **막대에 구멍이 4개(FULCRA 자리) 뚫려 있고 지금 받침점의 구멍에 핀이 꽂힌다**. 막대는 핀 중심을 지나는 축(y) 둘레로 tilt만큼 돈다(손 쪽이 내려가는 방향이 +). `G.prismOf(G.frameOf([f,0,PIN_Z],[0,1,0],u,v), rect, −6, 6, P)` — u = (cos t, 0, −sin t), v = (sin t, 0, cos t), rect는 막대 단면이 아니라 x–z 옆모습 [[LOAD_X−30−f,−5],[EFFORT_X+30−f,−5],[EFFORT_X+30−f,5],[LOAD_X−30−f,5]] |
| 막대 눈금 | 막대 윗면에 10 mm마다 눈금, 받침점 구멍 4곳 둘레에 링. 막대와 함께 돈다 |
| 추 | 막대 왼쪽 끝 고리(x = LOAD_X에서 막대 밑) → 쇠고리 2개(링) → 걸이 막대 r 2.5 → 원기둥 추 r 32, 높이 80(강철 2 kg). 추는 늘 수직으로 매달린다. 옆면에 "2 kg". 공중에 매달려 있다(tilt 0일 때 추 아랫면 z 약 275) |
| 용수철저울 | 막대 오른쪽 끝 고리(x = EFFORT_X) 아래에 수직으로 매달린 원통 몸(r 12, 길이 90), 앞면에 세로 눈금(0–60 N, 2 N마다, 10 N마다 굵게 + 숫자 0·20·40·60)과 바늘. 몸 안의 용수철(`k.coil` 또는 tube 나선)이 보이게 앞면을 세로로 잘라 연다. 아래로 나온 막대 끝에 손잡이 고리. 용수철이 늘어난 길이 = SPRING × 힘 → 바늘과 아래 막대가 그만큼 내려온다 |
| 손잡이 | 저울 아래 막대 끝의 T자 나무 손잡이(y축 원기둥 r 6, 길이 40) |

## 5. 그리는 순서 (뒤 → 앞)
방위각 30°에서 x가 큰 것이 앞(cos30 = 0.87), y가 큰 것도 앞(sin30 = 0.5).
1. 받침판, 레일·눈금
2. 받침대 수레·기둥, 갈래 뒤 판, 핀 뒤 너트
3. 추(막대 왼쪽 끝 아래 — 막대보다 화면 아래라 겹치지 않음, 겹치면 추가 먼저), 쇠고리
4. 막대, 막대 눈금·구멍 링
5. 핀, 갈래 앞 판, 핀 앞 너트
6. 용수철저울(막대 오른쪽 끝 아래, 막대보다 앞), 손잡이
7. 라벨
겹치는 곳이 이 표와 다르면 `k.depthOf`로 확인하고 ask로 묻는다.

## 6. 판(plate)
- title "지렛대". hint "끌어 내려 누르기 · 버튼으로 받침점".
- readout 예: "6.9 N · 손 6.8 cm · 추 2.4 cm"(휴대폰 25자 안쪽). 힘은 소수 한 자리 N, 거리는 소수 한 자리 cm.
- keys: [{ mark: "lit", label: "받침점: 짐 쪽으로 옮길수록 힘이 준다" }] — 받침대 갈래(판 두 장과 핀)를 lit(놋쇠 강조, differential의 color-mix 계열)로.
- caption: 모형값(2 kg 추, 막대 520 mm, 막대 무게와 마찰은 뺌, 저울 1.0 mm/N).
- controls(`lib/controls.mjs`): 그룹 "받침점" 버튼 4개(텍스트: 짐 쪽 팔 : 손 쪽 팔 비 "1:7", "1:3", "1:1", "3:1"), 그룹 "손" 버튼 "누르기"/"놓기".
- 그림 안 라벨(knowhow "그림 안 라벨"): 받침점 · 힘점(손잡이 쪽 막대 끝) · 작용점(추 쪽 막대 끝) · 용수철저울 · 추. 움직이는 앵커는 매 프레임 따라간다.

## 7. 움직임(2단계에서; 1단계는 START = { f: −110, tilt: 0.12 } 한 장면)
- 상태 f(4곳 중 하나), tilt(0…TILT_MAX). tilt는 지수 추종(시정수 0.35 s).
- 끌기: 무대에서 아래로 8 px 넘게 끌면 손잡이를 따라 tilt. 버튼 "누르기" = TILT_MAX, "놓기" = 0. 받침점 버튼: tilt > 0이면 먼저 0으로 내린 뒤 받침대가 레일을 따라 미끄러져(0.6 s) 옮겨 가고, 핀이 다음 구멍에 꽂힌다.
- 투어: 받침점 1:7 → 누르기 → 1 s → 놓기 → 1:3 … → 3:1 → 반복. 조작하면 멈추고 8 s 뒤 재개. 화면 밖·reduced motion 처리.

## 8. 본문 (4단계에서. 1단계에서는 쓰지 않는다)
절: 왜 필요한가 / 어떻게 움직이나 / 받침점을 옮기면 / 세 가지 지레 / 왜 이렇게 생겼나 / 이 그림에 대하여. 사실은 §9 사실표에서만.

## 9. 사실표 (본문에 쓸 수 있는 사실은 이것뿐, 출처는 싣지 않는다)
1. 지레(지렛대): 막대의 한 점을 받치고 한쪽에 힘을 주어 물체를 움직이는 장치. 막대를 받치는 점이 받침점, 힘을 주는 점이 힘점, 물체에 힘이 작용하는 점이 작용점. 본문의 주 용어는 "지레", 막대 자체는 "지렛대".
2. 지레의 원리: 힘 × 받침점까지 거리가 양쪽에서 같으면 평형(막대 무게를 빼면). 예: 시소에서 30 kg이 2 m에 앉으면 1 m에 앉은 60 kg과 맞는다.
3. 힘의 배율 = 힘점 쪽 팔 ÷ 작용점 쪽 팔. 받침점에서 먼 쪽이 같은 비율로 더 멀리 움직인다. 힘에서 얻은 만큼 거리에서 잃는다(일은 같다). 힘과 움직이는 거리를 동시에 얻을 수는 없다.
4. 1종 지레: 받침점이 가운데(가위, 시소, 장도리, 펜치, 노). 힘의 방향을 뒤집는 유일한 종류. 받침점이 짐 가까이면 힘을, 손 가까이면 빠르기를 얻는다.
5. 2종 지레: 작용점이 가운데(병따개, 호두까기, 손수레). 늘 힘을 얻는다.
6. 3종 지레: 힘점이 가운데(핀셋, 집게, 젓가락, 낚싯대, 사람의 팔). 힘은 잃고 거리와 빠르기를 얻는다.
7. 사람의 팔: 위팔두갈래근이 팔꿈치에서 약 4 cm에 붙고 손은 약 33–38 cm라 배율이 약 0.1. 근육이 짧게 줄어도 손이 크게 빨리 움직인다.
8. 쇠지렛대(빠루): 굽은 끝이 받침점이 되어 짐 쪽 팔을 몇 cm로 짧게 만든다. 길이 0.6–0.9 m짜리가 흔하다. 모형: 0.9 m 막대에서 받침점이 끝에서 5 cm면 배율 약 17, 손으로 200 N을 주면 약 3400 N(350 kg 무게).
9. 장도리: 노루발이 더 굽고 자루가 길수록 큰 힘을 낸다. 볼트 커터는 손잡이가 길고 날이 짧다. 가위로 두꺼운 것을 자를 때는 받침점 가까이 넣는다(짐이 받침점에 가까울수록 힘이 덜 든다).
10. 사람이 손으로 계속 주기 알맞은 힘은 100 N 안팎, 움직이기 시작할 때 200 N 정도(밀고 당기기 기준의 비유).
11. 아르키메데스가 "설 곳을 주면 지구를 움직이겠다"고 했다고 전한다(파푸스의 기록). 실제로 했는지는 알 수 없다. — 쓰려면 한 줄로만.
12. 이상적인 지레는 막대 무게와 마찰을 뺀다. 실제로는 휨·마찰·닳음이 배율을 줄인다.

## 10. 받아들임 기준(1단계)
1. `node -e` build 출력 길이, `npm run preview -- lever` 성공
2. `CHROME_PATH=/usr/bin/google-chrome-stable npm run check -- lever` 두 테마 line ends 0
3. 스크린샷을 직접 보고(이 모델은 이미지를 볼 수 있다) START 장면의 판독값이 "6.9 N · 손 4.1 cm · 추 1.4 cm"(tilt 0.12, f −110: 손 340·sin0.12=40.7 mm, 추 120·sin0.12=14.4 mm)인지 확인
4. worker_done: 바꾼 파일(git status), 설계서와 다르게 한 점, 설계에 대한 관찰

## 11. revision (본문 단계에서)
pulley와 같다(`docs/delegation.md` "생성 기록"): model deepseek-v4.1-flash, harness `pi <버전> (orca orchestration)`, note에 "설계: claude-opus-5-5, out/lever/design.md".

## 부록: 설계자가 확인한 높이(검산용, 1b)
1b에서 PIN_Z 400 → 260, 저울 몸 150 → 90 mm, SPRING 1.5 → 1.0 mm/N. 일꾼 보고(그림이 카드 폭의 37%, 저울 몸 4 px, 1 N 눈금 0.6 px)에 대한 답이다.
- 3:1·최대 기울기: 손 쪽 막대 끝 z = 260 − 5 − 24 = 231. 고리 16 + 몸 90 + 나온 막대(24 + 55.6) + 손잡이 12를 빼면 손잡이 아래 z ≈ 33.
- 1:7·최대 기울기: 끝 z = 260 − 5 − 79 = 176. 176 − 16 − 90 − (24 + 2.9) − 12 ≈ 31.
- 추는 막대 왼쪽 끝 아래 고리 40 + 몸 80, tilt 0에서 아랫면 z ≈ 135. 기울이면 왼쪽 끝은 올라가기만 한다.
- 받침대 기둥은 z 18…PIN_Z−20 = 240, 갈래는 PIN_Z−24…PIN_Z+12.
- fit points: 판 꼭짓점, 막대 양 끝의 최고·최저 z(3:1과 1:7 최대 기울기), 추 아랫면, 손잡이 최저점. 그림이 카드 폭의 55% 넘게 차야 한다.
