
    
jfL                        d Z ddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZ ddlmZ ddlZ ee      j!                         j"                  d   Z ee      ej(                  vr"ej(                  j+                  d ee             dedefdZ ed	d
      Z edd      Zej2                  Zej4                  Zej6                  Zej8                  Zej:                  Zej<                  Zej>                  Zej@                  Z ejB                  Z!ejD                  Z"ejF                  Z#ejH                  Z$ejJ                  Z%ejL                  Z&ejN                  Z'ejP                  Z(edz  dz  Z)edz  dz  Z*edz  dz  Z+edz  dz  Z,edz  dz  dz  Z-edz  dz  dz  Z.dZ/dZ0dZ1d Z2 G d de	jf                        Z4 G d de4      Z5 G d d e4      Z6e7d!k(  r e	jp                  d"       yy)#u  Regression — task-2553+47 NORMAL_CALLBACK_REGISTRY_WRITEBACK_AND_EVENT_
TRIGGER.

Covers 회장 §8 verbatim items 1~10 + §5/§6/9-R.1 invariants:

  1  normal collector success -> registry COMPLETED write-back
  2  completed write-back -> next_action READY
  3  fallback pending + normal completed -> non-blocking
  4  dead-man only -> NOT a primary trigger
  5  fixed-time gate as dependency trigger -> FAIL
  6  repeated scan idempotent
  7  missing fallback binding is NOT a cancel target
  8  +45 14:24 case -> automatic next-action detection reproduced
  9  registry mismatch -> TRACK_MISMATCH
  10 callback mandatory rule no-regression

9-R.1 Layer A: callback_event_trigger performs ZERO cron register/remove,
ZERO dispatch/merge/subprocess. The only write surface is the +44
append-only ledger via write_back_completed (the +44 module stays byte-0).
A next_action is a PROPOSAL ONLY (no auto dispatch/merge/closeout, §6).
    N)Path)Optional   modnamerelpathc                     t         j                  j                  | t        |z        }t         j                  j	                  |      }|t
        j                  | <   |j                  j                  |       |S N)		importlibutilspec_from_file_location_ROOTmodule_from_specsysmodulesloaderexec_module)r   r   specmods       N/home/jay/workspace/tests/regression/test_callback_event_trigger_2553plus47.py_loadr   )   sU    >>11'57?KD
..
)
)$
/CCKKKKC J    zanu_v3.callback_4tuple_registryz"anu_v3/callback_4tuple_registry.pyzanu_v3.callback_event_triggerz anu_v3/callback_event_trigger.pyanu_v3zcallback_event_trigger.pyzcallback_4tuple_registry.pyschemasz%callback_4tuple_writeback.schema.jsonz"callback_event_trigger.schema.jsonmemoryfixturesz:task-2553plus47.plus45-1424-normal-callback-completed.jsonz)task-2553plus47.consolidated-summary.json(20456b5f83fc039f2fd6f50f4b94095c29b41bfbz%task/task-2553p1-f1-clean-replacement@774d550628410d36962c23a7663c4b6dbf72789de7c7fd940871e9ad8280e5abc                      t        j                  ddt        t              g| ddd      j                  j                         S )Ngitz-CT)capture_outputtextcheck)
subprocessrunstrr   stdoutstrip)argss    r   _gitr)   _   s:    >>	c%j(4($d fUUWr   c                   >    e Zd Zd Zd Z	 	 	 	 ddee   dee   fdZy)_Basec                     t        j                         | _        t        | j                  j                        dz  | _        t        | j
                        | _        y )Nzcallback_4tuple_index.jsonl)tempfileTemporaryDirectory_tmpr   nameledgerCallback4TupleRegistryregselfs    r   setUpz_Base.setUpg   s<    //1	499>>*-JJ)$++6r   c                 8    | j                   j                          y r	   )r/   cleanupr4   s    r   tearDownz_Base.tearDownl   s    		r   Nnccfbc                 `    | j                   j                  t        |||dd|||dd
             y )Ndev
6937032012
REGISTEREDz2026-05-18 13:42 KST
task_iddispatch_iddispatch_cron_idexecutorchat_idnormal_collector_cron_idfallback_callback_cron_idrolestatusts_kst)r3   appendmake_record)r5   rA   rH   r:   r;   rB   s         r   _seed_registeredz_Base._seed_registeredo   s4     	(5 3&(tL)
 	r   )task-2553+45dispatchN1D8D112A2CCA4E15)__name__
__module____qualname__r6   r9   r   r%   rM    r   r   r+   r+   f   s8    7
 =G.2-7%/
&sm
%c]
r   r+   c                   T    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zy)WriteBackAndEventTriggerc                    | j                          t        | j                  ddddddddd	
      }| j                  |j                  t
               | j                  |j                         | j                  j                  d      }| j                  |j                  d
       | j                  |j                  d       | j                  |j                  d       | j                  |j                  d       t        j                  |j                         t        j                   t"        j%                  d                   y )NrN   rQ      dev2 오딘r>   zNC-2553p45-1424rP   rD   z2026-05-18 14:24 KST	rA   rB   rC   rD   rE   rF   rG   rH   rJ   	COMPLETEDutf-8)rM   write_back_completedr3   assertEqualrI   WRITEBACK_COMPLETED
assertTrueappended
latest_forrH   rF   rG   
jsonschemavalidateto_jsonjsonloads	WB_SCHEMA	read_text)r5   rlatests      r    test_01_normal_success_writebackz9WriteBackAndEventTrigger.test_01_normal_success_writeback   s     HHn*'- ;L&0z)
 	#67

#$$^44 	j188:KL99:FIIKI$7$7$@A	Cr   c                     | j                          t        | j                  dddddddd	       t        | j                        }|j	                  ddd	      }| j                  |j                  t               | j                  |j                         | j                  |j                  t               | j                  |j                         | j                  |j                         | j                  |j                  d
   d       | j                  |j                  d   d       | j                  |j                  d          t!        j"                  |j%                         t'        j(                  t*        j-                  d                   y )NrN   rQ   rY   r>   NC-1rP   rD   rA   rB   rC   rD   rE   rF   rG   rH   )rA   expected_dispatch_idexpected_chat_id	authoritynoneaction_modeproposalauto_executedr\   )rM   r]   r3   CallbackEventTriggerscanr^   verdictNEXT_ACTION_READYr`   readytrigger_sourceTRIGGER_REGISTRY_COMPLETEDassertFalsefixed_time_useddead_man_usednext_actionrc   rd   re   rf   rg   	ET_SCHEMAri   )r5   etress      r   -test_02_completed_writeback_next_action_readyzFWriteBackAndEventTrigger.test_02_completed_writeback_next_action_ready   s8   HHn*'- 6&0z		
 "$((+ggn+5'3  5 	&78		"++-GH,,-**+5v>7D9:KKM4::i&9&9'&BC	Er   c                 V   | j                          t        | j                  dddddddd	       t        | j                        j	                  d	      }| j                  |j                         | j                  |j                         | j                  |j                  t               y )
NrN   rQ   r=   r>   rn   rP   rD   ro   rA   )rM   r]   r3   rw   rx   r`   fallback_pending_non_blockingr{   r^   ry   rz   r5   r   s     r   %test_03_fallback_pending_non_blockingz>WriteBackAndEventTrigger.test_03_fallback_pending_non_blocking   s    HHn*'%%+&0z		
 #488,11.1I 	99:		"&78r   c                    | j                          t        | j                        j                  dd      }| j	                  |j
                         | j                  |j                  t               | j	                  |j                         | j                  |j                         | j                  t        d |j                  D                     y )NrN   T)rA   dead_man_signalc              3   0   K   | ]  }d |v xr d|v   yw)zdead-manNOTNrU   ).0xs     r   	<genexpr>zMWriteBackAndEventTrigger.test_04_dead_man_only_not_primary.<locals>.<genexpr>   s(      2 ! '!O:
: 2s   )rM   rw   r3   rx   r~   r{   r^   ry   NEXT_ACTION_DEFERREDr   assertIsNoner|   r`   anyreasonsr   s     r   !test_04_dead_man_only_not_primaryz:WriteBackAndEventTrigger.test_04_dead_man_only_not_primary   s    "488,11"D 2 :#&:;**+#,,- 2%([[2 2 	3r   c                 ~   | j                          t        | j                  dddddddd	       t        | j                        }t        t
        fD ]k  }|j                  d|	      }| j                  |j                  t               | j                  |j                         | j                  |j                         m y )
NrN   rQ   r=   r>   rn   rP   rD   ro   )rA   dependency_trigger_source)rM   r]   r3   rw   TRIGGER_FIXED_TIMETRIGGER_DEAD_MANrx   r^   ry   FORBIDDEN_TRIGGER_SOURCEr~   r{   r   r   )r5   r   badr   s       r   *test_05_fixed_time_dependency_trigger_failzCWriteBackAndEventTrigger.test_05_fixed_time_dependency_trigger_fail   s    HHn*'%%+&0z		
 "$((+&(89 	/C''.47  9CS[[*BCSYY'coo.	/r   c           
         | j                          t        dddddddd      }t        | j                  fi |}t        | j                  fi |}| j	                  |j
                  t               | j	                  |j
                  t               | j                  |j                         | j                  j                  d	      j                         D cg c]  }d
|v r|
 }}| j	                  t        |      d       t        | j                        }|j                  d      j!                         }|j                  d      j!                         }| j	                  ||       y c c}w )NrN   rQ   r=   r>   rn   rP   rD   ro   r\   z"status": "COMPLETED"   r   )rM   dictr]   r3   r^   rI   r_   WRITEBACK_IDEMPOTENT_SKIPr~   ra   r1   ri   
splitlineslenrw   rx   re   )	r5   kwr1r2lncompleted_linesr   abs	            r   test_06_idempotentz+WriteBackAndEventTrigger.test_06_idempotent   s9   .j#-&,6ZI "$((1b1!$((1b1$78$=>%..w7BBD
&", 
 
 	_-q1!$((+GGNG+335GGNG+335A
s   E(c                 \   | j                  d        t        | j                  ddddddd dd	
       t        | j                        j	                  d
      }| j                  |j                         | j                  |j                         | j                  |j                  t               y )N)r;   rN   rQ   r=   r>   rn   rD   T)	rA   rB   rC   rD   rE   rF   rG   rH   no_fallbackr   )rM   r]   r3   rw   rx   r`   r{   r~   r   r^   ry   rz   r   s     r   *test_07_missing_fallback_not_cancel_targetzCWriteBackAndEventTrigger.test_07_missing_fallback_not_cancel_target   s    &HHn*'%%+&*	
 #488,11.1I		"::;&78r   c                    t        j                  t        j                  d            }|d   d   }| j                  j                  t        |d   |d   |d   |d   |d   |d	   |d
   |d   |d   |d   
             t        | j                        }|j                  d      }| j                  |j                  t               |d   }t        | j                  |d   |d   |d   |d   |d   |d	   |d
   |d   |d   
      }| j                  |j                  t               |j                  d      }| j                  |j                  t               | j!                  |j"                         | j                  |j$                  t&               | j)                  |j*                         | j)                  |j,                         y )Nr\   defect_caseledger_record_at_defectrA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   r@   rN   r   writeback_inputrZ   )rf   rg   FX_45ri   r3   rK   rL   rw   rx   r^   ry   r   r]   rI   r_   rz   r`   r{   r|   r}   r~   r   r   )r5   fxdr   beforewiwrafters           r   test_08_plus45_1424_autodetectz7WriteBackAndEventTrigger.test_08_plus45_1424_autodetect  s   ZZ01}78iLa.>12Qz]iL%&'A%B&'(C&D61X;q{
 	 "$((+0)=>!"!HHbmM9J 23bnyM%'(B%C&()D&EFBxL
 	$78/(9:$--/IJ../,,-r   c                 n   t        j                  t        j                  d            }|d   d   D ]N  }| j                  j                  t        |d   |d   |d   |d   |d   |d	   |d
   |d   |d   |d   
             P t        | j                        j                  d|d   d         }| j                  |j                         | j                  |j                         | j                  t        |j                        t        |d   d                | j                  |j                  d          y )Nr\   consolidated_casecompleted_recordsrA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   r@   ztask-2553+47consolidated_inputs)rA   r   summary_candidate)rf   rg   FX_CONSri   r3   rK   rL   rw   rx   r`   r{   r   r^   sortedsummary_inputs_completedr   )r5   r   recr   s       r   'test_08b_consolidated_summary_candidatez@WriteBackAndEventTrigger.test_08b_consolidated_summary_candidate"  s7   ZZ))'23)*+>? 		CHHOOKIC4F!$%7!8Z#i.),-G)H*-.I*J[X8} 		 #488,11" "#6 7%!' 2 

 			"--.3//02)*+@AB	
 	(;<=r   c                    | j                          t        | j                  dddddddd	       t        | j                        j	                  dd	
      }| j                  |j                  t               | j                  |j                         | j                  |j                         t        | j                        j	                  dd      }| j                  |j                  t               y )NrN   rQ   r=   r>   rn   rP   rD   ro   DEADBEEF)rA   rp   
9999999999)rA   rq   )rM   r]   r3   rw   rx   r^   ry   TRACK_MISMATCHr~   r{   r   r   )r5   r   res2s      r   test_09_track_mismatchz/WriteBackAndEventTrigger.test_09_track_mismatch<  s    HHn*'%%+&0z		
 #488,11" 2 En5##//*#DHH-22"\ 3 C~6r   c                    | j                          t        | j                  dddddd dd	      }| j                  |j                  t
               | j                  |j                         | j                  d| j                  j                         r| j                  j                  d	      nd
       t        j                  |j                         t        j                   t"        j                  d	                   y )NrN   rQ   r=   r>   rP   rD   ro   r[   r\    )rM   r]   r3   r^   rI   CALLBACK_MANDATORY_VIOLATIONr~   ra   assertNotInr1   is_fileri   rc   rd   re   rf   rg   rh   )r5   rj   s     r   (test_10_callback_mandatory_no_regressionzAWriteBackAndEventTrigger.test_10_callback_mandatory_no_regressionN  s     HHn*'%%)&0z	
 	#?@$ KK//1 ..w779	; 	IIKI$7$7$@A	Cr   c                     t        | j                        j                  d      }| j                  |j                  t
               | j                  |j                         | j                  |j                         y )Nztask-unknownr   )
rw   r3   rx   r^   ry   NO_LEDGER_RECORDr~   r{   r   r|   r   s     r   test_11_no_ledger_record_deferz7WriteBackAndEventTrigger.test_11_no_ledger_record_defer`  sY    "488,11.1I&67##,,-r   N)rR   rS   rT   rl   r   r   r   r   r   r   r   r   r   r   r   rU   r   r   rW   rW   |   sB    C,E29 	3/",9 .B>47$C$.r   rW   c                   $    e Zd Zd Zd Zd Zd Zy)LayerANoCronInvariantsc                    t        j                  t        j                  d            }ddh}t        j                  |      D ]n  }t        |t         j                        rA|j                  D ]2  }| j                  |j                  j                  d      d   dhd       4 t        |t         j                        r| j                  |j                  dd       t        |t         j                        s|j                  }t        |t         j                         s|j"                  }t        |t         j$                        rT|j&                  |v rF| j                  |j&                  |j(                  fdd	       | j                  |j&                  dd
       | j                  |j(                  dd       q t        j                  |      D ]v  }t        |t         j*                        st        |j"                  t,              s9|j"                  j/                         }| j                  d|       | j                  d|       x y )Nr\   r#   os.r   z$Layer A violation: import subprocessz-Layer A violation: from subprocess import ...)r   systemz!Layer A violation: os.system callz$Layer A violation: subprocess.* callPopenzLayer A violation: Popen callzcokacdir --z
--sendfile)astparseCET_SRCri   walk
isinstanceImportnamesr   r0   split
ImportFromassertNotEqualmoduleCallfunc	AttributevalueNameidattrConstantr%   lower)r5   treebanned_modsnoder   fbaselows           r   &test_12_no_cron_side_effects_in_sourcez=LayerANoCronInvariants.test_12_no_cron_side_effects_in_sourcel  s   yy**734#T*HHTN 	D$

+ A$$S)!,|n>
 $/##KKC $)IIa/77D!$1dgg6L++!WWaff-/?? ++ GG\B ''75	> HHTN 	4D$-*

C3 jj&&(  4  s3	4r   c                     | j                  t        j                  t        j	                               j                         t               y r	   )r^   hashlibsha256REG_SRC
read_bytes	hexdigestREG_SHAr4   s    r   test_13_plus44_registry_byte0z4LayerANoCronInvariants.test_13_plus44_registry_byte0  s1    NN7--/0::<g	Gr   c                 @   | j                          t        | j                  dddddddd	       t        | j                        j	                  d	      }t        |d
      }| j                  |d   d       | j                  |d   d       | j                  |d          y )NrN   rQ   r=   r>   rn   rP   rD   ro   r   z2026-05-18 15:00 KST)generated_at_kstrt   ru   rr   rs   rv   )rM   r]   r3   rw   rx   proposal_enveloper^   r~   )r5   r   envs      r   'test_14_proposal_envelope_proposal_onlyz>LayerANoCronInvariants.test_14_proposal_envelope_proposal_only  s    HHn*'%%+&0z		
 #488,11.1I6LM]+Z8[)62_-.r   c                     | j                  t        dd      t               | j                  t        ddd      t               y )Nz	rev-parseHEADz--abbrev-ref)r^   r)   GIT_HEAD_PREGIT_BRANCH_PREr4   s    r   test_15_git_invariantz,LayerANoCronInvariants.test_15_git_invariant  s6    k62LAnf5~	Gr   N)rR   rS   rT   r   r   r  r  rU   r   r   r   r   g  s    
(4VG
/Gr   r   __main__)	verbosity)9__doc__r   r   importlib.utilr
   rf   r#   r   r-   unittestpathlibr   typingr   rc   __file__resolveparentsr   r%   pathinsertr   _reg_cetr2   rL   r]   rw   r   r_   r   r   rz   r   r   r   r   r}   r   r   r   r   rh   r   r   r   r  r  r   r)   TestCaser+   rW   r   rR   mainrU   r   r   <module>r     s?  *      
     X ((+u:SXXHHOOAs5z"3   .13,/1 44 00 00 ** ..  :: #@@ ** 00 $$88 (( !<< ,, (( 
(
8
8
(
:
:I GG	I DD			J	&G
H8j(89 :8 G 
H ,h.u h.VGGU GGT zHMMA r   