Compact interpretation storage metadata without summarizing evidence

This commit is contained in:
Nico committed 2026-10-15 11:29:30 +02:00
1 parent 82238ed213
commit 2fb81ef4af
11 files changed
+331 -20

No files matched your search

+6 -6
View File
@@ -81,7 +81,7 @@ class Model:
document["resolutions"][0]["candidate_id"] = "K9999"
else:
document = payload()
if version in {"case_interpretation_resolved_v3", "case_interpretation_resolved_v4", "case_interpretation_resolved_v5"}:
if version in {"case_interpretation_resolved_v3", "case_interpretation_resolved_v4", "case_interpretation_resolved_v5", "case_interpretation_resolved_v6"}:
document.update(described_behavior=[],provisional_behavior_gap=None)
data = json.loads(request["messages"][1]["content"])["input"]
selected = [(k,v) for k,v in data["sources"].items() if v["kind"] == "entity" and v["case_pointer"].startswith("/entity_resolution/")]
@@ -95,7 +95,7 @@ class Model:
if self.omit_resolved:
self.omit_resolved -= 1
document["relevant_entities"] = payload()["relevant_entities"]
if version in {'case_interpretation_resolved_v4','case_interpretation_resolved_v5'}:
if version in {'case_interpretation_resolved_v4','case_interpretation_resolved_v5','case_interpretation_resolved_v6'}:
from viano_bug_analysis.analysis.quality import unnamed_entity_reasons
reasons = unnamed_entity_reasons(data)
for entity in document['relevant_entities']:
@@ -132,7 +132,7 @@ def test_resolves_unrecorded_subject_preserves_case_and_portable_replay(built_ca
model = Model(); service = service_for(store)
result = run(store, model, service)
assert result.status == "COMPLETED" and PackageValidator().validate(result.package).valid
assert [r["prompt_version"] for r in model.requests] == ["entity_resolution_plan_v3","entity_resolution_assessment_v3","case_interpretation_resolved_v5"]
assert [r["prompt_version"] for r in model.requests] == ["entity_resolution_plan_v3","entity_resolution_assessment_v3","case_interpretation_resolved_v6"]
assert len(service.database.calls) == 1
assert service.database.calls[0]["filters"] == [{"column":"name","operator":"contains","value":"switch"}]
with PackageReader(result.package) as reader:
@@ -247,7 +247,7 @@ def test_search_cannot_be_grounded_in_a_capture_filename(built_case):
def test_empty_plan_still_supports_descriptive_quality_contract(built_case):
store=built_case[0];model=Model(plan={'searches':[]});service=service_for(store)
assert run(store,model,service).status=='COMPLETED'
assert model.requests[-1]['prompt_version']=='case_interpretation_resolved_v5' and not service.database.calls
assert model.requests[-1]['prompt_version']=='case_interpretation_resolved_v6' and not service.database.calls
def test_trial_phase_stop_includes_resolution_and_is_idempotent(built_case):
@@ -403,7 +403,7 @@ def test_third_assessment_can_use_lower_reasoning_without_resetting_history(buil
assert len(service.database.calls) == 1
assert model.efforts == [('entity_resolution_plan_v3','medium'),
('entity_resolution_assessment_v3','medium'),('entity_resolution_assessment_v3','medium'),
('entity_resolution_assessment_v3','low'),('case_interpretation_resolved_v5','medium')]
('entity_resolution_assessment_v3','low'),('case_interpretation_resolved_v6','medium')]
with PackageReader(result.package) as reader:
saved = json.loads(reader.read_bytes('analysis/interpretations/0001/entity-resolution/assessment.json'))
assert saved['payload']['attempt'] == 3
@@ -411,7 +411,7 @@ def test_third_assessment_can_use_lower_reasoning_without_resetting_history(buil
assert len(model.efforts) == 5
@pytest.mark.parametrize("version", [3,4])
@pytest.mark.parametrize("version", [3,4,5])
def test_completed_interpretation_keeps_its_historical_contract(built_case, version):
from viano_bug_analysis.analysis.entity_resolution import EntityResolver
store=built_case[0]
+67
View File
@@ -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
+1 -1
View File
@@ -93,7 +93,7 @@ def test_real_contextual_identity_resolution_with_fixture_llm(service, tmp_path)
assert any(e['id']=='23486' for e in entities.values())
resolved=next(k for k,e in entities.items() if e['id']=='23487')
doc=missing_payload()
if request["prompt_version"]in {"case_interpretation_resolved_v3","case_interpretation_resolved_v4","case_interpretation_resolved_v5"}:
if request["prompt_version"]in {"case_interpretation_resolved_v3","case_interpretation_resolved_v4","case_interpretation_resolved_v5","case_interpretation_resolved_v6"}:
doc.update(described_behavior=[{'text':'The quest describes catching wild creatures using a net while intoxicated or wearing goggles.',
'source_ids':[self.mention],'basis':'local_description','verification':'not_independently_verified'}],
provisional_behavior_gap={'text':'The tester does not see these creatures despite wearing goggles.',