
    9j4&                       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
mZ ddlZ ee      j                         j                  d   dz  Zedz  Zedz  Zd	Zd
ZdZdZdZdZdZd dZd dZd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$ejJ                  jM                  dg d      d        Z'ejJ                  jM                  dg d      d        Z(y)!u  anu_v2.tests.test_owner_trigger_201_capability_first_practical_use — task-2557 §Test-2.

회장 §명시 2026-05-12 Track C Rank 1 1:1 박제:
  PR #107 attempt-5 raw 201 evidence (``owner_trigger_201_capability_first_practical_use.json``)
  + attempt-4↔attempt-5 페어 (``owner_trigger_permission_update_no_regen.json``) cross-fixture
  회귀로 capability 첫 실용 활용 사례를 영구 catch.

회귀 catch 6 종:
  1. evidence schema = ``anu_v2.owner_trigger_evidence.owner-trigger-posted.v1``
  2. POST 201 + ``comment_user_login == "JonghyukJeon"`` + comment_id 박제
  3. ``capability_first_practical_use=True`` evidence_source 어셀션
  4. ``owner_manual_input_count=0`` evidence_source 어셀션
  5. cross-fixture: ``token_hash_changed_from_attempt_4 == false`` (fixture 3)
  6. permission_added: ``pull_requests=write`` 1 건 (fixture 3)

본 test 는 fixture 기반 evidence 회귀만 수행 (owner_trigger_only / executor_scheduler 모듈 코드
변경 0 — 회장 §명시 task-2557 금지 12 #12 1:1).
    )annotationsN)Path   fixturesz5owner_trigger_201_capability_first_practical_use.jsonz-owner_trigger_permission_update_no_regen.jsonz5anu_v2.owner_trigger_evidence.owner-trigger-posted.v1z;anu_v2.owner_trigger_evidence.permission-update-no-regen.v1JonghyukJeonl   Kq a9e05574z6/repos/Jeon-Jonghyuk/dev_workspace/issues/107/comments(e03f536ad7ad626f1a2afca080d1952588f53a71c                 T    t        j                  t        j                  d            S Nzutf-8)encoding)jsonloadsFIXTURE_POSTED	read_text     Y/home/jay/workspace/anu_v2/tests/test_owner_trigger_201_capability_first_practical_use.py_load_postedr   ,   s    ::n...@AAr   c                 T    t        j                  t        j                  d            S r   )r   r   FIXTURE_PAIRr   r   r   r   
_load_pairr   0   s    ::l,,g,>??r   c                    t               } | 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
}||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}||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}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}| 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        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}||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}||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}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}| 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}
}	y)'u?   fixture 2 의 schema 가 owner-trigger-posted.v1 임을 박제.schema==z%(py1)s == %(py3)sEXPECTED_POSTED_SCHEMApy1py3assert %(py5)spy5Nhttp_status   z%(py1)s == %(py4)sr   py4assert %(py6)spy6prk   attempt   headEXPECTED_HEADendpointEXPECTED_ENDPOINTmethodPOSTtoken_value_loggedFisz%(py1)s is %(py4)stoken_presentTtoken_hash_prefixEXPECTED_TOKEN_HASH_PREFIX   z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)slenpy0py2r'   py7assert %(py9)spy9)r   r   
@pytest_ar_call_reprcompare	_saferepr@py_builtinslocals_should_repr_global_nameAssertionError_format_explanationr/   r1   r:   r=   )fx@py_assert0@py_assert2@py_format4@py_format6@py_assert3@py_format5@py_format7@py_assert1@py_assert6@py_assert5@py_format8@py_format10s                r   =test_fixture_loads_and_schema_matches_owner_trigger_posted_v1rY   7   s   	Bh<1<11111<1111<111111111111111111m###################d8s8s?8s8si=A=A=A=Af:&:&&&&:&&&:&&&&&&&&&&&&&&&&j>.>.....>....>..................h<!6!<6!!!!<6!!!<!!!6!!!!!!!"#,u,#u,,,,#u,,,#,,,u,,,,,,,o&$&$&&&&$&&&&&&$&&&&&&&!"@"&@@@@@"&@@@@"@@@@@@&@@@@&@@@@@@@@%&,3&',1,'1,,,,'1,,,,,,3,,,3,,,&,,,',,,1,,,,,,,r   c                 `   t               } | 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	   }|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        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}||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}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            dx}x}}dt         }| d   }||k(  }|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)uX   POST 201 응답에서 comment_user_login == 'JonghyukJeon' (owner 본인 계정) 박제.r#   r$   r   r%   r&   r(   r)   Ncomment_user_loginr   EXPECTED_COMMENT_USERr   r!   r"   
comment_idEXPECTED_COMMENT_IDcomment_author_associationMEMBERcomment_bodyz/gemini reviewzEhttps://github.com/Jeon-Jonghyuk/dev_workspace/pull/107#issuecomment-comment_html_urlexpected_html)r   rD   rE   rF   rJ   rK   r\   rG   rH   rI   r^   )	rL   rM   rQ   rN   rR   rS   rO   rP   rc   s	            r   >test_post_201_comment_user_login_is_jonghyukjeon_owner_accountrd   H   s?   	Bm###################"#<#'<<<<<#'<<<<#<<<<<<'<<<<'<<<<<<<<l2222222222222222222222222222*+7x7+x7777+x777+777x7777777n1!11!11111!1111111!11111111[\o[pqM !2!]2222!]222!222222]222]2222222r   c                     t               } | 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}||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}||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?   evidence_source 에 capability_first_practical_use=True 박제.capability_first_practical_useTr5   r7   r&   r(   r)   Nevidence_sourcerunner_direct_invocation_countr   r   r%   r   rD   rE   rF   rJ   rK   rL   rM   rQ   rN   rR   rS   s         r   8test_evidence_source_capability_first_practical_use_truerk   T   s   	B./747/47777/4777/77747777777 !ABJdJBdJJJJBdJJJBJJJdJJJJJJJ !ABGaGBaGGGGBaGGGBGGGaGGGGGGGr   c                 $   t               } | 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	   }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
   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
   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}}y)u]   evidence_source 에 owner_manual_input_count=0 박제 — 회장 수동 /gemini review 0 건.owner_manual_input_countr   r   r%   r&   r(   r)   N(owner_manual_gemini_review_comment_countrg   bot_gemini_review_attempt_countri   rj   s         r   2test_evidence_source_owner_manual_input_count_zerorp   \   sa   	B().Q.)Q....)Q...)...Q.......89>Q>9Q>>>>9Q>>>9>>>Q>>>>>>> !;<AA<AAAA<AAA<AAAAAAAAAA !BCHqHCqHHHHCqHHHCHHHqHHHHHHHr   c                    t               } | 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
   }|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}||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}||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}||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}||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}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            d	x}x}}y	)uM   downstream evidence — Gemini fresh 도착 + BOT squash merge 완결 박제.
downstreamgemini_review_idl   M6} r   r%   r&   r(   r)   Ngemini_review_commit_idr   r/   r   r!   r"   gemini_review_state	COMMENTEDci_11_checks_statusSUCCESSmerge_state_statusCLEAN	merged_byzapp/jeon-jonghyuk-taskctl-botmerge_commit(696ab9c8b15ff135e1e358130ec118316f7fbc6d)
r   rD   rE   rF   rJ   rK   r/   rG   rH   rI   )	rL   rr   rM   rQ   rN   rR   rS   rO   rP   s	            r   1test_downstream_gemini_fresh_and_bot_squash_merger~   f   sm   	BL!J()7Z7)Z7777)Z777)777Z7777777/0A0MAAAA0MAAA0AAAAAAMAAAMAAAAAAA+,;;,;;;;,;;;,;;;;;;;;;;+,9	9,	9999,	999,999	9999999*+6w6+w6666+w666+666w6666666k"E&EE"&EEEEE"&EEEE"EEE&EEEEEEEEn%S)SS%)SSSSS%)SSSS%SSS)SSSSSSSSr   c                 2   t               } t               }| 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	   }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
}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|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   }|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   }|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   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   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}}y)uf   fixture 2 + fixture 3 cross-check — token_hash_prefix 변경 0 (regenerate 없이 권한만 추가).prior_attempt_hash_prefixr9   r   r%   r&   r(   r)   N!token_hash_changed_from_attempt_4Fr5   r7   token_regenerate_occurredr   r   EXPECTED_PAIR_SCHEMAr   r!   r"   token_hash_unchangedTtoken_hash_prefix_beforetoken_hash_prefix_afterr:   	attempt_4	attempt_5)r   r   rD   rE   rF   rJ   rK   r   rG   rH   rI   r:   )	postedpairrM   rQ   rN   rR   rS   rO   rP   s	            r   ;test_cross_fixture_token_hash_unchanged_from_attempt_4_to_5r   v   s   ^F<D -.M&9L2MM.2MMMMM.2MMMM.MMM2MMMMMMMM56?%?6%????6%???6???%???????-.7%7.%7777.%777.777%7777777 >1>11111>1111>111111111111111111&'/4/'4////'4///'///4///////*+Nt4M/NN+/NNNNN+/NNNN+NNN/NNNNNNNN*+I+/IIIII+/IIII+IIIIII/IIII/IIIIIIII+,55,5555,555,5555555555 01[T+5FGZ5[[15[[[[[15[[[[1[[[5[[[[[[[[01PV<O5PP15PPPPP15PPPP1PPP5PPPPPPPPr   c                    t               } | d   }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   }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}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            dx}x}}y)uE   fixture 3 — permission_added == [pull_requests=write] 1 건 박제.permission_addedzpull_requests=writer   r%   r&   r(   r)   Nr   r<   r=   r>   rB   rC   permission_methodgithub_owner_ui_token_edit)
r   rD   rE   rF   rJ   rK   r=   rG   rH   rI   )r   rM   rQ   rN   rR   rS   rT   rU   rV   rW   rX   s              r   ;test_pair_fixture_permission_added_pull_requests_write_onlyr      sC   <D"#>(='>>#'>>>>>#'>>>>#>>>'>>>>>>>>&'-3'(-A-(A----(A------3---3---'---(---A-------#$D(DD$(DDDDD$(DDDD$DDD(DDDDDDDDr   c                 B   t               } | 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   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   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   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   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   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   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}}y	)u8   fixture 3 — outcome transition FAILED→POSTED 박제.r   resultFAILEDr   r%   r&   r(   r)   Nr#   i  classificationTOKEN_SCOPE_MISMATCH_DIAGNOSEDr   POSTEDr$   expected_pair_assertionoutcome_transitionu   FAILED→POSTEDrn   r   )r   rD   rE   rF   rJ   rK   )r   rM   rQ   rN   rR   rS   s         r   5test_pair_fixture_outcome_transition_failed_to_postedr      s{   <DX&2(2&(2222&(222&222(2222222]+2s2+s2222+s222+222s2222222-.R2RR.2RRRRR.2RRRR.RRR2RRRRRRRRX&2(2&(2222&(222&222(2222222]+2s2+s2222+s222+222s2222222)*+?@UDUU@DUUUUU@DUUUU@UUUDUUUUUUUU)*+UV[Z[[VZ[[[[[VZ[[[[V[[[Z[[[[[[[[r   c                 N   t               } t               }|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	   }| 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
   }| 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   }| d   }||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)uP   fixture 2 ↔ fixture 3 — attempt_5 comment metadata 가 cross-fixture 일치.r   r]   r   r%   r&   r(   r)   Nr[   rb   r_   )r   r   rD   rE   rF   rJ   rK   )r   r   a5rM   rQ   rN   rR   rS   s           r   Btest_pair_fixture_attempt5_comment_metadata_matches_posted_fixturer      s   ^F<D	k	Bl3vl3333333333333333333333"#Cv.B'CC#'CCCCC#'CCCC#CCC'CCCCCCCC !?V,>%??!%?????!%????!???%????????*+Sv6R/SS+/SSSSS+/SSSS+SSS/SSSSSSSSr   field)r   task_idr,   r*   r.   tsr0   r2   r#   ra   r]   r[   rb   r_   r8   r9   r4   r   prior_attempt_indexprior_attempt_tsr   !permission_added_between_attemptsr   rf   rm   rn   rg   rr   lesson_pinnedc                   t               }| |v }|st        j                  d|fd| |f      dt        j                         v st        j
                  |       rt        j                  |       nddt        j                         v st        j
                  |      rt        j                  |      nddz  }t        j                  d|        dz   d|iz  }t        t        j                  |            d	}y	)
uA   schema owner-trigger-posted.v1 필수 필드 누락 회귀 catch.inz%(py0)s in %(py2)sr   rL   r?   r@   z;required field missing in owner-trigger-posted.v1 fixture: 
>assert %(py4)sr'   N)
r   rD   rE   rG   rH   rI   rF   _format_assertmsgrJ   rK   )r   rL   rT   @py_format3rR   s        r   4test_owner_trigger_posted_v1_required_fields_presentr      s    H 
BB;]]]5B]]]]]]5]]]5]]]]]]B]]]B]]]]UV[U\]]]]]]]r   )r   r   r*   r.   r0   r   r   r   r   r   r   r   r    elapsed_seconds_between_attemptsr   r   c                   t               }| |v }|st        j                  d|fd| |f      dt        j                         v st        j
                  |       rt        j                  |       nddt        j                         v st        j
                  |      rt        j                  |      nddz  }t        j                  d|        dz   d|iz  }t        t        j                  |            d	}y	)
uG   schema permission-update-no-regen.v1 필수 필드 누락 회귀 catch.r   r   r   r   r   zArequired field missing in permission-update-no-regen.v1 fixture: r   r'   N)
r   rD   rE   rG   rH   rI   rF   r   rJ   rK   )r   r   rT   r   rR   s        r   :test_permission_update_no_regen_v1_required_fields_presentr      s    . <DD=eee5Deeeeee5eee5eeeeeeDeeeDeeee]^c]deeeeeeer   )returndict))__doc__
__future__r   builtinsrG   _pytest.assertion.rewrite	assertionrewriterD   r   pathlibr   pytest__file__resolveparentsFIXTURES_DIRr   r   r   r   r\   r^   r:   r1   r/   r   r   rY   rd   rk   rp   r~   r   r   r   r   markparametrizer   r   r   r   r   <module>r      s  & #      H~%%'//2Z? WWMMP T &   ' L :B@-"	3HI
T Q,E	\T !D^E!D^ *f+*fr   