68 lines
4.1 KiB
Python
68 lines
4.1 KiB
Python
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'])<len(previous['messages'][1]['content'])*0.8
|
|
for sid,source in context['sources'].items():
|
|
if source['kind'] in {'observation','report','tester_comment','tester_assumption','expectation'}:
|
|
for key in ('text','title','summary'):
|
|
assert projected['sources'][sid]['data'].get(key)==source['data'].get(key)
|
|
assert builder.build(before)==previous
|
|
assert before==json.loads(previous['messages'][1]['content'])['input']
|
|
|
|
|
|
def test_meaningful_long_source_paths_and_human_text_are_not_shortened():
|
|
path='src/very_long_but_meaningful_namespace/subsystem/another_component/visibility_handler.cpp'
|
|
text='a'*100
|
|
context={'sources':{'O0001':{'kind':'observation','data':{'text':text}},
|
|
'X0001':{'kind':'unread_reference','data':{'path':path}}}}
|
|
assert compact_context(context)==context
|