
    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ej                  j                  dd       ddlmZ ddlmZ e
j                  j%                  e
j                  j'                  e      d      ZddZ G d	 d
      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Zy)u   Tests for finish_task_profile_classifier.py — 6 task_mode classification.

chair_authorization_id=CHAIR-AUTH-TASK-2706-V36-FINISH-TASK-PROFILE-LAYER-P1B-260529
    )annotationsNz/home/jay/workspace)classify_task_mode)VALID_TASK_MODESfixturesc                    t         j                  j                  t        |       }t	        |dd      5 }t        j                  |      cd d d        S # 1 sw Y   y xY w)Nrzutf-8)encoding)ospathjoinFIXTURES_DIRopenjsonload)namer   fs      L/home/jay/workspace/tests/harness/test_v36_finish_task_profile_classifier.py_load_fixturer      sD    77<<d+D	dC'	* ayy|  s   AAc                  (    e Zd ZdZd Zd Zd Zd Zy)TestCodeModeClassificationz(Tests for task_mode=code classification.c                ~   t        d      }|d   }t        |      }|d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j
                  d|d   d	|d
          dz   d|iz  }t        t        j                  |            d x}x}}y )Nzv36_task_mode_code.jsontask_md_text_fragment	task_modecode==z%(py1)s == %(py4)spy1py4zExpected code, got 	: signal=signal
>assert %(py6)spy6r   r   
@pytest_ar_call_reprcompare	_saferepr_format_assertmsgAssertionError_format_explanation	selffixturetextresult@py_assert0@py_assert3@py_assert2@py_format5@py_format7s	            r   test_code_fixturez,TestCodeModeClassification.test_code_fixture   s     9:./#D)k" 	
f 	
"f, 	
 	
"f 	
 	
 		 # 	
 	
 		 '- 	
 	
  "&"5!8	&BRAST	
 	
 	
 	
 	
 	
    c                   d}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}}y )	Nz**task_id**: task-9999
paths:
  - "src/models/user.py"
  - "src/api/routes.py"
  - "tests/test_user.py"
edits_existing:
  - path: "src/models/user.py"
new_modules:
  - path: "tests/test_user.py"
r   r   r   r   r   assert %(py6)sr$   r   r&   r'   r(   r*   r+   r-   r/   r0   r1   r2   r3   r4   r5   s           r    test_code_mode_typical_src_pathsz;TestCodeModeClassification.test_code_mode_typical_src_paths'   sj    1 	 $D)k",f,"f,,,,"f,,,",,,f,,,,,,,r7   c                   d}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}}y	)
z/code > local_runtime when both signals present.z**task_id**: task-9999
paths:
  - "src/models/user.py"
  - "scripts/harness/v36/helper.py"
  - "tests/harness/test_helper.py"
edits_existing:
  - path: "src/models/user.py"
r   r   r   r   r   r9   r$   Nr:   r;   s           r   %test_code_priority_over_local_runtimez@TestCodeModeClassification.test_code_priority_over_local_runtime6   sj    1 	 $D)k",f,"f,,,,"f,,,",,,f,,,,,,,r7   c                   d}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
}||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            d x}x}}y )Nz**task_id**: task-9999
paths:
  - "src/models/user.py"
  - "src/api/routes.py"
  - "app/services/auth.py"
  - "tests/test_auth.py"
  - "lib/utils.py"
edits_existing:
  - path: "src/models/user.py"
  - path: "src/api/routes.py"
r   r   r   r   r   r9   r$   
confidence)HIGHMEDIUMin)z%(py1)s in %(py4)sr:   r;   s           r   *test_code_high_confidence_multiple_signalszETestCodeModeClassification.test_code_high_confidence_multiple_signalsE   s    	0 	 $D)k",f,"f,,,,"f,,,",,,f,,,,,,,l#9'99#'99999#'9999#999'99999999r7   N)__name__
__module____qualname____doc__r6   r<   r>   rE    r7   r   r   r      s    2
--:r7   r   c                  (    e Zd ZdZd Zd Zd Zd Zy) TestSystemHookModeClassificationz/Tests for task_mode=system_hook classification.c                ~   t        d      }|d   }t        |      }|d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j
                  d|d   d	|d
          dz   d|iz  }t        t        j                  |            d x}x}}y )Nzv36_task_mode_system_hook.jsonr   r   system_hookr   r   r   zExpected system_hook, got r!   r"   r#   r$   r%   r,   s	            r   test_system_hook_fixturez9TestSystemHookModeClassification.test_system_hook_fixtureZ   s     @A./#D)k" 	
m 	
"m3 	
 	
"m 	
 	
 		 # 	
 	
 		 '4 	
 	
  ))<(?yPXIYHZ[	
 	
 	
 	
 	
 	
r7   c                   d}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}}y )	Nz**task_id**: task-9999
paths:
  - ".claude/hooks/pre_tool_call.py"
  - ".claude/hooks/post_tool_call.py"
edits_existing: []
new_modules:
  - path: ".claude/hooks/pre_tool_call.py"
r   rN   r   r   r   r9   r$   r:   r;   s           r   "test_system_hook_claude_hooks_pathzCTestSystemHookModeClassification.test_system_hook_claude_hooks_pathb   sj    = 	 $D)k"3m3"m3333"m333"333m3333333r7   c                   d}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}}y )	Nza**task_id**: task-9999
paths:
  - "settings.json"
  - ".claude/hooks/hook.py"
edits_existing: []
r   rN   r   r   r   r9   r$   r:   r;   s           r   test_system_hook_settings_jsonz?TestSystemHookModeClassification.test_system_hook_settings_jsono   sj    # 	 $D)k"3m3"m3333"m333"333m3333333r7   c                   d}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}}y )	Nzr**task_id**: task-9999
paths:
  - "scripts/finish-task.sh"
  - "settings.json"
edits_existing: []
new_modules: []
r   rN   r   r   r   r9   r$   r:   r;   s           r   &test_system_hook_finish_task_referencezGTestSystemHookModeClassification.test_system_hook_finish_task_referencez   sj      	 $D)k"3m3"m3333"m333"333m3333333r7   N)rF   rG   rH   rI   rO   rQ   rS   rU   rJ   r7   r   rL   rL   W   s    9
4	4
4r7   rL   c                  "    e Zd ZdZd Zd Zd Zy)"TestLocalRuntimeModeClassificationz1Tests for task_mode=local_runtime classification.c                ~   t        d      }|d   }t        |      }|d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j
                  d|d   d	|d
          dz   d|iz  }t        t        j                  |            d x}x}}y )Nz v36_task_mode_local_runtime.jsonr   r   local_runtimer   r   r   zExpected local_runtime, got r!   r"   r#   r$   r%   r,   s	            r   test_local_runtime_fixturez=TestLocalRuntimeModeClassification.test_local_runtime_fixture        BC./#D)k" 	
o 	
"o5 	
 	
"o 	
 	
 		 # 	
 	
 		 '6 	
 	
  +6++>*A6RZK[J\]	
 	
 	
 	
 	
 	
r7   c                   d}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}}y )	Nz**task_id**: task-9999
paths:
  - "scripts/harness/v36/new_module.py"
  - "tests/harness/test_v36_new_module.py"
edits_existing: []
new_modules:
  - path: "scripts/harness/v36/new_module.py"
r   rY   r   r   r   r9   r$   r:   r;   s           r    test_local_runtime_harness_pathszCTestLocalRuntimeModeClassification.test_local_runtime_harness_paths   sk    @ 	 $D)k"5o5"o5555"o555"555o5555555r7   c                   d}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}}y )	Nzy**task_id**: task-9999
paths:
  - "dispatch/__init__.py"
  - "scripts/harness/v36/dispatch_helper.py"
edits_existing: []
r   rY   r   r   r   r9   r$   r:   r;   s           r    test_local_runtime_dispatch_pathzCTestLocalRuntimeModeClassification.test_local_runtime_dispatch_path   sj    # 	 $D)k"5o5"o5555"o555"555o5555555r7   N)rF   rG   rH   rI   rZ   r]   r_   rJ   r7   r   rW   rW      s    ;
6	6r7   rW   c                      e Zd ZdZd Zd Zy)TestReadOnlyModeClassificationz-Tests for task_mode=read_only classification.c                ~   t        d      }|d   }t        |      }|d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j
                  d|d   d	|d
          dz   d|iz  }t        t        j                  |            d x}x}}y )Nzv36_task_mode_read_only.jsonr   r   	read_onlyr   r   r   zExpected read_only, got r!   r"   r#   r$   r%   r,   s	            r   test_read_only_fixturez5TestReadOnlyModeClassification.test_read_only_fixture   s     >?./#D)k" 	
k 	
"k1 	
 	
"k 	
 	
 		 # 	
 	
 		 '2 	
 	
  'vk':&=YvhGWFXY	
 	
 	
 	
 	
 	
r7   c                   d}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}}y )	Nz**task_id**: task-9999
mode: read_only
purpose: audit
paths:
  - "memory/reports/task-9999.md"
edits_existing: []
new_modules: []
r   rc   r   r   r   r9   r$   r:   r;   s           r   test_read_only_empty_filesz9TestReadOnlyModeClassification.test_read_only_empty_files   sj      	 $D)k"1k1"k1111"k111"111k1111111r7   N)rF   rG   rH   rI   rd   rf   rJ   r7   r   ra   ra      s    7
2r7   ra   c                      e Zd ZdZd Zd Zy)"TestCallbackOnlyModeClassificationz1Tests for task_mode=callback_only classification.c                ~   t        d      }|d   }t        |      }|d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j
                  d|d   d	|d
          dz   d|iz  }t        t        j                  |            d x}x}}y )Nz v36_task_mode_callback_only.jsonr   r   callback_onlyr   r   r   zExpected callback_only, got r!   r"   r#   r$   r%   r,   s	            r   test_callback_only_fixturez=TestCallbackOnlyModeClassification.test_callback_only_fixture   r[   r7   c                   d}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}}y )	Nu   **task_id**: task-9999
purpose: callback_only — ANU callback 발사 전용 (envelope only)
collector_key: ANU
anu_action_recommended: PROCEED
edits_existing: []
new_modules: []
r   rj   r   r   r   r9   r$   r:   r;   s           r   test_callback_only_anu_keywordzATestCallbackOnlyModeClassification.test_callback_only_anu_keyword   sj      	 $D)k"5o5"o5555"o555"555o5555555r7   N)rF   rG   rH   rI   rk   rm   rJ   r7   r   rh   rh      s    ;

6r7   rh   c                      e Zd ZdZd Zd Zy)(TestCloseoutMarkerOnlyModeClassificationz8Tests for task_mode=closeout_marker_only classification.c                ~   t        d      }|d   }t        |      }|d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j
                  d|d   d	|d
          dz   d|iz  }t        t        j                  |            d x}x}}y )Nz'v36_task_mode_closeout_marker_only.jsonr   r   closeout_marker_onlyr   r   r   z#Expected closeout_marker_only, got r!   r"   r#   r$   r%   r,   s	            r   !test_closeout_marker_only_fixturezJTestCloseoutMarkerOnlyModeClassification.test_closeout_marker_only_fixture   s     IJ./#D)k" 	
&< 	
"&<< 	
 	
"&< 	
 	
 		 # 	
 	
 		 '= 	
 	
  2&2E1H	RXYaRbQcd	
 	
 	
 	
 	
 	
r7   c                   d}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}}y )	Nz**task_id**: task-9999
paths:
  - "memory/events/task-9999.done.acked"
edits_existing: []
new_modules: []
new_marker_artifacts:
  - "memory/events/task-9999.done.acked"
r   rq   r   r   r   r9   r$   r:   r;   s           r   'test_closeout_only_new_marker_artifactszPTestCloseoutMarkerOnlyModeClassification.test_closeout_only_new_marker_artifacts   sn    ; 	 $D)k"<&<<"&<<<<<"&<<<<"<<<&<<<<<<<<r7   N)rF   rG   rH   rI   rr   rt   rJ   r7   r   ro   ro      s    B
=r7   ro   c                  @    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)TestSafeFailAndEdgeCasesz=Tests for UNKNOWN fallback, safe-fail, and priority ordering.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}}y )	N r   UNKNOWNr   r   r   r9   r$   r:   r-   r0   r1   r2   r3   r4   r5   s          r   test_empty_text_returns_unknownz8TestSafeFailAndEdgeCases.test_empty_text_returns_unknown   s^    #B'k"/i/"i////"i///"///i///////r7   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}}y )Nr   ry   r   r   r   r9   r$   r:   rz   s          r   test_none_text_returns_unknownz7TestSafeFailAndEdgeCases.test_none_text_returns_unknown   s^    #D)k"/i/"i////"i///"///i///////r7   c                   d}t        |      }|d   }|t        v }|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}}y )	Nz9# random text with no matching signals
some content here
r   rC   z%(py1)s in %(py3)sr   r   py3assert %(py5)spy5)
r   r   r&   r'   r(   @py_builtinslocals_should_repr_global_namer*   r+   r-   r/   r0   r1   r3   @py_format4@py_format6s          r   (test_no_matching_signals_returns_unknownzATestSafeFailAndEdgeCases.test_no_matching_signals_returns_unknown  sv    L#D)k"6"&66666"&6666"666666&6666&66666666r7   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}}y )	Ni90  r   ry   r   r   r   r9   r$   r:   rz   s          r   &test_does_not_raise_on_exception_inputz?TestSafeFailAndEdgeCases.test_does_not_raise_on_exception_input
  s^    #E*k"/i/"i////"i///"///i///////r7   c                T   dD ]  }t        |      }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}}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 )N)rx   z	some textN	dispatch/src/models.pyr   rC   r   r0   r   r   r   r"   priority_appliedr@   )	r   r&   r'   r(   r   r   r   r*   r+   r   s          r   $test_result_always_has_required_keysz=TestSafeFailAndEdgeCases.test_result_always_has_required_keys  s   I 	*D'-F(;&((((;&(((;((((((&(((&(((((((%8v%%%%8v%%%8%%%%%%v%%%v%%%%%%%%/%////%///%////////////////)<6))))<6)))<))))))6)))6)))))))	*r7   c           	        dD ]  }t        |      }|d   }|t        v }|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  }t        j                  d|d   dt        |      d d	       d
z   d|iz  }t        t        j                  |            d x}} y )N)rx   r   .claude/hooks/zdispatch/__init__.pyzmemory/events/task.done.ackedzcallback_only ANU enveloper   rC   r   r   r   z)classify_task_mode returned invalid mode z for    z
>assert %(py5)sr   )r   r   r&   r'   r(   r   r   r   r)   strr*   r+   r   s          r   test_task_mode_always_validz4TestSafeFailAndEdgeCases.test_task_mode_always_valid  s    
 	D (-F+& &*::  &*:  I '  v   +;  I +;    <F;<O;RRWX[\`XabeceXfWij    	r7   c                   d}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}}y	)
zcode > system_hook in priority.zpaths:
  - "src/api/routes.py"
  - "src/models/user.py"
  - "src/services/auth.py"
  - ".claude/hooks/pre_tool_call.py"
edits_existing:
  - path: "src/api/routes.py"
r   r   r   r   r   r9   r$   Nr:   r;   s           r   $test_priority_code_beats_system_hookz=TestSafeFailAndEdgeCases.test_priority_code_beats_system_hook%  sj    0 	 $D)k",f,"f,,,,"f,,,",,,f,,,,,,,r7   c                   ddl m} dD ]  }t        |      }|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 )Nr   )VALID_CONFIDENCE)r   r   r   rx   Nr@   rC   r   r   r   r   r   ).scripts.harness.v36.finish_task_profile_schemar   r   r&   r'   r(   r   r   r   r*   r+   )r-   r   r/   r0   r1   r3   r   r   s           r    test_confidence_values_are_validz9TestSafeFailAndEdgeCases.test_confidence_values_are_valid3  s    SN 	<D'-F,';'+;;;;;'+;;;;';;;;;;+;;;;+;;;;;;;;	<r7   N)rF   rG   rH   rI   r{   r}   r   r   r   r   r   r   rJ   r7   r   rv   rv      s-    G0070
*-<r7   rv   )r   r   returndict)rI   
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter&   r   r
   sysr   insert2scripts.harness.v36.finish_task_profile_classifierr   r   r   r   dirname__file__r   r   r   rL   rW   ra   rh   ro   rv   rJ   r7   r   <module>r      s    #    	 
 ( ) Q Kww||BGGOOH5zB8: 8:v-4 -4`!6 !6H2 226 60= =:>< ><r7   