
    i<                        d 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
Z
ddlmc mZ ddlmZmZmZmZ ddlZe	j*                  j-                  dd       ddlmZ ddlmZmZ ddlmZ ddlmZm Z  dd	l!m"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) G d d      Z* G d d      Z+ G d d      Z,y)u  
VERIFICATION_STAMP
Story: 2.08 (Track B)
Verified By: parallel-builder
Verified At: 2026-02-25T00:00:00Z
Tests: 12/12
Coverage: 100%

Module 2 White-Box Test Suite — JIT Hydration Pipeline
Story 2.08 — Track B

Tests internal implementation paths:
  - fast_extract: timing contract (<5ms), no I/O, no HTTP
  - scatter_gather: asyncio.gather concurrency, individual per-layer timeout
  - JITHydrationInterceptor: priority, metadata.name, interceptor chain contract
  - build_envelope: latency_ms formatting, mandatory 4 XML child tags
  - RedisL1Client.bump_version: atomic INCR pattern (not read-modify-write)
  - RedisL1State.version: defaults to 0

ALL external I/O is mocked. No live Redis, Qdrant, or KG required.
    N)	AsyncMock	MagicMockcallpatchz/mnt/e/genesis-system)fast_extract)RedisL1ClientRedisL1State)scatter_gather_memory)MemoryContextbuild_envelope)JITHydrationInterceptorc                       e Zd Zd Zd Zy)TestFastExtractTimingc                    dddd}t        j                         }t        |       t        j                         |z
  dz  }d}||k  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      d
z  }t        j                  d|dd      dz   d|iz  }t        t        j                  |            dx}}y)u;   fast_extract runs in <5ms — it is pure CPU with zero I/O.z8Build the redis schema at core/memory/redis_l1_schema.pyz/Use async def get_state and class RedisL1Clientz'Wire redis and qdrant services together)promptdescriptiontask     @@      @<z%(py0)s < %(py3)s
elapsed_mspy0py3zfast_extract took z.2fu-   ms — must stay under 5ms (pure CPU, no I/O)
>assert %(py5)spy5N)time	monotonicr   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgAssertionError_format_explanation)selfpayloadstartr   @py_assert2@py_assert1@py_format4@py_format6s           8/mnt/e/genesis-system/tests/memory/test_jit_hydration.py%test_fast_extract_completes_under_5msz;TestFastExtractTiming.test_fast_extract_completes_under_5ms.   s     QL=

  Wnn&.&8
 	
zC 	
 	
zC 	
 	
	6	
 	
   	
 	
 		  	
 	
 		   	
 	
  !C 00]^	
 	
 	
 	
 	
    c                 `   t        j                         }t        i       \  }}t        j                         |z
  dz  }d}||k  }|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  }t        t        j                  |            d	x}}g }||k(  }|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  }t        t        j                  |            d	x}}d}||k(  }|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  }t        t        j                  |            d	x}}y	)z<fast_extract on an empty dict returns quickly without error.r   r   r   r   r   r   assert %(py5)sr   N==z%(py0)s == %(py3)sentities intent)r   r    r   r!   r"   r#   r$   r%   r&   r(   r)   )	r*   r,   r9   r;   r   r-   r.   r/   r0   s	            r1   0test_fast_extract_on_empty_payload_is_still_fastzFTestFastExtractTiming.test_fast_extract_on_empty_payload_is_still_fast<   s<    '+&nn&.&8
zCzCzzCx2~x2xx2v|vvvr3   N)__name__
__module____qualname__r2   r<    r3   r1   r   r   ,   s    
r3   r   c                   *    e Zd Zd Zd Zd Zd Zd Zy)TestFastExtractNoIOc                 <   t        ddi      }t        j                  } ||      }| }|st        j                  d      dz   dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            dx}x}}y)	uF   fast_extract is pure Python — no HTTP, no file I/O, no subprocesses.r   zhello redis and postgresz$fast_extract must NOT be a coroutinezS
>assert not %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.iscoroutine
}(%(py3)s)
}asyncioresultr   py2r   r   N)r   rD   iscoroutiner!   r'   r#   r$   r%   r&   r(   r)   )r*   rE   r.   @py_assert4@py_assert6@py_format7s         r1   (test_fast_extract_makes_no_network_callsz<TestFastExtractNoIO.test_fast_extract_makes_no_network_callsL   s     x)CDE&&V&v.V..V.VV0VVVVVVV7VVV7VVV&VVVVVVvVVVvVVV.VVVVVVr3   c                 :   t         j                  } |t              }| }|st        j                  d      dz   dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            dx}x}}y)uC   fast_extract is defined as a plain sync function — not async def.z4fast_extract must be a synchronous function (no I/O)z[
>assert not %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.iscoroutinefunction
}(%(py3)s)
}rD   r   rF   N)rD   iscoroutinefunctionr   r!   r'   r#   r$   r%   r&   r(   r)   )r*   r.   rI   rJ   rK   s        r1   -test_fast_extract_is_not_a_coroutine_functionzATestFastExtractNoIO.test_fast_extract_is_not_a_coroutine_functionS   s    .. 	
.|< 	
<< 	
< 	
  C	
 	
	6	
 	
   	
 	
 		  	
 	
 		 / 	
 	
	6	
 	
  0< 	
 	
 		 0< 	
 	
 		 = 	
 	
 	
 	
 	
 	
r3   c                 F   t        ddi      \  }}|D cg c]  }|j                          }}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
c c}w )zKfast_extract correctly identifies known Genesis services from payload text.r   z@Connect to redis and qdrant for memory storage with telnyx voiceredisinz%(py1)s in %(py3)sentity_lowerpy1r   r5   r   Nqdranttelnyx)
r   lowerr!   r"   r&   r#   r$   r%   r(   r)   )	r*   r9   r;   erU   @py_assert0r-   r/   r0   s	            r1   )test_fast_extract_extracts_known_servicesz=TestFastExtractNoIO.test_fast_extract_extracts_known_servicesY   sG   'X)
 & ,44a	44&w,&&&&w,&&&w&&&&&&,&&&,&&&&&&&'x<''''x<'''x''''''<'''<''''''''x<''''x<'''x''''''<'''<''''''' 5s   Hc                    t        ddi      \  }}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}}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)	z8fast_extract identifies .py file paths from the payload.r   zCEdit core/memory/redis_l1_schema.py and core/memory/fast_extract.pyc              3   $   K   | ]  }d |v  
 yw)zredis_l1_schema.pyNr@   .0r[   s     r1   	<genexpr>zLTestFastExtractNoIO.test_fast_extract_extracts_file_paths.<locals>.<genexpr>h   s     ?'1,?   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}any)r   rG   py4Nc              3   $   K   | ]  }d |v  
 yw)zfast_extract.pyNr@   r`   s     r1   rb   zLTestFastExtractNoIO.test_fast_extract_extracts_file_paths.<locals>.<genexpr>i   s     <a$)<rc   )	r   rd   r#   r$   r!   r%   r&   r(   r)   )r*   r9   r;   r.   @py_assert3@py_format5s         r1   %test_fast_extract_extracts_file_pathsz9TestFastExtractNoIO.test_fast_extract_extracts_file_pathsc   s    '[)
 & @h??s?????????s???s??????????????<8<<s<<<<<<<<<s<<<s<<<<<<<<<<<<<<r3   c                 H   d}t        d|i      \  }}t        |      }d}||k(  }|st        j                  d|fd||f      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                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            dx}x}}y)z*Intent string is capped at 200 characters.  AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr      r6   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenr;   r   rW   r   py6zassert %(py8)spy8N)
r   rn   r!   r"   r#   r$   r%   r&   r(   r)   )	r*   	long_text_r;   r-   @py_assert5rI   rK   @py_format9s	            r1   /test_fast_extract_intent_truncated_to_200_charszCTestFastExtractNoIO.test_fast_extract_intent_truncated_to_200_charsk   s    	 (I!67	66{!c!{c!!!!{c!!!!!!s!!!s!!!!!!6!!!6!!!{!!!c!!!!!!!r3   N)r=   r>   r?   rL   rO   r]   ri   rv   r@   r3   r1   rB   rB   J   s    W
(="r3   rB   c                   D    e Zd Zej                  j
                  d        Zy)TestScatterGatherConcurrencyc           
        
K   g 
t         j                  
fd}t        dt        d      5  t        dt        d      5  t        dt        d      5  t        d|      5  t	        d	d
gdd       d{    ddd       ddd       ddd       ddd       t        
      }d}||k\  }|st        j                  d|fd||f      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                  |      t        j                  |      dz  }t        j                  d      dz   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}}y7 # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY ww)zLscatter_gather internally calls asyncio.gather to fire all 3 layers at once.c                  d   K   j                  t        |               | i | d {   S 7 w)N)appendrn   )coroskwargsgather_callsoriginal_gathers     r1   
spy_gatherzdTestScatterGatherConcurrency.test_asyncio_gather_is_called_during_scatter_gather.<locals>.spy_gather~   s/     E
+(%:6::::s   &0.0*core.memory.scatter_gather._fetch_redis_l1N)new_callablereturn_value'core.memory.scatter_gather._fetch_kg_l2+core.memory.scatter_gather._fetch_qdrant_l3z)core.memory.scatter_gather.asyncio.gatherside_effectz	task-concxr;   rl   
timeout_ms   )>=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)srn   r~   ro   z5asyncio.gather must be called for concurrent fetching
>assert %(py8)srq   r      r6   )z%(py1)s == %(py4)s)rW   re   zassert %(py6)srp   )rD   gatherr   r   r
   rn   r!   r"   r#   r$   r%   r&   r'   r(   r)   )r*   r   r-   rt   rI   rK   ru   r\   rg   rh   r~   r   s             @@r1   3test_asyncio_gather_is_called_during_scatter_gatherzPTestScatterGatherConcurrency.test_asyncio_gather_is_called_during_scatter_gatherx   s     !..	;
 >Yeij	V;Yeij	V ?ifjk	V =:V		V (cUHQTUUU	V 	V 	V 	V < ^A^ A%^^^ A^^^^^^s^^^s^^^^^^<^^^<^^^ ^^^A^^^'^^^^^^^^A#!#!####!######!#######	 V	V 	V 	V 	V 	V 	V 	V 	Vsw   +I;I.I!I#I	7I8I	<II!I.F0I;I	IIII!!I+	&I..I83I;N)r=   r>   r?   pytestmarkrD   r   r@   r3   r1   rx   rx   v   s    [[$ $r3   rx   c                   D    e Zd Zej                  j
                  d        Zy)"TestScatterGatherIndividualTimeoutc           	        K   g g d }fd}fd}t        d|      5  t        d|      5  t        d|      5  t        dd	gd
d       d{   }ddd       ddd       dd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                  |            s{t        j                  d      dz   ddt	        j
                         v st        j                        rt        j                        ndiz  }t        t        j                  |            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                  }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                  }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}}y7 m# 1 sw Y   mxY w# 1 sw Y   rxY w# 1 sw Y   wxY ww)zCA slow L1 does not delay L2/L3 beyond the per-layer timeout budget.c                 J   K   t        j                  d       d {    y7 w)N      ?never)rD   sleep)_task_ids    r1   slow_l1zaTestScatterGatherIndividualTimeout.test_per_layer_timeout_enforced_independently.<locals>.slow_l1   s      --$$$ %s   #!#c                 0   K   j                  d       yw)NTzKG Topology:
fast entityr{   )	_entities	l2_calleds    r1   fast_l2zaTestScatterGatherIndividualTimeout.test_per_layer_timeout_enforced_independently.<locals>.fast_l2   s     T".   c                 0   K   j                  d       yw)NTzLearned Constraints:
fast scarr   )_intent	l3_calleds    r1   fast_l3zaTestScatterGatherIndividualTimeout.test_per_layer_timeout_enforced_independently.<locals>.fast_l3   s     T"4r   r   r   r   r   ztask-timeoutyr;   2   r   Nz+L2 must execute independently of L1 timeoutz
>assert %(py0)sr   r   z+L3 must execute independently of L1 timeoutr   is)z5%(py2)s
{%(py2)s = %(py0)s.working_state
} is %(py5)sctxr   rG   r   assert %(py7)spy7is not)z7%(py2)s
{%(py2)s = %(py0)s.kg_topology
} is not %(py5)s)z?%(py2)s
{%(py2)s = %(py0)s.learned_constraints
} is not %(py5)s)r   r
   r!   r'   r#   r$   r%   r&   r(   r)   working_stater"   kg_topologylearned_constraints)r*   r   r   r   r   @py_format1r.   rI   rg   r0   @py_format8r   r   s              @@r1   -test_per_layer_timeout_enforced_independentlyzPTestScatterGatherIndividualTimeout.test_per_layer_timeout_enforced_independently   sw    
 				/	5
 >GT	^;GT	^ ?WU	^
 .nseXZ\]]C	^ 	^ 	^ GGGGGGGGGyGGGyGGGGGGGGGGGGGGyGGGyGGGGG  (D( D(((( D((((((s(((s((( (((D(((((((*d*d****d******s***s******d*******&&2d2&d2222&d222222s222s222&222d2222222 ^	^ 	^ 	^ 	^ 	^ 	^s]   O*OOOO 
OO O(MO* OOOO	OO'"O*N)r=   r>   r?   r   r   rD   r   r@   r3   r1   r   r      s    [[!3 !3r3   r   c                       e Zd Zd Zy)TestInterceptorPriorityc                 F   t               }|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  }t        j                  d|j                  j                         dz   d|iz  }t        t        j                  |            d	x}x}x}}y	)
z=JITHydrationInterceptor.metadata.priority must be exactly 10.
   r6   )zN%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.metadata
}.priority
} == %(py7)sinterceptorr   rG   re   r   z#Expected priority=10, got priority=
>assert %(py9)spy9N)r   metadatapriorityr!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r   r.   rg   rJ   rt   r   @py_format10s           r1   test_interceptor_priority_is_10z7TestInterceptorPriority.test_interceptor_priority_is_10   s   -/## 	
#,, 	
 	
,2 	
 	
, 	
 	
	6	
 	
   	
 	
 		  	
 	
 		 $ 	
 	
 		 - 	
 	
 		 13 	
 	
  2+2F2F2O2O1PQ	
 	
 	
 	
 	
 	
r3   N)r=   r>   r?   r   r@   r3   r1   r   r      s    
r3   r   c                       e Zd Zd Zd Zy)TestInterceptorMetadataNamec                 H   t               }|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  }t        j                  d|j                  j                   d      dz   d	|iz  }t        t        j                  |            d
x}x}x}}y
)z>JITHydrationInterceptor.metadata.name must be 'jit_hydration'.jit_hydrationr6   )zJ%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.metadata
}.name
} == %(py7)sr   r   z)Expected name='jit_hydration', got name=''r   r   N)r   r   namer!   r"   r#   r$   r%   r&   r'   r(   r)   r   s           r1   /test_interceptor_metadata_name_is_jit_hydrationzKTestInterceptorMetadataName.test_interceptor_metadata_name_is_jit_hydration   s   -/## 	
#(( 	
O 	
(O; 	
 	
(O 	
 	
	6	
 	
   	
 	
 		  	
 	
 		 $ 	
 	
 		 ) 	
 	
 		 -< 	
 	
  88L8L8Q8Q7RRST	
 	
 	
 	
 	
 	
r3   c                    t               }|j                  }|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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}}y)	z<JITHydrationInterceptor.metadata.enabled is True by default.Tr   )zM%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.metadata
}.enabled
} is %(py7)sr   r   zassert %(py9)sr   N)r   r   enabledr!   r"   r#   r$   r%   r&   r(   r)   r   s           r1   ,test_interceptor_metadata_enabled_by_defaultzHTestInterceptorMetadataName.test_interceptor_metadata_enabled_by_default   s    -/##3#++3t3+t3333+t333333{333{333#333+333t3333333r3   N)r=   r>   r?   r   r   r@   r3   r1   r   r      s    
4r3   r   c                       e Zd Zd Zd Zd Zy)TestEnvelopeLatencyFormattingc                 f   t        dddd      }t        |      }t        j                  |      }|j	                  d      }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  }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                  |      d	z  }t        j                  d|	 d      dz   d|iz  }t        t        j                  |            dx}}y)z=build_envelope formats latency_ms to exactly 1 decimal place.okg$(@r   r   r   
latency_msHYDRATION_LATENCY_MSNr   )z%(py0)s is not %(py3)s
latency_elr   r5   r   z12.3r6   r8   latency_textzExpected latency '12.3', got 'r   r   )r   r   ET
fromstringfindr!   r"   r#   r$   r%   r&   r(   r)   textr'   )
r*   r   xml_strrootr   r-   r.   r/   r0   r   s
             r1   %test_latency_formatted_to_one_decimalzCTestEnvelopeLatencyFormatting.test_latency_formatted_to_one_decimal   sG    $!	
 !%}}W%YY56
!%%z%%%%z%%%%%%z%%%z%%%%%%%%%%!% 	
|v% 	
 	
|v 	
 	
	6	
 	
   	
 	
 		  	
 	
 		  & 	
 	
  -\N!<	
 	
 	
 	
 	
r3   c                    t        dddd      }t        |      }t        j                  |      }|j	                  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}}y)z6latency_ms=0.0 renders as '0.0' (not '0', not '0.00').N        r   r   z0.0r6   z,%(py2)s
{%(py2)s = %(py0)s.text
} == %(py5)sr   r   r   r   r   r   r   r   r   r   r!   r"   r#   r$   r%   r&   r(   r)   
r*   r   r   r   r   r.   rI   rg   r0   r   s
             r1   .test_zero_latency_formatted_as_zero_point_zerozLTestEnvelopeLatencyFormatting.test_zero_latency_formatted_as_zero_point_zero   s     $	
 !%}}W%YY56
'%'%''''%''''''z'''z''''''%'''''''r3   c                    t        dddd      }t        |      }t        j                  |      }|j	                  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}}y)z<Large latency values are still formatted to 1 decimal place.r   gE?@r   r   z1000.0r6   r   r   r   r   r   Nr   r   s
             r1   +test_large_latency_formatted_to_one_decimalzITestEnvelopeLatencyFormatting.test_large_latency_formatted_to_one_decimal  s     #	
 !%}}W%YY56
*(*(****(******z***z******(*******r3   N)r=   r>   r?   r   r   r   r@   r3   r1   r   r      s    
&(+r3   r   c                       e Zd Zd Zd Zy)TestEnvelopeFourTagsc           	         t        dddd      }t        |      }t        j                  |      }t	        |      }t        |      }d}||k(  }|s3t        j                  d|fd||f      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                  |      t        j                  |      dz  }t        j                  dt        |       d|D 	cg c]  }	|	j                   c}	       dz   d|iz  }
t        t        j                  |
            dx}x}}yc c}	w )zJbuild_envelope produces exactly 4 child elements under ZERO_AMNESIA_STATE.wskglcr   r      r6   rm   rn   childrenro   zExpected 4 child elements, got z: r   rq   N)r   r   r   r   listrn   r!   r"   r#   r$   r%   r&   r'   tagr(   r)   )r*   r   r   r   r   r-   rt   rI   rK   cru   s              r1   ,test_envelope_always_has_four_child_elementszATestEnvelopeFourTags.test_envelope_always_has_four_child_elements  sY    $	
 !%}}W%:8} 	
 	
}! 	
 	
 	
} 	
 	
	6	
 	
   	
 	
 		  	
 	
	6	
 	
   	
 	
 		  	
 	
 		  	
 	
 		 !" 	
 	
  .c(m_Bx?X!?X>YZ	
 	
 	
 	
 	
 	
?Xs   F
c                    t        dddd      }t        |      }t        j                  |      }|D cg c]  }|j                   }}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c c}w )z7The 4 child elements have the exact expected tag names.Nr   r   WORKING_CONTEXTrR   rT   tagsrV   r5   r   TOPOLOGICAL_BLAST_RADIUSLEARNED_CONSTRAINTSr   )r   r   r   r   r   r!   r"   r&   r#   r$   r%   r(   r)   )
r*   r   r   r   childr   r\   r-   r/   r0   s
             r1   )test_envelope_child_tag_names_are_correctz>TestEnvelopeFourTags.test_envelope_child_tag_names_are_correct$  s    $	
 !%}}W%'+,e		,, ( D(((( D((( ((((((D(((D((((((()1)T1111)T111)111111T111T1111111$,$,,,,$,,,$,,,,,,,,,,,,,,,,%-%----%---%----------------	 -s   KN)r=   r>   r?   r   r   r@   r3   r1   r   r     s    
.r3   r   c                   D    e Zd Zej                  j
                  d        Zy)TestRedisL1BumpVersionAtomicc                 T  K   t        d      }t               }t        d      |_        t        t        d            |_        ||_        |j                  d       d{   }d}||k(  }|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  }t        t        j                  |            dx}}|j                  j                          |j                  j                  d   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}	}|j                   }d}
 ||
      }|sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |
      t        j                  |      dz  }t        t        j                  |            dx}x}
}y7 Fw)uK   bump_version must use INCR for atomicity — NOT a read-then-write pattern.zredis://fake:6379)	redis_url   )r   z&get must NOT be called in bump_versionr   ztask-atomicNr6   r8   new_versionr   r5   r   r   rR   rT   incr_keyrV   z:versionzJassert %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.endswith
}(%(py4)s)
})r   rG   re   rp   )r   r   incrr(   get_redisbump_versionr!   r"   r#   r$   r%   r&   r)   assert_awaited_once	call_argsendswith)r*   clientmock_rr   r-   r.   r/   r0   r   r\   rg   rt   rK   s                r1   .test_bump_version_calls_redis_incr_not_get_setzKTestRedisL1BumpVersionAtomic.test_bump_version_calls_redis_incr_not_get_set;  s     )<=Q/>:b+cd
"//>>{a{a{{a'');;((+A.(}((((}(((}((((((((((((((((  ,, ,,,,,,,,x,,,x,,, ,,,,,,,,,,,,, ?s   AJ(J% IJ(N)r=   r>   r?   r   r   rD   r  r@   r3   r1   r   r   9  s    [[- -r3   r   c                   $    e Zd Zd Zd Zd Zd Zy)TestRedisL1StateVersionDefaultc                    t        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  }t        j                  d	|j                         d
z   d|iz  }t        t        j                  |            dx}x}}y)z;RedisL1State.version field defaults to 0 when not provided.z	t-defaults-1task_id
session_idactive_task_idr   r6   z/%(py2)s
{%(py2)s = %(py0)s.version
} == %(py5)sstater   z*Expected version=0 (default), got version=z
>assert %(py7)sr   N)r	   versionr!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r  r.   rI   rg   r0   r   s          r1   test_version_default_is_zeroz;TestRedisL1StateVersionDefault.test_version_default_is_zeroW  s    &

 }} 	
 	
}! 	
 	
} 	
 	
	6	
 	
   	
 	
 		  	
 	
 		  	
 	
 		 !" 	
 	
  9H	
 	
 	
 	
 	
 	
r3   c                    t        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}}y)zCRedisL1State.version can be explicitly set to any non-negative int.zt-versionedr  *   )r  r  r  r  r6   r  r  r   r   r   N)
r	   r  r!   r"   r#   r$   r%   r&   r(   r)   r  s          r1   "test_version_can_be_set_explicitlyzATestRedisL1StateVersionDefault.test_version_can_be_set_explicitlyb  s    !(	
 }}""}""""}""""""u"""u"""}""""""""""r3   c                 4   t        ddd      }|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}}|j                  }t        |t              }|sd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t	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }	t        t        j                  |	            d
x}}y
)zARedisL1State.focus_entities defaults to an empty list (not None).zt-fezs-2r  r6   )z6%(py2)s
{%(py2)s = %(py0)s.focus_entities
} == %(py5)sr  r   r   r   NzYassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.focus_entities
}, %(py4)s)
}
isinstancer   )r   rW   r   re   rp   )r	   focus_entitiesr!   r"   r#   r$   r%   r&   r(   r)   r  r   )
r*   r  r.   rI   rg   r0   r   r-   rt   rK   s
             r1   *test_focus_entities_defaults_to_empty_listzITestRedisL1StateVersionDefault.test_focus_entities_defaults_to_empty_listl  s)   !

 ##)r)#r))))#r))))))u)))u)))#)))r)))))))..5z.55555555z555z555555%555%555.5555555555555555555r3   c                    t        dd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}}y)z-RedisL1State.active_blocker defaults to None.zt-abzs-3r  Nr   )z6%(py2)s
{%(py2)s = %(py0)s.active_blocker
} is %(py5)sr  r   r   r   )
r	   active_blockerr!   r"   r#   r$   r%   r&   r(   r)   r  s          r1   $test_active_blocker_defaults_to_nonezCTestRedisL1StateVersionDefault.test_active_blocker_defaults_to_nonev  s    !

 ##+t+#t++++#t++++++u+++u+++#+++t+++++++r3   N)r=   r>   r?   r  r  r  r  r@   r3   r1   r
  r
  U  s    	
#6,r3   r
  )-__doc__builtinsr#   _pytest.assertion.rewrite	assertionrewriter!   rD   inspectsysr   xml.etree.ElementTreeetreeElementTreer   unittest.mockr   r   r   r   r   pathinsertcore.memory.fast_extractr   core.memory.redis_l1_schemar   r	   core.memory.scatter_gatherr
   !core.memory.zero_amnesia_enveloper   r   %core.memory.jit_hydration_interceptorr   r   rB   rx   r   r   r   r   r   r   r
  r@   r3   r1   <module>r2     s   *    
  " " ; ;  * + 1 C < K I <%" %"X$ $:$3 $3V
 
4 4&-+ -+h. .L- -8(, (,r3   