
    
|j                     (   d Z ddlZddlZddlZddlmZ ddlZdZ ed      Z ej                  edz  dz  j                               Zed   ed	   cZZg d
Zh dZdhZdZdZ ej&                         Zd Zd Zd Zd Zd Zd Zedk(  r e        yy)u   최소 검증판 러너 — 스텝 목록을 인자로 받아 순차 실행.

usage: backend/.venv/bin/python scratchpad/minimal_e2e_runner.py step1 step2 ...
       (인자 없으면 STEPS_TEXT 기본 목록)
    N)Pathzhttp://localhost:8000z*/Users/manta/Documents/Projects/TheRoad-I1
scratchpadzminimal_e2e_state.json
project_id
episode_id)
text_cleanupscene_segmentationepisode_summaryvisual_world_rules
scene_saveentity_character_listscene_summarybeat_extractshot_extractshot_validator>   skipped	completednot_applicablefailed   
   c                  h    t         j                  t         ddddd      } | j                          y )Nz/api/v1/auth/loginadminadmin123)usernamepassword   )jsontimeout)spostBASEraise_for_status)rs    K/Users/manta/Documents/Projects/TheRoad-I1/scratchpad/minimal_e2e_runner.pyloginr%   "   s6    	$)*!(jA2 	 	OA    c                  2   t          dt         dt         d} t        j	                  | d      }|j
                  dk(  r!t                t        j	                  | d      }|j                          |j                         d   D ci c]  }|d   |
 c}S c c}w )	N/api/v1/projects/
/episodes/z/steps<   )r     stepsstep_id)	r!   PIDEIDr   getstatus_coder%   r"   r   )urlr#   xs      r$   
status_mapr4   (   s    F#C5
3%v
>C	c2A}}EE#rE"%&VVXg%67%6AiL!O%6777s   Bc                    t        j                          }t               j                  |       xs i }|j                  d      t        v r#t	        d|  d|j                  d       d       yt
         dt         dt         d	|  }t        j                  |d
did      }|j                  dk(  r$t                t        j                  |d
did      }|j                  dk7  r]|j                  dk(  r d|j                  v rt	        d|  dd       yt	        d|  d|j                   d|j                  d d  d       yt	        d|  d| dd       	 t        j                  t               	 t               j                  |       xs i }|j                  d      }|t        v rkt	        d|  d| dt!        t        j                          |z
         d|j                  d       d|j                  d       d |j                  d!       d       y|t"        v rMt	        d|  d"t!        t        j                          |z
         d#t%        j&                  |d$%      d d&  d       y't        j                          |z
  |kD  rt	        d|  d(| d)| dd       y*D# t        $ r}t	        d|  d| d       Y d }~gd }~ww xY w)+Nstatus[z
] already Tflushokr(   r)   z/steps/moderesumex   )paramsr   r+      i  zstep.disabledu   ] disabled — 건너뛴다z] start FAILED http= i,  start_failedz] started (attempt )z] poll error z] z (zs) done=completed_count/applicable_countz failed=failed_countz
] FAILED (u   s) — F)ensure_asciiiX  r   z
] TIMEOUT z
s (status=r   )timer4   r0   TERMINAL_OKprintr!   r.   r/   r   r    r1   r%   textsleepPOLL	ExceptionintTERMINAL_BADr   dumps)	sidattemptlimitt0str2   r#   exccurs	            r$   run_oncerY   2   s   	B			#		$"B	vvh;&#j!1 234@F#C5
3%wse
DC	sFH-s;A}}FF313F?}} ==COqvv$=AcU56dC#*1==/166$3<.I		AcU%gYa
0=


4	!!#&,"B ffX+AcU"SEC		B$7#8 9&&!234AVV./0 1FF>235 =AB ,AcU*SR%8$9ZZ7=>@GKM99;e#AcU*UG:cU!<DI)   	AcU-u-T:	s   -J 	J> J99J>c           
          t        dt        dz         D ]P  }t        | ||      }|dk(  r y|t        k  s!t        d|  d| dt         dd       t	        j
                  d	       R y
)N   r:   Tr7   z] retrying (rD   u   )…r8      F)rangeMAX_RESUME_RETRYrY   rJ   rH   rL   )rR   rT   rS   ress       r$   run_stepr`   a   sn    ,q01sGU+$;%%AcU,wiq1A0B$GJJrN 2 r&   c                     t         j                  j                  dt        t        dz               	 ddlm} g g }}| D ]g  }|j                  |      xs i }|j                  d	d
      d
k7  r*|j                  | d|j                  d      xs d        W|j                  |       i |r+t        dt        |       ddj                  |       d       |S # t        $ r}t        d| dd       | cY d}~S d}~ww xY w)u  폐기된 단계를 목록에서 뺀다 — **돈이 걸린 문제다.**

    ★2026-08-25 실측: `outlook_extraction` 이 폐기 상태인데 3회 6,264자를
     실제로 발송했다. 대체한 `outlook_phase1/2/3` 가 이미 다 돈 뒤였다.

    왜 관문에 안 걸리나: 실행을 막는 것은 `applicability == "disabled"`(8개)
    인데 폐기 표시는 `lifecycle != "active"`(11개)라 **축이 다르다.** 차이
    3개는 `on_demand` 라서, 요청하면 돈다 — 목록을 스텝 API 에서 그대로
    받아 순서대로 돌리면 그 요청을 우리가 하게 된다(API 는 lifecycle 을
    안 준다).
    r   backend)STEP_MANIFESTu$   [filter] manifest 를 못 읽었다(u   ) — 거르지 않는다Tr8   N	lifecycleactiveu   →replaced_by?u   [filter] 폐기 단계 u   개 제외: z, )syspathinsertstrROOTapp.core.step_manifestrc   rN   rJ   r0   appendlenjoin)r,   MrW   keptdroppedrR   metas          r$   drop_retiredru   m   s     HHOOAs4)+,-=
 'DuuSzR88K*h6NNcU#dhh}&=&D%EFGKK  'G~\7#$&-1	3K  4SE9RS	s   C 	C= C82C=8C=c                  x   t         j                  dd  dgk(  r.t        j                  t        dz  dz  j                               } nt         j                  dd  xs t        } t        |       } t                t               j                         D ci c]  \  }}||j                  d       }}}t        dt        |        dt         dt         d	
       | D ]L  }|j                  |      dk(  rdnd}t!        ||      r(t        d| d	
       t        j"                  d       N t        dd	
       y c c}}w )Nr[   z--restr   zminimal_e2e_steps.jsoncategoryztarget z steps | pid=z eid=Tr8   imagei`T  i`	  zSTOP at zALL STEPS DONE)rh   argvr   loadsrl   	read_text
STEPS_TEXTru   r%   r4   itemsr0   rJ   ro   r.   r/   r`   exit)r,   rR   rV   catrT   s        r$   mainr      s   
xx|z!

L #;;FFHJ *
E	G2<,2D2D2F
G2FwsB3z""2FC
G	GCJ<}SEse
<DIGGCLG3U#HSE"$/HHQK	 
 

$' Hs   D6__main__)__doc__r   rh   rH   pathlibr   requestsr!   rl   rz   r{   STATEr.   r/   r|   rI   rP   r^   rM   Sessionr   r%   r4   rY   r`   ru   r   __name__ r&   r$   <module>r      s   
  
   89

D<'*BBMMOPl 3S
 9z 	H8,^	B($ zF r&   