
    PiHx                        d Z ddlZddlZddlZddlZddlZddlZddlmZ ddlm	Z	m
Z
mZmZ ddlmZmZ ddlmZ ddlZej&                  j)                  d       	 ddlZd
ZdZdZdZdZdZdZdZ dZ!e! dZ"e! dZ#dZ$e G d d             Z%e G d d             Z&e G d d             Z'de(de	e%   fdZ)de(d e(dee%   fd!Z*de(fd"Z+d8d#e	e%   d$ee(   de	e&   fd%Z,d&ejZ                  d'e&d(e(d)e(de'f
d*Z.d+e	e&   d(e(d)e(d,e/de	e'   f
d-Z0d.e(de1fd/Z2d9d0e	e'   d.e(d1e3fd2Z4d3e	e'   d4e	e'   fd5Z5d6 Z6e7d7k(  r ejp                   e6              yy# e$ r  ed        ej0                  d	       Y w xY w):a  
OpenRouter Swarm Orchestrator - Mission-Driven Edition
Executes 102 atomic stories from SWARM_MISSIONS.md across MiniMax M2.5 and Kimi K2.5 models.

USAGE:
    python openrouter_swarm.py                    # Run all stories (auto-routed)
    python openrouter_swarm.py --team minimax     # Run only MiniMax stories
    python openrouter_swarm.py --team kimi        # Run only Kimi stories
    python openrouter_swarm.py --limit 10         # Run first 10 stories only
    python openrouter_swarm.py --skip-completed   # Skip already-completed stories (reads existing JSONL files)

    IMPORTANT: Run with PYTHONUNBUFFERED=1 to see real-time output:
        PYTHONUNBUFFERED=1 python openrouter_swarm.py --skip-completed

OUTPUTS:
    /mnt/e/genesis-system/hive/swarm_results/minimax_results.jsonl
    /mnt/e/genesis-system/hive/swarm_results/kimi_results.jsonl
    /mnt/e/genesis-system/hive/SWARM_METRICS_REPORT.md

Author: Genesis System
Date: 2026-02-15
    N)datetime)ListDictAnyOptional)	dataclassasdict)Pathz/mnt/e/genesis-systemz?ERROR: aiohttp not installed. Install with: pip install aiohttp   z-https://openrouter.ai/api/v1/chat/completionsz,/mnt/e/genesis-system/hive/SWARM_MISSIONS.mdzminimax/minimax-m2.5zmoonshotai/kimi-k2.5      i,  iX  z(/mnt/e/genesis-system/hive/swarm_resultsz/minimax_results.jsonlz/kimi_results.jsonlz2/mnt/e/genesis-system/hive/SWARM_METRICS_REPORT.mdc                       e Zd ZU dZeed<   eed<   eed<   eed<   eed<   ee   ed<   eed<   eed	<   eed
<   eed<   eed<   defdZdefdZ	y)Storyz2Represents an atomic story from SWARM_MISSIONS.md.story_idtitleroleneedbenefitacceptance_criteriablack_box_testswhite_box_testsestimated_tokensmodelprd_namereturnc                    d| j                    d| j                   d| j                   d| j                   d| j                   dt        d      j                  d | j                  D               d	| j                   d
| j                   dS )z,Convert story to task description for agent.z	# Story: z - z

**User Story:**
As a z	, I need z
, so that z.

**Acceptance Criteria:**

   c              3   &   K   | ]	  }d |   yw)z- N ).0	criterions     1/mnt/e/genesis-system/scripts/openrouter_swarm.py	<genexpr>z,Story.to_task_description.<locals>.<genexpr>]   s     I99+Is   z

**Black Box Tests:**
z

**White Box Tests:**
z

**Instructions:**
Implement this story following the acceptance criteria. Provide production-ready code/content with inline comments, error handling, and best practices. Include example usage or test scenarios where applicable.
)
r   r   r   r   r   chrjoinr   r   r   selfs    r"   to_task_descriptionzStory.to_task_descriptionU   s    T]]O3tzzl ; ii[	$))Jt||n = RI0H0HII J K       	    c                 @    | j                   j                         dk(  ryy)z7Generate appropriate system prompt based on story type.kimizYou are an expert software engineer building production-grade code. Write clean, well-documented, type-hinted Python code with comprehensive error handling. Follow PEP 8 and best practices.zYou are an expert content strategist and technical writer. Create clear, compelling, accurate content that drives user engagement and conversion. Be precise, actionable, and authentic.)r   lowerr&   s    r"   to_system_promptzStory.to_system_prompti   s#    ::' S Nr)   N)
__name__
__module____qualname____doc__str__annotations__r   intr(   r-   r   r)   r"   r   r   F   s^    <MJ
I
ILc"JMS (N# Nr)   r   c                   \    e Zd ZU dZeed<   eed<   eed<   edefd       Z	edefd       Z
y)		AgentTaskzRepresents a single agent task.agent_idteamstoryr   c                 6    | j                   j                         S N)r9   r(   r&   s    r"   task_descriptionzAgentTask.task_descriptionx   s    zz--//r)   c                 6    | j                   j                         S r;   )r9   r-   r&   s    r"   system_promptzAgentTask.system_prompt|   s    zz**,,r)   N)r.   r/   r0   r1   r4   r3   r2   r   propertyr<   r>   r   r)   r"   r6   r6   q   sH    )M
IL0# 0 0 -s - -r)   r6   c                       e Zd ZU dZeed<   eed<   eed<   eed<   eed<   eed<   eed<   eed	<   eed
<   eed<   eed<   eed<   dZe	e   ed<   dZ
e	e   ed<   dZeed<   d Zy)AgentResultz,Represents the result of an agent execution.r7   r8   r   r   story_titler   statusprompt_tokenscompletion_tokenstotal_tokenscost_usdresponse_time_msNresponseerror	timestampc                 l    | j                   (t        j                         j                         | _         y y r;   )rK   r   now	isoformatr&   s    r"   __post_init__zAgentResult.__post_init__   s'    >>!%\\^557DN "r)   )r.   r/   r0   r1   r4   r3   r2   floatrI   r   rJ   rK   rO   r   r)   r"   rA   rA      sq    6M
IJMMKO"Hhsm"E8C=Is8r)   rA   	file_pathr   c                    g }t         j                  j                  |       s#t        d|         t	        j
                  d       t        | dd      5 }|j                         }ddd       t        j                  dt        j                        }t        j                  dt        j                        }d	}j                  d
      }g }d}	t        |      D ]	  \  }
}|j                  |      }|r|j                  d      }|j!                  d      r:|	r2|r0d
j#                  |      }t%        ||      }|r|j'                  |       |g}d}	v|	sy|j'                  |       |j)                         j!                  d      s|
dkD  s||
dz
     j)                         j!                  d      sd
j#                  |      }t%        ||      }|r|j'                  |       g }d}	 |	r2|r0d
j#                  |      }t%        ||      }|r|j'                  |       t        dt+        |       d|         |S # 1 sw Y   xY w)z7Parse SWARM_MISSIONS.md and extract all atomic stories.z ERROR: Missions file not found: r   rzutf-8)encodingNa
  ####\s+([\w-]+):\s+(.+?)\n\*\*As a\*\*\s+(.+?),\s+\*\*I need\*\*\s+(.+?),\s+\*\*so that\*\*\s+(.+?)\.\n\*\*Acceptance Criteria\*\*:\n(.*?)\*\*Black Box Tests\*\*:\s+(.+?)\n\*\*White Box Tests\*\*:\s+(.+?)\n\*\*Estimated Tokens\*\*:\s+([\d,]+)\n\*\*Model\*\*:\s+(\w+)z^# PRD \d+:\s+([^\(]+)zUnknown PRD
Fz####Tz---r   z
**Model**:u   ✅ Parsed z stories from )ospathexistsprintsysexitopenreadrecompileDOTALL	MULTILINEsplit	enumeratematchgroup
startswithr%   parse_single_storyappendstriplen)rQ   storiesfcontentstory_patternprd_patterncurrent_prdlinescurrent_story_textin_storyiline	prd_match
story_textparsed_storys                  r"   parse_missions_filery      s   G77>>)$0<=	iw	/ 1&&(
 JJ	" 				M **6EK  KMM$EHU# !4%%d+	#//!,K ??6".!YY'9:
1*kJNN<0 #'H%%d+ zz|&&u-!a%E!A#J<L<L<N<Y<YZf<g!YY'9:
1*kJNN<0%'" 9!> &YY12
)*kBNN<(	KG~^I;
?@NA s   H33H=rw   r   c                 |   	 t        j                  d|       }|sy|j                  d      }|j                  d      j                         }t        j                  d|       }t        j                  d|       }t        j                  d|       }|r|r|sy|j                  d      j                         }|j                  d      j                         }	|j                  d      j                         }
t        j                  d| t         j                        }g }|rk|j                  d      }|j                  d	      D ]F  }|j                         }|j                  d
      s%|j                  |dd j                                H t        j                  d| t         j                        }t        j                  d| t         j                        }|r|j                  d      j                         nd}|r|j                  d      j                         nd}t        j                  d|       }|r*t        |j                  d      j                  dd            nd}t        j                  d|       }|r|j                  d      nd}t        ||||	|
||||||      S # t        $ r}t        d|        Y d}~yd}~ww xY w)zParse a single story from text.z####\s+([\w-]+):\s+(.+)Nr      z\*\*As a\*\*\s+(.+?),z)\*\*I need\*\*\s+(.+?),\s+\*\*so that\*\*z\*\*so that\*\*\s+(.+?)\.z;\*\*Acceptance Criteria\*\*:\n(.*?)\*\*Black Box Tests\*\*:rU   -z:\*\*Black Box Tests\*\*:\s+(.+?)\n\*\*White Box Tests\*\*:z;\*\*White Box Tests\*\*:\s+(.+?)\n\*\*Estimated Tokens\*\*: z$\*\*Estimated Tokens\*\*:\s+([\d,]+),i  z\*\*Model\*\*:\s+(\w+)Kimi)r   r   r   r   r   r   r   r   r   r   r   z WARNING: Failed to parse story: )r^   searchre   ri   r`   rb   rf   rh   r4   replacer   	ExceptionrY   )rw   r   title_matchr   r   
role_match
need_matchbenefit_matchr   r   r   criteria_matchr   criteria_textru   black_box_matchwhite_box_matchr   r   tokens_matchr   model_matchr   es                           r"   rg   rg      s~   ?ii :JG$$Q'!!!$**, YY7D
YYKZX
		">
Kzm"((*"((*%%a(..0 #acmoqoxoxy *003M%++D1 Azz|??3''..tABx~~/?@A ))$acmoqoxoxy))$bdnprpypyz>M///288:SU>M///288:SU yy!H*UJV3|11!4<<S"EF\` ii 9:F(3!!!$ 3++-
 	
  045s+   J A8J CJ !D8J 	J;#J66J;c                      t        j                  d      } | r| S t        d       t        d       t        j                  d       y)z5Load OpenRouter API key from env or credentials file.OPENROUTER_API_KEYz$ERROR: OPENROUTER_API_KEY not found.z1Set it with: export OPENROUTER_API_KEY='your_key'r   N)rV   getenvrY   rZ   r[   )api_keys    r"   load_api_keyr   (  s8     ii,-G	
01	
=>HHQKr)   rk   team_filterc                     g }d}| D ][  }|j                   j                         dk(  rdnd}|r|j                         |k7  r:|j                  t	        |||             |dz  }] |S )z=Convert stories to agent tasks, optionally filtering by team.r   minimaxMINIMAXKIMI)r7   r8   r9   )r   r,   upperrh   r6   )rk   r   tasksr7   r9   r8   s         r"   create_tasks_from_storiesr   4  s}    EH !KK--/9<y&   "d*Y
 	
 	A  Lr)   sessiontaskmodel_idr   c                   K   t        j                          }d| dddd}|d|j                  dd|j                  dgd	t        |j                  j
                  d
z   d      d}	 t        j                  t              }| j                  t        |||      4 d{   }t        t        j                          |z
  d
z        }	|j                  dk7  r|j                          d{   }
t        |j                  |j                   ||j                  j"                  |j                  j$                  |j                  j&                  ddddd|	d|j                   d|
dd        cddd      d{    S |j)                          d{   }|j+                  di       }|j+                  dd      }|j+                  dd      }|j+                  dd      }d|j-                         v rdnd}|dz  |z  }|d   d   d    d!   }t        |j                  |j                   ||j                  j"                  |j                  j$                  |j                  j&                  d"|||||	|#      cddd      d{    S 7 7 7 7 7 # 1 d{  7  sw Y   yxY w# t.        j0                  $ r t        t        j                          |z
  d
z        }	t        |j                  |j                   ||j                  j"                  |j                  j$                  |j                  j&                  ddddd|	d$t         d%      cY S t2        $ r}t        t        j                          |z
  d
z        }	t        |j                  |j                   ||j                  j"                  |j                  j$                  |j                  j&                  ddddd|	t5        |      dd       cY d}~S d}~ww xY ww)&zGExecute a single agent task via OpenRouter API with timeout protection.zBearer zapplication/jsonz!https://github.com/genesis-systemzGenesis Swarm Orchestrator)AuthorizationzContent-TypezHTTP-RefererzX-Titlesystem)r   rm   usergffffff?  i    )r   messagestemperature
max_tokens)total)jsonheaderstimeoutN   failr           zHTTP z: r7   r8   r   r   rB   r   rC   rD   rE   rF   rG   rH   rJ   usagerD   rE   rF   r+   gQ?g      ?i@B choicesmessagerm   success)r7   r8   r   r   rB   r   rC   rD   rE   rF   rG   rH   rI   zRequest timeout after s)timer>   r<   minr9   r   aiohttpClientTimeoutREQUEST_TIMEOUT_SECONDSpostOPENROUTER_BASE_URLr4   rC   textrA   r7   r8   r   r   r   r   getr,   asyncioTimeoutErrorr   r2   )r   r   r   r   
start_timer   payloadr   rI   rH   
error_textdatar   rD   rE   rF   cost_per_mtokrG   response_textr   s                       r"   execute_agentr   L  s     J #7),*;/	G $*<*<=(=(=>
 $**55<dCGY
''.EF<< 3'7\c<d 3	 3	hp"DIIK*$<#DE#%#+==?2
"!]]"!ZZ00 $

 0 0!ZZ00!"#&'!" %5!(//!2"Z5E4FG3	 3	 3	* "(D HHWb)E!IIoq9M %		*=q A 99^Q7L %+hnn.>$>DDM$y0MAH !OA.y9)DMYY,, JJ,,,, +"3)!!1&K3	 3	 3	 3	3	* )+3	 3	 3	 3	j  
		j 8D@A]]ZZ((

((ZZ((-*+B*C1E
 	
  
		j 8D@A]]ZZ((

((ZZ((-a&#,
 	

s   A#O3&7J I=J !AJ
'J (A>J
&J 2J3J 7O38J
JCJ
+J 7J8J <O3=J  J
J J
J 
JJJJ O3J B&O0O3O0BO+%O0&O3+O00O3r   
batch_sizec                   K   g }t        |       }t        j                         4 d{   }t        d||      D ]A  }| |||z    }||z  dz   }	||z   dz
  |z  }
t	        d|	 d|
 dt        |       d       	 t        j                  t        j                  |D cg c]  }t        ||||       c} t               d{   }|j                  |       t        |D cg c]  }|j                  d	k(  s| c}      }t        |D cg c]  }|j                  d
k(  s| c}      }t	        d| d| d       d|j                         v r0||z   |k  r(t	        d       t        j                  d       d{    D ddd      d{    |S 7 ic c}w 7 c c}w c c}w 7 -# t
        j                  $ r t	        d|	 dt         d       |D ]  }|j                  t!        |j"                  |j$                  ||j&                  j(                  |j&                  j*                  |j&                  j,                  d
ddddt        dz  dt         d              Y &w xY w7 # 1 d{  7  sw Y   |S xY ww)z5Execute all tasks in batches with timeout protection.Nr   r   z  Batch /z: Processing z stories...)r   r   r   u       ✅ u    success, ❌ z failedr+   u3       ⏸️  Waiting 10 seconds before next batch...r   u       ❌ Batch z timed out after zs - marking all as failedr   r   zBatch timeout after r   r   )rj   r   ClientSessionrangerY   r   wait_forgatherr   BATCH_TIMEOUT_SECONDSextendrC   r,   sleepr   rh   rA   r7   r8   r9   r   r   r   )r   r   r   r   resultstotal_tasksr   rt   batch	batch_numtotal_batchesr   batch_resultsrS   	successesfailuress                   r"   execute_swarmr     sz     Ge*K$$& / /'q+z2 .	A!A
N+EjA-I(:59jHMHYKq}SZLP[\]'&-&6&6NNV[\d-xI\ 2	' ! }-  M SqQXX=R ST	=OaAHH<NOP>(7KL X^^--!j.;2NOQ!--+++5.	/ /b Nc/ ]! !TO ,'' yk1BCXBYYrst! DNN;!%!YY&!%!4!4$(JJ$4$4!%!4!4%&'*+%&!$)>)E 45J4K1M$ ;/ / / /b Ns   &I<FI<AI&8"F'F/F' FF'F4F8F'F F !AF'7F%8F'<I&?I<
I$I<F'F''B6I!I& I!!I&$I<&I9,I/-I94I<output_filec                    t               }t        j                  j                  |       s|S 	 t	        | d      5 }|D ]L  }t        j                  |      }|j                  d      dk(  s-|j                  |j                  d             N 	 ddd       t        dt        |       d|         |S # 1 sw Y   %xY w# t        $ r}t        d|        Y d}~|S d}~ww xY w)	z2Load completed story IDs from existing JSONL file.rS   rC   r   r   Nz  Found z completed stories in z,  Warning: Could not read existing results: )setrV   rW   rX   r\   r   loadsr   addrY   rj   r   )r   	completedrl   ru   r   r   s         r"   load_completed_story_idsr      s    I77>>+&B+s# 	8q 8zz$'88H%2MM$((:"678	8
 	Y((>{mLM 	8 	8  B<QC@AABs4   B< /B0)"B0"B< 0B95B< <	CCCr   rh   c           	      V   t        j                  t         j                  j                  |      d       |rdnd}t	        ||      5 }| D ]2  }|j                  t        j                  t        |            dz          4 	 ddd       t        d| d|rd	nd
 d       y# 1 sw Y    xY w)z>Save results to JSONL file (append mode for --skip-completed).T)exist_okawrU   Nz  Results saved to:  (appendedoverwritten))
rV   makedirsrW   dirnamer\   writer   dumpsr	   rY   )r   r   rh   moderl   results         r"   save_resultsr     s    KK,t<3cD	k4	  7A 	7FGGDJJvf~.56	77 
 Rf
-/XXY
Z[	7 7s   8BB(minimax_resultskimi_resultsc                    | |z   }t        |      }t        |D cg c]  }|j                  dk(  s| c}      }t        |D cg c]  }|j                  dk(  s| c}      }|dkD  r||z  dz  nd}t        d |D              }t        d |D              }	|dkD  rt        d |D              |z  nd}
i }|D ]  }|j                  |vrddddd	||j                  <   ||j                     d
xx   dz  cc<   |j                  dk(  r||j                     dxx   dz  cc<   n||j                     dxx   dz  cc<   ||j                     dxx   |j                  z  cc<    d } ||       } ||      }dj                  g dt        j                         j                          d| d| d|dd| d|dd|	dd|
ddt         d|j                  d
d       d|j                  dd       d|j                  dd      dd |j                  d!d       d"|j                  d#d      dd|j                  d$d      dd%|j                  d&d      dd't         d|j                  d
d       d|j                  dd       d|j                  dd      dd |j                  d!d       d"|j                  d#d      dd|j                  d$d      dd%|j                  d&d      dd(      }t        |j                               D ]'  \  }}|d)| d*|d
    d*|d    d*|d    d+|d   dd,z  }) |d-|j                  d$d      dd.|j                  d$d      dd/|	dd0|	|z  dd1|j                  d&d      dd2t        | D cg c]  }|j                   c}d3       d2t!        | D cg c]  }|j                   c}d3       d4|j                  d&d      dd2t        |D cg c]  }|j                   c}d3       d2t!        |D cg c]  }|j                   c}d3       d5t        |        d6z  }| D ]7  }|j                  dk(  rd7nd8}|| d9|j"                   d:|j$                   d;z  }9 |d<t        |       d6z  }|D ]7  }|j                  dk(  rd7nd8}|| d9|j"                   d:|j$                   d;z  }9 |d=z  }|D cg c]  }|j                  dk(  s| }}|rG|d>t        |       d?z  }|D ]/  }|d@|j"                   dA|j&                   dB|j(                   d;z  }1 n|dCz  }|dDt*         dEt,         dFt.         dGt        j                         j                          dHt0         dIz  }t3        t.        dJ      5 }|j5                  |       dKdKdK       t7        d;dL        t7        dM       t7        dL        t7        dN|        t7        dO| d|ddP       t7        dQ|        t7        dR|	d       t7        dS|
ddT       t7        dUt.                t7        dL d;       yKc c}w c c}w c c}w c c}w c c}w c c}w c c}w # 1 sw Y   xY w)Vz&Generate comprehensive metrics report.r   r   r   d   c              3   4   K   | ]  }|j                     y wr;   rF   r    rS   s     r"   r#   z"generate_report.<locals>.<genexpr>*  s     ;!q~~;   c              3   4   K   | ]  }|j                     y wr;   rG   r   s     r"   r#   z"generate_report.<locals>.<genexpr>+  s     5AQZZ5r   c              3   4   K   | ]  }|j                     y wr;   rH   r   s     r"   r#   z"generate_report.<locals>.<genexpr>,  s     D1A..Dr   r   )r   r   r   costr   r   r   c           
         | si S t        |       t        | D cg c]  }|j                  dk(  s| c}      t        | D cg c]  }|j                  dk(  s| c}      t        | D cg c]  }|j                  dk(  s| c}      t        |       z  dz  t        d | D              t        d | D              t        d | D              t        |       z  dS c c}w c c}w c c}w )Nr   r   r   c              3   4   K   | ]  }|j                     y wr;   r   r   s     r"   r#   z8generate_report.<locals>.team_metrics.<locals>.<genexpr>C  s     E1Er   c              3   4   K   | ]  }|j                     y wr;   r   r   s     r"   r#   z8generate_report.<locals>.team_metrics.<locals>.<genexpr>D  s     ?Qajj?r   c              3   4   K   | ]  }|j                     y wr;   r   r   s     r"   r#   z8generate_report.<locals>.team_metrics.<locals>.<genexpr>E  s     $NAQ%7%7$Nr   )r   r   r   success_raterF   
total_costavg_response_time)rj   rC   sum)team_resultsrS   s     r"   team_metricsz%generate_report.<locals>.team_metrics;  s    I&OAY9NaOPK1F8JQKLL RqAHH	<Q RSVYZfVggjmmEEE?,??!$$N$N!NQTUaQb!b
 	
OK Rs"   C
C
 CC(C"=C"r}   zm# OpenRouter Swarm Execution Report
**Mission-Driven Edition** - Executing SWARM_MISSIONS.md

**Generated:** zT

## Overview

| Metric | Value |
|--------|-------|
| **Total Stories Executed** | z! |
| **Successful Executions** | r   z.1fz%) |
| **Failed Executions** | z |
| **Total Tokens Used** | r~   z |
| **Total Cost** | $z.4fz! |
| **Average Response Time** | z.0fz>ms |

---

## Team MiniMax (Content & Marketing)

**Model:** `z?`

| Metric | Value |
|--------|-------|
| **Total Stories** | z |
| **Successes** | r   r   z%) |
| **Failures** | r   z |
| **Total Tokens** | rF   r   z |
| **Avg Response Time** | r  z;ms |

---

## Team Kimi (Code & Architecture)

**Model:** `zms |

---

## PRD Breakdown

| PRD | Total Stories | Successes | Failures | Cost |
|-----|---------------|-----------|----------|------|
z| z | z | $z |
zX
---

## Cost Analysis

| Component | Cost |
|-----------|------|
| **MiniMax Team** | $z |
| **Kimi Team** | $z |
| **Total** | $z |

**Cost Per Story:** $z (average)

---

## Performance Metrics

### Response Time Distribution

| Team | Avg Response Time | Min | Max |
|------|-------------------|-----|-----|
| **MiniMax** | zms | )defaultzms |
| **Kimi** | z6ms |

---

## Completed Stories

### MiniMax Stories (z)
u   ✅u   ❌z **z**: rU   z
### Kimi Stories (z
---

## Failed Stories

z**Total Failures:** z

z- **z** (z): z4**No failures!** All stories executed successfully.
z/
---

## Output Files

- **MiniMax Results:** `z`
- **Kimi Results:** `z`
- **This Report:** `a  `

---

## Next Steps

1. **Review Results:** Read JSONL files for story outputs
2. **Extract Artifacts:** Code, content, configs from successful stories
3. **Integrate Outputs:** Merge generated work into codebase
4. **Fix Failures:** Manually complete failed stories or re-run
5. **Deploy:** Ship Sunaiva Memory Vault (6hr sprint complete!)

---

**Generated by:** Genesis OpenRouter Swarm Orchestrator (Mission-Driven)
**Timestamp:** z
**Source:** `z`
r   NP================================================================================zSWARM EXECUTION COMPLETEzTotal Stories: zSuccesses: z%)z
Failures: zTotal Cost: $zAverage Response Time: msz
Report saved to: )rj   rC   r  r   rG   r%   r   rM   rN   MINIMAX_MODEL_IDr   KIMI_MODEL_IDsorteditemsr   rH   maxr   rB   r8   rJ   MINIMAX_RESULTS_FILEKIMI_RESULTS_FILEREPORT_FILEMISSIONS_FILEr\   r   rY   )r   r   all_resultstotal_agentsrS   total_successestotal_failuresr   rF   r   r  prd_breakdownr  minimax_metricskimi_metricsreportr   metricsstatus_iconfailedrl   s                        r"   generate_reportr     s	   !L0K {#LkKQXX5J1KLO[GAHH4F!GHN=IA=MOl2S8STL;{;;L555JWcfgWgDDD|Smn M 8::]*231VY(ZM!**%ajj!'*a/*88y !**%i0A50!**%f-2-ajj!&)QZZ7)8
 #?3O-L4 4  4 ((*+4, 4 !-~4.4  //4 024 3?s1C4D4 **4+4 (*4+4  $4%4  15464( )4()40 '**7A671408142 #&&{A67342 8:342 ;J:M:Mn^_:`ad9e342f344 "%%j!455446546 &)).!<Q?746@748 %((q9#>948?94: +../BAFsK;4:L;4F OG4FG4N $''34O4N5O4P  ##K34Q4P 57Q4P 8D7G7GXY7Z[^6_Q4P`Q4R "":q12S4R3S4T #&&~q9!<U4T=U4V "%%lA6s;W4V<W4X (++,?CCHY4XIY4Fl $M$7$7$9: 'BxjGG$4#5S9K8LCPWX^P_O``delmsetuxdyy}~~   '**<;C@ A $$\15c: ;3   </4 
5 !$$%8!<SAshwKxcdAL^L^Kx  CD  HE  GF  FK  LO  m|  P}  hi  QR  Qc  Qc  P}  GH  LI  KJ J2A6s;5bnEo]^aFXFXEoyzA{@|  }B  CF  dp  Gq  _`  HI  HZ  HZ  Gq  {|  C}  B~ ~ /*+ ,9 F>  G xx94e%[MQZZLQ]]O2FFG  |$% & F  G xx94e%[MQZZLQ]]O2FFG   F %;AF(:a;F;(VT:: 	DAQZZLQVVHCyCCF	D 	II
 
 .. /'( ) M " ((*+ ,_ / F6 
k3	 1	 
Bvh-	
$%	VH	OL>
*+	K(<*<B
?@	J~&
'(	M*S)
*+	#$5c#:"
=>	}
-.	VHB-C LGf Ly  P}Eo  Gq: <F sF   YYYY&Y" Y'$Y,,,Y10,Y6Y6*Y;;Zc            	      6  K   t        j                  d      } | j                  dg ddd       | j                  dt        d	d
       | j                  ddd       | j	                         }t        dd        t        d       t        d        t        dt        j                         j                                 t        dt                t        d|j                  j                                 t        dt                t        dt                t        dt         d       t        dt         d       t        d|j                           t        d d       t#               }t        d       t%               }|j                   rFt        d       t'        t(              }t'        t*              }||z  }t        dt-        |       d       t        d        t/        t              }|s t        d!       t1        j2                  d"       t        dt-        |       d#       |j                   rt-        |      }|D cg c]  }|j4                  |vs| }}|t-        |      z
  }	t        d$|	 d%       t        d&t-        |       d'       t-        |      d(k(  r t        d)       t1        j2                  d(       |j                  dk(  rd	n|j                  }
t7        ||
      }|j8                  r(|d	|j8                   }t        d*|j8                   d+       g }g }|D cg c]  }|j                  d,k(  s| }}|D cg c]  }|j                  d-k(  s| }}|rtt        d        t        d.t-        |       d/       t        d        t;        |t<        |t               d	{   }t?        |t(        |j                   0       t                |rtt        d        t        d1t-        |       d2       t        d        t;        |t@        |t               d	{   }t?        |t*        |j                   0       t                |j                   rt        d3       g }g }tB        jD                  jG                  t(              rPtI        t(        d4      5 }|D ]1  }tK        jL                  |      }|jO                  tQ        d5i |       3 	 d	d	d	       tB        jD                  jG                  t*              rPtI        t*        d4      5 }|D ]1  }tK        jL                  |      }|jO                  tQ        d5i |       3 	 d	d	d	       tS        ||       y	tS        ||       y	c c}w c c}w c c}w 7 7 Y# 1 sw Y   xY w# 1 sw Y   DxY ww)6zMain orchestrator.z.OpenRouter Swarm Orchestrator - Mission-Driven)descriptionz--team)r   r+   bothr  z!Which team to run (default: both))r   r  helpz--limitNz1Limit number of stories to execute (default: all))typer  r   z--skip-completed
store_truezCSkip stories already completed in JSONL files (appends new results))actionr   rU   r  z6GENESIS OPENROUTER SWARM ORCHESTRATOR - MISSION-DRIVENzTimestamp: zMissions File: zTeam: zMiniMax Batch Size: zKimi Batch Size: zRequest Timeout: r   zBatch Timeout: zSkip Completed: u   ✅ OpenRouter API key loaded
u!   📋 Loading completed stories...u
   ✅ Found z total completed stories
u!   📖 Parsing SWARM_MISSIONS.md...z(ERROR: No stories found in missions filer   z total stories
u   ⏭️  Skipped z already-completed storiesu   📝 Remaining: z stories to execute
r   u1   ✅ All stories already completed! Nothing to do.u   ⚠️  Limited to first z	 stories
r   r   zTEAM MINIMAX: z stories (Content & Marketing))rh   zTEAM KIMI: z stories (Code & Architecture)u9   📊 Loading complete result set for report generation...rS   r   )*argparseArgumentParseradd_argumentr4   
parse_argsrY   r   rM   rN   r  r8   r   BATCH_SIZE_MINIMAXBATCH_SIZE_KIMIr   r   skip_completedr   r   r   r  r  rj   ry   rZ   r[   r   r   limitr   r  r   r	  rV   rW   rX   r\   r   r   rh   rA   r  )parserargsr   completed_story_idsminimax_completedkimi_completedall_storiesoriginal_countr   skipped_countr   	all_tasksr   r   tminimax_tasks
kimi_tasksall_minimaxall_kimirl   ru   r   s                         r"   mainr:    s    $$1abF
+0	   @	   R  
 D	Bvh-	
BC	VH	K0023
45	OM?
+,	F499??$%
&'	 !3 4
56	o.
/0	56a
89	O12!
45	T001
23	VHB- nG	+- %1245IJ12CD/.@
32344NOP 

-.%m4K89	Js;'((8
9: [)"-WQCV1VqWW&[)99 /IJK [!1 22GHI{q EFHHQK ))v-$499K)+{CI zzktzz*	)$**Z@AOL !*A1QVVy-@QAMA&;!&&F*:!;J; s=122PQR -m=MwXj kk_&:4CVCVW C
O,,JKL*:}g__\#4T=P=PQ IJ 77>>./*C0 <A <D::d+D&&{':T':;<< 77>>+,'- 9 9D::d+DOOK$7$$7899
 	X. 	6E X, B; l `< <9 9s   IVU,U, C
V*U1?U1V	U6U6"AV/U;0A5V%U>&A9V7V;V7V
2V>VV
VVV__main__r;   )F)9r1   rV   rZ   r   r   r$  r^   r   typingr   r   r   r   dataclassesr   r	   pathlibr
   r   rW   rh   r   ImportErrorrY   r[   r   r  r  r	  r(  r)  r   r   RESULTS_DIRr  r  r  r   r6   rA   r2   ry   rg   r   r   r   r   r4   r   r   r   boolr   r  r:  r.   runr   r)   r"   <module>rC     s  . 
 
    	  , , )   ' ( F > * &      9%&<= "m#67 B 'N 'N 'NT - - - 8 8 8.H3 H4; HVA3 A# A(5/ AH	c 	tE{ # Z^_hZi 0s
""s

s
 s
 	s

 s
l;	?;; ; 	;
 
+;|# # (	\${+ 	\# 	\t 	\GT+%6 Gd;FW GT7D zGKK E  	
KLCHHQKs   E E0/E0