import copy import json from pathlib import Path from viano_bug_analysis.analysis.model_context import compact_context from viano_bug_analysis.analysis.prompt import InterpretationPromptBuilder from test_interpretation_quality import fixture def test_compaction_preserves_evidence_and_keeps_identifier_domains_distinct(): path = 'original/' + 'a'*64 + '/report.json' origin = {'source_ref':path,'author':'Tester','observed_at':'2026-10-08T13:00:00Z', 'snapshot_id':'backup:'+'d'*64,'time_scope':'snapshot_not_current_production'} context={'sources':{ 'O0001':{'kind':'observation','data':{'text':'No creatures despite goggles.', 'provenance':origin}}, 'C0001':{'kind':'tester_comment','data':{'text':'Horde works.', 'provenance':copy.deepcopy(origin)}}, 'F0001':{'kind':'fact','data':{'value':{'query':{'filters':[{'column':'entry','value':23487}]}, 'result':{'truncated':True,'coverage':'filtered_rows','next_offset':8,'items':[{'row':{ 'entry':23487,'path':path,'sha256':'e'*64,'name':'Wild Wolpertinger'}}]},'origin':origin}}}, 'X0001':{'kind':'unread_reference','data':{'path':path,'sha256':'a'*64,'size':100}}, 'X0002':{'kind':'unread_reference','data':{'path':'original/'+'b'*64+'/report.json','sha256':'b'*64,'size':200}}}} before=copy.deepcopy(context) result=compact_context(context) assert context==before assert set(result['sources'])==set(context['sources']) for sid in context['sources']: assert result['sources'][sid]['kind']==context['sources'][sid]['kind'] assert result['sources']['O0001']['data']['text']==context['sources']['O0001']['data']['text'] assert result['sources']['C0001']['data']['text']=='Horde works.' assert result['sources']['F0001']['data']['value']['result']==context['sources']['F0001']['data']['value']['result'] assert result['sources']['F0001']['data']['value']['query']==context['sources']['F0001']['data']['value']['query'] assert result['sources']['X0001']['data']['path']!=result['sources']['X0002']['data']['path'] metadata=result['shared_metadata'][result['sources']['O0001']['data']['provenance']['metadata_ref']] assert metadata['author']=='Tester' and metadata['observed_at']==origin['observed_at'] assert metadata['time_scope']==origin['time_scope'] assert metadata['source_ref']==result['sources']['X0001']['data']['path'] assert result==compact_context(before) def test_compact_prompt_keeps_all_readable_sources_and_previous_version_is_unchanged(): context=fixture()['context'] context['sources']['D0098']={'kind':'data_quality','case_pointer':'/interpretation_quality/names', 'data':{'name_binding_policy':'typed_name_bindings_v1'}} builder=InterpretationPromptBuilder() previous=builder.build(context) before=copy.deepcopy(context) assert previous['prompt_version']=='case_interpretation_resolved_v5' context['sources']['D0099']={'kind':'data_quality','case_pointer':'/interpretation_quality/model_context', 'data':{'model_context_policy':'compact_storage_v1'}} new=builder.build(context) projected=json.loads(new['messages'][1]['content'])['input'] assert new['prompt_version']=='case_interpretation_resolved_v6' assert set(projected['sources'])==set(context['sources']) assert len(new['messages'][1]['content'])