
    .4Sj#              
       *   d Z ddlZddlZddlZddlZddlmZ ej                  j                  d e
 ee      j                               ddlZej                  dz  Zej"                  dz  ZdZdZ ej*                   e ee      j                  dz  d	z              Zed
   D  ci c]  } | d   | d   f|  c} ZddgZdddg dfdddddgfdddg dfdddg dfd d!d"g d#fd$d%d&g d'fgZd( Zd)j9                  g d*      Zd)j9                  g d+      Zd)j9                  g d,      Zd)j9                  g d-      Z d)j9                  g d.      Z!d)j9                  g d/      Z"d)j9                  g d0      Z#d)j9                  g d1      Z$d2d3d4d2d5d6id5d6id5d6id7g d7d8d9id3gd8Z%d: Z&dWd;Z'd< Z(d= Z)d> Z* ed?      Z+e+d@z  Z,e+dAz  Z-d)j9                  g dB      Z.d)j9                  g dC      Z/d)j9                  g dD      Z0dE Z1dF Z2e3dGk(  r| ejh                         Z5e5jm                  dHdIg dJK       e5jm                  dLdMN       e5jm                  dOdPN       e5jo                         Z8e8jr                  dQk(  r e(        ye8jr                  dRk(  r" e2e8jt                  jw                  dS             ye8jr                  dTk(  r" e1e8jt                  jw                  dS             ye8jr                  dUk(  r3 e&e8jx                  jw                  dS      D cg c]  }|s|	 c}       ye8jr                  dVk(  rM e)e8jt                  jw                  dS      e8jx                  jw                  dS      D cg c]  }|s|	 c}       y e*        yyc c} w c c}w c c}w )XuA  s34 — 연속성 콘티 시트 실험 (실험 전용·커밋 금지).

v22(2026-07-12): 영어 계약 원복(한국어 전문은 타 그룹 품질 저하로 반려)
+ 비유·은유·과장 캐릭터 표현의 실촬영 현실화 조항(REALIZE) 추가.
v21(반려): 프롬프트 전문 한국어 원어 — 숲 인영은 해결했으나 그 외 악화.
v20: 실사영화 프리프로덕션 스토리보드 스타일(만화체 금지, 영어 계약).
사용자 정정(v2): 콘티 = 손으로 그린 간략 러프 스케치 (실사 금지).
목적 = 구도·장면 연속성(인물 이동 방향/카메라 움직임/카메라 구도)만.
글자 절대 금지(샷 번호만 허용). 분할은 2/4/6 균등 그리드만.
패널 수 = 샷 수 그대로 — 홀수면 남는 패널을 순백으로 비움.
균등 분할이라 코드가 나중에 패널을 잘라 분해할 수 있어야 함.

사용: backend/.venv/bin/python s34_conti_sheet.py --only <prompts|gen|html>
     [--engines i2,nb2] [--groups forest,...]
산출: out/conti/conti2_*.png + plans/s34_conti_v2.json + conti_sheet.html
    N)Pathcontizconti_sheet.htmls34_conti_v2s34_conti_v1pipeline_doczshot_loc_data.jsonshotssceneshoti2nb2forestu   숲속z5a dense Korean mountain forest with thick undergrowth))   r   )r      )   r   busstopu   해안가 버스정류장z\a small seaside bus stop with a bench facing the sea at night on a quiet Korean coastal road)      )r      rooftop_extu   옥탑 단지 외부a  the exterior of an old Korean multi-family villa: narrow alley and small yard at ground level, an added exterior steel staircase climbing the wall, and a rooftop with a small rooftop room (steel front door, one lit window), a water tank, a clothesline and a low parapet))
   r   )r      )   r   )r      )   r   )r   r   rooftop_intu   옥탑방 내부zthe interior of a small Korean rooftop home: living room with a small window, kitchenette and dining table; a bedroom with a bed against one wall and a curtained window; a tiny tiled bathroom with a mirror))   r   )r      )   r   )   r   )   r   )r    r   martu   대형마트za mid-size Korean supermarket: shelved sales floor inside; the entrance area outside with a bicycle rack and one wall-mounted CCTV camera above; a small back security office with CCTV monitors))   r   )r"   r   )   r   )r#   r   )   r   )r$   r   policeu	   경찰서za modest Korean provincial police station: a detectives' office with desks, monitors and a doorway; and the street right in front of the building))   r   )r   r   )r   r   )r   r   )   r   c                     | dk  ry| dk  ryy)Nr   )r   u   2 panels made by ONE vertical cut at exactly 50% of the image width — each panel is exactly half the width and the FULL height (1 row x 2 columns)	1536x102416:9r   )r   u   4 panels made by ONE vertical cut at exactly 50% of the width and ONE horizontal cut at exactly 50% of the height — a 2x2 grid, each panel exactly one quarter of the image	1024x1024z1:1)r   u   6 panels made by TWO vertical cuts at exactly 1/3 and 2/3 of the width and ONE horizontal cut at exactly 50% of the height — a 3-column x 2-row grid, all six panels exactly equalr)   r*    )n_shotss    S/Users/manta/Documents/Projects/TheRoad-I1/scratchpad/forest_exp/s34_conti_sheet.py_gridr/   5   s!    !|%
 !|$
!    
)z,Draw ONE storyboard (conti) sheet: {layout}.zBSTYLE: hand-drawn PRE-PRODUCTION STORYBOARD FOR A LIVE-ACTION FILMuD   SHOOT — the working drawings a professional film storyboard artistz;makes for the director and cinematographer of a real movie:z<REALISTIC adult human proportions and faces (ordinary Koreanz=adults, film-actor realism), true cinematic lens framing, andz=naturalistic light-and-shadow blocking rendered in monochromez$graphite pencil tone on white paper.z>ABSOLUTELY NOT manga, NOT anime, NOT cartoon, NOT webtoon, NOTz:comic-book style: no stylized or enlarged eyes, no cute oru?   youthful idealized faces, no clean ink outlines — every panelz@must read like a frame of a live-action film sketched in pencil.zNo color anywhere.)	z?PURPOSE: each panel captures only the CAMERA COMPOSITION of oneuF   shot — framing (close-up / medium / wide), where the subject sits inz:the frame, and continuity between panels. Keep every panelz4extremely simple: only what matters for composition.zAMOVEMENT IS SHOWN BY THE FIGURE ITSELF, NEVER BY MARKINGS: conveyuB   direction of travel purely through the body — stride mid-motion,z@body lean into the path, back view vs front view, and the statedz>size/depth cues. Do NOT draw arrows, motion lines, path lines,z0speed lines or any diagram markings of any kind.)zBREALIZE FIGURATIVE LANGUAGE AS A LIVE-ACTION SHOT: the Korean shotzAtext may describe characters metaphorically, figuratively or withzAexaggeration. Draw what a real movie camera would actually recorduB   on a physical set — exaggerated or figurative impressions becomez@realistic staging choices (lighting, distance, angle, wardrobe),znot literal fantasy drawings.z=EVERY CHARACTER IS A HUMAN BEING: unless the story explicitlyz>features non-human or virtual beings (as in science fiction oru<   fantasy), every character — however indirectly, vaguely oruB   figuratively the text describes them — IS a real human. When thez@text gives no direct visual description of a person, IMAGINE onez<and still draw them as a concrete, fully-formed human being:u=   always render the human form to the maximum extent — build,uD   posture, face, hands, clothing — never reduce a person to a shape,z(blob, solid silhouette or abstract mass.)uC   CONTINUITY: all drawn panels are the SAME single location — fixedz=features (doors, stairs, windows, poles, desks) keep the samezAposition and left/right relationships across panels so the panelsz%cut together as one continuous scene.)uB   GEOMETRY — ANALYSE BEFORE DRAWING: from each panel's Korean shotzDtext, first work out the spatial facts and draw EXACTLY those, neverzEre-stage them: (a) each figure's DISTANCE from camera (tight insert /uD   close-up / medium / full / wide — a shot about a hand or an objectz@is a tight insert, not a two-shot); (b) each figure's FACING anduE   MOVEMENT DIRECTION relative to camera — '뒷모습' means seen fromz@BEHIND, moving AWAY from camera into the depth of the frame, notzBsideways; a profile means lateral movement; (c) relative positionsz<and distances BETWEEN figures. Keep every established screenzBdirection consistent across panels (180-degree rule): a person whozCleaves in one panel keeps the same on-screen direction wherever thezmovement appears again.z>SIZE & DEPTH ARE CONTRACTUAL: each panel states every figure'szAapparent size in the frame and the explicit near/far depth order.uA   Draw exactly those proportions — a farther figure MUST be drawnz?clearly smaller than a nearer one; never equalize figure sizes,z<especially when several figures share a panel or their pathszrelate to each other.u:   DEPARTING FIGURE — a figure running/walking AWAY must bezCunmistakably departing, never approaching: seen exactly from behindz>(back of the head only, no face, no chin, no cheek line), bodyz?leaning into the path, mid-stride with one shoe sole toward thez@camera. THE STATED SIZE/DEPTH WINS: draw the departing figure atzCexactly the apparent size and depth the panel's FIGURES line statesuB   (if stated FARTHER/small, it stays small in the distance — neverz*enlarge it into the foreground for drama).)zAABSOLUTELY NO TEXT anywhere: no words, letters, captions, labels,uC   sound effects or watermarks — the ONLY allowed marking is a smallzBshot number digit ({numbers}) in a corner INSIDE each drawn panel.zBTHE PANEL GRID FILLS THE ENTIRE IMAGE EDGE-TO-EDGE: no outer paperu@   margin, no border area, nothing drawn outside the panels — thez?image must be mechanically cuttable along the stated cut lines.z@Panels are separated only by thin straight black gutter lines atz=the exact stated positions; ALL PANELS EXACTLY THE SAME SIZE.)zDThere are {n_shots} shots but {slots} panel slots: draw the shots inz?panels 1..{n_shots} and leave the remaining panel(s) COMPLETELYuE   BLANK PURE WHITE — empty white paper, not even a frame line inside.)uZ   당신은 콘티 작가를 돕는 동선 분석가다. 씬 원문(한국어 전문)과 샷uX   목록을 읽고, 각 샷에서 인물이 공간을 어떻게 통과하는지(동선)를uZ   판정하라. 원문에 근거한 것만 쓰고 발명 금지. 마커나 ID 코드 금지.u"   샷마다 두 필드를 채워라:uX   1) movement_en — 영어 한 문장: 누가/무엇이 움직이는지, 이동 경로와uV   방향(오르는지 내려오는지, 들어가는지 나오는지, 카메라 쪽인지uT   반대인지), 몸의 진행 자세, 어디에서 와서 어디로 가는 중인지.uA   정지 샷이면 'static:'으로 시작해 시선·몸 방향만.u\   ★인물의 신체·의식 상태가 원문에 있으면 자세 서술에 반드시 반영:uG   죽었거나 의식이 없으면 'lifeless: collapsed, asymmetric, limpuN   limbs, weight fallen' 처럼 무너진 자세로 명시(단정하게 앉거나uV   웅크린 자세로 쓰지 말 것), 부상·긴장·공포도 자세에 드러나게.uZ   어둠 속 실루엣·그림자로 보이는 존재도 실제로는 사람이면 사람의uM   신체 비례임을 유지해 서술하라(예: 'a real person appearing as az&dark silhouette, normal human build').uO   2) figures_en — 영어 1~2문장: 프레임에 보이는 인물/핵심 물체uS   각각에 대해 (a) 프레임 안 겉보기 크기(화면 높이의 몇 분의 몇uJ   수준인지: e.g. fills ~2/3 of frame height / small ~1/5), (b) 카메라uM   기준 원근 서열(which is NEARER, which is FARTHER — 명시적 비교),uX   (c) 인물이 여럿이거나 동선이 얽히면 서로의 경로·거리 관계까지.uO   인물 1명 단순 샷이어도 크기와 근원(near/far)은 반드시 기록.object	movementsarraytypestring)r
   movement_en
figures_en)r5   
propertiesrequired)r5   itemsc                 L   t        j                  t              }|j                  di       }t        D ]  \  }}}}| r|| vrt        |D ch c]  \  }}|	 c}}      }	dj                  d |	D              }
dj                  d |D              }d|
 d| }t        j                  d| t        |t              }|d	   D ci c]  }|d
   |d   |d   d c}||<   t        d| d| dt        ||          d        t        j                  t        |       y c c}}w c c}w )Nmovement

c              3      K   | ]<  }d | dt         d   t        |         d    dt         d   t        |         d   z    > yw)u   [씬 z] scenesheadingr1   textN)DATAstr).0sis     r.   	<genexpr>z!stage_movement.<locals>.<genexpr>   sV       !   B4r$x.R1)<=R@8nSW%f-.s   AAr1   c           	   3   P   K   | ]  \  }}d | d| dt         ||f   d       yw)Ssh: descNSHOT)rE   rF   shis      r.   rG   z!stage_movement.<locals>.<genexpr>   s:      LFJ72sat2cU"T2s)_V456ds   $&u   씬 원문 전문:
u$   

샷 목록(각각 동선 판정):
	s34_move_r3   r
   r7   r8   r=   figuresz[movement] (z): u   건)F	load_planPLAN
setdefaultGROUPSsortedjoinllmMOVEMENT_SYSMOVEMENT_SCHEMAprintlen	save_plan)groups_filterplanmvgkeyname_placekeysrF   _	scene_ids	scene_txt	shots_txtuserresms                  r.   stage_movementro      sP   ;;tD	R	(B$* dFDT6D1D52qBD12	KK  !   ! !	 II LFJL L	&yk1X+eeiv&dOL !-/- fIAm,<+,\? < <-/4 	D64&C4M?#>?! %+" KKd 2/s   DD!c                    t        |      }t        |      \  }}}}g }t        |d      D ]  \  }	\  }
}t        |
|f   }d|	 d|d    }|xs i j	                  d|
 d|       }|r<t        |t              r|dd}|d	|d
    z  }|j	                  d      r|d|d    z  }|j                  |        t        j                  |      d|  dt        t        t        t        ddj                  |      g}||kD  r&|j                  t        j                  ||             |j                  t         j                  dj                  d t#        d|dz         D                           dj                  |      S )Nr   zPANEL rK   rL   rI   rJ    rQ   z
  MOVEMENT (follow exactly): r=   rR   u=   
  FIGURES — apparent size & depth order (follow exactly): )layoutz)THE LOCATION (same in all drawn panels): .z.PANELS (one shot per panel, Korean shot text):r1   )r-   slotsz, c              3   2   K   | ]  }t        |        y wN)rD   )rE   is     r.   rG   z_prompt.<locals>.<genexpr>  s     .O!s1v   )numbersr>   )r_   r/   	enumeraterN   get
isinstancerD   appendHEADformatPURPOSEREALIZEGEOMETRYCONSISTENCYrZ   BLANKSEALrange)place_enrg   r=   nrt   rr   _size_arlinesrw   rF   rO   slinerc   partss                   r.   _promptr      s   D	A %aE65#E!$*9B"cOs"QvYK(n"!!AbTC5/2"c""$45bn5EFFDvvi  //1)}o? @T + 	6"
3H:Q?8		%	E qyU\\!5\9:	LLTYY.OuQA.O%OPQ;;ur0   c                  t   	 t        j                  t              } | j                  di       }i |d}t
        D ]  \  }}}}t        t        |            \  }}}	}
|t        |      |||	|
|D cg c]  \  }}d| d|  c}}t        |||j                  |            dt        D ci c]  }|d| d| d c}|d	   |<    t        j                  t        |       t        d
 |j                         D              }t        dt        t
               d| d       y # t        $ r i }Y w xY wc c}}w c c}w )Nr=   )groupsr=   rI   rJ   )re   r   rt   rr   i2_sizenb2_arr   promptconti24_rh   .pngr   c              3   2   K   | ]  }t        |        y wrv   )r_   )rE   vs     r.   rG   z stage_prompts.<locals>.<genexpr>  s     10!s1v0rx   z
[prompts] u   그룹 저장 (동선 주입 u   건))rT   rU   rV   r{   	ExceptionrX   r/   r_   r   ENGINESr`   sumvaluesr^   )oldr=   rb   rd   re   placerg   rt   rr   sizearrF   rO   engn_mvs                  r.   stage_promptsr     sB   kk$77:r* h/D#)dE4"'D	"2vtRs4y559:T'"c"RuoT:eT8<<+=>	 

 <CC7CshtfAcU$//7C 
Xt $* KKd1x011D	Js6{m#@d
KL   ;Cs   +D -D/'D5D,+D,c           	         t        j                  t              }t        D ]  \  }}}}|r||vr|d   |   }t        D cg c]	  }|| v s| c}D ]\  }	t
        ||	   z  }
|	dk(  r%t        j                  d| d|d   d |d   |
       9t        j                  d| d|d   g |d	   |

       ^ t        d| d        y c c}w )Nr   r   s34v2_conti__i2r   r   refsr   out_path_nb2r   aspect_ratior   z[gen] u    완료)	rT   rU   rV   rX   r   OUTDimg_gptimg_nb2r^   )enginesra   rb   rd   _namerf   _keysexr   outs              r.   	stage_genr     s    ;;tD&,"eVUT6N4 &7w!!w,Aw7C3-Cd{		Lc2AhK#!I,F 		Ld3Qx["'({SB 8 	tfG$% '- 8s   	C	Cc                  v   t        j                  t              } 	 t        j                  t              }d g }t
        D ]  \  }}}}| d   |   }dj                  fdt        |d      D              }|d   |d   kD  rd|d   |d   z
   d	nd}	||fd
}
d}t        D ]  } |
|      \  }}|d| d| d| d| d	z  }d| d| ddfd| d| ddfd| d| ddfd| d| ddffD ]5  \  }}||k7  st        |z  j                         s$|d| d| d| d| d	z  }7  |dk(  rR|dz  }t        D ]D  }d| ddfd| ddffD ]/  \  }}t        |z  j                         s|d| d| d| d| d 	z  }1 F d}|r@||j                  di       v r,|d   |   d!dj                  fd"t        D              z   d#z   }|j                  d$ |       d%| d&|d    d'|d    d(|	 d)| d*| d+ |d,          d-| d.        d}t        d/z  j                         rNd}d0D ]A  \  }}t        |z  j                         s|d| d| d|j                  d      d1    d2| d	z  }C d3| d4}t        j                  d5| d6dj                  |       d7       t!        d8t                y # t        $ r d }Y w xY w)9Nc                 4    t        j                  | xs d      S )Nrq   )_htmlescape)ts    r.   esczstage_html.<locals>.esc5  s    ||AG$$r0   r   rq   c              3   l   K   | ]+  \  }\  }}d | d| d| d t         ||f   d          d	 - yw)z<li><b>Pz</b> SrJ       — rL   z</li>NrM   )rE   rw   rF   rO   r   s       r.   rG   zstage_html.<locals>.<genexpr>;  sO      4 29B qct2cU%D"cOF4K0L/MUS 2s   14r   rt   r   u    · 백색 패널 u   개c                 h   t         ||    z  j                         r||    dfS dd| d|  dfdd| d|  dfdd	| d|  dfd
d| d|  dfdd| d|  dfdd| d|  dfdd| d|  dfdd| d|  dfdd| d|  dfdd| d|  dff
D ]"  \  }}t         |z  j                         s||fc S  ||    dfS )Nu    v24(인물=사람 형상 원칙)u   v22(EN+비유 현실화)conti22_rh   r   u   v20(실사영화·EN)conti20_v9conti9_v8conti8_v7conti7_v6conti6_v5conti5_v4conti4_v3conti3_v2conti2_u
   생성 전)r   exists)r   r   rd   verfns        r.   	_img_filezstage_html.<locals>._img_file?  sJ   qv%%'vAAA78D63%t9TU4auD6QR!WTF!C5#=>!WTF!C5#=>!WTF!C5#=>!WTF!C5#=>!WTF!C5#=>!WTF!C5#=>!WTF!C5#=>!WTF!C5#=>	@R 2I%%'s7N	@ S6<''r0   <figure><a href='out/conti/$' target=_blank><img src='out/conti/z' loading=lazy></a><figcaption>u    · </figcaption></figure>conti23_rh   r   u6   비교 — v23(무광 검정 금지 하드룰, 반려)r   u#   비교 — v22(EN+비유 현실화)conti21_u(   비교 — v21(한국어 원어, 반려)r   u$   비교 — v20(실사영화·영어)r   u  <figure><a href='out/conti/ref_busstop_map_v5_overlay.png' target=_blank><img src='out/conti/ref_busstop_map_v5_overlay.png' loading=lazy></a><figcaption>★참조 이미지 (현행 v5, i2=gpt-image-2 생성) — 완전 수직 2D 평면도(원근 0, 셸터=평면 심볼) + LLM이 샷 원문을 재분석한 카메라 배치(액션 뒤 down-road에서 up-road 방향, H 가까이·S 멀리 깊이 순서) — 오버레이도 t2i</figcaption></figure><figure><a href='out/conti/conti16_busstop_i2.png' target=_blank><img src='out/conti/conti16_busstop_i2.png' loading=lazy></a><figcaption>i2 · v16 (현행 최종) — 재판정 카메라: 혜수 등 뒤 시점, H 전신 가까이/S 멀리 뒷모습, 찻길 명확</figcaption></figure><figure><a href='out/conti/ref_busstop_map_v5_flat_nb2.png' target=_blank><img src='out/conti/ref_busstop_map_v5_flat_nb2.png' loading=lazy></a><figcaption>비교 — nb2 평면도 재시도: 1차보다 개선됐으나 ★원근 잔존(도로 사다리꼴 수렴·호안 벽 측면 노출)+바다·보도 실사 질감 혼입 — 완전 평면 실패</figcaption></figure><figure><a href='out/conti/ref_busstop_map_v5_overlay_nb2.png' target=_blank><img src='out/conti/ref_busstop_map_v5_overlay_nb2.png' loading=lazy></a><figcaption>비교 — nb2 오버레이(재판정 카메라): ★배치는 이번엔 정확(카메라 down-road·콘이 셸터+H+S 포함·S 화살표 교차로 방향·단일성 준수) — 단 바탕 맵의 원근·실사 혼입 상속</figcaption></figure><figure><a href='out/conti/conti17_busstop_i2.png' target=_blank><img src='out/conti/conti17_busstop_i2.png' loading=lazy></a><figcaption>i2 · v17 — nb2 오버레이 맵 기반: 재판정 카메라·깊이 순서·찻길 전부 정확 (바탕 맵의 원근·실사 혼입이 출력에 전염되지 않음)</figcaption></figure><figure><a href='out/conti/conti17_busstop_nb2.png' target=_blank><img src='out/conti/conti17_busstop_nb2.png' loading=lazy></a><figcaption>nb2 · v17 — 같은 맵 기반: 배치·찻길 정확+텍스트 무재발, 단 등분 위반 지속(상단 몰림·하단 여백)</figcaption></figure><figure><a href='out/conti/conti18_busstop_i2.png' target=_blank><img src='out/conti/conti18_busstop_i2.png' loading=lazy></a><figcaption>i2 · v18 (재현 1) — 동일 구도 유지</figcaption></figure><figure><a href='out/conti/conti18_busstop_nb2.png' target=_blank><img src='out/conti/conti18_busstop_nb2.png' loading=lazy></a><figcaption>nb2 · v18 (재현 1) — ★등분 첫 준수·배치 정확 (단 밤이 낮처럼 밝음)</figcaption></figure><figure><a href='out/conti/conti19_busstop_i2.png' target=_blank><img src='out/conti/conti19_busstop_i2.png' loading=lazy></a><figcaption>i2 · v19 (재현 2) — 동일 구도 유지</figcaption></figure><figure><a href='out/conti/conti19_busstop_nb2.png' target=_blank><img src='out/conti/conti19_busstop_nb2.png' loading=lazy></a><figcaption>nb2 · v19 (재현 2) — 배치 정확·등분 재위반</figcaption></figure><figure><a href='out/conti/ref_busstop_map_v4_t2i.png' target=_blank><img src='out/conti/ref_busstop_map_v4_t2i.png' loading=lazy></a><figcaption>이력 — v4 참조(구 카메라 판정·준평면)</figcaption></figure><figure><a href='out/conti/ref_busstop_map.png' target=_blank><img src='out/conti/ref_busstop_map.png' loading=lazy></a><figcaption>구판 맵 (4회차 캐논 — 도로 소실 결함 실측, 비교용)</figcaption></figure><figure><a href='out/conti/conti15_busstop_i2.png' target=_blank><img src='out/conti/conti15_busstop_i2.png' loading=lazy></a><figcaption>i2 · v15 (현행 최종) — t2i 주석판 맵 참조: 찻길+보도+셸터+호안 층 구조 정확</figcaption></figure><figure><a href='out/conti/ref_busstop_map_nb2.png' target=_blank><img src='out/conti/ref_busstop_map_nb2.png' loading=lazy></a><figcaption>비교: nb2 맵 재투영 — 탑다운 미준수(아이소메트릭)+하단 실사 질감 혼입+B2 마커 누락</figcaption></figure><figure><a href='out/conti/ref_busstop_map_nb2_overlay.png' target=_blank><img src='out/conti/ref_busstop_map_nb2_overlay.png' loading=lazy></a><figcaption>비교: nb2 오버레이 — 단일성(1H/1S/1카메라)은 준수했으나 ★시야 콘이 지시 반대 방향으로 열림(S가 콘 밖)+S가 차도 위</figcaption></figure>conti12_busstop_u5   맵+실사+카메라 grounding 참조 (화살표 無)conti13_busstop_u5   맵+카메라 grounding만 — 실사 제외 ablationu$    — P2 전용</figcaption></figure>uH   <details><summary>v1 (실사판 — 비교용)</summary><div class=pair>c              3   J   K   | ]  }|v rd |    d|    d| d  yw)r   r   z"' loading=lazy></a><figcaption>v1 r   Nr,   )rE   r   v1es     r.   rG   zstage_html.<locals>.<genexpr>  sM       < &-cs
 8Cz B114S
 ;,,/50FH &-s    #z</div></details>z<section><h2>z <span class=k>(u    · 샷 u    → u   분할z)</span></h2><div class=pair>u@   </div><details><summary>패널 구성 (샷 원문)</summary><ul>z
</ul><pre>r   z</pre></details>z
</section>still_S15sh6_i2.png)	)zpanel_S15sh2_nb2.pngu(   크롭 패널 P1 (nb2 v18 콘티 좌반))zpanel_S15sh6_nb2.pngu   크롭 패널 P2 (우반))zstill_S15sh2_i2.pngu   스틸 S15sh2 · i2)zstill_S15sh2_nb2.pngu   스틸 S15sh2 · nb2)r   u!   스틸 S15sh6 · i2 (prev 없음))zstill_S15sh6_nb2.pngu"   스틸 S15sh6 · nb2 (prev 없음))zstill2_S15sh6_i2.pngus   스틸 S15sh6 · i2 + prev 동반 — 장소 연속 개선, ★인물 역할 스왑(남은 이가 수리영 의상))zstill2_S15sh6_nb2.pngui   스틸 S15sh6 · nb2 + prev 동반 — ★의상·장소 연속 정확(라벨드 참조가 역할 고정))zstill3_S15sh6_i2.pngu   스틸 S15sh6 · i2 + prev + 역할 바인딩 명시 — 그래도 스왑 잔재(2연속): i2 다중 인물 참조 정체성 관리 약함r   r   u   <section><h2>정류장 — 콘티 패널 → 실사 스틸 체인 <span class=k>(nb2 v18 콘티를 코드로 반분 → 패널=구도 참조 + 캐릭터 합성 참조 2장만(배경 참조 제외) → i2/nb2 스틸)</span></h2><div class=pair>z</div></section>uW  <!DOCTYPE html>
<html lang=ko><head><meta charset=utf-8>
<meta name=viewport content="width=device-width, initial-scale=1">
<title>s34 콘티 시트 v2 — 러프 스케치 · 연속성 6그룹 × i2/nb2</title>
<style>
body { margin:0; padding:24px; background:#0f1216; color:#e6e6e6;
       font:14px/1.6 -apple-system,'Apple SD Gothic Neo',sans-serif; }
h1 { font-size:20px; } h2 { font-size:17px; margin:34px 0 8px;
     border-bottom:1px solid #333; padding-bottom:5px; }
.k { color:#8a939e; font-size:13px; font-weight:400; }
.pair { display:flex; gap:14px; flex-wrap:wrap; }
figure { margin:0; } figcaption { color:#8a939e; font-size:12px; text-align:center; }
img { max-width:640px; width:100%; border-radius:8px; border:1px solid #2a2f36; background:#fff; }
details { margin:8px 0; } summary { color:#9ecbff; cursor:pointer; }
pre { background:#161b22; border:1px solid #2a2f36; padding:10px;
      white-space:pre-wrap; font-size:12px; }
ul { margin:6px 0; }
.box { background:#161b22; border:1px solid #2a2f36; border-radius:8px;
       padding:12px 16px; margin:12px 0; }
</style></head><body>
<h1>s34 v2 — 손그림 러프 스케치 콘티 (구도·연속성 전용, 균등 분할)</h1>
<div class=box>계약: 손그림 연필 러프 스케치(실사 금지)·글자 절대 금지(샷 번호만)·
2/4/6 균등 분할·<b>패널 수=샷 수, 홀수면 잔여 패널 순백</b>(숲 3샷→2×2+백색 1,
경찰서 5샷→3×2+백색 1)·모션 화살표로 인물/카메라 이동 표기·전 패널 같은 장소
연속성. 균등 그리드라 코드가 패널을 잘라 분해 가능. i2/nb2 둘 다.</div>
r1   z
</body></html>z[html] )rT   rU   rV   PLAN_V1r   rX   rZ   rz   r   r   r   r{   r}   splitPAGE
write_textr^   )rb   v1rowsrd   re   rf   rg   r   
shots_htmlblankr   imgsr   r   r   prevplabeng2fn_xlabv1imgsstill_sectionfigscapr   r   s                           @@r.   
stage_htmlr   .  sH   ;;tD[[!% D$*F dFDN4 WW 4 )$ 24 4
 CDG*qQTvBU%aj1S6&9%:#>[]T 	(  CnGB22$ 7,,.4 0$$'5SE1GI JD #+4&#d ; X Z"*4&#d ; E G"*4&#d ; J L"*4&#d ; F HI
d :4$;"6"6"8:4& ACCG& I>>AU$tf56 7DI $ 9 OL OMD`  +D66PR+D66PR"SID#
 t++-#>tf EGGKf MBBFt$'5(L"N O"S   $"&&2..X,t$C`  < &-	 < << ++F 	CI;&6tfHQsVHEzl&'DTF KIISQx[)**:6(*N	O_ %+h M$$,,.
GB" r	!!#6rd ;002t 4((*a(8'9se12 3%
.$ %)6)9; 	
 	OO 2   5 8 
GD6
k  s   J) )J87J8zp/Users/manta/Documents/Projects/TheRoad-I1/projects/8207aadc-7975-48f5-af17-ccc145a6660d/images/background_chainz$canon_bg_coastal_bus_stop_master.pngz!canon_bg_coastal_bus_stop_map.png)z@PANEL 2 CAMERA & PLACEMENT (follow exactly, from the site plan):z=camera stands on the water-side portion of the bus stop, justuB   beyond the bench, looking along the length of the coastal road —z=in frame: the departing runner in full-body stride at center,z@the bench with the other woman beside it in the left background,z>the coastal land edge to the right and the open sea beyond it.)z@REFERENCES (for grounding, not for style): the attached LOCATIONz?PHOTOGRAPH shows how this exact bus stop looks (shelter, bench,zBroad, sea side); the attached flat SITE PLAN shows the layout fromuB   above — never draw the plan itself or its markers. APPLY THEM TOz@PANEL 2 ONLY: panel 2's camera position, shelter/bench placementz=and figure positions must match the plan and the photograph'szAgeography. PANEL 1 is an earlier, tighter moment from a differentuA   angle — take only the stop's general look (bench, shelter) fromz=the references, not their viewpoint. The OUTPUT stays a roughuD   hand-drawn pencil storyboard sketch — do not copy the photograph'sz"rendering, only its spatial truth.)	z@REFERENCE (for grounding, not for style): the attached flat SITEuC   PLAN shows this bus stop's layout from above — where the shelter,z@bench, road, land edge and sea are relative to each other. Neverz>draw the plan itself or its markers. APPLY IT TO PANEL 2 ONLY:z=panel 2's camera position, shelter/bench placement and figurez>positions must match this plan. PANEL 1 is an earlier, tighteruC   moment from a different angle — do not force the plan's viewpointz>onto it. The OUTPUT stays a rough hand-drawn pencil storyboardzsketch.c                 f   t        j                  t              }|d   d   }|d   dz   t        z   dz   t        z   }d| v r6t
        dz  }t        j                  d|t        gd|	       t        d
|        d| v r9t
        dz  }t        j                  d|dt        fgd|       t        d
|        y y )Nr   r   r   r>   r   zconti13_busstop_i2.pngs34v13_busstop_maponly_i2r)   r   z[busstop_maponly] r   zconti13_busstop_nb2.pngs34v13_busstop_maponly_nb2O   SITE PLAN — top-down layout source only; never draw this plan or its markers.r*   r   )
rT   rU   rV   BUS_P2_GROUNDBUS_MAPONLY_NOTEr   r   BUS_MAPr^   r   )r   rb   r   r   r   s        r.   stage_busstop_maponlyr   4  s    ;;tDXy!Ax[6!M1F:=MMFw--			-vy{S	B"3%()..			.129; <%	5 	"3%() r0   c                    t        j                  t              }|d   d   }|d   dz   t        z   dz   t        z   }d| v r;t
        dz  }t        j                  d|t        t        gd|	       t        d
|        d| v rBt
        dz  }dt        fdt        fg}t        j                  d||d|       t        d
|        y y )Nr   r   r   r>   r   zconti12_busstop_i2.pngs34v12_busstop_refs_i2r)   r   z[busstop_refs] r   zconti12_busstop_nb2.pngu^   LOCATION PHOTOGRAPH — this exact bus stop; spatial truth only, output stays a pencil sketch.r   s34v12_busstop_refs_nb2r*   r   )rT   rU   rV   r   BUS_REF_NOTEr   r   	BUS_PHOTOr   r^   r   )r   rb   r   r   r   r   s         r.   stage_busstop_refsr   F  s    ;;tDXy!Ax[6!M1F:\IFw--			*F!7++	Mu%&..89BD)*134 	
		+VT%	5u%& r0   __main__z--onlyT)promptsr=   genhtmlbusstop_refsbusstop_maponly)r:   choicesz	--engineszi2,nb2)defaultz--groupsrq   r  r  ,r  r=   r  rv   )=__doc__argparser  r   jsonsyspathlibr   pathinsertrD   __file__parent
forest_librT   OUTr   EXPr   rV   r   loadopenrC   rN   r   rX   r/   rZ   r~   r   r   r   r   r   r   r\   r]   ro   r   r   r   r   	CANON_DIRr   r   r   r   r   r   r   __name__ArgumentParserapadd_argument
parse_argsaonlyr   r   r   )r   gs   00r.   <module>r!     s       
  3tH~,,- . uuwuu!!
tyyd8n++n<?SSTU,0M:Mq7QvY"M:- xP+  .Lw*  -|;=&  )x>@^  `9;{  p46
 !( yy    )) 
 
 ))  $ ii   99  : yy 	 	 			  	 yy  2  &1'-x&8&,h%79 :<; !< = 	.@M*&"Yx  P Q	>>	
9
9		   yy   99 
 
 *$'( z	 	 	 	"BOOHt@  A OOKO2OOJO+
Avv	
>	!199??3/0	
$	$aiiooc23	
:	188>>##6<#6a!#6<=	
5!))//#&hhnnS171Q117	9 	) s ;P = 8s   &NNN)N
1N
