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

Story B-7.03: MergePromptBuilder — Structured Conflict Prompt

Black Box Tests (BB1–BB5):
    BB1  Prompt contains "You are the Genesis Semantic Reducer"
    BB2  All conflicting agent IDs appear in prompt text
    BB3  Current state > 2000 chars → truncated with "... [truncated]" indicator
    BB4  Current state < 2000 chars → not truncated, full JSON in prompt
    BB5  "Respond ONLY with valid JSON" instruction present in prompt

White Box Tests (WB1–WB4):
    WB1  Output is deterministic — calling build() twice returns identical string
    WB2  _truncate_state with 3000-char JSON → returns string ≤ MAX_STATE_CHARS length
    WB3  _format_worker_proposals labels each delta on its own section
    WB4  _extract_agent_id works with both StateDelta-like objects and plain dicts

Package Test:
    PKG1 `from core.merge import MergePromptBuilder` works after __init__.py update
    )annotationsN)datetimez/mnt/e/genesis-system)MergePromptBuilderMAX_STATE_CHARS)ConflictDetectorConflictReport)
StateDeltac                P    t        | ||t        |      t        dddddd            S )z;Create a StateDelta with the given patch (stored as tuple).i           r   )agent_id
session_idversion_at_readpatchsubmitted_at)r	   tupler   )r   r   r   versions       6/mnt/e/genesis-system/tests/track_b/test_story_7_03.py
make_deltar   4   s3     EldAr2q!4     c                <    t        | |xs dg|xs dg|xs g       S )N/statuspath_collisionhas_conflictsconflicting_pathsconflict_typesnon_conflicting_deltas)r   r   s       r   make_conflict_reportr    D   s2     #+:	{%;*:);5;	 r   active   )statusr   data  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxc                    t        dddddg      } t        dddddg      }t               }t        j                  | |g|t        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}}y)z<BB1: Prompt starts with the required system identity header.agent-Areplacer   r!   oppathvalueagent-Binactive   r   z$You are the Genesis Semantic Reducerinz%(py1)s in %(py3)spromptpy1py3assert %(py5)spy5Nr   r    BUILDERbuildSMALL_STATE
@pytest_ar_call_reprcompare	_saferepr@py_builtinslocals_should_repr_global_nameAssertionError_format_explanationdelta_adelta_breportr4   @py_assert0@py_assert2@py_format4@py_format6s           r   1test_bb1_prompt_contains_genesis_semantic_reducerrN   ^   s    IyS[%\$]^GIyS]%^$_`G!#F]]GW-v{A]NF1;1V;;;;1V;;;1;;;;;;V;;;V;;;;;;;r   c                 4   t        dddddg      } t        dddddg      }t        dg      }t        j                  | |g|t        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)zFBB2: Every agent_id involved in the conflict is visible in the prompt.zagent-ALPHAr(   /xr/   r)   z
agent-BETAr   r   r   r0   r1   r3   r4   r5   r8   r9   Nr:   rF   s           r   3test_bb2_all_conflicting_agent_ids_appear_in_promptrR   i   s	   	4RS)T(UVG	4RS)T(UVG!TF;F]]GW-v{A]NF"=F""""=F"""=""""""F"""F"""""""!<6!!!!<6!!!<!!!!!!6!!!6!!!!!!!r   c                    t        dddddg      } t               }t        j                  | g|t        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}}y)uO   BB3: State JSON > MAX_STATE_CHARS → truncated and '... [truncated]' appended.agent-Zadd/kvr)   r   r0   ... [truncated]r1   r3   r4   r5   r8   r9   N)r   r    r;   r<   LARGE_STATEr>   r?   r@   rA   rB   rC   rD   rE   deltarI   r4   rJ   rK   rL   rM   s          r   -test_bb3_large_state_is_truncated_with_markerr\   u   s    y%#L"MNE!#F]]E7FK]CF&&&&&&&&&&&&&&&&&&&&&&&&r   c                 
   t        dddddg      } t               }t        j                  | g|t        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)uN   BB4: State JSON < MAX_STATE_CHARS → full JSON present, no truncation marker.rT   rU   rV   rW   r)   r   r0   rX   )not in)z%(py1)s not in %(py3)sr4   r5   r8   r9   Nr#   r1   r3   r:   rZ   s          r   "test_bb4_small_state_not_truncatedr_      s    y%#L"MNE!#F]]E7FK]CF*F****F*********F***F*******8v8v8vvr   c                    t        dddddg      } t               }t        j                  | g|t        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}}y)zBBB5: The LLM response format instruction must be present verbatim.r'   r(   rP   r/   r)   r   r0   zRespond ONLY with valid JSONr1   r3   r4   r5   r8   r9   Nr:   rZ   s          r   3test_bb5_respond_only_with_json_instruction_presentra      s    y)TA#N"OPE!#F]]E7FK]CF)3)V3333)V333)333333V333V3333333r   c                 |   t        dddddg      } t        dddddg      }t        dg      }t        j                  | |g|t        d	
      }t        j                  | |g|t        d	
      }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d}y)z>WB1: Identical inputs always produce identical output strings.r'   r(   z/v
   r)   r-      rQ      r0   ==)z%(py0)s == %(py2)sprompt_1prompt_2py0py2assert %(py4)spy4N)r   r    r;   r<   r=   r>   r?   rA   rB   rC   r@   rD   rE   )rG   rH   rI   rh   ri   @py_assert1@py_format3@py_format5s           r    test_wb1_output_is_deterministicrr      s    Itb%Q$RSGItb%Q$RSG!TF;F}}gw/a}PH}}gw/a}PHx8x88xxr   c                 H   ddi} t         j                  |       }t        |      }|t        k  }|s/t	        j
                  d|fd|t        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                  |      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}}|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)zOWB2: _truncate_state with a 3000-char JSON returns a string <= MAX_STATE_CHARS.r$     yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy)<=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} <= %(py5)slenresultr   )rk   r6   r7   r9   zassert %(py7)spy7NrX   zJassert %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.endswith
}(%(py4)s)
})rk   rl   rn   py6)r;   _truncate_staterv   r   r>   r?   rA   rB   rC   r@   rD   rE   endswith)
	big_staterw   rK   @py_assert4rM   @py_format8ro   @py_assert3@py_assert5@py_format7s
             r   !test_wb2_truncate_state_max_charsr      s(   $I$$Y/F v;);/))));/))))))3)))3))))))v)))v)));))))))/)))/)))))))??-,-?,--------6---6---?---,----------r   c                    t        dddddg      } t        dddddg      }t        j                  | |g      }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)zHWB3: _format_worker_proposals produces labelled sections for each delta.zworker-1rU   z/ar/   r)   zworker-2z/br   zWorker worker-1:r1   r3   	formattedr5   r8   r9   NzWorker worker-2:z"path"z"op")r   r;   _format_worker_proposalsr>   r?   r@   rA   rB   rC   rD   rE   )rG   rH   r   rJ   rK   rL   rM   s          r   2test_wb3_format_worker_proposals_labels_each_deltar      s   UD1&M%NOGUD1&M%NOG00'71CDI ************************************************ 8y    8y   8      y   y       6Y6Y6YYr   c                    t        dg       } t        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  }dd|iz  }t        t        j                  |            dx}}d	g d
}t        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  }dd|iz  }t        t        j                  |            dx}}t        j                  dg i      }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)zEWB4: _extract_agent_id works with StateDelta objects AND plain dicts.zstate-delta-agentrf   )z%(py0)s == %(py3)s
result_obj)rk   r7   r8   r9   Nz
dict-agent)r   r   result_dictr   unknownresult_missing)r   r;   _extract_agent_idr>   r?   rA   rB   rC   r@   rD   rE   )		delta_objr   rK   ro   rL   rM   
delta_dictr   r   s	            r   -test_wb4_extract_agent_id_statedelta_and_dictr      s]   .3I**95J,,:,,,,,:,,,,,,,:,,,:,,,,,,,,,,,*R8J++J7K&&;,&&&&;,&&&&&&;&&&;&&&,&&&&&&& ..}=N&&>Y&&&&>Y&&&&&&>&&&>&&&Y&&&&&&&r   c                    ddl m}  | t        u }|st        j                  d|fd| t        f      dt	        j
                         v st        j                  |       rt        j                  |       nddt	        j
                         v st        j                  t              rt        j                  t              nddz  }dd	|iz  }t        t        j                  |            d
}y
)z<PKG1: MergePromptBuilder importable from core.merge package.r   )r   )is)z%(py0)s is %(py2)sMPBr   rj   rm   rn   N)

core.merger   r>   r?   rA   rB   rC   r@   rD   rE   )r   ro   rp   rq   s       r   5test_pkg1_from_core_merge_import_merge_prompt_builderr      sq    4$$$$$3$$$$$$$3$$$3$$$$$$$$$$$$$$$$$$r   )zsess-001r/   )
r   strr   z
list[dict]r   r   r   intreturnr	   )TNNN)
r   boolr   list[str] | Noner   r   r   zlist | Noner   r   )(__doc__
__future__r   builtinsrA   _pytest.assertion.rewrite	assertionrewriter>   sysjsonr   pytestGENESIS_ROOTr+   insertcore.merge.merge_prompt_builderr   r   core.merge.conflict_detectorr   r   core.coherence.state_deltar	   r   r    r;   DETECTORr=   rY   rN   rR   r\   r_   ra   rr   r   r   r   r    r   r   <module>r      s$  , #   
    'sxxHHOOA|$ P I 1 !	  	
 " *.'+*.	' % (	
  
!a0z"<	"'	4	 .'(%r   