
    ꀛi:                        S r SSKrSSKrSSKrSSKrSSKJrJr  SSKJr  SSK	J
r
JrJrJr  \" S5      r\S-  S-  r\S	-  S
-  r\S-  S-  r\S-  S-  S-  r\S-  S-  r\S-  S-  rSSSSSSS.rSSSSS.r " S S5      r\S:X  a  SSKr\R4                  " S S!9r\R9                  S"S#S$S%9  \R9                  S&S#S'S%9  \R;                  5       r\R>                  (       a4  \ " S(5         \" 5       r!\!RE                  5         \RF                  " S)5        M+  \" 5       r!\!RE                  5       r$\%" \S*S+5      (       a	  \ " \$5        ggg),u  
GENESIS WAR ROOM DASHBOARD
============================
Generates a real-time status report for the Genesis system.

Reads from:
  - data/project_registry.json  (project states)
  - loop/tasks.json             (pending stories)
  - data/orchestrator_events.jsonl (recent events)
  - KNOWLEDGE_GRAPH/entities/failure_evolution_log.jsonl (failures)

Writes to:
  - data/war_room_status.md     (human-readable dashboard)
  - data/war_room_status.json   (machine-readable for Redis)

Run:
  python core/war_room_dashboard.py          — generate once
  python core/war_room_dashboard.py --watch  — refresh every 60s

Dashboard sections:
  1. SYSTEM HEALTH (all services up/down)
  2. REVENUE METRICS (MRR, leads, demos)
  3. PROJECTS (status per project, agents, next actions)
  4. TASKS IN FLIGHT (pending stories from tasks.json)
  5. RECENT FAILURES (last 5 from failure log)
  6. NEXT 24H PRIORITIES (top 10 actions across all projects)
  7. AGENT FLEET STATUS (active agents by role)
    N)datetime	timedelta)Path)DictListAnyOptionalzE:/genesis-systemdatazproject_registry.jsonloopz
tasks.jsonzorchestrator_events.jsonlKNOWLEDGE_GRAPHentitieszfailure_evolution_log.jsonlzwar_room_status.mdzwar_room_status.jsonLIVERUNNINGBUILDINGBACKLOGBLOCKEDPAUSED)liverunningbuildingbacklogblockedpausedz[P1]z[P2]z[P3]z[P4])            c                      \ rS rSrSrS rS\4S jrS\4S jrSS\	S\
\   4S jjrSS\	S\
\   4S	 jjrS\\\4   4S
 jrS\
\   4S jrS\
\   4S jrS\
\   4S jrSS\	S\
\   4S jjrS\	4S jrS\4S jrS\4S jrS rSrg)WarRoomDashboard<   z
Generates the Genesis War Room status dashboard.

Called by:
- Master Orchestrator (automatic, on health check)
- CLI (manual run)
- Genesis Start command (session init)
c                     [         R                  " 5       U l        U R                  5       U l        U R                  5       U l        U R                  SS9U l        U R                  SS9U l
        g )N   )limit   )r   nowgenerated_at_load_registryregistry_load_taskstasks_load_failuresrecent_failures_load_eventsrecent_events)selfs    ,E:\genesis-system\core\war_room_dashboard.py__init__WarRoomDashboard.__init__F   s\    $LLN++-%%'
#222;!..R.8    returnc                     [         R                  5       (       d  / 0 S.$ [        [         S5       n[        R                  " U5      sS S S 5        $ ! , (       d  f       g = f)N)projectsmetar)PROJECT_REGISTRY_PATHexistsopenjsonloadr/   fs     r0   r'   WarRoomDashboard._load_registryM   s@    $++-- "B//'-99Q< .--s   A
Ac                     [         R                  5       (       d  S/ 0$ [        [         S5       n[        R                  " U5      sS S S 5        $ ! , (       d  f       g = f)Nstoriesr8   )TASKS_JSON_PATHr:   r;   r<   r=   r>   s     r0   r)   WarRoomDashboard._load_tasksS   s>    %%''r?"/3'199Q< (''s   A
Ar#   c                 `   [         R                  5       (       d  / $ / n[        [         S5       nU HB  nUR                  5       nU(       d  M   UR	                  [
        R                  " U5      5        MD     S S S 5        X!* S  $ ! [
        R                   a     Mj  f = f! , (       d  f       N.= fNr8   )FAILURE_LOG_PATHr:   r;   stripappendr<   loadsJSONDecodeError)r/   r#   failuresr?   lines        r0   r+   WarRoomDashboard._load_failuresY   s    &&((I"C(Azz|4 

4(89	  )     //  )(/   B%B3BBBBB
B-c                 `   [         R                  5       (       d  / $ / n[        [         S5       nU HB  nUR                  5       nU(       d  M   UR	                  [
        R                  " U5      5        MD     S S S 5        X!* S  $ ! [
        R                   a     Mj  f = f! , (       d  f       N.= frF   )EVENTS_LOG_PATHr:   r;   rH   rI   r<   rJ   rK   )r/   r#   eventsr?   rM   s        r0   r-   WarRoomDashboard._load_eventsg   s    %%''I/3'1zz|4djj&67	  ( fg  //  ('rO   c                    0 n[         R                  R                  S5      (       a  SOSUS'   [         R                  R                  S5      (       a  SOSUS'   [         R                  R                  S5      (       a  SOSUS'   [        R	                  5       (       a  S	OS
US'   [
        R	                  5       (       a  S	OS
US'   [        S-  S-  S-  R	                  5       (       a  S	OS
US'   U$ )z)Quick health checks on critical services.
REDIS_HOSTUP	NO_CONFIGredisPOSTGRES_HOSTpostgresQDRANT_HOSTqdrantOKMISSINGproject_registry
tasks_jsonr
   context_statezcapability_manifest.jsoncapability_manifest)osenvirongetr9   r:   rC   GENESIS_ROOT)r/   healths     r0   _check_service_health&WarRoomDashboard._check_service_healthu   s     #%**..">">$Kw%'ZZ^^O%D%DT+z#%::>>-#@#@4kx .C-I-I-K-KTQZ!"'6'='='?'?tY|!F*_<?YYaaccD 	$%
 r3   c                     U R                   R                  S/ 5      nU Vs/ s H4  o"R                  SS5      (       a  M  UR                  S5      S:w  d  M2  UPM6     sn$ s  snf )NrB   passesFstatusr   r*   re   r/   rB   ss      r0   _get_pending_stories%WarRoomDashboard._get_pending_stories   sK    **..B/"b7a%%%*@QUU8_XaEa7bbbs   AAAc                     U R                   R                  S/ 5      nU Vs/ s H  o"R                  S5      S:X  d  M  UPM     sn$ s  snf )NrB   rl   r   rm   rn   s      r0   _get_blocked_stories%WarRoomDashboard._get_blocked_stories   s;    **..B/"C7aeeHo&B7CCCs
   AAc                     U R                   R                  S/ 5      nU Vs/ s H  o"R                  SS5      (       d  M  UPM     sn$ s  snf )NrB   rk   Frm   rn   s      r0   _get_completed_stories'WarRoomDashboard._get_completed_stories   s9    **..B/"=7aeeHe&<7===s
   AAc                    / nU R                  5       nUSS  H  nUR                  US    SUS    35        M!     U R                  R                  S/ 5       H}  nUR                  SS5      S	::  d  M  UR                  S
5      S;  d  M2  UR                  S/ 5      SS	  H2  nXb;  d  M
  UR                  SUS   R	                  5        SU 35        M4     M     USU $ )z8Extract top priority actions across all active projects.Nr"   id: titler6   priority	   r   rl   )r   r   next_actions[z] )rp   rI   r(   re   upper)r/   r#   
prioritiespendingstoryprojactions          r0   _compile_top_priorities(WarRoomDashboard._compile_top_priorities   s    
 ++-Ra[EtRg/?@A ! MM%%j"5Dxx
A&!+0BJ`0`"hh~r:2A>F/"))Ad4j.>.>.@-AF8*LM ? 6 &5!!r3   c                     SnU R                   R                  S/ 5       H=  nUR                  S0 5      nXR                  SS5      -  nXR                  SS5      -  nM?     U$ )Nr   r6   kpismrr_audmrr_usd)r(   re   )r/   totalr   r   s       r0   _compute_total_mrr#WarRoomDashboard._compute_total_mrr   s_    MM%%j"5D88FB'DXXi++EXXi++E 6 r3   c                    U R                   nU R                  5       nU R                  5       nU R                  5       nU R	                  5       nU R                  5       nU R                  5       nU R                  R                  S0 5      nUR                  SS5      n	U	S:  a  Xy-  S-  OSn
/ nUR                  S5        UR                  SUR                  S5       S	35        UR                  S
5        UR                  S5        UR                  S5        UR                  S5        [        S UR                  5        5       5      nU(       a  SOSnUR                  SU 35        UR                  S5        UR                  S5        UR                  S5        UR                  5        H*  u  pUS;   a  SOSnUR                  SU SU SU S35        M,     UR                  S5        UR                  S5        UR                  S5        UR                  S5        UR                  S5        UR                  SUS S35        UR                  SU	S S35        UR                  S U
S! S"35        UR                  S#5        UR                  S$5        UR                  S%5        UR                  S5        UR                  S&5        UR                  S5        U R                  R                  S'/ 5      n[        US( S)9nU GH_  nUR                  S*S+5      n[        R                  XR!                  5       5      n["        R                  UR                  S,S-5      S.5      nUR                  S/5      (       a  S0US/    3OSnUR                  S1U SUS2    35        UR                  SU U S	35        UR                  S30 5      nU(       a;  SR%                  S4 UR                  5        5       5      nUR                  S5U S	35        UR                  S6/ 5      nU(       a1  UR                  S75        US8S9  H  nUR                  S:U 35        M     UR                  S5        GMb     UR                  S;5        UR                  S5        UR                  S<['        U5       S=['        U5       S>['        U5       35        UR                  S5        U(       aH  UR                  S?5        U H   nUR                  S@USA    SBUSC    35        M"     UR                  S5        U(       an  UR                  SD5        U HF  nUR                  SESF5      nUR                  S@USA    SBUSC    35        UR                  SGU 35        MH     UR                  S5        UR                  SH5        UR                  S5        U R(                  (       a  U R(                   H  nUR                  S@UR                  SISJ5       SKUR                  SLSM5       SNUR                  SOS5       35        UR                  SP5      (       d  Me  USP   SQ:w  d  Mp  UR                  SRUSP    35        M     OUR                  SS5        UR                  S5        UR                  ST5        UR                  S5        [+        USU5       H  u  nnUR                  U SVU 35        M     UR                  S5        UR                  SW5        UR                  S5        UR                  SX5        UR                  SY5        / SZQnU H&  u  nn n!nUR                  SU SU  SU! SU S3	5        M(     UR                  S5        UR                  S[5        UR                  S\5        S]R%                  U5      $ )^z.Generate the full War Room status as Markdown.r7   target_mrr_aud鈐  r   d   z# GENESIS WAR ROOMz**Generated**: z%Y-%m-%d %H:%M:%S AESTz  z5**Model**: claude-sonnet-4-6 | **MCPs**: 11 connected z## SYSTEM HEALTHc              3   *   #    U  H	  oS ;   v   M     g7f)rV   r]   N ).0vs     r0   	<genexpr>5WarRoomDashboard.generate_markdown.<locals>.<genexpr>   s     H0G1,&0Gs   zALL SYSTEMS OPERATIONALu   DEGRADED — check servicesz**Status**: z| Service | Status |z|---------|--------|r   r]   WARNz| z |  z |z## REVENUE METRICSz| Metric | Value |z|--------|-------|z| Current MRR (AUD) | $,z| Target MRR (AUD) | $z| Progress to Target | z.1fz% |z*| Active Clients | 1 (George Bunker FNQ) |z| Demo Pipeline | 0 booked |z| Leads Generated | 0 |z## PROJECTSr6   c                 &    U R                  SS5      $ )Nr|   r}   )re   )ps    r0   <lambda>4WarRoomDashboard.generate_markdown.<locals>.<lambda>   s    z19Mr3   )keyrl   r   r|   r}   z[P?]blocked_reasonu    — BLOCKED: z### namer   c              3   4   #    U  H  u  pU S U 3v   M     g7f)rz   Nr   )r   kr   s      r0   r   r      s     $J\TQs"QC[\s   z
**KPIs**: r~   z**Next Actions**:Nr   z  - z## TASKS IN FLIGHTz**Pending**: z | **Blocked**: z | **Completed**: z### Pending Storiesz- **ry   z**: r{   z### Blocked StoriesblockerzUnknown blockerz  - Blocker: z## RECENT FAILURES (Last 5)dateunknownz** [project?z]: what
root_causezNot yet determinedz  - Root cause: uV   No failures logged yet. Genesis evolves through failure — log them when they happen.z## NEXT 24H PRIORITIESr   z. z## AGENT FLEETz#| Agent | Model | Thread | Status |z#|-------|-------|--------|--------|))z	team-leadopusB-Threadstandby)zparallel-buildersonnetP-Threadr   )zfusion-evaluatorr   zF-Threadr   )zlong-thread-runnerr   zL-Threadr   )zgemini-dispatcherr   r   r   )zrwl-executorr   z
L+C-Threadr   )zverification-agentr   zC-Threadr   )zresearch-scouthaikur   r   z---z[*Auto-generated by war_room_dashboard.py | Genesis v2.6.2 | Rule 14: Every failure is fuel*
)r&   rh   rp   rs   rv   r   r   r(   re   rI   strftimeallvaluesitemssortedSTATUS_ICONSr   PRIORITY_ICONSjoinlenr,   	enumerate)"r/   r%   service_healthr   r   	completedtop_priorities	total_mrrr7   
target_mrrmrr_pctlinesall_okoverallsvcrl   iconr6   projects_sortedr   r|   blocked_noter   kpi_strr~   r   r   r   r?   iagentsr   modelthreads"                                     r0   generate_markdown"WarRoomDashboard.generate_markdown   s   335++-++-//1	557++-	}}  ,XX.6
4>N9)C/)+s||4L'M&NbQRLNR 	'(RH0E0E0GHH/5+;X|G9-.R+,+,)//1KC!\14vDLL2cU#dV1VHB78 2 	R 	)*R)+)+.ym2>?-j^2>?.wsm3?@AC35.0R 	]#R==$$Z4 /MN#DXXh	2F##FLLN;D%))$((:q*A6JHHLQaHbHb^D1A,B+CDhjLLL4z4<.9:LL<vl^2>?88FB'D**$JTZZ\$JJz'"5688NB7L01*2A.FLL4x1 /LL! $& 	)*R}S\N2B3w<.PbcfgpcqbrstRLL./ tE$K=U7^4DEF !LLLL./ ))I/@AtE$K=U7^4DEF}WI67 ! LL 	23R))tAEE&)$<#=T!%%	SVBWAXX[\]\a\abhjl\m[nop55&&1\?>R+RLL#3AlO3D!EF *
 LLqrR 	-.R">15IAvLLA3b)* 6R 	%&R:;:;	
 ,2'D%LL2dV3ugSF82FG ,2RUrtyyr3   c                    U R                  5       nU R                  5       nU R                  5       nU R                  R	                  5       U R                  5       U R                  5       U R                  R                  S0 5      R                  SS5      S.U R                  R                  S/ 5       Vs0 s H@  nUS   US   UR                  SS	5      UR                  S
0 5      UR                  S5      S._MB     sn[        U5      [        U5      [        U5      U Vs/ s H  oUS   PM	     snS.U R                  5       [        U R                  5      S.$ s  snf s  snf )z4Generate machine-readable status JSON for Redis/API.r7   r   r   )total_mrr_audr   r6   ry   rl   r|   r}   r   r   )rl   r|   r   r   )r   r   r   pending_ids)r&   system_healthrevenuer6   r*   r   r,   )rp   rs   rv   r&   	isoformatrh   r   r(   re   r   r   r,   )r/   r   r   r   r   ro   s         r0   generate_jsonWarRoomDashboard.generate_json4  sP   ++-++-//1	 !--779!779!%!8!8!:"&--"3"3FB"?"C"CDTV["\ **:r: ;A $k !j! 4EE&"- uu%56	  ; w<w< ^189A$9	 #::<"4#7#78/
 	
  :s   3AE
Ec                    [         R                  R                  SSS9  U R                  5       n[	        [         SSS9 nUR                  U5        SSS5        U R                  5       n[	        [        SSS9 n[        R                  " X2SS9  SSS5        [        S	[          35        [        S
[         35        U$ ! , (       d  f       Nq= f! , (       d  f       NE= f)z%Generate and write dashboard to disk.T)parentsexist_okwzutf-8)encodingNr   )indentzWar Room dashboard written to zJSON status written to )STATUS_MD_PATHparentmkdirr   r;   writer   STATUS_JSON_PATHr<   dumpprint)r/   mdr?   status_jsons       r0   runWarRoomDashboard.runT  s     	##D4#@##%.#8AGGBK 9 ((*"C':aIIkQ/ ; 	.~.>?@'(8'9:;	 98 ;:s   B;7C;
C	
C)r&   r.   r,   r(   r*   N)r"   )r$   )
   )__name__
__module____qualname____firstlineno____doc__r1   r   r'   r)   intr   r+   r-   strrh   rp   rs   rv   r   r   r   r   r   __static_attributes__r   r3   r0   r   r   <   s    9    T  !C !T
 !# tDz tCH~ &cd4j cDd4j D>T
 >"S "$s) "$C D 3 D L
t 
@r3   r   __main__zGenesis War Room Dashboard)descriptionz--watch
store_truezRefresh every 60 seconds)r   helpz--printzPrint to stdout instead of filezWatching... Ctrl+C to stopr    r   F)&r   r<   timesysrc   r   r   pathlibr   typingr   r   r   r	   rf   r9   rC   rQ   rG   r   r   r   r   r   r   argparseArgumentParserparseradd_argument
parse_argsargswatchr   	dashboardr   sleepr   getattrr   r3   r0   <module>r     s  :   
 	 (  , , '($v-0GG ',6'*EE"33j@C`` &)==&(+AA   6f=g gT	 z$$1MNF
	,=WX
	,=^_Dzz*+(*IMMOJJrN 
 %&	]]_4%(("I )# r3   