Compact interpretation storage metadata without summarizing evidence
This commit is contained in:
1 parent
82238ed213
commit
2fb81ef4af
11 files changed
+331
-20
No files matched your search
@@ -0,0 +1,67 @@
|
||||
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
|
||||
Reference in new issue
Block a user