Ë
    ÛJêjó*  ã                   óR  — d Z ddlZddlmc mZ ddlZddlm	Z	 ddl
mZ ddlmZmZmZmZmZmZ ddlmZ ddlmZmZ dded	ed
ededef
d„Zej6                  defd„«       Z G d„ d«      Z G d„ d«      Z G d„ d«      Z G d„ d«      Z  G d„ d«      Z! G d„ d«      Z" G d„ d«      Z#y)z-Tests for the PtahBridge orchestration layer.é    N)ÚAgentResult)ÚSQLiteDatabase)Ú
PtahBridgeÚRoadmapÚRoadmapStatusÚRoadmapStepÚ
StepResultÚ
StepStatus)ÚApprovalManager)ÚAuditEventTypeÚ
AuditQueryÚstep_idÚroleÚdescriptionÚkwargsÚreturnc                 ó(   — t        d| ||xs | dœ|¤ŽS )N)Úidr   r   © )r   )r   r   r   r   s       ú8/home/oem/CyberBrain26-unified/tests/test_ptah_bridge.pyÚ_stepr      s   € ÜÐ[˜'¨¸+Ò:PÈÑ[ÐTZÑ[Ð[ó    c                  ó   — t        «       S ©N)r   r   r   r   Úbridger      s
   € ä‹<Ðr   c                   ó\   — e Zd Zdeddfd„Zdeddfd„Zdeddfd„Zdeddfd„Zdeddfd„Zy)	ÚTestRoadmapManagementr   r   Nc                 ó
  — |j                  dd«      }t        |t        «      }|�sd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dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }t        t        j                  |«      «      ‚d }|j                  }d}||k(  }|s­t        j                  d|fd	||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      d
œz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }d}||k(  }|s­t        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      d
œz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }t        j                  }	||	u }|söt        j                  d|fd||	f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |	«      dœz  }
dd|
iz  }t        t        j                  |«      «      ‚d x}x}}	|j                   }d} ||«      }	|	|u }|�st        j                  d|fd|	|f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      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}x}x}	}y )NÚr1zTest Roadmapú5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}Ú
isinstanceÚroadmapr   ©Úpy0Úpy1Úpy2Úpy4©ú==)z*%(py2)s
{%(py2)s = %(py0)s.id
} == %(py5)s©r$   r&   Úpy5úassert %(py7)sÚpy7)z,%(py2)s
{%(py2)s = %(py0)s.name
} == %(py5)s©Úis)zK%(py2)s
{%(py2)s = %(py0)s.status
} is %(py6)s
{%(py6)s = %(py4)s.PENDING
}r   ©r$   r&   r'   Úpy6úassert %(py8)sÚpy8)zQ%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get_roadmap
}(%(py4)s)
} is %(py8)sr   )r$   r&   r'   r1   r3   zassert %(py10)sÚpy10)Úcreate_roadmapr!   r   Ú@py_builtinsÚlocalsÚ
@pytest_arÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationr   Ú_call_reprcompareÚnameÚstatusr   ÚPENDINGÚget_roadmap)Úselfr   r"   Ú@py_assert3Ú@py_format5Ú@py_assert1Ú@py_assert4Ú@py_format6Ú@py_format8Ú@py_assert5Ú@py_format7Ú@py_format9Ú@py_assert7Ú@py_format11s                 r   Ú&test_create_roadmap_returns_registeredz<TestRoadmapManagement.test_create_roadmap_returns_registered   s¶  € Ø×'Ñ'¨¨nÓ=ˆÜ˜'¤7Ó+Ð+Ò+×+×+×+×+Õ+Œz×+×+Ó+Œz×+×+×+×+×+Ò+˜'×+×+Ó+˜'×+×+×+×+×+Ò+¤7×+×+Ó+¤7×+×+Ô+Ð+×+×+×+×+×+Ð+Ø�z‰zÐ!˜TÐ!ˆz˜TÑ!×!×!Õ!ˆz˜T×!×!×!×!×!Ñ!ˆw×!×!Ó!ˆw×!×!Ô!ˆz×!×!Ò!˜T×!×!×!×!×!×!Ó!Ø�|‰|Ð-˜~Ð-ˆ|˜~Ñ-×-×-Õ-ˆ|˜~×-×-×-×-×-Ñ-ˆw×-×-Ó-ˆw×-×-Ô-ˆ|×-×-Ò-˜~×-×-×-×-×-×-Ó-Ø�~‰~Ð6¤×!6Ñ!6Ð6ˆ~Ð!6Ð6×6×6Õ6ˆ~Ð!6×6×6×6×6×6Ñ6ˆw×6×6Ó6ˆw×6×6Ô6ˆ~×6×6×6×6×6Ð6¤×6×6Ó6¤×6×6Ô6Ð!6×6×6×6×6×6×6Ó6Ø×!Ñ!Ð2 $Ð2Ñ! $Ó'Ð2Ð'¨7Ð2×2×2Ö2Ð'¨7×2×2×2×2×2Ñ2ˆv×2×2Ó2ˆv×2×2Ô2Ð!×2×2Ò2 $×2×2Ò2Ð'×2×2×2×2×2Ð2¨7×2×2Ó2¨7×2×2×2×2×2×2×2Ð2r   c                 óþ  — |j                   }d} ||«      }d }||u }|sÕt        j                  d|fd||f«      dt        j                  «       v st        j
                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}y )NÚmissingr.   )zQ%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get_roadmap
}(%(py4)s)
} is %(py9)sr   ©r$   r&   r'   r1   Úpy9úassert %(py11)sÚpy11)	rA   r8   r=   r6   r7   r9   r:   r;   r<   ©	rB   r   rE   rC   rI   Ú@py_assert8rL   Ú@py_format10Ú@py_format12s	            r   Ú%test_get_roadmap_unknown_returns_nonez;TestRoadmapManagement.test_get_roadmap_unknown_returns_none%   sž   € Ø×!Ñ!Ð4 )Ð4Ñ! )Ó,Ð4°Ð4Ð,°Ð4×4×4Õ4Ð,°×4×4×4×4×4Ñ4ˆv×4×4Ó4ˆv×4×4Ô4Ð!×4×4Ò4 )×4×4Ò4Ð,×4×4Ò4°×4×4×4×4×4×4×4Ð4r   c                 óÎ  — |j                   } |«       }g }||k(  }|sÁt        j                  d|fd||f«      dt        j                  «       v st        j
                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}}y )Nr(   )zL%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.list_roadmaps
}()
} == %(py7)sr   )r$   r&   r'   r-   úassert %(py9)srR   )	Úlist_roadmapsr8   r=   r6   r7   r9   r:   r;   r<   )rB   r   rE   rC   Ú@py_assert6rI   rH   rW   s           r   Útest_list_roadmaps_emptyz.TestRoadmapManagement.test_list_roadmaps_empty(   s‰   € Ø×#Ñ#Ð+Ñ#Ó%Ð+¨Ð+Ð%¨Ñ+×+×+Õ+Ð%¨×+×+×+×+×+Ñ+ˆv×+×+Ó+ˆv×+×+Ô+Ð#×+×+Ò+Ð%×+×+Ò+¨×+×+×+×+×+×+Ö+r   c           	      óì  — |j                  dd«       |j                  dd«       |j                  } |«       }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                  |«      t        j                  |«      t        j                  |«      d
œz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}y )Nr   ÚAÚr2ÚBé   r(   )zk%(py7)s
{%(py7)s = %(py0)s(%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.list_roadmaps
}()
})
} == %(py10)sÚlenr   )r$   r%   Úpy3r+   r-   r4   úassert %(py12)sÚpy12)r5   r\   rd   r8   r=   r6   r7   r9   r:   r;   r<   )	rB   r   Ú@py_assert2rF   r]   Ú@py_assert9rV   rM   Ú@py_format13s	            r   Útest_list_roadmaps_returns_allz4TestRoadmapManagement.test_list_roadmaps_returns_all+   sâ   € Ø×Ñ˜d CÔ(Ø×Ñ˜d CÔ(Ø×'Ñ'Ð/Ñ'Ó)Ð/ŒsÐ)Ó*Ð/¨aÐ/Ð*¨aÑ/×/×/Ö/Ð*¨a×/×/×/×/×/Ñ/Œs×/×/Ó/Œs×/×/×/×/×/Ò/�6×/×/Ó/�6×/×/Ô/Ð'×/×/Ò/Ð)×/×/Ò/Ð*×/×/Ò/¨a×/×/×/×/×/×/×/Ð/r   c                 óº   — t        dd«      t        dd«      g}t        j                  t        d¬«      5  |j	                  dd|«       d d d «       y # 1 sw Y   y xY w)NÚs1ÚplannerÚcoderzduplicate step id©Úmatchr   ÚDup)r   ÚpytestÚraisesÚ
ValueErrorr5   )rB   r   Ústepss      r   Ú.test_create_roadmap_rejects_duplicate_step_idszDTestRoadmapManagement.test_create_roadmap_rejects_duplicate_step_ids0   sU   € ä�$˜	Ó"Ü�$˜Ó ð
ˆô �]‰]œ:Ð-@ÔAñ 	6Ø×!Ñ! $¨¨uÔ5÷	6÷ 	6ñ 	6ús   ´AÁA)	Ú__name__Ú
__module__Ú__qualname__r   rN   rY   r^   rk   rw   r   r   r   r   r      sb   „ ð3¸Zð 3ÈDó 3ð5¸Jð 5È4ó 5ð,¨zð ,¸dó ,ð0°Zð 0ÀDó 0ð
6ÀZð 6ÐTXô 6r   r   c                   ó  — e Zd Zej                  j
                  deddfd„«       Zej                  j
                  deddfd„«       Zej                  j
                  deddfd„«       Z	ej                  j
                  deddfd„«       Z
y)ÚTestStepExecutionr   r   Nc              ƒ   ó´
  K  — t        dd«      }|j                  d|«      ƒ d {  –—† }t        |t        «      }|�sd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dt	        j
                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }t        t        j                  |«      «      ‚d }|j                  }d	}||u }|s­t        j                  d
|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}}d}
g }|j                  }|}|sd}|}|
|v }|�sddt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dœz  }	|j                  |	«       |s+ddt        j                  «      iz  }|j                  |«       t        j                  |d«      i z  }t        j                  d|fd|
|f«      t        j                  |
«      |dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}
x}x}x}x}}|j                   }t"        j$                  }||u }|söt        j                  d
|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt	        j
                  «       v st        j                  t"        «      rt        j                  t"        «      ndt        j                  |«      dœz  }dd |iz  }t        t        j                  |«      «      ‚d x}x}}|j&                  }||u }|sÚt        j                  d
|fd!||f«      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d"œz  }d#d$|iz  }t        t        j                  |«      «      ‚d x}}y 7 �Œ1­w)%Nrm   Úghostr   r    r!   Úresultr	   r#   Fr.   ©z/%(py2)s
{%(py2)s = %(py0)s.success
} is %(py5)sr*   r,   r-   zunknown roleÚ ú"%(py7)s
{%(py7)s = %(py5)s.error
}©r+   r-   ú%(py10)sr4   é   ©Úin©z%(py1)s in (%(py13)s)©r%   Úpy13úassert %(py15)sÚpy15©zJ%(py2)s
{%(py2)s = %(py0)s.status
} is %(py6)s
{%(py6)s = %(py4)s.FAILED
}Ústepr
   r0   r2   r3   )z.%(py2)s
{%(py2)s = %(py0)s.result
} is %(py4)s©r$   r&   r'   zassert %(py6)sr1   )r   Úexecute_stepr!   r	   r6   r7   r8   r9   r:   r;   r<   Úsuccessr=   ÚerrorÚappendÚ_format_boolopr?   r
   ÚFAILEDr   )rB   r   rŽ   r   rC   rD   rE   rF   rG   rH   Ú@py_assert0r]   ri   rh   rM   rX   Ú@py_format14Ú@py_format16rI   rJ   rK   s                        r   Útest_execute_step_unknown_rolez0TestStepExecution.test_execute_step_unknown_role:   sÝ  è ø€ ä�T˜7Ó#ˆØ×*Ñ*¨4°Ó6×6ˆÜ˜&¤*Ó-Ð-Ò-×-×-×-×-Õ-Œz×-×-Ó-Œz×-×-×-×-×-Ò-˜&×-×-Ó-˜&×-×-×-×-×-Ò-¤*×-×-Ó-¤*×-×-Ô-Ð-×-×-×-×-×-Ð-Ø�~‰~Ð& Ð&ˆ~ Ð&×&×&Õ&ˆ~ ×&×&×&×&×&Ñ&ˆv×&×&Ó&ˆv×&×&Ô&ˆ~×&×&Ò& ×&×&×&×&×&×&Ó&ØÒ5 &§,¡,Ð5 ,Ð5¡,°"Ð5°"Ð5ˆ~Ð5Ð5×5×5×5×5×5Ñ5 &×5×5Ó5 &×5×5Ô5 ,×5×5×5Ñ5¡,×5×5Ð5°"×5×5×5×5×5×5×5×5Ô5ˆ~×5×5Ô5ˆ~×5×5×5×5×5×5×5Ò5Ø�{‰{Ð/œj×/Ñ/Ð/ˆ{Ð/Ð/×/×/Õ/ˆ{Ð/×/×/×/×/×/Ñ/ˆt×/×/Ó/ˆt×/×/Ô/ˆ{×/×/×/×/×/Ð/œj×/×/Ó/œj×/×/Ô/Ð/×/×/×/×/×/×/Ó/Ø�{‰{Ð$ˆ{˜fÐ$×$×$Õ$ˆ{˜f×$×$×$×$×$Ñ$ˆt×$×$Ó$ˆt×$×$Ô$ˆ{×$×$×$×$×$Ð$˜f×$×$Ó$˜f×$×$×$×$×$×$Ô$ð 7ûs   ‚"U¤U¥T1Uc              ƒ   óÀ  K  — t        dddddi¬«      }|j                  d|«      ƒ d {  –—† }|j                  }d}||u }|s­t        j                  d	|fd
||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }t        j                  }	||	u }|söt        j                  d	|fd||	f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |	«      dœz  }
dd|
iz  }t        t        j                  |«      «      ‚d x}x}}	d}|j                  }||v }|s­t        j                  d|fd||f«      t        j                  |«      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}x}}y 7 �Œ²­w)Nrm   rn   zPlan the taskÚactionÚplan©Úpayloadr   Tr.   r€   r   r*   r,   r-   ©zM%(py2)s
{%(py2)s = %(py0)s.status
} is %(py6)s
{%(py6)s = %(py4)s.COMPLETED
}rŽ   r
   r0   r2   r3   r†   )z,%(py1)s in %(py5)s
{%(py5)s = %(py3)s.data
})r%   re   r+   )r   r�   r‘   r8   r=   r6   r7   r9   r:   r;   r<   r?   r
   Ú	COMPLETEDÚdata)rB   r   rŽ   r   rE   rF   rC   rG   rH   rI   rJ   rK   r–   rh   s                 r   Útest_execute_step_known_rolez.TestStepExecution.test_execute_step_known_roleD   s¤  è ø€ ä�T˜9 oÀÈ&Ð?QÔRˆØ×*Ñ*¨4°Ó6×6ˆØ�~‰~Ð% Ð%ˆ~ Ð%×%×%Õ%ˆ~ ×%×%×%×%×%Ñ%ˆv×%×%Ó%ˆv×%×%Ô%ˆ~×%×%Ò% ×%×%×%×%×%×%Ó%Ø�{‰{Ð2œj×2Ñ2Ð2ˆ{Ð2Ð2×2×2Õ2ˆ{Ð2×2×2×2×2×2Ñ2ˆt×2×2Ó2ˆt×2×2Ô2ˆ{×2×2×2×2×2Ð2œj×2×2Ó2œj×2×2Ô2Ð2×2×2×2×2×2×2Ó2ØÐ$˜Ÿ™Ð$ˆv˜Ð$×$×$Õ$ˆv˜×$×$Ó$ˆv×$×$×$×$×$Ð$˜×$×$Ó$˜×$×$Ô$˜×$×$×$×$×$×$Ô$ð 7ûs   ‚'K©KªJ2Kc              ƒ   ód  K  — t        dddddi¬«      }|j                  d|«      ƒ d {  –—†  |j                  d«      }d }||u}|s™t        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}||k(  }	|	s­t        j                  d|	fd||f«      d
t        j                  «       v st        j                  |«      rt        j                  |«      nd
t        j                  |«      t        j                  |«      dœz  }dd|iz  }
t        t        j                  |
«      «      ‚d x}x}	}y 7 �Œ„­w)Nrm   ro   z
Write coder›   Úcoder�   r   ©úis not)z%(py0)s is not %(py3)sÚrecorded)r$   re   zassert %(py5)sr+   r(   )z/%(py2)s
{%(py2)s = %(py0)s.step_id
} == %(py5)sr*   r,   r-   )r   r�   Ústep_resultr8   r=   r6   r7   r9   r:   r;   r<   r   )rB   r   rŽ   r§   rh   rE   Ú@py_format4rG   rF   rC   rH   s              r   Útest_step_result_recordedz+TestStepExecution.test_step_result_recordedL   s  è ø€ ä�T˜7 L¸8ÀVÐ:LÔMˆØ×!Ñ! $¨Ó-×-Ð-Ø×%Ñ% dÓ+ˆØ#Ð#ˆx˜tÐ#×#×#Õ#ˆx˜t×#×#×#×#×#Ñ#ˆx×#×#Ó#ˆx×#×#Ô#˜t×#×#×#×#×#×#Ñ#Ø×ÑÐ' 4Ð'Ð 4Ñ'×'×'Õ'Ð 4×'×'×'×'×'Ñ'ˆx×'×'Ó'ˆx×'×'Ô'Ð×'×'Ò' 4×'×'×'×'×'×'Ô'ð 	.ûs   ‚'F0©F-ªFF0c              ƒ   ó  K  — |j                   }d} ||«      }d }||u }|sÕt        j                  d|fd||f«      dt        j                  «       v st        j
                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}y ­w)NÚnoper.   )zQ%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.step_result
}(%(py4)s)
} is %(py9)sr   rQ   rS   rT   )	r¨   r8   r=   r6   r7   r9   r:   r;   r<   rU   s	            r   Útest_step_result_unknown_idz-TestStepExecution.test_step_result_unknown_idT   s¢   è ø€ à×!Ñ!Ð1 &Ð1Ñ! &Ó)Ð1¨TÐ1Ð)¨TÐ1×1×1Õ1Ð)¨T×1×1×1×1×1Ñ1ˆv×1×1Ó1ˆv×1×1Ô1Ð!×1×1Ò1 &×1×1Ò1Ð)×1×1Ò1¨T×1×1×1×1×1×1×1Ð1ùs   ‚C?D)rx   ry   rz   rs   ÚmarkÚasyncior   r™   r¢   rª   r­   r   r   r   r|   r|   9   s°   „ Ø‡[�[×Ñð%¸:ð %È$ò %ó ð%ð ‡[�[×Ñð%¸ð %Èò %ó ð%ð ‡[�[×Ñð(°jð (ÀTò (ó ð(ð ‡[�[×Ñð2¸
ð 2Àtò 2ó ñ2r   r|   c                   ó˜  — e Zd Zej                  j
                  deddfd„«       Zej                  j
                  deddfd„«       Zej                  j
                  deddfd„«       Z	ej                  j
                  deddfd„«       Z
ej                  j
                  deddfd„«       Zej                  j
                  deddfd	„«       Zy)
ÚTestRoadmapExecutionr   r   Nc              ƒ   óž   K  — t        j                  t        «      5  |j                  d«      ƒ d {  –—†  d d d «       y 7 Œ# 1 sw Y   y xY w­w)NrP   )rs   rt   ÚKeyErrorÚexecute_roadmap©rB   r   s     r   Ú#test_execute_roadmap_unknown_raisesz8TestRoadmapExecution.test_execute_roadmap_unknown_raisesZ   sC   è ø€ ä�]‰]œ8Ó$ñ 	4Ø×(Ñ(¨Ó3×3Ð3÷	4ð 	4Ø3ø÷	4ð 	4üs)   ‚AœA±?²A¶	A¿AÁA
ÁAc              ƒ   óÎ  K  — t        dddddi¬«      g}|j                  dd|«      }|j                  d«      ƒ d {  –—†  |j                  }t        j
                  }||u }|söt        j                  d	|fd
||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  d   }	|	j                  }
t        j
                  }|
|u }|sÉt        j                  d	|fd|
|f«      t        j                  |	«      t        j                  |
«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}	x}
x}}y 7 �Œ&­w)Nrm   rn   ÚPlanr›   rœ   r�   r   ÚSingler.   rŸ   r"   r   r0   r2   r3   r   )zM%(py3)s
{%(py3)s = %(py1)s.status
} is %(py7)s
{%(py7)s = %(py5)s.COMPLETED
}r
   ©r%   re   r+   r-   r[   rR   )r   r5   r´   r?   r   r    r8   r=   r6   r7   r9   r:   r;   r<   rv   r
   ©rB   r   rv   r"   rE   rI   rC   rJ   rK   r–   rh   r]   rF   rH   rW   s                  r   Ú test_execute_roadmap_single_stepz5TestRoadmapExecution.test_execute_roadmap_single_step_   sv  è ø€ ä�t˜Y¨¸À6Ð8JÔKÐLˆØ×'Ñ'¨¨h¸Ó>ˆØ×$Ñ$ TÓ*×*Ð*Ø�~‰~Ð8¤×!8Ñ!8Ð8ˆ~Ð!8Ð8×8×8Õ8ˆ~Ð!8×8×8×8×8×8Ñ8ˆw×8×8Ó8ˆw×8×8Ô8ˆ~×8×8×8×8×8Ð8¤×8×8Ó8¤×8×8Ô8Ð!8×8×8×8×8×8×8Ó8Ø�}‰}˜QÑÐ>Ð×&Ñ&Ð>¬*×*>Ñ*>Ð>Ð&Ð*>Ð>×>×>Õ>Ð&Ð*>×>×>Ó>Ð×>×>Ò>Ð&×>×>×>×>×>Ð>¬*×>×>Ó>¬*×>×>Ô>Ð*>×>×>×>×>×>×>Ö>ð 	+ûó   ‚:I%¼I"½H&I%c           
   ƒ   ó~  K  — t        dddddi¬«      t        ddd	dd
i¬«      t        ddddddœ¬«      g}|j                  dd|«      }|j                  d«      ƒ d {  –—†  |j                  }t        j
                  }||u }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}d„ |j                  D «       }t        |«      }|s•ddt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      t        j                  |«      dœz  }	t        t        j                  |	«      «      ‚d x}}y 7 �ŒÝ­w)Nrm   rn   r¸   r›   rœ   r�   Ús2ro   ÚCoder¤   Ús3Ú	evaluatorÚEvaluategÍÌÌÌÌÌì?Úevaluate)Úscorer›   ra   ÚMultir.   rŸ   r"   r   r0   r2   r3   c              3   óT   K  — | ]   }|j                   t        j                  u –— Œ" y ­wr   ©r?   r
   r    ©Ú.0Úss     r   ú	<genexpr>zKTestRoadmapExecution.test_execute_roadmap_multiple_steps.<locals>.<genexpr>v   ó   è ø€ ÒK¸�1—8‘8œz×3Ñ3Ô3ÑKùó   ‚&(ú,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úallr�   ©r   r5   r´   r?   r   r    r8   r=   r6   r7   r9   r:   r;   r<   rv   rÐ   ©
rB   r   rv   r"   rE   rI   rC   rJ   rK   rD   s
             r   Ú#test_execute_roadmap_multiple_stepsz8TestRoadmapExecution.test_execute_roadmap_multiple_stepsg   su  è ø€ ô �$˜	 6°H¸fÐ3EÔFÜ�$˜ °(¸FÐ1CÔDÜØØØØ"%°Ñ<ô	ð	
ˆð ×'Ñ'¨¨g°uÓ=ˆØ×$Ñ$ TÓ*×*Ð*Ø�~‰~Ð8¤×!8Ñ!8Ð8ˆ~Ð!8Ð8×8×8Õ8ˆ~Ð!8×8×8×8×8×8Ñ8ˆw×8×8Ó8ˆw×8×8Ô8ˆ~×8×8×8×8×8Ð8¤×8×8Ó8¤×8×8Ô8Ð!8×8×8×8×8×8×8Ó8ÙK¸W¿]¹]ÔKÐKŒsÐKÓKÐKÑK×K×K×K×KÕKŒs×K×KÓKŒs×K×KÔKÐK×K×KÒKÐK×K×K×K×K×KÓKð 	+ûs   ‚AH=ÁH:ÁGH=c           	   ƒ   ó`  K  — t        dddddi¬«      t        ddd	dgdd
i¬«      g}|j                  dd|«      }|j                  d«      ƒ d {  –—†  |j                  }t        j
                  }||u }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}d„ |j                  D «       }t        |«      }|s•ddt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      t        j                  |«      dœz  }	t        t        j                  |	«      «      ‚d x}}y 7 �ŒÝ­w)Nrm   rn   r¸   r›   rœ   r�   r¿   ro   rÀ   r¤   ©Ú
depends_onrž   Úr3ÚDepsr.   rŸ   r"   r   r0   r2   r3   c              3   óT   K  — | ]   }|j                   t        j                  u –— Œ" y ­wr   rÈ   rÉ   s     r   rÌ   zNTestRoadmapExecution.test_execute_roadmap_with_dependencies.<locals>.<genexpr>�   rÍ   rÎ   rÏ   rÐ   r�   rÑ   rÒ   s
             r   Ú&test_execute_roadmap_with_dependenciesz;TestRoadmapExecution.test_execute_roadmap_with_dependenciesx   s`  è ø€ ô �$˜	 6°H¸fÐ3EÔFÜ�$˜ °T°FÀXÈvÐDVÔWð
ˆð ×'Ñ'¨¨f°eÓ<ˆØ×$Ñ$ TÓ*×*Ð*Ø�~‰~Ð8¤×!8Ñ!8Ð8ˆ~Ð!8Ð8×8×8Õ8ˆ~Ð!8×8×8×8×8×8Ñ8ˆw×8×8Ó8ˆw×8×8Ô8ˆ~×8×8×8×8×8Ð8¤×8×8Ó8¤×8×8Ô8Ð!8×8×8×8×8×8×8Ó8ÙK¸W¿]¹]ÔKÐKŒsÐKÓKÐKÑK×K×K×K×KÕKŒs×K×KÓKŒs×K×KÔKÐK×K×KÒKÐK×K×K×K×K×KÓKð 	+ûs   ‚AH.ÁH+ÁGH.c              ƒ   óÎ  K  — t        dddddi¬«      g}|j                  dd|«      }|j                  d«      ƒ d {  –—†  |j                  }t        j
                  }||u }|söt        j                  d|fd	||f«      d
t        j                  «       v st        j                  |«      rt        j                  |«      nd
t        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  d   }	|	j                  }
t        j
                  }|
|u }|sÉt        j                  d|fd|
|f«      t        j                  |	«      t        j                  |
«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}	x}
x}}y 7 �Œ&­w)Nrm   r~   ÚFailr›   rœ   r�   Úr4r.   r�   r"   r   r0   r2   r3   r   )zJ%(py3)s
{%(py3)s = %(py1)s.status
} is %(py7)s
{%(py7)s = %(py5)s.FAILED
}r
   rº   r[   rR   )r   r5   r´   r?   r   r•   r8   r=   r6   r7   r9   r:   r;   r<   rv   r
   r»   s                  r   Ú test_execute_roadmap_failed_stepz5TestRoadmapExecution.test_execute_roadmap_failed_stepƒ   s|  è ø€ ô �$˜ °(¸FÐ1CÔDð
ˆð ×'Ñ'¨¨f°eÓ<ˆØ×$Ñ$ TÓ*×*Ð*Ø�~‰~Ð5¤×!5Ñ!5Ð5ˆ~Ð!5Ð5×5×5Õ5ˆ~Ð!5×5×5×5×5×5Ñ5ˆw×5×5Ó5ˆw×5×5Ô5ˆ~×5×5×5×5×5Ð5¤×5×5Ó5¤×5×5Ô5Ð!5×5×5×5×5×5×5Ó5Ø�}‰}˜QÑÐ;Ð×&Ñ&Ð;¬*×*;Ñ*;Ð;Ð&Ð*;Ð;×;×;Õ;Ð&Ð*;×;×;Ó;Ð×;×;Ò;Ð&×;×;×;×;×;Ð;¬*×;×;Ó;¬*×;×;Ô;Ð*;×;×;×;×;×;×;Ö;ð 	+ûr½   c              ƒ   óÒ  K  — t        ddddgddi¬«      g}|j                  dd	|«      }|j                  d«      ƒ d {  –—†  |j                  }t        j
                  }||u }|söt        j                  d
|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  d   }	|	j                  }
t        j
                  }|
|u }|sÉt        j                  d
|fd|
|f«      t        j                  |	«      t        j                  |
«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}	x}
x}}y 7 �Œ&­w)Nrm   ro   rÀ   rP   r›   r¤   rÕ   Úr5ÚBlockedr.   )zK%(py2)s
{%(py2)s = %(py0)s.status
} is %(py6)s
{%(py6)s = %(py4)s.BLOCKED
}r"   r   r0   r2   r3   r   )zK%(py3)s
{%(py3)s = %(py1)s.status
} is %(py7)s
{%(py7)s = %(py5)s.BLOCKED
}r
   rº   r[   rR   )r   r5   r´   r?   r   ÚBLOCKEDr8   r=   r6   r7   r9   r:   r;   r<   rv   r
   r»   s                  r   Ú)test_execute_roadmap_blocked_dependenciesz>TestRoadmapExecution.test_execute_roadmap_blocked_dependencies�   s�  è ø€ ô �$˜ °Y°KÈ(ÐTZÐI[Ô\ð
ˆð ×'Ñ'¨¨i¸Ó?ˆØ×$Ñ$ TÓ*×*Ð*à�~‰~Ð6¤×!6Ñ!6Ð6ˆ~Ð!6Ð6×6×6Õ6ˆ~Ð!6×6×6×6×6×6Ñ6ˆw×6×6Ó6ˆw×6×6Ô6ˆ~×6×6×6×6×6Ð6¤×6×6Ó6¤×6×6Ô6Ð!6×6×6×6×6×6×6Ó6Ø�}‰}˜QÑÐ<Ð×&Ñ&Ð<¬*×*<Ñ*<Ð<Ð&Ð*<Ð<×<×<Õ<Ð&Ð*<×<×<Ó<Ð×<×<Ò<Ð&×<×<×<×<×<Ð<¬*×<×<Ó<¬*×<×<Ô<Ð*<×<×<×<×<×<×<Ö<ð 	+ûs   ‚<I'¾I$¿H&I')rx   ry   rz   rs   r®   r¯   r   r¶   r¼   rÓ   rÚ   rÞ   rã   r   r   r   r±   r±   Y   s  „ Ø‡[�[×Ñð4À
ð 4Ètò 4ó ð4ð ‡[�[×Ñð?¸Zð ?ÈDò ?ó ð?ð ‡[�[×ÑðLÀ
ð LÈtò Ló ðLð  ‡[�[×ÑðLÀ:ð LÐRVò Ló ðLð ‡[�[×Ñð<¸Zð <ÈDò <ó ð<ð ‡[�[×Ñð=Àjð =ÐUYò =ó ñ=r   r±   c                   ó~   — e Zd Zdeddfd„Zdeddfd„Zdeddfd„Zej                  j                  deddfd„«       Z
y)ÚTestQueryHelpersr   r   Nc                 óþ  — |j                   }d} ||«      }d }||u }|sÕt        j                  d|fd||f«      dt        j                  «       v st        j
                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}y )NrP   r.   )zT%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.roadmap_status
}(%(py4)s)
} is %(py9)sr   rQ   rS   rT   )	Úroadmap_statusr8   r=   r6   r7   r9   r:   r;   r<   rU   s	            r   Útest_roadmap_status_unknownz,TestQueryHelpers.test_roadmap_status_unknownš   sž   € Ø×$Ñ$Ð7 YÐ7Ñ$ YÓ/Ð7°4Ð7Ð/°4Ð7×7×7Õ7Ð/°4×7×7×7×7×7Ñ7ˆv×7×7Ó7ˆv×7×7Ô7Ð$×7×7Ò7 Y×7×7Ò7Ð/×7×7Ò7°4×7×7×7×7×7×7×7Ð7r   c           	      óÒ  — |j                  dd«       |j                  }d} ||«      }t        j                  }||u }|�st	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      t	        j                  |«      t	        j                  |«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      dœz  }dd	|iz  }t        t	        j                  |«      «      ‚d x}x}x}x}}y )
Nr   r`   r.   )zs%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.roadmap_status
}(%(py4)s)
} is %(py10)s
{%(py10)s = %(py8)s.PENDING
}r   r   )r$   r&   r'   r1   r3   r4   rf   rg   )r5   rç   r   r@   r8   r=   r6   r7   r9   r:   r;   r<   )	rB   r   rE   rC   rI   ri   rL   rM   rj   s	            r   Útest_roadmap_status_pendingz,TestQueryHelpers.test_roadmap_status_pending�   sÖ   € Ø×Ñ˜d CÔ(Ø×$Ñ$ÐC TÐCÑ$ TÓ*ÐC¬m×.CÑ.CÐCÐ*Ð.CÐC×C×CÖCÐ*Ð.C×C×C×C×C×CÑCˆv×C×CÓCˆv×C×CÔCÐ$×C×CÒC T×C×CÒCÐ*×C×C×C×C×CÐC¬m×C×CÓC¬m×C×CÔCÐ.C×C×C×C×C×C×C×CÐCr   c                 ó   — |j                   }d} ||«      }g }||k(  }|sÕt        j                  d|fd||f«      dt        j                  «       v st        j
                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}y )Nrn   r(   )zS%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.agent_results
}(%(py4)s)
} == %(py9)sr   rQ   rS   rT   )	Úagent_resultsr8   r=   r6   r7   r9   r:   r;   r<   rU   s	            r   Útest_agent_results_emptyz)TestQueryHelpers.test_agent_results_empty¡   sž   € Ø×#Ñ#Ð4 IÐ4Ñ# IÓ.Ð4°"Ð4Ð.°"Ñ4×4×4Õ4Ð.°"×4×4×4×4×4Ñ4ˆv×4×4Ó4ˆv×4×4Ô4Ð#×4×4Ò4 I×4×4Ò4Ð.×4×4Ò4°"×4×4×4×4×4×4×4Ð4r   c              ƒ   óÞ  K  — t        dddddi¬«      }|j                  d|«      ƒ d {  –—†  |j                  d«      }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  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}}|d   }	t        |	t        «      }|sÞddt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |	«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      dœz  }
t        t	        j                  |
«      «      ‚d x}	}|d   }|j                  }d}||u }|s€t	        j
                  d|fd||f«      t	        j                  |«      t	        j                  |«      t	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}x}}y 7 �ŒÁ­w)Nrm   rn   r¸   r›   rœ   r�   r   r…   r(   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)srd   Úresults©r$   r%   re   r1   r2   r3   r   z5assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}r!   r   )r$   r&   re   r+   Tr.   )z/%(py3)s
{%(py3)s = %(py1)s.success
} is %(py6)s©r%   re   r1   )r   r�   rì   rd   r8   r=   r6   r7   r9   r:   r;   r<   r!   r   r‘   )rB   r   rŽ   rï   rh   rI   rF   rJ   rK   rE   rG   r–   s               r   Útest_agent_results_populatedz-TestQueryHelpers.test_agent_results_populated¤   s¶  è ø€ ä�T˜9 f°xÀÐ6HÔIˆØ×!Ñ! $¨Ó-×-Ð-Ø×&Ñ& yÓ1ˆÜ�7‹|Ð ˜qÐ ˆ|˜qÑ × × Õ ˆ|˜q× × × × × Ñ Œs× × Ó Œs× × × × × Ò �7× × Ó �7× × Ô ˆ|× × Ò ˜q× × × × × × Ó Ø! !™*Ð2Œz˜*¤kÓ2Ð2Ñ2×2×2×2×2Õ2Œz×2×2Ó2Œz×2×2Ô2˜*×2×2×2×2×2Ð2¤k×2×2Ó2¤k×2×2Ô2Ð2×2×2×2×2×2Ò2Ø�q‰zÐ)ˆz×!Ñ!Ð) TÐ)Ð! TÐ)×)×)Õ)Ð! T×)×)Ó)ˆz×)×)Ò)Ð!×)×)Ò) T×)×)×)×)×)×)Ö)ð	 	.ûs   ‚'K-©K*ªKK-)rx   ry   rz   r   rè   rê   rí   rs   r®   r¯   rò   r   r   r   rå   rå   ™   sj   „ ð8°*ð 8Àó 8ðD°*ð DÀó Dð5¨zð 5¸dó 5ð ‡[�[×Ñð*¸ð *Èò *ó ñ*r   rå   c                   ó�   — e Zd Zej                  j
                  deddfd„«       Zej                  j
                  deddfd„«       Zy)ÚTestSecurityPipelineIntegrationr   r   Nc              ƒ   óv  K  — t        dddddi¬«      }|j                  d|«      ƒ d{  –—†  |j                  j                  t	        t
        j                  ¬	«      «      }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  }dd|iz  }t        t        j                  |«      «      ‚dx}x}}|d   }	|	j                   }d}||k(  }|s€t        j                  d|fd||f«      t        j                  |	«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚dx}	x}x}}|d   }	|	j"                  }d}||k(  }|s€t        j                  d|fd||f«      t        j                  |	«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚dx}	x}x}}y7 �Œ�­w)uA   Full pipeline: step dispatch â†’ policy â†’ permission â†’ audit.rm   rn   r¸   r›   rœ   r�   r   N©Ú
event_typer…   ©ú>=©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)srd   Úperm_eventsrð   r2   r3   r   úptah-plannerr(   )z-%(py3)s
{%(py3)s = %(py1)s.actor
} == %(py6)srñ   )z.%(py3)s
{%(py3)s = %(py1)s.action
} == %(py6)s)r   r�   Ú	audit_logÚqueryr   r   ÚPERMISSION_CHECKrd   r8   r=   r6   r7   r9   r:   r;   r<   Úactorr›   )
rB   r   rŽ   rû   rh   rI   rF   rJ   rK   r–   s
             r   Ú%test_execute_step_records_audit_trailzETestSecurityPipelineIntegration.test_execute_step_records_audit_trail¯   s¼  è ø€ ô �T˜9 f°xÀÐ6HÔIˆØ×!Ñ! $¨Ó-×-Ð-à×&Ñ&×,Ñ,Ü¤.×"AÑ"AÔBó
ˆô �;ÓÐ$ 1Ð$Ð 1Ñ$×$×$Õ$Ð 1×$×$×$×$×$Ñ$Œs×$×$Ó$Œs×$×$×$×$×$Ò$�;×$×$Ó$�;×$×$Ô$Ð×$×$Ò$ 1×$×$×$×$×$×$Ó$Ø˜1‰~Ð5ˆ~×#Ñ#Ð5 ~Ð5Ð# ~Ñ5×5×5Õ5Ð# ~×5×5Ó5ˆ~×5×5Ò5Ð#×5×5Ò5 ~×5×5×5×5×5×5Õ5Ø˜1‰~Ð.ˆ~×$Ñ$Ð.¨Ð.Ð$¨Ñ.×.×.Õ.Ð$¨×.×.Ó.ˆ~×.×.Ò.Ð$×.×.Ò.¨×.×.×.×.×.×.Ö.ð 	.ûs   ‚'J9©J6ªJJ9c              ƒ   óp  K  — t        dddddi¬«      t        ddd	dd
i¬«      g}|j                  dd|«      }|j                  d«      ƒ d{  –—†  |j                  j	                  t        t        j                  ¬«      «      }|j                  }t        j                  }||u }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                   |«      ndt        j                   |«      dt        j                  «       v st        j                  t        «      rt        j                   t        «      ndt        j                   |«      dœz  }dd|iz  }	t#        t        j$                  |	«      «      ‚dx}x}}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  }dd|iz  }	t#        t        j$                  |	«      «      ‚dx}
x}}y7 �Œg­w)z=Executing a roadmap with 2 steps should produce audit events.rm   rn   r¸   r›   rœ   r�   r¿   ro   rÀ   r¤   r   Ú	AuditTestNrö   r.   rŸ   r"   r   r0   r2   r3   rc   rø   rú   rd   rû   rð   )r   r5   r´   rý   rþ   r   r   rÿ   r?   r   r    r8   r=   r6   r7   r9   r:   r;   r<   rd   )rB   r   rv   r"   rû   rE   rI   rC   rJ   rK   rh   rF   s               r   Ú*test_full_roadmap_execution_audit_coveragezJTestSecurityPipelineIntegration.test_full_roadmap_execution_audit_coverage¼   s¯  è ø€ ô �$˜	 6°H¸fÐ3EÔFÜ�$˜ °(¸FÐ1CÔDð
ˆð ×'Ñ'¨¨k¸5ÓAˆØ×$Ñ$ TÓ*×*Ð*à×&Ñ&×,Ñ,Ü¤.×"AÑ"AÔBó
ˆð �~‰~Ð8¤×!8Ñ!8Ð8ˆ~Ð!8Ð8×8×8Õ8ˆ~Ð!8×8×8×8×8×8Ñ8ˆw×8×8Ó8ˆw×8×8Ô8ˆ~×8×8×8×8×8Ð8¤×8×8Ó8¤×8×8Ô8Ð!8×8×8×8×8×8×8Ó8Ü�;ÓÐ$ 1Ð$Ð 1Ñ$×$×$Õ$Ð 1×$×$×$×$×$Ñ$Œs×$×$Ó$Œs×$×$×$×$×$Ò$�;×$×$Ó$�;×$×$Ô$Ð×$×$Ò$ 1×$×$×$×$×$×$Ô$ð 	+ûs   ‚A
J6ÁJ3ÁI'J6)	rx   ry   rz   rs   r®   r¯   r   r  r  r   r   r   rô   rô   ®   s[   „ Ø‡[�[×Ñð
/À*ð 
/ÐQUò 
/ó ð
/ð ‡[�[×Ñð%Ø ð%à	ò%ó ñ%r   rô   c                   óN   — e Zd Zej                  j
                  deddfd„«       Zy)ÚTestShutdownr   r   Nc              ƒ   ó@   K  — |j                  «       ƒ d {  –—†  y 7 Œ­wr   )Úshutdownrµ   s     r   Útest_shutdown_no_errorz#TestShutdown.test_shutdown_no_errorÐ   s   è ø€ à�o‰oÓ×Òús   ‚–—)rx   ry   rz   rs   r®   r¯   r   r	  r   r   r   r  r  Ï   s,   „ Ø‡[�[×Ñð °:ð  À$ò  ó ñ r   r  c                   óˆ   — e Zd Zdd„Zej
                  j                  dd„«       Zej
                  j                  dd„«       Zy)ÚTestPersistentPtahBridgeNc                 óª   — t        |dz  «      }t        j                  t        d¬«      5  t	        |t        «       ¬«       d d d «       y # 1 sw Y   y xY w)Núptah.sqlite3z#must share the same SQLite databaserp   )ÚdatabaseÚapproval_manager)r   rs   rt   ru   r   r   )rB   Útmp_pathr  s      r   Ú6test_database_requires_approval_manager_to_share_storezOTestPersistentPtahBridge.test_database_requires_approval_manager_to_share_storeÖ   sF   € Ü! (¨^Ñ";Ó<ˆÜ�]‰]œ:Ð-RÔSñ 	NÜ ¼?Ó;LÕM÷	N÷ 	Nñ 	Nús   ªA	Á	Ac              ƒ   ó8  K  — t        |dz  «      }t        |¬«      }t        dddddi¬«      }|j                  d	|«      ƒ d {  –—† }|j                  }d
}||u }|s­t        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }	dd|	iz  }
t        t        j                  |
«      «      ‚d x}x}}|j                  j                  t        d¬«      «      }|sedddt        j                  «       v st        j                  |«      rt        j                  |«      ndiz  }t        t        j                  |«      «      ‚t        t        |dz  «      ¬«      }t        dddddi¬«      }|j                  d	|«      ƒ d {  –—† }|j                  }d
}||u }|s­t        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }	dd|	iz  }
t        t        j                  |
«      «      ‚d x}x}}|j                   }|j                   }||k(  }|sît        j                  d|fd||f«      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  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j"                  j%                  d«      }g }d }||u}|}|r!|j&                  }|j(                  }d}||k(  }|}|�s€t        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  }
|j+                  |
«       |r´t        j                  dfd"f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  «      t        j                  |«      t        j                  |«      d#œz  }d$d%|iz  }|j+                  |«       t        j,                  |d&«      i z  }d'd(|iz  }t        t        j                  |«      «      ‚d x}x}x}x}x}x}x}}y 7 �ŒQ7 �Œ¾­w))Nr  ©r  zpersistent-steprn   r¸   r›   rœ   r�   zpersistent-roadmapTr.   r€   r   r*   r,   r-   ©Útask_idzassert %(py0)sr$   Útask_eventsÚrestoredr(   )zF%(py2)s
{%(py2)s = %(py0)s.data
} == %(py6)s
{%(py6)s = %(py4)s.data
}r0   r2   r3   z'ptah:persistent-roadmap:persistent-stepÚ	completedr¥   ©z%(py2)s is not %(py5)sÚjob©r&   r+   ú%(py7)s©zN%(py13)s
{%(py13)s = %(py11)s
{%(py11)s = %(py9)s.status
}.value
} == %(py16)s©rR   rT   rŠ   Úpy16ú%(py18)sÚpy18r   úassert %(py21)sÚpy21)r   r   r   r�   r‘   r8   r=   r6   r7   r9   r:   r;   r<   rý   rþ   r   r¡   ÚqueueÚget_jobr?   Úvaluer“   r”   )rB   r  r  ÚfirstrŽ   r   rE   rF   rC   rG   rH   r  Ú@py_format1ÚreopenedÚrestored_stepr  rI   rJ   rK   r  r–   Ú@py_assert10Ú@py_assert12Ú@py_assert15Ú@py_assert14Ú@py_format17Ú@py_format19Ú@py_format20Ú@py_format22s                                r   Ú7test_completed_step_is_restored_without_second_dispatchzPTestPersistentPtahBridge.test_completed_step_is_restored_without_second_dispatchÛ   sV  è ø€ ä! (¨^Ñ";Ó<ˆÜ HÔ-ˆÜÐ&¨	°6ÀHÈfÐCUÔVˆØ×)Ñ)Ð*>ÀÓE×EˆØ�~‰~Ð% Ð%ˆ~ Ð%×%×%Õ%ˆ~ ×%×%×%×%×%Ñ%ˆv×%×%Ó%ˆv×%×%Ô%ˆ~×%×%Ò% ×%×%×%×%×%×%Ó%à—o‘o×+Ñ+¬JÐ?PÔ,QÓRˆÙ××××Öˆ{××Óˆ{×××××ä¤~°hÀÑ6OÓ'PÔQˆÜÐ/°¸FÈXÐW]ÐL^Ô_ˆØ!×.Ñ.Ð/CÀ]ÓS×SˆØ×ÑÐ' 4Ð'Ð 4Ð'×'×'Õ'Ð 4×'×'×'×'×'Ñ'ˆx×'×'Ó'ˆx×'×'Ô'Ð×'×'Ò' 4×'×'×'×'×'×'Ó'Ø�}‰}Ð+ §¡Ð+ˆ} Ñ+×+×+Õ+ˆ} ×+×+×+×+×+Ñ+ˆx×+×+Ó+ˆx×+×+Ô+ˆ}×+×+×+×+×+Ð+ ×+×+Ó+ ×+×+Ô+ ×+×+×+×+×+×+Ó+Ø�n‰n×$Ñ$Ð%NÓOˆÙB˜$ÐBˆs˜$ˆÔB 3§:¡:ÐB :×#3Ñ#3ÐB°{ÐBÐ#3°{Ñ#B×B×B×BÐBˆs˜$×B×B×B×B×BÑBˆs×B×BÓBˆs×B×BÔB˜$×B×B×B×B×B×BÕBÐ#3°{×B×B×B×B×BÑB 3×B×BÓB 3×B×BÔB :×B×BÒBÐ#3×B×BÒB°{×B×B×B×B×B×B×B×B×B×B×B×B×B×Bð Fùð Tûs&   ‚AVÁVÁFVÇVÇN;VÖVc              ƒ   ód	  K  — t        |dz  «      }t        |¬«      }t        dddddi¬«      }d	}|j                  j	                  d
|j
                  d|j
                  ddœdœ|¬«       |j                  «       5 }|j                  d|f«       d d d «       t        t        |dz  «      ¬«      }|j                  d|«      ƒ d {  –—† }|j                  }	d}
|	|
u }|s­t        j                  d|fd|	|
f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |	«      t        j                  |
«      dœz  }dd|iz  }t!        t        j"                  |«      «      ‚d x}	x}}
d}g }
|j$                  }|}|sd}|}||v }|�sddt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dœz  }|
j'                  |«       |s+ddt        j                  «      iz  }|
j'                  |«       t        j(                  |
d«      i z  }t        j                  d|fd ||f«      t        j                  |«      |d!œz  }d"d#|iz  }t!        t        j"                  |«      «      ‚d x}x}x}x}
x}}|j                  j+                  |«      }g }	d }
||
u}|}|r!|j,                  }|j.                  }d$}||k(  }|}|�s€t        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  }|	j'                  |«       |r´t        j                  d*fd+f«      d't        j                  «       v st        j                  |«      rt        j                  |«      nd't        j                  «      t        j                  |«      t        j                  |«      d,œz  }d-d.|iz  }|	j'                  |«       t        j(                  |	d/«      i z  }d0d1|iz  }t!        t        j"                  |«      «      ‚d x}x}	x}x}
x}x}x}}y # 1 sw Y   �ŒxY w7 �Œë­w)2Nr  r  zinterrupted-steprn   r¸   r›   rœ   r�   z)ptah:interrupted-roadmap:interrupted-stepzptah.dispatch_steprü   zinterrupted-roadmap)r  Ú
roadmap_id)r  Úagent_idrž   r  z5UPDATE tasks SET status = 'running' WHERE task_id = ?Fr.   r€   r   r*   r,   r-   zexplicitly retryingr�   r‚   rƒ   r„   r4   r…   r†   rˆ   r‰   r‹   rŒ   Úinterruptedr¥   r  r  r  r  r(   r  r  r   r!  r   r"  r#  )r   r   r   r$  Úenqueue_jobr   ÚtransactionÚexecuter�   r‘   r8   r=   r6   r7   r9   r:   r;   r<   r’   r“   r”   r%  r?   r&  )rB   r  r  r   rŽ   Ú
durable_idÚ
connectionr)  r   rE   rF   rC   rG   rH   r–   r]   ri   rh   rM   rX   r—   r˜   r  r+  r,  r-  r.  r/  r0  r1  r2  s                                  r   Ú-test_interrupted_step_requires_explicit_retryzFTestPersistentPtahBridge.test_interrupted_step_requires_explicit_retryî   s  è ø€ ä! (¨^Ñ";Ó<ˆÜ XÔ.ˆÜÐ'¨°FÀXÈvÐDVÔWˆØ@ˆ
Ø�‰× Ñ Ø àŸ7™7Ø*Ø'+§w¡wÐ>SÑTñð
 ð 	!ô 	
ð ×!Ñ!Ó#ð 	 zØ×ÑØGÈ*Èô÷	ô
 ¤~°hÀÑ6OÓ'PÔQˆØ×,Ñ,Ð-BÀDÓI×IˆØ�~‰~Ð& Ð&ˆ~ Ð&×&×&Õ&ˆ~ ×&×&×&×&×&Ñ&ˆv×&×&Ó&ˆv×&×&Ô&ˆ~×&×&Ò& ×&×&×&×&×&×&Ó&Ø$Ò<¨¯©Ð<¨Ð<©¸Ð<¸Ð<Ð$Ð<Ð<×<×<×<×<×<Ñ<¨×<×<Ó<¨×<×<Ô<¨×<×<×<Ñ<©×<×<Ð<¸×<×<×<×<×<×<×<×<Ô<Ð$×<×<Ô<Ð$×<×<×<×<×<×<×<Ò<Ø�n‰n×$Ñ$ ZÓ0ˆÙD˜$ÐDˆs˜$ˆÔD 3§:¡:ÐD :×#3Ñ#3ÐD°}ÐDÐ#3°}Ñ#D×D×D×DÐDˆs˜$×D×D×D×D×DÑDˆs×D×DÓDˆs×D×DÔD˜$×D×D×D×D×D×DÕDÐ#3°}×D×D×D×D×DÑD 3×D×DÓD 3×D×DÔD :×D×DÒDÐ#3×D×DÒD°}×D×D×D×D×D×D×D×D×D×D×D×D×D×D÷	ñ 	úð Jûs+   ‚A7R0Á9R Â5R0ÃR-ÃOR0Ò R*Ò%	R0)r   N)	rx   ry   rz   r  rs   r®   r¯   r3  r=  r   r   r   r  r  Õ   sH   „ óNð
 ‡[�[×ÑòCó ðCð$ ‡[�[×ÑòEó ñEr   r  )r�   )$Ú__doc__Úbuiltinsr6   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter8   rs   Ú cyberbrain26.agents.orchestratorr   Úcyberbrain26.data_planer   Ú&cyberbrain26.orchestration.ptah_bridger   r   r   r   r	   r
   Ú$cyberbrain26.security_plane.approvalr   Ú!cyberbrain26.security_plane.auditr   r   ÚstrÚobjectr   Úfixturer   r   r|   r±   rå   rô   r  r  r   r   r   ú<module>rK     sÀ   ðÙ 3ç  „ ƒå 8Ý 2÷÷ õ Aß Hñ\�3ð \˜cð \°ð \ÀFð \È{ó \ð ‡�ð�
ò ó ð÷6ñ 6÷:2ñ 2÷@==ñ ==÷@*ñ *÷*%ñ %÷B ñ  ÷2Eò 2Er   