Ë
   r[iöÁˆÈã                  ó®  — d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlmZmZ ddlmZmZmZ ddlmZmZ ddlmZ ddlmZmZmZ dd	lmZmZ dd
lmZm Z   G d„ d«      Z!d&d„Z"d&d„Z#e
jH                  j                  d&d„«       Z%e
jH                  j                  d&d„«       Z&e
jH                  j                  d&d„«       Z'e
jH                  j                  d&d„«       Z(e
jH                  j                  d&d„«       Z)e
jH                  j                  d&d„«       Z*e
jH                  j                  d&d„«       Z+e
jH                  j                  d&d„«       Z,e
jH                  j                  d&d„«       Z-e
jH                  j                  d&d„«       Z.e
jH                  j                  d&d„«       Z/e
jH                  j                  d&d„«       Z0 G d„ d«      Z1 G d„ de!«      Z2e
jH                  j                  d&d„«       Z3e
jH                  j                  d&d „«       Z4e
jH                  j                  d&d!„«       Z5 G d"„ d#«      Z6e7d$k(  r e
jp                  e9d%g«       yy)'z*Contract tests for InMemoryTaskDispatcher.é    )ÚannotationsN)ÚAuthorizedExecutionServiceÚExecutionRefused)ÚAgentÚAgentRegistryÚTaskDispatcher)ÚInMemoryAgentRegistryÚInMemoryTaskDispatcher)ÚApprovalManager)ÚAgentIdentityÚPermissionScopeÚ
TrustLevel)ÚPermissionGatewayÚSecurityError)ÚPolicyEngineÚ
PolicyModec                  óh   — e Zd ZdZ	 	 	 d	 	 	 	 	 	 	 	 	 d	d„Zed
d„«       Zed
d„«       Zdd„Zddd„Z	y)Ú	MockAgentz3Mock agent implementing Agent protocol for testing.Nc                óX   — || _         |xs d|› �| _        || _        || _        g | _        y )Nzagent-)Ú_roleÚ	_agent_idÚidentityÚpermission_gatewayÚexecuted_payloads)ÚselfÚroleÚagent_idr   r   s        ú</home/oem/CyberBrain26-unified/tests/test_task_dispatcher.pyÚ__init__zMockAgent.__init__   s4   € ð ˆŒ
Ø!Ò4 v¨d¨V _ˆŒØ ˆŒØ"4ˆÔØ-/ˆÕó    c                ó   — | j                   S ©N)r   ©r   s    r   r   zMockAgent.role%   s   € à�z‰zÐr    c                ó   — | j                   S r"   )r   r#   s    r   r   zMockAgent.agent_id)   s   € à�~‰~Ðr    c              ƒ  óJ   K  — | j                   j                  |«       d|dœS ­w)NÚok)ÚstatusÚpayload)r   Úappend©r   r(   s     r   ÚexecutezMockAgent.execute-   s%   è ø€ Ø×Ñ×%Ñ% gÔ.Ø¨7Ñ3Ð3ùs   ‚!#c                ó´   — | j                   �| j                  €y| j                  j                  | j                   ||«      }|j                  j                  dk(  S )NFÚallow)r   r   ÚevaluateÚdecisionÚvalue)r   ÚactionÚresourceÚresults       r   Úcheck_permissionzMockAgent.check_permission1   sM   € Ø�=‰=Ð  D×$;Ñ$;Ð$CØØ×(Ñ(×1Ñ1°$·-±-ÀÈÓRˆØ�‰×$Ñ$¨Ñ/Ð/r    )NNN)
r   Ústrr   ú
str | Noner   zAgentIdentity | Noner   zPermissionGateway | NoneÚreturnÚNone©r7   r5   ©r(   Údictr7   r;   r"   )r1   r5   r2   r6   r7   Úbool)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úpropertyr   r   r+   r4   © r    r   r   r      sw   „ Ù=ð
  $Ø)-Ø7;ð0àð0ð ð0ð 'ð	0ð
 5ð0ð 
ó0ð òó ðð òó ðó4õ0r    r   c                 óŽ  — t        «       } t        d«      }| 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                  |«      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}}| 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}}| 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}}| 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
)z<InMemoryAgentRegistry must implement AgentRegistry protocol.Úcoderúagent-1)Úis)zI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} is %(py8)sÚregistryÚagent)Úpy0Úpy2Úpy4Úpy6Úpy8úassert %(py10)sÚpy10NT)zL%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.exists
}(%(py4)s)
} is %(py9)s)rI   rJ   rK   rL   Úpy9zassert %(py11)sÚpy11)zP%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.unregister
}(%(py4)s)
} is %(py9)sF)r	   r   ÚregisterÚgetÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚexistsÚ
unregister)rG   rH   Ú@py_assert1Ú@py_assert3Ú@py_assert5Ú@py_assert7Ú@py_format9Ú@py_format11Ú@py_assert8Ú@py_format10Ú@py_format12s              r   Ú'test_agent_registry_protocol_compliancerg   8   sŽ  € ä3Ó5€HÜ�gÓ€EØ×Ñ�i Ô'Ø�<‰<Ð+˜	Ð+‰<˜	Ó"Ð+Ð" eÐ+×+×+Ö+Ð" e×+×+×+×+×+Ñ+ˆ8×+×+Ó+ˆ8×+×+Ô+ˆ<×+×+Ò+˜	×+×+Ò+Ð"×+×+×+×+×+Ð+ e×+×+Ó+ e×+×+×+×+×+×+×+Ø�?‰?Ð-˜9Ð-‰?˜9Ó%Ð-¨Ð-Ð%¨Ð-×-×-Õ-Ð%¨×-×-×-×-×-Ñ-ˆ8×-×-Ó-ˆ8×-×-Ô-ˆ?×-×-Ò-˜9×-×-Ò-Ð%×-×-Ò-¨×-×-×-×-×-×-×-Ø×ÑÐ1˜yÐ1Ñ˜yÓ)Ð1¨TÐ1Ð)¨TÐ1×1×1Õ1Ð)¨T×1×1×1×1×1Ñ1ˆ8×1×1Ó1ˆ8×1×1Ô1Ð×1×1Ò1˜y×1×1Ò1Ð)×1×1Ò1¨T×1×1×1×1×1×1×1Ø�?‰?Ð.˜9Ð.‰?˜9Ó%Ð.¨Ð.Ð%¨Ð.×.×.Õ.Ð%¨×.×.×.×.×.Ñ.ˆ8×.×.Ó.ˆ8×.×.Ô.ˆ?×.×.Ò.˜9×.×.Ò.Ð%×.×.Ò.¨×.×.×.×.×.×.×.Ð.r    c                 óR   — t        «       } t        d«      }| j                  d|«       y)z>InMemoryTaskDispatcher must implement TaskDispatcher protocol.rD   rE   N)r
   r   Úregister_agent)Ú
dispatcherrH   s     r   Ú(test_task_dispatcher_protocol_compliancerk   C   s$   € ä!7Ó!9€JÜ�gÓ€EØ×Ñ˜i¨Õ/r    c               ƒ  óV  K  — t        «       } t        ddt        j                  ¬«      }t	        d|¬«      }| j                  d|«       | j                  ddddi«      ƒ 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}}|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                  |
«      dœz  }dd|iz  }t        t        j                  |«      «      ‚dx}x}	x}}
|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7 �ŒF­w)z'dispatch must accept and track task_id.rE   rD   ©Útrust_level©r   ztask-123r1   ÚplanNr'   r&   ©ú==©z%(py1)s == %(py4)s©Úpy1rK   úassert %(py6)srL   é   ©zW%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.executed_payloads
})
} == %(py8)sÚlenrH   ©rI   ru   Úpy3Úpy5rM   rN   rO   r   )r
   r   r   ÚTRUSTEDr   ri   ÚdispatchrT   rU   rY   rZ   r[   r   ry   rV   rW   rX   )rj   r   rH   r3   Ú@py_assert0r_   Ú@py_assert2Ú@py_format5Ú@py_format7Ú@py_assert4ra   Ú@py_assert6rb   rc   s                 r   Útest_dispatch_uses_task_idr…   K   s¹  è ø€ ô (Ó)€JÜ˜Y¨¼Z×=OÑ=OÔP€HÜ�g¨Ô1€EØ×Ñ˜i¨Ô/à×&Ñ& z°9¸xÈÐ>PÓQ×Q€FØ�(ÑÐ#˜tÐ#Ð˜tÑ#×#×#Õ#Ð˜t×#×#Ó#Ð×#×#Ò#˜t×#×#×#×#×#×#Ó#Ø×&Ñ&Ð,Œ3Ð&Ó'Ð,¨1Ð,Ð'¨1Ñ,×,×,Ö,Ð'¨1×,×,×,×,×,Ñ,Œ3×,×,Ó,Œ3×,×,×,×,×,Ò,ˆu×,×,Ó,ˆu×,×,Ô,Ð&×,×,Ò,Ð'×,×,Ò,¨1×,×,×,×,×,×,Õ,Ø×"Ñ" 1Ñ% hÑ/Ð9°6Ð9Ð/°6Ñ9×9×9Õ9Ð/°6×9×9Ó9Ð/×9×9Ò9°6×9×9×9×9×9×9Ô9ð Rûs   ‚AJ)Á J&Á!IJ)c            	   ƒ  ó,  K  — t        «       } t        ddt        ddt        j                  ¬«      ¬«      }t        ddt        ddt        j                  ¬«      ¬«      }| j                  d|«       | j                  d|«       | j                  ddddi«      ƒ 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                  |«      dœz  }dd|iz  }t        t        j                   |«      «      ‚d	x}x}x}}|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                  |«      dœz  }dd|iz  }t        t        j                   |«      «      ‚d	x}x}x}}| j                  ddddi«      ƒ 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                  |«      dœz  }dd|iz  }t        t        j                   |«      «      ‚d	x}x}x}}|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                  |«      dœz  }dd|iz  }t        t        j                   |«      «      ‚d	x}x}x}}| j                  ddddi«      ƒ 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                  |«      dœz  }dd|iz  }t        t        j                   |«      «      ‚d	x}x}x}}|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                  |«      dœz  }dd|iz  }t        t        j                   |«      «      ‚d	x}x}x}}y	7 �Œr7 �Œò7 �Œr­w)zDdispatch_to_role must select agents deterministically (round-robin).rD   rE   rm   ro   zagent-2útask-1r1   rp   Nrw   rq   rx   ry   Úagent1rz   rN   rO   r   Úagent2útask-2ztask-3é   )r
   r   r   r   r}   ri   Údispatch_to_roler   ry   rT   rU   rV   rW   rX   rY   rZ   r[   )	rj   rˆ   r‰   r€   rƒ   ra   r„   rb   rc   s	            r   Ú/test_dispatch_to_role_deterministic_round_robinr�   Y   s×  è ø€ ô (Ó)€JÜØ�¤]°9¸gÔS]×SeÑSeÔ%fô€Fô Ø�¤]°9¸gÔS]×SeÑSeÔ%fô€Fð ×Ñ˜i¨Ô0Ø×Ñ˜i¨Ô0ð ×
%Ñ
% h°¸(ÀFÐ9KÓ
L×LÐLØ×'Ñ'Ð-Œ3Ð'Ó(Ð-¨AÐ-Ð(¨AÑ-×-×-Ö-Ð(¨A×-×-×-×-×-Ñ-Œ3×-×-Ó-Œ3×-×-×-×-×-Ò-ˆv×-×-Ó-ˆv×-×-Ô-Ð'×-×-Ò-Ð(×-×-Ò-¨A×-×-×-×-×-×-Õ-Ø×'Ñ'Ð-Œ3Ð'Ó(Ð-¨AÐ-Ð(¨AÑ-×-×-Ö-Ð(¨A×-×-×-×-×-Ñ-Œ3×-×-Ó-Œ3×-×-×-×-×-Ò-ˆv×-×-Ó-ˆv×-×-Ô-Ð'×-×-Ò-Ð(×-×-Ò-¨A×-×-×-×-×-×-Õ-ð ×
%Ñ
% h°¸(ÀFÐ9KÓ
L×LÐLØ×'Ñ'Ð-Œ3Ð'Ó(Ð-¨AÐ-Ð(¨AÑ-×-×-Ö-Ð(¨A×-×-×-×-×-Ñ-Œ3×-×-Ó-Œ3×-×-×-×-×-Ò-ˆv×-×-Ó-ˆv×-×-Ô-Ð'×-×-Ò-Ð(×-×-Ò-¨A×-×-×-×-×-×-Õ-Ø×'Ñ'Ð-Œ3Ð'Ó(Ð-¨AÐ-Ð(¨AÑ-×-×-Ö-Ð(¨A×-×-×-×-×-Ñ-Œ3×-×-Ó-Œ3×-×-×-×-×-Ò-ˆv×-×-Ó-ˆv×-×-Ô-Ð'×-×-Ò-Ð(×-×-Ò-¨A×-×-×-×-×-×-Õ-ð ×
%Ñ
% h°¸(ÀFÐ9KÓ
L×LÐLØ×'Ñ'Ð-Œ3Ð'Ó(Ð-¨AÐ-Ð(¨AÑ-×-×-Ö-Ð(¨A×-×-×-×-×-Ñ-Œ3×-×-Ó-Œ3×-×-×-×-×-Ò-ˆv×-×-Ó-ˆv×-×-Ô-Ð'×-×-Ò-Ð(×-×-Ò-¨A×-×-×-×-×-×-Õ-Ø×'Ñ'Ð-Œ3Ð'Ó(Ð-¨AÐ-Ð(¨AÑ-×-×-Ö-Ð(¨A×-×-×-×-×-Ñ-Œ3×-×-Ó-Œ3×-×-×-×-×-Ò-ˆv×-×-Ó-ˆv×-×-Ô-Ð'×-×-Ò-Ð(×-×-Ò-¨A×-×-×-×-×-×-Ö-ð Mùð
 Mùð
 Mûs9   ‚B`Â`ÂJ`Ì`ÌJ`Ö`Ö I,`à`à`c               ƒ  óà  K  — t        t        j                  ¬«      } t        | «      }t	        ddt
        j                  t        j                  h¬«      }t        | ¬«      }t        dd||¬«      }|j                  d|«       |j                  dddd	i«      ƒ 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}}t%        j&                  t(        «      5  |j                  ddddi«      ƒ d
{  –—†  d
d
d
«       y
7 ŒÄ7 Œ# 1 sw Y   y
xY w­w)uH   dispatch must enforce Identity â†’ Policy â†’ Permission before execute.©Úmodezsecure-agentrD   ©r   r   rn   Úscopes©Úpolicy_engine©r   r   r‡   r1   Ú	read_fileNr'   r&   rq   rs   rt   rv   rL   rŠ   Ú
write_file)r   r   ÚSAFEr   r   r   r}   r   Ú	READ_FILEr
   r   ri   r~   rT   rU   rY   rZ   r[   ÚpytestÚraisesr   )r”   Úgatewayr   rj   rH   r3   r   r_   r€   r�   r‚   s              r   Ú:test_dispatch_security_boundary_identity_policy_permissionr�   v   s9  è ø€ ô !¤j§o¡oÔ6€MÜ Ó.€GäØØÜ×&Ñ&Ü×)Ñ)Ð*ô	€Hô (°mÔD€JÜ�g˜~¸ÐU\Ô]€EØ×Ñ˜n¨eÔ4ð ×&Ñ& x°À(ÈKÐAXÓY×Y€FØ�(ÑÐ#˜tÐ#Ð˜tÑ#×#×#Õ#Ð˜t×#×#Ó#Ð×#×#Ò#˜t×#×#×#×#×#×#Ó#ô 
�‰”}Ó	%ñ VØ×!Ñ! (¨N¸XÀ|Ð<TÓU×UÐU÷Vð Vð	 Zøð
 	Vø÷Vð Vüs=   ‚BE.ÂEÂBE.Ä7E"ÅE ÅE"Å
E.Å E"Å"E+Å'E.c               ƒ  óü  K  — ddl m} m}m}  |«       }t	        t
        j                  ¬«      }t        ||¬«      }t        ddt        j                  t        j                  h¬«      }t        dd|¬«      }|j                  d|«       |j                  d	dd
di«      ƒ d{  –—†  |j!                   || j"                  ¬«      «      }t%        |«      }	d}
|	|
k\  }|söt'        j(                  d|fd|	|
f«      dt+        j,                  «       v st'        j.                  t$        «      rt'        j0                  t$        «      nddt+        j,                  «       v st'        j.                  |«      rt'        j0                  |«      ndt'        j0                  |	«      t'        j0                  |
«      dœz  }dd|iz  }t3        t'        j4                  |«      «      ‚dx}	x}}
|d   }|j6                  }	d}
|	|
k(  }|s€t'        j(                  d|fd|	|
f«      t'        j0                  |«      t'        j0                  |	«      t'        j0                  |
«      dœz  }dd|iz  }t3        t'        j4                  |«      «      ‚dx}x}	x}}
y7 �ŒÚ­w)z=dispatch must record audit events when audit_log is provided.r   )ÚAuditEventTypeÚAuditLogÚ
AuditQueryr�   )r”   Ú	audit_logzaudit-agentrD   r‘   ro   r‡   r1   r–   N)Ú
event_typerw   )ú>=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sry   Úperm_events)rI   ru   r{   rL   zassert %(py8)srM   rq   )z.%(py3)s
{%(py3)s = %(py1)s.action
} == %(py6)s)ru   r{   rL   )Ú!cyberbrain26.security_plane.auditrŸ   r    r¡   r   r   r˜   r
   r   r   r}   r   r™   r   ri   r~   ÚqueryÚPERMISSION_CHECKry   rT   rU   rV   rW   rX   rY   rZ   r[   r1   )rŸ   r    r¡   Úauditr”   rj   r   rH   r¥   r€   r`   rƒ   r‚   rb   r   s                  r   Ú!test_dispatch_records_audit_eventrª   �   s¨  è ø€ ÷ WÑVá‹J€EÜ ¤j§o¡oÔ6€MÜ'°mÈuÔU€JäØØÜ×&Ñ&Ü×)Ñ)Ð*ô	€Hô �g˜}°xÔ@€EØ×Ñ˜m¨UÔ3à
×
Ñ
˜h¨¸À+Ð7NÓ
O×OÐOà—+‘+™j°N×4SÑ4SÔTÓU€KÜˆ{ÓÐ ˜qÐ Ð˜qÑ × × Õ Ð˜q× × × × × Ñ Œ3× × Ó Œ3× × × × × Ò ˆ{× × Ó ˆ{× × Ô Ð× × Ò ˜q× × × × × × Ó Ø�q‰>Ð/ˆ>× Ñ Ð/ KÐ/Ð  KÑ/×/×/Õ/Ð  K×/×/Ó/ˆ>×/×/Ò/Ð ×/×/Ò/ K×/×/×/×/×/×/Ö/ð	 Pûs   ‚BI<ÂI9Â GI<c               ƒ  ó¢  K  — t        t        j                  ¬«      } t        | «      }t	        ddt
        j                  t        j                  h¬«      }t        | ¬«      }t        dd||¬«      }|j                  d|«       t        j                  t        «      5  |j                  dddd	i«      ƒ d
{  –—†  d
d
d
«       y
7 Œ# 1 sw Y   y
xY w­w)z0dispatch_to_role must enforce security boundary.r�   zsecure-agent-1rD   r‘   r“   r•   r‡   r1   Úexecute_shellN)r   r   r˜   r   r   r   r}   r   ÚSHELLr
   r   ri   rš   r›   r   rŒ   ©r”   rœ   r   rj   rH   s        r   Ú'test_dispatch_to_role_security_boundaryr¯   ©   sÁ   è ø€ ô !¤j§o¡oÔ6€MÜ Ó.€GäØ!ØÜ×&Ñ&Ü×%Ñ%Ð&ô	€Hô (°mÔD€JÜ�gÐ/¸(ÐW^Ô_€EØ×ÑÐ.°Ô6ô 
�‰”}Ó	%ñ ZØ×)Ñ)¨(°G¸hÈÐ=XÓY×YÐY÷Zð ZØYø÷Zð Züs0   ‚BCÂCÂ3CÂ4CÂ8	CÃCÃCÃCc               ƒ  ó¾   K  — t        «       } t        j                  t        d¬«      5  | j	                  ddddi«      ƒ d{  –—†  ddd«       y7 Œ# 1 sw Y   yxY w­w)z4dispatch must raise KeyError for unregistered agent.zagent not found©Úmatchr‡   Úunknownr1   ÚtestN)r
   rš   r›   ÚKeyErrorr~   ©rj   s    r   Ú'test_dispatch_unregistered_agent_raisesr·   ¿   s^   è ø€ ô (Ó)€JÜ	�‰”xÐ'8Ô	9ñ KØ×!Ñ! (¨I¸À&Ð7IÓJ×JÐJ÷Kð KØJø÷Kð Küó.   ‚&A¨AÁAÁAÁ	AÁAÁAÁAc               ƒ  ó¾   K  — t        «       } t        j                  t        d¬«      5  | j	                  ddddi«      ƒ d{  –—†  ddd«       y7 Œ# 1 sw Y   yxY w­w)z6dispatch_to_role must raise KeyError for unknown role.zno agent with roler±   r‡   zunknown-roler1   r´   N)r
   rš   r›   rµ   rŒ   r¶   s    r   Ú%test_dispatch_to_role_no_agent_raisesrº   Ç   s^   è ø€ ô (Ó)€JÜ	�‰”xÐ';Ô	<ñ XØ×)Ñ)¨(°NÀXÈvÐDVÓW×WÐW÷Xð XØWø÷Xð Xür¸   c               ƒ  óÄ  K  — t        «       } t        ddt        j                  ¬«      }t	        d|¬«      }| j                  d|«       t        j                  t        d¬«      5  | j                  dddd	i«      ƒ d
{  –—†  d
d
d
«       |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                   |«      dœz  }dd|iz  }t#        t        j$                  |«      «      ‚d
x}x}}y
7 ŒÕ# 1 sw Y   ŒÔxY w­w)zAA payload with no declared action must be refused, not defaulted.rE   rD   rm   ro   úno default action is inferredr±   r‡   r(   ÚanythingNrq   ©z9%(py2)s
{%(py2)s = %(py0)s.executed_payloads
} == %(py5)srH   ©rI   rJ   r|   úassert %(py7)sÚpy7)r
   r   r   r}   r   ri   rš   r›   r   r~   r   rT   rU   rV   rW   rX   rY   rZ   r[   ©rj   r   rH   r^   rƒ   r_   Ú@py_format6Ú@py_format8s           r   Ú'test_dispatch_without_action_is_refusedrÅ   Ï   sý   è ø€ ô (Ó)€JÜ˜Y¨¼Z×=OÑ=OÔP€HÜ�g¨Ô1€EØ×Ñ˜i¨Ô/ä	�‰”}Ð,KÔ	Lñ PØ×!Ñ! (¨I¸	À:Ð7NÓO×OÐO÷Pà×"Ñ"Ð( bÐ(Ð" bÑ(×(×(Õ(Ð" b×(×(×(×(×(Ñ(ˆ5×(×(Ó(ˆ5×(×(Ô(Ð"×(×(Ò( b×(×(×(×(×(×(Ô(ð 	Pø÷Pð Püs1   ‚A!E Á#EÁ<EÁ=EÂCE ÅEÅEÅE c               ƒ  óÀ  K  — t        «       } t        ddt        j                  ¬«      }t	        d|¬«      }| j                  d|«       t        j                  t        d¬«      5  | j                  ddi «      ƒ d{  –—†  ddd«       |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                   |«      dœz  }dd|iz  }t#        t        j$                  |«      «      ‚dx}x}}y7 ŒÕ# 1 sw Y   ŒÔxY w­w)z2dispatch_to_role must not invent an action either.rE   rD   rm   ro   r¼   r±   r‡   Nrq   r¾   rH   r¿   rÀ   rÁ   )r
   r   r   r}   r   ri   rš   r›   r   rŒ   r   rT   rU   rV   rW   rX   rY   rZ   r[   rÂ   s           r   Ú/test_dispatch_to_role_without_action_is_refusedrÇ   Ü   sø   è ø€ ô (Ó)€JÜ˜Y¨¼Z×=OÑ=OÔP€HÜ�g¨Ô1€EØ×Ñ˜i¨Ô/ä	�‰”}Ð,KÔ	Lñ AØ×)Ñ)¨(°G¸RÓ@×@Ð@÷Aà×"Ñ"Ð( bÐ(Ð" bÑ(×(×(Õ(Ð" b×(×(×(×(×(Ñ(ˆ5×(×(Ó(ˆ5×(×(Ô(Ð"×(×(Ò( b×(×(×(×(×(×(Ô(ð 	Aø÷Að Aüs1   ‚A!EÁ#EÁ:EÁ;EÁ?CEÅEÅEÅEc               ƒ  ó  K  — t        «       } t        ddt        j                  t        j
                  t        j                  t        j                  h¬«      }t        d|¬«      }| j                  d|«       t        j                  t        «      5  | j                  ddddi«      ƒ d{  –—†  ddd«       |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(                  |«      dœz  }dd|iz  }t+        t        j,                  |«      «      ‚dx}x}}y7 ŒÕ# 1 sw Y   ŒÔxY w­w)z:An action outside the canonical vocabulary must be denied.rE   rD   )rn   r’   ro   r‡   r1   r+   Nrq   r¾   rH   r¿   rÀ   rÁ   )r
   r   r   r}   r   r™   r­   ÚPYTHONr   ri   rš   r›   r   r~   r   rT   rU   rV   rW   rX   rY   rZ   r[   rÂ   s           r   Ú(test_dispatch_unmapped_action_is_refusedrÊ   é   s  è ø€ ô (Ó)€JÜØØÜ×&Ñ&Ü×)Ñ)¬?×+@Ñ+@Ä/×BXÑBXÐYô	€Hô �g¨Ô1€EØ×Ñ˜i¨Ô/ô 
�‰”}Ó	%ñ NØ×!Ñ! (¨I¸À)Ð7LÓM×MÐM÷Nà×"Ñ"Ð( bÐ(Ð" bÑ(×(×(Õ(Ð" b×(×(×(×(×(Ñ(ˆ5×(×(Ó(ˆ5×(×(Ô(Ð"×(×(Ò( b×(×(×(×(×(×(Ô(ð 	Nø÷Nð Nüs1   ‚BFÂF Â(E>Â)F Â-CFÅ>F Æ F	ÆFc               ƒ  óˆ  K  — t        «       } t        d«      }| j                  d|«       t        j                  t
        d¬«      5  | j                  ddddi«      ƒ d{  –—†  ddd«       |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                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚dx}x}}y7 ŒÕ# 1 sw Y   ŒÔxY w­w)z<An agent without identity must fail closed before execution.rD   rE   zidentity is requiredr±   r‡   r1   r¬   Nrq   r¾   rH   r¿   rÀ   rÁ   )r
   r   ri   rš   r›   r   r~   r   rT   rU   rV   rW   rX   rY   rZ   r[   )rj   rH   r^   rƒ   r_   rÃ   rÄ   s          r   Ú%test_agent_without_identity_is_deniedrÌ   ý   sç   è ø€ ô (Ó)€JÜ�gÓ€EØ×Ñ˜i¨Ô/ä	�‰”}Ð,BÔ	Cñ TØ×!Ñ! (¨I¸À/Ð7RÓS×SÐS÷Tà×"Ñ"Ð( bÐ(Ð" bÑ(×(×(Õ(Ð" b×(×(×(×(×(Ñ(ˆ5×(×(Ó(ˆ5×(×(Ô(Ð"×(×(Ò( b×(×(×(×(×(×(Ô(ð 	Tø÷Tð Tüs1   ‚AEÁD6ÁD4ÁD6Á#CEÄ4D6Ä6D?Ä;Ec               ƒ  óÀ  K  — t        t        j                  ¬«      } t        | «      }t	        ddt
        j                  t        j                  t        j                  h¬«      }t        | ¬«      }t        dd||¬«      }|j                  d|«       t        j                  t        «      5  |j!                  dddd	i«      ƒ d
{  –—†  d
d
d
«       y
7 Œ# 1 sw Y   y
xY w­w)z0UNTRUSTED agents must be denied by trust policy.r�   zuntrusted-agentrD   r‘   r“   r•   r‡   r1   r–   N)r   r   r˜   r   r   r   Ú	UNTRUSTEDr   r™   r­   r
   r   ri   rš   r›   r   r~   r®   s        r   Útest_untrusted_agent_deniedrÏ   	  sÈ   è ø€ ô !¤j§o¡oÔ6€MÜ Ó.€GäØ"ØÜ×(Ñ(Ü×)Ñ)¬?×+@Ñ+@ÐAô	€Hô (°mÔD€JÜ�gÐ0¸8ÐX_Ô`€EØ×ÑÐ/°Ô7ä	�‰”}Ó	%ñ XØ×!Ñ! (Ð,=ÀÈ+Ð?VÓW×WÐW÷Xð XØWø÷Xð Xüs0   ‚B'CÂ)CÃCÃCÃ	CÃCÃCÃCc                  ó$   — e Zd ZdZdZdd„Zdd„Zy)Ú_RecordingProviderz<Execution provider that records whatever it is asked to run.Ú	recordingc                ó   — g | _         y r"   )Úcallsr#   s    r   r   z_RecordingProvider.__init__&  s	   € Ø/1ˆ�
r    c              �  óH   K  — | j                   j                  |«       ddiS ­w)NÚreturn_coder   )rÔ   r)   )r   ÚargsÚkwargss      r   r+   z_RecordingProvider.execute)  s#   è ø€ Ø�
‰
×Ñ˜$ÔØ˜qÐ!Ð!ùs   ‚ "N©r7   r8   )r×   ÚobjectrØ   rÚ   r7   zdict[str, object])r=   r>   r?   r@   Úprovider_namer   r+   rB   r    r   rÑ   rÑ   !  s   „ ÙFà€Mó2ô"r    rÑ   c                  ó<   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 dˆ fd„Zdd„Zˆ xZS )Ú_SwappingCodera  Coder whose body swaps the code after the dispatch approved the original.

    This models the one thing the single-approval flow must never tolerate: the
    payload that reached the operator is not the payload that reaches the
    sandbox. It is deliberately a *legitimate-looking* agent - it holds the
    right identity, the right scope and calls the real execution service.
    c                óL   •— t         ‰| �  ||j                  |¬«       || _        y )N©r   r   )Úsuperr   r   Úservice)r   r   r   rá   Ú	__class__s       €r   r   z_SwappingCoder.__init__7  s&   ø€ ô 	‰Ñ˜¨×(9Ñ(9ÀHÐÔMØˆ�r    c              ƒ  óà   K  — d|d<   | j                   j                  | j                  |d   |d   t        |j	                  dd«      «      |j	                  d«      ¬«      ƒ d {  –—†  dd	iS 7 Œ­w)
Nz5print('swapped after the operator approved the step')ÚcodeÚlanguageÚtask_idúdispatched-taskÚ	workspace)ræ   rè   r'   r&   )rá   r+   r   r5   rS   r*   s     r   r+   z_SwappingCoder.execute@  sx   è ø€ ØQˆ�‰Ø�l‰l×"Ñ"Ø�M‰MØ�F‰OØ�JÑÜ˜Ÿ™ IÐ/@ÓAÓBØ—k‘k +Ó.ð #ó 
÷ 	
ð 	
ð ˜$ÐÐð	
ús   ‚A!A.Á#A,Á$	A.)r   r5   r   r   rá   r   r7   r8   r:   )r=   r>   r?   r@   r   r+   Ú__classcell__)râ   s   @r   rÝ   rÝ   .  s8   ø„ ñðàðð  ðð ,ð	ð
 
õ÷	 r    rÝ   c            	   ƒ  ó¬  ‡K  — t        «       Št        ddt        j                  t        j
                  h¬«      } t        «       }t        |t        t        «       «      ‰d¬«      }t        ‰¬«      }t        d| |«      }|j                  d|«       dˆfd„}t        j                   |«       «      }t        j                   t"        d¬	«      5  |j%                  d
dddddœ«      ƒ d{  –—†  ddd«       |ƒ d{  –—†  |j&                  }g }||k(  }	|	sÃt)        j*                  d|	fd||f«      dt-        j.                  «       v st)        j0                  |«      rt)        j2                  |«      ndt)        j2                  |«      t)        j2                  |«      dœz  }
t)        j4                  d«      dz   d|
iz  }t7        t)        j8                  |«      «      ‚dx}x}	}‰j:                  } |«       }t=        |«      }d}||k(  }|�s4t)        j*                  d|fd||f«      dt-        j.                  «       v st)        j0                  t<        «      rt)        j2                  t<        «      nddt-        j.                  «       v st)        j0                  ‰«      rt)        j2                  ‰«      ndt)        j2                  |«      t)        j2                  |«      t)        j2                  |«      t)        j2                  |«      dœz  }t)        j4                  d«      dz   d|iz  }t7        t)        j8                  |«      «      ‚dx}x}x}x}}y7 �Œ\# 1 sw Y   �Œ\xY w7 �ŒZ­w) aÈ  A granted approval must not travel from the approved code to other code.

    The dispatcher obtains one human approval for the step as declared, then
    hands control to the agent. If the agent changes the payload in between, the
    inner gateway has to notice: reusing the approval would run code nobody
    approved, and asking again would hide the swap. So the execution is refused,
    the provider is never reached, and the refusal is audited.
    úcoder-1rD   r‘   çš™™™™™©?©Úapproval_managerÚapproval_timeout_seconds©rî   c               “  óê   •K  — ‰ j                  «       s.t        j                  d«      ƒ d {  –—†  ‰ j                  «       sŒ.‰ j                  ‰ j                  «       d   j                  dd«       y 7 ŒD­w©Ng{®Gázt?r   ÚreviewerÚapproved©Úlist_pendingÚasyncioÚsleepÚapproveÚ
request_id©Ú	approvalss   €r   Úapprove_oncezatest_approval_for_the_original_payload_does_not_authorise_a_changed_payload.<locals>.approve_onceh  ó^   øè ø€ Ø×(Ñ(Ô*Ü—-‘- Ó&×&Ð&ð ×(Ñ(Õ*à×Ñ˜)×0Ñ0Ó2°1Ñ5×@Ñ@À*ÈjÕYð 'úó   ƒ)A3¬A1­A3Á0A3zdoes not cover this executionr±   r‡   Úexecute_pythonÚpythonz!print('approved by the reviewer')©r1   rå   rä   Nrq   ©z-%(py2)s
{%(py2)s = %(py0)s.calls
} == %(py5)sÚproviderr¿   z4the sandbox must not be reached with unapproved codez
>assert %(py7)srÁ   rw   ©zj%(py7)s
{%(py7)s = %(py0)s(%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.list_records
}()
})
} == %(py10)sry   rü   ©rI   ru   r{   r|   rÁ   rO   z+exactly one approval, and it was not reusedz
>assert %(py12)sÚpy12rÙ   )r   r   r   r}   r   rÉ   rÑ   r   r   r   r
   rÝ   ri   r÷   Úcreate_taskrš   r›   r   r~   rÔ   rT   rU   rV   rW   rX   rY   Ú_format_assertmsgrZ   r[   Úlist_recordsry   )r   r  rá   rj   rH   rý   Úapproverr^   rƒ   r_   rÃ   rÄ   r€   r„   Ú@py_assert9rd   rc   Ú@py_format13rü   s                     @r   ÚKtest_approval_for_the_original_payload_does_not_authorise_a_changed_payloadr  L  sH  øè ø€ ô  Ó!€IÜØØÜ×&Ñ&Ü×&Ñ&Ð'ô	€Hô "Ó#€HÜ(ØÜœ,›.Ó)Ø"Ø!%ô	€Gô (¸ÔC€JÜ˜7 H¨gÓ6€EØ×Ñ˜i¨Ô/õZô
 ×"Ñ"¡<£>Ó2€HÜ	�‰Ô'Ð/NÔ	Oñ 	
Ø×!Ñ!ØØà*Ø$Ø;ñó
÷ 	
ð 	
÷	
ð ‡N€Nà�>‰>ÐW˜RÐWˆ>˜RÑ×W×WÕWˆ>˜R×W×W×W×W×WÑWˆ8×W×WÓWˆ8×W×WÔWˆ>×W×WÒW˜R×W×W×WÐ!W×W×W×W×W×W×WÐWØ×%Ñ%Ð\Ñ%Ó'Ð\Œ3Ð'Ó(Ð\¨AÐ\Ð(¨AÑ-×\×\Ö\Ð(¨A×\×\×\×\×\Ñ\Œ3×\×\Ó\Œ3×\×\×\×\×\Ò\ˆy×\×\Ó\ˆy×\×\Ô\Ð%×\×\Ò\Ð'×\×\Ò\Ð(×\×\Ò\¨A×\×\×\Ð/\×\×\×\×\×\×\Õ\ð	
ù÷	
ñ 	
úð ûs=   ƒCMÃ
MÃ%MÃ&MÃ*MÃ7MÃ8I	MÍMÍMÍ		Mc            	   ƒ  ó8  ‡‡K  —  G ˆfd„dt         «      } t        «       Št        ddt        j                  t
        j                  h¬«      }t        «       }t        |t        t        «       «      ‰d¬«      Št        ‰¬«      } | dd|¬	«      }|j                  d|«       d%ˆfd
„}t        j                   |«       «      }|j                  ddddddœ«      ƒ d{  –—† }|ƒ d{  –—†  ddi}||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  }t-        t!        j.                  |«      «      ‚dx}	}|j0                  }t3        |«      }d}||k(  }|�s
t!        j"                  d|fd||f«      dt%        j&                  «       v st!        j(                  t2        «      rt!        j*                  t2        «      nd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}}‰j4                  } |«       }t3        |«      }d}||k(  }|�st!        j"                  d|fd ||f«      dt%        j&                  «       v st!        j(                  t2        «      rt!        j*                  t2        «      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7 �Œ;7 �Œ4­w)&zäThe same dispatch with an untouched payload needs no second approval.

    The gateway still re-runs its own scope and policy check; what it does not
    do is raise a second request the operator would have to answer again.
    c                  ó   •— e Zd Zdˆ fd„Zy)úStest_unchanged_payload_lets_the_second_gate_proceed_on_one_approval.<locals>._Coderc              “  ó¤   •K  — ‰j                  | j                  |d   |d   t        |j                  dd«      «      ¬«      ƒ d {  –—†  ddiS 7 Œ­w)Nrä   rå   ræ   rç   )ræ   r'   r&   )r+   r   r5   rS   )r   r(   rá   s     €r   r+   z[test_unchanged_payload_lets_the_second_gate_proceed_on_one_approval.<locals>._Coder.execute‡  s^   øè ø€ Ø—/‘/Ø—‘Ø˜‘Ø˜
Ñ#Ü˜GŸK™K¨	Ð3DÓEÓFð	 "ó ÷ ð ð ˜dÐ#Ð#ðús   ƒAAÁAÁ	ANr:   )r=   r>   r?   r+   )rá   s   €r   Ú_Coderr  †  s   ø„ ö	$r    r  rë   rD   r‘   rì   rí   rð   rß   c               “  óê   •K  — ‰ j                  «       s.t        j                  d«      ƒ d {  –—†  ‰ j                  «       sŒ.‰ j                  ‰ j                  «       d   j                  dd«       y 7 ŒD­wrò   rõ   rû   s   €r   rý   zYtest_unchanged_payload_lets_the_second_gate_proceed_on_one_approval.<locals>.approve_once¢  rþ   rÿ   r‡   r   r  zprint('approved')r  Nr'   r&   rq   )z%(py0)s == %(py3)sr3   )rI   r{   zassert %(py5)sr|   rw   )zK%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.calls
})
} == %(py8)sry   r  rz   rN   rO   r  rü   r  zassert %(py12)sr  rÙ   )r   r   r   r   r}   r   rÉ   rÑ   r   r   r   r
   ri   r÷   r  r~   rT   rU   rV   rW   rX   rY   rZ   r[   rÔ   ry   r
  )r  r   r  rj   rH   rý   r  r3   r€   r^   Ú@py_format4rÃ   rƒ   ra   r„   rb   rc   r  rd   r  rü   rá   s                       @@r   ÚCtest_unchanged_payload_lets_the_second_gate_proceed_on_one_approvalr  ~  s¬  ùè ø€ ö$”ô $ô  Ó!€IÜØØÜ×&Ñ&Ü×&Ñ&Ð'ô	€Hô "Ó#€HÜ(ØÜœ,›.Ó)Ø"Ø!%ô	€Gô (¸ÔC€JÙ�7 Y¸ÔB€EØ×Ñ˜i¨Ô/õZô
 ×"Ñ"¡<£>Ó2€HØ×&Ñ&ØØØ#°ÐCVÑWó÷ €Fð
 ‡N€Nà Ð%Ð%ˆ6Ð%Ñ%×%×%Õ%ˆ6Ð%×%×%×%×%×%Ñ%ˆ6×%×%Ó%ˆ6×%×%Ô%Ð%×%×%×%×%×%×%Ñ%Ø�~‰~Ð#Œ3ˆ~ÓÐ# !Ð#Ð !Ñ#×#×#Ö#Ð !×#×#×#×#×#Ñ#Œ3×#×#Ó#Œ3×#×#×#×#×#Ò#ˆx×#×#Ó#ˆx×#×#Ô#ˆ~×#×#Ò#Ð×#×#Ò# !×#×#×#×#×#×#Õ#Ø×%Ñ%Ð-Ñ%Ó'Ð-Œ3Ð'Ó(Ð-¨AÐ-Ð(¨AÑ-×-×-Ö-Ð(¨A×-×-×-×-×-Ñ-Œ3×-×-Ó-Œ3×-×-×-×-×-Ò-ˆy×-×-Ó-ˆy×-×-Ô-Ð%×-×-Ò-Ð'×-×-Ò-Ð(×-×-Ò-¨A×-×-×-×-×-×-×-Ð-ðùð
 ûs%   „CPÃPÃ	PÃ#PÃ$L1PÐPc            	   ƒ  ó"  K  — t        «       } t        ddt        j                  t        j
                  h¬«      }t        «       }t        |t        t        «       «      | d¬«      }t        | ¬«      }t        d||«      }|j                  d|«       t        j                  t        d¬«      5  |j!                  d	dd
dddœ«      ƒ d{  –—†  ddd«       |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.                  |«      dœz  }	dd|	iz  }
t1        t%        j2                  |
«      «      ‚dx}x}}| j4                  } |«       }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  }t1        t%        j2                  |«      «      ‚dx}x}x}}y7 �Œ»# 1 sw Y   �Œ»xY w­w)a'  A policy "allow" must not be laundered into an approval.

    ``plan`` needs no human decision at the outer gate. If that allow were
    turned into a grant, an agent could spend it to skip the approval the real
    execution action requires - so no grant is minted and the inner gate asks.
    rë   rD   r‘   rì   rí   rð   r¬   r±   r‡   rä   Úshellzecho hir  Nrq   r  r  r¿   rÀ   rÁ   )zK%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.list_records
}()
} == %(py7)srü   )rI   rJ   rK   rÁ   zassert %(py9)srP   )r   r   r   r}   r   rÉ   rÑ   r   r   r   r
   rÝ   ri   rš   r›   r   r~   rÔ   rT   rU   rV   rW   rX   rY   rZ   r[   r
  )rü   r   r  rá   rj   rH   r^   rƒ   r_   rÃ   rÄ   r„   r`   re   s                 r   Ú2test_outer_allow_mints_no_grant_for_the_inner_gater  ´  sÏ  è ø€ ô  Ó!€IÜØØÜ×&Ñ&Ü×&Ñ&Ð'ô	€Hô "Ó#€HÜ(ØÜœ,›.Ó)Ø"Ø!%ô	€Gô (¸ÔC€JÜ˜7 H¨gÓ6€EØ×Ñ˜i¨Ô/ô
 
�‰Ô'¨Ô	?ñ 
Ø×!Ñ!ØØØ¨7¸IÑFó
÷ 	
ð 	
÷
ð �>‰>Ð˜RÐˆ>˜RÑ××Õˆ>˜R×××××Ñˆ8××Óˆ8××Ôˆ>××Ò˜R××××××ÓØ×!Ñ!Ð)Ñ!Ó#Ð) rÐ)Ð# rÑ)×)×)Õ)Ð# r×)×)×)×)×)Ñ)ˆ9×)×)Ó)ˆ9×)×)Ô)Ð!×)×)Ò)Ð#×)×)Ò) r×)×)×)×)×)×)Ö)ð	
ù÷
ñ 
üs1   ‚B'JÂ)JÃI?ÃJÃ	F6JÉ?JÊJÊJc                  ó   — e Zd ZdZdd„Zy)ÚTestAgentProtocolz+Verify BaseAgent implements Agent protocol.c                óÈ  — ddl m} ddlm}m}  G d„ d|«      } |«       } |«       } |||«      }d}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	t        j                  |«      t        j                  |	«      d
œz  }
t        t        j                  |
«      «      ‚d x}}	d}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	t        j                  |«      t        j                  |	«      d
œz  }
t        t        j                  |
«      «      ‚d x}}	d}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	t        j                  |«      t        j                  |	«      d
œz  }
t        t        j                  |
«      «      ‚d x}}	d}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	t        j                  |«      t        j                  |	«      d
œz  }
t        t        j                  |
«      «      ‚d x}}	d}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	t        j                  |«      t        j                  |	«      d
œz  }
t        t        j                  |
«      «      ‚d x}}	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 }y )Nr   )Ú	BaseAgent)ÚAsyncEventBusÚMemoryTaskQueuec                  ó8   — e Zd Zedd„«       Zedd„«       Zdd„Zy)úPTestAgentProtocol.test_base_agent_has_required_attributes.<locals>.ConcreteAgentc                 ó   — y)NÚTestrB   r#   s    r   ÚnamezUTestAgentProtocol.test_base_agent_has_required_attributes.<locals>.ConcreteAgent.nameä  ó   € àr    c                 ó   — y)Nr´   rB   r#   s    r   r   zUTestAgentProtocol.test_base_agent_has_required_attributes.<locals>.ConcreteAgent.roleè  r%  r    c              “  ó   K  — y ­wr"   rB   )r   Ú	task_datas     r   r+   zXTestAgentProtocol.test_base_agent_has_required_attributes.<locals>.ConcreteAgent.executeì  s	   è ø€ Øùs   ‚Nr9   )r(  r;   r7   r8   )r=   r>   r?   rA   r$  r   r+   rB   r    r   ÚConcreteAgentr!  ã  s-   „ Øòó ðð òó ðôr    r)  r   z5assert %(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
}ÚhasattrrH   )rI   ru   r{   r|   r   r   r+   r4   z5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}Ú
isinstancer   )rI   ru   rJ   rK   )Ú cyberbrain26.agents.orchestratorr  Úcyberbrain26.control_planer  r  r*  rV   rW   rT   rX   rY   rZ   r[   r+  r   )r   r  r  r  r)  ÚbusÚqueuerH   r€   rƒ   rÃ   r_   r�   s                r   Ú'test_base_agent_has_required_attributesz9TestAgentProtocol.test_base_agent_has_required_attributesß  s  € Ý>ßMô
	˜Iô 
	ñ ‹oˆÙÓ!ˆÙ˜c 5Ó)ˆð %Ð%Œw�u˜fÓ%Ð%Ñ%×%×%×%×%Õ%Œw×%×%Ó%Œw×%×%×%×%×%Ò%�u×%×%Ó%�u×%×%Ô%˜f×%×%Ò%Ð%×%×%×%×%×%Ò%Ø(Ð)Œw�u˜jÓ)Ð)Ñ)×)×)×)×)Õ)Œw×)×)Ó)Œw×)×)×)×)×)Ò)�u×)×)Ó)�u×)×)Ô)˜j×)×)Ò)Ð)×)×)×)×)×)Ò)Ø2Ð3Œw�uÐ2Ó3Ð3Ñ3×3×3×3×3Õ3Œw×3×3Ó3Œw×3×3×3×3×3Ò3�u×3×3Ó3�u×3×3Ô3Ð2×3×3Ò3Ð3×3×3×3×3×3Ò3Ø'Ð(Œw�u˜iÓ(Ð(Ñ(×(×(×(×(Õ(Œw×(×(Ó(Œw×(×(×(×(×(Ò(�u×(×(Ó(�u×(×(Ô(˜i×(×(Ò(Ð(×(×(×(×(×(Ò(Ø0Ð1Œw�uÐ0Ó1Ð1Ñ1×1×1×1×1Õ1Œw×1×1Ó1Œw×1×1×1×1×1Ò1�u×1×1Ó1�u×1×1Ô1Ð0×1×1Ò1Ð1×1×1×1×1×1Ò1Ü˜%¤Ó'Ð'Ò'×'×'×'×'Õ'Œz×'×'Ó'Œz×'×'×'×'×'Ò'˜%×'×'Ó'˜%×'×'×'×'×'Ò'¤×'×'Ó'¤×'×'Ô'Ð'×'×'×'×'×'Ñ'r    NrÙ   )r=   r>   r?   r@   r0  rB   r    r   r  r  Ü  s
   „ Ù5ô(r    r  Ú__main__z-vrÙ   ):r@   Ú
__future__r   ÚbuiltinsrV   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterT   r÷   rš   Ú+cyberbrain26.execution_plane.secure_gatewayr   r   Ú+cyberbrain26.extension_layer.agent_registryr   r   r   Ú*cyberbrain26.extension_layer.registry_implr	   r
   Ú$cyberbrain26.security_plane.approvalr   Ú$cyberbrain26.security_plane.identityr   r   r   Ú&cyberbrain26.security_plane.permissionr   r   Ú"cyberbrain26.security_plane.policyr   r   r   rg   rk   Úmarkr…   r�   r�   rª   r¯   r·   rº   rÅ   rÇ   rÊ   rÌ   rÏ   rÑ   rÝ   r  r  r  r  r=   ÚmainÚ__file__rB   r    r   ú<module>rA     s^  ðÙ 0å "ç  „ ƒã ÷÷ ]Ñ \ß dÝ @ß [Ñ [ß Sß G÷ 0ñ  0óF/ó0ð ‡�×Ñò
:ó ð
:ð ‡�×Ñò.ó ð.ð8 ‡�×ÑòVó ðVð2 ‡�×Ñò0ó ð0ð0 ‡�×ÑòZó ðZð* ‡�×ÑòKó ðKð ‡�×ÑòXó ðXð ‡�×Ñò	)ó ð	)ð ‡�×Ñò	)ó ð	)ð ‡�×Ñò)ó ð)ð& ‡�×Ñò)ó ð)ð ‡�×ÑòXó ðX÷.
"ñ 
"ô �Yô  ð< ‡�×Ñò.]ó ð.]ðb ‡�×Ñò2.ó ð2.ðj ‡�×Ñò$*ó ð$*÷N(ñ (ð@ ˆzÒØ€F‡K�K�˜4Ð Õ!ð r    