+
    „WÝjŠY  ã            
      óæ  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
H
t
 ^ RIHt ^ RIHt ]P                  ! ]4      tRtRt^@t]P*                  ! R4      tR	R	R
R
RR/t]! RR04      tRRRRRRRRRR/t]P*                  ! R4      t]! 0 RHm4      t]! R ]! ]4      P=                  4        4       4      t]! 0 RIm4      t ]! R04      R3]R3]R3] R33t!RJt"]P*                  ! R4      t#R R lt$R R  lt%R! R" lt&R# R$ lt'R% R& lt(R' R( lt)R) R* lt*R+ R, lt+R- R. lt,R/ R0 lt-R1 R2 lt.R3 R4 lt/R5 R6 lt0R7 R8 lt1R9R:/R; R< llt2R= R> lt3R? R@ lt4RA RB lt5RCR/RD RE llt6RF RG lt7R# )Ka  Shared-metrics facts for ``hermes update`` runs and Desktop self-updates.

``hermes.update.run`` / ``hermes.update.stage`` are DERIVED from the final update receipt in the
process that finalizes it (``update_receipt.finalize_update_receipt``): the receipt already carries
the outcome, the stage marks with timestamps, the admission refusal and the fleet matrix, so no
stage is instrumented for metrics. A pre-pull interpreter must never import pulled code, so when
it is the finalizer it parks the receipt under the store dir (stdlib-only code in update_receipt)
and :func:`report_pending_updates` records it on the next Hermes start.

Desktop's packaged updaters (electron-updater, App Installer, Store) never run ``hermes update``;
Desktop reports their outcome through the ``shared_metrics.update_run`` RPC instead. Desktop's
source-checkout hand-off DOES run ``hermes update``; that receipt is tagged ``initiator=desktop``
and counted here, never by the RPC, so no run is counted twice.

Run and stage rows agree on where a FAILED run stopped: a run whose ``failed_stage`` names a stage it
never marked (it exited inside it, before the stage's END mark) also gets one failed stage row for it.
A run that passed the commit point and only owes follow-ups (contract C3) is a ``success`` run, while
the stage that failed (``deps``, ``build``, ``restart``, ``verify``) still reads ``failed`` at stage level.
)ÚannotationsN)Údatetime)ÚPath)ÚAnyÚpending_updatesÚrecorded_updatesz[0-9a-f]{8,64}ÚsuccessÚrefusedÚnoopÚstaleÚdownzelectron-updaterÚpackagezapp-installerzmicrosoft-storezwindows-handoffÚgitzposix-handoffz([A-Z][A-Za-z0-9_]*):(?: |$)c              #  óŠ   "  € T F9  w  r\        V\        4      '       g   K  \        V\        4      '       g   K5  Vx € K;  	  R # 5i©N)Ú
isinstanceÚtypeÚ
issubclassÚOSError)Ú.0ÚnameÚvalues   &  ÚbC:\Users\johnn\AppData\Local\hermes\hermes-agent\hermes_cli\observability\shared_metrics_update.pyÚ	<genexpr>r   ?   s0   é € ð nÙ2‰[ˆT´jÀÌ×6M„DÔR\Ð]bÔdk×Rl‡D‚DÓ2ùs   ‚A¡A¹
AÚPermissionErrorÚpermission_deniedÚdeps_failedÚos_errorÚsubprocess_failedz8[A-Z][A-Za-z0-9_]*: \[(?:Errno 28|WinError (?:39|112))\]c               ó    € V ^8„  d   QhRRRR/# ©é   Úreceiptúdict[str, Any]ÚreturnÚbool© )Úformats   "r   Ú__annotate__r(   T   s   € ÷ Zñ Z˜ð Z¨4ñ Zó    c                ó¼   € V P                  R 4      p\        V\        4      ;'       d5    \        ;QJ d    R V 4       F  '       g   K   R# 	  R# ! R V 4       4      # )Úfleetc              3  ó‚   "  € T F5  p\        V\        4      ;'       d    VP                  R 4      \        9   x € K7  	  R# 5i)ÚstateN)r   ÚdictÚgetÚ_FLEET_BAD_STATES©r   Úrows   & r   r   Ú_fleet_bad.<locals>.<genexpr>V   s6   é € ð +ZÙSXÈCŒ
�3œÓ×GÐG #§'¡'¨'Ó"2Ô6GÑ"GÔGÓSXùs   ‚?ž!?TF)r/   r   ÚlistÚany)r"   r+   s   & r   Ú
_fleet_badr6   T   sh   € Ø�K‰K˜Ó €EÜ�eœTÓ"÷ Zð Z§s£sñ +ZÙSXó+Z§s¤sð Z¢sð Z sñ +ZÙSXó+Zó (Zð Zr)   c               ó    € V ^8„  d   QhRRRR/# r    r&   )r'   s   "r   r(   r(   Z   s   € ÷ Vñ V ð V°Dñ Vr)   c                ó”  € V P                  R 4      p\        V\        4      '       dF   VP                  R4      RJ g/   VP                  R4      '       g   VP                  R4      '       d   R# V P                  R4      p\        V\        4      ;'       d5    \        ;QJ d    R V 4       F  '       g   K   R# 	  R# ! R V 4       4      # )Úgateway_restartÚ
incompleteTÚphase_errorÚfailed_unitsÚruntime_outcomesc              3  óz   "  € T F1  p\        V\        4      ;'       d    VP                  R 4      R8H  x € K3  	  R# 5i©ÚoutcomeÚfailedN©r   r.   r/   r1   s   & r   r   Ú&_restart_incomplete.<locals>.<genexpr>`   s4   é € ð .VÙLTÀSŒ
�3œÓ×@Ð@ #§'¡'¨)Ó"4¸Ñ"@Ô@ËHùs   ‚;ž;F)r/   r   r.   r4   r5   )r"   ÚrestartÚoutcomess   &  r   Ú_restart_incompleterF   Z   s¶   € Ø�k‰kÐ+Ó,€GÜ�'œ4× Ò Ø�K‰K˜Ó%¨Ó-°·±¸]×1KÒ1KÈwÏ{É{Ð[i×OjÒOjÙØ�{‰{Ð-Ó.€HÜ�h¤Ó%÷ Vð V¯#«#ñ .VÙLTó.V¯#¬#ð Vª#ð V¨#ñ .VÙLTó.Vó +Vð Vr)   c               ó$   € V ^8„  d   QhRRRRRR/# )r!   r"   r#   Ústagesúlist[dict[str, Any]]r$   ú
str | Noner&   )r'   s   "r   r(   r(   d   s"   € ÷ ñ ˜ð Ð1Eð È*ñ r)   c                ó  € ^RI Hp V P                  R4      R8X  d   V P                  R4      '       d   R# V P                  R4      pW29   d=   \        ;QJ d    R V 4       F  '       g   K   RM	  R	M! R V 4       4      '       g   V# R
# )z«The class the run named itself: the user's parked changes on a committed run, or the closed
``stop_class`` a pre-apply exit recorded (read only while nothing was applied).)ÚUPDATE_STOP_CLASSESr@   ÚpartialÚuser_actionÚlocal_changes_parkedÚ
stop_classc              3  ó8   "  € T F  qR ,          R8H  x € K  	  R# 5i)r   ÚapplyNr&   ©r   Úss   & r   r   Ú_named_stop.<locals>.<genexpr>n   s   é € Ð4ZÑSYÈa°vµYÀ'Ö5IÓSYùó   ‚TFN)Úshared_metrics_contractrL   r/   r5   )r"   rH   rL   rP   s   &&  r   Ú_named_stoprX   d   sj   € õ =à‡{�{�9Ó Ô*¨w¯{©{¸=×/IÒ/Iñ &Ø—‘˜\Ó*€JØÔ(·³Ñ4ZÑSYÓ4Z··²Ñ4ZÑSYÓ4Z×1ZÒ1ZØÐÙr)   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r!   r"   r#   rH   rI   r@   Ústrr$   r&   )r'   s   "r   r(   r(   s   s+   € ÷ ;"ñ ;" .ð ;"Ð:Nð ;"ÐY\ð ;"Ðadñ ;"r)   c                ó  aa€ VR%9  d   R# V P                  R4      p\        V\        4      '       d   TM. p\        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   R# V P                  R	4      p\        V\        4      '       d   TMR
oV P                  R4      p\
        P                  S4      pV'       d   VP                  ^4      MR
oSR8X  g   V^‚8X  d   R# \        W4      ;p'       d   V# VR8X  d   V^8X  d   R# R# V U	u0 uF#  q™P                  R4      R8X  g   K  V	R,          kK%  	  p
p	RV
9   d   R# \        V 4      '       d   R# RV
9   g   \        V 4      '       d   R# V P                  R4      R8X  d   R# V'       d5   VR&,          R,          R8X  d    VR&,          P                  R4      R8X  d   R# \        V3R l\         4       R4      ;p'       d   V# \        P                  S4      '       d   R# S'       d   \        V3R l\         4       R4      # V U	u0 uF  q™R,          kK  	  pp	RV9   d   R V9  d   R!# RV9  d   R# R# R"V 9  d   R# S'       g   Vf   R## R$# u up	i u up	i )'aË  Why a failed/refused/partial run stopped, from fields the FINAL receipt already carries.

A pre-apply exit names itself (``stop_class``, recorded on the line before the exit by
update_receipt.record_stop_reason); only a run with no apply mark reads it, so a reason can
never outlive the exit that recorded it. Parked copies (update_receipt._metric_receipt) carry
every field read here except the free text; copies parked by older releases have no ``schema``.
rA   r	   ÚnoneÚstepsc              3  ó¶   "  € T FO  p\        V\        4      ;'       d3    VP                  R 4      R8H  ;'       d    VP                  R4      '       * x € KQ  	  R# 5i©r   Ú	admissionÚokNrB   rS   s   & r   r   Ú'update_failure_class.<locals>.<genexpr>   sD   é € Ð
cÑ]bÐXYŒ:�aœÓ×SÐS 1§5¡5¨£=°KÑ#?×SÐSÈÏÉÈdËÄOÔSÓ]bùó   ‚AžAºATFÚmanaged_installÚstop_reasonÚ Ú	exit_codeÚKeyboardInterruptÚinterruptedÚ	lock_heldÚotherr@   r   ÚbuildÚbuild_failedÚfleet_stalerD   Úrestart_failedrM   Úfleet_unverifiedÚskippedc              3  ó^   <"  € T F"  w  rSP                  V4      '       g   K  Vx € K$  	  R # 5ir   )Ú
startswith)r   ÚprefixÚclsÚreasons   &  €r   r   rb   ™   s&   øé € ÐjÑ1L¡+ &ÐPV×PaÑPaÐbh×PiŸ#š#Ó1Lùs   ƒ-£
-NÚ	disk_fullc              3  ó>   <"  € T F  w  rSV9   g   K  Vx € K  	  R # 5ir   r&   )r   Útypesru   Úexc_types   &  €r   r   rb   ž   s   øé € ÐXÑ+B™Z˜UÀhÐRWÑFW—S’SÓ+Bùs   ƒ“
Ú	exceptionrR   Údepsr   ÚschemaÚ
git_failedÚaborted_before_apply>   rA   r	   éÿÿÿÿ)r/   r   r4   r5   rZ   Ú_EXCEPTION_STOP_REASONÚmatchÚgrouprX   r6   rF   ÚnextÚ_STOP_REASON_PREFIX_CLASSESÚ_DISK_FULL_ERRNOÚ_EXCEPTION_TYPE_CLASSES)r"   rH   r@   Ú	raw_stepsr]   Ú
raw_reasonrg   r‚   ÚnamedrT   Úfailed_marksÚ	by_reasonÚmarkedrz   rv   s   &&&          @@r   Úupdate_failure_classrŽ   s   s1  ù€ ð Ð+Ô+ÙØ—‘˜GÓ$€IÜ$.¨y¼$×$?Ò$?‘yÀR€Eß
ƒsÑ
cÑ]bÓ
c‡s‡s‚sÑ
cÑ]bÓ
c×cÒcÙ Ø—‘˜]Ó+€JÜ *¨:´s× ;Ò ;‘*À€FØ—‘˜KÓ(€IÜ"×(Ñ(¨Ó0€Eß!&ˆu�{‰{˜1Œ~¨B€HØÐ&Ô&¨)°sÔ*:ÙÜ˜GÓ,Ð,€uÖ,ØˆØ�)Ôð (¨1œnˆ{Ð9°'Ð9Ù'-ÓN¡v !·±°yÓ1AÀXÑ1M”I�A�f—I�I¡v€LÐNØ�,ÔÙÜ�'×ÒÙØ�LÔ Ô$7¸×$@Ò$@ÙØ‡{�{�9Ó Ô*Ù!ß�&˜•*˜VÕ$¨	Ô1°f¸Rµj·n±nÀYÓ6OÐS\Ô6\ÙÜÔjÕ1LÓjÐlpÓqÐq€yÖqØÐÜ×Ñ˜f×%Ò%ÙßÜÔXÕ+BÓXÐZeÓfÐfÙ!'Ó(¡˜A��iˆi¡€FÐ(Ø�&ÔØ˜ÔÙ Ø˜&Ô Ù!ÙØ�wÔñ ÷ �iÒ'ÙÙ!ùòA Oùò" )s   ÄI=Ä6I=È6Jc               ó    € V ^8„  d   QhRRRR/# )r!   r   r   r$   úfloat | Noner&   )r'   s   "r   r(   r(   ²   s   € ÷ ñ �#ð ˜,ñ r)   c                ó  €  \        V \        \        34      '       d"   \        V \        4      '       g   \        V 4      # \        P
                  ! \        V 4      4      P                  4       #   \        \        \        3 d     R # i ; ir   )r   ÚintÚfloatr%   r   ÚfromisoformatrZ   Ú	timestampÚOverflowErrorÚ	TypeErrorÚ
ValueError)r   s   &r   Ú_epochr™   ²   se   € ðÜ�eœc¤5˜\×*Ò*´:¸eÄT×3JÒ3JÜ˜“<ÐÜ×%Ò%¤c¨%£jÓ1×;Ñ;Ó=Ð=øÜœ9¤jÐ1ô Úðús   ‚<A, ¿,A, Á,BÂBc               ó$   € V ^8„  d   QhRRRRRR/# )r!   Ústartr   Úendr$   r�   r&   )r'   s   "r   r(   r(   »   s&   € ÷ \ñ \�sð \ ð \¨ñ \r)   c                ój   € \        V 4      \        V4      r2Ve   Ve   W28  d   R # W2,
          R,          # )Néè  )r™   )r›   rœ   ÚfirstÚlasts   &&  r   Ú_elapsed_msr¡   »   s0   € Ü˜“-¤¨£ˆ4Ø’= D¢L°D´Lˆ4Ð[ÀtÅ|ÐW[ÕF[Ð[r)   c               ó    € V ^8„  d   QhRRRR/# )r!   r"   r#   r$   rI   r&   )r'   s   "r   r(   r(   À   s   € ÷ ñ ˜^ð Ð0Dñ r)   c                ó€  € ^RI Hp . pV P                  R4      pV P                  R4      ;'       g    R F{  p\        V\        4      '       d   VP                  R4      V9  d   K1  VP                  / VCR\        W4P                  R4      4      /C4       VP                  R4      ;'       g    TpK}  	  V P                  R4      p\        V\        4      '       dä   V'       dÜ   \        ;QJ d    R V 4       F  '       g   K   R	M	  R
M! R V 4       4      '       g¢   \        V 4      ;'       gV    V P                  R4      R8H  ;'       d:    \        ;QJ d    R V 4       F  '       g   K   R	M	  R
M! R V 4       4      '       * pTP                  RRRV'       d   RMRR\        W0P                  R4      4      /4       V# )zVStage marks in order, each with a duration since the previous mark (or the run start).©ÚUPDATE_STAGESÚ
started_atrH   r   Úduration_msÚatr+   c              3  ó8   "  € T F  qR ,          R8H  x € K  	  R# 5i)r   ÚverifyNr&   rS   s   & r   r   Ú"_receipt_stages.<locals>.<genexpr>Í   s   é € Ð4[ÑTZÈq°vµYÀ(Ö5JÓTZùrV   TFr@   rM   c              3  óH   "  € T F  qP                  R 4      R8H  x € K  	  R# 5ir?   ©r/   rS   s   & r   r   r«   Ô   s    é € Ð;iÑbhÐ]^¿E¹EÀ)Ó<LÐPXÖ<XÓbhùs   ‚ "rª   rA   r   Úfinished_atr&   )
rW   r¥   r/   r   r.   Úappendr¡   r4   r5   r6   )r"   r¥   rH   ÚpreviousÚmarkr+   Úbads   &      r   Ú_receipt_stagesr³   À   s`  € å6à#%€FØ�{‰{˜<Ó(€HØ—‘˜HÓ%×+Ð+¨Ò+ˆÜ˜$¤×%Ò%¨¯©°&Ó)9ÀÔ)NÙØ�‰ÐT˜ÐT˜}¬k¸(ÇHÁHÈTÃNÓ.SÑTÔUØ—8‘8˜D“>×-Ð- XŠñ	 ,ð
 �K‰K˜Ó €Eä�%œ×Ò§5·³Ñ4[ÑTZÓ4[··²Ñ4[ÑTZÓ4[×1[Ò1[ô ˜Ó!÷ kð kØ�K‰K˜	Ó" iÑ/×iÐi¿»Ñ;iÑbhÓ;i¿¿ºÑ;iÑbhÓ;iÓ8iÔ4ið 	ð 	�‰Ø�H˜i·S©¸iØœ; x·±¸]Ó1KÓLð
ô 	ð €Mr)   c               ó    € V ^8„  d   QhRRRR/# )r!   rH   rI   r$   rZ   r&   )r'   s   "r   r(   r(   Ý   s   € ÷ ]ñ ]Ð.ð ]°3ñ ]r)   c                ó  € ^RI Hp V '       g   R# V R	,          pVR,          R8H  ;'       g)    VR,          R8H  ;'       d    VP                  R4      R8H  pVP                  R4      R8X  g	   V'       dJ   V  Uu. uF#  qDP                  R4      R8X  g   K  VR,          NK%  	  ppV'       d
   VR	,          # VR,          # VP                  VR,          4      pV^,           \	        V4      8  d   W^,           ,          # R# u upi )
zWWhere a failed/refused run stopped: the failing stage, else the stage it never reached.)ÚUPDATE_STAGE_ORDERrk   r   rª   rD   r@   rq   rA   r€   )rW   r¶   r/   ÚindexÚlen)rH   r¶   r    ÚterminalrT   rA   r·   s   &      r   Ú_failed_stagerº   Ý   sÞ   € å;çÙØ�"�:€DØ�F�|˜xÑ'×kÐk¨D°­L¸IÑ,E×,jÐ,jÈ$Ï(É(ÐS\ÓJ]ÐajÑJj€HØ‡x�x�	Ó˜hÔ&¯(Ù%+ÓL¡V ¯u©u°YÓ/?À8Ñ/K”)�!�F—)�)¡VˆÐL÷ $ˆv�b�zÐ5¨¨f­Ð5à×$Ñ$ T¨&¥\Ó2€EØ,1°A­I¼Ð<NÓ8OÔ,OÐ a�iÕ(Ð\ÐU\Ð\ùò Ms   Á8C=ÂC=c               ó$   € V ^8„  d   QhRRRRRR/# )r!   r"   r#   rH   rI   r$   rZ   r&   )r'   s   "r   r(   r(   ð   s"   € ÷ ñ ˜ð Ð1Eð È#ñ r)   c                óV  € V F4  pVR ,          R8X  g   K  VP                  R4      R	9   g   K+  VR,          u # 	  \        ;QJ d5    R V P                  R4      ;'       g    R
 4       F  '       g   K   RM*	  RM&! R V P                  R4      ;'       g    R
 4       4      '       d   R# R# )r   rR   Úmodec              3  ó¶   "  € T FO  p\        V\        4      ;'       d3    VP                  R 4      R8H  ;'       d    VP                  R4      '       * x € KQ  	  R# 5ir_   rB   rS   s   & r   r   Ú_apply_mode.<locals>.<genexpr>õ   sD   é € Ð
xÑ]wÐXYŒ:�aœÓ×SÐS 1§5¡5¨£=°KÑ#?×SÐSÈÏÉÈdËÄOÔSÓ]wùrc   r]   TFÚexternalÚunknown>   r   Úzipr&   )r/   r5   )r"   rH   Ústages   && r   Ú_apply_moderÄ   ð   s�   € ÛˆØ��=˜GÖ#¨¯	©	°&Ó(9¸^Ö(KØ˜•=Ò ñ ÷ ƒsÑ
xÐ]d×]hÑ]hÐipÓ]q×]wÐ]wÐuwÐ]wÓ
x‡s‡s‚sÑ
xÐ]d×]hÑ]hÐipÓ]q×]wÐ]wÐuwÐ]wÓ
x×xÒxÙÙr)   c               ó    € V ^8„  d   QhRRRR/# r    r&   )r'   s   "r   r(   r(   ú   s   € ÷ ñ  ~ð ¸$ñ r)   c                óŠ  € \         ;QJ d5    R V P                  R4      ;'       g    R	 4       F  '       g   K   RM*	  RM&! R V P                  R4      ;'       g    R	 4       4      pV P                  R4      R8H  ;'       g7    V P                  R4      R8H  ;'       d    \        V P                  R4      4      pT;'       d    T# )
a  The code moved (an apply mark that did not fail), and the run closed owing work, not failed:
interrupted after the commit point (finalize_interrupted_update_receipt) or the user's parked
changes (record_user_action -> ``partial``). Follow-ups alone already finalize ``success`` (C3).c              3  ó²   "  € T FM  p\        V\        4      ;'       d1    VP                  R 4      R8H  ;'       d    VP                  R4      R8g  x € KO  	  R# 5i)r   rR   r@   rA   NrB   )r   r±   s   & r   r   Ú,_committed_with_work_owed.<locals>.<genexpr>þ   sO   é € ð ;Ù9�dô ˜T¤4Ó(×lÐl¨T¯X©X°fÓ-=ÀÑ-H×lÐlÈTÏXÉXÐV_ÓM`ÐdlÑMlÔlÛ9ùs   ‚AžAºArH   TFr@   ri   rM   rN   r&   )r5   r/   r%   )r"   ÚappliedÚoweds   &  r   Ú_committed_with_work_owedrË   ú   s¯   € ÷ ‹cñ ;Ø%Ÿk™k¨(Ó3×9Ð9°rÐ9ó;�c�cŠcñ ;Ø%Ÿk™k¨(Ó3×9Ð9°rÐ9ó;ó ;€Gà�;‰;�yÓ! ]Ñ2÷ Rð RØ�‰�IÓ )Ñ+×PÐP´°W·[±[ÀÓ5OÓ0Pð 	à×Ð�tÐr)   c               ó    € V ^8„  d   QhRRRR/# )r!   r"   r#   r$   z2tuple[dict[str, str], list[dict[str, str]]] | Noner&   )r'   s   "r   r(   r(     s   € ÷ .ñ . >ð .Ð6hñ .r)   c                óh  € ^RI HpHp \        V \        4      '       d   V P                  R4      '       g   R# \        V 4      p\        P                  \        V P                  R4      ;'       g    R4      R4      pVR8X  d=   \        ;QJ d    R V 4       F  '       g   K   R	M	  R
M! R V 4       4      '       d   Rp\        V 4      '       d   Rp\        V P                  R4      4      p\        V P                  R4      ;'       g    / P                  R4      4      pVe   Vf   RMWV,
          R,          p\        YVR8X  d   RMT4      pR\        W4      RV! \        V P                  R4      V P                  R4      4      4      RVR8X  d   RMVR"9   d   \        V4      MRRV! V4      RV P                  R4      R8X  d   RMRRVRV/p	V	R,          R8X  d   V'       g   RV	R&   V U
u. uFF  p
RV! V
R,          4      RV
P                  R4      R#9   d   V
P                  R4      MRRV
R ,          /NKH  	  pp
\!        W“4      ;p'       da   \#        R! \%        V4       4       V P                  R4      4      pVP'                  RV! \        WÐP                  R4      4      4      RRRV/4       W›3# u up
i )$zQBounded hermes.update.run + hermes.update.stage dimensions for one FINAL receipt.)Úupdate_duration_bucketÚversion_age_bucketr®   Nr@   rf   rA   r   c              3  óp   "  € T F,  qR ,          R8H  ;'       d    VP                  R4      R8H  x € K.  	  R# 5i)r   rR   r@   rq   Nr­   rS   s   & r   r   Ú(update_receipt_fields.<locals>.<genexpr>  s4   é € Ð#kÑdjÐ_` f¥I°Ñ$8×$ZÐ$Z¸Q¿U¹UÀ9Ó=MÐQZÑ=ZÔ$ZÓdjùs   ‚6™6TFr
   rM   r¦   Ú
pre_updateÚcommit_daterž   Ú
apply_modeÚduration_bucketÚfailed_stagerO   rR   r	   r\   Úfrom_version_age_bucketÚkindÚ	initiatorÚdesktopÚcliÚfailure_classr§   rÃ   r   c              3  ód   "  € T F&  qP                  R 4      '       g   K  VR ,          x € K(  	  R# 5i)r¨   Nr­   rS   s   & r   r   rÑ   .  s"   é € ÐKÑ+; a¿u¹uÀT¿{œ'˜!˜DŸ'š'Ó+;ùs   ‚0Ÿ0>   rA   rM   r	   >   rA   rq   r   )rW   rÎ   rÏ   r   r.   r/   r³   Ú_RUN_OUTCOMESrZ   r5   rË   r™   rŽ   rÄ   r¡   rº   Ú_unmarked_failed_stager„   Úreversedr¯   )r"   rÎ   rÏ   rH   r@   ÚstartedÚ	committedÚage_msrÜ   ÚrunrÃ   Ú
stage_rowsÚdied_inÚ	last_marks   &             r   Úupdate_receipt_fieldsrè     sx  € çSä�gœt×$Ò$¨G¯K©K¸×,FÒ,FÙÜ˜WÓ%€FÜ×Ñ¤ G§K¡K°	Ó$:×$@Ð$@¸bÓ AÀ8ÓL€GØ�)Ô§£Ñ#kÑdjÓ#k§§¢Ñ#kÑdjÓ#k× kÒ kØˆÜ  ×)Ò)ØˆÜ�W—[‘[ Ó.Ó/€GÜ˜Ÿ™ LÓ1×7Ð7°R×<Ñ<¸]ÓKÓL€IØ’_¨	Ò(9‰TÀÕ@SÐW[Õ?[€FÜ(¨ÀgÐQZÔFZ¹(Ð`gÓh€Mà”k 'Ó2ØÑ1´+¸g¿k¹kÈ,Ó>WÐY`×YdÑYdÐerÓYsÓ2tÓuØà$Ð(>Ô>‰GØ*1Ð5UÔ*U”˜vÔ&Ð[aØ!Ñ#5°fÓ#=Ø˜WŸ[™[¨Ó5¸ÔB‘	ÈØ�7à˜ð€Cð ˆ9…~˜Ô"¯6Ø$ˆˆNÑñ óñ ˆEð	 Ñ5°e¸MÕ6JÓKØ¨u¯y©y¸Ó/CÐGgÔ/g�u—y‘y Ô+ÐmuØ�U˜6•]ó	
ñ
 ð ð ô )¨Ó5Ð5€wÖ5ÜÑK¬8°FÔ+;ÓKÈWÏ[É[ÐYeÓMfÓgˆ	Ø×ÑØÑ5´kÀ)Ï[É[ÐYfÓMgÓ6hÓiØ�x ¨'ð
ô 	ð ˆ?Ðùòs   Ç+AJ/c               ó$   € V ^8„  d   QhRRRRRR/# )r!   rä   údict[str, str]rH   rI   r$   rJ   r&   )r'   s   "r   r(   r(   6  s#   € ÷ ñ  ð Ð8Lð ÐQ[ñ r)   c                óÔ   a€ ^RI Hp V R,          oV R,          R8w  gH   SV9  gA   \        ;QJ d    V3R lV 4       F  '       g   K   RM	  RM! V3R lV 4       4      '       d   R# S# )	aÕ  The stage a failed run stopped in when the receipt holds no mark for it, else None.

Stage marks are END marks, so a run that exits inside a stage (every pre-apply ``sys.exit``:
fetch, channel, branch, merge, HEAD checks) leaves none for it and the stage rows would show no
failure where the run row says it died. Only ``failed`` runs: a refusal is not a stage failure,
and a committed run that owes follow-ups is a ``success`` whose failed stage already has its mark.
r¤   rÖ   r@   rA   c              3  ó:   <"  € T F  qR ,          S8H  x € K  	  R# 5i)r   Nr&   )r   rT   ræ   s   & €r   r   Ú)_unmarked_failed_stage.<locals>.<genexpr>A  s   øé € ÐHnÑgmÐbcÈ6ÍÐV]ÖI]Ógmùs   ƒTFN)rW   r¥   r5   )rä   rH   r¥   ræ   s   && @r   rß   rß   6  sO   ø€ õ 7à�.Õ!€GØ
ˆ9…~˜Ô! W°MÔ%AÇSÃSÔHnÑgmÓHnÇSÇSÂSÔHnÑgmÓHn×EnÒEnÙØ€Nr)   c               ó   € V ^8„  d   QhRR/# )r!   r$   r%   r&   )r'   s   "r   r(   r(   F  s   € ÷ Fñ F˜ñ Fr)   c                 óê   € ^ RI Hp  V ! 4       ;'       g    / pR F,  p\        V\        4      '       d   VP	                  V4      MRpK.  	  \        V\        4      ;'       d    VP	                  R4      RJ # )zVCheap pre-gate so a disabled install never loads the Relay runtime; `_emit` re-checks.)Úread_raw_config_readonlyNÚenabledT©Ú	telemetryÚshared_metrics)Úhermes_cli.configrð   r   r.   r/   )rð   ÚconfigÚkeys      r   Ú_collection_onrø   F  s]   € å:á*Ó,×2Ð2°€FÛ.ˆÜ$.¨v´t×$<Ò$<�—‘˜C”À$Šñ /ä�fœdÓ#×EÐE¨¯
©
°9Ó(=ÀÐ(EÐEr)   c               ó    € V ^8„  d   QhRRRR/# )r!   Ú	update_idr   r$   ztuple[bool, Path | None]r&   )r'   s   "r   r(   r(   P  s   € ÷ ñ  ð Ð(@ñ r)   c                ó„  € ^ RI Hp \        V \        4      '       d   \        P                  V 4      '       g   R
# V! 4       R,          R,          \        ,          pVP                  RRR7       W ,          p \        P                  ! \        P                  ! V\        P                  \        P                  ,          \        P                  ,          4      4        \        TP!                  4       R RR7      \"        R  F  pTP%                  RR	7       K  	  RT3#   \         d    Ru # i ; i  \&         d     RT3# i ; i)zS``(first, latch)``: first is False when this profile already counted ``update_id``.©Úget_hermes_homeTNró   rô   )ÚparentsÚexist_okc                ó6   € V P                  4       P                  # r   )ÚstatÚst_mtime)Úps   &r   Ú<lambda>Ú"_claim_update_id.<locals>.<lambda>^  s   € ¸q¿v¹v»x×?PÒ?Pr)   )r÷   Úreverse©Ú
missing_ok)TN)FN)Úhermes_constantsrý   r   rZ   Ú
_UPDATE_IDÚ	fullmatchÚRECORDED_DIRNAMEÚmkdirÚosÚcloseÚopenÚO_CREATÚO_EXCLÚO_WRONLYÚFileExistsErrorÚsortedÚiterdirÚ_RECORDED_KEEPÚunlinkr   )rú   rý   Ú	directoryÚlatchr   s   &    r   Ú_claim_update_idr  P  s  € å0ä�i¤×%Ò%¬Z×-AÑ-AÀ)×-LÒ-LØÐÙÓ! KÕ/Ð2BÕBÔEUÕU€IØ‡O�O˜D¨4€OÔ0ØÕ!€EðÜ
�Š”—’˜¤§
¡
¬R¯Y©YÕ 6¼¿¹Õ DÓEÔFðÜ˜I×-Ñ-Ó/Ñ5PÐZ^Ô_Ô`nÐ`oÓpˆEØ�L‰L DˆLÖ)ñ qð �ˆ;Ðøô ô ØÒðûô
 ô ØØ�ˆ;Ððús%   Á6A#D Ã=D. ÄD+Ä*D+Ä.D?Ä>D?Ú
wait_savedFc               ó$   € V ^8„  d   QhRRRRRR/# )r!   r"   r#   r  r%   r$   r&   )r'   s   "r   r(   r(   e  s"   € ÷ ñ  >ð À$ð ÐSWñ r)   c               óÖ  a€  \        4       '       g   R# ^RIHo ^RIHpHp \        V 4      pVf   R# \        V P                  R4      4      w  rVV'       g   R# Vw  rxSP                  V3.V3R lV 4       Op	V'       g   V	 F  w  r«V! W«3R l4       K  	  R# V! V	4      '       d   R# Ve   VP                  RR7       R#   \         d    \        P                  R	RR
7        R# i ; i)a  Record one run row plus its stage rows from a final receipt, once per update_id.

``wait_saved`` (parked receipts) blocks until the rows are in the store; False means the caller
must keep the receipt for a later retry. True also covers "nothing to record". Never raises.
T©rW   )Ú_emitÚ
emit_savedrú   c              3  ó@   <"  € T F  pSP                   V3x € K  	  R # 5ir   )ÚUPDATE_STAGE_MARK)r   r2   Úcontracts   & €r   r   Ú(record_update_receipt.<locals>.<genexpr>x  s    øé € Ð2kÑ`jÐY\°H×4NÑ4NÐPSÕ3TÓ`jùs   ƒc                ó   € V # r   r&   )r2   s   &r   r  Ú'record_update_receipt.<locals>.<lambda>{  s   € ©Cr)   r  Fz"Update shared metrics not recorded©Úexc_info)rø   rf   rW   Úshared_metrics_eventsr   r!  rè   r  r/   ÚUPDATE_RUN_MARKr  Ú	ExceptionÚloggerÚdebug)r"   r  r   r!  ÚderivedrŸ   r  rä   rå   Úrowsr±   r2   r$  s   &$          @r   Úrecord_update_receiptr1  e  sÒ   ø€ ðÜ×ÒÙÝ9ß<ä'¨Ó0ˆØŠ?ÙÜ'¨¯©°KÓ(@ÓA‰ˆßÙØ!‰ˆØ×)Ñ)¨3Ð/ÐlÔ2kÑ`jÓ2kÐlˆßÛ!‘	�Ù�dÓ/Ö0ñ "áÙ�d×ÒÙØÒØ�L‰L DˆLÔ)ÙøÜô Ü�‰Ð9ÀDˆÔIÚðús-   ƒC •C ´$C Á>C ÂC Â*C Ã"C(Ã'C(c               ó    € V ^8„  d   QhRRRR/# )r!   Úhomer   r$   r&   )r'   s   "r   r(   r(   ‡  s   € ÷ Cñ C˜dð C tñ Cr)   c                ó8   € V R ,          R,          \         ,          # rò   )ÚPENDING_DIRNAME©r3  s   &r   Úpending_updates_dirr7  ‡  s   € Ø�+ÕÐ 0Õ0´?ÕBÐBr)   c               ó    € V ^8„  d   QhRRRR/# )r!   r3  r   r$   ÚNoner&   )r'   s   "r   r(   r(   ‹  s   € ÷ Añ A ð A¨ñ Ar)   c                óH   € \         P                  ! \        V 4      R R7       R# )T)Úignore_errorsN)ÚshutilÚrmtreer7  r6  s   &r   Úpurge_pending_updatesr>  ‹  s   € Ü
‡M‚MÔ% dÓ+¸4×@r)   c               ó   € V ^8„  d   QhRR/# )r!   r$   r9  r&   )r'   s   "r   r(   r(   �  s   € ÷ Rñ R ñ Rr)   c                 óp  €  ^ RI Hp  ^RIHpHp \        V ! 4       4      pVP                  4       '       g   R# \        VP                  4       4       FŸ  pVP                  P                  R4      '       g   RVP                  9  d   K7  V! V4      pVf   KE   \        P                  ! VP                  RR7      4      p\!        V\"        4      '       * ;'       g    \%        VRR	7      pV! WTV4       K¡  	  R#   \        \        3 d    Rp LNi ; i  \&         d    \(        P+                  R
RR7        R# i ; i)z]Record receipts a pre-pull interpreter parked (it must not import pulled code). Never raises.rü   )Ú_claimÚsettle_claimNÚ.z.jsonz	utf-8-sig)ÚencodingT)r  z*Pending update shared metrics not reportedr(  )r	  rý   Úshared_metrics_processrA  rB  r7  Úis_dirr  r  r   rs   ÚjsonÚloadsÚ	read_textr   r˜   r   r.   r1  r,  r-  r.  )rý   rA  rB  r  ÚpathÚclaimedr"   Úsaveds           r   Úreport_pending_updatesrM  �  s  € ðRÝ4ç@ä'©Ó(9Ó:ˆ	Ø×Ñ×!Ò!ÙÜ˜9×,Ñ,Ó.Ö/ˆDØ�y‰y×#Ñ# C×(Ò(¨G¸4¿9¹9Ô,DÙÙ˜T“lˆGØŠÙðÜŸ*š* W×%6Ñ%6ÀÐ%6Ó%LÓM�ô # 7¬DÓ1Ô1×dÐdÔ5JÈ7Ð_cÔ5dˆEÙ˜¨Ö.ó 0øô œZÐ(ô Ø’ðûô ô RÜ�‰ÐAÈDˆ×QðRúsA   ‚4D ¸AD Â&C6Â=D ÃD Ã6DÄ	D ÄDÄD Ä"D5Ä4D5Úfrom_commit_datec               ó0   € V ^8„  d   QhRRRRRRRRRRRR/# )	r!   r@   r   rÖ   r§   Ú	mechanismrN  r$   rê   r&   )r'   s   "r   r(   r(   ©  s<   € ÷ ñ ØðØ#&ðØ58ðØEHðØ\_ðàñr)   c                óN  € ^RI HpHpHpHp \        T ;'       g    R4      P                  4       P                  4       p	W–9   d   T	MRp	\        T;'       g    R4      P                  4       P                  4       p
\        V4      pVf   RM"\        P                  ! 4       V,
          R,          pR\        P                  \        T;'       g    R4      P                  4       P                  4       R4      RV! V4      R	V	R8X  d   W¥9   d   T
MR
MRRV! V4      RRRT	RV	R9   d   R/# R/# )zIhermes.update.run dims for a Desktop packaged self-update (RPC-reported).)ÚDESKTOP_UPDATE_STAGESÚUPDATE_OUTCOMESrÎ   rÏ   rf   rA   Nrž   rÔ   rÁ   rÕ   rÖ   rk   r\   r×   rØ   rÚ   r@   rÜ   >   rA   r	   )rW   rR  rS  rÎ   rÏ   rZ   ÚstripÚlowerr™   ÚtimeÚ_DESKTOP_APPLY_MODESr/   )r@   rÖ   r§   rP  rN  rR  rS  rÎ   rÏ   Úoutcome_valuerÃ   Úcommitrã   s   $$$$$        r   Údesktop_update_fieldsrZ  ©  s  € ÷ó ô ˜Ÿ˜ 2Ó&×,Ñ,Ó.×4Ñ4Ó6€MØ%2Ô%E‘MÈ8€MÜ�×"Ð" Ó#×)Ñ)Ó+×1Ñ1Ó3€EÜÐ$Ó%€Fà’^‰T¬$¯)ª)«+¸Õ*>À$Õ)F€FàÔ*×.Ñ.¬s°9·?°?ÀÓ/C×/IÑ/IÓ/K×/QÑ/QÓ/SÐU^Ó_ØÑ1°+Ó>ØÐR_ÐckÔRk %Ô"@™ÁgÐqwØ!Ñ#5°fÓ#=Ø�	Ø�=ð 	 mÐ7LÔ&L˜ðð ð SYðð r)   c               ó    € V ^8„  d   QhRRRR/# )r!   Úrawr   r$   r9  r&   )r'   s   "r   r(   r(   Å  s   € ÷ Bñ B ð B¨ñ Br)   c                 óN   € ^RI Hp ^RIHp V! VP                  \
        3/ V B  R# )zJEmit one Desktop self-update run through the enabled() gate. Never raises.r  )r   N)rf   rW   r*  r   r+  rZ  )r\  r$  r   s   ,  r   Úrecord_desktop_updater^  Å  s   € å5Ý,á	ˆ(×
"Ñ
"Ô$9ÑA¸SÔAr)   >
   Ú	HashErrorÚPinMismatchÚBuildFailureÚInstallErrorÚStaleLockRowÚDownloadErrorÚDownloadPausedÚFeatureProbeErrorÚResolutionConflictÚDownloadTransportError>   ÚTimeoutExpiredÚSubprocessErrorÚCalledProcessError))z&historical takeover preparation failedr   )zWindows gateway recovery failedro   )8Ú__doc__Ú
__future__r   ÚbuiltinsrG  Úloggingr  Úrer<  rV  r   Úpathlibr   Útypingr   Ú	getLoggerÚ__name__r-  r5  r  r  Úcompiler
  rÞ   Ú	frozensetr0   rW  r�   Ú_PM_ERROR_TYPESÚvarsÚitemsÚ_OS_ERROR_TYPESÚ_SUBPROCESS_ERROR_TYPESr‡   r…   r†   r6   rF   rX   rŽ   r™   r¡   r³   rº   rÄ   rË   rè   rß   rø   r  r1  r7  r>  rM  rZ  r^  r&   r)   r   Ú<module>r|     sÇ  ðñõ( #ã Û Û Û 	Û 	Û Û Ý Ý Ý à	×	Ò	˜8Ó	$€à#€ð &Ð Ø€Ø�ZŠZÐ)Ó*€
à˜I y°)¸VÀVÐL€Ù˜w¨Ð/Ó0Ð ð ˜	 ?°IÐ?PÐR[Ø�u˜o¨uðÐ ð ŸšÐ$CÓDÐ áò ó €ñ
 ñ nÙ  ›N×0Ñ0Ô2ónó n€ñ $Ò$_Ó`Ð ñ Ð!Ð"Ó#Ð%8Ð9¸OÈ]Ð;[Ø�jÐ!Ð$;Ð=PÐ#QðÐ ðÐ ð
 —:’:ÐYÓZÐ õ
ZõVõõ;"õ~õ\õ
õ:]õ&õõ.õbõ Fõð*È÷ õDCõAõRð4Øbf÷÷8Br)   