[effort: high]
pulley 2단계: 그림을 움직이게 한다(설계서 §10). 지금까지는 START = { n: 4, pull: 60 } 한 장면만 그렸다.

시작 전에: cp /tmp/claude-1000/-home-namenu-src-github-com-namenu-isowiki/c0557bfd-7c20-45bf-a3c9-ce3c1f39ab97/scratchpad/design-pulley.md out/pulley/design.md 로 다시 복사하고 §6(줄·바퀴 회전), §9(판·버튼·라벨), §10(움직임)을 읽는다. docs/knowhow.md의 "휴대폰", "그림 안 라벨"과 docs/delegation.md도 읽는다. 본보기는 pages/differential/figure/live.js(끌기·버튼·투어·화면 밖 멈춤).

Target: pages/pulley/figure/live.js, 그리고 상태를 받아 다시 그리는 데 필요한 만큼 scene.mjs·index.mjs.
Change:
- 상태 { n, pull }을 바꾸면 아랫 블록·걸이 막대·추·손잡이 위치, 줄(tube 경로 전체), 바퀴 구멍·허브 표시의 회전각(§6 "바퀴 회전", M.turnOf), 라벨 앵커(움직이는 부품, 지금 쓰는 줄 끝 고리), 판독값을 같은 프레임에서 다시 그린다. 정적 부품은 다시 그리지 않는다.
- §10 그대로: pull 지수 추종(시정수 ~0.35 s), 무대에서 8 px 넘게 아래로 끌면 pull, 버튼(가닥 1·2·3·4, 당기기·놓기, aria-pressed), 가닥 바꿀 때 pull>0이면 먼저 0으로 내린 뒤 바꾸고 줄을 0.25 s 교차 흐림, 투어(1→4가닥 당겼다 놓기, 조작하면 멈추고 8 s 뒤 재개), 화면 밖·prefers-reduced-motion 처리, 투어 중에도 버튼 aria-pressed.
- live 스크립트는 document.getElementById(id) 안만 건드린다.
Constraints: 설계서와 다르게 해야 하면 ask로 묻는다. 기하·그리는 순서(§4–§7)는 바꾸지 않는다. 패키지 설치·커밋 금지.
Acceptance:
1. npm run preview -- pulley; CHROME_PATH=/usr/bin/google-chrome-stable npm run check -- pulley 두 테마 line ends 0.
2. .agents/skills/anatomy/scripts/drive.mjs로 n=1·2·3·4 각각 pull 0과 120에서 스크린샷(두 테마)과 판독값을 out/pulley/shots/에 남기고, 각 장면에서 line ends 검사(drive.mjs의 ["lines"] 동작)도 0. 판독값: 1가닥 49 N ↑12.0 cm, 2가닥 25 N ↑6.0, 3가닥 16 N ↑4.0, 4가닥 12 N ↑3.0 (pull 120).
3. 390 px 폭에서 가로 스크롤 없음, 콘솔 오류 없음. 스크린샷을 직접 보고 확인한다(이 모델은 이미지를 볼 수 있다).
4. worker_done: 바꾼 파일(git status로), 장면별 판독값 표, 설계서와 다르게 한 점. 진행 보고는 첫 움직임이 브라우저에서 돌 때 한 번.
