
    j&                    `   d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlmZmZmZ ddlmZ ddlmZmZ ddlmZmZmZmZmZmZmZmZmZmZ ddlmZm Z m!Z!m"Z"  ee#      jI                         jJ                  jJ                  d	z  d
z  Z& e ed            Z'ddZ(d Z)d Z*d Z+d Z,d Z-d Z.y)u   tests.regression.test_real_merge_inert_pass_path — task-2637.

pass path 에서도 실 GitHub 호출 0 + artifact 4종 (3 writer + 1 schema) 정합 단언.

Spec: memory/specs/system_real_merge_executor_wiring_spec_260523.md §5 / §7
    )annotationsN)datetime	timedeltatimezone)Path)AnyList)
EXECUTION_RESULT_FILENAMEEXECUTION_RESULT_SCHEMAMERGE_DECISION_FILENAMEMERGE_DECISION_SCHEMAPOST_SMOKE_SCHEMAPRE_GATE_SNAPSHOT_FILENAMEPRE_GATE_SNAPSHOT_SCHEMAREAL_MERGE_EVENTS_RELDIRresolve_artifact_dirvalidate_post_smoke_payload)FORBIDDEN_PATHSNO_OP_FORBIDDEN_PATHREAL_MERGE_DONEreal_merge_executefixturesreal_merge_wiring	   )hoursc                :    t        j                  | d      fdS )Nz%Y-%m-%dT%H:%M:%S%zc                      S N )dts   G/home/jay/workspace/tests/regression/test_real_merge_inert_pass_path.py<lambda>z_clock_at.<locals>.<lambda>+   s    2     )r   strptime)textr    s    @r!   	_clock_atr&   )   s    			4!6	7Br#   c                     t         dz  } t        j                  | dz  j                  d            }t        j                  | dz  j                  d            }||fS )Npass_path_inert_artifact_onlyzevidence.jsonzutf-8)encodingzexpected.json)FIXTURE_ROOTjsonloads	read_text)baseevidenceexpecteds      r!   _load_pass_fixturer1   .   sZ    99Dzz4/1<<g<NOHzz4/1<<g<NOHXr#   c                |    t               \  }}t        |d         }t        |       }g  dJ fd}t        |d   |d   |d   |d   |d   |d   d	d ||d
   |      }|d   }|t        k(  }|d   }	t        |	k(  }
|r|
st        j                  d||
fd|t        |	f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |	      dz  }dd|iz  }t        t        j                  |            d x}x}x}
}	|d   d   }d	}
||
u }|slt        j                  d|fd||
f      t        j                  |      t        j                  |
      dz  }dd|iz  }t        t        j                  |            d x}x}}
|d   }g }
||
k(  }|slt        j                  d|fd||
f      t        j                  |      t        j                  |
      dz  }dd|iz  }t        t        j                  |            d x}x}}
g } |k(  }|st        j                  d|fd |f      dt        j                         v st        j                         rt        j                         ndt        j                  |      dz  }d d!|iz  }t        t        j                  |            d x}}|d"   }d#}
||
u }|slt        j                  d|fd||
f      t        j                  |      t        j                  |
      dz  }dd|iz  }t        t        j                  |            d x}x}}
|d   d$   }|d   d%   }t        t        |||            }|j                  } |       }
|
sd&d't        j                         v st        j                  |      rt        j                  |      nd't        j                  |      t        j                  |
      d(z  }t        t        j                  |            d x}}
|t         z  }|j"                  }
 |
       }	|	sd)d't        j                         v st        j                  |      rt        j                  |      nd'd*t        j                         v st        j                  t               rt        j                  t               nd*t        j                  |
      t        j                  |	      d+z  }t        t        j                  |            d x}x}
}	|t$        z  }|j"                  }
 |
       }	|	sd)d't        j                         v st        j                  |      rt        j                  |      nd'd,t        j                         v st        j                  t$              rt        j                  t$              nd,t        j                  |
      t        j                  |	      d+z  }t        t        j                  |            d x}x}
}	|t&        z  }|j"                  }
 |
       }	|	sd)d't        j                         v st        j                  |      rt        j                  |      nd'd-t        j                         v st        j                  t&              rt        j                  t&              nd-t        j                  |
      t        j                  |	      d+z  }t        t        j                  |            d x}x}
}	t)        j*                  |t         z  j-                               }t)        j*                  |t$        z  j-                               }t)        j*                  |t&        z  j-                               }|d.   }|t.        k(  }|st        j                  d|fd/|t.        f      t        j                  |      d0t        j                         v st        j                  t.              rt        j                  t.              nd0d1z  }d d!|iz  }t        t        j                  |            d x}}|d.   }|t0        k(  }|st        j                  d|fd/|t0        f      t        j                  |      d2t        j                         v st        j                  t0              rt        j                  t0              nd2d1z  }d d!|iz  }t        t        j                  |            d x}}|d.   }|t2        k(  }|st        j                  d|fd/|t2        f      t        j                  |      d3t        j                         v st        j                  t2              rt        j                  t2              nd3d1z  }d d!|iz  }t        t        j                  |            d x}}|d4   }d	}
||
u }|slt        j                  d|fd||
f      t        j                  |      t        j                  |
      dz  }dd|iz  }t        t        j                  |            d x}x}}
|d5   }d#}
||
u }|slt        j                  d|fd||
f      t        j                  |      t        j                  |
      dz  }dd|iz  }t        t        j                  |            d x}x}}
|d   }g }
||
k(  }|slt        j                  d|fd||
f      t        j                  |      t        j                  |
      dz  }dd|iz  }t        t        j                  |            d x}x}}
d6}|j4                  }d7}d8} |||      }|j6                  } |       }||v }|st        j                  d9|fd:||f      t        j                  |      d;t        j                         v st        j                  |      rt        j                  |      nd;t        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      d<z  }d=d>|iz  }t        t        j                  |            d x}x}x}x}x}x}x}}t8        d?d@dAd@dBd	dCgd	dD}t;        |      }g }	||	k(  }|st        j                  d|fdE||	f      dFt        j                         v st        j                  t:              rt        j                  t:              ndFdGt        j                         v st        j                  |      rt        j                  |      ndGt        j                  |      t        j                  |	      dHz  }dd|iz  }t        t        j                  |            d x}x}}	|dI   }d	}
||
u }|slt        j                  d|fd||
f      t        j                  |      t        j                  |
      dz  }dd|iz  }t        t        j                  |            d x}x}}
y )KNfrozen_now_kstc                 @    j                  | |f       t        d      )Nz8subprocess_runner must not be invoked on inert pass path)appendAssertionError)argskwargs
seen_callss     r!   trapzGtest_pass_path_writes_three_artifacts_and_zero_subprocess.<locals>.trap<   s!    4.)WXXr#   merge_ready_resultpr_identitygate_snapshotdryrun_artifactcallback_envelopechair_authorizationTchanged_filesr;   r<   r=   r>   r?   r@   activation_flagsubprocess_runnercanonical_rootrA   clockresult_enum)==rH   )%(py1)s == %(py4)sz%(py4)s == %(py6)sr   )py1py4py6zassert %(py8)spy8decisionactually_executedisz%(py1)s is %(py4)srJ   rK   assert %(py6)srL   subprocess_invocationsrH   rI   )z%(py0)s == %(py3)sr9   )py0py3assert %(py5)spy5chair_report_requiredFprhead_shazAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_dir
}()
}artifact_dir)rX   py2rK   zNassert %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = (%(py0)s / %(py1)s).is_file
}()
}r   )rX   rJ   rK   rL   r   r
   schemaz%(py1)s == %(py3)sr   rJ   rY   r   r   	non_adminadmin_override_usedinertnote in)z%(py1)s in %(py15)s
{%(py15)s = %(py13)s
{%(py13)s = %(py11)s
{%(py11)s = %(py5)s
{%(py5)s = %(py3)s.get
}(%(py7)s, %(py9)s)
}.lower
}()
}	execution)rJ   rY   r[   py7py9py11py13py15zassert %(py17)spy17z2026-05-23T12:05:00+09:00(deadbeef00000000000000000000000000abcdef(88a1f2b0a0141b4d4aed7fb3bcd6b9cba54d78b9main_fetch_ff)nameok)ra   ts_kstmerge_commit_shaorigin_main_beforeorigin_main_aftersmoke_checksall_ok)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr   post)rX   rJ   rY   rL   post_smoke_schema_validates)r7   r   r8   r   returnr   )r1   r&   strr   r   
@pytest_ar_call_reprcompare	_saferepr@py_builtinslocals_should_repr_global_namer6   _format_explanationr   r   is_dirr   is_filer   r
   r+   r,   r-   r   r   r   getlowerr   r   )!tmp_pathr/   r0   rF   rE   r:   out@py_assert0@py_assert2@py_assert5@py_assert3@py_format7@py_format9@py_format5@py_assert1@py_format4@py_format6r]   r^   r_   rN   snapshotrk   @py_assert4@py_assert6@py_assert8@py_assert10@py_assert12@py_assert14@py_format16@py_format18r}   r9   s!                                   @r!   9test_pass_path_writes_three_artifacts_and_zero_subprocessr   5   s   +-Hhh/01E]NJY #$89]+/ !23"#67$%:;%/C }KKKH]4KK4KKKKKK4KKKKKKKKKKKKKKKK4KKKKKKKKz?./747/47777/4777/77747777777'(.B.(B....(B...(...B.......::::&'050'50000'5000'00050000000 
-	 	&B&z2H,R>JKL         <   <             22=2;;=;========L===L======2===2===;==========55@5>>@>@@@@@@@@L@@@L@@@@@@5@@@5@@@>@@@@@@@@@@44?4==?=????????L???L??????4???4???=?????????? zz<*AALLNOHzz<*DDOOQRH

L+DDOOQRIH6!66666!6666666666!6666!66666666H9!99999!9999999999!9999!99999999X9"99999"9999999999"9999"99999999[!)T)!T))))!T)))!)))T)))))))*+4u4+u4444+u444+444u4444444-.4"4."4444."444.444"44444447imm7F7B7mFB/7/557577777777777777777777i777i777m777F777B777/7775777777777777
 $-FHG"1>?D 't,22,2222,222222&222&222222t222t222,222222222212:d:2d::::2d:::2:::d:::::::r#   c                Z   t               \  }}t        |d         }t        |       }t        |d   |d   |d   |d   |d   |d   dd	||d
   |      }|d   d   }|d   d   }t        j
                  j                  t        j
                  j                  |t        d| |            }|d   }	|	j                  }
 |
|      }|sdt        j                  |	      t        j                  |
      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                   |            d	x}	x}
}|d   }	|	j                  }
 |
|      }|sdt        j                  |	      t        j                  |
      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                   |            d	x}	x}
}y	)zMArtifact directory must match memory/events/real_merge/pr_<pr>/<sha>/ layout.r3   r;   r<   r=   r>   r?   r@   TNrA   rB   r]   r^   pr_merge_decision_pathzLassert %(py6)s
{%(py6)s = %(py3)s
{%(py3)s = %(py1)s.startswith
}(%(py4)s)
}expected_dir)rJ   rY   rK   rL   execution_result_path)r1   r&   r   r   ospathnormpathjoinr   
startswithr   r   r   r   r   r6   r   )r   r/   _rF   rE   r   r]   r^   r   r   r   r   r   s                r!   $test_pass_path_canonical_root_layoutr   z   s   $&KHah/01E]N
#$89]+/ !23"#67$%:;%/C 
-	 	&B&z2H77##
^%=RDz8TL $%>%00>0>>>>>%>>>0>>>>>>>>>>>>>>>>>>>&'@'22@2<@@@@@'@@@2@@@@@@<@@@<@@@@@@@@@@r#   c                n   t               \  }}t        |d         }t        |       }t        |d   |d   |d   |d   |d   |d   dd	||d
   |      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }dd|iz  }	t        t        j                  |	            d	x}}t        |d   |d   |d   |d   |d   |d   dd	||d
   |      }
|
d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}|
d   }g }||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}y	)u?   Second invocation with same (pr, head_sha) → NO_OP_DUPLICATE.r3   r;   r<   r=   r>   r?   r@   TNrA   rB   rG   rV   rb   r   rc   rZ   r[   NO_OP_DUPLICATErW   rS   rT   rL   rU   )r1   r&   r   r   r   r   r   r   r   r   r   r6   r   )r   r/   r   rF   rE   firstr   r   r   r   secondr   r   r   s                 r!   test_dedupe_no_double_merger      s   $&KHah/01E]N#$89]+/ !23"#67$%:;%/E 2?2222?222222222?222?2222222#$89]+/ !23"#67$%:;%/F - 5$55 $55555 $5555 555$55555555*+1r1+r1111+r111+111r1111111r#   c                F   t               \  }}t        |d         }t        |       }t        |d         t        d   gz   }t        |d   |d   |d   |d   |d   |d	   d
d|||      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }	dd|	iz  }
t        t        j                  |
            dx}}|d   }d
}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   }g }||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|d   d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)uR   changed_files contains any forbidden path → NO_OP_FORBIDDEN_PATH + CHAIR_REPORT.r3   rA   r   r;   r<   r=   r>   r?   r@   TNrB   rG   rV   rb   r   rc   rZ   r[   r\   rP   rR   rS   rT   rL   rU   rW   rN   rO   F)r1   r&   r   listr   r   r   r   r   r   r   r   r   r6   r   )r   r/   r   rF   rE   contaminatedr   r   r   r   r   r   r   r   s                 r!   2test_forbidden_path_short_circuits_before_any_gater      s   $&KHah/01E]N12oa6H5IIL
#$89]+/ !23"#67$%:;%"C }5!55555!5555555555!5555!55555555&'/4/'4////'4///'///4///////'(.B.(B....(B...(...B.......z?./858/58888/5888/88858888888r#   c                H	   t               \  }}t        |d         }t        |       }g  G d d      d'fd}t        |d   |d   |d   |d   |d	   |d
   d|||d   |      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }	dd|	iz  }
t        t        j                  |
            dx}}|d   }t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}}d   }d}||v}|st        j                  d|fd ||f      t        j                  |      d!t        j                         v st        j                  |      rt        j                  |      nd!dz  }	dd|	iz  }
t        t        j                  |
            dx}}d"}||v}|st        j                  d|fd ||f      t        j                  |      d!t        j                         v st        j                  |      rt        j                  |      nd!dz  }	dd|	iz  }
t        t        j                  |
            dx}}d#}||v }|st        j                  d$|fd%||f      t        j                  |      d!t        j                         v st        j                  |      rt        j                  |      nd!dz  }	dd|	iz  }
t        t        j                  |
            dx}}d&}||v }|st        j                  d$|fd%||f      t        j                  |      d!t        j                         v st        j                  |      rt        j                  |      nd!dz  }	dd|	iz  }
t        t        j                  |
            dx}}y)(zzWhen a mock runner IS provided + rc=0, REAL_MERGE_DONE records argv with
    NO admin override tokens (--admin / --force).r3   c                      e Zd ZdZdZdZy)Qtest_mock_runner_pass_path_records_invocation_zero_admin_tokens.<locals>.FakeProcr   rv   rh   N)__name__
__module____qualname__
returncodestdoutstderrr   r#   r!   FakeProcr      s    
r#   r   c                F    j                  t        |                      S r   )r5   r   )argvtimeoutr   captureds     r!   fake_runnerzTtest_mock_runner_pass_path_records_invocation_zero_admin_tokens.<locals>.fake_runner   s    T
#zr#   r;   r<   r=   r>   r?   r@   TrA   rB   rG   rV   rb   r   rc   rZ   r[   NrU      )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)slen)rX   r`   rK   rl   zassert %(py9)srm   r   z--admin)not in)z%(py1)s not in %(py3)scomposedz--forcez--mergeri   )z%(py1)s in %(py3)sz--delete-branch=false)r   z	List[str]r   intr   r   )r1   r&   r   r   r   r   r   r   r   r   r   r6   r   r   )r   r/   r   rF   rE   r   r   r   r   r   r   r   r   r   r   @py_format8@py_format10r   r   r   s                     @@r!   ?test_mock_runner_pass_path_records_invocation_zero_admin_tokensr      s    %&KHah/01E]N "H 
 #$89]+/ !23"#67$%:;%%/C }000000000000000000000000+,23,-22-2222-22222232223222,222-2222222222{H$9H$$$$9H$$$9$$$$$$H$$$H$$$$$$$$9H$$$$9H$$$9$$$$$$H$$$H$$$$$$$ 9    9   9                "."h...."h..."......h...h.......r#   )r%   r   )/__doc__
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   r+   r   r   r   r   pathlibr   typingr   r	    utils.real_merge_artifact_schemar
   r   r   r   r   r   r   r   r   r   utils.real_merge_hooksr   r   r   r   __file__resolveparentr*   KSTr&   r1   r   r   r   r   r   r   r#   r!   <module>r      s    #    	 2 2      	N##**Z7:MM  yq!"
B;JA8#2L96&/r#   