
    xji9                        d Z ddlm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Z ed      Z ed      Z ed      Zg d	Zdd
ZddZ G d de	j&                        Zedk(  r e	j,                  d       yy)u  tests/integration/test_axis_2_live_inbound.py — Axis 2 live activation 자동 검증.

task-2649 AXIS_2_CALLBACK_COLLECTOR_CONTROL_PLANE_LIVE_ACTIVATION
task md: memory/tasks/task-2649.md
chair_authorization_id: CHAIR-AUTH-AXIS-2-20260524-JJONGS-INBOUND-001

회장 verbatim 7 필수 검증 자동화:
  1. UserPromptSubmit hook이 callback inbox 감지
  2. RECEIVED_INBOUND_THIS_SESSION 5 조건 자동 검증 가능한 항목
  3. callback_id + schedule_id ↔ ledger row 1:1 매칭
  4. self-attested result만으로 수신 처리 금지
  5. duplicate callback dedupe 처리
  6. Stop hook 미처리 callback 시 종료 차단
  7. hook crash L1 rollback / 5회 연속 실패 L2 rollback 박제 검증

본 dispatch executor 세션은 chair-facing 아니므로 회장-facing 본 세션의 실제 inbound
인식은 별도 회장 본 세션에서 직접 검증한다. 본 테스트는 hooks 3개 + ledger linkage +
dedupe + stop hook block + rollback 트리거 조건을 자동화로 박제한다.
    )annotationsN)Pathz-CHAIR-AUTH-AXIS-2-20260524-JJONGS-INBOUND-001z//home/jay/workspace/.worktrees/task-2644+1-dev4z/home/jay/.claude/hooksz/home/jay/.claude/settings.json)z*session_start_anu_callback_collector_v2.pyz*stop_anu_callback_collector_verifier_v2.pyz,user_prompt_submit_hook_callback_inbox_v2.pyc                    t        t        j                        }t        t              |d<   t        |      |d<   t        |       |d<   |S )N
PYTHONPATHANU_WORKSPACE_ROOTANU_CALLBACK_INBOX_DIR)dictosenvironstrSTAGED_WORKTREE)	inbox_dirworkspace_rootenvs      -tests/integration/test_axis_2_live_inbound.py	_hook_envr   .   sC    
rzz
CO,C #N 3C$'	NC !J    c                B   t        j                  dt        t        | z        gt	        j
                  |      dd|d      }|j                  |j                  |j                  |j                  j                         r!t	        j                  |j                        dS d dS )Npython3T   )inputcapture_outputtextr   timeout)
returncodestdoutstderrparsed)
subprocessrunr   LIVE_HOOKS_DIRjsondumpsr   r   r   striploads)	hook_namestdin_payloadr   procs       r   	_run_hookr)   6   s    >>	C234jj'D oo++++-1[[->->-@$**T[[)	  GK	 r   c                  l    e Zd ZdZed        Zed        Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zy)AxisTwoLiveInboundTestsu,   7 필수 검증 + 5 조건 자동화 박제.c                   t        t        j                  d            | _        | j                  dz  | _        | j                  j                          | j                  dz  | _        | j                  dz  dz  j                  d       | j                  dz  dz  d	z  | _        | j                  j                          | j                  dz  dz  d
z  | _	        | j                  j                          y )Naxis2_live_)prefixinbox	workspacememorysystemT)parentsz.callback_ledger.jsonlz.callback_dedupe_table.jsonl)
r   tempfilemkdtemptmpr/   mkdirr0   ledgertouchdedupeclss    r   
setUpClassz"AxisTwoLiveInboundTests.setUpClassJ   s    x''}=>GGg%			+-		!H	,33D3A]]X-8;SS


]]X-8;YY


r   c                F    t        j                  | j                  d       y )NT)ignore_errors)shutilrmtreer6   r;   s    r   tearDownClassz%AxisTwoLiveInboundTests.tearDownClassV   s    cggT2r   c                    t        d      }| j                  |j                         d       t        j                  |j                  d            }| j                  |d   t               | j                  |d   d       y )NzR/home/jay/workspace/memory/events/chair-authorization-axis-2-signature-260524.jsonzmarker missingutf-8encodingchair_authorization_idaxis_id   )r   
assertTrueis_filer"   r%   	read_textassertEqualCHAIR_AUTH_ID)selfmarkerdatas      r   'test_00_chair_authorization_id_verbatimz?AxisTwoLiveInboundTests.test_00_chair_authorization_id_verbatimZ   so    ?
 	(*:;zz&**G*<=67Gi!,r   c                r    t         D ].  }t        |z  }| j                  |j                         d|        0 y )Nzlive hook missing: )
HOOK_NAMESr!   rJ   rK   )rO   nameps      r   test_00b_live_hooks_3_installedz7AxisTwoLiveInboundTests.test_00b_live_hooks_3_installedd   s9     	GD%AOOAIIK+>tf)EF	Gr   c                D   t        j                  t        j                  d            }t        j                  |d      }t
        D ]  }| j                  ||d|         | j                  d|d          | j                  d|d          | j                  d	|d          y )
NrD   rE   Fensure_asciiu"   settings.json 에 hook 미등록: SessionStarthooksStopUserPromptSubmit)r"   r%   LIVE_SETTINGSrL   r#   rT   assertIn)rO   cfgjoinedrU   s       r   'test_00c_settings_json_hooks_registeredz?AxisTwoLiveInboundTests.test_00c_settings_json_hooks_registeredi   s    jj00'0BCCe4 	UDMM$*LTF(ST	Unc'l3fc'l+(#g,7r   c                b   ddddddddddd	d
d
}| j                   dz  }|j                  t        j                  |d
      d       t	        | j                   | j
                        }t        t        d   i |      }| j                  |d   d|d          | j                  |d          | j                  |d   d   d       |d   d   }| j                  |d   d   d       |d   d   xs i j                  d      }| j                  |       | j                  d|       |j                          y )Nv1zcb-axis2-smoke-001	task-2649zsched-axis2-smoke-001zcron-smoke-001zdev4-vishnu   callback_idschedule_idz2026-05-27T13:00:00+09:00F)
schema_versionri   task_idrj   source_cron_id	owner_keyenvelope_bytesledger_pointerttl_at	processedz?cb-axis2-smoke-001__sched-axis2-smoke-001__260524T1302.callbackrY   rD   rE   rI   r   r   r   msgr   pending_count   itemsri   hookSpecificOutputadditionalContextANU_CALLBACK_INBOX)r/   
write_textr"   r#   r   r0   r)   rT   rM   assertIsNotNonegetr`   unlink)rO   cbfr   resultrw   ctxs          r   1test_01_user_prompt_submit_detects_callback_inboxzIAxisTwoLiveInboundTests.test_01_user_prompt_submit_detects_callback_inboxr   s?   "/"2.&!36 2
 JJZZ	TZZ7'J

DNN3:a="c2-qfX6FGVH-.)/:A>x )q-02FGh 45;@@ATUS!*C0	
r   c                    g d}| j                  t        |      d       t        d      }t        j                  |j                  d            }|d   }| j                  t        |d         d       y)	uh   5 조건은 회장 본 세션에서 직접 검증. 본 테스트는 조건 5개의 정의 박제 검증.)u1   UserPromptSubmit hook 이 .callback 파일 인식uG   callback 파일 내 ledger_pointer 가 Axis 1 ledger row 와 1:1 매칭uA   ledger row 의 source_attribution == CALLBACK_COLLECTOR_PROCESSEDu<   본 ANU 세션이 callback 정보를 응답에 직접 활용u_   본 ANU 세션이 callback 에 대한 next_action 을 본 세션 내에서 실행 또는 결정   l/home/jay/workspace/memory/events/chair-signature-packet-axis-2-callback-collector-control-plane-260524.jsonrD   rE   6field_05_received_inbound_this_session_claim_condition.after_axis_2_live_activation_allowed_conditionN)rM   lenr   r"   r%   rL   )rO   
conditionsrP   packetfield_05s        r   0test_02_received_inbound_5_conditions_documentedzHAxisTwoLiveInboundTests.test_02_received_inbound_5_conditions_documented   st    

 	Z!,Y
 F,,g,>?RSX&VWXZ[\r   c                   i ddddddddd	d
dddddddddddddddddddddddddi}| j                   j                  dd      5 }|j                  t        j                  |d      d z          d d d        dddddd!dd"}| j
                  d#z  }|j                  t        j                  |d      d       t        | j
                  | j                        }t        t        d$   i |      }| j                  |d%   d&|d'   (       |d)   d*   }| j                  |d&   d   d       | j                   j                  d      j                         D cg c]'  }|j                         rt        j                  |      ) }	}|	D 
cg c]  }
|
d   dk(  r
|
d   dk(  r|
 }}
| j                  t!        |      d+       |j#                          y # 1 sw Y   _xY wc c}w c c}
w ),Nschemazcallback_ledger.v2ri   zcb-axis2-match-001rj   zsched-axis2-match-001rl   rf   source_attributionCALLBACK_COLLECTOR_PROCESSEDactual_owner_key_verifiedTenvelope_parsedcontext_recoveredterminal_state_classifiednext_action_decided
BATCH_WAITauto_action_dispatchedFchair_report_emittednoop_terminal_recordedbatch_wait_recordedcallback_ledger_writtennext_action_resultOKhelper_integration_status	availablewrD   rE   rY   
rh   )ri   rl   rj   rp   rr   z:cb-axis2-match-001__sched-axis2-match-001__260524.callbackrI   r   r   r   rs   r   rw   rv   )r8   openwriter"   r#   r/   r{   r   r0   r)   rT   rM   rL   
splitlinesr$   r%   r   r~   )rO   
ledger_rowfhr   r   r   r   rw   linerowsrmatchess               r   1test_03_callback_id_schedule_id_ledger_one_to_onezIAxisTwoLiveInboundTests.test_03_callback_id_schedule_id_ledger_one_to_one   s   
*
/
 2
 {	

 !"@
 (
 t
  
 (
 "<
 %e
 #E
 %e
 "4
 &t
  !$!
" (+t)<#

& [[cG4 	HHHTZZ
?$FG	H 0"236 	
 JJUU	TZZ7'J

DNN3:a="c2-qfX6FGx )q-02FG --w-?JJL
zz| JJt
 
 
#77- $;; 
 
 	Wq)	
E	H 	H,


s   *G#,G)G.G&c                $   t        | j                  | j                        }t        | j                        |d<   d|d<   d|d<   dddddd	d	d	ddd
d ddid}| j                  j                  dd      5 }|j                  t        j                  |d	      dz          d d d        t        t        d   dddd|      }| j                  |d   d|d          | j                  |d   d          | j                  d|d   d          y # 1 sw Y   kxY w)NANU_CALLBACK_LEDGER_PATHu   callback 수신 완료ANU_LAST_OUTPUT_TEXTANU_CALLBACK_COLLECTORCOKACDIR_MODEzcb-axis2-self-attest-001Tr   Fr   r   )ri   r   r   r   r   r   r   r   r   r   r   r   r   r   rD   rE   rY   r   rv   collector_moderi   last_output_textr   )r   rI   r   rs   r   block2RECEIVED_PHRASE_WITHOUT_INBOUND_SOURCE_ATTRIBUTIONfailures)r   r/   r0   r   r8   r   r   r"   r#   r)   rT   r`   rJ   )rO   r   bad_rowr   r   s        r   ?test_04_self_attested_result_without_source_attribution_blockedzWAxisTwoLiveInboundTests.test_04_self_attested_result_without_source_attribution_blocked   s:   

DNN3*-dkk*:&'&>"#7O 6#!%)-#/&+$)&+#''+"&"&*5t)<
 [[cG4 	EHHTZZe<tCD	E qM"&9$<
 
 	f\*Fx8HIx(12@8Z(	
	E 	Es   2*DDc           	     d   ddddddd}| j                   dz  }| j                   dz  }|j                  t        j                  |d	      d
       |j                  t        j                  |d	      d
       t	        | j                   | j
                        }t        t        d   i |      }|d   d   }i }|D ]2  }|j                  |j                  d      g       j                  |       4 |j                         D 	
cg c]  \  }	}
t        |
      dkD  s|	 }}	}
| j                  |dg       | j                  j                  dd
      5 }|j!                  t        j                  ddddd	      dz          d d d        | j                  j#                  d
      j%                         D cg c]'  }|j'                         rt        j(                  |      ) }}| j                  t        |      d       |j+                          |j+                          y c c}
}	w # 1 sw Y   xY wc c}w )Nzcb-axis2-dup-001rf   zsched-axis2-dup-001rh   )ri   rl   rj   rp   z8cb-axis2-dup-001__sched-axis2-dup-001__260524-A.callbackz8cb-axis2-dup-001__sched-axis2-dup-001__260524-B.callbackFrY   rD   rE   rI   r   rw   ri   rv   az2026-05-24T13:02:00+09:00)ri   first_seen_atduplicate_countr   )r/   r{   r"   r#   r   r0   r)   rT   
setdefaultr}   appendrw   r   rM   r:   r   r   rL   r   r$   r%   r~   )rO   r   f1f2r   r   rw   seenitkvdupsr   lr   s                  r   !test_05_duplicate_callback_dedupez9AxisTwoLiveInboundTests.test_05_duplicate_callback_dedupe  s   -"014	
 ZZTTZZTT
djj%87K
djj%87K

DNN3:a="c2x ) 	BBOOBFF=126==bA	B"jjl9dac!fqj99 	 234[[cG4 	HH

'9)D+,
 "' 
	 [[**G*<GGI
wwy JJqM
 

 	TA&
		
		1 :
	 	
s   HH.H!1,H-!H*c                >   t        | j                  | j                        }t        | j                        |d<   d|d<   ddddd dddddd d}| j                  j                  dd	      5 }|j                  t        j                  |d
      dz          d d d        t        t        d   dddd|      }| j                  |d   d          | j                  d|d   d          | j                  d|d   d          | j                  d|d   d          y # 1 sw Y   xY w)Nr   r   r   zcb-axis2-unproc-001F)ri   r   r   r   r   r   r   r   r   r   r   r   rD   rE   rY   r   rv   T r   r   r    MISSING_CALLBACK_ENVELOPE_PARSEDr   MISSING_CONTEXT_RECOVEREDMISSING_NEXT_ACTION_DECIDED)r   r/   r0   r   r8   r   r   r"   r#   r)   rT   rJ   r`   )rO   r   badr   r   s        r   -test_06_stop_hook_blocks_unprocessed_callbackzEAxisTwoLiveInboundTests.test_06_stop_hook_blocks_unprocessed_callback3  s7   

DNN3*-dkk*:&'7O 1$!&).#'&+$)&+#(',"&
 [[cG4 	AHHTZZ%84?@	A qM"&4$&
 
 	x(128&:J::VW16(3CJ3OP3VH5Ej5QR	A 	As   )*DDc                   t        d      }t        j                  |j                  d            }|d   }| j	                  t        |d         d       | j	                  t        |d         d       | j                  d|d	          | j                  d
|d          t        d      }| j                  |j                         d       y )Nr   rD   rE   &field_08_failure_fallback_and_rollbackL1_failure_trigger_30sec   L2_failure_trigger_5minu   자동 제거L1_rollback_actionu   비활성화L2_rollback_actionz?/home/jay/.claude/settings.json.bak.task-2649-pre-axis-2-260524z#L1 rollback baseline backup missing)	r   r"   r%   rL   rM   r   r`   rJ   rK   )rO   rP   r   fbbaks        r   .test_07_hook_crash_rollback_trigger_documentedzFAxisTwoLiveInboundTests.test_07_hook_crash_rollback_trigger_documentedW  s    Y
 F,,g,>?<=R :;<a@R 9:;Q?or*>'?@nb)=&>?TU'LMr   N)__name__
__module____qualname____doc__classmethodr=   rB   rR   rW   rc   r   r   r   r   r   r   r    r   r   r+   r+   G   sf    6	 	 3 3-G
8@]$6p&
P-^"SHNr   r+   __main__rI   )	verbosity)r   r   r   r   returnr	   )r&   r   r'   r	   r   r	   r   r	   )r   
__future__r   r"   r
   r@   r   sysr4   unittestpathlibr   rN   r   r!   r_   rT   r   r)   TestCaser+   r   mainr   r   r   <module>r      s   & #  	   
    @HI/067
"\Nh// \N~ zHMMA r   