
    ʓ}j)                        d Z ddlmZ ddlmZmZmZmZ dZdZ	dZ
e	e
fz   Z	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 ddZdd	Zdd
ZdddZddZddZddZg dZy)u  trip-wire 5종 증거 수치의 생성·검증·대조 헬퍼 (task-2950).

배경:
    dispatch 프롬프트에는 trip-wire 5종(Critical7 / PII net-new / 회귀실패 /
    forbidden_paths 침범 / nonce)이 인라인으로 상주한다. 그 **실측 수치**는
    ``result.json`` 의 ``trip_wire`` 필드에 백업된다.

★ 핵심 정책 (QC-RULES.md §trip-wire 8-B):
    result.json 의 수치는 실행 주체의 **자기증명**이므로 그 자체로 통과 근거가
    아니다. 판정은 ANU 가 clean worktree 에서 게이트를 **재실행**해 얻은 수치로
    하고, result.json 값은 대조용 백업으로만 쓴다. 불일치 시 재실행 수치를 채택한다.

설계 원칙:
    - 무손상: 어떤 입력에도 raise 하지 않는다(잘못된 타입은 위반으로 분류).
    - 미측정(None) 을 0 으로 승격하지 않는다. 미측정은 통과가 아니다.
    )annotations)AnyDictIterableOptional	trip_wire)	critical7pii_net_newregression_failuresforbidden_paths_violationsnonceNc                4    d|d|d|d|t         ||iS | xs diS )u  trip-wire 5종 증거 dict 를 생성한다.

    Args:
        task_id: 발사된 작업 ID. ``nonce`` 미지정 시 nonce 로 사용된다.
        critical7: Critical7 지적 건수 (통과=0). 미측정이면 None.
        pii_net_new: net-new PII 노출 건수 (통과=0). 미측정이면 None.
        regression_failures: 회귀 테스트 실패 건수 (통과=0). 미측정이면 None.
        forbidden_paths_violations: forbidden_paths 침범 건수 (통과=0). 미측정이면 None.
        nonce: 증거의 소유 task_id. 미지정 시 ``task_id``.

    Returns:
        5종 필드를 가진 dict. 미측정 항목은 None 으로 남는다(0 으로 채우지 않는다).
    r	   r
   r   r   N)TRIP_WIRE_NONCE_FIELD)task_idr	   r
   r   r   r   s         //home/jay/workspace/utils/trip_wire_evidence.pybuild_trip_wire_evidencer   %   sC    , 	Y{2$&@(9u 
 AH4     c                    t        | t              rt        |       ni }t        |t              rt        |      ni |t        <   |S )u(  result.json dict 에 ``trip_wire`` 증거를 병합한 **새 dict** 를 반환한다.

    원본을 변형하지 않는다(호출자가 이미 만든 payload 를 조용히 바꾸지 않기 위해).
    ``result`` 가 dict 가 아니면 새 dict 를 만들어 증거만 담는다(무손상).
    )
isinstancedictTRIP_WIRE_RESULT_KEY)resultevidencemergeds      r   attach_trip_wire_evidencer   C   s8     .8-ET&\2F5?$5O4>UWF Mr   c                |    ||  dS t        |t              st        |t              s|  d|dS |dk7  r|  d| dS y)uO   카운터 필드 1개를 판정. 위반이면 사유 문자열, 통과면 None.N5   =미측정(None) — 미측정은 통과가 아니다=u"    — 정수 카운터가 아니다r   u    — 0 이어야 한다)r   boolint)fieldvalues     r   _counter_violationr#   N   sZ    }MNN%j&<%"DEEz% 788r   c                   g }t        | t              sddt        |       j                   gg dS t        D ]1  }t        || j                  |            }|s!|j                  |       3 | j                  t              }|s|j                  t         d       n%|r#||k7  r|j                  t         d|d|d       | |t        t              dS )ud  증거 dict 가 trip-wire 5종을 모두 통과하는지 판정한다.

    ★ 이 함수의 PASS 는 **자기증명 통과**일 뿐이다. 완료 판정은 ANU 가 clean
      worktree 에서 재실행한 수치로 한다(QC-RULES.md §trip-wire 8-B).

    Returns:
        ``{"passed": bool, "violations": [사유, ...], "checked": [필드, ...]}``
    Fu(   trip_wire 증거가 dict 가 아니다: )passed
violationscheckedr   r   u    — 발사 task_id(u   )와 불일치)r   r   type__name__TRIP_WIRE_COUNTER_FIELDSr#   getappendr   listTRIP_WIRE_FIELDS)r   r   r&   r!   reasonr   s         r   verify_trip_wire_evidencer0   Y   s     Jh%Ed8nF]F]E^_`
 	
 * &#E8<<+>?f%&
 LL./E233hij	Ug%231UI=QRYQ\\jkl !. () r   c                    t        | t              r| ni }t        |t              r|ni }i }i }t        D ]7  }|j                  |      }|j                  |      }|||<   ||k7  s0||d||<   9 | ||dS )u  봇 자기증명(claimed) 과 ANU 재실행 관측치(observed) 를 항목별로 대조한다.

    QC-RULES.md §trip-wire 8-B 의 3단계(불일치 처리)를 코드로 지원한다.
    불일치 시 **관측치를 채택**한다 — 반환 dict 의 ``adopted`` 가 그 결과다.

    Returns:
        ``{"match": bool, "mismatches": {field: {"claimed": x, "observed": y}},
           "adopted": {field: observed_value}}``
    )claimedobserved)match
mismatchesadopted)r   r   r.   r+   )	r2   r3   claimed_mapobserved_mapr5   r6   r!   c_valo_vals	            r   compare_trip_wire_evidencer;   |   s     (6'BK)(D98rL,.J G! F&  'E>,1u EJuF $^:'RRr   c                x    t        | t              si S | j                  t              }t        |t              r|S i S )uN   result.json dict 에서 ``trip_wire`` 증거를 꺼낸다(없으면 빈 dict).)r   r   r+   r   )r   r   s     r   extract_trip_wire_evidencer=      s4    fd#	zz./H!(D189r9r   c                      t        t              S )uG   trip-wire 필드 이름을 순회한다(프롬프트/문서 대조용).)iterr.    r   r   iter_trip_wire_fieldsrA      s     !!r   )
r   r*   r   r.   r   r   r0   r;   r=   rA   ) NNNNN)r   strr	   Optional[int]r
   rD   r   rD   r   rD   r   Optional[str]returnDict[str, Any])r   r   r   rG   rF   rG   )r!   rC   r"   r   rF   rE   )rB   )r   r   r   rC   rF   rG   )r2   r   r3   r   rF   rG   )r   r   rF   rG   )rF   zIterable[str])__doc__
__future__r   typingr   r   r   r   r   r*   r   r.   r   r   r#   r0   r;   r=   rA   __all__r@   r   r   <module>rL      s   " # 0 0 #     +/D.FF  #!%)-04  '	
 !.  < FS2:"
r   