Ë
   GaBÚƒÝã                  óæ  — 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ZddlZddlZddlmZ ddl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 dd	lmZ  e«       Zej<                  j?                   e
j@                  d
«      du d¬«      Z!dZ"d2d„Z#d2d„Z$d2d„Z%d3d„Z&d3d„Z'd4d„Z(d5d„Z)d6d„Z*d7d„Z+d8d„Z,d9d„Z-d9d„Z.d9d„Z/d:d„Z0d:d„Z1d:d„Z2d:d„Z3d:d„Z4e!	 	 	 	 	 	 d;d „«       Z5d:d!„Z6d:d"„Z7d:d#„Z8d:d$„Z9ej<                  ju                  d%g d&¢«      d<d'„«       Z;	 	 	 	 	 	 d;d(„Z<	 	 	 	 	 	 d;d)„Z=ej<                  ju                  d*g d+¢«      d=d,„«       Z>d:d-„Z?d:d.„Z@d:d/„ZAd:d0„ZBe!	 	 	 	 	 	 d;d1„«       ZCy)>a8  Tests for the authorized ``cyberbrain run`` execution path.

These tests pin the fail-closed behaviour of the rewritten CLI:

* every option that grants anything is validated before a bridge exists, so a
  rejected invocation executes nothing at all;
* a code-carrying step ends closed at the scope gate when ``--scopes`` is empty;
* an approval is required before any code runs, and granting it on the shared
  SQLite store from a second "terminal" lets the very same step succeed;
* a step without an explicitly declared action, or one whose dependency did not
  succeed, is never dispatched;
* no command reports success for a run that failed, refused or blocked.

Output conventions under test
-----------------------------
Diagnostics that ``cyberbrain26.cli`` controls go to stderr through
``typer.echo(..., err=True)``, and no command re-raises a handled exception, so
a CLI failure never produces a Python traceback on stdout and never leaves an
unhandled exception behind ``result.exception``. The libraries below the CLI do
log their own diagnostics - including stack traces at ERROR level - on stderr
when a dispatched step is denied; that is deliberate operational logging in
``orchestration.ptah_bridge`` and is left in place, so the assertions below check
stdout for tracebacks and check ``result.exception`` for crashes.
é    )ÚannotationsN)ÚPath)ÚAny)Ú	CliRunner)Úapp)Úopen_databaseÚresolve_db_pathÚworkspaces_root)ÚApprovalManagerÚbwrapzBubblewrap is unavailable)Úreason)Ú	completedzcreated withÚ
authorizedc                ó^   — 	 | j                   S # t        t        f$ r | j                  cY S w xY w)z1Return the captured stdout across click versions.)ÚstdoutÚAttributeErrorÚ
ValueErrorÚoutput©Úresults    ú?/home/oem/CyberBrain26-unified/tests/test_cli_run_authorized.pyÚ_stdoutr   7   ó/   € ðØ�}‰}ÐøÜœJÐ'ò Ø�}‰}Òðúó   ‚ Ž,«,c                ó^   — 	 | j                   S # t        t        f$ r | j                  cY S w xY w)z1Return the captured stderr across click versions.)Ústderrr   r   r   r   s    r   Ú_stderrr   ?   r   r   c                ó0   — t        | «      t        | «      z   S )z"Return stdout and stderr together.)r   r   r   s    r   Ú_all_outputr   G   s   € ä�6‹?œW V›_Ñ,Ð,ó    c                ó|  — | j                   }d}||k7  }|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        |t        «      }|�sBt        j                  d	| j                  ›�«      d
z   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                  |«      dt        j                  «       v st        j
                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }t        t        j                  |«      «      ‚dx}}d}	t        | «      }|	|v}|söt        j                  d|fd|	|f«      t        j                  |	«      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                  |«      dœz  }dd|iz  }
t        t        j                  |
«      «      ‚dx}	x}}y)zPAssert the command failed cleanly: non-zero exit, no crash, no stdout traceback.r   ©ú!=©z1%(py2)s
{%(py2)s = %(py0)s.exit_code
} != %(py5)sr   ©Úpy0Úpy2Úpy5úassert %(py7)sÚpy7Nz!expected a clean SystemExit, got zV
>assert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.exception
}, %(py4)s)
}Ú
isinstanceÚ
SystemExit)r&   Úpy1Úpy3Úpy4Úpy6Ú	Traceback©únot in©z4%(py1)s not in %(py6)s
{%(py6)s = %(py3)s(%(py4)s)
}r   ©r-   r.   r/   r0   úassert %(py8)sÚpy8)Ú	exit_codeÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚ	exceptionr+   r,   Ú_format_assertmsgr   )r   Ú@py_assert1Ú@py_assert4Ú@py_assert3Ú@py_format6Ú@py_format8Ú@py_assert2Ú@py_assert5Ú@py_format7Ú@py_assert0Ú@py_format9s              r   Ú _assert_failed_without_cli_crashrM   L   s  € à×ÑÐ ˜qÐ Ð˜qÑ × × Õ Ð˜q× × × × × Ñ ˆ6× × Ó ˆ6× × Ô Ð× × Ò ˜q× × × × × × Ó Ø×&Ñ&ð Œ:Ð&¬
Ó3ð Ò3ô ïé ð ,¨F×,<Ñ,<Ð+?Ð@÷ô ïé ÷ò ïé ô ÷ ñ ïé ô ÷ ó ïé ÷ò ïé ð ÷ ñ ïé ð ÷ ò ïé ð '÷ ñ ïé ÷ò ïé ô )3÷ ñ ïé ô )3÷ ò ïé ð 4÷ ÷ ò ïé ÷õ ð Ð-œg f›oÐ-ˆ;˜oÐ-×-×-Õ-ˆ;˜o×-×-Ó-ˆ;×-×-×-×-×-Ð-œg×-×-Ó-œg×-×-×-×-×-Ò- f×-×-Ó- f×-×-Ô-˜o×-×-×-×-×-×-Ô-r    c                ó  — t        | «      }t        D ]ì  }||v}|sât        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      nddt	        j
                  «       v st        j                  |«      rt        j                  |«      nddœz  }t        j                  d|›d|›�«      dz   d	|iz  }t        t        j                  |«      «      ‚d
}Œî y
)z@Assert no success wording was printed anywhere for a failed run.r2   )z%(py0)s not in %(py2)sÚmarkerr   ©r&   r'   zsuccess marker z present in: z
>assert %(py4)sr/   N)r   Ú_SUCCESS_MARKERSr9   r:   r;   r<   r=   r>   rB   r?   r@   )r   r   rO   rC   Ú@py_format3Ú@py_format5s         r   Ú_assert_no_success_claimrT   U   s�   € ä˜Ó €FÜ"ò YˆØ˜VÐ#×X×XÕXˆv˜V×X×X×X×X×XÑXˆv×X×XÓXˆv×X×X×X×X×XÒX˜V×X×XÓX˜V×X×X×XÑX °v°jÀÈfÈZÐ%X×X×X×X×X×XÕXñYr    c                óV   — | dz  j                  t        j                  |d¬«      «       y)z*Write ``roadmaps.json`` into ``data_dir``.úroadmaps.jsoné   )ÚindentN)Ú
write_textÚjsonÚdumps)Údata_dirÚroadmapss     r   Ú_storer^   \   s    € à�Ñ×+Ñ+¬D¯J©J°xÈÔ,JÕKr    c                 ó    — dddddddœ| ¥g dd	œS )
zAReturn a stored coder step whose payload carries executable code.Ús1Úcoderzexecute the code stepÚexecute_pythonzprint('side-effect')Úpython)ÚactionÚcodeÚlanguageÚpending©ÚidÚroleÚdescriptionÚpayloadÚ
depends_onÚstatus© )rl   s    r   Ú
_code_steprp   a   s7   € ð ØØ.à&Ø*Ø ñ
ð ð	
ð Øñð r    c                ó  — t        j                  t        | «      «      }t         j                  |_        	 |j                  d«      D �cg c]  }t        |«      ‘Œ c}|j                  «        S c c}w # |j                  «        w xY w)z2Return every ``audit_events`` row as a plain dict.zSELECT * FROM audit_events)Úsqlite3ÚconnectÚstrÚRowÚrow_factoryÚexecuteÚdictÚclose©Údb_pathÚ
connectionÚrows      r   Ú_audit_rowsr~   r   sc   € ä—‘¤ W£Ó.€JÜ$Ÿ[™[€JÔðØ%/×%7Ñ%7Ð8TÓ%UÖV˜c”�S•	ÒVà×ÑÕùò Wøà×ÑÕús   µA2 ÁA-ÁA2 Á-A2 Á2Bc                óê   — t        j                  t        | «      «      }	 |j                  d«      D �cg c]  }t        |d   «      ‘Œ c}|j	                  «        S c c}w # |j	                  «        w xY w)z;Return every durable task id stored in the ``tasks`` table.úSELECT task_id FROM tasksr   )rr   rs   rt   rw   ry   rz   s      r   Ú	_task_idsr�   |   s[   € ä—‘¤ W£Ó.€JðØ'1×'9Ñ'9Ð:UÓ'VÖW ”�C˜‘F•ÒWà×ÑÕùò Xøà×ÑÕús    A  ³AÁA  ÁA  Á A2c                óæ   — t        j                  t        | «      «      }	 t        |j	                  d|› �«      j                  «       d   «      |j                  «        S # |j                  «        w xY w)z"Return the row count of ``table``.zSELECT COUNT(*) FROM r   )rr   rs   rt   Úintrw   Úfetchonery   )r{   Útabler|   s      r   Ú_table_countr†   …   s\   € ä—‘¤ W£Ó.€JðÜ�:×%Ñ%Ð(=¸e¸WÐ&EÓF×OÑOÓQÐRSÑTÓUà×ÑÕøˆ
×ÑÕús    -A ÁA0c                 óN  — t         j                  t        dg«      } | 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}}d	D �]<  }t        | «      }||v }|�s#t	        j
                  d
|fd||f«      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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}}�Œ? y )Nú--helpr   ©ú==©z1%(py2)s
{%(py2)s = %(py0)s.exit_code
} == %(py5)sr   r%   r)   r*   )ÚplanÚrunÚversionÚ	approvalsÚdoctor©Úin)z0%(py0)s in %(py5)s
{%(py5)s = %(py2)s(%(py3)s)
}Úcommandr   )r&   r'   r.   r(   ©ÚrunnerÚinvoker   r8   r9   r:   r;   r<   r=   r>   r?   r@   r   )r   rC   rD   rE   rF   rG   r“   s          r   Ú'test_top_level_help_lists_every_commandr—   ‘   s0  € Ü�]‰]œ3  
Ó+€FØ×ÑÐ ˜qÐ Ð˜qÑ × × Õ Ð˜q× × × × × Ñ ˆ6× × Ó ˆ6× × Ô Ð× × Ò ˜q× × × × × × Ó ØDó *ˆÜ! &›/Ð)ˆw˜/Ð)×)×)Ö)ˆw˜/×)×)×)×)×)Ñ)ˆw×)×)Ó)ˆw×)×)×)×)×)Ò)œ'×)×)Ó)œ'×)×)×)×)×)Ò) &×)×)Ó) &×)×)Ô)˜/×)×)×)×)×)×)Ó)ñ*r    c                 óŒ  — t         j                  t        ddg«      } | 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}}t        | «      }d
D ]Ð  }||v }|sÆt	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      nddt        j                  «       v st	        j                  |«      rt	        j                  |«      nddœz  }dd|iz  }	t        t	        j                  |	«      «      ‚d }ŒÒ y )Nr�   rˆ   r   r‰   r‹   r   r%   r)   r*   )ú
--data-dirz--dbú--approval-timeoutú--scopesr‘   )z%(py0)s in %(py2)sÚoptionr   rP   zassert %(py4)sr/   r”   )
r   rC   rD   rE   rF   rG   r   rœ   rR   rS   s
             r   Ú/test_run_help_exposes_the_authorization_optionsr�   ˜   s	  € Ü�]‰]œ3 ¨Ð 1Ó2€FØ×ÑÐ ˜qÐ Ð˜qÑ × × Õ Ð˜q× × × × × Ñ ˆ6× × Ó ˆ6× × Ô Ð× × Ò ˜q× × × × × × Ó Ü�V‹_€FØJò  ˆØ˜Ð××Õˆv˜×××××Ñˆv××Óˆv×××××Ò˜××Ó˜××××××Òñ r    c                 óv  — t         j                  t        ddg«      } | 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}}t        | «      }d
}||v}|s™t	        j
                  d|fd||f«      t	        j                  |«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      nddœz  }	dd|	iz  }t        t	        j                  |«      «      ‚d x}}d}||v}|s™t	        j
                  d|fd||f«      t	        j                  |«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      nddœz  }	dd|	iz  }t        t	        j                  |«      «      ‚d x}}y )Nr�   rˆ   r   r‰   r‹   r   r%   r)   r*   z--modelr2   ©z%(py1)s not in %(py3)sr   ©r-   r.   úassert %(py5)sr(   z--langr”   )
r   rC   rD   rE   rF   rG   r   rK   rH   Ú@py_format4s
             r   Ú-test_run_help_no_longer_exposes_model_optionsr£       sD  € Ü�]‰]œ3 ¨Ð 1Ó2€FØ×ÑÐ ˜qÐ Ð˜qÑ × × Õ Ð˜q× × × × × Ñ ˆ6× × Ó ˆ6× × Ô Ð× × Ò ˜q× × × × × × Ó Ü�V‹_€FØÐ"ˆ9˜FÐ"×"×"Õ"ˆ9˜F×"×"Ó"ˆ9×"×"×"×"×"Ð"˜F×"×"Ó"˜F×"×"×"×"×"×"Ó"ØÐ!ˆ8˜6Ð!×!×!Õ!ˆ8˜6×!×!Ó!ˆ8×!×!×!×!×!Ð!˜6×!×!Ó!˜6×!×!×!×!×!×!Ô!r    c           
     óž  — t         j                  t        ddddt        | «      g«      }t	        |«       d}t        |«      }||v }|söt        j                  d|fd||f«      t        j                  |«      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                  |«      d	œz  }d
d|iz  }t        t        j                  |«      «      ‚d x}x}}t        |«       y )Nr�   ú--idúno-such-roadmapr™   r‘   ©z0%(py1)s in %(py6)s
{%(py6)s = %(py3)s(%(py4)s)
}r   r   r5   r6   r7   )r•   r–   r   rt   rM   r   r9   r:   r>   r;   r<   r=   r?   r@   rT   ©Útmp_pathr   rK   rI   rH   rJ   rL   s          r   Ú-test_run_with_unknown_roadmap_id_fails_closedrª   «   sÄ   € Ü�]‰]œ3 ¨Ð0AÀ<ÔQTÐU]ÓQ^Ð _Ó`€Fä$ VÔ,ØÐ/¤¨£Ð/Ð Ð/×/×/Õ/Ð ×/×/Ó/Ð×/×/×/×/×/Ð/¤×/×/Ó/¤×/×/×/×/×/Ò/¨×/×/Ó/¨×/×/Ô/ ×/×/×/×/×/×/Ó/Ü˜VÕ$r    c           
     ó¨  — t         j                  t        ddddt        | «      ddg«      }|j                  }d}||k7  }|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}}t        | ¬«      }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                  |«      t        j                  |	«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}
}	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                  |«      t        j                  |	«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}
}	y )Nr�   r¥   r¦   r™   r›   rc   r   r"   r$   r   r%   r)   r*   ©r\   Útasksr‰   ©z9%(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
} == %(py8)sr†   r{   ©r&   r-   r.   r(   r7   úassert %(py10)sÚpy10Úapproval_requests)r•   r–   r   rt   r8   r9   r:   r;   r<   r=   r>   r?   r@   r	   r†   )r©   r   rC   rD   rE   rF   rG   r{   rH   Ú@py_assert7Ú@py_assert6rL   Ú@py_format11s                r   Ú3test_run_with_unknown_roadmap_id_dispatches_no_stepr¶   ³   sî  € Ü�]‰]Üˆe�VÐ.°¼cÀ(»mÈZÐYaÐbó€Fð ×ÑÐ ˜qÐ Ð˜qÑ × × Õ Ð˜q× × × × × Ñ ˆ6× × Ó ˆ6× × Ô Ð× × Ò ˜q× × × × × × Ó Ü xÔ0€GØ!(Ð.Œ<˜ Ó)Ð.¨QÐ.Ð)¨QÑ.×.×.Ö.Ð)¨Q×.×.×.×.×.Ñ.Œ<×.×.Ó.Œ<×.×.×.×.×.Ò.˜×.×.Ó.˜×.×.Ô. ×.×.Ò.Ð)×.×.Ò.¨Q×.×.×.×.×.×.Õ.Ø!4Ð:Œ<˜Ð!4Ó5Ð:¸Ð:Ð5¸Ñ:×:×:Ö:Ð5¸×:×:×:×:×:Ñ:Œ<×:×:Ó:Œ<×:×:×:×:×:Ò:˜×:×:Ó:˜×:×:Ô:Ð!4×:×:Ò:Ð5×:×:Ò:¸×:×:×:×:×:×:Ö:r    c           
     ó®	  — t        | dddt        «       gdœ¬«       t        j                  t        ddddt        | «      g«      }t        |«       d}t        |«      }||v }|söt        j                  d	|fd
||f«      t        j                  |«      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                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}d}t!        |«      }||v }|söt        j                  d	|fd
||f«      t        j                  |«      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                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}t#        |«       t%        t'        | ¬«      «      }|D �cg c]  }|d   dk(  sŒ|d   dk(  sŒ|‘Œ }	}|	s~t        j(                  d|› �«      dz   ddt        j                  «       v st        j                  |	«      rt        j                  |	«      ndiz  }
t        t        j                  |
«      «      ‚|	d   d   }|j*                  }d} ||«      }|stdt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }t        t        j                  |«      «      ‚d x}x}x}}|D �cg c]  }|d   dk(  sŒ|‘Œ }}|sed dd!t        j                  «       v st        j                  |«      rt        j                  |«      nd!iz  }
t        t        j                  |
«      «      ‚|d   d   }d"}||k(  }|slt        j                  d#|fd$||f«      t        j                  |«      t        j                  |«      d%œz  }d&d'|iz  }t        t        j                  |«      «      ‚d x}x}}y c c}w c c}w )(NÚgatedrg   ©ri   Únamern   Ústeps©r¸   r�   r¥   r™   zcoder scopes: (none)r‘   r§   r   r   r5   r6   r7   r`   r   r¬   Údenyrd   rb   z*no scope denial recorded in audit_events: ú
>assert %(py0)sr&   Údenialsr   Úerrorz.Agent ptah-coder lacks required scope 'python'zLassert %(py7)s
{%(py7)s = %(py3)s
{%(py3)s = %(py1)s.startswith
}(%(py5)s)
})r-   r.   r(   r*   Úscope_check_failedzassert %(py0)sÚscope_checkszmissing_scope:pythonr‰   ©z%(py1)s == %(py4)s©r-   r/   úassert %(py6)sr0   )r^   rp   r•   r–   r   rt   rM   r   r9   r:   r>   r;   r<   r=   r?   r@   r   rT   r~   r	   rB   Ú
startswith)r©   r   rK   rI   rH   rJ   rL   Úrowsr}   r¿   Ú@py_format1rD   r´   rG   rÂ   rE   rS   s                    r   Ú3test_code_step_without_scopes_is_denied_and_auditedrÉ   Á   s  € Ü
ØØ g¸ÌjËlÈ^Ñ\õô
 �]‰]œ3 ¨°¸ÄsÈ8Ã}Ð UÓV€Fä$ VÔ,Ø!Ð4¤W¨V£_Ð4Ð! _Ð4×4×4Õ4Ð! _×4×4Ó4Ð!×4×4×4×4×4Ð4¤W×4×4Ó4¤W×4×4×4×4×4Ò4¨V×4×4Ó4¨V×4×4Ô4 _×4×4×4×4×4×4Ó4ØÐ"”7˜6“?Ð"ˆ4�?Ð"×"×"Õ"ˆ4�?×"×"Ó"ˆ4×"×"×"×"×"Ð"”7×"×"Ó"”7×"×"×"×"×"Ò"˜6×"×"Ó"˜6×"×"Ô"�?×"×"×"×"×"×"Ó"Ü˜VÔ$ä”°Ô9Ó:€DØ"Öd�s c¨(¡m°vÓ&=À#ÀhÁ-ÐScÓBcŠsÐd€GÐdÙ×GÖGÐ@ÀÀÐG×G×G×G×G×GÔGˆ7×G×GÓGˆ7×G×G×G×G×GØ�1‰:�gÑÐ[Ð×)Ñ)Ð[Ð*ZÐ[Ñ)Ð*ZÓ[Ð[Ñ[×[×[Ð×[×[Ò[Ð)×[×[Ò[Ð*Z×[×[Ò[Ð[×[×[×[×[×[Ö[à#'ÖQ˜C¨3¨x©=Ð<PÓ+P’CÐQ€LÐQÙ××××Öˆ<××Óˆ<×××××Ø˜‰?˜7Ñ#Ð=Ð'=Ð=Ð#Ð'=Ñ=×=×=Õ=Ð#Ð'=×=×=Ó=Ð#×=×=Ò=Ð'=×=×=×=×=×=×=Ô=ùò eùò Rs   ÊSÊSÊ(SÏSÏSc           
     óD  — t        | dddt        «       gdœ¬«       t        j                  t        ddddt        | «      g«      }|j                  }d}||k7  }|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}}t        | ¬«      }d}t!        ||«      }d}	||	k(  }
|
�sgt        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                  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¸   rg   r¹   r¼   r�   r¥   r™   r   r"   r$   r   r%   r)   r*   r¬   r²   r‰   ©za%(py8)s
{%(py8)s = %(py0)s(%(py4)s
{%(py4)s = %(py1)s(data_dir=%(py2)s)
}, %(py6)s)
} == %(py11)sr†   r	   r©   ©r&   r-   r'   r/   r0   r7   Úpy11úassert %(py13)sÚpy13)r^   rp   r•   r–   r   rt   r8   r9   r:   r;   r<   r=   r>   r?   r@   r	   r†   )r©   r   rC   rD   rE   rF   rG   rI   r³   Ú@py_assert10Ú@py_assert9Ú@py_format12Ú@py_format14s                r   Ú8test_code_step_without_scopes_raises_no_approval_requestrÔ   Ø   s”  € Ü
ØØ g¸ÌjËlÈ^Ñ\õô
 �]‰]œ3 ¨°¸ÄsÈ8Ã}Ð UÓV€FØ×ÑÐ ˜qÐ Ð˜qÑ × × Õ Ð˜q× × × × × Ñ ˆ6× × Ó ˆ6× × Ô Ð× × Ò ˜q× × × × × × Ó ô (°Ô:ÐUÐ<OÐUŒ<Ð:Ð<OÓPÐUÐTUÐUÐPÐTUÑU×U×UÖUÐPÐTU×U×U×U×U×UÑUŒ<×U×UÓUŒ<×U×U×U×U×UÒUœ×U×UÓUœ×U×U×U×U×UÒU°×U×UÓU°×U×UÔUÐ:×U×UÒUÐ<O×U×UÒUÐP×U×UÒUÐTU×U×U×U×U×U×U×UÐUr    c                óØ  — t        | dddt        «       gdœ¬«       t        j                  t        ddddt        | «      dd	d
dg	«      }t        |«       d}t        |«      }||v }|söt        j                  d|fd||f«      t        j                  |«      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                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}d}t        |«      }||v }|söt        j                  d|fd||f«      t        j                  |«      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                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}t!        |«       t#        | ¬«      }d}t%        ||«      }d}	||	kD  }
|
�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}
}	t'        j(                  t        |«      «      }	 |j+                  d«      D �cg c]  }|d   ‘Œ	 }}|j-                  «        d}||v}|s™t        j                  d |fd!||f«      t        j                  |«      d"t        j                  «       v st        j                  |«      rt        j                  |«      nd"d#œz  }d$d%|iz  }t        t        j                  |«      «      ‚d x}}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                  |«      t        j                  |	«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}
}	y c c}w # |j-                  «        w xY w))Nr¸   rg   r¹   r¼   r�   r¥   r™   r›   rc   rš   ú0.2ÚApprovalr‘   r§   r   r   r5   r6   r7   rb   r¬   r²   r   )ú>)z8%(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
} > %(py8)sr†   r{   r¯   r°   r±   z$SELECT status FROM approval_requestsr2   rŸ   Ústatusesr    r¡   r(   Úapproval_recordsr‰   r®   )r^   rp   r•   r–   r   rt   rM   r   r9   r:   r>   r;   r<   r=   r?   r@   rT   r	   r†   rr   rs   rw   ry   )r©   r   rK   rI   rH   rJ   rL   r{   rD   r³   r´   rµ   r|   r}   rÙ   r¢   rF   s                    r   Ú9test_code_step_without_approval_reports_the_approval_gaterÛ   è   sˆ  € Ü
ØØ g¸ÌjËlÈ^Ñ\õô
 �]‰]ÜàØØØÜ�‹MØØØ Øð
	
ó€Fô % VÔ,ØÐ(œ ›Ð(ˆ:˜Ð(×(×(Õ(ˆ:˜×(×(Ó(ˆ:×(×(×(×(×(Ð(œ×(×(Ó(œ×(×(×(×(×(Ò( ×(×(Ó( ×(×(Ô(˜×(×(×(×(×(×(Ó(ØÐ.œw v›Ð.Ð˜Ð.×.×.Õ.Ð˜×.×.Ó.Ð×.×.×.×.×.Ð.œw×.×.Ó.œw×.×.×.×.×.Ò. v×.×.Ó. v×.×.Ô.˜×.×.×.×.×.×.Ó.Ü˜VÔ$ä xÔ0€Gð "5Ð9Œ<˜Ð!4Ó5Ð9¸Ð9Ð5¸Ñ9×9×9Ö9Ð5¸×9×9×9×9×9Ñ9Œ<×9×9Ó9Œ<×9×9×9×9×9Ò9˜×9×9Ó9˜×9×9Ô9Ð!4×9×9Ò9Ð5×9×9Ò9¸×9×9×9×9×9×9Õ9Ü—‘¤ W£Ó.€JðØ&0×&8Ñ&8Ð9_Ó&`Öa˜s�C˜“FÐaˆÐaà×ÑÔØÐ$ˆ9˜HÐ$×$×$Õ$ˆ9˜H×$×$Ó$ˆ9×$×$×$×$×$Ð$˜H×$×$Ó$˜H×$×$×$×$×$×$Ó$Ø!3Ð9Œ<˜Ð!3Ó4Ð9¸Ð9Ð4¸Ñ9×9×9Ö9Ð4¸×9×9×9×9×9Ñ9Œ<×9×9Ó9Œ<×9×9×9×9×9Ò9˜×9×9Ó9˜×9×9Ô9Ð!3×9×9Ò9Ð4×9×9Ò9¸×9×9×9×9×9×9Ö9ùò	 bøà×ÑÕús   ÏW Ï$WÏ0W ×W ×W)c                ó   ‡ ‡ — |j                  dt        ‰ «      «       |j                  dd¬«       t        ‰ ¬«      dz  }|j	                  d¬«       |d	z  }t        ‰ d
d
dt        dt        |«      ¬«      gdœ¬«       t        j                  t        ddd
dt        ‰ «      ddddg	«      }|j                  }d}||k7  }|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&                  } |«       }| }
|
s�ddt        j                  «       v st        j                  |«      rt        j                   |«      ndt        j                   |«      t        j                   |«      d œz  }t#        t        j$                  |«      «      ‚d x}x}}
t)        ‰ ¬«      }i Š dWˆ ˆ fd!„}t+        j,                  |¬"«      }t/        «       }|j1                  «        	 t3        t5        |d¬#«      ¬$«      }|j6                  }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}}t9        j:                  «       d(z   }|j=                  «       r³t9        j:                  «       |k  rœ|j?                  «       D ]L  }|j@                  |v rŒ|jC                  |j@                  d)d*«      }|€Œ2|jE                  |j@                  «       ŒN t9        jF                  d+«       |j=                  «       rt9        j:                  «       |k  rŒœ|jI                  d,¬-«       |j<                  } |«       }| }
|
s£t        jJ                  d.«      d/z   d0t        j                  «       v st        j                  |«      rt        j                   |«      nd0t        j                   |«      t        j                   |«      d œz  }t#        t        j$                  |«      «      ‚d x}x}}
d1}|‰ v }|s¯t        j                  d2|fd3|‰ f«      t        j                   |«      d4t        j                  «       v st        j                  ‰ «      rt        j                   ‰ «      nd4d5œz  }t        jJ                  d6«      d7z   d8|iz  }t#        t        j$                  |«      «      ‚d x}}‰ d1   }|s{t        jJ                  d9«      d:z   d;d<t        j                  «       v st        j                  |«      rt        j                   |«      nd<iz  }t#        t        j$                  |«      «      ‚|j                  }d}||k(  }|sÌt        j                  d=|fd>||f«      d1t        j                  «       v st        j                  |«      rt        j                   |«      nd1t        j                   |«      t        j                   |«      dœz  }t        jJ                  tM        |«      «      d?z   d|iz  }	t#        t        j$                  |	«      «      ‚d x}x}}d@}tO        |«      }
||
v }|söt        j                  d2|fdA||
f«      t        j                   |«      dBt        j                  «       v st        j                  tN        «      rt        j                   tN        «      ndBd1t        j                  «       v st        j                  |«      rt        j                   |«      nd1t        j                   |
«      dCœz  }dDdE|iz  }t#        t        j$                  |«      «      ‚d x}x}}
dF}tO        |«      }
||
v}|söt        j                  dG|fdH||
f«      t        j                   |«      dBt        j                  «       v st        j                  tN        «      rt        j                   tN        «      ndBd1t        j                  «       v st        j                  |«      rt        j                   |«      nd1t        j                   |
«      dCœz  }dDdE|iz  }t#        t        j$                  |«      «      ‚d x}x}}
|j&                  } |«       }|s�dIdt        j                  «       v st        j                  |«      rt        j                   |«      ndt        j                   |«      t        j                   |«      d œz  }t#        t        j$                  |«      «      ‚d x}}|jP                  } |«       }dJ}||k(  }
|
sÁt        j                  d=|
fdK||f«      dt        j                  «       v st        j                  |«      rt        j                   |«      ndt        j                   |«      t        j                   |«      t        j                   |«      dLœz  }	dMdN|	iz  }t#        t        j$                  |«      «      ‚d x}x}x}
}dO}tS        ||«      }tU        |«      }||k(  }|�s”t        j                  d=|fdP||f«      dQt        j                  «       v st        j                  tR        «      rt        j                   tR        «      ndQdRt        j                  «       v st        j                  |«      rt        j                   |«      ndRt        j                   |«      t        j                   |«      dSt        j                  «       v st        j                  tT        «      rt        j                   tT        «      ndSd<t        j                  «       v st        j                  |«      rt        j                   |«      nd<t        j                   |«      dTœz  }dUdV|iz  }t#        t        j$                  |«      «      ‚d x}x}x}}y # |jI                  d,¬-«       w xY w)XNÚCYBERBRAIN_DATA_DIRÚCYBERBRAIN_WORKSPACES_ROOTF©Úraisingr¬   Ú	workspaceT©Úparentsúran.txtr¸   rg   ú1open('/workspace/ran.txt', 'w').write('executed')©re   rá   r¹   r¼   r�   r¥   r™   r›   rc   rš   rÖ   r   r"   r$   Úblockedr%   r)   r*   zEassert not %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}rO   ©r&   r'   r/   c                 ód   •— t         j                  t        ddddt        ‰«      ddddg	«      ‰ d	<   y )
Nr�   r¥   r¸   r™   r›   rc   rš   Ú30r   ©r•   r–   r   rt   ©Úoutcomesr©   s   €€r   Ú_run_in_backgroundz`test_code_step_runs_after_an_approval_is_granted_on_the_shared_store.<locals>._run_in_backgroundD  ó=   ø€ Ü#Ÿ]™]ÜàØØØÜ�H“ØØØ$Øð
ó
ˆ�Òr    ©Útarget©r{   Úpersist©Údatabase©úis not©z4%(py2)s
{%(py2)s = %(py0)s.database
} is not %(py5)sÚmanagerç      N@útest-reviewerúgranted by testç{®Gáz”?éx   ©Útimeoutú!the background run never finishedúI
>assert not %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_alive
}()
}Úworkerr   r‘   ©z%(py1)s in %(py3)srí   r    ú*the background run never produced a resultú
>assert %(py5)sr(   zAno approval request was ever raised, so nothing could be approvedr¾   r&   Úapprovedr‰   r‹   ú
>assert %(py7)sr   r§   r   r5   r6   r7   r1   r2   r4   zAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}Úexecuted©zH%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.read_text
}()
} == %(py7)s©r&   r'   r/   r*   úassert %(py9)sÚpy9rÚ   )zY%(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
} == %(py10)s
{%(py10)s = %(py7)s(%(py8)s)
}r†   r{   Úlen)r&   r-   r.   r(   r*   r7   r±   zassert %(py12)sÚpy12©ÚreturnÚNone)+Úsetenvrt   Údelenvr
   Úmkdirr^   rp   r•   r–   r   r8   r9   r:   r;   r<   r=   r>   r?   r@   Úexistsr	   Ú	threadingÚThreadÚsetÚstartr   r   rõ   ÚtimeÚ	monotonicÚis_aliveÚlist_pendingÚ
request_idÚapproveÚaddÚsleepÚjoinrB   r   r   Ú	read_textr†   r  )!r©   Úmonkeypatchrá   rO   rç   rC   rD   rE   rF   rG   rI   r{   rî   r  r  rù   ÚdeadlineÚrequestÚdecisionrK   rH   r¢   r   rÈ   rJ   rL   rS   r´   Ú@py_format10rÑ   rµ   Ú@py_format13rí   s!   `                               @r   ÚDtest_code_step_runs_after_an_approval_is_granted_on_the_shared_storer+    s—  ù€ ð ×ÑÐ,¬c°(«mÔ<Ø×ÑÐ3¸UÐÔCÜ¨Ô2°[Ñ@€IØ‡O�O˜D€OÔ!Ø˜Ñ"€FÜ
ØàØØäØLÜ! )›nôðñ	

õô  �m‰mÜàØØØÜ�‹MØØØ Øð
	
ó€Gð ×ÑÐ! Ð!Ð Ñ!×!×!Õ!Ð ×!×!×!×!×!Ñ!ˆ7×!×!Ó!ˆ7×!×!Ô!Ð×!×!Ò! ×!×!×!×!×!×!Ó!Ø�}‰}Ð‰}‹ÐˆÐÐÑ××××Õˆv××Óˆv××Ôˆ}××Òˆ×××××Ôô  xÔ0€GØ!€Hö
ô  ×ÑÐ%7Ô8€FÜ›€HØ
‡L�L„Nð!Ü!¬=ÀÐRVÔ+WÔXˆØ×ÑÐ+ tÐ+Ð tÐ+×+×+Õ+Ð t×+×+×+×+×+Ñ+ˆw×+×+Ó+ˆw×+×+Ô+Ð×+×+Ò+ t×+×+×+×+×+×+Ó+Ü—>‘>Ó# dÑ*ˆØ�o‰oÔ¤D§N¡NÓ$4°xÒ$?Ø"×/Ñ/Ó1ò 5�Ø×%Ñ%¨Ñ1ØØ"Ÿ?™?¨7×+=Ñ+=¸ÐPaÓb�ØÑ'Ø—L‘L ×!3Ñ!3Õ4ð5ô �J‰J�tÔð �o‰oÔ¤D§N¡NÓ$4°xÓ$?ð 	�‰˜CˆÔ Ø�‰ÐE‰Ó ÐEÐ Ð ÐEÑ ×EÖEÐ"E×E×E×E×E×EÓEˆv×E×EÓEˆv×E×EÔEˆ×E×EÒEÐ ×E×E×E×E×EÔEØÐMˆ8�xÐ×M×MÕMˆ8�x×M×MÓMˆ8×M×M×M×M×MÐM�x×M×MÓM�x×M×M×MÑMÐ!M×M×M×M×M×MÖMà�hÑ€FÙ×XÖXÐX×X×X×X×X×XÔXˆ8×X×XÓXˆ8×X×X×X×X×XØ×ÑÐ5˜qÐ5Ð˜qÑ ×5×5Õ5Ð˜q×5×5×5×5×5Ñ5ˆ6×5×5Ó5ˆ6×5×5Ô5Ð×5×5Ò5˜q×5×5×5¤+¨fÓ"5×5×5×5×5×5×5Ð5ØÐ)œ' &›/Ð)ˆ;˜/Ð)×)×)Õ)ˆ;˜/×)×)Ó)ˆ;×)×)×)×)×)Ð)œ'×)×)Ó)œ'×)×)×)×)×)Ò) &×)×)Ó) &×)×)Ô)˜/×)×)×)×)×)×)Ó)ØÐ-œg f›oÐ-ˆ;˜oÐ-×-×-Õ-ˆ;˜o×-×-Ó-ˆ;×-×-×-×-×-Ð-œg×-×-Ó-œg×-×-×-×-×-Ò- f×-×-Ó- f×-×-Ô-˜o×-×-×-×-×-×-Ó-ð �=‰=Ð‰=‹?Ð‰?××××Õˆ6××Óˆ6××Ôˆ=××Òˆ?×××××ÒØ×ÑÐ+ÑÓÐ+ Ð+Ð Ñ+×+×+Õ+Ð ×+×+×+×+×+Ñ+ˆ6×+×+Ó+ˆ6×+×+Ô+Ð×+×+Ò+Ð×+×+Ò+ ×+×+×+×+×+×+Õ+Ø!3ÐEŒ<˜Ð!3Ó4ÐE¼¸H»ÐEÐ4¸ÑE×E×EÖEÐ4¸×E×E×E×E×EÑEŒ<×E×EÓEŒ<×E×E×E×E×EÒE˜×E×EÓE˜×E×EÔEÐ!3×E×EÒEÐ4×E×E×E×E×EÐE¼×E×EÓE¼×E×E×E×E×EÒE¸H×E×EÓE¸H×E×EÔE¸×E×E×E×E×E×EÖEøð 	�‰˜CˆÕ ús   É#Eq9 ÏAq9 ñ9rc                ó¸	  — t        | ddddddddig ddœgd	œ¬
«       t        j                  t        ddddt	        | «      ddg«      }t        |«       d}t        |«      }||v }|söt        j                  d|fd||f«      t        j                  |«      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                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}d}t        |«      }||v }|söt        j                  d|fd||f«      t        j                  |«      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                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}t        |«       t!        | ¬«      }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                  |«      t        j                  |	«      dœz  }d d!|iz  }t        t        j                  |«      «      ‚d x}x}x}
}	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                  |«      t        j                  |	«      dœz  }d d!|iz  }t        t        j                  |«      «      ‚d x}x}x}
}	y )#NÚsilentrg   zno-action-stepÚplannerz planner output carries no actionÚgoalzdo somethingrh   r¹   )r-  r�   r¥   r™   r›   rc   r‘   r§   r   r   r5   r6   r7   zdeclares no 'action'r¬   r­   r   r‰   r®   r†   r{   r¯   r°   r±   r²   )r^   r•   r–   r   rt   rM   r   r9   r:   r>   r;   r<   r=   r?   r@   rT   r	   r†   )r©   r   rK   rI   rH   rJ   rL   r{   rD   r³   r´   rµ   s               r   Ú,test_step_without_declared_action_is_refusedr0  y  sç  € Ü
ØàØØð +Ø%Ø#EØ &¨Ð7Ø"$Ø'ñð	ñ	
õô& �]‰]Üˆe�V˜X |´S¸³]ÀJÐPXÐYó€Fô % VÔ,ØÐ.œw v›Ð.Ð˜Ð.×.×.Õ.Ð˜×.×.Ó.Ð×.×.×.×.×.Ð.œw×.×.Ó.œw×.×.×.×.×.Ò. v×.×.Ó. v×.×.Ô.˜×.×.×.×.×.×.Ó.Ø!Ð4¤W¨V£_Ð4Ð! _Ð4×4×4Õ4Ð! _×4×4Ó4Ð!×4×4×4×4×4Ð4¤W×4×4Ó4¤W×4×4×4×4×4Ò4¨V×4×4Ó4¨V×4×4Ô4 _×4×4×4×4×4×4Ó4Ü˜VÔ$ä xÔ0€GØ!(Ð.Œ<˜ Ó)Ð.¨QÐ.Ð)¨QÑ.×.×.Ö.Ð)¨Q×.×.×.×.×.Ñ.Œ<×.×.Ó.Œ<×.×.×.×.×.Ò.˜×.×.Ó.˜×.×.Ô. ×.×.Ò.Ð)×.×.Ò.¨Q×.×.×.×.×.×.Õ.Ø!4Ð:Œ<˜Ð!4Ó5Ð:¸Ð:Ð5¸Ñ:×:×:Ö:Ð5¸×:×:×:×:×:Ñ:Œ<×:×:Ó:Œ<×:×:×:×:×:Ò:˜×:×:Ó:˜×:×:Ô:Ð!4×:×:Ò:Ð5×:×:Ò:¸×:×:×:×:×:×:Ö:r    c                ó¶  — t         j                  t        ddddddt        | «      g«      }|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}}t        j                  | dz  j                  «       «      }|d   d   }|sNt        j                   d«      dz   dt        j                  |«      iz  }	t        t        j                  |	«      «      ‚d }t         j                  t        ddddt        | «      ddg«      }
t#        |
«       t%        |
«       t'        t)        | ¬«      «      D �cg c]	  }d|v sŒ|‘Œ }}g }||k(  }|slt        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y c c}w )NrŒ   ú--goalzship the thingr¥   Úplannedr™   r   r‰   r‹   r   r%   r)   r*   rV   r»   z*the planner produced no steps to test withz
>assert %(py1)sr-   r�   r›   rc   r¬   zstep-1rÃ   rÄ   rÅ   r0   )r•   r–   r   rt   r8   r9   r:   r;   r<   r=   r>   r?   r@   rZ   Úloadsr$  rB   rM   rT   r�   r	   )r©   r   rC   rD   rE   rF   rG   ÚstoredrK   Ú@py_format2Ú
run_resultÚtask_idrH   rS   rJ   s                  r   Ú1test_planner_produced_roadmap_is_entirely_refusedr9  ›  s£  € Ü�]‰]Üˆf�hÐ 0°&¸)À\ÔSVÐW_ÓS`Ðaó€Fð ×ÑÐ ˜qÐ Ð˜qÑ × × Õ Ð˜q× × × × × Ñ ˆ6× × Ó ˆ6× × Ô Ð× × Ò ˜q× × × × × × Ó Ü�Z‰Z˜ OÑ3×>Ñ>Ó@ÓA€FØ�)Ñ˜WÑ%ÐSÑ%×SÖSÐ'S×S×SÖSÐ%×S×S×S×S×Sä—‘Üˆe�V˜Y¨´c¸(³mÀZÐQYÐZó€Jô % ZÔ0Ü˜ZÔ(ô $-¬_ÀhÔ-OÓ#PÖh˜ÐT\Ð`gÒTgŠGÐhÐnÐhÐlnÐnÐhÐlnÑn×n×nÕnÐhÐln×n×nÓnÐh×n×nÒnÐln×n×n×n×n×n×nÔnùÒhs   Ç
	IÇIc           
     ó>  — t        | dddt        «       gdœ¬«       t        j                  t        ddddt        | «      dd	g«      }|j                  }d
}||k7  }|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}}t        |«      }d}||v }	|	s™t        j                  d|	fd||f«      t        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }
dd|
iz  }t        t        j                  |«      «      ‚d x}}	d}||v }	|	s™t        j                  d|	fd||f«      t        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }
dd|
iz  }t        t        j                  |«      «      ‚d x}}	d}||v }	|	s™t        j                  d|	fd||f«      t        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }
dd|
iz  }t        t        j                  |«      «      ‚d x}}	t!        | ¬«      }	|	j"                  } |«       }| }|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                  |«      t        j                  |«      dœz  }t        t        j                  |«      «      ‚d x}	x}x}}y )Nr¸   rg   r¹   r¼   r�   r¥   r™   r›   zpython,teleportr   r"   r$   r   r%   r)   r*   Úteleportr‘   r  r   r    r¡   r(   zValid scopes are:rc   r¬   úlassert not %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py0)s(data_dir=%(py1)s)
}.exists
}()
}r	   r©   ©r&   r-   r.   r(   r*   )r^   rp   r•   r–   r   rt   r8   r9   r:   r;   r<   r=   r>   r?   r@   r   r	   r  )r©   r   rC   rD   rE   rF   rG   r   rK   rH   r¢   r´   Ú@py_assert8rL   s                 r   Ú3test_unknown_scope_is_rejected_and_nothing_executesr?  °  sp  € Ü
ØØ g¸ÌjËlÈ^Ñ\õô
 �]‰]ÜØ	�˜ ¬s°8«}¸jÐJ[Ð\ó€Fð
 ×ÑÐ ˜qÐ Ð˜qÑ × × Õ Ð˜q× × × × × Ñ ˆ6× × Ó ˆ6× × Ô Ð× × Ò ˜q× × × × × × Ó Ü˜Ó €FØÐˆ:˜Ð××Õˆ:˜××Óˆ:×××××Ð˜××Ó˜××××××ÓØÐ(Ð &Ð(×(×(Õ(Ð &×(×(Ó(Ð×(×(×(×(×(Ð( &×(×(Ó( &×(×(×(×(×(×(Ó(ØÐˆ8�vÐ××Õˆ8�v××Óˆ8×××××Ð�v××Ó�v××××××Óä¨Ô1Ð:Ð1×8Ñ8Ð:Ñ8Ó:Ð:Ð:Ð:Ð:Ñ:×:×:×:×:Õ:Œ×:×:Ó:Œ×:×:×:×:×:Ò:¨×:×:Ó:¨×:×:Ô:Ð1×:×:Ò:Ð8×:×:Ò:Ð:×:×:×:×:×:×:r    c           
     ó2  — t         j                  t        ddddt        | «      ddg«      }|j                  }d}||k7  }|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}t        |«      }||v }	|	söt        j                  d|	fd||f«      t        j                  |«      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                  |«      dœz  }
dd|
iz  }t        t        j                  |«      «      ‚d x}x}	}t        | ¬«      }	|	j                  } |«       }| }|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                  |«      t        j                  |«      dœz  }t        t        j                  |«      «      ‚d x}	x}x}}y )Nr�   r¥   Úanythingr™   r›   Únoper   r"   r$   r   r%   r)   r*   r‘   r§   r   r5   r6   r7   r¬   r<  r	   r©   r=  )r•   r–   r   rt   r8   r9   r:   r;   r<   r=   r>   r?   r@   r   r	   r  )r©   r   rC   rD   rE   rF   rG   rK   rI   rH   rJ   rL   r´   r>  s                 r   Ú5test_unknown_scope_is_rejected_even_without_a_roadmaprC  Ä  sÊ  € Ü�]‰]Üˆe�V˜Z¨´s¸8³}ÀjÐRXÐYó€Fð ×ÑÐ ˜qÐ Ð˜qÑ × × Õ Ð˜q× × × × × Ñ ˆ6× × Ó ˆ6× × Ô Ð× × Ò ˜q× × × × × × Ó ØÐ(”[ Ó(Ð(ˆ6Ð(Ð(×(×(Õ(ˆ6Ð(×(×(Ó(ˆ6×(×(×(×(×(Ð(”[×(×(Ó(”[×(×(×(×(×(Ò( ×(×(Ó( ×(×(Ô(Ð(×(×(×(×(×(×(Ó(Ü¨Ô1Ð:Ð1×8Ñ8Ð:Ñ8Ó:Ð:Ð:Ð:Ð:Ñ:×:×:×:×:Õ:Œ×:×:Ó:Œ×:×:×:×:×:Ò:¨×:×:Ó:¨×:×:Ô:Ð1×:×:Ò:Ð8×:×:Ò:Ð:×:×:×:×:×:×:r    r   )Ú0z-1z-0.5c                óÄ  — t        | dddt        «       gdœ¬«       t        j                  t        ddddt        | «      dd	d
|g	«      }|j                  }d}||k7  }|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}}t        |«      }d}	|	|v }
|
s™t        j                  d|
fd|	|f«      t        j                  |	«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }dd|iz  }t        t        j                  |«      «      ‚d x}	}
t!        |«       t#        | ¬«      }
|
j$                  } |«       }| }|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                  |«      t        j                  |«      dœz  }t        t        j                  |«      «      ‚d x}
x}x}}y )Nr¸   rg   r¹   r¼   r�   r¥   r™   r›   rc   rš   r   r"   r$   r   r%   r)   r*   z7--approval-timeout must be a positive number of secondsr‘   r  r   r    r¡   r(   r¬   r<  r	   r©   r=  )r^   rp   r•   r–   r   rt   r8   r9   r:   r;   r<   r=   r>   r?   r@   r   rT   r	   r  )r©   r   r   rC   rD   rE   rF   rG   r   rK   rH   r¢   r´   r>  rL   s                  r   Ú.test_non_positive_approval_timeout_is_rejectedrF  Ð  sÓ  € ä
ØØ g¸ÌjËlÈ^Ñ\õô
 �]‰]ÜàØØØÜ�‹MØØØ Øð
	
ó€Fð ×ÑÐ ˜qÐ Ð˜qÑ × × Õ Ð˜q× × × × × Ñ ˆ6× × Ó ˆ6× × Ô Ð× × Ò ˜q× × × × × × Ó Ü˜Ó €FØDÐNÐDÈÐN×N×NÕNÐDÈ×N×NÓNÐD×N×N×N×N×NÐNÈ×N×NÓNÈ×N×N×N×N×N×NÓNÜ˜VÔ$Ü¨Ô1Ð:Ð1×8Ñ8Ð:Ñ8Ó:Ð:Ð:Ð:Ð:Ñ:×:×:×:×:Õ:Œ×:×:Ó:Œ×:×:×:×:×:Ò:¨×:×:Ó:¨×:×:Ô:Ð1×:×:Ò:Ð8×:×:Ò:Ð:×:×:×:×:×:×:r    c           
     ó’  — | dz  }|j                  dt        |«      «       |j                  dd¬«       |j                  dd¬«       t        j	                  t
        ddd	d
t        |«      ddg«      }|j                  }d}||k7  }|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}||z  }|j                  } |«       }	|	s¡ddt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |	«      dœz  }t        t        j                  |«      «      ‚d x}x}x}}	d}| |z  }|j                   } |«       }	|	 }
|
s¡ddt        j                  «       v st        j                  | «      rt        j                  | «      ndt        j                  |«      t        j                  |«      t        j                  |	«      dœz  }t        t        j                  |«      «      ‚d x}x}x}x}	}
y )Núenv-datarÝ   ÚCYBERBRAIN_DB_PATHFrß   ÚCYBERBRAIN_RETENTION_DAYSr�   r¥   zfrom-envr™   r›   rc   r   r"   r$   r   r%   r)   r*   úcyberbrain.sqlite3zNassert %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = (%(py0)s / %(py2)s).is_file
}()
}r\   ©r&   r'   r(   r*   úQassert not %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = (%(py0)s / %(py2)s).exists
}()
}r©   )r  rt   r  r•   r–   r   r8   r9   r:   r;   r<   r=   r>   r?   r@   Úis_filer  )r©   r%  r\   r   rC   rD   rE   rF   rG   r´   r>  rL   s               r   ÚAtest_env_data_dir_keeps_roadmap_index_and_sqlite_in_one_directoryrO  ð  sð  € ð ˜*Ñ$€HØ×ÑÐ,¬c°(«mÔ<Ø×ÑÐ+°UÐÔ;Ø×ÑÐ2¸EÐÔBä�]‰]ÜàØØØÜ�‹MØØð	
ó€Fð ×ÑÐ ˜qÐ Ð˜qÑ × × Õ Ð˜q× × × × × Ñ ˆ6× × Ó ˆ6× × Ô Ð× × Ò ˜q× × × × × × Ó Ø+Ð6ˆHÐ+Ñ+Ð6Ð+×4Ñ4Ð6Ñ4Ó6Ð6Ñ6×6×6×6×6Õ6ˆH×6×6Ó6ˆH×6×6Ô6Ð+×6×6Ò6Ð4×6×6Ò6Ð6×6×6×6×6×6Ö6Ø/Ð9�Ð/Ñ/Ð9Ð/×7Ñ7Ð9Ñ7Ó9Ð9Ð9Ð9Ð9Ñ9×9×9×9×9Õ9�×9×9Ó9�×9×9Ô9Ð/×9×9Ò9Ð7×9×9Ò9Ð9×9×9×9×9×9×9Ñ9r    c           
     óà  — | dz  }|j                  dt        |«      «       |j                  dd¬«       |j                  dd¬«       t        j	                  t
        g 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  }t        j                  t        |«      «      dz   d|iz  }t        t        j                   |«      «      ‚d x}x}}|dz  }	|dz  }
|	j"                  } |«       }|s�ddt        j                  «       v st        j                  |	«      rt        j                  |	«      ndt        j                  |«      t        j                  |«      dœz  }t        t        j                   |«      «      ‚d x}}|
j"                  } |«       }|s�ddt        j                  «       v st        j                  |
«      rt        j                  |
«      ndt        j                  |«      t        j                  |«      dœz  }t        t        j                   |«      «      ‚d 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}}d}t&        j(                  }|	j*                  } |«       } ||«      }||v }|�s2t        j                  d|fd||f«      t        j                  |«      dt        j                  «       v st        j                  t&        «      rt        j                  t&        «      ndt        j                  |«      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}x}x}}d}| |z  }|j,                  } |«       }| }|s¡d d!t        j                  «       v st        j                  | «      rt        j                  | «      nd!t        j                  |«      t        j                  |«      t        j                  |«      d"œz  }t        t        j                   |«      «      ‚d x}x}x}x}}y )#NrH  rÝ   rI  Frß   rJ  )rŒ   r2  z
wire it upr¥   úenv-planr   r‰   r‹   r3  r%   r  r*   rV   rK  zBassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_file
}()
}Úroadmaps_filerè   Údb_file)zJ%(py2)s
{%(py2)s = %(py0)s.parent
} == %(py6)s
{%(py6)s = %(py4)s.parent
})r&   r'   r/   r0   r6   r7   rQ  r‘   )z…%(py1)s in %(py12)s
{%(py12)s = %(py5)s
{%(py5)s = %(py3)s.loads
}(%(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py6)s.read_text
}()
})
}rZ   )r-   r.   r(   r0   r7   r±   r  zassert %(py14)sÚpy14rM  r©   rL  )r  rt   r  r•   r–   r   r8   r9   r:   r;   r<   r=   r>   rB   r   r?   r@   rN  ÚparentrZ   r4  r$  r  )r©   r%  r\   r3  rC   rD   rE   rF   rG   rR  rS  rS   rI   rJ   rL   rK   r³   rÑ   Ú@py_assert11rH   r*  Ú@py_format15r´   r>  s                           r   Ú4test_env_data_dir_holds_plan_output_and_the_databaserX  	  s™  € ð ˜*Ñ$€HØ×ÑÐ,¬c°(«mÔ<Ø×ÑÐ+°UÐÔ;Ø×ÑÐ2¸EÐÔBä�m‰mœCÒ!UÓV€GØ×ÑÐ7 Ð7Ð Ñ!×7×7Õ7Ð ×7×7×7×7×7Ñ7ˆ7×7×7Ó7ˆ7×7×7Ô7Ð×7×7Ò7 ×7×7×7¤;¨wÓ#7×7×7×7×7×7×7Ð7à˜Ñ.€MØÐ-Ñ-€GØ× Ñ Ð"Ñ Ó"Ð"Ñ"×"×"×"×"Õ"ˆ=×"×"Ó"ˆ=×"×"Ô"Ð ×"×"Ò"Ð"×"×"×"×"×"Ò"Ø�?‰?Ð‰?ÓÐÑ××××Õˆ7××Óˆ7××Ôˆ?××ÒÐ×××××ÒØ×ÑÐ1 7§>¡>Ð1Ð >Ñ1×1×1Õ1Ð >×1×1×1×1×1Ñ1ˆ=×1×1Ó1ˆ=×1×1Ô1Ð×1×1×1×1×1Ð1 7×1×1Ó1 7×1×1Ô1 >×1×1×1×1×1×1Ó1ØÐ>œŸ™Ð> M×$;Ñ$;Ð>Ñ$;Ó$=Ð>™Ð$=Ó>Ð>ˆ:Ð>Ð>×>×>Ö>ˆ:Ð>×>×>Ó>ˆ:×>×>×>×>×>Ð>œ×>×>Ó>œ×>×>Ô>˜×>×>×>×>×>Ð> M×>×>Ó> M×>×>Ô>Ð$;×>×>Ò>Ð$=×>×>Ò>Ð>×>×>×>×>×>×>×>Ñ>à*Ð4�˜?Ñ*Ð4Ð*×2Ñ2Ð4Ñ2Ó4Ð4Ð4Ð4Ð4Ñ4×4×4×4×4Õ4�×4×4Ó4�×4×4Ô4˜?×4×4Ò4Ð2×4×4Ò4Ð4×4×4×4×4×4×4Ñ4r    r“   )r�   r�   rŒ   c                ó(  — t         j                  t        | dg«      }|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  }t	        j                  t        |«      «      dz   d|iz  }t        t	        j                  |«      «      ‚d x}x}}d	}t        |«      }||v }	|	söt	        j
                  d
|	fd||f«      t	        j                  |«      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                  |«      dœz  }
dd|
iz  }t        t	        j                  |«      «      ‚d x}x}	}y )Nrˆ   r   r‰   r‹   r   r%   r  r*   ÚUsager‘   r§   r   r5   r6   r7   )r•   r–   r   r8   r9   r:   r;   r<   r=   r>   rB   r   r?   r@   r   )r“   r   rC   rD   rE   rF   rG   rK   rI   rH   rJ   rL   s               r   Útest_subcommand_help_rendersr[  !  s%  € ä�]‰]œ3 ¨(Ð 3Ó4€FØ×ÑÐ5˜qÐ5Ð˜qÑ ×5×5Õ5Ð˜q×5×5×5×5×5Ñ5ˆ6×5×5Ó5ˆ6×5×5Ô5Ð×5×5Ò5˜q×5×5×5¤+¨fÓ"5×5×5×5×5×5×5Ð5ØÐ%”g˜f“oÐ%ˆ7�oÐ%×%×%Õ%ˆ7�o×%×%Ó%ˆ7×%×%×%×%×%Ð%”g×%×%Ó%”g×%×%×%×%×%Ò%˜f×%×%Ó%˜f×%×%Ô%�o×%×%×%×%×%×%Ô%r    c           
     óÆ  — | dz  j                  d«       t        j                  t        ddddt	        | «      g«      }t        |«       d}t        |«      }||v }|söt        j                  d|fd||f«      t        j                  |«      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                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}t        |«       y )NrV   z	{not jsonr�   r¥   r¸   r™   r‘   r§   r   r   r5   r6   r7   )rY   r•   r–   r   rt   rM   r   r9   r:   r>   r;   r<   r=   r?   r@   rT   r¨   s          r   Ú'test_corrupt_roadmap_index_fails_closedr]  +  sÐ   € Ø�Ñ×+Ñ+¨KÔ8ä�]‰]œ3 ¨°¸ÄsÈ8Ã}Ð UÓV€Fä$ VÔ,ØÐ-œg f›oÐ-ˆ?˜oÐ-×-×-Õ-ˆ?˜o×-×-Ó-ˆ?×-×-×-×-×-Ð-œg×-×-Ó-œg×-×-×-×-×-Ò- f×-×-Ó- f×-×-Ô-˜o×-×-×-×-×-×-Ó-Ü˜VÕ$r    c           
     ó(  — t        «       }t        | dddt        |«      t        |«      gdœ¬«       t        j	                  t
        ddddt        | «      g«      }t        |«       d}t        |«      }||v }|söt        j                  d	|fd
||f«      t        j                  |«      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                  |«      dœz  }dd|iz  }t        t        j                   |«      «      ‚d x}x}}t#        | ¬«      }d}t%        ||«      }	d}
|	|
k(  }|�sgt        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                  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}}
t'        |«       y )NÚduprg   r¹   )r_  r�   r¥   r™   Ú	malformedr‘   r§   r   r   r5   r6   r7   r¬   r­   r   r‰   rË   r†   r	   r©   rÌ   rÎ   rÏ   )rp   r^   rx   r•   r–   r   rt   rM   r   r9   r:   r>   r;   r<   r=   r?   r@   r	   r†   rT   )r©   Ústepr   rK   rI   rH   rJ   rL   rE   r³   rÐ   rÑ   rÒ   rÓ   s                 r   Ú1test_roadmap_with_duplicate_step_ids_fails_closedrb  5  sÇ  € Ü‹<€DÜ
ØàØØÜ˜4“j¤$ t£*Ð-ñ	
õô �]‰]œ3 ¨°°|ÄSÈÃ]Ð SÓT€Fä$ VÔ,ØÐ)œ' &›/Ð)ˆ;˜/Ð)×)×)Õ)ˆ;˜/×)×)Ó)ˆ;×)×)×)×)×)Ð)œ'×)×)Ó)œ'×)×)×)×)×)Ò) &×)×)Ó) &×)×)Ô)˜/×)×)×)×)×)×)Ó)Ü'°Ô:ÐI¸GÐIŒ<Ð:¸GÓDÐIÈÐIÐDÈÑI×I×IÖIÐDÈ×I×I×I×I×IÑIŒ<×I×IÓIŒ<×I×I×I×I×IÒIœ×I×IÓIœ×I×I×I×I×IÒI°×I×IÓI°×I×IÔIÐ:×I×IÒI¸G×I×IÒIÐD×I×IÒIÈ×I×I×I×I×I×I×IÜ˜VÕ$r    c                ót	  — t        | ddddddddig ddœd	d
dt        «       d   dgddœgdœ¬«       t        j                  t        ddddt        | «      ddg«      }t        |«       d	}t        |«      }||v }|söt        j                  d|fd||f«      t        j                  |«      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                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}d}t        |«      }||v }|söt        j                  d|fd||f«      t        j                  |«      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                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}d}t        |«      }||v }|söt        j                  d|fd||f«      t        j                  |«      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                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}t!        |«       t#        | ¬«      }t%        j&                  t        |«      «      }	 |j)                  d«      D �	cg c]  }	|	d   ‘Œ	 }
}	|j+                  «        d}||
v}|s™t        j                  d |fd!||
f«      t        j                  |«      d"t        j                  «       v st        j                  |
«      rt        j                  |
«      nd"d#œz  }d$d%|iz  }t        t        j                  |«      «      ‚d x}}y c c}	w # |j+                  «        w xY w)&NÚchainedrg   Úfirstr.  zdeclares no actionr/  Úgrh   Úsecondra   zdepends on firstrl   r¹   )rd  r�   r¥   r™   r›   rc   r‘   r§   r   r   r5   r6   r7   zwas not dispatchedr¬   r€   r   zptah:chained:secondr2   rŸ   Útask_idsr    r¡   r(   )r^   rp   r•   r–   r   rt   rM   r   r9   r:   r>   r;   r<   r=   r?   r@   rT   r	   rr   rs   rw   ry   )r©   r   rK   rI   rH   rJ   rL   r{   r|   r}   rh  r¢   rF   s                r   Ú5test_step_whose_dependency_failed_is_never_dispatchedri  L  s  € Ü
ØàØØð "Ø%Ø#7Ø &¨˜}Ø"$Ø'ñð #Ø#Ø#5Ü)›|¨IÑ6Ø#* )Ø'ñðñ	
õô6 �]‰]ÜØ	�˜	 <´°X³À
ÈHÐUó€Fô
 % VÔ,ØÐ&”w˜v“Ð&ˆ8�Ð&×&×&Õ&ˆ8�×&×&Ó&ˆ8×&×&×&×&×&Ð&”w×&×&Ó&”w×&×&×&×&×&Ò&˜v×&×&Ó&˜v×&×&Ô&�×&×&×&×&×&×&Ó&ØÐ0¤¨£Ð0Ð Ð0×0×0Õ0Ð ×0×0Ó0Ð×0×0×0×0×0Ð0¤×0×0Ó0¤×0×0×0×0×0Ò0¨×0×0Ó0¨×0×0Ô0 ×0×0×0×0×0×0Ó0ØÐ2¤7¨6£?Ð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¨6×2×2Ó2¨6×2×2Ô2 ?×2×2×2×2×2×2Ó2Ü˜VÔ$ô  xÔ0€GÜ—‘¤ W£Ó.€JðØ&0×&8Ñ&8Ð9TÓ&UÖV˜s�C˜“FÐVˆÐVà×ÑÔØ Ð0Ð ¨Ð0×0×0Õ0Ð ¨×0×0Ó0Ð ×0×0×0×0×0Ð0¨×0×0Ó0¨×0×0×0×0×0×0Ô0ùò Wøà×ÑÕús   Ï	R% ÏR Ï(R% Ò R% Ò%R7c           
     óÂ  — t        | dddg dœ¬«       t        j                  t        ddddt	        | «      g«      }t        |«       d}t        |«      }||v }|söt        j                  d	|fd
||f«      t        j                  |«      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                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}t        |«       y )NÚemptyrg   r¹   )rk  r�   r¥   r™   zcontains no stepsr‘   r§   r   r   r5   r6   r7   )r^   r•   r–   r   rt   rM   r   r9   r:   r>   r;   r<   r=   r?   r@   rT   r¨   s          r   Ú/test_empty_roadmap_is_not_reported_as_completedrl  }  sÔ   € Ü
ˆ8 '°7ÀiÐZ\Ñ]Õ^ä�]‰]œ3 ¨°¸ÄsÈ8Ã}Ð UÓV€Fä$ VÔ,ØÐ1¤'¨&£/Ð1Ð /Ð1×1×1Õ1Ð /×1×1Ó1Ð×1×1×1×1×1Ð1¤'×1×1Ó1¤'×1×1×1×1×1Ò1¨&×1×1Ó1¨&×1×1Ô1 /×1×1×1×1×1×1Ó1Ü˜VÕ$r    c                óÄ  ‡ ‡ — |j                  dt        ‰ «      «       |j                  dd¬«       t        ‰ ¬«      dz  }|j	                  d¬«       |d	z  }t        ‰ d
d
dt        dt        |«      ¬«      gdœ¬«       t        ‰ ¬«      }t        t        |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}}i Š d\ˆ ˆ fd„}t'        j(                  |¬«      }g }|j+                  «        	 t-        j.                  «       dz   }|s•t-        j.                  «       |k  r~|j1                  «       D ]<  }|j3                  |j4                  dd«      sŒ!|j7                  |j4                  «        n t-        j8                  d«       |st-        j.                  «       |k  rŒ~|j;                  «       rTt-        j.                  «       |k  r=t-        j8                  d«       |j;                  «       rt-        j.                  «       |k  rŒ=|j=                  d ¬!«       |j:                  } |«       }| }|s£t        j>                  d"«      d#z   d$t        j                  «       v st        j                  |«      rt        j                   |«      nd$t        j                   |«      t        j                   |«      d%œz  }	t#        t        j$                  |	«      «      ‚dx}x}}d&}|‰ v }|s¯t        j                  d'|fd(|‰ f«      t        j                   |«      d)t        j                  «       v st        j                  ‰ «      rt        j                   ‰ «      nd)d*œz  }t        j>                  d+«      d,z   d-|iz  }	t#        t        j$                  |	«      «      ‚dx}}‰ d&   }tA        |«      }d.}||k(  }|�st        j                  d/|fd0||f«      d1t        j                  «       v st        j                  t@        «      rt        j                   t@        «      nd1d2t        j                  «       v st        j                  |«      rt        j                   |«      nd2t        j                   |«      t        j                   |«      d3œz  }t        j>                  d4|› �«      d5z   d6|iz  }t#        t        j$                  |«      «      ‚dx}x}}|jB                  }d7}||k(  }|sÌt        j                  d/|fd8||f«      d&t        j                  «       v st        j                  |«      rt        j                   |«      nd&t        j                   |«      t        j                   |«      dœz  }	t        j>                  tE        |«      «      d9z   d|	iz  }
t#        t        j$                  |
«      «      ‚dx}x}}d:}tG        |«      }||v }|söt        j                  d'|fd;||f«      t        j                   |«      d<t        j                  «       v st        j                  tF        «      rt        j                   tF        «      nd<d&t        j                  «       v st        j                  |«      rt        j                   |«      nd&t        j                   |«      d=œz  }d>d6|iz  }t#        t        j$                  |«      «      ‚dx}x}}d?}tG        |«      }||v}|söt        j                  d@|fdA||f«      t        j                   |«      d<t        j                  «       v st        j                  tF        «      rt        j                   tF        «      nd<d&t        j                  «       v st        j                  |«      rt        j                   |«      nd&t        j                   |«      d=œz  }d>d6|iz  }t#        t        j$                  |«      «      ‚dx}x}}|jH                  } |«       }dB}||k(  }|sÁt        j                  d/|fdC||f«      dDt        j                  «       v st        j                  |«      rt        j                   |«      ndDt        j                   |«      t        j                   |«      t        j                   |«      dEœz  }
dFdG|
iz  }t#        t        j$                  |«      «      ‚dx}x}x}}dH}tK        ||«      }d.}||k(  }|�s
t        j                  d/|fdI||f«      dJt        j                  «       v st        j                  tJ        «      rt        j                   tJ        «      ndJdKt        j                  «       v st        j                  |«      rt        j                   |«      ndKt        j                   |«      t        j                   |«      t        j                   |«      dLœz  }dMdN|iz  }t#        t        j$                  |«      «      ‚dx}x}x}}dO}tK        ||«      }d.}||k(  }|�s
t        j                  d/|fdI||f«      dJt        j                  «       v st        j                  tJ        «      rt        j                   tJ        «      ndJdKt        j                  «       v st        j                  |«      rt        j                   |«      ndKt        j                   |«      t        j                   |«      t        j                   |«      dLœz  }dMdN|iz  }t#        t        j$                  |«      «      ‚dx}x}x}}tM        |«      }|D �cg c]  }|dP   dQk(  sŒ|‘Œ }}|D �cg c]  }|dR   dSk(  sŒ|d&   ‘Œ }}dg}||k(  }|s‚t        j                  d/|fdT||f«      t        j                   |«      t        j                   |«      dUœz  }t        j>                  |«      dVz   dW|iz  }t#        t        j$                  |«      «      ‚dx}x}}|D �cg c]  }|dR   dXk(  sŒ|d&   ‘Œ }}tO        |«      }d2dYg}||k(  }|�st        j                  d/|fd0||f«      dZt        j                  «       v st        j                  tN        «      rt        j                   tN        «      ndZd[t        j                  «       v st        j                  |«      rt        j                   |«      nd[t        j                   |«      t        j                   |«      d3œz  }t        j>                  |«      d5z   d6|iz  }t#        t        j$                  |«      «      ‚dx}x}}y# |j=                  d ¬!«       w xY wc c}w c c}w c c}w )]aÐ  A code step must need one human decision, not one per gate.

    Regression test. The operator approves the first request and then approves
    nothing at all - exactly what a person typing one ``approvals approve``
    does. The step must complete. While the run raised a *second* independent
    request, it instead sat blocked until the approval timed out and then failed
    with "Approval pending", so the documented single-approval flow was unusable
    in practice: it only ever finished for a script that approves in a loop.

    The earlier test above cannot catch that, because it approves every pending
    request until the worker exits and is therefore equally happy with one
    approval or with five.
    rÝ   rÞ   Frß   r¬   rá   Trâ   rä   r¸   rg   rå   ræ   r¹   r¼   rò   rô   Nrö   rø   rù   r%   r)   r*   c                 ód   •— t         j                  t        ddddt        ‰«      ddddg	«      ‰ d	<   y )
Nr�   r¥   r¸   r™   r›   rc   rš   Ú10r   rë   rì   s   €€r   rî   zOtest_code_step_completes_after_exactly_one_approval.<locals>._run_in_background¶  rï   r    rð   rú   rû   rü   rý   gš™™™™™©?rþ   rÿ   r  r  r  rè   r   r‘   r  rí   r    r  r  r(   é   r‰   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr  r  )r&   r-   r.   r0   z1expected exactly one approval to be granted, got z
>assert %(py8)sr7   r   r‹   r  r   r§   r   r5   r6   r1   r2   r4   r	  r
  rO   r  r  r  r²   r®   r†   r{   r¯   r°   r±   rÚ   r8  r`   Ú
event_typeÚapproval_requiredrÃ   rÄ   z
>assert %(py6)sr0   Úapproval_grantedÚreusedÚsortedÚgrantedr  )(r  rt   r  r
   r  r^   rp   r	   r   r   rõ   r9   r:   r;   r<   r=   r>   r?   r@   r  r  r  r  r  r  r   r  Úappendr"  r  r#  rB   r  r8   r   r   r$  r†   r~   ru  )!r©   r%  rá   rO   r{   rù   rC   rD   rE   rF   rG   rî   r  r  r&  r'  rI   rK   rH   r¢   r   rJ   rL   r´   r)  r³   rµ   rÇ   r}   Ústep_eventsrS   rv  rí   s!   `                               @r   Ú3test_code_step_completes_after_exactly_one_approvalry  Š  sÓ  ù€ ð" ×ÑÐ,¬c°(«mÔ<Ø×ÑÐ3¸UÐÔCÜ¨Ô2°[Ñ@€IØ‡O�O˜D€OÔ!Ø˜Ñ"€FÜ
ØàØØäØLÜ! )›nôðñ	

õô  xÔ0€Gô ¤}¸WÈdÔ'SÔT€GØ×ÑÐ' 4Ð'Ð 4Ð'×'×'Õ'Ð 4×'×'×'×'×'Ñ'ˆ7×'×'Ó'ˆ7×'×'Ô'Ð×'×'Ò' 4×'×'×'×'×'×'Ó'Ø!€Hö
ô  ×ÑÐ%7Ô8€FØ€HØ
‡L�L„Nð!Ü—>‘>Ó# dÑ*ˆáœtŸ~™~Ó/°(Ò:Ø"×/Ñ/Ó1ò �Ø—?‘? 7×#5Ñ#5°ÐHYÕZØ—O‘O G×$6Ñ$6Ô7Ùðô �J‰J�tÔñ œtŸ~™~Ó/°(Ó:ð �o‰oÔ¤D§N¡NÓ$4°xÒ$?Ü�J‰J�tÔð �o‰oÔ¤D§N¡NÓ$4°xÓ$?ð 	�‰˜CˆÔ Ø�‰ÐE‰Ó ÐEÐ Ð ÐEÑ ×EÖEÐ"E×E×E×E×E×EÓEˆv×E×EÓEˆv×E×EÔEˆ×E×EÒEÐ ×E×E×E×E×EÔEØÐMˆ8�xÐ×M×MÕMˆ8�x×M×MÓMˆ8×M×M×M×M×MÐM�x×M×MÓM�x×M×M×MÑMÐ!M×M×M×M×M×MÖMà�hÑ€FÜˆx‹=Ð]˜AÐ]ˆ=˜AÑ×]×]Ö]ˆ=˜A×]×]×]×]×]Ñ]Œ3×]×]Ó]Œ3×]×]×]×]×]Ò]ˆx×]×]Ó]ˆx×]×]Ô]ˆ=×]×]Ò]˜A×]×]×]Ð!RÐS[ÐR\Ð]×]×]×]×]×]×]Ð]Ø×ÑÐ5˜qÐ5Ð˜qÑ ×5×5Õ5Ð˜q×5×5×5×5×5Ñ5ˆ6×5×5Ó5ˆ6×5×5Ô5Ð×5×5Ò5˜q×5×5×5¤+¨fÓ"5×5×5×5×5×5×5Ð5ØÐ)œ' &›/Ð)ˆ;˜/Ð)×)×)Õ)ˆ;˜/×)×)Ó)ˆ;×)×)×)×)×)Ð)œ'×)×)Ó)œ'×)×)×)×)×)Ò) &×)×)Ó) &×)×)Ô)˜/×)×)×)×)×)×)Ó)ØÐ-œg f›oÐ-ˆ;˜oÐ-×-×-Õ-ˆ;˜o×-×-Ó-ˆ;×-×-×-×-×-Ð-œg×-×-Ó-œg×-×-×-×-×-Ò- f×-×-Ó- f×-×-Ô-˜o×-×-×-×-×-×-Ó-à×ÑÐ+ÑÓÐ+ Ð+Ð Ñ+×+×+Õ+Ð ×+×+×+×+×+Ñ+ˆ6×+×+Ó+ˆ6×+×+Ô+Ð×+×+Ò+Ð×+×+Ò+ ×+×+×+×+×+×+Õ+ð "5Ð:Œ<˜Ð!4Ó5Ð:¸Ð:Ð5¸Ñ:×:×:Ö:Ð5¸×:×:×:×:×:Ñ:Œ<×:×:Ó:Œ<×:×:×:×:×:Ò:˜×:×:Ó:˜×:×:Ô:Ð!4×:×:Ò:Ð5×:×:Ò:¸×:×:×:×:×:×:Õ:Ø!3Ð9Œ<˜Ð!3Ó4Ð9¸Ð9Ð4¸Ñ9×9×9Ö9Ð4¸×9×9×9×9×9Ñ9Œ<×9×9Ó9Œ<×9×9×9×9×9Ò9˜×9×9Ó9˜×9×9Ô9Ð!3×9×9Ò9Ð4×9×9Ò9¸×9×9×9×9×9×9Õ9ô
 �wÓ€DØ"&ÖA˜3¨#¨i©.¸DÓ*@’3ÐA€KÐAØ%0Ö]˜c°C¸Ñ4EÐI\Ó4\ˆC�‹MÐ]ð Ð]Øðbð Ð]ð bñ ÷ çÑóÐ]ð b÷ ñ ç	‰ð ^÷ ð ç	‰ðb÷ õ çÑ€{÷÷ ö ïé ÷÷ ð "-öØ°°LÑ0AÐEWÓ0WˆˆH‹ð€Gð ô �'‹?ÐA˜z¨8Ð4ÐAˆ?Ð4Ñ4×A×AÖAˆ?Ð4×A×A×A×A×AÑAŒ6×A×AÓAŒ6×A×A×A×A×AÒA�'×A×AÓA�'×A×AÔAˆ?×A×AÒAÐ4×A×A×A°k×A×A×A×A×A×AÑAøð9 	�‰˜CˆÕ üò* BùÚ]ùòs?   ÆA v< Ç;Av< ÉA#v< î6wïwïwïwñ;wò	wö<w)r   r   r  rt   )r   r   r  r  )r\   r   r]   údict[str, Any]r  r  )rl   r   r  rz  )r{   r   r  zlist[dict[str, Any]])r{   r   r  z	list[str])r{   r   r…   rt   r  rƒ   r  )r©   r   r  r  )r©   r   r%  zpytest.MonkeyPatchr  r  )r©   r   r   rt   r  r  )r“   rt   r  r  )DÚ__doc__Ú
__future__r   Úbuiltinsr;   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter9   rZ   Úshutilrr   r  r  Úpathlibr   Útypingr   ÚpytestÚtyper.testingr   Úcyberbrain26.clir   Ú cyberbrain26.product.local_storer   r	   r
   Ú$cyberbrain26.security_plane.approvalr   r•   ÚmarkÚskipifÚwhichÚrequires_bubblewraprQ   r   r   r   rM   rT   r^   rp   r~   r�   r†   r—   r�   r£   rª   r¶   rÉ   rÔ   rÛ   r+  r0  r9  r?  rC  ÚparametrizerF  rO  rX  r[  r]  rb  ri  rl  ry  ro   r    r   ú<module>rŽ     sö  ðñõ2 #ç  „ ƒÛ Û Û Û Ý Ý ã Ý #å  ß \Ñ \Ý @á	‹€à—k‘k×(Ñ(Ø€F‡L�L�Ó˜TÐ!Ð*Eð )ó Ð ð ?Ð óóó-ó
.óYóLó
ó"óóó*ó ó"ó%ó;ó>ó.
Vó $:ðN ðcFØðcFØ!3ðcFà	òcFó ðcFóR;óDoó*;ó(;ð ‡�×Ñ˜Ò$7Ó8ò;ó 9ð;ð>:Øð:Ø!3ð:à	ó:ð25Øð5Ø!3ð5à	ó5ð0 ‡�×Ñ˜Ò$CÓDò&ó Eð&ó%ó%ó..1ób%ð ðgBØðgBØ!3ðgBà	ògBó ñgBr    