
    4jrQ                    p   d Z ddlm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  ee      j                         j                  d   Zg dZddgd	gd
gdgdgdgdgdgdgdgd
Zg dZdZdZdZdZdZdZdZh dZd&dZd'dZd(d'dZd)dZd*dZd'd Z d+d!Z!d,d"Z"d# Z#d(d-d$Z$e%d%k(  r e& e$             y).u.  task-2609 Track F — AUTO_PR_AND_MERGE_READINESS_DRY_RUN entrypoint.

Verifies automated-PR-creation + automated-merge readiness purely via
read-only consumption + dry-run + fixture evaluation.

HARD CONSTRAINTS (회장 verbatim §2/§7):
  * read-only · dry-run · proposal-only
  * NO GitHub write · NO PR open · NO branch/commit/push · NO merge
  * NO credential raw exposure (BOT_GITHUB_TOKEN redacted preflight only)
  * NO OWNER PAT usage
  * additive-only: writes only task-2609.* allowlisted paths (§6)
  * the 10 consume modules are inspected byte-0 (sha256 + AST symbol probe,
    never executed) — no network, no subprocess, no mutation surface

This module is import-safe (no side effects on import) so the regression
suite can drive judge_case()/evaluate_conditions() with mock fixtures only.
    )annotationsN)Path   )
zutils/merge_queue_executor.pyzutils/replacement_pr_runner.pyz utils/post_merge_smoke_runner.pyzutils/bot_merge_identity.pyzscripts/refresh_bot_token.pyz%utils/critical_escalation_reporter.pyzutils/merge_topology_gate.pyzutils/automation_contracts.pyz,scripts/run_post_merge_reconcile_closeout.pyzutils/gemini_gate_validator.pyevaluate_prverify_head_lock_then_mergeReplacementPRRunnerrun_post_merge_smokeclassify_token_sourcerequest_installation_tokenprocess_eventclassifyCriticalEscalationType	reconcileevaluate_gate
queue_headexpected_files_exact_matchforbidden_path_zero!effective_diff_contamination_zerodependency_satisfiedserial_only_collision_zeroci_all_successgemini_unresolved_zeromerge_state_cleanhead_sha_lock_matchbot_token_is_ghs_appowner_pat_usage_zeropost_merge_smoke_configuredreconcile_evidence_configuredFORBIDDEN_PATH_INTRUSION9REPLACEMENT_PR_AUTO_CREATION_FAILED_FOR_CONTAMINATED_DIFF(GEMINI_REAL_BUG_REQUIRES_SCOPE_EXPANSION.BLOCK_OVERRIDE_REQUIRED_OR_REASON_INSUFFICIENT)DEPENDENCY_CYCLE_OR_SERIAL_ONLY_COLLISIONREPLACEMENT_PR_FAILEDPOST_MERGE_SMOKE_FAILED>   HOLDWAIT	CRITICAL7FAIL_CLOSEDREPLACEMENT_REQUIREDMERGE_CANDIDATE_READYc                     t         j                  j                  t         j                  j                        j                  d      S )Nz%Y-%m-%dT%H:%M:%SZ)_dtdatetimenowtimezoneutcstrftime     G/home/jay/workspace/scripts/run_auto_pr_merge_readiness_dry_run_2609.py_utcnowr7   `   s-    <<CLL,,-667KLLr5   c            
        dg ddd} t         D ]  }t        |z  }||j                         d}|j                         s)d| d<   d| d<   d |d<   g |d	<   | d
   j                  |       Y|j	                         }t        j                  |      j                         |d<   t        |      |d<   g }	 t        j                  |j                  dd      |      }t        j                  |      D ch c]G  }t        |t        j                  t        j                  t        j                   f      r|j"                  I }}t$        j'                  |g       }	|	D 
cg c]	  }
|
|v s|
 }}
|	|d<   ||d	<   t)        |      t)        |	      k7  rd| d<   | d
   j                  |        | S c c}w c c}
w # t*        $ r}t-        |      |d<   d| d<   Y d }~Dd }~ww xY w)Nz9read-only byte-0 (sha256 + ast.parse, no exec/import/net)T)modemodulesall_presentall_symbols_ok)pathpresentFr;   r<   sha256symbols_foundr:   bytesutf-8replace)filenamesymbols_expected	ast_error)CONSUME_MODULES	REPO_ROOTis_fileappend
read_byteshashlibr?   	hexdigestlenastparsedecodewalk
isinstanceFunctionDefAsyncFunctionDefClassDefnameEXPECTED_SYMBOLSgetsetSyntaxErrorstr)outrelprecrawfoundtreennameswantedses               r6   consume_modules_readonlyri   e   s   NGC #Oqyy{3yy{!&C$)C ! CM#%C 	N!!#&llns+557H3xG	*99SZZ;cJD%(XXd^ ^"1s8L8Lcll&[\ VV ^E ^%))#r2F &51!u*Q5E5&,C"##(C 5zS[((-$% 	Ic"7#8 J^ 6
  	*"1vC$)C !	*s=   .>F-,AF#8F-	F(F("(F-#
F--	G6GGc           	        | t        t        j                        n
t        |       } | j                  dd      xs d}t	        |      }|j                  d      rd}d}n!|j                  d      rd}d}n|rd}d	}nd
}d}dD cg c]  }| j                  |      r| }}|||r4t        j                  |j                               j                         d d nd ||dk(  |dk(  xs t	        |      |ddS c c}w )NBOT_GITHUB_TOKEN ghs_GITHUB_APP_INSTALLATION_TOKEN)ghp_github_pat_gho_	OWNER_PATpatUNKNOWNotherABSENTnone)rr   	PAT_TOKEN
GITHUB_PAT   F)bot_token_presentprefix_classfingerprint_sha256_8classified_sourceis_ghs_app_tokenowner_pat_detectedowner_pat_env_names_setraw_exposed)
dictosenvironrY   bool
startswithrL   r?   encoderM   )envtokr>   sourcer|   kowner_pat_env_namess          r6   redacted_token_preflightr      s   !k$rzz
tCyC
''$b
)
/RC3iG
~~f0	7	8	&N *!ggaj  * * %$$' ")

!=!G!G!I"1!M-1#"&EE$3Pt<O7P#6
 
*s   C3c                >   t        | j                  dd            t        | j                  dd            t        | j                  dd            dk(  t        | j                  dd             t        | j                  dd            xr t        | j                  d	d             t        | j                  d
d             t        | j                  dd            t        | j                  dd            dk(  t        | j                  dd            dk(  t        | j                  dd            t        | j                  dd            dk(  t        | j                  dd             t        | j                  dd            t        | j                  dd            d}|S )z;Map a mock fixture's inputs onto the 14 boolean conditions.r   Tr   forbidden_path_countr   effective_diff_contaminationFr   dependency_cycleserial_only_collisionr   gemini_unresolved_countmerge_state_statusCLEANr   bot_token_sourcerl   rn   r   r   r   r   )r   rY   intr\   )inpcs     r6   evaluate_conditionsr      sf    377<67&*3773OQU+V&W"377+A1#EF!KSWW;UCDD!%cgg.Dd&K!L "R)-cgg6H%.P)Q%QSWW4e<==sww'7>?"%cgg.G&K"LPQ"Q )=w!GHGS#CGG,A4$HI*B/04SS$(1Eu)M$N N6=>8$?@)	A, Hr5   c                `   | j                  di       }t        |      }g }d}d}|d   s	d|dgz   }}n|d   sd|dgz   }}||d   sd	t        }}|j                  d
       n|j                  d      s|j                  d      rd	t        }}|j                  d       n|j                  d      dk(  rd	t
        }}|j                  d       n[|j                  d      dk(  rd	t        }}|j                  d       n-|j                  d      dk(  rd	t        }}|j                  d       ||d   sd}|j                  d       ||d   s*|j                  d      dk(  rdnd}|j                  d       n|d   s(|j                  dd       d!v rd}|j                  d"       n]|d#   sd}|j                  d$       nD|d%   sd}|j                  d&       n+|d'   s&|j                  d      d(v rd}|j                  d)       |<|d*   s	d+|d,gz   }}n.|d-   s	d+|d.gz   }}n |d'   s|j                  d      d/v rd+|d0gz   }}|ht        |j                               rd1}|j                  d2       n;d}|j                         D cg c]
  \  }}|r	| }}}|j                  d3|        | j                  d4      | j                  d5      |t        |j                               |||| j                  d6      | j                  d7      || j                  d6      k(  xr || j                  d7      k(  d8
S c c}}w )9zResolve a mock fixture case to a dry-run verdict by safety precedence.

    Precedence (highest first): FAIL_CLOSED > CRITICAL7 > REPLACEMENT_REQUIRED
    > HOLD > WAIT > MERGE_CANDIDATE_READY.
    inputsNr   r*   zHEAD SHA lock mismatchr   zOWNER PAT detectedr   r)   zforbidden path > 0r   r   z(dependency cycle / serial_only collisionreplacement_pr_outcomefailurezreplacement PR failurepost_merge_smoke_outcomefailzpost-merge smoke failuregemini_severityreal_bugz(Gemini real bug requires scope expansionr   r+   u4   effective diff contamination → replacement PR pathr   successr'   u5   expected_files mismatch → HOLD/REPLACEMENT_REQUIREDr   r   rl   )rl   rv   u   BOT token absent → HOLDr   u!   post-merge smoke missing → HOLDr   u#   reconcile evidence missing → HOLDr   )highcriticalu(   Gemini unresolved high/critical → HOLDr   r(   u   CI not green → WAITr   u!   mergeStateStatus≠CLEAN → WAIT)lowmediumNu%   Gemini unresolved low/medium → WAITr,   zall 14 conditions truezresidual failed conditions: idrW   expected_verdictexpected_critical7)
r   rW   
conditionsconditions_all_trueverdictcritical7_typereasonsr   r   match)rY   r   C7_FORBIDDEN_PATHrJ   C7_DEP_CYCLEC7_REPLACEMENT_FAILEDC7_SMOKE_FAILEDC7_GEMINI_REAL_BUGallvaluesitems)	caser   condr   r   	critical7r   vfaileds	            r6   
judge_caser      s    ((8R
 Cs#DGGI %&('5M4N*N()('5I4J*J )*!,.?YGNN/0WW'(CGG4K,L!,lYGNNEFWW-.);!,.CYGNN34WW/0F:!,oYGNN56WW&':5!,.@YGNNEF t$GH(MN 0103(1*-617,<B NNRS,-#''"B3(+93:GNN6734GNN>?56GNN@A./CGG!5#&:5;GNNEF $%%w2I1J'JWG)*%w2U1V'VWG./CGG!5#&=5>%w2Y1Z'ZWG t{{}-GNN34G$(JJL:DAqa:F:NN9&BC hhtn "4;;=1# HH%78"hh';<TXX&899 B488,@#AA  ;s   <
L*L*c                     t        t              j                  d      } g d}g }|D ](  }| j                  |      dkD  s|j	                  |       * ||| dS )u   Static self-audit: this module must not reference any GitHub/git write.

    Scans its own source for forbidden write tokens. Any hit = the engine
    would be capable of a live mutation → fail closed.
    rB   encoding)
zgh pr mergezgh pr createzgit pushz
git commitz	git mergezgit branch -z--no-dry-runzsubprocess.runzsubprocess.Popenz	os.systemr   )forbidden_tokens_scanned
violationsno_live_write_surface)r   __file__	read_textcountrJ   )src	forbiddenhitsr   s       r6   assert_no_live_write_surfacer   %  sm     x.
"
"G
"
4C2I
 D  99S>AKK	
 )2)-X/ /r5   c                   t         dz  }t        j                  |j                  d            d   }|D cg c]  }t	        |       }}t               }t               }t               }t        d |D              }t        d |D        d       }	t        |	xr |	d   dk(        }
|d	   xr |d
   }|d    }|xr |xr |d   xr
 |xr |d    }| xr t        d |D              }i dddddddt               ddd|d|d|
d|
dt        t              dt        |      d|d|d|d   d d!d"d#d$|xr |
xr | d%d&i}| rt        |||||       |||||d'S c c}w )(Nz.memory/fixtures/task-2609.critical7-cases.jsonrB   r   casesc              3  &   K   | ]	  }|d      yw)r   Nr4   .0rs     r6   	<genexpr>zrun.<locals>.<genexpr>D  s     01AgJ0s   c              3  0   K   | ]  }|d    dk(  r|  yw)rW   
all14_trueNr4   r   s     r6   r   zrun.<locals>.<genexpr>E  s#      5QF)|3  5s   r   r,   r;   r<   r   r   r   c              3  :   K   | ]  }|d    dv xr |d      yw)r   )r*   r)   r   Nr4   r   s     r6   r   zrun.<locals>.<genexpr>O  s0      . 	
)44GQwZG.s   task	task-2609trackFtitle#AUTO_PR_AND_MERGE_READINESS_DRY_RUNgenerated_atr9   u2   read-only · dry-run · proposal-only · mock-only
track_passhold_for_chairauto_pr_creation_readinessauto_merge_readinessconditions_countregression_countregression_all_matchconsume_byte0_okowner_pat_usedFreal_write_or_merge_attemptsr   -next_step_limited_live_pr_open_pilot_possibleauthority_noteua   readiness/proposal-only — Track F PASS confers NO automatic real PR/merge permission (§8/§10))summaryresultsconsumetoken_preflightwrite_guard)rH   jsonloadsr   r   ri   r   r   r   nextr   anyr7   rN   CONDITION_KEYS_emit_artifacts)emitfixture_pathr   r   r   r   token_pfr   	all_match
ready_caseauto_pr_ready
consume_okno_owner_patr   r   r   s                   r6   runr   <  sU   OOLJJ|--w-?@IE&+,z!},G,&(G')H.0K000I 5' 56:<J 4
9(=3)4 5M'EG4D,EJ 455L C
 C{;R/S C"C+3M+B'B  %n # .. +N 	6 			
 	D 	j 	. 	%m 	 	C/ 	CJ 		 	J 	 -D!E 	%  	'!" 	8?=?-?%& 	 N'G. '8[I78&( ([ -s   E c                    t         | z  }|j                  j                  dd       |j                  t	        j
                  |dd      dz   d       y )	NT)parentsexist_okF   ensure_asciiindent
rB   r   )rH   parentmkdir
write_textr   dumps)r^   objr_   s      r6   _wr  q  sG    CAHHNN4$N/LLCeA>E!  #r5   c                *   d| d   t         |D cg c]  }|d   |d   |d   |d   |d   d c}d	}dd
|D cg c]  }|d   |d   |d   d   |d   d c}dd}dd
|D cg c]  }|d   |d   |d   d   |d   d   |d   d! c}dd}|D cg c]  }|d   dv s| }	}d|	D cg c]  }|d   |d   |d   |d   |d   |d   d c}d}
dd| d   rdn| d   rdnd| d   | d   | d    d
d!| d"   d#d
d$}dd| d   rd%n| d   rdnd&| ||||d'}t        d(|       t        d)|       t        d*|       t        d+|
       t        d,|       t        d-|       t        d.|       t        d/|       t        d0|       y c c}w c c}w c c}w c c}w c c}w )1Nr   r   r   rW   r   r   r   )r   rW   r   r   r   )r   r   r   per_caseTr   )r   rW   r   r   u.   no gh/git call — fixture-driven dry-run only)r   dry_runqueue_head_evaluationnoter   r   )r   rW   smoke_configuredreconcile_configuredr   zYpost_merge_smoke_runner / run_post_merge_reconcile_closeout consumed byte-0; no execution)r   r  post_merge_smoker  )r)   r*   r   r   )r   rW   r   r   expectedr   )r   critical7_and_fail_closed_casesr   r   TRACK_F_PASSr   HOLD_FOR_CHAIRTRACK_F_FAILr   r   Fr   z$independent ANU key c119085addb0f8b7)r   r   decisionr   auto_pr_readinessr   proposal_only confers_real_pr_merge_permissionr   callback_owner executor_self_callback_forbiddenPASSFAIL)r   r   statusr   regression_resultsconsume_byte0bot_token_redacted_preflightr   z.memory/events/task-2609.merge_gate_matrix.jsonz/memory/events/task-2609.queue_head_dry_run.jsonz?memory/events/task-2609.post_merge_smoke_reconcile_dry_run.jsonz>memory/events/task-2609.critical7_failure_fixture_results.jsonz9memory/events/task-2609.bot_token_redacted_preflight.jsonz;memory/events/task-2609.auto_pr_merge_readiness.result.jsonz=memory/events/task-2609.auto_pr_merge_readiness.decision.jsonz#memory/events/task-2609.result.jsonz%memory/events/task-2609.decision.json)r   r  )r   r   r   r   r   r   matrixr   smoke_reconc7
c7_fixturer  
result_docs                r6   r   r   x  s   !7>3J*
 %,	-  !	 #$D'1V9*+L/'(|./0@.AC -.F &! :A,B 56 tWai%&|_\%B"#I,0,B KLJ '4 ;B(C 67  gqylO,IJlO,KL#$Y<1(C*
+K 	M)0L L!	MB	M% 6869
 12	 tWai"#I,)*+;)<#$%7#8 !'
	,69:J c'.|'<^/67G/H+ ./$%AB '(> ?,1CD@,0H  c#L1& '(8 9v% (0!,	J 7@8*EHGBHMDF,j9.9K-,B(C 
N69s"   E<
F!$FFF'"Fc                \   t        j                  d      }|j                  ddd       |j                  ddd       |j                  |       }t	        |j
                  	      }|j                  s|j
                  s$t        t        j                  |d
   dd             |d
   d   rdS dS )Nztask-2609 Track F dry-run)descriptionz--emit
store_truez'write task-2609.* allowlisted artifacts)actionhelpz--jsonzprint summary json to stdout)r   r   Fr  r  r   r   r   )	argparseArgumentParseradd_argument
parse_argsr   r   r   printr	  )argvapargsr]   s       r6   mainr7    s    		 	 -H	IBOOH\B  DOOH\7  9==D
499
Cyy		djjYeAFGI|,13!3r5   __main__)returnr\   )r9  r   )N)r   r   r9  r   )r   r   r9  r   )r   r   r9  r   )r^   r\   r9  None)r9  r   )'__doc__
__future__r   r/  rO   r/   r.   rL   r   r   pathlibr   r   resolver   rH   rG   rX   r   r   C7_REPLACEMENT_CONTAMINATEDr   C7_BLOCK_OVERRIDEr   r   r   VERDICTSr7   ri   r   r   r   r   r   r  r   r7  __name__
SystemExitr4   r5   r6   <module>rD     s  " #  
    	 N""$,,Q/	 '45R%S'<&=)?(@$;#<%A$B.=->%/L&>%?5@M'6&7 $ / Y ? D :/ +M
F@6^D/.2(j#H:V
4 z
TV
 r5   