
    QjI                       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mZ ddl	m
Z
 ddlmZmZmZmZmZ dZdZ eeh      Zd	ed
<   dZdZdZdZdZdZeeefZdZdZdZ e
d      Z edefedefedefiZ!e G d d             Z"d1dZ#d2dZ$d2dZ%d2dZ&d Z'd e(e      d d d!d"	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d3d#Z)d$d e(e      d%	 	 	 	 	 	 	 	 	 	 	 	 	 d4d&Z* e(e      d'	 	 	 	 	 	 	 	 	 d5d(Z+d e(e      d)	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d6d*Z, e(e      d'	 	 	 	 	 	 	 d7d+Z-d8d,Z.g d-Z/e0d.k(  r%ddl1Z2 e3 e2jh                   e.       d!d/0             yy)9u  utils.callback_collector_helper_integration — task-2646 helper 통합 wiring (v2).

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

★ 본 module 은 v2 control-plane 산출물들이 task-2646 helper 3종을
   - utils.callback_registration.register_callback / verify_actual_owner
   - utils.callback_authority_validator.validate_authority
   - utils.callback_source_cross_checker.cross_check_sources
   를 단일 진입점으로 사용하도록 강제하는 wiring layer.

task md 11 필수 원칙 (1:1):
   4. task-2646 helper/authority validator 기준 필수
   5. ANU key actual owner 검증 필수 (등록 직후 actual schedule owner key
      == c119085addb0f8b7)
   6. self-key callback 이면 즉시 FAIL (SELF_COLLECTOR_FORBIDDEN)
   7. 4 source cross-check 필수 (schedule_history + cron-history + envelope +
      result artifact)
  10. registration helper bypass 시 fail-closed

helper 부재 시 fail-closed: HELPER_INTEGRATION_BYPASS state 로 강제 종료.
    )annotationsN)	dataclassfield)Path)AnyDictListOptionalSequencez.utils.callback_collector_helper_integration.v1c119085addb0f8b7	frozensetDEFAULT_ANU_KEYSzutils.callback_registrationz"utils.callback_authority_validatorz#utils.callback_source_cross_checkerz(_task_2646_helpers.callback_registrationz/_task_2646_helpers.callback_authority_validatorz0_task_2646_helpers.callback_source_cross_checkerHELPER_INTEGRATION_OKHELPER_INTEGRATION_BYPASSSELF_COLLECTOR_FORBIDDENz-/home/jay/workspace/.worktrees/task-2646-dev3zcallback_registration.pyzcallback_authority_validator.pyz callback_source_cross_checker.pyc                  r    e Zd ZU ded<   ded<   ded<   ded<   ded<    ee	      Zded
<   dZded<   ddZy)IntegrationStatusstrschemabool	availablestatez	List[str]helpers_loadedhelpers_missing)default_factoryreasonsNOptional[str]fallback_path_usedc                    | j                   | j                  | j                  t        | j                        t        | j
                        t        | j                        | j                  dS )Nr   r   r   r   r   r   r   )r   r   r   listr   r   r   r   )selfs    B/home/jay/workspace/utils/callback_collector_helper_integration.pyto_jsonzIntegrationStatus.to_jsonK   sR    kkZZ"4#6#67#D$8$89DLL)"&"9"9
 	
    returnDict[str, Any])	__name__
__module____qualname____annotations__r   r!   r   r   r$    r%   r#   r   r   A   s<    KOJt4GY4(,,	
r%   r   c                   | t         j                  v rt         j                  |    S t        j                  j	                  | t        |            }||j                  yt        j                  j                  |      }|t         j                  | <   	 |j                  j                  |       |S # t        $ r" t         j                  j                  | d        w xY w)zLoad a helper module by absolute file path under an alias namespace.

    Returns the loaded module or None on failure. Registers under both the
    alias and the canonical helper name so callers using either work.
    N)sysmodules	importlibutilspec_from_file_locationr   loadermodule_from_specexec_module	Exceptionpop)alias	file_pathspecmodules       r#   _load_from_filer=   W   s     {{5!!>>11%YHD|t{{*^^,,T2FCKK' M  t$s   B. .+Cc            	        g } g }g }d }t         D ])  }	 t        j                  |       | j                  |       + |rt
        j                         rt        t
              }g }t        |      D ]  }t        |   \  }}	t
        dz  |z  }
|
j                         s'|j                  |       |j                  d|
 d       R	 t        |	|
      }|'|j                  |       |j                  d|
 d       |t        j                  |<   | j                  |       |} |}|rt        t        d
t         | ||dgz   |      S t        t        dt"        | g ||      S # t        $ r3}|j                  |       |j                  d|d|        Y d }~d }~ww xY w# t        $ r3}|j                  |       |j                  d|d	|        Y d }~bd }~ww xY w)Nzprimary import z	 failed: utilszfallback file z missingz!fallback spec_from_file_location(z) returned Nonezfallback import z from file failed: FzHELPER_INTEGRATION_BYPASS: required task-2646 helpers are unavailable; registration must be considered fail-closed (task md ANCHOR-2 violation).r    T)REQUIRED_HELPERSr1   import_moduleappendr7   _FALLBACK_WORKTREEis_dirr   r!   _HELPER_FILESis_filer=   r/   r0   r   SCHEMAINTEGRATION_BYPASSINTEGRATION_OK)loadedmissingr   fallback_usednameexcfallback_strstill_missingfilenamer9   helper_filer<   s               r#   _try_import_helpersrS   l   s   FGG#'M  E	E##D)MM$E %,,.-.#%M 	TD+D1OHe,w6AK&&($$T*}HEFT(<>!((.NN%F{mSb#cd$*D!d# ,!	T(   $!#0 
  -
 	
 ( Y  	ENN4 NN_THIcUCDD	E0  T$$T*!1$9LSERSSTs5   &E 4F5&F	F"(FF	G!(GGc                     t               S )z1Public probe used by hooks/adjudicator/runner v2.rS   r-   r%   r#   integration_statusrV      s      r%   c                     t               } | S )zEagerly import helpers. Returns IntegrationStatus; raises only if
    truly unavailable (callers handle BYPASS as fail-closed).rU   )statuss    r#   require_helpersrY      s     !"FMr%   c                     t               } | j                  sd | fS t        j                  t              }t        j                  t
              }t        j                  t              }|||f| fS )N)rY   r   r1   rA   HELPER_REGISTRATIONHELPER_AUTHORITYHELPER_CROSS_CHECK)rX   regauthcrosss       r#   _get_modulesra      sb    FV|

!
!"5
6C""#34D##$67Euv%%r%   z/home/jay/workspaceTF)canonical_rootanu_keysrequire_envelopedispatch_pathdirect_cron_pathc        
        h   t               \  }
}|
(t        dt        |j                         |j                  dS |
d   }|t
        k(  rt        dt        |j                         dgdS |j                  d| |t
        t        |      |||||||	      }|j                         }|j                         |d<   |S )u   ANU normal callback 등록 (helper integration 단일 진입점).

    Caller MUST pass executor_key == 본 봇의 self key.
    owner_key 는 항상 ANU_KEY 로 강제됨 (self-key 발사 금지).
    FAILr   verdictr   rV   r   r   uu   executor_key == ANU_KEY: collector self-key registration is forbidden by task md 원칙 6 (SELF_COLLECTOR_FORBIDDEN).normal)kindtask_idexecutor_key	owner_keychat_idpromptatrb   rc   rd   re   rf   rV   )	ra   rG   rH   r$   r   ANU_KEYr   register_callbackr   )rm   rn   rp   rq   rr   rb   rc   rd   re   rf   r0   rX   r^   resultpayloads                  r#   register_normal_callbackrw      s    $ #nOGV'"(.."2~~
 	
 !*Cw-"(.."2L	
 		
 ""!G%)#) # F nnG$*NN$4G !Nr%   ANU)observed_roleexpected_chat_idrc   c                :   t               \  }}|(t        dt        |j                         |j                  dS |d   }|j                  | j                  dd      | j                  dd      | j                  d|j                        | j                  d	d
      | j                  dd      | j                  dt              t        | j                  dd            t        | j                  dd            | j                  dd      | j                  d      | j                  d      | j                  d      t        | j                  dg             | j                  d            }	|j                  |	|||||      }
|
j                         }|j                         |d<   |S )u   register_normal_callback 의 결과를 입력으로 받아 actual owner 검증.

    회장 원칙 5: 등록 직후 actual schedule owner key 가 ANU_KEY 인지 검증.
    rh   ri   r   r   zutils.callback_registration.v1rj   PASSr   rl   rk   rm    ro   rp   prompt_utf8_bytesprompt_byte_classification	OK_TARGETargvlaunch_decisionauthority_markerr   registered_at_iso)r   rj   r   rl   rm   ro   rp   r~   r   r   r   r   r   r   )registration_resultobserved_owner_keyobserved_chat_idry   rc   rz   rV   )ra   rG   rH   r$   r   RegistrationResultget#STATE_DISPATCH_SUBMITTED_UNVERIFIEDrs   r   intr!   verify_actual_owner)registration_payloadr   r   ry   rz   rc   r0   rX   r^   rrverifiedrv   s               r#   verify_ownerr      s    #nOGV'"(.."2~~
 	
 !*C			#''2RS$((F;"&&w0W0WX!%%fh7$((B7&**;@(,,Y;<2667JANO#7#;#;(+$
 "%%f-,001BC-112DE)--i<=.223FG! 
  
B$ &&-)#) ' H  G$*NN$4G !Nr%   )rc   c                    t               \  }}|(t        dt        |j                         |j                  dS |d   }|j                  | |||      }|j                         }|j                         |d<   |S )Nrh   ri      )envelope_collector_keyactual_owner_keyrn   rc   rV   )ra   rG   rH   r$   r   validate_authority)	r   r   rn   rc   r0   rX   r_   rj   rv   s	            r#   validate_callback_authorityr   5  s     #nOGV'"(.."2~~
 	
 1:D%%5)!	 & G ooG$*NN$4G !Nr%   )cron_list_presentrc   c           	         t               \  }}|(t        dt        |j                         |j                  dS |d   }	|	j                  | ||||||      }
|
j                         }|j                         |d<   |S )Nrh   ri      )cron_idschedule_history_recordscron_history_recordsenveloperesult_artifactr   rc   rV   )ra   rG   rH   r$   r   cross_check_sources)r   r   r   r   r   r   rc   r0   rX   r`   ru   rv   s               r#   cross_check_four_sourcesr   Q  s     #nOGV'"(.."2~~
 	
 AJE&&!91'+ ' F nnG$*NN$4G !Nr%   c                t   t               }t        |j                        }|j                  st        dt
        |j                         |dS | +|j                  d       t        dd|j                         |dS | j                  d      xs | j                  d      }||k(  r3|j                  d|d       t        dt        |j                         |dS |t        |      vr;|j                  d|d	t        |       d
       t        dd|j                         |dS t        dd|j                         ||dgz   dS )u6  SessionStart hook 직후 collector 가 호출하는 single contract check.

    Combines: helper availability + envelope presence + self-key forbidden gate
    + envelope.collector_key authority pre-check (envelope-only — actual owner
    verification still requires verify_owner after schedule lookup).
    rh   ri   u   envelope is None — collector 의 7 단계 중 1 단계 (envelope parse) 불가; SAFE_DEGRADED_MODE 또는 HOLD_FOR_CHAIR 강제 (task md 원칙 11).ENVELOPE_MISSINGro   collector_keyzenvelope owner_key=uA    == executor_key — SELF_COLLECTOR_FORBIDDEN (task md 원칙 6).u    ∉ anu_keys=uH    — authority pre-check FAIL (verify_owner still required post-lookup).ENVELOPE_OWNER_NOT_ANUr|   ENVELOPE_PRECHECK_PASSu_   envelope owner_key ∈ anu_keys AND != executor_key; proceed to schedule lookup + verify_owner.)r   rj   r   rV   envelope_owner_keyr   )rV   r!   r   r   rG   rH   r$   rB   r   r   set)r   rn   rc   rX   r   envelope_owners         r#    validate_spawn_callback_contractr   s  su     !Ffnn-G'"(.."2
 	
 [	

 '"(.."2
 	
 \\+.O(,,2ON%!.!3 4; ;	

 -"(.."2
 	
 S]*!.!3>$x.AQ RV V	

 -"(.."2
 	
 )$nn.,9
 

 
r%   c                 ~   g } t               }|j                  sE| j                  d|j                   d|j                          t
        d| d|j                         dS t        d d      }|d   d	k7  s|d
   dk7  r| j                  d|        t        ddid      }|d
   t        k7  r| j                  d|        t        dt        id      }|d   dk7  r| j                  d|        t        dt        dddd      }|d
   t        k7  r| j                  d|        t        t        t        d      }|j                  d      dk7  r| j                  d|        t        dg i d d d      }|j                  d
      dk7  r| j                  d|        t
        t        |       dk(  | d |j                         dS )!Nz(helper integration unavailable: missing=z	 reasons=Fr   )r   okfailures	tests_runrV   abc)r   rn   rj   rh   r   r   z"spawn contract None envelope: got ro   zself-exec-keyzself-key envelope: got z	other-keyr|   zANU envelope passthrough: got zt-self0x10m)rm   rn   rp   rq   rr   rd   zregister self-key: got )r   r   rn   zauthority ANU/ANU: got zzz)r   r   r   r   r   r   CALLBACK_MISSINGzcross_check missing: got r      )rV   r   rB   r   r   rG   r$   r   r   rs   rw   r   r   r   len)r   rX   r1r2r3r4r5r6s           r#   selftestr     s   H!F6v7M7M6N O~~&(	

  "(.."2
 	
 
*4e	LB	)}"W+1C"C<RDAB 
*/$
B 
'{..1"67 
*w' 
B 
)}8=> 
"
B 
'{..1"67 
%&  
B
 
vviF"1"67 
"!#
B 
vvg,,3B489 (mq $nn. r%   )rG   rs   r   rI   rH   r   r   rV   rY   rw   r   r   r   r   r   __main__r   )ensure_asciiindent)r9   r   r:   r   )r'   r   )rm   r   rn   r   rp   r   rq   r   rr   r   rb   r   rc   Sequence[str]rd   r   re   r   rf   r   r'   r(   )r   r(   r   r   r   r   ry   r   rz   r   rc   r   r'   r(   )
r   r   r   r   rn   r   rc   r   r'   r(   )r   r   r   zList[Dict[str, Any]]r   zDict[str, List[Dict[str, Any]]]r   Optional[Dict[str, Any]]r   r   r   zOptional[bool]rc   r   r'   r(   )r   r   rn   r   rc   r   r'   r(   r&   )5__doc__
__future__r   r1   importlib.utilr/   dataclassesr   r   pathlibr   typingr   r   r	   r
   r   rG   rs   r   r   r,   r[   r\   r]   _ALIAS_REGISTRATION_ALIAS_AUTHORITY_ALIAS_CROSS_CHECKr@   rI   rH   r   rC   rE   r   r=   rS   rV   rY   ra   tuplerw   r   r   r   r   r   __all__r)   json_jsonprintdumpsr-   r%   r#   <module>r      s  . #   
 (  6 6 
:
'	2 ) 23 7 :  A D G ')9;MN (0 5  IJ 46IJ8:JK;=OP 
 
 
**>B!
&" 0#$45!"99 9 	9
 9 	9 9 9 9 9 9 9B &*#$453(3 3 	3
 3 $3 3 3v $$45  	
  F )-#$45 3 :	
 ' . &  L $$45	I&I I 	I
 IXM`& z	+%++hjuQ
?@ r%   