
    <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  ee      j                         j                  j                  j                  Z ee      e
j$                  v r!e
j$                  j'                   ee             e
j$                  j)                  d ee             ddlmZ ddlmZmZmZmZmZmZmZ edz  dz  d	z  Zdd
Z ddZ!ddZ"ddZ#d Z$d Z%d Z&e'dk(  rddl(Z( e) e(jT                  edg            y)u  tests/regression/test_completion_callback_dup_ignored_realworld_2553plus1.py

회장 채택 (2026-05-16) — task-2553+1 F1-only fallback 9B3BEB11 실사례를
completion callback orchestrator / result collector regression fixture 로 박제.

회장 verbatim:
  "9B3BEB11 fallback 처리 결과는 정상으로 인정한다 / 판정은
   DUPLICATE_CALLBACK_IGNORED가 맞다 / callback policy (a) 표준화의
   정상 동작 증거로 채택한다."

fixture: memory/fixtures/task-2553+1.duplicate-callback-ignored.collector-regression-fixture.json

회장 6-point 불변식 (후속 자동화 반영 대상)을 실제 orchestrator
(utils.anu_delegation_completion_callback.run_completion_callback_collector)
로 검증한다 — mock/추론 아님, 실코드 경로:

  1. normal collector 선행 완료            (first.ack_acquired True / PASS)
  2. collector-result marker 존재          (first PASS marker persist 가능)
  3. fallback callback 도착                (second 처리됨)
  4. fallback 이 재검증/재escalate 안 함    (second.closeout_candidate False)
  5. DUPLICATE_CALLBACK_IGNORED 로 음소거   (second.classification == DUP)
  6. CALLBACK_MISSING/BOT_STALE/RESULT_MISSING 오분류 안 함

100% offline. 실제 callback cron / codex / network / git 0. tmp_path 만 사용.
    )annotationsN)Path)Signals)CallbackInputCallbackTypeClassificationForbiddenActionPostcheckPostResultReviewStaleDistinctionEvidence!run_completion_callback_collectormemoryfixtureszHtask-2553+1.duplicate-callback-ignored.collector-regression-fixture.jsonc                 T    t        j                  t        j                  d            S )Nzutf-8)encoding)jsonloadsFIXTURE	read_text     `/home/jay/workspace/tests/regression/test_completion_callback_dup_ignored_realworld_2553plus1.py_fixturer   8   s    ::g'''9::r   c                L    t        |t        j                  k(  rdnddddd      S )uS   advisory mock — 실 codex 호출 0, 자동 closeout 권한 X (회장 (a) 정책).PASSADVISORYTFu+   realworld fixture advisory — 실 실행 0)verdictadvisoryexecution_performedauto_closeout_authority_grantednote)r
   r   r   )delegation_resultclassifications     r   _mock_review_advisoryr#   <   s-    (N,?,??Z!(-: r   c                ,   | d   }| d   }t        d#i d|d   d|d   d|d   dt        j                  d| d   d	   d   d
ddddddt        |d   |d   dd|d   |d   d      ddgdddidt	               dddddd d!t               d"dS )$N$stale_distinction_evidence_realworldreal_world_sourcetask_idexecutordispatch_cron_idcallback_typecallback_cron_idorchestrator_scenariostep_1_normal_collectorcron_statusoktask_status	completedcron_duration_ming333333)@stale_distinction_evidencenormal_callback_registerednormal_callback_cron_idFbot_liveness_signalbot_liveness_observedr4   r5   fallback_firedttl_exceededr6   r7   evidence_collection_failedoutput_markers6memory/events/task-2553+1.f1only-result-collector.jsonrequired_closeout_markers(task-2553+1.f1only-result-collector.jsonTforbidden_action_postcheck
dev_sunsetpreservation_anchorsmatchpost_tool_use_shguardsignalschair_gatedr   )r   r   NORMALr   r	   r   )fxsdesrcs      r   _normal_inputrM   G   s/   
3
4C
 
!C IZ /0 #))	
 345NO
     $<'*+G'H$'(A$B  #$9 :"%&=">',$
( QQ)* $Nt"T+, $<#=-. /0 3:GL12 	34 5 r   c                
   | d   }t        d i d|d   d|d   d|d   dt        j                  d|d   dd	d
ddddt        d| d   d   ddddd      ddgdddidt	               dddddddt               ddS )!Nr&   r'   r(   r)   r*   r+   fallback_callback_cron_idr.   r/   r0   r1   r2   g @r3   Tr%   r5   artefactFr8   r<   r=   r>   r?   r@   rA   rB   rC   rD   rG   rH   r   )r   r   FALLBACK_STALEr   r	   r   )rJ   rL   s     r   _fallback_inputrR   h   s   
 
!C IZ /0 #11	
 89     $<'+$&'M$N)%   *"&',
$
( QQ)* $Nt"T+, $<#=-. /0 3:GL12 	34 5 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   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   }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   D        }t        |      }|sd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}}y )N
fixture_idz3task-2553+1.duplicate-callback-ignored.realworld.v1==)z%(py1)s == %(py4)s)py1py4assert %(py6)spy6r&   rO   9B3BEB11chat_idl   L5: chair_six_point_invariant   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)slenpy0py2rX   py7assert %(py9)spy9c              3  $   K   | ]  }d |v  
 yw)DUPLICATE_CALLBACK_IGNOREDNr   ).0vs     r   	<genexpr>z9test_fixture_present_and_chair_adopted.<locals>.<genexpr>   s     XQ+q0Xs   chair_adoption_verbatimz,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}anyra   rb   rX   )r   
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanationr_   @py_builtinslocals_should_repr_global_namerl   )rJ   @py_assert0@py_assert3@py_assert2@py_format5@py_format7@py_assert1@py_assert6@py_assert5@py_format8@py_format10s              r   &test_fixture_present_and_chair_adoptedr      s   	BlTTTTTTTTTTTTTTTTTTTTTTT!"#>?M:M?:MMMM?:MMM?MMM:MMMMMMM!"9-;;-;;;;-;;;-;;;;;;;;;;-.43./414/14444/144444434443444.444/44414444444X"=V:WXX3XXXXXXXXX3XXX3XXXXXXXXXXXXXXr   c                   t               }| dz  }t        t        |      |t              }|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                  }t        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                  t              rt        j                  t              ndt        j                  |	      dz  }
dd|
iz  }t        t        j                  |            d
x}x}}	t        t!        |      |t              }|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                  }t        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                  t              rt        j                  t              ndt        j                  |	      dz  }
dd|
iz  }t        t        j                  |            d
x}x}}	|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}}t        j(                  t        j*                  t        j,                  t        j.                  t        j0                  fD ]  }|j                  }||k7  }|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}} y
)uF   회장 6-point 불변식 — 실 orchestrator 경로로 전수 검증.task-2553+1.callback-ack.jsonpost_result_review_fnT)is)z4%(py2)s
{%(py2)s = %(py0)s.ack_acquired
} is %(py5)sfirst)ra   rb   py5zassert %(py7)src   NrU   )zP%(py2)s
{%(py2)s = %(py0)s.classification
} == %(py6)s
{%(py6)s = %(py4)s.PASS
}r   ra   rb   rX   rZ   assert %(py8)spy8Fsecond)zf%(py2)s
{%(py2)s = %(py0)s.classification
} == %(py6)s
{%(py6)s = %(py4)s.DUPLICATE_CALLBACK_IGNORED
})z:%(py2)s
{%(py2)s = %(py0)s.closeout_candidate
} is %(py5)s)z4%(py2)s
{%(py2)s = %(py0)s.hold_reasons
} == %(py5)s)!=)z6%(py2)s
{%(py2)s = %(py0)s.classification
} != %(py4)swrongrm   rY   rZ   )r   r   rM   r#   ack_acquiredrn   ro   rs   rt   ru   rp   rq   rr   r"   r   r   rR   rg   closeout_candidatehold_reasonsCALLBACK_MISSING	BOT_STALERESULT_MISSING
CRITICAL_7HOLD_FOR_CHAIR)tmp_pathrJ   ackr   r{   @py_assert4rw   @py_format6r~   r}   rz   @py_format9r   r   ry   s                  r   5test_realworld_normal_then_fallback_duplicate_ignoredr      s	   	B
4
4C .b36KE %%%%%%%%%%%%5%%%5%%%%%%%%%%%%%6>#6#66#66666#666666656665666666666>666>666#66666666 /S8MF '%'%''''%''''''6'''6''''''%'''''''  MN$M$MM $MMMMM $MMMMMMM6MMM6MMM MMMMMMNMMMNMMM$MMMMMMMM$$--$----$------6---6---$----------$"$"$$$$"$$$$$$6$$$6$$$$$$"$$$$$$$ 	''  %%!!%% . $$-$----$------v---v---$----------------.r   c                   t               }| dz  }t        t        |      |t               t        t	        |      |t              }t        |d   d   d         }|j                  }|j                  }||v}|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      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}x}}|j                  }|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                  |      t        j                  |
      dz  }dd|iz  }t        t        j                  |            dx}x}x}}
y)uM   fixture 의 must_not_classify_as 가 실제 분류와 disjoint 임을 박제.r   r   r,   step_2_fallbackmust_not_classify_as)not in)zU%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.classification
}.value
} not in %(py6)sr   must_notr   r   r   Nrg   rU   )zQ%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.classification
}.value
} == %(py7)sr`   rd   re   )r   r   rM   r#   rR   setr"   valuern   ro   rs   rt   ru   rp   rq   rr   )r   rJ   r   r   r   r{   rw   r}   rz   r   r|   r~   r   s                r   +test_must_not_classify_list_matches_fixturer      s   	B
4
4C%b36K /S8MF 
"#$567MNH   6 &&6&h6666&h66666666666666 666&666666h666h6666666  F &&F*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FFFr   __main__z-q)returndict)r   r
   )rJ   r   r   r   )+__doc__
__future__r   builtinsrs   _pytest.assertion.rewrite	assertionrewritern   r   syspathlibr   __file__resolveparent	WORKSPACEstrpathremoveinsertutils.anu_codex_bounded_loopr   (utils.anu_delegation_completion_callbackr   r   r   r	   r
   r   r   r   r   r#   rM   rR   r   r   r   __name__pytest
SystemExitmainr   r   r   <module>r      s  2 #    
 N""$++2299	y>SXXHHOOC	N# 3y> " 0    QQ ;B@Y.BG" z
[V[[(D!12
33 r   