+
    jHàj4#  ã                  ó~   € R t ^ RIHt ^ RIt^ RIt^ RIHtHt R R ltR R lt	R R	 lt
R
RRR/R R lltR R ltR# )z?Task graph initialization and atomic decomposition persistence.)ÚannotationsN)ÚAnyÚOptionalc          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )é   Úconnúsqlite3.ConnectionÚtask_idÚstrÚcreator_task_idúOptional[str]Ú
created_atÚintÚreturnÚNone© )Úformats   "Ú?/home/ubuntu/.hermes/hermes-agent/hermes_cli/kanban_db_graph.pyÚ__annotate__r      s=   € ÷ Sñ SØ
ðSØ'*ðSØ=JðSàðSð 
ñSó    c               ód   € V'       g   R# ^ RI Hp V P                  RW!34       V! WV3VR7       R# )zMCopy durable origin inside creation's transaction, never adding dependencies.N)Ú_inherit_notify_subszlUPDATE tasks SET session_id = COALESCE(session_id, (SELECT session_id FROM tasks WHERE id = ?)) WHERE id = ?©r   )Úhermes_cli.kanban_dbr   Úexecute)r   r	   r   r   r   s   &&&$ r   Úinherit_creator_originr      s6   € ÷
 ÙÝ9à‡L�Lð	Dà	Ð"ôñ
 ˜¨Ð(:Àz×Rr   c               ó0   € V ^8„  d   QhRRRRRRRRR	R
RR/# )r   r   r   Úparentsztuple[str, ...]Úinitial_statusr
   ÚtriageÚboolÚtenantr   r   ztuple[str, Optional[str]]r   )r   s   "r   r   r      s>   € ÷ ñ Ø
ðØ'6ðØHKðàðà'ðð ñr   c           	     ór  a€ / oV'       d¯   V P                  RRP                  R\        V4      ,          4      ,           R,           V4       Uu/ uF  qUR,          VbK  	  upoV Uu. uF  qfS9  g   K  VNK  	  ppV'       d   \        RRP                  V4       24      hVf   \	        V3R	 lV 4       R4      pVR
8X  d   R
V3# V'       d   RV3# \
        ;QJ d*    R SP                  4        4       F  '       g   K   RM	  RM! R SP                  4        4       4      '       d   RV3# RV3# u upi u upi )zÆResolve state and tenant under the creator's write transaction.

Parent order breaks ties in this soft namespace; explicit tenant wins.
Validate parents even for parked tasks so links never dangle.
z2SELECT id, status, tenant FROM tasks WHERE id IN (Ú,Ú?Ú)Úidzunknown parent task(s): ú, Nc              3  ót   <"  € T F-  pSV,          R ,          '       g   K  SV,          R ,          x € K/  	  R# 5i)r!   Nr   )Ú.0ÚpidÚrowss   & €r   Ú	<genexpr>Ú%initial_task_state.<locals>.<genexpr>,   s.   øé € ÐY¹'°3ÀTÈ#ÅYÈx×EXÑEXÔ.˜4 �9 X×.Ò.»'ùs   ƒ8 8Úblockedr   c              3  ó8   "  € T F  qR ,          R8g  x € K  	  R# 5i)ÚstatusÚdoneNr   )r)   Úrows   & r   r,   r-   1   s   é € Ð
<©m sˆx�=˜FÖ"«mùs   ‚TFÚtodoÚready)r   ÚjoinÚlenÚ
ValueErrorÚnextÚanyÚvalues)	r   r   r   r   r!   r2   r*   Úmissingr+   s	   &&&&&   @r   Úinitial_task_stater<      s$  ø€ ð €DßØ*.¯,©,ðØ—(‘(˜3¤ W£Õ-Ó.õ/Ø14õ5Ø6=ô+
ó ñ +
 3�D•	˜3’ñ +
ñ ˆñ #*Ó=¡'˜3¸©_—3�3¡'ˆÐ=ßÜÐ7¸¿	¹	À'Ó8JÐ7KÐLÓMÐMØŠ>ÜÔY¹'ÓYÐ[_Ó`ˆFØ˜Ô"Ø˜&Ð Ð ßØ˜ÐÐß
ƒsÑ
<¨d¯k©k¬mÓ
<‡s‡s‚sÑ
<¨d¯k©k¬mÓ
<×<Ò<Ø�vˆ~ÐØ�Fˆ?Ðùòùò >s   ÁD/Á&D4Á3D4c               ó    € V ^8„  d   QhRRRR/# )r   ÚchildrenÚlistr   r   r   )r   s   "r   r   r   6   s   € ÷ !Sñ !S tð !S°ñ !Sr   c           	     óÒ  € \        V 4       EF  w  r\        V\        4      '       g   \        RV R24      hVP	                  R4      p\        V\
        4      '       d   VP                  4       '       g   \        RV R24      hVP	                  R4      ;'       g    . p\        V\        4      '       g   \        RV R24      hV FW  p\        V\        4      '       d   V^ 8  g   V\        V 4      8¼  d   \        RV RV R24      hWQ8X  g   KJ  \        RV R	24      h	  EK  	  ^ .\        V 4      ,          pV  Uu. uF  p. NK  	  pp\        V 4       FR  w  ršV
P	                  R4      ;'       g    .  F.  pW…,          P                  V	4       Wi;;,          ^,          uu&   K0  	  KT  	  \        \        V 4      4       U	u. uF  q–V	,          ^ 8X  g   K  V	NK  	  pp	^ pV'       d]   V^,          pW‹P                  4       ,           F7  pWm;;,          ^,          uu&   Wm,          ^ 8X  g   K&  VP                  V4       K9  	  Kd  V\        V 4      8w  d   \        R
4      hR# u upi u up	i )z€DB-free shape check + Kahn's cycle check on the sibling graph (a cycle
would deadlock every involved child in ``todo`` forever).zchild[z] is not a dictÚtitlez].title is requiredr   z].parents must be a listz
].parents[z$] is not a valid index into childrenz ] cannot list itself as a parentz6cyclic dependency detected in decomposed children listN)Ú	enumerateÚ
isinstanceÚdictr7   Úgetr
   Ústripr?   r   r6   ÚappendÚrangeÚpop)r>   ÚidxÚchildrA   Úparents_idxÚpÚin_degÚ_ÚadjÚiÚcÚqueueÚseenÚnbs   &             r   Ú_validate_children_graphrV   6   s  € ô   ×)‰
ˆÜ˜%¤×&Ò&Ü˜v c U¨/Ð:Ó;Ð;Ø—	‘	˜'Ó"ˆÜ˜%¤×%Ò%¨U¯[©[¯]ª]Ü˜v c UÐ*=Ð>Ó?Ð?Ø—i‘i 	Ó*×0Ð0¨bˆÜ˜+¤t×,Ò,Ü˜v c UÐ*BÐCÓDÐDÛˆAÜ˜a¤×%Ò%¨¨Q¬°!´s¸8³}Ô2DÜ  6¨#¨¨j¸¸Ð;_Ð!`ÓaÐaØŽxÜ  6¨#¨Ð.NÐ!OÓPÐPô	 ñ *ð ˆS”3�x“=Õ €FÙ(0Ó1© 1›B©€CÐ1Ü˜(Ö#‰ˆØ—%‘%˜	Ó"×(Ð( bÒ(ˆAØ�F�M‰M˜!ÔØ�I˜�N�Ió )ñ $ô œc (›mÔ,Ó?Ñ,�1°qµ	¸Q±�QˆQÑ,€EÐ?Ø€Dß
Ø��	ˆØ—i‘i“k×"Ð"ˆBØ�J˜!�O‹JØ�z˜QŽØ—‘˜RÖ ó #ð Œs�8‹}ÔÜÐQÓRÐRñ ùò 2ùò
 @s   Ä<IÇ I$ÇI$ÚauthorÚauto_promoteTc               ó4   € V ^8„  d   QhRRRRRRRRR	RR
RRR/# )r   r   r   r	   r
   Úroot_assigneer   r>   z
list[dict]rW   rX   r    r   zOptional[list[str]]r   )r   s   "r   r   r   Z   sO   € ÷ Lñ LØ
ðLØ'*ðLØ>KðLØWaðLàðLà04ðLð ñLr   c               óÀ  € ^ RI HpHpHpHp	Hp
Hp V'       g   R# Ve	   V! V4      p\        V4       \        \        P                  ! 4       4      pV
! V 4      ;_uu_ 4        V P                  RV34      P                  4       pVe   VR,          R8w  d    RRR4       R# V P                  RV34      P                  4       '       d    RRR4       R# V Uu. uF  p\        WWÞWL4      NK  	  pp\        V4       FS  w  ppVP                  R4      ;'       g    .  F.  pVV,          VV,          ppV! V VV4       V! V VRR	VR
V/4       K0  	  KU  	  V F  pV! V VV4       K  	  R.p. pVe#   VP                  R4       VP                  V4       VP                  V4       V P                  RRP!                  V4       R2\#        V4      4       V'       dM   VP%                  4       '       d7   V	! WVP%                  4       RRP!                  V4      ,           R,           V4       V! WRRVRV/4       RRR4       V'       d	   V! V 4       X# u upi   + '       g   i     L'; i)a¬  Fan a triage task out into children and move the root to ``todo``; the root
waits on every child and wakes (``ready``) when all are done.

``children``: dicts of ``title`` (required), ``body``, ``assignee``,
``parents`` (indices into this list), optional workspace overrides.
Returns child ids in input order, or None when the root is missing / not
in triage, or has already decomposed. Atomic: malformed entries abort fan-out.
)Ú_canonical_assigneeÚ_linkÚ_append_eventÚ_insert_commentÚ	write_txnÚrecompute_readyNzQSELECT id, status, tenant, workspace_kind, workspace_path FROM tasks WHERE id = ?r0   r   zKSELECT 1 FROM task_events WHERE task_id = ? AND kind = 'decomposed' LIMIT 1r   ÚlinkedÚparentrK   zstatus = 'todo'zassignee = ?zUPDATE tasks SET r'   z WHERE id = ?zDecomposed into z,. Root will wake when all children complete.Ú
decomposedÚ	child_idsrZ   )r   r\   r]   r^   r_   r`   ra   rV   r   Útimer   ÚfetchoneÚ_insert_decomposed_childrB   rE   rG   r5   ÚtuplerF   )r   r	   rZ   r>   rW   rX   r\   r]   r^   r_   r`   ra   ÚnowÚroot_rowrK   re   rJ   Úp_idxÚ	parent_idÚchild_idÚcidÚsetsÚparamss   &&$$$$                 r   Údecompose_triage_taskrr   Z   sC  € ÷÷ ÷
 ÙØÒ Ù+¨MÓ:ˆÜ˜XÔ&ô Œd�iŠi‹kÓ
€CÙ	�4��Ø—<‘<ð&Ø(/ zó
÷ ‰(‹*ð 	ð Ò˜x¨Õ1°XÔ=Ø÷ 
‰ð �<‰<ØYØˆJó
÷ ‰(‹*öð ÷ 
‰ñ  "ó
á!�ô % T°HÀVÖQÙ!ð 	ð 
ô
 $ HÖ-‰JˆC�ØŸ™ 9Ó-×3Ð3°Ò3�Ø&/°Õ&6¸	À#½˜8�	Ù�d˜I xÔ0Ù˜d H¨h¸À9ÈgÐW_Ð8`Öaó 4ñ .ó ˆCÙ�$˜˜WÖ%ñ ð "Ð"ˆØˆØÒ$Ø�K‰K˜Ô'Ø�M‰M˜-Ô(Ø�‰�gÔØ�‰Ð(¨¯©°4«Ð(9¸ÐGÌÈvËÔWß�f—l‘l—n’nÙØ˜vŸ|™|›~Ø" T§Y¡Y¨yÓ%9Õ9Ø@õAàô	ñ 	Ø˜<¨+°yÀ/ÐS`Ð)aô	
÷W 
÷` Ù˜ÔØÐùòI
÷ 
�ús>   Á 5IÂ&IÃIÃIÃIÃ+*IÄCIÇ*AIÉIÉI	c               ó4   € V ^8„  d   QhRRRRRRRRR	R
RRRR/# )r   r   r   Úroot_idr
   rk   zsqlite3.RowrK   rD   rW   r   rj   r   r   r   )r   s   "r   r   r   ©   sF   € ÷ -ñ -Ø
ð-Ø'*ð-Ø6Að-ØJNð-àð-à #ð-ð 	ñ-r   c                óP  € ^ RI HpHpHp VR,          ;'       g    Rp	VP	                  R4      ;'       g    T	p
VP	                  R4      '       d   VP	                  R4      pMV
R8X  d   RpMW©8X  d   VR,          pMRpV! 4       pVP	                  R4      pT P                  RYÃR	,          P                  4       \        V\        4      '       d   TMRV! VP	                  R
4      4      Y«VR,          YT;'       g    R3	4       T! YRRT;'       g    RRV/4       \        WWR7       V# )u.  Insert one decomposed child as ``todo`` (linked under the root later so
the dispatcher only ever sees a coherent graph); returns its id.

Workspace: per-child override wins, else inherit the root's kind. Path
inherits only when kinds match (a 'dir' child must not point at the
root's worktree) and NEVER for worktrees â€” siblings dispatch concurrently
and one shared checkout would put them all on the first sibling's branch
with no lock; leaving it unset makes dispatch materialize a fresh
``<repo>/.worktrees/<child-id>`` per child from the board anchor.
)Ú_new_task_idr\   r^   Úworkspace_kindÚscratchÚworkspace_pathÚworktreeNÚbodyz¡INSERT INTO tasks (id, title, body, assignee, status, workspace_kind,  workspace_path, tenant, created_at, created_by) VALUES (?, ?, ?, ?, 'todo', ?, ?, ?, ?, ?)rA   Úassigneer!   Ú
decomposerÚcreatedÚbyÚfrom_decompose_ofr   )
r   rv   r\   r^   rE   r   rF   rC   r
   r   )r   rt   rk   rK   rW   rj   rv   r\   r^   Úroot_ws_kindÚchild_ws_kindÚchild_ws_pathÚnew_idr{   s   &&&&&&        r   rh   rh   ©   s!  € ÷ñ ð Ð,Õ-×:Ð:°€LØ—I‘IÐ.Ó/×?Ð?°<€MØ‡y�yÐ!×"Ò"ØŸ	™	Ð"2Ó3‰Ø	˜*Ô	$Ø‰Ø	Ô	&Ø Ð!1Õ2‰àˆÙ‹^€FØ�9‰9�VÓ€DØ‡L�Lð	5ð
 ˜'•N×(Ñ(Ó*´J¸tÄS×4IÒ4I©DÈtÙ §	¡	¨*Ó 5Ó6¸Ø�XÕ ×&<Ð&<°ð	
ô
ñ Ø�i $¨×(>Ð(>°,Ð@SÐU\Ð!]ôô ˜4¨ÕAØ€Mr   )Ú__doc__Ú
__future__r   Úsqlite3rf   Útypingr   r   r   r<   rV   rr   rh   r   r   r   Ú<module>r‰      sD   ðÙ EÝ "ã Û ß  õSõ"õ:!SðHLà ðLà7;÷L÷^-r   