
    j,                    6   d Z ddl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                v    t         | z  }|j                         s
J d|         t        |      sJ d|  d       y)uG   doctrine logic이 chair approval evidence를 정확히 인식하는지.   fixture 부재: u   doctrine 위반: uz   는 chair approval evidence로 인정되어야 함. filename pattern 또는 structured field 중 하나도 매치 안 됨.N	WORKSPACEr'   r4   r7   r1   s     r   *test_doctrine_recognizes_positive_fixturesr=   q   sQ     {"D;;=:,[M::=&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                v    t         | z  }|j                         s
J d|         t        |      rJ d|  d       y)uS   doctrine guard가 승인 없는 marker를 chair approval로 오인하지 않는지.r9   u   guard 위반: u   는 chair approval evidence가 아니어야 함. filename pattern 또는 structured field가 잘못 매치됨 → false positive risk.Nr:   r<   s     r   'test_doctrine_rejects_negative_fixturesr?      sT     {"D;;=:,[M::=*40 
 &` 	a00r"   c                 6   t         dz  } | j                         sJ | j                  j                         t	        fdt
        D              }|rJ d       t        j                  | j                  d            }d|v sJ d       t        |       sJ d       y	)
u   task-2582 false positive cascade의 핵심 시나리오.

    마르둑이 canonical filename pattern만 검색 → dispatch-marker.json 인식 실패.
    doctrine OPT_A 적용 시 structured field 인식 → PASS.
    r5   c              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 시나리오 재현r$   r%   r	   u_   task-2582.dispatch-marker.json은 owner_decision_basis 필드를 actual key로 포함해야 함uu   doctrine 통합 logic이 task-2582.dispatch-marker.json을 인식하지 못함 — false positive cascade 재발 riskN)
r;   r'   r(   r   r   r)   r,   r-   r+   r4   )dispatch_markerhas_filename_pattern_matchr   rC   s      @r   "test_task_2582_root_cause_scenariorF      s      "PPO!!### !%%++-J!$$TBS$T!T) 	7) ::o///ABD!T) i)
 '7 	-7r"   c                 ^    t         dz  } | j                         sJ t        |       sJ d       y)ug   review_thread_guard 호환 dir 패턴 (memory/evidence/task-{ID}/chairman-approval.json) 인식 유지.r6   uL   backward compat 위반: chairman-approval.json 패턴이 인식되지 않음Nr:   )r1   s    r   2test_backward_compat_chairman_approval_dir_patternrH      s3    IID;;==&t, V,r"   c                     t        d      } | j                         sJ d       | j                  d      }d|v sJ d|j                         v sd|v sJ d|j                         v sd|v sJ d	|v sJ d
|v sJ y)u>   doctrine 박제 파일이 정확한 위치에 존재하는지.z}/home/jay/.claude/projects/-home-jay--cokacdir-workspace-autoset/memory/feedback_dispatch_gate_evidence_recognition_260515.mdu-   doctrine memory 파일이 박제되어야 함r$   r%   r	   zfilename patternzstructured fieldzStructured Fieldz	task-2582OPT_AN)r   r'   r+   r   )doctrine_pathr3   s     r    test_doctrine_memory_file_existsrL      s    	@M !R#RR!%%w%7G!W,,,04F'4QQQ04F'4QQQ'!!!gr"   c                     t         dz  } | j                         sJ | j                  d      }d|v sJ d|v sJ d|v sJ y)uK   DIRECT-WORKFLOW.md에 chair approval evidence 섹션이 추가되었는지.zprompts/DIRECT-WORKFLOW.mdr$   r%   u   chair approval evidence 인식r	   2feedback_dispatch_gate_evidence_recognition_260515N)r;   r'   r+   )dw_pathr3   s     r   +test_direct_workflow_chair_approval_sectionrP      sZ    66G>>1G+w666!W,,,?7JJJr"   c                 z    t        d      } | j                         sJ | j                  d      }d|v sJ d|v sJ y)uD   MEMORY.md 인덱스에 신규 doctrine 항목이 추가되었는지.zQ/home/jay/.claude/projects/-home-jay--cokacdir-workspace-autoset/memory/MEMORY.mdr$   r%   rN   z"dispatch-gate evidence recognitionN)r   r'   r+   )mem_pathr3   s     r   test_memory_index_updatedrS      sP    [H ??  ' 2G?7JJJ/7:::r"   )r   objectreturnbool)r1   r   rU   rV   )__doc__
__future__r   r,   pathlibr   pytestr;   
EVENTS_DIREVIDENCE_DIRr)   r   r!   r4   POSITIVE_FIXTURESmarkparametrizer=   NEGATIVE_FIXTURESr?   rF   rH   rL   rP   rS   rB   r"   r   <module>ra      s    #   &'	!H,
8#j0  D   (9: ; 
  (9: ; H"K;r"   