# 윤활 장치(lubrication) 설계서 — 구현자용

설계·검증: Claude (coordinator). 구현: 이 문서를 받은 worker. 정한 것은 그대로 따르고, 바꿔야 하면 바꾸지 말고 `orca orchestration ask`로 묻는다. 정하지 않은 세부(작은 부품의 정확한 크기, 라벨 위치)는 네가 정하고 worker_done에 적는다.

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

## 0. 먼저 읽기
`docs/concept.md`, `.agents/skills/isowiki-entry/SKILL.md`, `docs/knowhow.md`(전부 — 특히 "냉장고: 배관과 문", "그림 안 라벨", "휴대폰"), 본보기 `pages/differential/figure/*`, `pages/refrigerator/figure/compressor*.mjs`(관과 흐름 점), kit 참조 `.agents/skills/anatomy/references/kit.md` §10–§11.

## 1. 한 문장
엔진이 돌면 펌프가 기름 통의 기름을 걸러 크랭크축 베어링까지 보내고, 도는 축은 그 기름을 쐐기 모양 틈으로 끌어들여 스스로 떠오른다 — 금속끼리 닿지 않는다.

**그림이 보일 핵심:** 펌프는 기름을 보낼 뿐이고, 축을 띄우는 압력은 도는 축이 만든다. 펌프 압력이 축을 들어 올리는 것처럼 그리지 않는다(멈춘 축 아래에 기름이 차 있어도 축은 뜨지 않는다).

독자가 하는 일: 상태 버튼 "멈춤 / 시동 직후 / 달릴 때"를 고른다. 시동을 걸면 기름이 기름 통에서 펌프·필터·기름길을 지나 베어링에 닿기까지가 보이고(그동안 축은 아래 셸에 닿아 있다), 기름이 닿고 축이 돌면 축이 떠올라 얇은 기름막(유막)이 축을 감싼다. 판독값: 회전수, 기름 압력, 가장 얇은 유막 두께.

## 2. 파일
`pages/lubrication/figure/{model.mjs, scene.mjs, live.js, index.mjs}`. 1단계에서는 index.md·build.mjs를 건드리지 않는다.

## 3. 모형 (model.mjs)
```js
// A small car engine's pressure-fed lubrication, simplified to one main bearing. Pressures in bar, film in µm.
export const STATES = {
  stop:  { rpm: 0,    label: "멈춤" },
  start: { rpm: 800,  label: "시동 직후" }, // the first second after starting: oil still on its way
  run:   { rpm: 3000, label: "달릴 때" },
};
// Oil pressure rises with rpm until the relief valve opens. Model fitted to one maker's hot minimums
// (≥0.7 bar at idle, ≥3.4 bar at 3000 rpm) and the usual 3.8–4.5 bar peak.
export const RELIEF = 4.2;
export const pressure = (rpm) => Math.min(RELIEF, 1.15 * rpm / 1000); // 800 → 0.9, 3000 → 3.45
// Main bearing: journal 50 mm, radial clearance 20 µm (diametral 40 µm, inside the 25–83 µm makers give).
export const JOURNAL_R = 25;   // mm
export const CLEAR = 20;       // µm, radial
// Eccentricity ratio e (0 centred … 1 touching). Running bearings sit low and to one side; model values.
export const ECC = { stop: 1, start: 1, run: 0.8 };
export const ATTITUDE = 40 * Math.PI / 180; // the thinnest film sits this far past the bottom, in the turning direction
export const minFilm = (e) => CLEAR * (1 - e); // run: 4 µm (model value; real films are "a few micrometres")
// Friction coefficient: full film 0.001–0.01, boundary (metal touching) 0.08–0.14.
export const MU = { film: 0.005, boundary: 0.1 };
// The oil's trip from the pan to the bearing after starting, drawn slowed: OIL_TRIP seconds on screen.
export const OIL_TRIP = 2.4;
```

## 4. 세계와 카메라 — 엔진의 단면 디오라마
- 1 단위 = 1 mm. 모든 기름길은 단면 평면 y = 0 근처에 있다(엔진을 세로로 잘라 앞에서 본 모습). x 오른쪽, z 위.
- 카드 600 × 440. `k.fitProjection(points, 600, 440, { pad: 30, azimuth: 70, elevation: 22 })`. 방위각 70°라 단면(y에 수직인 면)이 크게 보인다.
- 단면은 두께가 있는 판처럼 그린다: 블록 몸통은 y −30…0의 회색 슬래브(앞면이 잘린 면, 잘린 면은 `faint` 빗금 대신 한 톤 밝게), 기름길은 그 잘린 면에 판 홈처럼 보이는 관.

| 부품 | 형상(단면 평면 위 위치, mm) |
|---|---|
| 받침판 | `basePlate` x −220…220, y −90…70 |
| 기름 통(오일 팬) | 판 위 얕은 쟁반: x −170…170, z 10…80, 앞벽을 잘라 기름이 보이게. 기름 면 z 55(평평, 놋쇠보다 진한 호박색). 바닥 빼는 마개(r 8) |
| 거름망(스트레이너) | 기름 속 원판 r 22, 중심 (−90, z 25), 망 무늬(점 격자). 위로 흡입관 |
| 흡입관 | tube r 6: (−90, 25) → (−90, 150) → 펌프 입구 |
| 펌프 | 기어 펌프 상자 80×40(y −30…10)×60, 중심 (−90, z 175). 앞 덮개를 빼서 맞물린 기어 두 개(10잇, 모듈 3, `pages/gears`나 differential의 toothRing 관례)가 보인다. 펌프 축 톱니바퀴(r 18)가 크랭크축 톱니바퀴(r 18)와 체인(tube 고리, 점 무늬 rings)으로 이어진다 |
| 압력 조절 밸브(릴리프 밸브) | 펌프 출구 옆 작은 원통 r 8, 길이 40, 앞을 잘라 공·스프링이 보인다. 열리면 넘친 기름이 짧은 관으로 기름 통에 떨어진다(달릴 때만, 압력이 RELIEF에 닿을 때 — 모형에서는 3000 rpm에서 3.45 bar라 닫혀 있다. 열림 표시는 2단계 버튼 없이 생략 가능) |
| 기름 필터 | 원통 r 32, 높이 90, 블록 왼쪽 옆면에 매달림, 중심 (−170, z 300). 앞을 잘라 주름진 거름종이(세로 주름선)와 가운데 관이 보인다 |
| 주 기름길(메인 갤러리) | tube r 7: 펌프 출구 → 필터 → (−130, 330) → (60, 330) 블록 안을 가로지름 |
| 베어링 기름 구멍 | 주 기름길에서 (0, 330) → (0, 262) 아래로 뚫린 길 → 위 셸의 기름 홈 |
| 크랭크축 메인 베어링 | 블록 아래 벽(웹)과 베어링 캡(볼트 2개, r 6, 머리)이 축을 감싼다. 축(저널) r 25, 중심 (0, z 230). 셸 두 장(위·아래 반원, 두께 2, 놋쇠보다 연한 베어링 금속색), 위 셸에 기름 홈 한 줄과 구멍 |
| 유막 | 저널과 셸 사이의 초승달 모양 기름(호박색). **틈은 200배쯤 키워 그린다**: 반지름 틈 20 µm → 그림 4 mm. 저널 중심은 셸 중심에서 아래로·도는 방향으로 ECC × 4 mm 비켜난다(ATTITUDE). 가장 얇은 곳에 작은 표시 |
| 크랭크 팔 | 저널 앞에 크랭크 팔(웹)과 균형추가 붙어 함께 돈다 — 회전이 보이는 부품. 팔 끝에 크랭크 핀(r 22) 반쪽만, 커넥팅 로드는 그리지 않는다 |
| 기름 방울 | 베어링 양옆에서 기름 통으로 떨어지는 방울 3–4개(달릴 때) |

## 5. 그리는 순서
단면 평면 뒤(y < 0) → 앞. 블록 몸통 → 기름 통 뒤벽 → 기름 → 거름망·흡입관 → 펌프 상자·기어 → 체인 → 필터 → 주 기름길·내림 길 → 베어링 캡·셸 → 유막 → 저널 → 크랭크 팔·균형추 → 기름 통 앞벽(잘린 면) → 방울 → 라벨.
겹치는 곳이 다르면 `k.depthOf`로 확인하고 ask.

## 6. 기름의 흐름 표시
- 기름길(tube) 안에 작은 점들이 흐르는 방향으로 움직인다(냉장고 그림의 관 속 점 관례: 점 반지름은 관 안, 초기 좌표 필수 — knowhow "냉장고: 배관과 문").
- 시동 직후: 기름 앞머리가 OIL_TRIP 초 동안 기름 통 → 거름망 → 펌프 → 필터 → 주 기름길 → 베어링 순으로 나아간다. 앞머리 뒤는 호박색으로 찬 관, 앞은 빈 관(어둡게). 앞머리가 베어링에 닿기 전까지 저널은 아래 셸에 닿아 있다(ECC 1, 판독값 "금속이 닿음").
- 달릴 때: 모든 관이 차고 점이 흐른다. 저널이 떠 있다(ECC 0.8).
- 멈춤: 관은 비고(기름이 통으로 흘러내렸다), 저널은 아래 셸에 닿아 있다.

## 7. 판
- title "윤활 장치". hint "버튼으로 멈춤·시동·달림".
- readout: 멈춤 "멈춤 · 0 bar · 금속이 닿음", 시동 직후(기름 오기 전) "800 rpm · 0 bar · 금속이 닿음", 기름이 닿은 뒤 "800 rpm · 0.9 bar · 유막 2 μm"(시동 직후 상태의 ECC는 기름이 닿으면 0.9로), 달릴 때 "3000 rpm · 3.5 bar · 유막 4 μm". 25자 안쪽.
- keys: [{ mark: "lit", label: "유막: 도는 축이 끌어들인 기름" }] — 유막을 lit.
- caption: 모형값(저널 50 mm, 반지름 틈 20 µm를 200배로 그림, 압력은 회전수에 비례하다 4.2 bar에서 조절 밸브가 연다고 본 모형, 기름 이동은 느리게 그림).
- controls: 그룹 "엔진" 버튼 "멈춤"/"시동"/"달릴 때".
- 그림 안 라벨: 기름 통 · 거름망 · 펌프 · 압력 조절 밸브 · 필터 · 주 기름길 · 베어링 셸 · 유막 · 크랭크축.

## 8. 1단계 범위
START = 달릴 때 한 장면(관이 차 있고 점은 고정, 저널 떠 있음). live.js는 버튼을 누르면 해당 상태의 정지 장면을 즉시 다시 그리는 데까지(시동 직후는 "기름이 오기 전" 장면). 흐름 점의 움직임, 기름 앞머리 이동, 축 회전은 2단계.

## 9. 사실표(본문 4단계용, 출처는 싣지 않는다)
1. 기름은 엔진 맨 아래 기름 통(오일 팬)에 모인다. 거름망이 달린 짧은 흡입관이 바닥 가까이까지 내려간다.
2. 펌프는 크랭크축이 돌린다. 펌프는 기름을 필터로, 필터에서 엔진 안의 기름길(갤러리)로 보낸다. 승용차 펌프로는 트로코이드 펌프가 흔하고, 기어 펌프와 베인 펌프도 쓴다.
3. 압력이 정해진 값을 넘으면 스프링으로 눌린 조절 밸브(릴리프 밸브)가 열려 넘치는 기름을 펌프 입구나 기름 통으로 돌려보낸다.
4. 기름길의 기름은 크랭크축 메인 베어링과 캠축 베어링으로 간다. 메인 저널의 구멍으로 들어간 기름은 크랭크축 속 길을 지나 커넥팅 로드 쪽 저널로 나온다. 일을 마친 기름은 기름 통으로 떨어진다.
5. 도는 저널은 마찰로 기름을 끌어 저널과 베어링 사이로 들인다. 틈이 좁아지는 쐐기로 끌려 들어간 기름이 압력을 만들고, 이 압력이 하중을 받쳐 두 면을 떼어 놓는다. 가장 얇은 곳은 맨 아래가 아니라 조금 비켜난 곳이다.
6. 유막은 몇 마이크로미터 두께다. 빠를수록, 틈이 좁을수록, 기름이 진할수록, 하중이 작을수록 두꺼워진다.
7. 마찰 계수: 유막이 충분하면 0.001–0.01, 금속이 닿는 경계 윤활이면 0.08–0.14.
8. 멈춘 엔진에서는 저널이 베어링 셸에 얹혀 있다. 유막은 축이 돌아야 생기므로 이런 베어링은 시동과 정지 때 닳는다. 기름 압력이 충분히 서 있는 동안에는 금속이 닿지 않는다. ("닳음의 몇 %가 시동 때"라는 숫자는 출처가 없어 쓰지 않는다.)
9. 압력은 뜨거운 공회전에서 가장 낮고, 회전수를 따라 올라가다 조절 밸브가 열리면 더 오르지 않는다. 차가울 때는 기름이 진해 압력이 높다. 한 제조사 정비 지침의 최소값: 공회전 0.7 bar, 3000 rpm 3.4 bar(80 °C).
10. 메인 베어링 틈(지름 기준)은 수십 마이크로미터(예: 50 mm 저널에 25–83 µm).
11. 크랭크축 베어링이 볼 베어링이 아니라 미끄럼 베어링(반쪽 셸 두 장)인 까닭: 반으로 갈라 크랭크축에 끼울 수 있고, 같은 크기에서 하중을 더 받고 충격에 덜 민감하며, 작고 싸다. 셸은 캡을 조이면 약간 눌려 끼워져 돌지 않는다.
12. 필터는 닳게 하는 알갱이를 걸러 엔진을 지킨다. 필터가 막히거나 차가워 기름이 진하면 우회 밸브가 열려 기름이 필터를 건너뛰고 엔진으로 간다.
13. 기름은 윤활 말고도 식히고(피스톤 아래에 뿜기도 한다), 찌꺼기를 씻고, 피스톤 링과 실린더 사이를 막고, 녹을 막는다.
14. 소형 승용차 엔진의 기름 양은 대개 3.6–5.2 L.
15. 거의 모든 양산차는 기름을 엔진 밑 통에 담는 습식이다. 경주차·곡예 비행기 등은 따로 기름 탱크와 펌프 여럿을 둔 건식(드라이 섬프)으로, 급하게 돌 때 기름이 쏠려 펌프가 공기를 빨지 않게 한다. 작은 2행정 엔진은 연료에 기름을 섞어(약 32:1) 태워 버린다.
16. 낱말: 오일 팬(기름 통), 오일 스트레이너(거름망), 오일 펌프, 릴리프 밸브(압력 조절 밸브), 오일 필터, 메인 갤러리(주 기름길), 메인 베어링, 유막, 미끄럼 베어링(플레인 베어링). 본문은 쉬운 말을 앞에 쓰고 전문어를 처음 한 번 괄호로.

## 10. 받아들임 기준(1단계)
1. `npm run preview -- lubrication`, `CHROME_PATH=/usr/bin/google-chrome-stable npm run check -- lubrication` 두 테마 line ends 0, `npm run build`
2. 스크린샷을 직접 보고: 기름길이 기름 통 → 펌프 → 필터 → 주 기름길 → 베어링으로 끊기지 않고 이어지는지, 유막 초승달이 4배 크롭에서 보이는지, 판독값 "3000 rpm · 3.5 bar · 유막 4 μm"
3. 멈춤 장면(버튼)에서 저널이 아래 셸에 닿고 관이 비어 보이는지
4. worker_done: 바꾼 파일(git status), 설계서와 다르게 한 점, 관찰 → `out/lubrication/report.md`

## 11. 1b 고침 (1단계 검증에서, 조정자)
1단계 결과는 기름길이 한 흐름으로 읽힌다. 아래만 고친다. 좌표는 §4 단면 평면(x, z) 기준.
1. **크랭크 팔·균형추를 뺀다.** 저널 앞에 그린 큰 팔과 균형추가 베어링 단면(셸·유막·캡)을 덮는다. 대신 저널 앞면에 회전을 보이는 흰 표시선 하나(중심에서 r 20까지)와 크랭크 핀 쪽으로 이어지는 기름 구멍 점 하나(중심에서 r 12, 지름 4)를 둔다. "크랭크축" 라벨은 저널 앞면을 가리킨다.
2. **베어링 캡을 보이게.** 저널 중심 (0, 230). 블록 아래 벽(웹)은 z 230 위쪽 반원을 품는 U자(바깥 반지름 60), 캡은 아래 반원(바깥 반지름 60, z 170…230, 폭 x −80…80의 반달 + 양옆 귀 x ±80…±62, z 218…230). 캡 귀에 볼트 2개(x ±71, 머리 r 7, 단면이므로 볼트 몸은 z 230 위 블록 속으로 점선 없이 끝남 — 머리만). 웹과 캡의 경계선 z 230이 보이게.
3. **셸 두 장**: 위 셸(r 25.4…27.4, z ≥ 230 반원), 아래 셸(같은 반지름, z ≤ 230), 셸 끝이 웹·캡 경계에서 만난다. 위 셸 꼭대기에 기름 구멍(폭 4)과 셸 안쪽 기름 홈(위 셸 안면을 따라 호박색 띠, 폭 2).
4. **내림 길을 단면에 판다.** 주 기름길 (0, 330)에서 위 셸 구멍 (0, 257.4)까지 폭 8의 곧은 길을 단면 잘린 면에 호박색으로 채워 그린다(관이 아니라 블록에 뚫린 구멍). 주 기름길과 만나는 곳은 T자.
5. **주 기름길 끝을 막는다.** 오른쪽 끝 (60, 330)에 막음 마개(육각 머리 r 8, 블록 밖으로 4 나옴). 열린 관 끝을 없앤다.
6. **압력 조절 밸브를 펌프 출구 옆에 보이게.** 펌프 출구 관 바로 위 (−90, z 215)에 x축 원통 r 8, 길이 40(x −110…−70), 앞을 잘라 공(r 5)·스프링(코일 6)이 보인다. 넘친 기름이 나가는 짧은 관이 아래로 기름 통까지(닫혀 있으면 빈 관). 라벨 "압력 조절 밸브"는 이 원통을 가리킨다.
7. **떠 있는 타원을 없앤다.** 받침판 아래(카드 아래쪽)에 그려진 타원 하나 — 아마 halo나 그림자의 잘못된 좌표. 그 요소를 찾아 지운다.
8. **판 이름표는 "Fig 1"** (다른 문서와 같은 관례, `fig` 인자 그대로).
9. 모든 라벨 앵커가 그 부품 위에 있는지 4배 크롭으로 확인(기름 통·거름망·펌프·압력 조절 밸브·필터·주 기름길·베어링 셸·유막·크랭크축).
