
    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ZddlmZ ddlZ ee      j#                         j$                  d   Z eedz        Zej,                  D  cg c]
  } | ek7  s	|  c} ej,                  dd  ee      ej,                  vr"ej,                  j/                  d ee              eej2                        D cg c]  }|dk(  s|j5                  d      r| c}D ]B  Zej2                  j9                  e      Z eed	d
      xs d
Zdev sed
k(  s6ej2                  e= D d"dZ  e dd        e dd        e dd        e dd        e dd        e dd        ee      j#                         jB                  jB                  jB                  Z"e"dz  dz  dz  Z#dZ$d#dZ%ejL                  jO                  de$      d$d       Z(d%dZ)d%dZ*d%d Z+d%d!Z,yc c} w c c}w )&u$  tests.regression.test_spawn_callback_contract_validator — task-2640 Track A.

회장 verbatim unfork #1/#2 정합 검증 — dispatch.spawn_callback_contract_validator
6 fixture parametrized PASS/FAIL 단언.

본 회귀는 Layer A / NO-CRON: subprocess / cokacdir / merge / cron 호출 0.
    )annotationsN)Path   testsdispatchz	dispatch.__file__ z/tests/dispatchc                   t         j                  j                  |       }|3t        |dd      r&t	        |j
                        j                  |      r|S t        j                  j                  | t        |z        }g }d }||u}|}|r|j                  }d }	||	u}
|
}|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  }|j%                  |       |rt        j                  d
fd		f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      t        j"                  |	      d
z  }dd|iz  }|j%                  |       t        j&                  |d      i z  }t        j(                  d|       dz   d|iz  }t+        t        j,                  |            d x}x}x}x}x}x}
}	t        j                  j/                  |      }|t         j                  | <   |j                  j1                  |       |S )Nr   r	   )is not)z%(py2)s is not %(py5)sspec)py2py5z%(py7)spy7)z5%(py11)s
{%(py11)s = %(py9)s.loader
} is not %(py14)s)py9py11py14z%(py16)spy16r   zspec not found: z
>assert %(py19)spy19)sysmodulesgetgetattrstrr   endswith	importlibutilspec_from_file_location_ROOTloader
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprappend_format_boolop_format_assertmsgAssertionError_format_explanationmodule_from_specexec_module)modnamerelpathexistingr   @py_assert1@py_assert4@py_assert3@py_assert0@py_assert10@py_assert13@py_assert12@py_format6@py_format8@py_format15@py_format17@py_format18@py_format20mods                     N/home/jay/workspace/tests/regression/test_spawn_callback_contract_validator.py
_load_realr?   *   s   {{w'H*b Ac(J[J[F\FeFefmFn>>11'57?KDUtU4tUU4U4 7UUUU4tUUUUUU4UUU4UUUtUUUUUUU4UUUUUUUUUUUUUUU4UUUUUUUUUU;KG99UUUUUUUUU
..
)
)$
/CCKKKKC J    zdispatch/__init__.pyz dispatch.callback_owner_enforcerz#dispatch/callback_owner_enforcer.pyz(dispatch.normal_fallback_callback_helperz+dispatch/normal_fallback_callback_helper.pyz*dispatch.spawn_callback_contract_validatorz-dispatch/spawn_callback_contract_validator.pyzdispatch.corezdispatch/core.pyzdispatch.promptzdispatch/prompt.pyfixturesself_collector_enforcement)spawn_contract_pass_anu_keyspawn_contract_fail_self_key&spawn_contract_fail_no_prompt_doctrinescenarioc                    t         | z  }t        j                  |dz  j                  d            }t        j                  |dz  j                  d            }||fS )Nzevidence.jsonzutf-8)encodingzexpected.json)FIXTURE_ROOTjsonloads	read_text)rF   fdirevidenceexpecteds       r>   _load_fixturerP   M   sY    ("Dzz4/1<<g<NOHzz4/1<<g<NOHXr@   c                   ddl m}m} t        |       \  }} ||d   |d   |d   |d   t	        |j                  dd            |j                  d	d
            }|j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      nd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}}|j                  }|d   }
||
k(  }|st        j                  d|fd||
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |
      dz  }t        j                   |  d|j                   d|d    d|j"                   d      dz   d|iz  }t        t        j                  |            dx}x}}
|j$                  }|d   }
||
k(  }|st        j                  d|fd||
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |
      dz  }dd|iz  }t        t        j                  |            dx}x}}
|j&                  }|d    }
||
k(  }|st        j                  d|fd!||
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |
      dz  }dd|iz  }t        t        j                  |            dx}x}}
|j(                  }|d"   }
||
k(  }|st        j                  d|fd#||
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |
      dz  }dd|iz  }t        t        j                  |            dx}x}}
|j*                  }|d$   }
||
k(  }|st        j                  d|fd%||
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |
      dz  }dd|iz  }t        t        j                  |            dx}x}}
|j                  d&      }||j,                  }d}
||
u }|st        j                  d'|fd(||
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |
      dz  }dd|iz  }t        t        j                  |            dx}x}}
|j.                  }g }
||
k(  }|st        j                  d|fd)||
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |
      dz  }dd|iz  }t        t        j                  |            dx}x}}
n|j,                  }||k(  }|st        j                  d|fd*||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d+t        j                         v st        j                  |      rt        j                  |      nd+dz  }t        j                   |  d,|j,                   d| d      d-z   d|iz  }	t        t        j                  |	            dx}}|j                  d.g       }|D ]  }|j.                  }||v }|st        j                  d/|fd0||f      d1t        j                         v st        j                  |      rt        j                  |      nd1dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        j                   |  d2|d3|j.                   d      d-z   d|iz  }	t        t        j                  |	            dx}}  y)4uF   validate_spawn_callback_contract 가 fixture verdict 와 정합한다.r   )VALIDATOR_SCHEMA validate_spawn_callback_contracttask_idexecutor_keyanu_keyprompt_textanu_keys anu_keys_resolvableTrT   rU   rV   rW   rX   rZ   ==)z.%(py2)s
{%(py2)s = %(py0)s.schema
} == %(py4)sresultrR   )py0r   py4assert %(py6)spy6Nverdictz/%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py5)sr_   r   r   u   : verdict 불일치 (got=z, expected=z
, reasons=)z
>assert %(py7)sr   ok)z*%(py2)s
{%(py2)s = %(py0)s.ok
} == %(py5)sassert %(py7)sprompt_has_anu_key)z:%(py2)s
{%(py2)s = %(py0)s.prompt_has_anu_key
} == %(py5)sprompt_has_collector_role)zA%(py2)s
{%(py2)s = %(py0)s.prompt_has_collector_role
} == %(py5)sprompt_has_required_doctrine)zD%(py2)s
{%(py2)s = %(py0)s.prompt_has_required_doctrine
} == %(py5)sprimary_classification)is)z>%(py2)s
{%(py2)s = %(py0)s.primary_classification
} is %(py5)sz7%(py2)s
{%(py2)s = %(py0)s.classifications
} == %(py5)s)z>%(py2)s
{%(py2)s = %(py0)s.primary_classification
} == %(py4)sexpected_primaryu(   : primary classification 불일치 (got=z
>assert %(py6)smust_contain_classificationsin)z7%(py0)s in %(py4)s
{%(py4)s = %(py2)s.classifications
}clsz: classification u    누락 (got=)*dispatch.spawn_callback_contract_validatorrR   rS   rP   tupler   schemar    r!   r"   r#   r$   r%   r)   r*   rc   r(   reasonsrg   ri   rj   rk   rl   classifications)rF   rR   rS   rN   rO   r^   r0   r2   @py_format5@py_format7r1   r7   r8   ro   must_containrs   s                   r>   -test_validate_spawn_callback_contract_fixturer|   T   s   
 'x0Hh-#n-#]+x||J34$LL)>EF ==,=,,,,,=,,,,,,,6,,,6,,,=,,,,,,,,,,,,,,,,,,>> Xi0 >00  >0                  1    *-fnn-= >Y'(
6>>2B!	E     99&&9&&&&9&&&&&&6&&&6&&&9&&&&&&&&&&$$F1E(FF$(FFFFF$(FFFFFFF6FFF6FFF$FFF(FFFFFFFF++Tx8S/TT+/TTTTT+/TTTTTTT6TTT6TTT+TTT/TTTTTTTT..Z(;Y2ZZ.2ZZZZZ.2ZZZZZZZ6ZZZ6ZZZ.ZZZ2ZZZZZZZZ||$<=,,44,4444,444444v444v444,4444444444%%++%++++%++++++v+++v+++%++++++++++,, 	
,0@@ 	
 	
 		
,0@ 	
 	
 
6		
 	
 	  	
 	
 
		  	
 	
 
		 - 	
 	
 
6		
 	
 	 1A 	
 	
 
		 1A 	
 	
  j 112 3(),	
 	
 	
 		
 	
 << >CL 
,, 	
s,, 	
 	
 	
s, 	
 	
 
6	
 	
   	
 	
 
	  	
 	
 
6	
 	
   	
 	
 
	  	
 	
 
	 - 	
 	
  j)# 1**+1.	
 	
 	
 	
 	

r@   c                    ddl m}  t        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   }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}}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)uI   dispatch.core.dispatch_to_bot_with_contract PASS path — 정상 ANU key.r   )dispatch_to_bot_with_contractrC   rT   rU   rW   rV   rT   rU   promptrV   statusrg   r\   z%(py1)s == %(py4)spy1r`   ra   rb   Nrc   PASSrx   no_op_reason)not in)z%(py1)s not in %(py3)soutr   py3assert %(py5)sr   )dispatch.corer~   rP   r    r!   r%   r)   r*   r"   r#   r$   )r~   rN   _r   r3   r2   @py_assert2ry   rz   @py_format4r7   s              r>   ,test_dispatch_to_bot_with_contract_pass_pathr      s   ; =>KHa
'#n-&#	C x= D =D    =D   =   D       y>#V#>V####>V###>###V####### !'R'!R''''!R'''!'''R'''''''$>$$$$>$$$>$$$$$$$$$$$$$$$$r@   c                    ddl m} m} t        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   }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   }|| 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}}|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)uH   dispatch.core.dispatch_to_bot_with_contract block — executor self-key.r   NO_OP_SPAWN_CONTRACT_FAILEDr~   rD   rT   rU   rW   rV   r   r   blockedr\   r   r   ra   rb   Nrc   FAILr   z%(py1)s == %(py3)sr   r   r   r   rl   SELF_COLLECTOR_FORBIDDENr   r   r~   rP   r    r!   r%   r)   r*   r"   r#   r$   r   r~   rN   r   r   r3   r2   r   ry   rz   r   r7   s               r>   1test_dispatch_to_bot_with_contract_block_self_keyr      s   
   >?KHa
'#n-&#	C x=%I%=I%%%%=I%%%=%%%I%%%%%%%y>#V#>V####>V###>###V#######~="====="=========="===="========'(F,FF(,FFFFF(,FFFF(FFF,FFFFFFFFr@   c                    ddl m} m} t        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   }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   }|| 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}}d}|d   }||v }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }	t        t	        j                  |	            dx}x}}y)uM   dispatch.core.dispatch_to_bot_with_contract block — prompt doctrine 부재.r   r   rE   rT   rU   rW   rV   r   r   r   r\   r   r   ra   rb   Nrc   r   r   r   r   r   r   r   PROMPT_DOCTRINE_MISSINGrx   rq   )z%(py1)s in %(py4)sr   r   s               r>   4test_dispatch_to_bot_with_contract_block_no_doctriner      s   
   HIKHa
'#n-&#	C x=%I%=I%%%%=I%%%=%%%I%%%%%%%y>#V#>V####>V###>###V#######~="====="=========="===="========$>,=(>>$(>>>>>$(>>>>$>>>(>>>>>>>>r@   c                 L   ddl m}   | dddddd	      }|j                  }d
}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|j                  }g }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)uI   ANU key 집합 resolution 불가 시 HOLD_FOR_CHAIR (silent pass 금지).r   )rS   ztask-fixture-hold1e41a2324a3ccdd0c119085addb0f8b7dummyrY   Fr[   HOLD_FOR_CHAIRr\   rd   r^   re   rh   r   Nrn   )rt   rS   rc   r    r!   r"   r#   r$   r%   r)   r*   rx   )rS   r^   r0   r1   r2   r7   r8   s          r>   8test_validator_hold_for_chair_when_anu_keys_unresolvabler      s
    .#'"!F >>--->----->-------6---6--->-----------!!'R'!R''''!R''''''6'''6'''!'''R'''''''r@   )r-   r   r.   r   )rF   r   returnztuple[dict, dict])rF   r   r   None)r   r   )-__doc__
__future__r   builtinsr"   _pytest.assertion.rewrite	assertionrewriter    importlib.utilr   rJ   r   pathlibr   pytestr   resolveparentsr   r   
_TESTS_DIRpathinsertlistr   
startswith_mr   _cachedr   _fr?   parent	WORKSPACErI   SPAWN_VALIDATOR_SCENARIOSrP   markparametrizer|   r   r   r   r   )pks   00r>   <module>r      s   #      
   	X ((+!
((6Qa:oq6u:SXXHHOOAs5z" CKK 
J!,,{3  B kkoob!G	*b	)	/RBB"(KKO	 :- . 
-/T U 
57d e 
03 ?. / 
2 3N""$++2299	7"Z/2NN  %>?+
 @+
\%"G(?((A 7s   (
G+3G+G0