
    գiK                         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m	Z	  ed      Z
e
dz  Zedz  Zed	z  Zh d
Zd Z	 ddededededef
dZdefdZdefdZdefdZd Zedk(  r e        yy)a  
GENESIS REVENUE FEEDBACK LOOP
==============================
Tracks revenue impact of tasks and generates financial performance summaries.

Implements the feedback loop between task execution and revenue outcomes,
ensuring Genesis can prioritize work that generates real AUD.

Usage:
    from core.revenue_feedback_loop import record_task_revenue_impact, get_revenue_summary

    record_task_revenue_impact(
        task_id="RAI-007",
        revenue_impact="Widget upsell to $997/mo tier",
        outcome="success",
        amount_aud=997.0
    )

    summary = get_revenue_summary()

    # CLI:
    python3 revenue_feedback_loop.py --summary
    python3 revenue_feedback_loop.py --record RAI-007 "Widget sale" success 997.0
    N)datetimetimezone)Path)Optionalz/mnt/e/genesis-systemloopzrevenue_log.jsonlz
tasks.json>   failurependingsuccessc                  2    t         j                  dd       y)z"Ensure required directories exist.T)parentsexist_okN)LOOP_DIRmkdir     3/mnt/e/genesis-system/core/revenue_feedback_loop.py_ensure_dirsr   +   s    NN4$N/r   task_idrevenue_impactoutcome
amount_audreturnc                 r   t                |t        vrt        dt         d|      | ||t        |      t	        j
                  t        j                        j                         d}t        t        dd      5 }|j                  t        j                  |      dz          ddd       |S # 1 sw Y   |S xY w)	a  
    Record the revenue impact of a completed (or in-progress) task.

    Args:
        task_id:        Genesis task ID (e.g. "RAI-007", "GEN-028")
        revenue_impact: Human-readable description of the revenue event
        outcome:        "success" | "failure" | "pending"
        amount_aud:     Dollar value tracked (AUD), default 0.0

    Returns:
        The record dict that was appended to the log.
    zoutcome must be one of z, got: )r   r   r   r   	timestampautf-8encoding
N)r   VALID_OUTCOMES
ValueErrorfloatr   nowr   utc	isoformatopenREVENUE_LOG_PATHwritejsondumps)r   r   r   r   recordfs         r   record_task_revenue_impactr-   0   s    $ Nn$2>2B''UVV (J'\\(,,/99;F 
g	6 +!	

6"T)*+ M+ Ms   :(B,,B6c                     t                g } t        j                         r[t        t        dd      5 }|D ]:  }|j	                         }|s	 | j                  t        j                  |             < 	 ddd       | s
ddddddg dS | D ch c]  }|d   	 }}t        d	 | D              }t        d
 | D              }dddd}| D ]&  }|j                  dd      }||v s||xx   dz  cc<   ( t        | d d      }	|	dd }
t        |      |t        |d      |d   |d   |d   |
dS # t        j                  $ r Y 	w xY w# 1 sw Y   xY wc c}w )u  
    Read revenue_log.jsonl and return an aggregated performance summary.

    Returns:
        {
            total_tasks:       int   — unique task IDs recorded,
            revenue_generating: int  — tasks with amount_aud > 0,
            total_aud_tracked: float — sum of all amount_aud,
            success_count:     int,
            failure_count:     int,
            pending_count:     int,
            top_tasks:         list  — top 5 by amount_aud (desc)
        }
    rr   r   Nr           )total_tasksrevenue_generatingtotal_aud_trackedsuccess_countfailure_countpending_count	top_tasksr   c              3   L   K   | ]  }|j                  d d      dkD  sd  yw)r   r0   r      Nget.0r/   s     r   	<genexpr>z&get_revenue_summary.<locals>.<genexpr>}   s"     P1155s3Ka3OQPs   $$c              3   @   K   | ]  }|j                  d d        yw)r   r0   Nr:   r<   s     r   r>   z&get_revenue_summary.<locals>.<genexpr>~   s     >AEE,,>s   )r
   r   r	   r   r	   r9   c                 &    | j                  dd      S )Nr   r0   r:   )r/   s    r   <lambda>z%get_revenue_summary.<locals>.<lambda>   s    155s3K r   T)keyreverse      r
   r   )r   r'   existsr&   stripappendr)   loadsJSONDecodeErrorsumr;   sortedlenround)recordsr,   liner/   unique_task_idsr2   	total_audoutcome_countsr   sorted_recordsr7   s              r   get_revenue_summaryrU   U   s    NG "C': 	!a !zz|!tzz$'78	!	! "#!$
 	
 .55q|5O5PPP>g>>I!"qQ?N )%%	9-n$7#q(#)
 G)KUYZNr"I ?+0"9a0'	2'	2'	2 7  // ! !	! 	!( 6s5   E$D)1EE)E <E?E  EEc                  
   t         j                         sddt          iS t        t         dd      5 } t        j                  |       }ddd       j                  dg       }d}d}|D ]  }d	|vrd
|d	<   |dz  }|dz  } t        j                  t        j                        j                         |d<   t        t         dd      5 } t        j                  || d       ddd       ||dS # 1 sw Y   xY w# 1 sw Y   xY w)z
    Read tasks.json and add `revenue_impact` field (default: "unknown")
    to any stories that are missing it. Writes updated JSON back in-place.

    Returns:
        {"stories_updated": int, "stories_already_had_field": int}
    errorztasks.json not found at r/   r   r   Nstoriesr   r   unknownr9   
updated_atwrE   indent)stories_updatedstories_already_had_field)TASKS_JSON_PATHrF   r&   r)   loadr;   r   r#   r   r$   r%   dump)r,   datarX   updatedalready_presentstorys         r   update_tasks_with_revenue_fieldrg      s    !!#3O3DEFF	osW	5 yy| hhy"%GGO !5(&/E"#qLGq O! "hll3==?D	osW	5 %		$!$%  '_UU) "% %s   C-C9-C69Dsummaryc                    t        d       t        d| d           t        d| d           t        d| d   d       t        d	| d
    d| d    d| d           | d   rXt        d       t        | d   d      D ]0  \  }}t        d| d|d    d|d   dd|d   d d  d|d    d       2 t                y t        d       t                y )Nz.
=== GENESIS REVENUE FEEDBACK LOOP SUMMARY ===z  Unique tasks tracked  : r1   z  Revenue-generating    : r2   z  Total AUD tracked     : $r3   z,.2fu     Outcomes — success: r4   z  failure: r5   z  pending: r6   r7   z
  Top 5 highest-impact tasks:r9   z    z. [r   z] $r   u	    AUD — r   <   z (r   )z 
  No revenue records found yet.)print	enumerate)rh   its      r   _print_summaryrp      s,   	
;<	&w}'=&>
?@	&w/C'D&E
FG	'0C(DT'J
KL	$W_%=$>k'RaJbIccnov  xG  pH  oI  J  K{/0gk2A6 	|DAqD3q|nC,/EYqQaObcfdfOgNhhjklmvkwjxxyz{	| 
G 	12	Gr   c                     t        j                  d      } | j                  ddd       | j                  ddd	d
       | j                  ddd       | j                         }|j                  rN|j                  \  }}}}	 t        |      }t        |||      }t        dt        j                  |d              |j                  rt               }t        d|        |j                  s|j                  s#|j                  st!               }	t#        |	       y y y # t        $ r& t        d|       t        j                  d       Y w xY w)NuI   Genesis Revenue Feedback Loop — track and summarise task revenue impact)descriptionz	--summary
store_truezPrint revenue summary)actionhelpz--record   )TASK_IDREVENUE_IMPACTOUTCOME
AMOUNT_AUDzKRecord a revenue event: TASK_ID 'description' success|failure|pending 997.0)nargsmetavarru   z--patch-tasksz=Add missing revenue_impact field to all stories in tasks.jsonz)ERROR: AMOUNT_AUD must be a number, got: r9   z
Recorded: rE   r\   ztasks.json patched: )argparseArgumentParseradd_argument
parse_argsr+   r"   r!   rl   sysexitr-   r)   r*   patch_tasksrg   rh   rU   rp   )
parserargsr   r   r   
amount_stramountrecresultrh   s
             r   mainr      sI   $$_F L?VW
FZ	   L   D{{7;{{4*	:&F ).'6R
4::c!456702$VH-.||DKK0@0@%'w 1AK  	=j^LMHHQK	s   D ,EE__main__)r0   )__doc__r)   r   r}   r   r   pathlibr   typingr   GENESIS_ROOTr   r'   r`   r    r   strr"   dictr-   rU   rg   rp   r   __name__r   r   r   <module>r      s   2  
  '   +,& 11 \)20 	""" " 	"
 
"J<T <~V VLD # L zF r   