+
    jHàjY  ã                  óæ  € R t ^ RIHt ^ RIHt ^ RIHt ^ RIHtH	t	H
t
 Rt]! RR7       ! R R	4      4       t]! RR7       ! R
 R4      4       tR R lt]! ]! RRR4      ]! RRR4      ]! RRRRR7      ]! RRR4      ]! RRRRR7      ]! RR R!4      ]! R"R#R$RR7      ]! R%R&R'4      3]! RR*RR+RR,RR-RR.RR/R"R0R%R,]R,/	4      R(7      t]P!                  4        ]! ]P%                  4       4      ]0,          tR)# )1u  Kanban board workflow: the one definition of board columns and manual moves.

Groundwork for user-defined columns and workflow per board (issue #54818). Target
model: ``tasks.status`` holds a board-defined column key.

Phase 0 (this module) holds only what is consumed or checked today: the column list
(order, label, CLI icon, drag target) and the manual move matrix. The scattered status
copies (``VALID_STATUSES``, ``BOARD_COLUMNS``, the agent-tool enum, CLI icons) derive
from it, and ``tests/plugins/test_kanban_workflow_matrix.py`` pins ``manual`` to the live
dashboard API in both directions.

Kernel semantics are deliberately NOT modelled here â€” neither what a column means to
the dispatcher (claimable, terminal, parent gate) nor kernel-driven transitions (~20
conditional status writes: block routing, crash/reclaim return, parent reopen, import).
Both are designed together with the kernel switch, so this module never publishes a
partial contract.

Pure data + stdlib only: ``kanban_db`` imports this module, never the reverse.
)Úannotations)Ú	dataclass)ÚMappingProxyType)ÚIteratorÚMappingÚOptionalÚarchivedT)Úfrozenc                  óL   € ] tR t^t$ RtR]R&   R]R&   RtR]R&   RtR]R	&   R
tR# )ÚColumnz\One board column. ``key`` is stable (stored in ``tasks.status``); ``label`` is display-only.ÚstrÚkeyÚlabelÚ?ÚiconTÚboolÚdrag_target© N)	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__r   r   Ú__static_attributes__r   ó    Ú?/home/ubuntu/.hermes/hermes-agent/hermes_cli/kanban_workflow.pyr   r      s$   ‡ áfà	ƒHØƒJØ€Dˆ#ƒOð €K�×r   r   c                  ó„   € ] tR t^+t$ RtR]R&   R]R&   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tR# )ÚWorkflowz5Columns (board order) and the manual move allow-list.ztuple[Column, ...]ÚcolumnsúMapping[str, frozenset[str]]Úmanualc               ó   € V ^8„  d   QhRR/# )é   ÚreturnzIterator[Column]r   )Úformats   "r   Ú__annotate__ÚWorkflow.__annotate__5   s   € ÷ "ñ "Ð*ñ "r   c                	ó,   € \        V P                  4      # ©N)Úiterr   ©Úselfs   &r   Ú__iter__ÚWorkflow.__iter__5   s   € Ü�D—L‘LÓ!Ð!r   c               ó   € V ^8„  d   QhRR/# )r#   r$   ztuple[str, ...]r   )r%   s   "r   r&   r'   8   s   € ÷ 2ñ 2�oñ 2r   c                ó‚   € \         ;QJ d    . R V P                   4       F  NK  	  5# ! R V P                   4       4      # )z9Column keys in board order (never includes ``archived``).c              3  ó8   "  € T F  qP                   x € K  	  R # 5ir)   ©r   )Ú.0Úcs   & r   Ú	<genexpr>Ú Workflow.keys.<locals>.<genexpr>:   s   é € Ð1¡L˜q—U–U£Lùs   ‚)Útupler   r+   s   &r   ÚkeysÚWorkflow.keys8   s,   € çŒuÑ1 D§L¢LÓ1�uÐ1ˆuÑ1 D§L¢LÓ1Ó1Ð1r   c               ó    € V ^8„  d   QhRRRR/# )r#   r   r   r$   zOptional[Column]r   )r%   s   "r   r&   r'   <   s   € ÷ Eñ E˜#ð EÐ"2ñ Er   c                	óD   a€ \        V3R  lV P                   4       R4      # )c              3  óL   <"  € T F  qP                   S8X  g   K  Vx € K  	  R # 5ir)   r2   )r3   r4   r   s   & €r   r5   Ú"Workflow.column.<locals>.<genexpr>=   s   øé € Ð=¡˜1·±¸±—Q’Q£ùs   ƒ$š
$N)Únextr   )r,   r   s   &fr   ÚcolumnÚWorkflow.column<   s   ø€ ÜÔ= §¢Ó=¸tÓDÐDr   c               ó    € V ^8„  d   QhRRRR/# )r#   r   r   r$   r   r   )r%   s   "r   r&   r'   ?   s   € ÷ ñ ˜Cð  Fñ r   c                	óN   € V P                  V4      pVf   \        RV: 24      hV# )Nzunknown kanban workflow column )r?   Ú
ValueError)r,   r   Úcols   && r   Ú_requireÚWorkflow._require?   s-   € Ø�k‰k˜#ÓˆØŠ;ÜÐ>¸s¹gÐFÓGÐGØˆ
r   c               ó$   € V ^8„  d   QhRRRRRR/# )r#   Úsrcr   Údstr$   r   r   )r%   s   "r   r&   r'   E   s!   € ÷ 
8ñ 
8˜Cð 
8 cð 
8¨dñ 
8r   c                óÒ   € V\         8w  d   V P                  V4       W8X  d   R# V\         8X  d   R# V P                  V4       W P                  P                  V\	        4       4      9   # )z’True when a human may request ``src -> dst``. Archiving is always allowed;
``archived`` is a valid source (restore). ``src == dst`` is not a move.FT)ÚARCHIVEDrE   r!   ÚgetÚ	frozenset)r,   rH   rI   s   &&&r   Úcan_moveÚWorkflow.can_moveE   sO   € ð ”(Œ?Ø�M‰M˜#ÔØŒ:ÙØ”(Œ?ÙØ�‰�cÔØ—k‘k—o‘o c¬9«;Ó7Ñ7Ð7r   c               ó   € V ^8„  d   QhRR/# )r#   r$   Údictr   )r%   s   "r   r&   r'   Q   s   € ÷ 

ñ 

˜ñ 

r   c                ó0  € RV P                    Uu. uF5  pRVP                  RVP                  RVP                  RVP                  /NK7  	  upRV P
                  P                  4        UUu/ uF  w  r#V\        V4      bK  	  uppR\        /# u upi u uppi )z˜JSON shape served by the dashboard's ``GET /workflow``. ``manual`` keys are the
column keys plus ``archived`` (restore source), which is never a column.r   r   r   r   r   r!   r   )	r   r   r   r   r   r!   ÚitemsÚsortedrK   )r,   r4   rH   Údstss   &   r   Úto_dictÚWorkflow.to_dictQ   s”   € ð àŸšóá%�Að ˜Ÿ™˜w¨¯©°¸¿¹ÀÐPQ×P]ÑP]Ó^Ù%ñð ¸$¿+¹+×:KÑ:KÔ:MÔNÑ:M©Y¨S�sœF 4›LÒ(Ñ:MÒNØœð
ð 	
ùòùó Os   �;BÁ+Bc               ó   € V ^8„  d   QhRR/# )r#   r$   ÚNoner   )r%   s   "r   r&   r'   ]   s   € ÷ 
Yñ 
Y˜$ñ 
Yr   c                ó‚  € V P                  4       p\        \        V4      4      \        V4      8w  d   \        RV 24      h\        V9   d   \        \        : R24      h\        V4      pV P
                  P                  4        F7  w  r4W2\        0,          9  g   \        V4      V8:  d   K)  \        RV: R24      h	  R# )zMRaise ``ValueError`` on an inconsistent workflow (duplicate or unknown keys).zduplicate column keys: z# is reserved and cannot be a columnzmanual moves from z reference unknown columnsN)r8   ÚlenÚsetrC   rK   r!   rS   )r,   r8   ÚknownrH   rU   s   &    r   ÚvalidateÚWorkflow.validate]   sŸ   € à�y‰y‹{ˆÜŒs�4‹y‹>œS ›YÔ&ÜÐ6°t°fÐ=Ó>Ð>Ü�tÔÜ¤™|Ð+NÐOÓPÐPÜ�D“	ˆØŸ™×*Ñ*Ö,‰IˆCØ¤8 *Õ,Ô,´C¸³IÀÖ4FÜ Ð#5°c±WÐ<VÐ!WÓXÐXó -r   r   N)r   r   r   r   r   r   r-   r8   r?   rE   rN   rV   r^   r   r   r   r   r   r   +   s>   ‡ á?àÓð )Ó(õ"õ2õEõõ
8õ

÷
Yñ 
Yr   r   c               ó    € V ^8„  d   QhRRRR/# )r#   ÚtablezMapping[str, tuple[str, ...]]r$   r    r   )r%   s   "r   r&   r&   j   s    € ÷ Sñ SÐ7ð SÐ<Xñ Sr   c           
     ó|   € \        V P                  4        UUu/ uF  w  rV\        V4      bK  	  upp4      # u uppi r)   )r   rS   rM   )ra   rH   rU   s   &  r   Ú_frozen_manualrc   j   s0   € ÜÀ5Ç;Á;Ä=ÔQÁ=±i°c˜S¤)¨D£/Ò1Á=ÒQÓRÐRùÓQs   ™8
ÚtriageÚTriageu   â—‡ÚtodoÚTodou   â—»Ú	scheduledÚ	Scheduledu   â�±F)r   ÚreadyÚReadyu   â–¶ÚrunningÚRunningu   â—�ÚblockedÚBlockedu   âŠ˜ÚreviewÚReviewu   â—ŽÚdoneÚDoneu   âœ“)r   r!   N)rf   rj   )rd   rh   rj   )rd   rf   rj   )rd   rf   rh   rn   rp   rr   )rd   rf   rh   rj   rn   rp   rr   )rd   rf   rh   rj   rr   )rd   rf   rj   rr   )r   Ú
__future__r   Údataclassesr   Útypesr   Útypingr   r   r   rK   r   r   rc   ÚDEFAULT_WORKFLOWr^   rM   r8   ÚDEFAULT_STATUSESr   r   r   Ú<module>rz      sS  ðñõ( #å !Ý "ß .Ñ .ð €ñ �$Ô÷ð ó ðñ �$Ô÷;Yð ;Yó ð;Yõ|Sñ áˆx˜ 5Ó)Ùˆv�v˜uÓ%Ùˆ{˜K¨¸EÔBÙˆw˜ Ó'Ùˆy˜) U¸Ô>Ùˆy˜) UÓ+Ùˆx˜ 5°eÔ<Ùˆv�v˜uÓ%ð	ñ ØÐ#ØÐ0ØÐ0ØÐMØÐXØÐCð 	Ð5ØÐ+ØÐ-ðó ôÐ ð2 × Ñ Ô ñ Ð-×2Ñ2Ó4Ó5¸¸
ÕBÒ r   