
    5wjb                       d Z ddlmZ ddlZddlZddlmZmZ dZdZ	dZ
dZd	Zd
ZdZdZdZ ej"                  dej$                        Z ej"                  dej$                        ZddZddZddZddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZy)u  v3.6 Runtime Harness — Layer 0: Task MD SHA Normalize.

chair_authorization_id=CHAIR-AUTH-TASK-2705PLUS1-V36-TASK-MD-SHA-BOOTSTRAP-260528

Pure functions for normalizing task markdown bytes prior to sha comparison.
Mirrors dispatch.py L4518 `.read_text(utf-8).strip()` plus allowed sidecar /
retry-header strip per design spec v36_task_md_sha_contract_design_draft_260528.md.

Safe-fail: every public function catches all exceptions and returns a conservative
result (UNKNOWN / unverifiable) — never raises to the caller.
    )annotationsN)OptionalTupleNO_PATCHDISPATCH_META_SIDECARRETRY_HEADER_PREPENDWHITESPACE_NORMALIZATIONFORBIDDEN_SEMANTIC_CHANGEUNKNOWNtruefalseunverifiables#   ^<!--\s*DISPATCH_META[^>]*-->\s*\n?s"   ^<!--\s*RETRY_HEADER[^>]*-->\s*\n?c                n    | y	 t        j                  |       j                         S # t        $ r Y yw xY w)z;Return hex sha256 of ``content`` (None if content is None).N)hashlibsha256	hexdigest	Exception)contents    @/home/jay/workspace/scripts/harness/v36/task_md_sha_normalize.pycompute_sha256r   %   s9    ~~g&0022 s   "( 	44c                    | y	 | j                  dd      }|j                         j                  d      S # t        $ r$ 	 | j                         cY S # t        $ r Y Y yw xY ww xY w)zISimulate dispatch.py L4518 ``read_text("utf-8").strip()`` then re-encode.Nzutf-8strict)errors)decodestripencoder   )r   texts     r   normalize_whitespacer   /   sj    ~~gh~7zz|""7++ 	==?" 		s-   17 	A$AA$	A A$A  A$c                n    | s| dfS t         j                  |       }|r| |j                         d dfS | dfS )zPStrip a leading ``<!-- DISPATCH_META ... -->`` block. Returns (stripped, found).FNT)_DISPATCH_META_REmatchendr   r!   s     r   _strip_dispatch_meta_sidecarr$   =   sD    ~##G,Euyy{|$d**E>    c                n    | s| dfS t         j                  |       }|r| |j                         d dfS | dfS )zOStrip a leading ``<!-- RETRY_HEADER ... -->`` block. Returns (stripped, found).FNT)_RETRY_HEADER_REr!   r"   r#   s     r   _strip_retry_headerr(   G   sD    ~""7+Euyy{|$d**E>r%   c                   	 | |t         S | |k(  rt        S t        |       }t        |      }|||k(  rt        S t	        |       \  }}t	        |      \  }}||k7  rt        |      t        |      k(  rt
        S t        |       \  }}	t        |      \  }
}|	|k7  rt        |      t        |
      k(  rt        S t        S # t        $ r	 t         cY S w xY w)zEClassify the difference between ``pre_content`` and ``post_content``.)
PATCH_TYPE_UNKNOWNPATCH_TYPE_NO_PATCHr   #PATCH_TYPE_WHITESPACE_NORMALIZATIONr$    PATCH_TYPE_DISPATCH_META_SIDECARr(   PATCH_TYPE_RETRY_HEADER_PREPEND$PATCH_TYPE_FORBIDDEN_SEMANTIC_CHANGEr   )pre_contentpost_contentpre_norm	post_normpre_no_metapre_meta_foundpost_no_metapost_meta_foundpre_no_retrypre_retry_foundpost_no_retrypost_retry_founds               r   detect_patch_typer<   Q   s    ","6%%,&&&'4(6	H	$966&B;&O#^(D\(R%o_,#K04H4VV77(;K(H%o*=l*K''..#L15I-5XX6633 "!!"s,   	B< 
B< "B< =B< 8=B< 6B< <CCc                *   	 | |t         S | |k(  rt        S t        |       \  }}t        |      \  }}t        |      \  }}t        |      \  }}t	        |      }t	        |      }||t         S ||k(  rt        S t
        S # t        $ r	 t         cY S w xY w)zVReturn ``"true" | "false" | "unverifiable"`` after sidecar/retry strip + ws normalize.)VERBATIM_UNVERIFIABLEVERBATIM_TRUEr$   r(   r   VERBATIM_FALSEr   )r0   r1   r4   _r6   r2   r3   s          r   content_verbatim_matchrB   r   s    %,"6((,&  5kBQ6|Da,[9Q-l;a'4(6	y0(( (I 5}I>I %$$%s(   	B  
B  AB  /
B  :B   BB)r   Optional[bytes]returnzOptional[str])r   rC   rD   rC   )r   bytesrD   zTuple[bytes, bool])r0   rC   r1   rC   rD   str)__doc__
__future__r   r   retypingr   r   r+   r-   r.   r,   r/   r*   r?   r@   r>   compile
IGNORECASEr    r'   r   r   r$   r(   r<   rB    r%   r   <module>rN      s   
 #  	 "  #:  "8 &@ #'B $ & BJJ+R]]  2::*BMM 
" "0?""B% %0?%%r%   