+
    jHàjsO  ã                  ó8  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIH	t	H
t
 ^ RIHtHt ]P                  ! ]4      tRtR R ltR R	 ltR
 R ltR R ltR R lt]	 ! R R4      4       t]P0                  ! RRR7      tR]R&   RØR R lltR R ltRRRRRR/tR R ltR  R! ltR" R# lt R$ R% lt!/ ]!! R&R&R'R(R)R*4      C]!! R+R,R-R.R/R0R1R2R3R4R5R6R7R8R9R:R;R<R=R>R?R@RARBRCRDRERF4      C]!! RGRHRIRJRKRLRMRNRORPRQRRRSRTRURVRWRXRYRZR[R\R]R^R_4      C]!! R`RaRbRcRdReRfRgRhRiRjRk4      C]!! RlRlRmRnRoRp4      C]!! RqRqRrRsRtRuRvRw4      C]!! RÙ!  C]!! RxRyRzR{R|R}R~RR€R�4
      C]!! RÚ!  C]!! R‚RƒR„R…R†R‡RˆR‰RŠR‹RŒR�RŽR�R�4      C]!! R‘R’R“R”R•R–R—R˜R™RšR›Rœ4      Ct"R�]Rž&   ]#! 0 RÛm4      t$]PJ                  ! RŸ4      t&]PJ                  ! R 4      t']PJ                  ! R¡4      t(R¢t)^t*R£ R¤ lt+]#! ^‰^�04      t,R¥ R¦ lt-R§ R¨ lt.RØR©R/Rª R« lllt/]	 ! R¬ R­4      4       t0R® R¯ lt1R° R± lt2/ ]3Pi                  RÜR²4      C]3Pi                  RÝR³4      C]3Pi                  RÞR´4      CRµR¶R¶R¶R·R¸R¸R¸R¹RºR»R¼/Ct5R½ R¾ lt6R¿ RÀ lt7RÁ RÂ lt8Rßt9RÃ RÄ lt:RÅ RÆ lt;RÇ RÈ lt<RÉ RÊ lt=RË RÌ lt>RÍRÎRÏRÐRÑRÐ/t?RÒ RÓ lt@RÔ RÕ ltARÖ R× ltBR# )àa·  Agent-harness accuracy shared metrics: file-edit matching, loop guards, recovery after a tool
error, terminal command outcomes and bad model replies.

These tune the agent loop itself: which fuzzy-match strategies earn their keep, how often the loop
guards fire, whether a model recovers after a failed tool call, which kinds of commands fail, and
which models return empty / refused / truncated replies. Producers pass RAW values; every builder
maps them onto closed enums. Nothing here reads command text, file paths, tool arguments or reply
text beyond the structural checks Hermes already makes (think-block stripping for "visible text").

Hermes-owned agent loops (the background self-improvement review and the curator fork) are not user
work and never count. Recording is a no-op unless shared metrics are enabled for the owning profile,
and never raises into the caller. Stdlib-only at import time: tool modules import this on their hot
path.
)ÚannotationsN)Ú	dataclassÚfield)ÚAnyÚCallableÚbackground_reviewc               ó   € V ^8„  d   QhRR/# ©é   ÚreturnÚbool© )Úformats   "ÚT/home/ubuntu/.hermes/hermes-agent/hermes_cli/observability/shared_metrics_harness.pyÚ__annotate__r      s   € ÷ ñ �$ñ ó    c                 óB   €  ^RI Hp  V ! 4       #   \         d     R# i ; i)é   ©ÚenabledF)Úrelay_shared_metricsr   Ú	Exceptionr   s    r   Ú_enabledr      s$   € ðÝ1á‹yÐøÜô Úðúó   ‚ ��c               ó$   € V ^8„  d   QhRRRRRR/# )r
   Ú	mark_attrÚstrÚdataúdict[str, str]r   ÚNoner   )r   s   "r   r   r   '   s&   € ÷ Qñ Q�sð Q .ð Q°Tñ Qr   c                ó˜   €  ^RI Hp ^RIHp V! \	        W 4      V4       R#   \
         d    \        P                  RT RR7        R# i ; i)r   )Úshared_metrics_contract)Úrecord_process_markzShared-metrics %s not recordedT©Úexc_infoN)Ú r!   r   r"   Úgetattrr   ÚloggerÚdebug)r   r   Úcontractr"   s   &&  r   Ú_recordr*   '   sA   € ðQÝ9Ý=áœG HÓ8¸$Ö?øÜô QÜ�‰Ð5°yÈ4ˆ×PðQús   ‚" ¢#A	ÁA	c               ó   € V ^8„  d   QhRR/# r	   r   )r   s   "r   r   r   1   s   € ÷ ñ ˜tñ r   c                 óB   €  ^ RI Hp  V ! 4       #   \         d     R# i ; i)é    ©Úis_background_reviewF)Útools.skill_provenancer/   r   r.   s    r   Ú_background_tool_callr1   1   s%   € ðÝ?á#Ó%Ð%øÜô Úðúr   c               ó    € V ^8„  d   QhRRRR/# ©r
   Úagentr   r   r   r   )r   s   "r   r   r   :   s   € ÷ dñ d�sð d˜tñ dr   c                óB   € V RJ;'       d    \        V RR4      \        8g  # )zIThe review/curator forks tag themselves with the background write origin.NÚ_memory_write_origin)r&   Ú_BACKGROUND_ORIGIN©r4   s   &r   Ú_user_agentr9   :   s%   € à˜Ð×cÐc¤¨Ð0FÈÓ!MÔQcÑ!cÐcr   c               ó    € V ^8„  d   QhRRRR/# )r
   r4   r   r   r   r   )r   s   "r   r   r   ?   s   € ÷ Xñ X�#ð X˜.ñ Xr   c                óL   € ^RI Hp V! \        V RR4      \        V RR4      4      # )r   )Úmodel_routeÚproviderNÚmodel)Úshared_metrics_modelr<   r&   )r4   r<   s   & r   Ú_router@   ?   s%   € Ý1á”w˜u j°$Ó7¼ÀÈÐQUÓ9VÓWÐWr   c                  óT   € ] tR t^Gt$ Rt]! ]R7      tR]R&   ]! ]R7      t	R]R&   Rt
R# )Ú
_EditProbezMWhat the fuzzy matcher saw during one edit tool call (several hunks for V4A).©Údefault_factoryú	list[str]Ú
strategiesÚmissesr   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   ÚlistrF   Ú__annotations__rG   Ú__static_attributes__r   r   r   rB   rB   G   s#   ‡ áWá!°$Ô7€J�	Ó7Ù¨dÔ3€FˆI×3r   rB   Úshared_metrics_edit_probe)Údefaultz)contextvars.ContextVar[_EditProbe | None]Ú_EDIT_PROBEc               ó$   € V ^8„  d   QhRRRRRR/# )r
   Ústrategyú
str | NoneÚmissr   r   r   )r   s   "r   r   r   T   s!   € ÷ 	"ñ 	"˜jð 	"°
ð 	"Àdñ 	"r   c                óÎ   € \         P                  4       pVf   R# V '       d   VP                  P                  V 4       R# V'       d   VP                  P                  V4       R# R# )zžCalled by the fuzzy matcher: the strategy that landed a replacement, or why none did
(``no_match`` / ``ambiguous``). A no-op outside a metered edit tool call.N)rR   ÚgetrF   ÚappendrG   )rT   rV   Úprobes   && r   Únote_edit_matchr[   T   sI   € ô �O‰OÓ€EØ‚}ÙßØ×Ñ×Ñ Ö)ß	Ø�‰×Ñ˜DÖ!ñ 
r   c               ó   € V ^8„  d   QhRR/# )r
   r   zdict[str, int]r   )r   s   "r   r   r   `   s   € ÷ Iñ I˜ñ Ir   c                 ód   € ^ RI Hp  \        V 4       UUUu/ uF
  w  pw  r#W!bK  	  uppp# u upppi )r-   )Ú
STRATEGIES)Útools.fuzzy_matchr^   Ú	enumerate)r^   ÚindexÚnameÚ_fns       r   Ú_strategy_rankrd   `   s-   € Ý,ä2;¸JÔ2GÕHÑ2GÑ.˜E¡; DˆDŠKÑ2GÓHÐHùÔHs   –+ÚreplaceÚpatchÚv4aÚ
whole_filec          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r
   Útoolr   Úmoder   ÚresultrZ   rB   r   r   r   )r   s   "r   r   r   j   s0   € ÷ ñ ˜cð ¨ð °cð À*ð ÐQ_ñ r   c                óf  a
€ ^RI HpHp \        V4      pVP	                  R4      RJ g'   V'       d9   RV9  d2   VP	                  R4      '       g   VP	                  R4      RJ d   RMRpM*RVP
                  9   d   RpMR	VP
                  9   d   R	pMR
pRpVR8X  d8   VP                  '       d&   \        4       o
\        VP                  V
3R lR7      p\        P	                  \        T;'       g    R4      P                  4       P                  4       R4      p	RW…9   d   TMRRW”9   d   T	MRRVRV /# )r   )ÚFILE_EDIT_MODESÚFILE_EDIT_STRATEGIESÚsuccessTÚerrorÚ	no_changeÚalready_appliedÚappliedÚ	ambiguousÚno_matchÚfailedÚnonec                ó(   <€ SP                  V R4      # )r   éÿÿÿÿ)rX   )rb   Úranks   &€r   Ú<lambda>Ú"file_edit_fields.<locals>.<lambda>{   s   ø€ ¸$¿(¹(À4ÈÔ:Lr   )Úkeyr%   re   Úmatch_strategyrk   Úoutcomerj   )r!   rn   ro   Ú_parsedrX   rG   rF   rd   ÚmaxÚ_EDIT_MODESr   ÚstripÚlower)rj   rk   rl   rZ   rn   ro   r   r€   rT   Ú
mode_valuer{   s   $$$$      @r   Úfile_edit_fieldsr‡   j   s  ø€ ßNä�6‹?€Dà‡x�x�	Ó˜dÓ"§t°	ÀÔ0EÈdÏhÉhÐW^×N_ÒN_Ø'+§x¡x°Ó'<ÀÓ'DÑ#È)‰Ø	˜Ÿ™Ô	$Ø‰Ø	�u—|‘|Ô	#Ø‰àˆØ€HØ�)Ô × 0× 0Ð 0äÓˆÜ�u×'Ñ'Ô-LÔMˆÜ—‘¤ T§Z Z¨R£×!6Ñ!6Ó!8×!>Ñ!>Ó!@À)ÓL€Jà hÔ&F™(ÈFØ˜jÔ;‘
ÀØ�7Ø�ð	ð r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r
   rj   r   rk   ÚcallzCallable[[], str]r   r   )r   s   "r   r   r   …   s)   € ÷ ñ ˜3ð  cð Ð1Bð Àsñ r   c           
     ó‚  € \        4       '       d   \        4       '       d   V! 4       # \        4       p\        P	                  V4      p V! 4       p\        P                  V4        \        R\        WWSR7      4       V#   \        P                  T4       i ; i  \         d    \        P                  RRR7        T# i ; i)a  Run one ``patch`` / ``write_file`` tool call and count how its edit landed; returns the
call's result unchanged. The matcher reports into a context-local probe, so strategies from
unrelated callers (skill patches, V4A validation of another call) never mix in.ÚFILE_EDIT_MARK)rj   rk   rl   rZ   z%Shared-metrics file edit not recordedTr#   )r   r1   rB   rR   ÚsetÚresetr*   r‡   r   r'   r(   )rj   rk   r‰   rZ   Útokenrl   s   &&&   r   Úrecord_file_editr�   …   s¥   € ô �:Š:Ô.×0Ò0Ù‹vˆÜ‹L€EÜ�O‰O˜EÓ"€Eð!Ù“ˆä×Ñ˜%Ô ðMÜÐ Ô"2¸ÐPVÔ"dÔeð €Møô 	×Ñ˜%Õ ûô ô MÜ�‰Ð<ÀtˆÕLØ€MðMús   ÁA> Á%B Á>BÂ"B>Â=B>c               ó    € V ^8„  d   QhRRRR/# )r
   rl   r   r   zdict[str, Any]r   )r   s   "r   r   r   ˜   s   € ÷ 2ñ 2�Cð 2˜Nñ 2r   c                ó  € \        V \        4      '       d   V #  \        V \        \        34      '       d   \        P
                  ! V 4      MR p\        T\        4      '       d   T# / #   \        \        3 d    / u # i ; i©N)Ú
isinstanceÚdictr   ÚbytesÚjsonÚloadsÚ	TypeErrorÚ
ValueError)rl   r   s   & r   r�   r�   ˜   sm   € Ü�&œ$×ÒØˆðÜ%/°¼¼e¸×%EÒ%EŒt�zŠz˜&Ô!È4ˆô ˜d¤D×)Ò)ˆ4Ð1¨rÐ1øô ”zÐ"ô ØŠ	ðús   š4A( Á(A>Á=A>c               ó$   € V ^8„  d   QhRRRRRR/# )r
   Úkindr   Únamesr   r   r   )r   s   "r   r   r   ¤   s!   € ÷ &ñ &�ð &˜cð & nñ &r   c                ó,   € \         P                  W4      # r’   )r”   Úfromkeys)r›   rœ   s   &*r   Ú_kindsrŸ   ¤   s   € Ü�=‰=˜Ó%Ð%r   ÚgitÚghÚhubzgit-lfsÚtigÚpackage_managerÚpipÚpip3ÚuvÚuvxÚpoetryÚpipxÚcondaÚmambaÚ
micromambaÚnpmÚpnpmÚyarnÚaptzapt-getÚbrewÚdnfÚyumÚpacmanÚapkÚgemÚbundleÚcomposerÚnixÚsnapÚchocoÚwingetÚportÚbuildÚmakeÚcmakeÚninjaÚcargoÚgoÚgradleÚgradlewÚmvnÚbazelÚmesonÚgcczg++ÚccÚclangzclang++ÚrustcÚjavacÚtscÚdotnetÚmsbuildÚsconsÚswiftÚ
xcodebuildÚzigÚtest_runnerÚpytestzpy.testÚtoxÚnoxÚjestÚvitestÚmochaÚrspecÚphpunitÚctestÚ
playwrightÚpythonÚpython3ÚipythonÚpypyÚpypy3ÚnodeÚnpxÚdenoÚbunzts-nodeÚtsxÚnodejsÚshellÚbashÚshÚzshÚdashÚfishÚkshÚpwshÚ
powershellÚcmdÚnetworkÚcurlÚwgetÚsshÚscpÚrsyncÚpingÚncÚdigÚnslookupÚhttpÚtelnetÚsftpÚftpÚ
tracerouteÚ	containerÚdockerÚpodmanÚkubectlzdocker-composeÚhelmÚnerdctlÚminikuber›   Úk9sÚ	apptainerÚsingularityr   Ú_COMMAND_KINDSz\s*([^\s;|&()<>]+)z[A-Za-z_][A-Za-z0-9_]*=zpython\d+(\.\d+)?é   c               ó    € V ^8„  d   QhRRRR/# )r
   Úcommandr   r   r   r   )r   s   "r   r   r   Ú   s   € ÷ ñ ˜#ð  #ñ r   c                ó|  € \        V \        4      '       d
   V R\         MRp^ p\        \        ^,           4       Fþ  p\
        P                  W4      pVf    R# VP                  4       pVP                  ^4      P                  R4      p\        P                  V4      '       g1   VP                  4       \        9   g   VP                  R4      '       d   Kœ  VP                  R^4      R,          P                  4       pV\        9   d   \        V,          u # \         P#                  V4      '       d   Ru # Ru # 	  R# )	zŠA closed kind from the command's first program word (after env assignments and wrappers
like ``sudo``). The word itself is never exported.Nr%   Úotherz'"Ú-Ú/rá   rz   )r“   r   Ú_COMMAND_HEAD_CHARSÚrangeÚ_MAX_PREFIX_TOKENSÚ	_TOKEN_REÚmatchÚendÚgroupr„   Ú_ASSIGNMENT_REr…   Ú_COMMAND_WRAPPERSÚ
startswithÚrsplitr  Ú
_PYTHON_REÚ	fullmatch)r  ÚtextÚpositionÚ_r  Úwordrb   s   &      r   Úcommand_kindr(  Ú   sõ   € ô -7°wÄ×,DÒ,Dˆ7Ð'Ô'Ñ(È"€DØ€HÜÔ%¨Õ)Ö*ˆÜ—‘ Ó/ˆØŠ=ÚØ—9‘9“;ˆØ�{‰{˜1‹~×#Ñ# EÓ*ˆÜ×Ñ ×%Ò%¨¯©«Ô9JÔ)JÈdÏoÉoÐ^a×NbÒNbÙØ�{‰{˜3 Ó" 2Õ&×,Ñ,Ó.ˆØ”>Ô!Ü! $Õ'Ò'Ü%×/Ñ/°×5Ò5ˆxÒB¸7ÒBñ +ñ r   c               ó    € V ^8„  d   QhRRRR/# )r
   rl   r   r   rU   r   )r   s   "r   r   r   ó   s   € ÷ Kñ K˜Sð K Zñ Kr   c                óJ  € \        V \        4      '       g   R# V P                  R4      RJ d   R# V P                  R4      RJ d   R# V P                  R4      p\        V\        4      '       d   \        V\        4      '       d   R# V^ 8X  d   R# V^ 8  g   V\
        9   d   R# R	# )
z´How one foreground command ended, from the backend's raw result dict. Hermes' own deadline
and interrupt set flags on the result, so a command's own ``exit 124`` reads ``nonzero``.NÚhermes_timed_outTÚtimeoutÚhermes_interruptedÚkilledÚ
returncodeÚokÚnonzero)r“   r”   rX   Úintr   Ú_KILLED_STATUSES)rl   Úcodes   & r   Úterminal_outcomer5  ó   s‹   € ô �fœd×#Ò#ÙØ‡z�zÐ$Ó%¨Ó-ÙØ‡z�zÐ&Ó'¨4Ó/ÙØ�:‰:�lÓ#€DÜ�dœC× Ò ¤J¨t´T×$:Ò$:ÙØˆq„yÙØ˜a”x 4Ô+;Ô#;ˆ8ÐJÀÐJr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r
   r  r   Úbackendr€   r   r   r   r   )r   s   "r   r   r     s(   € ÷ ñ ¨ð °cð ÀCð ÈNñ r   c                ó¢   € ^RI Hp \        T;'       g    R4      P                  4       P	                  4       pRWC9   d   TMRR\        V 4      RV/# )r   )ÚTERMINAL_BACKENDSr%   r7  r  r(  r€   )r!   r9  r   r„   r…   r(  )r  r7  r€   r9  Úbackend_values   $$$  r   Úterminal_outcome_fieldsr;    sL   € Ý:ä˜Ÿ˜ 2Ó&×,Ñ,Ó.×4Ñ4Ó6€Mà MÔ$F‘=ÈGØœ WÓ-Ø�7ðð r   r€   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r
   r  r   r7  rl   r€   rU   r   r   r   )r   s   "r   r   r     s8   € ÷ Tñ T Sð T°3ð TÀð TÐXbð TÐnrñ Tr   c          	     ó>  €  \        4       '       d   \        4       '       d   R# ^RIHp VP	                  4       '       d   R# T;'       g    \        V4      pVf   R# \        R\        WVR7      4       R#   \         d    \        P                  RRR7        R# i ; i)a  Count one foreground terminal command that reached an exit status (or Hermes' deadline).
Commands handed to the background, refused by a guard, or whose backend failed never ran to
an exit status and are not counted here (``hermes.execution_backend.count`` covers them).N)Ú
_UNMETEREDÚTERMINAL_OUTCOME_MARK)r  r7  r€   z,Shared-metrics terminal outcome not recordedTr#   )r   r1   Úshared_metrics_loopr>  rX   r5  r*   r;  r   r'   r(   )r  r7  rl   r€   r>  Úresolveds   &&&$  r   Úrecord_terminal_outcomerB    s€   € ðTÜ�zŠzÔ2×4Ò4ÙÝ3à�>‰>×ÒÙØ×6Ð6Ô.¨vÓ6ˆØÒÙÜÐ'Ô)@ÈÐksÔ)tÖuøÜô TÜ�‰ÐCÈdˆ×SðTús(   ‚ A6 ¤A6 ÁA6 ÁA6 ÁA6 Á6"BÂBc                  óp   € ] tR tRt$ Rt]! ]R7      tR]R&   ]! ]R7      t	R]R&   ]! ]
R7      tR]R	&   R
tR# )Ú
_TurnStatei$  zUPer-turn harness bookkeeping; ``agent._harness_metrics_turn`` is reset at turn start.rC   zlist[tuple[str, bool]]Úround_outcomesrE   Úpending_errorszset[tuple[str, str]]Úguard_signalsr   N)rH   rI   rJ   rK   rL   r   rM   rE  rN   rF  rŒ   rG  rO   r   r   r   rD  rD  $  s4   ‡ á_á-2À4Ô-H€NÐ*ÓHÙ %°dÔ ;€N�IÓ;Ù*/ÀÔ*D€MÐ'×Dr   rD  c               ó    € V ^8„  d   QhRRRR/# )r
   r4   r   r   rD  r   )r   s   "r   r   r   -  s   € ÷ ñ �sð ˜zñ r   c                ól   € \        V R R4      p\        V\        4      '       g   \        4       pWn        V# )Ú_harness_metrics_turnN)r&   r“   rD  rJ  )r4   Ústates   & r   Ú_turn_staterL  -  s0   € Ü�EÐ2°DÓ9€EÜ�eœZ×(Ò(Ü“ˆØ&+Ô#Ø€Lr   c               ó    € V ^8„  d   QhRRRR/# r3   r   )r   s   "r   r   r   5  s   € ÷ -ñ -�3ð -˜4ñ -r   c                ó<   € \        V 4      ;'       d    \        4       # r’   )r9   r   r8   s   &r   Ú_activerO  5  s   € Ü�uÓ×,Ð,¤(£*Ð,r   Úexact_failureÚidempotent_no_progressÚsame_tool_failureÚidentical_call_streak_haltÚidentical_call_streakÚidentical_cycle_haltÚidentical_cycleÚloop_web_search_capÚweb_search_capÚloop_subagent_capÚsubagent_capc               ó(   € V ^8„  d   QhRRRRRRRR/# )r
   r4   r   Úsignalr   Údetectorr   r   r   )r   s   "r   r   r   E  s.   € ÷ Zñ Z˜ð Z cð Z°Sð Z¸Tñ Zr   c                ó¶   € \        V 4      pW3VP                  9   d   R # VP                  P                  W34       \        R/ \	        V 4      CRVRV/C4       R # )NÚLOOP_GUARD_MARKr]  r\  )rL  rG  Úaddr*   r@   )r4   r\  r]  rK  s   &&& r   Ú_record_guardra  E  sX   € Ü˜Ó€EØÐ˜U×0Ñ0Ô0ÙØ	×Ñ×Ñ˜VÐ.Ô/ÜÐÐX¤&¨£-ÐX°¸XÀxÐQWÑXÖYr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r
   r4   r   Úactionr4  r   r   r   )r   s   "r   r   r   M  s.   € ÷ Nñ N Sð N°#ð N¸Sð NÀTñ Nr   c                óL  €  \         P                  \        T;'       g    R4      4      pRRRRRR/P                  \        T;'       g    R4      4      pVe   Ve   \        V 4      '       g   R# \	        WV4       R#   \
         d    \        P                  RR	R
7        R# i ; i)zÞA tool-loop guardrail verdict: ``warn`` (the call ran, the model was told it is repeating)
is ``repeated_tool_call``; ``block``/``halt`` (the harness stopped it) is ``loop_detected``.
Once per turn per detector and signal.r%   ÚwarnÚrepeated_tool_callÚblockÚloop_detectedÚhaltNz&Shared-metrics loop guard not recordedTr#   )Ú_GUARD_DETECTORSrX   r   rO  ra  r   r'   r(   )r4   rc  r4  r]  r\  s   &&&  r   Úrecord_guardrail_decisionrk  M  s’   € ðNÜ#×'Ñ'¬¨D¯J¨J°B«Ó8ˆØÐ.°¸È&ÐRaÐb×fÑfÔgjÐkq×kwÐkwÐuwÓgxÓyˆØÒ˜vš~´W¸U·^²^ÙÜ�e XÖ.øÜô NÜ�‰Ð=Èˆ×MðNús"   ‚A= Ÿ)A= Á	$A= Á/A= Á="B#Â"B#c               ó(   € V ^8„  d   QhRRRRRRRR/# )r
   r4   r   ÚdecisionÚ
stall_kindrU   r   r   r   )r   s   "r   r   r   [  s)   € ÷ =ñ = Sð =°Cð =ÀZð =ÐTXñ =r   c           	     óˆ   € \        VRR4      R8X  d   \        V R\        VRR4      4       V'       d   \        V RV4       R# R# )z�The warnings one tool result carried: a guardrail ``warn`` verdict and/or an identical-call
stall notice (``stall_kind`` names its detector).rc  Nre  r4  )r&   rk  )r4   rm  rn  s   &&&r   Úrecord_guardrail_warningsrp  [  s>   € ô ˆx˜ 4Ó(¨FÔ2Ü! %¨´¸À6È4Ó1PÔQßÜ! %¨°Ö<ñ r   c               ó    € V ^8„  d   QhRRRR/# )r
   rb   r   r   r   r   )r   s   "r   r   r   i  s   € ÷ 1ñ 1�Sð 1˜Sñ 1r   c                ó"   € ^RI Hp V! RV /4      # )r   )Útool_metric_nameÚ	tool_name)r!   rs  )rb   rs  s   & r   Ú
_tool_nameru  i  s   € Ý9á˜[¨$Ð/Ó0Ð0r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r
   r4   r   rt  Úis_errorr   r   r   r   )r   s   "r   r   r   o  s.   € ÷ Pñ P ð P°ð P¸tð PÈñ Pr   c                ó  €  \        V 4      '       dE   \        V 4      P                  P                  \	        T;'       g    R4      \        V4      34       R# R#   \         d    \        P                  RRR7        R# i ; i)zPEvery committed tool result of the current round, in the model's emission order.r%   z(Shared-metrics tool outcome not observedTr#   N)	rO  rL  rE  rY   r   r   r   r'   r(   )r4   rt  rw  s   &&&r   Úobserve_tool_outcomery  o  sf   € ðPÜ�5�>Š>Ü˜Ó×-Ñ-×4Ñ4´c¸)¿/¸/ÀrÓ6JÌDÐQYËNÐ5[Ö\ñ øäô PÜ�‰Ð?È$ˆ×OðPús   ‚<A ¿A Á"A?Á>A?c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r
   r4   r   Úrouter   rj   r   Ú	next_toolÚnext_outcomer   r   r   )r   s   "r   r   r   x  s8   € ÷ ñ ˜Cð ¨ð ¸cð Ècð Ðadð Ðimñ r   c                óD   € \        R / VCRVRVR\        V4      /C4       R# )ÚTOOL_RECOVERY_MARKr}  r|  rj   N)r*   ru  )r4   r{  rj   r|  r}  s   &&&&&r   Ú_record_recoveryr€  x  s2   € ÜÐ ð #Ø
ð#Ø ¨{¸IÀvÌzÐZ^ÓO_ñ#ö r   c               ó    € V ^8„  d   QhRRRR/# )r
   r4   r   r   r   r   )r   s   "r   r   r   ~  s   € ÷ Qñ Q˜Sð Q Tñ Qr   c                ó  a€  \        V 4      '       g   R# \        V 4      pVP                  . uq!n        V'       g   R# VP                  '       di   \	        V 4      pVP                   FM  o\        V3R lV 4       R4      pVf   V^ ,          ^,          MTp\        YSVf   RMRV'       d   RMR4       KO  	  V UUu. uF  w  reV'       g   K  VNK  	  uppVn        R# u uppi   \         d    \        P                  RRR	7        R# i ; i)
zóResolve the previous round's failed calls against this round's first calls, then carry
this round's failures forward. The next call to the same tool is the retry; with none, the
model switched tools and its first call is what it tried instead.Nc              3  ó>   <"  € T F  w  rVS8X  g   K  Vx € K  	  R # 5ir’   r   )Ú.0rb   rw   rj   s   &  €r   Ú	<genexpr>Ú$finish_tool_round.<locals>.<genexpr>Œ  s   øé € ÐQ¹©¨ÀDÈDÁLŸVšV»ùs   ƒ“
Ú	differentÚsamerq   rp   z)Shared-metrics tool recovery not recordedTr#   )
rO  rL  rE  rF  r@   Únextr€  r   r'   r(   )r4   rK  Úoutcomesr{  rˆ  rw   rb   rj   s   &      @r   Úfinish_tool_roundr‹  ~  sæ   ø€ ðQÜ�u�~Š~ÙÜ˜EÓ"ˆØ).×)=Ñ)=¸rÐ&ˆÔ&ßÙØ××ÐÜ˜5“MˆEØ×,Ô,�ÜÔQ¹ÓQÐSWÓX�Ø+/ª<˜ !� Qž¸T�Ü Ø $°t²|©È×\bÑQXÐhqöñ -ñ :BÔL¹©¨ÄV§ ¹ÒLˆÖùÓLøÜô QÜ�‰Ð@È4ˆ×PðQús@   ƒC% –&C% ¾C% ÁAC% Â,C% Â=CÃCÃ	C% ÃC% Ã%"DÄ
Dc               ó0   € V ^8„  d   QhRRRRRRRRRRRR/# )	r
   r4   r   Úturn_exit_reasonÚfinal_responseÚinterruptedrw   r   r   r   )r   s   "r   r   r   –  sA   € ÷ Lñ L�sð L¨cð LÀ3ð LÐX[ð LÐehð LÐmqñ Lr   c               ó&  €  \        V 4      '       g   R# \        V 4      p\        T;'       g    R4      pVP                  \        4      '       d   \        V RR4       VP                  . uqun        V'       g   R# VP                  R4      ;'       d*    \        V4      ;'       d    V'       * ;'       d    V'       * p\        V 4      p	V F  p
\        Y	T
RV'       d   RMR4       K  	  R#   \         d    \        P                  R	R
R7        R# i ; i)uí   Turn end: the iteration cap, and failed calls the model never followed with another
call â€” ``no_tool_call`` when it answered in text, ``gave_up`` when the turn ended without a
reply from it (halted, budget spent, interrupted, errored).Nr%   Úiteration_capÚiteration_budgetztext_response(rx   Úno_tool_callÚgave_upz$Shared-metrics turn end not recordedTr#   )rO  rL  r   r   Ú_BUDGET_EXIT_PREFIXESra  rF  r   r@   r€  r   r'   r(   )r4   r�  rŽ  r�  rw   rK  ÚreasonÚpendingÚansweredr{  rj   s   &&&$$      r   Úfinish_turnr™  –  së   € ðLÜ�u�~Š~ÙÜ˜EÓ"ˆÜÐ%×+Ð+¨Ó,ˆØ×ÑÔ2×3Ò3Ü˜% Ð2DÔEØ(-×(<Ñ(<¸bÐ%ˆÔ%ßÙà×ÑÐ.Ó/×kÐk´D¸Ó4H×kÐkÐQ\Ì_×kÐkÐekÔakð 	ô �u“ˆÛˆDÜ˜U¨4°Ï8¹ÐYbÖcó øäô LÜ�‰Ð;Àdˆ×KðLús9   ‚C* •C* ®!C* Á(C* Á:C* ÂC* Â%C* Â44C* Ã*"DÄDÚcontent_filterÚrefusalÚlengthÚtruncated_lengthÚ
incompletec               ó(   € V ^8„  d   QhRRRRRRRR/# )r
   r4   r   ÚresponseÚfinish_reasonr   r   r   )r   s   "r   r   r   ³  s.   € ÷ Pñ P˜sð P¨cð PÀ#ð PÈ$ñ Pr   c                ó  €  \         P                  \        T;'       g    R4      4      pVe   \        V 4      '       g   R# Wn        \        R/ \        V 4      CRV/C4       R#   \         d    \        P                  RRR7        R# i ; i)ap  A primary response whose structured finish reason is a refusal or an output-length stop
(transports already promote Anthropic ``stop_reason=refusal`` and an OpenAI ``message.refusal``
to ``content_filter``). Those mostly leave the loop before normal intake, so they are counted
where the reason is derived; the latch keeps intake from counting the same response again.r%   NÚMODEL_REPLY_ISSUE_MARKÚissuez(Shared-metrics reply finish not recordedTr#   )
Ú_FINISH_ISSUESrX   r   rO  Ú_harness_metrics_replyr*   r@   r   r'   r(   )r4   r   r¡  r¤  s   &&& r   Úrecord_reply_finishr§  ³  sy   € ð
PÜ×"Ñ"¤3 }×':Ð':¸Ó#;Ó<ˆØŠ=¤¨§¢ÙØ'/Ô$ÜÐ(Ð*K¬V°E«]Ð*K¸GÀUÑ*KÖLøÜô PÜ�‰Ð?È$ˆ×OðPús   ‚A$ Ÿ A$ Á!A$ Á$"B
Â	B
c               ó$   € V ^8„  d   QhRRRRRR/# )r
   r4   r   Úassistant_messager   r   r   )r   s   "r   r   r   Â  s&   € ÷ Xñ X˜sð X°sð X¸sñ Xr   c                ó  € \        VR R4      '       d   R# \        VRR4      p\        V\        4      '       d0   VP                  4       '       d   V P	                  V4      '       d   R# V P                  V4      '       d   R# R# )Ú
tool_callsNrx   ÚcontentÚreasoning_onlyÚempty)r&   r“   r   r„   Ú_has_content_after_think_blockÚ_extract_reasoning)r4   r©  r¬  s   && r   Úreply_content_issuer±  Â  sm   € ÜÐ  ,°×5Ò5ÙÜÐ'¨°DÓ9€GÜ�'œ3×Ò G§M¡M§O¢O¸×8\Ñ8\Ð]d×8eÒ8eÙØ$×7Ñ7Ð8I×JÒJÐÐWÐPWÐWr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r
   r4   r   r   r©  r   r   r   )r   s   "r   r   r   Ë  s.   € ÷ Qñ Q ð Q¨sð QÀsð QÈtñ Qr   c           	     óü   €  \        V 4      '       g   R# \        V RR4      VJ d
   RV n        R# \        R/ \	        V 4      CR\        W4      /C4       R#   \         d    \        P                  RRR7        R# i ; i)uä   Every other primary response: ``empty`` (no visible text, no tool call, no reasoning),
``reasoning_only`` (reasoning but nothing to show or run), else ``none`` â€” one row per
response, so issue rates have their own denominator.Nr¦  r£  r¤  z)Shared-metrics reply content not recordedTr#   )	rO  r&   r¦  r*   r@   r±  r   r'   r(   )r4   r   r©  s   &&&r   Úrecord_reply_contentr´  Ë  sv   € ðQÜ�u�~Š~ÙÜ�5Ð2°DÓ9¸XÓEØ+/ˆEÔ(ÙÜÐ(Ð*s¬V°E«]Ð*s¸GÔEXÐY^ÓErÑ*sÖtøÜô QÜ�‰Ð@È4ˆ×PðQús   ‚A •A ¯$A Á"A;Á:A;r’   )#Úshell_builtinÚcdÚechoÚexportÚsourceÚ.rŒ   ÚunsetÚpwdÚprintfÚtestÚ[z[[ÚtrueÚfalseÚexitÚaliasÚreadÚevalÚtypeÚhashÚulimitÚumaskÚwaitÚpushdÚpopdÚshoptÚtrapÚdeclareÚlocalÚifÚforÚwhileÚcaseÚ{)3Úfile_opsÚlsÚcatÚheadÚtailÚcpÚmvÚrmÚmkdirÚrmdirÚtouchÚfindÚgrepÚegrepÚrgÚsedÚawkÚchmodÚchownÚlnÚduÚdfÚtreeÚwcÚsortÚuniqÚdiffÚtarÚzipÚunzipÚgzipÚgunzipÚfdÚstatÚfileÚlessÚmoreÚrealpathÚreadlinkÚbasenameÚdirnameÚcutÚtrÚxargsÚteeÚjqrf   Úmd5sumÚ	sha256sumÚtruncateÚwhich>	   ÚenvÚexecÚniceÚsudoÚtimeÚnohupÚstdbufÚbuiltinr  )Úrepeated_exact_failure_blockÚrepeated_exact_failure_warning)Úidempotent_no_progress_blockÚidempotent_no_progress_warning)Úsame_tool_failure_haltÚsame_tool_failure_warning)Úbudget_exhaustedzmax_iterations_reached()CÚ__conditional_annotations__rL   Ú
__future__r   Úcontextvarsr–   ÚloggingÚreÚdataclassesr   r   Útypingr   r   Ú	getLoggerrH   r'   r7   r   r*   r1   r9   r@   rB   Ú
ContextVarrR   rN   r[   rd   rƒ   r‡   r�   r�   rŸ   r  Ú	frozensetr  Úcompiler  r  r"  r  r  r(  r3  r5  r;  rB  rD  rL  rO  r”   rž   rj  ra  rk  rp  r•  ru  ry  r€  r‹  r™  r¥  r§  r±  r´  )r  s   @r   Ú<module>r"     sï  øðôõ #ã Û Û Û 	ß (ß  à	×	Ò	˜8Ó	$€à(Ð õõQõõdõ
Xð ÷4ð 4ó ð4ð :E×9OÒ9OØ¨ô:€Ð6ó ÷
	"õIð ˜) W¨e°\À<ÐP€õõ6õ&2õ&ð'"ÙˆU�E˜4 ¨	°5Ó9ð'"áØ˜5 &¨$°°xÀÈÐRYÐ[gØˆv�v˜u i°¸ÀÀxÐQVÐX]Ð_gØ�E˜6 7¨H°fóð'"ñ Ø�˜ '¨7°D¸(ÀIÈuÐV]Ð_fØˆu�d˜G Y°¸À%ÈÐS\Ð^eØ�˜uóð'"ñ Ø�x ¨E°5¸&À(ÈGÐU\Ð^gØ�óð'"ñ  ˆX�x ¨I°v¸wÓGð!'"ñ" ˆV�V˜U F¨E°9¸eÀXÓNð#'"ñ$ ò ð%'"ñ. ˆW�f˜d E¨6°6¸5À&È,ÐX]Ó^ð/'"ñ0 ò ð1'"ñ> Ø�6˜6 5¨%°¸&À$ÈÈzÐ[aÐckØ��|óð?'"ñF Ø�X˜x¨Ð4DÀfÈiÐYcÐekØˆ{˜MóðG'"€�ó 'ñR ÒnÓoÐ Ø�JŠJÐ,Ó-€	Ø—’Ð6Ó7€Ø�ZŠZÐ,Ó-€
àÐ ØÐ õñ, ˜c 3˜ZÓ(Ð õKõ"ñTÐei÷ Tð Tð* ÷Eð Eó ðEõõ-ðØ
‡m�mÐVÐXgÓhðà
‡m�mÐVÐXpÓqðð ‡m�mÐKÐM`Óaðð !Ð"9Ð;RÐTkØÐ-Ð/@ÐBSØÐ+Ð-@À.ñÐ õZõNõ=ð HÐ õ
1õPõõQõ0Lð4 # I¨xÐ9KÈ\Ð[mÐn€õPõX÷Qr   