
    i#              
         U d Z ddlmZ ddlZddlZddlZddlmZ  ed      Z	 ee
      j                  dz  Zej                  dd        ee
      j                  dz  d	z  Zd@d
Z ede	dz        Zg dZg dZg dZdAdZi dddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;Zd<ed=<   dBd>Zed?k(  r e        yy)Cu   task-2401 — 25장 stratified L1 evidence 생성 스크립트.

5 카테고리 × 5 패턴 × Latin square 사이즈 배분 → 25 PNG.
모든 PNG pass=True 검증. 실패 시 즉시 sys.exit(1).
    )annotationsN)Pathz/home/jay/workspaceevidenceT)parentsexist_okzresults.jsonc                $   t         j                  j                  | |      }|
J d|        |j                  
J d|        t         j                  j	                  |      }|t
        j                  | <   |j                  j                  |       |S )Nzfailed to spec zno loader for )	importlibutilspec_from_file_locationloadermodule_from_specsysmodulesexec_module)namepathspecmods       K/home/jay/workspace/memory/reports/task-2401-evidence-25-stratified/_run.py_loadr      s    >>11$=D5tf55;;";nTF$;;"
..
)
)$
/CCKKKKC J    _sc_render_runz,skills/satori-cardnews/scripts/render_one.py)	financialsaasconsumerluxurytech_minimal)h1_photo_cardh2_illustrationh3_gpt_styleh4_gradienth5_user_photo))8  r#   )r#   iF  )  iv  )r$   i  )r#   i  c                     t         | |z   dz     S )N   )SIZES)ijs     r   get_sizer*   '   s    !a%1r   )r   r   )u"   내 보험료 지금 바로 비교u#   5분 만에 최저가 보험 찾기)r   r   )u   실손보험 완벽 가이드u*   청구 방법부터 갱신까지 한눈에)r   r    )u   종신보험 vs 정기보험u%   나에게 맞는 선택 기준 정리)r   r!   )u   2026 보험 트렌드 총정리u'   꼭 알아야 할 변경 사항 7가지)r   r"   )u   보험료 절약 꿀팁u   매월 3만원 아끼는 방법)r   r   )u   팀 협업 효율 300% 향상u*   우리 팀만의 워크플로우 만들기)r   r   )u   SaaS 도입 전 체크리스트u'   실패 없는 도입을 위한 10가지)r   r    )u   구독 비용 최적화 전략u'   사용하지 않는 기능 정리하기)r   r!   )u   데이터 기반 의사결정u%   AI 분석 도구 활용 완전 정복)r   r"   )u   스타트업 필수 툴스택u#   월 10만원으로 운영하는 법)r   r   )u   오늘의 특가 한정 할인u&   24시간만 진행되는 특별 혜택)r   r   )u!   신상품 출시 기념 이벤트u   첫 구매 고객 50% 할인)r   r    )u   리뷰 이벤트 참여하기u&   별점 5개 남기고 적립금 받기)r   r!   )u   여름 시즌 컬렉션 공개u#   트렌디한 아이템 모아보기)r   r"   )u   고객 만족도 1위 달성u   4만 명이 선택한 브랜드)r   r   )u   프리미엄 라이프스타일u$   당신만을 위한 특별한 경험)r   r   )u   한정판 에디션 공개u%   전 세계 500개만 제작된 작품)u   장인 정신의 결정체u$   100년 전통을 이어받은 기술)u   익스클루시브 멤버십u'   VIP만을 위한 프라이빗 서비스)u   컬렉터를 위한 선택u*   가치가 오르는 아이템 큐레이션)u!   개발 생산성을 높이는 법u$   현직 개발자가 알려주는 팁)u   클린 코드 작성 원칙u'   유지보수가 쉬운 코드 만들기)u   AI 코딩 도구 비교zCopilot vs Cursor vs Codeium)u%   타입스크립트 마이그레이션u$   단계별 전환 가이드 완성본)u    오픈소스 기여 시작하기u   첫 PR 날리는 방법 정리))r   r    )r   r!   )r   r"   )r   r   )r   r   )r   r    )r   r!   )r   r"   z&dict[tuple[str, str], tuple[str, str]]
CASE_TEXTSc                 6   g } d}t        dd        t        d       t        d d       t        t              D ]  \  }}t        t              D ]  \  }}t	        ||      \  }}t
        ||f   \  }}	| d| d| d| d}
t        |
z  }t        d|d	z  |z   d
z   dd| d| d| d| 
       t        d|        t        d|	        	 t        j                  ||||f||	|      }|j                         r|j                         j                  dz  nd}|j                  di       j                  dd      }|j                  dd      }|d	z  |z   d
z   ||| d| ||	|
|t        |d      ||j                  di       |j                  dd      |j                  dg       d}| j                  |       |rdnd }t        d!| d"|d#d$|d%       |s#|d
z  }t        d&|j                  dg                 t"        j%                  t'        j(                  | dd)             t        d*t"                t+        d+ | D              }t-        |       }|rt+        d, | D              |z  nd}t+        d- | D              t/        d
t+        d. | D                    z  }t        dd        t        d/       t        d        t        d0| d1|        t        d2|d#d3       t        d4|d5       t        d d       |dkD  r%t        d6| d7       t1        j2                  d
       y t        d8       y # t        $ rW}|d
z  }|d	z  |z   d
z   ||| d| ||	|
dddi d't!        |      gd}| j                  |       t        d(|        Y d }~Bd }~ww xY w)9Nr   
z<============================================================u1   task-2401 — 25장 stratified L1 evidence 생성_xz.png[r&      02dz/25] u    × z @    ×z       title: z       body:  )brandpatternsizetitlebodyoutput_pathi   metrics
tofu_scorepassF   checksmode errors)idxcategoryr5   r6   r7   r8   filenamer=   file_size_kbr;   r?   r@   rB   PASSFAILu          → z | z.1fz
KB | tofu=z.3fz       !! FAIL errors: ERRORz       !! EXCEPTION: )ensure_asciiindentu   
결과 저장: c              3  ,   K   | ]  }|d    s	d  yw)r=   r1   N .0rs     r   	<genexpr>zmain.<locals>.<genexpr>   s     511V9Q5s   
c              3  &   K   | ]	  }|d      yw)rF   NrM   rN   s     r   rQ   zmain.<locals>.<genexpr>   s     61^$6s   c              3  8   K   | ]  }|d    dk\  s|d      yw)r;   r   NrM   rN   s     r   rQ   zmain.<locals>.<genexpr>   s     Lqq!7K1\?Ls   
c              3  2   K   | ]  }|d    dk\  sd  yw)r;   r   r1   NrM   rN   s     r   rQ   zmain.<locals>.<genexpr>   s1       ZF`apqr~p  DE  qEZ[  ZFs   SUMMARYz  pass:         /u     평균 파일크기:  z KBu     평균 tofu점수: z.4fz!!! u   장 FAIL — 재확인 필요u   전체 25장 PASS)print	enumerate
CATEGORIESPATTERNSr*   r+   EVIDENCE_DIR
render_modrender_and_verifyexistsstatst_sizegetroundappend	ExceptionstrRESULTS_JSON
write_textjsondumpssumlenmaxr   exit)results
fail_countr(   catr)   patwhr7   r8   fnamer9   resultrF   r;   passedrecordstatusexc
pass_counttotalavg_sizeavg_tofus                          r   mainr~   L   s   GJ	Bvh-	
=>	VHB-J' C53) B	5FAsAq>DAq$c3Z0KE4e1SE1#Qqc.E&.KAac!eAgc]%uDS2aSABN5'*+N4&)*85#55Q + 6  EPDVDVDX{//199D@^_#ZZ	26::<L
FE2 q519q= #" c1#J"  %"$),$:",$jj26"JJvr2$jj26 v&#)vF83|C.@
:VYJZ[\!OJ3FJJx4L3MNO]B	5C5L DJJwU1MN	l^
,- 555JLEBGs6g66>QHLGLLsSTVY  ZFel  ZF  WF  PG  GH	Bvh-	G	VH	ZL%
12	$XcN#
67	!(3
01	VHB-A~ZL =>?!"U  5a
q519q= #" c1#J"  %!$%"$ #"3xj v&-cU344%5s   D*L88	NANN__main__)r   re   r   r   )r(   intr)   r   returnztuple[int, int])r   None)__doc__
__future__r   importlib.utilr	   rh   r   pathlibr   	WORKSPACE__file__parentr[   mkdirrf   r   r\   rY   rZ   r'   r*   r+   __annotations__r~   __name__rM   r   r   <module>r      s  
 #   
  &'	H~$$z1   4$  /H~$$z1NB #Y1_%_`
 I
_L6")v6$)x6 ")r6 !)w	6
 #)g6 )x6  )w6 )v6 )s6 )q6 ")u6 $)n6 !)t6   )r!6" ")l#6&  )t'6( ")p)6* *p)t)u)v)s)d)z)o;6
2 Bc#L zF r   