
    Qj                     b   U d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	m
Z
 dZdZ G d d	ee      Z ed
 eD              Zded<   dZ eej(                  j*                  ej,                  j*                  h      ZddZddZddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 	 	 ddZddZg dZy)u  utils.source_attribution_guard_v2 — Stop hook 사후 거짓표현 차단 가드 (v2).

task-2644+1 ANU_CALLBACK_COLLECTOR_CONTROL_PLANE_CLEAN_REPLACEMENT
task md: memory/tasks/task-2644+1.md
spec (read-only): memory/specs/system_anu_callback_collector_control_plane_spec_260524.md

회장 verbatim 8 enum (보강-1 + §15):
    1. RECEIVED_INBOUND_THIS_SESSION
    2. LOG_LOOKUP_AFTER_CHAIR_QUESTION
    3. LOG_LOOKUP_PROACTIVE
    4. MEMORY_RECALL
    5. INFERENCE_ONLY
    6. CALLBACK_COLLECTOR_PROCESSED  (★ task-2644 주 경로)
    7. CALLBACK_LEDGER_RECONCILED  (post-hoc reconciliation)
    8. LOG_LOOKUP_OR_SCHEDULE_HISTORY_VERIFICATION  (★ §15 1C0F6F52 박제)

ANCHOR-9: "거짓말 패턴 (수신 vs 사후 조회 흐림) Stop hook 으로 사전 차단".
ANCHOR-11: "source attribution enum 8".

v2 변경: schema name + 본 task replacement 표시. logic 동일 (회장 박제 1:1).
    )annotationsN)Enum)DictListOptionalTuplez!utils.source_attribution_guard.v2z!utils.source_attribution_guard.v1c                  ,    e Zd ZdZdZdZdZdZdZdZ	dZ
y	)
SourceAttributionV2RECEIVED_INBOUND_THIS_SESSIONLOG_LOOKUP_AFTER_CHAIR_QUESTIONLOG_LOOKUP_PROACTIVEMEMORY_RECALLINFERENCE_ONLYCALLBACK_COLLECTOR_PROCESSEDCALLBACK_LEDGER_RECONCILED+LOG_LOOKUP_OR_SCHEDULE_HISTORY_VERIFICATIONN)__name__
__module____qualname__r   r   r   r   r   r   r   r        8/home/jay/workspace/utils/source_attribution_guard_v2.pyr
   r
   "   s2    $C!&G#1#M%N#A !=5 0r   r
   c              #  4   K   | ]  }|j                     y wN)value).0es     r   	<genexpr>r   /   s     $JQWW$Js   zTuple[str, ...]ENUM_VALUES)zcallback receivedu   callback 받았u   callback 도착u   callback 수신u   콜백 도착u   콜백 수신u   콜백 받았zcallback inboundzinbound callbacku   수신 완료u   받음 확인c                p    t        j                  dd| xs d      j                         j                         S )Nz\s+  )resubstriplower)texts    r   _normalisedr(   G   s+    66&#tzr*00288::r   c                T    t        |       }t        D cg c]	  }||v s| c}S c c}w r   )r(   _RECEIVED_PHRASE_PATTERNS)r'   normps      r   find_received_phrasesr-   K   s&    tD0>!AIA>>>s   	%%c                    | r| t         v S dS )NF)_INBOUND_SOURCES)sources    r   
is_inboundr1   P   s    )/6%%:U:r   c                N    t        |       }|sdg fS |t        |      sd|fS d|fS )uO   received/수신 표현이 있는데 source 가 inbound 가 아니면 violation.FT)r-   r1   )r'   source_attributionmatchess      r   detect_received_phrase_misuser5   T   s=    
 $D)Gby!4F)GW}'>r   c                f    |t         j                  j                  k7  ryt        t	        |             S )uP   LOG_LOOKUP_OR_SCHEDULE_HISTORY_VERIFICATION + received-phrase = 1C0F6F52 패턴.F)r
   r   r   boolr-   )r'   r3   s     r   "detect_schedule_history_as_inboundr8   a   s-    
 0\\bbb%d+,,r   c                R   |r| rt         j                  j                  S | rt         j                  j                  S |rt         j                  j                  S |rt         j
                  j                  S |rt         j                  j                  S t         j                  j                  S r   )r
   r   r   r   r   r   r   r   )inbound_envelope_presentcollector_modeledger_lookup_onlyschedule_history_lookup_onlychair_question_triggereds        r   classify_sourcer?   k   s     2"??EEE"@@FFF"==CCC#"NNTTT"BBHHH--333r   c                    t        | |      \  }}|r|d}nd| d}t        d|||dS t        | |      rt        ddt        |       |dS t        ddg |dS )	zStop hook v2 entry point.Num   RECEIVED_PHRASE_WITHOUT_SOURCE_ATTRIBUTION (v2 Stop hook 조건 7: '도착/수신' 표현 + source 미명시)z+RECEIVED_PHRASE_NON_INBOUND_SOURCE (source=u    은 inbound 아님)T)schema	violationreasonmatched_phrasesr3   u   SCHEDULE_HISTORY_VERIFICATION_AS_INBOUND (v2 Stop hook 조건 8: 1C0F6F52 패턴 — schedule_history 사후 조회를 수신처럼 표현)F)r5   SCHEMAr8   r-   )r'   r3   misuser4   rC   s        r   validaterG      s    3D:LMOFG%U -..BD 
 &"4
 	
 *$0BC8  5T:"4

 
	
 0 r   )
rE   REPLACEMENT_OFr
   r   r-   r1   r5   r8   r?   rG   )r'   strreturnrI   )r'   rI   rJ   z	List[str])r0   Optional[str]rJ   r7   )r'   rI   r3   rK   rJ   zTuple[bool, List[str]])r'   rI   r3   rK   rJ   r7   )r:   r7   r;   r7   r<   r7   r=   r7   r>   r7   rJ   rI   )r'   rI   r3   rK   rJ   zDict[str, object]) __doc__
__future__r   r#   enumr   typingr   r   r   r   rE   rH   rI   r
   tupler   __annotations__r*   	frozensetr   r   r   r/   r(   r-   r1   r5   r8   r?   rG   __all__r   r   r   <module>rT      s  * # 	  . . 
-4
#t 
  %$J6I$JJ_ J  55;;44::  ;?
;


%
 
-
-%- 
-4"4 4 	4
 #'4 #4 	4*'Tr   