
    !bj,                    P   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d      Zedz  dz  Zedz  dz  Zg d	Zg d
ZddZddZg dZej*                  j-                  de      d        Zg dZej*                  j-                  de      d        Zd Zd Zd Zd Zd Zy)u  task-2583 doctrine-only fix regression test (OPT_A).

회장 결정 2026-05-15 OPT_A: dispatch_gate_check 코드 detector 신설 금지.
대신 doctrine + DIRECT-WORKFLOW + bot prompt 학습 차원에서 enforce.

본 test는 doctrine compliance를 fixture-based로 검증한다:
- positive fixtures: chair approval evidence가 인정되는 marker
- negative fixtures: chair approval evidence가 아닌 marker

코드 detector가 없으므로 본 test는:
1. doctrine 인식 logic을 검증용 helper로 구현 (test-only, production code 아님)
2. 8 positive + 6 negative fixture를 식별
3. 봇 self-check가 같은 logic을 따르면 false positive 회피 가능을 입증
    )annotationsN)Pathz/home/jay/workspacememoryeventsevidence)zowner-approval-zchairperson-approval-zchairman-approval-chairman_approval_z.chair-approved.z.owner-approved.z
-approval.)owner_decision_basisowner_decision_referenceowner_explicit_constraintsowner_decisions_finalizedc                "   t        | t              r| j                         D ]l  \  }}|t        v r y|dk(  r%t        |t              r|j                         dk(  r yt        |t              sKt        d |j                         D              sl y y)uZ   JSON 본문에서 chair approval 필드가 actual key로 존재하는지 (1-depth 재귀).Tapproved_bychairmanc              3  ,   K   | ]  }|t         v   y wN)STRUCTURED_FIELD_KEYS).0ks     H/home/jay/workspace/tests/regression/test_dispatch_gate_doctrine_2583.py	<genexpr>z._has_structured_chair_field.<locals>.<genexpr>:   s     .`aq4I/I.`s   F)
isinstancedictitemsr   strloweranykeys)datakeyvalues      r   _has_structured_chair_fieldr!   0   s|    $**, 	JC++m#
5#(>5;;=T^C^%&3.`SXS]S]S_.`+`	     c                J   | j                         sy| j                  j                         }t        D ]  }||v s y | j                  dk(  r4	 | j                  d      }t        j                  |      }t        |      ryy# t        t        t        j                  f$ r Y yw xY w)u   doctrine-only fix logic — filename pattern OR structured field 인정.

    봇 self-check가 따라야 할 reference implementation (test-only helper).
    production code가 아니라 doctrine 검증용.
    FTz.jsonutf-8encoding)existsnamer   FILENAME_PATTERNSsuffix	read_textjsonloadsOSErrorUnicodeDecodeErrorJSONDecodeErrorr!   )pathr(   patcontentr   s        r   _is_chair_approval_evidencer4   ?   s     ;;= 99??D  $;
 {{g	nngn6G::g&D 't, +T-A-AB 		s   'B B"!B")	,memory/events/task-2582.dispatch-marker.jsonz7memory/events/task-2578.deployed-high-rec1-applied.jsonz,memory/events/task-2580.policy-approved.jsonz+memory/events/task-2579.hotfix-applied.jsonz*memory/events/task-2581.opt-a-adopted.jsonz3memory/events/task-2579.implementation-applied.jsonz2memory/events/task-2574.preserved-pr-decision.jsonz<memory/events/anu-v2.1-stabilization-chain.final-status.json0memory/evidence/task-2472/chairman-approval.jsonfixture_relc                j   t         | z  }|j                  } |       }|st        j                  d|        dz   dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}}t        |      }|st        j                  d|  d      dz   d	t	        j
                         v st        j                  t              rt        j                  t              nd	dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      d
z  }t        t        j                  |            d}y)uG   doctrine logic이 chair approval evidence를 정확히 인식하는지.   fixture 부재: C
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}r1   py0py2py4Nu   doctrine 위반: uz   는 chair approval evidence로 인정되어야 함. filename pattern 또는 structured field 중 하나도 매치 안 됨..
>assert %(py3)s
{%(py3)s = %(py0)s(%(py1)s)
}r4   r<   py1py3	WORKSPACEr'   
@pytest_ar_format_assertmsg@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr4   )r7   r1   @py_assert1@py_assert3@py_format5@py_assert2@py_format4s          r   *test_doctrine_recognizes_positive_fixturesrR   q   s>    {"D;;:;=:=::,[M:::::::4:::4:::;:::=::::::&t, ,   K= )Q 	R     '    '      (,    (,    -     r"   )z,memory/events/task-2582.read-only-audit.jsonz4memory/events/task-2582.gate-violation-detected.jsonz1memory/events/task-2582.system-trust-anomaly.jsonz<memory/events/task-2575.d3-doctrine-compliance-evidence.jsonzBmemory/events/task-2582.cancelled.stale-resolved-by-task-2583-prepzmemory/reports/task-2582.mdc                t   t         | z  }|j                  } |       }|st        j                  d|        dz   dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}}t        |      }| }|st        j                  d|  d      dz   d	t	        j
                         v st        j                  t              rt        j                  t              nd	dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      d
z  }t        t        j                  |            dx}}y)uS   doctrine guard가 승인 없는 marker를 chair approval로 오인하지 않는지.r9   r:   r1   r;   Nu   guard 위반: u   는 chair approval evidence가 아니어야 함. filename pattern 또는 structured field가 잘못 매치됨 → false positive risk.z2
>assert not %(py3)s
{%(py3)s = %(py0)s(%(py1)s)
}r4   r@   rC   )r7   r1   rM   rN   rO   rP   @py_assert4s          r   'test_doctrine_rejects_negative_fixturesrU      sI    {"D;;:;=:=::,[M:::::::4:::4:::;:::=::::::*40 00 0    &` 	a     +    +      ,0    ,0    1     r"   c                 Z   t         dz  } | 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}}| j                  j                         t        fdt        D              }| }|s{t	        j                  d      dz   d	d
t        j                         v st	        j
                  |      rt	        j                  |      nd
iz  }t        t	        j                  |            d}t        j                  | j!                  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  }	t	        j                  d      dz   d|	iz  }
t        t	        j                  |
            dx}}t%        |       }|st	        j                  d      dz   dt        j                         v st	        j
                  t$              rt	        j                  t$              nddt        j                         v st	        j
                  |       rt	        j                  |       ndt	        j                  |      dz  }	t        t	        j                  |	            d}y)u   task-2582 false positive cascade의 핵심 시나리오.

    마르둑이 canonical filename pattern만 검색 → dispatch-marker.json 인식 실패.
    doctrine OPT_A 적용 시 structured field 인식 → PASS.
    r5   Aassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}dispatch_markerr;   Nc              3  &   K   | ]  }|v  
 y wr    )r   r2   
name_lowers     r   r   z5test_task_2582_root_cause_scenario.<locals>.<genexpr>   s     $T3SJ%6$Ts   uv   filename 'dispatch-marker'는 canonical chair approval pattern 부재 — 마르둑 false positive 시나리오 재현z
>assert not %(py0)sr<   has_filename_pattern_matchr$   r%   r	   inz%(py1)s in %(py3)sr   rA   rB   u_   task-2582.dispatch-marker.json은 owner_decision_basis 필드를 actual key로 포함해야 함z
>assert %(py5)spy5uu   doctrine 통합 logic이 task-2582.dispatch-marker.json을 인식하지 못함 — false positive cascade 재발 riskr?   r4   r@   )rD   r'   rG   rH   rE   rI   rJ   rK   rL   r(   r   r   r)   rF   r,   r-   r+   _call_reprcomparer4   )rX   rM   rN   rO   r\   @py_format2r   @py_assert0rP   rQ   @py_format6r[   s              @r   "test_task_2582_root_cause_scenariorf      st     "PPO!!#!########?###?###!########## !%%++-J!$$TBS$T!T)) )  	7     *    *      ::o///ABD! !T)  !T    "      &*    &*    	j    
 '7 7  	-     '    '      (7    (7    8     r"   c                 0   t         dz  } | 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        |       }|st	        j                  d      dz   dt        j                         v st	        j
                  t              rt	        j                  t              nddt        j                         v st	        j
                  |       rt	        j                  |       ndt	        j                  |      d	z  }t        t	        j                  |            d}y)
ug   review_thread_guard 호환 dir 패턴 (memory/evidence/task-{ID}/chairman-approval.json) 인식 유지.r6   rW   r1   r;   NuL   backward compat 위반: chairman-approval.json 패턴이 인식되지 않음r?   r4   r@   )rD   r'   rG   rH   rE   rI   rJ   rK   rL   r4   rF   )r1   rM   rN   rO   rP   rQ   s         r   2test_backward_compat_chairman_approval_dir_patternrh      s   IID;;;==44;=&t, ,   	W     '    '      (,    (,    -     r"   c                 |   t        d      } | j                  } |       }|st        j                  d      dz   dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}}| j                  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}}g }d}|j                  }	 |	       }
||
v }|}|sd}||v }|}|st        j                  d
|fd||
f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |
      dz  }dd|iz  }|j                  |       |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  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}	x}
x}}g }d}|j                  }	 |	       }
||
v }|}|sd}||v }|}|st        j                  d
|fd||
f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |
      dz  }dd|iz  }|j                  |       |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  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}	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}}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) u>   doctrine 박제 파일이 정확한 위치에 존재하는지.z}/home/jay/.claude/projects/-home-jay--cokacdir-workspace-autoset/memory/feedback_dispatch_gate_evidence_recognition_260515.mdu-   doctrine memory 파일이 박제되어야 함r:   doctrine_pathr;   Nr$   r%   r	   r]   r_   r3   r`   assert %(py5)sra   zfilename pattern)zD%(py3)s in %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s.lower
}()
})rB   ra   py7py9z%(py11)spy11)z%(py14)s in %(py16)s)py14py16z%(py18)spy18   zassert %(py21)spy21zstructured fieldzStructured Fieldz	task-2582OPT_A)r   r'   rE   rF   rG   rH   rI   rJ   rK   rL   r+   rb   r   append_format_boolop)rj   rM   rN   rO   r3   rd   rP   rQ   re   @py_assert6@py_assert8rT   @py_assert13@py_assert15@py_format10@py_format12@py_format17@py_format19@py_format20@py_format22s                       r    test_doctrine_memory_file_existsr      s   	@M R!R!RR#RRRRRRR=RRR=RRRRRR!RRRRRR%%w%7G!,!W,,,,!W,,,!,,,,,,W,,,W,,,,,,,QQQQ0Q4FQ4F'4QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ4F'QQQ4FQQQQQQ'QQQ'QQQQQQQQQQQQQQQQQQQ0Q4FQ4F'4QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ4F'QQQ4FQQQQQQ'QQQ'QQQQQQQQQQQQQQQ!;'!!!!;'!!!;!!!!!!'!!!'!!!!!!!7g7g7ggr"   c                 d   t         dz  } | 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}}| j                  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}}y)uK   DIRECT-WORKFLOW.md에 chair approval evidence 섹션이 추가되었는지.zprompts/DIRECT-WORKFLOW.mdrW   dw_pathr;   Nr$   r%   u   chair approval evidence 인식r]   r_   r3   r`   rk   ra   r	   2feedback_dispatch_gate_evidence_recognition_260515)rD   r'   rG   rH   rE   rI   rJ   rK   rL   r+   rb   )	r   rM   rN   rO   r3   rd   rP   rQ   re   s	            r   +test_direct_workflow_chair_approval_sectionr      s   66G>>>77>1G+6+w6666+w666+666666w666w6666666!,!W,,,,!W,,,!,,,,,,W,,,W,,,,,,,?J?7JJJJ?7JJJ?JJJJJJ7JJJ7JJJJJJJr"   c                    t        d      } | 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}}| j                  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}}y)uD   MEMORY.md 인덱스에 신규 doctrine 항목이 추가되었는지.zQ/home/jay/.claude/projects/-home-jay--cokacdir-workspace-autoset/memory/MEMORY.mdrW   mem_pathr;   Nr$   r%   r   r]   r_   r3   r`   rk   ra   z"dispatch-gate evidence recognition)r   r'   rG   rH   rE   rI   rJ   rK   rL   r+   rb   )	r   rM   rN   rO   r3   rd   rP   rQ   re   s	            r   test_memory_index_updatedr      s6   [H ???88?  ' 2G?J?7JJJJ?7JJJ?JJJJJJ7JJJ7JJJJJJJ/:/7::::/7:::/::::::7:::7:::::::r"   )r   objectreturnbool)r1   r   r   r   )__doc__
__future__r   builtinsrG   _pytest.assertion.rewrite	assertionrewriterE   r,   pathlibr   pytestrD   
EVENTS_DIREVIDENCE_DIRr)   r   r!   r4   POSITIVE_FIXTURESmarkparametrizerR   NEGATIVE_FIXTURESrU   rf   rh   r   r   r   rZ   r"   r   <module>r      s    #     &'	!H,
8#j0  D   (9: ; 
  (9: ; H"K;r"   