
    <j!                        d Z ddlmZ ddlZddlmZ dZdZdZdZ	d	Z
d
ZdZdZdZdZdZdZdZdZddZddZddZddZddd	 	 	 	 	 	 	 ddZg dZy)uL  dispatch.anu_activation_preflight — task-2774+5 activation-intended preflight gate.

★ activation-intended 전용 게이트(G2 fail-closed + G3 canonical backlog 보호).
  **호출되는 경우에만 동작**한다 — driver 의 기본(default) 경로는 이 helper 를 호출하지
  않으므로 현행 동작 100% 보존(회귀 0). 이 PR 은 flag/systemd/canary/real activation 을
  켜지 않는다(ACTIVE=false 유지). activation-intended 모드는 코드로 정의만 하고 기본 OFF.

설계 원칙:
- self-contained: stdlib(os) only. driver 모듈 import 0(순환 의존 회피).
- 외부 부작용 0: canonical p0b_inbox backlog 는 **읽기 나열(listdir)만** 수행하고
  삭제/수정/이동/소비 0(파일 개수·내용 불변).
- fail-closed: activation-intended 인데 안전 전제가 깨지면 조용한 None 이 아니라 STOP.

판정 순서(첫 STOP 에서 즉시 반환):
  G2-a is_activated      예외→ACTIVATION_CHECK_ERROR   / 미활성→NOT_ACTIVATED
  G2-b build_governor    예외→GOVERNOR_BUILD_ERROR     / None→GOVERNOR_NOT_INJECTED
  G2-c governor callable 아님→GOVERNOR_NOT_CALLABLE
  G3-d paths             None/빈목록→CANARY_PATHS_REQUIRED
  G3-e canonical backlog paths 밖 backlog 1건이라도→CANONICAL_BACKLOG_DETECTED
  통과                   ok=True / ACTIVATION_INTENDED_READY
    )annotationsN)Optionalzmemory/state/p0b_driver_enabledenabledzmemory/events/p0b_inboxztask-*.result.jsonACTIVATION_CHECK_ERRORNOT_ACTIVATEDGOVERNOR_BUILD_ERRORGOVERNOR_NOT_INJECTEDGOVERNOR_NOT_CALLABLECANARY_PATHS_REQUIREDCANONICAL_BACKLOG_DETECTEDINBOX_SCAN_ERRORCANARY_PATH_INVALIDACTIVATION_INTENDED_READYc                    d| ddS )NFTokreasonstop r   s    8/home/jay/workspace/dispatch/anu_activation_preflight.py_stopr   /   s    6488    c                    d| ddS )NTFr   r   r   s    r   _okr   3   s    &%88r   c                   	 t         j                  j                  |      s t         j                  j                  | |      }t         j                  j	                  t         j                  j                  |            }	 t         j                  j                  | |g      | k(  r|S 	 y# t        t        t        f$ r Y yw xY w# t        $ r Y yw xY w)u   root 기준 정규화. 상대경로는 root 기준 join 후 realpath.
    정규화 실패/root 밖 경로 → None(비교 불가 → 호출측 fail-closed STOP).N)
ospathisabsjoinrealpathabspathOSError
ValueError	TypeError
commonpath)	root_realpnps      r   _norm_under_rootr*   7   s    ww}}QY*AWWbggooa01
77y"o.);I <  Z+   s$   A;B& >%C  &B=<B= 	CCc                
   t         j                  j                  | t              }	 t	        |dd      5 }|j                  d      j                         t        k(  cddd       S # 1 sw Y   yxY w# t        t        f$ r Y yw xY w)u   activation flag 파일(memory/state/p0b_driver_enabled) 첫 줄 trim == "enabled" 일 때만 True.
    부재/읽기실패 → False(fail-closed). is_activated_fn 미주입 시 self-contained 기본 reader.rz	utf-8-sig)encodingd   NF)
r   r   r    ACTIVATION_FLAG_RELopenreadlinestripACTIVATION_ENABLEDr#   r$   )root	flag_pathfhs      r   _default_is_activatedr7   J   sv     T#67I)S;7 	B2;;s#))+/AA	B 	B 	BZ  s.   A0 &A$	A0 $A-)A0 -A0 0BB)is_activated_fninbox_dir_relc                  |t         }|r|nt        }	  ||       }|st        t
              S 	  ||       }|t        t              S t        |      st        t              S 	 t        j                  j                  t        j                  j                  |             }|st        t               S |D 	cg c]  }	t#        ||	       }
}	t%        d |
D              rt        t&              S t)        |
      }t        j                  j+                  | |      }	 t        j,                  |      }|D cg c]D  }|j5                  d      r1|j7                  d      r t        j                  j+                  ||      F }}|D ]%  }t#        ||      }|||vst        t8              c S  t;        t<              S # t        $ r t        t              cY S w xY w# t        $ r t        t              cY S w xY w# t        t        f$ r# t        j                  j                  |       }Y w xY wc c}	w # t.        t0        f$ r g }Y t        $ r t        t2              cY S w xY wc c}w )u]  activation-intended 전용 preflight. Decision = dict(ok, reason, stop).

    Args:
        root: canonical root 경로.
        paths: explicit canary scope (처리 대상 result 경로 목록). None/빈목록 → STOP.
        build_governor_fn: callable(root) -> governor_fn|None. activation-gated builder.
        is_activated_fn: callable(root) -> bool. 미주입 시 _default_is_activated(파일 읽기).
        inbox_dir_rel: canonical inbox 상대경로(기본 INBOX_DIR_REL). backlog glob 대상.

    Returns:
        dict(ok: bool, reason: str, stop: bool). 첫 STOP 에서 즉시 반환.
    c              3  $   K   | ]  }|d u  
 y w)Nr   ).0r)   s     r   	<genexpr>z0activation_intended_preflight.<locals>.<genexpr>   s     
0"2:
0s   ztask-z.result.json)r7   INBOX_DIR_REL	Exceptionr   REASON_ACTIVATION_CHECK_ERRORREASON_NOT_ACTIVATEDREASON_GOVERNOR_BUILD_ERRORREASON_GOVERNOR_NOT_INJECTEDcallableREASON_GOVERNOR_NOT_CALLABLEr   r   r!   r"   r#   r$   REASON_CANARY_PATHS_REQUIREDr*   anyREASON_CANARY_PATH_INVALIDsetr    listdirFileNotFoundErrorNotADirectoryErrorREASON_INBOX_SCAN_ERROR
startswithendswith!REASON_CANONICAL_BACKLOG_DETECTEDr   REASON_READY)r4   pathsbuild_governor_fnr8   r9   	inbox_rel	activatedgovernor_fnr'   r(   norm_paths_list
norm_paths
inbox_pathentriesnamebacklogbacklog_filenorm_bfs                     r   activation_intended_preflightr_   U   s5   ( /!.MI4#D)	 )**2'- 122 K 122*GG$$RWW__T%:;	
 122 @EE!'	15EOE

0
00/00_%J
 dI.J.**Z( ??7#n(E 	Z&G    <"9l;?gZ7:;;< |u  42334  20112 Z  *GGOOD)	* F 12  .,--.sY   F2 G "<G. 3H#H( .A	I2GGG+*G+..H H (I<II)r_   r/   r3   r>   RESULT_GLOBr@   rA   rB   rC   rE   rF   rP   rM   rH   rQ   )r   strreturndict)r'   ra   r(   ra   rb   Optional[str])r4   ra   rb   bool)r4   ra   rR   zOptional[list]r9   rd   rb   rc   )__doc__
__future__r   r   typingr   r/   r3   r>   r`   r@   rA   rB   rC   rE   rF   rP   rM   rH   rQ   r   r   r*   r7   r_   __all__r   r   r   <module>rj      s   * # 	  8  )" !9 & 4 6 6 6 $@ !, 2 *99&  #'U
U U !U 
Upr   