
    u% j$                     8   d Z ddlZddlZddlZddlmZmZ ddlmZ ddlZej                  j                  dd      Zeej                  vrej                  j                  de       ddlmZ dZej"                  d	efd
       ZdedefdZd Zd Zd Zd Zd Zy)u1  task-2536 회귀: 유휴 base 명시 라벨 (회장 §결정 2026-05-10 fix D).

검증 5건:
1. _compute_team_idle_base — 가장 최근 completed end_time 기준 정확
2. get_teams_info — 유휴 dev sub_team에 idle_base 부착
3. _compute_team_idle_base — base 누락(completed 0건) 시 None graceful
4. _enrich_member_status — idle 멤버에 idle_base 부착
5. spec 박제 일관성 — traffic-light-spec.md §8 idle_base 규칙 박제

영역 격리: data_loader 시그널 병합 로직(task-2534) 절대 수정 안 함.
chat=6937032012 격리.
    N)datetime	timedelta)PathWORKSPACE_ROOTz/home/jay/workspace)
DataLoader
6937032012tmp_pathc                    | dz  }|j                          |dz  j                          ddddddd	d
ddddgdddddddddgdgdgidg idi}|dz  j                  t        j                  |d      d       |dz  j                  t        j                  dg i      d       |dz  j                  t        j                  i       d       |dz  d z  j                  t        j                  d!d"d#id"d#id$i      d       |dz  d%z  j                  t        j                  d&i i      d       |d'z  j                  t        j                  dg i      d       | S )(ug   org-structure + task-timers 최소 fixture.

    dev1-team / dev2-team 두 sub_team + members.json
    memoryevents	structureteamsdevelopment-officeu	   개발실	dev1-teamu
   개발1팀hermesu   헤르메스)idnamezdev1-m1u   팀원A)sub_team_idsub_team_nameleadmembers	dev2-teamu
   개발2팀odinu   오딘zdev2-m1u   팀원B)team_id	team_name	sub_teamscenters)columnsrowszorganization-structure.jsonFensure_asciiutf-8encodingztech-debt.jsonitemszci-status.jsonzmember-status.jsonr   statusidle)r   r   zbot-activity.jsonbotsz	todo.json)mkdir
write_textjsondumps)r	   r   orgs      @/home/jay/workspace/tests/dashboard/test_idle_base_label_2536.pyworkspace_with_orgr/      s     F
LLNh 	#7%0 0;1=/7(P3<i,P+Q	 0;1=/5x(H3<i,P+Q	&, O/
C6 ++77

3U+g 8 
 **4::wm+Dw*W**4::b>G*Lh--99

I8V*<xQWFXYZ[ :  h,,88

FB< 7 9  k%%djj'2&?'%RO    	workspacetasksc                 d    | dz  dz  j                  t        j                  d|id      d       y )Nr   ztask-timers.jsonr2   Fr    r"   r#   )r*   r+   r,   )r1   r2   s     r.   _write_tasksr4   V   s5    ..::

GU#%87 ; r0   c           	         t        j                         t        d      z
  j                         }t        j                         t        d      z
  j                         }t        j                         t        d      z
  j                         }t	        | dd|ddd|ddd|dd       t        |       }|j                          |j                  d      }|J |d
   dk(  sJ |d   |k(  sJ d|d   cxk  rdk  sJ  J y	)uX   3개 completed task 중 end_time이 가장 최근인 것이 base로 선택돼야 한다.x   hoursU   (   r   	completedr   r&   end_time)ztask-oldztask-midtask-newNtask_idr>   ts'   
idle_hours)   )r   nowr   	isoformatr4   r   
reload_all_compute_team_idle_base)r/   oldermiddlenewestloaderbases         r.   4test_compute_team_idle_base_returns_latest_completedrM   _   s   \\^ic22==?Ellnyr22==?Fllnyr22==?F '%! '%" '%"	
( *+F
))+6D	?j(((:l#)r)))))r0   c                    t        j                         t        d      z
  j                         }t	        | ddd|di       t        |       }|j                          |j                         }t        d |D        d      }|J t        d	 |d
   D        d      }t        d |d
   D        d      }||J d|v sJ |d   J |d   d   dk(  sJ d|v sJ |d   J y)uV   dev sub_team이 유휴(running 0)일 때 sub_info["idle_base"]가 채워져야 한다.r9   r7   z	task-2470r   r;   r<   c              3   2   K   | ]  }|d    dk(  s|  yw)r   r   N ).0ts     r.   	<genexpr>zItest_get_teams_info_attaches_idle_base_to_idle_subteam.<locals>.<genexpr>   s     PQ1Y<;O+OqPs   Nc              3   J   K   | ]  }|j                  d       dk(  s|  yw)r   r   NgetrQ   ms     r.   rS   zItest_get_teams_info_attaches_idle_base_to_idle_subteam.<locals>.<genexpr>   !     ]1}9MQ\9\Q]   ##r   c              3   J   K   | ]  }|j                  d       dk(  s|  yw)r   r   NrU   rW   s     r.   rS   zItest_get_teams_info_attaches_idle_base_to_idle_subteam.<locals>.<genexpr>   rY   rZ   	idle_baser?   )	r   rD   r   rE   r4   r   rF   get_teams_infonext)r/   end_tsrK   r   
dev_officesub_dev1sub_dev2s          r.   6test_get_teams_info_attaches_idle_base_to_idle_subteamrc      s$   llnyr22==?F&%"	

 *+F
!!#E P%PRVWJ!!!]
9 5]_cdH]
9 5]_cdHH$888 ("""K ,,,K +{::: ("""K (((r0   c                     t        | i        t        |       }|j                          |j                  d      J |j                  d      J |j                  d      J |j                  d      J y)uU   completed task가 0건인 팀에 대해 None 반환 (signal 병합 깨지지 않음).r   Nznonexistent-team )r4   r   rF   rG   )r/   rK   s     r.   :test_compute_team_idle_base_returns_none_when_no_completedrf      s    #R(*+F
))+6>>>))*<=EEE))$/777))"-555r0   c                 R   t        j                         t        d      z
  j                         }t	        | ddd|di       t        |       }|j                          |j                         }|j                  di       }d|v sJ d	|d   v sJ |d   d	   J |d   d	   d   dk(  sJ y
)uF   team에 running 0건 + member status=idle → member.idle_base 부착.   r7   z	task-prevr   r;   r<   r   r   r\   Nr?   )	r   rD   r   rE   r4   r   rF   _enrich_member_statusrV   )r/   r_   rK   enrichedr   s        r.   ;test_enrich_member_status_attaches_idle_base_to_idle_memberrk      s    llnyr22==?F&%"	
	 *+F
++-Hll9b)G w'(++++8[)5558[))4CCCr0   c                     t        d      } | j                         st        d      } | j                         s
J d|         | j                  d      }d|v sJ d|v sJ d|v sd	|v sJ d
|v rd|v sJ d|v sd|v sJ d|v sJ t        dk(  sJ y)u   traffic-light-spec.md에 §8 유휴 base 명시 규칙이 박제되어야 한다.

    회장 §결정 2026-05-10 fix D 박제 검증 — spec과 코드가 분리되지 않도록.
    zP/home/jay/workspace/.worktrees/task-2536-dev2/memory/specs/traffic-light-spec.mdz6/home/jay/workspace/memory/specs/traffic-light-spec.mdu   spec 파일 누락: r"   r#   u   ## 8. 유휴 base 명시 규칙z	task-2536zsince task-2470 13:59z	85h since?gracefulu   signal 병합 로직 수정u   병합 Xzfix Dr   N)r   exists	read_textCHAT_ID)	spec_pathbodys     r.   %test_spec_idle_base_section_is_pinnedrt      s    
 ghIQR	A!5i[AA0D -444$"d*kT.AAA$;:---(D0J$4FFFd??l"""r0   )__doc__r+   ossysr   r   pathlibr   pytestenvironrV   _WORKSPACE_ROOTpathinsertdashboard.data_loaderr   rq   fixturer/   dictr4   rM   rc   rf   rk   rt   rP   r0   r.   <module>r      s     	 
 (   **..!13HI#(("HHOOA' ,
 3 3 3lD   *L!)N	6D8#r0   