
    j3                       d Z ddlmZ ddlZddlmc mZ ddl	Z	e	j                  j                  dd       ddlZddlZddlZddlZej                   j#                  dd       dZej&                  d        Z G d	 d
      Zy)u  v3.6 Integration Test — End-to-End scenario for fake task.

chair_authorization_id=CHAIR-AUTH-TASK-2704-V36-CONTROL-PLANE-P0-MVP-260528

Scenario: task-fake-2704-integration
1. Write dispatch marker → verify marker exists
2. Detect spawn state → WORK_STARTED (after marker + session mock)
3. Watchdog suppression → chat_allowed=False (dispatch marker alive)
4. Closeout marker → signal_anu → ANU signal file written
5. Verify JSONL audit records written
    )annotationsNz/home/jay/workspaceANU_V36_HARNESS_TEST_MODE1ztask-fake-2704-integrationc                N   | dz  }|j                          | dz  }| dz  }|j                          |dz  j                          t        |d      5 }t        j                  dt        ddd	ii|       d d d        t        |      t        |      t        |      | d
S # 1 sw Y   +xY w)Neventsztask-timers.jsonz	.cokacdirschedule_historywtasksrunningFAKE-SCHED-001)statusschedule_id)
events_dirtimers_filecokacdirtmp_path)mkdiropenjsondumpFAKE_TASK_IDstr)r   r   r   r   fhs        =/home/jay/workspace/tests/harness/test_v36_integration_e2e.pyintegration_envr      s    H$J//K+%HNN""))+ 
k3	 2		'#3
 	 *o;'M	  s   "BB$c                  6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	TestEndToEndIntegrationc                   ddl m}  |t        ddddddd	|d
   	      }d}||u}|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}}|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }dd|iz  }t        t        j                  |            dx}}|d   }d}	||	k(  }|slt        j                  d|fd||	f      t        j                  |      t        j                  |	      dz  }
dd|
iz  }t        t        j                  |            dx}x}}	t        j                  |d
         }|D cg c]	  }d|v s| }}t        |      }d}||k\  }|st        j                  d |fd!||f      d"t        j                         v st        j                  t              rt        j                  t              nd"d#t        j                         v st        j                  |      rt        j                  |      nd#t        j                  |      t        j                  |      d$z  }t        j                  d%      d&z   d'|iz  }t        t        j                  |            dx}x}}yc c}w )(z,Step 1: Write dispatch marker for fake task.r   write_dispatch_markerr   zdev1-team/integration-testztest-bot-key-integration2026-05-28T13:00:00+09:00z%Integration test prompt for fake taskNdispatch_pyr   	task_idr   executorbot_key	fire_timeprompttask_md_sha_beforedispatch_methodr   is notz%(py0)s is not %(py3)sresultpy0py3z$Dispatch marker write should succeedz
>assert %(py5)spy5r$   ==z%(py1)s == %(py3)sr   py1r1   assert %(py5)sr   z%(py1)s == %(py4)sr7   py4assert %(py6)spy6
dispatched   >=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)slendispatch_files)r0   r7   r1   r=   z'Dispatch marker file must exist on diskz
>assert %(py8)spy8)*scripts.harness.v36.dispatch_marker_writerr    r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgAssertionError_format_explanationoslistdirrB   )selfr   r    r.   @py_assert2@py_assert1@py_format4@py_format6@py_assert0@py_assert3@py_format5@py_format7filesfrC   @py_assert5@py_assert4@py_format9s                     r    test_step1_write_dispatch_markerz8TestEndToEndIntegration.test_step1_write_dispatch_marker>   s   T& (1.1:#)&|4

 "IvT!IIIvTIIIIIIvIIIvIIITIII#IIIIIIIi 0 L0000 L000 000000L000L0000000m$8(88$(88888$(8888$888(88888888 

?<89%*@la.?!@@>"RaR"a'RRR"aRRRRRRsRRRsRRRRRR>RRR>RRR"RRRaRRR)RRRRRRRR As   /	M'9M'c           	     8   ddl m}m}m} ddlm} |j                  dg       5   |t        d|d   |d   |d	   
      }ddd       g }d   }d}	||	k7  }
|
}|
s|d   }d}||k\  }|}|st        j                  d|
fd||	f      t        j                  |      t        j                  |	      dz  }dd|iz  }|j                  |       |
s_t        j                  dfdf      t        j                  |      t        j                  |      dz  }dd|iz  }|j                  |       t        j                  |d      i z  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}x}x}
x}	x}x}}y# 1 sw Y   RxY w)u=   Step 2: Detect spawn state — should be at least REGISTERED.r   )detect_spawn_statestate_ge
REGISTEREDN9scripts.harness.v36.spawn_detector._list_claude_processesreturn_valuer   r   r   r   r$   r   r   r   r   stateUNKNOWNsignal_countr?   )!=)z%(py3)s != %(py6)s)r1   r=   z%(py8)srD   r@   )z%(py11)s >= %(py14)s)py11py14z%(py16)spy16z?Should have at least registered state given timer + schedule_idz
>assert %(py19)spy19)"scripts.harness.v36.spawn_detectorra   rb   rc   unittest.mockmockpatchr   rF   rG   rK   append_format_booloprL   rM   rN   )rQ   r   ra   rb   rc   rr   r.   rS   rR   r\   r]   rV   @py_assert10@py_assert13@py_assert12rY   r^   @py_format15@py_format17@py_format18@py_format20s                        r   (test_step2_detect_spawn_state_registeredz@TestEndToEndIntegration.test_step2_detect_spawn_state_registeredW   s   __$ZZSbdZe 	'$,*<8+M:(4F		
vg 	
) 	
)+ 	
vn/E 	
 	
/E/J 	
 	
 	
) 	
 	
 		  	
 	
 		 #, 	
 	
 	
	6	
		
 	
/E 	
 	
 		 0F 	
 	
 		 JK 	
 	
 	
	6	
		
 	
 	
  N	
 	
 	
 	
 	
 	
 	
	 	s   FFc                B   ddl m} ddlm}m}m} ddlm}  |t        ddddd	dd
|d   	       |j                  ddg      5  |j                  dd      5   |t        d|d   |d   |d         }ddd       ddd       d   } |||      }	|	st        j                  d|d    d|d          dz   dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      dz  }
t!        t        j"                  |
            dx}}	y# 1 sw Y   xY w# 1 sw Y   xY w)zLStep 2b: After dispatch marker written + bot session, state >= WORK_STARTED.r   r   )ra   WORK_STARTEDrb   Nr   	dev1-teamtest-keyr!   test promptr"   r   r#   rd   18b3a030fdc880aere   z7scripts.harness.v36.spawn_detector._get_anu_session_hexaaaa000000000000r   r   rg   rh   zHExpected state >= WORK_STARTED after dispatch marker + bot session, got z: reasonz7
>assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}rb   r   )r0   py2r1   r2   )rE   r    rp   ra   r   rb   rq   rr   r   rs   rF   rL   rH   rI   rJ   rK   rM   rN   )rQ   r   r    ra   r   rb   rr   r.   rS   r]   rU   s              r   0test_step2b_dispatch_marker_elevates_spawn_statezHTestEndToEndIntegration.test_step2b_dispatch_marker_elevates_spawn_statei   s   Taa$ 	 ( 1 #)&|4
	
 ZZG,-  
 	 I/   
 ,( 0.|< / >,Z8	
		$ w 	
x6 	
6 	
  WW]^eWfVggijpqyjzi{|	
 	
	6	
 	
   	
 	
 		  	
 	
 		 ( 	
 	
	6	
 	
  *6 	
 	
 		 *6 	
 	
 		 7 	
 	
 	
 	
 	

 
		 	s$   FF2FF	FFc                   ddl m} ddlm}  |t        dddddd	d
|d   	        |t        ddd|d   ddddd
      }|d   }d}||u }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  d|d    d|d          dz   d|iz  }	t        t        j                  |	            d	x}x}}y	)u:   Step 3: Watchdog sees dispatch marker → chat suppressed.r   r   evaluate_alertr   r   r   r!   r   Nr"   r   r#   '     F
r$   hb_ageev_ageconsecutive_stalled_cyclesr   _override_escalate_marker_override_spawn_ge_work_started_override_bot_session_active_override_worktree_mtime_lt_900_override_artifact_mtime_lt_900chat_allowedisz%(py1)s is %(py4)sr:   z>chat must be suppressed when dispatch marker present. verdict=verdictz
, signals=alive_signalsz
>assert %(py6)sr=   )rE   r    -scripts.harness.v36.watchdog_suppression_gater   r   rF   rG   rK   rL   rM   rN   )
rQ   r   r    r   r.   rV   rW   rR   rX   rY   s
             r   *test_step3_watchdog_suppression_chat_falsezBTestEndToEndIntegration.test_step3_watchdog_suppression_chat_false   s   TP 	 ( 1 #)&|4
	
   '(&|4&+,1).,1,1
 n% 	
 	
%. 	
 	
% 	
 	
 
	 & 	
 	
 
	 */ 	
 	
 i()F?4K3LN	
 	
 	
 	
 	
 	
    c                	   ddl m}m}m}m} |d   }t
        j                  j                  |t         d      }t        |d      5 }t        j                  t        dd|       ddd        |t        |	      }	|	d
   }
|
|k(  }|st        j                  d|fd|
|f      t        j                  |
      dt        j                          v st        j"                  |      rt        j                  |      nddz  }dd|iz  }t%        t        j&                  |            dx}
} |t        |d|      }d}||u}|st        j                  d|fd||f      dt        j                          v st        j"                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t%        t        j&                  |            dx}}t
        j                  j                  |t         d| d      }t
        j                  }|j(                  } ||      }|s t        j*                  d      dz   dt        j                          v st        j"                  t
              rt        j                  t
              ndt        j                  |      t        j                  |      dt        j                          v st        j"                  |      rt        j                  |      ndt        j                  |      dz  }t%        t        j&                  |            dx}x}}t        |      5 }t        j,                  |      }ddd       d   }
|
t        k(  }|st        j                  d|fd|
t        f      t        j                  |
      dt        j                          v st        j"                  t              rt        j                  t              nddz  }dd|iz  }t%        t        j&                  |            dx}
}|d    }
|
|k(  }|st        j                  d|fd|
|f      t        j                  |
      d!t        j                          v st        j"                  |      rt        j                  |      nd!dz  }dd|iz  }t%        t        j&                  |            dx}
}y# 1 sw Y   YxY w# 1 sw Y   zxY w)"u:   Step 4: Closeout marker → signal_anu writes signal file.r   )detect_closeout_state
signal_anuWORK_CLOSEOUT_STARTEDANU_RECEIVEDr   .harness-mvp-active.jsonr	   active)r$   r   Nr   rh   r3   r5   r   r6   r8   r2      )r$   rh   priorityr   r+   r-   signalr/   .anu-signal-.jsonzANU signal file must be writtend
>assert %(py7)s
{%(py7)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.isfile
}(%(py5)s)
}rO   signal_pathr0   r   r;   r2   py7r$   r   closeout_stater   )+scripts.harness.v36.closeout_marker_watcherr   r   r   r   rO   pathjoinr   r   r   r   rF   rG   rK   rH   rI   rJ   rM   rN   isfilerL   load)rQ   r   r   r   r   r   r   closeout_markerr   r.   rV   rR   rT   rU   r   rS   r   rW   @py_assert6@py_format8signal_datas                        r   %test_step4_closeout_marker_signal_anuz=TestEndToEndIntegration.test_step4_closeout_marker_signal_anu   s   	
 	
 %\2
 '',,zl^C[3\]/3' 	I2II,(CRH	I '|
Kg7"77777"7777777777"7777"77777777  !	
 "!vT!!!!vT!!!!!!v!!!v!!!T!!!!!!! ggll:,|L>Y^/_`wwMw~~M~k*M*MM,MMMMMMMrMMMrMMMwMMM~MMMMMMkMMMkMMM*MMMMMM+ 	("))B-K	(9%5%5555%555%5555555555555555+,<,<<<<,<<<,<<<<<<<<<<<<<<<</	I 	I(	( 	(s   R:9S:SSc           	        ddl m}  |dt        ddddd	       d
}t        j                  }|j
                  } ||      }|s t        j                  d      dz   dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            dx}x}}t        |      5 }|j                         }	ddd       	s{t        j                  d      dz   ddt        j                         v st        j                  |	      rt        j                  |	      ndiz  }
t        t        j                  |
            t!        j"                  |	d         }g d}|D ]  }||v }|st        j$                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  |      rt        j                  |      nddz  }t        j                  d|       dz   d|iz  }t        t        j                  |            d} |d   }d }||k(  }|slt        j$                  d!|fd"||f      t        j                  |      t        j                  |      d#z  }d$d%|iz  }t        t        j                  |            dx}x}}y# 1 sw Y   xY w)&z=Step 5: JSONL audit records are written to /tmp in test mode.r   )log_runtime_eventmarker_writtenz/tmp/test-marker.jsonr   r"   a3f8c2e1b6d94f27)marker_pathr   r*   bot_key_hash)
event_typer$   payloadz$/tmp/v36_harness_decision_test.jsonlzRJSONL audit file should exist in test mode at /tmp/v36_harness_decision_test.jsonlr   rO   
jsonl_pathr   Nz*JSONL file should have at least one recordz
>assert %(py0)sr0   lines)schema_versiondecision_idtsr$   contract_layerdecision_classevidencedecision_outcomeactor_attributionreason_codechair_authorization_idin)z%(py0)s in %(py2)sfieldlast_record)r0   r   z%JSONL record missing required field: z
>assert %(py4)sr;   r   zv36.runtime_harness.decision.v1r3   r9   r:   r<   r=   )+scripts.harness.v36.runtime_decision_loggerr   r   rO   r   r   rF   rL   rH   rI   rJ   rK   rM   rN   r   	readlinesr   loadsrG   )rQ   r   r   r   rS   rW   r   r   r   r   @py_format1r   required_fieldsr   @py_format3rX   rV   rR   rY   s                      r   &test_step5_jsonl_audit_records_writtenz>TestEndToEndIntegration.test_step5_jsonl_audit_records_written   s   Q' 6/#0 2			
 <
ww 	
w~~ 	
~j) 	
) 	
  a	
 	
	6	
 	
   	
 	
 		  	
 	
 		  	
 	
 		  	
 	
	6	
 	
  ) 	
 	
 		 ) 	
 	
 		 * 	
 	
 	
 	
 	

 * 	#LLNE	#BBBBBBBBBuBBBuBBBBBjjr+
 % 	YEK'XXX5KXXXXXX5XXX5XXXXXXKXXXKXXXX+PQVPW)XXXXXXX	Y +,Q0QQ,0QQQQQ,0QQQQ,QQQ0QQQQQQQQ	# 	#s   M66N c                R   ddl m} ddlm} ddlm} ddlm} ddlm	}m
}m} |d   }	 |t        dd	d
dddd|		      }
d}|
|u}|st        j                  d|fd|
|f      dt        j                          v st        j"                  |
      rt        j$                  |
      ndt        j$                  |      dz  }dd|iz  }t'        t        j(                  |            dx}}|j+                  dg       5   |t        d|	|d   |d         }ddd       d}|v }|st        j                  d|fd||f      t        j$                  |      dt        j                          v st        j"                  |      rt        j$                  |      nddz  }dd|iz  }t'        t        j(                  |            dx}} |t        ddd |	d!d!d!d!d!"
      }|d#   }d!}||u }|slt        j                  d$|fd%||f      t        j$                  |      t        j$                  |      d&z  }d'd(|iz  }t'        t        j(                  |            dx}x}}t,        j.                  j1                  |	t         d)      }t3        |d*      5 }t5        j6                  d+t        i|       ddd        |t        |	,      }d}||v }|st        j                  d|fd||f      t        j$                  |      d-t        j                          v st        j"                  |      rt        j$                  |      nd-dz  }dd|iz  }t'        t        j(                  |            dx}} |t        |d |	,      }d}||u}|st        j                  d|fd||f      d.t        j                          v st        j"                  |      rt        j$                  |      nd.t        j$                  |      dz  }dd|iz  }t'        t        j(                  |            dx}}t,        j.                  }|j8                  } ||      }|sd/d0t        j                          v st        j"                  t,              rt        j$                  t,              nd0t        j$                  |      t        j$                  |      d1t        j                          v st        j"                  |      rt        j$                  |      nd1t        j$                  |      d2z  }t'        t        j(                  |            dx}x}}t,        j.                  }|j8                  }t,        j.                  }|j0                  }t         d3| d4} ||	|      } ||      }|sd5d0t        j                          v st        j"                  t,              rt        j$                  t,              nd0t        j$                  |      t        j$                  |      d0t        j                          v st        j"                  t,              rt        j$                  t,              nd0t        j$                  |      t        j$                  |      dt        j                          v st        j"                  |	      rt        j$                  |	      ndt        j$                  |      t        j$                  |      t        j$                  |      d6
z  }t'        t        j(                  |            dx}x}x}x}x}x}}y# 1 sw Y   xY w# 1 sw Y   xY w)7uU   Full pipeline: dispatch marker → spawn detect → watchdog → closeout → signal.r   Nr   )ra   r   )r   r   r   r   r   r   ztest-key-pipeliner!   zFull pipeline testr"   r#   r+   r-   markerr/   r8   r2   rd   re   r   r   )r   r   r   r   rh   r   )z%(py1)s in %(py3)sspawn_resultr6   r   r   Fr   r   r   r   r:   r<   r=   r   r	   r$   r   closeout_result
anu_signalzbassert %(py7)s
{%(py7)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.isfile
}(%(py5)s)
}rO   closeout_pathr   r   r   zassert %(py16)s
{%(py16)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.isfile
}(%(py14)s
{%(py14)s = %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s.path
}.join
}(%(py10)s, %(py12)s)
})
})
r0   r   r;   r2   r   py9py10py12rm   rn   )rq   rr   rE   r    rp   ra   r   r   r   r   r   r   r   rF   rG   rH   rI   rJ   rK   rM   rN   rs   rO   r   r   r   r   r   r   ) rQ   r   rr   r    ra   r   r   r   r   r   r   rR   rS   rT   rU   r   rV   watchdog_resultrW   rX   rY   r   r   r   r   r   r   @py_assert8@py_assert11rw   @py_assert15rz   s                                    r    test_full_pipeline_no_exceptionsz8TestEndToEndIntegration.test_full_pipeline_no_exceptions  s   $TIPoo$\2
 ' ( '1'#)!

 "!vT!!!!vT!!!!!!v!!!v!!!T!!!!!!! ZZSbdZe 	-,%+M:(4L	 &w,&&&&w,&&&w&&&&&&,&&&,&&&&&&& ) '(!&+,1).,1,1
 ~.7%7.%7777.%777.777%7777777 ZL>AY1Z[-% 	5IIy,/4	5 0T)w/))))w/)))w))))))/)))/)))))))  lA*U
!%%z%%%%z%%%%%%z%%%z%%%%%%%%%% ww,w~~,~m,,,,,,,,r,,,r,,,w,,,~,,,,,,m,,,m,,,,,,,,,,wwiw~~ibggiglli,|T`Saaf7gil:7ghi~hiiiiiiiiriiiriiiwiii~iiiiiibiiibiiigiiiliiiiii:iii:iii7giiihiiiiiiiiiiiO	 	6	5 	5s   5\\\\&N)
__name__
__module____qualname__r_   r}   r   r   r   r   r    r   r   r   r   <   s-    S2
$(
T"
H$=L$RL@jr   r   )__doc__
__future__r   builtinsrH   _pytest.assertion.rewrite	assertionrewriterF   sysr   insertr   rO   tempfilepytestenviron
setdefaultr   fixturer   r   r   r   r   <module>r      su   
 #   
 ( )  	   

  13 7+
  :Gj Gjr   