
     j                        d Z ddlm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Z
dZdZ eh d	      Z eh d
      Z	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZy)u  v3.6 Runtime Harness — Layer 1: Dispatch Marker Writer.

chair_authorization_id=CHAIR-AUTH-TASK-2704-V36-CONTROL-PLANE-P0-MVP-260528

Contract:
- Write a dispatch marker JSON to memory/events/<task_id>.dispatched-<team>-<YYMMDD>.json
  immediately after a successful dispatch.
- 7 required fields: schedule_id, executor, bot_key_hash, fire_time, prompt_sha,
  task_md_sha_before, dispatch_method
- bot_key_hash = sha256(bot_key).hexdigest()[:16]  — raw key NEVER stored
- prompt_sha   = sha256(prompt.encode('utf-8')).hexdigest()
- dispatch_method enum: dispatch_py | direct_cron_bot_key | fallback_safety_net
- Safe-fail: ALL exceptions silently swallowed. Returns None on failure. Never raises.
    )annotationsN)datetimetimezone)Optionalv1dispatch_markerz!/home/jay/workspace/memory/events>   dispatch_pydirect_cron_bot_keyfallback_safety_net>   executor	fire_time
prompt_shaschedule_idbot_key_hashdispatch_methodtask_md_sha_beforec                N    	 t        | |||||||||	|
      S # t        $ r Y yw xY w)u  Write a dispatch marker JSON file.

    Args:
        task_id: Task identifier (e.g. "task-2704").
        schedule_id: Cron schedule ID returned by dispatch.
        executor: Team name or bot persona string.
        bot_key: Raw bot API key — hashed before storage; never persisted raw.
        fire_time: ISO 8601 dispatch time string.
        prompt: Full prompt text; stored as SHA-256 hash only.
        task_md_sha_before: SHA-256 of task markdown at dispatch entry; None if unavailable.
        dispatch_method: One of "dispatch_py" | "direct_cron_bot_key" | "fallback_safety_net".
        events_dir: Override directory for marker files (default: memory/events/).
        team_suffix: Optional team suffix for filename deduplication.

    Returns:
        dict with marker contents on success, None on any failure.

    CRITICAL: This function is absolutely safe-fail. Any exception — including bad
    argument types, filesystem errors, import errors — is silently swallowed.
    Callers' dispatch flow is NEVER affected.
    task_idr   r   bot_keyr   promptr   r   
events_dirteam_suffixchair_authorization_idN)_write_dispatch_marker_impl	Exceptionr   s              A/home/jay/workspace/scripts/harness/v36/dispatch_marker_writer.pywrite_dispatch_markerr   +   sJ    D*#1+!##9
 	
  s    	$$c                   |t         vrd}t        j                  |j                  d            j	                         dd }t        j                  |j                  d            j	                         }t        j                  t        j                        }|j                  d      }|j                         }|xs t        }|	r|  d|	 d| d}n|  d| d}t        j                  j                  ||      }t        j                  j                  |      rG|j                  d	      }|	r|  d|	 d| d}n|  d| d}t        j                  j                  ||      }t         t"        | |||||||||
d
}t$        |j'                         D ch c]  \  }}||dk(  s| c}}z
  }|ryt        j(                  |d       |dz   }	 t+        |dd      5 }t-        j.                  ||dd       ddd       t        j0                  ||       t        j                  j                  |      r	 t        j2                  |       	 ddlm}  |d| ||||d       |S c c}}w # 1 sw Y   sxY w# t4        $ r Y 6w xY w# t        j                  j                  |      r&	 t        j2                  |       w # t4        $ r Y w w xY ww xY w# t4        $ r Y |S w xY w)uL   Internal implementation — may raise; outer wrapper catches all exceptions.r	   zutf-8N   z%Y%m%dz.dispatched--z.jsonz%Y%m%d%H%M%S%f)marker_versionmarker_typer   r   r   r   r   r   r   r   
written_atr   r   T)exist_okz.tmpw)encodingF   )ensure_asciiindentr   )log_runtime_eventmarker_written)marker_pathr   r   r   )
event_typer   payload)DISPATCH_METHODShashlibsha256encode	hexdigestr   nowr   utcstrftime	isoformat_DEFAULT_EVENTS_DIRospathjoinexistsMARKER_VERSIONMARKER_TYPE_REQUIRED_FIELDSitemsmakedirsopenjsondumpreplaceunlinkr   +scripts.harness.v36.runtime_decision_loggerr+   )r   r   r   r   r   r   r   r   r   r   r   r   r   now_utcts_for_filets_isodir_pathfilenamer-   ts_usmarkerkvmissingtmp_pathfhr+   s                              r   r   r   `   s    ..' >>'.."9:DDFsKLg 67AACJ ll8<<(G""8,K F 00HYl;-qUKYl;-u= '',,x2K	ww~~k"  !12!,{m1UG5IH!,ugU;Hggll8X6 )""$ 0*"8F  !m1!-STXlSl!!mmG KK4(V#H
(C'2 	@bIIfbuQ?	@


8[) 77>>(#		(#
Q'**#2 ,			
 MI "n	@ 	@   77>>(#		(#  $&  Msx   III: I-I: +I+ K I($I: +	I76I7: KJ10K1	J=:K<J==K	KK)NNN)r   strr   Optional[str]r   rU   r   rU   r   rU   r   rU   r   rV   r   rU   r   rV   r   rV   r   rV   returnzOptional[dict])__doc__
__future__r   r1   rD   r:   r   r   typingr   r>   r?   r9   	frozensetr0   r@   r   r        r   <module>r^      sW   #   	 '  : Z[    ( !%!%,0222 2 	2
 2 2 &2 2 2 2 *2 2jbbb b 	b
 b b &b b b b *b br]   