
    k{j                        d Z ddlZddlmZ ddlmZ ddlmZmZm	Z	m
Z
  ej                  d      ZdZded	e	e
eeef      fd
Zded	eee	eeef      f   fdZefdeded	eeef   fdZefde	e   deeef   ded	eeef   fdZy)u  발송 줄 → 팩 파일 귀속 + 팩 버전 성장 추이.

프롬프트 팩 규약: prompts/_base/<module>/<버전.YYYYMMDDHHmm>/<stem>.md

한계(Codex 검토 2026-08-15 반영, 리포트에도 명시):
- **현재 checkout 의 최신 버전 디렉토리만** 색인한다 — trace 당시 활성
  팩·registry 고정판·프로젝트 오버레이(prompts/projects/...)는 다루지
  않는다. 주행이 최신 checkout 으로 돌았을 때만 귀속이 정확하다.
- exact-line 일치만 쓴다 — 조립 중 치환·접합·개행 변화가 있으면 miss,
  같은 줄이 여러 팩에 있으면 **정렬 순서상 첫 파일**로 귀속된다(다대일
  거짓 귀속 가능 — 소유자는 provenance 가 아니라 후보 중 하나다).
    N)defaultdict)Path)AnyDictListTuplez^(\d+)\.(\d{12})$(   
module_dirreturnc                 4   g }t        | j                               D ]p  }|j                         st        j	                  |j
                        }|s6|j                  t        |j                  d            |j                  d      |f       r t        |      S )N      )	sortediterdiris_dir
VERSION_REmatchnameappendintgroup)r
   outdms       U/Users/manta/Documents/Projects/TheRoad-I1/tools/opik_prompt_audit/audit/attribute.py	_versionsr      su    
CJ&&()xxzQVV$JJAGGAJQ78 * #;    prompts_rootc           
         i }| dz  }|j                         s|S t        |j                               D ]  }|j                         sg }t        |      D ]  \  }}}t        |j                               D ci c]7  }|j	                         r%|j
                  |j                         j                  9 }	}|j                  ||t        |	j                               |	d        t        |      dk\  s|||j
                  <    |S c c}w )uW  module 별 버전 크기 추이.

    행: {version, ts, bytes(버전 디렉토리 안 파일 크기 합 — schema 등
    stem 전부 포함), stems: {파일명: bytes}} — system.md 단독 추이는
    stems 에서 읽는다. 'bytes' 는 os byte (팩은 utf-8 파일)라 발송 '자'
    단위와 다르다 — 추이 비교 전용.
    _base)versiontsbytesstemsr   )r   r   r   r   is_filer   statst_sizer   sumvalueslen)
r   curvesbaser
   rowsverr"   vdirfr$   s
             r   growth_curvesr1   !   s     /1F'!D;;=T\\^,
  "&z2MCT$T\\^4E4		 VVQVVX---4  EKKCr"%elln"5G H 3
 t9>&*F:??# - MEs   6<Dmin_linec                 >   i }| dz  }|j                         s|S t        |j                               D ]  }|j                         st        |      }|s"|d   \  }}}t        |j                               D ]  }|j	                         r|j
                  dvr"	 |j                  d      }	|j                   d|j                   d|j                   }
|	j                         D ]#  }t        |      |k\  s|j                  ||
       %   |S # t        $ r Y w xY w)uR   최신 버전 팩 파일들의 줄(min_line 자 이상) → 'module/version/stem'.r    )z.mdz.txtz.jsonzutf-8)encoding/)r   r   r   r   r%   suffix	read_text	Exceptionr   
splitlinesr*   
setdefault)r   r2   indexr,   r
   vers_latestr0   textkeylines               r   build_line_indexrC   ;   s    E'!D;;=T\\^,
  "$Bx1f()A99;!((2J"J{{G{4  __%Qv{{m1QVVH=C)t9($$T3/ * * -$ L  s   D	DDcommon_linesr<   c                    t        t              }d}| D ]I  }t        |      |k  r|j                  |      }|r||xx   t        |      z  cc<   <|t        |      z  }K t	        t        |j                         d             |dS )u   정적 줄들을 팩 파일별로 묶는다.

    색인이 min_line 미만 줄을 안 담으므로 **여기서도 같은 문턱으로
    거른다** — v1 은 안 걸러서 짧은 정상 팩 줄이 전부 '색인 밖'으로
    새어 그 칸을 부풀렸다(Codex 검토 실증).
    r   c                     | d    S )Nr    )kvs    r   <lambda>z!attribute_lines.<locals>.<lambda>o   s
    beVr   )rA   )
pack_bytesunmatched_bytes)r   r   r*   getdictr   items)rD   r<   r2   	by_source	unmatchedrB   srcs          r   attribute_linesrR   X   s     !,C 0IIt9xiiocNc$i'NT"I  9??$*;<>$ r   )__doc__recollectionsr   pathlibr   typingr   r   r   r   compiler   INDEX_MIN_LINEr   strr   r1   rC   rR   rG   r   r   <module>r[      s    
 #  ) )RZZ,-
$ 4c3n(=#>  c4S#X3G.G)H 6 )7"%	#s(^@ #s)S>  
#s(^	r   